diff --git a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs index f95ca41138..2d98e367f8 100644 --- a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs @@ -31,7 +31,7 @@ namespace Perspex.Direct2D1.Media var sourceSize = layoutable.Bounds.Size; var destinationRect = brush.DestinationRect.ToPixels(destinationSize); var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceSize); - var translate = new Rect(destinationSize).CenterIn(new Rect(sourceSize * scale)).Position; + var translate = CalculateTranslate(brush, destinationRect.Size, sourceSize * scale); using (var brt = new BitmapRenderTarget( target, @@ -44,6 +44,34 @@ namespace Perspex.Direct2D1.Media } } + private static Vector CalculateTranslate(VisualBrush brush, Size destinationSize, Size sourceSize) + { + double x = 0; + double y = 0; + + switch (brush.AlignmentX) + { + case AlignmentX.Center: + x = (destinationSize.Width - sourceSize.Width) / 2; + break; + case AlignmentX.Right: + x = destinationSize.Width - sourceSize.Width; + break; + } + + switch (brush.AlignmentY) + { + case AlignmentY.Center: + y = (destinationSize.Height - sourceSize.Height) / 2; + break; + case AlignmentY.Bottom: + y = destinationSize.Height - sourceSize.Height; + break; + } + + return new Vector(x, y); + } + public override void Dispose() { ((BitmapBrush)this.PlatformBrush).Bitmap.Dispose(); diff --git a/tests/Perspex.RenderTests/Media/VisualBrushTests.cs b/tests/Perspex.RenderTests/Media/VisualBrushTests.cs index 4d6f19c7e7..9b7fb7fbdd 100644 --- a/tests/Perspex.RenderTests/Media/VisualBrushTests.cs +++ b/tests/Perspex.RenderTests/Media/VisualBrushTests.cs @@ -20,7 +20,7 @@ namespace Perspex.Direct2D1.RenderTests.Media } [Fact] - public void VisualBrush_Stretch_None() + public void VisualBrush_Align_TopLeft() { Decorator target = new Decorator { @@ -31,6 +31,8 @@ namespace Perspex.Direct2D1.RenderTests.Media { Fill = new VisualBrush { + AlignmentX = AlignmentX.Left, + AlignmentY = AlignmentY.Top, Stretch = Stretch.None, Visual = new Border { @@ -95,6 +97,45 @@ namespace Perspex.Direct2D1.RenderTests.Media this.CompareImages(); } + [Fact] + public void VisualBrush_Align_BottomRight() + { + Decorator target = new Decorator + { + Padding = new Thickness(8), + Width = 200, + Height = 200, + Child = new Rectangle + { + Fill = new VisualBrush + { + AlignmentX = AlignmentX.Right, + AlignmentY = AlignmentY.Bottom, + Stretch = Stretch.None, + 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(); + } + [Fact] public void VisualBrush_Stretch_Fill_Large() { diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_BottomRight.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_BottomRight.expected.png new file mode 100644 index 0000000000..0918b7fd51 Binary files /dev/null and b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_BottomRight.expected.png differ diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_None.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_TopLeft.expected.png similarity index 100% rename from tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_None.expected.png rename to tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_TopLeft.expected.png