diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 12510330b8..22c636b0d7 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -1152,7 +1152,10 @@ namespace Avalonia.Skia if (content.Transform is not null) { - transform = content.Transform.Value * transform; + var transformOrigin = content.TransformOrigin.ToPixels(targetRect); + var offset = Matrix.CreateTranslation(transformOrigin); + + transform *= -offset * content.Transform.Value * offset; } var calc = new TileBrushCalculator(tileBrush, contentSize, targetRect.Size); diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index d7f97b473b..7eb5b207fc 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -624,7 +624,10 @@ namespace Avalonia.Direct2D1.Media if (sceneBrush?.Transform is not null) { - ctx.Transform *= sceneBrush.Transform.Value; + var transformOrigin = sceneBrushContent.TransformOrigin.ToPixels(rect); + var offset = Matrix.CreateTranslation(transformOrigin); + + ctx.Transform = -offset * sceneBrush.Transform.Value * offset; } sceneBrushContent.Render(ctx, diff --git a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs index 699d0ea089..2a49444a10 100644 --- a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs @@ -490,5 +490,36 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } + + [Fact] + public async Task ImageBrush_Should_Render_With_TransformOrigin() + { + var image = new Image + { + Width = 200, + Height = 200, + Source = new DrawingImage + { + Drawing = new GeometryDrawing + { + Brush = new DrawingBrush + { + Transform = new RotateTransform(45), + TransformOrigin = new RelativePoint(.5,.5, RelativeUnit.Relative), + 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_TransformOrigin.expected.png b/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Should_Render_With_TransformOrigin.expected.png new file mode 100644 index 0000000000..b14d474414 Binary files /dev/null and b/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Should_Render_With_TransformOrigin.expected.png differ diff --git a/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Should_Render_With_TransformOrigin.expected.png b/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Should_Render_With_TransformOrigin.expected.png new file mode 100644 index 0000000000..6ad8d52329 Binary files /dev/null and b/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Should_Render_With_TransformOrigin.expected.png differ