diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index d373e7ef2a..96512b41a1 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -115,12 +115,45 @@ namespace Avalonia.Rendering } } + private static Matrix? TransformToVisual(IVisual visual, IVisual root) + { + var result = Matrix.Identity; + + while (visual != root) + { + if (visual.RenderTransform?.Value != null) + { + var origin = visual.RenderTransformOrigin.ToPixels(visual.Bounds.Size); + var offset = Matrix.CreateTranslation(origin); + var renderTransform = (-offset) * visual.RenderTransform.Value * (offset); + + result *= renderTransform; + } + + var topLeft = visual.Bounds.TopLeft; + + if (topLeft != default) + { + result *= Matrix.CreateTranslation(topLeft); + } + + visual = visual.VisualParent; + + if (visual == null) + { + return null; + } + } + + return result; + } + /// public void AddDirty(IVisual visual) { if (visual.Bounds != Rect.Empty) { - var m = visual.TransformToVisual(_root); + var m = TransformToVisual(visual, _root); if (m.HasValue) { @@ -191,7 +224,7 @@ namespace Avalonia.Rendering } } - static IEnumerable HitTest( + private static IEnumerable HitTest( IVisual visual, Point p, Func filter)