Browse Source

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`.
Steven Kirk 9 years ago
parent
commit
2f693acaf0

+ 0 - 1
src/Avalonia.Controls/Application.cs

@@ -175,7 +175,6 @@ namespace Avalonia
                 .Bind<IKeyboardNavigationHandler>().ToTransient<KeyboardNavigationHandler>()
                 .Bind<IStyler>().ToConstant(_styler)
                 .Bind<ILayoutManager>().ToSingleton<LayoutManager>()
-                .Bind<IRenderer>().ToTransient<Renderer>()
                 .Bind<IApplicationLifecycle>().ToConstant(this);
         }
     }

+ 2 - 2
src/Avalonia.Controls/TopLevel.cs

@@ -96,8 +96,8 @@ namespace Avalonia.Controls
             _renderInterface = TryGetService<IPlatformRenderInterface>(dependencyResolver);
 
             var renderLoop = TryGetService<IRenderLoop>(dependencyResolver);
-            Renderer = TryGetService<IRenderer>(dependencyResolver);
-            Renderer?.Attach(this, renderLoop);
+            var rendererFactory = TryGetService<IRendererFactory>(dependencyResolver);
+            Renderer = rendererFactory?.CreateRenderer(this, renderLoop);
 
             PlatformImpl.SetInputRoot(this);
             PlatformImpl.Activated = HandleActivated;

+ 1 - 0
src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj

@@ -103,6 +103,7 @@
     <Compile Include="Media\IDrawingContext.cs" />
     <Compile Include="Platform\ExportRenderingSubsystemAttribute.cs" />
     <Compile Include="Rendering\IRenderer.cs" />
+    <Compile Include="Rendering\IRendererFactory.cs" />
     <Compile Include="Rendering\IRenderLoop.cs" />
     <Compile Include="Rendering\Renderer.cs" />
     <Compile Include="Rendering\RendererMixin.cs" />

+ 0 - 2
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);
     }
 }

+ 18 - 0
src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs

@@ -0,0 +1,18 @@
+using System;
+
+namespace Avalonia.Rendering
+{
+    /// <summary>
+    /// Defines a factory for creating <see cref="IRenderer"/> instances.
+    /// </summary>
+    public interface IRendererFactory
+    {
+        /// <summary>
+        /// Creates a new renderer for the specified render root.
+        /// </summary>
+        /// <param name="root">The render root.</param>
+        /// <param name="renderLoop">The render loop.</param>
+        /// <returns>An instance of an <see cref="IRenderer"/>.</returns>
+        IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop);
+    }
+}

+ 3 - 3
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<ArgumentNullException>(root != null);
 

+ 8 - 1
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<IPlatformRenderInterface>().ToConstant(s_instance)
+            .Bind<IRendererFactory>().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")