diff --git a/src/Avalonia.Visuals/Vector.cs b/src/Avalonia.Visuals/Vector.cs index 69cbfd9592..c4545b8e5c 100644 --- a/src/Avalonia.Visuals/Vector.cs +++ b/src/Avalonia.Visuals/Vector.cs @@ -74,6 +74,17 @@ namespace Avalonia return new Vector(vector._x * scale, vector._y * scale); } + /// + /// Scales a vector. + /// + /// The vector + /// The divisor. + /// The scaled vector. + public static Vector operator /(Vector vector, double scale) + { + return new Vector(vector._x / scale, vector._y / scale); + } + /// /// Length of the vector /// diff --git a/src/Skia/Avalonia.Skia/BitmapImpl.cs b/src/Skia/Avalonia.Skia/BitmapImpl.cs index 17cabdbb2f..8fd648be62 100644 --- a/src/Skia/Avalonia.Skia/BitmapImpl.cs +++ b/src/Skia/Avalonia.Skia/BitmapImpl.cs @@ -8,8 +8,7 @@ namespace Avalonia.Skia { class BitmapImpl : IRenderTargetBitmapImpl, IWritableBitmapImpl { - private double _dpiX; - private double _dpiY; + private Vector _dpi; public SKBitmap Bitmap { get; private set; } @@ -18,16 +17,14 @@ namespace Avalonia.Skia Bitmap = bm; PixelHeight = bm.Height; PixelWidth = bm.Width; - _dpiX = 96; - _dpiY = 96; + _dpi = new Vector(96, 96); } - public BitmapImpl(int width, int height, double dpiX, double dpiY, PixelFormat? fmt = null) + public BitmapImpl(int width, int height, Vector dpi, PixelFormat? fmt = null) { PixelHeight = height; PixelWidth = width; - _dpiX = dpiX; - _dpiY = dpiY; + _dpi = dpi; var colorType = fmt?.ToSkColorType() ?? SKImageInfo.PlatformColorType; var runtime = AvaloniaLocator.Current?.GetService()?.GetRuntimeInfo(); if (runtime?.IsDesktop == true && runtime?.OperatingSystem == OperatingSystemType.Linux) @@ -71,8 +68,8 @@ namespace Avalonia.Skia { private readonly SKSurface _surface; - public BitmapDrawingContext(SKBitmap bitmap, double dpiX, double dpiY, IVisualBrushRenderer visualBrushRenderer) - : this(CreateSurface(bitmap), dpiX, dpiY, visualBrushRenderer) + public BitmapDrawingContext(SKBitmap bitmap, Vector dpi, IVisualBrushRenderer visualBrushRenderer) + : this(CreateSurface(bitmap), dpi, visualBrushRenderer) { } @@ -86,8 +83,8 @@ namespace Avalonia.Skia return rv; } - public BitmapDrawingContext(SKSurface surface, double dpiX, double dpiY, IVisualBrushRenderer visualBrushRenderer) - : base(surface.Canvas, dpiX, dpiY, visualBrushRenderer) + public BitmapDrawingContext(SKSurface surface, Vector dpi, IVisualBrushRenderer visualBrushRenderer) + : base(surface.Canvas, dpi, visualBrushRenderer) { _surface = surface; } @@ -101,7 +98,7 @@ namespace Avalonia.Skia public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { - return new BitmapDrawingContext(Bitmap, _dpiX, _dpiY, visualBrushRenderer); + return new BitmapDrawingContext(Bitmap, _dpi, visualBrushRenderer); } public void Save(Stream stream) diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index fb2e5a69a6..7a83835b10 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -11,8 +11,7 @@ namespace Avalonia.Skia { internal class DrawingContextImpl : IDrawingContextImpl { - private readonly double _dpiX; - private readonly double _dpiY; + private readonly Vector _dpi; private readonly Matrix? _postTransform; private readonly IDisposable[] _disposables; private readonly IVisualBrushRenderer _visualBrushRenderer; @@ -22,16 +21,13 @@ namespace Avalonia.Skia public DrawingContextImpl( SKCanvas canvas, - double dpiX, - double dpiY, + Vector dpi, IVisualBrushRenderer visualBrushRenderer, params IDisposable[] disposables) { - _dpiX = dpiX; - _dpiY = dpiY; - - if (dpiX != 96 || dpiY != 96) - _postTransform = Matrix.CreateScale(dpiX / 96, dpiY / 96); + _dpi = dpi; + if (dpi.X != 96 || dpi.Y != 96) + _postTransform = Matrix.CreateScale(dpi.X / 96, dpi.Y / 96); _visualBrushRenderer = visualBrushRenderer; _disposables = disposables; Canvas = canvas; @@ -217,7 +213,7 @@ namespace Avalonia.Skia if (intermediateSize.Width >= 1 && intermediateSize.Height >= 1) { - var intermediate = new BitmapImpl((int)intermediateSize.Width, (int)intermediateSize.Height, _dpiX, _dpiY); + var intermediate = new BitmapImpl((int)intermediateSize.Width, (int)intermediateSize.Height, _dpi); using (var ctx = intermediate.CreateDrawingContext(_visualBrushRenderer)) { @@ -242,7 +238,7 @@ namespace Avalonia.Skia if (tileBrush != null && tileBrushImage != null) { var calc = new TileBrushCalculator(tileBrush, new Size(tileBrushImage.PixelWidth, tileBrushImage.PixelHeight), targetSize); - var bitmap = new BitmapImpl((int)calc.IntermediateSize.Width, (int)calc.IntermediateSize.Height, _dpiX, _dpiY); + var bitmap = new BitmapImpl((int)calc.IntermediateSize.Width, (int)calc.IntermediateSize.Height, _dpi); rv.AddDisposable(bitmap); using (var context = bitmap.CreateDrawingContext(null)) { diff --git a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs index bd59c0c809..1956f02d1b 100644 --- a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs +++ b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs @@ -76,7 +76,7 @@ namespace Avalonia.Skia canvas.RestoreToCount(0); canvas.Save(); canvas.ResetMatrix(); - return new DrawingContextImpl(canvas, fb.Dpi.X, fb.Dpi.Y, visualBrushRenderer, canvas, surface, shim, fb); + return new DrawingContextImpl(canvas, fb.Dpi, visualBrushRenderer, canvas, surface, shim, fb); } } } diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index 3bf587d386..bd3769e4a5 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -77,7 +77,7 @@ namespace Avalonia.Skia if (height < 1) throw new ArgumentException("Height can't be less than 1", nameof(height)); - return new BitmapImpl(width, height, dpiX, dpiY); + return new BitmapImpl(width, height, new Vector(dpiX, dpiY)); } public virtual IRenderTarget CreateRenderTarget(IEnumerable surfaces) @@ -90,7 +90,7 @@ namespace Avalonia.Skia public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? format = null) { - return new BitmapImpl(width, height, 96, 96, format); + return new BitmapImpl(width, height, new Vector(96, 96), format); } } }