Browse Source

Merge branch 'master' into fixes/skia-path-fill-type

pull/772/head
danwalmsley 10 years ago
committed by GitHub
parent
commit
03b84a0266
  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 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;
_hiddenPostTransform = hiddenPostTransform;
}
@ -55,11 +59,17 @@ namespace Avalonia.Media
private set
{
_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>
/// Draws a bitmap image.

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

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

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

@ -79,6 +79,29 @@ namespace Avalonia.Skia
#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()
{
FixSize();
@ -89,9 +112,26 @@ namespace Avalonia.Skia
canvas.Clear(SKColors.Red);
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 WindowDrawingContextImpl(this));
new WindowDrawingContextImpl(this), Matrix.CreateScale(scale, scale));
return result;
}
public void Present()

Loading…
Cancel
Save