|
@@ -304,7 +304,7 @@ namespace Avalonia
|
|
|
{
|
|
{
|
|
|
var thisOffset = GetOffsetFrom(common, this);
|
|
var thisOffset = GetOffsetFrom(common, this);
|
|
|
var thatOffset = GetOffsetFrom(common, visual);
|
|
var thatOffset = GetOffsetFrom(common, visual);
|
|
|
- return Matrix.CreateTranslation(-thatOffset) * Matrix.CreateTranslation(thisOffset);
|
|
|
|
|
|
|
+ return -thatOffset * thisOffset;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
return null;
|
|
@@ -454,13 +454,28 @@ namespace Avalonia
|
|
|
/// <param name="ancestor">The ancestor visual.</param>
|
|
/// <param name="ancestor">The ancestor visual.</param>
|
|
|
/// <param name="visual">The visual.</param>
|
|
/// <param name="visual">The visual.</param>
|
|
|
/// <returns>The visual offset.</returns>
|
|
/// <returns>The visual offset.</returns>
|
|
|
- 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)
|
|
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;
|
|
visual = visual.VisualParent;
|
|
|
|
|
|
|
|
if (visual == null)
|
|
if (visual == null)
|