From 18563101b2062c0df4b61ce7ad6f6de3809abd39 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Fri, 13 May 2022 10:18:29 -0700 Subject: [PATCH] Fix blending math The blending math had two errors: first, colors were not separated for the purpose of blending (blending was wrongly applied to premultiplied values), and second, alpha was applied over-aggressively to the alpha channel. This PR does *not* address the issue of gamma correctness. That is a complex issue and should probably be handled in the short term by disabling sRGB conversions and doing the internal math in sRGB color space rather than linear. This will degrade the quality of antialiasing but on the other hand give spec-compliant results for compositing. We remove the plus-darker mode as its specification does not appear to be valid. The plus-lighter mode remains as it is quite useful for cross-fading effects. Also the generated shaders were compiled on mac so the DXIL is unsigned. Those should be compiled on Windows before this PR is merged. (and we should figure out a better strategy for all that) --- piet-gpu/shader/blend.h | 44 +++- piet-gpu/shader/build.ninja | 2 +- piet-gpu/shader/gen/backdrop.dxil | Bin 4576 -> 4584 bytes piet-gpu/shader/gen/backdrop_lg.dxil | Bin 4580 -> 4584 bytes piet-gpu/shader/gen/bbox_clear.dxil | Bin 3160 -> 3168 bytes piet-gpu/shader/gen/binning.dxil | Bin 6336 -> 6336 bytes piet-gpu/shader/gen/clip_leaf.dxil | Bin 7228 -> 7232 bytes piet-gpu/shader/gen/clip_reduce.dxil | Bin 4624 -> 4632 bytes piet-gpu/shader/gen/coarse.dxil | Bin 11628 -> 11628 bytes piet-gpu/shader/gen/draw_leaf.dxil | Bin 6764 -> 6760 bytes piet-gpu/shader/gen/draw_reduce.dxil | Bin 4260 -> 4264 bytes piet-gpu/shader/gen/draw_root.dxil | Bin 4468 -> 4468 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 15112 -> 15360 bytes piet-gpu/shader/gen/kernel4.hlsl | 200 +++++++++------- piet-gpu/shader/gen/kernel4.msl | 273 ++++++++++++---------- piet-gpu/shader/gen/kernel4.spv | Bin 65556 -> 66476 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 15016 -> 15268 bytes piet-gpu/shader/gen/kernel4_gray.hlsl | 198 +++++++++------- piet-gpu/shader/gen/kernel4_gray.msl | 271 +++++++++++---------- piet-gpu/shader/gen/kernel4_gray.spv | Bin 65312 -> 66232 bytes piet-gpu/shader/gen/path_coarse.dxil | Bin 7064 -> 7068 bytes piet-gpu/shader/gen/pathseg.dxil | Bin 9596 -> 9604 bytes piet-gpu/shader/gen/pathtag_reduce.dxil | Bin 4644 -> 4640 bytes piet-gpu/shader/gen/pathtag_root.dxil | Bin 4716 -> 4720 bytes piet-gpu/shader/gen/tile_alloc.dxil | Bin 5132 -> 5136 bytes piet-gpu/shader/gen/transform_leaf.dxil | Bin 5664 -> 5664 bytes piet-gpu/shader/gen/transform_reduce.dxil | Bin 4700 -> 4700 bytes piet-gpu/shader/gen/transform_root.dxil | Bin 4824 -> 4828 bytes piet-gpu/shader/kernel4.comp | 5 +- piet-gpu/src/blend.rs | 3 +- 30 files changed, 563 insertions(+), 433 deletions(-) diff --git a/piet-gpu/shader/blend.h b/piet-gpu/shader/blend.h index 1ac4bd6..c0ae6af 100644 --- a/piet-gpu/shader/blend.h +++ b/piet-gpu/shader/blend.h @@ -122,6 +122,8 @@ vec3 set_sat(vec3 c, float s) { return c; } +// Blends two RGB colors together. The colors are assumed to be in sRGB +// color space, and this function does not take alpha into account. vec3 mix_blend(vec3 cb, vec3 cs, uint mode) { vec3 b = vec3(0.0); switch (mode) { @@ -190,9 +192,10 @@ vec3 mix_blend(vec3 cb, vec3 cs, uint mode) { #define Comp_DestAtop 10 #define Comp_Xor 11 #define Comp_Plus 12 -#define Comp_PlusDarker 13 -#define Comp_PlusLighter 14 +#define Comp_PlusLighter 13 +// Apply general compositing operation. +// Inputs are separated colors and alpha, output is premultiplied. vec4 mix_compose(vec3 cb, vec3 cs, float ab, float as, uint mode) { float fa = 0.0; float fb = 0.0; @@ -245,16 +248,41 @@ vec4 mix_compose(vec3 cb, vec3 cs, float ab, float as, uint mode) { fa = 1.0; fb = 1.0; break; - case Comp_PlusDarker: - return vec4(max(vec4(0.0), 1.0 - as * vec4(cs, as) + 1.0 - ab * vec4(cb, ab)).xyz, - max(0.0, 1.0 - as + 1.0 - ab)); case Comp_PlusLighter: - return vec4(min(vec4(1.0), as * vec4(cs, as) + ab * vec4(cb, ab)).xyz, - min(1.0, as + ab)); + return min(vec4(1.0), vec4(as * cs + ab * cb, as + ab)); default: break; } - return as * fa * vec4(cs, as) + ab * fb * vec4(cb, ab); + float as_fa = as * fa; + float ab_fb = ab * fb; + vec3 co = as_fa * cs + ab_fb * cb; + return vec4(co, as_fa + ab_fb); } #define BlendComp_default (Blend_Normal << 8 | Comp_SrcOver) + +// This is added to alpha to prevent divide-by-zero +#define EPSILON 1e-15 + +// Apply blending and composition. Both input and output colors are +// premultiplied RGB. +vec4 mix_blend_compose(vec4 backdrop, vec4 src, uint mode) { + if (mode == BlendComp_default) { + return backdrop * (1.0 - src.a) + src; + } + // Un-premultiply colors for blending + float inv_src_a = 1.0 / (src.a + EPSILON); + vec3 cs = src.rgb * inv_src_a; + float inv_backdrop_a = 1.0 / (backdrop.a + EPSILON); + vec3 cb = backdrop.rgb * inv_backdrop_a; + uint blend_mode = mode >> 8; + vec3 blended = mix_blend(cs, cb, blend_mode); + cs = mix(cs, blended, backdrop.a); + uint comp_mode = mode * 0xff; + if (comp_mode == Comp_SrcOver) { + vec3 co = mix(backdrop.rgb, cs, src.a); + return vec4(co, src.a + backdrop.a * (1 - src.a)); + } else { + return mix_compose(cb, cs, backdrop.a, src.a, comp_mode); + } +} diff --git a/piet-gpu/shader/build.ninja b/piet-gpu/shader/build.ninja index 60e5582..09b0683 100644 --- a/piet-gpu/shader/build.ninja +++ b/piet-gpu/shader/build.ninja @@ -58,7 +58,7 @@ build gen/kernel4.hlsl: hlsl gen/kernel4.spv build gen/kernel4.dxil: dxil gen/kernel4.hlsl build gen/kernel4.msl: msl gen/kernel4.spv -build gen/kernel4_gray.spv: glsl kernel4.comp | ptcl.h setup.h mem.h +build gen/kernel4_gray.spv: glsl kernel4.comp | blend.h ptcl.h setup.h mem.h flags = -DGRAY build gen/kernel4_gray.hlsl: hlsl gen/kernel4_gray.spv build gen/kernel4_gray.dxil: dxil gen/kernel4_gray.hlsl diff --git a/piet-gpu/shader/gen/backdrop.dxil b/piet-gpu/shader/gen/backdrop.dxil index 0fb9622eda673c439b74f7538c649b770edef248..df2be88d04c2feced45175e7cabf1f0b1f17135d 100644 GIT binary patch delta 1396 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 delta 1402 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 ZT>u%_FID0HVd25=wHI|78-TF^0sweqsy+Y! diff --git a/piet-gpu/shader/gen/binning.dxil b/piet-gpu/shader/gen/binning.dxil index 3050aa83bdb31b0655c4e6a2c8d80987840b6532..4a4f0734c4735cdf4f37ec0ade7e7e7cacccabbc 100644 GIT binary patch delta 2206 zcmZ8ieNYo;8h4vW=hjc?DaB6R|5NWEwfHF#mI!gc#6)|VMYbiam z2@q2ZHO%4{p1sA=k+!sk)1f%$9|<6bbJ~LE&EOqggXPrg^m<^=n|8F*+m%3XZvV+X z&+qqq{od!@gp47h+EQIq4F2yKQeQ=J)mIlzS6=^paLciKhi*Zop-U0eE^$c_=GJ$i z{%_nzH^%-Lg|#G-KoYfyM;T@SM-6J;#sWNQFq2;ZXxRt_VkHtXim-;`Fl>$*p!gja zWtR=_MjZ~MQELO%Vj=+=wTMTD%`3^Nc}V)dkWZ+z99HiJK*2$*ZMhS?iQpy=nocN!vV5dc~U0Jd{Rtjwi?*}qVv%t%wxw?i;Ake@L=ijPgvdsDhp-T(coi6aXzL;?~PtoY-)gR zPZ(}?z5SW}tUY;Fzw3;C)g)1KI_2H>FXtBy=LPys^_|e**?l~(2)hbsYg^M;#7z@T z#CjvzrWhmqG!ejCTkHNx^|*=lus4j|Ah9eI4AbNkAE!UN>+F_f+Zp}c9&(__`@pdy ztKigs?&oKcy@9zaGaW;BPFydO`PbLKp8INJZGFR`vV-*vP1`*ESkgPkcHWt_pPQ|| zGuy*_Q0#rM^*&be{HfT-C-0XO6lBg^qL6?@SxW-&yl~1YxF$zD#S|_RFLfp1JEWE_ z&;!=h!Hpk(b3e(iDtu-&!h3(lZo)26ap54O42*)RUm(F! zU!QiffygH%+X#036wn%HN7uk(h=q-lR=koNO7rftb}%z6T2%}7RZ6SJgYpk?Opil9 z!OZLSgJZ-SeHu@#G|kxo4IJgn%50q^b(SvUotje0!HPXHjJ%(@S;V=OI+ruckfw-D*cE|@wSdw6&!jU2ZzDV`rVAG()PY4U?fe3$bPJkxm@5&%* z7WYYs8+mHWO7i&24Dwoq2v%4McgC~;4OZb^+ZZzuV5qaUotTS_|Y`i-6{8 z+jcx*rK!Y!JLBk={8?})rpy+MTUb+<%8UcZjAJ1t^O0L4`8837vhv>F0c~X4mW?ap zmwsEE1OFh7uQN5!YeN^vBdk&i1DXPDy@bq;S{)_>$Zh0eRSFlBSW)0`iV~Msx5Izx zB2omk-09lK?BR4IRv10v?|2En>kC7Iw1xF_VmlS3+j?NbvbawzTb@cbjEoB^q)3`% z7l3A@eLGN5jwvy-!>oOwHXbU&O|;516#ogZk8KJ0XsM9V<#XG{;q`F7VWz!o#X%& zb(+(wvt8ZVCr<4?qadAT3a)bM3ZvV%pgXXb&^V_R&k8Cx$F#ba#3B1iYAD{gq{!BN z{hJv7l7Rim`@?XQ^U*{NJh>#Gb#Pjnus6!NoqRw^L^)R`>>I;A{WF!V7Z9L~TkfDH2_05e zRhZwqwvP*F2y{q9dhA!Zpnya~NbYHTiU?l=rBWt*4H$x*^VV8I%*i>MC++DMC74!_H&Ubg+}f46ru)gr zab`RMgnhlN=~MhUbbPuU4Dk89=gCwyMl_?a@pJ>z%ZxMPO6RJR)+EeSE7gk$KQwmR zJbQRgn;zlLX>(nMJpB_xnkYR#r{5u56Q6IpIc<5j*!1-CdZ@E{wI^-$BYmb1UEYv+ z^sTQ-0%_LHerqTDhb6Ic9QU64p580*&w0ViLf=rQCweoasg>P-8|c;~30KPIY2+n1 zIiJ*wz7AvDW*rIjar<@pv>4o-CRt^q01mfhlpoFzhB&$oYO^69#+9a6VOYa+13JTV z2M=j_WL1T8$eXkt6-ZFT-caVFid(lO-tu0RUhflg?6U-kM;JRQ#z+;@r zs|piMNkIl1#_SYgM_!-=+HMhjcuaI2Q3@foCXpE^5eVMfs1VL4i&4ANg`CnRkvz~P xl82v>3q6cK2&oPwm@CLW3vkQ1*X;+ahX zX{u1dt!){wy&zcW6njA}jvYFaK(6MhT*cBGu0vb6<8FFa&jP16(>boaU5WJepWWyA z{hsG}pWpku@A`B6InvVF;*z3!w?2Q$@9B+keEFa~aC&WAI*H;&bHVg;<~M#gcw6;w zn5oFVwusjAZ2z+Fyv1i;jZm#6fXzp{ypslK*rY-Xfbg*4_Z)_J`mjN(d-?Da1C*#x zlnx`nRV2m%6t=K-F$s8KgIF``0Twp2w&htGkYS4oeF{PPu;KSaVE+##AwPzB1Z=iw zmZ($pOXEb9o^E04vme1Fyb22T5+7g0BRyU;EfGq?|7--I3lMn%q1|yne2B~4P5|&z z_8rf!^ca~!tjwlFf@CUs$S3M2!JMnpB)1X-ZywK;z`2X5=!FT3`mHV!K^!Dif;W>1 zLXe80hKt!*GtCYU@+TM?O-1SVEq<4UZ>ZfjG33pl?iGyOoLy}{+P2HtF`U^p%#SOH zVh-lM_DAH_UPSj$cl|1_I7KSGu3kw+kJ#vD;)7UhJ7y;6fXjdd0aot*@Wb(DB1B?- zYTAS}07L>Weoo?tOT;}pFYMw@GEa1gDer?bf^)8MnaVQhh=QV+I#Hk^f!@}3Jc0r?;8NDb& zQLI`tR1LMtDz#R2)KG+?qApQ04#qB0*yzYO<;YZHF*v_FYTwJ*=4hzK8@V6K^t&M* zO%gOzFj-8%KJ5Sw%6zO=AoBl`on3wSL zVSnDzrvE!S<`h1{)Qhui--1XVh~U@za z=}r|D1dtwQM=#}}UFP@|QH9b`16P53@%eK_o9$Pwmt?_Y4%@yWx51F@zwA9ji})}w zXn}Kp6xO2^)?78%+Q>vmqHQ9vDc{=4NnBm)hCl5g5?HnDN%DWwCz6l|w)MsC-#vqW z;SNBov;{xkE$-BY>2>|E`iZ#fox9eHpPme|DkSilgqMMAvU4vk(OU0vnXP)c))Hf= z!t-`Z^2TFsfO>wV-)-Qt8EtNRT?pO*=c^ZjRSTt0U*I*#GNB|SnypMCjRwg-@a0aA zq_9u&ZEKY8mv`W9B9~hrG1^t-EAdIDs_zG@gU+1~$lr+ge6~e;c`Dfv1#}szq_h>%8)u!TjTi>t0GK-W8oCvP#yUKo2;FwBF@47pqm*XYhUEXDdk=f%-7s(VAgk@%(n9Ohg>>fz9a zfaPOL^4KF`&Rl$phzN6TBIcriTlrY!^4~%VNVm``rLiHEEvA7M+xQQE50^oBnG}`kFGO8+|e%%jK`!H+nVhv!m{_^sNoCvaD-c zzBe4GgJMg+)7^H5mz*b*_hnF+2tFaSJaXvjZfz^{pJ@QlC6{A*j4Z)5hqB?`crNNd5}T9X#F0mPIP%0}az001c}!m6$fSxRr~ZLs dmz;qce3!I+Ud+91Ubk4zWz-3S?4Kh1{0|^9yNdt- diff --git a/piet-gpu/shader/gen/clip_leaf.dxil b/piet-gpu/shader/gen/clip_leaf.dxil index 29a158ea01f26edb79d205cf64d3c83a8425a232..b681a65dc37b137d61b26a7e37a94bac25cdcd78 100644 GIT binary patch delta 3617 zcmZ`+3s6&68a_9Vn+G>=2}EuZus5JKSHBptc)ZW;P+nQi>Wa>(DN?p=%vd!aTwb5S>CS{7y#E!pX5tfVSi!Q@8Z4pc6h=3xV@Kz@63*EZci4r z13_&pqQp<-0{&ryd=)i2q(D}~#PA0KfMt6HoGjBEzWI!fz=W0cQ5^b9iWI1HfZgKd zATG_U{yy9vz`b_wA##ULqjR4Ug&``AYToi_M9x~v{-FR+Is+ztxqR*Vs0NjH4quz5 z1Kpx54JPM*(|1OcQ;m!aD9*R+x>(j$CL5ElJ|vGDBuZOjJCB{wWPGG{wjVUL@0Z|- z?Jk$dm#!mhFZqKO9Z^SQs`xgMpK$1iqVmeqFV*KKB-MAei8(6YU91jIada1aaHFN$@$&P|eF}g5o}{*|C-%yd+Sq& zFJF;8zGnq{UJKX@Cj;p&4>lH?uTYcLq-;OhKw(}t5{a{^ z#T2A1R5)}h1ESQw06}v=l7ONxuD~^`N!g%3-)EGRP-A#6OFFE^bKG`I>^fbEUmN}r za}dQbaNc7a)Etb5IoY!3YB zz{dF5TNDO{p#0_ux*s4~96NKwL<@}k(u#QsFjx5zzUMKyk2Pmdv4bIdT%#4wvqGyR zg}tS1a?Qz&Vg;=gVTl4lr3E;Loswd-##s*&OZeun=G8t|%vxW#AI&C3-eg2=Sl-&? zi(^Z;TZk(v!*X{M0zuhGf-%n@>#Y6H{0v z18&*&NZ1jURJa+Ynyz)A%#&lut@n!(BAq5*vcH3qBi0uMV+uRrI`&br#cZu8QpgIs z82F`j3RcJpH#2aIo`RjS!mSMa%FI9q5exWM-A4JgOHSVo9|HGIw&zleP#SXVlfVAz ze;gl=$8e;>;$)bS4zJz>^Fs=gXHBCJ2nE{EwCV7Ymo|FSpBCf1_;T5_VEa#7qsjO;4E1*&R<>k=E+X zuJY+Fn)maB$kQtNni;4r&3c~iVqFag``DpnJ9q!!dBeP5s%bis?}gpl*CVGY%*=Kz z-EMO6UgX?Ry@i9A=xSuG_x%H3KmL>lozLnMjJv0LP#IRpUdV0XIS3MF+MLI_vkStzxKNmNJavjJsO*ZxLBW+vu1nu%Fxbat_YlZ7H71t64v?!}}FwbpQ6x3vs z2r&zEI^$dMBT870%P~UDD)|y2{;DhXw zh{k|;#hcKQV>^u!JaY{1X2#IP^s|NiuA*5UeRwyWKaUx!dP6;M0YSu0EjfV>Mdgo%z@gkI0E>(udOOgtU|l;Wb56kO8M zNV6p%wghF?x4cXHMOj@9KBJ#ZEH~&~r?JwQVR0Q>qK&O{Kt`;*6NdYWyJsH+y}s+U zX`_PZBlvP%TWx#3F{gKDv6vREV@ddK`}hm=>=KiIGN~v2zh!>+2b1}Mksu@UkveWR zmd@uABOhd>U&U`V8%prcMdxw~(#aQ8W5$OS?993-qzW` zmT2VG2)wXh;9>1{I#7YMrgz+Y}RL5>Aq~(mWf?EjH+yaT!kPd|KVrI1f&8mkTGk;Ki(PKgnP( z1hJuI-{myF2qnv@ekf)nOARE6|BC0Tk>pBR>J-4%F-y(y`?v4eau6I)^$rhmpvnd@ z?c2h^ymO1eXGGON6`U^KjMDvHruZh=!Lu=2rRz7}WFiibBC9noH?bNnL8m5084QjN zL+%g*U8!>!*jJJ}!~_sbRWtA#IybQjLQ+;`KM!-eRxQENR>v)2`rtH#zs$L z>kOz))XDOTkn^ojwqb5ptxDLhff@41KNKjHxsuw1Zy7i$|C2yzQs&OCOZYYw z;(PM5j62PkAYt4@+$RtYgv9#w1Wk)(`j)ZhYe!2*%e0{1O|Pu4O+b0@s)Ad>zrept zM&$628k9|1WWV{AP%2#MOS`YFEM4;Q3lTz|sSH zEli9N=lMccwiBJ{DfODIsZdZig}r8~mrRO^C@pt$XK3`f@QFYHo;h`Y!+B6(0I&Ba zG~~Q=VPe!V>bwA_j^5gPVTD$+$_FG3yLJ)tVBpBX`P)BFwcLz7-kEtkRpS@kGGx|J zpOL(Jyl8%4SJ8Ly{Pk_y_@v84NFqE5-_A#pO_hcxzGl+?SN8XLXP3eb9eZvYOW3^p zK3G`T69rH8`>J=~0Xi%m(fw%q6n?mIKAcj^+k}rS+80q|Tv&LEVLe>Su!?#X7XHA% zM?0tBorQ(t42(QJ1ydIlUSnX?P-se@)|8J3H@GfY7I~1N^FD2UJ8y%QL6#|`<825A z81xzA8%H;o8H5a5~cn%s-}e!X?^*T97oZ}IrT$D_i|Mcm>%Ot`!3 z(cRs*W7&0a-#;F8Ht=9@>ExomM-MJO3WlTo%)g`<_$#w#@(1Y8j65GvC%s1!wv;R- zr_xJAllvsz%i#dI~K=S2N^bm@fsgA1EN(=3&?w2O0K{V#rohG3@Ro K6v`|y{rnph%ldWz delta 3621 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 HaR2@fw5$C> delta 2873 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 diff --git a/piet-gpu/shader/gen/draw_reduce.dxil b/piet-gpu/shader/gen/draw_reduce.dxil index be69aad2781f64f94fa4a1d109e7b980e3bf0fdb..c101fc8c7f1997dba7d8584f3ec61030fb5e0059 100644 GIT binary patch delta 906 zcmZ9LQA}G^7{|YRxxKx;_qG(T0 z|8xF1-*-;VtUYhH_J{g>@V`M|&R?_M*FJuK__^ZMq4$1Ce)Z1K3-#wJ{h_1JW*Gnx zG~gfsY7BV05ho<<_xVcS+j)R}a~;gDgs#)|#NO;a{oRSlHujv|a68cWRDezgBx;sR zZ8ETJg|Cl*Iflb;BLLszI_r;{sOonvLD%7(cakOwHdQ0%<9$9bQNpImbG}}zZIpIe z7_Lx+>R`sdjMxt-Sw*?fD*6H=!hQ}MjK+K6(L<{va_*Rk5~l^&P!cvpPtA;ME98o_ za=E-5`*!Dpf#A-7yM_5oeNe1?cxUy}&7xn|mvIcgOGtmjvnPN49| zL-%Z9>(-Re=2L#!f4uvT;6Zn=+uc(58HcBe>vw+i-n>*?U-j#HVQz~XBjc$=^Bbru zs)E4K6R5ZR>9J;72eMclBRbED;y6OU$cY5aqOo218vP6!T-(kNq$HsJn5*Iau4yA! zQbf?>(Y$oJnPza>c$N5s+B($-yqkL2NbiyIGy3Zp|7B0z73p4B7IUOgTjk{h8<${N zKzT4%Il3LR6>NFP&vWO=b~S11@PLs@K3)Hfz-@?~c2I0`FO%dv8zt?D)ZSB;HzmuJ zMDUu&q96R-)6h`qXIF zV*0_JVQ(n%XF806=-otP#-hBKPs@xe1IgNSk)cOV=NM*G6+g=1KB+RVB-oO0SFAO? z3voN9-D)2;4b50^SxzKH>Y^rEtVnALfx3mmQQ&P_gs<}ppy&8yBkw-@u%@(+47UAM z9!H({nU+$9d6o4#%|(?f7FdgPYhu@*G8A)c!r8Qt;}%M6OQrm;KWkVhuuHAZ1B(T2 eagFVo|8L>CVX?##j~%*E;%-#gIf}ub2;grG!X&-` delta 860 zcmZ8gU1$_n6h5<=nZ22vB-_N%yIF-9B$|YfY}Sq2+Er(gRHA5DVGSD*ytA6LlpuMq zSZzvX|Kbv}vKlp7O*_GeTj;}T0?lqzCMqH*Ws~}_C^msoA3~v(zWC6G&eV#~`*1kl zch1N8&b{2MG%dM0!|ffbTfW}^Q&UR#}L`s%8> zLvZfg_P8^=d+!AVK!AZd8-RtuY-pGqd6IwHJ>I~b zmiWH?bYBoLU2;LrrlB}V>47p?Wlb%d#HM(Bk=v)b*@xmLH1P?ELBL(z-kVYhGIQB| zUg<@jnt8k!s7d_(jR=eM)c0GPI%l0r#@?Ul0hFzvLzF>JiCweF8~J@s-{&#ts-ekq z&%lFRRP?4_1P@{I#rQgAGeyRCGE&Wf4c@?n*S{?v$o}Z_7xE2?eP-D)W*gR`8wYV) zBm*L1yKx|P^T0;79Aac8Mftw`t}Q~W!XsDxaw~q*Apd`Alh+^BLTSlXZw~1m;aF%E{EdVWQiD zS_{sCbH!ou$Kjs-Ei`80?p7I`biBUmC(-eY_#_x{+X5)=ke}u32NSiQ2`4n+hiK1h zS*QxVmOrQ}ZQ(rl78ul5Toxk}5|32jtBOU;Qqg2YLanB)1pir;;m; zVKOHL8Smvjag-z%)~Z58H3 zkcz~*h4goHsbCMZ9A;?yPV#G&29hzvmwyfDHWr diff --git a/piet-gpu/shader/gen/draw_root.dxil b/piet-gpu/shader/gen/draw_root.dxil index 4ea23f7699a63ef9a4dcac871e1f234a5ea5b0ef..873fa29da1ffca54fc149ad5b31f42a47e79f5ba 100644 GIT binary patch delta 859 zcmeyO^hHU;CBn&>0S#;vX<-+*{mPNO>!Y_9?*;~ylfhDUn^&;2F!AXbSc}h?%YEh? ztK266hROGs;wDRQNyzdY4G?P$Xkck^XIRn8AfP9(%a}nVje((3f`P$nvM-l!y)esx zn+6J;hK@V5n1op#%v3PB+}0W)(Ig>tys&}y;O0gK1%??4A}pQTHkfSZWODNrV901< zaFJ%qmM{}w35}KJ%4AaNah@eDJAb>`c9R|EyNt}OCKzrpuyhN~%q_@CRdCjK*49=C zadLE&X3A@7@RV*_``L`=*7ID60}MQ|d$e+L%5wEGQ&RIvf}0j_NzUtzop~qb*6iC; z8Zw;Po+pVPOAA*sS2cJw;o;6R3tJ~nJ!!gk;?#}4oRf@FD)fp{i}Op1l2eO=nO5*g z&hwrrJvT<~O7tx0yLYBAFmDcHHDaO%1 znJiH8T35n+YC#QiRznCUgEAW@LsPdXmT`R6A=no%*hzg zyj_`%1E@w|=E1EjH!_?UrZm3oU}S1gkZ{RdV0qANmH@-l6zil01_cf_LFtmf2a~<{ zqJ1AdaN`kRU^%F8irMr-lc|I+M}yRh1b2woqh>RX<^#NL!b}Tz%x?%XvoJUsbo^uB zJE73ge6fXL#S`ALBMgiV0z68AGn$P#UQGVP=d4r9z_yvkNuWnU0_eO(Meec@6^}UaL@M?9W5CkVB9&S>#`;moT96Tip;PUV2Oj~3jKcxEhuNBDXk8x!!k@XZ8?}k49na8O z%iFh>C*?(IMk;HImxe}$^9Emm4H<_Q6y9x9{Je|z@b}Wt8#mrW-io<&;?$iN%UB#m zjcmks8|~b=#eBOa{v zN0Xxoo2XF4Vot_@!`qeFIDl#dW-@MLxtZa_FlFM~4o0R11qqkT4VH}NvjiBXrdTI6 zFeq@a2})N4ewggV7w!Axfg6ti1Is~$Q_ZFyn9L-6IU1y1CAdSx9xVSOHH zffxgZ!)!;?cn)k}T*%98kmHbYgh4`--#{Xdf&+7IY7wG zbBc@S17}v9jZpEEEglb?6NK74XS8@eapqKkiJv{<@x-}6=$Pl6Bc3mud6i(|7g>PZ z1|c@D1uR}~nmvsfn;*74P&tq=&C!#Ir-P9d7<^P$IK%S{|wp4G>g< z@$?Mc!!R-geGA4&3bvDvFStjLa~g$a+%%XLJ8=)DnjDEIGD2}Xi)F|ZkMupHbR#X+ zFPVtsdc_vkXKVb}8Cmu3L5$e+fo!UV&N1c-XUSE4%11kJyexPYSPXQ1m?|5(Yy^Qv z8>QBcHnD8XH*m27ZDKUgG(d+wx35B!&dwt`AG?7K_6m%}hSz(tm)78XIjz;;>-*}X z8b6;rm5Nkt%%f@bM1d#d^_ZyBk_}uM51UVvaLFk<#N=8r($u6!$P3DY#&7QoO&^+< zzM!FdLOIhP+%W`W(yvc4Jeq0E$lgYbH>7KAqjTZ}1}77>koRUTVV#z+o=sS-p{{i|Ho6;YMFf<<0zdsH zvMK>#vxrb>fgjTdRU?!lD&R0e`54^N5&+F=8x`}woO=WK$njCZ|=GIyso zE%2WO#k1e=MusW{Z+L6)04#JcDK@kPVbJq5D$l5?UAT;(91%{7TscPGp-uKW%Jyn+ zYsFvrn9a)Be0(Ez$4Lkq&BSO=3ozKycQEYru&k2-cx(bTTMw>5*gQ>^hi_&AA|b6$ z#deI{dnk9ydhCI<=P|;gq|`%O8pjlm@j5u>)xq=fO}yOoBuVZ)8qT*`et=EB28-E= zM4V7uR<7VCGi$M7QA9Bfj=5A^Ub-%dXgD1f)>MPQwNN7N8cs~+`z(o_nB-f1>V7-T zJCla>okHgdxmd1k&z*p(f|veTrhvpGA)@u{q)n&6E0lsFX0!NM{mS-Z(VZ>tbk{V# zx9|LoYtw19D-6ZcgE}Y$ep8U0XU?{t{*;oN@OE`V;VeHflQ{bOiFtS;exv=oyeOw>;qGzXIHDVDl6KO_9*^2g~L~IsCKsZ3y~GeZ|m$Tx%+reR>9+}q)6gPP2YLzzV2)9eR+PmXMNPtjpM7t zWmU`8%~2eqGTyx!ya1Vhpy(EJKI489G&-a9N%*|P-wQ@16(lA_I>t2iowq#F@57%z z|K*LE8-T^N>7HgSn3sEidAKO__Ci$MCIRIF5Tg3>oAWn-py{5D5j&X$>?DpT3pVxz zm-t~O)n_DE8&v5s!lsRc^(|}3k0I}$0IX%yIC6Sur#|HR(cls;-btop_FyNOGbX99 zlX^C)Dk}(Eh=fhqbrlta%@x?Hjdd05Iz|tj`blbOaa?+sg-jCTuA>Cr*O&fr zdG$g?96DDS_h8%F`vEkR?Irre+Z-zJ>LvMT_pi(%Uw`_0STZ1}68&T3*+6FXlHRkP zOHt;NL+BWCKRZ!0kgo<3{nOCFnF%B6L3$_~jcyQ>Eu53>=WIbxa_-n8Yx`HNzbRVm z+khRqipFQZxRH2$8N}s(j@Pea{}Hb*f_wi{QIHd)biDXAg zykyQ?=YLfEcG)Mm{Ev*^6x7B-Tm1e#eh2S38goTU+;N=drTCN%rA&pq{J63n1{Aa$ zihc*-3MwVq4 zh7@=9b8ZTM&FbBP&l~=MQrQ&s}6F0xLS+59c7uOaP2->O@ibULUt}t1-${>PE zH6WD5tgYQ30;79GkBnty=#po!gr2H;m#v$=X6drBIf_;?4%vqtSF{MHO2aZ)4#+##Aj{cl|S-?%7dLl6uO!oIlibP_ngP6Zf^?}7Yghrvy= z&Nt@8~Zw4LqoBJGYS|gC}+b&qq^!MLFjDG>8X(|KO z%n9W{k%BHne*NHjA}qnNi3&ENqRZIC&hMOquXfR2bPRTZ&VAFdUv|-rY1StXot>X{ z(JyXU@bEhX1LpiilHf`|{`E0KMX!!P`X3;eMaQ>Y-$g%lZqvgDh#ujsaC*0{=+hkYRdDS39t zn-p?lV|`r>b#I#4(2fyS>mf3emVuCU?U=BU4)D&p^tx4{gW{uxDc--eTl!8CwiFIl z+%rr9q?rtql-J~(m+tJ)K_{lt`m-=JAf?Q~1tQK$wLrun{%ur5>xhUTr-+e`5OmV( z*06pCB23;6AmYb5Y2l!KSjk64Fr6aKjEHb{=%5o*i72=00AC5@Gu&oKHqmn|dYa<>4nT!@(8Y(EnDd_fyAZLdTIx&@n z%DvGIHPlrypQsLtm@>ORA|U0IJV$E;f(Aweg*pX|bcCRjUYAtpxeq)89Mj=L3VEoF zEG#~1V4lm&MFp{(f?kXWa(3vTqe9rgbcBJve`yHO7@y;w7;Z1kh(mf}$?4o&c8^cH zu~ZQR9rrAQ=C%`N3t0mE?-g(1xVfSpANFaSS#X(6rpM;<%-yuGNHcD(z$c|xhFaR; znWw5pp%Hibwe99^XZNiSWJC6Bql#<(hU(kYFq?KT%-X zL>hbJQ$6EiX+HctA`^b{Ho1B7-QmLT`?$C{hX!e`Wq(3 zx6H=OEX9|()q8-S|2kb1;8d^Bt={If0sXYr%Rs%`m;mm`S}t1BHf18N3|-6jUgKO_ zMhIFhr|K7~qHux)zMJJPxad>{JJ5t|+0jvlY^m)yjq4Fy*2P{8<(?qLVpz9o4#?D= zQ>A&y{c|p_D8jcMefu0-pb6TboHYtrRu8c1~krO=5Pj(FO@<9at|%X^oHM1=$cqtoj{Kc$lmu#rZVy*+?Y_SMRgbfV^?V#N(yEL6+%_!UylhnIU^ z_f~x-8gI+kE+YFXfOgKgvsmZp1IBti>fnN3>Y4f(WtD=4m!)d3n>1LKrAMl8&l$XA zh=x;UOqO!&4Rj?I5^|GYa?(87t%DYyAs!2CHk%9`R`67w{c*(=sM(sftEO@TI4}X& zPlc?06K+|@4Pn&J8GK+10t8xsmlXOLmybL*)kmm?#<>2|_4U@CGh z^unu)JGTC7myV-vh6)$Dls_77r(e9BMR=D;{}Z(&F;p6$5-+43ap_o;$@e&qj41#8 zlpi?Sox7-Fakw2dv`)w}4l(H1Zy3j|W9b*U7z;VC=mUW9>B2@o#t7p;m3SHLjmE)! zYS{#r#^%PqiLZgi3v}k4BO34XevLVe%YJIuA;7;r>fcUunc4M`>1<9rz1Ixz;>Y8-@bciG&0K~{i3NCh+vt9XCsC=zOraWmh|yg4LtJi94`e}6 zC_@iL0c_n6To%pD=jZ#|y5Gtl zwZL#hgx|a_33*#FE5HIvPj&2a6bg){cf$Aq@phLnateOPY*V{7dgfV2@ki>j3z}wqdH`oG=^rAT=8M~db~nDzig@&@Xs&|9vD8@=RmS929uC4w#g&% z4D@v}PG?duk1#P^I*PoulNN;wJE!CRK~Jq$Ii7f4>jU=?p9t08p{=5k&5?LL#M zivmt18HW}0i&S(hiu%GCCzdE&Yd#lVtVjX|c_j>i!U@0^p}CX(SS;Ju1)>|VzxtTF z+c9gYdPp-7kr;KTlWT5f9B{2FwWVXfb_OurN+K+?=#i0>t6it+#<^CoC+`w&Be3UF z8CEiEFSE+(>qOAX$*=Jxo|;|MHR*BjaR5iHu^=4TT1(1G z03>sk0q7YUt{Hm(^jfX}h-vm7I&c6$EO{S5D|b|~ZyeY~*%*LI`HXcXOTnYD-$K!M zc#wP@bqyy`AgA7A90u#Ac#9zmZ#*cU@6norTc%a)y+Oy~z#0#Bb}gG7DLZhZ8nO=R zMu~kB1J9)bRSZC$eQ!tDAyRJ$n2ovtSw4_5p$mC4YOMyz*lV`4dTV(qgJV_erMBaMXwR(KT2Jn=}FfEaS zF;h3fW2}r2o&a6&kIRiG=6QU|m`;>=Rc7T@Fi**rpCKO6dr7md5}9d+wy~;|&NhxJ zHhk%Tq}psY)i*Y(=@FbGef6TnwQG`#wfp;+yQ6xT1|+#x%qB&X zTs?6theaxY`2nA)q%oxofH9{jtxJ{8aWxgGTQgkEJ*nH`toFE}4oumAB*SW6?lP-~ zo`=OF&4BOd?q>6MjKks!V$I2?wZfApnD7S&BQ5Y4_=~Ik0^koOT=dNskxAs?7LnNm zXYixoYH2`9i^>s93dt*xYHFxa8T{^a!rsxW8lr?ICWotp)x4PHz;ooAOypNY-R7QckoI$R!NoxVFV>S#7or zXB5B7U7P;miPRXCeFSWJ^f9T(2w?zJF8np?$fusxb*^B%I~2V4sdQn(9_HhfWm4R3bY~y@*2#K2b{7(l zCc7^(e#=N1?I#`Gln(v@-_JeB#vS)mat{i~272a?irTYH68>HEgx;hZrLOkKA2W>caYz-R17)vfUM>?P1#o zB+9?crrJN>=(OQXhQWpVjm9_4O}8@)l?L`(w<@Ih>ABNt=?nE*XB~jAyI^ubUR-^V; zNKYXH5_}lC(Fk2{sweWZGVK7&;l)rbg;CMp%`I;Ow$a=B#t~C71)|^Pc_M0Hc&dqqkGWjzfFZ?GcOZ>2#WzvlHGwJdel;!k| zZk7jb#hlO2&qY}_k8`tpx-^&PXLGVFc*8RFkq-s`1U?EVs6~ zS$5x=@HC$`1F)=kr{jIbmX?m?j4e$aqZnH>9Z!%gs*d-O)Lc7dF4@7@xcvEBnwj(D zlU7jJHU7_TJwQ*m2Sgcmp1#&5>5O18BZjSlZd3g78>WAD zi#GT6$f-Ue>Cud80Wo0iP={Cp5^Sl<)8F_&>ZNLGcNA8D0F2?gGgAL)_||w=%q~1U zSCkXbzQ;Yq^TTakYhBHkKfGx=yiV1=@onWu>&oMX zm_C0N>ejr5TY#6^A>?Om9GXAKp0O>`ixgsf`bn1fs4`g|Fgm7^_P%8d-s#ioxiGz} zeREE~L>R^ziyJQF0soec+BPp-;qq@F9A+BP3WJ3U+?$buy0<mGv*Pa23r}em$LV7g@o8Wlsx=+0x9D6?(BDWRD zT+zaL`mz<2FKhg5cfJwM%*SAAEWUFEx_TiN98EHx{x)x1!om#h!qW-hAF#sXp6T3! zT;g$0BR5#sd)rQ#N=r_V0=F}RawKGJBrA0whhNpRPnvgNtfM7;o}KsJ$2LjEqHYuX z1z6V&k?wVUNxJA>SI5{l%~!b>VP;k?KT*>xEsGvE>d)4>LKkcm)UsG!wdrN;F1P=c9{Auf&R0 z3X0K1bfAmaB_J#2d&DAbNV=RnHyHs_OO_Su(+Q_jcwq15AGNky^rvR4+}?>MR_&s$ zcvS3(?`qcp)3245aX}akJ5od4I7RYxI^p6;Ug=Tn;(LW>ESOKq^TJ(T4Ft4>A4Tv3 z{DwNxfp1evPq7DFLCodbK!Rj*J^91A73sprW5Y2JgxXgKm{OjI6-vD z38GH`h%NyTNdbsn?QsVlZ9&NumyV{_ed7g4z_AwzZ<~3gaoDw{u4iY z(-bBoGRtfeK%iMN)S>?h#F6cKQ|;dhHH8fy`4&4Emm732! z)LO$cf65`A-7)(MAH_$hx`YqXh@ua$+Zz^w#m70Jw}~b}cfuxAQNXsWCGZkaD+)1M zA#13HNd`InVytq0Z5&srExg*RE&B1Us2Td;?w*7;_MJ*sQt`IoGX|-0HApIQ&b}s> zc-|Cgi*-Lil$?Zo*V(>pVB9y=vp>}Jw$?(;DQ(C_ydU|vV&N^HJCw2JgmJ}p+ZBs$ z#Y!n(bARwUzMK04@wmz!H;g=AKE(654NR!5dwFuW>@-OEkp419Eyrsjlb?}2oqwX~ zpj5?67`7I#9O}^Bwn?ZbyGm2|@{Hx~^3kP+}Q=Y)2 z5J%aQhq8ZIVq(fOhV=&K-*MCj^J%HvmSy?M1Y*yfYDXcr+f+S`pO`nq>!$#ud9XNs z4&I-LRyvfY$)wJ`N-(U$um>HbBIe(XesqtVoc`WrRuJEeTk>;d56HY=JL1LZB&x#m2 z5NRf)A`YuwXQIOV6KO-dM~&*yYH1JBFX^JO;%Xf|J_E|P;zqGPESPjbDzUn=#Om-dJlz&xzP3;#ovstdYZC~|X#iqCqc7Ih)@E&v@zyG-ZWtvtwUm-?bSUmG}=lGULtx`_SXu;0%?w8%h zPDFMS@f~1xZE72seazd8&i+|P^%$EvxnA9v{$_S2SMb$oQiXza^N2&N$ATZp& z7ZvzQ=Ix>UVjeiffA~h=0&dIX^Q5w$6=3IH=mm9QcFYCvyR)D5q2#GO=@0PV#bBcy zLT>PLueSrGr^#A7LH=OTIFQj4YTbpgcw}(NL;Q&iLTQPoKn(Q$OZQO8*Z!{auH~$g z|Kij;Jq+31hQH+0n^vQHT^`sk(T{WMy*mWds-Z7+=@aU|juG;a39sLksseR0`CX*G zQ7mSqH$U-NC@7Lla*(IiV~72}tEf(HS^_MoUI{ubBbuLj>WK7Ih;=6a4)rH6>y8j) z_)2M6Az|1W=WXv;9%_?(ou)HIY|*Hvy=1fYJ`?gwfHg_#)r<_OiqS9Wp|K>j4r@M0 zfpYkXAfF49t0|t+vTR#iuEyIyk9@xEa#HXtA3JKkk@W4CLD3b|ij=d?`n(v$TG;Sv zull3vKS7}XL#d|xP5{9HC~mBlmeqR>TWP)^Km6M!!Tt?=|6hP0DU8J|PvK_e!xQV4_u4qKVXn30tww-HKj#b%aMAJmHo`!_69C_$C~8M zQATd`C8p|vzKyAh{WRGi;AaJt0xX%sDcIpc5}YCJ!7Ib~FBN(kOR2Yw>zDA5i&La| zu=4YIHDz5Gi$onpc!5J5P@~$v5_Elrk;Q(`c^BFJl8pd_t;uAYWKS?`=dGY(9SFlQ zMH=II8b}Am_81xMzOlKXU+y!+~=UcECE~8~B*PRdT)lY-n zhp$+Mb}1KiJU6n+b*55Il1*}^k!j~Wv|JYOyO>{qhu^3S1j4k;p$=gZa2w@j)1EMX zGx>SPQm4ha3P<#2;WT)F7wXE@>z9f4$Tzu5LaJpN&}%Ze$~#LLZA)dLa*7b_z!ha$ z)0$>XKt8bYXz-g+fV;P{YXH#Gu4e$;&BX+I2G(1_dULkA2N0FAEWruR!m`+)LE ztVZ3@eb8tsjL@hln5`wA72@P$QwlNx_j15}i*HhcT90zK0+mOt^EenoOVem)ov7@X4vx~1}S;2WiF2ef9P|1&^4s}%o--(o%B%O=bR;{k08+GolG zp3ON2#>>P;5qioRe~V=Jhr`CG&210J@U`7Y&dKb79Hk>0iOv=^SCyN z5(6AP9#qTDRm9n@ifA53$eUwrVA{xwl<&wnaY(f*1nJ_q*R(`ekRg7pjaMpMK_(*& zdyBkVlw6$LEdvX-P6!M{EGcQJvZP#iuxsez=}NP zH>&Y<(q~0CBl!j6f&I4o4Dk);*e6y{1_n{B0Ol+Ogk(e2E+C&=w6yZuC6hX!#0Ewk;ZvU>Igo_KBtal5k&u zfK8y(h#LO4;^gAR15<`e7M0 zg@r7gCj#Sl-0;b#nB(&gGzl5Ll$?0>4L5x9DOcjza9<`C9sV!jlb4Wx3&1CUQV^dH zrj5X-fbuy04Sb3cw71^CXX7`b8E@c&Ex@KwQ24Zcjl!q5FXX=mAAKr-Pi<{&{vNit+JmKKCoQtHLif(*B^p8;0HEfxMLOcp|DqX?Y?;h z?S0HUa1`!&ho~IXoO(eHdtMH5D)c8AMbCq7ujCT-hvBNA+bdjeMhKVSOF`sL7aoU$ zUa!n|$ELwmwhx6uR}|~`ME?mql^e{Htq_2eZHVhFkIa(BOzf9<`hXw{!XSvqQ}|uc z&w1g%0eEaxA%hYuj>QajSlRmJ&7x3v3^^mz%KndQEhl0k1%*}UP#Cv=hnij}Rhj!G zRY9eI6(~n5q$*IQJQ&F0fLBam7E`^PpIDEPmLb5w2w+!s?sT4IiI%&f4V9xdY)r6z zBbcXj`PA}6>s_`~_hiH71lu>Fd06nexRA@Y^Tbk{#NYsx;t`+yE=7=tR11of6%<{9 z%cV-nluZ;^?0T{LDP?YAwEKn8mBj3OTDHp%bMFh5DLKe)q#%I}K)2;woz92DZw`Lm zfoo7x8l+|U0}?|xOVR}DtQHed&d(yh=)i!pIvt!ifPbv;#)AL8;$4>iA6El?_9t*> z(p8!FFb!FI*+h)tXDxl+Q9(HaSeZ>kP!J;z@viMey@rZ5C@~6HOe4fkRDl&@W6_h7 zL9kY2-ZQ#w&S(;rKd2{02h&eu6!~%MN?lqr9+}{Co?RH$}&+|$dy{SwoAUjF(sj3-=Xi~T~Ec!3>ghnT2t_ z-`2ev%P1%2C856}*lMlQd8O`9`&ap~#y*SYC$=_%t>O$@+p~r`B8F0wopTc%?}1%w zt^TMCn(>_1OtCu&c)1#%JD&DiVGkPkcPwQ`ID`w{6+(T^UJ$xV#22KMOipjPM7QoN0^gJKI^3BTOM-74^g#|l|93>3#6yTZgW4le{0#G`IL3t5Pz*utv zz_Pa)1v~Zoz$pW!Q{v~r;*PfQbwCRZ4kT1XQ|9b zTj7Hp2QPtF+NiH&tvH4j7ySL`EH&L!Zc}7A6b66A-P*g-rv6eY)#1H5PpVRT(VP$7JNTXUZ_V)!=uN z3*koM9nn>Rk3Oi3kr!U59EZ)pt!iJE-you#CCAWD>6`VDiUez{F0&n82;XoL2cg6Z zIDlALh7z~zLW$3z#9>J&u_Fr**M8?D4n>KtIEgo-#D!{<*zP3eqr}#!DDfXCv5tij z&yE0`4LeZc(ngecf)C0$3nlK!Mu~$w0dWNfCC-UNbv}m@)ApmpLr&r)D6u^kCEkV- zL$N4vdK60BjS@#6K#8M$QO?Uy;`Th0xYvWX!MU+^VgcASdBp!6CaTq0TLy7ygIf-YZob6tK cn7a}s-aNhntVS=synPw+l?eTvzx(rl0Bkh(+W-In delta 11225 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 image_atlas : register(u3, space0); RWTexture2D gradients : register(u4, space0); RWTexture2D image : register(u2, space0); @@ -189,8 +189,8 @@ float4 spvUnpackUnorm4x8(uint value) Alloc slice_mem(Alloc a, uint offset, uint size) { - Alloc _304 = { a.offset + offset }; - return _304; + Alloc _310 = { a.offset + offset }; + return _310; } bool touch_mem(Alloc alloc, uint offset) @@ -206,7 +206,7 @@ uint read_mem(Alloc alloc, uint offset) { return 0u; } - uint v = _291.Load(offset * 4 + 8); + uint v = _297.Load(offset * 4 + 8); return v; } @@ -215,8 +215,8 @@ CmdTag Cmd_tag(Alloc a, CmdRef ref) Alloc param = a; uint param_1 = ref.offset >> uint(2); uint tag_and_flags = read_mem(param, param_1); - CmdTag _663 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _663; + CmdTag _669 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; + return _669; } CmdStroke CmdStroke_read(Alloc a, CmdStrokeRef ref) @@ -236,9 +236,9 @@ CmdStroke CmdStroke_read(Alloc a, CmdStrokeRef ref) CmdStroke Cmd_Stroke_read(Alloc a, CmdRef ref) { - CmdStrokeRef _679 = { ref.offset + 4u }; + CmdStrokeRef _685 = { ref.offset + 4u }; Alloc param = a; - CmdStrokeRef param_1 = _679; + CmdStrokeRef param_1 = _685; return CmdStroke_read(param, param_1); } @@ -274,8 +274,8 @@ TileSeg TileSeg_read(Alloc a, TileSegRef ref) s.origin = float2(asfloat(raw0), asfloat(raw1)); s._vector = float2(asfloat(raw2), asfloat(raw3)); s.y_edge = asfloat(raw4); - TileSegRef _820 = { raw5 }; - s.next = _820; + TileSegRef _826 = { raw5 }; + s.next = _826; return s; } @@ -301,9 +301,9 @@ CmdFill CmdFill_read(Alloc a, CmdFillRef ref) CmdFill Cmd_Fill_read(Alloc a, CmdRef ref) { - CmdFillRef _669 = { ref.offset + 4u }; + CmdFillRef _675 = { ref.offset + 4u }; Alloc param = a; - CmdFillRef param_1 = _669; + CmdFillRef param_1 = _675; return CmdFill_read(param, param_1); } @@ -320,9 +320,9 @@ CmdAlpha CmdAlpha_read(Alloc a, CmdAlphaRef ref) CmdAlpha Cmd_Alpha_read(Alloc a, CmdRef ref) { - CmdAlphaRef _689 = { ref.offset + 4u }; + CmdAlphaRef _695 = { ref.offset + 4u }; Alloc param = a; - CmdAlphaRef param_1 = _689; + CmdAlphaRef param_1 = _695; return CmdAlpha_read(param, param_1); } @@ -339,9 +339,9 @@ CmdColor CmdColor_read(Alloc a, CmdColorRef ref) CmdColor Cmd_Color_read(Alloc a, CmdRef ref) { - CmdColorRef _699 = { ref.offset + 4u }; + CmdColorRef _705 = { ref.offset + 4u }; Alloc param = a; - CmdColorRef param_1 = _699; + CmdColorRef param_1 = _705; return CmdColor_read(param, param_1); } @@ -385,9 +385,9 @@ CmdLinGrad CmdLinGrad_read(Alloc a, CmdLinGradRef ref) CmdLinGrad Cmd_LinGrad_read(Alloc a, CmdRef ref) { - CmdLinGradRef _709 = { ref.offset + 4u }; + CmdLinGradRef _715 = { ref.offset + 4u }; Alloc param = a; - CmdLinGradRef param_1 = _709; + CmdLinGradRef param_1 = _715; return CmdLinGrad_read(param, param_1); } @@ -439,9 +439,9 @@ CmdRadGrad CmdRadGrad_read(Alloc a, CmdRadGradRef ref) CmdRadGrad Cmd_RadGrad_read(Alloc a, CmdRef ref) { - CmdRadGradRef _719 = { ref.offset + 4u }; + CmdRadGradRef _725 = { ref.offset + 4u }; Alloc param = a; - CmdRadGradRef param_1 = _719; + CmdRadGradRef param_1 = _725; return CmdRadGrad_read(param, param_1); } @@ -462,9 +462,9 @@ CmdImage CmdImage_read(Alloc a, CmdImageRef ref) CmdImage Cmd_Image_read(Alloc a, CmdRef ref) { - CmdImageRef _729 = { ref.offset + 4u }; + CmdImageRef _735 = { ref.offset + 4u }; Alloc param = a; - CmdImageRef param_1 = _729; + CmdImageRef param_1 = _735; return CmdImage_read(param, param_1); } @@ -477,10 +477,10 @@ void fillImage(out float4 spvReturnValue[8], uint2 xy, CmdImage cmd_img) int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas[uv]; float3 param_1 = fg_rgba.xyz; - float3 _1638 = fromsRGB(param_1); - fg_rgba.x = _1638.x; - fg_rgba.y = _1638.y; - fg_rgba.z = _1638.z; + float3 _1721 = fromsRGB(param_1); + fg_rgba.x = _1721.x; + fg_rgba.y = _1721.y; + fg_rgba.z = _1721.z; rgba[i] = fg_rgba; } spvReturnValue = rgba; @@ -514,9 +514,9 @@ CmdEndClip CmdEndClip_read(Alloc a, CmdEndClipRef ref) CmdEndClip Cmd_EndClip_read(Alloc a, CmdRef ref) { - CmdEndClipRef _739 = { ref.offset + 4u }; + CmdEndClipRef _745 = { ref.offset + 4u }; Alloc param = a; - CmdEndClipRef param_1 = _739; + CmdEndClipRef param_1 = _745; return CmdEndClip_read(param, param_1); } @@ -706,8 +706,8 @@ float3 set_lum(float3 c, float l) { float3 param = c; float3 param_1 = c + (l - lum(param)).xxx; - float3 _1046 = clip_color(param_1); - return _1046; + float3 _1052 = clip_color(param_1); + return _1052; } float3 mix_blend(float3 cb, float3 cs, uint mode) @@ -795,9 +795,9 @@ float3 mix_blend(float3 cb, float3 cs, uint mode) float3 param_20 = cb; float3 param_21 = cs; float param_22 = sat(param_20); - float3 _1337 = set_sat(param_21, param_22); + float3 _1343 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1337; + float3 param_24 = _1343; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -807,9 +807,9 @@ float3 mix_blend(float3 cb, float3 cs, uint mode) float3 param_26 = cs; float3 param_27 = cb; float param_28 = sat(param_26); - float3 _1351 = set_sat(param_27, param_28); + float3 _1357 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1351; + float3 param_30 = _1357; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -919,18 +919,56 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) } case 13u: { - return float4(max(0.0f.xxxx, ((1.0f.xxxx - (float4(cs, as) * as)) + 1.0f.xxxx) - (float4(cb, ab) * ab)).xyz, max(0.0f, ((1.0f - as) + 1.0f) - ab)); + float rev_as = 1.0f - as; + float rev_ab = 1.0f - ab; + return max(0.0f.xxxx, float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); } case 14u: { - return float4(min(1.0f.xxxx, (float4(cs, as) * as) + (float4(cb, ab) * ab)).xyz, min(1.0f, as + ab)); + return min(1.0f.xxxx, float4((cs * as) + (cb * ab), as + ab)); } default: { break; } } - return (float4(cs, as) * (as * fa)) + (float4(cb, ab) * (ab * fb)); + float as_fa = as * fa; + float ab_fb = ab * fb; + float3 co = (cs * as_fa) + (cb * ab_fb); + return float4(co, as_fa + ab_fb); +} + +float4 mix_blend_compose(float4 backdrop, float4 src, uint mode) +{ + if (mode == 3u) + { + return (backdrop * (1.0f - src.w)) + src; + } + float inv_src_a = 1.0f / (src.w + 1.0000000036274937255387218471014e-15f); + float3 cs = src.xyz * inv_src_a; + float inv_backdrop_a = 1.0f / (backdrop.w + 1.0000000036274937255387218471014e-15f); + float3 cb = backdrop.xyz * inv_backdrop_a; + uint blend_mode = mode >> uint(8); + float3 param = cs; + float3 param_1 = cb; + uint param_2 = blend_mode; + float3 blended = mix_blend(param, param_1, param_2); + cs = lerp(cs, blended, backdrop.w.xxx); + uint comp_mode = mode * 255u; + if (comp_mode == 3u) + { + float3 co = lerp(backdrop.xyz, cs, src.w.xxx); + return float4(co, src.w + (backdrop.w * (1.0f - src.w))); + } + else + { + float3 param_3 = cb; + float3 param_4 = cs; + float param_5 = backdrop.w; + float param_6 = src.w; + uint param_7 = comp_mode; + return mix_compose(param_3, param_4, param_5, param_6, param_7); + } } CmdJump CmdJump_read(Alloc a, CmdJumpRef ref) @@ -946,24 +984,24 @@ CmdJump CmdJump_read(Alloc a, CmdJumpRef ref) CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) { - CmdJumpRef _749 = { ref.offset + 4u }; + CmdJumpRef _755 = { ref.offset + 4u }; Alloc param = a; - CmdJumpRef param_1 = _749; + CmdJumpRef param_1 = _755; return CmdJump_read(param, param_1); } void comp_main() { - uint tile_ix = (gl_WorkGroupID.y * _1666.Load(8)) + gl_WorkGroupID.x; - Alloc _1681; - _1681.offset = _1666.Load(24); + uint tile_ix = (gl_WorkGroupID.y * _1749.Load(8)) + gl_WorkGroupID.x; + Alloc _1764; + _1764.offset = _1749.Load(24); Alloc param; - param.offset = _1681.offset; + param.offset = _1764.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1690 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1690; + CmdRef _1773 = { cmd_alloc.offset }; + CmdRef cmd_ref = _1773; uint2 xy_uint = uint2(gl_LocalInvocationID.x + (16u * gl_WorkGroupID.x), gl_LocalInvocationID.y + (16u * gl_WorkGroupID.y)); float2 xy = float2(xy_uint); float4 rgba[8]; @@ -972,7 +1010,7 @@ void comp_main() rgba[i] = 0.0f.xxxx; } uint clip_depth = 0u; - bool mem_ok = _291.Load(4) == 0u; + bool mem_ok = _297.Load(4) == 0u; float df[8]; TileSegRef tile_seg_ref; float area[8]; @@ -997,8 +1035,8 @@ void comp_main() { df[k] = 1000000000.0f; } - TileSegRef _1784 = { stroke.tile_ref }; - tile_seg_ref = _1784; + TileSegRef _1867 = { stroke.tile_ref }; + tile_seg_ref = _1867; do { uint param_7 = tile_seg_ref.offset; @@ -1034,8 +1072,8 @@ void comp_main() { area[k_3] = float(fill.backdrop); } - TileSegRef _1904 = { fill.tile_ref }; - tile_seg_ref = _1904; + TileSegRef _1987 = { fill.tile_ref }; + tile_seg_ref = _1987; do { uint param_15 = tile_seg_ref.offset; @@ -1124,10 +1162,10 @@ void comp_main() int x = int(round(clamp(my_d, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba = gradients[int2(x, int(lin.index))]; float3 param_29 = fg_rgba.xyz; - float3 _2238 = fromsRGB(param_29); - fg_rgba.x = _2238.x; - fg_rgba.y = _2238.y; - fg_rgba.z = _2238.z; + float3 _2321 = fromsRGB(param_29); + fg_rgba.x = _2321.x; + fg_rgba.y = _2321.y; + fg_rgba.z = _2321.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0f - fg_k_1.w)) + fg_k_1; } @@ -1150,10 +1188,10 @@ void comp_main() int x_1 = int(round(clamp(t_2, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba_1 = gradients[int2(x_1, int(rad.index))]; float3 param_33 = fg_rgba_1.xyz; - float3 _2348 = fromsRGB(param_33); - fg_rgba_1.x = _2348.x; - fg_rgba_1.y = _2348.y; - fg_rgba_1.z = _2348.z; + float3 _2431 = fromsRGB(param_33); + fg_rgba_1.x = _2431.x; + fg_rgba_1.y = _2431.y; + fg_rgba_1.z = _2431.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0f - fg_k_2.w)) + fg_k_2; } @@ -1167,9 +1205,9 @@ void comp_main() CmdImage fill_img = Cmd_Image_read(param_34, param_35); uint2 param_36 = xy_uint; CmdImage param_37 = fill_img; - float4 _2391[8]; - fillImage(_2391, param_36, param_37); - float4 img[8] = _2391; + float4 _2474[8]; + fillImage(_2474, param_36, param_37); + float4 img[8] = _2474; for (uint k_11 = 0u; k_11 < 8u; k_11++) { float4 fg_k_3 = img[k_11] * area[k_11]; @@ -1184,8 +1222,8 @@ void comp_main() { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2454 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2454; + uint _2537 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2537; rgba[k_12] = 0.0f.xxxx; } clip_depth++; @@ -1206,32 +1244,20 @@ void comp_main() uint param_41 = blend_stack[d_3][k_13]; float4 bg = unpacksRGB(param_41); float4 fg_1 = rgba[k_13] * area[k_13]; - float3 param_42 = bg.xyz; - float3 param_43 = fg_1.xyz; - uint param_44 = blend_mode; - float3 blend = mix_blend(param_42, param_43, param_44); - float4 _2521 = fg_1; - float _2525 = fg_1.w; - float3 _2532 = lerp(_2521.xyz, blend, float((_2525 * bg.w) > 0.0f).xxx); - fg_1.x = _2532.x; - fg_1.y = _2532.y; - fg_1.z = _2532.z; - float3 param_45 = bg.xyz; - float3 param_46 = fg_1.xyz; - float param_47 = bg.w; - float param_48 = fg_1.w; - uint param_49 = comp_mode; - rgba[k_13] = mix_compose(param_45, param_46, param_47, param_48, param_49); + float4 param_42 = bg; + float4 param_43 = fg_1; + uint param_44 = end_clip.blend; + rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_50 = cmd_alloc; - CmdRef param_51 = cmd_ref; - CmdRef _2569 = { Cmd_Jump_read(param_50, param_51).new_ref }; - cmd_ref = _2569; + Alloc param_45 = cmd_alloc; + CmdRef param_46 = cmd_ref; + CmdRef _2615 = { Cmd_Jump_read(param_45, param_46).new_ref }; + cmd_ref = _2615; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1239,9 +1265,9 @@ void comp_main() } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_52 = i_1; - float3 param_53 = rgba[i_1].xyz; - image[int2(xy_uint + chunk_offset(param_52))] = float4(tosRGB(param_53), rgba[i_1].w); + uint param_47 = i_1; + float3 param_48 = rgba[i_1].xyz; + image[int2(xy_uint + chunk_offset(param_47))] = float4(tosRGB(param_48), rgba[i_1].w); } } diff --git a/piet-gpu/shader/gen/kernel4.msl b/piet-gpu/shader/gen/kernel4.msl index 6489563..796043b 100644 --- a/piet-gpu/shader/gen/kernel4.msl +++ b/piet-gpu/shader/gen/kernel4.msl @@ -237,7 +237,7 @@ bool touch_mem(thread const Alloc& alloc, thread const uint& offset) } static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_291) +uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_297) { Alloc param = alloc; uint param_1 = offset; @@ -245,29 +245,29 @@ uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memor { return 0u; } - uint v = v_291.memory[offset]; + uint v = v_297.memory[offset]; return v; } static inline __attribute__((always_inline)) -CmdTag Cmd_tag(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdTag Cmd_tag(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1, v_291); + uint tag_and_flags = read_mem(param, param_1, v_297); return CmdTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; } static inline __attribute__((always_inline)) -CmdStroke CmdStroke_read(thread const Alloc& a, thread const CmdStrokeRef& ref, device Memory& v_291) +CmdStroke CmdStroke_read(thread const Alloc& a, thread const CmdStrokeRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); CmdStroke s; s.tile_ref = raw0; s.half_width = as_type(raw1); @@ -275,11 +275,11 @@ CmdStroke CmdStroke_read(thread const Alloc& a, thread const CmdStrokeRef& ref, } static inline __attribute__((always_inline)) -CmdStroke Cmd_Stroke_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdStroke Cmd_Stroke_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdStrokeRef param_1 = CmdStrokeRef{ ref.offset + 4u }; - return CmdStroke_read(param, param_1, v_291); + return CmdStroke_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -291,27 +291,27 @@ Alloc new_alloc(thread const uint& offset, thread const uint& size, thread const } static inline __attribute__((always_inline)) -TileSeg TileSeg_read(thread const Alloc& a, thread const TileSegRef& ref, device Memory& v_291) +TileSeg TileSeg_read(thread const Alloc& a, thread const TileSegRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_291); + uint raw2 = read_mem(param_4, param_5, v_297); Alloc param_6 = a; uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_291); + uint raw3 = read_mem(param_6, param_7, v_297); Alloc param_8 = a; uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_291); + uint raw4 = read_mem(param_8, param_9, v_297); Alloc param_10 = a; uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11, v_291); + uint raw5 = read_mem(param_10, param_11, v_297); TileSeg s; s.origin = float2(as_type(raw0), as_type(raw1)); s.vector = float2(as_type(raw2), as_type(raw3)); @@ -327,15 +327,15 @@ uint2 chunk_offset(thread const uint& i) } static inline __attribute__((always_inline)) -CmdFill CmdFill_read(thread const Alloc& a, thread const CmdFillRef& ref, device Memory& v_291) +CmdFill CmdFill_read(thread const Alloc& a, thread const CmdFillRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); CmdFill s; s.tile_ref = raw0; s.backdrop = int(raw1); @@ -343,51 +343,51 @@ CmdFill CmdFill_read(thread const Alloc& a, thread const CmdFillRef& ref, device } static inline __attribute__((always_inline)) -CmdFill Cmd_Fill_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdFill Cmd_Fill_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdFillRef param_1 = CmdFillRef{ ref.offset + 4u }; - return CmdFill_read(param, param_1, v_291); + return CmdFill_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdAlpha CmdAlpha_read(thread const Alloc& a, thread const CmdAlphaRef& ref, device Memory& v_291) +CmdAlpha CmdAlpha_read(thread const Alloc& a, thread const CmdAlphaRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdAlpha s; s.alpha = as_type(raw0); return s; } static inline __attribute__((always_inline)) -CmdAlpha Cmd_Alpha_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdAlpha Cmd_Alpha_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdAlphaRef param_1 = CmdAlphaRef{ ref.offset + 4u }; - return CmdAlpha_read(param, param_1, v_291); + return CmdAlpha_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdColor CmdColor_read(thread const Alloc& a, thread const CmdColorRef& ref, device Memory& v_291) +CmdColor CmdColor_read(thread const Alloc& a, thread const CmdColorRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdColor s; s.rgba_color = raw0; return s; } static inline __attribute__((always_inline)) -CmdColor Cmd_Color_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdColor Cmd_Color_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdColorRef param_1 = CmdColorRef{ ref.offset + 4u }; - return CmdColor_read(param, param_1, v_291); + return CmdColor_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -408,21 +408,21 @@ float4 unpacksRGB(thread const uint& srgba) } static inline __attribute__((always_inline)) -CmdLinGrad CmdLinGrad_read(thread const Alloc& a, thread const CmdLinGradRef& ref, device Memory& v_291) +CmdLinGrad CmdLinGrad_read(thread const Alloc& a, thread const CmdLinGradRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_291); + uint raw2 = read_mem(param_4, param_5, v_297); Alloc param_6 = a; uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_291); + uint raw3 = read_mem(param_6, param_7, v_297); CmdLinGrad s; s.index = raw0; s.line_x = as_type(raw1); @@ -432,50 +432,50 @@ CmdLinGrad CmdLinGrad_read(thread const Alloc& a, thread const CmdLinGradRef& re } static inline __attribute__((always_inline)) -CmdLinGrad Cmd_LinGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdLinGrad Cmd_LinGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdLinGradRef param_1 = CmdLinGradRef{ ref.offset + 4u }; - return CmdLinGrad_read(param, param_1, v_291); + return CmdLinGrad_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdRadGrad CmdRadGrad_read(thread const Alloc& a, thread const CmdRadGradRef& ref, device Memory& v_291) +CmdRadGrad CmdRadGrad_read(thread const Alloc& a, thread const CmdRadGradRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_291); + uint raw2 = read_mem(param_4, param_5, v_297); Alloc param_6 = a; uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_291); + uint raw3 = read_mem(param_6, param_7, v_297); Alloc param_8 = a; uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_291); + uint raw4 = read_mem(param_8, param_9, v_297); Alloc param_10 = a; uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11, v_291); + uint raw5 = read_mem(param_10, param_11, v_297); Alloc param_12 = a; uint param_13 = ix + 6u; - uint raw6 = read_mem(param_12, param_13, v_291); + uint raw6 = read_mem(param_12, param_13, v_297); Alloc param_14 = a; uint param_15 = ix + 7u; - uint raw7 = read_mem(param_14, param_15, v_291); + uint raw7 = read_mem(param_14, param_15, v_297); Alloc param_16 = a; uint param_17 = ix + 8u; - uint raw8 = read_mem(param_16, param_17, v_291); + uint raw8 = read_mem(param_16, param_17, v_297); Alloc param_18 = a; uint param_19 = ix + 9u; - uint raw9 = read_mem(param_18, param_19, v_291); + uint raw9 = read_mem(param_18, param_19, v_297); Alloc param_20 = a; uint param_21 = ix + 10u; - uint raw10 = read_mem(param_20, param_21, v_291); + uint raw10 = read_mem(param_20, param_21, v_297); CmdRadGrad s; s.index = raw0; s.mat = float4(as_type(raw1), as_type(raw2), as_type(raw3), as_type(raw4)); @@ -487,23 +487,23 @@ CmdRadGrad CmdRadGrad_read(thread const Alloc& a, thread const CmdRadGradRef& re } static inline __attribute__((always_inline)) -CmdRadGrad Cmd_RadGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdRadGrad Cmd_RadGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdRadGradRef param_1 = CmdRadGradRef{ ref.offset + 4u }; - return CmdRadGrad_read(param, param_1, v_291); + return CmdRadGrad_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdImage CmdImage_read(thread const Alloc& a, thread const CmdImageRef& ref, device Memory& v_291) +CmdImage CmdImage_read(thread const Alloc& a, thread const CmdImageRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); CmdImage s; s.index = raw0; s.offset = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); @@ -511,11 +511,11 @@ CmdImage CmdImage_read(thread const Alloc& a, thread const CmdImageRef& ref, dev } static inline __attribute__((always_inline)) -CmdImage Cmd_Image_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdImage Cmd_Image_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdImageRef param_1 = CmdImageRef{ ref.offset + 4u }; - return CmdImage_read(param, param_1, v_291); + return CmdImage_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -528,10 +528,10 @@ spvUnsafeArray fillImage(thread const uint2& xy, thread const CmdImag int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas.read(uint2(uv)); float3 param_1 = fg_rgba.xyz; - float3 _1638 = fromsRGB(param_1); - fg_rgba.x = _1638.x; - fg_rgba.y = _1638.y; - fg_rgba.z = _1638.z; + float3 _1721 = fromsRGB(param_1); + fg_rgba.x = _1721.x; + fg_rgba.y = _1721.y; + fg_rgba.z = _1721.z; rgba[i] = fg_rgba; } return rgba; @@ -555,23 +555,23 @@ uint packsRGB(thread float4& rgba) } static inline __attribute__((always_inline)) -CmdEndClip CmdEndClip_read(thread const Alloc& a, thread const CmdEndClipRef& ref, device Memory& v_291) +CmdEndClip CmdEndClip_read(thread const Alloc& a, thread const CmdEndClipRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdEndClip s; s.blend = raw0; return s; } static inline __attribute__((always_inline)) -CmdEndClip Cmd_EndClip_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdEndClip Cmd_EndClip_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdEndClipRef param_1 = CmdEndClipRef{ ref.offset + 4u }; - return CmdEndClip_read(param, param_1, v_291); + return CmdEndClip_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -771,8 +771,8 @@ float3 set_lum(thread const float3& c, thread const float& l) { float3 param = c; float3 param_1 = c + float3(l - lum(param)); - float3 _1046 = clip_color(param_1); - return _1046; + float3 _1052 = clip_color(param_1); + return _1052; } static inline __attribute__((always_inline)) @@ -861,9 +861,9 @@ float3 mix_blend(thread const float3& cb, thread const float3& cs, thread const float3 param_20 = cb; float3 param_21 = cs; float param_22 = sat(param_20); - float3 _1337 = set_sat(param_21, param_22); + float3 _1343 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1337; + float3 param_24 = _1343; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -873,9 +873,9 @@ float3 mix_blend(thread const float3& cb, thread const float3& cs, thread const float3 param_26 = cs; float3 param_27 = cb; float param_28 = sat(param_26); - float3 _1351 = set_sat(param_27, param_28); + float3 _1357 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1351; + float3 param_30 = _1357; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -986,45 +986,84 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons } case 13u: { - return float4(fast::max(float4(0.0), ((float4(1.0) - (float4(cs, as) * as)) + float4(1.0)) - (float4(cb, ab) * ab)).xyz, fast::max(0.0, ((1.0 - as) + 1.0) - ab)); + float rev_as = 1.0 - as; + float rev_ab = 1.0 - ab; + return fast::max(float4(0.0), float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); } case 14u: { - return float4(fast::min(float4(1.0), (float4(cs, as) * as) + (float4(cb, ab) * ab)).xyz, fast::min(1.0, as + ab)); + return fast::min(float4(1.0), float4((cs * as) + (cb * ab), as + ab)); } default: { break; } } - return (float4(cs, as) * (as * fa)) + (float4(cb, ab) * (ab * fb)); + float as_fa = as * fa; + float ab_fb = ab * fb; + float3 co = (cs * as_fa) + (cb * ab_fb); + return float4(co, as_fa + ab_fb); } static inline __attribute__((always_inline)) -CmdJump CmdJump_read(thread const Alloc& a, thread const CmdJumpRef& ref, device Memory& v_291) +float4 mix_blend_compose(thread const float4& backdrop, thread const float4& src, thread const uint& mode) +{ + if (mode == 3u) + { + return (backdrop * (1.0 - src.w)) + src; + } + float inv_src_a = 1.0 / (src.w + 1.0000000036274937255387218471014e-15); + float3 cs = src.xyz * inv_src_a; + float inv_backdrop_a = 1.0 / (backdrop.w + 1.0000000036274937255387218471014e-15); + float3 cb = backdrop.xyz * inv_backdrop_a; + uint blend_mode = mode >> uint(8); + float3 param = cs; + float3 param_1 = cb; + uint param_2 = blend_mode; + float3 blended = mix_blend(param, param_1, param_2); + cs = mix(cs, blended, float3(backdrop.w)); + uint comp_mode = mode * 255u; + if (comp_mode == 3u) + { + float3 co = mix(backdrop.xyz, cs, float3(src.w)); + return float4(co, src.w + (backdrop.w * (1.0 - src.w))); + } + else + { + float3 param_3 = cb; + float3 param_4 = cs; + float param_5 = backdrop.w; + float param_6 = src.w; + uint param_7 = comp_mode; + return mix_compose(param_3, param_4, param_5, param_6, param_7); + } +} + +static inline __attribute__((always_inline)) +CmdJump CmdJump_read(thread const Alloc& a, thread const CmdJumpRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdJump s; s.new_ref = raw0; return s; } static inline __attribute__((always_inline)) -CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdJumpRef param_1 = CmdJumpRef{ ref.offset + 4u }; - return CmdJump_read(param, param_1, v_291); + return CmdJump_read(param, param_1, v_297); } -kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1666 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1749 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { - uint tile_ix = (gl_WorkGroupID.y * _1666.conf.width_in_tiles) + gl_WorkGroupID.x; + uint tile_ix = (gl_WorkGroupID.y * _1749.conf.width_in_tiles) + gl_WorkGroupID.x; Alloc param; - param.offset = _1666.conf.ptcl_alloc.offset; + param.offset = _1749.conf.ptcl_alloc.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); @@ -1037,7 +1076,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 rgba[i] = float4(0.0); } uint clip_depth = 0u; - bool mem_ok = v_291.mem_error == 0u; + bool mem_ok = v_297.mem_error == 0u; spvUnsafeArray df; TileSegRef tile_seg_ref; spvUnsafeArray area; @@ -1046,7 +1085,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_3 = cmd_alloc; CmdRef param_4 = cmd_ref; - uint tag = Cmd_tag(param_3, param_4, v_291).tag; + uint tag = Cmd_tag(param_3, param_4, v_297).tag; if (tag == 0u) { break; @@ -1057,7 +1096,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_5 = cmd_alloc; CmdRef param_6 = cmd_ref; - CmdStroke stroke = Cmd_Stroke_read(param_5, param_6, v_291); + CmdStroke stroke = Cmd_Stroke_read(param_5, param_6, v_297); for (uint k = 0u; k < 8u; k++) { df[k] = 1000000000.0; @@ -1070,7 +1109,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 bool param_9 = mem_ok; Alloc param_10 = new_alloc(param_7, param_8, param_9); TileSegRef param_11 = tile_seg_ref; - TileSeg seg = TileSeg_read(param_10, param_11, v_291); + TileSeg seg = TileSeg_read(param_10, param_11, v_297); float2 line_vec = seg.vector; for (uint k_1 = 0u; k_1 < 8u; k_1++) { @@ -1093,7 +1132,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_13 = cmd_alloc; CmdRef param_14 = cmd_ref; - CmdFill fill = Cmd_Fill_read(param_13, param_14, v_291); + CmdFill fill = Cmd_Fill_read(param_13, param_14, v_297); for (uint k_3 = 0u; k_3 < 8u; k_3++) { area[k_3] = float(fill.backdrop); @@ -1106,7 +1145,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 bool param_17 = mem_ok; Alloc param_18 = new_alloc(param_15, param_16, param_17); TileSegRef param_19 = tile_seg_ref; - TileSeg seg_1 = TileSeg_read(param_18, param_19, v_291); + TileSeg seg_1 = TileSeg_read(param_18, param_19, v_297); for (uint k_4 = 0u; k_4 < 8u; k_4++) { uint param_20 = k_4; @@ -1150,7 +1189,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_21 = cmd_alloc; CmdRef param_22 = cmd_ref; - CmdAlpha alpha = Cmd_Alpha_read(param_21, param_22, v_291); + CmdAlpha alpha = Cmd_Alpha_read(param_21, param_22, v_297); for (uint k_7 = 0u; k_7 < 8u; k_7++) { area[k_7] = alpha.alpha; @@ -1162,7 +1201,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_23 = cmd_alloc; CmdRef param_24 = cmd_ref; - CmdColor color = Cmd_Color_read(param_23, param_24, v_291); + CmdColor color = Cmd_Color_read(param_23, param_24, v_297); uint param_25 = color.rgba_color; float4 fg = unpacksRGB(param_25); for (uint k_8 = 0u; k_8 < 8u; k_8++) @@ -1177,7 +1216,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_26 = cmd_alloc; CmdRef param_27 = cmd_ref; - CmdLinGrad lin = Cmd_LinGrad_read(param_26, param_27, v_291); + CmdLinGrad lin = Cmd_LinGrad_read(param_26, param_27, v_297); float d_1 = ((lin.line_x * xy.x) + (lin.line_y * xy.y)) + lin.line_c; for (uint k_9 = 0u; k_9 < 8u; k_9++) { @@ -1187,10 +1226,10 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 int x = int(round(fast::clamp(my_d, 0.0, 1.0) * 511.0)); float4 fg_rgba = gradients.read(uint2(int2(x, int(lin.index)))); float3 param_29 = fg_rgba.xyz; - float3 _2238 = fromsRGB(param_29); - fg_rgba.x = _2238.x; - fg_rgba.y = _2238.y; - fg_rgba.z = _2238.z; + float3 _2321 = fromsRGB(param_29); + fg_rgba.x = _2321.x; + fg_rgba.y = _2321.y; + fg_rgba.z = _2321.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0 - fg_k_1.w)) + fg_k_1; } @@ -1201,7 +1240,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_30 = cmd_alloc; CmdRef param_31 = cmd_ref; - CmdRadGrad rad = Cmd_RadGrad_read(param_30, param_31, v_291); + CmdRadGrad rad = Cmd_RadGrad_read(param_30, param_31, v_297); for (uint k_10 = 0u; k_10 < 8u; k_10++) { uint param_32 = k_10; @@ -1213,10 +1252,10 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 int x_1 = int(round(fast::clamp(t_2, 0.0, 1.0) * 511.0)); float4 fg_rgba_1 = gradients.read(uint2(int2(x_1, int(rad.index)))); float3 param_33 = fg_rgba_1.xyz; - float3 _2348 = fromsRGB(param_33); - fg_rgba_1.x = _2348.x; - fg_rgba_1.y = _2348.y; - fg_rgba_1.z = _2348.z; + float3 _2431 = fromsRGB(param_33); + fg_rgba_1.x = _2431.x; + fg_rgba_1.y = _2431.y; + fg_rgba_1.z = _2431.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0 - fg_k_2.w)) + fg_k_2; } @@ -1227,7 +1266,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_34 = cmd_alloc; CmdRef param_35 = cmd_ref; - CmdImage fill_img = Cmd_Image_read(param_34, param_35, v_291); + CmdImage fill_img = Cmd_Image_read(param_34, param_35, v_297); uint2 param_36 = xy_uint; CmdImage param_37 = fill_img; spvUnsafeArray img; @@ -1246,8 +1285,8 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2454 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2454; + uint _2537 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2537; rgba[k_12] = float4(0.0); } clip_depth++; @@ -1258,7 +1297,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; - CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40, v_291); + CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40, v_297); uint blend_mode = end_clip.blend >> uint(8); uint comp_mode = end_clip.blend & 255u; clip_depth--; @@ -1268,31 +1307,19 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 uint param_41 = blend_stack[d_3][k_13]; float4 bg = unpacksRGB(param_41); float4 fg_1 = rgba[k_13] * area[k_13]; - float3 param_42 = bg.xyz; - float3 param_43 = fg_1.xyz; - uint param_44 = blend_mode; - float3 blend = mix_blend(param_42, param_43, param_44); - float4 _2521 = fg_1; - float _2525 = fg_1.w; - float3 _2532 = mix(_2521.xyz, blend, float3(float((_2525 * bg.w) > 0.0))); - fg_1.x = _2532.x; - fg_1.y = _2532.y; - fg_1.z = _2532.z; - float3 param_45 = bg.xyz; - float3 param_46 = fg_1.xyz; - float param_47 = bg.w; - float param_48 = fg_1.w; - uint param_49 = comp_mode; - rgba[k_13] = mix_compose(param_45, param_46, param_47, param_48, param_49); + float4 param_42 = bg; + float4 param_43 = fg_1; + uint param_44 = end_clip.blend; + rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_50 = cmd_alloc; - CmdRef param_51 = cmd_ref; - cmd_ref = CmdRef{ Cmd_Jump_read(param_50, param_51, v_291).new_ref }; + Alloc param_45 = cmd_alloc; + CmdRef param_46 = cmd_ref; + cmd_ref = CmdRef{ Cmd_Jump_read(param_45, param_46, v_297).new_ref }; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1300,9 +1327,9 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_52 = i_1; - float3 param_53 = rgba[i_1].xyz; - image.write(float4(tosRGB(param_53), rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_52)))); + uint param_47 = i_1; + float3 param_48 = rgba[i_1].xyz; + image.write(float4(tosRGB(param_48), rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_47)))); } } diff --git a/piet-gpu/shader/gen/kernel4.spv b/piet-gpu/shader/gen/kernel4.spv index 70612634a5e2d8a7713d8107b6f1da6aafffa287..b145245533171d27c8272c481f98a9d7bfa57cfc 100644 GIT binary patch literal 66476 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 literal 65556 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 diff --git a/piet-gpu/shader/gen/kernel4_gray.dxil b/piet-gpu/shader/gen/kernel4_gray.dxil index 046045f51c54cb050580f10b12ea5046b1b56a4f..abe1d225b002617025777d5c355ec77cbff70d71 100644 GIT binary patch delta 11288 zcmb7q3s@7^)^@H#fFva0HZec~0R%-%keh%p0R#n9R74Qegb1RIh}K(cG&hK-(FCE0 zw;B~KUK>PPZ9O)DV1lB>iZ)i%z@aU*wkJ~C29LGh9!UKD?>qnV{Lk-$$)1^aty#18 zde>TeOtavvtqmu)Vt1cKHJrn3VN_Lah$M8j zhlV!R!jKx3h`WOm5qY!~anqC9XW+larW`3;d*;nRZ^fI2%`5L|56#Ognv*AwL!pEy zJW5YQp^#$~xB~^;q!OG@&oDj>1?LYC8lI))CVvMC2qJtoGbIK8F<8Dd2$5=>^>t-Bu@-CcThTeDMq#N zAWLIP6j;xbywO}7H-3R1+7~y?8cE2A7r-r^9h|ik!h4-@c|-wevEQt3aUy+U%mXv! zQU0t28|PAb`Hv0xjEsT||5^90D0G~?kNIiAs5}Zzo>@|K=rJyoWbo|BUn_&nEJh+F z6J9Ac9CsQ~4y(MD{m1OU{Mx;DF5ZdQd%kCH zRSu;fwDbM8$qk2dx4nNjgGQNab(Fs7u)Vl7bQ+fx9G7-r`en|gxNE1AF2#KoEm)`~ zem(1=gn?35|H@DkAXMtbI9KU%~$gkif)VPkX_(;ZI-T3$4 z0LT|mrxXO#a{Xo}HYr^5dCop>1$sKq1QqN!g;OP@s zv2XW#04`?@KNE4XjGgD^Z4u)x4gV1j?qw5S`0N=hVD5>1yO(-(d(3w?I9Vtqt8T}b zHOb@Fd}AL!sWi!u+x^W1w*K{@@~8N$-an`8`MG1v27;Fu_rpIfUP>C1m$4DTupv*B zQmB8T46Z@PT<@5qfx}S*r9$n!g#{VxUgtSwIuwflEseFC;C^My<&HW5M$UpOztDNC ztoHug?&VVOi!!7c9Xr%9IaUM1Km&RK`F))?8-jp#els@sMMs?i4FoAa@IAidlnD`~ z=IMQchM%eVY0rh;lw^BH9U4)+@#kvqdy|LKXZ^DpkI!E?y>u43U)blFHDyz?9Uan? zlJ}D0lN%iQfo|t1^8K`)hAp&U|2-kkMQ1t}`}|?(8@RM{Tha6CCsWz41& zjj4g>%bLU5wHc^|A_mC0!FP?}Pk}i72riAtpkxLUjRrKg&x8U8>0<{}a1gVp2;0cn zb&C9+jyAEaPedxfL^P$GH#L0X%L)|k`Uu<;nqs2m20t}MEG;|J$+%vV+wjykR5sD~ zt^oP-mip?0E)N^Bru!lHY8 zm-%HukJ_g%_lMT$F3Zpp_>;N$iG0fk-jnZLGSRPB=0pF4<$_N)5u0XyJ6iP50S;~v zv60k^zL0qfT7~)ujf3(%M7{W89hREF@N382j8V`VJACuexs~`CXf{LuPSATCKlggN z&=)*aeodaywbt*g_q{|JGFPUfB%3(3SBmzCu(Gh~ooL(hYA?yXfKDjWLB<*$p#8tY zOi`2SP$7`;T*joUwM)TN3(|WNE(|y+Lkui(8@O$K zz#yfi3mDjk4&aPW=g}3dv!>%D$aJ21gVVq);O~OK32PN(Q;8-L$4}t7b=E_r=QCJ= z7I@q4ww>@cbz3{Ghu>w7yB)$g?Hz|^-mg6<*Lr44^O6S_;n$SnPaWTMT?Q5ECu~tI zm;#{02(!z~b`+mNB)?4F zYYdOk4~a1mOyB*^W}VrB6YwGlBivB=*W)~l85T`26?*I-`0T}qHEu5vWf5cXSG&@4WmHvEEBvL_ma*{Mp1Ao@k}Y(v5Tt0q6C~|Cp!&e zus!dk{U%_7^=8S4sG~}*#&d95SvBIk9(9^*P5>M708Uh0Q}+R`yzPM?(jn#nf8fKY zrFe0XpLx~zlkcMmw5TbrDdE)rPUtH;*E#o9_731K3J&U(*GglHeE0 z?5!&S18NXH14?>J71I!re(!Q_)X7~Y~38osuW!Ye2jR>2zQ6neC zf#+`*alQPm-hhw(DCiAas?fSwvw9)hK<&2z*7$MR zF4hDewp%5*lsLeeP2lOqS@UOPY8gYIMV=y>GyW7ZVQ=>??NAmf5(yQgeQuqbXpz^c znr=jA_&c2+>$=zBDmG}_zJ<5#X*&RK+X*OkkKZMqpU=zpAL?E#oVXO*D#UNwkOXg1 zE(qv_r03iAI*a&b%aKrCK)l1{kr{>0Gh4M|Yc1m>S9Hz8{oA$Js=|>>>7D3~7~Kd%nCK)Vx{x1X=zR(M8D-tR0rZno6y;YA8xaRm)pypL339})|2ZV&3{ zDo_hu1YJM$LcFD7TrfW%yDI$2BdTD{e+me7(I!C7a~bZTGP6 z;hbRI(>bV{9-|l#A6Uzg_^=zqhlNOd*p3GA!P|=vq~VTd_}uOnxf~abZ(YtcMs`Bx zWE_@1DAZ7~2>XljZ>~_fC{_q9S0>RDWvpAFFe=OgL?xtuM+AnrGswcCJR zPd1@+(_yjMh=jX<1EB|96T7du?SOtB@ZXIDNZxCL$LkM+xu+ZFn#10_8@R2&sn2I{ zP%Y$}FqeY_q}qytNY{G*Q&!=OumM*;5v)YBHgj&e;$_nPIFl=Ir2IBjaSY7EzbHi1 zH5E6DNCXjBc#q!f>7wy4z1}mu+$OKvDMYQA`37I%sk=a4w{Tj*G{B~oIFOs{=8CEc zz|5R-z(8~N9cvF@VDl|NG@Z=%$nk@KX~`b})^a9JXHNqwDW3$`shGF1VkLMu)?$Q& zM_=UKMMA_`gwUx22af_mD;Lw{VbsHlVoXa8u3WEdxJSj}z%&n=Z0E+3imyH)1XOE8z{a|v>s)>SUw zdggglG(K#4Ms*JZ9Q322FGRYtKdA+0Pcxu1ha!5RNznD%gM1JdrvAe>Ur6*Ojy4Oe z7AS)k3DroOQkr|5LAk+sYN_rNIdT!Nd!a`Imsv{?Q$)ltji81bvkF9ze5=K)p(|{P z3@)6>fvX7Lc@Qh;gek4dKVY`nw_L_J6|VLC<437Ea`rK>o>3>HLNf{tc#!hL8re?a0@o>vvS zO?cIXh^t<+hbPGhp%+B828{0)3{8qD%6kWx#;6f)y2LIPu$c_lS;R8BQZAY4b)2=) z<@nA}npc)Z*;ntbGG?~SG~uy(;drD(!e#xQkrM4Ejc!Z_e@JvtWG*7HW%u-k{k*{`jZ##ah$^m8n8(L)bj;(4u9B4m!*dU+%C zasJNQC#iH%xqM%hdsw@#y3!B|)>HM?YEl37&Zw=IGdf+Y{=och_+ej0=f+Of;`=03 zfoyIPap9E*=*=&NNl_d%zE+wSH6-q0G1+OOF`JyhytArP>w2q+T_(rG-pwD1WZiAotEK1eI6Xx_{2yBrTwO)GdTaD`a*q;Xg%G;zy}6m(J{YhRf-S7)0mXt!|x1@5fxr&(B44HcfHse7-W5>t`R+S@=$8 z>i0Af{!2t>mxAU}=`sKM#tg+&MCJBYx5_*Br~Z^rnFmx>A8Gr9zD?HLwu-*3v27xK zo38Cgc$=o}6F4>3K`J1=rf*&Kam)gaBHdG6}de-6GS-j$h)jur@W0u1}zGSqWBykg->vmW8%iMEbU7L}br z`4{az1^xijgz*AGmMVGH-kXFU3tDv?h{bD$0OC3 z7w(OGqQ4C0Pmj5g;{AFOHo>|0F0IbQ@8W+hfcuniL3POz^xD;=8@2vJ4<88T=cCcJ zy}ku}W1RpCwj!C&e_t{sp(KM-(w+eRfGeK#Oy?Zp5KelUIYEN{J_jkAlAIs~@n;_C zSn&D?X6jH5Pqw+|BWd2j$sVdS7=>?d!?!hHrAO zLyW9kUZSo^Dv6ph>Pj$SW#1>bhH+&-xQFRwKPKdXP?PY4Gy4G&d~$<#c$s^IvNN6Y zYi)E8YNDwbAk@rEC|k{u@F^B#9#vd0k2U$oJW@Aeg=_N5ka>KK%;QZyQCWLZfIBjcN$c) z>;6Qzfw_TjqwdpzcJ_@S@lI*CW#8z2cUC!GSaHi0z-1>Y-i=RguGmfbBZA5J6->YV zfSZ`p6A~CMUJI_g8_r2cWJqjNM{ULxBW=gO0!d$HvOs?;wWPoC$NmR5TA zC5^og{-I7Z_OYh<$~nC)Ec2Hf!e_e|eo0eaNVO)MNh1i`u(G`+z!Pv|jQW5gmSMq> zU7#TWZ&>faO+;KH*la`DLK+!FP?9gls*2UqI4XV7&;9yR?|xwu>dd$M6IxjhH@d2Z z&7D{1-W%6~sv+mIH^d6hZ-n}?-d|9poP>PW7QK0R%7dDP=j{D0YE(dKYtePQAMvEJ zOey=;pj>u8PD=Wk^W5v?KF)K(NsVLLDExBO2p7{gB+hK@UX>gsZwJ*H zJScIh*Nj2PrQCr!Xkv3zWT}(dPZNU_%w6o4eGQA5(AnqdlLqlKb z4S(0rcH{=tHSF)dK}wW44oM}$K!yE1cQH`@TMUCSnhC6_PJ6$`yAAJ6N!6LhAM*Ua)?W$zg?(5{+jbD=og-tA`>#E_a{@d6T z_ulO7#;HET?oITY$Nxyv%T&cmDZI~){n-0PF_fZH36n8C(pYB&eOO4w{QFv3o%SyQ z|J~+x{+o{2<_Nt?LC$E#F7O$Y_hF~Q`v~|pAgxYq1=1&ctcdilMlxn{>dZQAefm4; zEDryxcJB($UxoTk$_wKIY>NDMnVzg>=b?X5u4@WqI#{4LfWLz1l3G>9hgE)q;xm+9 zcXP^**#GG-$}xK@@t-3oo(GOM)lIpn*ycnM7_g9@nqQ)P_q>2-EFP}czDHA z{OK(MX@w_W1T24Re5&H<|1|oj*&7u98Z$gS6yDd0zcFSwrPlbSDsWJ2n&LK`90K~! zsDBvKr`CNPBjCYP-+V091RCe_Zh8;MCNdcteRzp4LO{D?hLf0GhaL5QR$Y_axB|FS zoeCVdJgGSK{4weIVB37&L-H>`>Y)Hs@+zsM$Yazt&BxKUD#R}SI?ZSa-=@>f`Gdu5 zcp>0b0FM&aY3UhK4Si7DLt%>5PFp@Ga&mZypk@nIXk{c%sbsc&TCUEglN#}IM^{qN z0-6JH;s~m&3$#%|-$%9JGuo?(%#vNN8?+Z{{sM{o-zqKXPY));0W3GyNF{Ziqc(~! zC<6bsi?M&3Eb6xakQB;fRHgG0`)k}${7jdSj6Ld#EnNZF6yipiEBH5+5TA2;J^z~w zi9%4cHE2oAQZ-wOA*u!$`y9JC#NF$XJ0_YrQ8yTxFHEfrP28pAPChRypb}8Z8b-p7 z7I{M%(jL4jl=p|yL}98-_9=s6E_{8KG!IgJUZ*8(2xWScM`3Q@NE@nNEA!t7j%lOt za=(|{>#RZXR=~xUWTIWXKL~PgSCg?$nC_eTJNh^U#-oBh&+S=K`q?FO-X3ZR_CiDL= zY4%E4CSp@SC9sK8Pon}2OO3V0ySTZ7;%FLZgv9BzZQX~=mZET-mW1A3;aM$8J~68> z6R58O>bLnO?b4bM^)_Jh#Pu}h;re&RE8;SEwFSEQ0{@{!Lj0)TQZ#wFfQMg#!WQf1 zhXxpr2MjHe>G9Q9!8M6U-=m)&>Ms=d4+HS}O8ok*_}6}=3Ld@~oDUdY)CvwO6<5J0 zf;9lFRp9>uU>8*4|LwQj1QfG8ioyAS)}@B|ihvi3u7dLtky(grs4hMtzKFBe2j8O} zAy&m1x`pGXV`bkFe~n{7p%bylc}^$@pO7?&7#7sw2lyB9>SHXT=)O|M{Igdpe!) zET%JdC_`xWXR-}WxW3EsVO%dz1v(8lz;UZ3ekv~u_lldY*HW?DL5bkBaUe&Vf;blO z00(5qTM=Dl^~Zu%`7M{%M@-PK;!JXPDo5Hb5vW_W%BH zdDPD31U0*;d@(|gASv)9q5l%ZlU7vjG+IxU4vGhWCt-@~wfLRV7p31s@Csvr6C3 zabe^4OKR3NDT2NWpc%To4*3m_GLq2G~H^MeR}1fILsID-~-S)MBM*7QF7Vx zp;@C9^oOCr%7MBMj|T#J=I`80$SW_5=JgQu&ks2G%qxj;PzbSCjzSj^i85AV`G$OGo)Wx35&#C2}Muc%%&5Lmi| z;PI`$S>aA&9d{w=6VxwNwkFY zgDn0XiJ_raI5yg`m04glKlVp?xZgK6zWL2E%zCv!0Wp# zgcx4d%9m}`q{~2+)j|-+fUXhlojnNQHI!kona^aHQM^PAS}I{-k!?^Xf4$JUKe}~M zw9Pl#YKzhZ2em$77>_cnD;PSV5sGd1mYnq7fc7!GBwy$Iyyo~oJe_HVL1=*DcY4Hc z@rXa*;Rx_@KwgeWFKm}0H21WA-YMby7MA!Vf3vJwzj+;MOBGADmajxJuJ*(l_QqQA zX~vtW4$O?<&NSG`hyFAwO%qy!LR$NSTT4T9B~dy?lI_oXrM3s#^5#rT)e`<343H=!L%@5g#W?-?IsLWV!9_6R#5 z^Y~&)4Q8FUUjN<+p~}0<0tN2Yl4AWpZ3lL!`u(6@jsP9f43I`Z!xT$0eX^r_EtXzI zn3sgS-`{TAY4l3nt@YpR$DI5kikH|@4_1pkYBOYwv?;Vef(aTWJf(K8#E}Kc$OGUd zXOL-C6F)-z6Erab-XYVy7NvXMVp{FY5M6cp3EHkCcvm9Jvo-vtG5lA1c!lS}vL;qU z&q~#@-C#eF(?e@9gD+b*blnfc*hWqxX*de(nxjS0jJ^e6*RrsqAkldWEL=;?1qo{2 zOKua%F$Un~>Szxy2|~IorHSw-&gMv~<+6Y$J53$oCWZ}(B?VTC&8pMVv0xW$7vDrN zOZ?n#To-(W{uN4QxL>;3*6F?!+=br#et|JurEf=bU9T?RLSHgoNccUp)|%sjN!^xS z{zpUNN<+>FcgER?qs<|Y8l-vJU*~}Bii0bb%a9x9HT~h~ZX0W=m?R8`UHy_Ja3c!k;lSiH-EnVqah{dPkyVUJ>X6=sC?Dv-Qf^wl65OYP!7Ug7@F@ zpOrK1U-SZn4wdJ%aHelo4li;TG#+}fqwsN$5v~$E6@GHJg;)ssoDgUQB2^S~Q2?0v zRx^K(>40K_RmEdP3!o^p*Fe_0$O7yzm~V)=z3h#5wig;nm^XO`aK@$U<&4UAU)0B{D|^h{zMO?lbN3k+)y1x zQg(bRlwn)>GOX*3;YGEILUtw+vXWu&I;$A7QeW0wluq&hoy{juVi3*`J_$`AUz90f z^5xyZWCMmlzNo%R(&Mg@gk~dBMV{r7`;+pY@Cl{K$@~6U`OLVVNfv@1S@l<=zzY}f zYb-Qm20w~h3;vft^#q&nHlK!ONa%TCLe&&(4o+ey&)+2{eMXF-8ca>52uz|a&X{S0 zN}zjV;0Xv=wv-LfDhYya-ix5GBIwX01ntZMX!Wx(bO?gJH3t3=0T*czuwx9&L%_Cd z1pIFVY-A$fh2cPR=WYaCS&x9H(h$vA2)Ji90-oS$lL>EEvk`Po1Y-471Wh@Bphw2g zD-g6J7eVjv1gcSS2sk|w0e2(dsDlVN$`?^xj(`n$2)JnsJPiStje+kV;MOs4G6Ght zLcmTLf`$wTnw5y4tq5B62to4?BdXURXi*h{w#`LUUq`^kBn13+3_Lt$$58~_ihu`p mjDZ&-njKyM%vpngKaAZ9=A$3K&QK12B`1Mp1OM=2pZ^8v$l(?M delta 11046 zcmaKSd0bQ1*7nJCGLS&RWFSHU0c27WKtNh!0ti-6ky^#64FnMtl{%u0WI_y>nkYkY zj^o9OnuxVx)g~m8pir?+sTVa+YL%ilaJ@EIZNGg&()WJf`}=+T5%xLf+3T#m_IlP{ zd+l>#OY^4S%!2d``>zw(YcrpQJXpywNyjaRP!I$)r|E-tV9B%2QA2Kia=Z*v`!%-i z40a2ntgI}GU}_ButKUI~tD$6UH@1+>^ZhJgDz|kS?lvavi)T}oEj~Kgd3SUzEBE)m z=4KXrlv~AxAR&Z<3dsW ztd@_$SP!CD8)0cj5JXx5Ize0M5L8rmmONX+fX%EZLZOb<#3J9WuF4B6qSMhfYLZ_S zwX-d6vHXLA`FisKBn<*J|p~M8sAxthg z+5ZWCqsY*%dO1VXQt%zQ>{@lUM8Dm4>kHFV~uS;8hx!0jHEJlA7B)N*+Gjo3-FsR!St{ zYfWF9t)a8~2oM)j}Z z3zL6eFd=0@a!RCq5Ol6@yVLoL;M&QyJKeL19Z>5B-W0UtD-s0xVdH3CSP04j=1uB? z{PV-$`gv{jv!?oI#mrA{3&@q#|HZ#kzx1g841GgppMN1=5U`Fv3i}s~;_I_U|6=;* z72fA>tuKV8{=!A)p^H_trr)pJd_tG~uzv#q7GYTgxg#Y@+xqNar3kw{{>pGlmi>+X z`4=LrgzNLB&2?1@uKsnn@%NN0NX}CJ)lNt4|Ly8l&^e4)U6GQ-f7pCvg9sb9_V5-U z>3IKQ0A~^2ZlSAa4#(GbAJb*=SEf+_{7u1`mnm62mSejlBJ5h`u1k|uG%1U4>?s{Z zkh8qUv`I=GyD5}#!0YUP?KIK_Prr>n=jGCs743Q|7a|W?N(meBJBSSvA-PcdQ+kLL z6@RroRz;712y)qGugz3gXD79AiZl?500&R%mC1jI0b0tUm$pgqBB9qMJIO8J zMS5txaiYCFPDQ6faRfO^;Jsez#fD)ZonLPn|GZr(LxGOeUpV+HoFXA2v}$S(YH}UQ zH@S}LOPQ%N8dU8{6e4}&3!xV^)$X|(Ece$f*kD&XeACA6n}qz99jtL!TF(HqG$)kM3UI*Z40A2FrgkO{>%UhWNfJ z3~fv+bMir#OX6nGQ!pKBJ(+Z}{y6gN{)XkIbNEGROuUihI!rfs1t4 z1r1!pZ=x$CR?u4n`M%ZND zoZp`sd<@F>I1$C^rJAwyt^{&ACx_MLd%|2Q4~C8t%b@u>e7=Cm$Gs{41k1@0cKNbe zu~z;KXhKF6c|O@p4GZYP&gb~16-g1>ADY`z6@#6~-A{!Ax)k0i*y$*^m29Mu>nLd7 zm@dpRzbtrPYmF>>hmjE>StEsgW|8YDJ*cDRoA3�fmM0@P$3NMH&q41BO3lIcB5k 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 image_atlas : register(u3, space0); RWTexture2D gradients : register(u4, space0); RWTexture2D image : register(u2, space0); @@ -189,8 +189,8 @@ float4 spvUnpackUnorm4x8(uint value) Alloc slice_mem(Alloc a, uint offset, uint size) { - Alloc _304 = { a.offset + offset }; - return _304; + Alloc _310 = { a.offset + offset }; + return _310; } bool touch_mem(Alloc alloc, uint offset) @@ -206,7 +206,7 @@ uint read_mem(Alloc alloc, uint offset) { return 0u; } - uint v = _291.Load(offset * 4 + 8); + uint v = _297.Load(offset * 4 + 8); return v; } @@ -215,8 +215,8 @@ CmdTag Cmd_tag(Alloc a, CmdRef ref) Alloc param = a; uint param_1 = ref.offset >> uint(2); uint tag_and_flags = read_mem(param, param_1); - CmdTag _663 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _663; + CmdTag _669 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; + return _669; } CmdStroke CmdStroke_read(Alloc a, CmdStrokeRef ref) @@ -236,9 +236,9 @@ CmdStroke CmdStroke_read(Alloc a, CmdStrokeRef ref) CmdStroke Cmd_Stroke_read(Alloc a, CmdRef ref) { - CmdStrokeRef _679 = { ref.offset + 4u }; + CmdStrokeRef _685 = { ref.offset + 4u }; Alloc param = a; - CmdStrokeRef param_1 = _679; + CmdStrokeRef param_1 = _685; return CmdStroke_read(param, param_1); } @@ -274,8 +274,8 @@ TileSeg TileSeg_read(Alloc a, TileSegRef ref) s.origin = float2(asfloat(raw0), asfloat(raw1)); s._vector = float2(asfloat(raw2), asfloat(raw3)); s.y_edge = asfloat(raw4); - TileSegRef _820 = { raw5 }; - s.next = _820; + TileSegRef _826 = { raw5 }; + s.next = _826; return s; } @@ -301,9 +301,9 @@ CmdFill CmdFill_read(Alloc a, CmdFillRef ref) CmdFill Cmd_Fill_read(Alloc a, CmdRef ref) { - CmdFillRef _669 = { ref.offset + 4u }; + CmdFillRef _675 = { ref.offset + 4u }; Alloc param = a; - CmdFillRef param_1 = _669; + CmdFillRef param_1 = _675; return CmdFill_read(param, param_1); } @@ -320,9 +320,9 @@ CmdAlpha CmdAlpha_read(Alloc a, CmdAlphaRef ref) CmdAlpha Cmd_Alpha_read(Alloc a, CmdRef ref) { - CmdAlphaRef _689 = { ref.offset + 4u }; + CmdAlphaRef _695 = { ref.offset + 4u }; Alloc param = a; - CmdAlphaRef param_1 = _689; + CmdAlphaRef param_1 = _695; return CmdAlpha_read(param, param_1); } @@ -339,9 +339,9 @@ CmdColor CmdColor_read(Alloc a, CmdColorRef ref) CmdColor Cmd_Color_read(Alloc a, CmdRef ref) { - CmdColorRef _699 = { ref.offset + 4u }; + CmdColorRef _705 = { ref.offset + 4u }; Alloc param = a; - CmdColorRef param_1 = _699; + CmdColorRef param_1 = _705; return CmdColor_read(param, param_1); } @@ -385,9 +385,9 @@ CmdLinGrad CmdLinGrad_read(Alloc a, CmdLinGradRef ref) CmdLinGrad Cmd_LinGrad_read(Alloc a, CmdRef ref) { - CmdLinGradRef _709 = { ref.offset + 4u }; + CmdLinGradRef _715 = { ref.offset + 4u }; Alloc param = a; - CmdLinGradRef param_1 = _709; + CmdLinGradRef param_1 = _715; return CmdLinGrad_read(param, param_1); } @@ -439,9 +439,9 @@ CmdRadGrad CmdRadGrad_read(Alloc a, CmdRadGradRef ref) CmdRadGrad Cmd_RadGrad_read(Alloc a, CmdRef ref) { - CmdRadGradRef _719 = { ref.offset + 4u }; + CmdRadGradRef _725 = { ref.offset + 4u }; Alloc param = a; - CmdRadGradRef param_1 = _719; + CmdRadGradRef param_1 = _725; return CmdRadGrad_read(param, param_1); } @@ -462,9 +462,9 @@ CmdImage CmdImage_read(Alloc a, CmdImageRef ref) CmdImage Cmd_Image_read(Alloc a, CmdRef ref) { - CmdImageRef _729 = { ref.offset + 4u }; + CmdImageRef _735 = { ref.offset + 4u }; Alloc param = a; - CmdImageRef param_1 = _729; + CmdImageRef param_1 = _735; return CmdImage_read(param, param_1); } @@ -477,10 +477,10 @@ void fillImage(out float4 spvReturnValue[8], uint2 xy, CmdImage cmd_img) int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas[uv]; float3 param_1 = fg_rgba.xyz; - float3 _1638 = fromsRGB(param_1); - fg_rgba.x = _1638.x; - fg_rgba.y = _1638.y; - fg_rgba.z = _1638.z; + float3 _1721 = fromsRGB(param_1); + fg_rgba.x = _1721.x; + fg_rgba.y = _1721.y; + fg_rgba.z = _1721.z; rgba[i] = fg_rgba; } spvReturnValue = rgba; @@ -514,9 +514,9 @@ CmdEndClip CmdEndClip_read(Alloc a, CmdEndClipRef ref) CmdEndClip Cmd_EndClip_read(Alloc a, CmdRef ref) { - CmdEndClipRef _739 = { ref.offset + 4u }; + CmdEndClipRef _745 = { ref.offset + 4u }; Alloc param = a; - CmdEndClipRef param_1 = _739; + CmdEndClipRef param_1 = _745; return CmdEndClip_read(param, param_1); } @@ -706,8 +706,8 @@ float3 set_lum(float3 c, float l) { float3 param = c; float3 param_1 = c + (l - lum(param)).xxx; - float3 _1046 = clip_color(param_1); - return _1046; + float3 _1052 = clip_color(param_1); + return _1052; } float3 mix_blend(float3 cb, float3 cs, uint mode) @@ -795,9 +795,9 @@ float3 mix_blend(float3 cb, float3 cs, uint mode) float3 param_20 = cb; float3 param_21 = cs; float param_22 = sat(param_20); - float3 _1337 = set_sat(param_21, param_22); + float3 _1343 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1337; + float3 param_24 = _1343; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -807,9 +807,9 @@ float3 mix_blend(float3 cb, float3 cs, uint mode) float3 param_26 = cs; float3 param_27 = cb; float param_28 = sat(param_26); - float3 _1351 = set_sat(param_27, param_28); + float3 _1357 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1351; + float3 param_30 = _1357; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -919,18 +919,56 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) } case 13u: { - return float4(max(0.0f.xxxx, ((1.0f.xxxx - (float4(cs, as) * as)) + 1.0f.xxxx) - (float4(cb, ab) * ab)).xyz, max(0.0f, ((1.0f - as) + 1.0f) - ab)); + float rev_as = 1.0f - as; + float rev_ab = 1.0f - ab; + return max(0.0f.xxxx, float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); } case 14u: { - return float4(min(1.0f.xxxx, (float4(cs, as) * as) + (float4(cb, ab) * ab)).xyz, min(1.0f, as + ab)); + return min(1.0f.xxxx, float4((cs * as) + (cb * ab), as + ab)); } default: { break; } } - return (float4(cs, as) * (as * fa)) + (float4(cb, ab) * (ab * fb)); + float as_fa = as * fa; + float ab_fb = ab * fb; + float3 co = (cs * as_fa) + (cb * ab_fb); + return float4(co, as_fa + ab_fb); +} + +float4 mix_blend_compose(float4 backdrop, float4 src, uint mode) +{ + if (mode == 3u) + { + return (backdrop * (1.0f - src.w)) + src; + } + float inv_src_a = 1.0f / (src.w + 1.0000000036274937255387218471014e-15f); + float3 cs = src.xyz * inv_src_a; + float inv_backdrop_a = 1.0f / (backdrop.w + 1.0000000036274937255387218471014e-15f); + float3 cb = backdrop.xyz * inv_backdrop_a; + uint blend_mode = mode >> uint(8); + float3 param = cs; + float3 param_1 = cb; + uint param_2 = blend_mode; + float3 blended = mix_blend(param, param_1, param_2); + cs = lerp(cs, blended, backdrop.w.xxx); + uint comp_mode = mode * 255u; + if (comp_mode == 3u) + { + float3 co = lerp(backdrop.xyz, cs, src.w.xxx); + return float4(co, src.w + (backdrop.w * (1.0f - src.w))); + } + else + { + float3 param_3 = cb; + float3 param_4 = cs; + float param_5 = backdrop.w; + float param_6 = src.w; + uint param_7 = comp_mode; + return mix_compose(param_3, param_4, param_5, param_6, param_7); + } } CmdJump CmdJump_read(Alloc a, CmdJumpRef ref) @@ -946,24 +984,24 @@ CmdJump CmdJump_read(Alloc a, CmdJumpRef ref) CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) { - CmdJumpRef _749 = { ref.offset + 4u }; + CmdJumpRef _755 = { ref.offset + 4u }; Alloc param = a; - CmdJumpRef param_1 = _749; + CmdJumpRef param_1 = _755; return CmdJump_read(param, param_1); } void comp_main() { - uint tile_ix = (gl_WorkGroupID.y * _1666.Load(8)) + gl_WorkGroupID.x; - Alloc _1681; - _1681.offset = _1666.Load(24); + uint tile_ix = (gl_WorkGroupID.y * _1749.Load(8)) + gl_WorkGroupID.x; + Alloc _1764; + _1764.offset = _1749.Load(24); Alloc param; - param.offset = _1681.offset; + param.offset = _1764.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1690 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1690; + CmdRef _1773 = { cmd_alloc.offset }; + CmdRef cmd_ref = _1773; uint2 xy_uint = uint2(gl_LocalInvocationID.x + (16u * gl_WorkGroupID.x), gl_LocalInvocationID.y + (16u * gl_WorkGroupID.y)); float2 xy = float2(xy_uint); float4 rgba[8]; @@ -972,7 +1010,7 @@ void comp_main() rgba[i] = 0.0f.xxxx; } uint clip_depth = 0u; - bool mem_ok = _291.Load(4) == 0u; + bool mem_ok = _297.Load(4) == 0u; float df[8]; TileSegRef tile_seg_ref; float area[8]; @@ -997,8 +1035,8 @@ void comp_main() { df[k] = 1000000000.0f; } - TileSegRef _1784 = { stroke.tile_ref }; - tile_seg_ref = _1784; + TileSegRef _1867 = { stroke.tile_ref }; + tile_seg_ref = _1867; do { uint param_7 = tile_seg_ref.offset; @@ -1034,8 +1072,8 @@ void comp_main() { area[k_3] = float(fill.backdrop); } - TileSegRef _1904 = { fill.tile_ref }; - tile_seg_ref = _1904; + TileSegRef _1987 = { fill.tile_ref }; + tile_seg_ref = _1987; do { uint param_15 = tile_seg_ref.offset; @@ -1124,10 +1162,10 @@ void comp_main() int x = int(round(clamp(my_d, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba = gradients[int2(x, int(lin.index))]; float3 param_29 = fg_rgba.xyz; - float3 _2238 = fromsRGB(param_29); - fg_rgba.x = _2238.x; - fg_rgba.y = _2238.y; - fg_rgba.z = _2238.z; + float3 _2321 = fromsRGB(param_29); + fg_rgba.x = _2321.x; + fg_rgba.y = _2321.y; + fg_rgba.z = _2321.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0f - fg_k_1.w)) + fg_k_1; } @@ -1150,10 +1188,10 @@ void comp_main() int x_1 = int(round(clamp(t_2, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba_1 = gradients[int2(x_1, int(rad.index))]; float3 param_33 = fg_rgba_1.xyz; - float3 _2348 = fromsRGB(param_33); - fg_rgba_1.x = _2348.x; - fg_rgba_1.y = _2348.y; - fg_rgba_1.z = _2348.z; + float3 _2431 = fromsRGB(param_33); + fg_rgba_1.x = _2431.x; + fg_rgba_1.y = _2431.y; + fg_rgba_1.z = _2431.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0f - fg_k_2.w)) + fg_k_2; } @@ -1167,9 +1205,9 @@ void comp_main() CmdImage fill_img = Cmd_Image_read(param_34, param_35); uint2 param_36 = xy_uint; CmdImage param_37 = fill_img; - float4 _2391[8]; - fillImage(_2391, param_36, param_37); - float4 img[8] = _2391; + float4 _2474[8]; + fillImage(_2474, param_36, param_37); + float4 img[8] = _2474; for (uint k_11 = 0u; k_11 < 8u; k_11++) { float4 fg_k_3 = img[k_11] * area[k_11]; @@ -1184,8 +1222,8 @@ void comp_main() { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2454 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2454; + uint _2537 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2537; rgba[k_12] = 0.0f.xxxx; } clip_depth++; @@ -1206,32 +1244,20 @@ void comp_main() uint param_41 = blend_stack[d_3][k_13]; float4 bg = unpacksRGB(param_41); float4 fg_1 = rgba[k_13] * area[k_13]; - float3 param_42 = bg.xyz; - float3 param_43 = fg_1.xyz; - uint param_44 = blend_mode; - float3 blend = mix_blend(param_42, param_43, param_44); - float4 _2521 = fg_1; - float _2525 = fg_1.w; - float3 _2532 = lerp(_2521.xyz, blend, float((_2525 * bg.w) > 0.0f).xxx); - fg_1.x = _2532.x; - fg_1.y = _2532.y; - fg_1.z = _2532.z; - float3 param_45 = bg.xyz; - float3 param_46 = fg_1.xyz; - float param_47 = bg.w; - float param_48 = fg_1.w; - uint param_49 = comp_mode; - rgba[k_13] = mix_compose(param_45, param_46, param_47, param_48, param_49); + float4 param_42 = bg; + float4 param_43 = fg_1; + uint param_44 = end_clip.blend; + rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_50 = cmd_alloc; - CmdRef param_51 = cmd_ref; - CmdRef _2569 = { Cmd_Jump_read(param_50, param_51).new_ref }; - cmd_ref = _2569; + Alloc param_45 = cmd_alloc; + CmdRef param_46 = cmd_ref; + CmdRef _2615 = { Cmd_Jump_read(param_45, param_46).new_ref }; + cmd_ref = _2615; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1239,8 +1265,8 @@ void comp_main() } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_52 = i_1; - image[int2(xy_uint + chunk_offset(param_52))] = rgba[i_1].w.x; + uint param_47 = i_1; + image[int2(xy_uint + chunk_offset(param_47))] = rgba[i_1].w.x; } } diff --git a/piet-gpu/shader/gen/kernel4_gray.msl b/piet-gpu/shader/gen/kernel4_gray.msl index 6402c6f..9647001 100644 --- a/piet-gpu/shader/gen/kernel4_gray.msl +++ b/piet-gpu/shader/gen/kernel4_gray.msl @@ -237,7 +237,7 @@ bool touch_mem(thread const Alloc& alloc, thread const uint& offset) } static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_291) +uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_297) { Alloc param = alloc; uint param_1 = offset; @@ -245,29 +245,29 @@ uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memor { return 0u; } - uint v = v_291.memory[offset]; + uint v = v_297.memory[offset]; return v; } static inline __attribute__((always_inline)) -CmdTag Cmd_tag(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdTag Cmd_tag(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1, v_291); + uint tag_and_flags = read_mem(param, param_1, v_297); return CmdTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; } static inline __attribute__((always_inline)) -CmdStroke CmdStroke_read(thread const Alloc& a, thread const CmdStrokeRef& ref, device Memory& v_291) +CmdStroke CmdStroke_read(thread const Alloc& a, thread const CmdStrokeRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); CmdStroke s; s.tile_ref = raw0; s.half_width = as_type(raw1); @@ -275,11 +275,11 @@ CmdStroke CmdStroke_read(thread const Alloc& a, thread const CmdStrokeRef& ref, } static inline __attribute__((always_inline)) -CmdStroke Cmd_Stroke_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdStroke Cmd_Stroke_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdStrokeRef param_1 = CmdStrokeRef{ ref.offset + 4u }; - return CmdStroke_read(param, param_1, v_291); + return CmdStroke_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -291,27 +291,27 @@ Alloc new_alloc(thread const uint& offset, thread const uint& size, thread const } static inline __attribute__((always_inline)) -TileSeg TileSeg_read(thread const Alloc& a, thread const TileSegRef& ref, device Memory& v_291) +TileSeg TileSeg_read(thread const Alloc& a, thread const TileSegRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_291); + uint raw2 = read_mem(param_4, param_5, v_297); Alloc param_6 = a; uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_291); + uint raw3 = read_mem(param_6, param_7, v_297); Alloc param_8 = a; uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_291); + uint raw4 = read_mem(param_8, param_9, v_297); Alloc param_10 = a; uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11, v_291); + uint raw5 = read_mem(param_10, param_11, v_297); TileSeg s; s.origin = float2(as_type(raw0), as_type(raw1)); s.vector = float2(as_type(raw2), as_type(raw3)); @@ -327,15 +327,15 @@ uint2 chunk_offset(thread const uint& i) } static inline __attribute__((always_inline)) -CmdFill CmdFill_read(thread const Alloc& a, thread const CmdFillRef& ref, device Memory& v_291) +CmdFill CmdFill_read(thread const Alloc& a, thread const CmdFillRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); CmdFill s; s.tile_ref = raw0; s.backdrop = int(raw1); @@ -343,51 +343,51 @@ CmdFill CmdFill_read(thread const Alloc& a, thread const CmdFillRef& ref, device } static inline __attribute__((always_inline)) -CmdFill Cmd_Fill_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdFill Cmd_Fill_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdFillRef param_1 = CmdFillRef{ ref.offset + 4u }; - return CmdFill_read(param, param_1, v_291); + return CmdFill_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdAlpha CmdAlpha_read(thread const Alloc& a, thread const CmdAlphaRef& ref, device Memory& v_291) +CmdAlpha CmdAlpha_read(thread const Alloc& a, thread const CmdAlphaRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdAlpha s; s.alpha = as_type(raw0); return s; } static inline __attribute__((always_inline)) -CmdAlpha Cmd_Alpha_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdAlpha Cmd_Alpha_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdAlphaRef param_1 = CmdAlphaRef{ ref.offset + 4u }; - return CmdAlpha_read(param, param_1, v_291); + return CmdAlpha_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdColor CmdColor_read(thread const Alloc& a, thread const CmdColorRef& ref, device Memory& v_291) +CmdColor CmdColor_read(thread const Alloc& a, thread const CmdColorRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdColor s; s.rgba_color = raw0; return s; } static inline __attribute__((always_inline)) -CmdColor Cmd_Color_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdColor Cmd_Color_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdColorRef param_1 = CmdColorRef{ ref.offset + 4u }; - return CmdColor_read(param, param_1, v_291); + return CmdColor_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -408,21 +408,21 @@ float4 unpacksRGB(thread const uint& srgba) } static inline __attribute__((always_inline)) -CmdLinGrad CmdLinGrad_read(thread const Alloc& a, thread const CmdLinGradRef& ref, device Memory& v_291) +CmdLinGrad CmdLinGrad_read(thread const Alloc& a, thread const CmdLinGradRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_291); + uint raw2 = read_mem(param_4, param_5, v_297); Alloc param_6 = a; uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_291); + uint raw3 = read_mem(param_6, param_7, v_297); CmdLinGrad s; s.index = raw0; s.line_x = as_type(raw1); @@ -432,50 +432,50 @@ CmdLinGrad CmdLinGrad_read(thread const Alloc& a, thread const CmdLinGradRef& re } static inline __attribute__((always_inline)) -CmdLinGrad Cmd_LinGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdLinGrad Cmd_LinGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdLinGradRef param_1 = CmdLinGradRef{ ref.offset + 4u }; - return CmdLinGrad_read(param, param_1, v_291); + return CmdLinGrad_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdRadGrad CmdRadGrad_read(thread const Alloc& a, thread const CmdRadGradRef& ref, device Memory& v_291) +CmdRadGrad CmdRadGrad_read(thread const Alloc& a, thread const CmdRadGradRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_291); + uint raw2 = read_mem(param_4, param_5, v_297); Alloc param_6 = a; uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_291); + uint raw3 = read_mem(param_6, param_7, v_297); Alloc param_8 = a; uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_291); + uint raw4 = read_mem(param_8, param_9, v_297); Alloc param_10 = a; uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11, v_291); + uint raw5 = read_mem(param_10, param_11, v_297); Alloc param_12 = a; uint param_13 = ix + 6u; - uint raw6 = read_mem(param_12, param_13, v_291); + uint raw6 = read_mem(param_12, param_13, v_297); Alloc param_14 = a; uint param_15 = ix + 7u; - uint raw7 = read_mem(param_14, param_15, v_291); + uint raw7 = read_mem(param_14, param_15, v_297); Alloc param_16 = a; uint param_17 = ix + 8u; - uint raw8 = read_mem(param_16, param_17, v_291); + uint raw8 = read_mem(param_16, param_17, v_297); Alloc param_18 = a; uint param_19 = ix + 9u; - uint raw9 = read_mem(param_18, param_19, v_291); + uint raw9 = read_mem(param_18, param_19, v_297); Alloc param_20 = a; uint param_21 = ix + 10u; - uint raw10 = read_mem(param_20, param_21, v_291); + uint raw10 = read_mem(param_20, param_21, v_297); CmdRadGrad s; s.index = raw0; s.mat = float4(as_type(raw1), as_type(raw2), as_type(raw3), as_type(raw4)); @@ -487,23 +487,23 @@ CmdRadGrad CmdRadGrad_read(thread const Alloc& a, thread const CmdRadGradRef& re } static inline __attribute__((always_inline)) -CmdRadGrad Cmd_RadGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdRadGrad Cmd_RadGrad_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdRadGradRef param_1 = CmdRadGradRef{ ref.offset + 4u }; - return CmdRadGrad_read(param, param_1, v_291); + return CmdRadGrad_read(param, param_1, v_297); } static inline __attribute__((always_inline)) -CmdImage CmdImage_read(thread const Alloc& a, thread const CmdImageRef& ref, device Memory& v_291) +CmdImage CmdImage_read(thread const Alloc& a, thread const CmdImageRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_291); + uint raw1 = read_mem(param_2, param_3, v_297); CmdImage s; s.index = raw0; s.offset = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); @@ -511,11 +511,11 @@ CmdImage CmdImage_read(thread const Alloc& a, thread const CmdImageRef& ref, dev } static inline __attribute__((always_inline)) -CmdImage Cmd_Image_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdImage Cmd_Image_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdImageRef param_1 = CmdImageRef{ ref.offset + 4u }; - return CmdImage_read(param, param_1, v_291); + return CmdImage_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -528,10 +528,10 @@ spvUnsafeArray fillImage(thread const uint2& xy, thread const CmdImag int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas.read(uint2(uv)); float3 param_1 = fg_rgba.xyz; - float3 _1638 = fromsRGB(param_1); - fg_rgba.x = _1638.x; - fg_rgba.y = _1638.y; - fg_rgba.z = _1638.z; + float3 _1721 = fromsRGB(param_1); + fg_rgba.x = _1721.x; + fg_rgba.y = _1721.y; + fg_rgba.z = _1721.z; rgba[i] = fg_rgba; } return rgba; @@ -555,23 +555,23 @@ uint packsRGB(thread float4& rgba) } static inline __attribute__((always_inline)) -CmdEndClip CmdEndClip_read(thread const Alloc& a, thread const CmdEndClipRef& ref, device Memory& v_291) +CmdEndClip CmdEndClip_read(thread const Alloc& a, thread const CmdEndClipRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdEndClip s; s.blend = raw0; return s; } static inline __attribute__((always_inline)) -CmdEndClip Cmd_EndClip_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdEndClip Cmd_EndClip_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdEndClipRef param_1 = CmdEndClipRef{ ref.offset + 4u }; - return CmdEndClip_read(param, param_1, v_291); + return CmdEndClip_read(param, param_1, v_297); } static inline __attribute__((always_inline)) @@ -771,8 +771,8 @@ float3 set_lum(thread const float3& c, thread const float& l) { float3 param = c; float3 param_1 = c + float3(l - lum(param)); - float3 _1046 = clip_color(param_1); - return _1046; + float3 _1052 = clip_color(param_1); + return _1052; } static inline __attribute__((always_inline)) @@ -861,9 +861,9 @@ float3 mix_blend(thread const float3& cb, thread const float3& cs, thread const float3 param_20 = cb; float3 param_21 = cs; float param_22 = sat(param_20); - float3 _1337 = set_sat(param_21, param_22); + float3 _1343 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1337; + float3 param_24 = _1343; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -873,9 +873,9 @@ float3 mix_blend(thread const float3& cb, thread const float3& cs, thread const float3 param_26 = cs; float3 param_27 = cb; float param_28 = sat(param_26); - float3 _1351 = set_sat(param_27, param_28); + float3 _1357 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1351; + float3 param_30 = _1357; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -986,45 +986,84 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons } case 13u: { - return float4(fast::max(float4(0.0), ((float4(1.0) - (float4(cs, as) * as)) + float4(1.0)) - (float4(cb, ab) * ab)).xyz, fast::max(0.0, ((1.0 - as) + 1.0) - ab)); + float rev_as = 1.0 - as; + float rev_ab = 1.0 - ab; + return fast::max(float4(0.0), float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); } case 14u: { - return float4(fast::min(float4(1.0), (float4(cs, as) * as) + (float4(cb, ab) * ab)).xyz, fast::min(1.0, as + ab)); + return fast::min(float4(1.0), float4((cs * as) + (cb * ab), as + ab)); } default: { break; } } - return (float4(cs, as) * (as * fa)) + (float4(cb, ab) * (ab * fb)); + float as_fa = as * fa; + float ab_fb = ab * fb; + float3 co = (cs * as_fa) + (cb * ab_fb); + return float4(co, as_fa + ab_fb); } static inline __attribute__((always_inline)) -CmdJump CmdJump_read(thread const Alloc& a, thread const CmdJumpRef& ref, device Memory& v_291) +float4 mix_blend_compose(thread const float4& backdrop, thread const float4& src, thread const uint& mode) +{ + if (mode == 3u) + { + return (backdrop * (1.0 - src.w)) + src; + } + float inv_src_a = 1.0 / (src.w + 1.0000000036274937255387218471014e-15); + float3 cs = src.xyz * inv_src_a; + float inv_backdrop_a = 1.0 / (backdrop.w + 1.0000000036274937255387218471014e-15); + float3 cb = backdrop.xyz * inv_backdrop_a; + uint blend_mode = mode >> uint(8); + float3 param = cs; + float3 param_1 = cb; + uint param_2 = blend_mode; + float3 blended = mix_blend(param, param_1, param_2); + cs = mix(cs, blended, float3(backdrop.w)); + uint comp_mode = mode * 255u; + if (comp_mode == 3u) + { + float3 co = mix(backdrop.xyz, cs, float3(src.w)); + return float4(co, src.w + (backdrop.w * (1.0 - src.w))); + } + else + { + float3 param_3 = cb; + float3 param_4 = cs; + float param_5 = backdrop.w; + float param_6 = src.w; + uint param_7 = comp_mode; + return mix_compose(param_3, param_4, param_5, param_6, param_7); + } +} + +static inline __attribute__((always_inline)) +CmdJump CmdJump_read(thread const Alloc& a, thread const CmdJumpRef& ref, device Memory& v_297) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_291); + uint raw0 = read_mem(param, param_1, v_297); CmdJump s; s.new_ref = raw0; return s; } static inline __attribute__((always_inline)) -CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_291) +CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_297) { Alloc param = a; CmdJumpRef param_1 = CmdJumpRef{ ref.offset + 4u }; - return CmdJump_read(param, param_1, v_291); + return CmdJump_read(param, param_1, v_297); } -kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1666 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1749 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { - uint tile_ix = (gl_WorkGroupID.y * _1666.conf.width_in_tiles) + gl_WorkGroupID.x; + uint tile_ix = (gl_WorkGroupID.y * _1749.conf.width_in_tiles) + gl_WorkGroupID.x; Alloc param; - param.offset = _1666.conf.ptcl_alloc.offset; + param.offset = _1749.conf.ptcl_alloc.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); @@ -1037,7 +1076,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 rgba[i] = float4(0.0); } uint clip_depth = 0u; - bool mem_ok = v_291.mem_error == 0u; + bool mem_ok = v_297.mem_error == 0u; spvUnsafeArray df; TileSegRef tile_seg_ref; spvUnsafeArray area; @@ -1046,7 +1085,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_3 = cmd_alloc; CmdRef param_4 = cmd_ref; - uint tag = Cmd_tag(param_3, param_4, v_291).tag; + uint tag = Cmd_tag(param_3, param_4, v_297).tag; if (tag == 0u) { break; @@ -1057,7 +1096,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_5 = cmd_alloc; CmdRef param_6 = cmd_ref; - CmdStroke stroke = Cmd_Stroke_read(param_5, param_6, v_291); + CmdStroke stroke = Cmd_Stroke_read(param_5, param_6, v_297); for (uint k = 0u; k < 8u; k++) { df[k] = 1000000000.0; @@ -1070,7 +1109,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 bool param_9 = mem_ok; Alloc param_10 = new_alloc(param_7, param_8, param_9); TileSegRef param_11 = tile_seg_ref; - TileSeg seg = TileSeg_read(param_10, param_11, v_291); + TileSeg seg = TileSeg_read(param_10, param_11, v_297); float2 line_vec = seg.vector; for (uint k_1 = 0u; k_1 < 8u; k_1++) { @@ -1093,7 +1132,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_13 = cmd_alloc; CmdRef param_14 = cmd_ref; - CmdFill fill = Cmd_Fill_read(param_13, param_14, v_291); + CmdFill fill = Cmd_Fill_read(param_13, param_14, v_297); for (uint k_3 = 0u; k_3 < 8u; k_3++) { area[k_3] = float(fill.backdrop); @@ -1106,7 +1145,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 bool param_17 = mem_ok; Alloc param_18 = new_alloc(param_15, param_16, param_17); TileSegRef param_19 = tile_seg_ref; - TileSeg seg_1 = TileSeg_read(param_18, param_19, v_291); + TileSeg seg_1 = TileSeg_read(param_18, param_19, v_297); for (uint k_4 = 0u; k_4 < 8u; k_4++) { uint param_20 = k_4; @@ -1150,7 +1189,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_21 = cmd_alloc; CmdRef param_22 = cmd_ref; - CmdAlpha alpha = Cmd_Alpha_read(param_21, param_22, v_291); + CmdAlpha alpha = Cmd_Alpha_read(param_21, param_22, v_297); for (uint k_7 = 0u; k_7 < 8u; k_7++) { area[k_7] = alpha.alpha; @@ -1162,7 +1201,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_23 = cmd_alloc; CmdRef param_24 = cmd_ref; - CmdColor color = Cmd_Color_read(param_23, param_24, v_291); + CmdColor color = Cmd_Color_read(param_23, param_24, v_297); uint param_25 = color.rgba_color; float4 fg = unpacksRGB(param_25); for (uint k_8 = 0u; k_8 < 8u; k_8++) @@ -1177,7 +1216,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_26 = cmd_alloc; CmdRef param_27 = cmd_ref; - CmdLinGrad lin = Cmd_LinGrad_read(param_26, param_27, v_291); + CmdLinGrad lin = Cmd_LinGrad_read(param_26, param_27, v_297); float d_1 = ((lin.line_x * xy.x) + (lin.line_y * xy.y)) + lin.line_c; for (uint k_9 = 0u; k_9 < 8u; k_9++) { @@ -1187,10 +1226,10 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 int x = int(round(fast::clamp(my_d, 0.0, 1.0) * 511.0)); float4 fg_rgba = gradients.read(uint2(int2(x, int(lin.index)))); float3 param_29 = fg_rgba.xyz; - float3 _2238 = fromsRGB(param_29); - fg_rgba.x = _2238.x; - fg_rgba.y = _2238.y; - fg_rgba.z = _2238.z; + float3 _2321 = fromsRGB(param_29); + fg_rgba.x = _2321.x; + fg_rgba.y = _2321.y; + fg_rgba.z = _2321.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0 - fg_k_1.w)) + fg_k_1; } @@ -1201,7 +1240,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_30 = cmd_alloc; CmdRef param_31 = cmd_ref; - CmdRadGrad rad = Cmd_RadGrad_read(param_30, param_31, v_291); + CmdRadGrad rad = Cmd_RadGrad_read(param_30, param_31, v_297); for (uint k_10 = 0u; k_10 < 8u; k_10++) { uint param_32 = k_10; @@ -1213,10 +1252,10 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 int x_1 = int(round(fast::clamp(t_2, 0.0, 1.0) * 511.0)); float4 fg_rgba_1 = gradients.read(uint2(int2(x_1, int(rad.index)))); float3 param_33 = fg_rgba_1.xyz; - float3 _2348 = fromsRGB(param_33); - fg_rgba_1.x = _2348.x; - fg_rgba_1.y = _2348.y; - fg_rgba_1.z = _2348.z; + float3 _2431 = fromsRGB(param_33); + fg_rgba_1.x = _2431.x; + fg_rgba_1.y = _2431.y; + fg_rgba_1.z = _2431.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0 - fg_k_2.w)) + fg_k_2; } @@ -1227,7 +1266,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_34 = cmd_alloc; CmdRef param_35 = cmd_ref; - CmdImage fill_img = Cmd_Image_read(param_34, param_35, v_291); + CmdImage fill_img = Cmd_Image_read(param_34, param_35, v_297); uint2 param_36 = xy_uint; CmdImage param_37 = fill_img; spvUnsafeArray img; @@ -1246,8 +1285,8 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2454 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2454; + uint _2537 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2537; rgba[k_12] = float4(0.0); } clip_depth++; @@ -1258,7 +1297,7 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 { Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; - CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40, v_291); + CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40, v_297); uint blend_mode = end_clip.blend >> uint(8); uint comp_mode = end_clip.blend & 255u; clip_depth--; @@ -1268,31 +1307,19 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 uint param_41 = blend_stack[d_3][k_13]; float4 bg = unpacksRGB(param_41); float4 fg_1 = rgba[k_13] * area[k_13]; - float3 param_42 = bg.xyz; - float3 param_43 = fg_1.xyz; - uint param_44 = blend_mode; - float3 blend = mix_blend(param_42, param_43, param_44); - float4 _2521 = fg_1; - float _2525 = fg_1.w; - float3 _2532 = mix(_2521.xyz, blend, float3(float((_2525 * bg.w) > 0.0))); - fg_1.x = _2532.x; - fg_1.y = _2532.y; - fg_1.z = _2532.z; - float3 param_45 = bg.xyz; - float3 param_46 = fg_1.xyz; - float param_47 = bg.w; - float param_48 = fg_1.w; - uint param_49 = comp_mode; - rgba[k_13] = mix_compose(param_45, param_46, param_47, param_48, param_49); + float4 param_42 = bg; + float4 param_43 = fg_1; + uint param_44 = end_clip.blend; + rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_50 = cmd_alloc; - CmdRef param_51 = cmd_ref; - cmd_ref = CmdRef{ Cmd_Jump_read(param_50, param_51, v_291).new_ref }; + Alloc param_45 = cmd_alloc; + CmdRef param_46 = cmd_ref; + cmd_ref = CmdRef{ Cmd_Jump_read(param_45, param_46, v_297).new_ref }; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1300,8 +1327,8 @@ kernel void main0(device Memory& v_291 [[buffer(0)]], const device ConfigBuf& _1 } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_52 = i_1; - image.write(float4(rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_52)))); + uint param_47 = i_1; + image.write(float4(rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_47)))); } } diff --git a/piet-gpu/shader/gen/kernel4_gray.spv b/piet-gpu/shader/gen/kernel4_gray.spv index 4633401878da028ffb233d5fda00be249864c016..2dd46c0c42af01cab37314c1ccd977a619948efb 100644 GIT binary patch literal 66232 zcmbWg2Y_Bx^|gP)OhTvu>Am+Ry?00`0YYzLnDjszDfAXVItU5~C`fP8r6U~$rK2>Z z2q;|;L5j5h^Stj}lQZ`#e!u_Kle5;^`|N$%E$=&bhK}i$n7*odRWnw7tKDX-TF30w zbSPD2y(;xgRi73gFmUIAD^Hp{Y~?l9{JxH}RvlI?Tfb`hsyDckGPY~% zeCXuS2M*V-Z{at3+|V&ohLsMz@hJNscUYT_88dz;bsu_J53?FSV#K83lPi?ztA5zV z4L@jbmwwAmS#^E>KV;SQv2|86W1HsNSavq2Pn#-1ZR||Jm3sX<)PiM6VeA>ACRExtmA3JR4$rH!# zKYXX*BcQGMRri?Iws*A@yxSMthySU0OdicbPfYu^?*16nHD<)%gGLXVJj%Y!UM+{# z9fJm4!~WOFt!KO2jc&Cj-8_zO8S3`+hFp?&(guJK!Q z-KW~19e3d9aRVlH4QowztH0_VWq&t<(}&u(y}#5vMvogd{9tOws^)yRt`~^WyuP%w zL#An7wOSe%1ozcu@M$^z>qzUq(C=cbn-C*o-4vX$ZqbgtQ`fMbV^#Mk$GR1qe$>A0 z{;GLQ8*68!=2*veO>T`-?l=z~gTUd{R?Tq^Ws`(^U7ScKog3}F<#d3mH4g)+r{({z z^Du2p#XM|7jLgHf;PyQ9uC{N--g<1;$kwI8KB#$=bFd?vKD7L_>8Iu~Z4TO+b1<## zY}KytwEeHWPfv=z?@asjeHU>0zI!|Freh|I>SEPfeNyw7mcMtkC!G8(KW+A1&7;f4 z)LsMjp^o2w?PszU{oLDltymq^52&-(2DjsGId0hIV@6M~r|mwddz5{(J$u zL&gjrH;meI!<*bRzyI3XX}OF3df!cdjhlHL*^a% z_wat*jx}2~7GC@O*G|?6>mEAJj*44%cOS=q+i^Rq@$I;+$+UlRkFtLUz{$N!7oGQ9 zlY2}?u#LPIWyF}Sk&~!<^8_)4nl^*+`M=%7$lLCweY9=n(G$Jh$9~nJbu8}}|8?-) z5!>VT`k9zqBD-TARmW`K-2dOB+Rr13m`4^dkE>(0w)Fpd$kzHCQ^Y*BhSvvvFV zAI3bPhzMV0{(lg)J*TG@aZfAa{)V^L+#JspWX7B1U z@Gd+C_j#)3QJ$w)z-zzOc`5f8KXLR(Ke2eOs(G#+$OjIegQ9tVJ!J6kVI#R9 zM)UqUZur5id#=~@Yv6VK|NGFUb+*Sf=qlRhT)Z0GKEL}^H-RS&oj82>xMdFbAX4^`w|PV*A;)?dE=ZqVV}6m=A-46UPbD=b3Jw zj_O&k_lDlp4Aq}&fBH3e^tf@uC)QIoZLT}3=WRQ-{aM)0i7&Ldw?JZaRxh@AmzUsH zu9v92#`k82y(*?Z8F%{gGJ1Pl9n~w{{(Y;zfya(McyR09-MtjkKG(f&yLzv@A#UxJ z&gxCujUVQ1p1dcw)Yx-_{Q$%vVT(d{0!AmeT+6~;!v!e)xV6>-T&UzXYk46C+##~vuW%6 zZ!|vJ;NPeE5F|rZU0r{zg5G&O%L8tZ3kxy61$_?9h|&-gUh@> z?9r~X+PA@nwEesD4sX~;_TU}We(>a-3{KvI!DZgVdbI1Tj_AQVs-xkFb38b4P6n58 zPV3RGv-)v^pV{{B?*Ca0`#BAMZrgvg%=0fA_6r;QqPG9)@xQELzoG~4sIG=*Tz7&q zu6w}cxbE-KuCw)BVYxpZZu@tS>yd{4?;HHFwtx4yo^05kZt!Q@{@vqxu3>+n!Cz|o zuaS9prD1=q!C!CtuNnWpH|%dW_`7ZYwc`JehW(=k|G4eHcKrX{uz%j*U$*_%iT~FP z`?n457Z0r0y7BLXm+RA~!TYxTSM`MV{GYjDpS1_)8V1ikSqq$fvL3kHCmZ%?*I8}c z;G4GnyZ6Z!4SW9{yrbF*p1ga4lXo9*nRnkF?K-O=J$Oeo9G*C1z=<;fT*jHyqg`h; zr3de*4u&Vrk>JER23*GZQIB?=)d@X#M|Cp19j8xq2AI#EgS*BJ8$9i^X=im-k2amv zISqbUgJ03$*Ejf$4Sq+1-__s`Hu%F0{&<5w+2GGN_=^qx*9L#1!QX4}4;uW_2LG%F z@2LI*&-#1|F4w15N6+)4qrrQ_@$cTJeH-=}8+_)rfA{sQU&B6ogU`|SUp?pR+ztD@ z4L*O{zx#T&P{Y1RgD=+h@4lWb*|0C&gY#SfZ|}#>>cAeh&g$SEyrVh^?!&Y9^2fj< zYWy5{V0}G#zR~6-I3Mj=ZQcO;u(l}bzF~uJ(%_pnc>f09y}|ct@O>J5 z-v-~W!N)fEga)6~;Kw!i2@QU7gP+#m7dH6C4SrdJU)kU{HTW$JetU!8)q{6bzk?5{ z*XorXw$AFc27j}`|K8vqH~6Ow{zZd-)!^SX_;kH{?w!63K2wADYw+(i_}mRXUxP2w z;EOf*QVqULgRk4*8#MSv4ZcZ(Z{FZrH28o9-=@I_Hu&}pzGH*$)Zn`|_#O?uSA*}< z;QKcCkRF`xe&Hj!+SiCNVm6-Fhzr3JhaWgNpJ6W!ukDY*yCw~`Y0Lj{`H;ajhj&y@ z!-w*Pv7ci<1dkqf;9x$t4sQE*RG(_+;@A3ITHEtkS0`h9t4}K*tWW*j{NVN{Ui&zG zwBf_>=cnWF^13!-gU{T9_pauG`&qvZ*~+<4OEZ6GwPp|h&T8!jU$?XBue8})I;}5Fma0htTkn#SgzmH>KCvv)^zId}>mf*tpjJ^VVW8{i{G4sLymoj=SP+%rFEz9+$)RIO>-dqO(=2A%x014bkn|gvmq4#E|^ctG9aHV(S_=ZhQ=h zH3RzOiCyC+)rQ2Hv5qx($dK^|ciZ~5#yJzVVLVig9Y1dT=wXRCZGL9P-uiy9dpzwq zm?ip<(VVpH7fAZ>{)uxsYiyGy^BqyF)8@8c>^=I^jyoGR`_r?pZQJa%ZS=Si#n^kd za()jR3+3pUr?xgnOLG>@-PY!8X^v=Gf967K&s%npw)R-&#^%q%+k2t3xBD~?b~E@{ zA=b?MytR#;^}pEW!{#{uckSk{ZNs`Iccr1{)gPJL_P*Y1$_RWMlbXj+_Pe#$#pi0x zHZOzy-YfggbMbYw^1Oe$!QW}{_v#q!@7z1958($NGI+}9ag)i=xAh(q=jy=mL%YUo zJ?=oN$)m@Q^Nelx=i8Ql8~0*kx34Lk)ePWi*MQ#Dtnk)e8#a7G`@NRVsvlbGyET3Y z>DcCjGiTt=YJPAzjs+WhH8|f8@&b-+JFC?j_BDHO-pPRbvrhAD1|Bv-+^5HUQ2QSBQLl53j-3-qhJqphFf8WEevwFP2 zpJ?!>8~m9byrcRPJY#(sJob>mewEvr>sNdD@;yDAOU=ZL_Z_%DrFUKa0X~SABfN<^ z7vI3+H$4~9gPB47<`EY^k65(Dr~Uk4X?UJpmIJ#e##<3Qtj4Q=^ZYUtoOwE=8+TSG z>(l+dLuYjgyqxdTdhm|wjH2zO;PU=`Sr6aN>WUtm?-Ai6Mz+UyO~ZCQJo9^7%Wtr> zHKr%w?7h~!Jk_IJXZ1`E&N{&}{x`wxn7ym_!R_z#Tg%pp^+Aueoz*|#tgFpidB26{ zGiYyaX5}+QANa_LUBgDVZ{MwWv!a!AH*dR5_c&IC)1>9QTElmZ9=xMk8=m>t7+mhR zO&h+u!Tsrl>%TX6XpM(}v$w{9GnUEVX=CZE4u_ZhKE7?Q``x?xrQG)w{9#3FZaS-r z8f`A=!FfJ|w|}<5KImcVtgh<8JE~v7GuB^&>09@lJ<)CBJ_2s9ZSU$8aO>x1ynD(` zy)~!rpiLVGKVO1#-VJWwUEBNa^Bz8()t5bZ@9JxKJ8quac~atmrTN_52d&-bj%rqL z_T22?A@v@g6FjXy9o4+>?El4j*gC5v8hoh+U$wzk@4-8&4dJ8fwHYAxdAH`<6utx4 zBcHj59Abao<{|#F4O{q&0{ind4}Dq>s5SQIUmgRvUM&sgwhF3vU#A5&mI(hR0-sXgQww}rfln{+ zj|+T8fzK?kpB3Bv>1=&YEce>Y*xYOFy~wi$+-G?An%L)Qv7aS9#J3mtjso9VU_Wcd z|Dggu(v3S?pEqa1$!BlRoqVqJJn>L_w)SsooFYBWG5yMOENvZ^ZT(CY&GS;t&ppxn ztf)3;p_y9EIfx&RGA(VvLi3!~Z_z^I65G<2EHo}rEp6FCbNselvC!bLctd zSmn8%h+P|XpCdiQ{R%u=foCtU&zbR`ufPiyc%cF>R^TNHykvowD)7<;UZ%i4M<%b& zkikb3_{ahuRp8?bd_sXwF7PP@{&9iNEbvbX{L=!TRp7G=>~m@Qc};q0f$uEv zT?M|k!1ovUfdW5R;D-wQaDm?_u+OjQgU^w{^Ay-;$mk0cc;NysQsBi4yks}-tb9f+ z_om#vIUU7)C(qs#d(Bbb5$xeLU{|o$0Bv*7(zc7?<26J)7e3x67NvMB3iq_PsLzR) zr;fTqSC=nL1k>oV82_3>p0@hh#_P12w#B#~dX2VybTzN3#+jz|sk}egCYmwK>3p>N z%kwx`U2Se`-m4a+EKJ^|sP$7b$I{el#{V!V~9^;I|C zD%5Jmv#s&Gw z)7C|;&AdaX<+k0IqJ1QF+KvL-R!!UJ+GgARz;fH_r+qwi+D-u5R?U5LKy6FziEuUB z>ubz|sI!-%9gdd$8f_|C#vJWhpBU(SbTZsPY#w2WEJ zF<(ZVF<%aL%xdn}E2sz5#r0BmoL5q7GoNkTBiB;vnJsX2!;Q>z)rwzgRb`}e>e%dtYXowv3bZ;9Hr5Vm}`urRUwZa}+5 z-To{~ZQr%6Uvs}FP)n}mYp(x_H8w{2-yex9J}X8+7Bx1qig%hwg32yCveA*_S2DkhJw!s z_a10}X9Mf&IV@kI<^yVf$F%}l^2=9&C%=3kd^T#^?^3rPRP$jq_xhs!pqh8p{G^(D z9Y}xAL;H@6s{gV~l>NJ+wtH@F?c{OjFCWz6M{gW{K-<1a_)%@X@ruln=jzdLwG_{T zsc`q9uJJn-Vy=|v$Dx@sC3#LoBl@P{KW_0&Hch)T;A$!HJFDGpllYwtS4)ZC`E9?A z;`ej7T1xyLS3B>#jl!RRZ#d&T-ShJ#{Q3c}Z29owzg zGXB)b_c6937CK{Tx%;Cxo71_KyHDrgAFo5M?-pR!*ZEKT0cZ=Zyxscg-&Sz7l=y9n zw$mNkchB!YxLQj52BB>@;|bmCzav~NC4M`j9k|PL-SfK(TrDMjyQ5t{psRcS_JFIU z#BT`NTh}ku?Kc#zmJ+`)Xy>0dU-$Ztg{!5^$Ju)$+`Zn5QXZTt%wl^kZ^FkzU$2F7 zzpL_auI~ps*Itj^^N+zbGxaU|;}GMk+g|=et=ay`8dJ6I)qXG4#tXH+j}n(f`~RO( z#`r&BpB4Ph!tb~2+n=bN3pM*L_j?O9=h=Pu3Y`CU@59$5OrGuEsD15k#_snV&WG)F z{TKguo%24o2@~mhc%QTVrf}z0J?pv!c-j5OZJ+i#!u_1TB3I7=)ce764T{edXftC= zjDbgxo(Pj1Og#5tgOkHb0dN3l(RZ!{eG+Gn|+DLp*D-D`f9v=83ryce&< z{A6G2=l=Wx#e0r1?86^uXD#=+&vy$-{(8aH-)?Z2I6n+ zy943(WApuiaBJTm2xq!l?+%1p`|d!v{rCNWaQox?1K~cC`2Ik+{=PpDuD|aOgj@Um zK)8Ezvw~la-S-G$_a5u}1L4-bLr`+xAqaOozC#dhe|(1^-1xpj5bpf>4ner}z6ICr zI|QZOcL>6L_VpctaBJTq2zPvbzZmW_n(q>X+dtnW2zS1Gmmu8QcL~Cs58o#UxAvWa zlKW0UxbxvV1>xrNoq}-Z!*>e8t$n8;-0}NfLAbT=6@+W|y@HbaUO~xyx1i*{TTpV} zF9>%&eaE2Wi#E9L7?gJ3Gbp+58kF4k4Z^L5Hn{H{#O^bp?;eCZU%q<~?)v!dLAbT= z9)$aheQCjM@B0U_+urvN!u>qtcg5k>zJpM5-$4l1-|vvaeMa{^gmCluE<(8Zd>0|y z`So3daO*b&kF?=5(-2VApbNF>|zc&uo?)SpsKI8lTLAd?* z9fWZE?>h+L*1m%fZhw6bA>4Y?g43a#`j_0C+JDy7l?)BO4e&g@;{fdGc&-W5yxAwh+aP#{eak#bbCY0Rw6T-bu z`i?@l?frf?+|NM1pAc^UeK#T8{(o6;^{*S;4{-6f_ML>1`(8r0`Tb5g+}igO!nOO| za>;#1q2#`!5N_=|3gPzOcND_yzwao7Tlt$y0|^O;DSb71`U!D`0Om_C5352BxbxA+gRn(cii zl4lP83HF(|oWqad>hbvm+??l6(bO|<{|5Ukt)9963~VfIiS;?yeC3|_0s6yZ5#E94=p%^ZNj73xlUn+eTZ?=S9HUJZ$Ily;{b- zC|E7yUJR_}xIf2#39yI#*0#7div1Ql-i$*%ahC!c*BGl(dwj*GGj%z)nrdlk(p1Y( z`&nvP>Q3tAsM!kD^3-nM6{z`twIcsGmn%_o+o@KjcFtCz_UCcmr?y|l&3vu_&V2gW zM4tIv3!M2}6D)T=mm=2MU_X!AMw@fD8nwFE&oMcd)&-l_+WoLT^#&9V=V!y(Zk_qr z2yBd;OB;jLaxTf&qZrHB;0TAH@Tnj&22wyZ=Lr2!M4x2GytrY zb4i<;?K3v}VLqyAYyNRA%IozuaCNWOm*KN5Sk3-yMJ+epKx+GA?Obh7y#vKV`*yY6 zI{9`68>7s(3tZj!J5kHUyHf8+ajfo@-NBxB+Wc%N&;4l+ZTQ&UcG~sZlUkcG9LwHd z^K09STJAo%0^1M3*HGI=n?8f6)$PB}s6Pa&<$5y!|G{u|{r91ki}$6@zUl%ySJuwe zQ0ie659exlZMV+ajsP1Y`)VXuE&ED7gkmgXi)}lAn4`hoFQ(FO`TlUV{U{mB7_ei> zS`5H%EL{EAy4^UiZPgvqC~CFzaRS&rY8y{2UzfHWTnr8X_n~g-b-yN}si&Wlz{X5J zCxg}WOFp&u9|(4i!w&-6{w#7XN&gQ9>!Ti@L%?O5Lu;Nkhr#txKe3K;IM`U)W@h&p z`v|btIDgKr-S4aYUfO<6fonIX*SRCX&P(`FHFxek&yR+0Mp4(t_*22^>Gv_<^jrI} zaPyo_i~;cD!1}1C&5yv&N7nCnuzu<@(=+3o0CpUkQMAuoP2bW_taY!M_C>$+_aw0W zbzF{DuD^TNeeC|T&UjA-JN{gkP64asx};6b_Bl7)$L717{HN+mxtWd{^D?y4;Ogez zidt@auQ}$owmnsKI{)aCz3rO(7_R;+e7v5V0ao)I^`0mnNZFoZJZp2ENuBffC$-Jm z^Y|?4vnd|-<(%4Xow@iK*cdsF&jqXHJeL2IVl4BD)AoF@ZL(3>oTzY%09Uqtd@PEP0jY1d*>MIPL7G zTtD-yN^L)vp|+nsms}6dv&VH{xi+8WZUpDq;|8$Yd&%y8EqhCT3&mK*7N_l9VB0z;eqVAo*uG_N z`SXn5z}3goANRyPV709GyC;@O29V=@xO)2e0oZox#(alb%^2SI zKLi^y-z9iXeFRsJ&p*MoD}6qOs}HK@<6mIgsYm++oS&gb`&4`VoZ>Zn0QvrnmTS0i zY^R_7{Rg%7^yM?Kn)}FkvA>_g)#LL;?Nj#mOEmS{>96O)f55g=_jBae)E?eUVx=Fg1O zl4D-5S~=eN;Og<2zxFBnu>hKSo@EyV+Yg^*ZLdAHg$kQ~o*#MUSp=@#pNZQ)e}<)& z+>3#m{aYMOJw8j+K4t%wL{m>6mIB+qWhu7TZoWmSwdGt}2CSBL%Yrj5ZTbA+&(gG| z-SS|yv|9n3eA>KDn9rZNX-m76z>YcXRtBe?wzTtSbK27G`(X2huL{;De6^bYi1Wv5 z$m(!?)Z?=T*#3mCS@X163$BlP)@yCBv9!f+9k9>7+NRd|)&<)~ZHd1g*s&(o`e6Ok z?J8ld%mNw_upIfRK!_Og`fV~$c=B99cvVS%MH?O&yqp8Pd zi`u8$V_TxBXFUDEwo}jC3;>%?TVibmK9By`uk>kauzKci8?aidJ#*^yb6a@YIZnBL zK2PLYZk=%t#OAnj{oM|p>u-6!Z;!4mpI3JPy9b>+ZRz(Q@XN$2=U_)P_4w=rHplV= z$k=v9Q_no@0=Auc#=9$6-SaEgw%y?N!_WWP^VuhJyE~eF)i3$?06RyHJ^A+pt0&i9 zU^UyP-QM7|b8hAOIk!Hyd7re--2MQYbDQVtec)<&uGXez`#cN!+-5#MZ~qXR^K^4P zPnV$$MpHNcR@mgW_nF!J*0!gr_Qj@8p1)kHE;RLg-W~#0bFIDa%Y7F2Iox>G<{Dc2 zm}?kVo3+oaBdAAGJhYFh?bex#(O_fTNZ+Wc{rE>M&#m&|6k{1%oVNReZ5uwO=2@4q zaMwj$AFpNO!0Oqr4aMMo}`a^D{&8i8`u2Kfn0yb=y>g?b^0|CY(KN! zlfY_OZ*6Mj96H{t*JN-$|0d=XH1)(h5Uh3u{Ytxo;Av++<@%XtRs8JdveeoRL3gdS z9SYWF?K&P#eFVir`;oQXI{i5cY>ceq(O|W#qx>+6v5YNF+o@pNW`2(WJHP7oP44`g z+kV*II_-}I+dgw~99S*$t4*yOoBhZ<{Ro_SO3dTY)D!aru$u3rrQM0}w6mXb{mhg3 zU5;@W)9)ot#g^|SP65lc`Mt#HU}G8QG_c&yj=m@TWAJg*w$Y}~$<*rNGpMt6XM&v{ zYuE0l)MrsV?AO_~-8y4E2W*V2-Os>kSv&bpD8@3jIBm}b+cs-=9@xI++Oi~h&xfnW z=jU?f#kTfeu8;k*uja5$j$eSyk+rx0td{lFre^z$-@ay@E(B+t67!d6>WO&~Sj{n~ z-No>zFTVn- zWnR5zUkg{){~Bt!pVRweyAJH%YEajHHMN@fdg|<#8^F%Dwfp5J>YFJZj`P>G-8yr3 z3)mRhFSml#vR~vkQjBG6v2E?w?O^+oSa*PpmA!E%*u9~ykNf8?u)5!+8{=-Uanv2p zZPaRs`5Uk?!|$oNIs6&;z3>^xp{|cH?*pr+ANPZedkOm?{dfSbo@bEWTRnSgkxK9*3u${gmrho)asOz?fe1p2n7Q;wi9Po9D!{;G7fB zfaRVO{_e{k!KYK(Mw_{wq*l)wJqK2E%*J%DJP%io&kJC`+j76h=S4L2JPW=Aww-#~ z{TXcR<%@QIfvd;oWw5c!XWCcL)D!zvu zPTPNgZEHV1pqA(R!VkfHm_zk^U-%JNUH|u~tMb8~nfTomp-M_nJ+ zU@@?I`ms3JxR)@t^kWIQdhUZug1rx_r*BJvjioKImj)YaYP}!)`w{x7r%%g*?UQ|X zOmh9aZg~y!+GCwDEr-o99!*T=ae25}?t|LYY@h3**D&+Bw^ziL`&nYHgr=UDD}&Yi zU7EC81)O&FQ?6fmA6$_H#`He8I=0*geb-v9&HLb*;M@m&?^^DCa4T$UfqzPE8*S!V zm0Dfwd)c|}uLE{|tiA59N4-A9!+vd0+pRO!4Z+69b$=smlw9}a>r#wmY_V+z5OWi7 z`E#Sq;Ks6Fz7HQU)hr&Kf428Ku&vRIS>7kMfvdZ3ZNDwp80yJ85ZuhW9h!RbZVy(oc%9&M=+3(X znt99n#UQwP^6m&WhI-~>C$Rm|W?%f-+0J15lKYc=-UY7i`6%BNY+LorqgvK&cd-3Q z%ss%y%(I6v_JphFy_>zjwo^CeZq#bVaBhD9Hio|&Y#y&y`@q$c_lIEfh7YcJa_kG& zM?Lq^F0gU5nb+SVP)m-XVEYn2tmbJy9IlUgd`5tc<2>8XkzoDQa~~ZAb{!X~?P)t2 z-F&(B?FZIZJ#(=?*tzicqSI~+Ts`f^f^DnrxQ0-x#eY0lEzbfI!1l-QGqp9J1r9)K z`Lx=!-yND*x3Qh}JPS+$YcuaSYPorR7MKF=Q*)mM4g~At*rtac1a@rYv%tY{^*jq4 z0#?hjz@cE{sOMSWFtE9_*^kN8YWBnP`UtREo&}Bst64l8ljpW=4@c9UXMv-@J`1R4 zO^yZ|uY4Am3fI@eIQpoi%`srxl+Oak!fj)I+vuZ~HphW&Q$7p)2yUD7S0A;E^#rhO zBpIH_3Z1PfPEHFPv3qDHkP);J_~HDspL1;*sLMttV9B1`YdoUwmb`51eR;_S>RG|o&_!e%Y7Eu5!+?pbE$2k&0N2v zR=0fz>vAR7-$~GR1z4`l_E&@T*LD@P+}Qs9_ch>t)V9&4&*jwW;$KncIpbQeb7$>y z#`V-UP&^#-jkVp{-0ta{z{bdP#?4^0JZH$SqZrHB;!+SR{T6JW?7L%<>*qST zX3n*B#`HU|W6XYk1gw^GNSm7NvkzP|^O2@{6r6J*F@KMyo|u0CtCc^icnqF)_EWB3 zc@C{i0&P#AXD>bpb_~|;#iyyCp?KK#+1hTM{`?VajO@iffz`4XIrcV|j;KoA+18{4Tf`3Do`huG&$AMBVj#t*=bQC)xeWxd<$<{CQp)@lC_u-Lo%T z!?gbh?AoRMKjCU=uT3p``D1YQWMcdaO+7I_0jrfi7y1;Qc8*J~U%8i8A(t_|AAEr= z_k+*Da&6uZ{sT6aalQo0y=He|`wDykwQaQN^BJ{z#_$bTt$bel7Owtay`JBJ)%?3G z#`qenmKeS0WHZKeXzGvDF*?9%^VBgMm|Eto6YTsRQ~URZtCe%FW`2KnHRt#AVE2Kw z=l2ZMGg3U9&zWkwb#l!NHb&0xS-@&JzvX=?#xk}zZTo@C^LsXU&Tnlwzx{n$ZE5#C zuv+*WVEd5sV=l1ghkn}PH#bED^O zulo9X!}8etyOXxp=I;>8v(J_WH}}~xXzKbeMJ@NeT*tO7_!DY#7)!gce4bqn>|EG4 z+sgHK&$xeFck7H{d9Y*1dA$NyE&EfOn(ebE-9PF3ir}2{iMbM*dSb2&R&yVw-74_3 zv!8PP%4@~<8HX{EtJU}?*9w2fTCUA&#TwvTEBt+Hxz~!(*wzGJLTwvu-Um2UtF^$| zJbWkHIBUbz?T_)~>F+w=^f%*N7fn4r>w)c~*BoQW^(n{X&&TC+Q@a+{@;Pcg7qxBu zJ@H%%HUjHw?X_SN>P;ygw%x3@Tc>ZEiz&GlYynowwLrcx#aPA`+jdLpttbO(-oaS5 z2K#KC*xPEO*w1aK<@vsAAlUD_)LnnuZwEGpHa{!-J^A)v^~BskOv!s!gTU@%^-GAM zpXca~aBaDF?*vvW%TRnBgE_Q2N6weyv`)^Q#gy#RUBGJD``XlOpEYp4zTwKa4#mIE z18uz{Pu2RJ(6yNpy3KPE`=`dU)R@a)>%YTfKV}2xZ}#}#y|zvIH3!`G*;jMI^~t`H z>!ZK<=c?`B5?7qQ@pUhMYqfp&cVX?1f1_ZI8k^I(17Yl>Uq0KmQ&uz!H2-xx2 zM%z`)hx(#mZJ*O-acU3WY6P|@$m2PW?mPnv2(X@f&DJ7)nDrDiPeawfBAf~I+}X&uK_kr z_V=1_ebl|?*^jlr>h@8bKKlOGaukoHDe2=fHC}>xS&IEyo;qvoe=EIQ`wa{3-rJ<$ z`fb+WTNGUXtqQLHHU;q@^R_Wq z&3&Se^R_A2xv;%sl8YUW{_auFpUuIZL;7gb$2n0?zAeFJz5#Hxd~a^Pt>MY%oXCyk zeCVHi+k(xfk2ZarQ}yKAUQEfH?ErQjoiqLAEg#0}7>nC)T>h5W2;kVkL^wj_d@vI1$WQp!yKqrv;tJoB{&+@x?6JMTYT0A>{oD;dRoDcnzZxq;k`e@U~ zIaN=-{lWGjb2bL-JZ6u{^@;yjurcyo`Z%zf?Z;D3px8cpOsdu)B`?5WAbDEHXG1$WOJR&f1}DELv}qide=Pl21K+%pHF zsb|j|1XjzQu@7pQqeH-I*)xZN)yh3{INY(hCiYP-wtxC(4UYu7hWcpJ$1$oW-&C+# z#&8VSab*qV`snXGA6wg9198^C_nJ1Ncx+6`dA>=FH>BQ_;u>sDoi#X~808wATyWRm zw1VsR;|4#o;QF6caQ)9|@N)~U|1S!z|Ah^HQNi`Utl;`zQSht4SJyoAc>;V>{K`FX zBAR;k#7SVa>Fa5J8&H%e7^wFk|bFQ9z zKLMBdehOFXU;B8kIvbpP&bi!J&bR)__cO5h^wFk|Yo?xj=Yh+7KZmQGU;CKv0&w!V zW^!Y>Uiv5BFTv*1N1Hybxq9+l3@-Cs3Rk#TL0v`5^O$wwCUrX zQBS^Wz|L{@#IL~albmC6ed2#D*g49*_&Ttf?Y$RY54L@-lX891{sypPPWv0dYH5EH z*!Ig)?5|v(wEs2OF{J%1V70Wr6>R&PDYlpEV|%Xyw}G{LjS%M=u@$y~6pyVbxkhYL z<1MMTrFf0ljyl(fJBi`B7Jg5`JtyxkxPA{d_`?O)|B-_0|N91itl;`TS#bTIZt!Od zuK#ld*Z+kEf2rX5zfy4hUu*E!3$Fj)3$Fj$4gPMy_5Vk~_5Y~BKQ6fb|1P-xpEvlI z1=s)Ug6scngR`97>!*Kb!S(Oc;C&0O|I7u~f7XKg_a0}jdCsr9$nQS#{K}rb8?2sd z?r*?qIS1ThYVp4ptd?u;ePFfnn)?9Uz3VyP9+ZpSfBNSd@etT+gg)BzaSy8}-*3TX zzTd&s`qw^QlO6>ppL7z}bFR9g&uNT*lGG7N=&HtW+KIZEUPCl<;a$|Y@(m(m8 z2b)hHZThsXf#Bqu0bJ&r39jaUuOj(o0Vki=K)JEJ{^_55{lMnaN1HxgL)DY-d*FK* zZ?2JZz`bsIjnrSRPyFWud(Fr*z+7;(*yjd&j>kR^TrKu_!Jd<`&j(kFeSYvug?$0I zTE6pL5NuB4+E%-L_varAf$jSs+S_-z{)xRX*z+a17lEtAz9`uJ9s6Q%wL!!mK>WqQ zwoy0d64Xml%(;A>Q?6fPE(LZEC+5;{wb+*dyXRtG7Os|@%Ykj9o}9~r&3SX3Q?6fP zt_XHtCFV+CHQW1~xH8!GzPIQ+$@NM5?}ObZX}>C1E$vqW+unEmY%kZx_CCw44%Y5- zo;c5WJ7U|F;^BXvD$jX4*LVl&T_`^1?M9vFy0wVm{XKlWg8Lk>VZrs=xWP9qxc*xd zT>t(BpMg2us^*SY``U2()v^!lvs(Pu2dm||VFR#Q`P{G(+_`X0 z9g|$_c=XSCy$RU!S|4rtI4A1Kw;8z1w>ey`d~Vnho_x-U+*re80Y(9Oo>EoQL zC*Rg!`;a-?2JAfMIwIF6{@a3$@i24j_l(_y3* z-n+(oQ2&79p8g?q_VAv>DEIU}1$U3`TX6k`6nq$Xc+E54d%?|9?$N!`)U!u_09MN$ zwGV2U%O8T(vPTDl)yh5E1$S)j0sANy+duuYXNH2^Gx})L$1$oW-w3c;t}`RSYL3b4 z)F`my%pQ{KV|(X)bZvJ{#95OrY{MxYLnv93p*7x@dKkqu89|*j8AFV6O(qoFHJMa! z{iYQBAn?I8&zg*do2OipacJsUlks4+tciV4%N!j5R?C`91gn*6G8yjJoMZba7u!Gm zvnB_ET@!t@>EjsHlkX6)TE=iF*l}eIa4+$#3Clvf7@X0k#|Br&3r(A=h(bTgBQ^9Ik1N)$sIXM=r zmNhsItX8hU@o>lHoZ3gZ*#7CCH8>IM8t9`**GGTn`Lx>Z z8i=z72Vk2*@$kQmm^GMG;|bK0DXzhR)LDZwh>%q^J`baIKApeIh>`j9=UP|P zJo9%E+;-*sU5uulJ$DIM&CjX+{B{NWFNLdTJ}(E`7w5;EaWuSxVq~04px;>YjPn|}?aFcf3QaxZycVpM zaW0Pkb#V2J^9Hbeact(4i_NF6<8%x+f&DqQKH40oTE^);+?~92dibAYvBI?Ts`A_2y9;*n>poT^Xcn29m8+I>rv~Y&2g$_oPNiAI>qA@O2&C= zjUDG{6vz2v>WuSoVq}~fqCZ*ljPp^r?aFcf9!)*t`~z4m!%ctGbkD7nKgEtKcP6zv#2x9=ZTSVZi)V4%`?tt z;kGNs`A0PMjPp-mwTyEM{GWrXXPhs9?TceGr(A44eI2J`cnLg^S|4qWQ!V4%5!<;G zkFzNm=Q%ZYoIj&D&hw}<&c6~PKW&&V6}{Md;DL6t7n|A zgYAoBGpAf^K7AdhV|Wwn=U#oZIZm~V)90uQC?4liGR~jZ*m3@X;y5p)&N$yAM#i}> z`Uf@7INyTXt{msvXzCf~J7Bepb1?qz!qqd*_rdnXv6)jYHlMzZ(=q%5Je*n|ZH`kd zfpOo^_5=U|_0_0i@y)iTa2uw6s(xRR1_URC4EsjsFu&RCjwD_l9dC7rP$%yHAYO3HG^FA8q=$rs~Pp2VCZx9-;KJE$iWi11;Ay#1>tI*_xkv` zV_|smxhLhuazE;ye2aq3r;j#$+|%mGw>Y@Ww**}6%_84Y@Z@t(%Z=rJ)<5}{0h>=B zZTfgls3+g@VE0hIGg$$y7W;}|*F5%>z-swEd1bI|)ID#OAl52i&n3?rbISEg%dCn#*qr&kO|D;Jt_60k6LW2_n(h5=XdSTaa~{j} zN&9ud&Yho?F2jF4u$t|?{;m(U{mu25<@(s(>-Pq=-D|rz*Y<0%-9+)Yp5nFrI_et= zd?VOv`_0tGv(3iD&?kHoxPDXVkM>RB`l!ceGjQ2vbGU8%J%8J50oO;}-=kF95^OAO z_FbO7FNytjipMP!`|e!cTHxEj_WcfO`(c}{h@sCd(c*na3MS5Mp>z~)Qb9pP$&D8}8H+QYcocB1S`F^<@{`pVT4cQ>&84c{GZ9_PsM z>;bo(dj2Nvo?zQ)%iqJ?3(WRteU{W;A9Jdk)Bb&jhuAp~mvenLZ9U4lz7w8#zYA>J z-%zKo`w&N;%*hYoYMGOL!5+?uw!xGk6yu1?IZ;pCpyAF!(*97e?bDyb;A-|KK8J(tbFLdl z!1Ys)&ylsyZy489@G%s%qbXO{efUwWA4h#G#lO>G-;M{nb}Litr}6c5t+eHw(DxyV zN4X{sz_TU~f?bn`sj~(r5yLe}Ur&bH#=l!)%v0dzUxcD9ey7!bnVZw$YNt}NCTD`x z&!D8;Pr$~{eEk%zpL(v>=YZAErlj4^z-7C0;rgk^=e*h{^ZX0A+RrJO=L^8<&3V2M z&2c))`sS$LIRmC;h$w zZXETryAf<#ZSlJaY(KRn*3Dr1nKk@1T&+A;Zh@ z9yIk_r|$*Z|7Gj;+GD$~u$f=q#J(Tg?BfGy>hXE7_9^@L5Sn^?9R>J^lC{ z*gh^rvAy=#9w}_**VnantdD{ngFdc@yj+hz;NwxQ$M4~;$79sFUOh%TuUDRz;-@It zJ5Pgc6aEZbpR?*dJPX!G-9E_E2d{NcQam1~WKTQ+whvEH+Xwf=bF?e(W6u{{`%4Y} zM$OZ&7vRQq47Qc~d!EkIi(uzMUAwu|vPORf+qT?~e?e1^&&#z>xz?|ssmJHl+NWIW z*U;3no__^rt!=M8w$}@r`SrEGj$K>wya{gh_it$G@%el0Q}*{QH1+trUHg>%eFsfF zeR>z1^T+nuV|%Z#nO|S~>)L3`dHX)tG2Fp=_&ojrSZ!;{=lFj}?cuYWwtrC6+#}+| z`3UUVWzGKyb{=B?xVGoH=3j8Nlw2b}L9?y)wEYxp?A&ku4c1RRKA(Y;-+lEt+;Qc6 z`~s|xdiwAsSUtsOO3#b`pqWE^e7^!a#+0eG@7HMBY~%boW;K7;H}hnjetrXX4eqMv z`&+QuAd2(NG`9}tTibUOHRoHLIK9v^Ui&;9yqxcj+MfP*!qrkT-@Vant39#%fQ_BG zn;vfe)UyVC!M4?wb~At-TlkFdGR{nJebm#hnZfEQS%X>7%%MHLvw|IWO4gtsnl{^H z4b)tN%$>FUa;|0rJ6B#4#pN~ekLVsxQ*upwrp8|Do~5`Jf1=JcdM;v=*T)5Fo_uq_ zjgfho6Kl3~x+*mmm7K7`f?zyl8 zwTI_|w#6wcQ;aK4oF&2bBYY{iaWh{_!}U>*&oW^9==0i=)XT#4Q;*Mb;IhBV!^^lU z!1Ynj=g}3x#?t0|+b^}mTnTJmZN`?nPaUh{a(rp$H8_6a(ocVF_D5U!w**|*S1BIl zK7JXVHGBnZzSpR8pWl#}*~hN)CJnxMgZFRn-5Y$b2H&T__iga~8hmVnPiXK-4SrmM zpU~hZH~47{eqn=O+~Air_>~QQQ-j~q;I}vUT{X`=e-*fER6gr`A5A?ztJXf{v%_j= z>VAgs9=Cu-lFy|`@SWb zy8iBOdCt`VV9yh6?sfUP%&^zRt-xLz?UQ+It54c)EvBTe+ki7RA0+QYThwku^c#r)#L-UHmszbBfy{r6fTkN@7_j4%ED0h+r0UTfs>{~=ia zaxV`?Q`g^Xkvy@wz**~k!Sby25U^`)pUh)hebRO)SX*)r17~dJlIs)y;b7y$e*`#V z(_gMn{6~V#8UIn>j7@*JKCZR%?_4|Q@!ubu_=!0NP2KihcjfUP2TuRvKORk8f3M5( z_#XgHf8sw8OV-1Ix1)ehhXm*eCPYR-d#z1FS8%&je>|=923Z z|DS-36aSxrGdBI@`o#Y%usP#@HaKI`U#^d9?fg5}&UyTQ22Otx^ISCb_?%b!l=F2y zntImy=V05ZyVe&_d$`uxenGjBVt#RA{}SBHe-WCx{lAb}9{)?g8DIK)DVnqtH@_FS7GJ+WB{`o%8tL3{L#S{56`o?Qf!%$NyGv`XB$> z(A4$6g<2l}JHY8r{O?3l*Z+2Ed2DxsGuL;4<(cc>fSqgmWFFhQ^ED$wZZo&xc++;T>pI< zeBXlWKcwcK2ky0F`E2jL?t|?SxO>ujz>8pyud2mb`U`Ns3x1T^&nLg9rfKyDYW`n6 z#y^Cv9;Y_e6V&eGC#n6+_!RXF)K63UUehzwGf_WFJu~$msb``76ZNdr&r$cIexBNM z#QZt`hLgziC}WU&uG(jP?PGjj0(<_2{~2!E{2c8saDCJhPpypSSkwMhu<`Wu+?2=m zS8)2}c`DD(#9s&dGjZE!OD^>?m-Cr;e*-6;=eaz#x4`L#=e#_*-Uj_ zaotn7rvD3U-16Dr6Et<(d)<@A|KDKqmj0iisq61`QSKZriQng7-#;>rw#4}oY~J#7 z-+$25jpOxH9{;bw<}LldK~vY?>#aO_zXhAuINB1&lgqs2b6hVpb>n!QmdC#XY~Iqp z6HQ%zujBIM?F}}sakS-o-#%dH!hY#vTdy1H<=S|jC-)54nrky7n!4@1XUO9}Gq|}n zv!JQ#?>$AHzRn8veI?^)OPtxj&9#{wP2D)&i{$a21KeDjInmVh_g*DW-nqc$HIBB# znFriln|aaHjpIE|9{>5l&9zwoOC5NuxKXv^9x1a>a$mp-<2ZPd%P@!Fg7 zaZzmcRbTI|^4Jy!+b?b2XXW<6^M47j*A&}mOD^>?m)G~iTN+z(Ed`dxwk$Zgyl2ak zYdP>k#W%`=q~(Ro@8u8(@!tPZwKezvs+TKVh@VB>2`U)9RK zdLK>R^{|;&U!Q~I`MJ;f;772j$A3d`*2L!|xov$$(m(67G1%|__0g90n}U;X6R(s!T9NA_%JOioqPhYkJJ63(PrTq@zwBH^qPrgB5$Et439jT2Y-ica!;_nQ0tomrnSk=q1 z`aG1}yJ1W2UBU9?-W_ai_4w}z&fNI?C^yeu)cU6{dxPzZKHAb3^|CKMlO^^Ku_g9C zV0rp77;InE0yWcB9YD?htBL$$ ztVz_4X)?9X?o+6Jc0Z7MM(Ts8eRe;XdS>cFsC{-nl-g(a!>FAn^SV~{M{fR%!=Lwy zGmg^F{>85xuWd>{`yW4T&c%}CKN{V2%g<-0!nLa>r&<}yIY|3s!R~>yKMrnt_2g4a ztY*KQ$HY1wY^=1Cr=4Rf`{2CCFKg>~PDFP+X(un+xlYMWQUR_RIZ}ew_g>=RqFZncy<^PvFK@Pi(a^wtFz`&jOcYJ{xX( z^^8R={^x+p`IMKj-PiFw7hJ|Z4{mJr#8!*{`QUOaKd=4OGZwWnpXX0v89RRB($DiN zd435l^IQbiU)}azchus43Ah}`rEvY#_4m4@7XQn^#*q7bas}9HWS(KJgsbV7Hdld- zlQvg_y~d`^HE=ck^1Spbu(7ly&b8p=cK=@oH?D2u*Ms#@&wnrJ2C%U_qTN_)Ui+fm zRBK)b^LM&#Mzg*C+Kun$Uhf;f2HW1xrwn>o7=u8(@=;(oBPJfb~NYvr6h zSZn2+J%na^{k0oEbM`RU_DfN21?%gasXJ%h57O`7gUf#Z0lq&a@69|0)<@la`Y5$p z+CKr#{5kF?;oeiy{wc6N>b8HJS}pCL0UJ~9K7STmuGt^qYWk(kpTNdRo9DpgnmrF! z(=TiG0@zsE?8np8YKie8SS>kT0;gY&>(6j=WS_cGWx9?@Q@wQ@aQt+jGJ zUqiFK{@RW2nyHu1QJ=KKS07RP9Q7gfKMVYEjeUOj7sd7dlseBx9}-VnzVH6D;68hO zS#Y0!zAd=zI(R@S+fU!%eH(nng4=H92A`|o=3A)2*KF{$3vPecZSV~WZoZ9c?z#f2 zHyDreat+tAzSM8R)h=Oye0KXg*u$T_Y5N;R&3P0Xr$6?$z|Q-o#IYZ5!<~EMWDmWA zrk>}Rcfnrs)x9Pg=RL5ov?ccYU}L%0^!Wg;pSpWOZh!1o@_z(w=Km*}diLzUz-k{; z@;=)qVEd%a^TPe1mcINOY~1{JW9!|oM_JF$`tb$TVMNO zPVE`X++gSIIQBKLnwNjn^54YsTA&vH`M_#9SLX+-xmP?_7X*8Fu4-F=vIfO-Lu{P> z*cS$udtni{n#H5s3(o7J==MGHvlzU2ZY_?cp7~h->1F)1Gx% z3apmAOM{zvmqAmH&$8g=+AW8s9-rmG%{VKdsps0XBG~guJ@@XFz{b)xl{ND|xH8y2 zXv;lr6|jBxi1z(jbL`Ppt+n#Lw;G!5_1A8EuW{eQ=a=^g zdB(pUxH(7bqp7}x_n~q&)7Ewe?V=2 z?U%W1ub<=8?l|4c&EHA=jCLN6Q@q!EfBZK^|Iewthi^fmzqOKL9(1{Ep;4U^V@0>%6PwxyqbhQasAJ z{sQh?|A#try)W&`xgOr&qiUYMb-|63xgG{r8%l9(##4*`2(bS7J&BQUHRoG@^Qpyu zG+2MnPsgzzT+O*ljQzpt&U4me95`#DeJsWJ_Fr4#j|ZDGd;(Y>xpRF0*fC_TCxX@V zv#oQjmbvavAHSh^d_{3zJD*=uoa=9?ookqBa8ZeVpF|Jcr-C-kR22=16R zp=jHoJ_ip5YqQX0vb6oET4OekKE~~jb|_da&kl!y)hr(7FoyGGpS1g(tMh+2*uA8l z>&X#d<6S~Sb9fy+60V+W<56JSdPFzI1x<0P8ZAN7;iJMy#nN6nuZ=Nai7xcZDmyPv^r zcYNLMT)0}E{AAE>$OWo+LU@H@B*!REI1zioOE^~Dqq z?U&Sc>&)+^U}N0KJo#DgGO(I+=`*AJmlR_eTWnj`@CvYFPpqrp#TwM!xPW`(!=F#UmGu! M*nFOgV$a3@4`5AT`Tzg` literal 65312 zcmbWg1)yEk*{!|coP^-+4#A4ML$CyQiZ`4nffx}SO3(r=P^85RMT!@SYbg{hPJv>@ zp)FS2;eVdJ*EpGH-S2+A{Z~7gV~kg(F57!2>6miSsj6yzKKk5~ZrF zSEQb{>fPc4w%lRM<;G7KvfL`GuAt)#Rfko}He)qa)eGE78PzpnwEDrltLj|JOvJ0t zOzA@ro4~;D*mB^2ZMGS(4jnjh#OR>|hm06Ebnt`` z`w!KxPvJLW^x%;bhm;Pz@F@ErcUT*Y964q%b#HoE53?FGY}ojr6DpLcsu{739(usQ zF8!9AxZ>LUf6$6+W9zJ@!#3Hsvzi`0e#F7_#@J5gfiVvqHE_(n@@cBs;SKeWtjGM+T`k;MEkHfFKb_Tr@X6!uT`dCNXw;A$CX5@i@6hds z4uiJlSKVWBY_DoDc(*UOH~&-fm@tBc9+&vG?*7=jYvizj2aFgpVQ>33bF~y&cMbx& zhWwwCThDg48{KM6y6rf=C8*ou>!_9l+iWlXw=|fb{v$??Y>mWyqUJGq9G%s2@Y=66 z2DwLb4C;%RaJjM+l)HQIh8QOha3oX9?v9oEp?yYmZ2Jz|Zn&xlKb?<7O zcHS*Vj2jvPAb>nvK?YoBb9ILuVIo3_#^rQA|_gBqh z@>n}7HOD%tYeH+Ba>se#NCXbAwrY-ZFq*6>%>D*}VC8q;at$EmzdUE^!aULd* zshEe&$&q>30^FX5Ue(s^+?$Q+8s558*atO_at^kG(}$LyHvQB*CeJ}za}FlQ&Q$FL zPwao}eR@*#eFx&x_Z`9M`_ApW8;l&gcNeSP>XVwsPHwyCulL>b*Swk6;qBa;PaM_mtn;PjF}bgu)d)C!(62S8au4s< z?OZcequ{mAf9z!4VBJH<*->%p?(XAAa64~jHKv`nHJSEL?osw{KR9jg*hS|(*W?}( z5R8#eK^Zo(YxsETUOYieq$Xw{KL6WIjCR}Iw2#JS9zD_9eVnm6xX$JM;y(_)J7as? zUO$tQOJsM>pVm3sH~0VdtoHM;BIn^n&ZFy`tu6ikp0c$*M;1AcDsmoQ=WN}6{>z-l z6*+&_opYw@q&jDPq5m(kw&(QcMc!W&c~7hJ))&tII`1!wyr*{Oov}Kz&fB`A{TEqX zt6vp4f8CvPrs}*pXMIBd7g^hLa88l;-0r+HR==(DdJg_KN$u+eMa~PmbM~q(2Jgr- z5l1DJzz{%y8&RUPxotY z;a=6l)FUU3YIOkEvOh%Kw)d_c6LUvwKijt5+)s}dK2L*r8622APMAJVcKdWxPl3HR z^s1(=Ua0-)*T4~@M-LrWPub+T?yR0Qc2xUa*!RTe+T2?pIXbJqwRo48;8t7DQ+ti? z#SZ(snEqtk>Ca2(?QwNfFL(R*son&S8gbyj*1fxXDJH+yy=Gj!S6&yl_DW~)YviOhjwRbk85(ickoNTe~4T8I;wwyyXtoSC9d0f7d*M0Ue$;2 z31h}@KVZYj>+t~^?;x%5e+(WrZp^639_=~%2z|Ux9M03{)DuUK8h!x zpnu$NTi4tr_n)}Z+LPZrTN-Efvipx%Dd*i(_#em();9Zq2XpTqF={xxqnZ}p)ymsh z%?=*hHLlC&8GYyM!8@u2;rrLNg~3}59W`bgd3}$Qd$c}_s6X3?u1S69xN%m1^h!6Vq6_G5MMxUK_QpZmzyf|vbVr@_~2`>#m)R{Vwy`^G(ZM>PQ6 z-uoTZcHp$T6S!=5mmYDQ)ou;GN87)<-GL2zR}bD%4S}cK(crW@4qUc7u}55IbwCf^ zQ5_6Vo+H4?b2PZjb6k(O&g%FEKe6rK-T#vs_EQ@C)VBXhnde_M>}NLk*=_%o<9~j` zenAi3QC$SjxUL6hTsMQuaoyG<>5iBW?fg zaXsF!KiS|!7V4;%K6 z8vK*C{~GcCykY;c!M|?%uNnXE8+JcHD9`69;jHh9p75UUy&LvEJvi4ec=pK(;OvuC zz~w$!y+>SUwPu5_-S+R^C+jur{d(|@YD0M1-2t3-cLta3?$#r&v)ZEv@2CdClV=z> zdG-O9c}De!2Z}5E@d{l!U-r$oO{OAThuEEc2@N*jc{06_U!LMxaYa0Bz z2EU;P@2KvE531MdxgNI8>iGtLxxrs)@OK;hg9iV&!9Q#8uNwT@2A{H5&%M;E!KZHU z=^A{d2A{RT=Wg(M8+^eAU%0_nZt&F_e2oTQtHIZ8@bwyeg9hKY!TUG(rVYMDgKyd3 z+cfz04ZdT8@7&PK)9)Y$8s`@z1G^@S&&VBgE zfjf^Gx9@;)VY~yy@hohI@fy+J0&&Pg>w$Yf;!$u5mzfa0NMh_f1a_Fd`qbG0! z@O@I9$4B(BT@&^mKNNS=saiU>#j5p{EuV@Ev}3K9wvEerwf9gzE1GOfK2Fv4IO;FN zqqB6?AX4Rf^5}ML?1aH1V@UhF!Lv54Ud7bi=RVlFMvop7Lvl@xK4Dzf=<&57xu&Ue z4IDIR%z@puKCN+1i){!u^ig9*j~Ou}87I%rbl6*;IdzYxJqOcAA2eccqI&b22Iq8! z*v3!b^Nd(0&+Uw{_vlYM?@ZY2PtU%#Z8O)l5u=9{WAD{!a~5nYl%r>!+S;rw%~`bV zwl-T!b3~K-Gdo&)-m;6dwZ}3CHos$S?}gId?$eyuZNcZ-STpZ))i!q4|6!XOo8$bS z;^wJsL%Jq(CD8Ng2= zGaCHYb&mGuxSiEG@B4fCj2JW8Gq&BID_j0; zd=0pLP3f#|0#CjM^r~)$xAxkQp<~;>mEipwt@Sw&Uu-$H`{B$PxU+fyT#nN9Zb+T=ny3AN96=w3C<{R6n{%aokJ zCGTkP-VHug56&l;@YZ+xe1Mk;2kEduugeaEt15!WBw z#ZOKWw=3Mw|H5~Jm;K(O2j~3~o;jKb&iME5;n!Im)Zhm<_+brxcn{uDO@e2v$Ad>5 zG|-P7TXTJ44`1FF;aqCQWxQv={pQzoIU9TcU$}b{buO-e$L|L4fy|(Oe-;;?aX;GP zlRwjb8s2_B?5LgvyC~*+9z3MRFM*v{^_jRxXPy@C#(e$=p8OqpXSD{robR=I@Q!NT zB6eGFdH>$7hi_-KLl53j{TM!Mczb+1H*CAZGrxmdegmbgz8?Z-@3rRT&>nG})!{uj z>jcmEPXV`c_NvYVw?BVwEn6$sSv_JqtMlNjtKqG7uY~7)=?~!Ync{l*@Nr#3Mzn9= zt$eqmm2-DrJEnUae}@y&@_nV@`&tj)QN0Pze7pxP_uB^z-wtlHgX-tEKH$MMo)MhA zH7_`0Sr|NdES=R-@Uq`4x9xSmdsSP?{SMp@)?0JaS#8yb*`^2Q`3&Cv9G-p9!`4~t z)Pr|ayTCKny}6+29>KluhnyXVt3*@2F;k zkEqvvZn4kPHJ`8W9l+f99h8UI@18uwAGcu(e^lVl3+(qs9{T%TP#bqv3xT<%ab>Ld zjaBwxPkd13us@#{ z*mt4mUl;hB0{eaxpC1Z5r32wGXGej17kH`y_bKo+1)ib6GZ)zRuH>J!z_S(Dcd_`) zQQ$cXJXe9|E%1B=p1;5g7T9;YfpS>UA#ymWz=De$rdUar8)7ua{kw6$`9 zS1ItS1zx?tYZQ3R0Dp>c_7X-gKG z<2QDhLbI=Gem|3TeYaFwrOVqS}sy=6j;rE`{d1q1qmW=KQMdRcO8ostqYL_lerxEv>WrJxc)kM9UtphE}$LWL5sloRb*k{z}4;T2+ z0zX#ZCky;kf&W_IXA1m$fnO-_%LRU=z^@kg{Q`eb;C~nRqXK_g;4ivyXXW#2dEUr9 zZ>FSpPRMiKh`k=FFADbX`m_Yt>yx%wi8OX$e7wGiXUE6O)It=Gh2UO>Eb6o2 zYwGd^$Y3-2EX;pxL!MZDjqx6$rfp&F)!sjhkFMtR-aM1F-j(-GW1^YEHl2@le|ZK5 ztE3wPY-4e1HS-x~uBEAy%X_Q2)SQ!LsTZP5K{4NQ)cUHMZ+U7p z^BHSC@4Lz87pvw|)3#b|Gj?^b+*tjzdoNDxx?p3~7C`mSwrF!KDdt%puFX8gm}g_^ z|_A%6n9Sb&A&3&_9ZA;tZ;A+O}Yt93x zvzMYBikAHvZ4z3>9PL=N?4@WYqGex1I|VIk7wrtR?I>km&W2}h;`bZ0j9JYwUre1b zUjlZ_YVOxdsRz`>^-_17zoXV>d&am&uAyg)stEtVUZp<|`R=4PLJ+(f@>2pJk z)h!F-b6>3)BY%Y2oNeB#dZOU%n5n8~(A=xZliKUstA)QgY=2?SnYXF?Q`9VpY1=!i zPiwo}zJEzAHpYH^MctdC?tFY#bNiwFdup}BPdP;!tC_E(=C0$?aC3E{^`V{*-V1D7 zYR*+}YBlp1Ys|9PrvrN|#Yz}EOKmgX{IzX5TU}`#TL-U(Z$f{52m? z`#Y}1(9*tqDR|nK_lM6!ZT!}C{I)g!NzJ{EXy32qT{Sa3I|Htk62JS=&OYm` z^}-*3uRG10-ShJx{F(u;t(!a#!Hv;R+cL~}e@1d9i=45ij_r1A8GmZm_ak)I%lS0bSkm(F?AY62BSI-o9qBZoiq}YANxX8}00~=I&n4dEjc@g|l%_xO;aB zN_nvLnZ@?r{|P=G`g(1X`}voLb3F>|Tzh?W4<88E%+$B+2SLoQZoJ&zYp5B2NR6pl z_gFvcYUBA^pK*!HqW%9*DRcbau=n^QF#4I9eVat>T&UT1`H{8eJbT?a0nY!suNyy? zFnPwGT>IMJjNQ*p9J}$l{)Yc}-SWQmKG^l}zGeIeaOYM%>-rIR$$dv}o%rwJbK$cL zSHl6+a}tniN_=)en+{uY`~`mJ>c_4cevKEMBYxN@>+9zc9*O@Oe71u3=R&?h!H~EFAheCb{p59-ja1Mc)yfXYXtMD627l+4uUnf4@ZGly2p)kN)n++MGVm z`Fn|ypHy&le=8BYwZD}J9}D-l65&3ZoKtY`f&LaEcI#^j?s?~LB1-%11!u}yzlSL8 z_ZN2i|3Ja*kH3kCzt14A6kPvT3$Fj`1vl=kg1dJ=EchkZ{cS|@dr$qY;Oaj#_>_q8 zcRc3;lJ8z{{r%iJcAv=)DY)(V`-<3Y&)-*sJHP(EBHa3vg1esn&Z4yY8;fw` z{f$Mq?-c&VBHaG@`F8l#a6hXK*Y0Q0;Xc#*n~HGz@9!$Y?Z3aP2)Fik72)>R-&TZM z``e0e``f`uP;!4?QSuoJ?s)v2MeO$1&#=QCkDp_QYxi^N@DAertwp%w@pl&Cj%S;K zdwurv=GeWy`&)}}^X*h{b$@FSyY25)aCLug5xcd&xd`_@>hCVXjrTL()*^P>zq{b-_ZD2cpJ&J4`G35@{oO@r_jecJ*8c7y z+<1R?QSuK9?tbxi7qQDfE4aG9yNKQS@pl*D&X2#l2)Fik7bW+%7V-^vYVf)CP>RpG zK3}ZMGXtwW2UkC$ zj{6zdSoQUIs__{{E&eBh)zZ!{z-m6n+DD&ZPobobKJOaqGwm;H+jezZr`8(XZS~Q) zI1SC`BFAU@a{a_UAK9MRXCvEOlNn?ht6zZ^qBd4P?fUu5rOi1o|CwMl^Jh$F!PU2= zpMEBJHdxJgpSk3j!}GvClb3UNK3qLM7l51dd?A{8=Iys&pXJpv_ZNZ9r7gKG2HRe_ zCoX}j$LCV8?Ug>igR7^#%fPm$p7t&Wn@iia%#WX!T>-Wq+8n>nm}<_I_N%~ZW8nkf zSA*5`_4!jSzJ}U4`if`b--CTNw*H*B>!|-g@z8#KZMV*v+yFMmwe*Y2cy%LK&1dkh z$sxa%VlH!w6MHk*Sm(#<#w}ox1FQL&TE?bUj?I2( z^O@Rl+qUQHo$y7ejZOZ$(A2M}$M#3CnsMg11FUBLyQ%G;wR3k5^}Q4i?SHQA*5-Gv z?gN{{c@qDLVw`!z`gzVg2=-jC%?GIE+B^py2D|sQJwz>Ev+CXYT>dZMiTD_!E$8zi zU~L}8-49mFxE}?pW!#T})g1R1_&)*mu;1Dqr>NO)vE$7+)RXrquzAh#cWRGsc>7bA zb1SQ!rly(duhhP)Jwx3|{VX+Gp?Z#*|5tzGKVB!Er*iaGPgLf{{|cDes0|p!5>o8?c2xHA5m=Eei(0^ z_)oyb=Un;}td?_0o0{<%oBgmo*Wq)pb5UNezksWIy}lTqFTrZ|=QC=#`Mwg@wR80i z{9B5L_OENZb=tF0bCm5(VMi$D{{fp^?EB{TaL4Li>4baUY4hDvp8HcTu%9;=Z=81h zd?(dr4#(05Z2Q`LKb5;rF2y!A_zLRQdn{O=@9?`?<6mywdZ0rDX&H=uXeoms_ z^10w@ejb&v%nf!dS&ISq&4Z?XR2?@j*jRPPK5FxQUA`u<-pdvMdr?r& z{cJ(7diuE#*qrI-!eBN1(w@V;eElzpH7>7X>KvFKI-vV99+gMQS-zs3D-yc zXLX*Xz~<669lOumKLUG=^ZR-2e*W#}-1c)3xOUrQN~@*8&P(_*HFxek&zFUJo~!F) zet(~(o_;S6PQSIU0Joi!$T0xEB3K{w#H<8%KC*r*gY{FNj-Huk6|m#jkfMD$PCoTj zYu#(6ebF!dT@7r19hc*k>+jxmAG`moGv3v~jz8C>HNa}QE@@LUKIew}*!C`={WZbv z&8z6BIWIzMhh zZOhM@avrY_)@JQ_yaDxw6c78dQEj)*Tx<+BN6zC-z-l><<^3q;GPgLf1Hi^+9X17f zz0UQ=b=wS0eG=o6Zw^-TbLZsQ0$%3X67G7c>tozjV0HJ7d~2||)N>AO1I{_1J?B9B zw=G(KN~_<@o!l7b#(8pl*6G)FVEdJQvOQQW`$U_X@tJ$)DeJr=*!zC2VZdr9H1*{C zF<5N}O5%0~C(bpN>t{PY)7Vd+W$dTVCA(wGv&U{=xi+8W_5_>DJbQrU-c$TO_$T0l zsg2R5&#u(!;(^rJTYG_R*V?@`hcB>SO4Sdtx83TGo4Culo_OV>=F>v)fuZ#t&*&nX~a`Wv+ZGWtt-|^HFC?49!)pqN&cL2C~ z9XSw9-TeDg%f$y#m(MGQ!1KIvFj$`Fl|#WkuNZHfc5@s?tx^)VC=$9`;Wx6WD}2R29c*3ZCd*<13XDCRP^ z*w_K&JOS+UM{@lfZZ7+EBDFlv3BLe)QBlux!bxEDN$kx5m`?_qQ{5cLQ>(d7K9~Ix z?AWs}1`u;9Ts?g{4QyQQji-b4Q8(u))N1kn6<958{2FW2p3@ecO6Iegig6J=z7}d?z36LbQAr?=^e? z?fn)l*KqR~r=R^jn_7GNauHa~eU$!Q3|EiOCACl4-%HWdZ>GQAYkvnePTlv&%c(uQ z?`pe@qUJslXAQ0d+kV=*3f!E(tI^am=4-%emaO&f!RFHD=V-3QwcxC0+4t+vwI$yl zz-kts4+ju?J=mPuoVP2e)zZ%!!S=J9x0~SV@wpl7I+s4Tz}4e(E7;tn&uwt^+>>ty zyPn=}Y{MM-B*z`#W?$|^Q;*MG;AUU`h^8K&yTSIQoU1><)zg=I!0C%^m_wh;<-K70 ztDp0B1GQS(xDTvWj`x1JdVC(Jeae13h^C%r*@wXP!)ICJwa4~wVbjm^BhNgKz_tH{ zV*mb3t(LYQ12_BkIGTEVo~V7w{ymANo<2MUwtq`fjMr{^k5X&Px%OAETH>AoXI$Fy z{_!+eTjHJrt0nGl;IyaB>xAt+3)Ysn7r>4=aW8@sr!8^MgS92@Ww7mq{~fGP_$xI( zhV#d3-m7qZ)Z_CS*#3mSUh~Af0oO-8>-8qsT-xII7T9NBZIkNu-Ui!8ZOQ)**s&(p zKfwB_$LF75=Rf>k;4hbxg_UXssq;DUisb@T&fQ?hn+b`Lst+S2}a;NvOf9DEN~ zkIxTa+vr=&lQ$&w%+nNbsQ`8&x$Y|559#+m+8kF_*c;iJc2fV#|ac?E>0&w%%zH=bg-!VE~`)Qqi zEeN)sS?`6wYFTe>YULa{-mKTc;Jp7P=OSq8$+;+4Z3p_5xW4ej*-yECwv+efXX^JA zfA5iXTmtMEtX;>YsDDK9Fm~zMZk_%t12#w2aapih)=|DB#a!kVCw4iov6MpIADRlsWg<}Gon!V_md z<@%NL>vt;V^mBn-AGKy+HDM0%i77;r2zurey8B}x)wahEcR=dL0_1~FV?t6NFY`cL!r&ibQ@2S+pyHjVs>;ZPZt=%s_p&m%_aGZP9 zcI(Vt7uX!xFN45p*)Q@vDdsY_*jW2D1Z-cDYbe-U*&D;a?hSQ)+&{y?>VB4Pj=jO= zQFlCpsnwEm1lXM6`_$Yv{0@9y_)Scpx<2L{306-(MuE-ipY=#TM#I(fEHVb{bxA#a z8w)mhU=m>}Ol<_xK!xrk-cPW5LF$ zC+;|~x%(DzKZC2s=XkKW`xQPXps6SKiD2W@Co%W-@#kRM)RtVo0NY-k>GV4ZuAaD) z!N#gPACsun#HUc_oc<-){bKDoeH!)Y6c5+wjM{GPoG^syS73AGoc=Xf&9(RWPkt)J zT;>)h_H3}R_TwySc|I>Z2ke8CdOj~a7p$)Tnbh*E&G}%*m3jFM*m)_}_yV|kd@cl= zr(EOT!qu}57lDma&wO4CwmoghbqUz^`W9w6%RhN~Z1=f4H4wkgn54U~_3p?x(@#npE$Hzk>BsPoJIv+b8?(nB@9--8!Ax zYmart^eosh=AQK&SS|NKZED8(km%Z-G-=>($++t$~kn??T`MuGHaC6zO z52)q25BwYK38bF;z(-(p_k;O92Afme9Pd%9Wp8`}cI>$qxL-eot8c?_#Dlg<$dA{xVrn+_%FfcP*1yGft&4qji#P`2#%r(zniKpQrFgc@)n_`IKN|)iaN3S+`EG{YlPV zaC7F_!yLWQ)bqQWsldjmo3r)j2f*fVZl?yD!#``BF;0V~o_41N+iv)DHBTGU!}U?m zeRKw}d9>NCe@;OyZOjC=FX1!SJn^%@^-+({tYGsv&#uL6VExo{ADtcSIxbk-6FUdG z?d94xCs<$g%*9+_=fXc{ow&Kt)Dt%k*jRPP<)61ui~oFJwLA;V54Jyko~f<*EU*BY zKG)E0#;{-=W1RLp3oHcIX1o5m4!Q06EU*ap`g)Cg7FZOnk7Jt(-WTlH%4dPa(A4uR zusB#P&jL$;&7+=YfhEDVrOkf$=SkG;hv)T=z-oCG@b5!Xvv@crPX}X{LerjSfn~rx z3#eyJmIa%yd=^*^uCIrA^ifO9@?c~7(OB;5E5MDhePi@dOU#O3W6EcNmEgvtzxt?U zto}Vt#>iQMYE`h;(d1kW?z4cpKJMAo!Roo+t^qcWy8T+2S}i%(1e-H_t(x10&jM@1 zz3-~);~MyPN2#YD>w?W&J`4DFN~vdG`}a!uETEpg^#hwrTXJszHrFKDx2+Aq`l+W+ z8-eYUeRoW9{k)fXU-N!soiS~U%`xV_y$M_`&jQ-ijL*H&`Nbbwe3VLH@AQOd}r{~)W&GjXM1XO@h;SP&e#>~ z+*|vcu{-r16c5L|XKlB(ZMswa1Z<8xXAA_Zb<(EK8S>pI<}$Z9v0Y$evo8jL?VGwj z{mDNVte%)5;KX=;8VdIuQrE|GXc$;M`*b+iJnD{lFKV^q+#77p@DVjnzxIKAH=g@v&{nXQ^abWvo-yM@& zKiA1MbFQs3rtx6MnEgHhtd?^~o0{?22dW zzMX#fJrPxP4BUIc;uLL1Q|#lB)Y=kvB3Lc_=V1E~{)?Jt-A;nLZtD8@!r)a0vn)jb*r`4LzsoOFZ^Pi4pPIDNek7GH5TATM*x>WrN?7xqx?)Ss4 z`>(+#P#mXYGfqw4jPXpcW6l`Q0y{=^{pIi!6n#o zKe!ky*XI4;cVKgw=TflTYjzj5%fRPR8>3C1i>TEzhAY5o<@4H=aP@oY^}HIab``}O zms6`H$M3<-9M__$KTzlR16b`kiaD;KR?ECy4|aZ!to?6*tCe%FX6%jBIlpfLyAP~A zzi*+wmEz%i-d5YK)7I@^bL9NK1FV+wTYfXeT;>)h_AYRFe*Y1k^IKca?>oWT689&t zTKGL+`;hbF&tT6F{j|mJKCm{&eJ{1#^Q=GPyC3X#IO^K(rdCVrgWz@>?Ps`$;GR$F z`k3QkuzF(t0#1zgqetN07uEIYi}om3J@=l+z~)i69}iHgrHv=S_ASrqPl44e9?oB$ zeV;(np4h*F&6n6`z-ktcGWKaS?HS8+VE3whdX`%5Z+87W@NeKZscp|V?fN}Vtu5_8 z4=&q(0j_58Nc;Mm_eFGbcy2gVW)#LMbu=7*;yaHFxd+MuTH;<*& zYhZQX^)Ba}cWqvWtNVPQzAd`_dIL>citml;Z=yK{e{bm6?7zP0+go7!U%nT;4L8oi zInzfiG4Ftl=||$+PyPW$YK7gxP zJhE1{{~nt5#Qqy>``Kq7fz>R{*bmXPr|+MDo9p)}n!0U$Of8T9=V03^*ZT{&y8fS0 z%QMcez}M8aFRA5gR#Ugm-><>%(Lu*!zii8R{cO*7w{O6n_s*C3<;Hn^yp`H(oORm! z7VNy{9`+qrE!SdgYR2D0ZTv0Nw&%V6dvNY=$@v4CdUASWQ}ddexGB&QXFuiomG{M$ z8HYJFb@HFw7ybJL7uVO4_OqSeu7`{=hs_!`1DN z`Q+*EG~o0%vJwDTc?W6ZsbIA26$K-Eq!JHMULvJ~I0=2etA3-JOYN`dj~Y0u_HJ-Q@VWYHa-66yyCn z>@%L($)QbdJ!gaa@6fBK|8v02>3%X+p1GI{Y#Z9lBlp~PY;%JhpE24lqdoO`z}o!t z3iDBW__>1mycD%opQ#G9l=N|l8ZSz{B*lLHh&pS%GCAyj`053B@2ypE{nlyl^$M>4 zh6UGud9ETLY|?d0P{#=04HKd0QLo zTo~_|-+uI17_M8*BxttIE)7~av z+tWvzKF+Cn+S?RtA2Mf~ft^R^Onc}n)!3N>DadPRzRY-Q@~sqM(&UI^c*;O?1S3a;O74ZcUg^&ePp z{ksZ27(ArrnXm2P_N&}uJD{m&kL?In%O11OYMIj?gVnOfb_T1Jdu&&@bK#meCb`)0 z=$|#;9qgLxqfH;@L_O{82`=0F30$q*V|&5Vo^v8Mm-C^2+8YG6J$fgd*WyCezfBnJ7;pS^QC|G#0g;cgg)Bzan9A#-p|2hd%u9I z^{ainSDh@c+jGw4=5oIEPkX-v+nzq!^l{D9)81*|vb{6lYNyvew)bmr+H=k1=5oFC zPkU#9ZBHL<`ncxmY403x+1`0@wR3A9+xrbT?YZW1b6r5Kf7-hcY)5krdp7t&V zJIC1*mw??TImhJs#Q##TbCi4W@4#xtdoR8WY<#Yha(xniIoL5L{tB>K;;#f7-;#Qz>_{8bd=<@y-!b>LdCcCQiQTq8Ecwk5@5GfJ)zo7Z>~>MbZ< zBetT>HR5`5c&>%tTyW3H+X}AV9Swe0!S(-B!S%nl!S5@${tp&h|A!m=k%H_0c)|65 zvcaD&xc<)-T>s}A{KbOn|4PC2f33maD7gOb6kPv*Hu$>**Z;$U>;F-Me^PM$KQFlc zUpDyH1=s)kg6q$6_gLR43$B0fg6rR>;QrmI)7Cua*A3)%A9;RdPu~bu&o%cZuv*Rm z_n2DzZvm_2ntLl)t-R*m4tMW*4!8&9V)vi^xklUx_8Os&HhtW~>S^zf;Ih5D;cESA zAFoOGfYY9PSZ*%&ul{N8&tTirN1HyL1L|q-esI~|18}wSn)?tu?RgH!&E@{rKkfYm zY)5mj2J?%XTF57zyu2x=ipMa-5&mpm+k!>uJ&^6V|%ZH)1K$B++3c& z`lr3u!M3N5HhsJXsHeR*!DV}I!`0rZeQfU^;I!v8KyEJ2fBn`vRQy zJ_pOq^(D3bY40nr?dhXUpHHaO)804Wvc2!%YTwpAw)X=#?RgE8o6GB${%LOtxb5kq zO`os9>S?b7T(;K>uI9h>qL1xO1x|adYarZQUjOt@dsBmLPakdicnwugd((k$rVqJB zP7n9G=`~V+xjylq0ely>JOj)KSBrfnu;+N}GsD$lp9SnW8T+howb*9^KV8^ohpXi? z-#NgxXYH4#(urcasvoF{-ud3UW>zAC1 zgWXrjxddFzc%KuO1RL*fbe$);K8gPk*nN`trNL^6Uj}TvziTyKu8;9P%PkAm?sJ|v z&w1Nn+lk__Jtfb1JJfg^>K!RQ=lz&E&vh%1!~1*qDh2mBVD*CQw`PN{U2y%^E4cps z3f{rIZCG>1t9?bd{qmg19Ib?=p67;@!D`tD_E|0dtAf??+^`y0ZT>o^=k*$J=fXL4 zOmeZ~(Ld+)T42v>eYEN0oT#V0b--nN>%!Ig745ALPkYXZ++5Cw{%LOmue3n z^zJp@g?bN)d-^BT*~2@KqukRw7u-F%Tfz0)qu@UQ53G6Sdq=qKlzVh1H1+J!AA{Ah zN9}`J=5iOXTK4F!V6}3O?hbcs?g9HK7u!GmvuE}MyJz&#rjKJ(PkVcT)pDKb0;@SD zuTz7-jx&2mu8;A~`{3H{nuxO|UD$?FJO)v+CWC9d7xfT|Ych;FYch-+<(lkMaMxs1 z!Sx$c@cqE!YMwP24!50hP4-4p&zg(?t7T2>gIeZjU$9!%WF%OvT$9mo$L1W{N4ePk z>7O+j3wBNP(WZ}MR8M>3!D<=91hC`E8p!q0-+7)`+g$^3*1+%IM^QZXp=1sAt?}N} zBPp)IXzHxNf#fLH;Lw7*20tyhev=A*6!_?xr~e1RZKqs=gVEHp28V#vvIh1+Epu`h zSS@RCI9RP*gCpRM%{jG?aKWlI#*fr2cn?8R?8TU1v{>+fm|Q`o#*3f zyK5lM8tjK{BE@4IC2KIg#$%}`P+Wuksj~(rkRxm0oS#&1^;2q|{+$RnPdUdwM^n!n z{{pP$9NTa2cPGQ`i*sNba1`5Ul(aei!5F19^=olnPbA=vNU^wH)x z)iO@MxAX5__we77%{ULMvEw|P;y90>&Nwe4N5;7*`V}?LI4_19SB~=%H1&-0Qm|Ua zxd{HhgR5tpmxJw#W3x@U*!J{woQ~m2u-{|rqs?)uWt`qaj;44_qGX&$*4S|#MRAoN>!Zzas%4zpVLOxJ zaRw#h{8fz|=dUS_^DOF&^96EboW4`ORP&7US-5fKIG;mP&p7`ER?9fI#{YS^ddB%8 z*uFS6+mwrKPhZFB7+wbZ-m8x`$ElWa`W$s0#p7&B#(7SS9p||e$9X<=#`z{WGS0ow z->!Ma`6}GFa-6TBsb`$8gVi$5f%v}xSI;=#0^1kIW}9-c?dj_{9m6}|q15_lbDU}! zr_UdPsP^Ga&R z>G(b+N5*OWWx;2Le^YSn-!=FT1=oMdj-L5C8@zYH^`E-n=AX8~r!TnvGZkF_SsHw{ zg6ltL!S$cJ!RIZw{tFab|Ah*^2zb$&XCHjV_?_2sAAF9co@c%!H8<#9ZHleQwo9n?A0odfG$k(cTnrweoYC4tUyg zP37itJ@rp}y}-7ok2ZbW6Y6PiDsVZzK5(_ur4ldi91Fq(IuaEB? zbHUS|ds1#L_oM!4ZyvDi>7z{__q2N2n-5&JH$PnM<)Xa>;c3r3EjQOf)cU8rg~7I` zk2ZZgC)CqkU$A>9pP4KMSBrgduxlRs5^%MAp1dU3700jnAB^><4aIBw)zrT) z@U>vC?SG&)pD}BaL!a=q;QCFXKib!Z>!Ti@b--oJx^QFsvqHwK2iHg4KQpYhKGcdY9B+AKO&7P5bu)9%AP}T+a3F#Cnu-eJeckejC`> zJE+swoynt5=42PRTIOUou!nP^ZCA=36!VD7IZ;pEJ;An@ygz}fWexWNdze?-K*}JB zdBx=#sweMYu>H;44uRWO_4o`0+ji!97+gQ~%=K_^IoJ9m=iXp*>SI6T_RBtJ{+*X{ z{yi7|NbxAo(>vkLzvt{-6!Y9o?K7C#Sn~L+5k9Wwj>ViK;l}xABITptYWq_1XYfXY z?QcrX%`s^DYfrxY!1l@Ou5HW3wyVGQ2HP1A_PV2ww!}{W8=wA6gsa(~`0Nk1&$(_K z0M}1FJ_pu5cQCF)z=u-Q4yO2L4(-EFYyEKQ!zlT)g-3v0yX7eM)BO6nR@!n-nB!iG zN4X|{f@e+c0lOxDrp_81MGn^_eLWg(jDNq4Igf$c{(=;3@jI^e%iR17u68UXYjPr3 z{RB$lehxN&=Ia-5{nT^4J_W3PG9_`p1ebBA!u3;+&uO(!=J{7}wKFK0=U;=>oAZ1o zn&Why9kcoMb-y@A+SATiVEYn&Hr%<*T$}?}bDv}`&IPO6ZsN|2AHc#6B9b7;4_*_=|q~Djr z&7+>UE5OETi{F)C`>8Ftt^(W7tl`ygwenoK2Ci-!<+<{E_!PvthR%uk_4QoQmUG4X z?gJE$`zSd-?gx8*JV@=cjQ8(95T~AZ6l1SPQ;*LLwNF19cO3fMh^8K&n`)oD3+Qt* zntHC&w}9>cl6AcH*lsOswy$q;-v(~>@pd%z_}o$ZlzqGtO+7w$)jnk(|A?lZe%uYV zkBd=^*B;xS3Y+cg>smY3d%%uCAJ;=(uE)dpc$Dk$5Zv|n3w5qn_Yvpy%JWkE5G8x( zVL7(&zrgi5z3#&!V13l>gFJokTK5>m;}J^s#G_#Q@Hn-7a8Eo=TzMaRqTt$}Zt$0C zo_;+EH?LzbR_>qkbe^69I~VHOZA&d{^jEO4<$inyO+7x();{H0KZm9spTE^U{|{;ppXIc@Ls4^&h?D1^ zVAn2d{x7ie5c|8eJLa-0%K7*) zSReKD;S;cWiqDju7oVcphW7Y=26l`olWO13(X<)k{5obe|EzE3$vXY~0_+;(?_>B9 zthTu|@n2JWIN#d7qNq9F;^g@ToblS{Z{g*9e^=Yn|L@^yDVgsd(2Uid+%(^wEJ^ktpR!_+qOoe6}+T+^??6_0122-PJGbU@G z<{D(~tnHU`H4QfB%4?#yye2-4?(qaA*Tg4l?6vMGifi##>Rh8|Bu9CDoW160Z+f^n zGA}d0%@g}fwcWm(OP=fF%wVsN>Y2w`z~<1FxtSHLo|3tl4bAqoo8P{vncumX1MGc3 z-T9DbKBh!}f#UHD#rbd!o-Ocm1^!!sp9ecnFH&dRbCX-2@Oj|o%DFHvTpxAMh54yH zJQuXhM_H0$UUBj)0Jb0D3&PEt`C16Bk9vF-2HQuU*ZNW~0@qJHK8u3O{`Q5Jc^8B0 zqn`KC#lhy%=6u^Pwd7m^Y`fabEq9+fR>$S|66ZBIe&W(ke{J?hTlsehxUPSvc$EA2 zC3x2GWw7nNLY@2k>g3EmcAeL1@O2x!UxRPg;5#<>&JDg>gAZx&;SIh|gO6(P!y9~3 zgCE`C$2Itw4Sr68pWomYHu#kdeocd4*WfqQJoo&i;I2{mtn(u@_4q7Z`;^ZP%b=h5*-r#${^gPZ+b2Tfgn_pdzu>w)zz`@X)u7X01c z@|>$1fIUyNx!2`uGQ(aMHw1fav`@BUtUig|2&^q_Zw$`Z%qQ0;{+oc!6aW6;j7@*J zKJgzQro?|!aK@&;TpzC)&cAc*oX3B2aQc&+TcD}OXUp2BoUg6W)U(!GgN;*nt+%E2 zaILj%Lm5o5eQ|Pc4{o-<1Dd-1_gW&4|4!hHFa7;7n!5g8Yvl3Y1+0I$mv==|*WYWA zJh^rUXRW<1$+OmbfL&|*WIM*{lh{4M+S2wzt?4X{PzW?Kk*-l zrmp`!)biLygEQBo!1B!X7_f6~pKQlieG)qstSxQt2hP}RORi7+$AQfg|MB3AO@FyQ z@t**;&G=6QXKeb*^(p7tIWNyM&o{Z(UDslN>f}2Boc7b^foSUSIjHt2&%1-s)N|e) z0ya+F^X@Qe56?Sohf+?V*uFTqe+tfc(*6->>W=SlYI*#R1ULJ86q>sJlc?qKKL)IS z+4p17)b&4_TAsFl2F_kM4lK`JI3Da?uuryQtUif70jw=;p9s#_Y)h_B{C^HMPyBxY z&e-&q>l6Qzz_uCxlffCA{&Ia>Yvpf~(_gNSYwi3y*UowTuL383a$b$5Zv2(h^7#KAoc_oES~PY2uc4O5 z{}15wC;r!?sq23owLG>P!I|qD!1B!XOQ3*z}j{6aU-6wi*9Bz!{tVa(&9VcFxQ5%=1mYJhf|KZGPWgYEV%yLH2C%f*MG-?>%Vh@?^baA_o%t& zfqU&R-tFDjy|MiX?w<4>@D$kNn`+^f{v_Pbg72aB{p4P1LaRSh^Z)8T{zK~Oerj_) zK!Y50YGpphn)ttg&8M&DraZP6!0DIgsXX6_ zzXFHlvub^X0A%ALc$_;f&HJp}K6w7m5B8d3jJC9;Ubf}+J^2>GmbSc4%VS#voVL7Y%hT4P;CpGy z7;R}wy==>SNb)U)&9=f9hnwHe=-hN_+CJ4}Kb7eYEN0zE&^C>a#-H-Vj^*?lYM@ZEpm2tm^UK1f0HZ43^tY ze`@{HmjPhMs*kqBZw5~MreJy6+Z^mz)y=sDwRyx_Qfp8Ct-y{|A8i?{dO22~htl@8 z*wXekV0qf!4s6@%@!tWQx$*f?ZaX_t>z}^t1hy~wXiHzz%f9$bmfX8wOYWV)^7Lg_ zuzgXF|L)-QeK)Y&cJ`pwKYiH~Y+v-zmcFQ$eeszuxd&l$pZH!T&U;yZ^1Mg!c$<>< zvUdvnj~ZW3{m%mbtHwUdzDx1>@_p)jr!|yzw1p3=x&76a@7UDE_SNU(;c)Z$tbG93 z;~RbzsJ=gC3i#gCQ&Nwh_E~!$YKB+sOU?hQk^IM8qp0n}XlkFe$58vMJ(hYJ>iwvF z)*eSa9rbu>pS34Y`>Z{Y+Hu*gb8CO(wx4nM{k%BiDE;hT{L1kfQ~KHe_-S)4`qKWv z=+1M#Pdx;#T|I58mARaQ#2*HB%@Th&+<5i0rh};9AG8?89;B<(&QuZeI1|QY-uAeo4Ph z0GIP1kL^TonfvE(bE_w}TAABDnD~>x<(N-~8?T|6**$=##Ns0(MO@_DkVjdt?7yZO@o4gX`lF?ebbH$9_evm1DmW&3OH_n>%B_ z3as7!WPDeH?Xx!DbsfVsVB7JX^h~fm`8Qa857ut+(9iZWmTS?={d67Nc~y6gygvK^ z96fQ@qm}#i2DpCe`OV#p;PlILU7yU)OBAr4`jq{;yVlBn{i)WkZ+`}t z`|Lh=xzFye?djVCaDB?YJy>gH-yW*9vTqNg8Lz)~bEj{A0c*EEIWHao+h=XrXODty zXEDm{V12UB9s_H)c<5K|v&Yf14(_QZ;Ep|e>`Ayj>e)X}fzzIQQlHGl(_q{5i1yc7 zE9c^wS}W(`Sv2GI*KRxRA9eSS&l6dr7rE|nOeLSMQT5DzBU#qpU@2{g7ufKM4XC2=FYqwA7|C`|KG5h-#d>AGDe;cfidiwtk zxZH>TfSV(I{ik+{N3?&{TG{`1Ypv}6duYb%uif0~|NCI=_9^@D1F+-L<{HWKoa|hG z*y=^k-)w(?<~shH+UMMli20b}GiScH_@cqTt$F6)6S#TqVx13R?|lwe`;6lK(|l_2 z{~D~n^J>4ofqz9&*WdQk;{O9!fA_lnQ}%A}^?AVBrhq3`2l#t5eY_9o-y5vni(-EJ zua^8%fo(Iq4_qI)CpXV*mgJQVZWe{IP>AJ{g-=LhQ}cdi!zJBG~lf?zfMjCHQnGS~fS z?{kXBrxfSf`TUIHTz^6BTz^Tu2yx|HFJ5!o23CvmALINCsXujJxMS)^(Y8(fZ=fv( z)@Gs0w9@vYYK_@;^f7OLv?ai5x&AK+R@eMe?@WLo#U@5 z&il92xqhsKv-6($SQ)Ng=3^DOn#H4>4`a1wK2`;L9aGPItOhn;IUlQ|sb}nKfQ|Kt zwq~uB^RZT~mGiMSn(_K;H@9nLo7yt2b-?X$wg0WWb>V83=00(cAy@11AKPD@qQCR3 zmU;dTz2!jlJth152e9)z1;N?B8xW^{Jo^M#ZODJr{GQz}8Ex@*I?Z0QY74_B>5AEC3cI(XV zwqSEy%RKeLZ#%G>bLsDCEqaq711{Hp1{C-q*Gfi>5^3#`u| z;`_q~f%Q>0-uYKEzCZRMV6~jvL&0hm54y(8v}0W>?K!uHfxXtL=iD9+HlOR3^LB5z zz8>~LAGO4c02|Y}*6Tr6TxhVEr{Qm%} CD&wO7 diff --git a/piet-gpu/shader/gen/path_coarse.dxil b/piet-gpu/shader/gen/path_coarse.dxil index 9fd593ca43dc26f919b022903612dc81fad0890b..b6c9398fd96324a92f6916a55a37f0d0c4376553 100644 GIT binary patch delta 2074 zcmZ8heNYo;8sANJHwjtdhVZeW2+ITlXb1~bg5bp@AfQ$*SafKMHzDFcTh8OIIAtnr zKKL+rp?oYjpdevRJv#j`Kxv!S(Ja9;wzNdBOu6e-P_%cgy#}t_a5vn|?UKZsx&3F~ z_xZiQ-}Ah`=h^L74XUJt6}kf8{~nOp4~|KH%iBG<{Mt~;p`4|~<)*^k-1!}a75krA zk^q1KfPoDN0N6di9LE@jmx=2N+}|Xk0Py3)pLv}eP)H4NW1`~Djwr%L%%ia&F{Vi! z1RcLZ0D$TXJ91RgGO|b#f=um3Do4^nFLq(V0<@q2c#2bF#gKVuRYk*Wx=61F$CHUw@Ln+g8ZJ>1gSLvD769j-4f)R0B);Vb)1TPOS( zcJZZek6piq(-~`7XFJ4?-yXeSAd8#}FQqdYiLMVfwgmajG!F8u1S;C11%f43n!l6r zQiccstHIFDkv{Xr60eaob^!z*SxD{GuJasSJQ;#8ux8XsHHqSjRKP5_dhkxp9gQ)uAdJEHnIcANnCR_%iDsvCB)S@#WwVu)zm z4^ObMQ{GT4M>I(wmUK2v+Le&_09VOiNu{AZe=N4aZb#IBX&^o#D0 zI9Ame630L)Awrtn{UjjC>~vcXs6FEFI_#dJxf_xbtI|voz@X;peYzw(ux#1qr(TXY zf{LRAMJUP?M*LGu%|!gd#F5dk$BxG_y|Ubq%OiSk*EiSo3-F+Y=j8dniQhdXW9>SX zDLbqKqE>82&9b2Fix*njPeaBmw!JI-AV;239g(0NU~S)C%?ZxQm$wIe#b!CHQ`}jb zSZh78XiU%-M4zPZJlW^V#8uC7toR=`die`qH*v| z>S%O^Y3PPPiF=jf-Lp0etDEGKo_X)(zM&7I|h*G98nsOG2U{Q3v#zZIxgB!N?O;oi3-s)yN(>rtbk za!mbvE9eQg5Xb~N7iq^8OfSLr_uhC#^^;`p_Y>4W3=x^Q&fdIq`BdnV0>LEpc})4X z5)zFjQ3n#?EBbRqCG&KL)2$Z{h?fqpsr73R~NCLtySv)yIh>W=ES6Lvwyj zEP`Xur;YWj-)(UZsZ~7Elo$Cwe_w@)z{~)Q#J6^53IlyMtcY>uZxZCicihp3fXCf9 zJWhU1Lbc>)zCNv<6MI`>QRy?Ud2m}n;7ty}uQXVN*aR)o=(VC_Bm7t`%qe#laTf zHrK)%h$1GmBoBp7u7#^w=(tOCy(i8F#`a>58wz5pXa$X<TtN6TdyHPU;G=F3&42m-!CrGS&}gtlmlXL{B{-<$XC93*SiE zoXhxkPr^`EUE1{!X>vY&vJ5NL<+eVXYdM_$M9d{oy2^;slSJu#B&l?y{8fO0pQ8Q? D17*T* delta 2185 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 Pv=JR~t*1X0+W!6x9duC? diff --git a/piet-gpu/shader/gen/pathtag_reduce.dxil b/piet-gpu/shader/gen/pathtag_reduce.dxil index 4c2bd233ca3457688916b6937bc1b15e1db950ba..ff544b84c9812c64787bdb840130b6bc35868a0e 100644 GIT binary patch delta 1220 zcmZvbe@q)?7{}l1UEAyRT8=B-t`^1>T88|X2V)e%GH5%PPSC?G6`GmcA!0RR7+DzV zmR^5Q*uoz~YDBUu$LNxZn6OODFj>+YXf_xL#AR!0X3#~9_+y5c_>VEZMH&;c`{T{? z{l3rhzMtp4_l?_SyX9zy+XMdhAyBi|EaiCp<&RB!AKc%#o8BsJzjh8y9qo9obx8++ z0My{L3V@6TFr9)Gv(R^YlHb}$0Q}d_Q zk}9r`q;c@j0+tVgydGHp4g-K^yi(s5Fkx((V|7)o8`UZk)|4Kj^d8dV0VYgHkCA%M zVHjI6?Ihcs#t^v#H+(MI?9qv6^h&AV;d|L4Jt)DOT~{hAR(nJ8D<({yWWoJt&>A&h zQ@szPsugMFlUrZ)JlK4{#k<+!bl@{%-z}s*xU+io=0cm!HB!<&cwj($Yv8s16RK&W z3tkLmpA)YsNd%QrFhX;1XWqL*v`^zL_hYn_g{Em#~|Sikdw>*m#k_0=}r;p<Dhs&%ejngur-t`Y$a}Biomq z@)?wH%JfC2%oE|0x={d%H98OyHfDp4OF?FESIsGoIAS@st3E?&)tU3-&FE%%b^#KktD#BWD2dp zX8>AI#Q_RKr*rPHiDL51QW7*#jDl_9fJxvSDJoX%`@& zZpUZVvH*|vJZnq5nv(@M#SO{yku1OfVh;Iwkn$$=4#2!*o(=g}A`6ft0{#qu56J)^ zW&V0UI5dyM)LQ<8RWcWnUgmdO!Qa9VQg{!^gF-BDi%_Io88KDRBBrF$7{b)DBi$fs z7(pzOh`Q@ELQ29%kqHN`DFehvSd>+=RL49?1Y{ML!y2Ri9$3>K$lkZ7wrn>DFA}we z&a&Z7jfi`h*6;U4%$o7!usEdHw}Txbr#oK??XE(yEGet9L!v8GR+1e$LvULjtIIGn zOJU&&qJ<;_@Q;EE7tZz#LvZq9rj=U~1G`X>(Tq4E!oKil7_iu((kvR33Y9i7_mx%Ol{8D4quZ3yUrAR-$|1|xWdtPAS Hivr*u$E9|F delta 1172 zcmYL}Z%7+=7{`B?yPRjd#7oZDpHpX|iMnXv8m#H8g*zK(A`0p1B$mN0I@@*qLn__o zz>?g>xG>^KYum{-;bQ+Cov;*JrhRo;ebGr7&cfK7h?c#OQ8xRg$hH^zCF*u?$MgB# z^BkY&4o-30bd-66ZAYbRe}CU~qoT5izWaRYnf^8g0C3zZYoJ~qxUxK6_WSvvU%CU| zbe!uQ@CN-|j|%}1fgTL$0LU>w?F^d8puFv&W6>A_>fV1Uxs^ACA-94t*?N-NHXNHh*UhG>3be^Ga+oLsQgQv2QzW#BEhwDl!I zB86&S`4yp$I)&=kQY$;!_@xazCDQZFjo$mrvexyKI7_KUq6gE6biMC>{MLLo({x4# z0hUl!xU-KklFdE-Yv64telX$D*J0wsJ9<0&R;9c3bGN5uzE%CU$@6gjHKAbkFnviE zSwTuH(b1S&jYTJM5-i>+!8=oodHOfQ0j0t)%`c|R>}|#_NCqyDV$!^X;d%o^wbHs6 zQFy#_dIazEC}G@{9>xu~INvpmLXQG9WFe5n^_i^mt1KMZr3_YkQz(mO6M`;kgONk$ zQpVE?8RGgyV57*f3hw>?%QFG&mDL26YxIUSb2m)Z61*Po+1lI?`-oKKg?Eid;39>e_dW;MlFX#Kh;NSx+_#!LDv8v^b;$FBVRPrGNKiNwVNR{3k ztb|I&jET0gXb6{mr1*0brZCuS8yx^B)*>+4CyR=1-6$51Nd^sD6QK$m>&6`D^3b#c zI0E#-kgm5Xyit1h)#TTrRh+X&3*3`~%$OL@I{pxXA+B%)_QI~}s)UuCSo)+N#V@mp zj&^Cgm!zvg)yXc0D$B0M$%qq@E+B+s$blm~6oU3Vgm=J?VCRdbCWi|?LgEWHh*qhl zM{`?fVh*0wOUKPg2mvKa7ue_P7HcM!giQ#u z4z~Kk%O=bZ9fHMi&t#n;c5gJXHEEOJw>ghloLQ4|8{f^nENYYd^|c{O?T@B|b9;FY mi`ue&uI_@RZo}06&tCp6i`uZxL-mrS{)K6lAkn`hfBXy8wr1o2 diff --git a/piet-gpu/shader/gen/pathtag_root.dxil b/piet-gpu/shader/gen/pathtag_root.dxil index 77f12e6db0ec75e4d05be227c033a9793a2cc1a0..48584bd22a13f8f01c186da6383ccc3ba77385b3 100644 GIT binary patch delta 1497 zcmZ9Me@qis9Khe*wbvhB+f$%kSH)xe&I@04m5MQLQ%##gA0F5$0nE=mxV2CBU!eXZSNF~+xz32d_M1c z-+S--UfxW~Y>L6gS*+lH1A$zB$#7b+wxHqg_zh1~9&_FOxGQZ@la1T_YOfjq9>~E( z6aa|ml828UZud=Z>bI})s8syeup4y z-Uxc%0c0k5btQv7 zOFegEub_$adjJhO>3DhTr{SCd6N0C8UAy;f^M=%hbH{d^nJm9^_S=&}wWZ}j#p3H#Z=~g=GCu{Uuf)3j$2-1Qb?tb^ zr6Sdd?8<|g4X(yL`x|z;8n>anTEn?l&KTb-Pn_7^W&CdPB*6NQE~r6Yu$w}Ry2p&! zFF5QU?Zd`Gf_yA5gm3DQP9+&v0WUxG*2Zw%MEeqLj$24&bGt~eDiC>>qJh%O_Ta|2 z`uA0c10P7nl`xsS?D<1>x7q@Vzy3LZpaMPdVnjY~`I_a^x+xm? zVNLFk;42A~BupX(6`)0< ztfT}dc8|oNX1qvPvzTWl$v%{dWh+^xf(Nt`cjK#@Et!4!bDqo}hQ_SRX1o$0Su+yM zp;^*Q)*PC^I}m(6^f6IvO-4HLt3w-8Tk|`u{X?Yg!IY%e=EJ6T6Ji))Q!v<5ViXWY za>xXr<_R$)A~n{sBpx<4HOiVGxc@_sVUKdJqm82AWk4*t&&L31t+O9*&=7ExNrBXB=U z$v6)0o6u(~7#|KJN%)AgdZ$_14}uR%aGrr%XL> zFLA~>IIVG@M3o_!ykfPW;GBc14rK|oyCStYq2(;!>hw>im3bw7dPOhrxz!AeQrLM4 z7<$1;tf7z6UAW@eJU5$)^`0r#uTp{>v#jA9evBfRFCe@h_;=-fRE> delta 1493 zcmYL}e^3-v9Khf1-tPU{MdyPA8+RKdGCGS z_xs&9FP3^cH8I~|vHme|xADuD-}`*#z9>-N-*O!R0MwmMJR)98JU{gYe)+@5BdTkY zX}-929Xt1?WL6$s!c>pN%4f!BZ`_*sYJ9d=v?W<@JfhE8J8bM5G~}EaUKz&0z(IK} zx^lcH9+RCg$qa#1*}F5Fass5x5!i?A;I~QvNFk)4m5c7%5Uju2!NeI{?P>1pw<)m3 zA3msIfTY!Yl1NgwoRA{6g25C*0vA)ChVO|u7A`v6l2^e4Mnb5PeC~LExW)qF=YRDf zD9>o}n{7l1N5GB2dE0q+61j|WuLgO_t4SBaK}5x3P){Jqg4RP_l6*zbj7#u8x)*#F z7!ZX`cnG*Caw~`riUmM+2~Y(tm{}VVL}CP#0c9vzMAtEWoT6$3ASQ}jVGm$>$t}*H z1v_GxCd&jUk*6>Iw1w>)Sg0HiAIAwtv4Jz}|FMu!;m7g}@nytL~!H`MbF~xl&vl=_Gfpe5{_R=YKB=STq z)O_59DC*t9HUB?|K)zP?eKwD=cE--?>qi~%mC`oVEWM3 z2Ln5oYO;lk$9!fC)>%|Pp?0w<@2HA)s^}~`vMuyrqG4K{rSgqx=?X2ax1)}S{)Ibg zy~;nDMOS9gtL>gG4}Bv-uU55>n&~PtZLoX)^Gzz+pz0j8)75r*jgu}HTE@s>%WQ`L mRso+!kSaWq&k~RQ`5Cz_R-ZT&y{6wC9;^nQC?-rVe*Xdj6YOFD diff --git a/piet-gpu/shader/gen/tile_alloc.dxil b/piet-gpu/shader/gen/tile_alloc.dxil index 7759910ca527b4ff12fbe9ba3ee03fdb6a428ca7..7b130e013427d747d2d4199badc1dcd7fb8e8297 100644 GIT binary patch delta 1185 zcmZ8hYfM{Z82(N>)fywCeQ zKR&-Ypw1|_n#|yT4`Fk-knujR?Bc+0q_X1Oo&r1B_DjAp7&TJ| zxS%%;HEd}W{9+^Y4$&wwrdKV8VI&6GIH*@e!f=g^F~*(GYYo=H`EwCd6=5V+OX}!; za?4Pj4r-y_UEXLN{|TKW7Wo`Y9R%kh^TG(`iIzCcUCrcrSCwn(mp^~l8Nr@ZHtbY# zb^Xuff7f0(E4(^O^tSFg+8xQh8nwFJ46!tyj@A=41=cd({4{DK^n}BLwOIOwR_9jp zhGy;#Icwl)WyG~mL`|Ih&@~~3b;JjA;M2Ny+T;Rv2cd{B2vM7m@PER z-K?_#jI}El;{%T^a2!NWE)t^KkYM(USJ0nfv9 zao1%3hN+o;se-K{5^l4WWHSBvs6qJIFr){N_@>To3w9!ll0!*m&~4vj+D%|MhudHR z=^^*kXTTr1?@_0qwAYjAGxFWv>xgo#os84oSKl=zW0Tr(2;TaG`2-r0yMyU5B*8Z- z=!qqN8E;BdjVtm)zS$VJ8P0@Ro~A%YUN5VU$Lgb3OzL6do?wcPbQ%}e>BA)r_!j|; z(XdC;)DBG5A1H1DMax6OYq=Q4!h!>4H7WtExIEgnOalWXhR;j;wmD?&t)#!6S>X1h zOjAXog5GUUcFa>2-!#A=ta9z|op^tlUz!y+Cn@zh zMG~<60Pfb>JL3k_zPj%Tr{rSXxPpzyF*KT(d9sIJc{u_0rhW^hdKGm~q~Z9IC`5d$ zez!9vg89S*sr(ywAN135+BSj|cphM9v|R0&qiQV3bKMkqlYvn?W(jAVSE@{QRb`H} zxD-G%3C{}~B~|tkB`Ad4&~`TUkywI-0Q$e;6+ zZRl*AN y({e>iD`%D}8khR2PrpvZ(xj@}wmU)Gn9-5(u~O|l8mUGd^A372$o?Jwy?+3ac!wAO delta 1180 zcmYLJe@q)?82;{hcfE2QTuVx?EsQG^>|EWhY$A2h^a@T;HXDOk`C%-DDH=e=HnZs> zZGm#j8ZBP8q0?E0b4^yv_%R%bGi`wdHh&aEDN0DeEkRA@Vy2skAzrhh-(T-P;vA z^KO}~qOzF)zz$IG6AVD|4g@$UFsg*Sr8K;(l>#s~62TYYTLhWpQiF4_Q{p!Inuuo)o}v9vF$;nc*xEvk*2m4HZLCEfB7!C9 zueKgKw*2GLTw;0c`qG;DS}b~#+H?MLWay+zdR0mfhMZOjinickyW5H_cvc9JG0q%m zpfL?rM2n34N9aQ^JiuQ=X+_{y-^#due0Js*d-eSI?ALoFB>;@%V%0Ej&#-iu<^h`z z3d}PUguCh6v&_5<2LNgUARm(ex7~M{eKY{6xd_L?PMT_LwJTn;V-1YM2WT8y)YN&@ zAxPz=D1f^o2gEV;e<7*yQnZkTlwt?d714ML5%Z>x{bZPflAYQP+p(v!c`d2z_{7z| z7-_Nqf01~f1t>zUcODQI#H|2*i}`>ABS_SY(#T&x`WSMI#3nXHHC?R4^-YnqjBz-V zN|y97R)O^=!7uz7IZ2w)Hv)=zC?(-^+M6--Lb9mT)uNj>Bn&3R^<=0cD$K6)H5UYg zopE93@RVEcXYZs9NT4=$`1{F?F8hd2eOSaGED}a%YJSH4P#GCOBBEQ$b@~dR8&=Iv z=3|)9Ai#C%5hZ9Oa;9II3v>lmFVeWzS6T4F6&WtZfs#wP_$P6%7%A@jadw+4JPheegsZ+ZS zI#)c2oUr{Aw8g!G)s%>tzWwEW0q)=xStklurq8;X-LBPH9J<|kl(8gf22n7{D$5-^ zwcue&90a+%ORmILbD}HR&+upEG<>Ot56jhvq*vd=FUz%1^u5fjFD7zZPnp$0&{e)S zkVXd&w@C&|oX0PQ)5kogow80$7bj#QNP%0~=hiq@BshGewKp?gHab-^`c&;` zcSTiw7PCasjm!;eb;Jkw E0q+okRR910 diff --git a/piet-gpu/shader/gen/transform_leaf.dxil b/piet-gpu/shader/gen/transform_leaf.dxil index f9f31e6ea1417ccaabda3cd5ad47c1b5642a4e85..0c1e37624dfc3d26fcfb6bec6f7c42bcf6883e72 100644 GIT binary patch delta 1694 zcmZ9NYfuwc7>0K@%d(ISBqW4DY}tTvNg|T~2BZadLqNeBRTyK%HUcW85-EbkDKl&? z1WIwt5Ts~F1?z=Uw1Hp&Wja|dl0mG{QinPgMbRp)EkpgGGo4O%1^nUuI?wl>dFPz( zJ?CtTvPCJ<>9wiA8(*hLiSjR4>hFonJ+Y6i(rvsW{Wez?s)XPI!(Vy_y|2B=vQ6^+nS;HQ255V@J2d_|L7r zdDLjkoCjS5b`Z+ALY_ZG2cM&BNr=KFI-}u}y(*+gm1hTV6q%6bo(gHBL+T|f0n|*w z-pv=0{ca>2K>)MCK1p^j568(N#|uAsmFR7|sq{Eqs0Fgk89rb(fh6TotW$RAIg_xB z6($L9)nZK)=<9XQ6;L=Ts1+44z~c1aVNpz4l^b%_%++n>#XP8Q?DgYdFUt^2pwWQEmX4iR6dpLHI+&wbM$coM9N{S zsd7xhc{!y<7CH;C+5Az7XQUz4ek^(~9vaSnAu+i}P&g$WpI2Yx&E{{FdPYub?8g$x zVn)6Lq=>Qk&H>*2d=NbIh&KZW4?6p0EAk+}rUa{H(-6I2D{1ywtDi3Mi&uN!kp9@} z$P`3Y86jklM`uv9(!z(A4urKj<-YC;XLGJkyzGh)>@aNLojapTPiuhcC)UQTu+u!VdMHey!OcdX=&8>)XHbKeCATq6b%22H0gZ9uZTki85acTH zg<*<9d%-r3^4#q(YE2dPX{VTWf`T%RYNLwD%ZYcVsO7vM4 zBVJe(?Tex|h7lK+?0ho3<%w=0tz?jwOCT=HOOPF@^D2>*2QjOU;`O6ZKzd-AY?#Fj zydPLxRl#CahoO)+&hnZ{*&|l2<^9BB+Sju35U^uU3vZIeoQtwy7Tvtt4BB$?@KDEf zCbG{>mGvQqW-^gnH~+t38AHAB4Hy}o+R(z$MMScFkv zoufmzE|1hPGsq0{`!(~F@4u<-Iwo#actk)JP%qc%GSe6=374~&xoHud;V~>0W$Wr# zbv`_n#kxFQdpe{a#3M8;wioF#*E48{NOEiznIfh#*4FGj!l}EP!CddOd7XZm3Of?3 zJV*$VWlagap3|Zm(p;#ij^OsDj}J1zwV?>HXQ{UDOQg!Yswdd!L-*{;#o6aL6k zv;@r7*%f^aimRo9u3`JK>n}0AVRHI1daX-wZ9t*%o`WniHev_U9Met+X8%Y31NhfJ ALjV8( delta 1610 zcmZ9MeM}Q)0LJgG*W;)KTiQZtQSSH>OEIm=hnwP+9yKu8nptL1bO#7BKdUp$O(J(y z3ac(_KjX0?*Qz>VW$AfSWEvc@G?)T6SNqXU{-pOt+7{<5~@@#~Q(ek-bn zV2XNbV`+&yLhbhIhrBY0hjv8*KbHbEUx8i<0a$!aUZoc4!xGSSS(KAru7Kg29@$W) z!E6S!4W|5>!ZMWCNo|-VA1&j@y%WpFV8)+-j$SInzplbut`mur*}5Hzn*$`E)x?Qp z{k84R(S-__{1U@%xEQS~1U|m~Hy1Qa51;S(vGmu64VL#FTGHatbDp~$fg@MhGvY7^ zI>~m5u?XK2UTf?ayZXR%<#fl`wcOz40RQ<3=}sv7qUrP(Or)2qF+nt@Cbv_&N({&c zh9VDup~zuv!3NDKMpLVf15l^w8PfbYve}2kA_(B5Jfo&luZJV1%k1+|UFG;Z53~CS zSC$FboY}#kjX>TgqJ<=7^eIMhRxrkiAj7OS9_=$JFAG}Z81hPMOzZ+x-7^6_uQl7k zK~6OyXv+JqHKlHx2@lNViT=yevB&3X;zVm5RS!a_Dai$27bvB`@TN4{r0?sQMwWQQ z`S#ls;y18&=B8IhSwlHO+ztLNliGkXpexg01-;;ugcoU~I|&x401a?~H?b37tC`|- zgI;GUEh#dslF9&>qjQ4R2M$bxTNIGj<)Gyv7%&;U0X*U*Hd-}y5J)sfP<;SM$fRdK zny9j(pA;^|0o_%x+DHI0Sd>#ae?Oyy9O_(@E-D8tvzh0DcBNNQQ9@?R#@Crs$D?ex zp_*pP-7(qoZ0&-;fVw`lcI7dA=&|vh`FD%BQV`b0P zO!oi^XIQW)lE0c?33 z{LL|x5}OM=S%z%{d(fyj$byNIygcXtW(XJE%W39z&;8O3ROjb3RbMM`U=* zz?ZilyKFXE!6{}mw4V?Yb28sl^5rF?e_DC-@~k=PoH1h-@#gH5eUtrfKO(PXIeJ41 z2*fWH%WVrtu>&uO;AfB3b)t!YMYRWS6OgF8B4GSpygvf0Y^A8W9|TURz#j-UT{k9R z)=9iX1GW}6*WC~>?+o51V0+y!Ji78IESl{hGRhgIqE;e$VPA?&8>{)sZt#_1i#_#n zw4#=nD25@SIJ>%?sTkSEH~Sa=n>2K?7y_de=<{X=S2+MnGW@WxRM{WG`e81#mp{q! z8HoBn)G#1_we?Ry?FHjD!Uq|FUWC+1Mf^55I}JSaCBg#G&KW0KDWb~h`3Ch4bhk)a z8d;00jRyY29uQ}2icNKC|A}E83Ki&PU5Z3-3wuGavIr-;sU}mlb6xcmEqQ5nlYH4& zYV#| zu#B}TnS}A|Wz{7gi`;>1{$^)ACGEHAn7xbjJBh=~@usx)nil1-wqO(cw{inm&gQA& z!F%jJRb*7wBHxJxTr28doaE0;T7|E-obRqNiTFLSKV*HXNU(|>QfXE`DN6E&O}afv z9Sup}?UrBa_eg5hOZj(?>0i_yqvO6sJ1-@5_9UeSJ%$e4brEa%H8c4TEWD-s_b)X( BF)RQ8 diff --git a/piet-gpu/shader/gen/transform_reduce.dxil b/piet-gpu/shader/gen/transform_reduce.dxil index 978dd98aca8a278bde85fc024c77ca5695bdfcda..fc3a311f97ad90657935d6f92e7e0be1a2fb9238 100644 GIT binary patch delta 1371 zcmZ9MeQXnD0LI_DdwaW<>$q;$a9s<%bsucfjTXoF5ax9yb)uU^>e!}#+*p~5ZiJv& z&@Ab->q_}@MM_fn!*r9G2{U%i7-k^$*s%N54riE%2FO4|CL$qoB$#+tHlp4iZ|?Uz z_db{RdEdKhxz}>(Z8ha~@V~2{PNq?t`$uvFUk3oe|~0ac@v^bP}n{luuM(vt~if3&blt1W3pGa)?1vQq(n z4b!bNpfe$InVoF61HC`(6ua*VM2_bZ$EU8R3juij8yx*;!iN17ZSoEp7l zyU;T@HCd_LGVqlm3suy!05B*1R69IfVoA{U9G-(KfsdzpkXJ&8E-VIZsK7GY-f-&N z6y9jr%>$OeNA(-`EZ!c{Z6qP`>>jIj#F$^i;usueHZQ2TZ=m4vX} zfjCGCKvB5b;R>~LT1O@tWn98yWSduehiytlrY%N#$liSi6k7;h&P+$=4SXjuPxH%> zd6J)8m~BX`Ha>lkD{J+8+ssPrVI%{;-|r@88^)NC1Odw&>^&>$?bHx$6SdgGnE}at zT|L{7%o<4qHwv8!tgSDEE!1%F#4oIow_Kz8FlJ&MVO!eK3eSSC%;jAE@*^s)!cYEo zke?BV(?|hoJk6N|Em?$Qh%rRt#GHw;iofk(4a4uw_0?mh7#^iPA@mTawoLe+heP-_ zLCvkt&F;uR`s#ZRg^7SV7|jxVRpp2C(3&A3)2t!&ly^NCfJ2-Dq?JEIV_HE^cz$=1 zF7Pq?h282zBEDq$B~HPs9=nBvY_g3e$$WeQ$E$?lXI+(WmxvFk#TP=N8QTH#hW&IE zjQK?Kep3`Md#3%amn5_my(?qS>|+#*F3Nc8fqy#X7LUo8=Q-X%*TGnztN3zia#x4z zRSC1#UX`)h>usArrDAjN`_>An_LEZWW^1T(tD7~pk8uC$|0s98L8Bi@X~j@XmwJe6JSj3P(h~@J5$XFg$9AlE+uF>-WTWnAHnTU_@dIeD4PeT<+0pW&6@`IceXDBQ!|=&Tsrx&eM4(!P24dXr=E@+sYM}@ H`j`F#T7JoB delta 1313 zcmY+Ee@qi+7{}jh-(Jt!!nL+~(6JsrR0tKW9RhLKU4KYAD6ZQoLBbyg1;YX}ZpLJD zWW64hRR_}9ZgV=5&N+g{EI4tdYO>xyVU2FkHA}vs16#GkEKqc0!Kdc;n>hKP*j;R#%pJs&!wz zcmA%tPy!j|FHe|M95N7xqQ*oNSA^J}ERfsCsVg1J<~W z;n=D*5Ke{ggpIP>f&PefXRx^)W4dRA{QF}hISG-*a-(AyPfoaggq_%+3VM(@oW-5P z2fm2a;al1`*0~0@PEnmBLw?fS_p`f+VD{}urx&N1lH-Z#`2lFvnXA@aHpgPa6&H(; z$$--G!_|`B8(+G1*D$Hvk-eYTSLYXpJND-ndyi|#w(+H=xx~$17v`=dZVtd5Ip(U5 z%@tc>Rf8AHDlWx}tn%}hWm%H&k_sYO;d`oT-wD1fV68y&(N%zB@XwGPy*v@(gH{Pk z5{}p0Sza7%qgoh1V(3AAW$S;BFX}6Wloiudc6;D_-v&sl`Xe|kJ9d~L0mdORxk1D7 z?KY5N(Umu!3G$j=F^ia1GD{>U;$L%A3_W=(q37ACReMUzw0l=Ft>G-98(J>-Bug2> z4>EFm((5+LjZkqTl|tzQG%oQ1c+EjB;Bi)KUnnRI~-rCQ0nTWB?52 z>X=c0(73X&k&u;R&gQaQkRWA*i3T{7F06IUs<>B)I*hHUMyi!KfIOQ#;0c8znQGmB zzixqSUoInmQYL&UGuwwr|4ysXJ0`Dk&O1hoj~y|E`is1zp*BHV1|t5hUV6q0C5C+b z0pX92eOeys-}*XfcxQ^Xpce$&E`88I#m5vCY`+Y4Evl9fbVS8(VR>UW4)ak|m|7?p zD4ny*?vWQVk+Y0*)w@`aDoAIuc}vy>gHO`H$2E^|r5;B%gMEwLsTbf7H@n`EN0gJ2 z4p4JjUKGL@S+^_VpgL)o1|GZSm5u6nHhPRc$fQ~93{p5>aH>9!-K?xQr{RYXb%T_u zrIa3Uk{q_1+(?j{$hb<&NQLcrtyISrVz=CaeCx6FrTxp+wn4CuzjtUJIv?669eZ@0 z)HHqtW?eVq+uSyn^A`swCK8g35(WEmb)ECJh)Hf4YqmS@i8v)Oigx=;&VNMwjax>| zPUnejpo5r~Y!dC-M&~&Zm$*$5pMq`vP-weRX#3Vy($GClTk1dXcU{jD=HeCRGA_*J z|NdjpvNq=La=j_o-$kpM^9Juo`Q^J6UP^+ zUV;FakK^xT@3XEOL18f=6*_#%W&$HVC_ghK;Scr*m*Ghq1^3zE7Y!6!+XFlQy zZnmevt)h;$Rfc9Xt)fqPZp8t@pL99YkM_sa-s- Zf0jSAl}J*A8m8#J*wOVgF5Y6|`WK>fx;_8^ diff --git a/piet-gpu/shader/gen/transform_root.dxil b/piet-gpu/shader/gen/transform_root.dxil index 5b4f05930600267411a9865e166d35bb5c6578ff..a33ff7f18731036eecfff1788ec93557c0699844 100644 GIT binary patch delta 984 zcmZA0ZERCj7zglk+S~57-aFc@VBg5@x|MCZmpf)!WC2Ut)RA>^(E%l6db@6>0)prV zQES%Tu5&NUHQo+7$xMlwxCN67TM$i5+On65{m^JJtroK-V=Rj=gor8Mytkj!^X+&3 z&yzgooSdAoVAR-MRvY-=g1igYG(Ba{emMSv^3F`=y6Mrrk2)4oqjuLpC-npXG?0L- z2mrx=FIVs#d-#2;E&gjY2Eh08UzYs|k#71ACmWN|5M!Zyr%FF|rBQwb$h=WVye{=K z8orBdmUj=IQX>(hkg_Hf9hX4Kl1bACKA9{>c15_-|-4ept*WXX$8 zg~H4D?KD9?!6B(|`b(ecDcWRGM>+VK~FRa7&`;P50U;2B)WF$TguYH{h zUCU2>*Co5KxBquGp1Mlf5aW(>=2O&_VXchss7k5H0 zJBRBaV3%!FB^m47?90RoesFUrdkEo} zKvUch1L`BiA=Po7usJ1gY9yp8rOg?EccP()K-iKKxP2m&?GeUlSuOR>gjBse*IG6O z9vuz%oLceYoKgC)^(40LIjl*o=-a}RT?0f_Fm2iIARe@e1_P5y)OW$M>T$>Ty0iGY z=ND~ig*1gHWr)v7ta_4?s>=FexyKI9+4=8FoP+hSA7+@6Jw16XqW1oK;U>LT+Xo=%ygj?w%TCqDr(h^)C5WAn8QXRCcf~lzVqeh`F?+S z{^UvPQ+kcPr`6V95h;9f;&(^yt?c)6N!J_%0Hi+A94L5n{ZO~=&I4CYU%SKC@9H~o z+1}%DItu|{0Sdm60U#NObxNGrDXzEL=2xo;0OGSB7uXQpew? zl%atU4M-jVhDpdlcs;@dn`3>@oB&$kSwH z?Jo?5b_O8&bQtP8mFLyWE9bS$HMq;#p`c7{fTIIG9q%Tc@Fo5dsf83DCk2?{`-=>a z<3A|+!nfi+G1!of?x{a6pkDUO68UMU_^vSLulOTUS^mi8!oJVtnt58TejW@GYzPvT zfzGcUYd>oTMm5XTa&CD|I~JzLLVMl--KOP52NK2X0%7gYSN~ZIXIMcofsc@Zux8*g z)B0e!9@ zEuqm44_!4Fv+ir7H_bAie^iBggVv14oe_KY$TiPT+Sm=#?$D?L@jB^@X92A$HEb=H zNGER*q9z7XNHZZ~e;zOYA36*J94n-+AKF?HU_`kH#K)R85%U6cD;Ff3qa;A(brEvv zG{d`8_09k}{UgqzgRiC9tk87vL$dCc#8X*`+rK2Ie~|e4RzAH=*5%9nf&EgNB&TyY zOWM4X5-;ZXWmRhTTzd;43m)V)s$<^?HO+?;fX1=%$uJ&3%of~SqT6}+#e~kJK8` 0.0)); - rgba[k] = mix_compose(bg.rgb, fg.rgb, bg.a, fg.a, comp_mode); + rgba[k] = mix_blend_compose(bg, fg, end_clip.blend); } cmd_ref.offset += 4 + CmdEndClip_size; break; diff --git a/piet-gpu/src/blend.rs b/piet-gpu/src/blend.rs index aacf597..7edcb4e 100644 --- a/piet-gpu/src/blend.rs +++ b/piet-gpu/src/blend.rs @@ -51,8 +51,7 @@ pub enum CompositionMode { DestAtop = 10, Xor = 11, Plus = 12, - PlusDarker = 13, - PlusLighter = 14, + PlusLighter = 13, } #[derive(Copy, Clone, PartialEq, Eq, Debug)]