|
|
|
@ -6,6 +6,7 @@ using Perspex.Direct2D1.Media; |
|
|
|
using Perspex.Media; |
|
|
|
using Perspex.Platform; |
|
|
|
using Perspex.Rendering; |
|
|
|
using Perspex.Win32.Interop; |
|
|
|
using SharpDX; |
|
|
|
using SharpDX.Direct2D1; |
|
|
|
using DrawingContext = Perspex.Media.DrawingContext; |
|
|
|
@ -15,19 +16,25 @@ namespace Perspex.Direct2D1 |
|
|
|
{ |
|
|
|
public class RenderTarget : IRenderTarget |
|
|
|
{ |
|
|
|
private readonly IntPtr _hwnd; |
|
|
|
private Size2 _savedSize; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The render target.
|
|
|
|
/// </summary>
|
|
|
|
private readonly SharpDX.Direct2D1.RenderTarget _renderTarget; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the <see cref="RenderTarget"/> class.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="hwnd">The window handle.</param>
|
|
|
|
/// <param name="width">The width of the window.</param>
|
|
|
|
/// <param name="height">The height of the window.</param>
|
|
|
|
public RenderTarget(IntPtr hwnd, double width, double height) |
|
|
|
public RenderTarget(IntPtr hwnd) |
|
|
|
{ |
|
|
|
_hwnd = hwnd; |
|
|
|
Direct2DFactory = PerspexLocator.Current.GetService<Factory>(); |
|
|
|
DirectWriteFactory = PerspexLocator.Current.GetService<DwFactory>(); |
|
|
|
|
|
|
|
@ -38,7 +45,7 @@ namespace Perspex.Direct2D1 |
|
|
|
HwndRenderTargetProperties hwndProperties = new HwndRenderTargetProperties |
|
|
|
{ |
|
|
|
Hwnd = hwnd, |
|
|
|
PixelSize = new Size2((int)width, (int)height), |
|
|
|
PixelSize = _savedSize = GetWindowSize(), |
|
|
|
PresentOptions = PresentOptions.Immediately, |
|
|
|
}; |
|
|
|
|
|
|
|
@ -48,6 +55,13 @@ namespace Perspex.Direct2D1 |
|
|
|
hwndProperties); |
|
|
|
} |
|
|
|
|
|
|
|
Size2 GetWindowSize() |
|
|
|
{ |
|
|
|
UnmanagedMethods.RECT rc; |
|
|
|
UnmanagedMethods.GetClientRect(_hwnd, out rc); |
|
|
|
return new Size2(rc.right - rc.left, rc.bottom - rc.top); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the <see cref="RenderTarget"/> class.
|
|
|
|
/// </summary>
|
|
|
|
@ -74,31 +88,22 @@ namespace Perspex.Direct2D1 |
|
|
|
get; } |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Resizes the renderer.
|
|
|
|
/// Creates a drawing context for a rendering session.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="width">The new width.</param>
|
|
|
|
/// <param name="height">The new height.</param>
|
|
|
|
public void Resize(int width, int height) |
|
|
|
/// <returns>An <see cref="Perspex.Media.DrawingContext"/>.</returns>
|
|
|
|
public DrawingContext CreateDrawingContext() |
|
|
|
{ |
|
|
|
WindowRenderTarget window = _renderTarget as WindowRenderTarget; |
|
|
|
|
|
|
|
if (window == null) |
|
|
|
var window = _renderTarget as WindowRenderTarget; |
|
|
|
if (window != null) |
|
|
|
{ |
|
|
|
throw new InvalidOperationException(string.Format( |
|
|
|
"A renderer with a target of type '{0}' cannot be resized.", |
|
|
|
_renderTarget.GetType().Name)); |
|
|
|
var size = GetWindowSize(); |
|
|
|
if (size != _savedSize) |
|
|
|
window.Resize(_savedSize = size); |
|
|
|
} |
|
|
|
|
|
|
|
window.Resize(new Size2(width, height)); |
|
|
|
return new DrawingContext(new Media.DrawingContext(_renderTarget, DirectWriteFactory)); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Creates a drawing context for a rendering session.
|
|
|
|
/// </summary>
|
|
|
|
/// <returns>An <see cref="Perspex.Media.DrawingContext"/>.</returns>
|
|
|
|
public DrawingContext CreateDrawingContext() |
|
|
|
=> new DrawingContext(new Media.DrawingContext(_renderTarget, DirectWriteFactory)); |
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
_renderTarget.Dispose(); |
|
|
|
|