From 18563101b2062c0df4b61ce7ad6f6de3809abd39 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Fri, 13 May 2022 10:18:29 -0700 Subject: [PATCH 1/3] 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 1ac4bd6c3..c0ae6af29 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 60e558268..09b068393 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 zcmY+DZA?>F7{|}Oz4v%~xh=Oy+3i|fYXKQUy(og)(A~bss)KkpURHdWw-pqSm#SnL zn@KOl0#26HAOz=2I>(mA=>lscYBcLDl{uB9igRizfrVtaPnht*C0nvvln*;!&Uya% z{h#xk=bSTVo;B<2POELtsiD-LPUj6Zt$6y$+1Bte1OPBQqU&Dv_LityDt>d~`TBog zQ|9|AlXmCUvV0N%0pQ>`3P3UjGEU2mbXm9BB2y*`0AKj=vKI(En^H1s0(~iphCYsD zOjO;61n%IDVB!=3o}=GvQgH21jLJL!?F<0reeGnqR}W*x9HM56-~$`=Y1Wz^mp}-% zco|*P=$m)wGybR{+=7uni?DkzdIAVOp2~U>y`RV-5``9UPKknMX86D(j(*tRoEsts z3)KxRZAYe_B<@d7&D~DSapUpmEK~m7Woe|pgStUox+wBW9B(GBE78}QnFH5SsUm6@ zBT8KsDh8+v!y}I`UmZHpfAwCu(wA5J*_u!54jpc2ZK*)dD|P3N?`BT#K9x8b3E8^- zT-TjZTAlOzLTUAQQ8srwFmv@*|HO^oe*LO{qFg!jj_j>#X*<-;x5^bAu0T~`4{k&? zE+YV_+{EQrb$+su%ln?G)_4uKgXs#A_BoZkAn?Xt#8J8F>zTz_TrX3=43)qqfJ?}h zGm`G8)MG(KBf~ZEn)(2Avu*(x30P_nHdtYnZ1E9=?ygeR*A3)`U=8O z#Y`)JVG7ZBdl@4jd{W`ES}|hL_2ys^k0LD~<#)2!EAwMXm%mR;n)weHhZ3orZonJm zvKBKxx9A-mdfCQl_AhDwB8EzfA*p2^T+)t34FZz6s5J%s50HTwxZ{`1pweq6s+n3T zebl8`NyA9jN^DGJ$rB~d*a_0bcLXO@KXBMv)M$isu}vH{0q&+z3N0|r*@vTnlpk3* z2JJ>Fl8+Sd$P0|4!q`m?XR}c`tUTtV%@E4x4<@X+qIJUR8B^8My_SAUFieeWPQFf! zM7^|nl;%MxPTWm1D72#BxY^Tz$Q{o8IY5TkJ7U&>;V7@ZHovry#Z9h_2v`3zRj-9fa%nNp9) zXPW2L2<{cAVxz>A6{nZ-Qr<=U8t`f17tU@GWxMoe1nPS|X%2CQho}cgq~g7pjYF6* zRV522RenvSN6kl9N61b`;-$Xhl`f|8=-LRW*tYOe7wBH8&E~?iw-hJYwBhJe>WX_JGXGP0~cModmk8EH}71-V*HdmQeuQ-wTIqCr%ZVEa%WuPQ>ciC9(Ol>tuf zn72EyO-WvBVBPWLORw4)!nV?aM#P;WzU`5eK{GAHX8D2w=Y;_w?_;M@j@=z{y-eO< zc8E2?4Ebm6gayQ|m~bZ!JD4Wjf|2fAZOg^n!*v_|95qT^qcc6!-|q59PCcQe0Szz$`3V~(evAkcXB>(Pmza#A$#*iHh!kbD$EkHd`APsS_2w5rnoVj5aYNi$uP?p zY+a=U1B3nKj~u?C!Yzz94HP&H9cRcf3AZTToFKsM%;W6LAkCEC6ksXb(sFZyfPk}r zv#_h+2E_?x0_Ry6gjpCBE{aWiX6CqI7U!V_J_2p2hbQnJW^3AEkn0>6$*?taawvt6P*>B;q)Fh%ij@kH&})vG5bzM^kI=9LadrUnHGjr+$m{4ruNCu0DciYiNh;}TI9gQN=}z5G%+J_izIj$5k2 zMEs=+d@rQNUbi)ciS$dA_&r$I_*||sKv1wp!USmG!Od*TKGQqc_nUR5kA!4IsJe#H7uCU7@9}jcBn4d1E zcFv)|CBoC^1S@F&1YjRRg8~p431N)((eEmWG_hfVqqdESVV?DkT^g>?TJtJJ+jm9Ny?C z!NZkYEX{UAL5*Xwb3&7Wg0zrRWJh8GM}qSOAAwbAO%rsa#U4d+Bqbb#Ecy!CUG8GkR!1n@rHxIwW+xpE4XHC(aOmw%hk(FNzE$>Zd$-4 zIj=i*=AD>Zvu{sn$Z%?Vo+N%OE!;xQT-D&!goiuNENq=P^`zz`Xf7%S6V>E!_6?C4Cc8uXH#vH7H1E z+*8hoHcd)kP~c!=kubU4!3YvHkykOfoZ-a4W6r}UdB%vv$snl#q@q{C=V)@T8jFME zged|JtP{fo4t6*)12x#BZ!lzRFO+#c1ul|tz|?ViY3%naaFNUlmW}0X^PbB&y1E!7 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 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 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 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 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 6489563f2..796043bc2 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 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 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 6402c6fad..964700135 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 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 M*nFOgV$a3@4`5AT`Tzg` literal 65312 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 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 aacf5973e..7edcb4e7e 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)] From 307bf8d2276a26fd0828a5979f91d40be64d8772 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Tue, 17 May 2022 14:34:14 -0700 Subject: [PATCH 2/3] More blend mode fixes Adds a test to visualize the blend modes. Fixes a dumb bug in blend.h and also a more subtle issue where default blending is not the same as clipping, as the former needs to always push a blend group (to cause isolation) and the latter does not. This might be something we need to get back to. This should fix the rendering, so it fairly closely resembles the Mozilla reference image. There's also a compile-time switch to disable sRGB conversion, which is (sadly) needed for compatible rendering. --- pgpu-render/src/lib.rs | 5 +- pgpu-render/src/render.rs | 9 ++- piet-gpu/bin/cli.rs | 3 +- piet-gpu/bin/winit.rs | 2 +- piet-gpu/shader/blend.h | 15 ++-- piet-gpu/shader/coarse.comp | 2 +- piet-gpu/shader/gen/coarse.dxil | Bin 11628 -> 11632 bytes piet-gpu/shader/gen/coarse.hlsl | 82 +++++++++---------- piet-gpu/shader/gen/coarse.msl | 64 +++++++-------- piet-gpu/shader/gen/coarse.spv | Bin 58852 -> 58868 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 15360 -> 14000 bytes piet-gpu/shader/gen/kernel4.hlsl | 111 +++++++++++++------------- piet-gpu/shader/gen/kernel4.msl | 76 ++++++++---------- piet-gpu/shader/gen/kernel4.spv | Bin 66476 -> 64668 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 15268 -> 14072 bytes piet-gpu/shader/gen/kernel4_gray.hlsl | 111 +++++++++++++------------- piet-gpu/shader/gen/kernel4_gray.msl | 76 ++++++++---------- piet-gpu/shader/gen/kernel4_gray.spv | Bin 66232 -> 64424 bytes piet-gpu/shader/kernel4.comp | 13 +++ piet-gpu/src/blend.rs | 4 +- piet-gpu/src/encoder.rs | 11 ++- piet-gpu/src/gradient.rs | 2 +- piet-gpu/src/lib.rs | 2 +- piet-gpu/src/render_ctx.rs | 31 ++++--- piet-gpu/src/stages/clip.rs | 4 +- piet-gpu/src/test_scenes.rs | 111 +++++++++++++++++++++++++- piet-scene/src/glyph/mod.rs | 4 +- 27 files changed, 431 insertions(+), 307 deletions(-) diff --git a/pgpu-render/src/lib.rs b/pgpu-render/src/lib.rs index 7d4c60bcd..50462e73f 100644 --- a/pgpu-render/src/lib.rs +++ b/pgpu-render/src/lib.rs @@ -215,7 +215,10 @@ pub struct PgpuRect { /// Computes the bounding box for the glyph after applying the specified /// transform. #[no_mangle] -pub unsafe extern "C" fn pgpu_glyph_bbox(glyph: *const PgpuGlyph, transform: &[f32; 6]) -> PgpuRect { +pub unsafe extern "C" fn pgpu_glyph_bbox( + glyph: *const PgpuGlyph, + transform: &[f32; 6], +) -> PgpuRect { let transform = piet_scene::geometry::Affine::new(transform); let rect = (*glyph).bbox(Some(transform)); PgpuRect { diff --git a/pgpu-render/src/render.rs b/pgpu-render/src/render.rs index 361ef42b5..5b5d328b5 100644 --- a/pgpu-render/src/render.rs +++ b/pgpu-render/src/render.rs @@ -16,8 +16,8 @@ use piet_gpu::{EncodedSceneRef, PixelFormat, RenderConfig}; use piet_gpu_hal::{QueryPool, Session}; -use piet_scene::glyph::pinot::{types::Tag, FontDataRef}; use piet_scene::geometry::{Affine, Rect}; +use piet_scene::glyph::pinot::{types::Tag, FontDataRef}; use piet_scene::glyph::{GlyphContext, GlyphProvider}; use piet_scene::resource::ResourceContext; use piet_scene::scene::{Fragment, Scene}; @@ -214,7 +214,12 @@ pub struct PgpuGlyph { impl PgpuGlyph { pub fn bbox(&self, transform: Option) -> Rect { if let Some(transform) = &transform { - Rect::from_points(self.fragment.points().iter().map(|p| p.transform(transform))) + Rect::from_points( + self.fragment + .points() + .iter() + .map(|p| p.transform(transform)), + ) } else { Rect::from_points(self.fragment.points()) } diff --git a/piet-gpu/bin/cli.rs b/piet-gpu/bin/cli.rs index abe6ae1d1..7d577d3c6 100644 --- a/piet-gpu/bin/cli.rs +++ b/piet-gpu/bin/cli.rs @@ -249,7 +249,8 @@ fn main() -> Result<(), Error> { println!("parsing time: {:?}", start.elapsed()); test_scenes::render_svg(&mut ctx, &svg); } else { - test_scenes::render_scene(&mut ctx); + //test_scenes::render_scene(&mut ctx); + test_scenes::render_blend_grid(&mut ctx); } let mut renderer = Renderer::new(&session, WIDTH, HEIGHT, 1)?; diff --git a/piet-gpu/bin/winit.rs b/piet-gpu/bin/winit.rs index 1642026d2..78867f59c 100644 --- a/piet-gpu/bin/winit.rs +++ b/piet-gpu/bin/winit.rs @@ -125,7 +125,7 @@ fn main() -> Result<(), Error> { } let mut ctx = PietGpuRenderContext::new(); - let test_blend = false; + let test_blend = true; if let Some(svg) = &svg { test_scenes::render_svg(&mut ctx, svg); } else if test_blend { diff --git a/piet-gpu/shader/blend.h b/piet-gpu/shader/blend.h index c0ae6af29..736600646 100644 --- a/piet-gpu/shader/blend.h +++ b/piet-gpu/shader/blend.h @@ -18,6 +18,7 @@ #define Blend_Saturation 13 #define Blend_Color 14 #define Blend_Luminosity 15 +#define Blend_Clip 128 vec3 screen(vec3 cb, vec3 cs) { return cb + cs - (cb * cs); @@ -45,7 +46,7 @@ vec3 hard_light(vec3 cb, vec3 cs) { return mix( screen(cb, 2.0 * cs - 1.0), cb * 2.0 * cs, - vec3(lessThanEqual(cs, vec3(0.5))) + lessThanEqual(cs, vec3(0.5)) ); } @@ -53,12 +54,12 @@ vec3 soft_light(vec3 cb, vec3 cs) { vec3 d = mix( sqrt(cb), ((16.0 * cb - vec3(12.0)) * cb + vec3(4.0)) * cb, - vec3(lessThanEqual(cb, vec3(0.25))) + lessThanEqual(cb, vec3(0.25)) ); return mix( cb + (2.0 * cs - vec3(1.0)) * (d - cb), cb - (vec3(1.0) - 2.0 * cs) * cb * (vec3(1.0) - cb), - vec3(lessThanEqual(cs, vec3(0.5))) + lessThanEqual(cs, vec3(0.5)) ); } @@ -260,6 +261,7 @@ vec4 mix_compose(vec3 cb, vec3 cs, float ab, float as, uint mode) { } #define BlendComp_default (Blend_Normal << 8 | Comp_SrcOver) +#define BlendComp_clip (Blend_Clip << 8 | Comp_SrcOver) // This is added to alpha to prevent divide-by-zero #define EPSILON 1e-15 @@ -267,7 +269,8 @@ vec4 mix_compose(vec3 cb, vec3 cs, float ab, float as, uint mode) { // 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) { + if ((mode & 0x7fff) == BlendComp_default) { + // Both normal+src_over blend and clip case return backdrop * (1.0 - src.a) + src; } // Un-premultiply colors for blending @@ -276,9 +279,9 @@ vec4 mix_blend_compose(vec4 backdrop, vec4 src, uint mode) { 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); + vec3 blended = mix_blend(cb, cs, blend_mode); cs = mix(cs, blended, backdrop.a); - uint comp_mode = mode * 0xff; + 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)); diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 3abb2e056..1b3f25293 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -303,7 +303,7 @@ void main() { uint scene_offset = memory[drawmonoid_base + 2]; uint dd = drawdata_start + (scene_offset >> 2); uint blend = scene[dd]; - is_blend = (blend != BlendComp_default); + is_blend = (blend != BlendComp_clip); } include_tile = tile.tile.offset != 0 || (tile.backdrop == 0) == is_clip || is_blend; diff --git a/piet-gpu/shader/gen/coarse.dxil b/piet-gpu/shader/gen/coarse.dxil index 910925dd080752fe8c34968c6b8992f0dbb8556e..9187e01fce13411401d35ab8182d57aad5bd9bed 100644 GIT binary patch delta 6411 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 N8}ie&1^Ug${U2&KJ;eY3 delta 6323 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 JEo?6i{9l6n6Jh`W diff --git a/piet-gpu/shader/gen/coarse.hlsl b/piet-gpu/shader/gen/coarse.hlsl index 04529bbc7..0331e33b0 100644 --- a/piet-gpu/shader/gen/coarse.hlsl +++ b/piet-gpu/shader/gen/coarse.hlsl @@ -919,26 +919,26 @@ void comp_main() uint scene_offset = _260.Load((drawmonoid_base_1 + 2u) * 4 + 8); uint dd = drawdata_start + (scene_offset >> uint(2)); uint blend = _1372.Load(dd * 4 + 0); - is_blend = blend != 3u; + is_blend = blend != 32771u; } - bool _1692 = tile.tile.offset != 0u; - bool _1701; - if (!_1692) + bool _1693 = tile.tile.offset != 0u; + bool _1702; + if (!_1693) { - _1701 = (tile.backdrop == 0) == is_clip; + _1702 = (tile.backdrop == 0) == is_clip; } else { - _1701 = _1692; + _1702 = _1693; } - include_tile = _1701 || is_blend; + include_tile = _1702 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1723; - InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1723); + uint _1724; + InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1724); } } GroupMemoryBarrierWithGroupSync(); @@ -967,9 +967,9 @@ void comp_main() { uint param_25 = element_ref_ix; bool param_26 = mem_ok; - TileRef _1800 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + TileRef _1801 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; Alloc param_27 = read_tile_alloc(param_25, param_26); - TileRef param_28 = _1800; + TileRef param_28 = _1801; Tile tile_1 = Tile_read(param_27, param_28); uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); uint scene_offset_1 = _260.Load((drawmonoid_base_2 + 2u) * 4 + 8); @@ -984,11 +984,11 @@ void comp_main() Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1848 = alloc_cmd(param_29, param_30, param_31); + bool _1849 = alloc_cmd(param_29, param_30, param_31); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1848) + if (!_1849) { break; } @@ -999,10 +999,10 @@ void comp_main() write_fill(param_32, param_33, param_34, param_35); cmd_ref = param_33; uint rgba = _1372.Load(dd_1 * 4 + 0); - CmdColor _1871 = { rgba }; + CmdColor _1872 = { rgba }; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; - CmdColor param_38 = _1871; + CmdColor param_38 = _1872; Cmd_Color_write(param_36, param_37, param_38); cmd_ref.offset += 8u; break; @@ -1012,11 +1012,11 @@ void comp_main() Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1889 = alloc_cmd(param_39, param_40, param_41); + bool _1890 = alloc_cmd(param_39, param_40, param_41); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1889) + if (!_1890) { break; } @@ -1043,11 +1043,11 @@ void comp_main() Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1953 = alloc_cmd(param_49, param_50, param_51); + bool _1954 = alloc_cmd(param_49, param_50, param_51); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1953) + if (!_1954) { break; } @@ -1077,11 +1077,11 @@ void comp_main() Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _2059 = alloc_cmd(param_59, param_60, param_61); + bool _2060 = alloc_cmd(param_59, param_60, param_61); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_2059) + if (!_2060) { break; } @@ -1094,27 +1094,27 @@ void comp_main() uint index = _1372.Load(dd_1 * 4 + 0); uint raw1 = _1372.Load((dd_1 + 1u) * 4 + 0); int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - CmdImage _2098 = { index, offset_1 }; + CmdImage _2099 = { index, offset_1 }; Alloc param_66 = cmd_alloc; CmdRef param_67 = cmd_ref; - CmdImage param_68 = _2098; + CmdImage param_68 = _2099; Cmd_Image_write(param_66, param_67, param_68); cmd_ref.offset += 12u; break; } case 5u: { - bool _2112 = tile_1.tile.offset == 0u; - bool _2118; - if (_2112) + bool _2113 = tile_1.tile.offset == 0u; + bool _2119; + if (_2113) { - _2118 = tile_1.backdrop == 0; + _2119 = tile_1.backdrop == 0; } else { - _2118 = _2112; + _2119 = _2113; } - if (_2118) + if (_2119) { clip_zero_depth = clip_depth + 1u; } @@ -1123,11 +1123,11 @@ void comp_main() Alloc param_69 = cmd_alloc; CmdRef param_70 = cmd_ref; uint param_71 = cmd_limit; - bool _2130 = alloc_cmd(param_69, param_70, param_71); + bool _2131 = alloc_cmd(param_69, param_70, param_71); cmd_alloc = param_69; cmd_ref = param_70; cmd_limit = param_71; - if (!_2130) + if (!_2131) { break; } @@ -1145,11 +1145,11 @@ void comp_main() Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; uint param_76 = cmd_limit; - bool _2158 = alloc_cmd(param_74, param_75, param_76); + bool _2159 = alloc_cmd(param_74, param_75, param_76); cmd_alloc = param_74; cmd_ref = param_75; cmd_limit = param_76; - if (!_2158) + if (!_2159) { break; } @@ -1160,10 +1160,10 @@ void comp_main() write_fill(param_77, param_78, param_79, param_80); cmd_ref = param_78; uint blend_1 = _1372.Load(dd_1 * 4 + 0); - CmdEndClip _2181 = { blend_1 }; + CmdEndClip _2182 = { blend_1 }; Alloc param_81 = cmd_alloc; CmdRef param_82 = cmd_ref; - CmdEndClip param_83 = _2181; + CmdEndClip param_83 = _2182; Cmd_EndClip_write(param_81, param_82, param_83); cmd_ref.offset += 8u; break; @@ -1198,17 +1198,17 @@ void comp_main() break; } } - bool _2228 = (bin_tile_x + tile_x) < _1005.Load(8); - bool _2237; - if (_2228) + bool _2229 = (bin_tile_x + tile_x) < _1005.Load(8); + bool _2238; + if (_2229) { - _2237 = (bin_tile_y + tile_y) < _1005.Load(12); + _2238 = (bin_tile_y + tile_y) < _1005.Load(12); } else { - _2237 = _2228; + _2238 = _2229; } - if (_2237) + if (_2238) { Alloc param_84 = cmd_alloc; CmdRef param_85 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.msl b/piet-gpu/shader/gen/coarse.msl index 55812d4b3..854d2435f 100644 --- a/piet-gpu/shader/gen/coarse.msl +++ b/piet-gpu/shader/gen/coarse.msl @@ -942,25 +942,25 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint scene_offset = v_260.memory[drawmonoid_base_1 + 2u]; uint dd = drawdata_start + (scene_offset >> uint(2)); uint blend = _1372.scene[dd]; - is_blend = blend != 3u; + is_blend = blend != 32771u; } - bool _1692 = tile.tile.offset != 0u; - bool _1701; - if (!_1692) + bool _1693 = tile.tile.offset != 0u; + bool _1702; + if (!_1693) { - _1701 = (tile.backdrop == 0) == is_clip; + _1702 = (tile.backdrop == 0) == is_clip; } else { - _1701 = _1692; + _1702 = _1693; } - include_tile = _1701 || is_blend; + include_tile = _1702 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1723 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); + uint _1724 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); } } threadgroup_barrier(mem_flags::mem_threadgroup); @@ -1005,11 +1005,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1848 = alloc_cmd(param_29, param_30, param_31, v_260, v_260BufferSize); + bool _1849 = alloc_cmd(param_29, param_30, param_31, v_260, v_260BufferSize); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1848) + if (!_1849) { break; } @@ -1032,11 +1032,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1889 = alloc_cmd(param_39, param_40, param_41, v_260, v_260BufferSize); + bool _1890 = alloc_cmd(param_39, param_40, param_41, v_260, v_260BufferSize); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1889) + if (!_1890) { break; } @@ -1063,11 +1063,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1953 = alloc_cmd(param_49, param_50, param_51, v_260, v_260BufferSize); + bool _1954 = alloc_cmd(param_49, param_50, param_51, v_260, v_260BufferSize); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1953) + if (!_1954) { break; } @@ -1097,11 +1097,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _2059 = alloc_cmd(param_59, param_60, param_61, v_260, v_260BufferSize); + bool _2060 = alloc_cmd(param_59, param_60, param_61, v_260, v_260BufferSize); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_2059) + if (!_2060) { break; } @@ -1123,17 +1123,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } case 5u: { - bool _2112 = tile_1.tile.offset == 0u; - bool _2118; - if (_2112) + bool _2113 = tile_1.tile.offset == 0u; + bool _2119; + if (_2113) { - _2118 = tile_1.backdrop == 0; + _2119 = tile_1.backdrop == 0; } else { - _2118 = _2112; + _2119 = _2113; } - if (_2118) + if (_2119) { clip_zero_depth = clip_depth + 1u; } @@ -1142,11 +1142,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_69 = cmd_alloc; CmdRef param_70 = cmd_ref; uint param_71 = cmd_limit; - bool _2130 = alloc_cmd(param_69, param_70, param_71, v_260, v_260BufferSize); + bool _2131 = alloc_cmd(param_69, param_70, param_71, v_260, v_260BufferSize); cmd_alloc = param_69; cmd_ref = param_70; cmd_limit = param_71; - if (!_2130) + if (!_2131) { break; } @@ -1164,11 +1164,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; uint param_76 = cmd_limit; - bool _2158 = alloc_cmd(param_74, param_75, param_76, v_260, v_260BufferSize); + bool _2159 = alloc_cmd(param_74, param_75, param_76, v_260, v_260BufferSize); cmd_alloc = param_74; cmd_ref = param_75; cmd_limit = param_76; - if (!_2158) + if (!_2159) { break; } @@ -1216,17 +1216,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M break; } } - bool _2228 = (bin_tile_x + tile_x) < _1005.conf.width_in_tiles; - bool _2237; - if (_2228) + bool _2229 = (bin_tile_x + tile_x) < _1005.conf.width_in_tiles; + bool _2238; + if (_2229) { - _2237 = (bin_tile_y + tile_y) < _1005.conf.height_in_tiles; + _2238 = (bin_tile_y + tile_y) < _1005.conf.height_in_tiles; } else { - _2237 = _2228; + _2238 = _2229; } - if (_2237) + if (_2238) { Alloc param_84 = cmd_alloc; CmdRef param_85 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.spv b/piet-gpu/shader/gen/coarse.spv index 6d33ee70c7b65cf2d8b8fef43e5b5ea63b20cbdf..56a87e5310cbe190f85e0e22531ab599ed276b46 100644 GIT binary patch delta 13021 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 delta 13014 zcmZ9S3A|QS^@cZaFW{6GI7KO1=78pyNzOx{Igy%{Lv-a{6$M1#FDlwWMI0)po2EI> z^MI&0qd1mj<=@IO8?CI=v=pbN=lSmUUJvK{aqfQKwbov1?REBE=NowQ=|L|&J!rW> z13xjOlmTVwGPFD~Z@Fr{wQd?*O3$S6(kX?G zB0YHGjLBV7wHjPrY+3b8?wK-U{Is4!#!oy(d1ra4ChwDVlvj{-PwSdFqw7#CI?7`B zjER%_Bfbrv+BL0fayx@}8+@rDWwj*?mS!0rOc-32?d=-1@~R(3I(MSeuo-=A#H3DsSw@D5vBgGT@65aqjY2uWgnG?Hb9M(=?6J#Iw?$UVmum1~OY*9$xTK)0+~BJ=_{ZTBr*!vluv!VP0p}2HoISEO zJR99pwP|DiXO`eqNBQg$f{wCVgYVJc;~ISb20yUD4{Pwl>%1bvNp%5yW`iHw;IkV1 zga)4tKX_8l6i#)kLUSAX(`tMzOLRs}Ab+^Q7tMcU!&3(hczpgYn=V+Ux`j4064#@! z1eSUHS-r;3V}}ffk3|0rn198awKDv9h;s(E^)Iyb$HL?9ePkQ8^`9aW=g(>D_blZj z7jb zSHf-5;r82NmyW;*+ts)e?9$O&0lIWQH=s>AdPkddxc+R?;rg>lhxZV_*rg+I!T~kz z1iN(fj^k@wdz*Ch+S{bVP1q(KZo)R{@ajkecIgOoXqOJxp(C}0u0NY}xb`;baP4iQz+AbXf1KOp-4QQ7Rp9{B1hih+> z4%gl$9qwq84%gl$EwAhjPOwYY4eZk4>h03ujyCCV9onSBwYN!!TOpftxD~QV!}srR zPj=}T=+G`5u0y+Y_}Orqbh!35>2U2A&F|cG^$l0NkbZOl*Qx_c*@pLYCxS2R9ev!0 z>bsyrx!%LrYilY2Ef?`e-Az0!@L4VfD_d$nDc578>=L;0xAAxxqp$bSDZi9U**kP~ z@%H#xz}(Bh##;_dtg4J*(iI3)+}I9wC0JP!GT2q{6S%H!+guISPWih8NifH^sDX2? z0h{0)F6~Xk1**FieBxjpQP;K|UWdR5Dy-22#_M{Inl+-j9wc*}H!}Kioyu?EQsz3v zso%}u)wt&3ouS;yA7wr#_3m>?S?q5IYyV{1{tmD*o}*QHtSy|6U?_!CsS_V&%Hrfs zu#Us;0w2INr#=5}u(H>AKE`GNd~dGVZJT?*+9}_j)TeNd%Ds>yI!ZBs2AO;x*d*Sd z;0)z{{%C8G?iBUjoK(nBzAB>?bBwPCz{9zc$b(>I9m^8f)vA23cf}Ldt{wvEK2slt z55=l4-%=ido38suUF;Tt)#+^^qug{JWi%bf#oXA(8K2C( zqlh2la-xpJ3Hm*-!Lqr(4_4*^+)+OO`*KIAdzwp`e#G(fL$C{s9&%Tv@900yxQ5Du2nP&}_wK>phbzm#2)53G{2Q$>&V`2CU438JpjN zO=j6LxQrp{@4ytf?81evD#vrLkd@!_M`iZxAHX_P?kZnoR2Ij71S_)}PN7170&m_~ zit^a}8LZs-FEPradl|fNFbDFa_G$eK0)-y982za5II?3MxV%BYPxZ5CszJc%s_-jT$% z_U#(F@*xCnl&ofX_#G?)4+ zlUIbO)UltK`R zBWSN*AMES>vV2i4-wFOH#^EHoHsi0T%sPxaBVU)1y!Fh(S}% z4Z$g=x+Jm@Se;#y&+27kurib0fKjfkM|4y0+EhZ_CSbX`E6{xgycxPmIZ^z zGYb5?V(U;p=`5|1&+{WU1C6p(?MDR$iY?Q;nX&UPKyUP&} zmFXIjz{*U_EiBJ!r+`!5$zXX_I~APr9toDK8%y%jz&R>Mf#t2Ii)Up9#6Sj|&M41W z`9H8{#b7#hvNj2NbX%Sh%hh>Hj{(<@%CYbq6?9d<;c+NbX4B0A&*aLclWP;l$Ac|x zHtq>vWxhE~xxWrixz%TG1y*-_;maUbKO3UZ;C@wcBG};hv?13f4o(8sgP#mnR)3Js zfhV~7%smCHu63)~e`PL2VS=9uHn`6}ODfkU4o(BtgP#spR)5%^0Z(xCnfnc}y6m&+ zn-GNw{w=VsGOS{!P!0P`rFh^5S7_JH-nX# znB7C3)!qtDd2a#Bv)bFiDerAyxw^3=e+M{iY93hL-=^+_7|4M08RcnHcY$qF2GgmN zwMo#s+wzoHuFhL}4|oJuDsV42Z3^87ZR$Q0DzoYC2QT2trju(E#}9z(hxI|YvU;0( z2%d7Q&)kJzbz9q}%<^GK-Pt2>W%ahR2p(tZm3m1RFqkR`(~c@~rO9 zU{{wXja-}fd>NdCDtG^15Gb5mTisvbNl1Mr{|&4zjp`M!GK2eoe-&)-VJynZ%C*V- z*T4x*?5g}7fx>fY!C!|bxcW?f1FSB={{dE(;Qs_0ycb^vmuusEpRsR&(>dP+zcplh zpYjTnZzD+STnv^w@i=tvf_1FZcNpdQDDWQmDQtA;JoP5TQ2y0=#{L`lFRnae{{vR` zK36RN3pRS%om{*6lVx3aN-=;>q}DM_U?4mtQy05IL#eUK)T{%Hu(gy8a3D{827^j=tAXVSxExq}bq1Cv z;D^BaQDzMuAKc=4d6g%z;owxlA1vibY$b3i;g6Sc zbz_OM3OLVLf5?>gKVv@%vE*j$ubT2aV@H5}#u`kgPSz$tKh~C~8gg}>-_^h)YI|XI zc%HH7K6u8CM4?hA{){S*lQqFQ$tL{-Tv`2j`bl^ktIyoE!0Pnt&$068*75!;e2g<; zw(Ek|;W~>B;iepeY(2R0N3oHQ0xQ!dj@F0kCv!FcE6bcugOxeQb~y(>8^T9b{84Fk zYcnd0(~ZDZLhgi(!P@BH6!<1!ZIo+c7ugJ)z2R@ma&?}P&E;%JWBEI?y!AzsKQikq zU1JOIGfdEdhU(J`MuT-?FG!-FL#8~pXG^fMC-@OA^R|L#o(agYtCra1>$NuuL)iuc zcdLQw!L~)NE?=>42UeD^*mnT?^6jv??YWeBs>CMb&$K&&7yCm)`*+&bz1<0+ia7r~ zSeXfU9OK9_Kf#Ux8_49fH;CtZXGUKpqRm*YUAas|+^U}Ee-{ZQP5Hh6SLW`vRQ{l# z%mj3*10Cg_?+(sA-wiC!J>L_Yd%g!)p4;|CaFy0L4x%8faWAl)QHM@cpMZOVmA5u6 z$;lINAF%f73@lH;FM;)=&baWZq&4n~!l0J!%Z$D(o$~#-l(}+oy)!CLVh4aziT%Oy zBz6!ul{gSAA6Ecjt6JgW))vUraZT+3#_c~ZExSR^UE0Z*kQrtFL?%8!ky5(w?7R%?^bttIt=KN=*b?sn+>F45A>V zIs%+h9S)W!&}4A-%p|Zpdu9sQJ)=M8sZYQo!OF8|(ljPrL4B%5X?Sgz8Rc^o*EI2J5dHx}LT;5<%e zf#oK70^`wKd3t^w?9)@<`p{OJRt(R7)mCKna+N-iP6XEL|~QZ-Af2-uc?8&nfyQ zIHw^=eG3`#s(;6yi9lifJLt1&6AdcYu6{4q=M>2OY1MmuF8T!N1?Tsn^TEE}=gqHj zc_;D9w*meDbRMG)t(c@^8AMbM|u7u z$>Y5nPaRQR#jI@!mHJ!_SJr{dRMja@(!fX%Jk3Sha8KiVjd&Gjm<3BLh8 zpl{B;tw}c`&`8B~ZAUkWxzt(LTNr&=S9LdYDYLF(mv#_N<+t?Sb@{03Hl+T)oP@m{ zJ{+E<&Vy^CJRfxK0Kdwc9^WqbMQ-NKN3QPnc6N7yov+;N?q>95cIxi(U??;lNWY^6 z;1y~~-2-2xmejp)ZImae`@l)ckKIY?e&p(s)B|AWD}T3C1N##&k-XV?5Nw9l$_Xat z3KlYE1=>8srOXA04Qi`-1e{j$Fj%h6R`V!0t!B~s5C#5x?-Tkl@U@IiTEyiIOMr#* KPrver9sdW4cEV`@ diff --git a/piet-gpu/shader/gen/kernel4.dxil b/piet-gpu/shader/gen/kernel4.dxil index da6c56306152a11db46427763591ff31027185e4..0322bf6b4ee86dece87a7ae16e94f5527a4fa1fd 100644 GIT binary patch delta 9293 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 TPWPvT?fN3^RS^Z%asK;X0)&sx delta 10687 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 diff --git a/piet-gpu/shader/gen/kernel4.hlsl b/piet-gpu/shader/gen/kernel4.hlsl index 5d6f83942..4839db2bb 100644 --- a/piet-gpu/shader/gen/kernel4.hlsl +++ b/piet-gpu/shader/gen/kernel4.hlsl @@ -162,7 +162,7 @@ struct Config static const uint3 gl_WorkGroupSize = uint3(8u, 4u, 1u); RWByteAddressBuffer _297 : register(u0, space0); -ByteAddressBuffer _1749 : register(t1, space0); +ByteAddressBuffer _1681 : register(t1, space0); RWTexture2D image_atlas : register(u3, space0); RWTexture2D gradients : register(u4, space0); RWTexture2D image : register(u2, space0); @@ -347,10 +347,7 @@ CmdColor Cmd_Color_read(Alloc a, CmdRef ref) float3 fromsRGB(float3 srgb) { - bool3 cutoff = bool3(srgb.x >= 0.040449999272823333740234375f.xxx.x, srgb.y >= 0.040449999272823333740234375f.xxx.y, srgb.z >= 0.040449999272823333740234375f.xxx.z); - float3 below = srgb / 12.9200000762939453125f.xxx; - float3 above = pow((srgb + 0.054999999701976776123046875f.xxx) / 1.05499994754791259765625f.xxx, 2.400000095367431640625f.xxx); - return float3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z); + return srgb; } float4 unpacksRGB(uint srgba) @@ -477,10 +474,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 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1653 = fromsRGB(param_1); + fg_rgba.x = _1653.x; + fg_rgba.y = _1653.y; + fg_rgba.z = _1653.z; rgba[i] = fg_rgba; } spvReturnValue = rgba; @@ -488,10 +485,7 @@ void fillImage(out float4 spvReturnValue[8], uint2 xy, CmdImage cmd_img) float3 tosRGB(float3 rgb) { - bool3 cutoff = bool3(rgb.x >= 0.003130800090730190277099609375f.xxx.x, rgb.y >= 0.003130800090730190277099609375f.xxx.y, rgb.z >= 0.003130800090730190277099609375f.xxx.z); - float3 below = 12.9200000762939453125f.xxx * rgb; - float3 above = (1.05499994754791259765625f.xxx * pow(rgb, 0.416660010814666748046875f.xxx)) - 0.054999999701976776123046875f.xxx; - return float3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z); + return rgb; } uint packsRGB(inout float4 rgba) @@ -529,7 +523,10 @@ float3 hard_light(float3 cb, float3 cs) { float3 param = cb; float3 param_1 = (cs * 2.0f) - 1.0f.xxx; - return lerp(screen(param, param_1), (cb * 2.0f) * cs, float3(bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z))); + float3 _889 = screen(param, param_1); + float3 _893 = (cb * 2.0f) * cs; + bool3 _898 = bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z); + return float3(_898.x ? _893.x : _889.x, _898.y ? _893.y : _889.y, _898.z ? _893.z : _889.z); } float color_dodge(float cb, float cs) @@ -572,8 +569,14 @@ float color_burn(float cb, float cs) float3 soft_light(float3 cb, float3 cs) { - float3 d = lerp(sqrt(cb), ((((cb * 16.0f) - 12.0f.xxx) * cb) + 4.0f.xxx) * cb, float3(bool3(cb.x <= 0.25f.xxx.x, cb.y <= 0.25f.xxx.y, cb.z <= 0.25f.xxx.z))); - return lerp(cb + (((cs * 2.0f) - 1.0f.xxx) * (d - cb)), cb - (((1.0f.xxx - (cs * 2.0f)) * cb) * (1.0f.xxx - cb)), float3(bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z))); + float3 _904 = sqrt(cb); + float3 _917 = ((((cb * 16.0f) - 12.0f.xxx) * cb) + 4.0f.xxx) * cb; + bool3 _921 = bool3(cb.x <= 0.25f.xxx.x, cb.y <= 0.25f.xxx.y, cb.z <= 0.25f.xxx.z); + float3 d = float3(_921.x ? _917.x : _904.x, _921.y ? _917.y : _904.y, _921.z ? _917.z : _904.z); + float3 _932 = cb + (((cs * 2.0f) - 1.0f.xxx) * (d - cb)); + float3 _942 = cb - (((1.0f.xxx - (cs * 2.0f)) * cb) * (1.0f.xxx - cb)); + bool3 _944 = bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z); + return float3(_944.x ? _942.x : _932.x, _944.y ? _942.y : _932.y, _944.z ? _942.z : _932.z); } float sat(float3 c) @@ -706,8 +709,8 @@ float3 set_lum(float3 c, float l) { float3 param = c; float3 param_1 = c + (l - lum(param)).xxx; - float3 _1052 = clip_color(param_1); - return _1052; + float3 _1048 = clip_color(param_1); + return _1048; } float3 mix_blend(float3 cb, float3 cs, uint mode) @@ -795,9 +798,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 _1343 = set_sat(param_21, param_22); + float3 _1340 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1343; + float3 param_24 = _1340; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -807,9 +810,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 _1357 = set_sat(param_27, param_28); + float3 _1354 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1357; + float3 param_30 = _1354; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -918,12 +921,6 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) break; } case 13u: - { - 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 min(1.0f.xxxx, float4((cs * as) + (cb * ab), as + ab)); } @@ -940,7 +937,7 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) float4 mix_blend_compose(float4 backdrop, float4 src, uint mode) { - if (mode == 3u) + if ((mode & 32767u) == 3u) { return (backdrop * (1.0f - src.w)) + src; } @@ -949,12 +946,12 @@ float4 mix_blend_compose(float4 backdrop, float4 src, uint mode) 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; + float3 param = cb; + float3 param_1 = cs; 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; + uint comp_mode = mode & 255u; if (comp_mode == 3u) { float3 co = lerp(backdrop.xyz, cs, src.w.xxx); @@ -992,16 +989,16 @@ CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) void comp_main() { - uint tile_ix = (gl_WorkGroupID.y * _1749.Load(8)) + gl_WorkGroupID.x; - Alloc _1764; - _1764.offset = _1749.Load(24); + uint tile_ix = (gl_WorkGroupID.y * _1681.Load(8)) + gl_WorkGroupID.x; + Alloc _1696; + _1696.offset = _1681.Load(24); Alloc param; - param.offset = _1764.offset; + param.offset = _1696.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1773 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1773; + CmdRef _1705 = { cmd_alloc.offset }; + CmdRef cmd_ref = _1705; 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]; @@ -1035,8 +1032,8 @@ void comp_main() { df[k] = 1000000000.0f; } - TileSegRef _1867 = { stroke.tile_ref }; - tile_seg_ref = _1867; + TileSegRef _1800 = { stroke.tile_ref }; + tile_seg_ref = _1800; do { uint param_7 = tile_seg_ref.offset; @@ -1072,8 +1069,8 @@ void comp_main() { area[k_3] = float(fill.backdrop); } - TileSegRef _1987 = { fill.tile_ref }; - tile_seg_ref = _1987; + TileSegRef _1920 = { fill.tile_ref }; + tile_seg_ref = _1920; do { uint param_15 = tile_seg_ref.offset; @@ -1162,10 +1159,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 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2254 = fromsRGB(param_29); + fg_rgba.x = _2254.x; + fg_rgba.y = _2254.y; + fg_rgba.z = _2254.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; } @@ -1188,10 +1185,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 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2364 = fromsRGB(param_33); + fg_rgba_1.x = _2364.x; + fg_rgba_1.y = _2364.y; + fg_rgba_1.z = _2364.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; } @@ -1205,9 +1202,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 _2474[8]; - fillImage(_2474, param_36, param_37); - float4 img[8] = _2474; + float4 _2407[8]; + fillImage(_2407, param_36, param_37); + float4 img[8] = _2407; for (uint k_11 = 0u; k_11 < 8u; k_11++) { float4 fg_k_3 = img[k_11] * area[k_11]; @@ -1222,8 +1219,8 @@ void comp_main() { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; + uint _2470 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2470; rgba[k_12] = 0.0f.xxxx; } clip_depth++; @@ -1256,8 +1253,8 @@ void comp_main() { Alloc param_45 = cmd_alloc; CmdRef param_46 = cmd_ref; - CmdRef _2615 = { Cmd_Jump_read(param_45, param_46).new_ref }; - cmd_ref = _2615; + CmdRef _2548 = { Cmd_Jump_read(param_45, param_46).new_ref }; + cmd_ref = _2548; cmd_alloc.offset = cmd_ref.offset; break; } diff --git a/piet-gpu/shader/gen/kernel4.msl b/piet-gpu/shader/gen/kernel4.msl index 796043bc2..4caeaf066 100644 --- a/piet-gpu/shader/gen/kernel4.msl +++ b/piet-gpu/shader/gen/kernel4.msl @@ -393,10 +393,7 @@ CmdColor Cmd_Color_read(thread const Alloc& a, thread const CmdRef& ref, device static inline __attribute__((always_inline)) float3 fromsRGB(thread const float3& srgb) { - bool3 cutoff = srgb >= float3(0.040449999272823333740234375); - float3 below = srgb / float3(12.9200000762939453125); - float3 above = pow((srgb + float3(0.054999999701976776123046875)) / float3(1.05499994754791259765625), float3(2.400000095367431640625)); - return select(below, above, cutoff); + return srgb; } static inline __attribute__((always_inline)) @@ -528,10 +525,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 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1653 = fromsRGB(param_1); + fg_rgba.x = _1653.x; + fg_rgba.y = _1653.y; + fg_rgba.z = _1653.z; rgba[i] = fg_rgba; } return rgba; @@ -540,10 +537,7 @@ spvUnsafeArray fillImage(thread const uint2& xy, thread const CmdImag static inline __attribute__((always_inline)) float3 tosRGB(thread const float3& rgb) { - bool3 cutoff = rgb >= float3(0.003130800090730190277099609375); - float3 below = float3(12.9200000762939453125) * rgb; - float3 above = (float3(1.05499994754791259765625) * pow(rgb, float3(0.416660010814666748046875))) - float3(0.054999999701976776123046875); - return select(below, above, cutoff); + return rgb; } static inline __attribute__((always_inline)) @@ -585,7 +579,7 @@ float3 hard_light(thread const float3& cb, thread const float3& cs) { float3 param = cb; float3 param_1 = (cs * 2.0) - float3(1.0); - return mix(screen(param, param_1), (cb * 2.0) * cs, float3(cs <= float3(0.5))); + return select(screen(param, param_1), (cb * 2.0) * cs, cs <= float3(0.5)); } static inline __attribute__((always_inline)) @@ -631,8 +625,8 @@ float color_burn(thread const float& cb, thread const float& cs) static inline __attribute__((always_inline)) float3 soft_light(thread const float3& cb, thread const float3& cs) { - float3 d = mix(sqrt(cb), ((((cb * 16.0) - float3(12.0)) * cb) + float3(4.0)) * cb, float3(cb <= float3(0.25))); - return mix(cb + (((cs * 2.0) - float3(1.0)) * (d - cb)), cb - (((float3(1.0) - (cs * 2.0)) * cb) * (float3(1.0) - cb)), float3(cs <= float3(0.5))); + float3 d = select(sqrt(cb), ((((cb * 16.0) - float3(12.0)) * cb) + float3(4.0)) * cb, cb <= float3(0.25)); + return select(cb + (((cs * 2.0) - float3(1.0)) * (d - cb)), cb - (((float3(1.0) - (cs * 2.0)) * cb) * (float3(1.0) - cb)), cs <= float3(0.5)); } static inline __attribute__((always_inline)) @@ -771,8 +765,8 @@ float3 set_lum(thread const float3& c, thread const float& l) { float3 param = c; float3 param_1 = c + float3(l - lum(param)); - float3 _1052 = clip_color(param_1); - return _1052; + float3 _1048 = clip_color(param_1); + return _1048; } static inline __attribute__((always_inline)) @@ -861,9 +855,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 _1343 = set_sat(param_21, param_22); + float3 _1340 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1343; + float3 param_24 = _1340; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -873,9 +867,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 _1357 = set_sat(param_27, param_28); + float3 _1354 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1357; + float3 param_30 = _1354; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -985,12 +979,6 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons break; } case 13u: - { - 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 fast::min(float4(1.0), float4((cs * as) + (cb * ab), as + ab)); } @@ -1008,7 +996,7 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons static inline __attribute__((always_inline)) float4 mix_blend_compose(thread const float4& backdrop, thread const float4& src, thread const uint& mode) { - if (mode == 3u) + if ((mode & 32767u) == 3u) { return (backdrop * (1.0 - src.w)) + src; } @@ -1017,12 +1005,12 @@ float4 mix_blend_compose(thread const float4& backdrop, thread const float4& src 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; + float3 param = cb; + float3 param_1 = cs; 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; + uint comp_mode = mode & 255u; if (comp_mode == 3u) { float3 co = mix(backdrop.xyz, cs, float3(src.w)); @@ -1059,11 +1047,11 @@ CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Me return CmdJump_read(param, param_1, v_297); } -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]]) +kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1681 [[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 * _1749.conf.width_in_tiles) + gl_WorkGroupID.x; + uint tile_ix = (gl_WorkGroupID.y * _1681.conf.width_in_tiles) + gl_WorkGroupID.x; Alloc param; - param.offset = _1749.conf.ptcl_alloc.offset; + param.offset = _1681.conf.ptcl_alloc.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); @@ -1226,10 +1214,10 @@ kernel void main0(device Memory& v_297 [[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 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2254 = fromsRGB(param_29); + fg_rgba.x = _2254.x; + fg_rgba.y = _2254.y; + fg_rgba.z = _2254.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; } @@ -1252,10 +1240,10 @@ kernel void main0(device Memory& v_297 [[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 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2364 = fromsRGB(param_33); + fg_rgba_1.x = _2364.x; + fg_rgba_1.y = _2364.y; + fg_rgba_1.z = _2364.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; } @@ -1285,8 +1273,8 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; + uint _2470 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2470; rgba[k_12] = float4(0.0); } clip_depth++; diff --git a/piet-gpu/shader/gen/kernel4.spv b/piet-gpu/shader/gen/kernel4.spv index b145245533171d27c8272c481f98a9d7bfa57cfc..f0e29634b2b9d08bc0070eb64f30f96acb59c5d6 100644 GIT binary patch literal 64668 zcmbWA2Y_8w`Rz}bnGhf}=}K?Xl_I^Dgc2YWK@c1!m4P%;ARsM(AXPv>s?r4%q$?n( zfFe>9kY1!omtLg5-|ybDl0E0W_xJgZZuVO1`}X(kcFMhHX3{a!QZrXoziQTMK=svG ztJX1hH4{oz%~thq)q{uZG-Q=YlSizw#<#wy!yHvd%TJ#Q2hop5Ad9j_qGn zzo5)Td-b^~11MtKbnw5KsBedKl6mlu?!nt{KX}L%-NPqL=$h8Xd-ory-+;oeciiwXQ$~~yU3ipzkUN}B#*7(1oVq`~tcO>PA2n*y$jKGT%=Evi z#*I9nyGOs}rmVUi{~xyMde}Ovf!JpFc2={)C-ojgZ*1GiJTT^wW4p)iE1$KR4?cPP zl;L}Kqb@gT^28~_C$HSElNG3Kb_TL@EPOoUo8pWZ0v}gCQlr{ z@5miTj)J!4SKVVq+pcOE_;g=zfBvWDF}at8o|yJ+-Tkq5&zMo&2lS4ZytjRuyILM? zdJG!$jQHOtx1R0kZgi_P>E>~KU#D)5ucKNHY}zjVw<4HEgL=n|X^q5vqUJGU9G%rF z@Y=662DwLb4C;**eDgmz!oMT_r$>})dEy>+hFrhWRlj`3S_ z-M?DD9d}6YxWN;9Mzp58)n9dwvcDU`=|kHR!if8;J(@vJ|o9}9BJJb`dy55V`5~in}9Rc&D*he>>1H_tm+=+Shs}JkJ`80 zUp0>zW9_We9P8Mg$*pn99p}_B2pnE*)g0$=Hc7bG#ffy%xzXMwrvp^2c^E=HBmaM# zhZ$ok=3#4MWFEEwx96d&+O8dYtFb+!TbBy^pypA|!47cx(DKu!pPI*vIcRIn!Hl+Z zRo{lE?SJfjdQ$X#C)%g)JA>2rUE6Ut88cz;9#*~8CpC{5`Mav!;N)-lX|wNY9z8au z_8PD!b^QKgKa;iS=XZ_Qiq%o=L7lzU-HyA(xDlI;>78It+kH^?DEn%A`cV6}{nR{$ zjTt#^1hwaeH@O*p|FO3-au@yezMK9UH}g8W9ee93W80l|zSKNs^tH3HqhTt@Sygh-O_s z#yqBo`NQck=c-PsW7Ze?{~~I8PERP}o>;{FaUHk5aQ@eEPbuP_Iz8^3)tPnN)+Oz~ zi0WFMQN;Yo^q6y1=hZRm6Z*f1+Ma`Rin!-ak2_~|VI9|V@V^OaU(YXMUNAjoS9LLX zXPzN<8aaCUd8+17o~M_>YroccDfbvZv3IneSUgwNJXiPU1BcH+(Y(JN*gbN@XfBA+ zyuXecIkk1q^}2oqypI1r4{b(g`&@%AqkYcB%fapQyMJ{Jc+&8RBS(%~ZvRoMuV-nU z6Td1~EhnK*8GlUAOa ziZ(YFZGH#dyJzAEKBSG_dvf2t-CDG{t!Q%xc+&V$lmAa`{!p~JeR`X&>Mq;#v=abZ zefpF37VfJ4LOo{6*j5LCE&JWnZF~Rfeld5%_Oor<&HZ#=;qwrf4};x_OrvghOTOs>WSK)es%Yb8#i)dJ!LcIy0d!3wqx6$h5elPXq$TrBt~cTSc~^~32x)t(mDQ0}Gd(L+CUU^>J+AE#a z3$`0S!rMG~XRY3l6KDANu@lBm8aX{udt5W(y^LSty&`VK>!@A@_tbe_6W4iO2bX!? zlc&E$wl&z^YxvS&OIC#?;>-+&4 zpKb8(UwsT7HF5md86M{8tp1HYNhc2dKBt~CZUUd)TAr;A>GxUf*FI1AUZh`DP4}|v zt@fR*i-@16pv0TG>W|;>y{C-Zx4V5s@+*e6t)uF~*4y$MSj`C@#eKYWEnjZ`DXXnF z;}dO5Xn038H@v46x3l^hctX#_9-ou+U8E21 zsFs26U)#P8-ge~J@e_&b=R>(i>pPD6JCo>|)JIO7=;adcu9p8yZM_x4zARtI5U&I7 zW!Kw}4Zst74)9}bi*F1s`?+a@Z{GG_HU3*R>|6KY9o4pQwji-Ps$Id!`(1FE_j`TX zbyj;d_^`JB^t>Y*_R)QKN3{<;c_)LDcPhBd`~5!cI;%ta@Q&(mc;XxlPMqVwWtY;WA8h+iAJ@YT`=bs1c-w!C z%)`?S`#&1|xwike;{VTv{pALKwe7!V{QuRkzt!OHwEfqL{|62GM-BdQ+kfr&f7Y;n z(cpgZzLpijHbYNH0< zr0qX_pKRW+59-4^sx9HkyBj!p_XL-D_v+KGvl`ZicT^+ci8BVAI1|8SoJoD!byidQ z@Q!LKJaG;MC(aSzGR_bBwCk*n>BBp!a;#>I;%4p z{Ne_`w85`x@T(jAHw}JsgWulZcQ*LF4Ss)vKhofjHTbg){(OVK*5Ge6`1=k1VISU6 zeFD$=d;u=kr(Z|k^P{7|yWsdw-=_l__E{TzVB3HC^=!_DeeMRIr|rLb&e!=H_5~aK zt8M@3*Rw?$_Qe`}iMIdr>)Fx``?7sF&js-Ie(bFF?_=w%ruN|-)zNStp1qgf1s+x7 z2f#z>>&b(SHV?!3XxD1<4A_TluRC+|h*n;w7HIHw8hrf*->AViZSb8Me3u5_t-<$b z@KFuk+u&mwe0+l+-rz?z_|Xl1Y=fWO;O8~?`3-(igJ0R;S2y@|4Sr)E-cj8SA6Bo` z6Mbx*)l&`rY=b}F;BPkgI}QFpga5n1KWp$W8@#Kl?_L_v-~$_c&IX^S!RK%Ag&Ta) z24Awlmu~Pi8+@GxU$4P8Xz-02e3J&>yuk-I_*M}L z8@#&@@2K{MkLqb(BYMSbJg*T~f_o-)YijXpo$FH;67d~oqck3gy^F7XXzD(-wnLLIs8EiAL(dH2NjL+bm)zR?D zzH8>@?3(!V38Tk!?>c_szJn)@pE6;q&D*(8L@$3{K<-g~mv|D|X5+_=>TP}J-@lT3 zjO!jbX5`qB<0iB2enwXB*U~5SOx}CaNZe6pZs{|DTd%kI2C3VQwc508+^VX*NBX_m z3}fPP`Du@%{^5b>EOj-EQ2CjH=yq+wlrt0d<=;-3;N`V zJ>w?ThQyk+j@3PE*!Zc_Z39~4oDJIu9%{ypA2+^tL?X_ZpMlt0-_K1SPkRn#k3OuI zldAm#9R2zE59f4_*d|TpJDON$%;BGwl+^oa~93r*5++#j%Y@I=0j`GTXvDQ_E_e}=KJXOUMTJDJ}rRV3_h#Jnt5Na zwz0GRH`_wk9OwV3-B)Ydh@QzkY3OunG6G3KS#v5I%NFto-tdE+n;K3 z@Az?^vF-lc-12YZTfyyXN@w*)@QiCfS9K4(wbw?BoY4NclFsU0wAOc9yaaS?kHDET zFyGmN%W*v3;BUeChK?VAv2ADdcEkQ|AKp=Y0QX&^dA5mCKu94sC{Nf z_o`v+Il*OLzS7|HH2C}tzCa(|RecrS`Z)+*b|l{-Xzl)WR?C1#@GWrL)>*C8r+r7Y z8r+v3j%B-|-7erBemp1bdf|Sj8NLs^9LJbGyrUWq&m8>#obeys$FH+Gw!x2U@Dm&S zq&}QI49{540*^hg+pkhvbA3)9-_GiMIG37<8Sf=<-;%p7SAY-ThZDvh(4LE%;qki@ zJe3*L@9*N`eZbQ#KI8lU7vOoecnR#HIJd8YN7VQYaGoy~=OUeXT5~$?tOkQ;{Ja4_ z3j#0ad+R=&??{Wbdx6XQcTXQ*?#q36M>PsQYIJ*iqZ_t;;hEn_Ex&GQYfQ((*?X;d zIiXLx&g!H-oOOa{{O5z)F}teE!0qqUTg%ppb$Oq*Jj20RSDUx;-U82Oz}vy)GsPY7 z(Gz<{^tNx`t$6pKm2>xSyUp}*ya}gC%lEB@?>l{XNA*5D^YIzD+;3kreCOdt>)Qj@ ze?jo@8ZQRU-dYiyv8)Q7F_zA19eCOA&D!?5-(A%na(`aHmj$i4>8$o_wCV1{JE~#u z_PYi4K_6RZHL?%qnHrw4P5{%l>2r46bX!MtD!9G2UDes(_VaJ+rrw&w&e#zK`-4%=K$oFt;pF#m|qm-}7i&%Kvagvx!>i=d-RF z+q{*-cS>Yx#r56Ll3)+>$d_o-mhXxt<*;w76xh!i(fyneyk>#dD)8C`Ubn#O6?pvu zZ&2V33+!i@D^QeZz@#s9DZA2}U!e+JKnlh2y&jeL%BA9$$w zEbr0O*aCg_kbdPJN?XTeTR%fYbKj}?oFC24Mr!jGnyJ;CgZOcKZD|V^ntN8i#S4v7 zv!yLvXnqFLZ@EHq{Aw!|ntfIC9Z2%}Sx0S+Li00@+S-NY=Nh&33(aw=ZCq%6j#1mZ z(ER+Owq>EY7u1FnnscN!w9x$gqPBCP`ME{yJB8+F6}3GI&G}W^tI+&xqBf$?+$U;# zw=~{i)_cP~Zpn2aJnI#18xQxcT1N|awmzej=YpSEJQv(sUT1y*cYVIr;vKEe3cywz zpUs0ebW?B`-)Gz4Jqz65O~Rqi`~_aIz$+DaoZgEx&>aZ!0Q*-XR7#bUf{t6-m<_$3cOu` zw=eL}0`E}Z9SiJpSn`f8u+Lf1Clz@A0v}M|?-%%x0v}r7!wP(Ofu|MtX9f0oEq(C0 zDfsUN_L(XAV+DS)z)uzU9|eAHI_|7|CMx%)+`Tyy#eFBw-V}SyQTJKNLp*zd=P2-; z1^!Bb=PB^K1)i_K^H0Z})k0veG3K6!p4qo0$m=yqJRfJ0mzu>X9*e`htXS0N#mnug z?$FicixR;!`YgeJ%^^=)eQo1?Kuy~c+;6=H*gm?N*KFg=(E3;2|7;V@80K`o+x_iq zU8~jA=Evr}aB<3_Gx2-@X*@M;Yt}Z~t_7CcRzL0DPt$e-ux-^AMfG<}v^ka(<7@=iW*plX zXLIVr*#c}FwFMZ%AZpup)_icy-3N=ZDqB+9RzGdA+s1rbQR`zqW1DX~>g3xVY(6#f zdH;64+VMMEzel03y76|T-hpB~+Zu0I>csQDZag(@yHTevyMyJn)la*>XOOmgfo-d% zt%q8hd52NUZMzpm`)KO4-5YFMHEq4M&9?i1<+jyN`*`ZKodCA2n)_zI+LqiC;cB+m z*O&)TXD>xN7%lrX+BCF`Ioi=^*-O!mN6Ws5b~0MlF52m6J5b8LoDI+1#P4Tl8MB&W zzL+{=z69);)!eU_QV*_+>!t2Ee@?B!|gy zoj%vsSlzM&K7Xt=+sN;wHfEc5RevjZyUoni!)Wf+#7XV-?b*WL80KGsbLJ)LK@>Gh z+Gw}0Z&Hi(G0s~xR*%j8eOl}7xSiFP@cy-r^VHF=&F!E5op80}8Bk+2^UhLp*LOv@ zv1UaZK)o=0Hn4qCa}Ebms~N|(wpkhbSHK?2vqH9Au(la*soJ&(wtO~UlvsYY)^1U^ zKg&_ucWvv{+|Su+$+bew^)tpwYw+YfIFY@|3ZKGLhQsb1aRH@QObj5r*(VX$C`vgU(ai~ z-|Kj|FAfH~FTA$6e#gKyGmMt~hY;hd+g|SXHfpv%uEtcY`;On?wDBUX?{36p(fF4XM1+|T%GncuVE{D1oVo+DxMZ2!~R*ZyYgekb7AvmRH$ zJ!iAlcfqs%slA?mj_z7{Jva6jaOYj!SgmzLSZ?2O+a>lKa6d1v#8qN2_1ED!*WxoA zZ6LP9coKf=T1S5?{5Chw;a_f+wf8f)N7}yvpSR$PwJUnOIQ-1z&PP{gI|5%f;X8-EvKKwTd+rAaUc>bJ* zwK08G@%?hi&nvjP@0Me?_T6&$1i0^(!@a-yZaLiRxbKd`t#2*3=a27@OZz z$EDr($Km$hcgW%P$9Kr#-bddmxcA%|Q04msR?=66-$mtgOLgnM7`9dfv} z?~zOHd*pD(<9p-J-y_HF^P2CG!>xUn9Par1 z&Mn;M3g0J(+dtnYhdW=sPY$>CeR8<-@q>b^`(8PAYu_t}J0HGR4mY3gmBXD6-z$e( z`(8QR@%wH$+}d}`;o8q{@Jkxp_sgZf@0UyNJLYib)A!6J_dRpTea~ES-!+%q_su2u zopZSL;#^Zo?z`u3pJROg9PWJi{yE(B@%?kSweO$9eJ9qx0n z@1(=+-|Ypz67F}YrQPpJ!+kFG9dx+;_dRsD{r5d|xV7)0!|ku{qQk9y7aeYYeHUGF z-$$2xv4T4u-%H2tc>Inv-0}E5Yq)m5M-BJ0kME|#9gpv&!yQj|!M#5FeQ4}n--j36 zc)pvC-P(84;pX>y({O9wPnXDbNh_pIU8zM~G;?)R-F_dRvVpDnn$@2O+A|GuXVxBtGU4!8C_b;*4< z9qxMjeXD#E?(#lQ9#8QZ)8~N=xW@yl6KZ`En4djQh5Ib$=U+dU#_z{y+KwU?RdpKw zv8{UIpAI&@pO4e-47mE?b-SN{ZL7W^Pa!^YsKx(muv+q*3s&>_(LVa@_%llS=yRrR zeU?1Gw(U^ox}etRZmW;Z#f4}-$2dOo%k>lcJYznw&obs*hZ*$I>Jsqc)V9@6yM8_+ zX>$&Y|8uaK@iV5&;Oax^r{9lV4py_h&q(sj;V;2H3zu_vC0so|zXCVs`D!%v%-c0! zpP|(=_t%1rr7f|p1Dmhh6W7Dl<8uSpe5KEgaP{Q-HQ0RW$@d$uv9t|kemaxY^;@u-zCJI?#Xc)KM<4SHdmGqiS?dpJ_j~F;P&~BXUfZp+ zCU=01aW(zovRmB=R`Z$p6Jp4JM=_SM#cBH|ux*_m&+|WneO6VsZ*o7cnA?8X-a75? z2HQUK^cS$2-{WL#YUSAMhc=&q9k;nXU+;r2Pi@=8zaLHgih68+1*_T4825tJjQ=-k z`)BRkJxKi!#Y6kwYrD1aovVkz#&Dj*4^V7p9I<|$Gmn8i7tHx6wOpI$z!PBizBZrB z^`{CczA5%P>pHFJLb>`<&urYEjeFj#`xg`IHVk~2e)7Htbt^3($ zo|)iZ!qx4YydTBf_QUqpY2Sg(_Boe2;c7XTw5i!XW3wOTL$3PsALpXHUeAoC?)Ca& zd|9wpSBq0GLGf^|maOg8S=*(+#>l=}8myLm zC0~qUEMtppJD8Zuf^TN7rqOTta&R@j>&aM_2RoLm#bEqafU6%_w_6cxTXn~@47FPN zxH8y2YV-58d>z_$a4}c~+@D%K_p@(+)zi;!f{mGet_oJuFZtBszdG1C4qpRo`_ss| zH2wb;SReKHtO+jLtX1>0SsSj8`VZ?k>wt}=Z6LeP*z1D5#`&&TyWhk4y{rB7y9Dj# zWZJ9sz|Kqf`Zag%JiXPxm520Q*- zm$n3}<+`Lz&GtDr+{fngyN#{D?#*lIs4*`_+ZwKJ{w`{{?Y-uh-`e(6)i(S`pX_bd zWC&dS7x;KR*%qwkIqE%8J_}_wit((?wHss#c8`M*tS`R?|{8t=lbJ%?uMp5jd96$2dnv=ZsL3wUdGu2?s}^0 zW4k@U>h2x+_rS(d&pFTy&N-kx=Ro?m7uqfq`|aGxZR6ZHPma$z{ptbRuk4dyV72TM zZECj9+&fQM=MiA<`{g>1L{m@9QDC*?ph z*cjPc`-9c8x8(a#jAd+b+8zM5t#jh{CsV=pEqlxNLF(h=b$)NuP?`g^Sp8#Sf1yV6Tm*N z*xq*9jd3EiHe+0j{YPN)YdeWrp68X5!9K6pMw>oApjH>3LY=*JD%i1GJNDD4Pp5b| z_A_d`b=K-9U}I!&oe5UU-je^AVk~2eZ9ABlXM=tINUU?=#8 z{1mJ{jlDUTcs~OhQ{5P6QLDL5K9^kpcI?>~gK2XiTs?id2yDCD8!rayqi)Resnz0t zDOfEzehxNA&X2+5xD2kIeqIi?ow_kEp;j}7_x)dhjhXKfJg0sMSC7w?VB3{GSHabX z5@#@Neg(FjdbF#-c{dpC8twISir4VLw7nKB*Kp(5PCxs51-16{GNl}dVKB%8@u%R3tT<-H)ZV`tl$+eKChI^vPU41h&8WId6ATt0l+7V6}3*kHFRA^Jwi;_Tw=$ z^*qZy4z?dY%i3OhY)=$6{X9SN%<~jn`;!#=_jhWw)^E0mUgd#wWZy^z~&2o6Rc18TQ&ay=a1Krx8eGz$LAfe{Rw}!=4taDTp#tU z*ZW{&X^YL2)2*f68|HxV@<4ogY{F7&&OcrKl~GL+2&KYKI-}G_!-z( z+MMGzsMUd`iuoi!Z?XWdD2#zJgMo171Yc5G5&)jr^ z&8ID~y1=`j*{_V#-z!ni{LKtjvwhkP0H>YflsJpE<$iSb+c;+gxbsnWwqIwo}h|zXDeG z{K~a$9=QGR^S}0d_Q~ANi)LT-OaA%5&XHqJet%C#J-HSDtJyy776hlAb1T=+xjmhD z&aHLkb|GxeZJw*Y3RlZ>wKg@|pIWy+joN&E-u@ak=jqydo-RgP7){;$UD)KdKdNqT zZF{O}5p4S8`OCFh6iq#!w-*Dexz^tI<yTutAos;~1OwLG`Vm!ufW*y6NZ4s6@-$Gw%ftH6zGe&;~0zhiW~_R~83`Ucp3X1%`&R?B*8Q!D4t@n*eN z1?Tf`Vy=d!o|vnH)rQlrv|9t7cJ@=QpLz1R+3)_f`STgBwYIguj=|b>T!(sHiih^~ zYP)s%vp(1uS;q~)YFS75+7x3MTb#BVf^D1m-3aXbs@pfY^KWkZVSDSe-xzHB%*7^P zwajlTHoP30{m49R3eG$w=4NQ>iMcsg&7Vo^snx~XQfKY913N#~uH8`T9Vj05YscDd zow4o&Hb&NNXRung<;>VCUP~{W6YvJjKItPN?nHnY;bK#>jq|2v*B}k&mSq z%h+Pu+ONrA`;u5wz{bkn*dOfPP}j%(a{yS~@6wGi6>J=J$1{mqEin%S8#DZ%nw!IS z;NOS)4qROyV;&4vPd^R;8}~x?L;7(jTs_Yshk?B=si$v;gN>yvv8REJHLdRd5n%n) z)2AcB_Q}3GCb@pDf$QNsT4zj0fgNM^?+?IgIVZHK**0# zKXa&_?+bqkR@eVBYI)Y?DzM|qy!;C6yp(HvHC#PD*MN;vuJN^S^{m5nVB4u@KCcIx zPg`Q$05)H_?l;2KZUWm*J^5}1n^T)(zmi%lWB)B!EuUd-1v7Q6 z&oJ7WpJ9H7rq6AZJkS0fY#WRAajdWJ2L1rnX5L$<<>np3;@=6rqvrbl5v-5n^;+>K zuya!0d+vg(A6&=(GgxgXZHCh3Zm@CG{Z|zRq5TDHE^YSXc4{^Iq5WR4+V<6e*6$YG z2UfFqI3|C7#kTjLX?LIbdr0?#Kc-gCI{g)FJokk^m*YA0H@LnY#?ePDZ5{yI#fxQo^>to*^2dn2^ z^90y9>h|klYPH0C5^T)yr)q8v?}Janz2~Uw;~G2zR!=|v0XFW1j4l0m7OtNA;B#Q_ zgX-zq^I&6XOY9fG#+pWcbG-=GPd$D5C)hsOcgG~x&+FF3)Lwh6Gp3iojxqPFm%(be z4{B4h{RPyv_ZntC_x7vc+|Ls8H8l0ad>yRz3MK8{0H>Y(lRk6f06RWwulpa#DIWIg$JMy~sxg4J@}mw!lU#Uh5-wu6cJIk>h4?H z4*(lOJ$YvVH}lSlrk=dBfz>QtCpaCZ=N*V<-tvAiJDPg(&H*-tdgfzJu>H|yUwn5q z7ude!{$!u$MpO5Elz#DEQ`QXOPvxhO}M^n$w-7EmMow_mod4Dxy zIJXOdjp6UNn#b$aSJBjy_iJGDhA&+6zQ2JAX6R@>8dS#>+fO6 z&FizkYT)u&V0E}Yj%{Y*tO0gx<+H%I(A4uRuqIe7&jM?Kjia7tfwjTr(q=#W{SP(! z;d#9-SS`;2>w(oQ9*)U#+qUbVY0tC3`e2_0)UzfVfQ?r^3v3A2*TXpasHM$DVB3_> z0vp3^V}9G{qn0+CfNfJg3v3FvP5P^kTE@CL*fw&OpxOfLbu=*t!F?7`*T+3O7_6TA z?UrEUsN1j2sMQj4E3h%cx30N4d=}US?tNEXAJ9fH1u;p1` zPq18@&jNda^DNK}misKQ1GXOUnbfw?X0AP`)otIwx{Lr{K`w2>!E$Z39|hK5+em7; zvHiX8(cn3$ZKF+}Vbtp4y{Yq@(F=C&t$ohemwF7v!!eJo?bha|JJmR_G4h--9;}w< z4Ea73V;NhVw)=r?n|(16Y~R%N8ASX^VD+?_3{D&GPgCHYL+bi?4($(C&ptf>Y#epR zJb_v*F{gr!8Gc~R)31Zz?pJkv?AQ0f>iXD^gTcnVusDYffve{nIuz_Vq@KPV1~!(q z#6BEstZDT*G!3kudirz(*gn~J$0XO!b#l#|YwL{ZNU&qfem@GVmUBp(n(ea>Tr=}| z4*dX}b0IO0MpIABW588L$AcY%wR`bI>XRrQw*66U zw@!af1{))L@f5IH_M-d*im{9>PTL=Y{k<076H!&C!&%B|S&FvPDE9GGYHewE4p=Sx zT(ErzKdzaAIEYDwKngsbg8-&+>Zq6z8`koe-1vI;y4|f?bP(m7%u}m=8W-juwzu$U!LDZ zat)n(>$JZDZ2Rn^Ux3xJH?^s`?%5ZvVcP!^?AoRMm2kDR*QS=ed=)r*GBJLIrk)sA zgVoCSLf634&T+~0EBEpnOUH|8)<^Ei* zWBVugJ!*3pOS`dro_z`IT-Z0;%Jp~8xPM%C>x|)Luw%%1{R&tu`%{~m?XxG{Kk56c z;GFY``5KyfV!jSmb04PN8}PKVpK|@mYlXjGXH2gZZ(+-|;!Utzo7akWz`0hu4VHVY z=*9Lf_(E#iX!AZm*y=s7HV=O$+c@vT)$Nb*u2E(Z2qkpc?V0G*x2g2RQ>iP^q^Y4+W=d-bYlTmT8~Zm)Kg6b< zoO6NOIom&LJ2%{%>K77BKd%e^jZ+8B$r@sqev%fj77KE$iT-By#`|KIl_j7u+HpRa$gt_%I{Zy^r zVO@(g^f|`AqZB-QjcMBYw}kA+T;Tl8A^+`U+oWIfz-^!NU|zUBIS=Ie=x_e{YWo+& z6{l}}B<1g$wh#XntNrnBEX-45bNct1?9cqvw)b!Tr9Dg6`g`hB{5`K3?fpAa8QVf& z+xvH|GoG&z!`O1`MH+mWny3E@!;R_wx2-&Lu_)La+KeOjTIARk13Nz3XuFJj>WhQ5 zeMFljsXhGJGxa4XYW7*|n7uB@)suHcuz9`j`a9<Y6Q1@$hfoW?dGkv2(U)f&K2V)nDrDiPeawfB8JNI+}X&uK_kr_V>5o`lx%2 zwjXPP)$OA=ee~zmmZx|uOGzKUUgM>xm!sIP6{xe;{(IZy+HX*B_uj?@*KgAX-@M@Z zZ&`5tw=TGU&uZJ6XI|EY+plt7)R`L=>5pK~HNmh+*1@@)e) zpFZ03aZc5fZ#yw1bGAL$d34V7m$!Tvt7F&!ZVc}=UcYw)tJ&UXzn#Fg&vjF-kNMn3 zJJ)vim^gcE6>O_fJibB69{XmESE62(;vQR_I(y82Tiv}7{@sGRXTDc({q}0`VFlNJ zWWn_xUGQG;J~hvLeFtv8%00FlntJxw?qId-G5f5RHP{2JmOZv7SgqV+-Eil^HE~RG zvE$J{Yu*EP&Gpfyk8`4)e8a(Iz7cS>a*vIIC!cd7H2YUagCibx!C#AKYQY2uzNxuZTdLp>dAL1xXkxs zxZ0rF$9vW3;N)}8<;HTp^-sQ^fX%0mHho+(_2fGXT;@9mu6B0qW4`mi$>*BMjpcgj zpL{<9n@=BY`ncxm$#(&`%y$u7?ZVo}e3yWe&o!4D>r!g{lkewX^Xa2aANP!U@?8OT zjGSw?XLmbeg%sC zmFtuC*MS{F+FuV=OZywZw!fBQd$~Tg_d0MRSi9E;KP!>;H0tzglqp|5b4P-)iu83aEBs!{rflgfP(8ku;BX7QE>lW<=i#T`E@h--AA5Z+0(ax)pO1LEm$q* zfO||W{p=$>%vJHk?&*nIkE)8}z&_2hdVT;_WbuJ%IhW4@Qb$>%vNHk?W*nIkE)5mLodh)#nF7v$sS9`toG2ffuk??*nIkE)5mLwdh)#s zF7v$)S9`DaG2e&adE&BxXkw{Ty56c$9$iIlkYRI z+*n^w>z{mIg3YIoHhn&(R!_cuTtmuy9dI@O4F`S9*9A^KuVHdydHvEq`DO;2Pakdi zw61~R+!=D!h-;K3+rBlkY3wTN!Vzk@LX4 zZhDQ>U#?I5=LLJs$TPrvaJAUy2YZgkz5rY;_65P7ld&%ZSBw3t;KvL5*WhaT&Uaz3 zIgM*u?e^X8xfcQ3_o1}6?{fVUdr`3GOL8v;SBrgdu=_jqCE#j9i9eY5OM-2qZqB8s zm!_C=g*vBPzr>f_cW#MYEe;w?ei+wq`T5>KAwvBpnt^hXYwRKLpeu=pf*nO3l zD}&W+?{nfRVB7n1md=x0pS1rb*nN`rtAf?iel@V|{n;wC(7XS6YYI$y0AFNhBH*5%ZE}T=xBo{j# z{c~P#4EDU%N1Hy*iF)#F3NG_)23ISe8@7NapK~HNmh+*1@(l)?PakdiIH&5#w-wkv zWX`q*JCC`J$n}Z;Heh4i$sGGV1$AJj6J z-vg^+rP-eAX> zJtWu1_Rf26ZFfz?S(6@YBPkxkC|Q%?HQtMQ1jRKOMV&PnLyU4wCKTK?nN)E7rWE`D z@YI@TO~%5_Q?AK4H1({>c(7X5#6GBHj`jnqWlbi6)yg%Q40mkKv3-<_?VtWxll{T2 zi9Xu&ag6H8cOY0TV>k%xxUvRvee`#pzhB#3198@%7u#5h$3B#-!M-)#n|chzH5f;o zH8_+Q?dI7OdoCf*hlru*_mLq{4CkoV70R-@i_;qPx^E&SZxT! zdxP_J9@w_poKJb?({~LAQ9S&&95bI&YwUa;NO3;DPwjjEvj$F)td?=^ivO?S>KW%v;3Lo-n>poT^Xcn29m6ePpF#A| z<~Y?dPT$WQOYu0Gl5rkWW5@YJisL+vI^(>Z7#XMU%I>Ur#(5jucI7yKho+u!{vNEB zajt>?AK>a4=N(}C;@He77n@IC$LSdU2ws<3A8n3PE#ve%=94HM$5S%S6Kd=@Poy}` zA5mwV_Yx!H+yMRlnrEDUhTEFp&p7V`+ZV@XPPy28`Z`X> z@K^Ar)cR<1oN5`TpRs;S@i>{1ah_6R$9XEnah^tAMMbsJR`^3mN_eTG)<{9VPaNCvRdR#`yvG ze00ZVPPy28`Z`X>@DbQ&TYa=SPPL5lQfyaHJbq5eI4`U5CDfNw9Oo~n9jD{_gcup8 z^%n)78{V&@uf3zey9%!VfPx!u)&?I~aQ){jxc+lD_&f#IfBu5&zhHxZwcz?MQgHnj zYw#rsuK&^n*MHf9`|s;5U-RsPPnj?0wcH1vp{eJY?{lzPp7ot`HTQtuLwpHV%f4ax zTUz<7KNFg3>E3WnA1->Z45`*Hk_E`h&}SGsD%&?`dX%C!cF7H&$ys z!O1rp*nIkE)5krbo_w=|%Y1Xd)z0oW<2;xPo_y{Jxv|_2`X}F4z~<9On?CL-_2iou zT;`h(u6ALOZvlAnxu@jDazE*xd<%iir;j#$+>`3b_cd^tZ(+Ea=e<6D?pPF_eC|oP zvD}aPC*R^=^Xa2aANRC+@+}E2^DPBed!fj;3_SVV({f|EpY>0^uY=8}k2ZZgC)AT~ z1+aT4-y!5DfSo%( zD_xBLx?nZid;MJxZ2N2LG0XL_z1Q#cYrEHWajxyZ#C8qE<0^{R_A9A>Rp6_^UfZvw zHlA%ZB8EQU8^iURMt`(#0@p`9KAVEeHk-k1w5nfIH)w*4)2`no4^ z^vRrj53ZIu*$eF9oM`K&45JuFT+WGl;tmI!FL6h})v|`8z#hicHj=V8#kk^f4b>C3 z7i@nsxBI~Dt9pF)1)Do_JqE6ydggj8xSVT!5_25bnEKccx&5-wnSbY{oPW=c-%&iu z^Ym7@^Y1x(8^t)kr}i04ZGYnUtPwu7=8naf6XCY=_uAx>;A;C(hH}?en=CF$&dn)k z`fE?T1Hksl>#n)wV)N?ny}_6Vg1zqOqb=0~Cuzk*T;}E!h>hU?W z_W3R2ng%|CqINjt^12U4*1GNOk87cpJ#Rnnpm>yX{s(yG{C2Q&ekXP2_-JA{=jqEa zaNGDdNR0VIxO-zUinjP2SNmn`$HUc*rDV=e0;``$NxL6`ji32A8LpptuE#$HtDj0q zyVJmByVK$NsmJGx+9&gP7F_L2O6Kuwu)6IXo9pcys3*=jU~`3^3wQ1^*7M+Mu5-rv zGqCzkDQR~;*x2D0fQ_3r7sB;X&wN}2HkP)`$Hid#q%E;70hfKe6khi6=Ww;MkC(yi zpSHxg99+)p6>$C3=%pIM`;;cDexzXq;u zd&llxSIb`aK5`eu~Xv-+!j|S;PD5^|VvZX9(NgfTkXw8*86I{o4K1=htZJ z@%c^dlV^2(ZbDPfb@XO1AzHr&V|(qf-BQ@huWw@i7ToOPt!V1;xvlmo`}jLF_4xe0 z_9^@L2Q>Bc<94upT!vzM?Xlfa*vzl5Yw1|;1Um+OTn~A<9)H2dqg;=>;jYI$)Vbc= zMLVxIo_FGVDA^nLf^8FiA6%c)>OR~L)<@kw$kPX}Rrgao?xkc;+y}M~f2Fn$?uiFz zSKenHEV%ZE8~mA?r(X}jjq4a}EBE&^ou|KpoeOpC=2FWVJp#6ExgQ@zQ;*MMwNJU$ zkE5x_=ZV^+F!@6EqVR{Zua+CH1+sASNoLxeI89c zJ}=ZhWq)5pQ%|4%3C{Urd+o8kRM^a~ul;pxw7E9U|I1*<@Eg{{=jB(xYFkl0!v8gD z51+NPy-HDYkBAfJb+BufHGc!_JjDL5+Mef*H{oh2xdy(4W?SuP`!?9vxu3iP)=xb? z?}C%xalHq3Tsa@#2kWDrK70UHPw|=0^WsA^b7+t6M_|X8GOhOgH<~uvIKPfr&ELh% zJXxooAA?XKlZntAW^@E3b*-@|yS%y2sxrxh6hPW3P1&Qe2C_Q|B5z zH!;fV;{r8LzB%E>$h^!2H%{zdsqOaNSn^yS=K*_tRL^?M3pR$f%*}jY^_0xb{AlLa zZhZTumfw$G5bS+G-T9DbK4wCHg5vQo#rbd!9x3pn1%9l+kAt13C#f^;uMu0H@P*;V z%DJ!zTpxAMg~g~nJQuVrN?CzoTyf$o4z?fROTdkr`C1aLk9vHT0^3KQ$CjpE8m^yu ze3k*1{aqGb#{D{6AN71*Tn=n3ZO*s-QcKL`!RFOwY`Oc?u{titmv&x*<0mft^w(y8 zw3WZ>?;d}K;!*D7r{Gz`r@`j?2X*fA>ku>h*mYjN!8dB~O&fft2H&N@cWdxH8hliP z_cr*L1|Q$xhd20<4SsZkAKTz(H~4uCetv^r)ZkY(_|*-5U4!3P^W5`Sgu6!Nv(8Fr z>hW2*_9>qoRzXwuGlKWE-wTI`Cwr^6VQe1y=Vy^}^e;IpqH1+tbQTvq7 zCEr3*PyRK*wo^C%+SDHA*R~dA8;beGiM=kkIsWy~)ZOduPkH<|05|))A)31W?q7NQ zHwNop_I(pHb^YDn@|>%ifjv*Ox!2|EFvDIKHwSxdv`^--tv+eH1z1~h4+3Xw#*^z4 z|G{A6#D7b0#-_hqpZISDZuOTn_gvk&_IGUh%k}Y^;ru(-&UxYw0jEESxhm8j@gD)s*z}j{<61la&b4zM|Iy&YPt3j1)NSu|S04X;!0CVd z_eE3J-|MnG{$s)EPyENBsp~(6S{~a3aOQeESf07w5A0mqC-c}=pR}C_)|T9pz!{sl zsm~uPP_xb$)B7D zp{d8``?XKG*AGTh&v|zU*mmlkcZX4Xc;0C{lyWM?{Nlu(2F`er{|Gd7$9FijJpM<4 zoBjO(n!5f+Qp@9i3|RlN?>|IS*Z*j0d2$~I&R#ecEYDsz9_(JQPv)_$K52UbSX*+R z2+r8dCD$kZCxML<{~v)fHvQ%L#Q$WlIpco{IAhaau8(W&{5#jqdHjD2PJa^fG&J@2 zoL>8s^K}NAde-_UVB4v?)@MiVBgEl;eA!CC8z!1Ap1C1BUuKAFe1`lRipU~S3$b8yCH zF1bGOzYJ`g_+Jjr*z}j{6aOo~=8XR@z!{tVa(!HD=ij+@&f|X-IPnwnS7_?Czmi%W z|7*bMfBdgSQ`i4$YI*#x2d6*rzX45M|LdsbvHcpHxxNuB&s_fo>|EO?^Vn9Ow7m(e zExB(7XKdz@>l6Q5z{ZLHZ^0Rx{&Icde=FFW@xKk6vFR_@r<`l&ygbi5-{h-OyB5~Q z_p{IMz{d0QtT>-%wY^C3c$Tsjxvr#suE5XN*v~;PP>lUg>U`F}op||-WZNei{HX?i zw!xn-xX*2GHuyUY{y~HPyTLze@Gl#@t7}Go%{QRI2R8Ve4L(nU&tGuIzi@*u+Tcqz z_|gr&W`nO&aQnMn!OgcpgKu1L{WmGN{+l=W;DYPFRl)V&rop!>xc=K0T>l*#{M!ZB zf7gQRzk7r4S#bTkYwmgAUb}zbWjx24_D_P1 zr?2OxJhrF7>6hoJJnyWZ0sGF{HrkR)z0Bo&Cf;-4#Pd9t$M%A}?uX~RJh@&3`@Y{c z+LBAX%;lOT-b>(eo?eEV+wc3muDt^9N4*S1U+syjt&Hm)NZi-JW!%@{W!yL5#$Ar0 zulB^%R>pNt<(mE$*tq4h!P{u+w)eUxkN>-1^OpYap{eWdby4mdE{)&&V1GWyINB2D zL$GQ#X#+Q+fP92Aj9^{{&54f3LUloX^4LEuZ7QKvOr4*J*kD zJsHhg`u9Uq*Wc^7Jb7mVo7Xtn^1W{dx^rQ_^s%ki4fS$uJkOK6Kep!D%#5aP`_?@J z9RFFs&9#{oOgC#a?aleP2sZnwulH7YY>R>Imp1RSa{J)wDrYg)O<31j}Pv z2Ao{pv*pRPEcgy`*+yG(sh7FDha}!|*vu8aJlyzxM{oaEfa{~4pQTw5+z%UJTK42o zFY|bhO5ByPm3dZyn`c^`=NoW+)YImhVB6%~)~ax|{kVa~XEnHSa$i~kn|l1$1!qlsPLkW!XC(czKI?=1{$C$$X}=*j z`FxI&C*MY3-!rvzVr~pKj`4k_(w_L6f*-eqK~%pMZN5c&t!@H zU2KWHJ6N8+>;bkf>hb>`IDOv}EH_U#wf^bLUSRv8kGAwhz3hw6e2G00o7X=-mx=Sa zY!GqYpm@AQ$>*|{3;arrucLmoz^~QVXW7>&K41QeI`6dhCXcr8-Uh$2!LKQ}&+9kT z-0>MJ@8palc5FUR?*li#&*le$JwD|xAFEHL^n>q9Jrng9YM;%=QZpUZIBNc1jpskc znm}!z_oMdNd?K~a=98#rrJhXfv-uS2fz7k1tODOF#P+ zzjBt&Hv7OZ$_-<(N-_+g?3mQH%en z;Br3YWo-9zd`|5zk{1I z>-l@IKI&PgKY)$n5$*O`E7$XmS}WJ{PBh!=uif~rnRc_wQ#5?mhOO1-IR61=s#&gTK|_?-bnj?=|>m1vg$N zH`%g(3peJj)h}exd}g>8 z?BP2dZTC>roLjN62VuVt>{@I>9Q$@Z-1RU{_SIj})N>#G8`x`_y4M`zJODP9w#0rA zY%KSmJ`ch5Q+J=p?T`IR{zt&g{EwokXCFTfR(p(+pObn5Y@f7wuDEB^(wC>e#?8O^ z@-$q{;^AI*Z)eQUpc^CC)PI0&qi%fnpj!I<9N2j*=k0kk_4NA%uv*#g7vc6>n{l6| zR!hHM0vk8|ei^Q2@o4t@6?9{y->-sgqi%f94K?Gtw_XRkxAHr}|AMQ%LDAoHM@@gP zb#H@>q0RF~9^1QM=S7?6kUV+b2OCS9=abxjhsu~AfM29Gp6#^j=Xt6v@jnC`Kl~%G zK3Ri*gPUvcF`9b5L-_=(mg2t;Y#%;Fb1qk*n8(=q+7EMT&saVOm*?Y`aJ4Te`g?s) zi@y`CmUFeA6Hjrkc&>KHIXqXj%|!Vc#dAY!oI%*Tz~x@(4_C8zlzYK3&5Ul}Gd~01 z&2wuOH1*8StYEd2%+G9SnIH2STVKcP^-p`&Wgu8Bd1nVV^Ui^$9-leE&9$2gO+7wy zgPU=_f~KBp(>!3$C-vOV=LH)}+cd64-W%rw+XrpA@68Xk?;g<>s5QqPZNXYA?}ZDY z*P?Ilo;W`=s6PUYwt`!OoF-)_)za@h+sHIo$W_!qu~v*8|(u zBij14R_^%?YOUP!8=~1>f9=M0?bI{xz^b2tIKHGf@6NGQgheK*uFRPGyCpfb6fjwChkGKC&fei_iDR!=C>PcjH{U^pUw9It2vk6 zYn!M!=0_zZ{d?J+ALauxqYiUYnZVg1~!H<-J6Gl-GBO-Q?8Hu%f03v ou}-{cVB@(~RMipuM=gI(M4MWE-=?_ntM`bKZM@pYQ0-UTb~d{=VH#xp&SC9n&m6ZB_NErmy-|drx1rj@hbd zP^xN%s!yx#KVYW;D@~j5!v0Hl-5{Ra%{zy0?82W&BD$oTPtCQdqd^sqsrM~xjeXy~X3!-h;6 zb-*zF`WAkp#ts=hd1&d-8;`ONa)-0Y=+WbbQ1_vi_3)~3!-r2CHmO3Hmi|}O*kK0_ z>e6qS$*Zi#{|B$K9=6VEMr>1kJFA)C6Gt6FZ*1GiJTT^AV+M`ePdf5kBPqi3)voS+=nlxeDe#3Sg zHXPcTUv-bEZF^Ts!n=LJefXc6$D~m#^n|o;>+X+{U89E&I&jp`Nh9ssY}K-8-7#p; zHS~X<+}0fAx0U&Bl!$H^Bke ze>IP({qJ3^2`7KcPn+wY<}qQ!;I2VKjL`1ux@htJkDX2Cy0^~t+O$t!*D-!;uKQH$ zx8n{NHMakRuA!~zZuM8)qwMd7aQaaDw)dBs$EdMGhaE)iSk;{G*7X80n%9?>cJNfq zt5!?ng5bW|6h1Y_e;jGu7y4a{bz@>=teb!{*3H|ockCM4bFAtf-Cs42 zsblS|)Ew)Wu1T$N${puHqY*f~+NwFuA#9RxuZt7tq;sRax10`8wdP>}_0;_TaUQ0Q zshEeYiII8O2Hc*9-qm*P*jtV18qvB`*atO_at?NY(}$LyHvQB*rp`fIa}K7qoweEp zp0@w7_vuN|_nl~;zV8f9-*;=r-DLFmkzK5Mt50ekQ}g$(_JEVW<)_WQt9f+UnA&T= z-qi8?kNr&6qMv&iuNAAK`T=$J+MssaEyfPrZ1kw{_O#sxb&s;Iwxh~XeJ2iLFU+=r=uW>W4BigaIo;;@AS?5d5V`^VJt5I%p?(XAga64{iHLe}EHJSEL?osw{e>k~!?xORaYjTfC z2)2>;q6{D1HDV%lZ=N6~Q`2S;KL68AjJ)k`+DF@F9zD_9eVnB_q>knN;y(_)J7Rm> zUOy9)OJsML$DFk~t&Uk==>LnT?KwTAhT)Yb0KEL}^H-aY)nJ{eF*kukFzS?@0);V!K z`jElx`MyES1;WoVw~2j>8#Htr9bRVmD(mt8w%;v9n_G)EcXhWJJbA*{?k24~cNA^z zEZW=)9@#ZvC?C>BjGWZ7Z+91M?kUbAX4^@Nx^V*A;)?dE=Zyzu!Wm=A-462}SC=jm>rj_Mh( z_lDlpbk(10fBH3O)Y!4ZCe%|lb*?+B=WIKs{aM)0iO;vWw?JZaRxh-8mzUsHt{17j z#`k82y&|SR8F%{g5_)@F9o5U-{(Y;zfyazGXi)3k-Mti3Ki9oxyLzv@E^h6W&gu=@ zjT`E1p1jjn@5_lZWZanX<0cO4j?^C4)Oc^-T&Uzr|?PRChpjO)2ZwHZ!|vJ z;NPeE0z7=exG_^b%+pzYjy_Q*4*kBNo;-FupWa%Ytq$q;b?w(aPx)S?S5z9RV*L)+F-^~N@;Y!03&MvWN(@2F;jceUbnR`Y|$cTMQ>IZ59Id+?5G zN%#S^ZE5hf!^Vu8KwLi`$~{`&an#?LMAxJ~Y{CRDmw5MX`A^ff6In_>mIzL+7`|hBz8x&8#sCQ0+)Gz*rQ!% zwNHZ&Zu@uV9oDdq=)pUxec{PF37otKfy=yy_Gs5x9o~a?R7b%R=QwcUoCGf8oZ6#Z zXZ7O-Kcns6-TyNi_Ol!OoVNd}nde_L>=!ing>C=U;(uwwet8exQC$Vkxb6UFTz7-Z zaoyLWU1#gN!g7B+)b{Tl*TW6}-#7T9ZU63ZJ<+f~)!@&x{kzBYY{UM1gTL7JUp@2i za>M>=gTL1HUnBm1Z`j{z@ORq&YsUW{4f}@;{!!b1t@!`DVgIbbzi9if9sjQz_HP^9 zFCJL0b>iO%FW09}gZFLwui^>s`9EXBK64MwH4L78vL-nDWLwxQsKgN4w5yau427 z9RyFDBfyDsG`NiOqaN)#tK)m{j_M?MJ5HbKbTFSk2X&1dI%w)=)6VM59&I|Svm5-< z2EV+)uWRrd8vOPKzq7#~Xz+&`{ILdqqQReQ@E02VuMPfsgTLG0?>G1-4gP5l-cfxC z&-#1|F4w15N6+)4qrrQ_@$cTJeH-@a8+^vLfA{rlmWF+{2A{p{zgo`Mxf=F)8hpOC zfA{rl!G?X|24A%8-+et>qG4aE2j{r}-rkR$)d4+hoz+1-ct>?2+=plH<&T1g*Z5iR zfckp!T%*m4a6a0#+Pn_-VcYA@oIIkH*Qxm%e1itxxWPAT@O}-xTZ8Y};CnatJ`KKa zgO6$O@eMw)!H;e5;~V^>20yjIFKFc&@M(JY+&g_6e1-;}rNO_~;Bz(jybZo^gD=|P zOE&n@4Zco;uixMsHu%O3zFC8B-r)TkeCq}u(BRuO_zn%eV}tL~;JY{Yo(;ZtgYVPe zgL`nk`-KnhYF{Hpi`jTyBQ5|>7HGEU7d{atv;=Mus-#7^Ml%-ceCl@qoz)-U zll)mX4+pNf??;RnJ!rRa6ZY#rVcg{LTW#LX{WN;{zJlDN{4Vnuw9Uqi9X_h{GlxEv z++*yZVWWqQ88&tj`^wMg>b+X}_^wGKCl13Mb=sCb4Y>8=b-uwGWXD=<+BR;L)yQFf zuQ%10cw7$K+(y*l{r=)^zBT zCUlLRSQ`>+`a0I2!Gp&g)NSkA8s`kyhVoD~X583uqlPBp)cKhad+Ynb?(wweV5aDU zM{&}&Um)qj`zOxn%&|?J#CJroPMzCXV(-zPcHCL9*`J<$ZQEw6ZKK8xFUH=xmGgVp zSSUx&JhipiTbi?I?zT2ZOLIh1`!gq6d)~5(w6(`F7dC$$-rftPz1^p|v75oq3bAJ1 z=c#S%tpCk6FE+>de`+^hZ5!G(sVfaVul~r~w)gd>lZWHunAALmu-~n{Ej|o{O)cmFN9i4gPk6zgx#>f9Kv=eE>h`;6al|jh#e>zODC|I9CUZ8`3p;tFZ@A zO&T?BtY>VyKi{_e+qf4SyM0aRtfm7`y$1BIW`?)++R$O++wZk>RtmXrk<5-}!8^^ns6<&^2^a`}W<6H#1r}ck{H{bdO^dI89oIAfUvo;sG!>M(fO@8jC`y5GI4U&?)7!5>z%=BBf{u+iq? z9-QYhc>8A??1LV*&g#k@yrcRRJY)Sen7(z-+2h?d?jzv#+V-wq2Dg5G#=EE7)LV1< zHrmv2@be`&=iQ+8-L<{%KI`GrS$)xi_pZK%x8vryohKz8Senn>ebCx{?x&;DPuhpn?(yup`j@KqXowH~~q+5kSPUYjk%KJV6i%O1X+)piB% z&z||zMdc9t^EVIi7j4+WpBLDlw|VH(dSI=wKM(Wh&-H65Ft=Gy#rtdRpEGG&+yDTjUAs=$7BiN0-tw=1xpXX3MC zfp;nJt_9wszEwG=Hl6QE4M-WjmyVt}%UyJ>0=^?(Yz_%CpjspAH zGyV@2_~CBc+4}rB15Q4Rd+y|Orss)=+B3C(Q{xoragOO%o?~h2xNPfZtZ1H>YJLui z=4VH>ISS3xYR*CYc(iG03ly5?w0?^e8kgLbwnU+EiE3%f6q@6=?FxlvU)B5>Rr2~- zP;K=>^E05@+J)xlKDG4=&2g%2TxfpIQ`@}I{CuajWudtj)CLrqbEGz~(ENO-wsWER zxlV2OLi4kn+7AlN`BmGe(ERMCHnh;(Cu$>GT4(p?GW)nC*UfxR%X)>|#>2g<*3rV9 zt~m%E z`b-&oc!7^7@R0>RuE56^_@n}#T;LxU_>2Poq`*Hd@R*uz4?Bgt8EMm!#HD%^XWns~OLB z##){_vAjPTOU*f1k$MqIFN*P2qSja4cq>z@8PB%H^WK?w{(#tcYTDMUZMIztEVr$G z+P$Bq?FL}msx5@-@BV0WEGfp>2(HaIwlU7;)QPhN*f?r)GlqWDw(qQY|C+lG7GhPl zq_(Yo+G4kj`L?3g$9%>%-*(i=w>{W=YUcC)?R>T4ceZ}dMPGH}?MS@?#dx+g-fq;1 z=Y8FHYTEXoPG9x}%WbQlc7G2fZTA7&R!v(MwKnq(rk2}wABy%7)M+~sY+E&LqiUON z_XW#stDp99)M+~&Y+E(=&HlA5xhKHYY_G2|52Vgsigp-U_G`2$Xc=>~+lzll5p1FzNFVQk)HOG7@b;f)d*fFcQUoWTbUl-R)-Em$)t<8M4 zagSU>t&i6uuNT)+8%y0b*VS0vqR+3X^|75kH`iF*vM4^ktu@=oAEP#AoA<7sDtNoi zwAHg{?$yLe?e*=ig}*V(zbNO-o7DX%YL>LoZeKs37VBf24{NL*oBjK$*4uGAtMA}_ zY9HsRqgR{TKm9x5YRS{L#%kuBuI8@q@^E8KkJguZ0r(7H`=sU^&Pc6h9NXGvMeN@L zdo0Te*>;}VX1v8~+k)8g-Ni!0^1BD^7Ipix47GjNwqDKs9zrd-maDn`E7aH+>3=^o z{$FVy0C4P{BWXXdu#c+kE7ktvYVMe9e`L))cM|_RwDiZk7sInJudMw&uafVk+Mf1* zfp-@1-hlTm_T?sXvjJs0geHmd&1Fj4mJ^4jjXxs{X0p}%}! ziyyU7`2KDC#^Fb{`9>=+OP;Go!PQbc52nD~hq}h^7>K!2q92Q9&XnXi1&!#Ng#Wn3 zH{K-ePKT?d#P7^@yN%;_7F;bQe&@CQHjLlT;c6-Idra-zb2kis9KONyb9c|r6Y%T$ zzqUc*JPEgre%e-G#``gnOIhTMJ#}oiV9WSZC*Mcd4qx!}rR469-fT|iR_;EXn}56x zxxSl&U0>%v?fauGu+p~crGHz()l%ZO4cd;kZ`VD)1K?^Y@f(P?!Su&>um28kwUqen zgm%Er&vwu6&TzGq`0a*vUH`7``P&_?mJ+|gXm4J(WVhcCxLQj5Mx&i~?!4XWKL)Or zGB0QE4RH5*FG_iEsxXV~xx5h{4}HBB%Ka|P!@0f>>|A?2cF#Ww*UZ$n?2kc=uWoz! zx(XR~s+b`o2qC7VZB(rHt`^!#*qcorvF`*|$GYI~Qv9UGDcHYR-sPL@jB;yZeu3W_3%Dt`%U1^t$NmVbMP|z zjomKocYymn!U|kH`%~`=&owAMm!r*yEio42#JPK|5W&`rU*_+Aj~E zqu}SlzhCg@;YY$9!;4_YDjQFDwhQPaIjJ^B6o>EXHRzVUOR@w{hw zUtN>2W{>LUUi%!y`-d@%_XpZp%YBCPy@Zm#R&e#V8r*jh;y)hyy9M{TxeD@&S+IJ7a8G7rzgK%r#I|#S`zIzaEe|+~K+~*75JqXv|cMrn#_uYeV zYu`Nxcb{!q@XN6K4npkSFManQ+}igKO78my;f}}m55nz_?;nI4-}eu~oj>0{2)Ev+ z;M#rvptSq`LAcMczJCyI?K=qJj?eER!+qZJJ%n)k=X(g@&X?~Ygj@R_Lb&tcy9nXd zzK>9H-$w{{K71b`+&)?<0gee&0z5xAvWcaP7X6P;%c%D7o(?l-&0c zO76P};m)V;CzO1V2KW7h((XG7CHFmrlKZYgxb=_*_nn2dJ~_ZGrkAKzOD zxAwh-aG#eiDY)%@cOiD$`|d)xpKbhJIo#U!7fSB?3*q|veRH_a+rGmPZa&{*2sfYa zF@!t6zQ+)5{YJrEPv2)K?Y_$pZhPNl2>0`X?=pnjKfjj_zZULy%;DPo4msTCb>CeG zxBtGs5N`i{e<9r3_ZPzLukSE~TW?Zu`|CRlvCDmrq2z-L?s$BkA$I%gchBLD$M2uR zwfp^YxSt7qry<<&Tv%|&b8*4FKKng!{Jp+kUU1|2PDAY0zS9tHe!ou+xAwh;lKXB$ zxc5BYZwR-&-vx*JdB%4e!tKBBHH6#$FAA>yb%Xn1EdJKM&rovTX$UvJ-#>?2`))(H zcE5)%x$ifW-1i&8t(Ppg{rCNb*zLdXH-uaJenZK9ry<<+_IqggCfwzHW_*(3bEMA$ z8*q;YR!`OXCNMvfKL_`D&F=;LydJ;j(X<^)EUM}S{;{ok;=c$szTX?9-Jjv=N7e2A z0=BLChCGG%%%K+lSHNn?^H;E%&xrQX=fgKB>7&n*w)J`OZ?$cQI@jN8jqbMk=v=&s z=5vhWGrwFvvClK+6ZkI%>8<~)Cbrk;8GH`wQ7_00XJU}I@Ztk1yaEBD0b zaP|0n0XARh^Cet8`Mv_1Pd)j*1{+J;K<1}|Ir#=`KeRc1p9$5REA8Kb)yBj7GgnTk zn!Y|S%Edk_I!9md3_A_jXIbk{Y1c{Jo8qCpPi?o(noJ8e#trm~+d$P9tmZTGm&A~F zP>f}4aoSD~wypEyc|HT!XH|9kCigSDx$Q^mIh#7|X9U|m^E4A!&F{A|HnnnW_CuS` zz>eG8p0BgQm!-CC;?IVresw*z?}629XN+0EYQ~?P+WuKPcXLwDMe)!+cWt*ezH>DX z*ci@}cn*r~j3d_1b7p?9=YlzX7ME-D99R(S-q+@HxqKbY@BOhY1fEQ78*MqC7Y1wd zu$|BQY8m$;V6}{UQLvih{tW-c!5;Qo+hW=%_FL?DGY<8{T@q|uW2{2$@fAODQ+&pRJam?xbFpnypYRNA31qo|^wxEAWqVxgs^Up=u>+=WJzaf7bSWYWro} z%;)Oh%%`7K)|sCT!N$nBv=LY>=aPI~im{9>PTS4Ewsk-IjI#xJQ;NEMll%GI-1fuv)@k1l zZ2O!`{lRKEm$a$bK4Y^V=A){%;veUtyk2h&SND2-DL&hP)$Grf)N9!_|$yBeh(-3-t~Z$Le0$4eWWR&CiPR+@E&WhL7!Sr(M52 zsI?ixvFrslzqUQ8X=R^2g;q*hBG$Aj&owsF+*b!gkc#bAGMAL^D~_iF;0 zdipsLY|Qj?5?D>YXJC|n=)6Y4mJ zfsLhYMs}aE4+ndV^JnPV{Vv+?obBgixOQ`TojU^Tyo4WFbLZak{3!UQ6m@-!KLxCw zejg1^zqKC&H_vIr=np>@tdDxy{0QuPWc`i<>!&^=Ju}YnV8^j3Mf;4^v@QLFTKAf1 zU-V0VPXyav$K`nC`nz}C$L>GtjQ1q4JWUyMUOWM?IpL4@~Y`)9Le~P}8o9L)9 zFGV{Qu5SJ)+pfuv;p)G_$Lq=IU^UNC?}_pOlWBE@h#xk!sZO;SSHtXA&SAf0mm+O2bntEbh1y;M9 zl6F^v)6Ra%^)t^Z)b?{}YWwMP$#vj7dt3{aYx7y|25_D|t_RD#r>unSM(`ojw$Wy; zYpB)5H&JJA{TgguYxmYI)VESR?AL9z-8%DkJJ=Z6TX%rfvbW?nQ;cP7aoXMqwyksG z_a}FO?OXPiKdbl+Tzwqv|OtJxo~0dnI#L~Vbpo!{S4KTPq^{@dDaoqT@)H?Jd) zqNyAI_tbLnW7IoP9IMxtC&07Rw#TXEd0u%^8$PzTopxh9MXk*kmtubgY<_J|Q_J(b z@<*`GE4I<5&m+|8;y+PmZ#@fk?ADI`dFmG^9*+IR+HRe-`ZL%V*;{`Bt7UJ=pQ9Md z*karEC+5pwpFa}oRk*S2*DKWWJSY4W>~n&8KKH%`R-eM&>`%Pc!NycK#!J*{u9MGY ze*-)A?2G=i`8!-aeR>mYyWAV!0_&r0%r~gj;{OgVj2Vi67y9Cdv58>+Z`6t+RrO!uj^?~(#{0nS5^=Kc1^Yig&pJ=b2Q@n=v zC*Qx(at$|*?ew$1|De{MzI+N+b00Y`_V+WmdVD^weailRfu?>N{qMF%+RS@yjXU0dSy z2CG?oKI~81K44>NbKbrowp#kx7i>Svd7BPRJwDTeUFXtg1~m2f%m_Ai=`$0WdhW?H zgI!PWH|8*gK8Z04xY?Ik(bVHJ8@Sn*@1d#3XLhiCDd%bqH1+glPH_5S4rAz(xtt4Z zfAw?T{27v3a?Ar(E5|!8Ts=PX)jnlE=0{V{v+M$3`{A>!?X}0YU}4kG^CQnZ3&XYh z^KSd+&$QH%dr@$+e~Y21$7k`{r|jPnXzJ<1l3@F{48``^&9?}(ww!BAgVoY*8F0p> zEuTO9*_yVrTMn$2cFTj4Pn*{X^Z7G4ZE3e6*fFQwO5n89mUjNEPFvc2A8fwxRlxd$ zuUhjTasGG>Sq-j_dVE#~+n?|?YMwT0!u3(ldaVUEmbUn<4ffer+mt%rI$-;#E%Da{ zJJ!Tn53HYheAWj$|KS^e%QhRr^-<4f$Bn?o(&ildb4)d3_&H=_u=m2m+yt&q_Rpr^ z<~4USH1+swUi*}LYzs8?jHe&icIug%{$TTIORO!y=h7ehl|F3+R?qxx4OVNlXHLC- zZUav{$0^s(=ZRd)tuyWc*c^ARzuUrd{VmV;?a;O5^Xm3s_n>p9E&Uz{eu;SH9PEIm z9-ke-=2(sZ8QV^1>Y1mV!M0P+cy|G-dw%8GwkzCz`1xOZKKo>DcSEzU`X&GFVCTrO zC;uK`_2k+UtY-VP+Y6j_&aGTO=ho*o?~~S<+aF+aZu4BdH(V{x)!Ni-pJzdz+sxoXzJ$Q5}VxiJ~Nx&+V)h{KG^ih^OtMYg{Gd*+k?SsuC@1lxzFN0 zha1n@TtjLfa}5P+v-Y`lIQ0mMhxU=R-8yqI3T%uU=o?kFFaN0Jxm7-lVk~2e({?|w zZNo>`JnJ$B?z*V!I#wW*b3vmcqKAAvJZiFq8FdSV_AR`VUTv^xQw zcJ@=QpLsIB%Q6mQ`n|*{*z&!^$zZuQzn3@-Y%JrP3YPoX(RZMK3_h0HHrn(#iCSHJ zI(63W46yTK?b`j6`b>(4{W`0*TW73igN>23`x#g*YbXB+#aPA`r|mgl+h*;~1>3h= zTb3a2d2sdk{9Mkw*w+5b^|62U)g0Ez@e8myvKHrq)v~_Y)NG&e+t;kq1>mexV*V0M zJuxo?t2yShy9l0k_EWB3xxUL4>w6ittnZ~@x%ph*E5KRb%fWKj*LVJ}1fNK48*S#g zgjzj)`4w0#^XfJG8o0XtS5wRVoZb)HwP63wgSz&ssMW;RQD?tg4|cw--7hy%-$e0n zoWHK^)|tDT!N$mbxdp72{UX1CVk~2eZEL@71KXFxx*cq+?2S9X?hSQ)+&_1M)%`Br z7}ez*UvR@J)B4DjOk&pW6b`21gw^G zLYtcHv&OE6`AAd!9-O_Mn14W1Ps~TbYUMfc7(DIlr(D1CoLHU&#`K!^6t+mVqcIuhW&%ox>mRO&I%~!7b7jX6Xd+8=3I>Fk^ z`z^8L=DmT%pBC)z1jzO63)aW+daala?wpkOp6Sul53AeE09G4Fn}M{M5o{cF|7#%q z&}IUgOPl@h9ac5-YWHs=sBK^MZT-%be;+|De>0&qCj4yc`>xvEXa0Vce?Q?1YW1ws z_rS(;U-({*=hW=*{H+D!=%bc4bAWB*+NRB%aNC&QHu|Wg&0JvH_&a-PGdJ8ezHeh2 zebh46dBL`kd;ZM__8dyg`QhFN)%CIO3xL&gukmj{7)RY4zVoY=mbPxjq0$@TNPw3%xaYIU*iY3I7XHrV;G_PW0=^?DQ!`?Y>;x6W8M02?FM{SCEIa^07&Lot@I z#kTEF%#Fe2&y6;P8_RzAez-jMfz80)2h?*P*c`0xelXq^U}LHq!*|ZrvN!sH9eeHt z?$`cs_3c?rV{8dlvv_#^+1~HKwn8&zd7s!CuI|3I{Wf4@s3-3La5L|=XzIzk9azoc zb%N8OJMZ>r<}L3R1L5k)y93x5>Y0xn!S+X+eeq{!JAv&>?oal4XSllOqkI>zZPhc6 zYFW44!1gCGcLy6Y&mP9u1FoL;ZuSJ*PTiQhQmYxmx%~my82;X`dAwfj4OdUzAA-#r zKB(r&u@77y_1s6hz{b&LUVpDZEjfmO?MwL3ny39RxIXIf84fm%^K3syfb~<)eRL$) zbzHc%r|l?o^X1yNFIZpo%*B3S=fdB4PP@@?^|TuUwynD38ceMg|8ZcoJPV8m+aJHr z)Yg0!*dMLs(`wUxcW6T0#&+8CEHDwQ&Ael&<>vKSU^2K*&3zU)0IZK=n-+c`*s+z* z0tdm>^DJ;MSS`;2hk%Wvo@aqW!RFFtKPFMD*$>a_!@+8K7B~W|X7O-Lp4+xP3{88U z1&##!ETEn>ISOpN@>yUCTwf34=%bc4M}uusJ_{TJw~hI2qmNqJ91FHh`7H1wxNXv3 zebh46WTRau-dtlv^yW1cJ@=QU->MsA_EY?p%1 zp|*`SbN!N9-S!=<%N1aMCqdigV7WHiUj^1*+m+OEWBa?^SA%Dvwv9G@E~8c#|B5=# z8P|ZFJ8PdauA{!5;^CNYsO{F~c2D03Hb$N^ZUU?2IYWLe#aPA`r|r#P+h$+f0=94J z`nZ2?1*@mcZQ!)={&YLsb4Xnu&!IcO>e;7vf{ml@n14;JmY8>ejT!!%nx|iP!`-jy z`q-~~!0P(gk9)z!y|_4s?t`o69J(LuIi#MxJpeYAw#0rAY^*8uIrI=%KlSwKw_y8Z z-yM@&KiA1MbFQs3rr&`bWA^*QV6~h>+SF{Hec+mzk2KXI;G7GI`Fk|=#QXzTt^8TV zqwut|pK|@mb7& zV~f-FIq=N%!=DqmuU~+(l&!z%rR{l&eSDT$TiU$>RttX>Y#+k^TJx;iYjD?1T_5+- z>tOYK#(V>;<`M00wPv59{k_(_|3rJU)_hJK$XJa37Md}QVHz7KYc>iWws?cH8C*U-7QPWyj=ZJ&Mg0az`2 zQ=6LWo_*mOru~Ot*Dme<30F&dZED%eAAz$c6XRcK>WT3&SgriI&?oS;b6j%$%DucY zxs2)k;B#!bAAAOuYx92aCD>TT`2sBWn%#x%EAaW$w$Y}~r_|~h!#7~H@_FrBxcUS2 zdVU91^KY&g<7=>5V)UYu%^1_5sXtuD=m4wDUB_@>YMHlAu=9I#?cW=&R?fYe`Tbqi zoZr)e-3Qj5-_ub~Pw{X*XQ=Jg$u%R`7&*UZ0;}cxmiMI?%h=+yodsN;-?PGVerwD5 z?eEuWOS|uZ)xu{7+lQPVbAmlT^wSoxQo)%95d&A&aVo_mjff6_SW_QT&5R!hu9 zz{X5Y|3;;K)z{x6mdEDbthBv0f2UZUeYO<1xzCnHQ`dh*c{}*`M0fY@a>p{z>0g0Oy=f%oWkp6LTf7 zn)@*AR)(jY{gmrhUMs%OIE;y0t;#>SR`@&Da&2BKRtM)=;qPC|y;h9Ewg&iOYTIb@ zKESD3tqIoV;XB#JSqrXie~c$jf7b@5zZvH`XzKA<7i=HB<`_e+PdO%kJ}#e&+O@Ej z&tCI6scq};jptghAy{8)uLT=ZZ$j~~?WVQeI(^$rOv$xibFf;j1@et3#xl0pwtg1w z2i~IQ9gL+v*k|j+-bx$Aer`!E&-YzhgZ;is-SxNqHeh3D^Ru$wlMeu^C+4$BVfGrE z)4$hbf99gLy?+Za?b)KOzcWw8-|U*&-oGQ2vCRv%y?^gJeKd#1i9Ma@2o9kbU3 zxq9+04>qrR+21)|k>c;1FGtZ9zm>q+?4RS3$F?$9%^c#)t82Ch#lyb|oOM~S#?IYB z1@^ncR)49pCsrk%{^j%7YG~@ozdG1B+23ox^-=d4Z9mootJ_C$`sn*=%Thd+qNI;Y z*LZR2WhnM*IqIyn|DE`9?Kdd6dvD`{>$hoxZ(eZyw=B5+TNm8FXSHq3GcW7H?N>Q3 z>!GRVIdy%onrrF0*=M!P+lFAZ%-cp_HTQ`=&f6wn=fd`mNiKFg`nyLxe>MaAH~96@ zrjK)?o_t$?%Y6OeYWbeud|Sbj&pDAB%lXhh`L+R@PakdiIH&5#x1E@hIolrWJUVCk z%UeE-)iLY!AF7jt$F5acewp3_t+k2 z>e*v^g4MFe?6X?d;0Iu}?6JMUYULgq1a~f66UQVMJ0AVB=3QXdTpw-vI4A1KHw0Yf z8wyt|_tuuCC*Mf0`Sj7Ik8`S?eEWgzL*{HW*m=wzlj{@zF<@ilyZ^CZ zHQSG)9#64-_Ly8B+q;kUukG$JarT(+#jQ*6SgTdq_rSGlyax3;6!+MA)Y(&$h*9pb zg9`4RIke#V9bWJw!AI3RrjKJ(PrfN&wT$6tu;a=a%JtFTc|NALy9VN{f$w2$O7Yl; zlJk7y8gD?o3B@(oj5=#@95Ko@IH};S!Knq;@5c>(M#1$zv*7xl-QedGT>oDbT>lFi z{KA6ke`&$>zr5gAg0HH1=JR;?CisY>YS|OciCWg^WUyNH#3^94a!;HF z->`F;W}^ZgXA*01*QUUe2Y`J8jPv7B%HlkaC> z^Xa2aAJ}Kh@yR6kPvj3$Fk34gO-m^?$kG`oG%XuN7SXzZYEp zw;KGNg6sc}g6scbgMUz*9F)A+XiPjyVplvh zuK&yh_wQBCR`Z-+caq-g zz&$7zyZ`jhHR3_A*9d*I>Ej+&Prl!R%Y46stM#jWye2&YPCoar+*s~k{gdwxVDsst zO&`wz_2hdDT;_Wmu2x=ipM)o$=YZT;?tlH0?`g34^wFk|=a72x{SjQ|`x9L4;@ZdY zJqJ!c&mp<7Jb(00z8Ape(?^>=o`dSi_h)dK?`Jcs4R^8D35`Q8SbPakdicnwfbzIVZ8zW3p3 z@6|r$`v9DLUIXOD^8D97`ThwupFZ03@fxC@eE$NM`96WGeO&vP?^AH{c@2>p%j<{! z$@e+feEMk9$7_&!@_h*|^L+(Zo4)oj-#6go`x-1a*0n+{y&n*pxoe>)@jW&$Ul z*Fd?ky#DE*e6xVfr;j#$yoRbL-}k_GGu~VyXNP;;^ctzZT%Y*Q0rr}aXMj23YO&7+ z_8gCWZn#?P^ME}kW1knU7W;hQ7YqCRaJ78ry8zgn#`|kJL3xe(YK-$}Px&Dd0 z5ZLo2xfh13#l8sG{T=(FaJ7NN?@#>2z_w90=i<~$P|Uepol~w~VlD}G4=3hQaJAT% z2D|5CUk0w0oXdi3qn@10fz5eSol~w~Vy*yoUnS;>U^UzOoVXI$_P%H7JjwM*`|pF@ zCuzS5SS{^W1>4?t6KyZo$M!zUtp?WabDlWQc{^a+h2r6VD=W`=JJoo5>YXV*=j}?J z=ejkC;r%^)-GciZutCA~+o-`eDY*Wd7hL~-1)q*N-LmG6SNmFU`{g;2Ia(V{J6reP92k6?0EFgdA%{%^I9Km`Zy=*$+s!E%(od_ zt$c3S0-k)%iQHJuhyKaeA8bB-wCUrVswdx8VEd3c+ZyaV<~kzRC;r=jjqwn3?Dve@ zg4G64+;_e=x*b^kL44%fgVpp&oPl8Dq|FXswY1q0tY#a}se#1V32ZEF_SgS*&@L4F zn`?($Kl8Y6cdhO2X>s=S9@zG#ce*jj?9<>i@nadx7)v`wifz`@A+68xP?g9HK7u!Gm zvuB2Y-81@V)5kHYC*N?eTCOuAz-o@k>(ofFtlQ8eN=6CO~hG~E^Nan9)l@a zlOZ+Uhk7W*H5pEwH5pBea!tk;+%=h4aQ!A1{6O$QHP4!ift#mXld)*(S(9;KwXBJK zP|FXOaQBuYcdJ$*qmegC>Ps5{j(+qfL#-PwCUp*)sydFuv*4&2-tCD4dnXh z?>rw`+g$^3*1-1##!x)=rDP5EtMN$c(G=HUEOpl42x63LaCE_4gC7-KzvByjBKV}5 zr~gO7%~P(yQE2K}gDGIOtbu({%bXkoR?8Y33sx)F;5fKrb58A}Tx|dJ&l;Qnb`A8= zrjKJ(Prj4EY8k^RV8@j;kn5wr^L%P;cMZf@gZ;5hrg-?@Y0Mf-tnqm2Nfg)M0P3v4 z>BPtyIOk^;T>b2tr+;U_jZ@C?Ptepe$3F$DImh zXw%0&s%Os50juR*vh%=d=ThSHbFe{+Gbj zGoP1%?ThncPPy28`Z}ME;R>)nd(%go<5bHy{kffgKik9qZfC}Mc#R$B5fsOH6m`aV z9WgS_#nEr5dB%A)+;-(Se}$%=ab5#f%QzRq|5~_u#(6#1zBo2>%Eji>*Ks*m0gf zahxYnXPgfZBjfaEWe?Rn(dIbSGETo^K8@mWG9}|YrN)l)REp#LF?GiI7%?)=4bY#cdB*t&+;-(S ze~+e~asC0UmT|6+|D$mAjPr4@eQ|8&l#9)$uj6zKPl7k4)<>J;RLeO1jP+BB$LW-e z^Nboh&Yw^m=b6+Q=X1o!IJZE5q2?LqGjQ9Lz8RuV#k#YK&^7Wc$ zoG-y`SB~>#H1&-06|h>yxgGwm!qqd**TDA0v6)jYHlMzZ(=ogO_H(a3+8n1^#_4m^ z`4o@yC>iI^YwS3GL2;ZHP-mR)5+mc>2mSq;XPj@sZC8%-Ej0Cv^KGzN#yJT8ci`$7 z=X+rL;@He77n@IC$LSdU0Uk!Jk2c4tmT~&5axul@mz0e2!Wuiyiztrs66%ce6JlhX zBhf#tdB*uqxb4bueuSo;asCUemT`{2|6{m%#`$mXh3JmWoN}@G^mUw$;WMz$w)$vu zoN5{8<=C#Kcw9lrIIpbnWz<(u9Otj79jD{_k{B7M^|u9|4c@Dxr@f=Wdly{)z6Cel z^bI~^!S$b|;QG(j;IkK8|G5gT|2z#oU%~ZXu;BVH+~A8AT>m8suK!X6_rI^VY|XO| zzGA+d*K!|xji#PwzHh*4dDeH%)!YMq5AhvXE&GP$Z)xST{xoQ=rF+9Qk&9gq{oNID1Ts*g5(TvPSr>jN(HO$%2mzo(fFo_wyU+*qyk1Sj7NVDsstO&|A!dh*Q#F7wR{ zS39rQ)bn6gc=EX?J8=%0Mw1Dj7DZTh&U)RS)xaG7sTxZ1@-;KJIDtQu;-HJjXCA|CFb|Ru4`hh0#=KCRj}(2`)XjdUVqmE+y16{%yNBf z@AZ5A+U~VooNN0v*lwhFTu1TRel7L&1-=37wf!b)=Y0Ka5+!M_9XnmH{UmtU- zo74V%hlkiX5SMd(7i~StxxNFQdA}2E+uu;9uX__mpUlY*;cA(aeZU^hiMBzM!4%_& z%Q;a`+#z7|CGJqTTGntl*u%KmhEYaRj4LkJP(5)+f$eYRc3-%CRgcepU~^}#N5l0~ z&s>iImvgO8VvYqHQy=>ww_o--^Y6Tr^Y6KEFU6xgPw$31|DLn=P>gdQwa;K`2N1_+ zjqrnN?pTaD0d6~guT4G?uC_mAAa{MWN#dg9+?dkq+0L^ha&yLyn`nq47BkjraOR#+jzYy-+W-cy* ztGQ1y7Z-!o&6{?YfQ=n~DcHDaa~WJ8^~~4hU}I^^d|d&yPuddeN^sf7tKelHuZF9Y zef$;N{%K2`Yrw`y{%hg-smJHK+9&T|JyiYw$@%Swz=g05Bo*$1;`z+)A`*zx?=QE0J z??6+J&z-eTKax8ReeOb2kI!#vpL`b3=WaChT&M2=+y7*QO%0B)UO+Eei9oRlDNwK~5*d8uy=GWJ?cC3$p9fLluhrC>m zKj7n0uE+1;uE(R)xn4a=JFi!sm*OWW**i~xZ4>@9T%R-RK0E`~N8LWi(+970Pf$D_ zqhwD!4z>?ZQridj#Iv+3?_Fa+{(8;Rujk>$bquzZ`}?2H(+gndLS4JL)Url@ z2HUpWkAFc^kIzfBPr24Fqp8Q|mD;CV>sQg#vz~tiXRU3oJ+{{hoB8#%zm8p7^1K0V z_V;gS>hbw|?Nj#mO*HlRyjA;@{e2rvJ$-ryob$)_+GBgSu$f<9`|H|h%X#}A*fHGB zdiXs4K3Hul%4hh0K<(kPoVI^Z)Z8QD#Q6~H+GWlE33eW0|ERX-x#nMRwUk^VKSr~y z_O$&3Z0y``{teboJwBg;liz*y8QgK@eEb}&k9zv>1z0`BXG+hDFVW1QJ-%Oo9b?Lr z+V^WTZMJcK9kZIh>zjG9PCvf^y9RgG^ZhMYZ6L+@W|~`v^R4YWikkB+PMlt78Lxew z242p0M{Q64JK<_6neX0cw$+~4eZa=f+)WF&f9hF-zF^yGOS|d7jxBt8co}B~xIXIX z*NkBGl&rx_Xy(u!-6UF5<@sH>pPf>DB ze7eS7>z<*w7Js77HF{2Bl-I}kYo2_w!;O)7nFDT|*ypP4_T5Tddveh zhPKSjykPZ|%*}jg=GSg~`=*xPzh40CeL&s$kY_%az3R^tk7p^)hjZ{;fuAq%3k7}= z>^%L2I^$lL*!qMo0ykF9g+<}|sCzCfPVM2jplvbAN)+RY6K4sq{Rm$YZrse*QgD6L zLEV%6Na_}Fc@2)Axb)LsoBh#N{w)Fb_$w5Tav#40&l;-+f3W9?Hut)G9cI|;;+9~qjrPer zw$&$Xw-Qs**R8=BoAKl=ALe8U;%oyqPW%UeGdBI@`Xv6gU~|TQJFxzaO@FyQUNfA3 z=h``s|3Gm1lbAc8smEu>+NYeaozT>?);oi3r|w$sO6}oVYukk~iei3oV($)a=HCNN z-Tr$mk;i{8aK@MZ{s2u~f3G$2`2P^Bf4P?jp{eWdwMd>=UEr+sK45v)dNA0vwom4< ztv+cx1gtH&hk`RUbIJ9I|1hv|;y)amvFR_@C;lVA=8XSHaK@&;Tp!ok`FF0J^Z4%v zPW;3ijizpUueYv;T? z&phAcUUyxK!>AMQaB%V`=MiY?@j0^gDbKs3(A0C@O#$0Z-Sh4kY7fslZAVkirkG!x z*gpbiJjs6?n!4jVmRcVF6Tr>>o`|Nd|MArF_@4~czwG-dXzKc(L@iJ5)4q>Ce`U@v8_I7do@^Fa{mgPv6)M*PyDX|8z=tPf-^S#<@&_`IT4*z}j{6aV|c=8XRX;EYXw zxjyAwJLlzj=J_UHgW9#QHol*I9t0cD&$Hrup4Ij@ipO6mYmw_(>emYVdX4=Y^ajP) zf2Yo8{ofHUpOI|)a)ZCx;BPee-wWIzNrQjh;9oWPcMU#G@2UMWe%}V4p}}Wq z@b5MFTn#>N!5#m?4ZdiDFWKNrH~2aYzJ9^&|AqxO-^LBTS;1S+_yyO$e}ivbaQz1q zT>tGFe20STzhlAm-=)EKFS!1D7F_?m8+@OF>p!^Wo(Jx=WB6?EzV3tVVYqwJd%z1| zkFTmlTl({GzYBhZ+RrDyr>1H32WtLbJ<30Xt{$T{*5lOf<0q*7%=jerbkt8#`(D%2 z)H6^&Lp>w)AE{@e{uA}g)X!4SLj4@I=ZN`p{tY9M=TXKW_guBl`r60%z6kdG3;#3R zw)r{QU*P(vC!Sgv&#|WcD`4a4>$xe9?XTeU%kxy8pNYQ)_GjX@(Ux55WiID4@%{!* zJkN7^Y;S_o56^jda=iuieFEEPOD^>?mur@I?|{pBdKYePzwh_D_8z<9+}y<9-M?u0NyGS9{`WE91JSa!vmi*tq4h!N+Low)eUxkN>~H<}Lj{ zMN`+`>!RE_Tmrw(z`lQE9Bqm71=zgh=e{q|)Q#iyR387Y!R9Ufzd=*i-|MYBdA|jl z*Ere|$CJyv<#SvwGgC#ao+tNo*qUoIJ({}hy=TbdKO?xgHZ!5A>+d~9p1#fu_I)MeXiJ<~!OgXq4NcuR z-ize%pB>y>n>oxxe<7ms;EC_Zk?3X^ab#2tkwei}U^KlVu_Elf+t@79w1KTfc-e=|Z!SjD{u-6pZ zXiF~jGMCr)#9InmaxDp#$F>YOxx8n~lWSSg{eQ8a&e(D*+T43XAOJCK>zIq=`-gU8=S6`olkn?CMq z^>VB}Dhns71*(=$A24e`sy>A+&lxQ^-o{61v^%Kw59#_;I!WkEKk0H zV8^O%%pItWBi@l(d*bf|cC7kn%UIRRvHCoe+`D2+?p?t0p zqb+?=FZ<#%Ut*8M=05RrnK+-z`Vr@SipQIjd@g&dz;D<1*VOM6_}v=&Ec+hC=gWUk z=Vw~`kw;tj=mx)_!7pm?M;iRGg8MxGRLvc~x$-kR^N1b0&)Z|*_RnYc!@(Y3@s^?b zVU%9*vDDL0kE8b4eLOYORqapB|Emf7W2}kPj%gCL&+e0{eRe;9dV1;useN`ohj)ZO+9K`hweT#s;6W z;O1Mf!PjW;wF+*3*J<$e3vRxRYVNuMtJfKi^Kv!UvcA-Bz|}5hfqZuRJJ`dYy=nU! zMa_8>8>b)kH^I*PCd9EHZ^4~=<75xLji#RGn0LTl^VPj38|PiHv9u-jdthU^*YtTG zuAjPlLT-QTSMq-dZsz|dntJx^zrboAQSv_9$6))U&GW+jp_ab<8*JSCw|_o`t64nU z*Y4wt`7?B5h z`t9PYSv;Ek?uFeL>Gw2n+o&7g^FYn`nmYN%eU#r7?*muMf78zML`{FMYtw-pyRke+ z{#|Su$qT|)bii(^ID)5|9Qb` zIalWctGQP^R~G<#c&=)jpRzi|b3<&Le%KcRmwRDhxSGYI+zZa@BIx!#^Rp+Ae@t<#=$SrV+4yi0+bd6!00kIypT=GrZbrXHW=z|A-O6~V^RHib3wKDZLtK4{B5Ze_52_lWlWT665tR;jh}zPBox?e*7g ze6MlpuA}Rj`B_t2eV%w!GQ;4&FoL@!tU4oUaYh)b;ls z)8h5DU}L!ZRGar3`8s@J@5k6T0l!aef9;pKY_Ff=)b2Rl%gx_O{giedk5RnWdw={l zMgPyJy@zj3yDcc?J$dT}-@fLVtA23f+{2nqVa>OKt8Gbf48~K7|F&TL-4~u8+rbA= z)b%%?TKsne>z|)p?E-fn%tz6-GbOQh1@A!7$GvF$J;3U_Q;cu_)e?VCusOr`0_!7p zJU;+ChWw7?-e5KTZ0o$M<+;k7Ur;>Cx&9pPTz^TOx!#9%hnG{GP-JxSI2=zxmYSKMJhB=cnV?7p~^qCB}YWb>}&2G8UXQ(LRP^ zeEY90@yCJ989pAYkKDQ5AM6-1*Au{M`q|dGR?A%XqmSQEJiem1ubt1YDbDq`)Xuff zwUcRA&h^1HH#e|4fPZY~&lCDl9|(6$8&kAxU!Q{qfwfuaGFjSwRIM?aM<3(%Lpubl zmS=}U!DZ9SqLRcq#p zHl^0eYv|Evw%1>~v7LAI%sa5^Wgw34D9*cc>|mVtX{hs=;72$+@0pL|T8*d9$MJBr zmfjB0Js-B!p7}Td>~%~%^Kl~ByybkHgr=Txo(#6FN3>IF&0$14wbsh{I1SDA`fE3~ zYh_Mt8P|`&YS|~J!__R!ec~R|{S5vw|5_CNooBVoa|gygI&gGSXMgtwJI~Wno8MSx z@{jt7>>c@8{G;a2jPs0iHe7xBqTSEnwmYtFcMe>wY z_YB0Fh2k+Iwf*i(JyVVSTh}vF9K)>C?iKgQ`NYUMx-*M#S;5t>D7gFW`ht5uyS3o= zf$y)m>t$@;7w|i{3&7^K_P@n?A@xNR5A7G%cI(XVC17LRz&!a`?^3XubLlgq{FfAC z8Cz^y*YI+%V^6Fr;l{FGj!Etw*Y_&0Yp#A&tz8W^hBp5$%|P=13asvV;9Ok;c251f zHs;aiS~PXz$gcz2PTkzjubTchQ2&~8Q_c0i8LZD>+V_Ls0@g>}_RhbW?fYTB4Xl=H z-R)pCiw9j}X4-9CEA2VA?*MzPQ_s15C)jwdTh7tD;QD&l2YuAi<~Ly5_>M-}+zq#l z`E8?*TH4$LwvBr}ZSIBJCjHe%Eo=Ay*fq@99|Rl2nC{Jo!0tc&%qiE${pDVBk60(( lZ^6cMt*ENs@sC>mPLVdXa{s#5Z14H@FxY&ai(=2k{{?MLcC7#a diff --git a/piet-gpu/shader/gen/kernel4_gray.dxil b/piet-gpu/shader/gen/kernel4_gray.dxil index abe1d225b002617025777d5c355ec77cbff70d71..d48974d6811f75016bae7d23cf71a05a570a3b9d 100644 GIT binary patch delta 9276 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 LH1MB0V?X~3NyVZV delta 10523 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 image_atlas : register(u3, space0); RWTexture2D gradients : register(u4, space0); RWTexture2D image : register(u2, space0); @@ -347,10 +347,7 @@ CmdColor Cmd_Color_read(Alloc a, CmdRef ref) float3 fromsRGB(float3 srgb) { - bool3 cutoff = bool3(srgb.x >= 0.040449999272823333740234375f.xxx.x, srgb.y >= 0.040449999272823333740234375f.xxx.y, srgb.z >= 0.040449999272823333740234375f.xxx.z); - float3 below = srgb / 12.9200000762939453125f.xxx; - float3 above = pow((srgb + 0.054999999701976776123046875f.xxx) / 1.05499994754791259765625f.xxx, 2.400000095367431640625f.xxx); - return float3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z); + return srgb; } float4 unpacksRGB(uint srgba) @@ -477,10 +474,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 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1653 = fromsRGB(param_1); + fg_rgba.x = _1653.x; + fg_rgba.y = _1653.y; + fg_rgba.z = _1653.z; rgba[i] = fg_rgba; } spvReturnValue = rgba; @@ -488,10 +485,7 @@ void fillImage(out float4 spvReturnValue[8], uint2 xy, CmdImage cmd_img) float3 tosRGB(float3 rgb) { - bool3 cutoff = bool3(rgb.x >= 0.003130800090730190277099609375f.xxx.x, rgb.y >= 0.003130800090730190277099609375f.xxx.y, rgb.z >= 0.003130800090730190277099609375f.xxx.z); - float3 below = 12.9200000762939453125f.xxx * rgb; - float3 above = (1.05499994754791259765625f.xxx * pow(rgb, 0.416660010814666748046875f.xxx)) - 0.054999999701976776123046875f.xxx; - return float3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z); + return rgb; } uint packsRGB(inout float4 rgba) @@ -529,7 +523,10 @@ float3 hard_light(float3 cb, float3 cs) { float3 param = cb; float3 param_1 = (cs * 2.0f) - 1.0f.xxx; - return lerp(screen(param, param_1), (cb * 2.0f) * cs, float3(bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z))); + float3 _889 = screen(param, param_1); + float3 _893 = (cb * 2.0f) * cs; + bool3 _898 = bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z); + return float3(_898.x ? _893.x : _889.x, _898.y ? _893.y : _889.y, _898.z ? _893.z : _889.z); } float color_dodge(float cb, float cs) @@ -572,8 +569,14 @@ float color_burn(float cb, float cs) float3 soft_light(float3 cb, float3 cs) { - float3 d = lerp(sqrt(cb), ((((cb * 16.0f) - 12.0f.xxx) * cb) + 4.0f.xxx) * cb, float3(bool3(cb.x <= 0.25f.xxx.x, cb.y <= 0.25f.xxx.y, cb.z <= 0.25f.xxx.z))); - return lerp(cb + (((cs * 2.0f) - 1.0f.xxx) * (d - cb)), cb - (((1.0f.xxx - (cs * 2.0f)) * cb) * (1.0f.xxx - cb)), float3(bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z))); + float3 _904 = sqrt(cb); + float3 _917 = ((((cb * 16.0f) - 12.0f.xxx) * cb) + 4.0f.xxx) * cb; + bool3 _921 = bool3(cb.x <= 0.25f.xxx.x, cb.y <= 0.25f.xxx.y, cb.z <= 0.25f.xxx.z); + float3 d = float3(_921.x ? _917.x : _904.x, _921.y ? _917.y : _904.y, _921.z ? _917.z : _904.z); + float3 _932 = cb + (((cs * 2.0f) - 1.0f.xxx) * (d - cb)); + float3 _942 = cb - (((1.0f.xxx - (cs * 2.0f)) * cb) * (1.0f.xxx - cb)); + bool3 _944 = bool3(cs.x <= 0.5f.xxx.x, cs.y <= 0.5f.xxx.y, cs.z <= 0.5f.xxx.z); + return float3(_944.x ? _942.x : _932.x, _944.y ? _942.y : _932.y, _944.z ? _942.z : _932.z); } float sat(float3 c) @@ -706,8 +709,8 @@ float3 set_lum(float3 c, float l) { float3 param = c; float3 param_1 = c + (l - lum(param)).xxx; - float3 _1052 = clip_color(param_1); - return _1052; + float3 _1048 = clip_color(param_1); + return _1048; } float3 mix_blend(float3 cb, float3 cs, uint mode) @@ -795,9 +798,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 _1343 = set_sat(param_21, param_22); + float3 _1340 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1343; + float3 param_24 = _1340; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -807,9 +810,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 _1357 = set_sat(param_27, param_28); + float3 _1354 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1357; + float3 param_30 = _1354; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -918,12 +921,6 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) break; } case 13u: - { - 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 min(1.0f.xxxx, float4((cs * as) + (cb * ab), as + ab)); } @@ -940,7 +937,7 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) float4 mix_blend_compose(float4 backdrop, float4 src, uint mode) { - if (mode == 3u) + if ((mode & 32767u) == 3u) { return (backdrop * (1.0f - src.w)) + src; } @@ -949,12 +946,12 @@ float4 mix_blend_compose(float4 backdrop, float4 src, uint mode) 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; + float3 param = cb; + float3 param_1 = cs; 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; + uint comp_mode = mode & 255u; if (comp_mode == 3u) { float3 co = lerp(backdrop.xyz, cs, src.w.xxx); @@ -992,16 +989,16 @@ CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) void comp_main() { - uint tile_ix = (gl_WorkGroupID.y * _1749.Load(8)) + gl_WorkGroupID.x; - Alloc _1764; - _1764.offset = _1749.Load(24); + uint tile_ix = (gl_WorkGroupID.y * _1681.Load(8)) + gl_WorkGroupID.x; + Alloc _1696; + _1696.offset = _1681.Load(24); Alloc param; - param.offset = _1764.offset; + param.offset = _1696.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1773 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1773; + CmdRef _1705 = { cmd_alloc.offset }; + CmdRef cmd_ref = _1705; 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]; @@ -1035,8 +1032,8 @@ void comp_main() { df[k] = 1000000000.0f; } - TileSegRef _1867 = { stroke.tile_ref }; - tile_seg_ref = _1867; + TileSegRef _1800 = { stroke.tile_ref }; + tile_seg_ref = _1800; do { uint param_7 = tile_seg_ref.offset; @@ -1072,8 +1069,8 @@ void comp_main() { area[k_3] = float(fill.backdrop); } - TileSegRef _1987 = { fill.tile_ref }; - tile_seg_ref = _1987; + TileSegRef _1920 = { fill.tile_ref }; + tile_seg_ref = _1920; do { uint param_15 = tile_seg_ref.offset; @@ -1162,10 +1159,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 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2254 = fromsRGB(param_29); + fg_rgba.x = _2254.x; + fg_rgba.y = _2254.y; + fg_rgba.z = _2254.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; } @@ -1188,10 +1185,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 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2364 = fromsRGB(param_33); + fg_rgba_1.x = _2364.x; + fg_rgba_1.y = _2364.y; + fg_rgba_1.z = _2364.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; } @@ -1205,9 +1202,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 _2474[8]; - fillImage(_2474, param_36, param_37); - float4 img[8] = _2474; + float4 _2407[8]; + fillImage(_2407, param_36, param_37); + float4 img[8] = _2407; for (uint k_11 = 0u; k_11 < 8u; k_11++) { float4 fg_k_3 = img[k_11] * area[k_11]; @@ -1222,8 +1219,8 @@ void comp_main() { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; + uint _2470 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2470; rgba[k_12] = 0.0f.xxxx; } clip_depth++; @@ -1256,8 +1253,8 @@ void comp_main() { Alloc param_45 = cmd_alloc; CmdRef param_46 = cmd_ref; - CmdRef _2615 = { Cmd_Jump_read(param_45, param_46).new_ref }; - cmd_ref = _2615; + CmdRef _2548 = { Cmd_Jump_read(param_45, param_46).new_ref }; + cmd_ref = _2548; cmd_alloc.offset = cmd_ref.offset; break; } diff --git a/piet-gpu/shader/gen/kernel4_gray.msl b/piet-gpu/shader/gen/kernel4_gray.msl index 964700135..8c608c384 100644 --- a/piet-gpu/shader/gen/kernel4_gray.msl +++ b/piet-gpu/shader/gen/kernel4_gray.msl @@ -393,10 +393,7 @@ CmdColor Cmd_Color_read(thread const Alloc& a, thread const CmdRef& ref, device static inline __attribute__((always_inline)) float3 fromsRGB(thread const float3& srgb) { - bool3 cutoff = srgb >= float3(0.040449999272823333740234375); - float3 below = srgb / float3(12.9200000762939453125); - float3 above = pow((srgb + float3(0.054999999701976776123046875)) / float3(1.05499994754791259765625), float3(2.400000095367431640625)); - return select(below, above, cutoff); + return srgb; } static inline __attribute__((always_inline)) @@ -528,10 +525,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 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1653 = fromsRGB(param_1); + fg_rgba.x = _1653.x; + fg_rgba.y = _1653.y; + fg_rgba.z = _1653.z; rgba[i] = fg_rgba; } return rgba; @@ -540,10 +537,7 @@ spvUnsafeArray fillImage(thread const uint2& xy, thread const CmdImag static inline __attribute__((always_inline)) float3 tosRGB(thread const float3& rgb) { - bool3 cutoff = rgb >= float3(0.003130800090730190277099609375); - float3 below = float3(12.9200000762939453125) * rgb; - float3 above = (float3(1.05499994754791259765625) * pow(rgb, float3(0.416660010814666748046875))) - float3(0.054999999701976776123046875); - return select(below, above, cutoff); + return rgb; } static inline __attribute__((always_inline)) @@ -585,7 +579,7 @@ float3 hard_light(thread const float3& cb, thread const float3& cs) { float3 param = cb; float3 param_1 = (cs * 2.0) - float3(1.0); - return mix(screen(param, param_1), (cb * 2.0) * cs, float3(cs <= float3(0.5))); + return select(screen(param, param_1), (cb * 2.0) * cs, cs <= float3(0.5)); } static inline __attribute__((always_inline)) @@ -631,8 +625,8 @@ float color_burn(thread const float& cb, thread const float& cs) static inline __attribute__((always_inline)) float3 soft_light(thread const float3& cb, thread const float3& cs) { - float3 d = mix(sqrt(cb), ((((cb * 16.0) - float3(12.0)) * cb) + float3(4.0)) * cb, float3(cb <= float3(0.25))); - return mix(cb + (((cs * 2.0) - float3(1.0)) * (d - cb)), cb - (((float3(1.0) - (cs * 2.0)) * cb) * (float3(1.0) - cb)), float3(cs <= float3(0.5))); + float3 d = select(sqrt(cb), ((((cb * 16.0) - float3(12.0)) * cb) + float3(4.0)) * cb, cb <= float3(0.25)); + return select(cb + (((cs * 2.0) - float3(1.0)) * (d - cb)), cb - (((float3(1.0) - (cs * 2.0)) * cb) * (float3(1.0) - cb)), cs <= float3(0.5)); } static inline __attribute__((always_inline)) @@ -771,8 +765,8 @@ float3 set_lum(thread const float3& c, thread const float& l) { float3 param = c; float3 param_1 = c + float3(l - lum(param)); - float3 _1052 = clip_color(param_1); - return _1052; + float3 _1048 = clip_color(param_1); + return _1048; } static inline __attribute__((always_inline)) @@ -861,9 +855,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 _1343 = set_sat(param_21, param_22); + float3 _1340 = set_sat(param_21, param_22); float3 param_23 = cb; - float3 param_24 = _1343; + float3 param_24 = _1340; float param_25 = lum(param_23); b = set_lum(param_24, param_25); break; @@ -873,9 +867,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 _1357 = set_sat(param_27, param_28); + float3 _1354 = set_sat(param_27, param_28); float3 param_29 = cb; - float3 param_30 = _1357; + float3 param_30 = _1354; float param_31 = lum(param_29); b = set_lum(param_30, param_31); break; @@ -985,12 +979,6 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons break; } case 13u: - { - 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 fast::min(float4(1.0), float4((cs * as) + (cb * ab), as + ab)); } @@ -1008,7 +996,7 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons static inline __attribute__((always_inline)) float4 mix_blend_compose(thread const float4& backdrop, thread const float4& src, thread const uint& mode) { - if (mode == 3u) + if ((mode & 32767u) == 3u) { return (backdrop * (1.0 - src.w)) + src; } @@ -1017,12 +1005,12 @@ float4 mix_blend_compose(thread const float4& backdrop, thread const float4& src 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; + float3 param = cb; + float3 param_1 = cs; 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; + uint comp_mode = mode & 255u; if (comp_mode == 3u) { float3 co = mix(backdrop.xyz, cs, float3(src.w)); @@ -1059,11 +1047,11 @@ CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Me return CmdJump_read(param, param_1, v_297); } -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]]) +kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1681 [[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 * _1749.conf.width_in_tiles) + gl_WorkGroupID.x; + uint tile_ix = (gl_WorkGroupID.y * _1681.conf.width_in_tiles) + gl_WorkGroupID.x; Alloc param; - param.offset = _1749.conf.ptcl_alloc.offset; + param.offset = _1681.conf.ptcl_alloc.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); @@ -1226,10 +1214,10 @@ kernel void main0(device Memory& v_297 [[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 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2254 = fromsRGB(param_29); + fg_rgba.x = _2254.x; + fg_rgba.y = _2254.y; + fg_rgba.z = _2254.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; } @@ -1252,10 +1240,10 @@ kernel void main0(device Memory& v_297 [[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 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2364 = fromsRGB(param_33); + fg_rgba_1.x = _2364.x; + fg_rgba_1.y = _2364.y; + fg_rgba_1.z = _2364.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; } @@ -1285,8 +1273,8 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 { uint d_2 = min(clip_depth, 127u); float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; + uint _2470 = packsRGB(param_38); + blend_stack[d_2][k_12] = _2470; rgba[k_12] = float4(0.0); } clip_depth++; diff --git a/piet-gpu/shader/gen/kernel4_gray.spv b/piet-gpu/shader/gen/kernel4_gray.spv index 2dd46c0c42af01cab37314c1ccd977a619948efb..6ff17912d610740bfa9563c86085fdaf0330ee73 100644 GIT binary patch literal 64424 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 M*nFOgV$a3@4`5AT`Tzg` diff --git a/piet-gpu/shader/kernel4.comp b/piet-gpu/shader/kernel4.comp index a0710d2a1..99fd22ee9 100644 --- a/piet-gpu/shader/kernel4.comp +++ b/piet-gpu/shader/kernel4.comp @@ -9,6 +9,11 @@ #version 450 #extension GL_GOOGLE_include_directive : enable +// We can do rendering either in sRGB colorspace (for compatibility) +// or in a linear colorspace, with conversions to sRGB (which will give +// higher quality antialiasing among other things). +#define DO_SRGB_CONVERSION 0 + #include "mem.h" #include "setup.h" @@ -39,18 +44,26 @@ layout(rgba8, set = 0, binding = 4) uniform restrict readonly image2D gradients; #define MAX_BLEND_STACK 128 mediump vec3 tosRGB(mediump vec3 rgb) { +#if DO_SRGB_CONVERSION bvec3 cutoff = greaterThanEqual(rgb, vec3(0.0031308)); mediump vec3 below = vec3(12.92) * rgb; mediump vec3 above = vec3(1.055) * pow(rgb, vec3(0.41666)) - vec3(0.055); return mix(below, above, cutoff); +#else + return rgb; +#endif } mediump vec3 fromsRGB(mediump vec3 srgb) { +#if DO_SRGB_CONVERSION // Formula from EXT_sRGB. bvec3 cutoff = greaterThanEqual(srgb, vec3(0.04045)); mediump vec3 below = srgb / vec3(12.92); mediump vec3 above = pow((srgb + vec3(0.055)) / vec3(1.055), vec3(2.4)); return mix(below, above, cutoff); +#else + return srgb; +#endif } // unpacksRGB unpacks a color in the sRGB color space to a vec4 in the linear color diff --git a/piet-gpu/src/blend.rs b/piet-gpu/src/blend.rs index 7edcb4e7e..f0ca002ed 100644 --- a/piet-gpu/src/blend.rs +++ b/piet-gpu/src/blend.rs @@ -33,6 +33,8 @@ pub enum BlendMode { Saturation = 13, Color = 14, Luminosity = 15, + // Clip is the same as normal, but doesn't always push a blend group. + Clip = 128, } #[derive(Copy, Clone, PartialEq, Eq, Debug)] @@ -76,7 +78,7 @@ impl Blend { impl Default for Blend { fn default() -> Self { Self { - mode: BlendMode::Normal, + mode: BlendMode::Clip, composition_mode: CompositionMode::SrcOver, } } diff --git a/piet-gpu/src/encoder.rs b/piet-gpu/src/encoder.rs index a24ddbc66..d0ef1eb71 100644 --- a/piet-gpu/src/encoder.rs +++ b/piet-gpu/src/encoder.rs @@ -306,16 +306,21 @@ impl Encoder { self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } - /// Encode a fill radial gradient draw object. /// /// This should be encoded after a path. pub fn fill_rad_gradient(&mut self, index: u32, p0: [f32; 2], p1: [f32; 2], r0: f32, r1: f32) { self.drawtag_stream.push(DRAWTAG_FILLRADGRADIENT); - let element = FillRadGradient { index, p0, p1, r0, r1 }; + let element = FillRadGradient { + index, + p0, + p1, + r0, + r1, + }; self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } - + /// Start a clip. pub fn begin_clip(&mut self, blend: Option) { self.drawtag_stream.push(DRAWTAG_BEGINCLIP); diff --git a/piet-gpu/src/gradient.rs b/piet-gpu/src/gradient.rs index e6559089b..443eaec29 100644 --- a/piet-gpu/src/gradient.rs +++ b/piet-gpu/src/gradient.rs @@ -19,7 +19,7 @@ use std::collections::hash_map::{Entry, HashMap}; use piet::kurbo::Point; -use piet::{Color, FixedLinearGradient, GradientStop, FixedRadialGradient}; +use piet::{Color, FixedLinearGradient, FixedRadialGradient, GradientStop}; /// Radial gradient compatible with COLRv1 spec #[derive(Debug, Clone)] diff --git a/piet-gpu/src/lib.rs b/piet-gpu/src/lib.rs index d32a9c53a..ba06e712d 100644 --- a/piet-gpu/src/lib.rs +++ b/piet-gpu/src/lib.rs @@ -13,8 +13,8 @@ use std::convert::TryInto; pub use blend::{Blend, BlendMode, CompositionMode}; pub use encoder::EncodedSceneRef; -pub use render_ctx::PietGpuRenderContext; pub use gradient::Colrv1RadialGradient; +pub use render_ctx::PietGpuRenderContext; use piet::kurbo::Vec2; use piet::{ImageFormat, RenderContext}; diff --git a/piet-gpu/src/render_ctx.rs b/piet-gpu/src/render_ctx.rs index dca03eb23..14f2561de 100644 --- a/piet-gpu/src/render_ctx.rs +++ b/piet-gpu/src/render_ctx.rs @@ -1,9 +1,12 @@ +// This should match the value in kernel4.comp for correct rendering. +const DO_SRGB_CONVERSION: bool = false; + use std::borrow::Cow; use crate::encoder::GlyphEncoder; use crate::stages::{Config, Transform}; use crate::MAX_BLEND_STACK; -use piet::kurbo::{Affine, Insets, PathEl, Point, Rect, Shape}; +use piet::kurbo::{Affine, PathEl, Point, Rect, Shape}; use piet::{ Color, Error, FixedGradient, ImageFormat, InterpolationMode, IntoBrush, RenderContext, StrokeStyle, @@ -13,7 +16,7 @@ use piet_gpu_hal::BufWrite; use piet_gpu_types::encoder::{Encode, Encoder}; use piet_gpu_types::scene::Element; -use crate::gradient::{LinearGradient, RadialGradient, RampCache, Colrv1RadialGradient}; +use crate::gradient::{Colrv1RadialGradient, LinearGradient, RadialGradient, RampCache}; use crate::text::Font; pub use crate::text::{PietGpuText, PietGpuTextLayout, PietGpuTextLayoutBuilder}; use crate::Blend; @@ -471,19 +474,27 @@ fn rect_to_f32_4(rect: Rect) -> [f32; 4] { } fn to_srgb(f: f64) -> f64 { - if f <= 0.0031308 { - f * 12.92 + if DO_SRGB_CONVERSION { + if f <= 0.0031308 { + f * 12.92 + } else { + let a = 0.055; + (1. + a) * f64::powf(f, f64::recip(2.4)) - a + } } else { - let a = 0.055; - (1. + a) * f64::powf(f, f64::recip(2.4)) - a + f } } fn from_srgb(f: f64) -> f64 { - if f <= 0.04045 { - f / 12.92 + if DO_SRGB_CONVERSION { + if f <= 0.04045 { + f / 12.92 + } else { + let a = 0.055; + f64::powf((f + a) * f64::recip(1. + a), 2.4) + } } else { - let a = 0.055; - f64::powf((f + a) * f64::recip(1. + a), 2.4) + f } } diff --git a/piet-gpu/src/stages/clip.rs b/piet-gpu/src/stages/clip.rs index 2fd195b94..b7b77ebfc 100644 --- a/piet-gpu/src/stages/clip.rs +++ b/piet-gpu/src/stages/clip.rs @@ -16,7 +16,9 @@ //! The clip processing stage (includes substages). -use piet_gpu_hal::{include_shader, BindType, Buffer, ComputePass, DescriptorSet, Pipeline, Session}; +use piet_gpu_hal::{ + include_shader, BindType, Buffer, ComputePass, DescriptorSet, Pipeline, Session, +}; // Note that this isn't the code/stage/binding pattern of most of the other stages // in the new element processing pipeline. We want to move those temporary buffers diff --git a/piet-gpu/src/test_scenes.rs b/piet-gpu/src/test_scenes.rs index bfd2af2d1..e3aeabaf1 100644 --- a/piet-gpu/src/test_scenes.rs +++ b/piet-gpu/src/test_scenes.rs @@ -2,10 +2,10 @@ use rand::{Rng, RngCore}; -use crate::{Blend, BlendMode, CompositionMode, PietGpuRenderContext, Colrv1RadialGradient}; +use crate::{Blend, BlendMode, Colrv1RadialGradient, CompositionMode, PietGpuRenderContext}; use piet::kurbo::{Affine, BezPath, Circle, Line, Point, Rect, Shape}; use piet::{ - Color, FixedGradient, FixedRadialGradient, GradientStop, Text, TextAttribute, TextLayoutBuilder, + Color, GradientStop, LinearGradient, Text, TextAttribute, TextLayoutBuilder, UnitPoint, }; use crate::{PicoSvg, RenderContext, Vec2}; @@ -200,6 +200,113 @@ fn render_tiger(rc: &mut impl RenderContext) { println!("flattening and encoding time: {:?}", start.elapsed()); } +pub fn render_blend_square(rc: &mut PietGpuRenderContext, blend: Blend) { + // Inspired by https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + let rect = Rect::new(0., 0., 200., 200.); + let stops = vec![ + GradientStop { + color: Color::BLACK, + pos: 0.0, + }, + GradientStop { + color: Color::WHITE, + pos: 1.0, + }, + ]; + let linear = LinearGradient::new(UnitPoint::LEFT, UnitPoint::RIGHT, stops); + rc.fill(rect, &linear); + const GRADIENTS: &[(f64, f64, Color)] = &[ + (150., 0., Color::rgb8(255, 240, 64)), + (175., 100., Color::rgb8(255, 96, 240)), + (125., 200., Color::rgb8(64, 192, 255)), + ]; + for (x, y, c) in GRADIENTS { + let stops = vec![ + GradientStop { + color: c.clone(), + pos: 0.0, + }, + GradientStop { + color: Color::rgba8(0, 0, 0, 0), + pos: 1.0, + }, + ]; + let rad = Colrv1RadialGradient { + center0: Point::new(*x, *y), + center1: Point::new(*x, *y), + radius0: 0.0, + radius1: 100.0, + stops, + }; + let brush = rc.radial_gradient_colrv1(&rad); + rc.fill(Rect::new(0., 0., 200., 200.), &brush); + } + const COLORS: &[Color] = &[ + Color::rgb8(255, 0, 0), + Color::rgb8(0, 255, 0), + Color::rgb8(0, 0, 255), + ]; + let _ = rc.with_save(|rc| { + // Isolation (this can be removed for non-isolated version) + rc.blend(rect, BlendMode::Normal.into()); + for (i, c) in COLORS.iter().enumerate() { + let stops = vec![ + GradientStop { + color: Color::WHITE, + pos: 0.0, + }, + GradientStop { + color: c.clone(), + pos: 1.0, + }, + ]; + // squash the ellipse + let a = Affine::translate((100., 100.)) + * Affine::rotate(std::f64::consts::FRAC_PI_3 * (i * 2 + 1) as f64) + * Affine::scale_non_uniform(1.0, 0.357) + * Affine::translate((-100., -100.)); + let linear = LinearGradient::new(UnitPoint::TOP, UnitPoint::BOTTOM, stops); + let _ = rc.with_save(|rc| { + rc.blend(rect, blend); + rc.transform(a); + rc.fill(Circle::new((100., 100.), 90.), &linear); + Ok(()) + }); + } + Ok(()) + }); +} + +pub fn render_blend_grid(rc: &mut PietGpuRenderContext) { + const BLEND_MODES: &[BlendMode] = &[ + BlendMode::Normal, + BlendMode::Multiply, + BlendMode::Darken, + BlendMode::Screen, + BlendMode::Lighten, + BlendMode::Overlay, + BlendMode::ColorDodge, + BlendMode::ColorBurn, + BlendMode::HardLight, + BlendMode::SoftLight, + BlendMode::Difference, + BlendMode::Exclusion, + BlendMode::Hue, + BlendMode::Saturation, + BlendMode::Color, + BlendMode::Luminosity, + ]; + for (ix, &blend) in BLEND_MODES.iter().enumerate() { + let _ = rc.with_save(|rc| { + let i = ix % 4; + let j = ix / 4; + rc.transform(Affine::translate((i as f64 * 225., j as f64 * 225.))); + render_blend_square(rc, blend.into()); + Ok(()) + }); + } +} + pub fn render_anim_frame(rc: &mut impl RenderContext, i: usize) { rc.fill( Rect::new(0.0, 0.0, 1000.0, 1000.0), diff --git a/piet-scene/src/glyph/mod.rs b/piet-scene/src/glyph/mod.rs index 3bfa36ce6..81d9735a6 100644 --- a/piet-scene/src/glyph/mod.rs +++ b/piet-scene/src/glyph/mod.rs @@ -114,7 +114,9 @@ impl<'a> GlyphProvider<'a> { }; xform_stack.push(xform); } - Command::PopTransform => { xform_stack.pop(); }, + Command::PopTransform => { + xform_stack.pop(); + } Command::PushClip(path_index) => { let path = glyph.path(*path_index)?; if let Some(xform) = xform_stack.last() { From aac6513409ff0c0c95f96bd18328dc203f5eae0a Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Wed, 18 May 2022 15:41:00 -0700 Subject: [PATCH 3/3] Compile shaders on Windows Updates DXIL on generated shaders. --- piet-gpu/shader/gen/binning.dxil | Bin 6336 -> 6336 bytes piet-gpu/shader/gen/coarse.dxil | Bin 11632 -> 11632 bytes piet-gpu/shader/gen/draw_leaf.dxil | Bin 6760 -> 6764 bytes piet-gpu/shader/gen/draw_reduce.dxil | Bin 4264 -> 4260 bytes piet-gpu/shader/gen/draw_root.dxil | Bin 4468 -> 4468 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 14000 -> 14000 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 14072 -> 14076 bytes piet-gpu/shader/gen/tile_alloc.dxil | Bin 5136 -> 5132 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/piet-gpu/shader/gen/binning.dxil b/piet-gpu/shader/gen/binning.dxil index 4a4f0734c4735cdf4f37ec0ade7e7e7cacccabbc..3050aa83bdb31b0655c4e6a2c8d80987840b6532 100644 GIT binary patch delta 2232 zcmYjSeNYo;8h6cK2&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- delta 2206 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 delta 2961 zcmbtWdsGu=7N5!FF?qox;V}W!37{KAA#Xqt5`v0RXj%nBQ9D3EYyl%~Ij)C2c@QB; zQc?nl*1GXnyH=?i)OMxY^#lP)DXpm}B1^lVtn0RP7ipJ*b@%K963^M5vw!XUG5PK{ z_wl>GdvCsPTJ~7R&(dY8fuB7fA(waYe+Q?&lao3e(K^n)%zm)l_~U`svvgaxTR8xL z0~DZ`3;=!^Ak-1ULQm{xsy$x|SO8FP1*FqRj1m!G zUR9-;0k3GO6hF2Ngd^?lT|1YFTjdMdc{C5)q=A;ZjcjZfNVfQU=tstwz4Fz+B`a%~)hY>KfpM?7HHg3Cd6b`xpm;0F_8Ne%N6&pK>cmqTe~noID#wG7&@A9A3?DPP{4c!Sg`Nix z61(2S00ch#zXh=fK*-S4%8AKk^=$Y})K~-+NBaT$EPlY3alodbqpW1|0zh@H<}wXj z-YgQ@%XYiCxac!ujH*9#>u$;v5J!dmRqyG`7|jH@XX&8UlIpR7BqN6Eqyla?V(Tl< z1n!tZM8!sbH?`-ql9R}*#3vEp+&pAks#_aR_=Ks_`0KV7lxRVib_yj5UhQoZYr$;V zJA_~`){Hia#}Qf@NWH?+a9d++q;C@ViIpe2frU7KIc-2qe)@(cS6Iw)7K#cX}dHmHk%W_%8#@IoijDC`+T+#L-K2gTa;q885 z_mU9NeiDDU=CO-({~99~+RTaq$UVTY{SMNE%N=)h_Pfd^19yAy!=Ko9(I%rD8Nt~j z*-cT;_aEBtVoff&W2D?ZqHT)R1ogjVj|iJQa^#+#eNWe+zPv?&__HM2H&u9*8oIRq}z%KK+kKrLuEc(6>Iy=$iN+WzvkV+fk zNVn1JE#?n|qXqT9U@!!ss95Rm;HHd`5*caE?}G!8iMeqOJ(7@r$tJt~otp85@99|U8q=lrC%PoxvETyHJ}9qo+ID30?re`x`PN7I9tBPK(~ z;HQ4yxi8KkrMI+maA_0!4!)1?5(?>ALA5A>f%7%2d6m$+K;i_jGPmSTC6mJVMCiEI zjjH^TZCOdJb#1#Sc_VdmS5M`$BlS4b{uFgY9YmiEOZ?74p^}C zrN3VHyIVWRf#vy64K{K_pQ*Nt{+@}k$>9}5m4TYcZ-gnXan}*(TN1u4+&i_#OF%34 z(`d`7v80=q^N+l{~bpHFiF57t# z$O&Y-HkI!D3GVYJdkp3Uk~Lh+^=4(5CC{_fc*%jv-ge3snw2?zwo$1mP`0O*oUHhA zC&6|~=6znP{2XhlWE3)@C~-SW(!9 zrI($ms~y5<3%XR+Y*)2ts>G7&9UzO0%@j&)1q{vWaL+)B#M*rDRb<7*%kv%KzJW{I zh_>@z2z*1fYhhWc4y13uYD|y7X2sxJ&Flt4EsGvGKfVDdJS>pz>iN`TRYAm|fUkE- z9&kH{+>(SVlE>A{-11W_8!97CZ}6rxL7k}j3|==ZS$8(^9#}{j3>u{mOCE7QvCT-5 zzL!iBMsK)+MpQ*oU7~6T7W1Uyhlzg$3mZRMGBTieF;DspcgQA^635W0L95LQ zX>X$Hb6CDZDvwM0Em&y(V=z?N4(Z>y<2JoC`H=L7YM%R_)}T?nA{k0jeF3LBrKu%J zTfo8>pC|R2Q##9?wz;Jnu1M#r!`<>OmLZsxVuLzKbqn4&EZulEX&+da7XXOjRm0Lb z?laqrG~;{eGs!kR`>L=^a-y+xRoe;egJIVHC%qDI6IS7{g(QQ4`W;` HaR2@fw5$C> diff --git a/piet-gpu/shader/gen/draw_reduce.dxil b/piet-gpu/shader/gen/draw_reduce.dxil index c101fc8c7f1997dba7d8584f3ec61030fb5e0059..be69aad2781f64f94fa4a1d109e7b980e3bf0fdb 100644 GIT binary patch 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 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&-` diff --git a/piet-gpu/shader/gen/draw_root.dxil b/piet-gpu/shader/gen/draw_root.dxil index 873fa29da1ffca54fc149ad5b31f42a47e79f5ba..4ea23f7699a63ef9a4dcac871e1f234a5ea5b0ef 100644 GIT binary patch delta 855 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 delta 4205 zcmZ9Qdt6i3mdDRY4kr&2%!9yz7zjk3f*wKyg-R2^fCw76NK>B)^0ET*q15`4n1NYc!X83~r-La!K z_WlzBuH~;nBsmk|`jO_bKqROPi8_KJZxRSnM6KfGn#A>Yu9I?3yoPOUbz(+y;zIYJ zU}#+6Y;bnTTj~-u!+rdDXgn6L%JW0TSi*1wJ6)wAPI3mxN&$QOkTQp-;ji;s`CpjP zmKgiBTX0>sGOxB$Z{HVsx_f`m^bK`Z=lM!`urCt9W~h7OV!x=gRO24ZXiwxB+xR9a zo554Ydvv=(##_;O3FrStCa3PGtlCz+qqd}~R=%~|Skv;smp7(7qw0pu4TXhjd%eYy zh?S9=W!CLO2E4otmo_MMR+WeBa|NA58&yf4@YAJsO;80f>EwTD<4WJ(^#1CgSG%M) z+vWDOhJO{k5|MQ1zrRZimmhAsllrk|Z~yg!Be|TGysOfPU^2uwwwQw-te#d@3fJJSif|9r%g%VgyF^ZTI?YRvfJ_`Xm{@87~uhNeH8rS?_ zkkDjVLT|OgW52o0Mi2$gK`aJaw({L#+7^DV-=pqLKM0 zx75AV2NvQxS#Rj4N&N9RRWB-#+zIwi?yF0k0xL^BjeCGB{=`Q8Ad*XF!G7s%`pdDk zyR4=eAiM(+J)^?J3Lj^B@U)f67QehgEz+T>(@iMDEGKHoiTNK0o(z?zAq8gNte|eNh}LG1nJPiO3=|Oxvb4o$f_g zRQzE9va%CvA>;_#qPZ-N4xQ)9rc{0kQ%#Y_%)Vko5|d93u6^isphDXaQc zGQ+YOQO~r4Yn%`b;TbkxremT`;%3A)@S6-W+;Ad&QOjOEPbxrDc+OatQWt+D-5M=% zf&j$c0M>ilOR!~g0eD^n;J-Z7*R`f40!vZLR484TPkq+5r%#Dba8TW7j+0J8%_H%& zp#Bm}g5rhdrlw2DSTQA(M9jN)X`LZpJ*(W{^A?pRN$_TJD8StW@= zO^}PMQ1e`fzD!CIRqTz_sAN%ce~@NP3$Xy?!&Mi2M)=UJWwp|3?owR*J8{R z92Z)dh=yF|VJ0$;6Y3b3hKS!NocTZ zLq+Y>zTXT7KqLyra z>Y=y4;UWt07h&jxzp`h&VMz8Ja4tzq?%Uf`KMZQlX6j~<5OTG-AoVe;00~)NXYv*x zx+ugXoVpAO;Aae>iz;ir*I17I9)Fm6J0Q%I_b!N54&AWX$!-R2(8MEB+2b&6K{3ci z3p7xG@|zG~plY5|%lfSIT_O-6YFAjr1+tb46KyP+Bv#Kzq64?K1 zhgY*KB4JRfX@#1a2(RX;eXUQlX2q|>Tdnc1UvD2CtNtB?K&dWjnY&zhRK^-Fmk>BRj{}1gDYr%Mi;{aW!?2=sU3B52>;Gw=I zQqpFM*@zBZ?!pc2zMuAO!fDM79kV%l|H+4i-o>{ z?jM^hD}XC*gc3**YikQZz{a#FpNi-n?N>e$&5k(GN4_qkErrN~$0a44J0?nWFm=szn-^(=xVk z>PN6|0T_##f|?IX7gz5Dn(qO}t7B5q69O)zfb%{FqU6D2tGeb*%0Mio;6U5x)yHE# zKl(}qt^^QFL3o9edM1_nHk9rTcXUnEBX(!WS&WKWVBbW_K(XX!ZCO5lwpl)%;O4Wm zJOP+)wi8Fk^STVRS~0`cG+rlUVj!c_RgJalBgmsr;qDHD8$m&el5Z}Tb#n5{RG~=r zBPsFx7H4)Al$A25I9UMCw(|_*=0wmiYtigcN+(nJ9>2-?vXsv0lSfpYOwLJ2btR?V zO-Q{PZm%xGCqGyBrj3MV3NlN3LR;5(;elv3LaqLD)`Q65zvi%C_UnF zGRkcQO(zQlW_$iB)^SJHIMQGvbJ;Gsk6(7DofBUehZEoWLX!AY@FVyt2qb;>nY@~> zXq9JEP(IYmeZr(QyYu+Jt*K6jn*P3C&F%H+cf`|knjJ4Rr9TLM!&X4eOYeFm12R)< zQ&9p+{#&d!%!xdrcP*&}lGR80KMbVeLge!tnXjP1+xR{8lE;)jq#}um_ED*xyZ!RA zQ~8E;|A%eh1;7KPG6a68<1Qx3-8NW`u$pg9NNY|Zl8qw=H;z!hhcqozA9ETyP~K;@ zsmmRP4y1QBG}4Y7t)lI$vK$U6BW}|4?Cne6{wEuc)8o z8E7@73hhG~)SXbBLc55FC!twSoy*!zf4p=q`!DpzZ_njCpbEmWMEVCYQRmrz|3qZ@ zDD3Q+dcy;XIun*4aKr)6En_CIPj@)yo$jci9)*d0mR!HlYo<7gg(Bzb*Vu+$YfkSg zY8M&P85h@0y{sr>SVWXvQ4qbfVW{3ExW^pA^Q9S8>Q6O<({djHt}rZ*>RIldyiv{a;qn1FUhjd-IkV@0<4Sp@EO1)Qo5YNz~KfUL%`a zHt$$B3?aDH;{C$Fw-Qv?B3soChJPl#%wFZNA>ec%Myi=s_bu2LJQ`JR=$ zj58WCI297yR-M)(;v^EBrE-p)>QnBGBR@d*;BNXg@pe$#HoB++{Q8H=8Owqq0D!Pvk*gA4e!`e!_Y+X=fT zqJ}@E8lF(IH!sz<-`n+{&SP8n269p`N!?Ken64QCAB88}JD>go7ZwUIAch1%x|WA$$SCp-B*))dINT_8c4x;n6vG zH-z;EAUrb%r$X4|$%ORpkamVZI)5RM9@-D-@^>Mu1f)wK?Z|<2#~hsi>7qIM3rO4N z=w)IMM_n0&XCaI`AS_RW@Gyj}*CDKaA4CQYTeS`~Waxu9RG%~O|Ihyw{ujXp&$|Es diff --git a/piet-gpu/shader/gen/kernel4_gray.dxil b/piet-gpu/shader/gen/kernel4_gray.dxil index d48974d6811f75016bae7d23cf71a05a570a3b9d..7b7c19f008c9b84a65d0dd58c2fb1cf7558b0462 100644 GIT binary patch delta 9696 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

