From b30de64a8ca3de7632696f45bdb580217bd9f8a1 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 1 Mar 2009 10:05:16 +0000 Subject: [PATCH] [test] Add regression test for 005436 Jeff Muizelaar found a regression in commit 005436 and submitted this little test to exercise it. The essence of the bug appears to be wrt to the product of the CTM and device transform matrices. --- test/Makefile.sources | 1 + test/path-append.c | 81 +++++++++++++++++++++++++ test/path-append.ps.ref.png | Bin 0 -> 4516 bytes test/path-append.ref.png | Bin 0 -> 6165 bytes test/path-append.test-fallback.ref.png | Bin 0 -> 6461 bytes test/path-append.xlib-fallback.ref.png | Bin 0 -> 6357 bytes test/path-append.xlib.ref.png | Bin 0 -> 6461 bytes 7 files changed, 82 insertions(+) create mode 100644 test/path-append.c create mode 100644 test/path-append.ps.ref.png create mode 100644 test/path-append.ref.png create mode 100644 test/path-append.test-fallback.ref.png create mode 100644 test/path-append.xlib-fallback.ref.png create mode 100644 test/path-append.xlib.ref.png diff --git a/test/Makefile.sources b/test/Makefile.sources index 69c581b11..eb118acc8 100644 --- a/test/Makefile.sources +++ b/test/Makefile.sources @@ -126,6 +126,7 @@ test_sources = \ paint-repeat.c \ paint-source-alpha.c \ paint-with-alpha.c \ + path-append.c \ path-precision.c \ pattern-get-type.c \ pattern-getters.c \ diff --git a/test/path-append.c b/test/path-append.c new file mode 100644 index 000000000..bcd282db0 --- /dev/null +++ b/test/path-append.c @@ -0,0 +1,81 @@ +/* + * Copyright © 2009 Jeff Muizelaar + * Copyright © 2009 Chris Wilson + * + * 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 the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS 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. + */ + +#include +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_matrix_t m; + int xoffset = 50; + int yoffset = 50; + + cairo_surface_t *shadow; + cairo_t *shadow_cr; + cairo_path_t *path; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 130, 130); + cairo_rotate (cr, .5);//2*M_PI*angle/360); + cairo_rectangle (cr, 0, 0, 50, 100); + cairo_get_matrix (cr, &m); + + shadow = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + 600 - xoffset, + 600 - yoffset); + cairo_surface_set_device_offset (shadow, xoffset, yoffset); + shadow_cr = cairo_create (shadow); + cairo_surface_destroy (shadow); + + cairo_set_source_rgb (shadow_cr, 0, 1, 0); + cairo_set_matrix (shadow_cr, &m); + + path = cairo_copy_path (cr); + cairo_new_path (shadow_cr); + cairo_append_path (shadow_cr, path); + cairo_fill (shadow_cr); + cairo_path_destroy (path); + + cairo_identity_matrix (cr); + cairo_translate (cr, 10, 50); + cairo_set_source_surface (cr, cairo_get_target (shadow_cr), 0, 0); + cairo_paint (cr); + cairo_set_matrix (cr, &m); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill (cr); + + cairo_destroy (shadow_cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (path_append, + "Test appending path to a context, in particular to exercise a regression in 005436", + "path", /* keywords */ + NULL, /* requirements */ + 600, 600, + NULL, draw) diff --git a/test/path-append.ps.ref.png b/test/path-append.ps.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..fd8026f7544fbb7702cab2a25a4ee2f7eadf61f3 GIT binary patch literal 4516 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 DeaebDooP?sJ~|KJS}5&W^SR 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 YXK2Ox>vagg{}d3ri;fqn&U>f+7sVit>Hq)$ literal 0 HcmV?d00001 diff --git a/test/path-append.xlib.ref.png b/test/path-append.xlib.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..fa72ac06f3efa913b12fed071e78bedecd6ed5e2 GIT binary patch literal 6461 zcmeHMi8q_++YV~zW|=OkLaQm}SBe(VAfg*J)+wbaids??Yb=vkqUtx=YG|pQ(3;Yg zT4LWqb&8M(O)aUYsz@43EV0G2bc7L!m4POn#48$ey5EGe7KSZ%Wb}2b`p&@2g3PtDAvb zUQ^%4OJ_VzKL6S2j9=?sqvv~{{%mh8&0MxOYxKKv;F3O@W70o)@fvA3u)K9AYB8pj zsOG)fHqXBJRk+i*nn|?Dg-U|n9%n3rK>epx_Y~^?d;LGg04%vPHy%1$g>0(f!9ZuG znKgb6486~FAzm`37b3^=&v`AO@EKUa`H(vdJ+Z@gAm}fMt;>9}u_ZK+8b0hZ{h6AR zu2F!-X~msEClEGPD)fAQRf%2@BHCukdGmDl9iL8u{~fKkOQPr&*U;hpX*-i=4BK8d zML6wT9pcs1CH~7_<|BC;#A`u8v5QF;W107*INy^5b@k!i>T#jy1X?x%zpzgo*`(hE zPMb{bO^MZC(i3~`1wnU9$a+tI-r^WuUQY!wosdQGT~BCA-i0W6Ugl60Z%L-1Sy}$& zl+SNq0&7t~LCNzFzezI)=TJ8l8QYPtyv9u{SgyJr7vK#+ckoJr93<1qZs$ALTDrTF zHwFV@4x0r)JCa=*bi0&?`=rP`o5uC;V63-s!Cw16eKM> zj)p|bYplT+Bz|`dvf?IZIGz`?MzcWV6zqguA<8bC@`212*7}P;!rk?@Q$(1SrO1TNmQAQIOf^1-m9`>Qk9*vp-(6 zwq_#`C)UkyI3t|4*;=K1L{AGgzuY7B{(Ue$S_ZCP&-%nG5^G8zR6=$H2*$7>yVU#3 z41AvQUxkgE|7jPDNE_cdrtr3Qte%{{y+)^IW7*IC&=5OjgHC`1QBti7Ods>{SZ421 zHl6)Mk2INVlOo=4q6)@ZoXEeLl%w)pGGg>BhU?3rK2aWB{sm<7bBFxuToBi7{vPh( z*_k<7yreJDzP)ikTsRU)mNrcX~+R)EsDe8qTe#G{=b0*nbg_ODCC^P)jE!hDYW5lF1s7-s6wArBCgv4vmjRnySjt3s zoUFjzU|>K`_5nfROdB8AZMK1xq*yH7d_*P%L8PQLPoBvhi=_9Y10@20^r)$nuls=I zhFeIcc7 zP8juF{0_$5jdWGR{3Y)upzVN^PbZ9W7CtmjHuVvSTDS9fj9g%m&x`lMl%fT>W52yW zJ&$kOCyve_1UC#-&|^1!giFQTyYEM;kYs?P25_nNyWS9Rd1-|xci~?ej&dGW=!6eT z%M5_kMJZ6Y#r}vd|B;Yj2GkdGLC0PJu~3SdXyR&A>B)Ad5$QyJRo8iJC=vHogi6!! z)Xt{hQzjIc`G*e#+=QXei8wHCa%9hlkKy@>B8Ye<&4ol;P%nwW%lYQ zrdw51FUgkU0Zf8n1OO};-?C4R@xW57`r*a zOt$q-?iQ`7%pV7i)Bd(AFT)wIV2tLL6a?au-@|Jxip#pcEVgY<{As;`Hr*@{GKkCi zMhfk(0d7-Sjcx#X+`P?Q%`ER5PBFSC@`${8c1EYK_^}mqf=g{Qc6GEuvpiL}NQQmm zqgfs9=;YpzOm-@HIXvQ*IBgFI>n*?0K43NetdlN<)`%US-5iKsE)n`kC5rzLhjyH8 zUKs+%{?52u!;T8-JvSb}b55qOJB0R>QNO^9Qx@z&V;80CJs8CRmyYU)QVy7=s77)S zGAbRJ*4+u!m{oVSPNxs+Ax*Mhx#jp+yi(BYV}KshdoP!Iqz)ptorR@-*{dtjF%DZc z(!bEm8(?(PTt5aW)Q5pNz&9L4O~+t8Dkcz~=Dw~^_a{@I%^lxc*gPU_$nDW=ei?7M zvql+pe1AHrdi^zc#X?x*gB&7egPI-_79@wtC~OLLYq6MnjFr~x{pqbqm46g*HMNBe z5q4u?L2I*Li5lWz5=s;MT|+IMMPh)edj}{nYFk0@k&Xy)eo-(9}gaoh9jjPJ=#hSe0`1YhMIdx0&B7qfRAu8&ItS|3=zA@hb zOM3&W#c;*K@|=q(P2s$m-nTbI8+D(5`etpaZFQFQ$eH~(g*%yVEGtTZqCoCH0_d!; z#OT)hH`yCi(PhAB{TEy24Zb$&Ha*jWqR|==HuGk&i;w&A*HeUDYn)cm=)F^h9s6}e zEP%DO6&*3rN_=zD{^A^AVImP|lg_Sc0{18py1tt-%EM_yJiVAetEfI{`-6@>{}dqq<pOrmNLN=R|jV>C)Ri<-Pr{ z-zrUP32p59Q~TUsLp7^`A?7HX&z@NJPn$7)eqwI8aWaC=FJV9L%a_vK z=NMzK;Ua6ARo&OKGK`w+EVf`i0f20sr(cc=Sy)h!*&tz|Ufot?tSG51 z+jBN4B*n~_rlKRWR^yLgRRE$-WNHmNxVIW~x3~YcY_VK!h4s7{k@X6rv4hzW!m)PT zK8a(>_kt4W;ef3pogTiO`{+=vikc;-U~pic$}@w$fnA~$o3A5+ zx_57W9oRp36t%c)JrAH;^awaIohkG(B(m{5u)UDUU6R2g3?6)JGWdb9okie+HJ2_!+BY0gl5!st?)m91N zRNtJEpRVClapaU6Kx~g163~#BdB~c(LK_9086}PchX%}&((~ItO}`GNl{iM8sFTIR z1RU=*i$50rTdMvl2sso!{c|pHnME9xrKl(PkcELYg zi`AoV-}K|^I2uDxuTP46XFa6|TVvR2$K@TxZ(9v<|MCyz!P%cg0l9N_6gdLdVxW}hnO zsO<5msg{>{&xAE=0v4_%uOuGy4lsZBkQs9Y+s)t4WN%mRx;6IRI1hTafbuEr>sA!C zABCw?fFF5As8mBxWyf>sq429#$&_>Bl*k;Sc%i@a#5br9;|a9^5~&aG{?_SDP1SE^wH$%sX%xaOZc|-`7 zbMIF8`{{JMHz(WenbP&XHbd4ue-0wYM1?VEmht{}1bdb702HREG%@6wwO`b`Hy9Q1 zpbvlvd6_6!cy7&mT4Q_-ggMEW(5_9BSCg*scyOG;Uv8ojK_eiX&>x`XYdV1I``+H=njDr_~pd@*jaS3c8V%xoU82Sp+ zmMF#jW{g4E;fx|qwI}5gg4b7jZVz)e)R3W$$zG*;qL|1}eQGrC^i%J`{E+;u=g^whmbzmDip{&{2-u`89p{+cO({G0x!;abEGj#nBNU2T5n4} z$sx(z03o;`=fNJ4&aE;k<@)k(G~Syzp$R{o2*|FRnuKm>LZzjI;t#vsgN>e6_37F@ zFCiFjRHFFnkEH|ZE5&Ow!i|8&xrgAzj@=D@i;JX~c@81CX1!#~0l$&y!wkYVxYadl ztXcQg_?C$OK2R;6d=#IDAZx6-W@|>$`Ie@sDX&kONdYgO`R-HBnNy@gnD73AFU2Ua z-xm*E0{tqucR21-g51B?zZm?>fqyyhf13k4I(8}=!TE1~jR*b@0a;$Py;6S3BmRE? D