From 2f693acaf07f7ca703dc6dc9aac562a9971b3634 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 21 Oct 2016 00:10:47 +0200 Subject: [PATCH] Add IRendererFactory. I don't like to add factories, but it's better than the previous `Attach` way of doing things; it's necessary because it's not possible to pass constuctor parameters using `AvaloniaLocator`. --- src/Avalonia.Controls/Application.cs | 1 - src/Avalonia.Controls/TopLevel.cs | 4 ++-- .../Avalonia.SceneGraph.csproj | 1 + src/Avalonia.SceneGraph/Rendering/IRenderer.cs | 2 -- .../Rendering/IRendererFactory.cs | 18 ++++++++++++++++++ src/Avalonia.SceneGraph/Rendering/Renderer.cs | 6 +++--- .../Avalonia.Direct2D1/Direct2D1Platform.cs | 9 ++++++++- 7 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs index 69b3152e9b..326556f629 100644 --- a/src/Avalonia.Controls/Application.cs +++ b/src/Avalonia.Controls/Application.cs @@ -175,7 +175,6 @@ namespace Avalonia .Bind().ToTransient() .Bind().ToConstant(_styler) .Bind().ToSingleton() - .Bind().ToTransient() .Bind().ToConstant(this); } } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 606fcee1f3..43c59f0b31 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -96,8 +96,8 @@ namespace Avalonia.Controls _renderInterface = TryGetService(dependencyResolver); var renderLoop = TryGetService(dependencyResolver); - Renderer = TryGetService(dependencyResolver); - Renderer?.Attach(this, renderLoop); + var rendererFactory = TryGetService(dependencyResolver); + Renderer = rendererFactory?.CreateRenderer(this, renderLoop); PlatformImpl.SetInputRoot(this); PlatformImpl.Activated = HandleActivated; diff --git a/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj b/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj index 18f5c58c61..3d2347683d 100644 --- a/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj +++ b/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj @@ -103,6 +103,7 @@ + diff --git a/src/Avalonia.SceneGraph/Rendering/IRenderer.cs b/src/Avalonia.SceneGraph/Rendering/IRenderer.cs index 864dfd9ae3..c643662179 100644 --- a/src/Avalonia.SceneGraph/Rendering/IRenderer.cs +++ b/src/Avalonia.SceneGraph/Rendering/IRenderer.cs @@ -10,8 +10,6 @@ namespace Avalonia.Rendering { void AddDirty(IVisual visual); - void Attach(IRenderRoot root, IRenderLoop renderLoop); - void Render(Rect rect); } } \ No newline at end of file diff --git a/src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs b/src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs new file mode 100644 index 0000000000..8e27f85193 --- /dev/null +++ b/src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs @@ -0,0 +1,18 @@ +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.SceneGraph/Rendering/Renderer.cs b/src/Avalonia.SceneGraph/Rendering/Renderer.cs index 04baf0b505..ed58d129af 100644 --- a/src/Avalonia.SceneGraph/Rendering/Renderer.cs +++ b/src/Avalonia.SceneGraph/Rendering/Renderer.cs @@ -9,12 +9,12 @@ namespace Avalonia.Rendering { public class Renderer : IDisposable, IRenderer { - private IRenderLoop _renderLoop; - private IRenderRoot _root; + private readonly IRenderLoop _renderLoop; + private readonly IRenderRoot _root; private IRenderTarget _renderTarget; private bool _dirty; - public void Attach(IRenderRoot root, IRenderLoop renderLoop) + public Renderer(IRenderRoot root, IRenderLoop renderLoop) { Contract.Requires(root != null); diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index 73ecf78907..b43eef2fa9 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -7,6 +7,7 @@ using Avalonia.Direct2D1.Media; using Avalonia.Media; using Avalonia.Platform; using Avalonia.Controls; +using Avalonia.Rendering; namespace Avalonia { @@ -22,7 +23,7 @@ namespace Avalonia namespace Avalonia.Direct2D1 { - public class Direct2D1Platform : IPlatformRenderInterface + public class Direct2D1Platform : IPlatformRenderInterface, IRendererFactory { private static readonly Direct2D1Platform s_instance = new Direct2D1Platform(); @@ -38,6 +39,7 @@ namespace Avalonia.Direct2D1 public static void Initialize() => AvaloniaLocator.CurrentMutable .Bind().ToConstant(s_instance) + .Bind().ToConstant(s_instance) .BindToSelf(s_d2D1Factory) .BindToSelf(s_dwfactory) .BindToSelf(s_imagingFactory); @@ -59,6 +61,11 @@ namespace Avalonia.Direct2D1 return new FormattedTextImpl(text, fontFamily, fontSize, fontStyle, textAlignment, fontWeight, wrapping); } + public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) + { + return new Renderer(root, renderLoop); + } + public IRenderTarget CreateRenderTarget(IPlatformHandle handle) { if (handle.HandleDescriptor == "HWND")