diff --git a/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs b/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs
index 6987e5a19d..e55d75cc5c 100644
--- a/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs
+++ b/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs
@@ -4,6 +4,7 @@
using System;
using System.Linq;
using System.Reactive.Disposables;
+using System.Runtime.InteropServices;
using Perspex.Cairo.Media.Imaging;
using Perspex.Media;
@@ -200,6 +201,8 @@ namespace Perspex.Cairo.Media
}
}
+ private static Random Random = new Random();
+
///
/// Pushes a clip rectange.
///
@@ -207,10 +210,13 @@ namespace Perspex.Cairo.Media
/// A disposable used to undo the clip rectangle.
public IDisposable PushClip(Rect clip)
{
+ _context.Save();
+ uint fill = 0x90000000 | (unchecked((uint) Random.Next(int.MinValue, int.MaxValue)));
+ FillRectangle(new SolidColorBrush(fill), clip, 0);
_context.Rectangle(clip.ToCairo());
_context.Clip();
- return Disposable.Create(() => _context.ResetClip());
+ return Disposable.Create(() => _context.Restore());
}
///
@@ -238,11 +244,12 @@ namespace Perspex.Cairo.Media
/// A disposable used to undo the transformation.
public IDisposable PushTransform(Matrix matrix)
{
+ _context.Save();
_context.Transform(matrix.ToCairo());
return Disposable.Create(() =>
{
- _context.Transform(matrix.Invert().ToCairo());
+ _context.Restore();
});
}