From 62ef8a1483c9fd3cbd11988db1bb3bf17d98d68b Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 14 Jun 2021 00:28:03 +0200 Subject: [PATCH] Fix remaining cairo backend tests * fix cairo backend handling of arcs in regions --- gerbonara/gerber/render/cairo_backend.py | 4 +++ .../gerber/tests/golden/example_cutin.png | Bin 0 -> 6495 bytes .../tests/golden/example_level_holes.png | Bin 0 -> 9991 bytes gerbonara/gerber/tests/test_cairo_backend.py | 30 ++++++------------ 4 files changed, 13 insertions(+), 21 deletions(-) create mode 100644 gerbonara/gerber/tests/golden/example_cutin.png create mode 100644 gerbonara/gerber/tests/golden/example_level_holes.png diff --git a/gerbonara/gerber/render/cairo_backend.py b/gerbonara/gerber/render/cairo_backend.py index ff5e6cb..a7baf84 100644 --- a/gerbonara/gerber/render/cairo_backend.py +++ b/gerbonara/gerber/render/cairo_backend.py @@ -295,6 +295,10 @@ class GerberCairoContext(GerberContext): radius = self.scale[0] * prim.radius angle1 = prim.start_angle angle2 = prim.end_angle + + if angle1 == angle2: + # Make the angles slightly different otherwise Cario will draw nothing + angle2 -= 0.000000001 if prim.direction == 'counterclockwise': mask.ctx.arc(center[0], center[1], radius, angle1, angle2) diff --git a/gerbonara/gerber/tests/golden/example_cutin.png b/gerbonara/gerber/tests/golden/example_cutin.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc996d3de7efe984a8344acfc15b18e30237622 GIT binary patch literal 6495 zcmeAS@N?(olHy`uVBq!ia0y~yU|Ybzz~s)s%)r2KqAJ~=fq|JJz$e6&fq~(Fj2gpD zhAqpbb*3KLUehDLt8?zu@c*|x{;#mwa?5!C67}u7Cmrl6F5F(YWLjX#)VGIfR=Mw5 zv1n?R@6?-1DyAE)oI0&9MU&J&?b7w(s<1i?+1ZX05AUFez$c`0Vphh3QN4 zR&={(S8Z68)8w+Ser8wn`Q?>&dV*%}@ZUP!a^Bqj?F~hFs|prQ2&t_)u`y>_$igXe zyD}ph_suVuU^}mGN@vE#MYB(L74&Y(TR%0Rf7YB04K&o7|bneOC(*8}w>!*cIoIQ6#Q(exAngtVMAGiPeSh8*5)-5|H z6)x#}w5w!J>hf6&d$T`o+x>EK#oB$PduIi%U$T5(b3^6Yx}}q1*7tooShB8Y`P!wu z6(yaQmX*x*UpQ+e`Jfmrto~ zm~m=F-R!94GiUV|9^ACvoCPx%bQk5f z?O9klIbhzz>0P;-7S2D>T`^%p+4^Y_lV;A_&{UtdymsNlc%hRbR~Z<@q&!_5Ln`LH zy~LUBvS~bAXDi#|E!a zdNdpm>EQg5x$|%ST+b{%S#C-C#Y^jb{@p%sbSe8w&62OC!j_EY6Xlk$2i!0})5aPT zRW;$AZ}$DI+J+CBE;X0L&-yL9JD6Ed#n$8dlD+p!wJaYnU1~0|m#R7b@=HU~OUGT3 zs{1sB6#_JEJ<1my|E_Axa%u_tOS4O^_m-S0>2R3%Md7aVuA|dS_}+V~bBK8IUy@y7 z9kXs?k^Rt^tQ4AbM<2H_b&~ubhferao6eGy=(88{(1MMos6!R znoD9|KC4rmd;Y!WayF1rp-ZcOca^y9SDq^gitX!D^4_k#WLX<;WeC=+arb8VlFh%? zmBfLZ5$m^W!+US_Z@MoxG$_4v+%>Bte!ucukP4=*CG0PwF6I7RSCSV$-H%ISlH3w) z&+@N*C1vqb&vAmduRYAat}CgFpX>+buJ-tDqB!?q_!48VUa3pEzMjv2WWQ_yo7__3 zS$xU!Uyzjo$QgPHu@~2r%-TPpj~!%E-OILROF#cfe^~-jn>GDidV9&T|0;8NK|Z*9 z>Ft|I=e|C_bdtgKQgeuI>^ZxaDfL>iJRr%Vm#)5<>i1p!(ngTv745rc@?O@|>&)c> zNv^%Lcg}=!Kin_P1WATy#h#XYIi+4fmJ=j7_tM%qlg|Bof2k8Bc}3&yNza#S{%g%; z2T8VGnmT8y-*5d(gp|m7>OGG1Ie)+F03oedqFZnK6`uYD9KSodp zNWE10bcy$myA=z_hNvag857<;aJFIw@w}E~znGBskl&S|`-?)U$My?KcbnB3T&pH% zE%AOaG0#c#!2C6VC0QXxG4X z(okzc-~P!?4QvN>wI=xOpX%1Yv{O@S0^k1WUJZM02#I>6-}g~>h{@{UTC({4G7$yc zEzZ1`E|v##O%S`akm==<+nKB!r_Tg5mVEeog(<}~Y=wi>ckK(@0#hXxGQGU9-qFw@ zD505aN$`HIvkZ>U)mJ!JeR&#mKCZsVCs0&Y$F+oczuZ>_N%!l^9jxAKU*Z=iEUMvJ@_3&bD{DjTkc@>a`k1Qf*Uh$YEIz$_3H}DoYIt1sU^+(>`WQcWh3V@y`1yj z!T&&@y4!LGt7p{#A_bQk&t^{O`za^FI;SL|m}^P!K5kz|_P6urFuk1c-Z}Ju2#FNE#Q z_S{UaC7bse&t<&*R%#a8%bfQ<=?BVow=Hw9x>X%4wc+-%xtSCCzTKO`_GVjVI@glP zd#%?p&VD;{Cfm!D_kP(2(yG&zIauBJ9W1@!`n0K;6ZpRUyTbNnYicUjlHyvXy^PUs zC1$d{jG6C{e;~}-ZJC4Bwe$d)4VT+`Gbi+Yl@wurvn4T^Ye{e|*I7pCv;IEKC9C`w zS|%+1*_k=P@2jQ>dya{{A?u}ucI~ekYLAI8bF{khJV18C`5%WwJko!u>|)+FQ*H*^ zOP~2J-8}ETn@g6QUu2Uo{b8-<1ivqtTiA1q zto3;>b=viQYw%5bzSP0$!t+4+4aZ;XGVx&lW%G*pn?&q%wwDg`-D?lXEq)!OF!#Ce zOa2>4MKMxKKG!JyWsLUe^KLGg=fA{0q5EW^=7he_GetPw80^sHy;Nv7nW<5hZTnJ3 zt8?i=3L6eT*e2q!{AY+1i`k6X)7V~`%=co=o406)Kq?SysvC?HaoR+rK5x*eUl4h6Q18XLRW=`M} zGG*HA7Pi#U%Hs;h8L7yrY%di8l?}2}LZx7eG$)*!II~{!FR#PI&cMtG=LGph404h} zq?QyPVP@r-EisktrOZbM#=~lEOC7D;Z2}H#=nT}H&^M94i$#q$$E&%drzSwfATuFY zYDw~wW~D|?=Gm7NWR>MbIDMpUOksN|@pFMk!leVtOgxUCV0UGj%x1RK(aOzELuiJ{ z22IvWnx8x;A6W2ReW|0Bt6ip$#Fu|dOgxsKQ1@kOzBhjg+e?w3OFR=U{GNPCVXo4A z6HcD0`XH$#!A~ZuH9Efc_i8Tbs=1_M@Zzs$<^;cq{)A=TfhcXqj&1>IN(y?cS&049TunBU#)S2(oeqhJS#LNljKAkM#=$S1wjSVii zasuDyogo}&q@$;?y)>Bb-Fjfp#?(w~f-5KZeO_t8kz-)4%X=x)ZYo;(BaIut0+?mGq(qg`6;{m?r+m{q%pBrlm+(;~l*1}eHW==Twx$_Hq zj-jQV=%q%x{$CBYZr7JOVk?ljUb@V8t3IH%`ST@(xi2nf@ZU%&i_^kZ%4bgK`w}^Y z{f*HcebGxZ?K3J=Dqe? z8LM+6XL2DbOh>DmyDv*^xH)g;N<`f%wPf*L^QDZtb8pS$LR7F{FQyG8fM$h6xRPIhz_o{;=3Jx7xn~7)#Xf64?SGkta{f*3QHbj%b$?C!H zK=FcO*S2ONS{GVNg!f73GPb{&JDUs95OK76R2?W*aO&CKm54Tr))MD^{Gp7`bK>W) zy@WS!oUESiz93R?;or%X6W}c&sU^w#*j*XbWpB*kLNuD3tX{kh7B09p@oFZbeWkTz z@;)nF#`d{0=W-#MVop}CwJ!@6+*$cB6VYnZT5@=wo+#sU+30y(FSo4sa&|bd^X1A3 zeZOaku&Bt~naB2W$9hjkheHS7uAFf0ch?tYmpL-?xn3Sv?{4dG?Bdsz6a4;UZDDSi zGj~4M%MQ|l@<0U8S zD+;o;=1Une7s{@haBkmBzlI%G1VTO9?|Z8{#N~8qExDY(RB(YqUYFLA$M2U2EO0F7 z)>`s8e+mBrr=lLMCEPC-^DS^L>9ty-{bCW%0@sRuttHkOi?|oKp*8Ro?>cpt@Xulp zd+De(aos}aU9I*aj5?Q^uPEJhZZ2V$za$Cnb128U#O-SQ@6pZx>YenL2xq?hW4|<* zp=$~IN{?M#Yf66opV|lRb7;LZD!O#?zrPg+sF$&8$!!nM=l_HthX|$#4 z+|T!y3NwQ257{-%_>$&-2P+|vWYp4XOU1b#`=AHK+E{$$ueM5+KQ4OK;y)o%{Oy(#c@S*j@8wFU|Znxx@_Q^snCLCc1N< z+j}o(2K9$omuSzL>i1dv(npZvOE_OndbVWppQR-ZAhog1yOwIcl&RO9D*)>Dg-?8! z>11_yy+=9=NNeem*;V0I``3Fe2Xm(`*q7{$tX)hqW(R8bKZW-ja#tD~)88KrTiann;`SW0_Bb!_qGbcl+7y7h2ga zh^U(I&a-;|>yV-YtV`Hm?lbvrUACMp#sg&}7W@3xy88oa&vF9pANm9199l&56t zaemR#_?dsUH+FmTUoy^oo?iCv^?{>H*g3;qR)f;WC_RG1fyD7!iI4f+J5xQ1O%|(z Obb7k_xvXMU&J&?b7w(s<1i?+1ZX05AUFez$c`0Vphh3QN4 zR&={(S8Z68)8w+Ser8wn`Q?>&dV*%}@ZUP!a^Bqj?F~hFs|prQ2&t_)u`y>_$igXe zyD}ph_suVuU^}mGN@vE#MYB(L74&Y(TR%0Rf7YB04K&o7|bneOC(*8}w>!*cIoIQ6#Q(exAngtVMAGiPeSh8*5)-5|H z6)x#}w5w!J>hf6&d$T`o+x>EK#oB$PduIi%U$T5(b3^6Yx}}q1*7tooShB8Y`P!wu z6(yaQmX*x*UpQ+e`Jfmrto~ zm~m=F-R!94GiUV|9^ACvoCPx%bQk5f z?O9klIbhzz>0P;-7S2D>T`^%p+4^Y_lV;A_&{UtdymsNlc%hRbR~Z--7(87ZLn`LH zz09~y$~xZrX3ud%X(N!#?j$`W(u_p5kLq6zZ-T0iL@_ur{qj{cFe z+W&bSU9eo|taJU+qzl2*o-N!TWcWhU`}2kPl@ed3EUkR8K7^<0)FqoQ;aY6AshM)W zv_+feZ8G5>)jk?@qseBtWSM%yeB-dgk6&6}2>xeu?1=DXed<|JJR-X~hSz5RvH^hM{FNqm{I-bMbcsMWRJ7qd0lY@hzVARg_Y zzMHSs0HjU&S6ugtoaqbCF9j)dlF#OreXsUqtw{5{Pp&V5a~Ct;Yu+~nWFl+ra;1`E z-WSq?c&bj7FIXSa;aAD}%cIND|0mOz&Qlj1pD)&5BJpL)@x}ZlEV89mzwEjk{VOeg z*&M%+n7(-ZVu>$P+!yy3i^!H6{W1ed>HRX|eQ_lDVtXJ@)v4f%<(W?Da$R=aNf(0W zb?)<0w)*PvB@pBcmoL7vF79MsxF)afou}^C1UZ5q4>h|0G_H-$rsus8to2=e31ni zF7QS2*aCh-=2}*eF6P=+#}~mp4)Ts5(;e<7Nc@svzMu}$X7h`Q`J(#4i|ind#V-cs zi|z|A{uOPWXVi1fUaVF^EH>Woh34iLznU*Dcf9x!B+;2?FH7>h(qTH_p?;c&bj- zzPQBrLU`LkXON6u$#a1(lCv+&1nCjBD(3k$!S=-|kZJ6(mK?RG#7a^?_B8d$wA!Vy z@7f4*frB}p^Zd<>b0Z92XwG*R=X06=#lmVs(uH8VK0cXFyH}Yd@t~9@b=O>^_S)eW zdq7FXz$#zo*M{_qrJ~LAK1G(?P56@8zv!_Ro9)xZFLqpf@pzug_E4UxQ|uQrA75m* zYu8&X@ny>Sg{SKne;qk~ArYj>u;j*i2l<~OyH`_(K0$7THk47n<^p?tituZ1i6+8)TR8i)Ha`cHbFGf)qt{3*7}Z4Z;^i*IEAh)B0ixC@=-)etLb8d4=tpf6?cc<}VW8EPM?rOKeMQ|BBi6>Xz6XU9fylYu|GF1;;lw=Pj4` zGNt^&+b`~4Y|Jja1m!cnU333+%sb9zH5X)=!}81gFB;b@J`FOXw8Zjn$Gj6pR-l3_ z&aM42^B0e>i+4e~jI8F!EpXq|^$t{ug8*^A=fyq>jG`&~oU1 zp}A`^$iS|5ON74k$SpDkNwuH3@VMl;x0C$&1^JHtKNXF?SlsB4d27tt4j>yGjG z_Ox3r+i^HofQG@qzp7 zo1HEO*B#=?l?u8qAb)a!%aHwom0}E)4d6YrjbN5BFUM!xx(WPw>pG%KG2XXQ0w7bRqa( zr(~4r(|?_kB2Du?`JcJ4O7lB&S^!hYaeHIu_3Q5W&v5+C9R8<8va0lJ-4UK$a^{cJ z&sK z=Xmb^>e`>kc6U|nZv7bxW0OCHpIKmSs{dWocuTg=zdp&5rS~50OKPi|dp6#vS?`MF z?dfMOtl#`II_*NORQT^nk_>Av-ZyGqciH^b_A?9_z5nJ(mdspta$g#oL;e@mvJ0`Z z#D33{{Poo=K8YiCY5E54GZ)sG|5WmRp{83Mo6web_UQGSPTw;kUJDtUWb^GiEV1j@ z&y9M9&YRyoh+eZWTIT*MDdR7%-t9dpv+Kyqm3l_btKZ$Z{br%HOx!Ca<1Ja|_nueS zb?D~8bw2vWC9lt1V9$s>t~Kl34L9={3wbB(niOerXJu!efwQzyspjsCZO+_x6WjD$UM96& z%t&Y3b(F`q-cE%+)_ISmS<2OA%i>%w!B-yuENIqTpZ19d#OlcN;-Zk?kn)uz-(4O(oWK99PcIK>2 zzS9g2XGT2a3%g{JI(tn*+vOdHbk8hFT%{Iyh-Z0WYxE4y!y&$#S|s@%GnsFkoTeF- z!fQO|=-1q2jou*R6H;jwJUn-f21qSUn_zmTKX_Bp& z;o-o9dw$CsiW4jh$B4i6Dy-{dKHVT+1MrNr}Wy)c-pZW^2w6M zb6l?Frs?!Y^CC@xNv#aU8Zc^Li3%l;FS*poZx4lD> z&*||urGQO;P#dHK;B zK6^IV-%D;wez8Sjc4zpvAdcNUd&63Co7h6{U zexjRZ(ZbigX;wz-{ymNB3{(y?mPAas>Z1MUDQ`)uq9osf!;99aMLpEdU!cu%GNAt* zm+|a`srUEvtus(@w%w(DCZ{R1?z7ddLlbzuzF23lnKSI?+1D?)oQk{eltAV@eX)vJ!f(Z`{x}zR ziAf7(VoMngbB6xD*bOpv%Hq|02^I^p?5hN26Fu6BO0F{UsE53D*9Y6u+h^7E)J5yx zOVg4TMafkc1Kl^w@i=O~w+&>esnsivX~HXiET4XX*Us2z%HqX+36>MP>Z>^KJ}_2x zwxmefbk|FPWx^|dtqunp9CZBB-Mt^wEF) zLQwj|n{sHCT>DWng)R2nbQ+Wmr!0o%CVec~kc9k;lJRks5$_ESE5b?-*))q*J#M2} z1*P-%9OYSlA=S}Mc-_0n+h;r!*`;$LtXh31}B|T<( zvsBXS-}WX+1iJ-CS)Yx&a`1C{UAB4JGL0X1wbCp)*W5l6A(dR;lX|8=D02JEjV8zb zNt~YXP{Sx+J36zk$u!LHaAeATH*j^eCaG=lfjx5})zwj+^v2rX5nhw0yxG_xd5-D# zw~bTOG;byg8q2V;y-Nbuhe~M{-LG#S1J{SHX9^_5cXZA*@xG{(J>#Ltx&m(F%o(dZ zK^1PyL$S0=2BDMJB(`1Na7cE|lFU?DJ_G+ z)$XK&)XK6Mzt3D?=&G62XcF|+;QP#l%ppHzerGIul={xtnSI$O!)F%*u3o;A)+Xlj z%z4e?m8Z7vJk4V}}wd)`Fq%@G^(nF~1u zcg;yPxjC`+ouRY%q7uWy8C#5*?+1oGpjK93hk3FU#_5O~B`HY2u^>38SF4nMz?>fgb_gD6GgHFAIqGhkoTv)lc zjJ5j(n|t}LGdyc=6~8y`SXWTC;`EsdtE|79RlneCpT6r9&)!|t`9|$}g;lG%&s9-BR6=bN&YG|t3S!J zE8uy~eIw`H$DX{O;TZl(_MLTF#`PJ0M2%ngojqN99H~{EKLfqFZJ)*#+cV>RaazVT zu|Jx|FS5=w%r|o0yzRmH8IIEztNodP)S`Dkb7A%B@4{&p{vHsuPihPE-6?O-EVRJ7 z?f}o)Sw;Vk@NhZ$|8!4#aV7XSJE+>6(lGB+|CtLbmw%JL$oa1|Z-K;@DfMY>Zn_(v z%Qvk<;>96q?`-)CKP|`eFBGl79XC9EIy^nWM!%)LUmE5u_68Y>#cuTDQHprc@+65Yq zxaYY2vi!x*HyoCObXmVB`=wkZC;g%XWFWV!f4xJ0GW%UW!xx(G7ruVE{Y7TZ!p9&p zd`s;9vf1|7mVkz4_jJEo9=|AkW9K>0xXAX4j9WjzWi=sjHM3tP?cbmUYL^jy)g{Ju8;yT@5AGW@j1sdIw zy8GGtV!FQDbI|D4(-#ZkJMF4WcP$5vX}OF4b^3Dh^hHO|5FTU6rS;D8d*ot6KqH3^ z=6{X8?BriC8DzThixu&$cHcNlf6 z^&RK`6tDsh1Ge$~7JZ>S->Dolg!lYH>VAgWN69ZXfQA7Tta5FB9e92r6{IV${<^RaO~HU>9BiQSdsu54sFbnX|qdbwgL@@<~h3eImvHkz6%--{k}k(eWCx&roJ^2 zU#85yFf;i=`y0n_(5P$di*t%EjLjArgGOELN?tO2;k zlxS$FaM z0=1jUN(w;Z%L^vQx7$V7?*a`LyIr`r-budO!91L&>J-neU#>5L6<@sQa`cyUO5e{` ztHBl+JfM@Fg># zqy}Wk;?MoA@@=lyK@uo~?~h++ZLWTWT<7r7;NWvoS(?^OThR- zIB0wwb&Ou&i)O(W#%Bxk7lP&x7WOwTdhG9X-^uWWCcpE1X6N?#t^3+Qvj%PZ*jvuo z@znBxOy{o^WSCnc^GgAgQ487OlcsM8BgmWg^Hx-51uP3ytHN>_CP1K91T| zxg`gxFH8^OsX7(Duzzc7U%BwFFi`3=`?6Q;;!Qp0`QC;vH1D_XyTN32v-Aac_)+_! zdv$AHsq(KhkixJpcjXot$9CC)3a)(;wY%gmHokL>2Ngl_eRlWrFDAZoiw6zV-tXV{ zK>vd0I(K={K(PCQ{vZ4$JuF{%K}n3~*M$0o%1ai!2bD96D^3c$P@LK_uSjOS1cT)w zp^L%io-n?@R$-sI70a8Jw&Rz}X*n@If0+^&0|WCm&{}}eIrh=@1*2;#hQhiMP0vXxu`m8J{%m-1P@~m< R2?GNIgQu&X%Q~loCIFp!R_6c! literal 0 HcmV?d00001 diff --git a/gerbonara/gerber/tests/test_cairo_backend.py b/gerbonara/gerber/tests/test_cairo_backend.py index c60e7a9..b8c9676 100644 --- a/gerbonara/gerber/tests/test_cairo_backend.py +++ b/gerbonara/gerber/tests/test_cairo_backend.py @@ -105,31 +105,19 @@ def test_render_overlapping_touching(): def test_render_overlapping_contour(): """Umaco example of D02 staring a second contour""" - _test_render( - "resources/example_overlapping_contour.gbr", - "golden/example_overlapping_contour.png", - ) + _test_render("resources/example_overlapping_contour.gbr", "golden/example_overlapping_contour.png") -def _DISABLED_test_render_level_holes(): +def test_render_level_holes(): """Umaco example of using multiple levels to create multiple holes""" - - # TODO This is clearly rendering wrong. I'm temporarily checking this in because there are more - # rendering fixes in the related repository that may resolve these. - _test_render( - "resources/example_level_holes.gbr", "golden/example_overlapping_contour.png" - ) + _test_render("resources/example_level_holes.gbr", "golden/example_level_holes.png", + autocrop_golden=True, auto_contrast=True, scale=50, max_delta=0.005) -def _DISABLED_test_render_cutin(): +def test_render_cutin(): """Umaco example of using a cutin""" - - # TODO This is clearly rendering wrong. - _test_render( - "resources/example_cutin.gbr", - "golden/example_cutin.png", - "/Users/ham/Desktop/cutin.png", - ) + _test_render("resources/example_cutin.gbr", "golden/example_cutin.png", + autocrop_golden=True, auto_contrast=True, max_delta=0.005) def test_render_fully_coincident(): @@ -284,11 +272,11 @@ def images_match(reference, output, max_delta, autocrop_golden=False, auto_contr print_stats('out pre proc', out) ref -= ref.min() - ref /= ref.max() + ref /= ref.max() + 1e-9 ref *= 255 out -= out.min() - out /= out.max() + out /= out.max() + 1e-9 out *= 255 def write_refout():