diff --git a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs index d2467bbb86..41d63c2beb 100644 --- a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs @@ -29,7 +29,7 @@ namespace Perspex.Direct2D1.Media var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size); var destinationRect = brush.DestinationRect.ToPixels(targetSize); - var bitmapSize = CalculateBitmapSize(brush.TileMode, destinationRect.Size, targetSize); + var bitmapSize = CalculateBitmapSize(brush.TileMode, sourceRect.Size, targetSize); var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size); var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale); var options = CompatibleRenderTargetOptions.None; @@ -43,6 +43,8 @@ namespace Perspex.Direct2D1.Media renderer.Render(visual, null, transform, destinationRect); var result = new BitmapBrush(brt, brt.Bitmap); + result.ExtendModeX = ExtendMode.Wrap; + result.ExtendModeY = ExtendMode.Wrap; this.PlatformBrush = result; } } @@ -53,6 +55,8 @@ namespace Perspex.Direct2D1.Media { case TileMode.None: return targetSize; + case TileMode.Tile: + return size; default: throw new NotImplementedException(); } @@ -68,24 +72,27 @@ namespace Perspex.Direct2D1.Media var y = destinationRect.Y; var size = sourceRect.Size * scale; - switch (brush.AlignmentX) + if (brush.TileMode == TileMode.None) { - case AlignmentX.Center: - x += (destinationRect.Width - size.Width) / 2; - break; - case AlignmentX.Right: - x += destinationRect.Width - size.Width; - break; - } + switch (brush.AlignmentX) + { + case AlignmentX.Center: + x += (destinationRect.Width - size.Width) / 2; + break; + case AlignmentX.Right: + x += destinationRect.Width - size.Width; + break; + } - switch (brush.AlignmentY) - { - case AlignmentY.Center: - y += (destinationRect.Height - size.Height) / 2; - break; - case AlignmentY.Bottom: - y += destinationRect.Height - size.Height; - break; + switch (brush.AlignmentY) + { + case AlignmentY.Center: + y += (destinationRect.Height - size.Height) / 2; + break; + case AlignmentY.Bottom: + y += destinationRect.Height - size.Height; + break; + } } return new Vector(x, y); diff --git a/tests/Perspex.RenderTests/Media/VisualBrushTests.cs b/tests/Perspex.RenderTests/Media/VisualBrushTests.cs index 4d404cfefd..ac8c39f113 100644 --- a/tests/Perspex.RenderTests/Media/VisualBrushTests.cs +++ b/tests/Perspex.RenderTests/Media/VisualBrushTests.cs @@ -396,5 +396,43 @@ namespace Perspex.Direct2D1.RenderTests.Media this.RenderToFile(target); this.CompareImages(); } + + [Fact] + public void VisualBrush_Tile() + { + Decorator target = new Decorator + { + Padding = new Thickness(8), + Width = 200, + Height = 200, + Child = new Rectangle + { + Fill = new VisualBrush + { + Stretch = Stretch.None, + TileMode = TileMode.Tile, + Visual = new Border + { + Width = 92, + Height = 92, + Background = Brushes.Red, + BorderBrush = Brushes.Black, + BorderThickness = 2, + Child = new TextBlock + { + Text = "Perspex", + FontSize = 12, + FontFamily = "Arial", + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + } + } + } + } + }; + + this.RenderToFile(target); + this.CompareImages(); + } } } diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile.expected.png new file mode 100644 index 0000000000..ab0cf7e1d0 Binary files /dev/null and b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile.expected.png differ