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)