From a967c9bf8291d4fa32223ff350b4c0ae47efad73 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sun, 11 Dec 2016 14:37:48 +0100 Subject: [PATCH] Make DPI scaling work again. --- src/Avalonia.Controls/TopLevel.cs | 3 +++ .../Media/Imaging/RenderTargetBitmap.cs | 17 +++++++----- .../Platform/IPlatformRenderInterface.cs | 8 +++++- .../Rendering/DefaultRenderLayerFactory.cs | 10 +++++-- .../Rendering/DeferredRenderer.cs | 26 +++++++++++-------- .../Rendering/IRenderLayerFactory.cs | 2 +- src/Avalonia.Visuals/Rendering/IRenderRoot.cs | 2 ++ src/Avalonia.Visuals/Rendering/RenderLayer.cs | 11 +++++--- .../Rendering/RenderLayers.cs | 4 +-- .../Rendering/SceneGraph/Scene.cs | 2 ++ .../Rendering/SceneGraph/SceneBuilder.cs | 7 +++-- src/Gtk/Avalonia.Cairo/CairoPlatform.cs | 2 +- .../Avalonia.Skia/PlatformRenderInterface.cs | 8 ++++-- .../Avalonia.Direct2D1.csproj | 4 +-- .../Avalonia.Direct2D1/Direct2D1Platform.cs | 15 +++++++++-- .../Avalonia.Direct2D1/HwndRenderTarget.cs | 23 ++++++++-------- .../Media/Imaging/RenderTargetBitmapImpl.cs | 8 +++--- .../Avalonia.Direct2D1/packages.config | 2 +- .../ItemsPresenterTests_Virtualization.cs | 1 + ...emsPresenterTests_Virtualization_Simple.cs | 1 + tests/Avalonia.UnitTests/TestRoot.cs | 2 ++ tests/Avalonia.UnitTests/TestTemplatedRoot.cs | 2 ++ .../Rendering/DeferredRendererTests.cs | 12 ++++++--- .../VisualTree/MockRenderInterface.cs | 6 ++++- 24 files changed, 121 insertions(+), 57 deletions(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 43c59f0b31..8ba2b035f6 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -220,6 +220,9 @@ namespace Avalonia.Controls /// double ILayoutRoot.LayoutScaling => PlatformImpl.Scaling; + /// + double IRenderRoot.RenderScaling => PlatformImpl.Scaling; + IStyleHost IStyleHost.StylingParent { get { return AvaloniaLocator.Current.GetService(); } diff --git a/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs b/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs index 749d690d48..315b1916c7 100644 --- a/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs +++ b/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs @@ -3,7 +3,6 @@ using System; using Avalonia.Platform; -using Avalonia.Rendering; using Avalonia.VisualTree; namespace Avalonia.Media.Imaging @@ -16,10 +15,12 @@ namespace Avalonia.Media.Imaging /// /// Initializes a new instance of the class. /// - /// The width of the bitmap. - /// The height of the bitmap. - public RenderTargetBitmap(int width, int height) - : base(CreateImpl(width, height)) + /// The width of the bitmap in pixels. + /// The height of the bitmap in pixels. + /// The horizontal DPI of the bitmap. + /// The vertical DPI of the bitmap. + public RenderTargetBitmap(int pixelWidth, int pixelHeight, double dpiX = 96, double dpiY = 96) + : base(CreateImpl(pixelWidth, pixelHeight, dpiX, dpiY)) { } @@ -41,11 +42,13 @@ namespace Avalonia.Media.Imaging /// /// The width of the bitmap. /// The height of the bitmap. + /// The horizontal DPI of the bitmap. + /// The vertical DPI of the bitmap. /// The platform-specific implementation. - private static IBitmapImpl CreateImpl(int width, int height) + private static IBitmapImpl CreateImpl(int width, int height, double dpiX, double dpiY) { IPlatformRenderInterface factory = AvaloniaLocator.Current.GetService(); - return factory.CreateRenderTargetBitmap(width, height); + return factory.CreateRenderTargetBitmap(width, height, dpiX, dpiY); } public IDrawingContextImpl CreateDrawingContext() => PlatformImpl.CreateDrawingContext(); diff --git a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs index 5cd5f9dadf..70f6ed6bd1 100644 --- a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs +++ b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs @@ -51,8 +51,14 @@ namespace Avalonia.Platform /// /// The width of the bitmap. /// The height of the bitmap. + /// The horizontal DPI of the bitmap. + /// The vertical DPI of the bitmap. /// An . - IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height); + IRenderTargetBitmapImpl CreateRenderTargetBitmap( + int width, + int height, + double dpiX, + double dpiY); /// /// Loads a bitmap implementation from a file.. diff --git a/src/Avalonia.Visuals/Rendering/DefaultRenderLayerFactory.cs b/src/Avalonia.Visuals/Rendering/DefaultRenderLayerFactory.cs index fe57d057af..c75f948b66 100644 --- a/src/Avalonia.Visuals/Rendering/DefaultRenderLayerFactory.cs +++ b/src/Avalonia.Visuals/Rendering/DefaultRenderLayerFactory.cs @@ -18,11 +18,17 @@ namespace Avalonia.Rendering _renderInterface = renderInterface; } - public IRenderTargetBitmapImpl CreateLayer(IVisual layerRoot, Size size) + public IRenderTargetBitmapImpl CreateLayer( + IVisual layerRoot, + Size size, + double dpiX, + double dpiY) { return _renderInterface.CreateRenderTargetBitmap( (int)Math.Ceiling(size.Width), - (int)Math.Ceiling(size.Height)); + (int)Math.Ceiling(size.Height), + dpiX, + dpiY); } } } diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 8a472a51d7..da51d39a2c 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -166,7 +166,7 @@ namespace Avalonia.Rendering { if (DrawFps || DrawDirtyRects) { - var overlay = GetOverlay(scene.Size); + var overlay = GetOverlay(scene.Size, scene.Scaling); using (var context = overlay.CreateDrawingContext()) { @@ -240,13 +240,15 @@ namespace Avalonia.Rendering foreach (var layer in scene.Layers) { - var renderLayer = _layers[layer.LayerRoot]; - context.DrawImage(renderLayer.Bitmap, layer.Opacity, clientRect, clientRect); + var bitmap = _layers[layer.LayerRoot].Bitmap; + var sourceRect = new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight); + context.DrawImage(bitmap, layer.Opacity, sourceRect, clientRect); } if (_overlay != null) { - context.DrawImage(_overlay, 0.5, clientRect, clientRect); + var sourceRect = new Rect(0, 0, _overlay.PixelWidth, _overlay.PixelHeight); + context.DrawImage(_overlay, 0.5, sourceRect, clientRect); } } } @@ -316,15 +318,16 @@ namespace Avalonia.Rendering Render(scene); } - private IRenderTargetBitmapImpl GetOverlay(Size size) + private IRenderTargetBitmapImpl GetOverlay(Size size, double scaling) { - int width = (int)Math.Ceiling(size.Width); - int height = (int)Math.Ceiling(size.Height); + size = new Size(size.Width * scaling, size.Height * scaling); - if (_overlay == null || _overlay.PixelWidth != width || _overlay.PixelHeight != height) + if (_overlay == null || + _overlay.PixelWidth != size.Width || + _overlay.PixelHeight != size.Height) { _overlay?.Dispose(); - _overlay = _layerFactory.CreateLayer(null, size); + _overlay = _layerFactory.CreateLayer(null, size, 96 * scaling, 96 * scaling); } return _overlay; @@ -332,18 +335,19 @@ namespace Avalonia.Rendering private IRenderTargetBitmapImpl GetRenderTargetForLayer(Scene scene, IVisual layerRoot) { + var size = new Size(scene.Size.Width * scene.Scaling, scene.Size.Height * scene.Scaling); RenderLayer result; if (_layers.TryGetValue(layerRoot, out result)) { if (result.Size != scene.Size) { - result.ResizeBitmap(scene.Size); + result.ResizeBitmap(size, scene.Scaling); } } else { - _layers.Add(layerRoot, scene.Size); + _layers.Add(layerRoot, size, scene.Scaling); } return _layers[layerRoot].Bitmap; diff --git a/src/Avalonia.Visuals/Rendering/IRenderLayerFactory.cs b/src/Avalonia.Visuals/Rendering/IRenderLayerFactory.cs index 4fedc6d5fc..ed2751cd64 100644 --- a/src/Avalonia.Visuals/Rendering/IRenderLayerFactory.cs +++ b/src/Avalonia.Visuals/Rendering/IRenderLayerFactory.cs @@ -6,6 +6,6 @@ namespace Avalonia.Rendering { public interface IRenderLayerFactory { - IRenderTargetBitmapImpl CreateLayer(IVisual layerRoot, Size size); + IRenderTargetBitmapImpl CreateLayer(IVisual layerRoot, Size size, double dpiX, double dpiY); } } diff --git a/src/Avalonia.Visuals/Rendering/IRenderRoot.cs b/src/Avalonia.Visuals/Rendering/IRenderRoot.cs index 50cda1b1b8..09639cdaff 100644 --- a/src/Avalonia.Visuals/Rendering/IRenderRoot.cs +++ b/src/Avalonia.Visuals/Rendering/IRenderRoot.cs @@ -22,6 +22,8 @@ namespace Avalonia.Rendering /// IRenderer Renderer { get; } + double RenderScaling { get; } + /// /// Creates a render target for the window. /// diff --git a/src/Avalonia.Visuals/Rendering/RenderLayer.cs b/src/Avalonia.Visuals/Rendering/RenderLayer.cs index 9c2f9d4736..aa2cfeeccb 100644 --- a/src/Avalonia.Visuals/Rendering/RenderLayer.cs +++ b/src/Avalonia.Visuals/Rendering/RenderLayer.cs @@ -12,23 +12,26 @@ namespace Avalonia.Rendering public RenderLayer( IRenderLayerFactory factory, Size size, + double scaling, IVisual layerRoot) { _factory = factory; - Bitmap = factory.CreateLayer(layerRoot, size); + Bitmap = factory.CreateLayer(layerRoot, size, 96 * scaling, 96 * scaling); Size = size; + Scaling = scaling; LayerRoot = layerRoot; } public IRenderTargetBitmapImpl Bitmap { get; private set; } + public double Scaling { get; private set; } public Size Size { get; private set; } public IVisual LayerRoot { get; } - public void ResizeBitmap(Size size) + public void ResizeBitmap(Size size, double scaling) { - if (Size != size) + if (Size != size || Scaling != scaling) { - var resized = _factory.CreateLayer(LayerRoot, size); + var resized = _factory.CreateLayer(LayerRoot, size, 96 * scaling, 96 * scaling); using (var context = resized.CreateDrawingContext()) { diff --git a/src/Avalonia.Visuals/Rendering/RenderLayers.cs b/src/Avalonia.Visuals/Rendering/RenderLayers.cs index 3173247180..f163578ed4 100644 --- a/src/Avalonia.Visuals/Rendering/RenderLayers.cs +++ b/src/Avalonia.Visuals/Rendering/RenderLayers.cs @@ -20,13 +20,13 @@ namespace Avalonia.Rendering public int Count => _inner.Count; public RenderLayer this[IVisual layerRoot] => _index[layerRoot]; - public RenderLayer Add(IVisual layerRoot, Size size) + public RenderLayer Add(IVisual layerRoot, Size size, double scaling) { RenderLayer result; if (!_index.TryGetValue(layerRoot, out result)) { - result = new RenderLayer(_factory, size, layerRoot); + result = new RenderLayer(_factory, size, scaling, layerRoot); _inner.Add(result); _index.Add(layerRoot, result); } diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs index b6cd56f964..3874038621 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs @@ -34,6 +34,7 @@ namespace Avalonia.Rendering.SceneGraph public SceneLayers Layers { get; } public IVisualNode Root { get; } public Size Size { get; set; } + public double Scaling { get; set; } = 1; public void Add(IVisualNode node) { @@ -50,6 +51,7 @@ namespace Avalonia.Rendering.SceneGraph var result = new Scene(root, index, Layers.Clone(), Id + 1) { Size = Size, + Scaling = Scaling, }; return result; diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs index 8fe7b88ab6..08fd74d9bc 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs @@ -16,7 +16,7 @@ namespace Avalonia.Rendering.SceneGraph Contract.Requires(scene != null); Dispatcher.UIThread.VerifyAccess(); - scene.Size = (scene.Root.Visual as IRenderRoot)?.ClientSize ?? scene.Root.Visual.Bounds.Size; + UpdateSize(scene); scene.Layers.GetOrAdd(scene.Root.Visual); using (var impl = new DeferredDrawingContextImpl(scene.Layers)) @@ -203,7 +203,10 @@ namespace Avalonia.Rendering.SceneGraph private void UpdateSize(Scene scene) { - var newSize = (scene.Root.Visual as IRenderRoot)?.ClientSize ?? scene.Root.Visual.Bounds.Size; + var renderRoot = scene.Root.Visual as IRenderRoot; + var newSize = renderRoot?.ClientSize ?? scene.Root.Visual.Bounds.Size; + + scene.Scaling = renderRoot?.RenderScaling ?? 1; if (scene.Size != newSize) { diff --git a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs b/src/Gtk/Avalonia.Cairo/CairoPlatform.cs index 4fc177d777..9745f2bd8e 100644 --- a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs +++ b/src/Gtk/Avalonia.Cairo/CairoPlatform.cs @@ -71,7 +71,7 @@ namespace Avalonia.Cairo handle.HandleDescriptor)); } - public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height) + public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height, double dpiX, double dpiY) { return new RenderTargetBitmapImpl(new ImageSurface(Format.Argb32, width, height)); } diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index d389808c1f..c0730c33db 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -11,7 +11,7 @@ namespace Avalonia.Skia { public IBitmapImpl CreateBitmap(int width, int height) { - return CreateRenderTargetBitmap(width, height); + return CreateRenderTargetBitmap(width, height, 96, 96); } public IFormattedTextImpl CreateFormattedText(string text, string fontFamilyName, double fontSize, FontStyle fontStyle, @@ -54,7 +54,11 @@ namespace Avalonia.Skia return new Renderer(root, renderLoop); } - public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height) + public IRenderTargetBitmapImpl CreateRenderTargetBitmap( + int width, + int height, + double dpiX, + double dpiY) { if (width < 1) throw new ArgumentException("Width can't be less than 1", nameof(width)); diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index 94499bc507..31131a7258 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -41,8 +41,8 @@ ..\..\..\packages\SharpDX.3.1.1\lib\net45\SharpDX.dll True - - ..\..\..\packages\SharpDX.Direct2D1.3.1.0\lib\net45\SharpDX.Direct2D1.dll + + ..\..\..\packages\SharpDX.Direct2D1.3.1.1\lib\net45\SharpDX.Direct2D1.dll True diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index a60965923a..39aa3bac1b 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -93,9 +93,20 @@ namespace Avalonia.Direct2D1 } } - public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height) + public IRenderTargetBitmapImpl CreateRenderTargetBitmap( + int width, + int height, + double dpiX, + double dpiY) { - return new RenderTargetBitmapImpl(s_imagingFactory, s_d2D1Factory, s_dwfactory, width, height); + return new RenderTargetBitmapImpl( + s_imagingFactory, + s_d2D1Factory, + s_dwfactory, + width, + height, + dpiX, + dpiY); } public IStreamGeometryImpl CreateStreamGeometry() diff --git a/src/Windows/Avalonia.Direct2D1/HwndRenderTarget.cs b/src/Windows/Avalonia.Direct2D1/HwndRenderTarget.cs index 7adae884cc..7b3aa1d02e 100644 --- a/src/Windows/Avalonia.Direct2D1/HwndRenderTarget.cs +++ b/src/Windows/Avalonia.Direct2D1/HwndRenderTarget.cs @@ -17,8 +17,8 @@ namespace Avalonia.Direct2D1 private readonly SharpDX.Direct3D11.Device _d3dDevice; private DeviceContext _deviceContext; private SharpDX.DXGI.SwapChain1 _swapChain; - private Size2 _savedSize; - private Size2F _savedDpi; + private Size2 _size; + private Size2F _dpi; /// /// Initializes a new instance of the class. @@ -48,7 +48,9 @@ namespace Avalonia.Direct2D1 SharpDX.Direct3D11.DeviceCreationFlags.BgraSupport, featureLevels); - CreateSwapChain(); + var size = GetWindowSize(); + var dpi = GetWindowDpi(); + CreateSwapChain(size, dpi); } /// @@ -76,11 +78,9 @@ namespace Avalonia.Direct2D1 var size = GetWindowSize(); var dpi = GetWindowDpi(); - if (size != _savedSize || dpi != _savedDpi) + if (size != _size || _dpi != dpi) { - _savedSize = size; - _savedDpi = dpi; - CreateSwapChain(); + CreateSwapChain(size, dpi); } return new DrawingContextImpl(_deviceContext, DirectWriteFactory, _swapChain); @@ -93,8 +93,11 @@ namespace Avalonia.Direct2D1 _d3dDevice.Dispose(); } - private void CreateSwapChain() + private void CreateSwapChain(Size2 size, Size2F dpi) { + _size = size; + _dpi = dpi; + using (var dxgiDevice = _d3dDevice.QueryInterface()) using (var d2dDevice = new Device(dxgiDevice)) using (var dxgiAdaptor = dxgiDevice.Adapter) @@ -102,6 +105,7 @@ namespace Avalonia.Direct2D1 { _deviceContext?.Dispose(); _deviceContext = new DeviceContext(d2dDevice, DeviceContextOptions.None); + _deviceContext.DotsPerInch = dpi; var swapChainDesc = new SharpDX.DXGI.SwapChainDescription1 { @@ -121,8 +125,6 @@ namespace Avalonia.Direct2D1 Flags = 0, }; - var dpi = Direct2DFactory.DesktopDpi; - _swapChain?.Dispose(); _swapChain = new SharpDX.DXGI.SwapChain1(dxgiFactory, _d3dDevice, _hwnd, ref swapChainDesc); @@ -144,7 +146,6 @@ namespace Avalonia.Direct2D1 } } } - private Size2F GetWindowDpi() { if (UnmanagedMethods.ShCoreAvailable) diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs index 5b51849bd8..66bfb16b50 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs @@ -20,13 +20,15 @@ namespace Avalonia.Direct2D1.Media Factory d2dFactory, DirectWriteFactory dwriteFactory, int width, - int height) + int height, + double dpiX, + double dpiY) : base(imagingFactory, width, height) { var props = new RenderTargetProperties { - DpiX = 96, - DpiY = 96, + DpiX = (float)dpiX, + DpiY = (float)dpiY, }; _target = new WicRenderTarget( diff --git a/src/Windows/Avalonia.Direct2D1/packages.config b/src/Windows/Avalonia.Direct2D1/packages.config index bc2a37c3b5..780e6014e5 100644 --- a/src/Windows/Avalonia.Direct2D1/packages.config +++ b/src/Windows/Avalonia.Direct2D1/packages.config @@ -1,7 +1,7 @@  - + \ No newline at end of file diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs index 847662e629..a0192cfab8 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs @@ -318,6 +318,7 @@ namespace Avalonia.Controls.UnitTests.Presenters { public IRenderer Renderer { get; } public Size ClientSize { get; } + public double RenderScaling => 1; public IRenderTarget CreateRenderTarget() { diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index e603925e31..5414fd80da 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -993,6 +993,7 @@ namespace Avalonia.Controls.UnitTests.Presenters { public IRenderer Renderer { get; } public Size ClientSize { get; } + public double RenderScaling => 1; public IRenderTarget CreateRenderTarget() { diff --git a/tests/Avalonia.UnitTests/TestRoot.cs b/tests/Avalonia.UnitTests/TestRoot.cs index 0473ec11b3..6528d64e8b 100644 --- a/tests/Avalonia.UnitTests/TestRoot.cs +++ b/tests/Avalonia.UnitTests/TestRoot.cs @@ -48,6 +48,8 @@ namespace Avalonia.UnitTests public double LayoutScaling => 1; + public double RenderScaling => 1; + public ILayoutManager LayoutManager => AvaloniaLocator.Current.GetService(); public IRenderTarget RenderTarget => null; diff --git a/tests/Avalonia.UnitTests/TestTemplatedRoot.cs b/tests/Avalonia.UnitTests/TestTemplatedRoot.cs index 73c9f370d6..91e797fa87 100644 --- a/tests/Avalonia.UnitTests/TestTemplatedRoot.cs +++ b/tests/Avalonia.UnitTests/TestTemplatedRoot.cs @@ -39,6 +39,8 @@ namespace Avalonia.UnitTests public double LayoutScaling => 1; + public double RenderScaling => 1; + public ILayoutManager LayoutManager => AvaloniaLocator.Current.GetService(); public IRenderTarget RenderTarget => null; diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs index 5a4435238d..adddfd845e 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs @@ -141,7 +141,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering }); var layers = new Mock(); - layers.Setup(x => x.CreateLayer(root, root.ClientSize)).Returns(CreateLayer()); + layers.Setup(x => x.CreateLayer(root, root.ClientSize, 96, 96)).Returns(CreateLayer()); var renderInterface = new Mock(); @@ -154,7 +154,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering RunFrame(loop); - layers.Verify(x => x.CreateLayer(root, root.ClientSize)); + layers.Verify(x => x.CreateLayer(root, root.ClientSize, 96, 96)); } [Fact] @@ -241,7 +241,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering private Mock MockLayerFactory(IRenderRoot root) { var result = new Mock(); - result.Setup(x => x.CreateLayer(root, root.ClientSize)).Returns(CreateLayer()); + result.Setup(x => x.CreateLayer(root, root.ClientSize, 96, 96)).Returns(CreateLayer()); return result; } @@ -262,7 +262,11 @@ namespace Avalonia.Visuals.UnitTests.Rendering _layers = layers; } - public IRenderTargetBitmapImpl CreateLayer(IVisual layerRoot, Size size) + public IRenderTargetBitmapImpl CreateLayer( + IVisual layerRoot, + Size size, + double dpiX, + double dpiY) { return _layers[layerRoot]; } diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs b/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs index 1b373d93a0..19668293e1 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs @@ -26,7 +26,11 @@ namespace Avalonia.Visuals.UnitTests.VisualTree throw new NotImplementedException(); } - public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height) + public IRenderTargetBitmapImpl CreateRenderTargetBitmap( + int width, + int height, + double dpiX, + double dpiY) { throw new NotImplementedException(); }