[cairo] [PATCH] Add another high-curvature spline to the bug-spline test case

Carl Worth cworth at cworth.org
Mon Jun 25 10:20:11 PDT 2012


This demonstrates that there are still rendering errors in stroking
high-curvature splines far beyond the specified tolerance, (notice
multi-pixel errors in the failure images).

The reference image here was obtained with cairo-1.8.0. We need not
match its rendering pixel-for-pixel, but we shouldn't have the larger
errors that we have here.
---

Chris Wilson <chris at chris-wilson.co.uk> writes:
> A simple fix in the meantime is just to look at the cosine between the
> two segments and decide whether the bevel join the two is within
> tolerance of the ideal round join.

Hi Chris,

I saw your fixes go by this weekend.

There are still lots of bugs here. See the attached update to the
bug-spline test case showing that in areas of high curvature the stroke
boundary is still being very poorly approximated by long straight lines
in many cases.

And I'm still confused by language in your recent commits:
    
    If the angle between two segments is small we can simply replace the
    round-join with a bevel-join. This is done automatically by the
    insertion of the triangle fan as it will not be able to find a point
    around the pen between the two vectors. However, we can make that search
    cheaper by inspecting whether the bisection angle is small enough that
    the bevel-join will be within geometric tolerance of the round-join.

Why are we computing new triangle fans, etc. during stroking? The
insight of the original algorithm is that we can simply copy portions of
the pen to the stroke outline. We've already done a fair amount of work
to compute a good pen, and we should just use that rather than trying to
recompute something.

See the attached reference image from cairo 1.8.0 which shows how things
should look.

Meanwhile, for splines stroked with a large width, and with
high-curvature near the end point, the current algorithm is doing
extremely badly. The errors are multiple orders of magnitude worse than
what I'm showing here. Granted, those errors are in ugly "holes" in the
stroke due to self-intersections within the outline from convolving the
pen and the path. I don't know that anyone every really wants to draw
those holes, but cairo (up to 1.8) at least drew them smoothly, while
the current code just goes insane.

Contrast these two:

http://cworth.org/~cworth/tmp/tough-butt-spline-cairo-1.8.png

http://cworth.org/~cworth/tmp/tough-butt-spline-cairo-1.12.2-101-g13d61d7.png

Source to render that here:

http://cworth.org/~cworth/tmp/tough-butt-spline.c

Oddly, even outside the "hole", there's a huge approximation error on
the outside of that stroke as well. That error should be independent of
the butt-cap used here, but the error is not visible with
CAIRO_LINE_CAP_ROUND, (perhaps the capping code is adding a full-circle
cap instead of only the half-circle that's strictly needed?).

Looking forward to more form you,

-Carl

 test/bug-spline.c                 |   10 ++++++++++
 test/reference/bug-spline.ref.png |  Bin 5476 -> 6698 bytes
 2 files changed, 10 insertions(+)

diff --git a/test/bug-spline.c b/test/bug-spline.c
index 00a915c..912b28b 100644
--- a/test/bug-spline.c
+++ b/test/bug-spline.c
@@ -54,6 +54,16 @@ static const struct spline {
 	},
 	NARROW_LINE_WIDTH,
 	{ 1, 0, 0, 1 },
+    },
+    {
+	{
+	    { -9, -73 },
+	    { 105, 44 },
+	    { 27, 61 },
+	    { 41, -55 }
+	},
+	WIDE_LINE_WIDTH,
+	{ 1, 1, 1, 1 }
     }
 };
 #define NUM_SPLINES (sizeof(splines)/sizeof(splines[0]))
