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