|
|
|
@ -7,11 +7,13 @@ using SharpDX; |
|
|
|
using SharpDX.Direct2D1; |
|
|
|
using SharpDX.DXGI; |
|
|
|
|
|
|
|
using AlphaMode = SharpDX.Direct2D1.AlphaMode; |
|
|
|
using PixelFormat = SharpDX.Direct2D1.PixelFormat; |
|
|
|
|
|
|
|
namespace Avalonia.Direct2D1 |
|
|
|
{ |
|
|
|
|
|
|
|
using AlphaMode = SharpDX.Direct2D1.AlphaMode; |
|
|
|
using DeviceContext = SharpDX.Direct2D1.DeviceContext; |
|
|
|
using PixelFormat = SharpDX.Direct2D1.PixelFormat; |
|
|
|
|
|
|
|
public abstract class SwapChainRenderTarget : IRenderTarget, ILayerFactory |
|
|
|
{ |
|
|
|
private Size2 _savedSize; |
|
|
|
@ -32,7 +34,8 @@ namespace Avalonia.Direct2D1 |
|
|
|
{ |
|
|
|
_savedSize = size; |
|
|
|
_savedDpi = dpi; |
|
|
|
CreateSwapChain(); |
|
|
|
|
|
|
|
Resize(); |
|
|
|
} |
|
|
|
|
|
|
|
return new DrawingContextImpl(visualBrushRenderer, this, _deviceContext, _swapChain); |
|
|
|
@ -42,7 +45,7 @@ namespace Avalonia.Direct2D1 |
|
|
|
{ |
|
|
|
if (_deviceContext == null) |
|
|
|
{ |
|
|
|
CreateSwapChain(); |
|
|
|
CreateDeviceContext(); |
|
|
|
} |
|
|
|
|
|
|
|
return D2DRenderTargetBitmapImpl.CreateCompatible(_deviceContext, size); |
|
|
|
@ -51,54 +54,68 @@ namespace Avalonia.Direct2D1 |
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
_deviceContext?.Dispose(); |
|
|
|
|
|
|
|
_swapChain?.Dispose(); |
|
|
|
} |
|
|
|
|
|
|
|
private void Resize() |
|
|
|
{ |
|
|
|
_deviceContext?.Dispose(); |
|
|
|
_deviceContext = null; |
|
|
|
|
|
|
|
_swapChain?.ResizeBuffers(0, 0, 0, Format.Unknown, SwapChainFlags.None); |
|
|
|
|
|
|
|
CreateDeviceContext(); |
|
|
|
} |
|
|
|
|
|
|
|
private void CreateSwapChain() |
|
|
|
{ |
|
|
|
using (var dxgiAdaptor = Direct2D1Platform.DxgiDevice.Adapter) |
|
|
|
using (var dxgiFactory = dxgiAdaptor.GetParent<SharpDX.DXGI.Factory2>()) |
|
|
|
var swapChainDescription = new SwapChainDescription1 |
|
|
|
{ |
|
|
|
_deviceContext?.Dispose(); |
|
|
|
_deviceContext = new DeviceContext(Direct2D1Platform.Direct2D1Device, DeviceContextOptions.None) { DotsPerInch = _savedDpi }; |
|
|
|
|
|
|
|
var swapChainDesc = new SwapChainDescription1 |
|
|
|
Width = _savedSize.Width, |
|
|
|
Height = _savedSize.Height, |
|
|
|
Format = Format.B8G8R8A8_UNorm, |
|
|
|
SampleDescription = new SampleDescription |
|
|
|
{ |
|
|
|
Width = _savedSize.Width, |
|
|
|
Height = _savedSize.Height, |
|
|
|
Format = Format.B8G8R8A8_UNorm, |
|
|
|
Stereo = false, |
|
|
|
SampleDescription = new SampleDescription |
|
|
|
Count = 1, |
|
|
|
Quality = 0, |
|
|
|
}, |
|
|
|
Usage = Usage.RenderTargetOutput, |
|
|
|
BufferCount = 1, |
|
|
|
SwapEffect = SwapEffect.Discard, |
|
|
|
}; |
|
|
|
|
|
|
|
using (var dxgiAdapter = Direct2D1Platform.DxgiDevice.Adapter) |
|
|
|
using (var dxgiFactory = dxgiAdapter.GetParent<SharpDX.DXGI.Factory2>()) |
|
|
|
{ |
|
|
|
_swapChain = CreateSwapChain(dxgiFactory, swapChainDescription); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void CreateDeviceContext() |
|
|
|
{ |
|
|
|
_deviceContext = new DeviceContext(Direct2D1Platform.Direct2D1Device, DeviceContextOptions.None) { DotsPerInch = _savedDpi }; |
|
|
|
|
|
|
|
if (_swapChain == null) |
|
|
|
{ |
|
|
|
CreateSwapChain(); |
|
|
|
} |
|
|
|
|
|
|
|
using (var dxgiBackBuffer = _swapChain.GetBackBuffer<Surface>(0)) |
|
|
|
using (var d2dBackBuffer = new Bitmap1( |
|
|
|
_deviceContext, |
|
|
|
dxgiBackBuffer, |
|
|
|
new BitmapProperties1( |
|
|
|
new PixelFormat |
|
|
|
{ |
|
|
|
Count = 1, |
|
|
|
Quality = 0, |
|
|
|
AlphaMode = AlphaMode.Premultiplied, |
|
|
|
Format = Format.B8G8R8A8_UNorm |
|
|
|
}, |
|
|
|
Usage = Usage.RenderTargetOutput, |
|
|
|
BufferCount = 1, |
|
|
|
Scaling = Scaling.Stretch, |
|
|
|
SwapEffect = SwapEffect.Discard, |
|
|
|
Flags = 0, |
|
|
|
}; |
|
|
|
|
|
|
|
_swapChain?.Dispose(); |
|
|
|
_swapChain = CreateSwapChain(dxgiFactory, swapChainDesc); |
|
|
|
|
|
|
|
using (var dxgiBackBuffer = _swapChain.GetBackBuffer<Surface>(0)) |
|
|
|
using (var d2dBackBuffer = new Bitmap1( |
|
|
|
_deviceContext, |
|
|
|
dxgiBackBuffer, |
|
|
|
new BitmapProperties1( |
|
|
|
new PixelFormat |
|
|
|
{ |
|
|
|
AlphaMode = AlphaMode.Premultiplied, |
|
|
|
Format = Format.B8G8R8A8_UNorm |
|
|
|
}, |
|
|
|
_savedDpi.Width, |
|
|
|
_savedDpi.Height, |
|
|
|
BitmapOptions.Target | BitmapOptions.CannotDraw))) |
|
|
|
{ |
|
|
|
_deviceContext.Target = d2dBackBuffer; |
|
|
|
} |
|
|
|
_savedSize.Width, |
|
|
|
_savedSize.Height, |
|
|
|
BitmapOptions.Target | BitmapOptions.CannotDraw))) |
|
|
|
{ |
|
|
|
_deviceContext.Target = d2dBackBuffer; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|