From 667fa8fc15044f1d488aa98a74c29206b921d57e Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 27 Oct 2004 10:48:58 +0000 Subject: [PATCH] Add new test for cairo_set_fill_rule. Also demonstrate some of the current tessellation bugs with the version of the code that is in CVS. --- ChangeLog | 6 +++ test/.cvsignore | 1 + test/Makefile.am | 26 +++++++----- test/fill-rule-ref.png | Bin 0 -> 408 bytes test/fill-rule.c | 90 +++++++++++++++++++++++++++++++++++++++++ test/fill_rule-ref.png | Bin 0 -> 408 bytes test/fill_rule.c | 90 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 204 insertions(+), 9 deletions(-) create mode 100644 test/fill-rule-ref.png create mode 100644 test/fill-rule.c create mode 100644 test/fill_rule-ref.png create mode 100644 test/fill_rule.c diff --git a/ChangeLog b/ChangeLog index 787f19bbf..9db2d9dd6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-10-27 Carl Worth + + * test/fill_rule.c: Add new test for cairo_set_fill_rule. Also + demonstrate some of the current tessellation bugs with the version + of the code that is in CVS. + 2004-10-26 Carl Worth * test/cairo_test.c (cairo_test): Find reference images in diff --git a/test/.cvsignore b/test/.cvsignore index 1937368c3..3b5304218 100644 --- a/test/.cvsignore +++ b/test/.cvsignore @@ -2,6 +2,7 @@ .libs Makefile Makefile.in +fill_rule line_width move_to_show_surface *-out.png diff --git a/test/Makefile.am b/test/Makefile.am index b0729cc71..13216d72d 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,10 +1,20 @@ +# All new test cases go here TESTS = \ +fill_rule \ line_width \ move_to_show_surface -# Known bugs (not regressions). We do need to fix these before the -# next release, but they are expected to fail for now, so they don't -# need to hold up any new code commit. +# And all new test go here too. I really don't like having to repeat +# this list. Anyone know a good way to avoid it? Can I use a wildcard +# here? +EXTRA_DIST = \ +fill_rule-ref.png \ +line_width-ref.png \ +move_to_show_surface-ref.png + +# This list is only for known bugs (not regressions). We do need to +# fix these before the next release, but they are expected to fail for +# now, so they don't need to hold up any new code commit. # # When new bugs are found in committed code they can be listed # here. New failures due to local, uncommitted code changes are @@ -13,12 +23,6 @@ move_to_show_surface XFAIL_TESTS = \ move_to_show_surface -# Ugh, don't like having to repeat this list so much. Can I use a -# wildcard here? -EXTRA_DIST = \ -line_width-ref.png \ -move_to_show_surface-ref.png - check_PROGRAMS = $(TESTS) # We're using _GNU_SOURCE to get the prototype for asprintf. This may @@ -39,6 +43,10 @@ write_png.h \ xmalloc.c \ xmalloc.h +# ARGH! I have to repeat the list of tests a third time. Maybe it's +# time to break down and auto-generate the Makefile.am or something +# from autogen.sh. My, but this is painful... +fill_rule_SOURCES = fill_rule.c $(cairo_test_lib) line_width_SOURCES = line_width.c $(cairo_test_lib) move_to_show_surface_SOURCES = move_to_show_surface.c $(cairo_test_lib) diff --git a/test/fill-rule-ref.png b/test/fill-rule-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..25442c049a431609e1a39b1025024ed5f499c35b GIT binary patch literal 408 zcmV;J0cZY+P)^?g@INAt4Q|NPnlxciEje;z(5=C5{1q8!22TAG>N9d_y(I?&D4CjW=?1Rk!qUc zW5hN%_Ao2m&+R>(WE%MFIGOE}eeP*q1U~wht_tIuh3LvNhG}3^VVozkbz9_9nI^H6 z(1pyO3*UPc4Q=}Vy6(U}gHIo<@Ald^rj23FxBUPrM%WCgp+8Un0000 + */ + +/* Bug history + * + * 2004-10-27 Carl Worth + * + * There's currently a regression bug in the tessellation code. This + * causes each of these simple star shapes to be filled incorrectly. + * + * It looks like right now we can get this test to pass by doing: + * + * cvs update -r 1.16 src/cairo_traps.c + * + * But we don't want to revert that change permanently since it + * really does correct some bugs. It must be that the old version of + * the code is masking some other bugs in the tessellation code. My + * current plan is to back this revision up for the next snapshot, + * but not to list the test as an expected failure since I'm + * planning on doing the new tessellator which should fix this + * problem. + * + */ + +#include "cairo_test.h" + +#define STAR_SIZE 20 + +cairo_test_t test = { + "fill_rule", + "Tests cairo_set_full_rule with a star shape", + STAR_SIZE * 2 + 3, STAR_SIZE +2 +}; + + +/* Not a perfect star, but one that does show the tessellation bug. */ +static void +star_path (cairo_t *cr) +{ + cairo_move_to (cr, 10, 0); + cairo_rel_line_to (cr, 6, 20); + cairo_rel_line_to (cr, -16, -12); + cairo_rel_line_to (cr, 20, 0); + cairo_rel_line_to (cr, -16, 12); +} + +/* Fill the same path twice, once with each fill rule */ +static void +draw (cairo_t *cr, int width, int height) +{ + cairo_set_rgb_color (cr, 1, 0, 0); + + cairo_translate (cr, 1, 1); + star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + cairo_fill (cr); + + cairo_translate (cr, STAR_SIZE + 1, 0); + star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); +} + +int +main (void) +{ + return cairo_test (&test, draw); +} diff --git a/test/fill_rule-ref.png b/test/fill_rule-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..25442c049a431609e1a39b1025024ed5f499c35b GIT binary patch literal 408 zcmV;J0cZY+P)^?g@INAt4Q|NPnlxciEje;z(5=C5{1q8!22TAG>N9d_y(I?&D4CjW=?1Rk!qUc zW5hN%_Ao2m&+R>(WE%MFIGOE}eeP*q1U~wht_tIuh3LvNhG}3^VVozkbz9_9nI^H6 z(1pyO3*UPc4Q=}Vy6(U}gHIo<@Ald^rj23FxBUPrM%WCgp+8Un0000 + */ + +/* Bug history + * + * 2004-10-27 Carl Worth + * + * There's currently a regression bug in the tessellation code. This + * causes each of these simple star shapes to be filled incorrectly. + * + * It looks like right now we can get this test to pass by doing: + * + * cvs update -r 1.16 src/cairo_traps.c + * + * But we don't want to revert that change permanently since it + * really does correct some bugs. It must be that the old version of + * the code is masking some other bugs in the tessellation code. My + * current plan is to back this revision up for the next snapshot, + * but not to list the test as an expected failure since I'm + * planning on doing the new tessellator which should fix this + * problem. + * + */ + +#include "cairo_test.h" + +#define STAR_SIZE 20 + +cairo_test_t test = { + "fill_rule", + "Tests cairo_set_full_rule with a star shape", + STAR_SIZE * 2 + 3, STAR_SIZE +2 +}; + + +/* Not a perfect star, but one that does show the tessellation bug. */ +static void +star_path (cairo_t *cr) +{ + cairo_move_to (cr, 10, 0); + cairo_rel_line_to (cr, 6, 20); + cairo_rel_line_to (cr, -16, -12); + cairo_rel_line_to (cr, 20, 0); + cairo_rel_line_to (cr, -16, 12); +} + +/* Fill the same path twice, once with each fill rule */ +static void +draw (cairo_t *cr, int width, int height) +{ + cairo_set_rgb_color (cr, 1, 0, 0); + + cairo_translate (cr, 1, 1); + star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + cairo_fill (cr); + + cairo_translate (cr, STAR_SIZE + 1, 0); + star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); +} + +int +main (void) +{ + return cairo_test (&test, draw); +}