Forráskód Böngészése

Fir TransformToVisual and use it in ImmediateRenderer

Andrey Kunchev 7 éve
szülő
commit
85c786e4e9

+ 1 - 34
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;
-        }
-
         /// <inheritdoc/>
         /// <inheritdoc/>
         public void AddDirty(IVisual visual)
         public void AddDirty(IVisual visual)
         {
         {
             if (visual.Bounds != Rect.Empty)
             if (visual.Bounds != Rect.Empty)
             {
             {
-                var m = TransformToVisual(visual, _root);
+                var m = visual.TransformToVisual(_root);
 
 
                 if (m.HasValue)
                 if (m.HasValue)
                 {
                 {

+ 19 - 4
src/Avalonia.Visuals/Visual.cs

@@ -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)