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