summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-12-07 04:26:06 -0500
committerSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-12-20 10:48:52 -0500
commite646c505692a478d75011db84da7b21830947755 (patch)
treea0051b537af2924bfc161dadcb6d195cd81a596f
parent9ce9147cd584a37486f692caaef10188ffd8d4bf (diff)
Split edge stepping into its own function
-rw-r--r--dda.c131
1 files changed, 69 insertions, 62 deletions
diff --git a/dda.c b/dda.c
index 8446293..420aeed 100644
--- a/dda.c
+++ b/dda.c
@@ -102,84 +102,91 @@ edge_init (edge_t *edge, double x0, double y0, double x1, double y1)
}
static void
+edge_step (edge_t *edge, test_data_t *testdata, int i)
+{
+ if (edge->dx_positive)
+ {
+ while (edge->e <= 0)
+ {
+ if ((edge->xi & 0xff) == N_GRID_X - 1)
+ {
+ edge->e += edge->delta_e_big_x;
+ edge->xi += (1 << 8);
+ edge->xi &= 0xffffff00;
+ }
+ else
+ {
+ edge->e += edge->delta_e_small_x;
+ edge->xi++;
+ }
+ }
+ }
+ else
+ {
+ begin:
+ if ((edge->xi & 0xff) == 0)
+ {
+ if (edge->e > edge->delta_e_big_x)
+ {
+ edge->e -= edge->delta_e_big_x;
+ edge->xi -= (1 << 8);
+ edge->xi |= (N_GRID_X - 1);
+ goto small;
+ }
+ }
+ else
+ {
+ small:
+ if (edge->e > edge->delta_e_small_x)
+ {
+ edge->e -= edge->delta_e_small_x;
+ edge->xi--;
+ goto begin;
+ }
+ }
+ }
+
+ if (testdata->points[i++] != sample_to_pos (edge->xi) ||
+ testdata->points[i++] != sample_to_pos (edge->yi))
+ {
+ printf ("%d error %f %f\n", i, testdata->points[i - 1],
+ sample_to_pos (edge->xi));
+ exit (-1);
+ }
+
+ if ((edge->yi & 0xff) == (N_GRID_Y - 1))
+ {
+ edge->e -= edge->delta_e_big_y;
+ edge->yi += (1 << 8);
+ edge->yi &= 0xffffff00;
+ }
+ else
+ {
+ edge->e -= edge->delta_e_small_y;
+ edge->yi++;
+ }
+}
+
+static void
dda (test_data_t *testdata)
{
double x0 = testdata->segment.x0;
double y0 = testdata->segment.y0;
double x1 = testdata->segment.x1;
double y1 = testdata->segment.y1;
- int i = 0;
-
#if 0
printf ("= = = = %f %f %f %f = = = = \n", x0, y0, x1, y1);
#endif
edge_t edge;
+ int i = 0;
edge_init (&edge, x0, y0, x1, y1);
while (edge.yi < edge.bottom)
{
- if (edge.dx_positive)
- {
- while (edge.e <= 0)
- {
- if ((edge.xi & 0xff) == N_GRID_X - 1)
- {
- edge.e += edge.delta_e_big_x;
- edge.xi += (1 << 8);
- edge.xi &= 0xffffff00;
- }
- else
- {
- edge.e += edge.delta_e_small_x;
- edge.xi++;
- }
- }
- }
- else
- {
- begin:
- if ((edge.xi & 0xff) == 0)
- {
- if (edge.e > edge.delta_e_big_x)
- {
- edge.e -= edge.delta_e_big_x;
- edge.xi -= (1 << 8);
- edge.xi |= (N_GRID_X - 1);
- goto small;
- }
- }
- else
- {
- small:
- if (edge.e > edge.delta_e_small_x)
- {
- edge.e -= edge.delta_e_small_x;
- edge.xi--;
- goto begin;
- }
- }
- }
-
- if (testdata->points[i++] != sample_to_pos (edge.xi) ||
- testdata->points[i++] != sample_to_pos (edge.yi))
- {
- printf ("%d error %f %f\n", i, testdata->points[i - 1],
- sample_to_pos (edge.xi));
- exit (-1);
- }
+ edge_step (&edge, testdata, i);
- if ((edge.yi & 0xff) == (N_GRID_Y - 1))
- {
- edge.e -= edge.delta_e_big_y;
- edge.yi += (1 << 8);
- edge.yi &= 0xffffff00;
- }
- else
- {
- edge.e -= edge.delta_e_small_y;
- edge.yi++;
- }
+ i += 2;
}
}