diff options
Diffstat (limited to 'draw_linear_bezier_reference.c')
-rw-r--r-- | draw_linear_bezier_reference.c | 81 |
1 files changed, 53 insertions, 28 deletions
diff --git a/draw_linear_bezier_reference.c b/draw_linear_bezier_reference.c index 451eb3a..a395c18 100644 --- a/draw_linear_bezier_reference.c +++ b/draw_linear_bezier_reference.c @@ -112,7 +112,7 @@ draw_linear_bezier_reference(RASTER *restrict raster, double x1, double y1, doub #define CHECK_CELL(X, Y, AREA, SHADOW)\ do {\ - size_t i__ = (Y) * raster->width + (X);\ + size_t i__ = (size_t)(Y) * raster->width + (size_t)(X);\ ASSERT(raster->cells[i__].cell_coverage == (AREA));\ ASSERT(raster->cells[i__].opposite_coverage == (SHADOW));\ raster->cells[i__].cell_coverage = 0;\ @@ -121,7 +121,7 @@ draw_linear_bezier_reference(RASTER *restrict raster, double x1, double y1, doub #define SUB_CELL(X, Y, AREA, SHADOW)\ do {\ - size_t i__ = (Y) * raster->width + (X);\ + size_t i__ = (size_t)(Y) * raster->width + (size_t)(X);\ raster->cells[i__].cell_coverage -= (AREA);\ raster->cells[i__].opposite_coverage -= (SHADOW);\ } while (0) @@ -160,28 +160,31 @@ draw(double x1, double y1, double x2, double y2) draw_linear_bezier_reference(raster, x1, y1, x2, y2); alarm(0); } -#undef draw_linear_bezier_reference -#define draw_linear_bezier_reference "use draw(double, double, double, double) instead" static void check_horizontal(void) { ssize_t y, x1, x2; + double fy, fx1, fx2; for (y = -2; y < 12; y++) { for (x1 = -2; x1 < 12; x1++) { for (x2 = -2; x2 < 12; x2++) { - draw(x1, y, x2, y); + fy = (double)y; + fx1 = (double)x1; + fx2 = (double)x2; + + draw(fx1, fy, fx2, fy); CHECK_ZEROED(); - draw(x1 + 0.25, y, x2 + 0.25, y); + draw(fx1 + 0.25, fy, fx2 + 0.25, fy); CHECK_ZEROED(); - draw(x1, y + 0.25, x2, y + 0.25); + draw(fx1, fy + 0.25, fx2, fy + 0.25); CHECK_ZEROED(); - draw(x1 + 0.25, y + 0.25, x2 + 0.25, y + 0.25); + draw(fx1 + 0.25, fy + 0.25, fx2 + 0.25, fy + 0.25); CHECK_ZEROED(); } } @@ -194,13 +197,17 @@ check_vertical(void) { ssize_t x, y1, y2, i, ydir; double yhit; + double fx, fy1, fy2; for (x = -2; x < 12; x++) { for (y1 = -2; y1 < 12; y1++) { for (y2 = -2; y2 < 12; y2++) { ydir = SIGNUM(y2 - y1); + fx = (double)x; + fy1 = (double)y1; + fy2 = (double)y2; - draw(x, y1, x, y2); + draw(fx, fy1, fx, fy2); for (i = 0; i < 10; i++) { if (i < y1 && i < y2) continue; @@ -213,7 +220,7 @@ check_vertical(void) } CHECK_ZEROED(); - draw(x + 0.25, y1, x + 0.25, y2); + draw(fx + 0.25, fy1, fx + 0.25, fy2); for (i = 0; i < 10; i++) { if (i < y1 && i < y2) continue; @@ -226,7 +233,7 @@ check_vertical(void) } CHECK_ZEROED(); - draw(x, y1 + 0.25, x, y2 + 0.25); + draw(fx, fy1 + 0.25, fx, fy2 + 0.25); for (i = 0; i < 10; i++) { if (i < y1 + (y1 > y2) && i < y2 + (y2 > y1)) continue; @@ -240,7 +247,7 @@ check_vertical(void) } CHECK_ZEROED(); - draw(x + 0.25, y1 + 0.25, x + 0.25, y2 + 0.25); + draw(fx + 0.25, fy1 + 0.25, fx + 0.25, fy2 + 0.25); for (i = 0; i < 10; i++) { if (i < y1 + (y1 > y2) && i < y2 + (y2 > y1)) continue; @@ -262,15 +269,20 @@ check_vertical(void) static void check_11_diagonal(ssize_t xshift, ssize_t yshift) { - ssize_t i1, i2, i, imin, imax, idir, x, y; + ssize_t i1, i2, i, imin, imax, x, y; + double fi1, fi2, idir; + double fxshift = (double)xshift; + double fyshift = (double)yshift; for (i1 = -2; i1 < 12; i1++) { for (i2 = -2; i2 < 12; i2++) { imin = i1 < i2 ? i1 : i2; imax = i1 > i2 ? i1 : i2; - idir = SIGNUM(i2 - i1); + fi1 = (double)i1; + fi2 = (double)i2; + idir = SIGNUM(fi2 - fi1); - draw(i1 + xshift, i1 + yshift, i2 + xshift, i2 + yshift); + draw(fi1 + fxshift, fi1 + fyshift, fi2 + fxshift, fi2 + fyshift); for (i = imin; i < imax; i++) { x = i + xshift; y = i + yshift; @@ -285,7 +297,7 @@ check_11_diagonal(ssize_t xshift, ssize_t yshift) } CHECK_ZEROED(); - draw(i1 + xshift, i1 + yshift + 0.25, i2 + xshift, i2 + yshift + 0.25); + draw(fi1 + fxshift, fi1 + fyshift + 0.25, fi2 + fxshift, fi2 + fyshift + 0.25); for (i = imin; i < imax; i++) { x = i + xshift; y = i + yshift; @@ -310,7 +322,7 @@ check_11_diagonal(ssize_t xshift, ssize_t yshift) } CHECK_ZEROED(); - draw(i1 + xshift + 0.25, i1 + yshift, i2 + xshift + 0.25, i2 + yshift); + draw(fi1 + fxshift + 0.25, fi1 + fyshift, fi2 + fxshift + 0.25, fi2 + fyshift); for (i = imin; i < imax; i++) { x = i + xshift; y = i + yshift; @@ -335,7 +347,7 @@ check_11_diagonal(ssize_t xshift, ssize_t yshift) } CHECK_ZEROED(); - draw(i1 + xshift + 0.25, i1 + yshift + 0.25, i2 + xshift + 0.25, i2 + yshift + 0.25); + draw(fi1 + fxshift + 0.25, fi1 + fyshift + 0.25, fi2 + fxshift + 0.25, fi2 + fyshift + 0.25); for (i = imin; i < imax; i++) { x = i + xshift; y = i + yshift; @@ -367,15 +379,20 @@ check_11_diagonal(ssize_t xshift, ssize_t yshift) static void check_11_antidiagonal(ssize_t xshift, ssize_t yshift) { - ssize_t i1, i2, i, imin, imax, ydir, x, y; + ssize_t i1, i2, i, imin, imax, x, y; + double fi1, fi2, ydir; + double fxshift = (double)xshift; + double fyshift = (double)yshift; for (i1 = -2; i1 < 12; i1++) { for (i2 = -2; i2 < 12; i2++) { imin = i1 < i2 ? i1 : i2; imax = i1 > i2 ? i1 : i2; - ydir = -SIGNUM(i2 - i1); + fi1 = (double)i1; + fi2 = (double)i2; + ydir = -SIGNUM(fi2 - fi1); - draw(i1 + xshift, i2 + yshift, i2 + xshift, i1 + yshift); + draw(fi1 + fxshift, fi2 + fyshift, fi2 + fxshift, fi1 + fyshift); for (i = imin; i < imax; i++) { x = i + xshift; y = imax - i + imin + yshift - 1; @@ -390,7 +407,7 @@ check_11_antidiagonal(ssize_t xshift, ssize_t yshift) } CHECK_ZEROED(); - draw(i1 + xshift, i2 + yshift + 0.25, i2 + xshift, i1 + yshift + 0.25); + draw(fi1 + fxshift, fi2 + fyshift + 0.25, fi2 + fxshift, fi1 + fyshift + 0.25); for (i = imin; i < imax; i++) { x = i + xshift; y = imax - i + imin + yshift - 1; @@ -415,7 +432,7 @@ check_11_antidiagonal(ssize_t xshift, ssize_t yshift) } CHECK_ZEROED(); - draw(i1 + xshift + 0.25, i2 + yshift, i2 + xshift + 0.25, i1 + yshift); + draw(fi1 + fxshift + 0.25, fi2 + fyshift, fi2 + fxshift + 0.25, fi1 + fyshift); for (i = imin; i < imax; i++) { x = i + xshift; y = imax - i + imin + yshift - 1; @@ -440,7 +457,7 @@ check_11_antidiagonal(ssize_t xshift, ssize_t yshift) } CHECK_ZEROED(); - draw(i1 + xshift + 0.25, i2 + yshift + 0.25, i2 + xshift + 0.25, i1 + yshift + 0.25); + draw(fi1 + fxshift + 0.25, fi2 + fyshift + 0.25, fi2 + fxshift + 0.25, fi1 + fyshift + 0.25); for (i = imin; i < imax; i++) { x = i + xshift; y = imax - i + imin + yshift - 1; @@ -479,13 +496,21 @@ check_11_antidiagonal(ssize_t xshift, ssize_t yshift) } +static double +frand(void) +{ + int i = rand(); + return (double)i / (double)RAND_MAX; +} + + static void try_random_line(void) { - double x1 = (double)rand() / (double)RAND_MAX; - double y1 = (double)rand() / (double)RAND_MAX; - double x2 = (double)rand() / (double)RAND_MAX; - double y2 = (double)rand() / (double)RAND_MAX; + double x1 = frand(); + double y1 = frand(); + double x2 = frand(); + double y2 = frand(); draw(x1, y1, x2, y2); } |