diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs index ed8a2960dc..0208511c4c 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs @@ -159,10 +159,7 @@ namespace Avalonia.Rendering.SceneGraph EnsureDrawOperationsCreated(); var old = _drawOperations[index]; _drawOperations[index] = operation.Clone(); - if (old is IDisposable disposable) - { - disposable.Dispose(); - } + old.Dispose(); } /// diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs index 8fcb54775b..7821f60a51 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs @@ -359,7 +359,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering private Mock GetLayerContext(DeferredRenderer renderer, IControl layerRoot) { - return Mock.Get(renderer.Layers[layerRoot].Bitmap.CreateDrawingContext(null)); + return Mock.Get(renderer.Layers[layerRoot].Bitmap.Item.CreateDrawingContext(null)); } private void IgnoreFirstFrame(Mock loop, Mock sceneBuilder) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DeferredDrawingContextImplTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DeferredDrawingContextImplTests.cs index 1906775783..b0c9e28c98 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DeferredDrawingContextImplTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DeferredDrawingContextImplTests.cs @@ -3,6 +3,7 @@ using System.Linq; using Avalonia.Media; using Avalonia.Rendering.SceneGraph; using Avalonia.UnitTests; +using Avalonia.Utilities; using Avalonia.VisualTree; using Moq; using Xunit; @@ -111,7 +112,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph public void Should_Not_Replace_Identical_DrawOperation() { var node = new VisualNode(new TestRoot(), null); - var operation = new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0); + var operation = RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0)); var layers = new SceneLayers(node.Visual); var target = new DeferredDrawingContextImpl(null, layers); @@ -133,7 +134,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph public void Should_Replace_Different_DrawOperation() { var node = new VisualNode(new TestRoot(), null); - var operation = new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0); + var operation = RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0)); var layers = new SceneLayers(node.Visual); var target = new DeferredDrawingContextImpl(null, layers); @@ -175,10 +176,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph var node = new VisualNode(new TestRoot(), null); node.LayerRoot = node.Visual; - node.AddDrawOperation(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 10, 100), 0)); - node.AddDrawOperation(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 20, 100), 0)); - node.AddDrawOperation(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 30, 100), 0)); - node.AddDrawOperation(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 40, 100), 0)); + 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))); var layers = new SceneLayers(node.Visual); var target = new DeferredDrawingContextImpl(null, layers); diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs index 3d2e780e0b..1101ccacba 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs @@ -1,5 +1,6 @@ using System; using Avalonia.Rendering.SceneGraph; +using Avalonia.Utilities; using Avalonia.VisualTree; using Moq; using Xunit; @@ -43,7 +44,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph var node = new VisualNode(Mock.Of(), null); var collection = node.DrawOperations; - node.AddDrawOperation(Mock.Of()); + node.AddDrawOperation(RefCountable.Create(Mock.Of())); Assert.NotSame(collection, node.DrawOperations); } @@ -52,7 +53,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph public void Cloned_Nodes_Should_Share_DrawOperations_Collection() { var node1 = new VisualNode(Mock.Of(), null); - node1.AddDrawOperation(Mock.Of()); + node1.AddDrawOperation(RefCountable.Create(Mock.Of())); var node2 = node1.Clone(null); @@ -63,18 +64,33 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph public void Adding_DrawOperation_To_Cloned_Node_Should_Create_New_Collection() { var node1 = new VisualNode(Mock.Of(), null); - var operation1 = Mock.Of(); + var operation1 = RefCountable.Create(Mock.Of()); node1.AddDrawOperation(operation1); var node2 = node1.Clone(null); - var operation2 = Mock.Of(); + var operation2 = RefCountable.Create(Mock.Of()); node2.ReplaceDrawOperation(0, operation2); Assert.NotSame(node1.DrawOperations, node2.DrawOperations); Assert.Equal(1, node1.DrawOperations.Count); Assert.Equal(1, node2.DrawOperations.Count); - Assert.Same(operation1, node1.DrawOperations[0]); - Assert.Same(operation2, node2.DrawOperations[0]); + Assert.Same(operation1.Item, node1.DrawOperations[0].Item); + Assert.Same(operation2.Item, node2.DrawOperations[0].Item); + } + + [Fact] + public void DrawOperations_In_Cloned_Node_Are_Cloned() + { + var node1 = new VisualNode(Mock.Of(), null); + var operation1 = RefCountable.Create(Mock.Of()); + node1.AddDrawOperation(operation1); + + var node2 = node1.Clone(null); + var operation2 = RefCountable.Create(Mock.Of()); + node2.AddDrawOperation(operation2); + + Assert.Same(node1.DrawOperations[0].Item, node2.DrawOperations[0].Item); + Assert.NotSame(node1.DrawOperations[0], node2.DrawOperations[0]); } } }