diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
index e5e3533bf6..967dd24acf 100644
--- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
+++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
@@ -118,45 +118,12 @@ 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 = TransformToVisual(visual, _root);
+ var m = visual.TransformToVisual(_root);
if (m.HasValue)
{
diff --git a/src/Avalonia.Visuals/Visual.cs b/src/Avalonia.Visuals/Visual.cs
index e5fcf1ba1d..f26c21d1b6 100644
--- a/src/Avalonia.Visuals/Visual.cs
+++ b/src/Avalonia.Visuals/Visual.cs
@@ -304,7 +304,7 @@ namespace Avalonia
{
var thisOffset = GetOffsetFrom(common, this);
var thatOffset = GetOffsetFrom(common, visual);
- return Matrix.CreateTranslation(-thatOffset) * Matrix.CreateTranslation(thisOffset);
+ return -thatOffset * thisOffset;
}
return null;
@@ -454,13 +454,28 @@ namespace Avalonia
/// The ancestor visual.
/// The visual.
/// The visual offset.
- private static Vector GetOffsetFrom(IVisual ancestor, IVisual visual)
+ private static Matrix GetOffsetFrom(IVisual ancestor, IVisual visual)
{
- var result = new Vector();
+ var result = Matrix.Identity;
while (visual != ancestor)
{
- result = new Vector(result.X + visual.Bounds.X, result.Y + visual.Bounds.Y);
+ 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)