diff --git a/.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject b/.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index ba3ecb99c5..60e25d2be6 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using Avalonia.Input; using Avalonia.Input.Raw; +using Avalonia.Rendering; using JetBrains.Annotations; namespace Avalonia.Platform @@ -60,6 +61,12 @@ namespace Avalonia.Platform /// Action ScalingChanged { get; set; } + /// + /// Creates a new renderer for the toplevel. + /// + /// The toplevel. + IRenderer CreateRenderer(IRenderRoot root); + /// /// Invalidates a rect on the toplevel. /// diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 8b1b80169f..f8db0e2a5b 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -90,8 +90,7 @@ namespace Avalonia.Controls _renderInterface = TryGetService(dependencyResolver); var renderLoop = TryGetService(dependencyResolver); - var rendererFactory = TryGetService(dependencyResolver); - Renderer = rendererFactory?.CreateRenderer(this, renderLoop); + Renderer = impl.CreateRenderer(this); impl.SetInputRoot(this); diff --git a/src/Avalonia.Visuals/Rendering/IRendererFactory.cs b/src/Avalonia.Visuals/Rendering/IRendererFactory.cs deleted file mode 100644 index 8e27f85193..0000000000 --- a/src/Avalonia.Visuals/Rendering/IRendererFactory.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace Avalonia.Rendering -{ - /// - /// Defines a factory for creating instances. - /// - public interface IRendererFactory - { - /// - /// Creates a new renderer for the specified render root. - /// - /// The render root. - /// The render loop. - /// An instance of an . - IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop); - } -} diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 4d12be7db0..4ef2b30463 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -20,11 +20,6 @@ namespace Avalonia.Rendering /// public class ImmediateRenderer : RendererBase, IRenderer, IVisualBrushRenderer { - class ImmediateRendererFactory : IRendererFactory - { - public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) => new ImmediateRenderer(root); - } - private readonly IVisual _root; private readonly IRenderRoot _renderRoot; private IRenderTarget _renderTarget; @@ -41,8 +36,6 @@ namespace Avalonia.Rendering _renderRoot = root as IRenderRoot; } - public static IRendererFactory Factory { get; } = new ImmediateRendererFactory(); - /// public bool DrawFps { get; set; } diff --git a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs index ef7e4d3362..f449229c53 100644 --- a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs +++ b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs @@ -28,7 +28,7 @@ namespace Avalonia.Gtk using Rendering; using Gtk = global::Gtk; - public class GtkPlatform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader, IRendererFactory + public class GtkPlatform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader { private static readonly GtkPlatform s_instance = new GtkPlatform(); private static Thread _uiThread; @@ -53,7 +53,6 @@ namespace Avalonia.Gtk .Bind().ToConstant(GtkKeyboardDevice.Instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) - .Bind().ToConstant(s_instance) .Bind().ToConstant(new DefaultRenderLoop(60)) .Bind().ToSingleton() .Bind().ToConstant(s_instance); @@ -112,11 +111,6 @@ namespace Avalonia.Gtk return new PopupImpl(); } - public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) - { - return new ImmediateRenderer(root); - } - public IWindowIconImpl LoadIcon(string fileName) { return new IconImpl(new Gdk.Pixbuf(fileName)); diff --git a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs index ce1f50ac0f..5c18d015d4 100644 --- a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs +++ b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs @@ -10,6 +10,7 @@ using Gdk; using Action = System.Action; using WindowEdge = Avalonia.Controls.WindowEdge; using GLib; +using Avalonia.Rendering; namespace Avalonia.Gtk { @@ -141,6 +142,11 @@ namespace Avalonia.Gtk return new PopupImpl(); } + public IRenderer CreateRenderer(IRenderRoot root) + { + return new ImmediateRenderer(root); + } + public void Invalidate(Rect rect) { if (_widget?.GdkWindow != null) diff --git a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs index b4063855eb..4ea1a5af56 100644 --- a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs +++ b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs @@ -15,7 +15,7 @@ using Avalonia.Gtk3; namespace Avalonia.Gtk3 { - public class Gtk3Platform : IWindowingPlatform, IPlatformSettings, IPlatformThreadingInterface, IRendererFactory + public class Gtk3Platform : IWindowingPlatform, IPlatformSettings, IPlatformThreadingInterface { internal static readonly Gtk3Platform Instance = new Gtk3Platform(); internal static readonly MouseDevice Mouse = new MouseDevice(); @@ -37,9 +37,7 @@ namespace Avalonia.Gtk3 .Bind().ToConstant(Instance) .Bind().ToConstant(Instance) .Bind().ToSingleton() - .Bind().ToConstant(Instance) .Bind().ToConstant(new DefaultRenderLoop(60)) - .Bind().ToConstant(ImmediateRenderer.Factory) .Bind().ToConstant(new PlatformIconLoader()); } @@ -53,11 +51,6 @@ namespace Avalonia.Gtk3 public IPopupImpl CreatePopup() => new PopupImpl(); - public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) - { - return new ImmediateRenderer(root); - } - public Size DoubleClickSize => new Size(4, 4); public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(100); //STUB diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 39304940d2..4464059efb 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -9,6 +9,7 @@ using Avalonia.Gtk3.Interop; using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Platform; +using Avalonia.Rendering; namespace Avalonia.Gtk3 { @@ -354,5 +355,10 @@ namespace Avalonia.Gtk3 IntPtr IPlatformHandle.Handle => Native.GetNativeGdkWindowHandle(Native.GtkWidgetGetWindow(GtkWidget)); public IEnumerable Surfaces => new object[] {Handle, _framebuffer}; + + public IRenderer CreateRenderer(IRenderRoot root) + { + return new ImmediateRenderer(root); + } } } diff --git a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs index 0854f9acf4..daff4dd751 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs @@ -5,6 +5,7 @@ using System.Text; using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Platform; +using Avalonia.Rendering; using Avalonia.Threading; namespace Avalonia.LinuxFramebuffer @@ -24,6 +25,11 @@ namespace Avalonia.LinuxFramebuffer mice.Event += e => Input?.Invoke(e); } + public IRenderer CreateRenderer(IRenderRoot root) + { + return new ImmediateRenderer(root); + } + public void Dispose() { throw new NotSupportedException(); diff --git a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs index 5f1c55fd5d..6db153c3e0 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs @@ -34,7 +34,6 @@ namespace Avalonia.LinuxFramebuffer .Bind().ToTransient() .Bind().ToConstant(KeyboardDevice) .Bind().ToSingleton() - .Bind().ToConstant(ImmediateRenderer.Factory) .Bind().ToConstant(PlatformThreadingInterface.Instance) .Bind().ToConstant(PlatformThreadingInterface.Instance); } diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs index fbed2f621c..0c46eceef6 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs @@ -13,6 +13,7 @@ using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Layout; using Avalonia.Platform; +using Avalonia.Rendering; using Key = Avalonia.Input.Key; using KeyEventArgs = System.Windows.Input.KeyEventArgs; using MouseButton = System.Windows.Input.MouseButton; @@ -88,6 +89,11 @@ namespace Avalonia.Win32.Interop.Wpf _ttl.ScalingChanged?.Invoke(_ttl.Scaling); } + public IRenderer CreateRenderer(IRenderRoot root) + { + return new ImmediateRenderer(root); + } + public void Dispose() { _ttl.Closed?.Invoke(); diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index 154162f1bc..584a5ba39e 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -39,10 +39,9 @@ namespace Avalonia namespace Avalonia.Win32 { - partial class Win32Platform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader, IRendererFactory + partial class Win32Platform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader { private static readonly Win32Platform s_instance = new Win32Platform(); - private static bool s_deferredRendering = true; private static uint _uiThread; private UnmanagedMethods.WndProc _wndProcDelegate; private IntPtr _hwnd; @@ -59,6 +58,8 @@ namespace Avalonia.Win32 CreateMessageWindow(); } + public static bool UseDeferredRendering { get; set; } + public Size DoubleClickSize => new Size( UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CXDOUBLECLK), UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CYDOUBLECLK)); @@ -79,12 +80,11 @@ namespace Avalonia.Win32 .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(new RenderLoop(60)) - .Bind().ToConstant(s_instance) .Bind().ToSingleton() .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance); - s_deferredRendering = deferredRendering; + UseDeferredRendering = deferredRendering; _uiThread = UnmanagedMethods.GetCurrentThreadId(); } @@ -208,12 +208,5 @@ namespace Avalonia.Win32 { return new PopupImpl(); } - - public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) - { - return s_deferredRendering ? - (IRenderer)new DeferredRenderer(root, renderLoop) : - (IRenderer)new ImmediateRenderer(root); - } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index f1537e53f5..feb7bdc2ee 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -15,6 +15,7 @@ using Avalonia.Platform; using Avalonia.Win32.Input; using Avalonia.Win32.Interop; using static Avalonia.Win32.Interop.UnmanagedMethods; +using Avalonia.Rendering; #if NETSTANDARD using Win32Exception = Avalonia.Win32.NetStandard.AvaloniaWin32Exception; #endif @@ -90,6 +91,15 @@ namespace Avalonia.Win32 } } + + public IRenderer CreateRenderer(IRenderRoot root) + { + var loop = AvaloniaLocator.Current.GetService(); + return Win32Platform.UseDeferredRendering ? + (IRenderer)new DeferredRenderer(root, loop) : + new ImmediateRenderer(root); + } + public void Resize(Size value) { if (value != ClientSize) diff --git a/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs index 00642b65e2..019f78a2b0 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs @@ -188,12 +188,10 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Showing_Should_Start_Renderer() { - var renderer = new Mock(); - - using (UnitTestApplication.Start(TestServices.StyledWindow - .With(renderer: (root, loop) => renderer.Object))) + using (UnitTestApplication.Start(TestServices.StyledWindow)) { - var target = new TestWindowBase(); + var renderer = new Mock(); + var target = new TestWindowBase(renderer.Object); target.Show(); @@ -204,12 +202,11 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Hiding_Should_Stop_Renderer() { - var renderer = new Mock(); - using (UnitTestApplication.Start(TestServices.StyledWindow - .With(renderer: (root, loop) => renderer.Object))) + using (UnitTestApplication.Start(TestServices.StyledWindow)) { - var target = new TestWindowBase(); + var renderer = new Mock(); + var target = new TestWindowBase(renderer.Object); target.Show(); target.Hide(); @@ -221,14 +218,14 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Renderer_Should_Be_Disposed_When_Impl_Signals_Close() { - var renderer = new Mock(); - var windowImpl = new Mock(); - windowImpl.Setup(x => x.Scaling).Returns(1); - windowImpl.SetupProperty(x => x.Closed); - - using (UnitTestApplication.Start(TestServices.StyledWindow - .With(renderer: (root, loop) => renderer.Object))) + using (UnitTestApplication.Start(TestServices.StyledWindow)) { + var renderer = new Mock(); + var windowImpl = new Mock(); + windowImpl.Setup(x => x.Scaling).Returns(1); + windowImpl.SetupProperty(x => x.Closed); + windowImpl.Setup(x => x.CreateRenderer(It.IsAny())).Returns(renderer.Object); + var target = new TestWindowBase(windowImpl.Object); target.Show(); @@ -252,8 +249,10 @@ namespace Avalonia.Controls.UnitTests { public bool IsClosed { get; private set; } - public TestWindowBase() - : base(Mock.Of(x => x.Scaling == 1)) + public TestWindowBase(IRenderer renderer = null) + : base(Mock.Of(x => + x.Scaling == 1 && + x.CreateRenderer(It.IsAny()) == renderer)) { } diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index 276dbaafb3..df9ca6b1b1 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -4,6 +4,7 @@ // // ----------------------------------------------------------------------- +using System; using System.Collections.Generic; using Avalonia.Platform; using Avalonia.Rendering; @@ -189,12 +190,10 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Showing_Should_Start_Renderer() { - var renderer = new Mock(); - - using (UnitTestApplication.Start(TestServices.StyledWindow - .With(renderer: (root, loop) => renderer.Object))) + using (UnitTestApplication.Start(TestServices.StyledWindow)) { - var target = new Window(); + var renderer = new Mock(); + var target = new Window(CreateImpl(renderer)); target.Show(); @@ -205,12 +204,11 @@ namespace Avalonia.Controls.UnitTests [Fact] public void ShowDialog_Should_Start_Renderer() { - var renderer = new Mock(); - using (UnitTestApplication.Start(TestServices.StyledWindow - .With(renderer: (root, loop) => renderer.Object))) + using (UnitTestApplication.Start(TestServices.StyledWindow)) { - var target = new Window(); + var renderer = new Mock(); + var target = new Window(CreateImpl(renderer)); target.Show(); @@ -221,12 +219,10 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Hiding_Should_Stop_Renderer() { - var renderer = new Mock(); - - using (UnitTestApplication.Start(TestServices.StyledWindow - .With(renderer: (root, loop) => renderer.Object))) + using (UnitTestApplication.Start(TestServices.StyledWindow)) { - var target = new Window(); + var renderer = new Mock(); + var target = new Window(CreateImpl(renderer)); target.Show(); target.Hide(); @@ -241,5 +237,12 @@ namespace Avalonia.Controls.UnitTests // AvaloniaLocator scopes. ((IList)Window.OpenWindows).Clear(); } + + private IWindowImpl CreateImpl(Mock renderer) + { + return Mock.Of(x => + x.Scaling == 1 && + x.CreateRenderer(It.IsAny()) == renderer.Object); + } } } diff --git a/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs b/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs index e9de51f6bd..4a834fd55d 100644 --- a/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs +++ b/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs @@ -28,6 +28,7 @@ namespace Avalonia.Input.UnitTests var root = new TestRoot { MouseDevice = new MouseDevice(), + Renderer = renderer.Object, Child = new Panel { Children = @@ -78,9 +79,7 @@ namespace Avalonia.Input.UnitTests private IDisposable TestApplication(IRenderer renderer) { return UnitTestApplication.Start( - new TestServices( - inputManager: new InputManager(), - renderer: (root, loop) => renderer)); + new TestServices(inputManager: new InputManager())); } } } diff --git a/tests/Avalonia.LeakTests/ControlTests.cs b/tests/Avalonia.LeakTests/ControlTests.cs index 94e51489c3..e0b0d4a4c0 100644 --- a/tests/Avalonia.LeakTests/ControlTests.cs +++ b/tests/Avalonia.LeakTests/ControlTests.cs @@ -318,12 +318,11 @@ namespace Avalonia.LeakTests var impl = new Mock(); impl.SetupGet(x => x.Scaling).Returns(1); impl.SetupProperty(x => x.Closed); + impl.Setup(x => x.CreateRenderer(It.IsAny())).Returns(renderer.Object); impl.Setup(x => x.Dispose()).Callback(() => impl.Object.Closed()); AvaloniaLocator.CurrentMutable.Bind() .ToConstant(new MockWindowingPlatform(() => impl.Object)); - AvaloniaLocator.CurrentMutable.Bind() - .ToConstant(new MockRendererFactory(renderer.Object)); var window = new Window() { Content = new Button() @@ -336,8 +335,7 @@ namespace Avalonia.LeakTests private IDisposable Start() { - var services = TestServices.StyledWindow.With(renderer: (root, loop) => new NullRenderer()); - return UnitTestApplication.Start(services); + return UnitTestApplication.Start(TestServices.StyledWindow); } private class Node diff --git a/tests/Avalonia.UnitTests/MockRendererFactory.cs b/tests/Avalonia.UnitTests/MockRendererFactory.cs deleted file mode 100644 index e62012b13c..0000000000 --- a/tests/Avalonia.UnitTests/MockRendererFactory.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Rendering; - -namespace Avalonia.UnitTests -{ - public class MockRendererFactory : IRendererFactory - { - private readonly Func _cb; - - public MockRendererFactory(Func cb = null) - { - _cb = cb; - } - - public MockRendererFactory(IRenderer renderer) : this((_, __) => renderer) - { - - } - - public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) - { - return _cb?.Invoke(root, renderLoop); - } - } -} diff --git a/tests/Avalonia.UnitTests/TestRoot.cs b/tests/Avalonia.UnitTests/TestRoot.cs index 7502439f87..d64a4ff4ce 100644 --- a/tests/Avalonia.UnitTests/TestRoot.cs +++ b/tests/Avalonia.UnitTests/TestRoot.cs @@ -21,9 +21,6 @@ namespace Avalonia.UnitTests public TestRoot() { - var rendererFactory = AvaloniaLocator.Current.GetService(); - var renderLoop = AvaloniaLocator.Current.GetService(); - Renderer = rendererFactory?.CreateRenderer(this, renderLoop); } event EventHandler INameScope.Registered diff --git a/tests/Avalonia.UnitTests/TestServices.cs b/tests/Avalonia.UnitTests/TestServices.cs index f26d0ad112..394dcbaa22 100644 --- a/tests/Avalonia.UnitTests/TestServices.cs +++ b/tests/Avalonia.UnitTests/TestServices.cs @@ -23,9 +23,7 @@ namespace Avalonia.UnitTests assetLoader: new AssetLoader(), layoutManager: new LayoutManager(), platform: new AppBuilder().RuntimePlatform, - renderer: (_, __) => Mock.Of(), renderInterface: new MockPlatformRenderInterface(), - renderLoop: Mock.Of(), standardCursorFactory: Mock.Of(), styler: new Styler(), theme: () => CreateDefaultTheme(), @@ -47,9 +45,6 @@ namespace Avalonia.UnitTests public static readonly TestServices MockWindowingPlatform = new TestServices( windowingPlatform: new MockWindowingPlatform()); - public static readonly TestServices RealDeferredRenderer = new TestServices( - renderer: (root, loop) => new DeferredRenderer(root, loop)); - public static readonly TestServices RealFocus = new TestServices( focusManager: new FocusManager(), keyboardDevice: () => new KeyboardDevice(), @@ -71,7 +66,6 @@ namespace Avalonia.UnitTests ILayoutManager layoutManager = null, Func mouseDevice = null, IRuntimePlatform platform = null, - Func renderer = null, IPlatformRenderInterface renderInterface = null, IRenderLoop renderLoop = null, IScheduler scheduler = null, @@ -79,6 +73,7 @@ namespace Avalonia.UnitTests IStyler styler = null, Func theme = null, IPlatformThreadingInterface threadingInterface = null, + IWindowImpl windowImpl = null, IWindowingPlatform windowingPlatform = null) { AssetLoader = assetLoader; @@ -89,14 +84,13 @@ namespace Avalonia.UnitTests LayoutManager = layoutManager; MouseDevice = mouseDevice; Platform = platform; - Renderer = renderer; RenderInterface = renderInterface; - RenderLoop = renderLoop; Scheduler = scheduler; StandardCursorFactory = standardCursorFactory; Styler = styler; Theme = theme; ThreadingInterface = threadingInterface; + WindowImpl = windowImpl; WindowingPlatform = windowingPlatform; } @@ -108,14 +102,13 @@ namespace Avalonia.UnitTests public ILayoutManager LayoutManager { get; } public Func MouseDevice { get; } public IRuntimePlatform Platform { get; } - public Func Renderer { get; } public IPlatformRenderInterface RenderInterface { get; } - public IRenderLoop RenderLoop { get; } public IScheduler Scheduler { get; } public IStandardCursorFactory StandardCursorFactory { get; } public IStyler Styler { get; } public Func Theme { get; } public IPlatformThreadingInterface ThreadingInterface { get; } + public IWindowImpl WindowImpl { get; } public IWindowingPlatform WindowingPlatform { get; } public TestServices With( @@ -127,7 +120,6 @@ namespace Avalonia.UnitTests ILayoutManager layoutManager = null, Func mouseDevice = null, IRuntimePlatform platform = null, - Func renderer = null, IPlatformRenderInterface renderInterface = null, IRenderLoop renderLoop = null, IScheduler scheduler = null, @@ -147,15 +139,14 @@ namespace Avalonia.UnitTests layoutManager: layoutManager ?? LayoutManager, mouseDevice: mouseDevice ?? MouseDevice, platform: platform ?? Platform, - renderer: renderer ?? Renderer, renderInterface: renderInterface ?? RenderInterface, - renderLoop: renderLoop ?? RenderLoop, scheduler: scheduler ?? Scheduler, standardCursorFactory: standardCursorFactory ?? StandardCursorFactory, styler: styler ?? Styler, theme: theme ?? Theme, threadingInterface: threadingInterface ?? ThreadingInterface, - windowingPlatform: windowingPlatform ?? WindowingPlatform); + windowingPlatform: windowingPlatform ?? WindowingPlatform, + windowImpl: windowImpl ?? WindowImpl); } private static Styles CreateDefaultTheme() diff --git a/tests/Avalonia.UnitTests/UnitTestApplication.cs b/tests/Avalonia.UnitTests/UnitTestApplication.cs index 5aa3afd25c..dfbcdbb9ae 100644 --- a/tests/Avalonia.UnitTests/UnitTestApplication.cs +++ b/tests/Avalonia.UnitTests/UnitTestApplication.cs @@ -53,9 +53,7 @@ namespace Avalonia.UnitTests .Bind().ToConstant(Services.LayoutManager) .Bind().ToConstant(Services.MouseDevice?.Invoke()) .Bind().ToConstant(Services.Platform) - .Bind().ToConstant(new RendererFactory(Services.Renderer)) .Bind().ToConstant(Services.RenderInterface) - .Bind().ToConstant(Services.RenderLoop) .Bind().ToConstant(Services.ThreadingInterface) .Bind().ToConstant(Services.Scheduler) .Bind().ToConstant(Services.StandardCursorFactory) @@ -69,20 +67,5 @@ namespace Avalonia.UnitTests Styles.AddRange(styles); } } - - private class RendererFactory : IRendererFactory - { - Func _func; - - public RendererFactory(Func func) - { - _func = func; - } - - public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) - { - return _func?.Invoke(root, renderLoop); - } - } } } diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs index 2401142f16..1044c1f2a3 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs @@ -38,6 +38,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); @@ -65,6 +66,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); @@ -101,6 +103,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); @@ -129,6 +132,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); @@ -172,6 +176,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); @@ -225,6 +230,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); @@ -273,6 +279,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); container.Measure(Size.Infinity); container.Arrange(new Rect(container.DesiredSize)); @@ -320,6 +327,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); @@ -392,6 +400,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering scroll.UpdateChild(); + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); @@ -437,6 +446,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); @@ -475,6 +485,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new DeferredRenderer(root, null); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); Assert.Equal(new Rect(100, 100, 200, 200), border.Bounds); @@ -491,10 +502,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering private IDisposable TestApplication() { - return UnitTestApplication.Start( - new TestServices( - renderInterface: new MockPlatformRenderInterface(), - renderer: (root, loop) => new DeferredRenderer(root, loop))); + return UnitTestApplication.Start(TestServices.MockPlatformRenderInterface); } } } diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs index fa53cba938..2c3e9bf11a 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs @@ -35,6 +35,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new ImmediateRenderer(root); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -72,6 +73,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new ImmediateRenderer(root); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -101,6 +103,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new ImmediateRenderer(root); root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -145,6 +148,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new ImmediateRenderer(root); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -199,6 +203,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new ImmediateRenderer(root); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -257,6 +262,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new ImmediateRenderer(root); container.Measure(Size.Infinity); container.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -305,6 +311,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering } }; + root.Renderer = new ImmediateRenderer(root); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -378,6 +385,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering scroll.UpdateChild(); + root.Renderer = new ImmediateRenderer(root); root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); @@ -408,10 +416,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering private IDisposable TestApplication() { - return UnitTestApplication.Start( - new TestServices( - renderInterface: new MockPlatformRenderInterface(), - renderer: (root, loop) => new ImmediateRenderer(root))); + return UnitTestApplication.Start(TestServices.MockPlatformRenderInterface); } } } diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs index ec5f9a8c13..f20c59fabe 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs @@ -152,34 +152,32 @@ namespace Avalonia.Visuals.UnitTests public void Attaching_To_Visual_Tree_Should_Invalidate_Visual() { var renderer = new Mock(); - - using (UnitTestApplication.Start(new TestServices(renderer: (root, loop) => renderer.Object))) + var child = new Decorator(); + var root = new TestRoot { - var child = new Decorator(); - var root = new TestRoot(); + Renderer = renderer.Object, + }; - root.Child = child; + root.Child = child; - renderer.Verify(x => x.AddDirty(child)); - } + renderer.Verify(x => x.AddDirty(child)); } [Fact] public void Detaching_From_Visual_Tree_Should_Invalidate_Visual() { var renderer = new Mock(); - - using (UnitTestApplication.Start(new TestServices(renderer: (root, loop) => renderer.Object))) + var child = new Decorator(); + var root = new TestRoot { - var child = new Decorator(); - var root = new TestRoot(); + Renderer = renderer.Object, + }; - root.Child = child; - renderer.ResetCalls(); - root.Child = null; + root.Child = child; + renderer.ResetCalls(); + root.Child = null; - renderer.Verify(x => x.AddDirty(child)); - } + renderer.Verify(x => x.AddDirty(child)); } [Fact]