Browse Source

Added Direct2D-specific IExternalDirect2DRenderTargetSurface

pull/1009/head
Nikita Tsukanov 9 years ago
parent
commit
2f34c124e6
  1. 2
      src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj
  2. 5
      src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
  3. 50
      src/Windows/Avalonia.Direct2D1/ExternalRenderTarget.cs
  4. 15
      src/Windows/Avalonia.Direct2D1/IExternalDirect2DRenderTargetSurface.cs
  5. 7
      src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs

2
src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj

@ -50,7 +50,9 @@
</Compile> </Compile>
<Compile Include="Direct2D1Platform.cs" /> <Compile Include="Direct2D1Platform.cs" />
<Compile Include="Disposable.cs" /> <Compile Include="Disposable.cs" />
<Compile Include="ExternalRenderTarget.cs" />
<Compile Include="HwndRenderTarget.cs" /> <Compile Include="HwndRenderTarget.cs" />
<Compile Include="IExternalDirect2DRenderTargetSurface.cs" />
<Compile Include="Media\BrushImpl.cs" /> <Compile Include="Media\BrushImpl.cs" />
<Compile Include="Media\BrushWrapper.cs" /> <Compile Include="Media\BrushWrapper.cs" />
<Compile Include="Media\DrawingContextImpl.cs" /> <Compile Include="Media\DrawingContextImpl.cs" />

5
src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

@ -141,6 +141,11 @@ namespace Avalonia.Direct2D1
if(nativeWindow.HandleDescriptor != "HWND") if(nativeWindow.HandleDescriptor != "HWND")
throw new NotSupportedException("Don't know how to create a Direct2D1 renderer from " + nativeWindow.HandleDescriptor); throw new NotSupportedException("Don't know how to create a Direct2D1 renderer from " + nativeWindow.HandleDescriptor);
return new HwndRenderTarget(nativeWindow); return new HwndRenderTarget(nativeWindow);
}
var external = surfaces?.OfType<IExternalDirect2DRenderTargetSurface>();
if (external != null)
{
} }
throw new NotSupportedException("Don't know how to create a Direct2D1 renderer from any of provided surfaces"); throw new NotSupportedException("Don't know how to create a Direct2D1 renderer from any of provided surfaces");
} }

50
src/Windows/Avalonia.Direct2D1/ExternalRenderTarget.cs

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Direct2D1.Media;
using Avalonia.Platform;
using Avalonia.Rendering;
using SharpDX;
using DirectWriteFactory = SharpDX.DirectWrite.Factory;
namespace Avalonia.Direct2D1
{
class ExternalRenderTarget : IRenderTarget
{
private readonly IExternalDirect2DRenderTargetSurface _externalRenderTargetProvider;
private readonly DirectWriteFactory _dwFactory;
private SharpDX.Direct2D1.RenderTarget _target;
public ExternalRenderTarget(IExternalDirect2DRenderTargetSurface externalRenderTargetProvider,
DirectWriteFactory dwFactory)
{
_externalRenderTargetProvider = externalRenderTargetProvider;
_dwFactory = dwFactory;
}
public void Dispose()
{
_target?.Dispose();
_target = null;
}
public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer)
{
_target = _target ?? _externalRenderTargetProvider.CreateRenderTarget();
_externalRenderTargetProvider.BeforeDrawing();
return new DrawingContextImpl(visualBrushRenderer, _target, _dwFactory, null, () =>
{
try
{
_externalRenderTargetProvider.AfterDrawing();
}
catch (SharpDXException ex) when ((uint) ex.HResult == 0x8899000C) // D2DERR_RECREATE_TARGET
{
_target?.Dispose();
_target = null;
}
});
}
}
}

15
src/Windows/Avalonia.Direct2D1/IExternalDirect2DRenderTargetSurface.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Avalonia.Direct2D1
{
public interface IExternalDirect2DRenderTargetSurface
{
SharpDX.Direct2D1.RenderTarget CreateRenderTarget();
void BeforeDrawing();
void AfterDrawing();
}
}

7
src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs

@ -23,6 +23,7 @@ namespace Avalonia.Direct2D1.Media
private readonly IVisualBrushRenderer _visualBrushRenderer; private readonly IVisualBrushRenderer _visualBrushRenderer;
private readonly SharpDX.Direct2D1.RenderTarget _renderTarget; private readonly SharpDX.Direct2D1.RenderTarget _renderTarget;
private readonly SharpDX.DXGI.SwapChain1 _swapChain; private readonly SharpDX.DXGI.SwapChain1 _swapChain;
private readonly Action _finishedCallback;
private SharpDX.DirectWrite.Factory _directWriteFactory; private SharpDX.DirectWrite.Factory _directWriteFactory;
/// <summary> /// <summary>
@ -32,15 +33,18 @@ namespace Avalonia.Direct2D1.Media
/// <param name="renderTarget">The render target to draw to.</param> /// <param name="renderTarget">The render target to draw to.</param>
/// <param name="directWriteFactory">The DirectWrite factory.</param> /// <param name="directWriteFactory">The DirectWrite factory.</param>
/// <param name="swapChain">An optional swap chain associated with this drawing context.</param> /// <param name="swapChain">An optional swap chain associated with this drawing context.</param>
/// <param name="finishedCallback">An optional delegate to be called when context is disposed.</param>
public DrawingContextImpl( public DrawingContextImpl(
IVisualBrushRenderer visualBrushRenderer, IVisualBrushRenderer visualBrushRenderer,
SharpDX.Direct2D1.RenderTarget renderTarget, SharpDX.Direct2D1.RenderTarget renderTarget,
SharpDX.DirectWrite.Factory directWriteFactory, SharpDX.DirectWrite.Factory directWriteFactory,
SharpDX.DXGI.SwapChain1 swapChain = null) SharpDX.DXGI.SwapChain1 swapChain = null,
Action finishedCallback = null)
{ {
_visualBrushRenderer = visualBrushRenderer; _visualBrushRenderer = visualBrushRenderer;
_renderTarget = renderTarget; _renderTarget = renderTarget;
_swapChain = swapChain; _swapChain = swapChain;
_finishedCallback = finishedCallback;
_directWriteFactory = directWriteFactory; _directWriteFactory = directWriteFactory;
_swapChain = swapChain; _swapChain = swapChain;
_renderTarget.BeginDraw(); _renderTarget.BeginDraw();
@ -73,6 +77,7 @@ namespace Avalonia.Direct2D1.Media
_renderTarget.EndDraw(); _renderTarget.EndDraw();
_swapChain?.Present(1, SharpDX.DXGI.PresentFlags.None); _swapChain?.Present(1, SharpDX.DXGI.PresentFlags.None);
_finishedCallback?.Invoke();
} }
catch (SharpDXException ex) when ((uint)ex.HResult == 0x8899000C) // D2DERR_RECREATE_TARGET catch (SharpDXException ex) when ((uint)ex.HResult == 0x8899000C) // D2DERR_RECREATE_TARGET
{ {

Loading…
Cancel
Save