Browse Source

Use Vector for DPI.

Still needs changing in `IPlatformRenderInterface` but I'd prefer to make that change in a separate PR.
Steven Kirk 8 years ago
parent
commit
bbf69b7e2d

+ 11 - 0
src/Avalonia.Visuals/Vector.cs

@@ -74,6 +74,17 @@ namespace Avalonia
             return new Vector(vector._x * scale, vector._y * scale);
         }
 
+        /// <summary>
+        /// Scales a vector.
+        /// </summary>
+        /// <param name="vector">The vector</param>
+        /// <param name="scale">The divisor.</param>
+        /// <returns>The scaled vector.</returns>
+        public static Vector operator /(Vector vector, double scale)
+        {
+            return new Vector(vector._x / scale, vector._y / scale);
+        }
+
         /// <summary>
         /// Length of the vector
         /// </summary>

+ 9 - 12
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<IRuntimePlatform>()?.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)

+ 7 - 11
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))
                 {

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

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