From 379ed3df210f862e345bcfec63ac3b18efb2819e Mon Sep 17 00:00:00 2001 From: Universe Date: Wed, 8 Apr 2026 19:18:56 +0900 Subject: [PATCH] =?UTF-8?q?wip:=20fill=5Fmask=20PoC=20=E2=80=94=20explore?= =?UTF-8?q?=20face-centric=20vector=20network=20region=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds an isolated test file exploring a fill_mask: u64 model that replaces fill_rule: FillRule on VectorNetworkRegion. Each loop owns one face, and a bitmask marks which faces are filled. Fill rules become a codec at the import/export boundary. Includes rendered comparison PNGs demonstrating: - fill_mask vs current model for concentric ring scenarios - Complex scenarios (open paths, shared edges, T-junctions, self-intersecting Z-shapes, pentagrams, overlapping circles) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../tests/complex_scenarios_output.png | Bin 0 -> 79429 bytes .../tests/current_model_output.png | Bin 0 -> 38873 bytes .../tests/current_model_workaround_output.png | Bin 0 -> 51257 bytes crates/grida-canvas/tests/fill_mask_poc.rs | 2120 +++++++++++++++++ .../tests/fill_mask_poc_output.png | Bin 0 -> 46095 bytes 5 files changed, 2120 insertions(+) create mode 100644 crates/grida-canvas/tests/complex_scenarios_output.png create mode 100644 crates/grida-canvas/tests/current_model_output.png create mode 100644 crates/grida-canvas/tests/current_model_workaround_output.png create mode 100644 crates/grida-canvas/tests/fill_mask_poc.rs create mode 100644 crates/grida-canvas/tests/fill_mask_poc_output.png diff --git a/crates/grida-canvas/tests/complex_scenarios_output.png b/crates/grida-canvas/tests/complex_scenarios_output.png new file mode 100644 index 0000000000000000000000000000000000000000..e771cd20253607e83f7ee3ee3ba9935d1bc556b7 GIT binary patch literal 79429 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 literal 0 HcmV?d00001 diff --git a/crates/grida-canvas/tests/current_model_output.png b/crates/grida-canvas/tests/current_model_output.png new file mode 100644 index 0000000000000000000000000000000000000000..957938c8b4a0094917a2c9a049df747a0e5896be GIT binary patch literal 38873 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≫!C zO0ChJ+-TpOd&?1-$eZ+Q^3fIJI1w=|O=zn?hDshytG8T)|^J zhGN1OoQhMI#b@uV4(q*}?sEMNGG*tOu_VyEC+S*O@wOj+{{+ChmaBW4HC9 zb)|Q`Q<$OFT;IVGQOA1}<;6Rm5br?x6 z#l&jR`pS`INN4E2`%Aw*?=4UuRZ5j3l;@O@5`-NkKhd~o11{5a=(>Csi4sMX+KtBs zU-t}wdIPSH0=*OFdF3n(GfaDLFNbba2YID;pH0KF^R&X%jp=A5v$#+;p< zu1CdOu@=ns_VtBSI}{NliE2I4?S3Q-_E%t;Vt8LY{bjE(z8z6$sQMuC@va;nZ3&-Y zs0~pAnD+wb6N%HXcW#H$-AO@&vh<*Ru&X9GLg|?YA)Ot|tNMyRe*%48N{v_80lG%K z$%$H#IV)?utzT?j`CZ()yzUVW!h*Ayo8n&;4TKpO8$dz=y^h5RIdcHUYP>uzvNp}3 zj(Ox?I>Cg@VSZ-e!{FCS=!h#wH#&hcP09mos>;itCqS^)ST2FcmJQ1s!;(Kk0guX!dh^H23aeohL=VZhCR!M8wTiy|!>ZX( zE?j3A3LE7J@&?eW!h=cfL}m-3^BT9!MbTn=Pu&owi!{p-%iHNTdVfZAzFo?1S{cyl zgeFR0!osYJgsN&0RxAP7p>X)HuhsIb9Su1Set-Q6E>|sM@P{eu^-!j@bH;FD+ov54Yqt{ewm0_8sjiXr&p!yJ<%K{zhA@w5Ss`X9K27DDY2OkZUj?U5K zrp6=+$3Afs>snnZq=haok6dU6!9nMB>hv@MDpDuR3;FHcv1@Squ~;UcnWp4aEW{!y zC0V~DhZ|$~f4ng=lb_SL*y?Z0Y(ZbJ2=4atcS{kx6~QFeTD){$t^IC{*8G@~xbZ_J zyw;gMBCvnpP3-!tPZ({9%||+y3D0_ycPsLua{<^vzMAQJ%j;-L%@ z3?;zd`^{!h>TGW(6GTB|ITOn^MkH~zf^Re%=1WzE^7@vuHr%>aX3IzKPNn!;!Oe4KJ4Z1Iv6Dc8;=*%nrY3=ZQ7U>W7 zjpX(n{S=yeOMAV|RxYRTIbn4rl_|b*#f!lo`*U{y%gM4TjN0r<}^=ZxxHS^0yK=K(=otZz;Ze+#=9Ytp#=-{*5McwiOu;{h)xMk75c7F zVjJu;4kP4?-~D*-uK0sWo=@1k24yt8Mn>GQ3J?C%7#cI7HQM*|$%K0~fzJbFoTD&Q z@bN26+Do`m&EW)OAoRMsIv-F;P(5%Y#!o?28leHo_0f8hcL*bi@&Dd88r*sBV`;qS zl%Wzx4>Nz(g98IFWMxgyUpew;5st~|TQo2jMR+208LoWsb2Cg@%(FbO=SKy|IF}=k z#jh)*>m`hH<4i!64A-p^w9A50St}TUxdD8fn^HpBbu&4fxXz%+NYh13Tl0-Gm;H5)X zeWbUnhTq%$b{@CMs|#XxUHB`i0%Jq0C=9i6~l z%Q{4=j(Ryl4jMGsd1Xs_9Dd73IzX;kZ!-lG7i(LYvQyUMNvh7MxiOZu%pG7S2V={K zu3WL2s+0cu)eTtz7d1qP+dIwmMuNGlc0g@C7cD8C!1wymyNic{ zrKFGz96z3n329W3eDBw^aELuE{BBX0Otd^cvav)4_Bkk^-^s<^uO!kB-aq@fh-AOB z;&)GhU6X64g!pQ@m+%AVo~!MWfP6hHW|%SERyc_Hso9D>p|3W_^w$6iOqZ~bP+aoR zT{yQ}F5Mdx(k(FXAO1u5El$B!y^%A$%(>XJj1EbHm94<~E^f4~4B;RuAGti+&|ngP zvM#7?$eEFM4Lgj0S1Nn&JRWzqZ&~$#6h>^0c$nb|OQv4xfl`YIC%WxoIU*QxOM6t= zSdvNNjnpmZ_^JTn7FAEm$=|t>d6(Epo(7dHnwuO2U=uGHgn@w@G8i{>ZS|@Hl5*pM zu8OfL_149VOOa7#k3S{rZ1GtAu_$uThf2={S2`WW`@PX-B>53GxXqVw89(yJ52eA9 zPoY*wHq}h?dplVDdX%(G0j+fC$BN)SL8D(IBPFK(M<}K-)YFsm!I;QMsvQSA^7Y`6 zRXds`W?}}R5I8}`Nr?!;5iF>bk1;VfF7jN$7@zh;{u6n>BM(`^-S6k87#Cj|=J=C? zx1V2{Yxm+LyeU9C6>~eG7D{0As#swPu>=obJ|!l25OeK@wm%_PfdV!m!S=v8M9U=L zb)cC(k-jiKgWOiY4mM`o`>0dsJ+$FYER6 zqNZK$bFDKG%N#e-upwcZvf5n-KsBDWRJEa(){{hp^-Yl-f9|@gO(n%&j$pPX5%Oc; zV(Ywu1VE~KufXS?ME|+q^)sSo^b^yO zE_Lm(ovDV;Vu%GWVwfW>infx~K=$q7dpAZ(`+-jC%h9~`~ zN<$51?Xt4Q-e_{x#Wm80Z?9^oDEPb|%_f0=dhhDh8&6$X^yieF*Fd%(?^-iij=#n zmfq52jH@uBC0B5^=_EYcqZKPV;@wnCY$B{85G|;!lJu1cvn^0NBtOg68lDk$^x)$! zI*=FzJ{QKT*UUxOe~in8NGnoyTgabqxKY*26&{ZN76_HB*M6jT;}6_rs`uZWZm|k+ zmSD-yBdgT=7bll?W++^IUx&+;?4&E*ADM|IbLwQkuTULDUD`VGYARkk(iwF8@6Z1F z?b`)aIj5WYlQHd$^ruZ~K;8&Vi;R2HdT2y_TcZnLrl7q!SDNO`O}E>WeN`Z zOtUl7U-Lhg6CFOZ{?xkPs8AWr?`3wGOx0CEwyQDd)7sl*>E$%+OQP!jui)XC93;M} zhu{B<&6F~i4&4b`O{SooTHg$7rP0};NKQOl@KkT zmqM-2Yeehz(j_B#i*<}tThwA~Cns~xsmc~f0?*)EQwN091=cRST+nw}2qy)Gh44M? zC~n|0P?eMKm}_Tjff-Su87~%8g}j0b)X)s88Y)Uy61!j zk%&ee5Hy_&Wx41##xaJr5CZ9~87v-)-mQ+}cg)MuZs(LP9h|&PyLBZk$dl0M_p30r zQB**rxq*H?lxH$oRimM`c{k!qe*hb&)hC)CBa{d6VK=GRYyUgTucPr*DIdMjm8Lt- zZxGEz?=_Rh^f&5YLU85YAlEMhK&~djH_5R)?M%tcfkU_SuN;Al0f;mZDt`s59 zp)Wxf-u*OsDCG_BhT6doB{+lZD;V$QeWPAezClLj=2{v5NKY^Q#i#XPyh=k}(;S%z zdr@O}bpor$CEKh9efH%)v}R1sv4ow+y&xtR$36^6UxYJdIalW(M_SLOBMexn*15qM2?gFOGz#ic$F<;4`i3Dh=6?wPLZ zpCUL*L7Mb>Bmtum-Lh-spHC!tUuwW7C2U{e(fQ6K6XC?;W6yE4e}Ig#lJl6lOED8h z9ns@wot^x7@Z0Qr_FuF!yoSNvc(LuyU)l1`E6B>psWK)7n8B z3IpDa)V3^rwdCLNjY<)Jeq3gztOm3`p5VQUnU?Y4hAa3fHhMeQe@9-IFmO5fSw0mu zK|=g)2KQXR>E&_Ktq?=g=!As(>88`v|2|jEHJWKUZ_l}mVj^}Jrzze2(?@Jh$XTHJ z5p?-A$~7${$>hjO2L5uUm0gpOTAMhx5hx}R=uTu5p2y`0_QjLc7)ZTUtJiZ4VWSgxxP?6dOlgac(8UJ~Z# zMFPVGtR=GTq~u)4#}y>UMS8O5bHa(gew(nxsOUX^aLJaLTf~nUC{CG{LnFA9AQF-G z13mxiIlM2wfFGo=<5QbLXYwFvBUi}gYpN2s^{bbf8lobCJ;l2P4H9exywhR((;36r zf^={l`6&jxZ1wgtkd`^%TlE(*C985)_Z-2sP>#c{#B*P zzrnZQYLdk^_WGi*fi2fQVa8AmnqxPge@J_Zyi807@-)*&XvC+?A`k~3@2_*Q_3qCt z1&rOC#rO2|EbKjCFe7nZu{q@Az7>K(>gG-pdqGjZwYBfH`OVbcgmvXet>iEUBuesM z1>D1z2*aUkD>qhd7dE)il>PSfL;g%t_Nd=DCFO9h3RH1{t=Mg*=vet1XmtGiGwYU3 zMhz0BZRP!#@5!lI#Y)Y_gC*zYX}p=W(ArhTDoONo)T_)|2+Wha^Vhr_GAhd#Erl<0 z)uzP~iQ;i#$b=hL05y5&l0ktB$0OCerUwJDvQsr9`*T^C%9csYml54VZ4;B;yaQmM$3>WMrtp(lubaIKhuqV=Wg^?j`3LSL0hpf;$GPzb1z}uV3%Yq=*geV7| zn?$ky0@;wXTfmo=f3dsCc7^ezKGVS-L8VAIelO^_Dy0D;b=|v3z$#+RrQEi=*tv7q>V#HmxQO+CpCI(|OS;k05 z>G^E^hQNCMNJnv$b2-wJQp@d7>rr5mG~DsP!<;Y05|CSe)~*=e<>tb?6l2o4`4ZtH=IG)p_3axd74~C!C$OW7bittov zBR@T{d|ud0uu8QRC&nhGOj76$TXFB%mNLRIiK&4(bFqy?mHoRqBeMaEUWpL(463wz zNv|y&Zzl&lkc3>f6#WrQ+_~qLPwI-HoboK@G9osvh~>_&UYK=m4sUvlKsrVsJ-Hc0 zWNPRYUFiHZ<4}W6XUcT>Q=}Bg0soDp+IcIh7>o6n*IulqWk0#h>=Cr+|4ChCE3svM z=tE>&0?Yi1d$`;aH|9}q+ktwJZPlLmxT6tuL; zhVm5E**ax3hcHU04MZ+Dp#eaKruRH?<&*^{faSBzPg{}vL6vuq%$3&tzZM{}{}R^t zdcL*xW}EQ0xJ`=W^G`|<4%vdAVV2nYXvkk5O1Kuo`wyeu$x;6-G76OjK!he1ODMe9 z&3Cy=v#}J^1-RLD)!WTKhpa4r z)$1UU4hc4mMz9b?%zeHrcEjQUEseDhlg;W;^MVhVTTmkyV*6d81lD0S$?&NN@zKbQ z9w$FAH}4ljt&LZpak2u#|GJDcfG6i&!}kOyUEdpZzjE?S)t5!{OW!?q(t6Pcf1YK} zbEx*Me*UB z%tUr-XU7aKUEC0luQ`&gCsmo5L7=i9j#>AQ({8XH7r9ua-9=%1G;N@vv``_xeJ)00 z#E*^g_u;3)uJ`PPTf&h;Psj1dJvHZlF+o{%E-7TnCqfbBb&@BB%>TasnCaWaHodYY z0Zp2=kuotR4P0B_G(PnJG`~yW_qtq_>Tv>9u!8S2(sOM#1>b>K48>(xC8eN3o(F(# zy)Z3l)FmSCoAc4av*Gj z1jWk_uyOqWVrjsF$Oq67+5x&k^qfV4YKwPFtAZArvv0|(QI}%p zrt{1}?o1Q?N#rusOtRHCVSBp7@)K2 zLRiq?oPL&VuvPjC zolrWD9zBOv)`Z7W;_~Tnwp8!Yb2#O~$^SV4wl6-(bt&=H0}~U(hb4(5?o?;y?loNL zT|Rh`Uie8fc0gItehA@$IIg?E?7>tUrPZBC&~piTrA^sW9NZ`F{3~vh`bPv}lv>UR zN+)U$0`JX_DJM}+g3de#(#el=0iO*T1p3^6tkVZk$;o_dXn)Z~DgG@&7^dootzh_i zbGyeT^4o<i)&%IEL#g6;FJY`y4r?G*^2WzoiICb5j3`v zFdP&|MuO)^z8wt{un9UCVQ9O|o6i5?OO^%_hR5LM*~b0B_4{0x``%Q-{HoBjm-V~aQBQX9gh{-6 zmmmgH*`WF*gMPEoTyMryU7==m%4h1H^RIvoZF=eDt~W(TJe!co)Cry#1z7V!33K&< znLd$f6T?b>5A(96XkM@g1w!NPmN`ntLAnR?#{IGhX#qhO|6ZI(#By*oM*U z$=>HdV36Jq?v>fuxqhx;Xqyh8+pfPRPVQ|39c1>m(1b0RD-#X9S8{?&?!bBiUuy`- zH3>2VqPN=B41D328tR;#&j2Pr4(Zo z3j%R|#}D=fj)_ zMz|@q&=0r>F@wx!>duc3P56eQ~BNX?8BQSR+sOE9xP(!;OdU09_dx0g{4Q+|+s?zC6Pm z!eWqvg3wnYzzFT4#+hnF=&6R|56S^2x`!vt!fL7JVRq3 zXoBvSB=BQ0GL_yT0BI{U>scPIAdVi`wadC9{X8!Ap6@ z<1WREx<~wH-ZuHp(yO^8?)GEOEp07xn3OB#;fIXkF*^7!d9zuVZze5eO1BwU8q6vG zk%Bh^QiwWGcMzfg*LD?b@Sw7a2f*Dw5uD)}8fA3wJrJ_NLmj8}WF((j5Cu%Ma2RDk zGeZ&mO6($aqEEK5p-jOZ>aZ50u*cu$H%r}cp+gazj>{7U?+~eesq1Y;gh%An0>(n{ z94r5i0&#(jjSUPs`lTy&mxg7YxjNrxEnFmoPAu?>beHYom;uU&BlJRM@C@utO*@MG zFtZvabpv>SU*q)*{w_)Le4H@Tm}!$+d=fJ+N~*c;=UmpalyqD5I_=3P^7C(w~*C6?OxRu(-xO zOA8qyk1M`AiZRiBn9b)vUqZsXFFAOGJ-|yz2Lr=Ci^L;Qz>bZA`D22>X$M|hJpZ#G zxR-H+U8v!>^^i7D>lrrcc0bL-%K_4gxxeL*(pcKtgJ-{PS@a~R;tM6Yx_403+TCek zFtX5-UHX>Oa#UoWxZbw)5z>X#f9Cd?2E|?PFX?H ztL}uhSWz*G$Z@QOerAq{yHS2Nc4G$gO1FQLcEmSGo|X5YL1d0IgW6S024$%c@`{@1 z2R@=cEn&>~b}j<_?d5_F*~2`X6E(@_)Z@X!yq!5vD3fmlm)w-Vws&+iYO`+Ot7QC7 zl2X0Od))`)7#h}$MB$DqnD~bSVZ*iovxhm#WqnNNw>a|LM`KS;!mTY#TbhpkIZg_x zxqpu7vzFtp7z5yC=9KIoV5HXnMVYB%NqnUYVWYkTk1us7o*U*#8e zHH!}|>222TM64@Q(t{2KXO$RR1WU);8tp;b-R~x84&I+({1O3=?e#D%WN(u6ljZI& z7CVsJZ10cHo)`$P20A-A>6cm4LvD#dY(VbJDgxb1U;V@aObW2WT_ay~*&yL8_bN?2^RZ}(=z5;b5b zVoxBgaXZ*V3`(uYf0jG#5_7!a=6K8@`rzF_#)!y@@Gl;DDfgG}k)6;Lu-u06uFwUpoj z>g4O*X}&|pVq=(ds2aoGP`xswWHc*T-?J`i65h=G0}YdwP=_=4ytRFxb$wZ7NX#hm z4(JU^6Nir9x(a|k+6!82`;-2=U>ug&{}@|jx{gdado&-Qp)2|~qtB+CT>nI9vU=$y zz{B(>6BKaJT`(bR!Kg!=H%r1bbOZIL+>TLGdXGw696m^Tai@7!iv+4Uurj$<&IFpxxZ%> zua@3u$Gp1ORxem1E`m>Z;}Sst*QJ1fdu&A^?6Uvv7Uh+#aOud&y=KnRai_+6Wc%;- zb*h+eJPf?ed%E_IZiGI4K z;uRHD&U*Be0$;BpUq?gy_p3{FJ}K+*;V4hZ7|V2#zY%2z_w>gm-k9yZIyp6JkJ=Y` zMDuL@h$(cX*tLJhO8I^Nj+-D*$pIg3SR4+4&qqVm#%!5gO0M?KZf2Bkk@s&~5g1%i zxe)tA%yajac(6bbQ^{OO2^D)YNj1q(L6n!x(YkICCHvG{&kVqjv3S+<{&4Dwc$@(z zBdM|1mf}Y3js^xBzBw1(QqlhNgG|0Ij8p@)MT`t;gH>4g1Jq0+KE z*l1C+i-EBu_h4EI+!}L;vqOBJvy-V&m|P7bNC$$0545FyV0K^i`o#cAm*s|S^Un4` zmt)Q!##>z`Z$9%dcUbksxdwZ(G^ZA8Kbuy`lm-MwZ3Ax`7B-NPF(%zUV(nz z#$Q&bOHbB(LFWvmD&PZ`3uf4m)MLI>Es{F;pg`l|0AxCDZ$o@gAhq(@&#V^IXCD5u zwi>wDTL1P*xzSXqpTCu)af-SA!#{CHpEx(thk!s5`{Y~14%nprg2zhzll!8hjQhVE zy~r~uD90?6jZF9?80mV#8+!o?h`$DmsdN7MV_hCpIalvx&4?Y;q1`O_tmhafizhp^ z8C_crV(*sD&MjBf^gF*wUD)^$|ElqCH%h&sfb)ukrw8xv-h?w(8!|P0NHyhz3PsrQPSf)@+$y?K2s+-pMf205>MN z!uG&P!fmY`@NHr!j2Hy1W?+I_nS2SZm1#p%1Iibp0`KArx?hgY&h8PAkXV4d_I{F7JgC|QOq(tp z9~|V)VL;!qQ&Eq_&3U!xy0a)&x!KF51?cgrDkmhlQI_11YF zZ3PMX??fLnY}}Z>zP%;4{!J#hOTDzISu9k5{;=<%{kVm<;5X9sLnmV&)+qF1Poo*X zG6H6%0N?c`)YmTHhATkC($U$O4uUdJX@U<3OxsY68!UbC5XPUsn5g83tU2Q$hx5K^ z#kdFd>fgD?xHu0q=zr5Ayn%B7%XPtFIo`s=59< zq&T7P@aHs_@d&I+;A~esKXzL}{Skq-i#&DW9XyFoPx&_< z+;%;zu?N1A$b>Wc@D7YQliG{f)uz?)=H}q%j}mv5az6bB9u7$Hp?aoqoXr8o zo2UCV4m-2IJ|3Blzz$U|Qj#&-EzA#nc9tbZiVXw$*7o+VkJi#B!^F6PBn$!X1}$zA z&ej2UJz8p(zU>Go%`*U@riF?dj;SlO1|QvdE@tL8RnALki4(qKNBnyB--6Qg3x7z3 zv6?fDMX_;TLpXK1t*TuO_v^bg;uTuQC{Btx4?Sbl7D*_hX4!~_y{tAB2v6qA?S@6u zj|*F*?pgd4gFdMHGPCnOIW@KU?6MXi%z0SSJf>Y+OR~L;zW%< z*F<~rymL+JjgKoY>v+F22TibmPh}&dNg5Ds!;zc6tBnRQZv4?$j@Q2#rs#T1%+IuR z{TfZ#qC*Dh(t87mZcH^6DVA9){$Epl?wQpmDSq6XhQPI561q1%Dp&tx|+I)gA?JJ*)r$-#k^KrfB^$#i8#IN9s=z-|gtYvd$L zMut91pcj5*$(HHn{j^@h@T77K3gbr@3Civ@510o$smNRSV#?RC6*`5Y8x0Qn0B(~x z7c~UXxL*GIS^9UN%~fK&4Q)S}zdQ4IKpBf0(Euv)waL{#M>sZ_-dj66mh(ovcI6Y<9C< zeoBg>tr2fI!YMsCaN}09%7kEJfi?_YkaaljQ5*FKBfaIC}dm_u9~)q)3)n*&^Uw9auN)$oR%3fYWe<)K_4+M z0FUmec z3a9=Pp>u>|mtx>0E_uVc9D`huP?Dii{81I%Px_;$-$FMZN14#f#8V;giW6z~!5Nx*;YkGZ`dZ2TXB5{uFluF&bV~Y)J}(YRR^i-N zo1iGpLP<^!mJ6e?m+_AlxI^7GOl`(wgGrx{dE|`DTXZL%kYW=1SVdmXRcRO>t-&q9 z_+9*u^uzu6FuwUUQ4(Q+u6(ynT?VP5l;#jNi;9{(DLq}?Vwl83l5W^z9iX?A2@o>zORdqNq*|(z+pGErEN%YpMAgj zPUPIBE3Pd(-f?T#CQtKV3<&-=0p2}a?dTly@}+{C+dGO5%HaxEARS6sru?tE%WZ{2 zF&HC7YOeghr^M%W&&BQThJd|1RN=P*zbQ&mg+ttkSI(Dn?O$LT0hB}xN2=$+lL+i2 zgs{DVGZ@R=T+_Z49A&~JEiFxUhtjjXlDhJ|p&Uik+Pk(j>6+AX_qBa^{svROiuc_g zveifD6I;4beqYCFU6Dt^?D6F=P6@ZowUI2UR3}j8LDXjnWLN?LT?{=Te0SWXa#uWuER&!vMkdNXx74~{ke^_sCX zp>e5qUGs2ZW@0Hid&mTchq2(<)}56WPzQWI*Y%_#sot{9@NkjgdnRXTEP0?LgHKON zLtR}#2UeN5FU1B_m*cPAp2SnZys{a_71V((OEHhIYEQTb!5*`{qxe5})=(Tnu-D~lmserF8USbLW~2<732-Y;sx$2nJ_d7wR9YgmLO z_1e1An91W6T>Q~cbR$$w3o(vX*4CtXtWZ1kht&I*j%N+oUq(E}<0-D9&?4rLblP|D zj8_3srS572zD8SQ_x#9c6_Zy5SB;Wh0>Bs*07pzK&yHWx;k)~u2$)l z1Sm4j&#hgQTEhl;oqi4`KL3E>ScStSD20NFIQK1gkGhgeFlSsX+nUE;Gtx0oLc02J z`T{FCV>Ef5#8;rx;Jvwa{xsGIO(vA*Z6O{@ki=BBRd}ZXmM5T@q?&2cs%xJma=$Oq z7}v@qAO7ab5t zY@`B!62-5^hvDF+b;nlq3|G*P+)tx6%+%*ZXr{=*7-G8dfyt$ zfHnO0`b!*jB>DV%4Lb>8-|Dz zM)Wl+E2ZkUb~PwWsMq@YhpVw<(x4jpt)5)KX+go2ai~Fdp4))YN>t9xiC=GSZzd{Q zzwCQ*E<|6i`3=FI3C%Qnq{qbndj#7Q^sht=1+bOs$fE_dCIJhI*~|z}x+Qo!=hiO> zp8&*aQZHPTmzRfc_#6gy5D8bfT1mss?uL(d%8VAA_G4CunU3l zvMn))%c=6o__$eycXRKIZxTO$9dcTVO5ExB^0hVKF5x=*%2jaOicJckEN-#dt_rU>|r6d5!oS zDLP9nE+79Gei}YgV)x{K1fPtIK z<(BmtP^YeU4>VZ)YhD={rxo3B-(r{TmSGYey37!j@+jPNyD1I>ZHKSxV;bnUx+92^ zH{Xg1&!2Y~t&NA(poZrC)Y*wg3Xr@z!f^6Ja?giQUp5|s{pj5BHn}a|3mf)byC=eXE4n;4e|8T} zSBH~u_aLdZsB*m=b9a9zhsuMCUrL@)7Df_*?8YH}$os-=G(!3Txv*@CD@XNPBm<(Z z5^*wM;MxruYZL-QCJJ>DTdB9Y4SlRsQ_5XhZw?p=*OFa6FngI{@s2^HtXV@-Dj3h$TcBkl<)T zfuhz6!}B9EwsT%Gu=F0R+K~y#h+<^fmt#rtScd`jOuTRuCiEh_Aq=&|%a2uVlAtkZ z3Gt+$PvonIzUyauN{H_6_IsGUeFmNtE@0lkbtMM)DB6F+8qn}WiwE>B3~wq@nH7v) z46zl%Oe-Rf(-mHHO;~nrp}oJ@>miNCS1C$Cq11bM{DP3AgNRjzjJm5s;y)=nJl}Ya zmw0Rxnp<=qS{$O-|)A|d91FmsOSTbymiq09(;r9 zk`L`i1i5>itbZ087fmrwn%P9WX}K{DMrf4m5)CN$Ov$u2wY|bbx1G8hCeD*B<@Y_! z5Xr|Ib_!jw;7FZXRR0n)Tv!c#V9VV~ZJ6~rE_lll4mTo>IsI<1--~gWsiQyQ6cn=- z^H*Y#xoz^})$G`=&bj7Dai$Ryo9TyNuT@Nu2BZ(wEir#f%(1YQ=&CH4mi8SK0b6hm zQ2d0iAz8W_NhO)2fMP+D0+}B~UgYBF&|!=8P4L*$6Z!;XoTzxr_GOI8GbPx;WTw~`7BIqmy;8IVHRxBonxm?_mRv0W;x-(J~ga`1XjdT3L+KP_6Arfm6 z6k?RFlm8*nfTA?g#g{R$KxNU&h@CPE(@?5Qi-j0dzt4I?Cj}IK9j+v%S-1+8u9{bE zN`&*uwB~kem3li9<`KH2ph}p)jxJM-KA9jiwKgHU91t9SgDM4)8u5ih)*PZuly~P- z2O35>zxt6F#j!gavrAKgg%c(TE=AcFzS;8kcYZ369Lt2BV{o`Nv@p5l&SBZlf+StP zX+ScZq`xUW;sHn=nuNh7fJB`dTH&8I@j2 z@iv0@(Y@l==Bpqv1}5ugNrE?D4{*F#Wh3IcA#1NJvDYIL4rHQM-lWJ+b|l*m(B0L8 zMl07Mc8T`M#6+z&x$P7#3!XmfH&J|{c|yfT>A+&Z60MHTr!^o{HG(dO2sSPY7)tyX zE)-wyL_-hsia>fZKys$)3D1c4T) z`73|xB(7dB@m>E?W0HciXkjUfn$;d04Jq%pWEoRdMln1Xdt|e@1xyx*2Jq;s5 zs`Ob|S##gtA3amXpl&9t_(?}oM>My6D?LaljmI%T?=pe{fGb>m{JNs-mh1NSE}@BEEEeK{daf3&Ro zP1O1-Bm?)renG5GHhGSloN+~YUFYuIPx!N~L|md8TCZgq15FF$5nzhNCo4M~;i_Az zFG86giUl9j80V2s0ZHesw5!qGSgFT&B=7YU)Ly5#;eSOyE4~TpD(yR@Em%!-ptKx` zxjEbdBAxmr_YYo4^zKB%{)E}E$E{I<8tB-Q4EhSa9bE@S9>>M8*Y9{;dWO53QN|f` zpYei&NMCfLOZ3tKA-QK>mVCZztkL64Lhr4VQH3UOfAikfK6H~)4>4ROUpi5)qmqF; z_}C=o+3t>eS%^)$d#4<(`Tj)@S!J!0+4C89_J#kr?O>StG28il*V%Xb+Y@|L&TX?1b}NKtkKebTJHwV0AMHzR=1c!P-yGK z=2WlhK(5-K5>$W9i3bw@XufhW^pgc!8}Z1*5*WllhKz_o2xzYKZ=}BS9r_dXY!+q1{eO(fCev*eY?n%Q9 zxY)ek+s^JBQDweko|K(PdibM6MRUb6^DS~XCHbUAR0F7HU`4i|Oy|5QD}RMCQl;j~ zlv0)vg;hvrz+A?eV>f-y2vlimp@o+7auCg_<9SO1eJ8+ zHm*s?L4kUl>F#efVow&{-A5hm>gp;>&9&}Cr~3UqJXGNvi+TH!gUZ}ga8!Oj19JM8 zIdXmYR21_#gQff)TCv6bd^2nC;G`2vzP!PwguDvY$wkG(Hsp)embTVwKU9;Sz2CFQ zl?voseN-?an0|GgNomA zW9%@h9&1}9@S7|ze`>1?;8ZIzzijP^v4WjrNe_rBa#5JK$@i#Wrft^x@=SD03^51q zL#1b6Ab}9hhq1BLa@$Ax4{-Z2yFs=o?#kb^5}F+B`7!yA{m`bokLE54+)A?9=-g32 zs80X_zQUXzKZ}KCLNKU8mN<`L49b5OZ1Mwqi_|+%8>pf^&4MvO7ldz%n9%|Z8w|54 zYmOSqw!MFy$qnmP%u5qGXGe0%bzD#?*~oa{cta*7bcN!5#}wrdm~IfpJL%)0!eKzQ zOOme-@tPhR7a7%&XEW&SLU^8X0&U>A<>g^cDFx!`=+#y~S91^JGe|%H)&6 zZR6e-VNbx0R1~7M1VoM*eBV@Pc zN|OLj1=+91&{|@b%hbrr%{7B|0OEcCQ@sv%g?F%K#Tn76cO*R=wvvm#u{KS*(LH#@ zWKiMM4hMogVv<%=bae|XM#kfU z(osm)4jiiT+Iptab!1Jko3AX%Slf-;Pf^?OQ^xyg{9tCHMnyoK$0I(2FR3MO&iHM7 zphJo^O_%0tQ4fkuUPS*nB@!fl3Ds9-A+C9at9{o~LZc zmipOMH&8L5sk@Qczp?3g(|zc}Jjdga)6!$sY5@a@`z9iB4%4b=RkYquG8QRjp|!!x z!9o7ENrIGmZm>KA`T}a`)z1!CdUJtn!^V9BrPe6OYLplp@a2m)S@IjY6|2v6BpKU$ zH-v_w;<65nM<1I+=5cj1dk8)BHqVX?RCh2K8camymDZ_irN>&njDYx~P(%c8+uj)550nvgBcFHR0TJ0MY8f}`ME{y~bxY3$G zA)-g2idK#nAs|C!Q^UagE=o+cs;uOxMHUoTur4bl!)v#uL$R-Tu~-dj7>+ zcg~=X!xT(`a=>v9iQpicU3Gtb#@NT_s>P>JKG1ejB9rob?x5@IJ!W+GR#c$Z46>4q zPDKgwnW+8?7HEaIXJ^@pX%M0kgV@dBPZ#x_Q_S;(HH;bS-m!~{oe=eA^Znp2q=x&F zzT%uoecE@3l}ms711EiT=}cijhnq{Z-p+bwh_1xg5N9Z7Z}!a5BBVj9l(>5{kb!J) zCVXD(_0OD(z(H`TCJSWXJk+d`kt>&FCa-QQeQRqIHsZz)XNJbHF?3?PvWqqi$ZftP zy1^(U_#o$`*M@%iva+S^7sz*w>Ow~*NMz#MV1IPN@f0WPBM!(^Ep;Y8+jr<|A5wz? zyabv-%RQrYnW<9Ob!^E#70Y*69P*yZOYcq(B;C6F+NfOntx)vrozw>p`a1&*@4J}M zI1awgfZIx$`yMqtZPSzb+&vA3j}iI~kqBqx#2xH5+C=SKq3*M+Xqz=pc-M6i9=TNiu9K*%(LI!iE3Hh*R@Je4g!>DRbWesx;8-F1zUfyNor)gMjY_BDSyb|#nch1Tot8aHDP zV?qh(3?*s)X1r{?p>ti|G+*DBugCwP@L}0CsV-=8#tVv$eBKr^;E%YBwX8!&-^krd z)ywNjb8|C9I?%M&S$WEx>+`{6$68yP8OEr}?D}3n7QoCt{T*wQ@F_&B{xit8!~+rF z5?PUYAt8Q?xyfd-+N1d(pc7!U367;>%~jS{zBvV4_Eqh_v3yv;cK9G?BI#J6vTJtz zbAPG~90S%ft%SKu)Z%GuFN#c%fn7=(#vs!3=skF!0|yUwXKAoid)N+O5#7PXdbpXf zl!@d_6kl!NpE4nSQ#`p(uWw+d{gn1KN8-pd-}Bk=4RWeYOOy}zM%?tQ8XSz<5r0p_ zdBXt&EeRIsC4yu~7j5|)%0w%~uoEXvJWCe>B}wKRI@6=Z)Fn$0{S>@l#M3gYWFdA4X z0LXyOf2mdbDfkX9C&&bMs1zRx;_o&7&GKxZ9=p7{N@_@CO=sh|&Nz!p?_Kt7Z7TF= ze_}BuJRP5i7)E?l1Vb)L#LUOr0?cH>B{lQ{ANHXDnIOk<1K})hY;8qFM}Gv0GR#Mz z^Uh)8;t3Pu;A3Xq0}pxypYAl4exgp+iZ5TMx^j{y8n z|2&kLF|g&l8LbDI`0V>)y(WJEU3g*V57~O+G@r!7j*K=JCmuz9`7p#o5o)mvT(6lL zdXgU-hohJSyyAmAuVT!fE2pOw5E1>Vzo{1tV0t-Vv&|G{LcB*KF`=iiad--!5@90J znNL;^>dwP~bju{X{L4D)g9hC?y^|%ss|1{~WxjNKH3Y9r->+^_T7g*osQFD%ivN)! zia8SzcNO0BBsT6gJUj5vomIrv00OW&TxY)pd?MJ!uK>s79mt5MXJnyDBQRgDQ<>8z zmNyQH&;Y9?g6}X$x}gm9(yg%}ZUjxC`mj)5gTU8pXq7Pxtz3W@LhCO;TFWa5QRuVw@j6>dE_R+dJ+Uhix zT?5|J{P&B4BL4MX9YL5BVIdhd+*904vy5*1CUo5~j5k5gJ!Sau+Sp!Jq~@JiRe^x4~x{&HN(M3ufo z9!THq;?utGZaK&Vx^G4BZI?Nta=gS8gfYQHDbD5@9^v0sX|Yr3+j0Mp#`pQI&VAr= z{(2fpY^d90oD*T2uSZ~HqbL)+@XmIlwO18`kD5aofNXU@_>S}N%u86y#@%poIv=n# zG=^wT!x)R%G^7%XpvBv3R6f4lFl6qg?lQ^X<25=Dz+@Y?&Pm1cS#5i zMxL3j$+75h-|Ru}ea_X%s9h6p8bx-;TYl_A44L2w8`|3m4cW?l5X#@!-0TJ`OEO6s zq!|(X8tN1Tug4Q{Es+=_6~J$FZ-azA1q$bkmI-mNp!SopK0o{It@2?f{2AY)b~e@- zxL=WF+o@eW$6Q%?{y0@2O>-%!fobz9U8F+ARdNz>>u_A-DHGTuM~(m+^?bfwQ8spK z4WSu;`W3sJ2)+zTC>WQx>Tg6{Vg)KdB!GQWzo`cc>_Eq4VpZ~3t89Gu;NUJ~k}^@w{8%FyGGS|r`G>*fI9OMh9S=|p_M?)mr}M-N zW*?Q5aS7-p<~?%~Q<5t=FhAg?%e~#Xw~azbb|v~E%BXfnP9g-1-Y|&Ds_61445t-3 z6}!e!Utf<%uMY?8?YK$2HvrE|Wb*(GFPs2tPllY~l!*`S!!djIy=E=W`vpcK&|`=H z{p7Y@+UkhD^!B0VqLOaKO9$&tp;iYJxLfqh?@S;<(UJ|DjG76TFZ$Xz^)m}HlS#ib z@ul#+NeaZ4dyG|h=t;lMI|rwUci_&Zsru^jy(+geC*iXZTcEjF%6T8HU{rXh>hT>> z0CItxSmLmGWbPGH^wJPiP@*pitKdz8Ok%>^e!6p$?Uz=|-4?sjkiIk{RZ@x3XI~_y zLlD7LA~1PsXtpQ}D{@po<>o!?N{4uA+m6coSEn}ubN*Wd zTxoSq3T!8+ijjpE+u8;;Sc;}ZNMe3DNomn0^JfbUxy#=09w-!$~vNjf* zue$|U>_|cDwRj!R|LimICk?E-{0k7pz>@7_AVJ>S$+NJ2yVm)F-|cbsrE#4 zbss;bS*X#X{y_l&If1;xPLM%=3P~P;CE2VI^Y`CI2foon7w_sf(WPB}zMP;jK2sf@ zvcBKolQgBkxr^t)0XoSa{SCV(ps$Svvvp-u_hrj{S2f^6K*KWW3|wHgmza*c1q;|- z&=CBKnfV&H9s-;A!o`cDeJzmQBO=mcek+WSI$pNx{l|1iomv?|agBj%0~if+y4SnM zo`=0^l3}v9#I{G^eYOKZ$Cl2J-7f!n?!@8TC!%4zKP0-<#k<76HNEk)$@&gSv|F2~ z>-O*1hD?a)CVN9E_I$@bH)o=BG^v$w6h7n*$yDGGyVQ!I!wd`-z}7p;As!SXDp!gR z4Lu6#b_75!KX-I|>hF&Q<6@FqCO$+Bot^;UWZsf?_6TI;$Q1mnq=RKkIFHROx|r84 zWf3;L0^LGk8Jb&9m4vT8_ZMK46Jyjc=X`ZTutdLbcsK_IZEbLCasqT^Y}z~_;pWL$ zLF{D*V#_ZzG-D#g)u#{ZFs$E)BTSr>l}&>58zy$anf=N3VPc$aj544W^@@6ZgTYw93;V<)%PHK72x1DE(mv z^O8w3$wSC3`%{qtafCA69SBDuxYH_yu!_<%dOD*arvQukcR)9U(s!WlktF;B4IE}E zDRNnOd$^@?KuJ_W_ry}s9i~{O-Za>sqi!WR&bB*AFhYS0cEBy1oZNH zpnq4PWi_fK5MeKfeJKB@<2$Mayt>#~0>lh}E|^(am4Sl*_df$Hx`Tp(nAzD?p&HOk zFf#t*W5LD-XT1VAz(D{hnaG|78?I#)FXJgy-i(L_%Tq9%z~q z2|NyuE%&{V|6gQ)e2?zHvQqlAIKh{#eEaN#&(WVu|KA! z^m>9Q6ViWzL@ko>%oix58WWKbS>UOe{I&<}N*IT|t*x!SG876$b;vH)Nuk`UNU#3D z0cI8!B{MU#c4tkXP67Ov0mFb!qcVJN|GX0N6=C}Lvh#T?{USdEUCv|o8r{I8D8Xp; zY>mR@%g|AS(;aRn^1krspbDKZ-p9-e^n5}8{)*)X@caM%YU;J5)%d@^6yg#@%ntwe zkqY#;qYjGv?=N$^caP8f=T+bpZfdd?|L?D$H?8|({_kyQAWAob1dQBKzVr9%h>XGY zS*CrG1{me4w@-ljk2qQGQgY;t``2Bcy?jJx)HlB`*0Eq^eHVG9WniEh&o*>>CJUzeA#(LdrXLX* zInjqTBG98fBJ_Qt;Ac}5prFz7G1Q7N|Y&z!@_uYpuu<}@-meF=TWiiU#bRoWDtfeaXuZ=I3eBJMTT|zuu=~BXiS>c9?*trY)W6zr*YWCnyux|+%5pHAH^%BRSD@f)C6Uej( zUkSQ{zN)uX-SA(+xW zguWnx5Fk+syif{O?E&*Jah0!Rf$MUOn)?c_%t>soI>c#67mzRw*GYE>D<>_TfIz!4 zi?vZOpARGFCOx={%B86|fbih1-mCEvMUrJ8EQ8D2#rq%Wo$5EOfSU+m&;kb65nvxi zXyPCOC9Mze4YxgD&__xM=urZzg4PA5%isB~+JRWjqt>B(yS}MbLlIVBC8|P6kEBI3 zR}#Y*xvq2-8cM>@HBx8g2OBR!r$Yhi8v9*;*r?E?RRHfmK#yNTO)FtK1VILvkpgfF z{`rR(mY`aZt;x02 zWI;L%%i`DKV!-Ga*3VB!MC3r@giG)C9v~JWyN)_Ke<3^{NbvteLf{i3${RK|x%t6! z$N2d8B=&e9Epl^zz;j8OA&8#86YS)jO&e)H7$U|bJ^QZR? z?f2YMNPY!Bx{!N9j`b3gr;4_Q)F$5%&GkZKhg-~VPO9S7jQ_^w#T)FiKU7M5#myRN zKx$A>tVr)J6{lxpQ~~|Y2dHk4 zjaoH6rrlofZXis!AhaWBAl!sNoh`I#ZevjN^ovFK;1L8v*3-G6T_kZ*YV>7 zIM&->zZgpx#pe>?!2hX5uv>kxNT#$x?;&10}`ZdFvJLv9(>#un(y_Put46VD1TyDnzIqC|_s9 z#g8Snd$k4x#`1D$rTwSfSw3nuZKzj2EYSG-VywSQZb89ESRuo-d04_tqOL4o|f$|GOTL z2j_rJ;lJ-|SPrQQxPC09?tuhnjuxDUrNSm%uhY1>N~?Zw=qp^d)T1)~!^{}}pCkk7 z8+simP}!Mqfv~G!1;d<6P_1ZJrjh@l|78V1_wE(mg_RV>8(g{X-d&der6Jh@{~wZ) epbO=DbXPxN>hJd4W~71t)Nb5TdaGde^#1|j_J2SC literal 0 HcmV?d00001 diff --git a/crates/grida-canvas/tests/fill_mask_poc.rs b/crates/grida-canvas/tests/fill_mask_poc.rs new file mode 100644 index 000000000..3f108828b --- /dev/null +++ b/crates/grida-canvas/tests/fill_mask_poc.rs @@ -0,0 +1,2120 @@ +//! # fill_mask PoC — explicit face enumeration for VectorNetworkRegion +//! +//! This file demonstrates a `fill_mask: u64` model that replaces `fill_rule: FillRule` +//! at the topological layer. Each loop in a region "owns" one face (the area inside +//! that loop minus the areas inside its direct children). A bitmask marks which +//! faces are filled. +//! +//! Fill rules become a codec at the import/export boundary: +//! - decode: (loops, fill_rule, winding_dirs) → fill_mask +//! - encode: (loops, fill_mask) → (fill_rule, winding_dirs) +//! +//! The test renders five concentric-ring scenarios side by side into a single +//! Skia surface and compares sampled pixel alpha values to verify correctness. + +use cg::cg::prelude::*; +use cg::vectornetwork::*; +use skia_safe::{ + surfaces, Color, EncodedImageFormat, Font, FontMgr, FontStyle, Paint as SkPaint, PaintStyle, + PathBuilder, PathFillType, Point, +}; + +// --------------------------------------------------------------------------- +// 1. The proposed model +// --------------------------------------------------------------------------- + +/// Replacement for `VectorNetworkRegion` — fill_rule removed, fill_mask added. +#[derive(Debug, Clone)] +struct FillMaskRegion { + loops: Vec, + /// Bit `i` = 1 ⟹ face owned by `loops[i]` is filled. + fill_mask: u64, + fills: Option, +} + +// --------------------------------------------------------------------------- +// 2. Nesting tree (computed from geometry, not stored) +// --------------------------------------------------------------------------- + +struct LoopNesting { + /// parent[i] = Some(j) means loop j is the smallest loop containing loop i. + /// None means the loop's parent is the exterior (unbounded face). + parent: Vec>, + /// Depth from exterior. Root loops have depth 0. + depth: Vec, +} + +/// Compute the nesting tree for a set of loops. +/// +/// Uses a sample point from each loop and winding-number containment against +/// every other loop. O(n² · m) where n = loops, m = avg segments per loop. +fn compute_nesting( + loops: &[VectorNetworkLoop], + vertices: &[(f32, f32)], + segments: &[VectorNetworkSegment], +) -> LoopNesting { + let n = loops.len(); + let mut parent: Vec> = vec![None; n]; + let mut depth: Vec = vec![0; n]; + + // For each loop, collect its polygon vertices (flattening curves to endpoints). + let loop_polys: Vec> = loops + .iter() + .map(|VectorNetworkLoop(seg_indices)| { + seg_indices + .iter() + .map(|&si| { + let seg = &segments[si]; + vertices[seg.a] + }) + .collect() + }) + .collect(); + + // Sample point: first vertex of the loop. + // For containment tests between non-intersecting loops, any vertex works: + // if one vertex of loop i is inside loop j, then loop i is entirely inside loop j. + let sample_points: Vec<(f32, f32)> = loop_polys.iter().map(|poly| poly[0]).collect(); + + // Point-in-polygon (ray casting, even-odd). + fn point_in_polygon(px: f32, py: f32, poly: &[(f32, f32)]) -> bool { + let mut inside = false; + let n = poly.len(); + let mut j = n - 1; + for i in 0..n { + let (xi, yi) = poly[i]; + let (xj, yj) = poly[j]; + if ((yi > py) != (yj > py)) && (px < (xj - xi) * (py - yi) / (yj - yi) + xi) { + inside = !inside; + } + j = i; + } + inside + } + + // For each loop i, find the smallest containing loop. + for i in 0..n { + let (px, py) = sample_points[i]; + let mut best: Option = None; + let mut best_area = f64::MAX; + for j in 0..n { + if i == j { + continue; + } + if point_in_polygon(px, py, &loop_polys[j]) { + // Approximate area via shoelace (smaller area = tighter container). + let area = shoelace_area(&loop_polys[j]).abs(); + if area < best_area { + best_area = area; + best = Some(j); + } + } + } + parent[i] = best; + } + + // Compute depths. + for i in 0..n { + let mut d = 0u32; + let mut cur = parent[i]; + while let Some(p) = cur { + d += 1; + cur = parent[p]; + } + depth[i] = d; + } + + LoopNesting { parent, depth } +} + +fn shoelace_area(poly: &[(f32, f32)]) -> f64 { + let n = poly.len(); + let mut area = 0.0f64; + for i in 0..n { + let (x0, y0) = poly[i]; + let (x1, y1) = poly[(i + 1) % n]; + area += (x0 as f64) * (y1 as f64) - (x1 as f64) * (y0 as f64); + } + area * 0.5 +} + +// --------------------------------------------------------------------------- +// 3. Fill-rule codec (decode & encode) +// --------------------------------------------------------------------------- + +/// Decode: (fill_rule, loop winding directions) → fill_mask. +/// +/// This is what runs at Figma/SVG import time. +fn decode_fill_rule(nesting: &LoopNesting, fill_rule: FillRule) -> u64 { + let mut mask = 0u64; + for (i, &d) in nesting.depth.iter().enumerate() { + let filled = match fill_rule { + // EvenOdd: a point in face i crosses (depth + 1) loop boundaries. + // Filled when that count is odd, i.e., depth is even. + FillRule::EvenOdd => d % 2 == 0, + // NonZero with all-same-winding: winding = depth + 1, always ≠ 0. + // (For a full codec we'd track per-loop directions; this PoC + // assumes all loops wind the same way for NonZero.) + FillRule::NonZero => true, + }; + if filled { + mask |= 1u64 << i; + } + } + mask +} + +/// Encode: fill_mask → best-fit (FillRule, per-loop direction). +/// +/// Returns None if no single fill rule can represent the mask (requires +/// splitting into multiple SVG paths). +fn encode_fill_rule(nesting: &LoopNesting, fill_mask: u64) -> Option { + let n = nesting.depth.len(); + + // Check if EvenOdd matches. + let mut evenodd_mask = 0u64; + for i in 0..n { + if nesting.depth[i] % 2 == 0 { + evenodd_mask |= 1u64 << i; + } + } + if evenodd_mask == fill_mask { + return Some(FillRule::EvenOdd); + } + + // Check if NonZero (all same winding) matches. + let all_filled = (1u64 << n) - 1; + if fill_mask == all_filled { + return Some(FillRule::NonZero); + } + + // Check NonZero with mixed winding: try to assign directions. + // For each loop, decide CW (+1) or CCW (-1). + // winding(root) = sign(root). Filled iff winding ≠ 0. + // winding(child) = winding(parent) + sign(child). + let mut signs = vec![1i32; n]; + let mut windings = vec![0i32; n]; + + // Process in depth order (parents before children). + let mut order: Vec = (0..n).collect(); + order.sort_by_key(|&i| nesting.depth[i]); + + for &i in &order { + let parent_winding = match nesting.parent[i] { + Some(p) => windings[p], + None => 0, + }; + let want_filled = (fill_mask >> i) & 1 == 1; + if want_filled { + // Need parent_winding + sign ≠ 0. + // Same direction as parent (or +1 for roots). + signs[i] = if parent_winding >= 0 { 1 } else { -1 }; + } else { + // Need parent_winding + sign = 0. + // sign must be ±1, so this only works when |parent_winding| = 1. + if parent_winding == 1 { + signs[i] = -1; + } else if parent_winding == -1 { + signs[i] = 1; + } else { + // Can't cancel to 0 with a single ±1 contribution. + return None; + } + } + windings[i] = parent_winding + signs[i]; + } + + // Verify. + let mut ok = true; + for i in 0..n { + let want_filled = (fill_mask >> i) & 1 == 1; + let is_filled = windings[i] != 0; + if want_filled != is_filled { + ok = false; + break; + } + } + if ok { + return Some(FillRule::NonZero); + } + + None // Needs multi-path split. +} + +// --------------------------------------------------------------------------- +// 4. Rendering: fill_mask → Skia paths +// --------------------------------------------------------------------------- + +/// Build one Skia path per filled face, using the fill_mask model. +/// +/// Each filled face is rendered as its own path: the owning loop as the outer +/// contour, with direct child loops subtracted (added as inner contours with +/// EvenOdd fill type). +fn render_fill_mask_region( + region: &FillMaskRegion, + vertices: &[(f32, f32)], + segments: &[VectorNetworkSegment], + nesting: &LoopNesting, + canvas: &skia_safe::Canvas, +) { + let n = region.loops.len(); + let fills = region.fills.as_ref().map(|p| p.as_slice()).unwrap_or(&[]); + if fills.is_empty() { + return; + } + + // Collect children for each loop. + let mut children: Vec> = vec![vec![]; n]; + for i in 0..n { + if let Some(p) = nesting.parent[i] { + children[p].push(i); + } + } + + for i in 0..n { + if (region.fill_mask >> i) & 1 == 0 { + continue; // face not filled + } + + // Build path: outer loop + hole loops (direct children that are NOT filled, + // which punch holes; filled children render themselves). + let mut builder = PathBuilder::new(); + + // Add the owning loop as the outer contour. + add_loop_to_builder(&mut builder, ®ion.loops[i], vertices, segments); + + // Add direct child loops as hole contours. + for &child in &children[i] { + add_loop_to_builder(&mut builder, ®ion.loops[child], vertices, segments); + } + + builder.set_fill_type(PathFillType::EvenOdd); + let path = builder.detach(); + + // Paint with the first solid fill. + for paint_item in fills { + if let Paint::Solid(solid) = paint_item { + if !solid.active { + continue; + } + let mut sk_paint = SkPaint::default(); + sk_paint.set_anti_alias(true); + sk_paint.set_style(PaintStyle::Fill); + sk_paint.set_color(skia_safe::Color::from_argb( + solid.color.a, + solid.color.r, + solid.color.g, + solid.color.b, + )); + canvas.draw_path(&path, &sk_paint); + } + } + } +} + +fn add_loop_to_builder( + builder: &mut PathBuilder, + lp: &VectorNetworkLoop, + vertices: &[(f32, f32)], + segments: &[VectorNetworkSegment], +) { + let VectorNetworkLoop(seg_indices) = lp; + if seg_indices.is_empty() { + return; + } + let mut first = true; + for &si in seg_indices { + let seg = &segments[si]; + let a = vertices[seg.a]; + let b = vertices[seg.b]; + if first { + builder.move_to((a.0, a.1)); + first = false; + } + let ta = seg.ta; + let tb = seg.tb; + if ta.0 == 0.0 && ta.1 == 0.0 && tb.0 == 0.0 && tb.1 == 0.0 { + builder.line_to((b.0, b.1)); + } else { + builder.cubic_to( + (a.0 + ta.0, a.1 + ta.1), + (b.0 + tb.0, b.1 + tb.1), + (b.0, b.1), + ); + } + } + builder.close(); +} + +// --------------------------------------------------------------------------- +// 5. Helpers to build concentric circle geometry +// --------------------------------------------------------------------------- + +/// Build N concentric circular loops as a VectorNetwork + loop list. +/// Returns (vertices, segments, loops) for circles centered at (cx, cy). +fn make_concentric_circles( + cx: f32, + cy: f32, + radii: &[f32], +) -> (Vec<(f32, f32)>, Vec, Vec) { + let mut vertices = Vec::new(); + let mut segments = Vec::new(); + let mut loops = Vec::new(); + + // Each circle approximated by 4 cubic Bézier arcs (standard quarter-circle). + // Control point factor for a quarter circle: κ ≈ 0.5522847498 + let k: f32 = 0.5522847498; + + for &r in radii { + let base_v = vertices.len(); + let base_s = segments.len(); + + // 4 vertices: right, top, left, bottom + vertices.push((cx + r, cy)); // 0: right + vertices.push((cx, cy - r)); // 1: top + vertices.push((cx - r, cy)); // 2: left + vertices.push((cx, cy + r)); // 3: bottom + + // 4 cubic segments forming the circle + let kr = k * r; + segments.push(VectorNetworkSegment { + a: base_v, + b: base_v + 1, + ta: (0.0, -kr), + tb: (kr, 0.0), + }); // right → top + segments.push(VectorNetworkSegment { + a: base_v + 1, + b: base_v + 2, + ta: (-kr, 0.0), + tb: (0.0, -kr), + }); // top → left + segments.push(VectorNetworkSegment { + a: base_v + 2, + b: base_v + 3, + ta: (0.0, kr), + tb: (-kr, 0.0), + }); // left → bottom + segments.push(VectorNetworkSegment { + a: base_v + 3, + b: base_v, + ta: (kr, 0.0), + tb: (0.0, kr), + }); // bottom → right + + loops.push(VectorNetworkLoop(vec![ + base_s, + base_s + 1, + base_s + 2, + base_s + 3, + ])); + } + + (vertices, segments, loops) +} + +// --------------------------------------------------------------------------- +// 6. Tests +// --------------------------------------------------------------------------- + +fn solid_black() -> Paints { + Paints::new([Paint::Solid(SolidPaint { + active: true, + color: CGColor::from_rgba(0, 0, 0, 255), + blend_mode: BlendMode::Normal, + })]) +} + +/// Render a FillMaskRegion to a surface and return sampled alphas at each face. +/// +/// `sample_radii` should be mid-ring distances from center where we probe. +fn render_and_sample( + region: &FillMaskRegion, + vertices: &[(f32, f32)], + segments: &[VectorNetworkSegment], + nesting: &LoopNesting, + cx: f32, + cy: f32, + sample_radii: &[f32], + size: i32, +) -> Vec { + let mut surface = surfaces::raster_n32_premul((size, size)).unwrap(); + let canvas = surface.canvas(); + canvas.clear(Color::WHITE); + + render_fill_mask_region(region, vertices, segments, nesting, canvas); + + // Sample at each radius along the positive-x axis from center. + sample_radii + .iter() + .map(|&r| { + let x = (cx + r) as i32; + let y = cy as i32; + // Black paint on white canvas → R channel < 255. + let img = surface.image_snapshot(); + let info = img.image_info(); + let row_bytes = info.min_row_bytes(); + let mut raw = vec![0u8; row_bytes * size as usize]; + img.read_pixels( + &info, + &mut raw, + row_bytes, + skia_safe::IPoint::new(0, 0), + skia_safe::image::CachingHint::Allow, + ); + let off = (y as usize) * row_bytes + (x as usize) * 4; + // BGRA: B=off, G=off+1, R=off+2, A=off+3 + let r_val = raw[off + 2]; + // If filled with black, r_val ≈ 0. If white background, r_val = 255. + r_val < 128 + }) + .collect() +} + +// ── Test 1: solid disc (all faces filled) ───────────────────────────────── + +#[test] +fn fill_mask_solid_disc() { + // ┌──────────┐ + // │ ┌──────┐ │ + // │ │ ┌──┐ │ │ + // │ │ │■■│ │ │ fill_mask = 0b111 → all three faces filled + // │ │ └──┘ │ │ + // │ └──────┘ │ + // └──────────┘ + let cx = 100.0; + let cy = 100.0; + let (v, s, loops) = make_concentric_circles(cx, cy, &[90.0, 60.0, 30.0]); + let nesting = compute_nesting(&loops, &v, &s); + + assert_eq!(nesting.depth, vec![0, 1, 2]); + assert_eq!(nesting.parent, vec![None, Some(0), Some(1)]); + + let region = FillMaskRegion { + loops, + fill_mask: 0b111, + fills: Some(solid_black()), + }; + + let filled = render_and_sample(®ion, &v, &s, &nesting, cx, cy, &[75.0, 45.0, 10.0], 200); + + assert_eq!(filled, vec![true, true, true], "all three faces filled"); + + // Verify: NonZero with all-same-winding encodes this mask. + assert_eq!(decode_fill_rule(&nesting, FillRule::NonZero), 0b111); + assert_eq!(encode_fill_rule(&nesting, 0b111), Some(FillRule::NonZero)); +} + +// ── Test 2: bullseye (EvenOdd pattern) ──────────────────────────────────── + +#[test] +fn fill_mask_bullseye() { + // ┌──────────┐ + // │■┌──────┐■│ + // │■│ ┌──┐ │■│ fill_mask = 0b101 → face₀ ■, face₁ □, face₂ ■ + // │■│ │■■│ │■│ + // │■│ └──┘ │■│ classic EvenOdd pattern + // │■└──────┘■│ + // └──────────┘ + let cx = 100.0; + let cy = 100.0; + let (v, s, loops) = make_concentric_circles(cx, cy, &[90.0, 60.0, 30.0]); + let nesting = compute_nesting(&loops, &v, &s); + + let region = FillMaskRegion { + loops, + fill_mask: 0b101, + fills: Some(solid_black()), + }; + + let filled = render_and_sample(®ion, &v, &s, &nesting, cx, cy, &[75.0, 45.0, 10.0], 200); + + assert_eq!( + filled, + vec![true, false, true], + "bullseye: outer ■, middle □, center ■" + ); + + // EvenOdd produces exactly this mask. + assert_eq!(decode_fill_rule(&nesting, FillRule::EvenOdd), 0b101); + assert_eq!(encode_fill_rule(&nesting, 0b101), Some(FillRule::EvenOdd)); +} + +// ── Test 3: donut (outer ring only) ─────────────────────────────────────── + +#[test] +fn fill_mask_donut() { + // ┌──────────┐ + // │■┌──────┐■│ + // │■│ ┌──┐ │■│ fill_mask = 0b100 → face₀ ■, face₁ □, face₂ □ + // │■│ │ │ │■│ + // │■│ └──┘ │■│ donut with empty center + // │■└──────┘■│ + // └──────────┘ + let cx = 100.0; + let cy = 100.0; + let (v, s, loops) = make_concentric_circles(cx, cy, &[90.0, 60.0, 30.0]); + let nesting = compute_nesting(&loops, &v, &s); + + let region = FillMaskRegion { + loops, + fill_mask: 0b001, // only face₀ (outermost ring) + fills: Some(solid_black()), + }; + + let filled = render_and_sample(®ion, &v, &s, &nesting, cx, cy, &[75.0, 45.0, 10.0], 200); + + assert_eq!( + filled, + vec![true, false, false], + "donut: outer ring ■, rest □" + ); + + // With 3 nested loops, "only outer ring" is NOT representable by any + // single fill rule — once loop₁ cancels the winding to 0, loop₂ + // inevitably adds ±1 making the center filled again. + // This proves the fill_mask model is strictly more expressive. + assert_eq!(encode_fill_rule(&nesting, 0b001), None); +} + +// ── Test 4: only the middle ring (impossible in single SVG fill-rule) ───── + +#[test] +fn fill_mask_middle_ring_only() { + // ┌──────────┐ + // │ ┌──────┐ │ + // │ │■┌──┐■│ │ fill_mask = 0b010 → face₀ □, face₁ ■, face₂ □ + // │ │■│ │■│ │ + // │ │■└──┘■│ │ NOT representable by any single SVG fill-rule! + // │ └──────┘ │ + // └──────────┘ + let cx = 100.0; + let cy = 100.0; + let (v, s, loops) = make_concentric_circles(cx, cy, &[90.0, 60.0, 30.0]); + let nesting = compute_nesting(&loops, &v, &s); + + let region = FillMaskRegion { + loops, + fill_mask: 0b010, // only face₁ (middle ring) + fills: Some(solid_black()), + }; + + let filled = render_and_sample(®ion, &v, &s, &nesting, cx, cy, &[75.0, 45.0, 10.0], 200); + + assert_eq!( + filled, + vec![false, true, false], + "middle ring only: face₁ ■, rest □" + ); + + // No single fill rule can express this — encode returns None. + assert_eq!(encode_fill_rule(&nesting, 0b010), None); +} + +// ── Test 5: center dot only (also impossible in single SVG fill-rule) ───── + +#[test] +fn fill_mask_center_dot_only() { + // ┌──────────┐ + // │ ┌──────┐ │ + // │ │ ┌──┐ │ │ fill_mask = 0b100 → face₀ □, face₁ □, face₂ ■ + // │ │ │■■│ │ │ + // │ │ └──┘ │ │ NOT representable by any single SVG fill-rule! + // │ └──────┘ │ + // └──────────┘ + let cx = 100.0; + let cy = 100.0; + let (v, s, loops) = make_concentric_circles(cx, cy, &[90.0, 60.0, 30.0]); + let nesting = compute_nesting(&loops, &v, &s); + + let region = FillMaskRegion { + loops, + fill_mask: 0b100, // only face₂ (innermost) + fills: Some(solid_black()), + }; + + let filled = render_and_sample(®ion, &v, &s, &nesting, cx, cy, &[75.0, 45.0, 10.0], 200); + + assert_eq!( + filled, + vec![false, false, true], + "center dot only: face₂ ■, rest □" + ); + + assert_eq!(encode_fill_rule(&nesting, 0b100), None); +} + +// ── Test 6: roundtrip — decode a fill_rule, then encode back ────────────── + +#[test] +fn fill_rule_roundtrip() { + let cx = 100.0; + let cy = 100.0; + let (v, s, loops) = make_concentric_circles(cx, cy, &[90.0, 60.0, 30.0]); + let nesting = compute_nesting(&loops, &v, &s); + + // EvenOdd → mask → EvenOdd + let mask = decode_fill_rule(&nesting, FillRule::EvenOdd); + assert_eq!(mask, 0b101); + assert_eq!(encode_fill_rule(&nesting, mask), Some(FillRule::EvenOdd)); + + // NonZero (same winding) → mask → NonZero + let mask = decode_fill_rule(&nesting, FillRule::NonZero); + assert_eq!(mask, 0b111); + assert_eq!(encode_fill_rule(&nesting, mask), Some(FillRule::NonZero)); +} + +// ── Test 7: two sibling loops (disjoint circles) ───────────────────────── + +#[test] +fn fill_mask_sibling_loops() { + // Two separate circles, not nested. + // ┌──┐ ┌──┐ + // │■■│ │ │ fill_mask = 0b01 → only left filled + // └──┘ └──┘ + let (v1, s1, l1) = make_concentric_circles(60.0, 100.0, &[40.0]); + let (v2, mut s2, l2) = make_concentric_circles(160.0, 100.0, &[40.0]); + + // Merge the two geometries. + let v_offset = v1.len(); + let s_offset = s1.len(); + for seg in &mut s2 { + seg.a += v_offset; + seg.b += v_offset; + } + let mut vertices = v1; + vertices.extend(v2); + let mut segments = s1; + segments.extend(s2); + + let loop_right = VectorNetworkLoop( + l2[0] + .0 + .iter() + .map(|&i| i + s_offset) + .collect::>(), + ); + let loops = vec![l1.into_iter().next().unwrap(), loop_right]; + + let nesting = compute_nesting(&loops, &vertices, &segments); + + // Both should be roots (depth 0, no parent). + assert_eq!(nesting.depth, vec![0, 0]); + assert_eq!(nesting.parent, vec![None, None]); + + let region = FillMaskRegion { + loops, + fill_mask: 0b01, // only left circle filled + fills: Some(solid_black()), + }; + + let filled_left = { + let mut surface = surfaces::raster_n32_premul((220, 200)).unwrap(); + let canvas = surface.canvas(); + canvas.clear(Color::WHITE); + render_fill_mask_region(®ion, &vertices, &segments, &nesting, canvas); + let img = surface.image_snapshot(); + let info = img.image_info(); + let row_bytes = info.min_row_bytes(); + let mut raw = vec![0u8; row_bytes * 200]; + img.read_pixels( + &info, + &mut raw, + row_bytes, + skia_safe::IPoint::new(0, 0), + skia_safe::image::CachingHint::Allow, + ); + // Sample left center (60, 100) and right center (160, 100). + let left_r = raw[100 * row_bytes + 60 * 4 + 2]; + let right_r = raw[100 * row_bytes + 160 * 4 + 2]; + (left_r < 128, right_r < 128) + }; + + assert_eq!(filled_left, (true, false), "left ■, right □"); +} + +// ── Visual output: all scenarios rendered to a single PNG ───────────────── + +#[test] +fn fill_mask_render_all_to_png() { + let cell_w = 200; + let cell_h = 240; + let cols = 6; + let total_w = cell_w * cols; + let total_h = cell_h; + + let mut surface = surfaces::raster_n32_premul((total_w as i32, total_h as i32)).unwrap(); + let canvas = surface.canvas(); + canvas.clear(Color::from_argb(255, 245, 245, 245)); // light gray bg + + // Text paint for labels. + let mut text_paint = SkPaint::default(); + text_paint.set_color(Color::from_argb(255, 40, 40, 40)); + text_paint.set_anti_alias(true); + + let font_mgr = FontMgr::new(); + let typeface = font_mgr + .match_family_style("Arial", FontStyle::normal()) + .or_else(|| font_mgr.match_family_style("Helvetica", FontStyle::normal())) + .unwrap_or_else(|| font_mgr.legacy_make_typeface(None, FontStyle::normal()).unwrap()); + let label_font = Font::from_typeface(&typeface, 13.0); + let title_font = Font::from_typeface(&typeface, 11.0); + + // Grid outline paint. + let mut grid_paint = SkPaint::default(); + grid_paint.set_color(Color::from_argb(255, 200, 200, 200)); + grid_paint.set_style(PaintStyle::Stroke); + grid_paint.set_stroke_width(1.0); + + struct Scenario { + label: &'static str, + mask_str: &'static str, + fill_mask: u64, + encode_result: &'static str, + } + + let scenarios = [ + Scenario { + label: "Solid Disc", + mask_str: "0b111", + fill_mask: 0b111, + encode_result: "NonZero", + }, + Scenario { + label: "Bullseye", + mask_str: "0b101", + fill_mask: 0b101, + encode_result: "EvenOdd", + }, + Scenario { + label: "Donut (3 loops)", + mask_str: "0b001", + fill_mask: 0b001, + encode_result: "None!", + }, + Scenario { + label: "Middle Ring", + mask_str: "0b010", + fill_mask: 0b010, + encode_result: "None!", + }, + Scenario { + label: "Center Dot", + mask_str: "0b100", + fill_mask: 0b100, + encode_result: "None!", + }, + Scenario { + label: "Sibling (L only)", + mask_str: "0b01", + fill_mask: 0, // handled specially + encode_result: "NonZero", + }, + ]; + + // Colors for the three concentric faces. + let face_colors: [(u8, u8, u8); 3] = [ + (66, 133, 244), // blue — face₀ (outer ring) + (234, 67, 53), // red — face₁ (middle ring) + (52, 168, 83), // green — face₂ (center) + ]; + + for (col, scenario) in scenarios.iter().enumerate() { + let ox = (col * cell_w) as f32; + let oy = 0.0f32; + + // Draw cell border. + canvas.draw_rect( + skia_safe::Rect::from_xywh(ox, oy, cell_w as f32, cell_h as f32), + &grid_paint, + ); + + // Draw label. + canvas.draw_str(scenario.label, (ox + 8.0, oy + 18.0), &label_font, &text_paint); + + // Draw mask and encode info. + let mut sub_paint = SkPaint::default(); + sub_paint.set_color(Color::from_argb(255, 120, 120, 120)); + sub_paint.set_anti_alias(true); + canvas.draw_str( + &format!("mask={}", scenario.mask_str), + (ox + 8.0, oy + 32.0), + &title_font, + &sub_paint, + ); + canvas.draw_str( + &format!("encode → {}", scenario.encode_result), + (ox + 8.0, oy + 44.0), + &title_font, + &sub_paint, + ); + + let cx = ox + (cell_w as f32) / 2.0; + let cy = oy + 145.0; + + if col < 5 { + // Concentric circles scenarios. + let (v, s, loops) = make_concentric_circles(cx, cy, &[80.0, 53.0, 26.0]); + let nesting = compute_nesting(&loops, &v, &s); + + // Render each filled face with its own color. + for face_i in 0..3 { + if (scenario.fill_mask >> face_i) & 1 == 0 { + continue; + } + let (cr, cg, cb) = face_colors[face_i]; + let colored_fills = Paints::new([Paint::Solid(SolidPaint { + active: true, + color: CGColor::from_rgba(cr, cg, cb, 255), + blend_mode: BlendMode::Normal, + })]); + + // Render just this single face. + let single_face_region = FillMaskRegion { + loops: loops.clone(), + fill_mask: 1u64 << face_i, + fills: Some(colored_fills), + }; + render_fill_mask_region(&single_face_region, &v, &s, &nesting, canvas); + } + + // Draw loop outlines. + let mut stroke_paint = SkPaint::default(); + stroke_paint.set_color(Color::from_argb(255, 60, 60, 60)); + stroke_paint.set_style(PaintStyle::Stroke); + stroke_paint.set_stroke_width(1.5); + stroke_paint.set_anti_alias(true); + for lp in &loops { + let mut builder = PathBuilder::new(); + add_loop_to_builder(&mut builder, lp, &v, &s); + let path = builder.detach(); + canvas.draw_path(&path, &stroke_paint); + } + } else { + // Sibling circles scenario. + let lcx = cx - 45.0; + let rcx = cx + 45.0; + let (v1, s1, l1) = make_concentric_circles(lcx, cy, &[35.0]); + let (v2, mut s2, l2) = make_concentric_circles(rcx, cy, &[35.0]); + let v_offset = v1.len(); + let s_offset = s1.len(); + for seg in &mut s2 { + seg.a += v_offset; + seg.b += v_offset; + } + let mut vertices = v1; + vertices.extend(v2); + let mut segments = s1; + segments.extend(s2); + let loop_right = VectorNetworkLoop( + l2[0].0.iter().map(|&i| i + s_offset).collect::>(), + ); + let loops = vec![l1.into_iter().next().unwrap(), loop_right]; + let nesting = compute_nesting(&loops, &vertices, &segments); + + // Fill only left circle. + let (cr, cg, cb) = face_colors[0]; + let region = FillMaskRegion { + loops: loops.clone(), + fill_mask: 0b01, + fills: Some(Paints::new([Paint::Solid(SolidPaint { + active: true, + color: CGColor::from_rgba(cr, cg, cb, 255), + blend_mode: BlendMode::Normal, + })])), + }; + render_fill_mask_region(®ion, &vertices, &segments, &nesting, canvas); + + // Outlines. + let mut stroke_paint = SkPaint::default(); + stroke_paint.set_color(Color::from_argb(255, 60, 60, 60)); + stroke_paint.set_style(PaintStyle::Stroke); + stroke_paint.set_stroke_width(1.5); + stroke_paint.set_anti_alias(true); + for lp in &loops { + let mut builder = PathBuilder::new(); + add_loop_to_builder(&mut builder, lp, &vertices, &segments); + let path = builder.detach(); + canvas.draw_path(&path, &stroke_paint); + } + } + + // Draw legend at bottom. + let legend_y = oy + cell_h as f32 - 12.0; + let face_labels = if col < 5 { + vec!["outer", "mid", "inner"] + } else { + vec!["left", "right"] + }; + let face_cols: Vec<(u8, u8, u8)> = if col < 5 { + face_colors.to_vec() + } else { + vec![face_colors[0], (180, 180, 180)] + }; + let mask = if col < 5 { scenario.fill_mask } else { 0b01u64 }; + for (fi, (label, &(cr, cg, cb))) in face_labels.iter().zip(face_cols.iter()).enumerate() { + let lx = ox + 8.0 + (fi as f32) * 65.0; + let filled = (mask >> fi) & 1 == 1; + // Color swatch. + let mut swatch = SkPaint::default(); + if filled { + swatch.set_color(Color::from_argb(255, cr, cg, cb)); + } else { + swatch.set_color(Color::from_argb(255, 220, 220, 220)); + } + swatch.set_style(PaintStyle::Fill); + canvas.draw_rect( + skia_safe::Rect::from_xywh(lx, legend_y - 8.0, 10.0, 10.0), + &swatch, + ); + let mut swatch_border = SkPaint::default(); + swatch_border.set_color(Color::from_argb(255, 100, 100, 100)); + swatch_border.set_style(PaintStyle::Stroke); + swatch_border.set_stroke_width(0.5); + canvas.draw_rect( + skia_safe::Rect::from_xywh(lx, legend_y - 8.0, 10.0, 10.0), + &swatch_border, + ); + canvas.draw_str( + *label, + (lx + 14.0, legend_y), + &title_font, + &text_paint, + ); + } + } + + // Save to PNG. + let img = surface.image_snapshot(); + let data = img.encode(None, EncodedImageFormat::PNG, None).unwrap(); + let out_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("fill_mask_poc_output.png"); + std::fs::write(&out_path, data.as_bytes()).unwrap(); + eprintln!("Rendered to: {}", out_path.display()); +} + +// ── Comparison: same scenarios rendered with the CURRENT VectorNetwork model ── + +/// Helper: draw a VectorNetwork using its own to_paths() + region fill logic, +/// matching VNPainter behavior but with per-face coloring. +fn draw_vn_region_with_color( + vn: &VectorNetwork, + canvas: &skia_safe::Canvas, + color: (u8, u8, u8), +) { + let paths = vn.to_paths(); + for path in &paths { + let mut paint = SkPaint::default(); + paint.set_anti_alias(true); + paint.set_style(PaintStyle::Fill); + paint.set_color(Color::from_argb(255, color.0, color.1, color.2)); + canvas.draw_path(path, &paint); + } +} + +#[test] +fn current_model_render_all_to_png() { + let cell_w = 200; + let cell_h = 240; + let cols = 6; + let total_w = cell_w * cols; + let total_h = cell_h; + + let mut surface = surfaces::raster_n32_premul((total_w as i32, total_h as i32)).unwrap(); + let canvas = surface.canvas(); + canvas.clear(Color::from_argb(255, 245, 245, 245)); + + let mut text_paint = SkPaint::default(); + text_paint.set_color(Color::from_argb(255, 40, 40, 40)); + text_paint.set_anti_alias(true); + + let font_mgr = FontMgr::new(); + let typeface = font_mgr + .match_family_style("Arial", FontStyle::normal()) + .or_else(|| font_mgr.match_family_style("Helvetica", FontStyle::normal())) + .unwrap_or_else(|| font_mgr.legacy_make_typeface(None, FontStyle::normal()).unwrap()); + let label_font = Font::from_typeface(&typeface, 13.0); + let title_font = Font::from_typeface(&typeface, 11.0); + + let mut grid_paint = SkPaint::default(); + grid_paint.set_color(Color::from_argb(255, 200, 200, 200)); + grid_paint.set_style(PaintStyle::Stroke); + grid_paint.set_stroke_width(1.0); + + // For each scenario, we define: + // - the DESIRED fill_mask (what we want) + // - the BEST fill_rule we can use (or "CANNOT" if impossible) + // - what the current model actually renders + struct CurrentScenario { + label: &'static str, + desired_mask: &'static str, + approach: &'static str, + fill_rule: FillRule, + /// true = this fill_rule produces the correct result + correct: bool, + } + + let scenarios = [ + CurrentScenario { + label: "Solid Disc", + desired_mask: "0b111", + approach: "NonZero (all same)", + fill_rule: FillRule::NonZero, + correct: true, + }, + CurrentScenario { + label: "Bullseye", + desired_mask: "0b101", + approach: "EvenOdd", + fill_rule: FillRule::EvenOdd, + correct: true, + }, + CurrentScenario { + label: "Donut (3 loops)", + desired_mask: "0b001", + approach: "EvenOdd (closest)", + fill_rule: FillRule::EvenOdd, + correct: false, // EvenOdd gives 0b101, not 0b001 + }, + CurrentScenario { + label: "Middle Ring", + desired_mask: "0b010", + approach: "NonZero (closest)", + fill_rule: FillRule::NonZero, + correct: false, // NonZero gives 0b111, not 0b010 + }, + CurrentScenario { + label: "Center Dot", + desired_mask: "0b100", + approach: "EvenOdd (closest)", + fill_rule: FillRule::EvenOdd, + correct: false, // EvenOdd gives 0b101, not 0b100 + }, + CurrentScenario { + label: "Sibling (L only)", + desired_mask: "0b01", + approach: "separate regions", + fill_rule: FillRule::NonZero, // placeholder + correct: true, + }, + ]; + + let fill_color: (u8, u8, u8) = (66, 133, 244); // blue for all + + for (col, scenario) in scenarios.iter().enumerate() { + let ox = (col * cell_w) as f32; + let oy = 0.0f32; + + // Cell border. + canvas.draw_rect( + skia_safe::Rect::from_xywh(ox, oy, cell_w as f32, cell_h as f32), + &grid_paint, + ); + + // Labels. + canvas.draw_str(scenario.label, (ox + 8.0, oy + 18.0), &label_font, &text_paint); + + let mut sub_paint = SkPaint::default(); + sub_paint.set_color(Color::from_argb(255, 120, 120, 120)); + sub_paint.set_anti_alias(true); + canvas.draw_str( + &format!("want: {}", scenario.desired_mask), + (ox + 8.0, oy + 32.0), + &title_font, + &sub_paint, + ); + canvas.draw_str( + &format!("via: {}", scenario.approach), + (ox + 8.0, oy + 44.0), + &title_font, + &sub_paint, + ); + + // Result badge. + let badge_text = if scenario.correct { "MATCH" } else { "WRONG" }; + let mut badge_paint = SkPaint::default(); + badge_paint.set_anti_alias(true); + if scenario.correct { + badge_paint.set_color(Color::from_argb(255, 52, 168, 83)); + } else { + badge_paint.set_color(Color::from_argb(255, 234, 67, 53)); + } + canvas.draw_str(badge_text, (ox + 140.0, oy + 18.0), &label_font, &badge_paint); + + let cx = ox + (cell_w as f32) / 2.0; + let cy = oy + 145.0; + + if col < 5 { + // Build a VectorNetwork with 3 concentric circle loops and one region. + let (v, s, loops) = make_concentric_circles(cx, cy, &[80.0, 53.0, 26.0]); + + let region_fills = Paints::new([Paint::Solid(SolidPaint { + active: true, + color: CGColor::from_rgba(fill_color.0, fill_color.1, fill_color.2, 255), + blend_mode: BlendMode::Normal, + })]); + + let vn = VectorNetwork { + vertices: v.clone(), + segments: s.clone(), + regions: vec![VectorNetworkRegion { + loops, + fill_rule: scenario.fill_rule.clone(), + fills: Some(region_fills), + }], + }; + + draw_vn_region_with_color(&vn, canvas, fill_color); + + // Outlines. + let all_loops_data = &vn.regions[0].loops; + let mut stroke_paint = SkPaint::default(); + stroke_paint.set_color(Color::from_argb(255, 60, 60, 60)); + stroke_paint.set_style(PaintStyle::Stroke); + stroke_paint.set_stroke_width(1.5); + stroke_paint.set_anti_alias(true); + for lp in all_loops_data { + let mut builder = PathBuilder::new(); + add_loop_to_builder(&mut builder, lp, &v, &s); + let path = builder.detach(); + canvas.draw_path(&path, &stroke_paint); + } + } else { + // Sibling: use two separate regions (one per circle) — the only way + // to fill one and not the other with the current model. + let lcx = cx - 45.0; + let rcx = cx + 45.0; + let (v1, s1, l1) = make_concentric_circles(lcx, cy, &[35.0]); + let (v2, mut s2, l2) = make_concentric_circles(rcx, cy, &[35.0]); + let v_offset = v1.len(); + let s_offset = s1.len(); + for seg in &mut s2 { + seg.a += v_offset; + seg.b += v_offset; + } + let mut vertices = v1; + vertices.extend(v2); + let mut segments = s1; + segments.extend(s2); + let loop_right = VectorNetworkLoop( + l2[0].0.iter().map(|&i| i + s_offset).collect::>(), + ); + let left_loop = l1.into_iter().next().unwrap(); + + // Only the left circle gets a filled region. + let vn = VectorNetwork { + vertices: vertices.clone(), + segments: segments.clone(), + regions: vec![VectorNetworkRegion { + loops: vec![left_loop], + fill_rule: FillRule::NonZero, + fills: Some(Paints::new([Paint::Solid(SolidPaint { + active: true, + color: CGColor::from_rgba( + fill_color.0, + fill_color.1, + fill_color.2, + 255, + ), + blend_mode: BlendMode::Normal, + })])), + }], + }; + + draw_vn_region_with_color(&vn, canvas, fill_color); + + // Outlines for both circles. + let mut stroke_paint = SkPaint::default(); + stroke_paint.set_color(Color::from_argb(255, 60, 60, 60)); + stroke_paint.set_style(PaintStyle::Stroke); + stroke_paint.set_stroke_width(1.5); + stroke_paint.set_anti_alias(true); + for lp in [ + &vn.regions[0].loops[0], + &loop_right, + ] { + let mut builder = PathBuilder::new(); + add_loop_to_builder(&mut builder, lp, &vertices, &segments); + let path = builder.detach(); + canvas.draw_path(&path, &stroke_paint); + } + } + } + + // Save. + let img = surface.image_snapshot(); + let data = img.encode(None, EncodedImageFormat::PNG, None).unwrap(); + let out_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("current_model_output.png"); + std::fs::write(&out_path, data.as_bytes()).unwrap(); + eprintln!("Rendered to: {}", out_path.display()); +} + +// ── Current model: correct output via multi-region workaround ──────────── + +/// Shows that the current model CAN produce every pattern — but only by +/// decomposing into multiple regions with carefully chosen loop subsets. +/// +/// This is the "best effort" golden: same visual output as the fill_mask +/// version, achieved entirely through `VectorNetworkRegion` + `fill_rule`. +#[test] +fn current_model_workaround_to_png() { + let cell_w = 200; + let cell_h = 280; + let cols = 6; + let total_w = cell_w * cols; + let total_h = cell_h; + + let mut surface = surfaces::raster_n32_premul((total_w as i32, total_h as i32)).unwrap(); + let canvas = surface.canvas(); + canvas.clear(Color::from_argb(255, 245, 245, 245)); + + let mut text_paint = SkPaint::default(); + text_paint.set_color(Color::from_argb(255, 40, 40, 40)); + text_paint.set_anti_alias(true); + + let font_mgr = FontMgr::new(); + let typeface = font_mgr + .match_family_style("Arial", FontStyle::normal()) + .or_else(|| font_mgr.match_family_style("Helvetica", FontStyle::normal())) + .unwrap_or_else(|| font_mgr.legacy_make_typeface(None, FontStyle::normal()).unwrap()); + let label_font = Font::from_typeface(&typeface, 13.0); + let title_font = Font::from_typeface(&typeface, 11.0); + + let mut grid_paint = SkPaint::default(); + grid_paint.set_color(Color::from_argb(255, 200, 200, 200)); + grid_paint.set_style(PaintStyle::Stroke); + grid_paint.set_stroke_width(1.0); + + let face_colors: [(u8, u8, u8); 3] = [ + (66, 133, 244), // blue + (234, 67, 53), // red + (52, 168, 83), // green + ]; + + fn make_fill(c: (u8, u8, u8)) -> Paints { + Paints::new([Paint::Solid(SolidPaint { + active: true, + color: CGColor::from_rgba(c.0, c.1, c.2, 255), + blend_mode: BlendMode::Normal, + })]) + } + + // For each scenario, we construct the VectorNetwork regions needed. + struct WorkaroundScenario { + label: &'static str, + desired: &'static str, + /// How we decompose it. + recipe: &'static str, + /// Number of VectorNetworkRegion objects required. + region_count: usize, + } + + let scenarios = [ + WorkaroundScenario { + label: "Solid Disc", + desired: "0b111", + recipe: "1 region, NonZero, 3 loops", + region_count: 1, + }, + WorkaroundScenario { + label: "Bullseye", + desired: "0b101", + recipe: "1 region, EvenOdd, 3 loops", + region_count: 1, + }, + WorkaroundScenario { + label: "Donut (3 loops)", + desired: "0b001", + recipe: "1 region, EvenOdd, 2 loops\n(drop loop₂)", + region_count: 1, + }, + WorkaroundScenario { + label: "Middle Ring", + desired: "0b010", + recipe: "1 region, EvenOdd\n{loop₁, loop₂}", + region_count: 1, + }, + WorkaroundScenario { + label: "Center Dot", + desired: "0b100", + recipe: "1 region, NonZero\n{loop₂} only", + region_count: 1, + }, + WorkaroundScenario { + label: "Sibling (L only)", + desired: "0b01", + recipe: "1 region, {left loop}", + region_count: 1, + }, + ]; + + for (col, scenario) in scenarios.iter().enumerate() { + let ox = (col * cell_w) as f32; + let oy = 0.0f32; + + canvas.draw_rect( + skia_safe::Rect::from_xywh(ox, oy, cell_w as f32, cell_h as f32), + &grid_paint, + ); + + canvas.draw_str(scenario.label, (ox + 8.0, oy + 18.0), &label_font, &text_paint); + + let mut sub_paint = SkPaint::default(); + sub_paint.set_color(Color::from_argb(255, 120, 120, 120)); + sub_paint.set_anti_alias(true); + canvas.draw_str( + &format!("want: {}", scenario.desired), + (ox + 8.0, oy + 32.0), + &title_font, + &sub_paint, + ); + + // Draw recipe (multi-line). + for (li, line) in scenario.recipe.split('\n').enumerate() { + canvas.draw_str( + line, + (ox + 8.0, oy + 44.0 + li as f32 * 12.0), + &title_font, + &sub_paint, + ); + } + + let cx = ox + (cell_w as f32) / 2.0; + let cy = oy + 170.0; + + if col < 5 { + let (v, s, all_loops) = make_concentric_circles(cx, cy, &[80.0, 53.0, 26.0]); + + // Build the VectorNetwork with the correct region decomposition. + let regions: Vec = match col { + 0 => { + // Solid disc: 1 region, NonZero, all 3 loops + vec![VectorNetworkRegion { + loops: all_loops.clone(), + fill_rule: FillRule::NonZero, + fills: Some(make_fill(face_colors[0])), + }] + } + 1 => { + // Bullseye: 1 region, EvenOdd, all 3 loops + // face₀ ■ (blue), face₁ □, face₂ ■ + // But EvenOdd with single color only gives one color. + // To get per-face colors we need separate regions: + vec![ + VectorNetworkRegion { + loops: vec![all_loops[0].clone(), all_loops[1].clone()], + fill_rule: FillRule::EvenOdd, + fills: Some(make_fill(face_colors[0])), // blue outer + }, + VectorNetworkRegion { + loops: vec![all_loops[2].clone()], + fill_rule: FillRule::NonZero, + fills: Some(make_fill(face_colors[2])), // green center + }, + ] + } + 2 => { + // Donut (outer ring only): use loops[0] + loops[1] with EvenOdd. + // This gives: outer ring = filled, inside loop₁ = empty. + // loop₂ is simply not included in any region. + vec![VectorNetworkRegion { + loops: vec![all_loops[0].clone(), all_loops[1].clone()], + fill_rule: FillRule::EvenOdd, + fills: Some(make_fill(face_colors[0])), + }] + } + 3 => { + // Middle ring only: use loops[1] + loops[2] with EvenOdd. + // loop₀ excluded entirely. + vec![VectorNetworkRegion { + loops: vec![all_loops[1].clone(), all_loops[2].clone()], + fill_rule: FillRule::EvenOdd, + fills: Some(make_fill(face_colors[1])), + }] + } + 4 => { + // Center dot only: just loop₂, NonZero. + vec![VectorNetworkRegion { + loops: vec![all_loops[2].clone()], + fill_rule: FillRule::NonZero, + fills: Some(make_fill(face_colors[2])), + }] + } + _ => unreachable!(), + }; + + let vn = VectorNetwork { + vertices: v.clone(), + segments: s.clone(), + regions, + }; + + draw_vn_region_with_color(&vn, canvas, face_colors[0]); + + // But wait — draw_vn_region_with_color uses a single color. + // For multi-region with per-region colors, use to_paths + region fills. + // Re-render properly: + // First clear what we just drew by re-filling the circle area. + // Actually, let's just render properly via to_paths + each region's fill. + + // Redraw: clear area and render properly per-region. + let mut bg = SkPaint::default(); + bg.set_color(Color::from_argb(255, 245, 245, 245)); + bg.set_style(PaintStyle::Fill); + canvas.draw_rect( + skia_safe::Rect::from_xywh(ox + 1.0, oy + 70.0, cell_w as f32 - 2.0, cell_h as f32 - 85.0), + &bg, + ); + + let paths = vn.to_paths(); + for (region, path) in vn.regions.iter().zip(paths.iter()) { + if let Some(fills) = ®ion.fills { + for paint_item in fills.as_slice() { + if let Paint::Solid(solid) = paint_item { + let mut sk = SkPaint::default(); + sk.set_anti_alias(true); + sk.set_style(PaintStyle::Fill); + sk.set_color(Color::from_argb( + solid.color.a, + solid.color.r, + solid.color.g, + solid.color.b, + )); + canvas.draw_path(path, &sk); + } + } + } + } + + // Outlines for all 3 loops (even ones not in regions). + let mut stroke_paint = SkPaint::default(); + stroke_paint.set_color(Color::from_argb(255, 60, 60, 60)); + stroke_paint.set_style(PaintStyle::Stroke); + stroke_paint.set_stroke_width(1.5); + stroke_paint.set_anti_alias(true); + for lp in &all_loops { + let mut builder = PathBuilder::new(); + add_loop_to_builder(&mut builder, lp, &v, &s); + let path = builder.detach(); + canvas.draw_path(&path, &stroke_paint); + } + } else { + // Sibling — same as before. + let lcx = cx - 45.0; + let rcx = cx + 45.0; + let (v1, s1, l1) = make_concentric_circles(lcx, cy, &[35.0]); + let (v2, mut s2, l2) = make_concentric_circles(rcx, cy, &[35.0]); + let v_offset = v1.len(); + let s_offset = s1.len(); + for seg in &mut s2 { + seg.a += v_offset; + seg.b += v_offset; + } + let mut vertices = v1; + vertices.extend(v2); + let mut segments = s1; + segments.extend(s2); + let loop_right = VectorNetworkLoop( + l2[0].0.iter().map(|&i| i + s_offset).collect::>(), + ); + let left_loop = l1.into_iter().next().unwrap(); + + let vn = VectorNetwork { + vertices: vertices.clone(), + segments: segments.clone(), + regions: vec![VectorNetworkRegion { + loops: vec![left_loop], + fill_rule: FillRule::NonZero, + fills: Some(make_fill(face_colors[0])), + }], + }; + + let paths = vn.to_paths(); + for (region, path) in vn.regions.iter().zip(paths.iter()) { + if let Some(fills) = ®ion.fills { + for paint_item in fills.as_slice() { + if let Paint::Solid(solid) = paint_item { + let mut sk = SkPaint::default(); + sk.set_anti_alias(true); + sk.set_style(PaintStyle::Fill); + sk.set_color(Color::from_argb( + solid.color.a, + solid.color.r, + solid.color.g, + solid.color.b, + )); + canvas.draw_path(path, &sk); + } + } + } + } + + let mut stroke_paint = SkPaint::default(); + stroke_paint.set_color(Color::from_argb(255, 60, 60, 60)); + stroke_paint.set_style(PaintStyle::Stroke); + stroke_paint.set_stroke_width(1.5); + stroke_paint.set_anti_alias(true); + for lp in [&vn.regions[0].loops[0], &loop_right] { + let mut builder = PathBuilder::new(); + add_loop_to_builder(&mut builder, lp, &vertices, &segments); + let path = builder.detach(); + canvas.draw_path(&path, &stroke_paint); + } + } + + // Legend. + let legend_y = oy + cell_h as f32 - 12.0; + let face_labels: Vec<&str> = if col < 5 { + vec!["outer", "mid", "inner"] + } else { + vec!["left", "right"] + }; + let desired_mask: u64 = match col { + 0 => 0b111, + 1 => 0b101, + 2 => 0b001, + 3 => 0b010, + 4 => 0b100, + 5 => 0b01, + _ => 0, + }; + let face_cols: Vec<(u8, u8, u8)> = if col < 5 { + face_colors.to_vec() + } else { + vec![face_colors[0], (180, 180, 180)] + }; + for (fi, (label, &(cr, cg, cb))) in face_labels.iter().zip(face_cols.iter()).enumerate() { + let lx = ox + 8.0 + (fi as f32) * 65.0; + let filled = (desired_mask >> fi) & 1 == 1; + let mut swatch = SkPaint::default(); + if filled { + swatch.set_color(Color::from_argb(255, cr, cg, cb)); + } else { + swatch.set_color(Color::from_argb(255, 220, 220, 220)); + } + swatch.set_style(PaintStyle::Fill); + canvas.draw_rect( + skia_safe::Rect::from_xywh(lx, legend_y - 8.0, 10.0, 10.0), + &swatch, + ); + let mut sb = SkPaint::default(); + sb.set_color(Color::from_argb(255, 100, 100, 100)); + sb.set_style(PaintStyle::Stroke); + sb.set_stroke_width(0.5); + canvas.draw_rect( + skia_safe::Rect::from_xywh(lx, legend_y - 8.0, 10.0, 10.0), + &sb, + ); + canvas.draw_str(*label, (lx + 14.0, legend_y), &title_font, &text_paint); + } + } + + let img = surface.image_snapshot(); + let data = img.encode(None, EncodedImageFormat::PNG, None).unwrap(); + let out_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("current_model_workaround_output.png"); + std::fs::write(&out_path, data.as_bytes()).unwrap(); + eprintln!("Rendered to: {}", out_path.display()); +} + +// ═══════════════════════════════════════════════════════════════════════════ +// Complex scenarios — stress-testing the model boundaries +// ═══════════════════════════════════════════════════════════════════════════ +// +// Row 0 (non-self-intersecting — fill_mask / face model works): +// [Open + Closed] [Shared Edge] [T-Junction] +// +// Row 1 (self-intersecting — requires planarization): +// [Z / Bowtie] [Pentagram] [Overlapping Circles] +// +// The top row shows where per-face fill works cleanly. +// The bottom row shows where all non-planarized models (fill_rule AND +// fill_mask) break down, because the loop doesn't map 1:1 to geometric faces. + +/// Draw small vertex dots at each vertex position. +fn draw_vertex_dots(canvas: &skia_safe::Canvas, vertices: &[(f32, f32)], color: skia_safe::Color) { + let mut paint = SkPaint::default(); + paint.set_color(color); + paint.set_anti_alias(true); + paint.set_style(PaintStyle::Fill); + for &(x, y) in vertices { + canvas.draw_circle((x, y), 3.0, &paint); + } +} + +/// Draw segment outlines. +fn draw_segments_wireframe( + canvas: &skia_safe::Canvas, + vertices: &[(f32, f32)], + segments: &[VectorNetworkSegment], + color: skia_safe::Color, + width: f32, +) { + let mut paint = SkPaint::default(); + paint.set_color(color); + paint.set_anti_alias(true); + paint.set_style(PaintStyle::Stroke); + paint.set_stroke_width(width); + + for seg in segments { + let a = vertices[seg.a]; + let b = vertices[seg.b]; + let mut builder = PathBuilder::new(); + builder.move_to((a.0, a.1)); + if seg.ta == (0.0, 0.0) && seg.tb == (0.0, 0.0) { + builder.line_to((b.0, b.1)); + } else { + builder.cubic_to( + (a.0 + seg.ta.0, a.1 + seg.ta.1), + (b.0 + seg.tb.0, b.1 + seg.tb.1), + (b.0, b.1), + ); + } + canvas.draw_path(&builder.detach(), &paint); + } +} + +/// Render a VectorNetwork using its to_paths + region fills. +fn draw_vn_filled2(canvas: &skia_safe::Canvas, vn: &VectorNetwork) { + let paths = vn.to_paths(); + for (region, path) in vn.regions.iter().zip(paths.iter()) { + if let Some(fills) = ®ion.fills { + for paint_item in fills.as_slice() { + if let Paint::Solid(solid) = paint_item { + if !solid.active { + continue; + } + let mut sk = SkPaint::default(); + sk.set_anti_alias(true); + sk.set_style(PaintStyle::Fill); + sk.set_color(Color::from_argb( + solid.color.a, + solid.color.r, + solid.color.g, + solid.color.b, + )); + canvas.draw_path(path, &sk); + } + } + } + } +} + +#[test] +fn complex_scenarios_to_png() { + let cell_w = 240i32; + let cell_h = 340i32; + let cols = 3i32; + let rows = 2i32; + let total_w = cell_w * cols; + let total_h = cell_h * rows; + + let mut surface = surfaces::raster_n32_premul((total_w, total_h)).unwrap(); + let canvas = surface.canvas(); + canvas.clear(Color::from_argb(255, 252, 252, 252)); + + let font_mgr = FontMgr::new(); + let typeface = font_mgr + .match_family_style("Arial", FontStyle::normal()) + .or_else(|| font_mgr.match_family_style("Helvetica", FontStyle::normal())) + .unwrap_or_else(|| font_mgr.legacy_make_typeface(None, FontStyle::normal()).unwrap()); + let title_font = Font::from_typeface(&typeface, 13.0); + let small_font = Font::from_typeface(&typeface, 10.0); + let tiny_font = Font::from_typeface(&typeface, 9.0); + + let mut text_paint = SkPaint::default(); + text_paint.set_color(Color::from_argb(255, 30, 30, 30)); + text_paint.set_anti_alias(true); + let mut gray_paint = SkPaint::default(); + gray_paint.set_color(Color::from_argb(255, 110, 110, 110)); + gray_paint.set_anti_alias(true); + let mut ok_paint = SkPaint::default(); + ok_paint.set_color(Color::from_argb(255, 52, 168, 83)); + ok_paint.set_anti_alias(true); + let mut err_paint = SkPaint::default(); + err_paint.set_color(Color::from_argb(255, 234, 67, 53)); + err_paint.set_anti_alias(true); + + let mut grid_paint = SkPaint::default(); + grid_paint.set_color(Color::from_argb(255, 210, 210, 210)); + grid_paint.set_style(PaintStyle::Stroke); + grid_paint.set_stroke_width(1.0); + + let blue = (66u8, 133u8, 244u8); + let red_c = (234u8, 67u8, 53u8); + let green_c = (52u8, 168u8, 83u8); + let orange = (255u8, 152u8, 0u8); + + fn mk_paint(c: (u8, u8, u8), alpha: u8) -> Paints { + Paints::new([Paint::Solid(SolidPaint { + active: true, + color: CGColor::from_rgba(c.0, c.1, c.2, alpha), + blend_mode: BlendMode::Normal, + })]) + } + + // Draw cell grid. + for r in 0..rows { + for c in 0..cols { + canvas.draw_rect( + skia_safe::Rect::from_xywh( + (c * cell_w) as f32, (r * cell_h) as f32, + cell_w as f32, cell_h as f32, + ), + &grid_paint, + ); + } + } + + // Row tint backgrounds. + let mut row0_bg = SkPaint::default(); + row0_bg.set_color(Color::from_argb(10, 52, 168, 83)); + row0_bg.set_style(PaintStyle::Fill); + canvas.draw_rect(skia_safe::Rect::from_xywh(0.0, 0.0, total_w as f32, cell_h as f32), &row0_bg); + let mut row1_bg = SkPaint::default(); + row1_bg.set_color(Color::from_argb(10, 234, 67, 53)); + row1_bg.set_style(PaintStyle::Fill); + canvas.draw_rect(skia_safe::Rect::from_xywh(0.0, cell_h as f32, total_w as f32, cell_h as f32), &row1_bg); + + // ─── Cell (0,0): Open + Closed ────────────────────────────────────── + { + let ox = 0.0f32; + let oy = 0.0f32; + let cx = ox + cell_w as f32 / 2.0; + let cy = oy + 160.0; + + canvas.draw_str("Open + Closed", (ox + 8.0, oy + 18.0), &title_font, &text_paint); + canvas.draw_str("stroke-only path + filled loop", (ox + 8.0, oy + 32.0), &small_font, &gray_paint); + canvas.draw_str("coexist in same network", (ox + 8.0, oy + 44.0), &small_font, &gray_paint); + + // Open zigzag. + let open_v: Vec<(f32, f32)> = vec![ + (cx - 70.0, cy - 30.0), (cx - 30.0, cy - 70.0), + (cx + 10.0, cy - 30.0), (cx + 50.0, cy - 70.0), + ]; + let open_s: Vec = vec![ + VectorNetworkSegment::ab(0, 1), VectorNetworkSegment::ab(1, 2), VectorNetworkSegment::ab(2, 3), + ]; + // Closed triangle. + let to = open_v.len(); + let so = open_s.len(); + let mut all_v = open_v.clone(); + all_v.extend(vec![(cx - 50.0, cy + 55.0), (cx + 50.0, cy + 55.0), (cx, cy - 10.0)]); + let mut all_s = open_s.clone(); + all_s.extend(vec![ + VectorNetworkSegment::ab(to, to + 1), VectorNetworkSegment::ab(to + 1, to + 2), + VectorNetworkSegment::ab(to + 2, to), + ]); + + let vn = VectorNetwork { + vertices: all_v.clone(), segments: all_s.clone(), + regions: vec![VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![so, so + 1, so + 2])], + fill_rule: FillRule::NonZero, fills: Some(mk_paint(blue, 180)), + }], + }; + draw_vn_filled2(canvas, &vn); + draw_segments_wireframe(canvas, &all_v, &all_s, Color::from_argb(255, 60, 60, 60), 1.5); + draw_vertex_dots(canvas, &all_v, Color::from_argb(255, 234, 67, 53)); + + canvas.draw_str("fill_rule:", (ox + 8.0, oy + 270.0), &small_font, &gray_paint); + canvas.draw_str("✓ works", (ox + 75.0, oy + 270.0), &small_font, &ok_paint); + canvas.draw_str("fill_mask:", (ox + 8.0, oy + 284.0), &small_font, &gray_paint); + canvas.draw_str("✓ works", (ox + 75.0, oy + 284.0), &small_font, &ok_paint); + canvas.draw_str("faces:", (ox + 8.0, oy + 298.0), &small_font, &gray_paint); + canvas.draw_str("✓ works", (ox + 75.0, oy + 298.0), &small_font, &ok_paint); + canvas.draw_str("open path → no face, just stroke", (ox + 8.0, oy + 318.0), &tiny_font, &gray_paint); + } + + // ─── Cell (1,0): Shared Edge ──────────────────────────────────────── + { + let ox = cell_w as f32; + let oy = 0.0f32; + let cx = ox + cell_w as f32 / 2.0; + let cy = oy + 155.0; + + canvas.draw_str("Shared Edge", (ox + 8.0, oy + 18.0), &title_font, &text_paint); + canvas.draw_str("two triangles, shared boundary", (ox + 8.0, oy + 32.0), &small_font, &gray_paint); + canvas.draw_str("independently fillable faces", (ox + 8.0, oy + 44.0), &small_font, &gray_paint); + + let vertices: Vec<(f32, f32)> = vec![ + (cx, cy - 70.0), (cx + 70.0, cy), (cx, cy + 70.0), (cx - 70.0, cy), + ]; + let segments: Vec = vec![ + VectorNetworkSegment::ab(0, 3), VectorNetworkSegment::ab(3, 2), VectorNetworkSegment::ab(2, 0), + VectorNetworkSegment::ab(0, 1), VectorNetworkSegment::ab(1, 2), VectorNetworkSegment::ab(2, 0), + ]; + let vn = VectorNetwork { + vertices: vertices.clone(), segments: segments.clone(), + regions: vec![ + VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![0, 1, 2])], + fill_rule: FillRule::NonZero, fills: Some(mk_paint(blue, 200)), + }, + VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![3, 4, 5])], + fill_rule: FillRule::NonZero, fills: Some(mk_paint(orange, 200)), + }, + ], + }; + draw_vn_filled2(canvas, &vn); + draw_segments_wireframe(canvas, &vertices, &segments, Color::from_argb(255, 60, 60, 60), 1.5); + draw_vertex_dots(canvas, &vertices, Color::from_argb(255, 234, 67, 53)); + + canvas.draw_str("fill_rule:", (ox + 8.0, oy + 270.0), &small_font, &gray_paint); + canvas.draw_str("✓ 2 regions", (ox + 75.0, oy + 270.0), &small_font, &ok_paint); + canvas.draw_str("fill_mask:", (ox + 8.0, oy + 284.0), &small_font, &gray_paint); + canvas.draw_str("✓ mask=0b11", (ox + 75.0, oy + 284.0), &small_font, &ok_paint); + canvas.draw_str("faces:", (ox + 8.0, oy + 298.0), &small_font, &gray_paint); + canvas.draw_str("✓ 2 faces, 1 shared edge", (ox + 75.0, oy + 298.0), &small_font, &ok_paint); + canvas.draw_str("SVG needs 2 separate s", (ox + 8.0, oy + 318.0), &tiny_font, &gray_paint); + } + + // ─── Cell (2,0): T-Junction ───────────────────────────────────────── + { + let ox = (cell_w * 2) as f32; + let oy = 0.0f32; + let cx = ox + cell_w as f32 / 2.0; + let cy = oy + 155.0; + + canvas.draw_str("T-Junction", (ox + 8.0, oy + 18.0), &title_font, &text_paint); + canvas.draw_str("3 edges meet at one vertex", (ox + 8.0, oy + 32.0), &small_font, &gray_paint); + canvas.draw_str("impossible in SVG paths", (ox + 8.0, oy + 44.0), &small_font, &gray_paint); + + let vertices: Vec<(f32, f32)> = vec![ + (cx, cy - 65.0), // 0: top + (cx - 65.0, cy + 5.0), // 1: left + (cx + 65.0, cy + 5.0), // 2: right + (cx, cy + 5.0), // 3: center junction + (cx, cy + 70.0), // 4: bottom stem + ]; + let segments: Vec = vec![ + VectorNetworkSegment::ab(0, 3), // s0: top→center + VectorNetworkSegment::ab(3, 1), // s1: center→left + VectorNetworkSegment::ab(1, 0), // s2: left→top + VectorNetworkSegment::ab(0, 2), // s3: top→right + VectorNetworkSegment::ab(2, 3), // s4: right→center + VectorNetworkSegment::ab(3, 0), // s5: center→top + VectorNetworkSegment::ab(3, 4), // s6: stem (open) + ]; + let vn = VectorNetwork { + vertices: vertices.clone(), segments: segments.clone(), + regions: vec![ + VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![0, 1, 2])], + fill_rule: FillRule::NonZero, fills: Some(mk_paint(blue, 200)), + }, + VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![3, 4, 5])], + fill_rule: FillRule::NonZero, fills: Some(mk_paint(green_c, 200)), + }, + ], + }; + draw_vn_filled2(canvas, &vn); + draw_segments_wireframe(canvas, &vertices, &segments, Color::from_argb(255, 60, 60, 60), 1.5); + draw_vertex_dots(canvas, &vertices, Color::from_argb(255, 234, 67, 53)); + canvas.draw_str("3-way", (cx + 6.0, cy + 2.0), &tiny_font, &gray_paint); + canvas.draw_str("stem", (cx + 6.0, cy + 50.0), &tiny_font, &gray_paint); + + canvas.draw_str("fill_rule:", (ox + 8.0, oy + 270.0), &small_font, &gray_paint); + canvas.draw_str("✓ 2 regions + open stem", (ox + 75.0, oy + 270.0), &small_font, &ok_paint); + canvas.draw_str("fill_mask:", (ox + 8.0, oy + 284.0), &small_font, &gray_paint); + canvas.draw_str("✓ 2 faces + open edge", (ox + 75.0, oy + 284.0), &small_font, &ok_paint); + canvas.draw_str("faces:", (ox + 8.0, oy + 298.0), &small_font, &gray_paint); + canvas.draw_str("✓ natural", (ox + 75.0, oy + 298.0), &small_font, &ok_paint); + canvas.draw_str("SVG impossible: can't branch paths", (ox + 8.0, oy + 318.0), &tiny_font, &gray_paint); + } + + // ═══════════ Row 1: Self-intersecting ═══════════════════════════════ + + // ─── Cell (0,1): Z / Bowtie ───────────────────────────────────────── + { + let ox = 0.0f32; + let oy = cell_h as f32; + let cx = ox + cell_w as f32 / 2.0; + let cy = oy + 155.0; + let hw = 50.0f32; + + canvas.draw_str("Z-Shape (Bowtie)", (ox + 8.0, oy + 18.0), &title_font, &text_paint); + canvas.draw_str("rect with v1,v2 swapped", (ox + 8.0, oy + 32.0), &small_font, &gray_paint); + canvas.draw_str("segments cross at center", (ox + 8.0, oy + 44.0), &small_font, &gray_paint); + + let vertices: Vec<(f32, f32)> = vec![ + (cx - hw, cy - hw), // 0: top-left + (cx + hw, cy + hw), // 1: bottom-right (swapped) + (cx + hw, cy - hw), // 2: top-right (swapped) + (cx - hw, cy + hw), // 3: bottom-left + ]; + let segments: Vec = vec![ + VectorNetworkSegment::ab(0, 1), // diagonal ↘ + VectorNetworkSegment::ab(1, 2), // right side ↑ + VectorNetworkSegment::ab(2, 3), // diagonal ↙ (crosses s0) + VectorNetworkSegment::ab(3, 0), // left side ↑ + ]; + + // LEFT: EvenOdd + let shift_l = -38.0f32; + let vl: Vec<(f32, f32)> = vertices.iter().map(|&(x, y)| (x + shift_l, y)).collect(); + let vn_eo = VectorNetwork { + vertices: vl.clone(), segments: segments.clone(), + regions: vec![VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![0, 1, 2, 3])], + fill_rule: FillRule::EvenOdd, fills: Some(mk_paint(blue, 200)), + }], + }; + draw_vn_filled2(canvas, &vn_eo); + draw_segments_wireframe(canvas, &vl, &segments, Color::from_argb(255, 60, 60, 60), 1.5); + draw_vertex_dots(canvas, &vl, Color::from_argb(255, 234, 67, 53)); + canvas.draw_str("EvenOdd", (cx + shift_l - 20.0, cy + hw + 18.0), &tiny_font, &text_paint); + + // RIGHT: NonZero + let shift_r = 38.0f32; + let vr: Vec<(f32, f32)> = vertices.iter().map(|&(x, y)| (x + shift_r, y)).collect(); + let vn_nz = VectorNetwork { + vertices: vr.clone(), segments: segments.clone(), + regions: vec![VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![0, 1, 2, 3])], + fill_rule: FillRule::NonZero, fills: Some(mk_paint(red_c, 200)), + }], + }; + draw_vn_filled2(canvas, &vn_nz); + draw_segments_wireframe(canvas, &vr, &segments, Color::from_argb(255, 60, 60, 60), 1.5); + draw_vertex_dots(canvas, &vr, Color::from_argb(255, 234, 67, 53)); + canvas.draw_str("NonZero", (cx + shift_r - 20.0, cy + hw + 18.0), &tiny_font, &text_paint); + + canvas.draw_str("fill_rule:", (ox + 8.0, oy + 270.0), &small_font, &gray_paint); + canvas.draw_str("⚠ ambiguous (2 results)", (ox + 75.0, oy + 270.0), &small_font, &err_paint); + canvas.draw_str("fill_mask:", (ox + 8.0, oy + 284.0), &small_font, &gray_paint); + canvas.draw_str("✗ sees 1 face (1 loop)", (ox + 75.0, oy + 284.0), &small_font, &err_paint); + canvas.draw_str("faces:", (ox + 8.0, oy + 298.0), &small_font, &gray_paint); + canvas.draw_str("✓ planarize → 3 faces", (ox + 75.0, oy + 298.0), &small_font, &ok_paint); + canvas.draw_str("crossing creates hidden faces", (ox + 8.0, oy + 318.0), &tiny_font, &gray_paint); + } + + // ─── Cell (1,1): Pentagram ────────────────────────────────────────── + { + let ox = cell_w as f32; + let oy = cell_h as f32; + let cx = ox + cell_w as f32 / 2.0; + let cy = oy + 160.0; + let r = 60.0f32; + + canvas.draw_str("Pentagram", (ox + 8.0, oy + 18.0), &title_font, &text_paint); + canvas.draw_str("5 vertices, connect every other", (ox + 8.0, oy + 32.0), &small_font, &gray_paint); + canvas.draw_str("center pentagon: EO=□ NZ=■", (ox + 8.0, oy + 44.0), &small_font, &gray_paint); + + let mut star_v: Vec<(f32, f32)> = Vec::new(); + for i in 0..5 { + let angle = -std::f32::consts::FRAC_PI_2 + (i as f32) * 2.0 * std::f32::consts::PI / 5.0; + star_v.push((r * angle.cos(), r * angle.sin())); + } + let star_s: Vec = vec![ + VectorNetworkSegment::ab(0, 2), VectorNetworkSegment::ab(2, 4), + VectorNetworkSegment::ab(4, 1), VectorNetworkSegment::ab(1, 3), + VectorNetworkSegment::ab(3, 0), + ]; + + // LEFT: EvenOdd + let shift_l = -38.0f32; + let vl: Vec<(f32, f32)> = star_v.iter().map(|&(x, y)| (cx + x + shift_l, cy + y)).collect(); + let vn_eo = VectorNetwork { + vertices: vl.clone(), segments: star_s.clone(), + regions: vec![VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![0, 1, 2, 3, 4])], + fill_rule: FillRule::EvenOdd, fills: Some(mk_paint(blue, 200)), + }], + }; + draw_vn_filled2(canvas, &vn_eo); + draw_segments_wireframe(canvas, &vl, &star_s, Color::from_argb(255, 60, 60, 60), 1.5); + draw_vertex_dots(canvas, &vl, Color::from_argb(255, 234, 67, 53)); + canvas.draw_str("EvenOdd", (cx + shift_l - 20.0, cy + r + 18.0), &tiny_font, &text_paint); + + // RIGHT: NonZero + let shift_r = 38.0f32; + let vr: Vec<(f32, f32)> = star_v.iter().map(|&(x, y)| (cx + x + shift_r, cy + y)).collect(); + let vn_nz = VectorNetwork { + vertices: vr.clone(), segments: star_s.clone(), + regions: vec![VectorNetworkRegion { + loops: vec![VectorNetworkLoop(vec![0, 1, 2, 3, 4])], + fill_rule: FillRule::NonZero, fills: Some(mk_paint(red_c, 200)), + }], + }; + draw_vn_filled2(canvas, &vn_nz); + draw_segments_wireframe(canvas, &vr, &star_s, Color::from_argb(255, 60, 60, 60), 1.5); + draw_vertex_dots(canvas, &vr, Color::from_argb(255, 234, 67, 53)); + canvas.draw_str("NonZero", (cx + shift_r - 20.0, cy + r + 18.0), &tiny_font, &text_paint); + + canvas.draw_str("fill_rule:", (ox + 8.0, oy + 270.0), &small_font, &gray_paint); + canvas.draw_str("⚠ ambiguous (2 results)", (ox + 75.0, oy + 270.0), &small_font, &err_paint); + canvas.draw_str("fill_mask:", (ox + 8.0, oy + 284.0), &small_font, &gray_paint); + canvas.draw_str("✗ 1 loop → 1 face only", (ox + 75.0, oy + 284.0), &small_font, &err_paint); + canvas.draw_str("faces:", (ox + 8.0, oy + 298.0), &small_font, &gray_paint); + canvas.draw_str("✓ planarize → 6 faces", (ox + 75.0, oy + 298.0), &small_font, &ok_paint); + canvas.draw_str("5 triangles + 1 center pentagon", (ox + 8.0, oy + 318.0), &tiny_font, &gray_paint); + } + + // ─── Cell (2,1): Overlapping Circles ──────────────────────────────── + { + let ox = (cell_w * 2) as f32; + let oy = cell_h as f32; + let cx = ox + cell_w as f32 / 2.0; + let cy = oy + 160.0; + + canvas.draw_str("Overlapping Circles", (ox + 8.0, oy + 18.0), &title_font, &text_paint); + canvas.draw_str("two loops partially overlap", (ox + 8.0, oy + 32.0), &small_font, &gray_paint); + canvas.draw_str("intersection is ambiguous", (ox + 8.0, oy + 44.0), &small_font, &gray_paint); + + let (v1, s1, l1) = make_concentric_circles(cx - 28.0, cy, &[55.0]); + let (v2, mut s2, l2) = make_concentric_circles(cx + 28.0, cy, &[55.0]); + let v_off = v1.len(); + let s_off = s1.len(); + for seg in &mut s2 { seg.a += v_off; seg.b += v_off; } + let mut vertices = v1; + vertices.extend(v2); + let mut segments = s1; + segments.extend(s2); + let right_loop = VectorNetworkLoop(l2[0].0.iter().map(|&i| i + s_off).collect()); + let left_loop = l1.into_iter().next().unwrap(); + + let vn = VectorNetwork { + vertices: vertices.clone(), segments: segments.clone(), + regions: vec![ + VectorNetworkRegion { + loops: vec![left_loop], fill_rule: FillRule::NonZero, + fills: Some(mk_paint(blue, 140)), + }, + VectorNetworkRegion { + loops: vec![right_loop], fill_rule: FillRule::NonZero, + fills: Some(mk_paint(red_c, 140)), + }, + ], + }; + draw_vn_filled2(canvas, &vn); + draw_segments_wireframe(canvas, &vertices, &segments, Color::from_argb(255, 60, 60, 60), 1.5); + + canvas.draw_str("L", (cx - 55.0, cy + 5.0), &title_font, &text_paint); + canvas.draw_str("R", (cx + 45.0, cy + 5.0), &title_font, &text_paint); + canvas.draw_str("L∩R", (cx - 12.0, cy + 5.0), &tiny_font, &text_paint); + + canvas.draw_str("fill_rule:", (ox + 8.0, oy + 270.0), &small_font, &gray_paint); + canvas.draw_str("✗ double-paints overlap", (ox + 75.0, oy + 270.0), &small_font, &err_paint); + canvas.draw_str("fill_mask:", (ox + 8.0, oy + 284.0), &small_font, &gray_paint); + canvas.draw_str("✗ nesting tree wrong", (ox + 75.0, oy + 284.0), &small_font, &err_paint); + canvas.draw_str("faces:", (ox + 8.0, oy + 298.0), &small_font, &gray_paint); + canvas.draw_str("✓ planarize → 3 faces", (ox + 75.0, oy + 298.0), &small_font, &ok_paint); + canvas.draw_str("L-only, L∩R, R-only", (ox + 8.0, oy + 318.0), &tiny_font, &gray_paint); + } + + // Save. + let img = surface.image_snapshot(); + let data = img.encode(None, EncodedImageFormat::PNG, None).unwrap(); + let out_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("complex_scenarios_output.png"); + std::fs::write(&out_path, data.as_bytes()).unwrap(); + eprintln!("Rendered to: {}", out_path.display()); +} diff --git a/crates/grida-canvas/tests/fill_mask_poc_output.png b/crates/grida-canvas/tests/fill_mask_poc_output.png new file mode 100644 index 0000000000000000000000000000000000000000..c16632cbf97c21566360df3be391a06811c1286f GIT binary patch literal 46095 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 literal 0 HcmV?d00001