diff options
-rw-r--r-- | common.h | 6 | ||||
-rw-r--r-- | lines.c | 121 |
2 files changed, 126 insertions, 1 deletions
@@ -145,6 +145,12 @@ tolerant_eq(double a, double b) return iszeroish((a - b) / 100.0); } +static inline int +intolerant_eq(double a, double b) +{ + return fabs(a - b) < 1e-11; +} + # define ASSERT(ASSERTION)\ do {\ if (!(ASSERTION)) {\ @@ -217,10 +217,129 @@ draw_bounded_line(RASTER *restrict raster, double x1, double y1, double x2, doub #else +static RASTER *raster; +static RASTER *refraster; + + +static double +frand(double a, double b) +{ + int i = rand(); + double f = (double)i / (double)RAND_MAX; + double max = fmax(a, b); + double min = fmin(a, b); + return fma(f, max - min, min); +} + + +static void +check_against_reference(double x1, double y1, double x2, double y2) +{ + size_t i; + alarm(5); + draw_linear_bezier_reference(refraster, x1, y1, x2, y2); + alarm(0); + for (i = 0; i < 100; i++) { + ASSERT(intolerant_eq(raster->cells[i].cell_coverage, refraster->cells[i].cell_coverage)); + ASSERT(intolerant_eq(raster->cells[i].opposite_coverage, refraster->cells[i].opposite_coverage)); + } +} + + +static void +check_vertical_line(double x, double y1, double y2) +{ + alarm(5); + draw_vertical_line(raster, x, y1, y2, SIGNUM(y2 - y1)); + alarm(0); + check_against_reference(x, y1, x, y2); +} + + +static void +check_diagonal_line(double x1, double y1, double x2, double y2) +{ + double dx = x2 - x1; + double dy = y2 - y1; + alarm(5); + draw_diagonal_line(raster, x1, y1, x2, y2, dx, dy, SIGNUM(dx), SIGNUM(dy)); + alarm(0); + check_against_reference(x1, y1, x2, y2); +} + + +static void +check_bounded_line(double x1, double y1, double x2, double y2) +{ + alarm(5); + draw_bounded_line(raster, x1, y1, x2, y2); + alarm(0); + check_against_reference(x1, y1, x2, y2); +} + + +#ifndef ROWWISE_RESET_INKLEVEL +static void +check_vertical_line_opposite_only(double y1, double y2) +{ + alarm(5); + draw_vertical_line_opposite_only(raster, 9, y1, y2, SIGNUM(y2 - y1)); + alarm(0); + check_against_reference(20, y1, 20, y2); +} +#endif + + +static void +reset(void) +{ + rtgrpblib_reset_raster(raster, 10, 10); + rtgrpblib_reset_raster(refraster, 10, 10); +} + + int main(void) { - return 0; /* TODO add test */ + double x1, x2; + double y1, y2; + size_t i; + + raster = rtgrpblib_create_raster(10, 10); + ASSERT(raster); + refraster = rtgrpblib_create_raster(10, 10); + ASSERT(refraster); + srand((unsigned)(uintptr_t)raster); + + for (i = 0; i < 10000UL; i++) { + x1 = frand(0, 10); + y1 = frand(0, 10); + x2 = frand(0, 10); + y2 = frand(0, 10); + + check_vertical_line(x1, y1, y2); + reset(); + + if (x1 != x2) { + check_diagonal_line(x1, y1, x2, y2); + reset(); + } + + check_bounded_line(x1, y1, x1, y2); + reset(); + + check_bounded_line(x1, y1, x2, y2); + reset(); + +#ifndef ROWWISE_RESET_INKLEVEL + check_vertical_line_opposite_only(y1, y2); + reset(); +#endif + } + + free(raster); + free(refraster); + return 0; } |