diff --git a/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs b/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs index 0ad826f5a9..8dd75d2374 100644 --- a/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs +++ b/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs @@ -75,7 +75,7 @@ namespace Avalonia.Media.Imaging public Vector Dpi => PlatformImpl.Item.Dpi; /// - public Size Size => PlatformImpl.Item.PixelSize.ToSize(Dpi); + public Size Size => PlatformImpl.Item.PixelSize.ToSizeWithDpi(Dpi); /// public PixelSize PixelSize => PlatformImpl.Item.PixelSize; diff --git a/src/Avalonia.Visuals/Media/PixelSize.cs b/src/Avalonia.Visuals/Media/PixelSize.cs index 6785b51716..b903b804f9 100644 --- a/src/Avalonia.Visuals/Media/PixelSize.cs +++ b/src/Avalonia.Visuals/Media/PixelSize.cs @@ -72,7 +72,7 @@ namespace Avalonia /// The . public static PixelSize Parse(string s) { - using (var tokenizer = new StringTokenizer(s, CultureInfo.InvariantCulture, exceptionMessage: "Invalid Size")) + using (var tokenizer = new StringTokenizer(s, CultureInfo.InvariantCulture, exceptionMessage: "Invalid PixelSize")) { return new PixelSize( tokenizer.ReadInt32(), @@ -126,13 +126,29 @@ namespace Avalonia /// The new . public PixelSize WithHeight(int height) => new PixelSize(Width, height); + /// + /// Converts the to a device-independent using the + /// specified scaling factor. + /// + /// The scaling factor. + /// The device-independent size. + public Size ToSize(double scale) => new Size(Width / scale, Height / scale); + + /// + /// Converts the to a device-independent using the + /// specified scaling factor. + /// + /// The scaling factor. + /// The device-independent size. + public Size ToSize(Vector scale) => new Size(Width / scale.X, Height / scale.Y); + /// /// Converts the to a device-independent using the /// specified dots per inch (DPI). /// /// The dots per inch. /// The device-independent size. - public Size ToSize(double dpi) => new Size(Width / (dpi / 96), Height / (dpi / 96)); + public Size ToSizeWithDpi(double dpi) => ToSize(dpi / 96); /// /// Converts the to a device-independent using the @@ -140,7 +156,27 @@ namespace Avalonia /// /// The dots per inch. /// The device-independent size. - public Size ToSize(Vector dpi) => new Size(Width / (dpi.X / 96), Height / (dpi.Y / 96)); + public Size ToSizeWithDpi(Vector dpi) => ToSize(new Vector(dpi.X / 96, dpi.Y / 96)); + + /// + /// Converts a to device pixels using the specified scaling factor. + /// + /// The size. + /// The scaling factor. + /// The device-independent size. + public static PixelSize FromSize(Size size, double scale) => new PixelSize( + (int)Math.Ceiling(size.Width * scale), + (int)Math.Ceiling(size.Height * scale)); + + /// + /// Converts a to device pixels using the specified scaling factor. + /// + /// The size. + /// The scaling factor. + /// The device-independent size. + public static PixelSize FromSize(Size size, Vector scale) => new PixelSize( + (int)Math.Ceiling(size.Width * scale.X), + (int)Math.Ceiling(size.Height * scale.Y)); /// /// Converts a to device pixels using the specified dots per inch (DPI). @@ -148,9 +184,7 @@ namespace Avalonia /// The size. /// The dots per inch. /// The device-independent size. - public static PixelSize FromSize(Size size, double dpi) => new PixelSize( - (int)(size.Width * (dpi / 96)), - (int)(size.Height * (dpi / 96))); + public static PixelSize FromSizeWithDpi(Size size, double dpi) => FromSize(size, dpi / 96); /// /// Converts a to device pixels using the specified dots per inch (DPI). @@ -158,9 +192,7 @@ namespace Avalonia /// The size. /// The dots per inch. /// The device-independent size. - public static PixelSize FromSize(Size size, Vector dpi) => new PixelSize( - (int)Math.Ceiling(size.Width * (dpi.X / 96)), - (int)Math.Ceiling(size.Height * (dpi.Y / 96))); + public static PixelSize FromSizeWithDpi(Size size, Vector dpi) => FromSize(size, new Vector(dpi.X / 96, dpi.Y / 96)); /// /// Returns the string representation of the size. diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index fabfe2b225..353354da5e 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -401,15 +401,15 @@ namespace Avalonia.Skia /// Tile brush image. private void ConfigureTileBrush(ref PaintWrapper paintWrapper, Size targetSize, ITileBrush tileBrush, IDrawableBitmapImpl tileBrushImage) { - var calc = new TileBrushCalculator(tileBrush, tileBrushImage.PixelSize.ToSize(_dpi), targetSize); + var calc = new TileBrushCalculator(tileBrush, tileBrushImage.PixelSize.ToSizeWithDpi(_dpi), targetSize); var intermediate = CreateRenderTarget(calc.IntermediateSize); paintWrapper.AddDisposable(intermediate); using (var context = intermediate.CreateDrawingContext(null)) { - var sourceRect = new Rect(tileBrushImage.PixelSize.ToSize(96)); - var targetRect = new Rect(tileBrushImage.PixelSize.ToSize(_dpi)); + var sourceRect = new Rect(tileBrushImage.PixelSize.ToSizeWithDpi(96)); + var targetRect = new Rect(tileBrushImage.PixelSize.ToSizeWithDpi(_dpi)); context.Clear(Colors.Transparent); context.PushClip(calc.IntermediateClip); @@ -634,7 +634,7 @@ namespace Avalonia.Skia /// private SurfaceRenderTarget CreateRenderTarget(Size size, PixelFormat? format = null) { - var pixelSize = PixelSize.FromSize(size, _dpi); + var pixelSize = PixelSize.FromSizeWithDpi(size, _dpi); var createInfo = new SurfaceRenderTarget.CreateInfo { Width = pixelSize.Width, diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index aaca1a3b00..5e150ff647 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -330,7 +330,7 @@ namespace Avalonia.Direct2D1.Media { var platform = AvaloniaLocator.Current.GetService(); var dpi = new Vector(_deviceContext.DotsPerInch.Width, _deviceContext.DotsPerInch.Height); - var pixelSize = PixelSize.FromSize(size, dpi); + var pixelSize = PixelSize.FromSizeWithDpi(size, dpi); return platform.CreateRenderTargetBitmap(pixelSize, dpi); } } @@ -438,12 +438,12 @@ namespace Avalonia.Direct2D1.Media // D2D alters the DPI of the render target, which messes stuff up. PixelSize.FromSize // will do the rounding for us. var dpi = new Vector(_deviceContext.DotsPerInch.Width, _deviceContext.DotsPerInch.Height); - var pixelSize = PixelSize.FromSize(intermediateSize, dpi); + var pixelSize = PixelSize.FromSizeWithDpi(intermediateSize, dpi); using (var intermediate = new BitmapRenderTarget( _deviceContext, CompatibleRenderTargetOptions.None, - pixelSize.ToSize(dpi).ToSharpDX())) + pixelSize.ToSizeWithDpi(dpi).ToSharpDX())) { using (var ctx = new RenderTarget(intermediate).CreateDrawingContext(_visualBrushRenderer)) { diff --git a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs index 19d320b783..fbc6d21cb7 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs @@ -21,7 +21,7 @@ namespace Avalonia.Direct2D1.Media Size targetSize) { var dpi = new Vector(target.DotsPerInch.Width, target.DotsPerInch.Height); - var calc = new TileBrushCalculator(brush, bitmap.PixelSize.ToSize(dpi), targetSize); + var calc = new TileBrushCalculator(brush, bitmap.PixelSize.ToSizeWithDpi(dpi), targetSize); if (!calc.NeedsIntermediate) { @@ -101,7 +101,7 @@ namespace Avalonia.Direct2D1.Media using (var context = new RenderTarget(result).CreateDrawingContext(null)) { var dpi = new Vector(target.DotsPerInch.Width, target.DotsPerInch.Height); - var rect = new Rect(bitmap.PixelSize.ToSize(dpi)); + var rect = new Rect(bitmap.PixelSize.ToSizeWithDpi(dpi)); context.Clear(Colors.Transparent); context.PushClip(calc.IntermediateClip); diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs index fbe7f840d7..8ec368c999 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs @@ -61,8 +61,8 @@ namespace Avalonia.Direct2D1.Media.Imaging dc.DrawImage( RefCountable.CreateUnownedNotClonable(this), 1, - new Rect(PixelSize.ToSize(Dpi.X)), - new Rect(PixelSize.ToSize(Dpi.X))); + new Rect(PixelSize.ToSizeWithDpi(Dpi.X)), + new Rect(PixelSize.ToSizeWithDpi(Dpi.X))); } wic.Save(stream);