From 07fd1731e74ee6a45f8af41b8c2e02e7968e45c4 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 12 May 2020 23:28:46 +0200 Subject: [PATCH] Fix PixelRect snapping. --- src/Avalonia.Visuals/Media/PixelRect.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Visuals/Media/PixelRect.cs b/src/Avalonia.Visuals/Media/PixelRect.cs index c062112ace..32a728475f 100644 --- a/src/Avalonia.Visuals/Media/PixelRect.cs +++ b/src/Avalonia.Visuals/Media/PixelRect.cs @@ -377,7 +377,7 @@ namespace Avalonia /// The device-independent rect. public static PixelRect FromRect(Rect rect, double scale) => new PixelRect( PixelPoint.FromPoint(rect.Position, scale), - PixelSize.FromSize(rect.Size, scale)); + FromPointCeiling(rect.BottomRight, new Vector(scale, scale))); /// /// Converts a to device pixels using the specified scaling factor. @@ -387,7 +387,7 @@ namespace Avalonia /// The device-independent point. public static PixelRect FromRect(Rect rect, Vector scale) => new PixelRect( PixelPoint.FromPoint(rect.Position, scale), - PixelSize.FromSize(rect.Size, scale)); + FromPointCeiling(rect.BottomRight, scale)); /// /// Converts a to device pixels using the specified dots per inch (DPI). @@ -397,7 +397,7 @@ namespace Avalonia /// The device-independent point. public static PixelRect FromRectWithDpi(Rect rect, double dpi) => new PixelRect( PixelPoint.FromPointWithDpi(rect.Position, dpi), - PixelSize.FromSizeWithDpi(rect.Size, dpi)); + FromPointCeiling(rect.BottomRight, new Vector(dpi / 96, dpi / 96))); /// /// Converts a to device pixels using the specified dots per inch (DPI). @@ -407,7 +407,7 @@ namespace Avalonia /// The device-independent point. public static PixelRect FromRectWithDpi(Rect rect, Vector dpi) => new PixelRect( PixelPoint.FromPointWithDpi(rect.Position, dpi), - PixelSize.FromSizeWithDpi(rect.Size, dpi)); + FromPointCeiling(rect.BottomRight, dpi / 96)); /// /// Returns the string representation of the rectangle. @@ -441,5 +441,12 @@ namespace Avalonia ); } } + + private static PixelPoint FromPointCeiling(Point point, Vector scale) + { + return new PixelPoint( + (int)Math.Ceiling(point.X * scale.X), + (int)Math.Ceiling(point.Y * scale.Y)); + } } }