From e94e0a1ca262ef67b527b13a5e9691ad42a43204 Mon Sep 17 00:00:00 2001 From: M Joonas Pihlaja Date: Tue, 5 Dec 2006 12:20:17 +0200 Subject: [PATCH] test: check if cairo_in_fill() is reporting false positives for empty trapezoids. cairo_in_fill() may report true if a query point lands on an edge of an empty trapezoid. --- test/Makefile.am | 3 + test/in-fill-empty-trapezoid-ref.png | Bin 0 -> 108 bytes test/in-fill-empty-trapezoid-rgb24-ref.png | Bin 0 -> 107 bytes test/in-fill-empty-trapezoid.c | 89 +++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 test/in-fill-empty-trapezoid-ref.png create mode 100644 test/in-fill-empty-trapezoid-rgb24-ref.png create mode 100644 test/in-fill-empty-trapezoid.c 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 0000000000000000000000000000000000000000..60ae6178467a58b0e56942e10a53e5037a96484e GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u_bxCyDyxmw5WR zvR~t2<+Na&dgZ?}P>9dd#W6%;YI1@EYqKx|1LG_PMzK?uGl4P;p00i_>zopr01m_& AO8@`> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ef08ebb59683d486318e2718448df3a7fd1feb66 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ihz4G4~D8%dO;us<^H90|obqO;AqZtF^(eC-|KnVs + */ + +/* 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); +}