summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-06-12 13:18:42 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2010-06-12 13:30:24 +0100
commit4e3ef57bc892b0b046c486390adc7164a1de64de (patch)
treea5e1b88c561eb77bcb05227c70f830f18f34384b /test
parent9b7cc7641b691a3b9e3d5edd51053c9a095d9c5a (diff)
test: More coverage coverage.
A couple of different shapes that aim to test the tessellation side of the rasterisers more... And worryingly there does seem to be an unexpected systematic error.
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.am8
-rw-r--r--test/coverage-column-triangles.ref.pngbin0 -> 208 bytes
-rw-r--r--test/coverage-column-triangles.xlib.xfail.pngbin0 -> 12745 bytes
-rw-r--r--test/coverage-intersecting-quads.ref.pngbin0 -> 253 bytes
-rw-r--r--test/coverage-intersecting-quads.xlib.xfail.pngbin0 -> 15296 bytes
-rw-r--r--test/coverage-intersecting-triangles.ref.pngbin0 -> 209 bytes
-rw-r--r--test/coverage-intersecting-triangles.xlib.xfail.pngbin0 -> 16728 bytes
-rw-r--r--test/coverage-row-triangles.ref.pngbin0 -> 208 bytes
-rw-r--r--test/coverage-row-triangles.xlib.xfail.pngbin0 -> 12671 bytes
-rw-r--r--test/coverage.c249
10 files changed, 251 insertions, 6 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
index bc43e480..836b1b40 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -345,6 +345,14 @@ REFERENCE_IMAGES = \
copy-path.ref.png \
coverage-rectangles.ref.png \
coverage-rectangles.xlib.xfail.png \
+ coverage-intersecting-triangles.ref.png \
+ coverage-intersecting-triangles.xlib.xfail.png \
+ coverage-intersecting-quads.ref.png \
+ coverage-intersecting-quads.xlib.xfail.png \
+ coverage-row-trianges.ref.png \
+ coverage-row-trianges.xlib.xfail.png \
+ coverage-column-trianges.ref.png \
+ coverage-column-trianges.xlib.xfail.png \
coverage-triangles.ref.png \
coverage-triangles.xlib.xfail.png \
create-from-png-stream.ref.png \
diff --git a/test/coverage-column-triangles.ref.png b/test/coverage-column-triangles.ref.png
new file mode 100644
index 00000000..aa61031b
--- /dev/null
+++ b/test/coverage-column-triangles.ref.png
Binary files differ
diff --git a/test/coverage-column-triangles.xlib.xfail.png b/test/coverage-column-triangles.xlib.xfail.png
new file mode 100644
index 00000000..f433b7a8
--- /dev/null
+++ b/test/coverage-column-triangles.xlib.xfail.png
Binary files differ
diff --git a/test/coverage-intersecting-quads.ref.png b/test/coverage-intersecting-quads.ref.png
new file mode 100644
index 00000000..f56cb557
--- /dev/null
+++ b/test/coverage-intersecting-quads.ref.png
Binary files differ
diff --git a/test/coverage-intersecting-quads.xlib.xfail.png b/test/coverage-intersecting-quads.xlib.xfail.png
new file mode 100644
index 00000000..d6b8c2ef
--- /dev/null
+++ b/test/coverage-intersecting-quads.xlib.xfail.png
Binary files differ
diff --git a/test/coverage-intersecting-triangles.ref.png b/test/coverage-intersecting-triangles.ref.png
new file mode 100644
index 00000000..40a48c13
--- /dev/null
+++ b/test/coverage-intersecting-triangles.ref.png
Binary files differ
diff --git a/test/coverage-intersecting-triangles.xlib.xfail.png b/test/coverage-intersecting-triangles.xlib.xfail.png
new file mode 100644
index 00000000..e64cd474
--- /dev/null
+++ b/test/coverage-intersecting-triangles.xlib.xfail.png
Binary files differ
diff --git a/test/coverage-row-triangles.ref.png b/test/coverage-row-triangles.ref.png
new file mode 100644
index 00000000..aa61031b
--- /dev/null
+++ b/test/coverage-row-triangles.ref.png
Binary files differ
diff --git a/test/coverage-row-triangles.xlib.xfail.png b/test/coverage-row-triangles.xlib.xfail.png
new file mode 100644
index 00000000..f8582fbb
--- /dev/null
+++ b/test/coverage-row-triangles.xlib.xfail.png
Binary files differ
diff --git a/test/coverage.c b/test/coverage.c
index 70ef97b7..198ebae8 100644
--- a/test/coverage.c
+++ b/test/coverage.c
@@ -30,12 +30,15 @@
* driver test suite.
*/
+#define GENERATE_REFERENCE 0
+
#define WIDTH 256
#define HEIGHT 40
#include "../src/cairo-fixed-type-private.h"
#define PRECISION (1 << CAIRO_FIXED_FRAC_BITS)
+/* XXX beware multithreading! */
static uint32_t state;
static uint32_t
@@ -47,10 +50,12 @@ hars_petruska_f54_1_random (void)
}
static double
-random_offset (int range)
+random_offset (int range, int precise)
{
double x = hars_petruska_f54_1_random() / (double) UINT32_MAX * range / WIDTH;
- return floor (x * PRECISION) / PRECISION;
+ if (precise)
+ x = floor (x * PRECISION) / PRECISION;
+ return x;
}
static cairo_test_status_t
@@ -63,6 +68,13 @@ rectangles (cairo_t *cr, int width, int height)
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
cairo_paint (cr);
+#if GENERATE_REFERENCE
+ for (x = 0; x < WIDTH; x++) {
+ cairo_set_source_rgba (cr, 1, 1, 1, x * x * 1.0 / (WIDTH * WIDTH));
+ cairo_rectangle (cr, x, 0, 1, HEIGHT);
+ cairo_fill (cr);
+ }
+#else
cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
for (channel = 0; channel < 3; channel++) {
switch (channel) {
@@ -74,13 +86,111 @@ rectangles (cairo_t *cr, int width, int height)
for (x = 0; x < WIDTH; x++) {
for (y = 0; y < HEIGHT; y++) {
- double dx = random_offset (WIDTH - x);
- double dy = random_offset (WIDTH - x);
+ double dx = random_offset (WIDTH - x, TRUE);
+ double dy = random_offset (WIDTH - x, TRUE);
cairo_rectangle (cr, x + dx, y + dy, x / (double) WIDTH, x / (double) WIDTH);
}
}
cairo_fill (cr);
}
+#endif
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+static cairo_test_status_t
+intersecting_quads (cairo_t *cr, int width, int height)
+{
+ int x, y, channel;
+
+ state = 0x12345678;
+
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_paint (cr);
+
+#if GENERATE_REFERENCE
+ for (x = 0; x < WIDTH; x++) {
+ cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH));
+ cairo_rectangle (cr, x, 0, 1, HEIGHT);
+ cairo_fill (cr);
+ }
+#else
+ cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
+ for (channel = 0; channel < 3; channel++) {
+ switch (channel) {
+ default:
+ case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break;
+ case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break;
+ case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
+ }
+
+ for (x = 0; x < WIDTH; x++) {
+ double step = x / (double) WIDTH;
+ for (y = 0; y < HEIGHT; y++) {
+ double dx = random_offset (WIDTH - x, TRUE);
+ double dy = random_offset (WIDTH - x, TRUE);
+ cairo_move_to (cr, x + dx, y + dy);
+ cairo_rel_line_to (cr, step, step);
+ cairo_rel_line_to (cr, 0, -step);
+ cairo_rel_line_to (cr, -step, step);
+ cairo_close_path (cr);
+ }
+ }
+ cairo_fill (cr);
+ }
+#endif
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+static cairo_test_status_t
+intersecting_triangles (cairo_t *cr, int width, int height)
+{
+ int x, y, channel;
+
+ state = 0x12345678;
+
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_paint (cr);
+
+#if GENERATE_REFERENCE
+ for (x = 0; x < WIDTH; x++) {
+ cairo_set_source_rgba (cr, 1, 1, 1, x * 0.75 / WIDTH);
+ cairo_rectangle (cr, x, 0, 1, HEIGHT);
+ cairo_fill (cr);
+ }
+#else
+ cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
+ for (channel = 0; channel < 3; channel++) {
+ switch (channel) {
+ default:
+ case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break;
+ case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break;
+ case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
+ }
+
+ for (x = 0; x < WIDTH; x++) {
+ double step = x / (double) WIDTH;
+ for (y = 0; y < HEIGHT; y++) {
+ double dx = random_offset (WIDTH - x, TRUE);
+ double dy = random_offset (WIDTH - x, TRUE);
+
+ /* left */
+ cairo_move_to (cr, x + dx, y + dy);
+ cairo_rel_line_to (cr, 0, step);
+ cairo_rel_line_to (cr, step, 0);
+ cairo_close_path (cr);
+
+ /* right, mirrored */
+ cairo_move_to (cr, x + dx + step, y + dy + step);
+ cairo_rel_line_to (cr, 0, -step);
+ cairo_rel_line_to (cr, -step, step);
+ cairo_close_path (cr);
+ }
+ }
+ cairo_fill (cr);
+ }
+#endif
return CAIRO_TEST_SUCCESS;
}
@@ -95,6 +205,13 @@ triangles (cairo_t *cr, int width, int height)
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
cairo_paint (cr);
+#if GENERATE_REFERENCE
+ for (x = 0; x < WIDTH; x++) {
+ cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH));
+ cairo_rectangle (cr, x, 0, 1, HEIGHT);
+ cairo_fill (cr);
+ }
+#else
cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
for (channel = 0; channel < 3; channel++) {
switch (channel) {
@@ -106,8 +223,8 @@ triangles (cairo_t *cr, int width, int height)
for (x = 0; x < WIDTH; x++) {
for (y = 0; y < HEIGHT; y++) {
- double dx = random_offset (WIDTH - x);
- double dy = random_offset (WIDTH - x);
+ double dx = random_offset (WIDTH - x, TRUE);
+ double dy = random_offset (WIDTH - x, TRUE);
cairo_move_to (cr, x + dx, y + dy);
cairo_rel_line_to (cr, x / (double) WIDTH, 0);
cairo_rel_line_to (cr, 0, x / (double) WIDTH);
@@ -116,6 +233,101 @@ triangles (cairo_t *cr, int width, int height)
}
cairo_fill (cr);
}
+#endif
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+static cairo_test_status_t
+column_triangles (cairo_t *cr, int width, int height)
+{
+ int x, y, i, channel;
+
+ state = 0x12345678;
+
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_paint (cr);
+
+#if GENERATE_REFERENCE
+ for (x = 0; x < WIDTH; x++) {
+ cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH);
+ cairo_rectangle (cr, x, 0, 1, HEIGHT);
+ cairo_fill (cr);
+ }
+#else
+ cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
+ for (channel = 0; channel < 3; channel++) {
+ switch (channel) {
+ default:
+ case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break;
+ case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break;
+ case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
+ }
+
+ for (x = 0; x < WIDTH; x++) {
+ double step = x / (double) (2 * WIDTH);
+ for (y = 0; y < HEIGHT; y++) {
+ for (i = 0; i < PRECISION; i++) {
+ double dy = random_offset (WIDTH - x, FALSE);
+
+ cairo_move_to (cr, x + i / (double) PRECISION, y + dy);
+ cairo_rel_line_to (cr, 0, step);
+ cairo_rel_line_to (cr, 1 / (double) PRECISION, step);
+ cairo_rel_line_to (cr, 0, -step);
+ cairo_close_path (cr);
+ }
+ cairo_fill (cr); /* do these per-pixel due to the extra volume of edges */
+ }
+ }
+ }
+#endif
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+static cairo_test_status_t
+row_triangles (cairo_t *cr, int width, int height)
+{
+ int x, y, i, channel;
+
+ state = 0x12345678;
+
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_paint (cr);
+
+#if GENERATE_REFERENCE
+ for (x = 0; x < WIDTH; x++) {
+ cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH);
+ cairo_rectangle (cr, x, 0, 1, HEIGHT);
+ cairo_fill (cr);
+ }
+#else
+ cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
+ for (channel = 0; channel < 3; channel++) {
+ switch (channel) {
+ default:
+ case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break;
+ case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break;
+ case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
+ }
+
+ for (x = 0; x < WIDTH; x++) {
+ double step = x / (double) (2 * WIDTH);
+ for (y = 0; y < HEIGHT; y++) {
+ for (i = 0; i < PRECISION; i++) {
+ double dx = random_offset (WIDTH - x, FALSE);
+
+ cairo_move_to (cr, x + dx, y + i / (double) PRECISION);
+ cairo_rel_line_to (cr, step, 0);
+ cairo_rel_line_to (cr, step, 1 / (double) PRECISION);
+ cairo_rel_line_to (cr, -step, 0);
+ cairo_close_path (cr);
+ }
+ cairo_fill (cr); /* do these per-pixel due to the extra volume of edges */
+ }
+ }
+ }
+#endif
return CAIRO_TEST_SUCCESS;
}
@@ -127,6 +339,31 @@ CAIRO_TEST (coverage_rectangles,
WIDTH, HEIGHT,
NULL, rectangles)
+CAIRO_TEST (coverage_intersecting_quads,
+ "Check the fidelity of the rasterisation.",
+ NULL, /* keywords */
+ "target=raster", /* requirements */
+ WIDTH, HEIGHT,
+ NULL, intersecting_quads)
+
+CAIRO_TEST (coverage_intersecting_triangles,
+ "Check the fidelity of the rasterisation.",
+ NULL, /* keywords */
+ "target=raster", /* requirements */
+ WIDTH, HEIGHT,
+ NULL, intersecting_triangles)
+CAIRO_TEST (coverage_row_triangles,
+ "Check the fidelity of the rasterisation.",
+ NULL, /* keywords */
+ "target=raster", /* requirements */
+ WIDTH, HEIGHT,
+ NULL, row_triangles)
+CAIRO_TEST (coverage_column_triangles,
+ "Check the fidelity of the rasterisation.",
+ NULL, /* keywords */
+ "target=raster", /* requirements */
+ WIDTH, HEIGHT,
+ NULL, column_triangles)
CAIRO_TEST (coverage_triangles,
"Check the fidelity of the rasterisation.",
NULL, /* keywords */