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);
}
/// <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>

21
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)

18
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))
{

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

4
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);
}
}
}

Loading…
Cancel
Save