From 30b451da5256c74a559188dd8b401a31b5be4731 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 9 Feb 2026 20:08:59 +0500 Subject: [PATCH] Fix Border clip regression (#20648) --- .../ServerCompositionVisual.Render.cs | 2 +- .../Controls/BorderTests.cs | 33 ++++++++++++++++++ ...ps_To_Round_Bounds_NonUniform.expected.png | Bin 0 -> 1564 bytes ...Clips_To_Round_Bounds_Uniform.expected.png | Bin 0 -> 1654 bytes 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_NonUniform.expected.png create mode 100644 tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_Uniform.expected.png diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.Render.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.Render.cs index ad828b068a..d2dd0346d6 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.Render.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.Render.cs @@ -110,7 +110,7 @@ partial class ServerCompositionVisual _walkContext.PushClip(effectiveClip); if (visual.ClipToBounds) - _canvas.PushClip(new Rect(0, 0, visual.Size.X, visual.Size.Y)); + visual.PushClipToBounds(_canvas); if (visual.Clip != null) _canvas.PushGeometryClip(visual.Clip); diff --git a/tests/Avalonia.RenderTests/Controls/BorderTests.cs b/tests/Avalonia.RenderTests/Controls/BorderTests.cs index 9e2f06ea6a..f7b1a7508f 100644 --- a/tests/Avalonia.RenderTests/Controls/BorderTests.cs +++ b/tests/Avalonia.RenderTests/Controls/BorderTests.cs @@ -424,5 +424,38 @@ namespace Avalonia.Skia.RenderTests await RenderToFile(target); CompareImages(); } + + [Theory, + InlineData(true), + InlineData(false)] + public async Task Border_Clips_To_Round_Bounds(bool uniform) + { + var cornerRadius = uniform + ? new CornerRadius(20) + : new CornerRadius(20, 10, 30, 5); + + Decorator target = new Decorator + { + Padding = new Thickness(8), + Width = 200, + Height = 200, + Child = new Border + { + CornerRadius = cornerRadius, + Background = Brushes.LightBlue, + ClipToBounds = true, + Child = new Border + { + Width = 300, + Height = 300, + Background = Brushes.Red, + } + } + }; + + var testSuffix = nameof(Border_Clips_To_Round_Bounds) + "_" + (uniform ? "Uniform" : "NonUniform"); + await RenderToFile(target, testSuffix); + CompareImages(testSuffix); + } } } diff --git a/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_NonUniform.expected.png b/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_NonUniform.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e04a3e07bd5c8d7a6bf6421b36dfa69468dfbe3e GIT binary patch literal 1564 zcmeHH|5FkM6!**m*-X2vm1uHVE5b$26@Fu=XG`&BMuhn-Y{Q&i5)?xbnb}O{w!WB{ zCYW{1^EgB^5*1OGu8|0IXJwfoO;qp;AW5PqFl>Lre%rfy@AJ8L@80Kg?}t|zA9unH z0(b=|%##I4b{a>s<%9kRxNTKu44S2|qhIZGIjT6@e{c>)xVr*oC|Q zFsfD+eS&8z{p!zi>#^Zi8iHm=H@ogQ>k;Vxn|}d;u%H+ixgUAi0|2F7sUkB^&2HwE z5vr>NV7ScICF(Hp@7FLm$}j{wN3K`#boML3f+N`^?V9h?of46p{ImX#sCPZLUD2>;yC> z5BmD!ODNO7woS`@f^W)KucEe=c7>4_WjBiCS+C4V-5q~FHAJFHU0q8?%?C} zv~D%Sl#?}wp{fH5)2SUdSHjLYZamM(-84;ti( zbKs))Mhut!y5`Bf1ZKXMR=f3K=$Fgny!a@e%^2m|F1m#mZWwa=Jz!~a;9a%kgCG%5 z9GeS~&sM&Ac43DW*nxy@f|?CGrqYRIk0>nWY_L7Icpp6 z>Ps*0H?j?KDd@<9dW4_HFT4~g6S3C=1cNm(sDaM+A6U%Gsv#D1+Km8BPaOvqNAb=P z6DX7|vCyNO;6e`&H*ZziL(SV)7LQFtqvi>U6aJuPrK-_V!H}TA;AE;m5AlpsONWOW z{;YC|+;*m(q0$xLAfD2hgc z@n4;1JtH?nD=IF;W@r2QPG53t98gU2P(fMVLq6quUyG@0o$5jrazr3$b{XgvUZU$2 z+L1|E6Eoi~UKRk$$=RAGwZb`=`{COdsrC6AyCe{(8L>@a1tmqKwS5lvq&*kq%9Z2~ zvj@~aoxEF8FhX`MU*cfVEJUugAjfD;h=p1^Va+n|;->?e2!|cSVZ6<@VqNRk&QQq) zh`im1L%@MbX3cOWSw9n6lca0Pl~jee5{Oxrh)y`@0Pau|f1Ygck;!D&;1hJd$&{%t zJs5l)t>42n4Khazaq3Bu_c&f8eB0l%)Z541BL1$WL_y~!i&uqzrZ)%)= zaIEfVYf3LmT7$pQT4KUw(rDI}R^=%OwCP1%uSNR!>Eg+(#+JUM`} literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_Uniform.expected.png b/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_Uniform.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..faec852614740c7fc0756e912b7925b5d9571ca8 GIT binary patch literal 1654 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu@pObhHwBu4M$1`0|T3`r;B4q z#hkZy_GU|$%N+l>`*S4!L>=yvpC*55dA)06_QaK2q7_;l76$)s=Q}&WX*pl)p7LzP zw;>tZC+G?|MQbb+u`*YDaAZf`2dQhz$HzHPg0xzK~-zG{1qy}7gZ&$DA^ zHJmIjrK#~8xmv$4C%-mlU(L?aN6Zy%6IYxMulvMv`0;~|*B{@@`SR>K&;Bd?zOe|=%wUG2O=lNM$gUZo%-(s zPqM|EoeP-@#kBZ=`h*kDGy4U9JAYL(ec>mCH<5zz1Ti2MQdT zBmBd-!`#g5t=X*C*BI}IJ$zF%+4KCVG<}x8ToxaMk4Vn{)o4+0E%NTVmp;?>bMCUc z&~{&c`g5VHXHzfR+FUAdkZGyxVyS8>Df;=ogLyso>f5GsJ72zMUdy{ln0a+O*N zZj-*wEpJ})nRkh4;l4@h@=}y$a&>f;lqz4IWfA`|`nmK8$CV#EQ-T={g;Mf=vl(4^ z8{3_uq~La@?!WDR(|wH*d;bQd2s0WQl@u7f+kVVkVE5f~u4aM)%4N?(@8$RAD;%!& zGuqVIAR(D&a;Yx6CSIhf?IB2k@iKqrKa8vn3Id~OXoSEA-X-%-?ov1AD%jNYCilKW z)y^1oP|R{}+WvRG!pmYmP&xpolA;+NIp9R#_-$Lh!o1x7ayMNZdRT7W-q)y-wR^kr zY>tkJ3e~rHiWY_kUtSALY{Dl)9C%8WExY}Em2~9((#CtuCEUsTU5rEpgzqN3tea5U zI8PyNrOE4ert_lM?>fA0v?vz#JTG%kJND@E6z|7M*z}cBk~ok^`FAAchK` z@(bZ320VvPKmYtUuKsx5_8*m8=hoDzJ-*fHa&XP{?@ep?_uTY7UKk~=UthN5Wkc|_ zJrzI0E?BSy#qX&)Zp_o){CJJ**Q2Y;554<-L4KF*;SEv7o9olV!%roiXZ7<=F3VHh z{^^VEWdo=il9j8tn>zPEFgi zZEEo|ZF~MAyMmxOKaaMrocng7&1_%Ha70qmTPiv&i||TO7r^m)cpIg;(GU&vlZ!CuY#5b z{3`o$^AqpAU5`~{mtBhc+abN^n++kQ{-RoUii zb?T;f^7sY$`VRT3?2S_^ez7d*cl*hZ)$>pOOWQ6T-@9h5t