diff --git a/test/Makefile.am b/test/Makefile.am index ef358522d..b063a17e7 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -44,6 +44,7 @@ get-group-target \ get-path-extents \ gradient-alpha \ infinite-join \ +in-fill-empty-trapezoid \ leaky-dash \ leaky-polygon \ line-width \ @@ -238,6 +239,8 @@ glyph-cache-pressure-ps-argb32-ref.png \ glyph-cache-pressure-svg-ref.png \ gradient-alpha-ref.png \ gradient-alpha-rgb24-ref.png \ +in-fill-empty-trapezoid-ref.png \ +in-fill-empty-trapezoid-rgb24-ref.png \ infinite-join-ref.png \ infinite-join-ps-argb32-ref.png \ leaky-dash-ref.png \ diff --git a/test/in-fill-empty-trapezoid-ref.png b/test/in-fill-empty-trapezoid-ref.png new file mode 100644 index 000000000..60ae61784 Binary files /dev/null and b/test/in-fill-empty-trapezoid-ref.png differ diff --git a/test/in-fill-empty-trapezoid-rgb24-ref.png b/test/in-fill-empty-trapezoid-rgb24-ref.png new file mode 100644 index 000000000..ef08ebb59 Binary files /dev/null and b/test/in-fill-empty-trapezoid-rgb24-ref.png differ diff --git a/test/in-fill-empty-trapezoid.c b/test/in-fill-empty-trapezoid.c new file mode 100644 index 000000000..2999ec579 --- /dev/null +++ b/test/in-fill-empty-trapezoid.c @@ -0,0 +1,89 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * 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 Joonas Pihlaja + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Joonas Pihlaja makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * JOONAS PIHLAJA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL JOONAS PIHLAJA 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: M Joonas Pihlaja + */ + +/* Bug history + * + * 2006-12-05 M Joonas Pihlaja + * + * The cairo_in_fill () function can sometimes produce false + * positives when the tessellator produces empty trapezoids + * and the query point lands exactly on a trapezoid edge. + */ + +#include "cairo-test.h" + +static cairo_test_draw_function_t draw; + +cairo_test_t test = { + "in-fill-empty-trapezoid", + "Tests that the tessellator doesn't produce obviously empty trapezoids", + 10, 10, + draw +}; + +static cairo_test_status_t +draw (cairo_t *cr_orig, int width, int height) +{ + int x,y; + cairo_surface_t *surf = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + cairo_t *cr = cairo_create (surf); + cairo_set_source_rgb (cr_orig, 1, 0, 0); + + /* Empty horizontal trapezoid. */ + cairo_move_to (cr, 0, height/3); + cairo_line_to (cr, width, height/3); + cairo_close_path (cr); + + /* Empty non-horizontal trapezoid #1. */ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, width, height/2); + cairo_close_path (cr); + + /* Empty non-horizontal trapezoid #2 intersecting #1. */ + cairo_move_to (cr, 0, height/2); + cairo_line_to (cr, width, 0); + cairo_close_path (cr); + + /* Point sample the tessellated path. The x and y starting offsets + * are chosen to hit the nasty bits while still being able to do a + * relatively sparse sampling. */ + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + if (cairo_in_fill (cr, x, y)) { + cairo_rectangle(cr_orig, x, y, 1, 1); + cairo_fill (cr_orig); + } + } + } + cairo_destroy (cr); + cairo_surface_destroy (surf); + return CAIRO_TEST_SUCCESS; +} + +int +main (void) +{ + return cairo_test (&test); +}