5 changed files with 78 additions and 1 deletions
@ -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; |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -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(); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue