|
|
|
@ -327,31 +327,36 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
if (_drawOperations == null) |
|
|
|
{ |
|
|
|
_drawOperations = new List<IRef<IDrawOperation>>(); |
|
|
|
_drawOperationsRefCounter = RefCountable.Create(Disposable.Create(DisposeDrawOperations)); |
|
|
|
_drawOperationsRefCounter = RefCountable.Create(CreateDisposeDrawOperations(_drawOperations)); |
|
|
|
_drawOperationsCloned = false; |
|
|
|
} |
|
|
|
else if (_drawOperationsCloned) |
|
|
|
{ |
|
|
|
_drawOperations = new List<IRef<IDrawOperation>>(_drawOperations.Select(op => op.Clone())); |
|
|
|
_drawOperationsRefCounter.Dispose(); |
|
|
|
_drawOperationsRefCounter = RefCountable.Create(Disposable.Create(DisposeDrawOperations)); |
|
|
|
_drawOperationsRefCounter = RefCountable.Create(CreateDisposeDrawOperations(_drawOperations)); |
|
|
|
_drawOperationsCloned = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public bool Disposed { get; } |
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
private static IDisposable CreateDisposeDrawOperations(List<IRef<IDrawOperation>> drawOperations) |
|
|
|
{ |
|
|
|
_drawOperationsRefCounter?.Dispose(); |
|
|
|
return Disposable.Create(() => |
|
|
|
{ |
|
|
|
foreach (var operation in drawOperations) |
|
|
|
{ |
|
|
|
operation.Dispose(); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private void DisposeDrawOperations() |
|
|
|
public bool Disposed { get; private set; } |
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
foreach (var operation in DrawOperations) |
|
|
|
{ |
|
|
|
operation.Dispose(); |
|
|
|
} |
|
|
|
_drawOperationsRefCounter?.Dispose(); |
|
|
|
|
|
|
|
Disposed = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|