diff options
author | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-12-07 04:26:06 -0500 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-12-20 10:48:52 -0500 |
commit | e646c505692a478d75011db84da7b21830947755 (patch) | |
tree | a0051b537af2924bfc161dadcb6d195cd81a596f | |
parent | 9ce9147cd584a37486f692caaef10188ffd8d4bf (diff) |
Split edge stepping into its own function
-rw-r--r-- | dda.c | 131 |
1 files changed, 69 insertions, 62 deletions
@@ -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; } } |