From 2a77f4426ad45f7dc35a76b0673281d3dd409dd7 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 19 Feb 2019 18:49:49 +0100 Subject: [PATCH] Snap dirty rects in DeferredRenderer to device pixels. Fixes #2015. --- .../Rendering/DeferredRenderer.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 3bc5e92fb4..5293e1b978 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -393,24 +393,36 @@ namespace Avalonia.Rendering } else { + var scale = scene.Scaling; + foreach (var rect in layer.Dirty) { + var snappedRect = SnapToDevicePixels(rect, scale); context.Transform = Matrix.Identity; - context.PushClip(rect); + context.PushClip(snappedRect); context.Clear(Colors.Transparent); - Render(context, node, layer.LayerRoot, rect); + Render(context, node, layer.LayerRoot, snappedRect); context.PopClip(); if (DrawDirtyRects) { - _dirtyRectsDisplay.Add(rect); + _dirtyRectsDisplay.Add(snappedRect); } } } } } } + } + private static Rect SnapToDevicePixels(Rect rect, double scale) + { + return new Rect( + Math.Floor(rect.X * scale) / scale, + Math.Floor(rect.Y * scale) / scale, + Math.Ceiling(rect.Width * scale) / scale, + Math.Ceiling(rect.Height * scale) / scale); + } private void RenderOverlay(Scene scene, IDrawingContextImpl parentContent)