From 943fca9aaf4c984bc91ce8d154a9231dc03ab13e Mon Sep 17 00:00:00 2001 From: Nelson Carrillo Date: Sun, 6 Sep 2015 17:22:24 -0400 Subject: [PATCH] Implemented IDisposable for IRenderer --- src/Gtk/Perspex.Cairo/Media/DrawingContext.cs | 21 +------------------ src/Gtk/Perspex.Cairo/Renderer.cs | 18 ++++++++++------ src/Perspex.SceneGraph/Platform/IRenderer.cs | 4 +++- .../Rendering/RendererBase.cs | 3 +++ src/Windows/Perspex.Direct2D1/Renderer.cs | 5 +++++ 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs b/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs index 7bbf98700d..e194ff038e 100644 --- a/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs +++ b/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs @@ -24,19 +24,13 @@ namespace Perspex.Cairo.Media /// The cairo context. /// private Cairo.Context context; - - /// - /// The cairo surface. - /// - private Cairo.Surface surface; - + /// /// Initializes a new instance of the class. /// /// The target surface. public DrawingContext(Cairo.Surface surface) { - this.surface = surface; this.context = new Cairo.Context(surface); this.CurrentTransform = Matrix.Identity; } @@ -47,7 +41,6 @@ namespace Perspex.Cairo.Media /// The GDK drawable. public DrawingContext(Gdk.Drawable drawable) { - this.Drawable = drawable; this.context = Gdk.CairoHelper.Create(drawable); this.CurrentTransform = Matrix.Identity; } @@ -58,24 +51,12 @@ namespace Perspex.Cairo.Media private set; } - public Gdk.Drawable Drawable - { - get; - private set; - } - /// /// Ends a draw operation. /// public void Dispose() { this.context.Dispose(); - - // if (this.surface is Cairo.Win32Surface) - // { - if (this.surface != null) - this.surface.Dispose(); - // } } public void DrawImage(IBitmap bitmap, double opacity, Rect sourceRect, Rect destRect) diff --git a/src/Gtk/Perspex.Cairo/Renderer.cs b/src/Gtk/Perspex.Cairo/Renderer.cs index 046be3e5b4..9d74d1da2e 100644 --- a/src/Gtk/Perspex.Cairo/Renderer.cs +++ b/src/Gtk/Perspex.Cairo/Renderer.cs @@ -20,7 +20,8 @@ namespace Perspex.Cairo /// public class Renderer : RendererBase { - private ImageSurface surface; + private Surface surface; + private Gdk.Window window; /// /// Initializes a new instance of the class. @@ -46,6 +47,7 @@ namespace Perspex.Cairo { // Don't need to do anything here. } + /// /// Creates a cairo surface that targets a platform-specific resource. @@ -54,16 +56,16 @@ namespace Perspex.Cairo /// A surface wrapped in an . protected override IDrawingContext CreateDrawingContext(IPlatformHandle handle) { + switch (handle.HandleDescriptor) { - case "HWND": - return new DrawingContext(new Win32Surface(GetDC(handle.Handle))); case "RTB": return new DrawingContext(this.surface); - case "HDC": - return new DrawingContext(new Win32Surface(handle.Handle)); case "GdkWindow": - return new DrawingContext(new Gdk.Window(handle.Handle)); + if (this.window == null) + this.window = new Gdk.Window(handle.Handle); + + return new DrawingContext(this.window); default: throw new NotSupportedException(string.Format( "Don't know how to create a Cairo renderer from a '{0}' handle", @@ -73,5 +75,9 @@ namespace Perspex.Cairo [DllImport("user32.dll")] private static extern IntPtr GetDC(IntPtr hwnd); + + public override void Dispose() + { + } } } diff --git a/src/Perspex.SceneGraph/Platform/IRenderer.cs b/src/Perspex.SceneGraph/Platform/IRenderer.cs index 7a9d40ec78..3a0a81c74c 100644 --- a/src/Perspex.SceneGraph/Platform/IRenderer.cs +++ b/src/Perspex.SceneGraph/Platform/IRenderer.cs @@ -6,6 +6,8 @@ namespace Perspex.Platform { + using System; + /// /// Defines a renderer. /// @@ -15,7 +17,7 @@ namespace Perspex.Platform /// as RenderBase has a default implementation for the non-platform specific parts of a /// renderer. /// - public interface IRenderer + public interface IRenderer : IDisposable { /// /// Gets the number of times has been called. diff --git a/src/Perspex.SceneGraph/Rendering/RendererBase.cs b/src/Perspex.SceneGraph/Rendering/RendererBase.cs index 6dd6dbd81c..b1bbb4e40a 100644 --- a/src/Perspex.SceneGraph/Rendering/RendererBase.cs +++ b/src/Perspex.SceneGraph/Rendering/RendererBase.cs @@ -6,6 +6,7 @@ namespace Perspex.Rendering { + using System; using System.Linq; using Perspex.Media; using Perspex.Platform; @@ -27,6 +28,8 @@ namespace Perspex.Rendering private set; } + public abstract void Dispose(); + /// /// Renders the specified visual. /// diff --git a/src/Windows/Perspex.Direct2D1/Renderer.cs b/src/Windows/Perspex.Direct2D1/Renderer.cs index e82dd2b64d..01d6818f9c 100644 --- a/src/Windows/Perspex.Direct2D1/Renderer.cs +++ b/src/Windows/Perspex.Direct2D1/Renderer.cs @@ -108,5 +108,10 @@ namespace Perspex.Direct2D1 { return new DrawingContext(this.renderTarget, this.DirectWriteFactory); } + + public override void Dispose() + { + this.renderTarget.Dispose(); + } } }