From 08ba8b64211885e96533460d440202b0af0bb3a0 Mon Sep 17 00:00:00 2001 From: Erik Corry Date: Fri, 15 Mar 2024 10:36:16 +0100 Subject: [PATCH 1/5] Add way to improve performance by using more memory --- src/pixel-display-impl_.toit | 30 ++++++++++++++---- tests/gold/rounded-window-visualized.toit.png | Bin 7342 -> 7277 bytes tests/rounded-window-visualized.toit | 3 ++ tests/toit-png-tools | 2 +- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/pixel-display-impl_.toit b/src/pixel-display-impl_.toit index 4e03e8e..1625267 100644 --- a/src/pixel-display-impl_.toit +++ b/src/pixel-display-impl_.toit @@ -77,6 +77,17 @@ abstract class PixelDisplay implements Window: inner-width: return driver_.width inner-height: return driver_.width + /** + By default, the display is rendered in patches that have + a max size of 2-8k, depending on the bits per pixel. On devices + with a large amount of memory this patch size can be increased, + which may improve performance. + During rendering, the display may allocate extra buffers for + multiple color components, transparency, and clipping, so the + effective memory use may be higher than this number. + */ + max-patch-size/int := 2000 + // Need-to-redraw is tracked as a bit array of dirty bits, arranged in // SSD1306 layout so we can use bitmap-rectangle to invalidate areas. // One bit in the dirty map covers an area of 8x8 pixels of the display. @@ -527,17 +538,18 @@ class TwoColorPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: super driver --inverted=inverted --portrait=portrait --transform=transform background_ = two-color.WHITE + max-patch-size = 4000 max-canvas-height_ width/int -> int: height := 0 width-rounded := round-up width 8 height-rounded := round-up driver_.height 8 - if width-rounded * height-rounded >> 3 < 4000: + if width-rounded * height-rounded >> 3 < max-patch-size: // If we can fit both the red and black plane in < 8k then do that. height = height-rounded else: // Some multiple of 8 where each plane fits in one page. - height = (4000 / width-rounded) << 3 + height = (max-patch-size / width-rounded) << 3 // We can't work well with canvases that are less than 8 pixels tall. return max 8 height @@ -584,17 +596,19 @@ abstract class TwoBitPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: super driver --inverted=inverted --portrait=portrait --transform=transform + max-patch-size = 8000 max-canvas-height_ width: width-rounded := round-up width 8 height-rounded := round-up driver_.height 8 height := ? - if width-rounded * height-rounded >> 3 < 4000: + per-plane-size := max-patch-size >> 1 + if width-rounded * height-rounded >> 3 < per-plane-size: // If we can fit both the red and black plane in < 8k then do that. height = height-rounded else: // Some multiple of 8 where each plane fits in one page. - height = (4000 / width-rounded) << 3 + height = (per-plane-size / width-rounded) << 3 // We can't work well with canvases that are less than 8 pixels tall. return max 8 height @@ -617,7 +631,7 @@ class GrayScalePixelDisplay_ extends PixelDisplay: max-canvas-height_ width: height := 0 // Keep each color component under 2k so you can fit two on a page. - height = round-down (2000 / width) 8 + height = round-down (max-patch-size / width) 8 // We can't work well with canvases that are less than 4 pixels tall. return height < 8 ? 4 : height @@ -643,7 +657,7 @@ class SeveralColorPixelDisplay_ extends PixelDisplay: max-canvas-height_ width: height := 0 // Keep each color component under 2k so you can fit two on a page. - height = round-down (2000 / width) 8 + height = round-down (max-patch-size / width) 8 // We can't work well with canvases that are less than 4 pixels tall. return height < 8 ? 4 : height @@ -665,12 +679,14 @@ class TrueColorPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: super driver --inverted=inverted --portrait=portrait --transform=transform background_ = true-color.WHITE + max-patch-size = 6000 max-canvas-height_ width: height := 0 + max-component-size := max-patch-size / 3 // Keep each color component under 2k then the packed 3-colors-in-2-bytes // format is still less than a page. - height = round-down (2000 / width) 8 + height = round-down (max-component-size / width) 8 // We can't work well with canvases that are less than 4 pixels tall. return max 4 height diff --git a/tests/gold/rounded-window-visualized.toit.png b/tests/gold/rounded-window-visualized.toit.png index 06948b9d6bef9a9aab6162728829f1caa23938b9..56bdb151c721538d07d141ef3568bda07814bba6 100644 GIT binary patch delta 6448 zcmai&c|26_+xXAyV+_W=WgHZWBq>Yb5K>A+QYqU>$>MY*LA(G>pU{}sn2qBpXx&v zxJdUb!W&2WrV#D|GR{K=N05<0WcVjC-HXh1Au~P5d?&&mMS7=^t~q324C$OldS;OR zNo4Um@_iBcwuCHwLxz4KV*|)2ANe(e{2WFmejq<4kjehUr%pD_3m3<^7e4pjW^_+g zOlCLovP;MF8C}y~7Gv^$RmM(#o#4h!a-&)nF8u0@D;X<%G+I8%jea!zvYvOZWV|5v zSM{BtcTqi~k<;8p-o50b7HWe|(D zKs&*ZVJCvAI;H3Dn$n=#mgl0jy4W^b_|lFHNjk@|S?UoPUiEwn`K+x$!-3@rBNg1P za|@O4sM~i{8TE&@g$L_Dk_8gOX5!l;1vnF7(#k)ZLZ+*4AJ;nYGl>L=v*Br3tj=@* z;C)}$ZAPM?Tw~wKdk^NlAgwTRu2n4{L9^I+7cg5zaIAlxfS1r8QewM_D2GF9dI7U) zksKylY#BLgg=NOc+ltuje~D?alwz0n5gg=W*ZH+!qD&4$QlM_vf!~Ywg^}}=gx!hF zvffCFybW}dk#F1#H*FLJw8{9YX7U+KVieUZiqL3j+O*LGUJM?Lp{S44QMrG+*kCDj zR~?`%QjQu%vX}1$r5-UX!l*MD+6xl{k2pe3jA!{|RY-gA6U$${$+`N6#-rK9G`>7y z9}s$84)Nq}WSj3#{Ujc2z`i4GTPDl#H(0OBc9%!&U`D7OZe6yTE*OSUSQ^FF$GbzH z0L}T!7|(kA;!x8@ApjubO#7eb$SfQ-!+eu7YvRIXDc3Lof^7cSX>4~*Jc3n6qK_E9 z!hlSMdfd_@wNB-qi;s(+N0|DObqB^(RA+lOIA7DyzIvl92-xQ4`&3sjaG(z{WDD0h zR>D_qlqF*hn(ievV}hYO4pemo#7ah9>7c1%SDE0;7($9|F3J$;?(<1nwaKurg|(5py>+Xt);h(p_4Th{hf03;Kg!8_^^9$GoM zq-M6)7BA3Hee1DTavfma)-lLsAjuB$R^Lo!hZUtt0YRafn5jBOz}U2(BPLBlibD_Z;qA+#nHh zqY9E}(iC%13C~U>9cz_GJkuNPSO6{y+FcN>-FFXr2~uI@d1Yuh&%U39PiOJZ6XvE8 zEEW^SvEMq9OewgHR9x6+>p;%4y=309B428E3rp2gDB6=G=9cdKsz?&D?t%mHbGt1A zaG&~+7Ny&{7dLS= z??&NlJH7~Un#^mH$M2N?>}k-F%><}5+S*S{*!Oyc=9Xic_T`Llo6 zt)=i4HDqnt-K9NAO6AK=%@S!8)4R^Us+&~QLcyDYcAW$d;CIu`y@(n+aRzHUYmh2S6Ra0j z=S^#A6@aO?h|Q=cwqd?0P__GhI6DC&Y+So$$N-Im(1;o8bMirc`@YO`eS!&*tuSq0 z(~ljy$7)@eItN_W>4gpe=GCoaZz+kUC#WMU*rNX2Mo9}i9jXIr@PeR6E1nJPm66x_ z|2$i8a|G=9e|R>)bW`W2E0K6cl<&)by{Ej%Z8lqmZz+xZEy!MXT3R5MaFN)1KMpCu z=`R^!p2ZVRw|zk5Y;lE$kzAe7MC5_13C;%+@+z>7*|Ktq79Zj0;ZKWtX1CdOk-ex} zj|F6i+crJZAXO3us}qfTd3}f~Tfpmyb*(B;gU+|ld#-d!P>3ZPUp1eQ*dBG2pHG0p zUr?$NB*7~;%j%J8+hE9H74Et)kiI}PUrV(!G+@hfgwzip4qJvTJ)wc)zCt;(gk}w# zkM}+MxtuHyaln-pn~{5@H^e_Z9`x#($Q6%W8xi}sqPsJ}<&|g^LDVdGD_58^`b(A; zga4@?lZ0yu#~eHc#f3c3Wk1Wwf;}Xe43Jz?9X!3|)1g!6ohy~w*G8za99aXt`f*W;{X7w!u&?FeCeXPUxCCOxjPA;Pl&9U=g{X4S5wks=IJl6l!vo~ve%6;Q zn?X~xbnGnM^c>`PY8_(pIt@7|!Z?=@qBzA@AV6SrMvkiia{FtD{x*yfE0m?(*SI}J~Sx?z5fmi*8vx@J+stw6>fM{V=mm!c)-tIbKdQI zsz_#e|EYOXa7a1Z)eDi3!x78+? zSBmXEh!tZY_|+gLY707Rg=sa~Z{n6k`thsN?yH7vS;h=F+z8hIqpniO5P+p20G{oZ zdU+23Kp^puNyT#cWw15&94hb3)mz~zV2nBe1TbVMbo16wUmPk8qLmJrXsdvxS9@QE zh88bl`f`s1g%Yl~CBs-rxLFMWuw?K*Zqr(TLP#e<1OUK|wP^pfCvp<){>Sfls<6+> zE}|31H(b{fs|yxO$<{PE1z_+r2))^w{@a^a`~RfZEC7F$QO7;nvf%CV06-(V&v0QE zT{#QhC4cXe4Nn%*6o|itH2?RJq%1A#Y*J$zs+rpy4Da}N%RKJ}Ed@EuitB7&TvEyW zShsfv&+}y#x{HT@bb6uKR6%t_Gn`6lmBPMByrZznv5vb zkPOr9qIdbbZpo6PR#r{1QW=+yDqT`mSB_(=J1!k*J}X}#WSw$O|ASD!=ei*KVi)@5 zyja&E(W>ZHUoKBS^jSM?sLMK#{Xv%Uv`nay{#L|6%GTXsi|`wILHz25JC?U(1;S?9 zO*r^C3Cn8w1(69Ryv|<5HKB-f-5^Kj!3}~(f>R{-jqNcls=J6w1F79W{fU!c)zX7n zG^<*N0f<$guN+RMLFUxnJlD3(G;>?#@0iHYdtZU$EtMJ%S|`={)JMOpXo{3pdW`>eIC42ZYIO<4gsrs!v)e(7L zpP=#>BBh=}N%j-=#9it2Nd6*h2cHBGQyKEH)QRtm%Zq9m*#%55_t$#WgUQb$k^&Qk z`xx6;qzJa1_H-+S5)m=?ct?RXX$=5qQ*rm)F7vs~t0wfkloDw+CC8z|X}$|q7(57U zj90AHQuqX{yuMdtfi2%FHXciHaRLW+ddVFw;f<*pab-V)w?3yb>4x%(CfaOJnhq3Wxeuf2-m$9FF7 zs3#I7MYhcN?C*{|eJQs^OZe0w?xE&fY^q7ZhqXU<-NS=Kc{u zCVXtRfjglPc=>!`6@%%8eR)XJSgm*3sk>PRj=De1Q!BC|%xz>tEnyRa6M>L82VaC9 zzc}DdqtqNItCX+CICowzT{b)5oJ^x>(#1wLxKlJ{ol_+p1RINfBZuNeyk%v06CWIB0*?Di7D?NEh>ebx!t+U*YNYJ26*ga(2*l#EcJ# zv{gX+aGF2j!=(GmE(!J$#f-xbgP$>$US{n;$_Yyw-ABB#cI>G2E8{w*$dWhAaI`wB z$@(g$w}C@ZSbfexn)goYStdlqZPYD3t5~z&W;AdaN01K0s%}s5)W(}^Q_Rd|PO*|= z%p?=0?!I&{;06pn^cLAUs-n29{KZt}LQgG)gI+WX{;94prQy%Uir|;6CaR>I{yVmP za$s?nqLW|esr8$oU~H!12pp-n*#O#szV%C9<$bd=S$5m@{7$r(j>9-;>F&v{^zqaB@(^vSYJuB5i-A zUPNEXF?I>BAS?tVx}%Lv36hAXm;SXMJh(jR^t;f20V=a{E=P1hBQKI`cn&L8CmKd9 ziV_{)Ap&9qc&%BH;%Fd@WjN*&T5BT~5A=WiP!*skt+R%yZmS_B)`r5G^(i)VPtsq0TKO@Ax0xfz1J5zOruc69j_p^zY&%-4 zvWq_dUXiv?(;Xbje49CgAjR&T?ctDC+P0;krmYl2TL#|+@n0OG7=K8NNm9KOLWio} z*BrWc*eXu3;}^N+shz8H>Fi%W=8-#eBRxubTHrxFKl{9fa3qudgfu5RnXk(tHbIKX zALX;*Ra^Zb)L0Phx~1Hoqg7}BgJ$T+6Km3D003z;j3K>Wv0wCVC^Ktpv zEvu2;$EYmeA+x{NX(8t!0S&7t`(fAhh}pa3b{$7MkXW7nnwxe{06r7-Fq`}!=aQFF zJ5QsvL#acldvl!YW8-_J@`Vl6M>VTg>nZL&=2l8pbSbc>-H{V%>9Mih3Qb?THZa;V zF@9|wTRApxaBzNjHBjkN%_;jf;<4cX+y@32Q{0TdC$DDL$~LP!D7L86qUM+4F>l8c zP1tW`SRgfRZ!0dTAC5Eu70kVlT&AgLuFWib9>~&HJd~agIzlSKZ!W3Z>+!(oYbfKk z<*7Fvn4K$Y)n+ODNx?a0Fn883@sNyTBj&<*;#PLCg$Q%G-nUkswN0@Da}D%SYLL#i zQ?*JLQTY%fP@}+#(k^*`QRtm*t!Q0|!jKFlr@7tD$sGLgSpEQH%u&|=7Q%j~rI5Z-B}q&U83;a& z)Ckf#5DMIpUOTaU3CkE^=1FiwA6p_+-oZ_5D-|@5SD4^6o9<)QJ7*zM`R@^G9imkh z1l!^OS~WECeZdwcshdiR5>*P8r1bNIbKlz7e;RMv=te_4^s2M_0iq=$S8)?NQi|4n9 z7A`xSVp(E|fhw!~RJ1feJba93eoz^#{~iu%*LNVQS{iJDp#u=XVWpwz1quE(G&Yp@wZKS|ikMj=5Bly==C)kCu65JytPod%pIn>vBAR2cwdn2ejEh{S?*9xlaZ zB9__FKzu`JJ7pr1<_lvaZC4uVUg&2T6iNA~6Bk$pv|A>3b?Wvlx~`3Oz3FcOV+5RJ zShcapwyEjumD^H?4o@=>iW7~4Jp?8E_S;xfFinm?-W3Cz{6eDpuf5&%^x4k0*g?qg zb7a(CdwkaC3xBRZo6kAqA`*oAwz3F4Gp0LOAJ5p3f%O5FulsYNg473gKHc`plfbNO zMAWVE=51d^@Rrx)IWYQ6mvLS&2ce*iS7=RA11cdhe*C3P5qW-thQf>hNwh;OCGn)p zm%6E`NXFZ#&1~#C@KrH|%vg_I$HqQKQ6vfg)auIj-|Qk_KlCM;C#13(o~p0!)?D+L zgta@n)t1DE6moD1zmJ0a8oDC8K?tYCccBTx&soB$3u;|~hxJ<+cn5l&XaKkaHp2Jj z7}53yvvCfqydw4_pjNc(uuh2#4sY0djt>=_r^HCcs1vSokM76&n-Qy!!hNP>8+`$NXbJ44RYTO5GehayVu$gf(#gfRt#vFYz#|K^TK>${!1m@f$gm z5@6mbf4TnLyn+63k6AX8M(`nI)?Tru^okiBHCajeig3jdA3Y*mC!YTEuhBY&*}Qjg ztNXEmYHa8kfoIJrDn`Ar^iO^N=7nf_jN0#W^3=x4IlV(T)2THx%Bx}^$NZ_83?_8t z0Zjk-kzvR|^HMdG0W|!2RTkZSjj|JyEs{6=Qw_`r^tZ1rbRmgtTl2iNX8_vS+56CS zD4^bXe;4(1K`nm_+S3(;c0Msw=O+@XK?!_-K1=-MjX=JIl0}l1Qm10Rr1^-j_sQ}T zJ~v9Yy&~bpw^r9SPVf4%3VEB^i@?_}yvyT1sq78VwbmouiTS3T`rbl=#6dx8b34irUSY zKP(yI_F9AeCw+q3MEsjQrXZ6{dI}0jIi5%A<&!J*CXF=Dc1JX?{PlFAtZ+L2`P7@)?#PtUhObLE8<%f>n1AqX zDJp5GmEN;ZH1i_P0U-@d^hDPWJs#-0Q$3$tIr6M-@NwZx-jj)nf2Il}*i&Ki-I4v1 z^IehiT@gR}?sT&g>KE=Y=D%~h8By~c&&S_Q^+eBgMYb(RrgA=|PkwkZRrYb{@%!PN zu%*tq?#Sm8Z|UsWyvbLkoZRM>=;xDfBiU0?i|s|zc~2)xAC9sZA`9PAM!r^#KI3*r zMf6R_VUcop2YaC$0Fd&G(?HHZJOQNfP`tPWh$sr_|dqG_`wi2k4*sI9_?gStb_U$#J*=+Jq`;@lx{vfxE7a}pi#*Nog z(@7m?LlT~~EPuL(Aij$Fl4Y0(94ft{(5Ur5bnD91AAYS`R{moup*fXQmU*RGjf(KKzgMdQfiLUhdX90LfO0mtK-$D zM6;qcgRZX-v&7@0(liej#7Aid@FhKKI#QOl@Q<?aB?&=H7^1tsyT%FDUnxy*T32Ywn!n1ss0g zIqL@8yH*X0H`^UP(lh`^JAmx-;QN6aEI8W(fc9a!Itf`xDJ+*Q3zk%(1=Bh^jw7QZ4TWl80)Gr$ND%P=04GXxnpcEKgQRy6&umCg z#MtC3Yw(C&+y~57WbeVad5k*L2LNGI(t~ly9?DzZ`%E!EcZ7J#3)gAm_uF8#yCvR$ zBRm7vV$+)RnZmB9X+qC|f$G+W{R$C%<_5_2}WCRwXHOWCxC;!knd2BY^B-6 zUIg1x?T1Cu0s2W0$`;+$P;HMnDs#2bi{8&J+DRM=mUqdH`Fm4|i#Jl6fGQ92!i*SW z(&@qXxZPjq79^JqyHw{4D}>1kLWVk=8NfrcUl2T+9MmC}`qJjhI6Q}6$ay}O>Xg!URQmdHD#7&vtj4~b2m^b1O(Z}~wLsH76=Iif>qSHsqLsRbnU-31@Q6g1!MMVntQUObQo22>Cb zRxyyETypQ3dGlF6>zM&9ki51z;)x z{RE10!B6aw*n!D3A*!{ORV*w53^Dz!lUU{*{Y{cYp=gns;dw2UJWAX< zY!l*BXc{VT7nypuUcU%%JdE>e<1{LW015;%D{ew@SNik$(&nGYhSGmS8~-n~8R2cEe27tn?^4BI^+(+q$Vs;*srsFDA0A{GF`>6God?nvH88dwym zGdxk+$*O|An}u5jAEVKg!3Ycu&@A!0fdufCv?hJiTP$1B8(wYl#v9g8BGwEc)1D~_ z@c0icaiWlfaLw_J2oIe1N)XalQs_tiL&Ody)};urJ~yt2I8`2kZGxp(&Oeb&Cr798 zNS&F>Ug1W@w{f+GXBzt1W`8i#FP#v9g<2w%uGKWuAr65XSmzVQJpe47d?VBUvT28e z9A!I;idyDnW|loU?D!Y7{`lSt5XsDRmd|vS7RFwWh{A0f34(YiQE)-KBSrqGn%~YW)Y%8ZCAPdS5PI z%1{awQVbvQFO+4nySGzB1lqMllyT{+$mx2RG#20nUb3=;s@3__NQ{ga9rwt5*|BsB z_K>5{kA+g&+|2Or3I?3ZZ149bmUcTwZCzCzBsGnCo<+V^c~$rv_T0JyyqpP48&+j+ zmnJ6JHvyUp>Jw{12!(dj9L!i7JT9sUURFj-8>VOfc>xS?M@ShX`-3cYr0t|6-vtga z`Fp~Xpfa3`@i`VkhxGmK6e!7pUkj~h$@`{NK#OKe5|SP z6^n=(LyqssRl@tn?0-0}*PPld$haV20V2g?VKk{dcO8*@U8^K-S=*DiA=WWFiSum* zmu~H`^b981s8aw09t4m?IMUug7Xbitvg_)~+KfS{qtY}#UjOmHC5@Y~j06mzDL`j4 zrz4M#PXfxgBcE4x14bXev)t9$yoQT^?BCG2krs)Gqa!y!Xxc*niKoE-*QTQc@N1)^ zqyRo5jOUJc#E7<_`1AkslWcF0^)ruspG#f4EGVt}PbTHB6eG|?5Ln+}e$QBs|BFtT zLH&ENZS^tdpr7RrQW(7u?^=T^DRpN>#!JmF(`Wt3KZDTtV*hJVPA>84>XYG-WTO7L zMIY3!l$nqDV01+T0H4}tmt$`1Q`#e&ny`3}pT$e$@7rRYOZdzePmqjl%;%XJi=DG} zw*i9CqtmBW+BzW|f35h-I^LLT$y4RmE-6aWf$b4#=d`S>AQ0-BTBRrl#@m%0wGtCs z39=gX*d~2XLo#^+J5jww`{01{t7kTd@&a>!&Gub!?BOgr1-pu#h(}#JLM-dLfg2NB z1^0?5oZma>*setKX(TwisQDB`J>{W1C>Doh#>5sOa4RGKkH|Sj5c5HV>eozL>X?|i z+s-KJj_npf#eqhwa+Ac_&2F<^h9R6^_{20EoWXgM4_&y>yM}TJgYnTl(!F{KEp)99 zR!i-287S=!d9>WI+p}#MXQcp86`RIbknpAnEl`Y+*tXnH^^G?l>TvfL%VeDz(4fhV z`vmQ#z3|mlowty64VR;h-!`BHP`WBnJJiuT;#@_}q5S$U#j!-JAU6PZBI6^?jmf5k zljiaI*E6y#pDj_|yvtI`Qk_q9kgGvmrQlCvF2&gHH>Mrs&AR#zGx?7u(y2%0p!Mqg zq_8!t=4SDV+Bt%&P~1&oUoMQjX6Cg6^c!a`4H+g&AR*hKhW}Tawrxs&10uLtO zoGIAsC>N-K-3St@z)xDT?EnCS1T*%jfq8l1o8`AbS990H9zN8UQ;+6IL>TC|)|^Lo3)NzKu_#Bs!PoZ$SptdR9rs!&x1ETn27hFH+U+EOuGl~NvacSsrCBZ68ewz0IVi=A5t{u}w6zM^>zFFP$x-TglcAScZAu;QdwS%v7 za!DakW#{pqh!1jrG4U6Z2+D(xVFjNrizn)krH3v`0%!IU+YR;$6p>})NQFg{oPJKt_iBL^8G-7k@w)>{} z?CoxrV4P8$Ggb+nJR$@Ym^7ZHcibz!O1BxJ^genGdimE5pqw?*Z;9G0!trp{tq`Co?O z+!te;uO6Gj3)J}O z3?Kk&;`p`+y>_>`+)LI7A<)k-M738i79ZjG?Cr;CEEnK2d=wb?r5qi%=ZU%FCN-x!h6F`(Rk z^hExW!YOXso%P!1cQILf7(rP2kYZakFxu@ZjQ*C;bKP48d8)jfeO(-Bl^i&hV-MHeALUsPV=N=FyP@!&wHLlE5Ws9PCPJK*Fp5N>o9~IyR=rPk z6=f@)x$^%cytMN|o{#y6us`GOP?^exIpx=R51Pwv^;3chG!2>G?K!=2=z6)AsOZNM zZCVy{s&cgC_&0Oq`R0QN`rSvjS`!_=J@QyYDC|*p_>TT0H-JKB8q@z=3&jN$thQyC z$^cHP__RI76Ho)y&|GMfsvbcAk4_tQdOE7B*7pZzSB1+(5_y7c^vzy~Jks!wRZmqx zj(JLO`<%B!PgZp+YV}57fRqKwjrl=K_B)?AsD!g@Ud-S6so9rI`ZeofZ#VfeLb6c_ZQZ7YULW!oveY%KysI z(x2Zl&PoFSG16(0_qD!Wb~KrIwXslRPsmR-btgg=0imTUw1G3uO?F9*Z&FnHUdBO zUq5T8d;XPSz9ioIi!X_k$h=ahv|iP5;h4!*wYnJT^)y&#>V8u!v2tZ?%cBNW6R&W~ zKOx(cf$D#w-D>&i{sBB%yJ=$2HmRG6+VIEj$d%84{I>{vqOQ#6Rk-Sm z?>8UHcs~2jO56Ki$}Htv=b)TM#y^rc!`^+U_=WdV9jAnn>y*N3(+U0pHs zE)=8YN!GxoK~B17L=OIl^oz2#`zGyL?R(k(t_MAX=E&l7y+izx{SD_G4Z4 ze+h?2f+tb=MoYMYL|`8na#$i9Zo(;0qD8l+GQz3%p~_7}SA>(15Y#&(=6)@4ENr4u zp0zQp-K2>w_0_uD7o2-+1vQyEdeo4AW+_FOWU*He=4|#P#>@4qACh~z?VkA zD9WtxE$a1tYP<}itc)-e@Ku+YFS;jK-XT)a_w>M12rMRlTnHv$ggx8v4_Ei z$|ttvZS44@q_Sam=a}XJdUTm2fASc0=oh7g)3X#L-V3VaK{#oSIkD+2zFK+C=YZip zT*a*8NW(^wgy6`T7=DLx000~v$=J^ytC~tP^oP7yCW;El7r(%T)Nc#7(R@>Cz^6z& zK#p{BR6`s8rMKdCdAv{m-H^i2=27gOy)oVWbTWgkzAood3_3aMnP5}PJGmHpgG_#b z(1|BCXX%h_T$kh~=pw(dLL0N>>Ys1wU4HSgt-n{FAmVRHwxQoFoAiFFi?Q(tcymq8 z6{m}=tQ4f~P6jIfBhe`<)7ck{zcYk{ev+u|EpDvRZv)}}zw0J@@?-Pl->WBFE>2I% zU~whNgr{Zu90Q7v-$y>xg?4uti58%w>Ag-EvfN>~*M|>jz6t*Sx|9FR$p-!{(eN+B zj}OUz`Zh2TNTdf zTzQoP#hz`de?ug*;Zj&+@cUW@zvHddl5P6=PN-87#Q;I!`qE5+lO`3Z8XBvEDM_2g zPWgn4J%ODaT|kTbcs%6R3B3_@a{;?jHV(F?2-e`{G${yi{$N&W$tLr~g-V)DJ~Tr7 z25I0_NrA4%YIY5hj4W+MK3#1OQ=XNd&*S=nA~lEznWUKld0|x}9dazn7mWJZvEZFl z121EX_vZ6FMJQ-9TI`#nITet7{F)xA`?gkm=6oAuK74WgbbShr^ixr(c+-ZI&b?bb z`DXVrY{Ik%hbNM)7mPj|4Sq?HiWO4C9gB4aF*|s~V?=!>`GS2DY(ms#8eZfT^ZoLA z|5F8?XV$3<=ksiubhf4*lMhxp>0qzyVXEA~*7c`g`2y?Aq;g3&@QJ-Ii zl#Hj(9^J5T!Uk7*c>%pSR%zX~D*cF&yC97Z422@1-~zb&#UXzK_!?8dX999ZMWQX&o?0<*3!Oq zB+8}Xtfd?S;`elI8IQyPfQ(MN?kJDSfgbH3x||8!TH%9t!TcGs^#I%U%Sg8e=5&m1{EAMK9!`d!Ma z9+?IY^%D4#uXL4VZcHeZg!VZ(Y4-i}Vd$-b<0yiZgEr2c5e+@rmRW26>8Vb3v=asyuAR;xWNklc}v||b7 z+oJ%`=je1hu1@X&4sCPGz~OA@xtPKMT=+^>fX4=%pm|g_E0xdh>XmrXV1T5t^jh;p}&^tw@m)9F%iEgLd-+U@cN`Fagg>(`!q@@c#G|Msvl`ZYjsUE00! Qb$Q*t_psS>6UWg10VbAWy8r+H diff --git a/tests/rounded-window-visualized.toit b/tests/rounded-window-visualized.toit index 1632cef..44890ad 100644 --- a/tests/rounded-window-visualized.toit +++ b/tests/rounded-window-visualized.toit @@ -49,6 +49,9 @@ main args: // Window-relative coordinates. text.move-to -10 7 + // Larger patches. + display.max-patch-size = 10_0000 + display.draw driver.write-png diff --git a/tests/toit-png-tools b/tests/toit-png-tools index ee472ac..8387669 160000 --- a/tests/toit-png-tools +++ b/tests/toit-png-tools @@ -1 +1 @@ -Subproject commit ee472ac9d4333a138206f9d3a817d3c5432d6f87 +Subproject commit 8387669efa33a7108c746dcb19dd5ad0ac8f89d0 From a72d9751f4c169b69d935d861cf2724f537d2b37 Mon Sep 17 00:00:00 2001 From: Erik Corry Date: Fri, 15 Mar 2024 11:16:10 +0100 Subject: [PATCH 2/5] Don't mislead with a default max-patch-size on the member variable --- src/pixel-display-impl_.toit | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/pixel-display-impl_.toit b/src/pixel-display-impl_.toit index 1625267..8e80799 100644 --- a/src/pixel-display-impl_.toit +++ b/src/pixel-display-impl_.toit @@ -86,7 +86,7 @@ abstract class PixelDisplay implements Window: multiple color components, transparency, and clipping, so the effective memory use may be higher than this number. */ - max-patch-size/int := 2000 + max-patch-size/int := ? // Need-to-redraw is tracked as a bit array of dirty bits, arranged in // SSD1306 layout so we can use bitmap-rectangle to invalidate areas. @@ -208,7 +208,7 @@ abstract class PixelDisplay implements Window: that the display driver is exactly square, a rotated orientation is used. The orientation is rotated by 180 degrees if $inverted is true. */ - constructor .driver_ --inverted/bool?=false --transform/Transform?=null --portrait/bool?=null: + constructor .driver_ --inverted/bool?=false --transform/Transform?=null --portrait/bool?=null --.max-patch-size=2000: x-rounding_ = driver_.x-rounding y-rounding_ = driver_.y-rounding height := round-up driver_.height y-rounding_ @@ -536,9 +536,8 @@ See https://docs.toit.io/language/sdk/display */ class TwoColorPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: - super driver --inverted=inverted --portrait=portrait --transform=transform + super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=4000 background_ = two-color.WHITE - max-patch-size = 4000 max-canvas-height_ width/int -> int: height := 0 @@ -595,8 +594,7 @@ abstract class TwoBitPixelDisplay_ extends PixelDisplay: background_ := three-color.WHITE constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: - super driver --inverted=inverted --portrait=portrait --transform=transform - max-patch-size = 8000 + super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=8000 max-canvas-height_ width: width-rounded := round-up width 8 @@ -625,7 +623,7 @@ See https://docs.toit.io/language/sdk/display */ class GrayScalePixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: - super driver --inverted=inverted --portrait=portrait --transform=transform + super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=2000 background_ = gray-scale.WHITE max-canvas-height_ width: @@ -651,7 +649,7 @@ See https://docs.toit.io/language/sdk/display */ class SeveralColorPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: - super driver --inverted=inverted --portrait=portrait --transform=transform + super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=2000 background_ = 0 max-canvas-height_ width: From 1a2817a50e87922b9aa24a45a49c1219c911c0a9 Mon Sep 17 00:00:00 2001 From: Erik Corry Date: Fri, 15 Mar 2024 11:26:30 +0100 Subject: [PATCH 3/5] consistency --- src/pixel-display-impl_.toit | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pixel-display-impl_.toit b/src/pixel-display-impl_.toit index 8e80799..4f3189c 100644 --- a/src/pixel-display-impl_.toit +++ b/src/pixel-display-impl_.toit @@ -675,9 +675,8 @@ See https://docs.toit.io/language/sdk/display */ class TrueColorPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: - super driver --inverted=inverted --portrait=portrait --transform=transform + super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=6000 background_ = true-color.WHITE - max-patch-size = 6000 max-canvas-height_ width: height := 0 From 0571f303f62736f5db8e4c8eeaeb18b6be2b2a9e Mon Sep 17 00:00:00 2001 From: Erik Corry Date: Fri, 15 Mar 2024 11:31:15 +0100 Subject: [PATCH 4/5] Add comments --- src/pixel-display-impl_.toit | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/pixel-display-impl_.toit b/src/pixel-display-impl_.toit index 4f3189c..e4bf137 100644 --- a/src/pixel-display-impl_.toit +++ b/src/pixel-display-impl_.toit @@ -208,7 +208,7 @@ abstract class PixelDisplay implements Window: that the display driver is exactly square, a rotated orientation is used. The orientation is rotated by 180 degrees if $inverted is true. */ - constructor .driver_ --inverted/bool?=false --transform/Transform?=null --portrait/bool?=null --.max-patch-size=2000: + constructor .driver_ --inverted/bool?=false --transform/Transform?=null --portrait/bool?=null --.max-patch-size=4000: x-rounding_ = driver_.x-rounding y-rounding_ = driver_.y-rounding height := round-up driver_.height y-rounding_ @@ -536,6 +536,9 @@ See https://docs.toit.io/language/sdk/display */ class TwoColorPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: + // We have a somewhat larger default max-patch-size here because 2-color + // displays are often e-paper and don't react well to very small + // incremental updates. super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=4000 background_ = two-color.WHITE @@ -594,6 +597,9 @@ abstract class TwoBitPixelDisplay_ extends PixelDisplay: background_ := three-color.WHITE constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: + // We have a somewhat larger default max-patch-size here because 2-bit + // displays are often e-paper and don't react well to very small + // incremental updates. super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=8000 max-canvas-height_ width: @@ -675,6 +681,9 @@ See https://docs.toit.io/language/sdk/display */ class TrueColorPixelDisplay_ extends PixelDisplay: constructor driver/AbstractDriver --inverted/bool=false --portrait/bool=false --transform/Transform?=null: + // Since the true color display has three pixel buffers (one per color) + // the patches would be excessively small if we stuck with patches of + // only 2k of memory. super driver --inverted=inverted --portrait=portrait --transform=transform --max-patch-size=6000 background_ = true-color.WHITE From 5017dc92062fcdc19459b0fe9991438a8433086b Mon Sep 17 00:00:00 2001 From: Erik Corry Date: Fri, 15 Mar 2024 11:39:41 +0100 Subject: [PATCH 5/5] Remove rollback of toit-png-tools submodule --- tests/toit-png-tools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/toit-png-tools b/tests/toit-png-tools index 8387669..4d393d2 160000 --- a/tests/toit-png-tools +++ b/tests/toit-png-tools @@ -1 +1 @@ -Subproject commit 8387669efa33a7108c746dcb19dd5ad0ac8f89d0 +Subproject commit 4d393d275d16ae7f65162fa5121a438cb9ca4083