Browse Source

Implemented Skia DPI scaling.

Has a workaround for bug in DrawingContext.
pull/771/head
Dan Walmsley 10 years ago
parent
commit
b83991fdb6
  1. 34
      src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs
  2. 20
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  3. 4
      src/Skia/Avalonia.Skia/WindowDrawingContextImpl.cs

34
src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs

@ -79,6 +79,31 @@ namespace Avalonia.Skia
#endif
}
#if WIN32
private Size GetWindowDpi()
{
if (UnmanagedMethods.ShCoreAvailable)
{
uint dpix, dpiy;
var monitor = UnmanagedMethods.MonitorFromWindow(
_hwnd.Handle,
UnmanagedMethods.MONITOR.MONITOR_DEFAULTTONEAREST);
if (UnmanagedMethods.GetDpiForMonitor(
monitor,
UnmanagedMethods.MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI,
out dpix,
out dpiy) == 0)
{
return new Size(dpix, dpiy);
}
}
return new Size(96, 96);
}
#endif
public override DrawingContext CreateDrawingContext()
{
FixSize();
@ -89,9 +114,16 @@ namespace Avalonia.Skia
canvas.Clear(SKColors.Red);
canvas.ResetMatrix();
double scale = 1.0;
#if WIN32
var dpi = GetWindowDpi();
scale = dpi.Width / 96.0;
#endif
return
new DrawingContext(
new WindowDrawingContextImpl(this));
new WindowDrawingContextImpl(this, scale));
}
public void Present()

20
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -11,13 +11,19 @@ namespace Avalonia.Skia
internal class DrawingContextImpl : IDrawingContextImpl
{
private Stack<PaintWrapper> maskStack = new Stack<PaintWrapper>();
private Matrix _dpiScaleMatrix;
private Matrix _currentTransform = Matrix.Identity;
public SKCanvas Canvas { get; private set; }
public DrawingContextImpl(SKCanvas canvas)
public DrawingContextImpl(SKCanvas canvas, double scale = 1.0)
{
Canvas = canvas;
Canvas.Clear();
_dpiScaleMatrix = Matrix.CreateScale(scale, scale);
_currentTransform = Matrix.Identity * _dpiScaleMatrix;
}
public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect)
@ -342,9 +348,7 @@ namespace Avalonia.Skia
}
Canvas.Restore();
Canvas.Restore();
}
private Matrix _currentTransform = Matrix.Identity;
}
public Matrix Transform
{
@ -355,7 +359,11 @@ namespace Avalonia.Skia
return;
_currentTransform = value;
Canvas.SetMatrix(value.ToSKMatrix());
// TODO this line is a workaround for bug in DrawingContext.cs
_currentTransform *= _dpiScaleMatrix;
Canvas.SetMatrix(_currentTransform.ToSKMatrix());
}
}
}

4
src/Skia/Avalonia.Skia/WindowDrawingContextImpl.cs

@ -6,8 +6,8 @@ namespace Avalonia.Skia
{
WindowRenderTarget _target;
public WindowDrawingContextImpl(WindowRenderTarget target)
: base(target.Surface.Canvas)
public WindowDrawingContextImpl(WindowRenderTarget target, double scale = 1.0)
: base(target.Surface.Canvas, scale)
{
_target = target;
}

Loading…
Cancel
Save