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();
+ }
}
}