Browse Source

Merge pull request #771 from VitalElement/feature/skia-dpi-scaling

WIP: Implemented Skia DPI scaling.
pull/775/head
Nikita Tsukanov 10 years ago
committed by GitHub
parent
commit
e8543dc6de
  1. 16
      src/Avalonia.SceneGraph/Media/DrawingContext.cs
  2. 4
      src/Avalonia.SceneGraph/Rendering/RendererMixin.cs
  3. 44
      src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs

16
src/Avalonia.SceneGraph/Media/DrawingContext.cs

@ -12,6 +12,9 @@ namespace Avalonia.Media
{ {
private readonly IDrawingContextImpl _impl; private readonly IDrawingContextImpl _impl;
private int _currentLevel; private int _currentLevel;
//Internal tranformation that is applied but not exposed anywhere
//To be used for DPI scaling, etc
private Matrix? _hiddenPostTransform = Matrix.Identity;
@ -36,9 +39,10 @@ namespace Avalonia.Media
} }
} }
public DrawingContext(IDrawingContextImpl impl) public DrawingContext(IDrawingContextImpl impl, Matrix? hiddenPostTransform = null)
{ {
_impl = impl; _impl = impl;
_hiddenPostTransform = hiddenPostTransform;
} }
@ -55,11 +59,17 @@ namespace Avalonia.Media
private set private set
{ {
_currentTransform = value; _currentTransform = value;
_impl.Transform = _currentTransform*_currentContainerTransform; var transform = _currentTransform*_currentContainerTransform;
if (_hiddenPostTransform.HasValue)
transform = transform*_hiddenPostTransform.Value;
_impl.Transform = transform;
} }
} }
internal Matrix CurrentContainerTransform => _currentContainerTransform; //HACK: This is a temporary hack that is used in the render loop
//to update TransformedBounds property
[Obsolete("HACK for render loop, don't use")]
internal Matrix CurrentContainerTransform => _currentContainerTransform;
/// <summary> /// <summary>
/// Draws a bitmap image. /// Draws a bitmap image.

4
src/Avalonia.SceneGraph/Rendering/RendererMixin.cs

@ -124,8 +124,12 @@ namespace Avalonia.Rendering
using (context.PushTransformContainer()) using (context.PushTransformContainer())
{ {
visual.Render(context); visual.Render(context);
#pragma warning disable 0618
var transformed = var transformed =
new TransformedBounds(bounds, new Rect(), context.CurrentContainerTransform); new TransformedBounds(bounds, new Rect(), context.CurrentContainerTransform);
#pragma warning restore 0618
if (visual is Visual) if (visual is Visual)
{ {
BoundsTracker.SetTransformedBounds((Visual)visual, transformed); BoundsTracker.SetTransformedBounds((Visual)visual, transformed);

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

@ -79,6 +79,29 @@ namespace Avalonia.Skia
#endif #endif
} }
private Size GetWindowDpiWin32()
{
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);
}
public override DrawingContext CreateDrawingContext() public override DrawingContext CreateDrawingContext()
{ {
FixSize(); FixSize();
@ -89,9 +112,26 @@ namespace Avalonia.Skia
canvas.Clear(SKColors.Red); canvas.Clear(SKColors.Red);
canvas.ResetMatrix(); canvas.ResetMatrix();
return double scale = 1.0;
var runtimeService = AvaloniaLocator.Current.GetService<IRuntimePlatform>();
if (runtimeService != null)
{
switch (runtimeService.GetRuntimeInfo().OperatingSystem)
{
case OperatingSystemType.WinNT:
var dpi = GetWindowDpiWin32();
scale = dpi.Width / 96.0;
break;
}
}
var result =
new DrawingContext( new DrawingContext(
new WindowDrawingContextImpl(this)); new WindowDrawingContextImpl(this), Matrix.CreateScale(scale, scale));
return result;
} }
public void Present() public void Present()

Loading…
Cancel
Save