From 34c0c5cdc610ddf5a1d18a987f9887c745cd2b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sun, 26 Oct 2025 22:36:36 -0300 Subject: [PATCH] Add a few more tests for font and text rendering. --- .../eepp-editor-monospace-tab-stop-test.webp | Bin 0 -> 9264 bytes .../eepp-editor-monospace-tabs-test.webp | Bin 0 -> 8896 bytes .../eepp-text-edit-tab-stop-test.webp | Bin 0 -> 7358 bytes .../eepp-text-edit-tabs-test.webp | Bin 0 -> 7264 bytes .../assets/fontrendering/eepp-textview.webp | Bin 0 -> 24540 bytes .../assets/fontrendering/tabs_test.txt | 21 +++ src/eepp/graphics/text.cpp | 1 + src/tests/unit_tests/fontrendering.cpp | 136 +++++++++++++++++- 8 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 bin/unit_tests/assets/fontrendering/eepp-editor-monospace-tab-stop-test.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-editor-monospace-tabs-test.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-edit-tab-stop-test.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-edit-tabs-test.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-textview.webp create mode 100644 bin/unit_tests/assets/fontrendering/tabs_test.txt diff --git a/bin/unit_tests/assets/fontrendering/eepp-editor-monospace-tab-stop-test.webp b/bin/unit_tests/assets/fontrendering/eepp-editor-monospace-tab-stop-test.webp new file mode 100644 index 0000000000000000000000000000000000000000..f6ecfe1365717a4175e4f2dff508dbac77ee22dd GIT binary patch literal 9264 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 HXlVZr9=_Uj literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-editor-monospace-tabs-test.webp b/bin/unit_tests/assets/fontrendering/eepp-editor-monospace-tabs-test.webp new file mode 100644 index 0000000000000000000000000000000000000000..255403f7b9d032c3cf944a1c9a3ee0a117a6565c GIT binary patch literal 8896 zcmd6K_cxr~_jW==FCj`WLA2;yFa)DT4T&0bl8BwE)GD@Nc5iNR+-h~knqt`JE ziO%RX%y*vW^M2O)u6MnE!28pE*14|T&OUqJ`@GOpS8slF>z0WcNZ(jrMyDLV7Qv}} zxg|xt+L*wqd7bX+-W-UG$+#sAd@q+zHu8kds6vN-d1#Ga=_ zK-=EIjrWD`%Qq||_n$-l*iBA7w@PivG1wEPNM&tE;L^lUZ)EHS!0b&^T(TPhxUBG_ zd1T}6Oo*lni)Kn8!CLP8W7x0SHf~i1Sm(|_qx6DrO6rDC7`ub~Bfp-nHzy&uo71N0 zo6exvqlxxgHT!=szB2__j@vC@vM}k}S9+y2CL1TE)mrf!MR3PZQ%WQ7fZ`5}5;!^oV_ zTqLjUNg_`1abR1}m!JynS8TNr0xz)BzE?X()iHNgN{B@e0s8$XzC?j&dN9aG|NRGyQDDr zm5Cm5?wM>|RfiPMwgBl&paG*YP9nG@2AxHb0^Q}#s3`onQy53Fjy&%wFT}2XJj*V_ z5epyB*hQ2z1^hk@Z_#S^S@|9(yn=HR&kdms!g2@X7PUMzI#MJX(3R@H$|>p!);gPX zWqQS8TW0&`^W>NM+>giwigj$!I4X}WgiXAyyx0$SG>iz@%&nN;U>`H&_8LhtW&4r0 zzFCDm2$^xNuGU;a3`c(EaacoXKOfNH&ava3*4(;+P64wxFlSWt`B@a0SqFY1XlRC_ zdY3+<(JuRW>AStG_++&J_ln*()rKn?v@Dr0sjF%rd{?F+cQ^$5l}(+mfWM|HG_MDfE*A1k+8=ugnOxcazNFeI=6NYqaI^_3ptA z*>Jc$@~a=#X7T&d>FBWi)Q_t~GR*P(9TnBjp8^-9+|4a2Bw(Hbzp{dj_+~boE7Kw0 z%I1s}cb|yQ^llnk6TYoBD6P+D@3Kiq5qWR~CzSgk=i%bO+wEL|K)yYWRo}eja1;@p zSMW~wH`FbInHy0RJ<<%*X%t5^{gETJjNo}}sC2c$`-s4P|1BW8Qe-$@(PXIs^m@&W zQbJx-&f1&`?b`cW6HI@+XiYctbnw{XOfbm-#n z6~VWWDF48Ur1xwN!$9~J*OLD;1sApHCTgm#>7L5y$-adw9`v!eI54;CkRk1q;3_&R z^6iAbHXzdYkd-7OR;g#E)^VqM)m>b5fI@oJSz$WRs70{BA9wf^EkkQg<8LMLBBywt5q$p9BLM@;;RB4 zGZs4;+Sx26rSAF?>qs~!a{rfR?w*y44LN1@&^dK=jyB@9VWNJcdV2X*!(b=2*-7v4 zF7yH9O#T6jLx1${Go=$I``0e`0(`xG0GA{2T7T)_yOShhGUdEjdjvO%tNPwHVSdbX zKSHO)rcfD~>etfK@J?EQyOkEJ=bkKNNlp7o?{NI{`cS(?=a8}z-zO`UmBme=x}xnK zr}QJ*{B^B%3pAsPu8Xm@;y^M0YsepMl#!?kn->A4x^BKo(vk28Jo%S~YJo4$R-^^T zbG9k(7@d=6-+Q#^TuoxsSQHnUDnK;X6!3o3D?gnD_DlvQ8oP;jTz7S%276?m`QE1_ zUHxl=kR|!}uyf?n9ybUXY2}u1Y(u3kbj_sU8~EM##rqHOY8Ai^Nl=mNrddt%%(sr5 zI|_{cEtOx`H)XUo5l)x!NY`a$Nc>@=U(2}Dd()vm!OI}9jl)>}zj);j9?5Vd&*kBdJt%@O?#kdSTTf6{6{q?Z8PO_^5ibFr1*zF#RS5&!6; ztp(@dfIJ`JRlFZUXQXN+XBbCi>?EKg?jAPd$DC2in9xh#R+O`VkizV+o|5Xf zhS=}xd%bttp*)Tzf7F|F<~BV`G$zD*OI@bi4#<-2OhXmr&F)I?;fuCy>q+aMLA_7F zpoiM`3iQP*=S8)i${SnhAk#dt8GUm`U1LHTzOPWui4Bdd5y&-C>OB2B>OEhWupVen zSuKkHezegC(soUJ&WrZPa73G}9|ck&JD~^U@SIkqs%%0_A^gw#iwR0P0e`Fv#`miU z)89PLB0;-*no*4vD%cRGYPqArTx6QZAL{CNXrQoz1j7g~O|qTSPr2ip=+iO@q@{2) z5;!eXKcHlF5bpMCpHA#Ktdw6PM@y5@SUn{o%_pgWAYke(?;t~b>2Kk;FL_S$PvP8( zU)Z^!t7gT@nR$8kCsIlu_%?gXo~2CG!IO;bs^zd07NQPz)}yV)1M%a)>F1{D!{cr= zBBlzQN@C=upp>07pL}hBW|JJ>r#nLZpPo6YZUVM>SNVr3+Jj7aw&L0742D6*$y`nL zmX9Z5cZ_&%Ox6>H57j@SYlX#M6%qxbjn>@H=3SI4|CVP7SHyD33T=}(tDTn7AtPf= zI|XIwRuAC`G>i;=!^APQY{KH4xGAsDQODAq-a}qZXVd6e+_{y{(1HEh2BSmqi;OF( z*PlFrd2vx9L-njp3pMK*f%Z3Qh6u=;R7>z}OQ&igoRNF{U}hJj+iqD+qk!{Zph*5l7qOIDQH}W!>Q14`UEua;ZKQ{HC(8{0&JFu zppAw_=J<%@l12SZLq+yv96$) z8m^6Ca$TcWx~uTqfX?&r<03DC*$-d}os?cu;s7|KiJd7sYq$a*Uoc}tTcHJB&cZol zkk=WYd}eM_mhzezc8ogOTo~@n^ag~FH?ob}@fTvDik7Wu)E<3T{o|5vrR3edE@Jp;6GD0B~>PRpk@RP&^9Qd32xQ=*{bx znBuY&o~o6(Z~ks2xtxO7|2+>0hE+$$(Dcux^YNp4hQyW-+ouB zRq2e{Y6;@%A5AXQ@P%7GX`wQqfn#z%M_Tx~qQ>$eFOy$0*Yi9WNE4=z-P^d};hdG^ z(G`aaEi(F{#=>-snzEaNf|UUNi2vflJQ;P zo5l_C1EK9R_*{-aFfHWi&Nms%C1_w5prS_ahgd%3L`g;|>80>(4{Thp|jToe}I*x#}2AWV>-MnCv zvWjuM9`BFYN$5{6s}9@)z5@+j>GeX!E~F3GkhL^+%&{Pl)f;Nq`9J zsy22~_*hLMdTa02U_|3V>~<-oxTzK~IgM7L)jc3S69=k{jvN)yD<+dyCyLs$Myh@E z^BtVHh}RhBP$>amedKcqn|<}c5faLw*6ulO1DVb=9hv_mmc1&n{q-aOKk2yD1^BqQ zrPx3nHNJT4%ns{>|BIk)1kYwW{5?M0VUYuViGb!L*>GSLeWI`ArRb+a$2HN($MBqY zmt8ON5>*^_hURkkW0$W0S+soeKR#Zo9M6=SdIlieh>Eh#k+7h8FYseua#_QO^`4ql zO&;nhXZw|guwTI9)FV>$dUMJwLAyGcygy7`Gb?qnq-`(?l;Ls%=;~xacU3_fMMhR0 zCPN{z9ZgS=X%r+ichV7lkTJOomZU_ReEQATM7G?NWD=*}-rqC#uA~Rvwfc4~auy2{ zTrMUkp`Witz9Q%4S75wvOytQ#AaF-qfL3a**3@LZhaypJVtMf^uGv^rDKyd|=F$Dz zj)XT0<>$cMHS1=5$-^rEd2?y^y{Oae=v}CKFqv5x$vy5LE>5*Y8@?pi12_9BH+ z5p?<05CNYuLL-qGy%#XdNprYl*0JGz7go54jTjX1+Xd&}6Ve&&JevTDBm(8KDX zILA|NjT307|FDZt;M_Two=}9n?^=D|2@~Bx*K)!lLa+G)#5+`3)0{itLgl2PSv!|| z-vOJ`wWh>H3hTZK95&*;+p4pBen+7f`a6E`x5X#J^+hx&w3zoxWlh?v6F|Z9*>e5FF7j+%(WZ}xt!R{z^83g zm*`nMMmZ~=PwOLexs7Z^bkv_i-=Y5t4^V2GtjPSHYxo(xihPmPrPxawj%r$t9T|B_ zKW3LSfJh8XC%@xGA&-V^{gJN2=daf_oq+1EupI`H7avso5GI~~-CZ7PzETu)M+j^I zHrWdeKRl`O80f%+aa;tY_-Kp)pBjDqE=dK6VpBMCk$yl&wRS@dUx(78fih0nsa9b2 zyI#La{v?X%2-v+v=qX_^8tw)}OQX(0!;X|?`{{2{C}6PeADh_8?`E#Ilp<*SO`%yMF6kd;XQfnumj!30fm>YwK_7hvO>51jqwkd^cb8*^px_tJ)EUr zDKFxWt2?(ee+wPeT@glAl3VZJ34c$qv8_fR+R7uLy*+5>+n?F$`38OrY|qc~TEN}~ zqkFRHkQEhkr^XEiKLEj!el6^vTRL~VIqvpU9QG5*IstbBAM>#8xm~mvijFiWS|tjjk*M$g)#P)WsFG8md5$lZY43eRXP+UpqQ7jvOW?h` zBndv{^*2EXo9C+Xd(XOIMCjVIJK7uj1q-RlvP`IC6Empq08753(=P(j#@72Z2hE($ zl-{P=Vcg#5W4lA2Su4DTM>05%$tYp+!B4;4a$JJA{wB1XPO~Xx4fb}l*Qc6(;^0X8 z$by+!k~NMaPfLIBA*^uF(f9wwIA5Z;m?R*32;-t`-~x+Bvn^U?auI4EGI9(wHt3np zm%J~2F9Podd|CF?5U=F|Gw=HBlC%kI+j%@pf9v45MzRPZ#IZO(eQ*Zv$$jjHN~Sr6 zx6xJ%uWFo`OgoH*S*wwIMg-^gkP{dD;GGn?kBRo%HL{NgJ%&=6TOzSQhU$*8c+r$# zK}h-8W9-Jn@!tg9_xe6h&uBZK$^LuXow-1l4s^d}XhRE{G6!hJj2cC}VKZm=|BfD?ga+h9-mInN*^Q z&@gD46(tp;uR|`NHo^K=uInRPf^+jyzA`wWbiK})V*vkuUq~dH3i`EbL|&gHMGT{S zbf22>Kje;c-W%2r9$hL0*r9@TagwQP7;o?q(8IxG+i!|?1rW?ENemNGCm9dZ8dD|i z(i2SaiH@wp)=*wnN%{*%>QiF%D0UHH5u{ z&1as((O|*zcdC9nX!=ApO6nhqlgD)=%4Yg}S?kL)nnWZBn?(qwb17eUB0~pB$*>_h z8eF00vvkxf$M?EE31AL=F{sx~`mSMKYs?$(5U-L9!wi6-v9qrL+{>Tf%qlc$@cA07 zzu1)jp-zT;E=`Zj^iJWFacnX0+=sgZnpu2cY(CgqCr|{d7?(u5kemAWTHmN0=&s83 zUrnvMqd1S@$bzG^&g`l93htKNXr=3OLj&G+D&(NZ=>mB2X1X<%>dUd`XjMGB(m11q@M^6^h&jwQD8 z3J{8v(!}-myxE|>iD`DQ;Bx`>YlrWfcYn6_9d5ynmd`SJH`6OYorh&K)Dd^frQZ;d zn<`t{KjCBjC6v2I{b(A%@ad-yjm&kO(V&SHy)97E;@fTTGv#f5M0-4!e3Rc02Kna^ z^BO?@JfiQvnildgWkP8GOUJ*=BM2wWf&VZYIcygprt5E-s9GsXtlcPPMrOFG$!Y=2 zRjug)fyX3icC$a9y`foJX*q!#Q~(8=f}fn7Z^c#5o?Vcm`R6z?OeiKP{t1SRLHsl4 zk0UTyR^Z(qWw3b2BIM$v?EyIz3$bO?gh&BK%a>%$h)@a?Zj{~9h$rhPMmfL#?5u9F z)7ocl7%3ClA5(4#^NTB^S+8a~c)ARTj9Wm^ze#y%6@MP=wv-QOM@6TLw-#|j%Hx!9 z-D4qtufJh}qT!anOnLo0faBs8Xg^P}Bg!i}wXahJci60cZ(2x5(>!MnUzK7ouznKb z&{0-#?PaXz{``+5%Yc+u8$gCc=N)Ju^llP$m0-KM1)1tFfZ_h{$isFg=7LRUmUiDd zh_=d7t)C8b#!YkeVK^Hgq+B~Rrll{;fkFAL)r6$_XC~sR9G8XhQJA3ggkR|a<%4B{ zoqw0+>Q z+vZny<^uhA=!{+?oNe(GK#tiXNR3C)-zZ%WIHWwBo-Oqw3NSk42Y{VHyh%An%)hZcj8Fz!h(kg5;6t> zYS?p3(NwO$cnMoYam1TDALiSf%|;TDz1#}8i$sYX!0Qa4AfjvWtGkRmgNRB>zRuQ> zM-at8=XOsJ@y&%>R0njrrO%9VoSCYe{rCMhqRDvcU5TRs2=#zmbIG{;Y0$vvPABw1 zT!~2jj?;@KX_;ldNb^MG#xC~*ZDxs&bQC{PkV>&@)%7mj*GKDPx-dt0@|5K0tX*|O@9)QfoV zmJk}C$%h3VUsZb|0n;Q1pPWR>|LWe#D{l?|M{|R>%rnete0ykZN8!gaz~%K!^E%aQ z(g#xG;}QR=H9oVLdZhLE$}U=3<|$?Fi{_JaibboGj>6hbm6BOt@h6}l@k+0)WE=+) zWEJaEsX-D#YG1OmzZY@fy#KMc65+UUnzF+!L@LyRf3vmp)d{zfEO-?eP;@YeM@-vV zZr{7fQMCrmAq(Bs;RQ#MGFq6mRf#tNnuOYA0ZaK!qoAkMH(cDTS(mL0Q66vj-ik%F^~sveMfp;rKDJegt5wqwS7a%40?Y{R~9M zkD;8EvHpk(uV^(AWB_q>6w|feJ^B;4+Atu^$b)IhSlfVJAsFm%0U;^A*5m)1b({nA z-@i;I+XTenQ(wMZQ`*R!R)rE)O-y5R>$#F2hwW|jY-{ir!YXX`YKFu52w#;$HirP} zRP}#reoZtHRz#dzb5^Nu4wYC7cSs<4O%O{+>I_QI9Uk4NcRAwMi5R=e0nhkOsf7b z?{z8@!-9v?9g%IPo!-y_HKq%6a@tggx)U=z)#jg;B-dd49+FHM-RLa5?R5UXD0gG< z6zl&`(kAA~TIAN@(2Y8{oV89sq!#88S2K*OJC=t1m5g!lJ$w_~7;VI5Ip}gkk81Vd z{11L@cWvnX$1lx2z$WC@PasvA-FycW-)p8kofg&?KY^$cQlo$%VXNt}*+|0ZxTIxt zvRUH7_hYzeiq2k30sSz*7?JNPR+6N$+ENez5`H!j&Pc^71d0mKATXMZ8U2TddXEHL zx4|O5F=;P#5Moo;;Z~U5(9~~C<)|~Nc4tskBcTTGvg>;+vp<4b#94Q>n@+w(6zIcn zSoc9ay&el@UZaW|kt}{Te%lql7XrWEfCc04YX6<*JrLL=co1%g-*~h}MJ{B?JdsiQ z!OUS1<15JroFlDI;wWZlol(+z!jFe@J^nW=2DE3WGvLYGlS-PPJVQY!yP?byT%<Guca_JKm;)zL|DMQb|AOV1oDXx6D+|e9U8`c81!mB#E}}r2~h#0(vEY^0!N$ z0u0>u%w48IL6bY9r(Enr{R3@19&h>ykaPCdy@IRB!oYEmWK&tW(nxFC?~`yIZikX# zP}Co)T*)kn%HRHoT@*x97Iy3)$$ELTbkTKv*|Y2P!ncmjo&yGDmUlkZn}k)YNV58~ zZ3B%xnW-wIQV8JT)Is)0AagEwJpE1{^Yl_ zV&FqFEZ|&@dLF?(h8EjKL1aOYD@e$96tG5c#PNMDFlGb=aV`b6AGVH zEywmNZ(5`M-lcU`&9?&&4=3hpnZ>{6I*SlryHN>@%{p1B%~F={%aW@Whu}_c?SO+6FB!Jr1!*jZ(C%E zoC+!Il)4@M) zIt0%Dq3!902fVIrhnBBSxLkU|J60X`Y8oa11E=z@E5|AM=c(IF_P+@mX5e(guSIm3 zq|tJcQklVl5^XRWNMg_K4m#9F;cioC05Ljh#|?+ZSc)$bQc+9;(nzTTyF)Rped62J zn$4XwRY0!#+{1z%pJ@B>)x2{rk3~r45!n7koZUYQ!5eo63EZz0LMoTF5N5yb(0)Ac z#u_$TjXU0rSXaay>`nrWeHJ0tM-tw^6S$Ej47^T<((8a0;Z6Cx`<-116Z~S~j@c%! z4)Kt{H{i()As1ZyQAegfV)*YVlyAoT{BjA_86t23zrA(BaP#|S1=;ix3r_Hf{#N*A zM+mPTx(E?!vG|g+%UE~aw~0G^;)bX&kv**^YA+}?U4+!^)#&`~?86V*nWxoU7S<$Z zcIY!e)GCz}_KKAPqn3)pue=Clhu3pEjf!DoW!q!t2?;U3)dwxXqc6%agp| h>yrO2Hx(yBig7x)%o~Yo$4lgK-v2)vUc^kd{s%#vrN96H literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-edit-tab-stop-test.webp b/bin/unit_tests/assets/fontrendering/eepp-text-edit-tab-stop-test.webp new file mode 100644 index 0000000000000000000000000000000000000000..d6927db4b29b13eea70e1a3692b1d139d1d49520 GIT binary patch literal 7358 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 b!1#~EG57zM+x*ecqZaz3ar=dnb>sg9<;4co literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-edit-tabs-test.webp b/bin/unit_tests/assets/fontrendering/eepp-text-edit-tabs-test.webp new file mode 100644 index 0000000000000000000000000000000000000000..8e73a15cf1a3007215031aa30b243e64f12bf56c GIT binary patch literal 7264 zcmchb_ghoXy2S$o2oNBNAT^XEG(jm+jnWcGkS<-2CLjn%l~4pJK|ldXqy!X{qEZx5 zilIpFq5>*K>Agv>f^g&aoO{mw3vPaz{k)&G);s%|%*?Z|=;`WO3jzREI@%_dCaMPd zw6W|7CJ*qi142gWCHWqw;(Dt!VzjDAy6ea3KE67=Ro;0R)w^Wo_0Z$*Ro*R)wk8Md zC$cLkt)o0p04jJ7IuuSP7|sY30Rb5`p8?dUyC}HXR~5NBBe&d^=p6IkHqln$;>B(Z(pjwjf?(SohtMG ziHCi^JG>WC&W3cR7vwa(`n8QEgEs_xDp#NXYfOUYHD}mG#n@Y3bspc=7OC&)BDtzx zSFtDFl>bf1>{BKa_smfW1%HrXil{-?b+s?Khq!1&W-Q%1)8aYm%e6NgvU?W=x#f3{KS({T|=WK zVaSi8uy@jjPuP>xjyVPRMLSM%-#!J*?i{{}IQhQT@cYl820iePP@z*Zb9MM@p>_Do zt}FY@Z;RAvtGOsc|Dy}}zf0^+G*(LwnHzB@4^Mb(udRoao(#g(r2>SbPt5R4tqECf$0f8g4XP2HcC z9sc$GwZqOG(uX}rK6H6OKu(y zbBNlWDb*U$Jw=LX#cg#Mj2*KXzn1ZcOE6S!V4nDud5zI~eb(Iw9{ZHp{fEPA#+McE z;r=d^F?Kx-sh*z=$Sd=$Ul^*B&fPG-JKO)%=KCdf4X^Nw`Pvm`jpLRDbu=#^qL}j3 z>gv@iZ6}nml(-m`PwpOCDvboCs8AJDtXRh<`bdL6m4FvF0}ixSMGnH`8YP&nvMB(@ z2dUp-iuIVVj)_Hc>k1`%;)CV2Kz1Eq2L9E9GhmZjRwB?Uj#u z4-ml;Isd8RBD}pVBD{Gaart|s+Zo=XQ3U7v%cyLFNCMF*qN1uQ!e%IoH@>BIWUS(J z4n;DOF!jG>1r5B#q^4khT}hCP^zf#cRNW)MuM2t-=3%%C_f@kFjr<`aq+~?$T>Yb@ z!x54_Z8Z1r#IFvims9#XX^~b-3f|tywkB(TGlC3&iUYk`^WUtslDI@}N`O3p#&rk| zmY87b=H-d(cy{TauO(;NBO-sWIG@c4))9m;ZTQZnHKL&cmR`rNGtnx{o+9y;ktf%$ckZbFnHU*jkn+ayEqSqmu#`b)5r;41~PEWn*0+y$L=Cp*y#cN$O z2+>(LN`6%1l5*8R(sR*n_rB_rm|)4N(cg!=E`; zD)LfHR+vmWKn|DLgOHSr`hB)9oaOBpDFj0o4~$gnb~&x3#q!N3VO5_uw!TNSp#6>6 z=4ILBip}14Sq}y=Tf4K<<7~`xlBqTTMltIK#u{0=-4W=P{>Gk0C1EFBMSFQLeD4d; zQv@7VVC2Ta#bssB@--v!CjoEOq!2myf&p-3FDL~GE4b{&$Hir45B-|q_=6B1cbWqb zsb;bM!;-s==@m=6P!ZXNiLvdGRr|JBYAEhvDqkIFBI#2tb3@L77>bf_;0FD-ImI5Za#P-lmb(eQ=G8Rl#Ft7W*E3%x3`g!$xiqH_zjQ4wiRPXgkG;huL&hVftE zT{oAMj20vW$K&H zk4@4B8pGpy&b)dh6MQdmMvKaSW{xAb;-PkDamr~J)$f{% z`R^~>G~)%Nzb3LS6qjys95&e;w})!r;R#R*l*7sWVrX!;#jxcj=?iP3e7GBH%|JoK zJBBul?;elOqKyHOtNl7yN=a_CTC}@xqPu8<%BrpUUBjQZGES|44zk|CoK$Gb%y66; zpgJdx==pBaB-m8JdFBPAI?1->W?XGtn&3F53_0ToW8}{rMEm!Dx=cZ83p5aK##*h# zGh1QU0y(gowxnz+gc#|Z1G(5NAu=7@^ z;cVyoFXx1}avrzQk&@Net@K4i(U&+qS=X3&ciFUp9g{oXF-VJ#xd!8L2z4r0liZLD zK9@a#d-Ahu;$?IaSX*q8j3@;q_KOHq%XK$=SWAy0xU7!!tm*6){|1+)YpRv1v5jTc zs~lNiAVNf>e`A8D<(kv}c)_DiA65ht74<}0`?AD7v?EAiyGR7tVxkAxNp?(S8t#lW zQ#m4!vo&OdEDoQo!B+yiH@aTp7}id=h^J@O2K(x%#u8IM zPvWQp!!O@~=}q-O{}?rpK0dvtjlbwH$DBB(jwu#1NmhE{-GA5ZL%;}zcQWd6WGn;S z1YtTl5CvfLjDj)?oi=ZWTU`R)uma00~9VVk8;6@gQH65rs5=FNc*3kkq{#ZFH? zvUa?gj4eaP=0uMYs8LH)w0tWIATG#$j@U6}GyBLvW-BtVb*IS{knY9GVs>F8@zhds z_!+t)lzAu)b}UEGmchpl##yH%L)7ulQ>dISc)2v-$9fEGphbmtAKRBYU4SHV(!%W) z1poPw*Q}7}bP@2->1+w|zz0M+OfR$ehBy*Z|W!AKgLe85r{)J>bEjSo(uv z6sN1Vl2PIZcye$~;NZSKgoMKW998O1eA$JD0cxXcM7iqwY8-5SG4tj}ZHR93Oiyjf zIbwLpC`)Bg(0bJTDS0k^dTEa0(y&r9vKTI_}qQ$dAFRpW#q9CS6aH{q}ku zS4)CZB2#;u$>e_xsI$4a+vNrj)tSWG-iLSu8TCyW8gXVIQf4{?5wb#)%H;qe5)4pwA&(>xdI)c`}%YI zFq44)=jBXt38uV00_b7Ms2_8Pt8K<&S3l{dZ+yE%0Jros=B+2ihNTbOAQXRulU-R>U63r=N|02}sSIF#a)n>d|AacViAk4eq4)UZl1V!% z=(zHSTe7|ZLJHJvh(q<5!oU@wM|CK1$U93(_D;k|2=3_l^*zdrn0!=9nxe=9-+6fE zfp{aKMPcL{9DEAXvMNvXi4Jp%gXhYn;tOhTEDbd695QccXFbt0l=Q(0*#LF!Q~7VH z3QhC}P-ks<#qZr8y)HLS-0tB(YdcAj+zI8kZt_*B;^{^EXMi`gLy$lIiJeP(6T{-* zXGV}S0JGP2K%$u!GvPtRW)no;>gj=7Tli-{?bI%oZ@>**MY2xWR&t}VPlSpPwFpg% zxJQdhz56eQfgS-=#3I`=c0p77N7fVNxvY5%ui4h%jt-5Kw@#bj^3NnQ^ z3PEmmBCL1e^tIlsGTbo=^5!c-7?4oG4a+ccHpa=`_XP0S46map`(qsndog{=lBX2jclwCK2wq!7 z6%qWso9xsrCeT35xJz=2DF7H;DEiKYQvD3i7_E$r^>rUX-;@5g{0Vy&P5w~|AN&Me zs)Xfg&JA4SEwyu-<{8|S?e~IkN18hrYSB+Aj49sZX^NB_Mc+G{@pC^`R*S-(N8h{j z!256K?>xZL(R8LY1hDP7_Zw^u(O7}cY?>u+sB|ssBl4l%!KMHm5ZRA5<4WZ^sYoFp z%a1ScuQlLo7018(o5hIZ!-{FoPK7zk?;>n%V0#g1tvg9sN%0_MU2~?`TfN)ixchu{ zSXk>|;ZS_M`*p0V$pX{OF(`PqkpfO|;S7Q9_hEd&MJ{rXjw_1q64hiF8eEcEU?X7o zFm?*2To-}^iDMAM7<-`d8U%(pW3w6Sa9@`qALlxe@oMs{=%*BtA@-b8%wqyEPZvwR z^o>(%`ZIcF&$(tse@r2T6`)qj0FCJ4AA|LS`G&D`Fy#uG4)W%=-^94Dhtmz{9`@NXuZ zlRB=ALRyi+>`xRoafpi#5EUTLF%rI;eiz>k9zRy|n0eSEP|SK(JB83HPvr5WoN5pw z&;!q(2bPYLU8aP~&VOa|i#5S_zbO$qs5*BXuN8b+#~m77hfEf&vu>$VOlh;Fc4=Ht z5}vyGWHFYiErmKDG-uzg*+=T;97g5}H?zss1+$?Ka4+XDf=LWt*`OHF#YhKzASE~3 ztQ5OmUbOtaRX)c1$#U#J6ze|nRuSew?<~BJ<2zpeINrYkbbE}X^t>-_ zewI_1oOJ}?T~?rY#>|Bl$YyIQ7U{QMgV{(=L4#f>K`G^7am%?sY|h|J-@ zSE%NVf^8CM1>!%Y)gE~YeW{13^s*=yE*9vp=x?@MGP>eJKEQE)2i7%^{rnYn0O4P zF|SD2O(B=R42j0%Gr&&&Ww>kDK6R~MPe-BuB*?9UZnheY#i(uD(u^+X#XV<$fz_R8 zMl?w41gTHXKF0C~11mT;9_=}D{28DVG!31SD~Jf1;>7h74q&f9f|tlXdhfnI1u;By zq$ZmF?TOhJJD|#JTGxP z;jH_dED*eOUVq(?DPaP-S%)kF3mm+#beJgm(1vW?f#>lmBkJ7DW20VPIV0rZWx!I3 zi}Tbqa4TT?ZRCmXi^8hd4qg;1Pxoa7NNys{nRPt?4>pr0un0I34Ctw7)Go5I;`7=DOz z4A-T*u$b7q+KAU{T^7pt6Pu{{ej`;{`+QidbcA_*F1~+6m5}RYudl$I)@HRz!BX;` zrXeNA(4fa^AX}pIZoJjsSp3w8YEbU0H)5F&x~HTG1_*<`huzR0>L__LX4#m6%uCMf zXbR_7l+RzBjsfAV+F!Ke>N?u#0fdjO~RI11>t zvo#ZqZI=cThkiohB4wG9Y?~Fe z=iXhPg5WBxT8^X$L+zf(yK2=TZqxYPE` z??INX=5}&HA4_XtY?9*nq-P6oy znsaA4u&Ex?@3@|_%?7X3dLTBm11B@Z#1+^t6pkugm7)8DZgxA2nm+QqhE>RpiNgvT z10;ob*s+nEtE3r(`2FQnw^t;!d=`5yd8M-9hzV5mzF+Sf551-cp;M>g$oezI+6#%|a!|H+O|FMp zQ%AnDUd4e26pck1WTyyW`3J%l`}*m1dqc6pTvkVuox4b~^bIqQn7D;whlwlT`yDzA zq=}etRP|Y`IQfD874HYCwm~k3(C|7M<{cB~TgVC4+@QLP!0z}yMDd8~@m5n&ZB-z} zHPEA9%-mhW=8JDz{sSQvkyE(~FceEsw67je;vp-AfC|reNZUJZEEI+cL!HM+iZ<%v zZyzw_T@3t|lwsSYsC@H9c;U~B;=u43ap%+n4FcuzVsXaDPlcOrs&rE%a_$yCiHjEU z+u--`n~>WmU{`6ztClvs+9}40lpiT|@k@ z(uuD?oJ14L4*pY|=lrM0J*i8b#1UiVn&$#KKst%kTN-IkHGrJ!QMFb?0jD@&D7+cu zfhu2oVBQ+PxNCNBfLR9!Q^PJ%p+Wo5Nzp{#UD07fhXS~2;?}O2=*={~2?oL&W|d|| zcFQ0T5_m35Zz!t8+DC&M@cusYzR0L_bCTQ;w})t=$nOz(7^h%+&|wjAI*NJ!+32#` zEjx}{ggOzrU%&QjB7l1&QQt^o@1_-pb_VTZ7Kh-RxM5sj%>CZLRmo8*pW#h^x+471 z8X7oTkEvN|%Gz%7F5GG2FLhx&7db@0TZVRU=sjxHnkv*{Oe9v+W9~dBtfVOF38L=R zc$zojdzaCzS+7v@9Ee-HEsA!xJ;~lYc~(c%%nm$SOpO5XD;I7*c*$rr zUCH2-o;&HI9e?kow*9!MbzT5-pYoxT-QBCc7WQb!Jxuc$5dxQkt^elex_oC;w>3yC<(Uo8h~T!YV$k4fzo zB1dCdrOU#(=DPhu6m@D+`)#Tr_uR>d(~-pSsgs10*1PI_Q4&8pcTT3?`c+5RJX*HW z|Lky5e4jZmtXbdj)51qltkT1G(z zu@=E;v1Mg^kf{pwlTT%G@dFn{p+?+Mm8~~g@mFDP61AqIn3fhZ`6jy!TIx;w8hc^R ztD5?#UEP9UULnvJUd*ejrahjv8=Kv$EBONgF_M(*;@IAw_1CXX*%n96-%fhLBopx} zsJ#XkwqC=_*z5iCp(Y#bI$Lzj#&?xH9UMgMyLi)o)?+#h&C%{zC-adb682#tB^2y` zLt>A*M!ko})OqBGc7M2HA3brY@s+o}tenK1^GA%Qmr5j)npdgqEXs_~+#hql+X2gq z7{;T5a>Q*(`1rii>;p!cxsK$elSH>HDno@G5_roXwAuqvffOR=tv={dEXGCLw} zk^0Me%OP&6T#x&&%T*AqrYbEx7xF#Dm2G?zQif3U=r(bz4k>7Izi|*5Cr3{HM%;*P zIUA^4C9mwbL2&oOcJUu1cz6B5U7ZHoD(?R3bYvWfhvzDdA)H_2z5|`aUI;8`h72)$ zydxF4ruKvE{_yAF#sQKlJo%yPdRD!%kk7}I0ms34w~LhUuT-9a88XkOpN#&uptkU= zH~POf#(`qz6c+58O1UtHeYdw!`y&ly&E>L**ZgC+;Yj&YHgBozS6Y+3SxKXVlvR{p zipFatsDmQfIx1%6mJ37+O%n+`76=|73{8?|Pm+yG{VL>Fq)ezqU1u z+M-79LXXbmDTlTRJI0tPYH0-Cld*_N&U_fL6H~$Qn4wjGAxbTR9puG2dHmbpZer@^ z&^dgFg1#4giG<0#!lpyd)<30*%Q%lk$j12Q$w87YGs(SM)t?t#4~(A)A}dFT@nvHn z@g|9x&QzTw2(>>$_hTM7egVIU6VF%WA7YLRA4GsxyTGPyl>{ zlccHrw06rO^)o^75AV8H8j4zGl`{!P60W4?P}qDAai!F8Un#1^ zq+%foi3<~;m`-UMh=WAq7vpwC>nI#*K)BqoG~W`69FV6&q`dB0P*TX)Wec5-_X z*y6^Y1O!EL@^F+h;~CK6$N2l7nFud2u?fc=yWA`a$Hf)Z5wpjP9h`(oI{722)t*||z1J--qCf5dJ3;BRq7+2EC%Z8H zS{;od283pvZsFpw1DUIP@^Y(&)!dACB^6P1ntvp@C{v+)!c5I$ zWU7~YW90%57&gvR&-ZPKysYzaT*7u2iHJHAYR0etgzH|5GYTiICvuj^=I-=NR~w|d zdMPb7o|1II8LSTZvl29FFkNX;dgke4ieFAccmH+ywB5agP^N&X#FfMscyAo2HzV#_ zOM5c))4_k1d*>i>2L(Ul+i@<8zMsg6!utU(W8EDeK?ZZZ*=$pEMtla8<&!z=>d4N) z10TVuBXhqe#~i21Ew`Hu!RxbkR}bPxp2VkDdoW)sd6Fq91{eR#t+JL~U`cH>;!jAb z1PoVw%yRVs>}G|Gr>h;WZeS}_(~Bbw>#wYBz_rom2tFQ|k215VFXj=HdE?;BJH@4z z-x*q(%i5Nomfx=e?T!(Yg6O}{+M!REvzujvrH9d4vY6EVn#}6=WmJEG-0w7r>qA%! z(PC+ocbkJDG8j36{ADz|qN|?iSdBy_Oy{i}bt~0u1gF|koiQbBA^M)# zQE2L&E~Gs0S{|=u3CX_2oX0uA_sej4dAwOF@o{l#+4JbM3{WM5sT4L45-Vtb)7~qX`QI9!@W3(1NNPGsWhEU(F*;0~$+tl~iL#ws(saDrHwm z3x|nhvfVXvZ0=U8L8aD(8x511Md(v!CG(D%3H%TY<NgpC0?DK*3JiyK zLO7x9vG?fdrrT4hq5gbE#Txme37u+y@&2#83A+1=Bly(PP&u9Vnj!g|?QpPEsqXJ| zw?H-}_4&@fW>U$dT&$!L4H(?CHsMQUt& z(j|t)8al5pD&bPt#bKx2N*;UCJ?)Vv>6!ZT=aog1jHO$#!4;pqVs;&HN6nqJ>c*7HRIN z3I@ooL-7mtF5>^FC8?oB!f2V3mu4qx=N=GVI|M|so|2U-aqNkg7|Mi-T*oBSzT;_I zy6*LS>XXiDoAj)#aA*g^UbQth-)~<9RIKP}g<|Upxv&E=BVi|=yNHYGD~Z#>gt;)9 z@UflpJX++_6HBoKoP<*5C8>E?jIdk1s5hSzlMC+AzI3ji@<1}Y&-}G-h0TvA0*s*X z<9E&7{7-am_xjBxI?WS>EyKlBqv~mAc`^&?8M$8)wAIMZjn+f2-?5b@S!b^b_o0M@ zD=6vO__4H+rw?DW)zrhQ)|+8vDA<9W+qe63-sbn#Ln%wmC7Pvj3!~IJbzmG7MCoE% z0}>tiJ$tB1kjBs?D(JJ-uU)hm@v0eg<(rbS`D>~eYYaz0*@Pa$(ObSOxo|mpcbfWj zC3U&rEpSz`vR?a|7ONS+=(x$?F`)vX*6R>9UuUNuPN9e7o#}nBmA-5t!9x|Pdt2ew z85i!IJHW-G?L+L$7NvQk#%m4p@FIygXU)eVO$hw#e$Yu*Don zC@hsaNSE9zTe7+!fL4M>TTNzN&yk6}Z-Rr8J*b+V?0QN_Q1`{QT%reM1!h9&Y*u1q z2@9L_s}$#(a!5D|X$ozosIMxP+>n8oU{aH9)5BtB zU=P0tq#q04rsaQy^T8Z>I!>=LFo&r6udK?z0yvT4Vi{9RBM9G7_qufVAS5HKrTmAM%n!A)lq0k9rg zZO{P;tJRU~gx_Wb0aBQ$f3@%i6xb&Fi;*y)JWT3<^XYBbBE`tn*2Mu*6*hw)8t#Hl z3JSZzD-47X!;Iu01qZO*r&f+9B)ZBoxuvidSL%6 z)xnK|JiY{linj13E(ki1k7u7=eRkx-L_KtISbD*{3N(wskvUYDNMlEfZ99O*d>ifh z6U+1v6o&^~R4U5fkNhGJoZ@TF$Z>+=*&JCNH)UF=wZ@X4|07N7}8MBKPL9`=;EMe?^wD5?~0T~ z&E&%#2pc@@K>kmNY%sRdR=K~vGeQEom7TGIGVGJVU{rdRIv@u`H)P+Ac2jF50y5h3 z(~O ziYxi&VbZ^1bahWVyyi_I^s1Zdn(p5SQC7JEZe}rjck*ita0hoP8SaUT$tU^v57E$! z4uA$kbnbnFJN)e6{A)XAN27<#j{AFnL&955UJ=~h*D*ir$?fC#zJi2EkpI>n?D2#B z_PP7%b)T2UNOf~|N!#<4eedbUpp?5SHv^~dG4NcQsHeU!n}c@O>%hLElq9bB>axX= zbLVGdauf$;{3YnYbo478a~layS^IYauz{g6H_l}C!A|gs5cqw8mCUJpKaFm}eUDushn!%XDE?ACq=TUGA5bolYNi{ zL^Bg(7))SQE=Qr#!yCjFFj^lGwgNoy;v@LPaGBEar4)9vt>*?>4~Y9+tFp%@8(N5m z$kUH8bn3EiTR{`gRgz~QpO6_Ba1}l)k7zcl)9K)dKYzoy`Tjeg?O!j{>##-ecDD#B zs2nX^lWL$+(C+4<_Z3!aX6cpX`N((}DBaqLYa*ecCIxW5?s~C>&*CFo80#%;wsV*d zlB(!nA-*wO8ch3J+H?A7c9!2fsxs>uhK;`CNJ`hSk_wk%n5G%k_=4vwpeTRQlx6`f zuXChJE|{sAVg54^qkjeh{#PMT#rLncWaa;QqFt9MjIq0oRYO&8;gVGgmV)Lm7ady+ zx?q`XuFZGR7LJ6pkupcbz=#cHxnFzm*QM%7V#Wx4q=&~n6a!ZNGgpcRq_L>2B$t=D zZzKs<(@R{n3bhlrM~fkGOa`RlQr?hCWb<1sIPW{Z|5-)^ESm$C=Sb)At44g8YZSTJ z_edvKB9!L0mF^>4e|~o|iKbPRmwT3e!MVN5`}({SxHt$tB3w?D9DUh}#l5B*mRSG( z_0zxDRht^Il#p0u#d?1DurbyS6Bl-mE|`g?4KW@nqeBDAf|%*0%4B1BM3`%WC>!P~ zcz@LSj7P2`+9$Q)vgad;=YlPHMEi5+CWKSUr20 zXtNbf*{Xp2N`=k4HGYlsLQ42Dc3s>1oDk=8n8-}Pg(ZRyGDf-=2WrG8YMw`O<*v-) z+OZB2X?4x@T-xkDm#rSkxd^;-jk?#w(C!<>Rs9OGj^U*Jlfbg4Hdf-EiZ0&w#b&+}flruQ@9nBm0Mt7Buk&jeg~pG^Hp?7L?IG=+snB zz>iwS9u}b0E0qu)T$Xq4H43iF4KO;bV^>V$rXf?%si&pe2!c>>S2^P1NTeUX^cVc< zre)a}qbI*IHTt1$i$E#j2ESKrEjI0{f(=MRt*O_SyHn>NDcO<~Mj|q`9?J_Jtza5p z1KB=N2W7`pMbKnC+JU6P<=BT{(K9dYRy1aKipC8fcaABOyN}SGawXlriM_z zqN(q)hsM`D!_?x5zV>sl0y`h9O#hz3qdBF+OK;A~#K?{!0xMakSzh8OGgpTlt&fBf z18sLJM-{ZFfCqAaMH8Ai)_F4*#Y!WFA$I{PBB#hE2Qr^u{x2D)7LUi)9OiJOHtQja zTXj*3OTdPcot_I_2uiwHt*TN_l2Q~Y3kq~hPOQZ7#R@cFi(f3i(FidL5QHKNB$KxB zw$e5zuW;M|%%6zS4UD{M2eG$jUrz!ypV=GzRKm3b?cg38-BA~URJe!oRdt4CnsrV? zfXIc5Vrx@3r9lQBuI2> zx?TQD4@K^3Q5{e%b;$jUkmj}xa~S7+kt?Y=U%FOrg$OiY==!U+_5nkO@LjyH+F0vS zoQGI2a@O)d(H;(2*Wk@jR>yn9J&)vVZ5DF44GsVvh)(6=;phIut8vsBHo!g|`S&Jb zjq3sJQPefMedY6bioH*X?rryg9r|ZvF|NSxPpew8d&2#$ZCzXNj^mHilyCUgVq;m$ zWSHnOZB51C8R(cz97a!-$Z-T$skW*rP*<*1) z{jf{+^tj5J@dz%h_y{CzfpHpNRwyoom@jcm{KbZr$qX7CEMn5Z=;W)3p8ZYwG%3=r zPDI{ZB%p3EVjvM#KX8YWLjC&-C?qX2WZ1KAL@YrL7g_ShgOP>%`kIY?;UQgzE}*8$ zTx6}kC9Z<7ncvmQtp^*gvyXg4MHET(Z0>F^$4m9?_kaX_azaF#1)aw75A}M$0B;xG z_5pAB7kM_^F?t5dB#e|~PPrt4ja8TlCP9)8K-Rz~{S5GA%+9UTHQre?Pg}&uXU_7k zHtCJBTETjyCBdM0Aqn<=7Z6C2@1};*+vYc5?~wEf(&mVATN-&HPl zsxZIHMgw-nf?!kgLGJOe<7(AKK13^MbG6=Cr1%%yZPFWLwSo-*$NmNLm8&>l6ZYj|(1EO=t{Ecn;1GT2zVnILL8T#n7)3HNM(ifn|83GnGSc{8}> z78c6~3&zGWgKOWR5?&jW>_n^%S`Q%82e?Xs8N-ro zZW4*$G(BjhpxKEY?lirIC}>$aQd$_u{DO=%>}7(U0pAG+YE^p|Qu#?NA?_*0gAE!D8)W}^>0vSn%#3bPq_ z7)b@j3VK0Oj?WrFBR{5*513y6P^q5fU43X~=yWikfxAzZjNJ&lW1S!Xb@=9M$e%`G zLD7?nS{`##gB&u!S?(LEhHW<+-QY1@htjIUg1|`9#xBuE4PoRXXZf!X22f2Rj;tCW z*E5Z$;cRxoxBVHjE85)`|9V-+v{;;D9SAl8E(|-kT8Ris-p`=!S!V;eaHuIhO0m#v z!2jHsNPKqJ>--VYp9at?!GXbx(MQiP#EfBQ)2Dh@2$Pv65uF=ZQo%jgeOd^NsKLj4aCZFx58PT8H$Geo!|JBkaA6W zC>kPqF8@|4ceckTzz4jDX*b=Qzm7vvcYHn`6F$GCoI!4K=ngzNPh=r!UyVLKGWCT@ zKI=1_GWYSpIbx&qU`|e$n*?~@=RF#Qc7yWQaspAvW9GCnOiz3q*?O=3Z0uHdDZd=# ztPn1?Htu;R>WnaVLHgRw_06IQ z+DVjZ^_~sR0u57!m^~^mnQ^U|H8XAp+mPz~+YcyV+{tFF&Tdfot3WVs`JQWs9qBVT zjU|Ey$|`hdLYu3Al&{sZ{VArMWQd3%56ccjA!}l6S;4dC!&+Yk zzog&{3;syESkD*_FV5Q7WK|VMS~sj2UcJP3bVejwb@?SS)5})Ds;lO`n0Hf8gTgQ4 zgkPdh>*|QU#xOPrYSR6H3$^EtJavrp@YM-p#u0VDk0!T$Gu^Ubm7pm(x%QG5>+oP< z%Ki$QrU=^3QRo}l zH_D^#+h04iGtZgU^I7WtSSelw{snwW!TAK2sHsyYhDH_CS9=U!m__HXzQM?k)z-bMP1)B9Sr&`uOcd&eeFJ?%iZcz`*L1qRFKeJ zQtWeClT-2wnhfAAWiEtcbw?(ziJ}t{<%0W`ZmLvG-JALV4h@=+^003A<65D+s+MSj z+{;t2s`V=h1|z<2x~Dy3W41b|B0 zgTB3GR$U;2rD5s0*&OmDKZ-Jp&Q{fma?`nK;ZLOl&N1P(crnuR)RY(TUr zuuYM6qA`K^P4fy^26#@1^_{Eo2A1%56VEzH6aK!*k1q6K=#6}oD`bEzV$4fsp7G(7>0 zM>CP*O+!y0UgwSY8(9H z*js{Sj6?hcD*g+b?p{-_YE46c=>)N@Vc-mGHa#Zttg;4S`gZL`JY*iwMr(K}kqmHs zLWUon>hnXs8t|0{qa6KTr0h;Fl)C>)XuXWcO3C6o6#V80)Jh?Ubmv-EZ z;N~OTsNDpFMOv5##CDGgyayf&y_DO3fF#m~I|hRDvlIO?kQJ2C^)>7S-s3n7B+Gxg z1V%~&8Gr_{C?%9Y_oKH|3wXUBV#%wA2c5oumoa>3)x$bqTW<$=h29u}LJdp{zk=TQ zb}V)D9VVg$Z{G=;t}cy`0Ts-zV4a+~i`itU(5Yc|v_JvbEU1rBwUaE2)4WQXO&;TS z+u#qxUZjQIrjcl`ZzH1x7mX=|e#E8zRx#L>7%@qqe)k4a&r5;Q1DIaE%n&CR{Xv%^ zM_Jz&{j1OKU`u$c9lzw#TUTLh`Sx_+gGmpl5_y!ZV49H0!aB%-Fx3QJCUE((9xwp; zx6haNo2?bbO1QRSO%t|%cFiFGlN)WnUh&s5jwnL$IZ1&yeuqfmPE)mY>FyT_U5Fq( zOBDW8<#?@<9T1IfP5Y(Rdq3&Xj|=x}YvN&;2xe@kEn13iW}(wg`Mu0-m9=&iM8EN#Y)IYdEg)5QEV!Ov$J3AL28EXRuI@cY6<( zC~yYWff3 zzF0fb#Gv@y>f_(&Xj|XTo8u6T;Et~%AOm8VdKi|ZCaRtPx*;zDrrM(ltXWq+CcZt% zMUmhce1g=t9a^iQD-}3V1W`6GSyU)VufHw}I^;<@?GEK$Pk%g$IaueaI7qNAFH-)= zjmxM8q&_wl2FTRc%;Ft%o>=~#p(_ytvIrtgy$z|&)9MZ$<>0c|2en1SGT4W56cbbg z&byo&eh#}3_B&7&6FI&!>j7T$1EOp=*Ieg~G>mONJ)AtPY($DTNj@OFpG3^t`ad{L zcthC6JnVg#xfcKS6MVQEV7y3%=gfR$oYv-?Fdf0E(8EXw=1(iDn21L_4P@`!B>ZmY zDe%cgHfTXCY{TOrUZ!IhA;NL~+d&yuDG7jeH#4oY5!VRTZdh1lLw;*Vqflt#k?Qp0 z^Vs+O65qa~Kw^`RP93Z_yhP^DEqXXVxbgJQD+~yMaMQ_z(0+l>cgPQo($Bsxxxzq4 zcG~f)L#;&}IV)NHdvTQ^9giP`@%4dnuZw&0UhcS}vjSY$s!{^|UlHszK#EQGPMcv9rN#Q_L42 z)DCBR6yvL&&$^#U>%SQfB`c40B~s@NvFaZAgA=CftN$d`H2v1A2z_*CW7I=zF z-;%4+T!#J*-0KP968?+D)-v+PYw!Fv2oV)t-dH zrq}u-1eqZ*i%jX|y28!vlFU^dlHtYpCPzmzVrlpyIjqk9`(yk zjti`_?2K2`@JK3=N=4Ua0IUQ)QI)9J0y`ojVlr_dIp$I7~`USU#J3OBa^fZ zp`^ML9Cy@|qVH2?D1*7GSkk=5KPGM(OzunauN1N=uFNcfTlrd5pIXEqt7<}(9=}LF zr*ul{fBQC26SP_mD9^Q?EIW7=z)8d5_W`JtC@aNq(wXVK6lg+T59OGuH1DA@TVV$4}OLag}uX0$$Lw`cS%j0QK9&J90^SVsSqw=OfzCRbeEoO9Wcz z0%jPvFLtq^t<&&F$;QxD;saMuqGolIEWNBEFAEMyyTxQ!7q0si%rG;FG+eu@Nt@^y zUu>Pfmr}c}sr4RLwReG|!kE<-;!=$wUPqVb(Wgia_I5OD+8VmhMQ8*Hh|#Uw@36&; zQDjRO!Vv1d+zYhrE2SymIJ>V{Z7+g028JS!F<4IzDy>}Y9GKN!HuVgY2ZHG-$>!eBxcA}x&V7%_gpKagAJ$aI}eop<65IER4@-2GW5Z(@{Q zq6`1M{{Zewfk02tw&A{W@6O2~O4##PS=JF}Ehd9B{Kp4cXr}Vx00~Y$xGf*Y{~>&306gJC6TCS`aygi0?!|Dq z_$qYsP3l7d;*63JwfYn1+cAH-eqf$rQ#dk&T3?_Xq6#M=6prl}4|_!bUG6s;k08h% zU6N_MahcyE+%8fI-Fj?e`cR2TP;hw>vt8r_67f^MirpZevv-Wal8B^uG&_JYyg3Px zXl%!nYc*+zzWppbll#$#s6n;;9=BqVaY*iaklkKfw#|TJ$_OR}1s0|tYPk*ax3T5= zf!A^g0sk-OESJOv+|=o}nuBt#9$-4QT9IG6_@|o2Ut3ERrt?0sW_I{fkC`YxAM+wl z9OUw{xqX=l+b1#xH-k~>ISwnGez6Z;2kt5NG^eBGQS-mb}ev*NH{&G3X*av}Md&UQaO+ zuMe7lGy=5ItQ_U4ab0tTg}^9FX%+CddkS*%U%R&$sFIvi_bSQ zFo&!ADDkAwB>djg#^|CtUdzksRc==6%I2dy%^8`Ry{k*a;w4@{?<11)q@M2aB6AHl zje$UqKu|Bx+brTit9i{T;LTM4e!-r^DLB~Ehh_K;dO4hi{%QhG@mH4L*6k38nGWR$ z<&jU)n7ktcR?i_ec*_mE+qTZS{Plb$>a^S>#&i^x`sS zx9@8%U(*yI#sfjLnuY^f^@5yykw#N($lxM6&Io+R%tcBqpPhUwN5b9TE}Jwy`uiy9 z0_go0y;YgU!|=IaV`wlIn`^6Z*Nl%eK@dirtFlQzvp`VdmU0RDq!|L$ik)N@e?wt^dvRezj<|<3&<@+h36n;nVGeo7 zMaauRW@>%Ln2~YZSoz?Dg+IVNfRwY|UB6T!e@>8|6QUX(N$5VQ$3~pDTrp|^W@k1+ z-tSkJ^>FU{>!JJH*`J69$G5+^yUlo@!;mE3WAo$Py7(%I2^W^jCAwBh+q{_wOxgHo z?5ClI`Y*qq$U^O-Kbjr0zl3-})E48%JFxa@^=?xdY;-a_K^7Lztvs>#42QV&iwa)1 zy}vF=cH_{SVmWk$t&q_-Y9oPA*E=7&)X~y@?Y)C~F}>4l$B1nVXPUv9YY)Os1A7Iw zTfS~wE`R95_9xQD@zr7+L|q1F-5NZ2yw=G1+EyNYO3{;DBc*NMOtjpah(ha<7c8VT z{F+1A``)ip!HKLk zzHqrudz)EYq7G{;CS8U1jCV2def#>0&ucKbvLv@R)WX|f#I#yfC($b6*G9i1P}pk7 zY0vvCtNVwu?i%o2=<}eAt39XJr%L(m4$Elll*h1fY4QYZ`Uv#DH8RniGu9fUt$i2< zR>}TGGJgrym`5-q9m#t52eh$ta;^=OTgQ-oNI;hH8GU=snDF(NI^dYGt&JpK?= zW&f@1``?l#isd1(r@h$SqiJnRz2VcVOmF+Fg^-Geeq_w_msXv;Pm3HTaoWO;j*FyQ z>`Jc-*$z1ZE(KTyb@3OU8-x%zKpv*wdM^4Bi?9i8EN`HBU8I1GF#Fd7X z`?hL8|DSzo0q?L0EM5vsHKDusiCJ0r(P%HZiHHPSy}}5I&14DY(5BJSJMRC=JskXT zsZP>gdbc<8f!<4r^}FB>VO(wsK|CS~unphnbEYtvNwQcgszl;+17V6>++tLyxZ0!B z%`z}WvhK{M&7W8~(K`sZkC%*-ofiwKq((ZM)6e}~zg99D#mam-olt#qNY{7~kVwn+ zR($8&ktr_QNkxC>}_t-mt7degpWG@fMez|jttEsP= zI>8X#(34m>2we~qP}+u}I}?N!xzFaw#-v-+(AkFW%^~0iqo4W{HGPAVy2i=>D2^0> z+si@IR{{;L;0OG(Gb;~2T1g#R0N((eWIt{!!uyaBQdCfMvd8^}^&6<4=JQfao)+HC zAjs!9D&!mBi;tgHMWd{^H%Yc+v7#*ijg|hc|GCYt_6Cg6i@^}SC5c3 zFNAZlgFA*}%U5T^p{`V=F(8Z~?)iWBU>+QzIFRGk}eX5 zY#M#iMfeYDh^{B-s8|tM9r-1OC?JPYb1>ir=`2@6erdyMHY_4PmQ2@~odibx8KNVS zb+@5yZ|Fc&fG9}q^s9MTzjqD!3`zK^&L3l}cMq22a;%y?0pe?T(L)lMPne}_y;Ci; zeT5F<^S*I19Y^NTR6;&O1Xn{d1_%Q|X1zLz%_?rJ_;sph<2YLD3t@@+adC>?8?mS%eHCf@9|NvKycNf8`bZEl6cn{4F_;{$EfP2*Mq zXH3jN#78-k5JQ!D&ZBNd1S?p{Vwc<%#{!g#63Y5>jZUmD!Buwh=5D6g}G zWUv(NQzF@yEJL>*&u6+Xi$W%?1SiA88KxtrSY5CDj3 z3lP;B9`tr-NE4kbCZe1UZ36p++yR{LY&yidx~QcGS91n(jeMZ{VQe}? zlKK^;lqZJ&p^7cw5$eQ2rIp}jc$f-M+@GL2>phsc=VLduVXgY!kpQ%3Ph@;=9$0<3uE$n?r`1S==^zbMfzQt! zzcH7i4gBrA2h{K{8a-QkTUr9QC;o^7wZa!d&wiNbB=1j0p=(Z_dj5VH1TIF&(wGVH z&Nk6WTMv-kS!h>X+vO#hi~V7XLpq5$F--P)cZkQrK>Y6v6y!SwCx=zYu*mx@N$G0h z$FH8XLqBiz{o+Vg9lJUXz1!EF+AX)b5g16$+QP_m%}4e^v2*1Tfblh^RZa_0C`uTA zdb|gAOYMA;3j^3u`{6( zvrz=au75$)LLnOssuu8!&OEnyR~Rft{FTWa{gT~H30h@7=dDJ-5wc!%aRv-GNZCQk zoh_d8;rGC7uN#&f8!QK_j;_%yaK$=)>f zoU)-?uVft%1&1q=#WwE6DfCRno_Lr7vL?HcB5++CQ5Pwi3TI|p`g|Jo<5Y!BVA#%( zr9tFd0~;^7YW@a{q6j9je|YiQcRl~Uwu0fvlHV!)QN4-ftz^8|V_BMah!8Oea@#nF zcroK;*w{@-oiT~u`Jxox2XYbiXI|q3I5Yb`j!7Mu!pSX#7flVvh@orFHQ&texP+NK ziXvgDeYFNRozJuj_c)o?H571a%vU$t)I*qDfjy4$YiRTi^Etz~R69QcoJ78%$~@2p zqx+L90U~9I=WISEWE+T=+s+J{x9YVLhj0|4Q@c_Mfx+d8NV&=qaw8uJGvu&arwyjW5133G@2OycF6n*LH0oB2jWjT}V+}4j|RK z-y0;F3a>E_wEcqH_nH3jH&UAB$Ug^PFI5xjSyHIMBZ#C372L^h#&m2lo*+7dxak5> z3rFTf_=>(6k>v28NE={??8JAZ60@#9MH-30ydY4Rwn0hjrNfMP4g-cz91Qlk`_mT{ z?oh7w1=9D2*C~4yFoRQuXlXD@$%T{*8RT3g7o7)^1fOXUbQN26BWi9iw35i_OU4{? z+fwwdhUnF}?r(%ioMQ~-6&5n_*N)34_?&|b(UCpyp9%Lz)i@z^n0_>Ri=RP@iGNP0 zzFOY-{uX}rhg4HYP_G5RX-fLkJd-4>$M@QhpNv&|9(r>?qEaAh6=EUfxjItI0MrS= zG2O+v>VldJ8-|Nr^3z*fVpoF|(;OZD#8ed3r=6m=G8*G#!->t{jQr)Wq!|kh8 zkKGal@yR9fcC`+wc7Y3Xz=H(1-&Q?zi-KG?`P#eS_GYI4Z1XhtY0rk|7rbN#k4Z%; zq37F#+j5ntj*O4f^e)mY2oCw~|3{cH4&qM6*x8=qSApURPmFp-(cp{DIYFI? z;N)H_TyOZ$-fzn_L?@8v-~R9ax#;+x%a4;o>I*z9EBTs4d{VP-n%C98K4}b9O7l4} z`f=$%kRPp(rgc>^qh4i5slJsX|9+>pZH8=_Cny#1Io^7lYU%g}+sFy?L^1=?XlA${ zd=w5iJeV1E6y!l6Gc@4`FZzDt)k&XTZ6g%TFz{``F9%cWI)4HL6iKKlhMf%O!yU!e zbqHaf|I^1=Mzz(oZytAdcPmbyK#LQkP_)I}p=gi-EffMFNOAXKb=-l-#C~FHLBI~7zxq;6|~qs7gv7`h4n#k*zgDh}8Y#zpaN^z9p9H>v3{cHmcO> z^)r9l(S+8q(vK}%$@yGHlH#`<+t;M8I=yj;IsPDm(Yn-dX2OHqcG7_)^@Ajhe3TWh8e zk7s`X4@SY<3n6l^!aYX*_SuZ1n#F=DH5gOb2&vD|YY=-MdK@O%9J_X>65 z5-0v#Q*lW6Ye}pgTCXQR5b*7$&rFwGPd7xl0>%S0-#n*|Q}lHnhCoefm2Dn0@iQb|ubkWnwvsM7t<# zZ9*psCrSV$Wa7bew52(kRsY0*r6f-GTbtmZky;`*RIzmN=<+xXAkXzKLg}Gc^||G5 zUgzLmZER$+z?phKr4VVTTx>n%i&l;+jo6+$zHk-5 zP}{Yxbt6d-2)!Ra>0SXU&t#nMZCW^I8LI#faph8j+-rGyf8v{GavJoSF~ z9u(=Zu=WK7O$dDRUnrJC>hvrKq)f6QeJ>Z?s=ta-gd5O1lPC_Y+7!cq{}*K+O_@ZA zr81d-6T<~miXPipWp@Fv2`qkPd{4Z`vYIDd&zHUYDHeE>CfsmX*s8S|ymNV-co8=^ zS$y!1u{5cF`}awRxQUls`nCk;t&)7zux%zLu1LU;LO;zINH^a+U1-dm_A7so(N(-ed9)rN6Vjdpe=B+;Ud4a4rF;~x6ZDe^4C@M5IB!Cw48_#M4$bjY$zh4fo`o~H{sB z8Wbtcl=|SiOUr?{u(8omFz~YLohf+%#{aI0FO8Cn^<@xOwXkG~jIW}#rPYyDVMrV( z@Ty-7romVj&F{Bd!*i^Vd0QH%Ma4yA%i+d6K$)ekzAc+GDUP8*Ob`kx(8cetg*Vh+J=goNmu5uzWY}tVX z_*Hk7p(ikFG2Ao?!^_d6Fsq~*QEh2-(A~+m3CuDvD{v~Zua?{ZS4(t3K_G$A#t7+G zGoM&>Y6y>7Mp%6rdp5UlJk=P-*Yzc2S}fbmU4!ZHseqN7%^uT@Byz0_E_M3wS}>x` zWH^W*0AOU|Ph)&ET}L3Qe*Fv6lM^IyIwAuc%OW5GQ8laJENYqzMmbYbk{-dJK=ES zpRt^iMf9CIctl+Nw1hSdmt#DzrIL47(DOd*zEc5aQOZ5!Np-8RgQ)ZWjAAFQ?aGQm z_HdF)`UW8y6AKbp79lHgQFPzq8K8`U@~CMsM-gxF{oh+5_qx!Gv9SGcaItgmGGil2 z@*)6VZna-~yPDgVD<#@|eRgF*Lr;TjS7o0y^7W4OG44~N;E_+ZeHM%Lj9h39uLpxJ zA$Qo=ADJ{_c&HL_mutIA)BWMenFw2aCA5bJ(|X3;3O0iS-3kPqK)2cs4kK5>ETO=c zv>aPoA%6A^Z2UKdg~?O}_1Vg^huDf6w2Lw;{}BNxifwDDXjl0cfz=7bsO=Coa-A2! zS^i-RE)XMRYh>eZI$yb4;TVoxVwr?o;T2e-?D((ET%}Zj`cdGp*oau;eV+ehXyFlY z0Z`aJ6jUC|#!0qHP7gshaw5gK*M_-~gx~j{VuX_v9IS^Ek@;@$X@7DyEKj`QCoG6y z(X+adE=O#tN36Fi+5nORDKKjwo?FoqCDvRiJ*)b9S8jowlwp$eD zOD=*6;oqM^>q;Bv%FIWoU+s=u5r)T&#SeMsFDPl6Foi^1Vqm|TW zdHggr>bDPJ2vB{jzlJ(ZF222u6Kq8+v@#VEbT~krnCS?~GR!TPk(b2BE$?hYaR_z&7H1R5MNYiepM$?y6sTL_7Guo`=Kq1A$Zjt=h7&WVQWVL9P=b0) zBEDm0C$sjAzq6M}NB}p|Q(o1v`J3~MPZ#zx1oodMtps2 zIfl`Sg>xa*;wo~w+m_v_tJd#?@(CU3n{FlmCxBe~*J^n^~Fy{EpbvD)Y9`Igw z{)V^c`|BxxtuDO5Vyfa7&NoyBH z8&$7A&RgGXSw;O$LUD|3#u{UR)rB1Y^Uy}wG$_Ptg|%IO0?!W6DlEFm#E!%r{2+8< zHUdy15S!>5wc*`3v6NcocLRM9BY{?TykYn@V8<0wQLO?{y}xeRK-m3AK$e=#!UrZ) z?qdt64NGtn^p_smyZYYLd_{Ra`fZu=PIG(H-HFTh>wcVhG{GuvYjaEIOWFfP6$lM% zUXBpRz)0ehd~*Mh#z&V>4;jv!FvqaRi*ZhqRxO=Q4mS+*MkuQcrQ_?zEq{65cKW6s zeq6rZMc@xi98uZ798SZn!bU)wiYjG)c|A;w74Vul4#o9v}g%|HtRD+c=dPLo z)4-D8bJqGK&3%=fKzxLQrjwDs)I4qTW^2Hn_Fjrr2Yr zP$=_OK6`Kh_1X+Qrn&t;nx@e!9fO4o{C^Ck#feN9p#n0jUr_IA%0>#-Llmt495#rT zIco)p+J9-ixM-|u5_N@>_!q@dAOk=U9{i36SAejCfU%}`z|-G$PH@YJJR#F89Z!|_ z0N2v(q2Z(dp<+}lHLzyEl^uF}E`~9zIt9d@_&`$Ie$t*XwS|R!NP6YC+;m_YSO2V$+#sSYFoO#qM$OFhWHJ2*NV7cg>n5MO; zDpMYM;O(8p=;FCvgqMNhU;`rnDQDN(6%kfs-p3l?twJCD6a_31_sorF@WDdOd zUX!ur8|(>sMP_OAhbpWtpDshy!th+uCj!{1Z_fh8SNGUb0xR+C^+6{_ZU#^2+ISP9 z(sijjH@G_Pl_1YM&bUm)EekjP3U-kO=J1sMqxW1lTkCM&x~PXN*W!sCqc-IhcA<(! zsrM}Kl4h(q%&>WURwylA;x1fnbn$p^;V~Fg_Y6*N{Z@wan7QlBW`hV-o*w!naz$t8 zvw#WTJ{CwQ)mN@}6|Hykk6t;W0P_fEKJ^N+05Zn7R>qb5bc?Q2oygf)+tik2<%i7C zdo%qT`TEV z=co$${|B!U&4cyvfa~n-d83x+>v1%q#9AKtX#Z-uTMn_;I=jt3FQmdTL61>RK!gn7 z57Dc`^T(nVW@XQ!d$N>x-)Y~{=`FCDQeJ*6* zoAD(gw@e>-`uS<_Lof0W1?bUB?97CigUzU0R;j!fzK^g=cADYkYMkI7|Vn-YH|urqz_w~zDHK!EA@lpr(j-!LP#*c zV0;2N(~C@?pSuI7%+WXLJ!01&(IKne#}1V&8GwkGDt}NL@O_ z91GqurQ@Ku6sQ?k^lnfon@(Bird-w@d{n1Y&jzY z7~AUi;q6V8jsMhA{-;(pB*E!d$+NXRqF3%gg6iJe1-l~9V|y5EL)+v$;uJuVneg1Z z!W8-culwL_RzfowgNdCkg!YIS7RUd7343`Wa)cKd&vd#5|HNT;hFFlJTHBULD~Wj% z*TrhHn7N23qn(U#;U4y}KpSk$w#WN&5^?<7@=P(D0KIDBo)afQbL1K^-7e-i6FQY| zy+|UlU2X4eL!!+daKzwD#Xe-$nIXdKm0icBNyj)lmSK+?QLeS<9Ra`bAZ72WBM*>V zojP2IE7a7_G5N_Oc03ZDDi|cW!HZ zaQxcsl8(q=N_JlcWom3qsf$#_bZ5f9{aUO#b=IoQ8SYqPsf#S<5xqXTEAKdb@+Rj_ zPu}|V>NP*%4B>j&tDn39x}i2c4mDRwcO?!VE!cpIB62vj$0!4S5)OuNrE^ddi(tX* zQthS>?Z}MMKFA`OIO=ybJ7>Y=iKk9vRq8VF`tF1qoEaHFk^0*1RnJNy`Xv>?*wAX< z&pF?tjtd(wAXN2i&mhIa!74QIq+8K&;snHXdq#n78DEo<9!E)NOud*6_h0sg-nl-jn257ZXAR{!~I0jR+Pow!c#;URC|8 WYvPwI?JeVPX0|T}+H&qv82 #include #include +#include #include #include @@ -193,7 +194,7 @@ UTEST( FontRendering, editorTest ) { WindowBackend::Default, 32, {}, 1, false, true ), UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1 ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); - UICodeEditor* editor = UICodeEditor::New(); + auto* editor = UICodeEditor::New(); editor->setPixelsSize( app.getUI()->getPixelsSize() ); editor->loadFromFile( "assets/textformat/english.utf8.lf.bom.txt" ); SceneManager::instance()->update(); @@ -218,7 +219,7 @@ UTEST( FontRendering, textEditTest ) { WindowBackend::Default, 32, {}, 1, false, true ), UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1 ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); - UITextEdit* editor = UITextEdit::New(); + auto* editor = UITextEdit::New(); editor->setPixelsSize( app.getUI()->getPixelsSize() ); editor->loadFromFile( "assets/textformat/english.utf8.lf.bom.txt" ); SceneManager::instance()->update(); @@ -235,3 +236,134 @@ UTEST( FontRendering, textEditTest ) { runTest(); } } + +UTEST( FontRendering, tabsTest ) { + const auto runTest = [&]() { + UIApplication app( + WindowSettings( 1024, 650, "eepp - Tabs Test", WindowStyle::Default, + WindowBackend::Default, 32, {}, 1, false, true ), + UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1 ) ); + FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); + auto* editor = UICodeEditor::New(); + editor->setPixelsSize( app.getUI()->getPixelsSize() ); + editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + SceneManager::instance()->update(); + SceneManager::instance()->draw(); + compareImages( utest_state, utest_result, app.getWindow(), + "eepp-editor-monospace-tabs-test" ); + }; + + UTEST_PRINT_STEP( "Text Shaper disabled" ); + runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled" ); + { + BoolScopedOp op( Text::TextShaperEnabled, true ); + runTest(); + } +} + +UTEST( FontRendering, tabStopTest ) { + const auto runTest = [&]() { + UIApplication app( + WindowSettings( 1024, 650, "eepp - Tab Stop Test", WindowStyle::Default, + WindowBackend::Default, 32, {}, 1, false, true ), + UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1 ) ); + FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); + auto* editor = UICodeEditor::New(); + editor->setTabStops( true ); + editor->setPixelsSize( app.getUI()->getPixelsSize() ); + editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + SceneManager::instance()->update(); + SceneManager::instance()->draw(); + compareImages( utest_state, utest_result, app.getWindow(), + "eepp-editor-monospace-tab-stop-test" ); + }; + + UTEST_PRINT_STEP( "Text Shaper disabled" ); + runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled" ); + { + BoolScopedOp op( Text::TextShaperEnabled, true ); + runTest(); + } +} + +UTEST( FontRendering, tabsTextEditTest ) { + const auto runTest = [&]() { + UIApplication app( + WindowSettings( 1024, 650, "eepp - TextEdit - Tabs Test", WindowStyle::Default, + WindowBackend::Default, 32, {}, 1, false, true ), + UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1 ) ); + FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); + auto* editor = UITextEdit::New(); + editor->setPixelsSize( app.getUI()->getPixelsSize() ); + editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + SceneManager::instance()->update(); + SceneManager::instance()->draw(); + compareImages( utest_state, utest_result, app.getWindow(), "eepp-text-edit-tabs-test" ); + }; + + UTEST_PRINT_STEP( "Text Shaper disabled" ); + runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled" ); + { + BoolScopedOp op( Text::TextShaperEnabled, true ); + runTest(); + } +} + +UTEST( FontRendering, tabStopTextEditTest ) { + const auto runTest = [&]() { + UIApplication app( + WindowSettings( 1024, 650, "eepp - TextEdit - Tab Stop Test", WindowStyle::Default, + WindowBackend::Default, 32, {}, 1, false, true ), + UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1 ) ); + FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); + auto* editor = UITextEdit::New(); + editor->setTabStops( true ); + editor->setPixelsSize( app.getUI()->getPixelsSize() ); + editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + SceneManager::instance()->update(); + SceneManager::instance()->draw(); + compareImages( utest_state, utest_result, app.getWindow(), "eepp-text-edit-tab-stop-test" ); + }; + + UTEST_PRINT_STEP( "Text Shaper disabled" ); + runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled" ); + { + BoolScopedOp op( Text::TextShaperEnabled, true ); + runTest(); + } +} + +UTEST( FontRendering, textViewTest ) { + const auto runTest = [&]() { + UIApplication app( WindowSettings( 1024, 650, "eepp - TextView", WindowStyle::Default, + WindowBackend::Default, 32, {}, 1, false, true ), + UIApplication::Settings( + Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1.5f ) ); + FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); + auto* view = UITextView::New(); + view->setPixelsSize( app.getUI()->getPixelsSize() ); + std::string file; + FileSystem::fileGet( "assets/textformat/english.utf8.lf.bom.txt", file ); + view->setText( file ); + SceneManager::instance()->update(); + SceneManager::instance()->draw(); + compareImages( utest_state, utest_result, app.getWindow(), "eepp-textview" ); + }; + + UTEST_PRINT_STEP( "Text Shaper disabled" ); + runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled" ); + { + BoolScopedOp op( Text::TextShaperEnabled, true ); + runTest(); + } +}