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)); + } } }