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 000000000..25442c049 Binary files /dev/null and b/test/fill-rule-ref.png differ diff --git a/test/fill-rule.c b/test/fill-rule.c new file mode 100644 index 000000000..40ab9a123 --- /dev/null +++ b/test/fill-rule.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* 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 000000000..25442c049 Binary files /dev/null and b/test/fill_rule-ref.png differ diff --git a/test/fill_rule.c b/test/fill_rule.c new file mode 100644 index 000000000..40ab9a123 --- /dev/null +++ b/test/fill_rule.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* 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); +}