From 8e475a3abe7109c58006f86428a739c68f796238 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 9 Aug 2025 08:04:22 +0100 Subject: [PATCH] add functionality to change grid size for layer tree --- dotscape | Bin 1051816 -> 1051816 bytes fcore/layer-tree.sml | 53 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/dotscape b/dotscape index 5ffccb189289299172fb6ab5fd119edbf86d77eb..036a86206742de22faa4bd00530ab00a8daf020e 100755 GIT binary patch delta 11568 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 delta 11588 zcmbtZ4_K5{)_>2vFMno41meFN%nXQx1%d^L1p~EYRHnv=*C@3e2Ji7*M?-p^=?lh zFipDpD$^aLgTg1YwBTLWme)|({v=oQ>purLD784+h$&ghYJCtUNOi3Yza!dq;`f2J zH{m|1d?)^PkzETQ=mRq7Ng<_@`@bSxwl~57K9IKTzMmYY(r3G~QCjGm?-R0?N++G& zMu85RGf8QINC)fhBBcui^Kc=4zM-V!?^Nh8>z5K>Bzk0a04=V%UaI{Lw0kt5aYxt|M` z_jKHjf*p}w!PW>>uxK8>h(c3xrS)%RK#r^Ptvn!(DXz=E)kB&g&erE9!muUKJZuzf zeIN+KZW`G!Zai$YPPX-VxMGO4wrUg1sV68rd697G+5B`x5kTWZL=y45ITd zcS-r*=1aDHi*%2WLG#1NZ>Dr*-+1F+$)He*J#3Hj_97W{&m^VB5VO-wqdFE&kka<= z4t1xaMM4Fq8O82QmM-kifoLhZ>o?pWW~j6e+z{*E%OVvSQrCMINOFp_<}TX+1?e4y$`Gw2*o2VIG{<50?=Gbzz``hZAp(ZTql1rS(p9mFHl{sz;vD30qN{k2KLiU-ViD{fQHnpF2mw;w z@gzu*%8yS3y{qx~#{{yZc^^H-W70AQ?f$N->!V9R+LEO0e=OlbFa42Qu()?N?`-ew z=1tj27mn#q@iABVsWwbJNm9av64xVr222$?srnO6VES|hC#d<9639m>MXrON{h;!W zmrniXWKK%XdHH8aThAHzz=3m$jG8}j7AfZy8FlASQvk>jRfM_Y!J^_9%$V|;xX#U@Jjl>V>D5hqlV}t zB}6N~d5AMOe8<1a0E0YDq1(=5^26xg=gyAF$Vi{8CwRqyVOIrV3iZt_@L2t^i^_gM=oNdWc?{^s( z{v+STOCMaD%H`A-{eR_5LOI3yHcT_4WVCIt;Gnx%bY5z}baw>omvJ#|$+o`!jsT}8 zTNqwHawCR_X6OG!*ZtMMMz6dp9iUlmhG={Hh-1aei~SOVd=bB+ja zE`7r!*mvdpx*rykg*mJQU|J@3HdK=ze65IbRWG7>MG=PDF!faMvjw$^atL-}5bV}C zb^xFynw#4Zh@pZR+R-N170$`>Jc6t-mgOTNMDU!-&IAB2gXH2sSgZ_m202XC0 zyHW}#amt~81BOjm8GMFK`W#q*&6YWeeplzfM>ylqTzHJ@6*>=Y;}A+_@YY z6z9lV1y}eFW?BnhM&x3(gIPZj+e+R}Ci3{F;b+R++MmNR!YM2~T(LdQ+sTA|^9*!D zF6*p=DFi2cQ3pg1gk5?LCfy!p>$64RzD4sB-ZmRg`M2x)F)ZS7OfRQD4`qZnLgmIL zD5lXSJg-f7j+0dL@KZ<$cMHR~b^Xm?BE|?7_)Fk5jhz2Wm;t0BnYFwKQ(!DR@*)(I z3L@)&1s6m9!`sA3#z+X5qL zhG0~cpjugqs(rj5v8J1cP3WMWdu@I7=!y#v^BC9(39^V|92=1^G!0bF+X{FyXiH-0 z+h8ZIyl)#MZNTEkh5>IaG7nosoKC=5h!&_f32$5GnTKuB$PO_Z!KxY8y-`n{crd(O zff&-*8yZDtE6%GBh0R5dEPFjx*!2xqha+u$bD-1K5acu{Ki`Eo0i$}j=;;j*U@!+&J;LZ@@w4wi6s<29pU=_Pj6pHNJ4Qn8gncl?cOk`)?ga$r3uN@wY zLhs`XJKRt@#241n5IbZTD<5cwXuNI)uwExF-@yLMiScb=0UfZHxC7XM4%p4n@;x{l z!s@WOCj@)#M|Vh@IbWh~2n3qCd`<3i>k zc_+UB+WPn|TJgN9ukeoHS(Wx%NWxS z+g|Lu$Fa+Mae_OHMel<|2xr;*aQ6+j$yNK{Lx4~@s|$`mlyxe%APS2>3-Ut}!^+5X zzk`L4B3J(o`gr}!iVk4%GE9}zWtb2A-eq__s1FNYmC2w(Esk--_o>(4>Y z?kJ^LsKC_nEnc9KbLH;0aU1yUjtk?f#1-Yeg9_rQx%eGOr+nMD9fBo1m5#ixq|&Y) zXu=elcNnIK;q6$MriGU#VjDaGTL)Wz6p}(;#L6Q*yfig4ytLps%Jv?GS$Jh-mG);gr!a-mdKXJ#5Fvu%5Ku!xBD$ z8sbsfDeUMcP(X~?d~gbz`Y9|St+}l2Q`i>a!JGlH!f;})@OI+Y!c=P>D>(xhap+VK z9ONW!^f@#=1P42bf$+j-%Na;P)3fd~aGkhw*@4fXmsoP;#T<&Fz55pIuFGj#dQ5a7kZ*rOzItKdN^I^BUd7wzzR1x&?YwmT5F1!5Yl0J|*@D|)n#fMxMU z%uxM!n{H?ca`s~pQr{fx#Gtp^8g)*`B)QIw<%8mzRPoJT4+dxsyX=9_xo=v=dVSM4 zM)l2npKmhs%_OG#0+PoX)m3C;p_|G=H_!w&_X}8yFH3Uo7chhBEAH^tkj6WjQoaN^ z42{z8`jZabPt8Dn5>OrHP6s1(H6Y+ z)Kg)zu}5!L4knauxI?b3qiYBR$(Ns{F=VW1v~JRD~nXam~PU`rfQTpCXt{;Gp6-P}O4K~atKv*0m=stsGcs-4+LcaNHh*-M?d z<$0R-V>4NQ$wdtQ~*?3cPMYOUja?d9EG=Pa^H`5)Vj(=RU{6jO{1qlW;tfKu4 zulAN=Z1uPbT#exlcIZXAJKD&N&ody7;VJI4mMB==ujmqZk@f$IP9bLri)o>c5<|Yc zxP=}dp&pb7n4&9CCF31(nw{dQ)HZ>g+d{iY>jc&!(Q;zEmtB$Q4jh+Tw$cMYE~c^K zZS>8EWPGVQf$tgEwjaXwCxqSDM(qg>yv8bfH!6q*EW%dnU1|^ovSW;55Mj`0gUEp? z;FcibLG>d+)TRcJiKk<25Zxu`y-d|0S`x$)e9J482T{i>R0$&Ynjj^?x2_KICiuKt zgXj<2sev!AXDQCc_Mu8_Q;GcjcB%)M%mQDf@8gkrj5h_W@iqE5q_A_Z(T$kq%XiS( zN-^8zpzjbQuHH#qNNn0gD|jW>xQp&kZagWw>HYYO#j4(<_-Ylyn%|@uAj;iu(h~~a z=%fz<#IW8Dn#Iq0vWKpW!?WJQA5`(YUx4P_fakrn0*_&wzK5m|Q!MM+LrX~8L^iUA zHWN!0YkrH)$D7%ux9Bu}?J#xH5#q^aroGs{F;O<{qxpnbQdvb8{RTZmp5vl_q$GJF zOOa_K*)>`2lxa2a9|><$6Cp`=%0=(cZ9q(SvUBg!BiPD2-lM%rg#rn`h#MW?4xuifKfhojFy4kjYkI$SwkYrJ5JkhmGXt-G?CwLMn0k` zUNilXc0i~*|E5nljPiwE9OUH9r#R}k1!ahu}y`qRlP^dZG8@q?Hean)Jh z(DD4rH{k#x>l7nkf0qHB3dMHi~t`izzI3h%V>o?jd>=ldrsen3e#~!uVsG z{OtGiI6llPy%zS#2z^!URI&3nXgeMPzit$#=r9jAGz2=`slPuWUI5N6or>}7T_Ubh zJI!2jHx*4lejddxh~iVB&*9Z*?v^A5Z>BM-_f0taW z6D6WU8Z1YhNmJzhF(R)l#%seqMn~va&wf3_h;2a^14{@S!Gez z;>0d>^d({=^0e_{Nw6N*Av_7C1)GTcQj*x43u9RM6JiW6{d+L4TCjTLdC{H68lMoe zh$TnvenKR8iQumNoG`?%TuPa_#XM}im-Rg<=9AX3ETUXYBZfSdUoJ-TNoD0?g|ffh z7E!O<>5o;49T4H>SuP$+g*@Ty*RKjwEqSb=N>mCRTVRm0z8~xsT)iz2D+3d;TjJP> zD$ztN8S<4XaSHJN5hxEF*beZAj*Dc_fiFgY|0C$fQ_nJijns=tY|(OYGk?=EcwbxD zjpZU%l?E^P^a}Ad;>cjlE5rijLDl=9#y(ylb}O&0xIJwdtmHXyqWoU9c#7a_fc(;G zQKz`}_O;^sfG$0+R%|BT^_XxyCAgj};On`z&bJ64vo64MDkbeqJ!n`+4CHi?ON`;f1{ zAb!uY&$SoDZe`E9HjB-H#26*#Gx2qRAa>zpafFA?g;&H{#ZAjz6{D53TK$@MO&MA2 z5Q_tdF}kVq4G}*9_zA>Mklgu3aPoh!Lo0N8_QO(L2)lQwE||HO>O>a8yB7WxwoI48 z0+;Ec+2obFP*$}Df2A%%;C!X7gdJL?i)9^4btdLmhI2PB!!CXWvJyTwuL_AbFGqgM zt8_nMmbH2$S%F>4GVHG6#4}gu!q_P;*H)!VWtJ+O_AKuXR3gc#mH5j?f;amWx_EYe zxlT`m1(6w->26~KW5U8%*h-v*w9!-$0$A&E-7?Uz@TIyK_PZ6jNY=yop>RcRq)t%& z%t#4Ux*V=}C<|SQy5K5fS?E%<#yYM&Y7oYCQRM1b$Z{M*;t=*VN86Y374gM=uwJUTz>})_-2xk?_ENgU=*|RmeVs>G*ZaUXKlx^Z%Y}NR+YNaljh1DR5qW-&F zxPzntL_U&0LM$ef*cZ8nx==GB&S4R>(lx^>K-1`>K&2&bXJ) zh~-?A#hA9O)ZNVnYINo79Il0i36#~Z);;dk38_N363N`87G|!|rL#1y@s%~`3TXZi zX66Q0=oC$^tkRXS%~iT!*}PV_>TmF=bQ)sdQ#Pwv9|IpU&jNi++=pJX3l(ZR-CUyl z`jCY$)WB91e%TKfYT+6ccKhMgTG-1{5DbMr=B--z7wT+_A3m*xm#DDA55ppjYLzPd zwI9yZ!aq~t+#;WBs}`2~ zY}dm0$fx`b_~FA^I7Nk1AN0u{)WVS}T^3+JnF zj~_m*g@aUBDDg3eWg6ASsIb`&XL9%jb-}sIyt91ke}P%GaIgwjs_hHRu7%H5d1t@u zhYxGvb`?JEhX=LrIu#!B!^Y(r)uyX(>T<7;7uYN<9IL`}{cyb&9$4y~waE|f*TM%? z_@E#5XyHvNJm81JS7=n5tHQA>e5w^{;Zzl#?uS=v;h{?JtaX04RSO?i;dVcKS_{9d z!e{+3RBKeLRN>%ipK6&}I9G*p{jgOF2di+UAGT}ZvrD{8U-rX?wQ#!%ANRw9T6mob z5BXu^N{!~zRXBB}PxDz?I97${`r&#lJh0e1Ym*<|uZ0h)@IgQ9(ZZWlc)$;buhOVC zSA}C&`BW>^!l^1e-4CzU!b6L^v)1|HRxNy7h1>n`X)XM+3ZM1Euv(*9r3weH_NkVs zg>zLn*AH8@aIgwj`eC~kKD*G%^kqMMSPQqS@NqvpsD;<5@Q@!i)@U@JuEMD`KFw!o z;aC-(>xb)W^cirH?dMb{)wHI^mRDC+^-Mj$2Y0tO>94Bw?v&kdcnSF1Ea+F48+aL z|9s+`SoqUuzZ|uHaKWwG<*-78H~6@QJ$x%1r%s!!j*nOS7PargH;wAIkLsUN`#w2C zYF}lyLGUq(eZ;GPuRn8C-!`hhZ&d&6sJ`&%t^6jB>RXil-GboLY?Df$YUUqrA2l8a zthrX708Zwt)lUq6Ql%eKJ!^&RsnsWf)yH;d)O7#2Y6!qhwKb4QIgG3z?q zULQPHg$I1j)MQ_$$Ilr2gvj=FWB>L`sAu(J=mu$~C^m@!p|Th-ZdzX8;sw*QGuO&L yEf`lDll;IvrMXk?PtQtUAS_ key then get (searchKey, right) else SOME value + fun foldl (f, tree, acc) = + case tree of + LEAF => acc + | NODE {value, left, right, ...} => + let + val acc = foldl (f, left, acc) + val acc = f (value, acc) + in + foldl (f, right, acc) + end + + fun map (f, tree) = + case tree of + LEAF => LEAF + | NODE {key, value, left, right} => + let + val left = map (f, left) + val right = map (f, right) + val newValue = f value + in + NODE {key = key, value = value, left = left, right = right} + end + (* copies non-blank pixels in value vector into acc *) fun helpFlatten (value, acc) = Vector.mapi @@ -45,14 +70,28 @@ struct else valuePixel) valueYAxis) value - fun flatten (tree, acc) = - case tree of - LEAF => acc - | NODE {value, left, right, ...} => + fun makeEmptyGrid maxSide = + Vector.tabulate (maxSide, fn _ => + Vector.tabulate (maxSide, fn _ => emptyPixel)) + + fun flatten (maxSide, tree) = + foldl (helpFlatten, tree, makeEmptyGrid maxSide) + + fun helpChangeGridSize maxSide squares = + Vector.tabulate (maxSide, fn i => + if i < Vector.length squares then let - val acc = flatten (left, acc) - val acc = helpFlatten (value, acc) + val yAxis = Vector.sub (squares, i) in - flatten (right, acc) + Vector.tabulate (maxSide, fn ii => + if ii < Vector.length yAxis then Vector.sub (yAxis, ii) + else emptyPixel) end + else + Vector.tabulate (maxSide, fn _ => emptyPixel)) + + fun changeGridSize (maxSide, tree) = + let val f = helpChangeGridSize maxSide + in map (f, tree) + end end