Browse Source

Use Vector for DPI.

Still needs changing in `IPlatformRenderInterface` but I'd prefer to make that change in a separate PR.
pull/827/head
Steven Kirk 9 years ago
parent
commit
bbf69b7e2d
  1. 11
      src/Avalonia.Visuals/Vector.cs
  2. 21
      src/Skia/Avalonia.Skia/BitmapImpl.cs
  3. 18
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  4. 2
      src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs
  5. 4
      src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

11
src/Avalonia.Visuals/Vector.cs

@ -74,6 +74,17 @@ namespace Avalonia
return new Vector(vector._x * scale, vector._y * scale); 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> /// <summary>
/// Length of the vector /// Length of the vector
/// </summary> /// </summary>

21
src/Skia/Avalonia.Skia/BitmapImpl.cs

@ -8,8 +8,7 @@ namespace Avalonia.Skia
{ {
class BitmapImpl : IRenderTargetBitmapImpl, IWritableBitmapImpl class BitmapImpl : IRenderTargetBitmapImpl, IWritableBitmapImpl
{ {
private double _dpiX; private Vector _dpi;
private double _dpiY;
public SKBitmap Bitmap { get; private set; } public SKBitmap Bitmap { get; private set; }
@ -18,16 +17,14 @@ namespace Avalonia.Skia
Bitmap = bm; Bitmap = bm;
PixelHeight = bm.Height; PixelHeight = bm.Height;
PixelWidth = bm.Width; PixelWidth = bm.Width;
_dpiX = 96; _dpi = new Vector(96, 96);
_dpiY = 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; PixelHeight = height;
PixelWidth = width; PixelWidth = width;
_dpiX = dpiX; _dpi = dpi;
_dpiY = dpiY;
var colorType = fmt?.ToSkColorType() ?? SKImageInfo.PlatformColorType; var colorType = fmt?.ToSkColorType() ?? SKImageInfo.PlatformColorType;
var runtime = AvaloniaLocator.Current?.GetService<IRuntimePlatform>()?.GetRuntimeInfo(); var runtime = AvaloniaLocator.Current?.GetService<IRuntimePlatform>()?.GetRuntimeInfo();
if (runtime?.IsDesktop == true && runtime?.OperatingSystem == OperatingSystemType.Linux) if (runtime?.IsDesktop == true && runtime?.OperatingSystem == OperatingSystemType.Linux)
@ -71,8 +68,8 @@ namespace Avalonia.Skia
{ {
private readonly SKSurface _surface; private readonly SKSurface _surface;
public BitmapDrawingContext(SKBitmap bitmap, double dpiX, double dpiY, IVisualBrushRenderer visualBrushRenderer) public BitmapDrawingContext(SKBitmap bitmap, Vector dpi, IVisualBrushRenderer visualBrushRenderer)
: this(CreateSurface(bitmap), dpiX, dpiY, visualBrushRenderer) : this(CreateSurface(bitmap), dpi, visualBrushRenderer)
{ {
} }
@ -86,8 +83,8 @@ namespace Avalonia.Skia
return rv; return rv;
} }
public BitmapDrawingContext(SKSurface surface, double dpiX, double dpiY, IVisualBrushRenderer visualBrushRenderer) public BitmapDrawingContext(SKSurface surface, Vector dpi, IVisualBrushRenderer visualBrushRenderer)
: base(surface.Canvas, dpiX, dpiY, visualBrushRenderer) : base(surface.Canvas, dpi, visualBrushRenderer)
{ {
_surface = surface; _surface = surface;
} }
@ -101,7 +98,7 @@ namespace Avalonia.Skia
public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer)
{ {
return new BitmapDrawingContext(Bitmap, _dpiX, _dpiY, visualBrushRenderer); return new BitmapDrawingContext(Bitmap, _dpi, visualBrushRenderer);
} }
public void Save(Stream stream) public void Save(Stream stream)

18
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -11,8 +11,7 @@ namespace Avalonia.Skia
{ {
internal class DrawingContextImpl : IDrawingContextImpl internal class DrawingContextImpl : IDrawingContextImpl
{ {
private readonly double _dpiX; private readonly Vector _dpi;
private readonly double _dpiY;
private readonly Matrix? _postTransform; private readonly Matrix? _postTransform;
private readonly IDisposable[] _disposables; private readonly IDisposable[] _disposables;
private readonly IVisualBrushRenderer _visualBrushRenderer; private readonly IVisualBrushRenderer _visualBrushRenderer;
@ -22,16 +21,13 @@ namespace Avalonia.Skia
public DrawingContextImpl( public DrawingContextImpl(
SKCanvas canvas, SKCanvas canvas,
double dpiX, Vector dpi,
double dpiY,
IVisualBrushRenderer visualBrushRenderer, IVisualBrushRenderer visualBrushRenderer,
params IDisposable[] disposables) params IDisposable[] disposables)
{ {
_dpiX = dpiX; _dpi = dpi;
_dpiY = dpiY; if (dpi.X != 96 || dpi.Y != 96)
_postTransform = Matrix.CreateScale(dpi.X / 96, dpi.Y / 96);
if (dpiX != 96 || dpiY != 96)
_postTransform = Matrix.CreateScale(dpiX / 96, dpiY / 96);
_visualBrushRenderer = visualBrushRenderer; _visualBrushRenderer = visualBrushRenderer;
_disposables = disposables; _disposables = disposables;
Canvas = canvas; Canvas = canvas;
@ -217,7 +213,7 @@ namespace Avalonia.Skia
if (intermediateSize.Width >= 1 && intermediateSize.Height >= 1) 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)) using (var ctx = intermediate.CreateDrawingContext(_visualBrushRenderer))
{ {
@ -242,7 +238,7 @@ namespace Avalonia.Skia
if (tileBrush != null && tileBrushImage != null) if (tileBrush != null && tileBrushImage != null)
{ {
var calc = new TileBrushCalculator(tileBrush, new Size(tileBrushImage.PixelWidth, tileBrushImage.PixelHeight), targetSize); 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); rv.AddDisposable(bitmap);
using (var context = bitmap.CreateDrawingContext(null)) using (var context = bitmap.CreateDrawingContext(null))
{ {

2
src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs

@ -76,7 +76,7 @@ namespace Avalonia.Skia
canvas.RestoreToCount(0); canvas.RestoreToCount(0);
canvas.Save(); canvas.Save();
canvas.ResetMatrix(); 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);
} }
} }
} }

4
src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

@ -77,7 +77,7 @@ namespace Avalonia.Skia
if (height < 1) if (height < 1)
throw new ArgumentException("Height can't be less than 1", nameof(height)); 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) public virtual IRenderTarget CreateRenderTarget(IEnumerable<object> surfaces)
@ -90,7 +90,7 @@ namespace Avalonia.Skia
public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? format = null) 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);
} }
} }
} }

Loading…
Cancel
Save