diff --git a/test/reference/bug-spline.ref.png b/test/reference/bug-spline.ref.png
index ebef26144a827e3630b2b6c1baec1213d8a77f01..d6b0ab8149a213f1655af8a44cac6a3381e2bf7f 100644
GIT binary patch
literal 6698
zcmbVxcQjmI)Hb5aMDHOCQ4<8w+b|Q6gy=0w2qGdnqYEa{i59&Lq9l6nB_R^MMKF4A
zqj%yvzW2A*`~Q3Insx8obI!i|?DFhq&xEL}DMLt^NO5p*AS#dHnm9PP_pU$0c;Ly=
z9Y!d)5Sl+#hT~japP5a0u{b!4Gb(VHwtMQ<l!t at 1Wj*0eO>Ey#ngU%c4#MKstw1v!
zg{6Q19)iAS_>T89co=o*wZk3ZL;`Wbo=xG-#tJ-b1VU0;!QpW?gm2-;m;Rz+S5Txv
zDd4G6#q>>2&0KQaV?TH5^JsDI+yAP~r_=gt|GuDo#&BN4eMMqC5^WtF0s?~3kr4+X
z+#(N0qW51fE-#57Oh3}_7&3|P3R`qhV2N9C5IoT*C+`2<)z(V<&mARAmZX7$t2V1Z
zLbqMb*q=X6M7XM1)K7lcR6Rl<9P at CBvWS<cn3=m-a4SDT<H*#=REZHh335JX4$A+3
zY$#iq97~+}kS5Eh{rmSij`x4mQBEWf$WkPZp%UfqyFx;rr17jF2p)QxED|6q04mCk
zspew&I=b%GP^b0YZGa><(8^kjM{y0GfWT21M>UH$cVS`SI}5Jp2WXs{rR7~D{s2v=
zx|CX8ERaO1r=0t$Ouv at n{g(lfB~4x3&i^!H4NIm7RTtn<q*kQ-O at Odg<Wa1np{IBL
zA2pp$_bmTYb8mnDKQ$$h*xNuj6IeDrK8~SOcnj88SXnuNHFMPuLq<kM at bU3$jRdf4
znY=EFA*oWXq_o$9LsBIi1EleU6eyqIbEB3~(74B*o>EBsm+#3$${iY}va+&rb8|5;
zg}1AyatZexHok#WbyWG^I%jSq{;WSVjv#cP(m{=fAeADSQ7VhZLDAZZN0E2)Z&{#p
z0A6EbBk*9I)+%|ZI%z>c0ftiQZR>m7H*en9HyzR;DOjjlw+6D5Fb$bnU|z!g7rMsA
z_fZaYMo5e!5fa)oH|@_B6B}EHg#Day?w93$p8icfl|wmlc0qI^=<N!OrDl?ak?~g(
znG{r1)Maa;iZv>4H`B!T)Dr7bkG`x9Jo|UK?dNRoAL+hX_LG#1EQMJcfk3#ph$0_d
z4mf>>y%Krdw>XWrHC$sq^KP=bN~(Bkvc{QvlpJ!zD4K^xqu-7dV_swyebasG<mBYx
z;lZpd{%%4P+a;B?&K3B%=tWJW*X5+m-%_(6@;i28s{+RLG<0;GEJozo6D9+EQ9ngq
zw&Gw9?Tuf)oR!{gTyUzB66$;|cZ!m3X60$F$&9GB9dB<sDM}H2GgQ*@Z({C&r%Za;
ztDjEfik_rcKI?>N4rM1n->04jtGi1Hrf$B81_lPT2}QJN8J4R!Nv5?HW%|oKNm at om
z-$q`V`dzwWAN*1+2>Iy7DDNwC{9C-p at 9JLza$DD}^x?yYAt50cj at ZQVVaPkjomm*x
z(mo&~V`eD#>4qJy4klgJtFdv%#@{Oc!NNc}uhtg_K`*6j<tRDFc~oJx?|MOAtuima
z&I$|DWQ$*mwk$g*=VEr0oXsAcx}|ZQQ|{~jbj<hom<cWN!@4Q#-1i{ol2b^O+?h2D
z=5O_Vrt%H-ad2+VINo~-^WNl#7&2d-3^||X%cB=tui1EcL%de^27MWyb<a6;IWQ-T
z+8Eb5WDT!bB%z#F`qoz63?fRup(J}##G|~b-mDH}$zNTFY|AtrPkUj8*%+q}g~*RK
z9{BtF^Xq=gFDhC}Cz*3=P!4Bklb{`%GojQ1A=Nncic2juF(KinEJS?vzK~se)9o*%
zw&TLZhg;K4UN$y-$M~Xi at p>k6$<%8OB_DP{ICW1>zBrGs(!W<>)vLJ!HmU=%^v4ft
z`TN52CS-vPE^AcXA|oUuBp{+O+4dcgEYkPr!j57&Sg;?2gn{=R=iw3bBV%L8Uom(2
zrtk`DxzpVh7fz!okNFsqj_j3XZAS8YdY)k&Yi>;A1rj6jlV!b*PR`D3sw3Ol+TQ;8
zHaJVC-r;jJ{yMogCZ{%`HL)*U_UqD%Gr7Gk4tfEjSyq>yQ^*;g<lgx3+Lf920;bL0
zlkaNYRCqUe9Z%Q0@*f9F^Gi!lT2;Iec_lob?w8FgC^)w4;qi6!>|(z^AwJ$QN}sVi
zL2&Hl5NC(%>Bo7eI^Xlj8JkiYrH?ly9cFQk9pWw4Yg%X1y%%=eWkjrc)V-SU at bIR6
z&)+d#hYc{D0oG>rr|f=bR+}=VYN8OkxOjqBCZFeW((93QB}T{R4V3OO>2Yy1Itc|Y
zYV4TB?G{<{*PlFn>UsuqOlz0js at K!f67e~6Ii%|{FY8H_tjNy~_R3@$Z}h0}jOFFU
zN{)%=4NID};~(mB%gOn!^rd04M<$fWWpk$Eeg}KCyY|dE<R9CjN=mjft}a#z3;D1b
z!d?CS<fNpUZ_F(%`Yf>kh#FBS{CK)0Y{Ryk+a|*?g{03;8xdb`QTWGOES~El*RM&s
zJU{+=fR{TvJ4-Hqp&nK9p09h$ZN_6I&8DX`r`~Pr>~tl=`FVpJ*bgng?#bzCK^X;@
zxpTU|QWwM%79M_cxQU>1bG%~mpGw#AqJxBXJ^L5E5)+`6eBDp(G(;F(!GlRnW}%m@
zy9+<-UYlrw#Y!b6O*9$K_V(KZWONM6|3z6x2d~^pdBx<`#-E~vbnm*_DeO{r!iyr^
zj at MoTnXvQY?G at IHk>;y^Ua`#tk2E!hl0;tDu9%YkjAUUJu?n9Tv8|b$@!YttG>um%
z0l{{~$4%M!T^^1d?&;pO;o;|hs-~v9FuHp@<L9TQcI)`W<@=liDkzA*nY5mgnfbiL
z?=sAbmcjeq>57dE2_+?EneU}1wr#Ed>~MqDlq}6-H7lrRfA!#R*{frWbJV=Eb(wy;
z_uelMO3qQwORz0hz8&<4*PCwV?H|bYL7f^?L`X_X?yvOgEz}j%*4A#fT%~(?pShhK
zylI#!J{ek#0$B9TprX9IyjBlx#>mJRC3}>}G$!xk<74WzRrUM#6D&JZTZ(;i!3o}4
zd`-<UN0f}y>Hs?yq0#zW{_<cpki5`^@}jr_`@5 at amKE(d^5 at U3+Y;&#@k9J!9l~bq
zD1g>~0JkVnYXB6(`*2hbpquU+r+|O}-D0CPP{WCAM9+`5MAlxsth@(>&adTVOjo=n
zKgO%-TiCtW`A)vS+)D<5=-4ZAJx{mYjD2lFMt4u$e#=FWi_2<vzQd`Ri$g?Ye^k#D
z6p at lb5ei1eI?HZ4Y#Ec0fx&oD&2-_q6jR&I-1h`fCcKXArdQ6s78VW-4Sg0cmIB<S
zDrj?Q>2R~6|MTb1!jWS#pf;e70+ at oP>{<ZMRo&|<EG(RAKnfbyA542~k8Y}_5#737
zYd<3gc|<g(nk0-!=@@<QR?|7LbwtVW=wM?^P)<%xKtMoDtQxsJohI|^$X(`jU+S;l
z*N2qH-lAa3MNE3SiGe|Z_OkA{ZFNT&y`WL8dPJUhrX at Q&``x>DF}yUb9)9&18Ky2S
zE=ER1+S=Mcd656WXzRYj;J9_`7BMkTOXr%)=eW3$OE4oYApyBQQt<8DxAk?K;){i!
zQKofHmfG4hdN at LBWcS_&19k=crG-_tcv)V9_Lrgyv+N9KycHDab>5~!F0+Gk`~?Tn
z(b<UwB*JS9ru6+IWMP^qQ|`{443I!N+S(4=;?{=Gp4~iV#eEoYTXJu8FdH*@(=aA2
zt!Uj?y_JiHXZ7-U=I8y)`kliu(~SdjUhIc=x*$iyXS_w+Hucj4ipGEZ{7FwwzdhBE
zAWh7}E-dT>oQt`tP- at W8(_4T>U_q^yy*wD!D>j;&RvUojJ<kvu3;M<I%-q}@5Ts*)
zfW9ZHs!P*PwgR0Mq0p4xYL~U4DEWW-5yyWCBOnYynWd#Wt^PMKunE$H+t!#`$FI6Y
zp^=fxx9~z8rP4qtuB)p9gFnKgaq>z_O93aa0I`>^5J+<Krcsp*Ei$xPc<sAJSjXNE
z>gTrO<(7+G(e8xppU~OaQMV<X=6{f2*@{FK{)I(GnpD}0);ccK2EMO%a&`vDV5+0j
z!IDF}yp93^z{|@EnAh&^F2+E?6?k=Ybo9Df!3 at pNY7*WjJELFqxVg9hS>BRJ>qDVX
z7Z=`Gw)+n{J|q<zH#DDP8-TB<`37w9Zrn%^H0?`6({^s7TF$4oK at 2u^bv?$iwSHf6
zy35I#D(90d{kS3=L*jL`S@&l63#iuFc)dL~Rb1TM&Uw}$52Uja62>rf&NJ={5X>WD
zIN<xVw6v~s?F3jhRgu}z!AZM at t*<4`$s(^KTUz9ibe{r7Z4TXKW_*rWke|LV7E({x
zR)Y{|Iv9Ft<K4-&Y6#d6K+i?*49x|XcEFo__j|=#t}eHC3uFfpLDYJ9)TQ<_GG$Ru
zJ9Xc;Z at D}=SQ~b{!Bp8g=Ya9tD59EH$Ugs?4gBVAWwjj6D5CB^P!7DI63gY7XB`k3
zCd9{QGg<vE!}sisySoIEZXgKk%Td`nz@#AvK+xK7p4Tz9mj(YI=gXHb%2BL<Tw-8$
z=&`p9ioqb6)Y4^=q={EUYHE;ncG$K+qPjo~yae$W4&V*Y*dH$hl^XDgh)MvBl<rVH
zICH2}0~z+{(Z?yfm0NiA?5Nern(b>~55#0Hs6B>vbaYfzRUJ<u?;t4#AYmQz4iawL
z)4eQ<gg!_`Xt`k#2q9(}cOftu;d6cjxg(b<-2tf=RD?2#+3JJ1wTtr?bNXLaUo70-
zDeL#o+uC|Hn34kokes`R$K}aF6tF7>Ry?#DdwAG%w*D1xyCpT;`Uh4$3|L}uh8*HF
zwUvw0ebDsSg|o^gOSeNFNpLq}!vvcXrCj-tqyxAGYGjZhk_{P99Gse8-n3ZQ+5%jM
z2TP;JIM?3es+L!glLPOQUV at 3O^k*b2Rvmp at N5LyS57+PbT|`S0thR2|%=EF$@nzFy
zQJ5cXj)SNLO^Dkb#?`hG%83S`(sH_-g5gzg1BB`3&6|sAFpJW!*<+`tr!10A_;)05
z?*l^stPQHuVko1g(r|S>OqFy-Q2;46F&E<RdVmz;2Dc*PhR at OjkME0#eU`?H_7D3M
zY~s0=+up8-rC}=pi~&mw?-XbUjlfE}SEMvS*V7oXoJRtRP>}qWN0auz0y$79w3dT{
zv6(o;`rpOr($W&p>QRgg!t4Ut)7|}|+=2v2`YD<dVcoMr!dz-t1R{n-*n${I at hNiD
z#<gLpkuiLRB&2J}3DDv&pJJGzu&9z24Lju}AZUJoi`8nqcd<BOFsJ~}?wd5~7a~*e
z88fMEey_R69gb*$w+Z0l;$kR!w1EX(H~t7Vp9Fv{!9Pavi|SEQ4F(X9g@%OzP48K_
zr!WrFnt|iV6H=hmhvBuw$d{4VYU$r=aNCMm@$r2h4KnZiTqv=OI3(Y+#rJ2_ofS3Q
z9-FssK_RZwO5C2aPHSwG0X_Hgk3Z2C6VOy~dsfg2>RtD*{#~gE>x%K~mQ4#sUPZ2P
zIvgQkKi!C(YH-fO at x6vT%HU`EDC<CnsRFG$V78=E;z7bWDHS>NfDs~CjQB8%T3CS@
zbp|r$7Z9iY{LiFqb!zHu8uk$YWPoYU0Y?|AUC&h6(~s-XLP;>A2z^hN=&{6lNx48+
zmOpT-qjK$Unw9IZPS0cP<wi-1Qy!bJ3O5`~28|qNfr79S<-9Eg(|Nz&zwaz_gbVcS
z6KtZO at OFYPff>|bESa;Pgq^XO8Vyl=rI|(%Qx-<?I&gq<T<(5<*R`su6QyQ1kf;=f
zqtxqxoYd6R#6$*meB>wQo0B9!5fx at J+fRjfzw*;4-ccmSe)`1ri$Aeg#OhiLE*1#~
zg=$hxB|3J2P(|lIC8qr>StNw_6f0rYG2Kfs`yzGWy1-5YsS(WLbTl*$0FDMjujO!}
z+*i_&wOXRR>UzqK8Z^ljpm8N)b$>677`{1r{a#7X1kFYc+*6`8Q&CYdGh+v??#ogN
zs<xj2 at NF=S!HshPEfk=BS9?p{frJoJkUx<($`j at N{)JF;1JT{;E2uF*2<n_yzU1V%
zZ2XCkCKHkdi$Jq(*`QM-r{vncVI-gj5TzbUF}V0Ewm)6AJFOjKD>k{`FK?=@&erO!
zsijpX{&FMy)S>c$jKagb;Nak=2?CCJ?>z at -RhK&GO&6yf-<f|_)4x-XR?#ogt(oji
zL%Vi13JnVzRX+#>XuiC-2=+}a;?{mPKpXMfe6V*~>=pMna^t~I?d|P+{QPxV3g>g>
z5f8qBEcW8Bin24Tw%Wnb+1_-Mp2(!k<X;~l6Krg4LQX)^O7E_Qo at r`m_*cMQDe8 at o
z$yURxiQ>?U0!FnjE5>VUNb<>ZdG1%joMF7b3EvImsE6(;FpEBngGyJz*c5ro6`4`Y
z>Y)=#z;&54RVXpyUPWFToOcw4L7LjM6Ks{VPc$IFU3NSO%Pfc at Q5FpX=I?%DrlJ2g
z=~X5~@%3mtTC>6M`R!ZLi9EqS?))1_`ko015C#SV1UY_UT1s6L`tcSm9PQ^f=iqW8
zWF43(l+t?ynts08(Yrc^e2>B@;83ndiz~?G$6zoNaLC2QMV_j;TrCrUe;Y0M(W{es
zsj`zv99fWn`m=+z?2+n($A}LM;%XEjU5^LXuB-<LVPp%P5n2}ePqXR`pCz&d!=qT|
zM+($fZ@#0bd{t!_;n4f#%OlRaBv49Lfk>8(i(Rnftyszy at Yd$V^pb`a#}_qP`26P=
zKcYF(<XI=!O3Mt3Dqi<vFS!0_BR(XGs!)VvvX%L at K!f1S_*Nz+Cg2x<d}xD#t6p*N
zgID;`#AMV&<a|z#D`B6y5+A&x8UJJBDDk7zOt0jFl@*_>Hh8WE7$)Ey(z(^O=6m~y
z7T<u!KRQD(M!AupV#Isp<F+MDN6DIAO%>%8hzz-a$DCZDWb`yLLKAFV#aK57Wo~Sz
zcI#j^TA3Wi35<q7kg_toqi_k_M`%hTLkHAhoShNWYI)^9A2H*nnelYEZh+2_jVhKq
ztdP$#Dng9dGgpJxQ)d3T9~B%(=O(Lpu{-l#jQH$}9j~r-Fs~MV^v*8j+duic%majN
zY}&jXWb{8+ki<|*DyZA0`d-%|aBLQjL8x+6s7Vukba15Z&e{nfn43t$)6sHe?6L+8
z{xO9Ndzui(U;nXZm~c1g(8{7>e7P?zB_?JFv?*>EA_-xdnyV##ciFAaT+Vis_V%@S
z&0sJXpx0{hKGQ)wixYYd*>@C!>#06a5Ks|N5IE%#sBLY8(hCG at WCIQNsrmH^$8a_t
z|0N6znGeQtdVX4UM86K9qrQw^eT6Ow848Z1O1tay$C%%)pI$0!ysCg7JFTjfrwPM7
zTt{4;5KZ|u6h>Ft2b#g>;AY^Ygj1?sZcZ*|k5bW^p7XsqP<o)jtMMQ at Hb1p11d5XC
z{fwrlG$&}f5Uw*4^_6*td0c}*yCr at gqc7GkQ*68Ok=m6b^xJXMWYv1%SJ`c`+c~IJ
zXmsGJlSr=X<;tF0rxIm51oCuu9s%lLwJp1#pkZb3=X>B<CF1f8@`qN(BHMgJWuytB
z+5>Y5>4Gh?)w>t{Wx6mLo at 1{fL=Zzp<L5JiAY{IC1bp{$f{6_qK69y!EZ5Ww5GsY(
z-CakFtW1!*&Tts=S3HG(fUm6k2sY{(yH>5}nz6kLf}%cd!mpG>qq-EeW!=8be1wb?
zhvlcKtE*Gop{3O{FlZTCZ}zNlXD=(x?|aBs?TyBJn34!pM>)i@!#6_CD0L{B;FWz=
zDZ~EUA`|(QacUXOyYaDFjedS(Lqp4b1EIlvRF_ZUkXu3Z+w{4D6`!++=lD#~2_YtT
z_t?*pteG^HtK`>b_d^e9Y1G}^jB_>Ijz+g{DKE6>KXv)H{N(Gol+xnn>^9**pfvCu
z3EB|7)SGHvb?DKN%;dP2^S4svVoA{a%;kZ1EitLh8E<*9amQ?%`EQ!&7^rTEiKOL|
z?P}wEQ3e;q3NkjsM+f(!#RtvM@>DFgyW8TMp|rFv7ZNP;YTRl at m%sbIOiX;d`sRfU
z4ar)y4h=;oCVrjy-d=oFS8N}RyIM;EmxKr8$E?yq- at f&m3FArT39(L!>Yw|oucsZi
zb7c2-#@icil=}Dy6)*4nLKMQYo`-jE;l6M(j9avz8GiLN4i1OQQ(Q)`T4?$8J`(+8
zO+3hkhNEXh>){3fiG25&GyHGxvd^vSJ-c~&QptaFf-NyD!kR>bAexPj({pe6D&#T*
z%a*KsKnXT6k<yTw!joc6J?KZR${u=mPj^0^(aJ9Hr2rjTIi%010cZb~h7cv?A!qWF
z13x%Xu#H`DJt<lizD?Z=WtyHBab*!eG}=-0nBN?1dz)JoyGn_!gJ)1KO&ht!!@WY}
z*gRvbUo!VmF|R7{q9Fmh5u6jcB|X1`L+u0_o#CbwvPz<H`99pvz1CjW<84!}&ZndD
zRo!fcDxwkjQ8q12_j3Vf_(=QoV5;|no@!;vDg+$@XJ_JilSMN~*w#g7`n8D~zD*_D
zbty)w`WZUG#$cd_{$(RKvYB{xy|nd9G0k=N&VmpAxB0&vH|MW#Px5-Zh1>1Hzd<-S
NDhM at rvEs{s{|DGd at lyZ*

literal 5476
zcmb_g2Uk-~v`ry&B2|G%??phAB0Uu8kzOJl0Y$2W7P=rHsDSj|4IOMC9pOVjDH1_Y
zdM7AFNTeBfm-iFiddbR4GI#FGnSJ)&=dAnG1f|PB%Sj6Yff)4lw9P;uu;j&u8Ul>`
z<>BB5z9?M`b+tj~7w?izTsjEE#-Xo`v<NBKo(nU{3_PRSQ)q#Pz(r|1ul6IT=U+}3
z>(2zW#CgA(HGU{N<8Q|$HnNP%B?cIh%ZEn_$@MRcZ=0{y|Ew=Q3$pW&UTJ7UzRDD6
z%Sp^;Rf)EvSQYj=Iy+Mg0fUi60cvAwWX=R+f5PEG!S2A=K}3=C7&!6&_chq^@83T!
z`Fsp5e{G&h=>B-Qu7dBpBv;%Z_9}ef({n_AUS5WoPfOU(cMtGS6YB(pgw|$T1GX-U
zpbDsIX<v@&+yg@?>5sk at pH(Qm at thPVV6<PYZ){}e<)KYY$DLu~m7JWM%*@OcuFSa>
znwq^IW2uxSx)JcJii;Z?B3xO6c8_CYryA_<Iyy!T&=Pahqq;En_*wJ~43zwrwH3aM
zm3MT6_e6v7AD=#xR#Ev!K3wp9 at PJ?n!+I at r*(<4~eH_VG7+ZTZr*k})T2LU_$)f#<
zm4)T4$5_#PM)AP$!Nzt_J8_<o!$3nr1B=BP8yoLRe03$CknpG4_pYW38=vg7 at 4gdP
zPkHs~)#+}xBX%qiGv?E>U<0XX70`V_K|!In%b)f_NJOMqHS9ZLEm#YU&LcW76U;0u
zEIbS~-dmcR-|(82A<PNk)0L&ble6=kVU at vodJ1i=6czz at R7n}c1{VFdKfE4JHPqME
z9z+0`Bqb&B^Yd4vfYS=9&2il7k#-gTd_s0R4=XM~)8ghO!IN1t+eK;-ZNxvk`}Mfu
z$hK@?r@*a=>cvGTLb>KDi&i}S_&u7c_4$w$27;^Bsv8&#e(>OdrKKf)?fdKa_;?_b
zhCG7&jk${cW$T6-a>09xNHs{T(O at m`r^RnclK{P4QO$9~JtT~#s`>MmFI4cWq7l=H
z?-t(*mE at hSrr)W!#BI8J6bWp?9re$jP_Bn*SzcMWbXAepUb~ajcS&9GDxBb|KcV&J
zVnydZN`ipF1Pc}bu6})eT|Zq|pU1k)XHOCw*gl81Ebnw3cmboNG~jV6lR94HV||k)
zWiKA_?5PqH8{7Mc(;x!ppSGHs8h{{%JYHqZ058|aiXE-2gzb6N-h>_c5VTO3<PRS{
zM3H|v;sci+zI7jYskW!Bp{F-^Li&Y3ASxv^HT?ar^TZ%~-G_7h*M~U>=+um~G(Iwa
zswHWA=5Q`}L2ivJk=wt0PG4Ui-$-fu%!B5BXlN_(Xezm*qa!tyk&yjF(siQB^z?8y
zoBMCu+n{YU!8%^DXJO&IGTWi1p&^TV4{PD*$aCe22$?yp+BjDhV1_QX>etWibFwc0
za0kDn<ZvB;2p|D*@}o4uaFOaMzS0oyIwK=4AyJ6J5tDDbU!2){MxJ2mt)d+CJ2jFp
zc=V4<{)Wc`Qz{4EnvN9QGCz?M6hJ5kc?AVE6J_L^>8?oSkeJxR5&pZhG&G?HBML1(
zbDtHew=26MPJx7<k$0oA;hORLo8>9!a3H6%K8F+4=9P|?vWa_pdw@(1;Bo6OuHIs1
zbZY*l at OC?eTjh8)J?wBNVl_=SB-=Isg?n38w!F90hezr)7N9nE=GrUUpA6Y|V&#N|
zZ=X~Oldu0U*9hG4jXKRI(xH?NdZ3s5XsS|13YD!-+(aU%85rzad<x}wH2J=)JtF;@
zx^qGjc>v^Tnb`!%6M0lhWaPb-mX>z6#mD=>gEa1hto5LFK&aPLFAr{fps=v!L?EKh
z4vGyg(e9VNb{%kcbJM at 1;#uC at oRt#yhC)IeW^ry{XvhM%$pCdI3y)@L)ba6ghm9x7
z+1WW?-W%9PYq~W6M-1VsCof;=78Mmu<wj3H1J;MrxaBICaNk-VPDv4%bX2WOO|Rb@
zWF#zUb+WLt=M)u<3YC1y%*=HAP#h?0W7o*3;4|A`-yR82jS2?S_b6=#JjLA7GH~-N
zAAxs5t0=)_4<2`GVrnXdN8JHyWP0b{Zx40lh?953LB4BitE&`LRE8;%TR>7yJ>1<N
z(Nu{=?0uxduOzpv+Cs2vpV<hdnhy6ebTiR^_(WYlJsTPv%#rub!!YhQ07U$=GN2$Q
zr%%-ieQ3|c0Eb8Zs&6 at BHAzl<_DoVt?07xjw<2~n=84jhK#Iy6w=Y at K(>4U&RprXc
zN`HU<3kyKDxjaR&U%uSz+!t at 0FRyd^wt)v<@tc|Lk&%%LYQynt2f at 9e2kV^&qsmY!
zcm`Zkc57=Zo&jNnMvHS*n7i-9jgOD#=H}K~)yw`uJT(cXfWaoef9F;SF;UXP4ga8l
zLLgRkHm|XyEwzXfJrBN6U|+2S_~iER*SNwxUG<Z3$Fu!xNAi}n9mIf}kB<+4_s5SP
zc%+hh4QkU*aUT1tUdS+u0&oNmz6dcfF%Grxkcfy*Oe#DF$D;Ok+7)1?vA+JF!^7-R
z&9)UkMLVf%wOx+9QWmAc(Q9{`RnCr90HRJwIdrfi5Vd`<oAJJ!W2%R<fb-eLV05ov
zzdkfHgcnnCTI9c~iX~<{Mz#VL1e7ZvTGt!}-y%#LoSlTZDI>EtoO=U^Jrk~Z+sxWp
z!EdoAFOQSJ>&;H;H8M0b1PYn?9aSN&xMzX at rPS5Wr(e6`kw0ZTnIMBBBZZ3oF5%%F
z7)Dv<gud4oM#c)<h?x)&78X`e$gag#oubib7Z(>P`!+$YRbgnbCJ4Zafq?-yG#)u9
z12`RUv<B`0_unXLULcwo-|j*g=f}W`&w!{@j}~L`Vm`9rOpp(|U8h~-zjqs0D}5fd
z&jC^bK*b}`9H*Fx@`?&U6%{+{^Om%t<I__Q507HC2(*%(1azUUdooY%;b at _<Na17p
z6%qC0r<k~WBeS@`z(B(+$utx)zO<JAW?#Wxe4%nMFwI&C#u44{>WMHRjvJ^cZf<UP
zu|W_70^!DP@)20;jV$AUF#>@A46_phZhO}7Q|$d2;Q94ejIu(4MFf at c;_GLN0L>J@
ztycz865`_YsQByyTJ2Ccb0wHl7jQ~-^{BbFK)jgVZdrMGUvF=PIp~$7Ca9ad?Hdpf
zP-&hz-{0S_uL~MR$31`k9I!qwz%byNZStNIq6F$_+hoR`rM`q4va%KCsSU4Lu=ZGN
zTSKJRGh)2XX5i%HWMkJ!4TcskeYsRR{DgqJa1~%tl#Y%Lu&7aJaZ};u=4QIcoxj^N
z)=Ja_l)nB at 2{N|AJg1Wd;@4_dYu%WILSie at aV)vrERem!!?Dkw4Gauk!ZlCIGHB`P
zS-Ugc&QR1Pm6dD98^u#g`HZQO>gww4b5e!9oI2Et|2<{NSMUYaXzROGdWXEO(0wcH
zZykoV?60In9En6qzI at HhK%a__tGd2E^Mz9-KSfj2`5BjTkRFbgYrHSN&t`dRv!0TH
z6SKcMl$c0O;H{uTB9VZ6-*D7T(tug7T#>%pY@`GuXliN2hQN9s>rgxW`d)wfcRL-0
z+$Z`;(LTJ)7u}zHWol~55Xb9`{U8qga=G-&S{s%GAjA9#CHjDXuMEe9xiBTsFfgpW
z=YZVNg<Z36v$&L;sb_~o#$YIV9_s)~wQ8^vD}0RMQ&)FXf;fHTx9bS;zjv<!fEQNS
zp;P+aYFP2=i-V1^x70%dfarj7sPv>?iEoB?t|S9LM5uc5zrSlrN_c at P0_49MH7Kvw
zf**=w{4Un}_3PKQFWEqZTti>JqyxMW*BK0poj_SxWntp1vT|4+$?I*4Ru-T<Oij};
zj6M8?sc(^<BGS@#MA)b$SoyLCzitD~Brn&J at WGXfJ$DvA#^RZLWRDAgiEV{u;z~+w
zA3oRsLP!tpz2XoO!=|^ry0%8ZL7aE^S38kgU)9h4Tq00==d at BghX3gg+wBDSPZ(|X
zo~aOc=lt^)pGWLO>Fn&R|H>zQ-2J|H7XfU2^(c-I<|<VU2-0juZl#)e9_=k%k+MsL
z<Ku5B17QG#qEri8tC91DnhUNAkP|?w98i~m?q)Pivfong6R%iI`=?Kzq`QtZm2{|v
zt>WMbE2JsMY=Cwdxw)ao`)&kQE}6Sb!1=j6eS9J}3WF=mF~b(tx}l~SN(VnYid9d4
zzXj|Ku+yV|2V-v`gdl at zpy(RnHZ!V|nt*n;uI_>$qw43!cT`mzC&azv?|OQAIy;y0
zx9uz?@MLl4*k7M4*rQD7`?H)Z-C*<ju?G&bI+!MA{z?zGX%LM8HQx8~8Xg^u1Ul22
z+FBMCmQx}@pfK^CXyy8FZh3mJ;~S}>6145 at +wnwD$BlrZ7xSa;Z%2yNqexqm7h<P7
z*0Z&>4G$03(RqSNRhHQxY;FT>N$^5Mc3PULy}hb)FU5ss5<7O at PdR*>gcfcJ0}Flx
zv`r=(2U3m3*(3=AO at hdsB1zT%s=`!KD7(Us-w>PluKjO46{w}Ed*uA;Aw0o#=%tW^
zRb66I(#uiJPD?X0*+;8`KYyZuY8{}0luLN`?k1sh;>Pc|?bi~VXh80XOaef~tB5se
z^l!Lt(%7+|M4TpE59)1blHjD9DR}^lvc~5#n2j~D1~xP`$p{K+V{=juU$X`#dw)gS
zBw_pH at 0&{Mkev|kZf2D!HX|XR_PMjI+Q$8^GHQW&grKjpHBl8HM>LL=j+VA!04L-p
zuUF_Ib^-!e%CV8;@IL(b5y3i#{&D3d1K at VyIYOjoI95Xgg9_b7{U!#y{j!~@eOFyk
zgcWH=U0{^5x~1-J(%PD5F9od1qlhr#?htwGMwm)9`uM0aWGyLA#TM-O+r|=&oyvDc
z2tK!UYp`)>U}j+}`SkpkF-&}va>!7n(#F)ZbTVfuyGC5jEeSHQIo?^ouwNz`YTX at 4
zmiL*Ro}I0mT%3Bc<(ZjL0g`ix+ak3pc*L&KJ$?GrF at lsSyyEC!{5((19_%?S6S$-)
zt?=mw?=i~BX|YTvdH>)*PK at F@iL^DY%T`iWo_YDS7r2^NT)e<?M<uPWaPD+TV)3UO
zX*HeJ<Z!n91=la~-)TyHJdyD2 at b?d(`^BG@{uYpv6Bp6}i>ugi-6|UrzJ(ABHOHaI
z0L2lUoHseXIbe?8<lU?$NfOo1$M2<gh#Dv{Gcmn(>8B;nTT6<Xl<T%Q(5VKaYU=^%
zw7Is-kZh8Uk3FZGzANubWn0~KLkN=b)?(|cRmfP at lAZ4E?BLZI0I<$){hSkxU1m&7
zv?kwhwVw?b6o!+_?y<kL_g_$(Y%GRM+=;5GseL~uKf}xMY|bZYEz>$2oy5T*E~*Fi
zTsN|GY}{^6PD)Zl2x{${ipk5 at Ojy7~HR^54JNyvo-l at +<+5`GO8)O#Lf!y9!r>O0J
z3SRU|HR_e9w6UoYMtRvY9!zz6wyxdvdrF_1lvNo*ta_xxRuT`l97uWC^zlU#!^>L_
zOp=s?MB4%MKeJj|RM?Nd_b8MfJgjTs&mWPGI{T+EAL6>V_)+!9<N0%&uB*FUbf7Vn
z*kPl%c&yk`rD3*<t1AFv$GeEeH(;h7RSoTpVj{RVMy5xqFiVhBC*jah^$KMfO-pMQ
zbrgHZS&{&sDd9>43qyx`t~y<BqCMi;<7=W*1g(Ou#Bh$iUoQIRBJ!@yC$K-_R3=!;
z!0`G#>a!zVL7`B&mnkz&yo at y35ORzt@79U0YLqPF<|S>&obQQT4_nE8R!YlxGrWqz
zGX{N`FBF4LGFaMfd5x8u^$`?t-9TyI#wr`3(LY}q=fC at jW|RT3)6+u=rqplSOV^9?
zmLU-SP&W-R6UvN0Gi!y&nTftQNzJzE2(cpNgpH!UDMtZOYJ~jaTK3Wg2^?_6yNPF!
zVh2{Hd@@afS;1Hx8~Lx8OpI?>N1r(CSZ3SAO%&l+r&RYe&Ziu-Y&j_Ddz!uV^#6<m
z at 0Kyl)BOk1ie`5bm0 at LvXhWgxR|l^3xRq>T?d>5+G0VTaw`KkM4a4x>lA4~<kPw~_
zPLPR0fO~QM-SNg^->yJs=cN=^*WK12Zwi at ZtinO~e80XcgWn(Q^SQI}T4N&?;67K`
zCKh(sO^`$keg1att$^=!wl`e<qu%bewPYJD_?UY`G3@(+K54vs>HYh{h-0=zem|xo
zu;_=gP_PO9;6YA96Lqzv%$`yzoB}Ko-P#k?aGp8hp8xHOnWS{L>4U*BUvkGg;$LYm
zO1l=zpD^Hdl2o at s8j}$e1)=qWo_`zarw0h+JKq63H<@4JUU>g->vVT=XU>z1eeV>5
z-9t`xM-8+L_V!u2l;x at 3t+%Ug_WJSfizA#064Ci<f10LViarEkLw^JniLu~q|I+BY
zz$PK#zf6HD>?M3t45SSWRgB^u8QDJnQG!f--anYeev4V)_Pa=Cw!oELIyyR6SJy`S
z_E)4cCc;d5kB$bIp@*|42-kQCv>bzrX at Npsz`18vZ9mQJSZhQlJ-58!QIjb#smoK{
z*u69QP09gF5OVz8B=wpFJ#pVjKn4m*g;hWnf{AWHyi6Z>azI9)Pmt}%&z(OOx`p^Y
z1}#Le-=L(S(bLliSMds#+>oE9973N!x~Vw9unZ90&$ByM;VSf!&}L|>M!<~J6r=!l
zb}57<gpwUf5fs$`^e?Q`l3)W6>?Rli9^38?aRR5(6hP2Ft?Z$G>>*cdD2!meN()E!
z*)BlW=I7Ux0tcs+<n|m+8U8YK0`EEYoJ0D(Ya3_=!D<u^AYmv{^`BI*X_8m$y~q^s
zkCqHu0l)X&OPSEH=yOW$Ht)~D!EKHgSKT9fj287o)cdk7dBHA&T|0sT8<Z=7c-;R+
z&eQ}z7eL)q?%>#P_VQ%2dkDcBhM*b{>_fDX6MT_W4Eb%Aa4}c-(AB8}6CdPrO{W>j
ue?8)aXbYtCF^sMvmXYcI_)63Nr_L!rfE0ID15ZssAblN_c7vwV<NpENO;OYU

-- 
1.7.10

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.cairographics.org/archives/cairo/attachments/20120625/43e17fe8/attachment.pgp>


More information about the cairo mailing list