From e5d71a6c827f6ba69dba10900af0978b24832a10 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Fri, 15 Nov 2024 14:41:15 +0100 Subject: [PATCH] LibWeb: Apply the paint transformation in SVGGradientElement In commit 1b82cb43c2db1686e2f36d826059698381ec2edc I accidentally removed the paint transformation altogether. The result was that zoomed-in SVGs, or SVG elements with a transformation applied could have their gradient coordinates misplaced significantly. This was also exposed in the `svg-text-effects` test by way of a slight visual difference. Add a new test that very clearly exposes the fixed issue by rotating the gradient coordinates by 45 degrees. --- .../LibWeb/Painting/SVGPathPaintable.cpp | 1 + Libraries/LibWeb/SVG/SVGGradientElement.cpp | 2 +- Libraries/LibWeb/SVG/SVGGradientElement.h | 1 + ...svg-gradient-paint-transformation-ref.html | 9 +++++++++ .../svg-gradient-paint-transformation-ref.png | Bin 0 -> 4488 bytes .../images/svg-text-effects-ref.png | Bin 13791 -> 17457 bytes .../svg-gradient-paint-transformation.html | 13 +++++++++++++ 7 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Screenshot/expected/svg-gradient-paint-transformation-ref.html create mode 100644 Tests/LibWeb/Screenshot/images/svg-gradient-paint-transformation-ref.png create mode 100644 Tests/LibWeb/Screenshot/input/svg-gradient-paint-transformation.html diff --git a/Libraries/LibWeb/Painting/SVGPathPaintable.cpp b/Libraries/LibWeb/Painting/SVGPathPaintable.cpp index 40eeb52974..fe2a14ad44 100644 --- a/Libraries/LibWeb/Painting/SVGPathPaintable.cpp +++ b/Libraries/LibWeb/Painting/SVGPathPaintable.cpp @@ -106,6 +106,7 @@ void SVGPathPaintable::paint(PaintContext& context, PaintPhase phase) const SVG::SVGPaintContext paint_context { .viewport = svg_viewport, .path_bounding_box = computed_path()->bounding_box(), + .paint_transform = paint_transform, }; auto fill_opacity = graphics_element.fill_opacity().value_or(1); diff --git a/Libraries/LibWeb/SVG/SVGGradientElement.cpp b/Libraries/LibWeb/SVG/SVGGradientElement.cpp index e65766a86d..e090a3feae 100644 --- a/Libraries/LibWeb/SVG/SVGGradientElement.cpp +++ b/Libraries/LibWeb/SVG/SVGGradientElement.cpp @@ -84,7 +84,7 @@ Optional SVGGradientElement::gradient_transform_impl(HashT // The gradient transform, appropriately scaled and combined with the paint transform. Gfx::AffineTransform SVGGradientElement::gradient_paint_transform(SVGPaintContext const& paint_context) const { - Gfx::AffineTransform gradient_paint_transform; + Gfx::AffineTransform gradient_paint_transform = paint_context.paint_transform; auto const& bounding_box = paint_context.path_bounding_box; if (gradient_units() == SVGUnits::ObjectBoundingBox) { diff --git a/Libraries/LibWeb/SVG/SVGGradientElement.h b/Libraries/LibWeb/SVG/SVGGradientElement.h index bfd860ee2b..81d6f9f5b0 100644 --- a/Libraries/LibWeb/SVG/SVGGradientElement.h +++ b/Libraries/LibWeb/SVG/SVGGradientElement.h @@ -19,6 +19,7 @@ namespace Web::SVG { struct SVGPaintContext { Gfx::FloatRect viewport; Gfx::FloatRect path_bounding_box; + Gfx::AffineTransform paint_transform; }; inline Painting::SVGGradientPaintStyle::SpreadMethod to_painting_spread_method(SpreadMethod spread_method) diff --git a/Tests/LibWeb/Screenshot/expected/svg-gradient-paint-transformation-ref.html b/Tests/LibWeb/Screenshot/expected/svg-gradient-paint-transformation-ref.html new file mode 100644 index 0000000000..c6408feeca --- /dev/null +++ b/Tests/LibWeb/Screenshot/expected/svg-gradient-paint-transformation-ref.html @@ -0,0 +1,9 @@ + + diff --git a/Tests/LibWeb/Screenshot/images/svg-gradient-paint-transformation-ref.png b/Tests/LibWeb/Screenshot/images/svg-gradient-paint-transformation-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..92cd9fa76132c63c3ff51cf84b3e02d83a02445b GIT binary patch literal 4488 zcmdT{dpMN&9)F2Yi%OHrge{4+8rh19SS8(*T&9tFjZ27e*_Ki6Yb#|7o#Z-UGaKc~44Pr+( z7ig->Y1e4BoP6k*)7bi1TO}s_fF#Pl$oy9A*-cW_8?43;AJ^I*{gJ(-i1mb-mg9DL zlneW!Ck}IJB;4%X%%xLbZ+wp=7d1o$ea#P2$-(xHA14$-qQ z4yJJdL7*193G>3MGl@j(fuMAT@W`k*fvq8Hu-g^J-YxI21HA!Ci;LeGGlB*wW99-e zu?4~w37ny4KRGTld##ZkICtY7$9^`f{@!tB#~y%ojTH`yWz@;u#p4JT>(H3}+h82F zVo#18v90m^_2f;gbJ8HvP#zKyG5F{R#|DR#E7&pEK%mX$mzexNGjv;}@oRs$=x z>aKxN!evU4m#|fQ;m1~tOliU~ICtxoRD*rbb~}AuSorL^+mmdq6hrC^Fn^sVTVArQ zYya{jBg<^P1SE?1wqtk39(>(7N==amDz%UI2DI%>T7rmB}_Sni>l2@O5OX57pZ1mC+gG~hzw z53@|aQ>`4~4fEFWc`p)=H+rEi_fTdSpC0(~g5&c8jxUaec+|IlKlM>q*a9sm7fEBt z7%vhMr(dyK6{EyKg0YvA0$~y_`%M`sUGwBm{ zdty70IIr&5u2boi;Q!*Opr>?+xo~p`^lw4KtsSk>da|HdG=APYmo3xI@_?~%~zHrS|K+M7xw z1|;g~EezL>_fP7NhH{a-UT_O@KG2ltbSDKM!b)OV%pWlUWzpIV-?H(31Q=&sd-KFV z)i)?PvL=V_)jf-rxowRjtB#dCe#ER4Qh%wCNc9OB`=yl0N{Q{9si5f_1k10+~HNeviPAyT>1Qpy3pOw-s+ zO1(59Tsjmc*A3(3jhN2Ptoqs49f?`SnG4k>F5L+u7adGQK6eNiFEl`(icop8>{D6H zoly>RWkiSd>T%^p5oA)eD-7lic;zDDE`71fQj5JZZRnjHmS8$npN$r2pzNMY zBG->R2=L-~IA*zP!J&lD8@Ojte5tFz1Z=dW2)*FY_@N>MCbITyq-Rz-CLKw= zlj^$>w9PlBUhv#Y(mdFOB)k%KoX$&@>Q47=NOu_%1x)K6-$C%1ZP3-_^CINS5*RM) z?Qs&O6528GCF_OT=;QAD&ql`{fgt^pZmxy9#Pg6;%VxK9w=Qw8E1m8!T*vHY8HvPw z-Zl9)JI@36s3|+eTt9hX=;}&!c@VcDP3it+cg<_?RCHjuLg}mR02)-JMjA;0bRBh} zLtw+2x5V+&i5Ou<|FE6sEdYmuEfzK!w9U^b0@DyC3Iyx7w3~hv*G8|+LM&r~{W_Zp zzh<-gTKdrG((f*ISQYzsMI8bIa`Ti7CNG9$GQrQrGxK(6U3rHDmO+y99tQ8ECOl|+ z-qWxy`EpA1-DvGQ^%up25w6s&ajVHf`tDS6Mq}y#RW`v!XJBQNGW8SA%PqpR<04Yx z*bD8`C_{=ygjH)oxl>b?`dJ{jykb!n~(ALRQs0rM00%bU4KEIF1>4m=`! z{HU#~)erytMxqX-feChrHQ5?XHX9I!!fS$!hjV-s$AL#0WM%kP}F*8&1 zwQQ;eC|M@bmE@u`?c~ ziUs1nUCFLzf$`<*rauh7;k1BAK>JMFPTnUIWV^`}??`W5MG%6Dck%Dk--PeM;^y6^ zNpcKbIdDp}!6cAUlQ?_YLhSc8?*%#lyBlj6x9wk48d$-9s5BtUpx;#*P+Wf^<=)Sz zLGnHH-#?|@e-nu-jQ$Xo|E?tev(bvWgjfI4XhreDt1H5-@U&W^l`wt~tc6nhFIiiy zkx;b%Pb&QbQ7PnZMNWT7e_)L1Q+4|5_N@}b9KVrRF82=Vnuju1H z|4d%3(TctGw-}rE+NG literal 0 HcmV?d00001 diff --git a/Tests/LibWeb/Screenshot/images/svg-text-effects-ref.png b/Tests/LibWeb/Screenshot/images/svg-text-effects-ref.png index 1abce3203ae5861feda66307d6d91410e0983fcf..2d7db64de6178067ead2e70ad27f8f9a3127d445 100644 GIT binary patch literal 17457 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 Zx7YNH*d{Wj9+WGJq?oK|v55Yc{|oCL_vHWp literal 13791 zcmdsecT`hpzb-{YML?xVcSeOln#dqcKt>ViDi8t)2_PUHrPqjxjMNdN3k)J45FpYa zkVJYFX+a3RlMs3dq2#`q?>l$RJ?q|czO&Xn>#lYE$Cb_AZ~2wyd49kB?zayNwb{=I zoMB*KVAr{S_YngF^CbobCg>?9aD|7PN1TB{Ay4P7riuS3d7L$cd*>_VS-;$F^98$7 zs9l=?&-=SEX}>s|tUy27z779;kum0i)Krv!>aO)yUE}vZM{+OEpYeM<9ZPB;PawE9 zu}I4W-{}Xhdlv(;_BI+0db(G;$GY}XGmZ@MAq)&ECgNxYhTCvPhEq}u3}Gw`FK|o@ z=b&IcY=8Z{gkoSg!TZW`Fc{Y zLTiXhJD*{Guu>k^aN-i`g-MKn!nL|w4t2^@cX#*7%E}!MD$_AyZsswxFDf5)(j2BXLVL$Ru>O7@-a zDROMQQtdrG?AE>gxq9M8nXU+?Q&Q03Av}JyV!%+6NZjm_EiEarew#QqH~08?$JKWV zuGphpUkR{7i>=K~4wa=p&tJZW9GfvUHSODLzXxLZZvJ$rlm z-P3f7=qL$IAZSMf0TLLs+K6t6!iDbCfnBv`(ZeZLu+++bTy$^P!B<5=wM9cJgqgqw zIZ#{QRI3&6OMN-ybHKmI!sDZZY8L#}B}jbZL{OTTId83dAPxv%r6dwbH5hGRV4$(zVFYoN+!W1z@VQCxp_v)qQLKCY z#=QtZFf}nTJ)KbQ*lSp@j4vk8otUea>^sF)Gxd^fchse{xOyV+XlFP}*=vF5ABR1h zmnBRzf*CAXh3QW}va}33AXk@yyE6K{7c=}q<0c%uynrb)2-b(Si4W7)HrX-n0Rv_x$s1Ea+lJ!$Dd&!6vH}+PwMD^**9wY?f~d>+T!&vP{Cu3p zYMz-HX~&7Ul?L~!?Rm!o58l6A zY^X}ESUNlETHa%*JpZ1D)-V}*&=Re&GiW@^?6Nu6aoQ}jiCwWd8d+FK#PMm^wMMIl zP(S$K%^g2HyBD#Rx-$&JlI>wZFl-8A zGAuNp%;4~74H3tGD}=hu5zIE*7UyBlUU>zOp?Mt|!UDB|} zTEpH1h(g5)|Jk+ShJAWKGlTrv;2ElP8MbZ+B$xN9Z(v8Ai;8V&4w&WnWSC)9aeijt zHHY;UKG@h7k3}#*QBjc>l<@>_g{-3DUQsEAI`xV(6QI!7SFC<30}gdQBwk^)bk{N+ zYinzQhvT;o`(s|cM>Bj_=msH1aYD&qBSrQ?>*T3Pv3_g0FrUGP+R8OxB@i?V8*lUB zT%=^l@5}LEi8;*G{=khVCi!^0qWro&>@YqT@2dkJ-!|3znq(F+v-}@Atq;c z?bNj zJvRs&T4HJ{zx>EoUQ5?!AhhVXqO7dU$kvL8TkF@8jp6q?-d}8s=2s8)XT?xJ&`UWS z33}9T;KG=J!Hv}S=Tcxie0a6} zS^16c031ZjCz|Q%>Dlp?78OPD*Av{)Ez$gPws*TzCXZJAgeklep$FvGvS{+e?$g@Z z+AoNkZ|_FRV>D+Y*a6l`0DhPfe8VYHsVH0?|B6H97YF@rH|WmJ4ym}> zdOh)z=|d~43@RxO%Z}Acmf2_u+#&9OjUxcKMDfYS)@J~qtgo-9*d#xG{J9tJkUjEy3?)KnZ+Sr6p&P*HMfrv80i!s6dDkB(j$l=Db8`TOiy}cQeXFE61je9I z{6gN+Qcj$&4C5&&ydf-f-~N!3Puk-B%5DLrjaa!q6D2zlywwBZm>&2Yt$7us+05H02qc{O|0`HB3Y3<&$1h-vRRYi{z zP!|kqMa(^S$VmWQE5aSN@3qAW3!+SPbUFZaYQS+XxQuSe9mllk&x+8TE;BGiRchY5 z*LqUW6*cn{X0|oP zTcRbTqyXjUBn=%&VV{KVcfqRMyyx2A709L}By26Dd(aKi25cDFA$D`jvq{js=BMLv zMzAwI6Em|lz%Opg=Ol`&T=eK*N9Y}fA&yd5G>*0hD7eVg@~3_B0VUT#Zl%a=RLiyW zzTu%sVMBID76~H{`($M?9L9=%t7Dy=y5b@)aJFs`7z{y~j%d@jPE1HJwy+R5YNDr` z!`BqX^B^KZ%Zi`a+qaxu9Y_0hrvSKUi>_TM>#}W?va0(PLtN<1qDilO22@+>7Ipbv zwC4iDCDf@$rlyquu(iZNa9OzniLjIf;6!bM?cO7)K>d67?v)uxSymy(OTV=kDGEFr z_ZhD2NjH7);G9PKox9l3BTRV1c87Qt^2Zq7(u4eg@ishUP1>U3=@bHqG2rIoTLV&x zvD(fkLq#F9z%Eu(wcde?>@?rq%c&RRfTuki0)0X)b41f}s)<*^n+JwGKWj ze?&(|i)RIIu9Ww>6TSmjCvmfYt!D)T{{*epI-=$JiY==FXbf!&08IU2+xg~chdQ?l zTDrghccjxdAao_DeFJ1=&GWFoB;}w8w8nE9xHI&d@?u2~BVO!+<+n#*`)Rg-L+RN7 zfk4(#V0N*V%pX9F>FMf128v>`%C9}LI<3vi$Jd6fqEpHA6uF8}G9Dq+h8Vf-^ECmH z_Zfpx5A7k9VneS4M{tU+>Ys$Wu^~rCM}cA~*+-Y6P}h$&edubF(2`H7%@{r0??uF> zPA`K%AQP(B=-LP<8Y}NUtv)OW04tzV%-SrWD7a>~+5+RNSx45Gtgw)9N|YC%S*Jr( ziien(SL12%mHMr3eXt;Xf5Bs2rLAuH(mG;c5a39__;EXH6U4DM)6%Wd^bm_|X=!o0oFjU45CuE@ zxu3B^M6aGW+Tg!SEGoT+{pK`~S9#>DCETjCS~ELic0nyCuvxl#?1KDM7^}$dBI^Kf zOJfy-Kt!GJwvGn8Tov+?U!#nC!#drqYD5g)LkFOhFu?k%f$#3yRvBz6KbvVT|E40T zp)n~c&A=oH0iXuRb-dbR@^Y-w$8pX#bX8o%0t5!XiucntOcl^H;+g&*Evwz%C1wQ@ z3m7j0O~8MoJBo4H1qdY;BrA$IeAcaND?@13j~0=5>zElJ7Ko#Zbd}iq-9BX_<&Lap zV};&5@wi@=Nf(3He=TM&e<27F{5CDV_wRg;FPul;WBg=CCJR!A0m;sXoTMHjeDoU)-t*g|UqQ{`bid^~Z^-Wp)m}BGjcK4O_JMzF16_^Y~AL1ael|$~D zewMsrtcEhk3EjfNLIDNm!556oK#H8#V7qNmR$fkk5N_7`5`t5TC@SIxY2JXKPmVEo zcgwY1Nq4+aCvSLbqq*HEGnBeKwfD%{dZNm|F@NQ1dEY%jEvkplE%_P*?YK{nPW>M` z9|2tmhyuMg5frpTOzhO>l61!f0(3cQ0O$^BC09=#r%xW{4HS-mga9&X3=oPxD2f;r z&dJ#{zD^7+kW@e8I-DILV)5|d`FhGO!9#RkXAYq)>yKk(?M{`?hhak{k9$*kg&ez6 z`d0JyfR`=ZYwb-Z?9jIApF`%}X+zxA01MCC#i{WY3^j3T94>0m0tja=(?VK!%(~MR zdtm|$OfK_R50lK%Dt@cM;1N0>0c<~&vc3$0N{@0>_B1>^JO_yO8&BE+c&-D2KUqIW zNxh!%_S2*7mV6!=?BV8;oZq;Q**1-T-;L0IRWIoSkeh2*T4=Yx&B@>`ikn;gMr(dn zD0O|hDOuXGsxB@Bq--~yPv-HDpIod_@UK9o3XITz)IDwmsw~&%R@lkp&Myl4%}zPZGDCE5rGDD+Fa3i zv^SZx;+ChRJs%ms`jL)3lM7$s=3KY&)uYam2u=o+*hvV%__^N?n+On=Fi_$GUA_k@ z`As0Js|==V=zgW4MV!h8heZ*4ewKU9W2NK1dyg86Zh#6??lO=z+-mUA3MV;c+l750 zpm`hX&R|@5-8N=g^<{QO_-=+*NQVt5Y#-Gg>~FrS1Eg7G*92f;xh`w39)*oQ{HoB5Xz;pbcS@Dx z=-lEW7GM+**V^0cQ}mE|8Is)oNhjgaBu}pfEjTjD(ZK-&3h$hIF+?2mdHI67XilRO z4EQmefRZO%-}IAu_yT2P)-GurOd$&jR$mVj8VN=dXvm~U@WiU^{-DdJ5qlIfhtj3v zmMb6dbSYl27D=U24Q`HHS@;fCLW6B=Y%GE<_v;rR#y6>?(zW%b^Ka|v<&S?I;|m-WVgSTMo*>BlchnhB#hH~I zU%cu1BT}yS)|UR^eD2aR5(tKKx4tX_!|#CshVl55_3w1^i%tH2?1LREv3`L*khkh zsjacX=`)f6fa&e)9LFqa8zo)!yVLLH_Vu`ZvQ^cL80!9KpS6jQDO?!HNGChHoPi2v1$+cnsBgP{-)H!! zj#>wUOm24(EkhrA9mqQ8sS&o_FwyH~SF?-6-^hr}|ITm<$-yNb30t=O3Tf}?cx&D?0Z5yu>IhQhTi4KBq9%Lt>I0vR1=C~? z$hc#<#|iv^_+W^jmFXb2K;5T#MLWyT&EL9=L_9`jomhb?@<{^--*P+JkON=?E-2{!*c$8OFwo0;ljiEMWhCBm z5*wve8SDddt5KcuH)?`~rqD6P429 zQ9GYhHR+DoU$_&&;iFsJ!E5Al`V>+#9q)js*A@K{ZrND5Hk|yy^ij=5|I9b#+>CMp zJMuewjxZlX*pM7h1G8IK7sR$1=>0VFT_E}ml%4}A*Vi;7s*td*`u4ONn1NoIng3x)y_Y%gVnaVwBNQ{_}5OmFI6!qN2J!SZDu-;C*aAXqF?2l?|>*+uVR{VzSUps07 zV8S8CG5~O8kZ%(HirrSkJHhoywflH{PvQ_Y%W@pZJKw{NHc%WXs~6V!k^_4bhU-C# zaAaiUTViFC!hwl68&aI3NYKkJu-Zl;IU-rZBJ0_c{lhFiS!%$;g}`tpR{Tv)rC)&k znzonv>`Wb&qX(gp#)*#nQhdmOF8W?fLo405vNB=?Fo)MEO&IXgzrqE7e?5K zts37`cFgsR-2(k!rbaI2!S3XWoi4}Ydhgv{J%~Cg^f1oTsdyH2K~-Amr3s?tDQI3w z$Q)N=kEB})blKS02(3Z@#5wj=+y`f4JjO<@Z#69x&X}gXx6v%ElN~NyNx@O2x}Jd+ zv+yikPI4l(MFOt0w9H~7D9v0(R|M;A`*(rZUj^+#ulD70@@Tv_6s~q_r5g-_% zIgx+|WLsK5Z6{Ffx;D{}zzzgOGCkv2(>Z>%FE89?a*1l`3F>xHpCKhBJQDEZzAVR#F`^mpwPhPo>TpSZh3k&%0VY z@PV0<2Nc*ZJEx1`tGhkU@+lDP7??jhZS1%&xIeUOxSEidTFI2%}SlO2$I62H`vqQXXa0pcV>p$$`l&_I$!siVf zgH7s4uNR*vPX}?M92yp1;fF(ws#=SbW=VB3(EM=|S&sh=N9jf(dxwMz-CmXWhP{!s#rn zi>Hy(2UXa&I+laYtdQ2yNMR*r^eiWwOTMM<2Ej z8!c;e5lUdcCSADt;$Tc$WANfR=vF2t_2=obWn9(rT^&Tm4BD);j(cn*Nl* z@9ZAoG9jbSSkFOG0z0&iH_YKN=7WrTwY?$(Lg%1d?x#oZ?q*BQ5mYw{ zOb@O>D&NYx^6Qg_OD}b#4;m)QCTQUxslLZ~oIawYeUA%_Fcji;cYVGMTBS%{TAEdc z6zWazC>S<*A)JYBy_cB#N_&lOfMVDyKc(1R6jHS?smybxTI#85XmR0kRs4c+(#^H& z;?qr;G(MeX;#0&8r3L)( zTK>v1>HlNvAJ~5owv%JrsCJ;r2yEnC-x1EVb1zeWYPJvgB;?uRhs3i;Q4zu80fTAY;V<+tK6iI6JPE5LYv?8qpGY)z zx9%!%goqG|XZmb32SPEyAtATn^G2tL>3Q+%6%9pZcJQP1@9XVGA5MZ!ugW7UFQrSU zR%zWpaes(=myV;E$QC;CK0Kqpq3q^I87}Pg&WmnBR@GIknEl59 z825_|74>l@ZEUQ_>-oW)6uJD#vgt^Gnf<&~YNDUk9OA|nE&d%XxrIg1k*~NpO_tv> zNeaawY;j)RzjG|_vW(1Hpo1$s<45K5mG)1=ACEEG1|T;A(I(=rJ|9;|*ubSHrK%U| z;um_k##nh}oKIzFe96F3zp77{Iw*ey&LMqZ+40eqe(X8e7>>0m}u*H$xL76Ik#!nL9h3X?{M71Lg(?)+V9w z(h6qMv@t231#c%fJjDBnI+otKCz!+RvMvwKTk{fC$a%Kb)yZ`d(mN~ZXvkh?c0>+kXADc+ zdnUkj)ujGGR)dGm$P{tm<@=;F!@own`Q|*by74DYWziy^AG8^T`!8_7(B6H0Q44t@ z(1`B#Ow)lssAASuCVc0hoUyb$ZGX}3r(@+t0gX5n+E}4I3wf;R*Zq;a7r3;eDdzxZ zgPID7Up=k6cuOm3=cjkIRR-u*`$Ic2S*ZMJphcL^)b@%9Y>`({A;0Er@1_6~6Dcye z2)6&xW*D2a7HawuM+|ZS@81qY*QNIhuU$c0nH1BSw=LaxAHH*( zF3%3)p@j0O@H63Kui4Kij+Cmo!+jPBcY7OiFF;!S52}nO%U*}=d`~Et$eMV-#c>Mx zZk(v<92b5=AYE2M-%bQsY;-0rZBC#0926;8CQxYj_|QBUo>B43R%QR@WN+_T4kRIQPl|**an{NQHphMp>laAsB&@0}1p$Z^VYKv8-3i_qx1&F;8`W_$qBt=e{4JrM# z=}2Nyo>#dB3G*~qA3k3HYw4y&?>EV(uEa_uaV6AlR+@a}johd^2e*>%!F{mxw)n;c z@5#RPa(Xzd$B+ukAfaM~t#KqtqigyeVteG$vxvjWfwN%O9H%3i6z2_AF;7jr;XBZZ zb@Jxsl1-&_wqP0COJ-7b?tFpkmo~wx5+Do+*VyzRVs9oyf1Eo9tzD}`Hd_}8nwxDB zK5mO7ZY8+fF~goKDez1CE4H)@D%)g4_=TYj$xo!5^bcEbHsM{&OhtQ#_64pRhn!uH zP9w4E7RJNptZNk&$UAhmhaduBS6n5WI|!vp4UXqUHccp*8`D>F4X-nVwWtvH`@`MB zb{=f>zj()<{opp7yk~ECEuC~=ZjTOASWg@^4ba{%w*aR7ZLI=(KZV$oi4HwSU5xgG zgeRP#d)Vc4gpBo#<%({d0cV2jt1kIXW+oR4(*rNtahjW8DSD^lo&8|o;5 z-7cqnZ5{uIugV2(!#Bo@f)VNcdpDuS)AzJ;6eTGB1BW`QJo*}Co)gPj=4Qz}YE=vM z-_nwj6gxW|he9uFI}8r8oWLitMG~yYH6Pv#Vzqvd%Oc~%klndRK3OE^DP&~8vX3R1 zb;m8t6f@jU4YSW~iTU;f*i_)t!q&h?X34by*n%U+VaG zPlyAAa5twx-YbGzO4RaUhUujL_6qVzm=9$zms}Fyu47!c1s@MIGSEs(E^Fm*2aNEc zy8qy3o6omQYW!@5UPR{c*U_ziuQ1Ec@iyGlG;})y+o&@%goRc7vXeSSU~-w1eZFW~ zop9-@PqsHR31uv4sGk3PX6{$akz&wYkbof}jtN`f#eXHl>Du9?OQ@vz$z5Sgm8a6- z6P><3C-rOMDyU4^&(3~aR+;xzQIK0J`>SZ@qM}D>=xl$RUoN54RolXU0S&*=tAh`K zR4`|YJ1((?8t82q1Vow5n7{4|+Zkr*B8-2RlTAiGh6@9RL?#sFA^MKTR z#G?;t<%Pi-@Difcj%7HD>n^0cJp1JmR7HU&5A2b<9l3Ty9 zOA14=8Xq^COA?FOU}XhdbQE#)BzxRoi`E zl^rKiMnW{n+lirS2`-Ub>MH?PnMjHWUgge&+NR~vXNg4@q2g<>5p>Yd2MNvOvWc2{ z@V2xwFX96@4uP!HwQBw21+KFTE#|+`nO85{l^LkAw}QUGNy-Xn?n%WqsBbM{9WwtI z{$sbpkc~SknzojO^AQOSrmgIRy5Re7^iG za~p%t1+e4SDURn$0^#Fzs0_z-HF@++8~72KoR%Q^Ss%H(6ZXVf+7fgcV;!UVwX@0J%lQZ&BI0(J~PaQ_rfs%(EezY4P^{S4xJ&Wan`-rQJZ-8oi0j#H7G-Sb)ysIN>(2*|ML0MPf zosc&W))V;rwNxqacDr)-bcCg&!PAhHI(%1^iyGRP6rN#0>o3?Tu`+&KC$sn#fH3-L zoF_#v*>ST-Blxn{8aFekBAV-sl;8!_j$Tqdw-B^V>MfC@-*4 zW6V>>Yo(Vnr9rh(-C)Wk|NNO@m-4WQ7AwBti1gtFJxU%<%3E-*y}yJi(X(4*Wrf%* z(_}PzWH9zm@R`de@e=%w`o*cKo&#o!n9S=a_nzKv*ZV4`7jyabzyu8%9g-ersnKPN z>Gr3YNzK`br`tI9&Bh~fbp=K-<($BjNdkd({Wxc&!874pm=KUOQCq!GIV943^D}bX zOa_%H6QDeuR|=y-8gb62SPY(c`anX7VG32hEU6f0JxuIa_*&?6|JI$MISGSdD@!Y5 zx8rMcgd)z{=r9-AIz^H`ry-01_GQ%S>3y!cYC;QeuTJDZsWpK4O)T}$jEUJLVsrG_$W_0P z_)3BSQedsVpH=n>4>4hdgRHF{e@2OR9ANn$r=AySQxKnoz_dpf* z{o|hj^{bC9-Uq_T3Sy;I%FC>=YceH9ywDI>p-(7y1%lV%$<<+YnLyKo2cSb~NA8p; zOwVObck_4(TS$18J1{KFp3E%@?Gjw5lC~Bt%!F+%qjLFJPe82gUPdgQm7-j-fm^*p zUz#$QOn`lWzzr-iw=D(-U*@IYRF;l65wV5o3684|fNkqme(Z3u;)8~(V^;}O{b77I z2>v07!#U2htmB7W_1UL~AKsWXa$>>96FDz5>kb`&^2EMpcq3}eO6i&nTo~)`fKwHL zpl%i81gbvY7%AK=w1AwzXU8Rt%T@W-l`sMR_GsAE6@n`IIg=*~d>-U4;hZxA?=B@R>^9)WueSCX-NY~l+2-R0PYw~P9Vx| zjrDT8!2LYB)0Qs+HOR_Lt%-@$&btUrV3Xm9NSNr~e)@F>z~0x7jRm;NNvUN^nDDGW7c+~! z&kI#t9Ou#qh4xXNgzZo^KTRG7*#`ua;Z%Yx+=JodorlL2k9sS>%kFoP%CO4gXUU%w zYsJqXTNSH~s>)t=SiNL+X^dxfNq_zd_RvkwJ}Y_^q|Mk0X|_!R2;njuF+DlKRnj9F zB6b$Jwa6z`=%#-W8Yf%w90LvyJncO?ve;W047{Ch!tBzVEe#tx*BKx`Le*W^KEr`5 zt9!o?;(uwa?sb^Yqt>gH**|oKL}BU@=J1T9+Uue7Q6xcdgei1-=0sfQ+d)&eF02N+ zK3MZ%FkCIml>DB)=&_fz#aKeA&!Qoj6>qs%Z5UMJGcss`w@8$~atT$YdoqtgY&EM- zltS_1W#97Os-N3>5us*Qad;s2(!Qrh6k@{BEqTjH6F=?6D|%CP_WKAwI1;sbcvzT3 zo8aHoF$WDjpDdI0yS}FO#_i_Jz-zTXy|P4%6!?$~C0HPK0?BT~u2z7=jUS7Q9~%XD zJuAaeKM}i9zV;@E@}GkudVA5=RS&A!ctw;Eedo7$h1LC@fx0Nj+FEN%F>@)nG5XNU zLHgj&ANtwg@YAU2tfHG zLgw(wC^=6z0^ahP=r7Al`f)V)W9A9nDrLge_b;RJ4q+CgZ&`SSDG}tGg+}gS`NG4> z*I^2u*E>?)l_nX$5^+Rj*=nS@9{oIumbfUWF&excT9B+U>ya;T*Gl$(Y1w)ItF+!l zsM#V%B)@Xr^RED1L>K3|6;l0yVrnTw&r|Ukif(GQi}=ilDr?_h7p!&hol>WUnW^Tm zouy-^Vszou22d=&2!Eg!Qe_*isiO?L>SaRb>ZueU^%BOHdIgPE= zdiw!qVx!GK830G zA2i#!x6HN?wgZmfNyual|5(B?fq7PgH=X-&fyeC?coWm@-vB3AdEX%xb-K03av}+v zB3?D1pAjM&yrJ2Tt6N)iDlYiq>kh6Y1wFQKAtiX}=)=GS@>f zqKEAa=-vi>vJH3uZwUF#Lb6Ck7({Hs85w;Sx7othd4&bly8s9<9s)#AXnm0$urN1n zihqF%)HrzI`QvpK_#2)DL9yw_35*t0R$VVnv=1J?3i^NDqviEBVMpxX{k58Q1h}EHtMT~Gv~<0X%r33*%;mZ#A-P+h9O*Wv zjX!sN06!`+uBp9Qykp<3@noW2IC;+M(ZekprLiZh00=Dh#y0YOnOsJiEAVDk$|bcU z+F|rX+3#f%4Bh@E^w1|x<7T73xL6+-M$3S|9iS2|IeSxMVetdW4_ZPcNz_b{&{Ww03-~B zv6#);nZ5GI9k7D?11r6l^H9W*CTT#t$|1zH4aBr9cpp#kfLm=2;1^}wr7hse^ov8> zPbxC2ok)_^6%bwmKX`cQ5_{$DKaSh~?U4LGPv6sz+yC?Q{l6Wz{}*ohe|duce;)Jy z+YbKS2Lu1Y4*vSc033AxYx92_>Az}=e}1m;ACL66oBqwn;KPT1XZrvBP5(A9_&S3A z=>MIYz}eaVe5AkK1RBhL&HgWcvGF$t{GUJT_^;mdH!uCS`1^0RrANWvru$n^{8w-K z@AmiKyhIO`zfJeI$oXGxDg)oy{LS?Lzi#tiu*H9SSpUto|5C*Mhc~_OAkdg^>{}=w Va2PCu54RX}v<&Z-{04vdKL8dl4CDX+ diff --git a/Tests/LibWeb/Screenshot/input/svg-gradient-paint-transformation.html b/Tests/LibWeb/Screenshot/input/svg-gradient-paint-transformation.html new file mode 100644 index 0000000000..779fbb3f0b --- /dev/null +++ b/Tests/LibWeb/Screenshot/input/svg-gradient-paint-transformation.html @@ -0,0 +1,13 @@ + + + + + + + + HI +