diff --git a/src/Perspex.SceneGraph/Rendering/RendererBase.cs b/src/Perspex.SceneGraph/Rendering/RendererBase.cs
index 2dce69e3d0..d5b593d5e0 100644
--- a/src/Perspex.SceneGraph/Rendering/RendererBase.cs
+++ b/src/Perspex.SceneGraph/Rendering/RendererBase.cs
@@ -43,9 +43,11 @@ namespace Perspex.Rendering
/// The visual to render.
/// An optional platform-specific handle.
/// The transform.
- public virtual void Render(IVisual visual, IPlatformHandle handle, Matrix transform)
+ /// An optional clip rectangle.
+ public virtual void Render(IVisual visual, IPlatformHandle handle, Matrix transform, Rect? clip = null)
{
using (var context = this.CreateDrawingContext(handle))
+ using (clip.HasValue ? context.PushClip(clip.Value) : null)
{
this.Render(visual, context, Matrix.Identity, transform);
}
diff --git a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs
index a1a7520fb2..d2467bbb86 100644
--- a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs
+++ b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs
@@ -40,7 +40,7 @@ namespace Perspex.Direct2D1.Media
var transform = Matrix.CreateTranslation(-sourceRect.Position) *
Matrix.CreateScale(scale) *
Matrix.CreateTranslation(translate);
- renderer.Render(visual, null, transform);
+ renderer.Render(visual, null, transform, destinationRect);
var result = new BitmapBrush(brt, brt.Bitmap);
this.PlatformBrush = result;
diff --git a/tests/Perspex.RenderTests/Media/VisualBrushTests.cs b/tests/Perspex.RenderTests/Media/VisualBrushTests.cs
index 962ecf01a6..7d32014cc3 100644
--- a/tests/Perspex.RenderTests/Media/VisualBrushTests.cs
+++ b/tests/Perspex.RenderTests/Media/VisualBrushTests.cs
@@ -320,5 +320,43 @@ namespace Perspex.Direct2D1.RenderTests.Media
this.RenderToFile(target);
this.CompareImages();
}
+
+ [Fact]
+ public void VisualBrush_SourceRect_DestinationRect_Absolute()
+ {
+ Decorator target = new Decorator
+ {
+ Padding = new Thickness(8),
+ Width = 200,
+ Height = 200,
+ Child = new Rectangle
+ {
+ Fill = new VisualBrush
+ {
+ SourceRect = new RelativeRect(40, 40, 100, 100, OriginUnit.Pixels),
+ DestinationRect = new RelativeRect(92, 92, 92, 92, OriginUnit.Pixels),
+ Visual = new Border
+ {
+ Width = 180,
+ Height = 180,
+ Background = Brushes.Red,
+ BorderBrush = Brushes.Black,
+ BorderThickness = 2,
+ Child = new Ellipse
+ {
+ Width = 100,
+ Height = 100,
+ Fill = Brushes.Yellow,
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ }
+ }
+ }
+ }
+ };
+
+ this.RenderToFile(target);
+ this.CompareImages();
+ }
}
}
diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_DestinationRect_Absolute.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_DestinationRect_Absolute.expected.png
new file mode 100644
index 0000000000..b2abed4041
Binary files /dev/null and b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_DestinationRect_Absolute.expected.png differ