From 8215194f3232ccb3afaf50a446912a103f1c7f28 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Thu, 15 Jan 2026 16:17:07 +0100 Subject: [PATCH] Reset cached transform on PopEffect (#20474) --- .../DrawingContextImpl.Effects.cs | 2 +- .../Avalonia.RenderTests/Media/EffectTests.cs | 40 +++++++++++++++++- .../EffectFollowedByNonEffect.expected.png | Bin 0 -> 3959 bytes 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tests/TestFiles/Skia/Media/Effects/EffectFollowedByNonEffect.expected.png diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.Effects.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.Effects.cs index 7621e8436c..b661ad467d 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.Effects.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.Effects.cs @@ -23,7 +23,7 @@ partial class DrawingContextImpl public void PopEffect() { CheckLease(); - Canvas.Restore(); + RestoreCanvas(); } SKImageFilter? CreateEffect(IEffect effect) diff --git a/tests/Avalonia.RenderTests/Media/EffectTests.cs b/tests/Avalonia.RenderTests/Media/EffectTests.cs index 9a83b397f4..c8b931dae8 100644 --- a/tests/Avalonia.RenderTests/Media/EffectTests.cs +++ b/tests/Avalonia.RenderTests/Media/EffectTests.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Avalonia.Controls; +using Avalonia.Controls.Shapes; using Avalonia.Media; using Xunit; #pragma warning disable CS0649 @@ -38,6 +39,43 @@ public class EffectTests : TestBase await RenderToFile(target); CompareImages(skipImmediate: true); } + + [Fact] + public async Task EffectFollowedByNonEffect() + { + var target = new Border + { + Background = Brushes.White, + Width = 200, + Height = 200, + Child = new Panel + { + Margin = new Thickness(25), + Children = + { + new Rectangle + { + Fill = Brushes.Yellow, + Effect = new DropShadowEffect + { + Opacity = 1, + OffsetX = 0, + OffsetY = 0, + Color = Colors.Black, + BlurRadius = 50 + } + }, + new Rectangle + { + Fill = new SolidColorBrush(0x7F007FFF) + } + } + } + }; + + await RenderToFile(target); + CompareImages(skipImmediate: true); + } } -#endif \ No newline at end of file +#endif diff --git a/tests/TestFiles/Skia/Media/Effects/EffectFollowedByNonEffect.expected.png b/tests/TestFiles/Skia/Media/Effects/EffectFollowedByNonEffect.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f57cecf6ca16a58692562185f712f127556830 GIT binary patch literal 3959 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