diff --git a/src/Avalonia.SceneGraph/Media/DrawingContext.cs b/src/Avalonia.SceneGraph/Media/DrawingContext.cs index 9fd8761ca5..ddaa681bab 100644 --- a/src/Avalonia.SceneGraph/Media/DrawingContext.cs +++ b/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; /// /// Draws a bitmap image. diff --git a/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs b/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs index 6852192bb4..3d13501edd 100644 --- a/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs +++ b/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); diff --git a/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs b/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs index 5b61042655..ef5fb88142 100644 --- a/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs +++ b/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(); + + 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() diff --git a/src/Skia/Avalonia.Skia/StreamGeometryImpl.cs b/src/Skia/Avalonia.Skia/StreamGeometryImpl.cs index ddc66e1854..33d4ce10c7 100644 --- a/src/Skia/Avalonia.Skia/StreamGeometryImpl.cs +++ b/src/Skia/Avalonia.Skia/StreamGeometryImpl.cs @@ -72,6 +72,8 @@ namespace Avalonia.Skia public IStreamGeometryContextImpl Open() { _path = new SKPath(); + _path.FillType = SKPathFillType.EvenOdd; + return new StreamContext(this); } diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index f11eba2397..fb494c4f85 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -37,16 +37,16 @@ true - - ..\..\..\packages\SharpDX.3.0.2\lib\net45\SharpDX.dll + + ..\..\..\packages\SharpDX.3.1.0\lib\net45\SharpDX.dll True - - ..\..\..\packages\SharpDX.Direct2D1.3.0.2\lib\net45\SharpDX.Direct2D1.dll + + ..\..\..\packages\SharpDX.Direct2D1.3.1.0\lib\net45\SharpDX.Direct2D1.dll True - - ..\..\..\packages\SharpDX.DXGI.3.0.2\lib\net45\SharpDX.DXGI.dll + + ..\..\..\packages\SharpDX.DXGI.3.1.0\lib\net45\SharpDX.DXGI.dll True diff --git a/src/Windows/Avalonia.Direct2D1/packages.config b/src/Windows/Avalonia.Direct2D1/packages.config index cd93ea7704..57031c2b9d 100644 --- a/src/Windows/Avalonia.Direct2D1/packages.config +++ b/src/Windows/Avalonia.Direct2D1/packages.config @@ -1,6 +1,6 @@  - - - + + + \ No newline at end of file