Browse Source

Fixed access violation on delete issue

flabbet 10 months ago
parent
commit
f207dbc365

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/StructureNode.cs

@@ -234,6 +234,7 @@ public abstract class StructureNode : Node, IReadOnlyStructureNode, IBackgroundI
 
     public override void Dispose()
     {
+        Output.Value = null;
         base.Dispose();
         maskPaint.Dispose();
         blendPaint.Dispose();

+ 1 - 0
src/PixiEditor.DrawingApi.Core/Bridge/Operations/ISurfaceImplementation.cs

@@ -20,5 +20,6 @@ public interface ISurfaceImplementation
     public void Flush(DrawingSurface drawingSurface);
     public DrawingSurface FromNative(object native);
     public RectI GetDeviceClipBounds(DrawingSurface surface);
+    public void Unmanage(DrawingSurface surface);
 }
 

+ 5 - 0
src/PixiEditor.DrawingApi.Core/Surfaces/DrawingSurface.cs

@@ -91,5 +91,10 @@ namespace PixiEditor.DrawingApi.Core.Surfaces
         {
             return DrawingBackendApi.Current.SurfaceImplementation.FromNative(native);
         }
+
+        public static void Unmanage(DrawingSurface surface)
+        {
+            DrawingBackendApi.Current.SurfaceImplementation.Unmanage(surface);
+        }
     }
 }

+ 6 - 0
src/PixiEditor.DrawingApi.Skia/Implementations/SkiaSurfaceImplementation.cs

@@ -172,5 +172,11 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
             SKRectI rect = ManagedInstances[surface.ObjectPointer].Canvas.DeviceClipBounds;
             return new RectI(rect.Left, rect.Top, rect.Width, rect.Height);
         }
+
+        public void Unmanage(DrawingSurface surface)
+        {
+            _canvasImplementation.ManagedInstances.TryRemove(surface.Canvas.ObjectPointer, out _);
+            ManagedInstances.TryRemove(surface.ObjectPointer, out _);
+        }
     }
 }

+ 1 - 0
src/PixiEditor/Views/Rendering/Scene.cs

@@ -546,6 +546,7 @@ internal class DrawSceneOperation : SkiaDrawOperation
         RenderScene?.Invoke(surface);
 
         canvas.RestoreToCount(count);
+        DrawingSurface.Unmanage(surface);
     }
 
     private void RenderOnionSkin(SKCanvas canvas, SKPaint paint)