From 3cf78a5c434b7399c134c59a058d526649c7be84 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 9 Apr 2024 04:20:22 +0500 Subject: [PATCH] Clamp reported dirty rect before attempting to merge it (#15277) --- .../ServerCompositionTarget.DirtyRects.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.DirtyRects.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.DirtyRects.cs index c4d721c733..d82502fc3c 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.DirtyRects.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.DirtyRects.cs @@ -8,14 +8,27 @@ namespace Avalonia.Rendering.Composition.Server; internal partial class ServerCompositionTarget { public readonly IDirtyRectTracker DirtyRects; + + static int Clamp0(int value, int max) => Math.Max(Math.Min(value, max), 0); public void AddDirtyRect(LtrbRect rect) { if (rect.IsZeroSize) return; - var snapped = LtrbPixelRect.FromRectWithNoScaling(SnapToDevicePixels(rect, Scaling)); + DebugEvents?.RectInvalidated(rect.ToRect()); - DirtyRects.AddRect(snapped); + + var snapped = LtrbPixelRect.FromRectWithNoScaling(SnapToDevicePixels(rect, Scaling)); + + var clamped = new LtrbPixelRect( + Clamp0(snapped.Left, _pixelSize.Width), + Clamp0(snapped.Top, _pixelSize.Height), + Clamp0(snapped.Right, _pixelSize.Width), + Clamp0(snapped.Bottom, _pixelSize.Height) + ); + + if (!clamped.IsEmpty) + DirtyRects.AddRect(clamped); _redrawRequested = true; }