1
0
Эх сурвалжийг харах

Correctly handle Push/Pop without inner items

Nikita Tsukanov 2 жил өмнө
parent
commit
72c549a205

+ 12 - 5
src/Avalonia.Base/Rendering/Composition/Drawing/RenderDataDrawingContext.cs

@@ -79,12 +79,19 @@ internal class RenderDataDrawingContext : DrawingContext
 
         if (!(parent.Node is T))
             throw new InvalidOperationException("Invalid Pop operation");
-        
-        foreach(var item in _currentItemList!)
-            parent.Node.Children.Add(item);
-        _currentItemList.Clear();
-        s_listPool.ReturnAndSetNull(ref _currentItemList);
+
+        var removeLastPush = true;
+        if (_currentItemList != null)
+        {
+            removeLastPush = _currentItemList.Count == 0;
+            foreach (var item in _currentItemList)
+                parent.Node.Children.Add(item);
+            _currentItemList.Clear();
+            s_listPool.ReturnAndSetNull(ref _currentItemList);
+        }
         _currentItemList = parent.Items;
+        if (removeLastPush)
+            _currentItemList.RemoveAt(_currentItemList.Count - 1);
     }
 
     void AddResource(object? resource)

+ 13 - 0
tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs

@@ -132,5 +132,18 @@ namespace Avalonia.Base.UnitTests.Rendering.SceneGraph
 
             Assert.True(ctx.Context.GetRenderResults()!.HitTest(new Point(25, 25)));
         }
+        
+        [Fact]
+        public void Empty_Push_Pop_Sequence_Produces_No_Results()
+        {
+            var ctx = new TestContext(_services);
+            using (ctx.Context.PushTransform(Matrix.CreateTranslation(20, 20)))
+            using (ctx.Context.PushOpacity(1, default))
+            {
+
+            }
+
+            Assert.Null(ctx.Context.GetRenderResults());
+        }
     }
 }