From 0ec9dadb189bbe5eb7a40becaf3452a735663380 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Mon, 25 Sep 2023 15:05:29 +0200 Subject: [PATCH] Add measureText() method (#1870) --- example/src/Tests/assets/DIN-Medium.ttf | Bin 0 -> 44056 bytes example/src/Tests/useAssets.ts | 6 +++ package/cpp/api/JsiSkFont.h | 17 ++++++++ .../snapshots/text/text-bounds-android.png | Bin 0 -> 11315 bytes .../snapshots/text/text-bounds-ios.png | Bin 0 -> 11525 bytes .../snapshots/text/text-path-bug-android.png | Bin 0 -> 21164 bytes .../src/renderer/__tests__/e2e/Text.spec.tsx | 40 +++++++++++++++++- package/src/renderer/__tests__/setup.tsx | 4 ++ .../src/skia/__tests__/assets/DIN-Medium.ttf | Bin 0 -> 44056 bytes package/src/skia/types/Font/Font.ts | 10 +++++ package/src/skia/web/JsiSkFont.ts | 7 ++- 11 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 example/src/Tests/assets/DIN-Medium.ttf create mode 100644 package/src/__tests__/snapshots/text/text-bounds-android.png create mode 100644 package/src/__tests__/snapshots/text/text-bounds-ios.png create mode 100644 package/src/__tests__/snapshots/text/text-path-bug-android.png create mode 100644 package/src/skia/__tests__/assets/DIN-Medium.ttf diff --git a/example/src/Tests/assets/DIN-Medium.ttf b/example/src/Tests/assets/DIN-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a8360c2fd9e549b7e05bd07aa42d8ab5a1ff8c4c GIT binary patch literal 44056 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 mY*ZsQsmUd&Sp4`JN^ literal 0 HcmV?d00001 diff --git a/example/src/Tests/useAssets.ts b/example/src/Tests/useAssets.ts index d65f78ee01..9d7c660ab1 100644 --- a/example/src/Tests/useAssets.ts +++ b/example/src/Tests/useAssets.ts @@ -35,6 +35,10 @@ export const useAssets = () => { require("./assets/NotoSansSC-Regular.otf"), errorHandler ); + const DinMedium = useTypeface( + require("./assets/DIN-Medium.ttf"), + errorHandler + ); if (error) { throw new Error("Failed to load assets: " + error.message); } @@ -44,6 +48,7 @@ export const useAssets = () => { !NotoColorEmoji || !NotoSansSCRegular || !UberMoveMediumMono || + !DinMedium || !skiaLogoJpeg || !skiaLogoPng || !mask @@ -55,6 +60,7 @@ export const useAssets = () => { NotoColorEmoji, NotoSansSCRegular, UberMoveMediumMono, + DinMedium, oslo, skiaLogoJpeg, skiaLogoPng, diff --git a/package/cpp/api/JsiSkFont.h b/package/cpp/api/JsiSkFont.h index b0dd78e8d6..548f8ed50e 100644 --- a/package/cpp/api/JsiSkFont.h +++ b/package/cpp/api/JsiSkFont.h @@ -60,6 +60,7 @@ class JsiSkFont : public JsiSkWrappingSharedPtrHostObject { return jsiWidths; } + // TODO: deprecate JSI_HOST_FUNCTION(getTextWidth) { auto str = arguments[0].asString(runtime).utf8(runtime); auto numGlyphIDs = getObject()->countText(str.c_str(), str.length(), @@ -85,6 +86,21 @@ class JsiSkFont : public JsiSkWrappingSharedPtrHostObject { return jsi::Value(std::accumulate(widthPtrs.begin(), widthPtrs.end(), 0)); } + JSI_HOST_FUNCTION(measureText) { + auto str = arguments[0].asString(runtime).utf8(runtime); + SkRect bounds; + if (count > 1) { + auto paint = JsiSkPaint::fromValue(runtime, arguments[1]); + getObject()->measureText(str.c_str(), str.length(), SkTextEncoding::kUTF8, + &bounds, paint.get()); + } else { + getObject()->measureText(str.c_str(), str.length(), SkTextEncoding::kUTF8, + &bounds); + } + return jsi::Object::createFromHostObject( + runtime, std::make_shared(getContext(), std::move(bounds))); + } + JSI_HOST_FUNCTION(getMetrics) { SkFontMetrics fm; getObject()->getMetrics(&fm); @@ -260,6 +276,7 @@ class JsiSkFont : public JsiSkWrappingSharedPtrHostObject { JSI_EXPORT_FUNC(JsiSkFont, setTypeface), JSI_EXPORT_FUNC(JsiSkFont, getGlyphWidths), JSI_EXPORT_FUNC(JsiSkFont, getTextWidth), + JSI_EXPORT_FUNC(JsiSkFont, measureText), JSI_EXPORT_FUNC(JsiSkFont, dispose)) JsiSkFont(std::shared_ptr context, const SkFont &font) diff --git a/package/src/__tests__/snapshots/text/text-bounds-android.png b/package/src/__tests__/snapshots/text/text-bounds-android.png new file mode 100644 index 0000000000000000000000000000000000000000..a6205bf3d3d05a8c86c4d491acc311c0191b1e0b GIT binary patch literal 11315 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 G&i?_+aj2jL6D1-j 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 literal 0 HcmV?d00001 diff --git a/package/src/__tests__/snapshots/text/text-path-bug-android.png b/package/src/__tests__/snapshots/text/text-path-bug-android.png new file mode 100644 index 0000000000000000000000000000000000000000..6626c0f645ee73f3769577d33ef6694bf4405a1a GIT binary patch literal 21164 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 YGuN`6-`{+S%w&>0D}5&Z)U~_+3;bAuDF6Tf literal 0 HcmV?d00001 diff --git a/package/src/renderer/__tests__/e2e/Text.spec.tsx b/package/src/renderer/__tests__/e2e/Text.spec.tsx index dd2acde113..3f537aac63 100644 --- a/package/src/renderer/__tests__/e2e/Text.spec.tsx +++ b/package/src/renderer/__tests__/e2e/Text.spec.tsx @@ -5,7 +5,7 @@ import { itRunsCIAndNodeOnly, itRunsE2eOnly, } from "../../../__tests__/setup"; -import { Fill, Group, Text, TextPath } from "../../components"; +import { Fill, Group, Rect, Text, TextPath } from "../../components"; import { fonts, importSkia, surface } from "../setup"; describe("Text", () => { @@ -30,6 +30,44 @@ describe("Text", () => { ); expect(result).toBe(64); }); + itRunsE2eOnly("Should calculate text width correctly", async () => { + const font = fonts.DinMedium; + const result = await surface.eval( + (_Skia, ctx) => { + return ctx.font.measureText( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do" + ).width; + }, + { font } + ); + expect(result).toBeLessThan(1000); + }); + + itRunsE2eOnly("should draw the text bound measure correctly", async () => { + const font = fonts.DinMedium; + const bounds = await surface.eval( + (_Skia, ctx) => { + return ctx.font.measureText("Lorem ipsum"); + }, + { font } + ); + const image = await surface.draw( + <> + + + + + + + ); + checkImage(image, `snapshots/text/text-bounds-${surface.OS}.png`); + }); // We test it only on Android and iOS now because there might be no default font on Web itRunsE2eOnly("The font property is optional", async () => { diff --git a/package/src/renderer/__tests__/setup.tsx b/package/src/renderer/__tests__/setup.tsx index 38f1027973..541c8142bc 100644 --- a/package/src/renderer/__tests__/setup.tsx +++ b/package/src/renderer/__tests__/setup.tsx @@ -42,6 +42,7 @@ export let fonts: { NotoColorEmoji: SkFont; NotoSansSCRegular: SkFont; UberMoveMediumMono: SkFont; + DinMedium: SkFont; }; beforeAll(async () => { @@ -67,6 +68,7 @@ beforeAll(async () => { "skia/__tests__/assets/UberMove-Medium_mono.ttf", fontSize ); + const DinMedium = loadFont("skia/__tests__/assets/DIN-Medium.ttf", fontSize); const oslo = loadImage("skia/__tests__/assets/oslo.jpg"); const skiaLogoPng = loadImage("skia/__tests__/assets/skia_logo.png"); const skiaLogoJpeg = loadImage("skia/__tests__/assets/skia_logo_jpeg.jpg"); @@ -77,6 +79,7 @@ beforeAll(async () => { NotoColorEmoji, NotoSansSCRegular, UberMoveMediumMono, + DinMedium, }; assets.set(mask, "mask"); assets.set(oslo, "oslo"); @@ -84,6 +87,7 @@ beforeAll(async () => { assets.set(NotoColorEmoji, "NotoColorEmoji"); assets.set(NotoSansSCRegular, "NotoSansSCRegular"); assets.set(UberMoveMediumMono, "UberMoveMediumMono"); + assets.set(DinMedium, "DinMedium"); assets.set(skiaLogoPng, "skiaLogoPng"); assets.set(skiaLogoJpeg, "skiaLogoJpeg"); }); diff --git a/package/src/skia/__tests__/assets/DIN-Medium.ttf b/package/src/skia/__tests__/assets/DIN-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a8360c2fd9e549b7e05bd07aa42d8ab5a1ff8c4c GIT binary patch literal 44056 zcmb?^2Vfk<)&I<%nyq@$73oeVUD4^JlTJG6B%SWmtuEVg#Z7XzWsK#5ZHkReLPpOw%v)4jfALrTHBSh6337**^vqqhJ96H4g}AL*h}2itZ(Y0N8-KdS zjGG@4!Z2(7*}I+MvVWW_#EiRfzh!L4rmgjJcZ~^=F$ZO=+q8Dq4q+8DkbZ&QvT1zJ z*pj`Qekert4MJRW#pxT@Zg}PU<`90*!tYI|BO@g(Rl{`;uFFo}y8GO$g;68Qe+=(? zVavvy+uoV|k1`>?G#|yiHokrR+H;>+I!lNvgLvl8Ti2eu!;qsDBYiracWzs|bz}E3 ze=4ru5JG!?$M#*j+s>?R6XI$ou7f*vZrqV`@16kai`I()LAbzCymt5-t8-ibA!Zox zoDkoi`^MMe=ZUK(0x3I@FVQa4l>g{C{!2NC-&d#Xh0Syhrz?8Bj@0qh@Fq(I7H#f1Z#N6T*O;9C4@qULn@vTGc_~x3zj2FA*E`v_XW#8G1TJ%oJbO)2V2| z?Rq*5`FG-ZnSwqR4~s*3T8cEeS5IpqOMX&M8^oCWyq-=GCi#}0P8B&?nx0M*Ce1Wj z-&p7DIcxX&)15sVcWvIZE$ZwVU$=4R?!eI6ZO-}Iw~tpl>mrfH8t448){Sr8b^68) z&UJg7ecQL~UUd5Q9nQgRyFn{!cW>UlZS6Q`(@)Nw8^<@U-L=tK*Vr>SJa^-U&1Y?0 zymRfgU5oeZ*yyZx&hKtPen9=u5)9VW1cSkrV5m0OP#bJ?)&-;W;bG0ZQS8JW0Wk#pZ$s{UP{(%sQjK(- zh~QtNsNwvxaQ8T#--XgPqKBNg-UHZ&`?sNtMabVSb|7bvuc_p1D0MfUp*z;%>BQaf zr<}NJBYxS4-**AhTN_dDK`|`m@_RO;4O_)x+($Lsh14Frh3>4!F<*3x7XALflqXt5 z5dZ2>dpZYkR}j=x3)sN0k>3>rF6u=XFod?M_f9QmYAGkXg9x2R56&i{Ads~UM_Qb` zai&okAE|Ud{oy`CN@`kq#*CSnS=l+cdB*$#li6Y|EV9{)9VMksm)le3E%#Ma`m3q~ zHMPOI`cOk-Q@A-2ZE0<5@96BB)!ozE*FP{gG<(k6;d%2HEL^nsv?WWIEnhJ*x^mU( zHEYGX^&2*hZ90AP8C%A;Zri@&%$>V-pLO;*=kD2i-oE|kf8vuDTzJvNpZfG?F8S=G zpZok}mw(}kE3dlxi(mTkSH619wby;^>)#O9-*DqiH{WvWZQ}NCe#>y+;2n3~b@x5r zx%a;Nzx%yI4~WA@9{iv0|KOqjefa;5KJw@fAA9^qPyG1Fr^M6G{N&l69((TjpS|$& zU;OgLmqdzIftJn@o!}~2;(T#XOvpMpOD>XY<+<{Fd6o70P4Q`Qx%eEo;O*jOajAG-TqLd* ze-wWZmx-^4OT}rjJ|Pevv>dI!X6~5XCD$X<}bTP%FCA@k`tdgBzhbVKvEi3uL>LzvfAnF-Q07x zT!Ra(8X0~UQif`0-`xgp-@;{{<<3i;mkw^Y)Y<1eeeH(3Q@nh}4;wFCUhBMDELyf1 zaPczN-JQ$rlgW+Cmq$@f3YCLLaQmgpQNkH|2{?0B?Qz_cT0Pr&x1oIgvIWcT{$!8+ z?#`a&c9+Z9d-p^0m)-qPkKMI=IqpiEtSM?tZBunlN1fCB_&r0FvIu3Mh~<}FN@Xru z=5gKq(508!FGV}_>qAnUn9-?cpy7A~4evc9KRF-I;^cAJDZ}IPxKOR-J$TiO>e-8y z^`c^~<ztT#IwFtQDuz zkzx=HxDL@-PKbW(Rne)PDKfOLh?UxI(XCyJ^9YVX9G}JYy<(*-$MK%X)~-TcyI5%m z;QTC(PviHq^z#>R9u_595Xa48q1GT$4Vy%!HcQOZoFWzcEhtCO7StK%Dy;?2wjlks z*s0~?x>77a8^bt9G`k4P0pZiUNH-xr18vQi_>)$KbXW`Gmawsj_2qZ`91vh zcj1&v(EesINB#_LdR=75e+r8{hVyfxN`6HI&ANbb3gRT==)00-BQp(Q0oz?@_J!roXi(qZN3;Vc%WH;HYafeycm9hV-?y2`Z4?% zH24Jig^nzBa9J0kJ-|2DiNBH_g`p!K8Noj9n?M7xiCFAE5F-Ku#Wb-7`39A3&Mf2l01FdKavp z_T~D^Qz;`=Wk@_EUPRUKUFBNPs$<7ni(u(o};^o-I=O1G4*USL`^&$Y$* zS=Sk^Rr5?+3O;L+-(GbTf2;PbdIo>1_U+q;`j<>xu2mb#g&!Jmo4D=>B&>#pQ?KQr z>eNAvd?j#IhbuE*)uCcW93E6I4`=T)am?is8gi5Hl1~}=3NOXLgog_##zVPz55O{% z=wc79%28A~I-a__0qF*$>8@s^o1yo58_In(vQ{>hNNc!8`p}U%(rmJp$Wm#>bvp9R zp~iND#6^v4Y-kD>n9|bec8gZ+a9CUG-R0f3-pUoN3)gOGwDeZlf(yz9g5v`VgYzS$ zu~)4AyqxTC<9FMeZPljYCu)XlrlO407Yw$dp7QdP#O{wjXO+4=dNQ0%C?-0NBG@s_)#aC`eX1?5BZOuVNZ)SiMh+Xnk_T+wq4H=5`< z1z1hxs}x){Qxhuz55p40U-IZ5po7tz;6j3#^49;pxNkwIBmebnZ zR8(GS&wU8@4x~0Y)i*{ms?i{O0Okt-k$soVn*GHo_j;jZuWYOYZq#9VEB$;oYrw$Nq*N zy2Wd9lkCNPMP#gL!T@Oj`bfN)-sCdNO|chWTfG{$3`3AS1}o7Z>{Cmg@(iSy`LVrw z_flQN#CPQ<4EcB>6LhBmy#g{of)~k8tc(3-ogx2&TSz#yO}r;xz<7scAV8aCxY0{D zL-d!S(Ii|m=^CTd!rDY8QjR1oB8}K(nqrqlc(G!aMR+z1cRCeQG{(oWQD=%iW`7`N z#r|G!HP80@XE!^Y>g*Z|*VQ#O)zyU`m94?qjm5={vxBjtdMeb=+1VhQ2;zl1(cJYI zZ)sxQRNSE1s730eWYu-6gieweh=;-0Pz(!*R6P}}a~VD9=CDz&AN$Sn(XK{lkv>9!rO9_?5>_%5R;H>igg=Yoca5%sBsLcU3nN(o_9o5prP#}_ zxZEX8b7}%}!lh&Rj&f6dQ@$zo=MibF=&r39YAALz%np?JZCR~BdsR{F-VxNzKk=@7 z88Wk8jH^}3OXZxv}tqbj+E9z3deya$wP$5k;uX9rg|AZ^EUpaaz0r1}%=AyM=6 zP`gwWuaah!@VILb8bvqp`JRR=uSXtawa% zTjy2<=Cybpo3+qnnjNVgY;@S`2Li#S=BB!qUq!yZ=ug~ z#FR^DZ;?@rEyL4OXE6wvS$)%Ci;umaTaw|7HOtLK2tT#!=S1xkf3IUv6!}c%NCT=fxdVJbqt8J4~ZI#p;~=h)u5nU z)GHVIcovT-Bd(14C@bQeEZpNluB$dKHFBt$If|l6P<#dVPzm}ADj@oWI4Y@rIq0P< zy_e7lHIR-_;#`d`BX?7YMg&H>2l_`sc!cVkz}Mv~DcMCPOQ+x0mM_a48HObT5m;PjV1Gy2cUtGRYK}J*(tu6Jk=vHz}S#MN}bTm0x zX6aORGG0R_7HNtS96r<-GKA#ov1RLi{+Dgq){!T69KV{huv%d6HSib@G~aHq?JyoO zvy>ni83eY1z?>QBDALhM8p$S{Wh5K;zMmy(G(wu`Y=jWDU1-% zO&~!xiQx^!i`6e(n^laP@mXNX0m5rEQocgnr zID>PWii?}(%B|Evwe9V(FBerg^Yfi}tjbwX;H)AE)~xemqO^08DNWJVOkilHPFu=I zEYL?9(P4aa6%ghMlFZYD(xDilvPOv^=EFKu3^5fbbE&?J%QvRFrm!Id&OVj&;^gKC zb^DAiMS>u`P^2{&Y?JTS&0}(_Q#2TRN)FX7_Ji&kL4VZB(;=091>Y3;4kE;;5_+XF z&`H*%k@k}8HkiuMl&VSU=CAhb*&`i$_r`uh+5$?4<`OSGbfS(H*VIW@(|}E_Hc9Is z#bvTwTE6PFvF(!P!nW1RL3G#u%f0e!^q)bT>O{G!;o@{)^UxBqUf zTpBw!wnr{Sy+Yzs(AsX}R+s*pw$XS>C9Ub#u?6xj9Q~_TKg`+_)#B;NTF{(r+=L0% z&45beGP`8R@O13li{$d-R_*t(+b@Cyz9jaowXtszcKShK&to*YU^?zlMz)V=2p$$A z^RjYarVN-V1D$y|$Al}B&fVfhq6c@`kZ+qDugOG4GT6=ImF^?bf)j+;M4YrjN>?(a z<;ooCkRcf89kN{-(4F#mXVYM%f3T@!tiHCo$(S>opEou$W3H+A(lfQ(>i#-=aj4&4 z*&6kmz4@C9t4lp4S*4ld#Vs+j@*#Cjysg~;4ZU3~6kjER*YI}Y7Is~eRnkV{Y7oEG z^KXNwX9bQnw5bhkrF6$hV<06G60AkmlP%Kd4;Whe~-nUXPB9vW9_c2ZYk6MPv&eOcxrC^XGwbyjm8jI)rZt+=?<=3Fw%-Bj((vy~J( z>i^(u_QS4(t{b6qgeWWnU^663I_BYf;yfv#p6Z&)GzC`op|R>RW0I_AU_fGM$xzs3 z^?3@k&9V2F#@^pmCyVOl{c^kZ*zx8seBqC>mE_Dyymv9)Yl2E&E_OpYP(SLlP10Do z+ftE3HhWx7!wZ97+>?EsEO*?fhhmm)^fg%o%3)Q+a>pZzSeYVeV@r}YhQ@|+kIU#H ze~BrrN;Z;ZA5UnD^GnLj`EI*$*M`_1rL%Tk#Cc9*MaG3P(n| z-B;%rIsJIEEi_whu5b8pL+rX>+t1Nb*j(^ybYTqFis%v2y7XFQ<;AgWCkbFzvXfXu z6;mkbkapBn*Lz|1lja1XBYy*{z1EOUaPUxoAW5NW*R-y!*#oW4rh;tajFgla#_WP7 zXKR1yV&Mk)f_ynJMdgnkJXgpsvBr(8mM#Sn5;cbTXy)owrJ0y zP-sz4)aLaSH!nn$skfG*xAGy_p}0EHD=zLUazG_CDzeoIxQAvimJ?DggW8y(+DJV! zliNtPTE=955Wj)eSS5|D85$tP($OKfLff>ZGONVlUe)~Gd(Erdj*=`nKC`%b?nM{P ztuCG^H~Z!cc01gzLj|ET$CXUd_)ki>2IiCr!X-Yc^~XN=YM#m5>N$aY=j3e7sOVZAiL6W} z;K;g44_uvFM=Lx{){3%gpN_<5$1a(PwxD!osZFg0LmISZ{N4^U#xg6y9( zv^_p&p*%FyHh5^Jb&#Hs5T|;^G=`Z_%gL2VkzYhmDa0_19wQy-O{2DCJod`?xO8Eb zaNUwF@2_A{xcUYP3;Mmz(&!RZbL|qw z_SO@%yNpSEPOE(aTRJ{9qCbu3ZyLsx2SsC%jc7PQDPYx5;E{yY#&Cgl$;9gy$6gvA zKld?tkF>_Fm2gczeMRg>y?##AFEu_d7WdA@v5}Z9I#H#?;KK_vXY54t{U$@ zL1|gydPP?`Q)nw2RFn$ZO2w#C<1qah@?Jx6X4ynkmU(Kd=nk)wnRYr>QV2~cgeG#I zptl(-knwsdQ%^C~WlAEtf>41``^or^pBW$j=KNbgcfIlm=idsaCg_7?Z8x}H zDU3_VsZP|k3kUfWJ5kR(;69J8!KIwc2lJ2$Ce=DwPF0}sg*;42za%+@F4py8-Mc}P z1G?x12ZO}I^uS5@U5Np;$|A8lg@>(-L`WoOY2yYG)M2MHOk&$G^-6BgMe$T_re8HF zepg6hyuWG674SilZyx$C2i}m)YQm^U$44RB6z6j$#sztz2{XA#_?R{j6P)e{1V@~Y z6`(LO9F(%ch6B7lklgJWq_|S5w0X|f#SO8y#&2p^-0B?fjePBEkzV=Nn)wlkZCU7w z%&U#G{i&UM@l|aEz33LR#2JS~H)`C2BMrUSjTc!^PYYe+h05kp{;I=JBrWV|#P9em zl+=!7A66BrUBdlZh0@4t)x!Pi^|eF0n)F;v>06%rf$N{$S5uTQ^zBGre*O%3(hl~| zDeWIf&*^QQ?W{a$?-utKHnz_WoV1IrmVSA0?|eI+ww|e&;#VNo=FmBrcwlHR$5KEOi>OR zNlQ>ZJ8i-Eg6{75X6BUC%gd}y_(T^b@y z^%qTRwN9W36(Av*Dc%r8u;7;-$hCryR=e|-TXy^bCg$8U*@s=z^Kk9GM z`F#Sn)2RMKUaOapn1`ZzK-jX-O`S~5)KfGGhPrX}>~Q;x?%el$^YE%Gu3QB{ zW{}6}z+m`0g|3p3B(!GKH&cwn>pN|fPHVu&(v;F+ts6pisWrd!)V|9;zwfCR_g#CP z+$u*VCSte7u9n8wU-VwGqdpm885t(=`S=Xj*ObmcyW{noChR{1jr26a50iS2DA<1X zm%eoNbI@92Ka`Q!%GfWZmvBO>H2#G;%z!gT$A3cUnW~{FUI!wD%!aNe;h}TEyY{cx z{c?7!PqxIqw^qwtw)XftD^cze%vuI9Ynd(rYF!fYSu=s<6bY~UboEm>K>Emkr z^QItS6Ii)Zgj6cCf%uwLh{i{pT{a|W}mrTTYA$?XkZmAkViEML$N}9{*b6d_53)98)dU(ssuO6 z2cOSJF6qq5cd618RFw~2UY5kAbWV^?6KQaZL)js&?*hue@%88r3e>XVhCms;7q;vjDxM=6mz0**YT*+F8oNcrebIu@06n}hz=(5IIzt*~|l zYg>yoi>byD4Acb9k&Esu^>^4UwZXE5o!x$`wXnG6dyN*;46nyS@pub>fxm)^ZJ7Lo zr9ks@G_OK3t`>DvaS3r5r{pw6CuEB()D!oi?(mdChLg3Lh~UyE6ca2`=MIb*Cs3iL zvYdE`)LB0_KNCaQ&&84!ryOncvI5~`q|oG+uI{ouMV4P&*_|>6^H)QbwZPn2UfEeZ zw!zWiFYhuJShEac=@!4+Q)x|4w^n-GeoK1H(b`;JU@k0lNpZZn$x~ElE~t;RI^1ow zc6)7`+uc@Ux7V~0{e^+2hd?PV@|}_YM8*8fn3Rorqz^Zc%xX37M7|7)?oobhua8u6 zCG5jf#XU)>CizfbVO2@1+nAkgbhnmN750@4H&!j^@cB9xR5cFI>b6+|=4c=gF$XNR zo^n@l+xq_g_3g!OuxAlL4PVfE@|r|XCL}BMr$Q>cO-NI4AZcloCS8W~&twf|n#9#v z>0}>Tn7FAANodE(nUrDGp9YM4>d(V)fm-xFBtw-{9C%}rEtYBCY5Brfac5n1nSihfjc09K4(JFXN9wBreCCj7kM=z6#tMyOIXC@_h_vBDk>7b2~$M9SYe!t+Dx z&MIqL6m&HPe5NjYV^znj-~LvnWMnm#l{I8#q`n$xTG3hdnSBEr+Uzq;4pW=GXwIyD ztHbEiB%;9nPy`Ki zfwS=$(&aqNYZ_HdA2IuoQC4rXI|7|$4Q^vJIwo%!9xN_hTIdVehlgXMlH+P369IV) z7)O-4xN)lQPgwzKCQUgA%slYP8>qBDHMd)iYEaBYvSqB(CCCs}Bw>==WpJotj1tqO z;7BsClwL>%7Ihh>gu!TuG8>sPP58Y^aTiE1qD(MXn(kH1#mti?lj^tOggF#>Y`vqS za=6-SGI`DI<-X41Y)8OZ9xUvtSP%`(Z!Q^2vs8lRnA6kEU^$hRG=uyX_)N9;^scVc zy&zRrm#wA@Yqh$(CCO@kRcqZZaj=z-L3W)h>*XZqqrGbvJMt2_9VwKi@{4qz#QfqmLWC(gv%Rx_Oim?-0 z|DSju6OIqkSFx6v37LYoREk`Wlp@z7qP$sDhOJu8qj&FnWNd8q<+9<2e~{lh-u$K0 z{y?=tugF5wDx3U{6m5yMg z<421_<-|bIYJ-cpz!Rhe(IQ?dKNrKZ7*{HCtQc3+H)Z^rgdRTwzZ9btbZ1-#i_`Qp z5}p=nZzJQ-mK4jNyN?n~LpQGy8G6t;XT$^4s2Z8V!U)dMQ&8u?6EP0RY6rV0Ct*gq zcYHJ;(auq9MuV%!VV&h$*A`q;-f!D5){en3W^|OBF-Cf-`W=?Sp&>_cD3&T4qv58O z*b_2pue4`VN~ah3CNO6apM%B-I;Ajc3C)bONAjR#!TSJbBUpA^t`l_|*wR{udQ60X?cIpi*b|f_q9ZXuvt7wxIycw*!8Z8Ro zAbpc&!d0tqjTaZ{dL_x(M2nJ{J&8mW8|=Wd#NH9(LlRl<8#M(U=j9xYLSbJC1&jpq ztA%Anvl|+QipmO+8fs{mjnr6{wIonoV$I63Is!EgYgVjtZMn_uww15#?24zl{6p4~ z66=s3XSijCh{r9M2tl7FEu%(Um(argy*^D=r)qbyK24FR=u2|mv#3j`(Rzl?yg{`` z;7I;(z4{coG}G?C(WP1W+K{A@ol=*E@&&FhU8mHgi3UQ@R27cCl)%wP*HrC5N3ymW z$Igdp285l2#`@t}Dp|BA(Nc@#iSqx2B=aI+beyQ9KB+yX8y87Rsw*}jpEyxXMIA}r z-w*5<#Tw;>%V3^JbHvJr8Xw!b7c?=H6UL`b9LZywtW2^(D4f$Ea(F1~aUu!kWtI2a zqTZ?j(}uAYzs+ToKe1Wd_AnS!Lt~o}x`1$E{62=-Rf%=eN3ZgS)2uY{BpSoXQPMh- zo+MSZ7QzY6PfOjEJw@895zmo5%;UHgbv)5E%AV1weo^_@yn*?Zj+&aXuEI{wnn*=& zL&@;K0&i(&ZTZ~N?!X!Cf#GK7bv?al=_#dFN14&oRcbT)qTcTAv~)wMt;}t9c2_%0 zm93}>Mb>(;e$XshXihAfqYg7rGsHGe6@g?5Vt)wkpc%M<*cVOB=a7U@!VxYRC?}*d zvyk-q9rktW#-dT9yP<4pX|c>7zV_PT*zfHjUm;#A<^aF1VYj~5)BNW+5zXIe41ADCj6+n)K1iE8oeewt;&y=?1>A>r^nAZcl_`o zyz@G_k+eI0i}niMlH^DI_isr^5Hz0bhiRV6gzJ^+@sa(g+ACYvoi*?5b>m-OcJ?_- z^?Gt$<+|86sJ<3}U!lH9epKB{n!t*Vgha+PZ6{IRQ_VO-?SrR_eQCeCEE)eVf8f zC~WK5d&ci6&Ma}-DjiK`YmSZq$GlSOXr9?xK^Uk4xD{`m?lnb&rw*>EUQp zS>76p#lHCG4@Ts?1tYP07NE=k{FZ0HZ`mwHj*#u6$2AdgXJA%42iGQ+t{&vnO&`Og zMkw~<05gK`0=1-e`k{vAAWc3D_ODXdlf)7=xS`q&v{a2_?l8_t(Le-9932*`1y?+7 zkJ ze833|tycbW<(DLXxdQ{A{N+lkbc2%+r>iF{C1XN4FcYeKvhRQjLANTALR`;Bi~0yx zYB2<~EM5tS5NezWS31$O6EZ1;OrB9@EY#7^uOqC05LR#k!U~NtoP>mbk1<7aKhg^1 zM!4k2cZ`Jr;Ox}DSwzRa97F&qRUT93%Hhh!KO)!)x^k=q1vAa%=F*VE4oyBEl zv)5eOfJ={87Ix<3&oE?X=H_SQm*B@dJt?rS2-t?U*>JvA4x>guBwj9B#djz3-l z%Fv6c=uL|7(4!$J7?&B|G>)RP#Dpr5uz&SO5>p$>T|)zkgd_HF;C?5Wp&}xTK6Zbx zaTNDpD{snVtVGac&&n;zHMuN>HSVCfFgw?tg9|Gr-V#9+h6S~z%$YN?vdr#U^Nh@l z%q;YpimNc3&v6yqh)TZv2>FI|n=**u+l8xH+`V1UBY-7nBDCJp30zRLU=X>zoEt=L zA9DL9C1D z`$j)@bcQ^49DkrSo|$EeZDv}#Tr6XXRkI}Tf(Cn#pC&F#C(1lAw>v5KUz7J9OUiw0 zGWYVN+~+5ApG)K#qLaBlPba%73}2%1zk9{NzxTjXB)M7#O{=*+u0KBAlOFmvKKYdk z`!=51FF$%UVT$Gsey0)s1{D6RC(G?l$|d}%dyggM68==~<(x~FLJpVvQ&sNgsoWED zyI+mxeoLcr)xF0I@!U^qRIbXs{H=KIn;P{C%0hoX=cQa_xl=0^s<-8zEVnx|kxOq= z_Z~~Sm)@pwFHg#)x2fFcIG6QcZrd{Two)qh#N6(rTzZ?j_gGRcy-np_UP`i{3&f;+ za4V;-nj>w4^abTXPefQI=JpRM=9w_NPE=Qj-IC9oR>_jjT&ew-LC(2v?B09Ff|7Jj9;i2XUhaW$96I%9~3{7df=x2RQz$S2?>EWxq_?65(zq*XYwF;kku+|-X+$5(vNTm;Q7(Tpk0 zESXUE6pLk++mpItB;D7wthsqvmoI($wp343y3-P= z4m4Yw;4iF~YAJ~Hv5O7L>Q=4-6`8Gk?Y7BT72T4Z<`JDbC7-Zll~G7m8rio+AP)+c zCd+V2&=2N$VJ2!Rv1c#1AQ8;Ew6naueeDaw%O;~)mxk92$9_m$aR^+IRxWp7*Svj) z#A5WwX*v}x#+#JPdjQ);kQ7w$N{7S{ehHv14p5;vu0Gix2gO;wFxcDY zsi^Un*BKC;5bUk4?hO{zBH*{!IMCbYFAG-r>kJ#DyQ#-p-rHDOUv6|4=Wj4(*{TD! zth}5YTfpkdamb9J5wkhdSL&_sRF<_>6=5FN6K>0&;qcWvX0I@tvx9bD!0)Z@^qUF; zv#KK9M*7KCQkGp@ob7cuyg9|W*|gWlN^wBmEdPd)YCQ~Agg^?~Un~`_Y+AB@vN0!b zwpF*d-7VF&_*o7oUm+LemQRE@?g& zVdAXECA747L|LlQ6(9U?NQ0Q1vDZV3qt23s{>riOCkO4Eh5=j&h`P#n53g#>G-`7X|-ZE&Y#MWlbA)-T@Fk$ zSW&63tPX%(IdP>X=$x=VQjn&}eNZ5tr}@h)&=eRPd4HHl5_@3i9(L%G@cpm_!Dd#n zIU)a1>a=@Gn`c*HeN5@5U~6+xW{%%k>Twn1n=>s1&PHF8*<}9et-*Suu_;j9h0d=Z zsyqIUmeSBxm|2?dEniSzEc;qz-i(Z;1*U>1D%d;mo}mb1tN_mCFb2p~w0et{T#`0e zjTW`xO05QK!xarnwGx?jK*0JTPz>E!g4R|bt^B-gXl=tJKS|8!sMSJh?NAY(uLri; z`1yKVk#kDzq|=J$Da;jm4v#*XlcNC_XZlkYr5f~=>a>KVF=R#Lyb6Rh6h+ouJbU)V z>mu>tt?``)oIC)MPyNik(Lg5gFgdruIYe7WYn^8cVdAu6wdS zBDhlh5&4g>l&%bysXSSswCSXnI-|8!VT#XRt+AHbBB4;kR%WenwE8P&)!1w`vnu_q zC&Ad3`GLUvE$!{<{A{f$cWz6|++0(w%~sqnR6|=EK-gmkGKZlFJR%Dub&2wAsOfAI zFow8&upy!?+K1+ZnN74@MfAgI%j1jugo%j$1n1CMNy5I&;Q-hY z!bkI6)(|#^Ag>J4hNija@1Hw&MgNM}nX#vL&Vj{$;O~EjvSYpX-q`QuSZ^;ab|8N9 zDB`m&JXL%aDcl#HIeV`5?oBk1)@Y;hi)cU17>__Z1LyhwvaeS>S~Uet(zP`ZV zNNJ;F522yVHOPU{vcAAbSHc2j8(gbrM>akx6@2%xa2c~$x zEo)fI`1P_&+uAx#k3Fjrn?ALA{p#M(xe9W}3d03xc`hcn&Y-nT@zto*k7+2LbgaBd z4w4)Zo$Q)90`U@$k2ZozC{R{aI}OjrSCFa7X6kwg=_dGxwUZ%pBcd@ch%YER{$A|T zvlsvI!3WnKTl*8N@Ve=ynB0uwx+jjoc6}R~VFXKKFM)=EewvMgRtHB}iqMwIQKrMV zW=mQ~e7=C9JIIM-5kbC3t^PU;*BczB$T#YD9S*{M>u$u&(I@5;_eUN(`I$dKi+dD+fDYlXgMBKA)`VUhP_ zy8n-AQuK-zAB=$e9_%s89zY7f%2NLS+Ah;t+DtD^^o z5U%5*sEHBHOE1XD22WqTC6(Pnipv_LHPGd6TIBaH3HiGMR=R39&F^2_NLTA>T+X1w z5p=q0Vh=j%oUTB?<*bt?Z)dGNR96?W*LHgKbiKW{!&6ojaJ#GhW$r*#8PXUsG!^k{ zts8#pTrv1>?7btz=JY_1Y-XquSS9vKBbr9|G}{g~33;XUU68(s_4ci_9n!bH6+4PW z_bBbi#2tps+6XXOdO}3Kn)FhOFb%NVQe~>oWwaWlVe|2~1*p}08ZFDKSUtc*PAxs$v`AA1RBq3%wEvIiW|gi69@o*F%) z_)k2(gx-{{uae2a8;G7WaV9O0>@FfU;!@UUXvaG2D+W#gGUJH{7)n-}RHNNPU`7#x z)of>d@ylmlz4Q~dYpxl;<{H~4uuM4isEo#5#-=U9H{U$m5TZ~Q_z(Xv zX$4QhZ%R9goETL_(*TG9V%|jjm$q3fAp3|GZ6<5tiAfth?20Efi0LZNIW;E_hd=?M zmWstjU(DbN^prmPMr%GOuqM=q9p4c1i>bG^s;btpv64V}pN*#7TAFCm?RfL6MLgrC zcCk7JJ=F(pfmQ77s9J~KvV0!>?RYW8EEgk}Y>Wy@gCiubPD+mTsX?{fJOFAi9I#)L zuJcl`CrzJ|R&W@?v6%y8SYKD6VeCXN!R~)L+f9n6Q!yCKV|iXzMZqEpjw%wma&&`>kiBb{#V&}Qu?)|wge|uO zWn$$_vX(-g;&?Qh+IN(g32hZNY0DXE)xu@xUuwc>3q`g$OkQkjUQY` zw7U%8pP=1zvEe^?4~@xbK7W0XCWdh$dLq6(4>lt}RS@g>&)C|H&x7hx<=0{xP>c){PVmO)*`n`nh>=`JB)%)fBn1fry_Z;^*KZLs+}fq$Y!~g+)kS5ShKAzdAB| z`GB@(>5@6ezcmD?E#=6X2JG8;9`;x*hNMEQe%u2^BUi=hlShJhM?6+P?(ZNkl!Nkt z`Q-TKWG;nBUR~tTjtvy6uXg*O*fUz6s0J)4dGT0%JMMQYj&zb({mD7=sloc^-4>eV z2phew+KSD+eR+8Wp>l7nMKk7lt>rF{XC-FBaz0n+Zm<~3%8O@(Y=OK2W4@*ADt}&X zda>P33$)-ltd*Ao5C3fh72D>gil9={cWPoY5e<8a2&&5q9Hth(KWcImAQkodTaa3u zUSKWrSPL>T3ap+oYeBkkGfhC91aS!mPK(9a&lbYSFfF!N+E&nITRr1vf+{<1J`wA=5TBv((Co~3$YKZ z%_S5X_)Urv%$F(FW*Wbh@Yx;$4>y2Lz{P31V%l-00Jw^C8S<;DmCz~@8h4>pN_MM= z&o~YeJX@*l%CkmNX9}M+OHX{yGTJYx4UT5Dhf>^QBt1K1>R70@y3v?3H{XbjlZH)p zXVU;}s8lL1-?}xny0Rq_-#V#G-#V$Ry1$;bRYI$lPK3lyxmD@3!|4g$2=sD1&RTg8 zQGX^18hnX1D6?GON(*bjp4@S^Wxj=8fBaVYc8q53gJPZhtsI8HfksVli7UR4<;fd> zkUD}@c4qn8*c^Gqq4j3KV-9pD@q%e$5bRM^N39kh<&V6+(B%}M;m6DnqgmT>{E)R;qIm-uJ|42e9Fk0W)nk$P^U27JOjE&%vK&eiLb~Z1@cwm?o zoetkuTng+|i4BN@c%0|XN%tYQnQ|wR8w^#1# z%)!nB2&6Ekb4*39p1ki=u@-2V7vFWrkpDpcWI`cTv^5ihioE4%wC{JLFWi_b38rfq zePeajZh>)0P9 z?|0{&vE{ti7}9Q1Ffp{}@Ldz~SY?uhLERnqd8CnXK96WJcScvT=+pQV;^$ZXZA`{u$#X$$po%Kch zQ-7FYMMMXpRw&*?MXk_RkrGiWpP$Tsj`Gn;-sb{wD74STaxr>HtU!B5a1ifb!Bh*% zrEApI$@Na!>4F?ZJPJ=0c|jWV3I3e_EVe?4&XWbBeEfYd%%_ZB`S>vy-2PEYviZyMnOEog(-e39qlhgd$U(?py?K){Vm{s{kqN zls#~m=S|*Uti)irHuf#)iM=G3#M&LhRgsaz223N7iUp4NP9?nEnA*3bDZY!znip0* zyCw=d5&MbtE)Inj_hLUWZ;3l9H%!^4KMzkaJZE#K}$o(*r5rca-2!Ms6)ChN#C4qmVc<8sT8Axrc@#gK2kTg zG!`yyPOO^Wu(R|><6%|U~Tu@$>SX5Ev^_QPS*X*3O&VqdNuVGhA z+CO~ydT^5bv;(HvH@sWCZul&|mUF5*4WIqs@at>WVzdowYvg`|7k8$M@?`s(HhiK{ zMtYUfUKI}}d7KVbnr@c+cg)+Nt$AeS>G)4t-msP;_v;XCx_z0LeT?v ze0Y}Ty=hoOS>f5*a@ys;9P7)l*N<9}ip~Djv<0>RnmWI$oi>zjGUX3-4>k4mH4SzT z(iKj&4v(k9Hq>tR))yDola{5<3x?D$xW(&D+}Ev2kuxUmt)pk^h;E=^$xK~4Qu-C` zBEfo9y3Cx^rf?_pD0nE8E~ex|>ZJB0YZE#XX-i%d{Vud*8gUNsGqvYmDKMA{jK)O` z&2y8-Ebd98x%9-`ky`&oK1te}f&9mbD1>P%NA(RZPp0haqb-jX4nkk2VDw}vCT&XD z1E4>=h!pbptRE@pv_dOx%+hZZ>_hB=f_79V_(~%3Hw_X=t-GPf-?*))_U0`{juRCk zheTq>(uA*9Z+r5VMadeaa)_y==Hw6~g@X3iB6D3yn;e`=pFuG=^Xf>70*@~YJ!!MG zrSa9Ge@Sk8($dlCjYsqz{HzqcS0MJDxHgLPAwqbTex}(3nnlQ`c?;fHo~%86MHF}M z)FzUXK51qYPoHW+SKnv_ol4I1vb|U^K@r|K1_)6m|N8o(Z@TpXq0Go|^oQ|s{e04gmC^+HceuHQ>bLm11eoDpV zPJ;M!YIM>_{FvV$A}#5VSb$C>k{`vHT!I^Lj^ex}p$q*t-zb`lOyb22`VMoTds-NR zc~0|x@eL!x*7ygG;^(>X?;Kq?A5_Vz2Uc79|{j~Z)-G8}$|B34vx)b@*#&%~lmw(yBSGj!LFYo92 zsQhDa0@8aa|0|yc*?)GT@S;2%MhKQb_fGnJ#-S==fhSA7!VfoU#t$uLO{*OwoElM zB5~q&{+*1!K5_9O(U0a2==kgZxA+qr<#!lST6rAf0sQfHm>(5?oxoog^Nnsj_3jzTnz25rNq0|-q{mZmhJY{8`+1QQ^&m7gp zWst46im5guFvR>bVe!WO|D-U>;J7wEf;|~Ev0v+y=NO{U`buf7gcB%r>72(2&J*{p z{{LJnVUg#U+yR>{;5Nn2ZRIvwIUU;nBxm!_@GQZjM6JCYvpXFV4*}0{zl2gM$rMke z=*A8#80x$lty% zw+)`^ZM4_jVBf;fPp`h3?wv}TiZ02!&E@0Xkh~3i?X(LJ$FO$ojid|k?x!q!n|Or1 z1Wy#nUbP1Rt+!c%{50{>M8amK@uh6$%gAQN-O9qIbwkR+zU*(*r=$nae!zL4{Ik?f zv9zlLNn;zDtsIGQi-vlbdRJL9q}7`zqmdFCy-rTa>vOObtWL9LD6OR8t7RRuODG9q zgh5k`%}I6#zG+<9e5M%4*c2U%~v?1!|~mL)m|TJ@4TxM`&dvLYEj2* z)H-`|e^~WZKkTLnDW+PJyw3;5!sH$wiP(9)MY@8)6P-@9;luXMJH;L!6iS3OH6LNW zypOWS2kn>l!4`SSO+L`;ygMe-PMc0UrA!UH{+rjKfdYtj-XZM*IwI!$DH^R9RxS1+ zECVgjH~46$Wf}@((~^N%3g@y0Hb6mBq~xn_2G9m`@w`&x(N{YTBfPOxl<<9}csgPC z7Lj35l(d6;31yThn}4cNNFD$cxkWZTS+{nKN0?EVcB8L#Abut3lQd>*^d2&(59S$i zZr@`m9E>y%&T*M+_L*5XbS=PY^}4xBm-c?%R#_UIH7n}0mK5b$a}M{?hWHdPJ$vb# z*nv1c1n`lA=-(pox5W4`z{*G5_Xlc}P}l*@k*C3Uqwl@ZH@LuVxXr{wD2|P+*ldI) zbST)l!> zf>H{bGx3`hGmq-GLOn%(C0;#8-X+3yq8mC#{0P7qy3*3M!wcv!pGt>;C>OUGvL||F^prX-0{b#|`^qC@Z%Ta)p zTDmi>{|acumu@nro%C~w_!^(Se#KB$F*tJd;;Zf)JfAu_$7Qt?o7}mCM&bbV-Gm7}hV?=Qq8Y3z)J+8UvQ#R~Pa-ldsqmg!dr7z2< zEhXriKL(`LH-BhjG1^dz#Lq{^hiv;u7?A(I$=qfKqJe)5UaNn*Q;8GR=6K5zbA%@j zXNs-KQ!O|Z8ot(RabRhb!8{ul~-L% zY5L!B<&}7!3(6G5keK86i+_~_MPWGPLR}_$iDNRc|Ke0kvKS#}5keB6gy18q9E&5% z;TP@e8*6FNchdV)^^&T$V$YNRIjHH8PqbZ03DRl{U5Z*P zo#g1rZtbb;nJAiuvJ+>uK7gnbB91pNJ>e?^6qja&$FmX3Do&W7rJXV{b&J@D?mnYA zBR_5GR|wMcGfc+5r>&lxjG1Y?T*B1o#An9%D-&rmGjcrEHMu2u6`Pu;et@8PQ$=1$ z?wX~U#pWz`a8`BGV7)uXR8(Zjan}zvRnNkwtj)!l^qo8yVA@9X3+?Ucj$=Q;*Oh{; zrcwE0H`oB%>nhMT#y-H8!LSSb|J+1kcvLRx)q4QPZ~5L zH$w|!_bgQ3w$W%05B{2&8BsUqPv0p^>9@*TO`5Ixt}w+qsP9OWO!iztzopfL@wGhk z%~LWK;~Vm*nGe#CXx86_GsOlZRtNgZvG$ML)d>xdzG%h4^SnW=0kxfJF%5mvM+6nnVAUs&5Rx1qiRTNZY_ zyy#~o&YY5JOmXw~lwZUQMHv?VT%o@A)QUkydT|SC7mwFW1D8~heVLP~tjQD^1_@o6 z;&xRWC#@BV_et{DqQC{U=W-QrLyFtUx8jY$w|%@FX$nFQ(=c z6@==S`o?|3y8|@G*5xa+TFVLtL!qIKHWd#9x)zBK{!1qAk?^Zpb(E8}=E#Z}@9UN{S<;DP<_-K+11Y z>r!t`{b$!AH|AfN|3Lmz`R^1I7t|H>7d&Pf zHQixuGhc6h$8wD&W^J~fZ++bQZsC`UM9~hLX1mh%s(qpT3j5o|zT!_5KjIJ$zvDK? zk&gTvqbcl3PlhrB9XqqV#vAe=U9AndUS)i=BI&pK@N|yv})>^B(7e&L29T zb-v_$!})h-%r(Pha+SLLz*DE|V%LlAIqus%%RQg+JYKfE?6~(U<+9vbzNGw%<$v&9 zR}ro_r{WtGM=QH3@9=l|xA?F3|E9`Obz`-$`VWB%0&mthYdUIn*L=UWs&;Pej@oDN z@5S0Tf?ugyT3=QlsUNQ2U4Nkdq579Xw$MOmQD}AO#n9gx(i?7UEN$G=cva)AjgL1y z)AVA~8%=MAMK~*57%mG3!>!>Ln?DutM(QGMk-^CJ$R&{nBhN?PjoP9+qMwT19{r!_ z^U+^N{}g?e_?YOBk(7C8{cjsGOS9Cpw z&el|iPn;v*nmNfINJ3KZ0E`Im(==#%_);DiO(wLyY-ql@5dB6dFae!FjpB0yi&xy~A%MbZy5nmP8h-<}l;%nmT;v3=yaih3N+$?Spw~E`u?c!VF+v0#YDDDtf+z-#=_b`edz)k{3#Q$Kn?+4-`@xS6>X%I)nBjQoTJ!7eSw#B<_#@iXy)__<6GzZ5Tum&D8B74fS0mH4gro%o}8Q~XK%S-d7* z7jKJyh`)(<#NWkR;tlZ^@mKL1alK3x4~pN5KZswa)@(a#d^~5z#+{qDZ&<%^+wP4! zH*QGVx_13e?2pm2aeVh$PzWr!ykCPTp2`wpM#?etYx%@GfPRJn&_|i5=X3+Z@WfH% zL?&JWj86O!u$9xxIX%j71K+uc;T;U`WcZzlyK(=$4DVxjKf@>a*QXdh4d}&=Z@&k1 zl_6b@^lN}&%=47vy_6GW*ut=t;W~!v8D7Eg0K+Df$==Fr1HCRbq!(f(tok5vNaMxQyWl!<7s-aA}(uUdix!e(DB> zcW};~4DaHcCprBT!>0lLj152PPo6)*hM%$FXKeTx8-B)ypRwU*Z1@=)e#VBMvEgTI z_!%1kF0+QIsD`Pi2Am-Syn(2wMi3R%h|!6c0f|m(1kp*2AUdhRK4}Dr9%=;9LyaJM zs6}bN2J|ze(rQr}^hhnKRw{jH?i6<|^>YvI+VERbb*0z#g-!@D@=D5oC7me%qFzrO>k}_uop(%jsg-rhnb$kxRdgU zp2NUD!5-i|j5-tSXE?xch~fN+XOX{v;X=+?#OcMHK8@2$IK7P1%NedX0OucMNTV#mqb!29 z(^E$||51iC?jk(yB0TP*X!TQ&-enVS0aB}@-0CQ|I?AoahpSOelv^D|?^Bvu9mU>7 z1gWJ_L2ZoU%SQy)acS!rQY)g|iYT`N_5|lsE28K@x}RDR#R#H09ArqXh;l2U+=?h# zLBBrAkXjMtRz$fKEnM>!u6Yadq86@y3)jB|yy!LPCsdObu1O2?q82W{g?Uj6m)63i zwK65N0w*s(ry-oQa>=cr6Urej*UBZg0yB3b-N&$>;Q+%ShV%LU1q>H*&LU1P=JaWt zUc%{RoE~AglHodr>lsqbTe;?~z#+Zy3eG1SwgQKga|6QzoPUrZ;gI&FBzPD9dX)1Y zWk@(|+aC%5WRQ9en?p z40kfz#c&V9y$sJ|xR2p}hS&46cOg9>mgDUMV#UO}fFqoyF)|4K)dWZsJBZr;1(0ex z$n_lLdJY0Vlyf~pDs2$@8a;I{!}}QC4>*ix{|?yCaDd?u!-WhNGu+N_2g5TN?qs-& z;U0#28J@>*AH)3&uV;7{;5>XM_b6cB#Or_q3>N~Q^U%^4013DAK&8I{{0`rFFT?v7 z-VeBtak7wcvJg0V6FG#F(}0aj0DCyyH}NXc{R{^f4l!KFa4|!YDW?HTbmtC+XENN$ za2LZp4EHiTkKsOs`x#!(@CJr=0WQI)e}^=AhSYaU#Qn%$idwx7*vD{y;X;Pn8D7uu zF2Lnz#SZ|f70YoyL6V8f(WeBd{N<=K!5s|GWVn;zE{1y;?qzr$!+i|*GbCBL9Akta z$;TCV+q@Jxm~8SY}Zhv8m^=P}&Ja6iNA8Q#F~F2E6#|0du7 zL+bGnw1VIchG#O|$#56LJq-6UJdfc%hWi;_&+rC@cL9zv-bNX3ql~vv#@i_4ZIm%K z$`~6Jgt1XU7#kIYu~9)78x@4HQ9&3R6@;--K^Pmw2qH)r8)b~GV@|k^IpI3yf$NwD zu7jp@6!sd~3+tdM{SlDtg>|4$!yWT*7)T zVLg|y9wodFi?9s!*}(F818Zm-SVP;u8rlZd&^EA!wgDXSeb|n4|0ceF6W_my@887t zZ{qtm@%@|l{_VizzhGhZF(mG{ow>?(V1x3BpX}g~xPwRH4(3ifcqE?5`Db$enVf$n z=kMhFot(du^LKLoF3#V@`MWrO7w7Nc{5_n%hx7Mv{$9@C%lUgbe=p~s$NA@R{&}2# z9_R1l{C%9ikMs9&{(jEi&-wc~e?R9R;NCgFy>ozj=K%N40q&gx+&c%jcMfpx96&jL zgk?QHGBK{=W|HJ2+^Gs%PzMJIS)dsCLXthDB4Owl-YC~2Vvf7Z1IGD9BffZ@Y%*MxTe9XqjY`hWp2~#dVN?or7J~70+cw?jQ|254)+GYbO;uA1~mF+Dd#pi zpaFOVKVvg_$d$-*!(9`Z!&Nv?1MzBJYu?13{TjTM=PERk!d-{gGbjGu`34-ML3kri z^k^WNy9saRY&NjFyajLNoHnoryv^0y?ysI*&+UAC2fOKd_5yd(pA2R`>*$T|LSjg~ zoBsgRk>=e)zdb}laHxjjz1+WFOS*R--p^|rYe@MXzz2CYU=97@L-;TqNDZCaBkVed zX&64rPNA9v@G*Rxr}tEm1U`YoxdXn6p65v%p%M5LyQfNeo2PN4M&dKr(<)n$P;AoBJ_j8QK;8=~tSNZEJBVl|E zUuR!XO49fSj?*}NlTN#o)bTBRn~t}H^zj`WukkoR6L6v?;v`LS#jFeO;(M&K#UzvO z;|Hv>MI@9T;$%(6DVl;G@!!%S63dU-k4)86{Df7wko59X{ESt&kQDQCcZMYM3!J8D zI9=0mhGw_|lFcu1re@+S&BEE5jdL`I?s2Z>;ylg6`I?Ulv;Y@sA^FB4EyBfGj7zix zmue|4(=wM&D*6>J*K%B;6}VC>>Ec#t6|UB5T%$F(R%>yc*10^A)30&8*5d|kz&OR> zMr|bj*`!VQ4Xfu#a@B8fvo_-vZJ|Ths;#(9+i<(K;|}d`C&*mC!=2iRyR-{;Yd3z+ z6*8A3_6Pit9b7Jn>`(YJ>vAs1Y`n`Mo&5!WrHjttx*fovf*7JB%_gz^4fkjd?$uu0 zr+swb`?Vi`=UHD_B&&bm0Uf}DI_NUVb^pXeI)sOH7!#C$M|8wxa4ikvQ5{8(D|QCC z?_YRK$6Px3@86iHL`+f=CM(&cah;4{l>Jv4xo`|ql!B>Bb^qwNjwA1wrZh}fI%X(? zt~FDcn58VtRyO7+2XmF{Qc06f;J@6_mrAO967!VjQb?Eo!+hoADV@U8I*kP?a4}Nn zGgzoXEK(5`s~AgE!irO>QY=#$ma7~qRN*3I)RkDJDy&vD)~E(+RqK+;tn08|_1K^W mY*ZsQsmUd&Sp4`JN^ literal 0 HcmV?d00001 diff --git a/package/src/skia/types/Font/Font.ts b/package/src/skia/types/Font/Font.ts index 52e2569fe9..6340b9ae79 100644 --- a/package/src/skia/types/Font/Font.ts +++ b/package/src/skia/types/Font/Font.ts @@ -12,10 +12,20 @@ export interface FontMetrics { } export interface SkFont extends SkJSIInstance<"Font"> { + /** + * Returns the advance width of text. + * The advance is the normal distance to move before drawing additional text. + * Returns the bounding box of text + * @param text + * @param paint + */ + measureText(text: string, paint?: SkPaint): SkRect; + /** * Retrieves the total width of the provided text * @param text * @param paint + * @deprecated Use measureText or getGlyphWidths instead */ getTextWidth(text: string, paint?: SkPaint): number; diff --git a/package/src/skia/web/JsiSkFont.ts b/package/src/skia/web/JsiSkFont.ts index 399ebc153d..c9f2468b7e 100644 --- a/package/src/skia/web/JsiSkFont.ts +++ b/package/src/skia/web/JsiSkFont.ts @@ -6,10 +6,11 @@ import type { SkFont, SkPaint, SkPoint, + SkRect, SkTypeface, } from "../types"; -import { HostObject, ckEnum } from "./Host"; +import { HostObject, NotImplementedOnRNWeb, ckEnum } from "./Host"; import { JsiSkPaint } from "./JsiSkPaint"; import { JsiSkPoint } from "./JsiSkPoint"; import { JsiSkRect } from "./JsiSkRect"; @@ -20,6 +21,10 @@ export class JsiSkFont extends HostObject implements SkFont { super(CanvasKit, ref, "Font"); } + measureText(_text: string, _paint?: SkPaint | undefined): SkRect { + throw new NotImplementedOnRNWeb(); + } + dispose = () => { this.ref.delete(); };