diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 2fdb523287..12510330b8 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -1150,6 +1150,11 @@ namespace Avalonia.Skia var tileBrush = content.Brush; var transform = rect.TopLeft == default ? Matrix.Identity : Matrix.CreateTranslation(-rect.X, -rect.Y); + if (content.Transform is not null) + { + transform = content.Transform.Value * transform; + } + var calc = new TileBrushCalculator(tileBrush, contentSize, targetRect.Size); transform *= calc.IntermediateTransform; @@ -1186,15 +1191,6 @@ namespace Avalonia.Skia paintTransform = SKMatrix.Concat(paintTransform, SKMatrix.CreateScale((float)(96.0 / _intermediateSurfaceDpi.X), (float)(96.0 / _intermediateSurfaceDpi.Y))); - if (tileBrush.Transform is { }) - { - var origin = tileBrush.TransformOrigin.ToPixels(targetRect); - var offset = Matrix.CreateTranslation(origin); - var brushTransform = (-offset) * tileBrush.Transform.Value * (offset); - - paintTransform = paintTransform.PreConcat(brushTransform.ToSKMatrix()); - } - if (tileBrush.DestinationRect.Unit == RelativeUnit.Relative) paintTransform = paintTransform.PreConcat(SKMatrix.CreateTranslation((float)targetRect.X, (float)targetRect.Y)); diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index e1d51f7054..d7f97b473b 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -621,6 +621,12 @@ namespace Avalonia.Direct2D1.Media using (var ctx = new RenderTarget(intermediate).CreateDrawingContext(true)) { intermediate.Clear(null); + + if (sceneBrush?.Transform is not null) + { + ctx.Transform *= sceneBrush.Transform.Value; + } + sceneBrushContent.Render(ctx, rect.TopLeft == default ? null : Matrix.CreateTranslation(-rect.X, -rect.Y)); } diff --git a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs index 640aed2ea8..699d0ea089 100644 --- a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs @@ -460,5 +460,35 @@ namespace Avalonia.Direct2D1.RenderTests.Media await RenderToFile(new RelativePointTestPrimitivesHelper(brush), testName); CompareImages(testName); } + + [Fact] + public async Task ImageBrush_Should_Render_With_Transform() + { + var image = new Image + { + Width = 200, + Height = 200, + Source = new DrawingImage + { + Drawing = new GeometryDrawing + { + Brush = new DrawingBrush + { + Transform = new TranslateTransform { X = 10, Y = 10 }, + Drawing = new GeometryDrawing + { + Brush = Brushes.MediumBlue, + Geometry = new RectangleGeometry { Rect = new Rect(0, 0, 48, 48) } + } + }, + Geometry = new RectangleGeometry { Rect = new Rect(0, 0, 48, 48) } + } + } + }; + + await RenderToFile(image); + + CompareImages(); + } } } diff --git a/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Should_Render_With_Transform.expected.png b/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Should_Render_With_Transform.expected.png new file mode 100644 index 0000000000..957cddecb8 Binary files /dev/null and b/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Should_Render_With_Transform.expected.png differ diff --git a/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Should_Render_With_Transform.expected.png b/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Should_Render_With_Transform.expected.png new file mode 100644 index 0000000000..5a0d77cbd2 Binary files /dev/null and b/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Should_Render_With_Transform.expected.png differ