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`.
pull/773/head
Steven Kirk 10 years ago
parent
commit
2f693acaf0
  1. 1
      src/Avalonia.Controls/Application.cs
  2. 4
      src/Avalonia.Controls/TopLevel.cs
  3. 1
      src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj
  4. 2
      src/Avalonia.SceneGraph/Rendering/IRenderer.cs
  5. 18
      src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs
  6. 6
      src/Avalonia.SceneGraph/Rendering/Renderer.cs
  7. 9
      src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

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);
}
}

4
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
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" />

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
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);
}
}

6
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);

9
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")

Loading…
Cancel
Save