GIg3I;Tx)F~ezsM0BKUi)=vl^rp%DU~iqaYw3KG z`TH|b1G3-qeTSL*hOjy;=6b*81L(5>*1n;-h8V%ax^zK6@CY9Rj($v^SwopkVEG_BdM$ug#HXPyQhccz*1( zXZYY3n(NZ^!`n+s=u?b_$A9I*KnMRyho=)=c8?-QrfvhrW9u$??9?6L;@&QK_SE;m zg$;~M9FVy)*jY8sKA*uJ*Ws^!?v9romAw>20ckQl@8t<&z!0LDE@69imQ$}8sNMF_Tq z0ex4zM^T0qglk|;xT8k^rq>?;)+TUcqZ8eOugz?*HX#;sdAfK&#`Ce5iFAr`W?<+27jwCz#`C4OBm1xz!$vNfZIaOdhi#=S^@Tb3FRWd1{4y0Q@fTi|g4HTl9neElqsTsK zaxpY}03>6|@}?iBOvSG9Bt__F2KdTl$O!*SFi3c>o<1Zq3E3jXa9BiHo8UBFQoZ4;F?BzB9aN+>T z96><&NY{4dL1zJ{2AClAe?v@NNKJTQ>Eh-MErgIhF1k;8AfEx=zPY^CFm!UofQ%3X z%oFAh$_PvgW_}*I5)84xkO2(gae-T`KTwEUycM*Dl8NuEp93tu2P`JF;RbI41`}5R zgV%!|d0QhG*@ll)x@i7=QF7R__i+&$5J_um27sOT95(@x?Hu;fwiYmg;UinHw=%ju zXr3`pnCql8_;nK^C>!mhP0+leV5>b?n9FmMOWYd#z9z73gos^R0o&7a9h6N@N~2%5 zh;0(FEux5B8|m}r@DHgbEf zovjW>_o2)99FUZ@SJgJP#Z18*UL^mTey`B+!%U48h)ag~ zn~?uYkl^2!EZfd>lqlkpWbv=i=Q4v9^bp5}tC-JAFnj#0p7__OQ)bmF@lGnla<)Q= zjxIt4I40}ymf<@q;bJC|D%@|(fWw%sSP~r)6~gNAKwAy3Vfu}?CQmUxES1n*yVH>} zU5k-{%tb~~`j4^dnSE)}IKg(ro5gyB&!y(!{HY;2<-7x zL1KoZEwZ&%>Cw~RmZM4q%6$ciOVxLZE6;R?PvbMq8iU zFl!V7G4(mWSf`~GLu}SfkVqN`c%@!sl44_y9Y%8Eg-5^PAH9fJyz24Qb#IR0|5j*Wg=*S4u7I zCFz)|{cmK;6>h^_2sGuN7qN*kJE8^oFD3F$YP-|M0TM+uK!Vn5uHmb+v{JB^Ur_}& z4->p@n2FQ&Ybhz@W7rZ^Gg`(9Zk9SlPis?>-EXl?c6Mk(W$Fo^x`i6vzA`RGjG1FeGB`GGQ|S?@r=%P)|liw2lZ380;%`)0hN9k@^UK zLouynw7D8>sLp`Hi>|9ObfS#bbC6FM6MLx+a;ir?{#INk&PJMduQNc?tpk)+64EGo93J7T>Ou39 z*=t7P_Tv>t1diDydV@E+erFy|Kj@NldiG8PW~#Quyu| zI0y$9h6Av=0>ja*dvWv?9L-I_(M~Zy*Zeq!4#m;8#?U)(aDf&FJI25Q9BiA5ga5+8 z1~v}PjR2~9cH`jkMjSlV2iGjd!F?GxILIAM&aOI930(-gQI!Hh`7Bq@V$}jsN^VMTKgV diff --git a/piet-gpu/shader/gen/tile_alloc.dxil b/piet-gpu/shader/gen/tile_alloc.dxil index 7b130e013427d747d2d4199badc1dcd7fb8e8297..7759910ca527b4ff12fbe9ba3ee03fdb6a428ca7 100644 GIT binary patch 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 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