diff --git a/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs index 452ee67854..0b9183d928 100644 --- a/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using Perspex.Media; using Perspex.Platform; using Perspex.Rendering; @@ -11,10 +12,12 @@ namespace Perspex.Cairo.Media.Imaging public class RenderTargetBitmapImpl : IRenderTargetBitmapImpl { + + private readonly RenderTarget _renderTarget; public RenderTargetBitmapImpl(Cairo.ImageSurface surface) { Surface = surface; - renderTarget = new RenderTarget(Surface); + _renderTarget = new RenderTarget(Surface); } public int PixelWidth => Surface.Width; @@ -23,7 +26,7 @@ namespace Perspex.Cairo.Media.Imaging public void Dispose() { - renderTarget.Dispose(); + _renderTarget.Dispose(); } public Cairo.ImageSurface Surface @@ -31,15 +34,19 @@ namespace Perspex.Cairo.Media.Imaging get; } - private RenderTarget renderTarget; - public void Render(IVisual visual) + public void Save(string fileName) { - renderTarget.Render(visual, new PlatformHandle(IntPtr.Zero, "RTB")); + Surface.WriteToPng(fileName); } - public void Save(string fileName) + public IDrawingContext CreateDrawingContext() { - Surface.WriteToPng(fileName); + return _renderTarget.CreateDrawingContext(); + } + + void IRenderTarget.Resize(int width, int height) + { + throw new NotSupportedException(); } } } \ No newline at end of file diff --git a/src/Gtk/Perspex.Cairo/Media/TileBrushes.cs b/src/Gtk/Perspex.Cairo/Media/TileBrushes.cs index 77710a3282..fd1f457a95 100644 --- a/src/Gtk/Perspex.Cairo/Media/TileBrushes.cs +++ b/src/Gtk/Perspex.Cairo/Media/TileBrushes.cs @@ -116,7 +116,7 @@ namespace Perspex.Cairo.Media context.Rectangle(drawRect.ToCairo()); context.Clip(); context.Transform(transform.ToCairo()); - renderer.Render(visual, new PlatformHandle(IntPtr.Zero, "RTB"), transform, drawRect); + renderer.Render(visual, transform, drawRect); var result = new SurfacePattern(intermediate); diff --git a/src/Gtk/Perspex.Cairo/RenderTarget.cs b/src/Gtk/Perspex.Cairo/RenderTarget.cs index 1b428e36f4..83edc10f31 100644 --- a/src/Gtk/Perspex.Cairo/RenderTarget.cs +++ b/src/Gtk/Perspex.Cairo/RenderTarget.cs @@ -17,6 +17,7 @@ namespace Perspex.Cairo /// public class RenderTarget : IRenderTarget { + private readonly IPlatformHandle _handle; private readonly Surface _surface; private Gdk.Window _window; @@ -28,6 +29,7 @@ namespace Perspex.Cairo /// The height of the window. public RenderTarget(IPlatformHandle handle, double width, double height) { + _handle = handle; } public RenderTarget(ImageSurface surface) @@ -51,21 +53,22 @@ namespace Perspex.Cairo /// /// The platform-specific handle. /// A surface wrapped in an . - public IDrawingContext CreateDrawingContext(IPlatformHandle handle) + public IDrawingContext CreateDrawingContext() { - switch (handle.HandleDescriptor) + if(_surface != null) + return new DrawingContext(_surface); + + switch (_handle.HandleDescriptor) { - case "RTB": - return new DrawingContext(_surface); case "GdkWindow": if (_window == null) - _window = new Gdk.Window(handle.Handle); + _window = new Gdk.Window(_handle.Handle); return new DrawingContext(_window); default: throw new NotSupportedException(string.Format( "Don't know how to create a Cairo renderer from a '{0}' handle", - handle.HandleDescriptor)); + _handle.HandleDescriptor)); } } diff --git a/src/Gtk/Perspex.Gtk/WindowImpl.cs b/src/Gtk/Perspex.Gtk/WindowImpl.cs index 1914207d08..c6076a85f8 100644 --- a/src/Gtk/Perspex.Gtk/WindowImpl.cs +++ b/src/Gtk/Perspex.Gtk/WindowImpl.cs @@ -83,7 +83,7 @@ namespace Perspex.Gtk public Action Input { get; set; } - public Action Paint { get; set; } + public Action Paint { get; set; } public Action Resized { get; set; } @@ -223,7 +223,7 @@ namespace Perspex.Gtk protected override bool OnExposeEvent(EventExpose evnt) { - Paint(evnt.Area.ToPerspex(), GetHandle(evnt.Window)); + Paint(evnt.Area.ToPerspex()); return true; } diff --git a/src/Perspex.Controls/Platform/ITopLevelImpl.cs b/src/Perspex.Controls/Platform/ITopLevelImpl.cs index 1cbc5f7c60..053c340b27 100644 --- a/src/Perspex.Controls/Platform/ITopLevelImpl.cs +++ b/src/Perspex.Controls/Platform/ITopLevelImpl.cs @@ -22,7 +22,7 @@ namespace Perspex.Platform Action Input { get; set; } - Action Paint { get; set; } + Action Paint { get; set; } Action Resized { get; set; } diff --git a/src/Perspex.Controls/Platform/ITopLevelRenderer.cs b/src/Perspex.Controls/Platform/ITopLevelRenderer.cs index 74afcceeb8..fa71860f7d 100644 --- a/src/Perspex.Controls/Platform/ITopLevelRenderer.cs +++ b/src/Perspex.Controls/Platform/ITopLevelRenderer.cs @@ -44,9 +44,9 @@ namespace Perspex.Controls.Platform resources.Add(queueManager.RenderNeeded.Subscribe(_ => topLevel.PlatformImpl.Invalidate(new Rect(topLevel.ClientSize)))); - topLevel.PlatformImpl.Paint = (rect, handle) => + topLevel.PlatformImpl.Paint = rect => { - viewport.Render(topLevel, handle); + viewport.Render(topLevel); queueManager.RenderFinished(); }; diff --git a/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs b/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs index 90b83dff6b..0d751d61c6 100644 --- a/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs +++ b/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs @@ -3,6 +3,7 @@ using System; using Perspex.Platform; +using Perspex.Rendering; namespace Perspex.Media.Imaging { diff --git a/src/Perspex.SceneGraph/Platform/IRenderTarget.cs b/src/Perspex.SceneGraph/Platform/IRenderTarget.cs index 2ea2889348..5634d622cd 100644 --- a/src/Perspex.SceneGraph/Platform/IRenderTarget.cs +++ b/src/Perspex.SceneGraph/Platform/IRenderTarget.cs @@ -20,9 +20,7 @@ namespace Perspex.Platform /// /// Creates an for a rendering session. /// - /// The handle to use to create the context. - /// An . - IDrawingContext CreateDrawingContext(IPlatformHandle target); + IDrawingContext CreateDrawingContext(); /// /// Resizes the rendered viewport. diff --git a/src/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs b/src/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs index 9e1b0e6cdd..679e243664 100644 --- a/src/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs +++ b/src/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs @@ -9,15 +9,7 @@ namespace Perspex.Platform /// Defines the platform-specific interface for a /// . /// - public interface IRenderTargetBitmapImpl : IBitmapImpl, IDisposable + public interface IRenderTargetBitmapImpl : IBitmapImpl, IRenderTarget { - /// - /// Renders an into the bitmap. - /// - /// The visual to render. - /// - /// Before calling this method, ensure that has been measured. - /// - void Render(IVisual visual); } } diff --git a/src/Perspex.SceneGraph/Rendering/RendererBase.cs b/src/Perspex.SceneGraph/Rendering/RendererBase.cs index 3f254afe61..7281ac516b 100644 --- a/src/Perspex.SceneGraph/Rendering/RendererBase.cs +++ b/src/Perspex.SceneGraph/Rendering/RendererBase.cs @@ -21,10 +21,9 @@ namespace Perspex.Rendering /// /// IRenderer instance /// The visual to render. - /// An optional platform-specific handle. - public static void Render(this IRenderTarget renderTarget, IVisual visual, IPlatformHandle target) + public static void Render(this IRenderTarget renderTarget, IVisual visual) { - using (var ctx = renderTarget.CreateDrawingContext(target)) + using (var ctx = renderTarget.CreateDrawingContext()) ctx.Render(visual); } @@ -32,13 +31,12 @@ namespace Perspex.Rendering /// Renders the specified visual. /// /// IRenderer instance - /// An optional platform-specific handle. /// The visual to render. /// The current translation. /// The current transform. - public static void Render(this IRenderTarget renderTarget, IVisual visual, IPlatformHandle target, Matrix translation, Matrix transform) + public static void Render(this IRenderTarget renderTarget, IVisual visual, Matrix translation, Matrix transform) { - using (var ctx = renderTarget.CreateDrawingContext(target)) + using (var ctx = renderTarget.CreateDrawingContext()) ctx.Render(visual, translation, transform); } @@ -46,13 +44,12 @@ namespace Perspex.Rendering /// Renders the specified visual with the specified transform and clip. /// /// IRenderer instance - /// An optional platform-specific handle. /// The visual to render. /// The transform. /// An optional clip rectangle. - public static void Render(this IRenderTarget renderTarget, IVisual visual, IPlatformHandle target, Matrix transform, Rect? clip = null) + public static void Render(this IRenderTarget renderTarget, IVisual visual, Matrix transform, Rect? clip = null) { - using (var context = renderTarget.CreateDrawingContext(target)) + using (var context = renderTarget.CreateDrawingContext()) context.Render(visual, transform, clip); } diff --git a/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs index c08d48e225..97efa00d47 100644 --- a/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using Perspex.Media; using Perspex.Platform; using Perspex.Rendering; using SharpDX.Direct2D1; @@ -37,10 +38,11 @@ namespace Perspex.Direct2D1.Media // TODO: } - public void Render(IVisual visual) + public IDrawingContext CreateDrawingContext() => new RenderTarget(_target).CreateDrawingContext(); + + void IRenderTarget.Resize(int width, int height) { - RenderTarget renderTarget = new RenderTarget(_target); - renderTarget.Render(visual, null); + throw new NotSupportedException(); } } } diff --git a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs index 5bb191a4bc..c57c2b1477 100644 --- a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs @@ -53,7 +53,7 @@ namespace Perspex.Direct2D1.Media out drawRect); var renderer = new RenderTarget(intermediate); - renderer.Render(visual, null, transform, drawRect); + renderer.Render(visual, transform, drawRect); this.PlatformBrush = new BitmapBrush( target, diff --git a/src/Windows/Perspex.Direct2D1/RenderTarget.cs b/src/Windows/Perspex.Direct2D1/RenderTarget.cs index 95259f324b..ea6400be80 100644 --- a/src/Windows/Perspex.Direct2D1/RenderTarget.cs +++ b/src/Windows/Perspex.Direct2D1/RenderTarget.cs @@ -94,9 +94,8 @@ namespace Perspex.Direct2D1 /// /// Creates a drawing context for a rendering session. /// - /// The platform handle. Unused. /// An . - public IDrawingContext CreateDrawingContext(IPlatformHandle handle) + public IDrawingContext CreateDrawingContext() { return new DrawingContext(_renderTarget, DirectWriteFactory); } diff --git a/src/Windows/Perspex.Win32/WindowImpl.cs b/src/Windows/Perspex.Win32/WindowImpl.cs index fa3313c232..dda55f4757 100644 --- a/src/Windows/Perspex.Win32/WindowImpl.cs +++ b/src/Windows/Perspex.Win32/WindowImpl.cs @@ -51,7 +51,7 @@ namespace Perspex.Win32 public Action Input { get; set; } - public Action Paint { get; set; } + public Action Paint { get; set; } public Action Resized { get; set; } @@ -405,7 +405,7 @@ namespace Perspex.Win32 { UnmanagedMethods.RECT r; UnmanagedMethods.GetUpdateRect(_hwnd, out r, false); - Paint(new Rect(r.left, r.top, r.right - r.left, r.bottom - r.top), Handle); + Paint(new Rect(r.left, r.top, r.right - r.left, r.bottom - r.top)); UnmanagedMethods.EndPaint(_hwnd, ref ps); } }