From 241ce933f8fa44210015dcdc4a66b3f9d8ac56e8 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 25 Apr 2010 09:37:50 +0100 Subject: [PATCH] test: Add clip-shape cu found a bug when using clipping and fills with the image backend, but it turns out to be the lost sign bug afflicting everything... To trigger the bug requires evaluating the clip surface prior to using in with _cairo_clip_combine_with_surface(). Which is taken along a particular path when using a clip mask with non-pixel geometry on image, but more easily hit by the fallback code. Reported-by: --- test/Makefile.am | 4 ++ test/Makefile.sources | 1 + test/clip-shape.c | 86 ++++++++++++++++++++++++++ test/clip-shape.ps.ref.png | Bin 0 -> 1797 bytes test/clip-shape.ref.png | Bin 0 -> 2935 bytes test/clip-shape.xlib-fallback.ref.png | Bin 0 -> 2916 bytes test/clip-shape.xlib.ref.png | Bin 0 -> 2944 bytes 7 files changed, 91 insertions(+) create mode 100644 test/clip-shape.c create mode 100644 test/clip-shape.ps.ref.png create mode 100644 test/clip-shape.ref.png create mode 100644 test/clip-shape.xlib-fallback.ref.png create mode 100644 test/clip-shape.xlib.ref.png diff --git a/test/Makefile.am b/test/Makefile.am index 5e2a38215..65f80e9c7 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -241,6 +241,10 @@ REFERENCE_IMAGES = \ clip-push-group.ref.png \ clip-push-group.svg.ref.png \ clip-push-group.xlib.ref.png \ + clip-shape.ref.png \ + clip-shape.ps.ref.png \ + clip-shape.xlib.ref.png \ + clip-shape.xlib-fallback.ref.png \ clip-stroke.ref.png \ clip-stroke.xlib.ref.png \ clip-stroke.xlib-fallback.ref.png \ diff --git a/test/Makefile.sources b/test/Makefile.sources index 1062e253a..df6c666f8 100644 --- a/test/Makefile.sources +++ b/test/Makefile.sources @@ -33,6 +33,7 @@ test_sources = \ clip-nesting.c \ clip-operator.c \ clip-push-group.c \ + clip-shape.c \ clip-stroke.c \ clip-stroke-no-op.c \ clip-stroke-unbounded.c \ diff --git a/test/clip-shape.c b/test/clip-shape.c new file mode 100644 index 000000000..6a74a6ed5 --- /dev/null +++ b/test/clip-shape.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Adapted from a bug report by */ + +#include "cairo-test.h" + +static const struct xy { + double x; + double y; +} gp[] = { + { 100, 250 }, + { 100, 100 }, + { 150, 230 }, + { 239, 100 }, + { 239, 250 }, +}; + +static const double vp[3] = { 100, 144, 238.5 }; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_paint (cr); /* opaque background */ + + for (i = 0; i < 5; ++i) + cairo_line_to (cr, gp[i].x, gp[i].y); + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 1.5); + cairo_stroke_preserve (cr); + cairo_clip (cr); + + for (i = 1; i < 3; ++i) { + double x1 = vp[i - 1]; + double x2 = vp[i]; + + cairo_move_to (cr, x1, 0); + cairo_line_to (cr, x1, height); + cairo_line_to (cr, x2, height); + cairo_line_to (cr, x2, 0); + cairo_close_path (cr); + + if (i & 1) + cairo_set_source_rgb (cr, 0, 1, 0); + else + cairo_set_source_rgb (cr, 1, 1, 0); + + cairo_fill (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_shape, + "Test handling of clipping with a non-aligned shape", + "clip", /* keywords */ + NULL, /* requirements */ + 400, 300, + NULL, draw) diff --git a/test/clip-shape.ps.ref.png b/test/clip-shape.ps.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..1125fb59513f4c275bccaf83ef45a822ac2a21e0 GIT binary patch literal 1797 zcmchY`%@EF7>45#(p*3j(*(Il0tj9nxHT2pA)3k$@OcQPiM_ih@RAyhmzx`xkWjL(iEr`^r@6;20SZx{^ScP>c;88Necmw|`b)A5vn}(on)zyq`E za&3$2QaZ`p*hw)?KmLOLoL&x0#d@rS8ljkZb>^H&HIJA(Rz#jUIb%voV34Kdb=aJm zx@VU*`g>w^|JP>NRw*Yu8tVII#uCZXY=0Z!tq+=>S+GqlC!GlhYwZ%)ou?r7?lR6U zu$xiSm$Hi|2)i8iB4T*v@-`UeCb6m23$CvIqIUiGV;=HPPtKh$s62V zmY;h^yPE;0Z38QR}r(a^kNbd9{H5FwRI>z@QxOn7#aVOox_vT6%G5LfCKypGIFq$H8BGsF<{pU zrTd`o;~&HxXk$jlaJ2IiP|=_gJ@4;kOuqwqhDiJdN^W1*@vr(5A-jHR;8|-yHbyc{ z;OI@(Yceul-}cO473{4eLayTVYd@H{90t6pT$vu_{A3BBbxtU5Oti3qJW;hT&9cYR zzRm*`_fVT+N#{Z&4Nq!+@{$&h5TPiUrU|tceDy|MGCIWVd*(LL;e!>*_;zbjx(9j> ziwT{dgag_|o0Wx?p7ANi6|;y?u1w>EE$2Q3nXPYg?UQ$T0$N(_8+JTNB$Q;XXMbj! zxKR`&en)Ulm8BiwqB*`axe_BUbU_dGm&?o7;4}t(^k^v(MN2Z1*`IT>I69?qxYK)N zsY$(3u~N=+;}hVsJE4$A@-))c7ktjvf?PnjjV-u zxuZt4qzo@YqQlIW^{iRD9k{5^-G@AV=9&W@=(D>wovO1qa}OBRN&Y&sU_;6@h2J%S zcmTW8#Xy>RYAfrWyi0=7u+D7a4pNW`VM6^&fo!3|FV-STZ7HeFCOEkRwK++PR}!HOaVeVGmXmG@Ron&Ww8P3nM$?&C zP;Vw&Gklw&9+gVo`3Za1^GkJitYc30i$DvqssXMT~-Rx)*px4;sX&{|ImQB%uQjO z_42PyJSCWn+!HjlVUF_s!nYANj(s~Sv#|CJ>|K5TMWU?Ojsd?r7r$i+K*OHc2~sle zgoDDq)C1kcC$d-UH3B9&yx93)PhN@nGT%mUc(mD&{*FERqNZR++6ZpAD<^TP^ b@!O|Ko!#!Iv$oUk<3%FFVnWY^Nb>#$NH*W% literal 0 HcmV?d00001 diff --git a/test/clip-shape.ref.png b/test/clip-shape.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..e80f666f244067a3eea12d3cc8cc5ff1f20b8eb0 GIT binary patch literal 2935 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 GOaB91%7x4T literal 0 HcmV?d00001 diff --git a/test/clip-shape.xlib.ref.png b/test/clip-shape.xlib.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..a6804a7feb225dc2df88027e8c9471cc3dda87e9 GIT binary patch literal 2944 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 e`QMM8H