Browse Source

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

danwalmsley 9 years ago
parent
commit
03b84a0266

+ 13 - 3
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 - 0
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);

+ 42 - 2
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()