瀏覽代碼

Fixed bug in TrimDrawOperations that wasn't disposing draw operations correctly.

Jeremy Koritzinsky 7 年之前
父節點
當前提交
74f8930277

+ 4 - 3
src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs

@@ -358,9 +358,10 @@ namespace Avalonia.Rendering.SceneGraph
 
         private void Add(IDrawOperation node)
         {
-            var refCounted = RefCountable.Create(node);
-            Add(refCounted);
-            refCounted.Dispose(); // Dispose our reference
+            using (var refCounted = RefCountable.Create(node))
+            {
+                Add(refCounted); 
+            }
         }
 
         private void Add(IRef<IDrawOperation> node)

+ 1 - 1
src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs

@@ -192,7 +192,7 @@ namespace Avalonia.Rendering.SceneGraph
             if (first < _drawOperations?.Count)
             {
                 EnsureDrawOperationsCreated();
-                for (int i = first; i < _drawOperations.Count - first; i++)
+                for (int i = first; i < _drawOperations.Count; i++)
                 {
                     _drawOperations[i].Dispose();
                 }

+ 15 - 5
tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DeferredDrawingContextImplTests.cs

@@ -175,13 +175,18 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
         public void Should_Trim_DrawOperations()
         {
             var node = new VisualNode(new TestRoot(), null);
-
             node.LayerRoot = node.Visual;
-            node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 10, 100), 0)));
-            node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 20, 100), 0)));
-            node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 30, 100), 0)));
-            node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 40, 100), 0)));
 
+            for (var i = 0; i < 4; ++i)
+            {
+                var drawOperation = new Mock<IDrawOperation>();
+                using (var r = RefCountable.Create(drawOperation.Object))
+                {
+                    node.AddDrawOperation(r);
+                }
+            }
+
+            var drawOperations = node.DrawOperations.Select(op => op.Item).ToList();
             var layers = new SceneLayers(node.Visual);
             var target = new DeferredDrawingContextImpl(null, layers);
 
@@ -192,6 +197,11 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
             }
 
             Assert.Equal(2, node.DrawOperations.Count);
+
+            foreach (var i in drawOperations)
+            {
+                Mock.Get(i).Verify(x => x.Dispose());
+            }
         }
 
         [Fact]