aboutsummaryrefslogtreecommitdiffstats
path: root/lines.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2023-02-08 20:46:54 +0100
committerMattias Andrée <maandree@kth.se>2023-02-08 20:46:54 +0100
commit96fe8194386421855279c52a7061b8d21ba60767 (patch)
tree42b3cbbd6b5d1af446065be563f1243203eaf214 /lines.c
parentm whitespace (diff)
downloadlibrifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket-96fe8194386421855279c52a7061b8d21ba60767.tar.gz
librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket-96fe8194386421855279c52a7061b8d21ba60767.tar.bz2
librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket-96fe8194386421855279c52a7061b8d21ba60767.tar.xz
Test lines.c
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'lines.c')
-rw-r--r--lines.c121
1 files changed, 120 insertions, 1 deletions
diff --git a/lines.c b/lines.c
index dfe2448..d43c7fe 100644
--- a/lines.c
+++ b/lines.c
@@ -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;
}