Просмотр исходного кода

Merge pull request #741 from PixiEditor/fixes/23.01.2025

Fixes/23.01.2025
Krzysztof Krysiński 7 месяцев назад
Родитель
Сommit
6eabde93a8

+ 28 - 6
src/PixiEditor/Models/Rendering/PreviewPainter.cs

@@ -89,7 +89,7 @@ public class PreviewPainter
     {
         painterInstances.Remove(requestId);
         dirtyTextures.Remove(requestId);
-        
+
         if (repaintingTextures.Contains(requestId))
         {
             pendingRemovals.Add(requestId);
@@ -126,13 +126,18 @@ public class PreviewPainter
                 continue;
             }
 
+            if (!painterInstances.TryGetValue(texture, out var painterInstance))
+            {
+                repaintingTextures.Remove(texture);
+                dirtyTextures.Remove(texture);
+                continue;
+            }
+
             repaintingTextures.Add(texture);
 
             renderTexture.DrawingSurface.Canvas.Clear();
             renderTexture.DrawingSurface.Canvas.Save();
 
-            PainterInstance painterInstance = painterInstances[texture];
-
             Matrix3X3? matrix = painterInstance.RequestMatrix?.Invoke();
 
             renderTexture.DrawingSurface.Canvas.SetMatrix(matrix ?? Matrix3X3.Identity);
@@ -146,9 +151,16 @@ public class PreviewPainter
                 {
                     Dispatcher.UIThread.Invoke(() =>
                     {
-                        if(pendingRemovals.Contains(texture))
+                        if (pendingRemovals.Contains(texture))
                         {
-                            renderTexture.Dispose();
+                            if (!renderTexture.IsDisposed)
+                            {
+                                try
+                                {
+                                    renderTexture.Dispose();
+                                } catch (Exception) { }
+                            }
+
                             renderTextures.Remove(texture);
                             pendingRemovals.Remove(texture);
                             pendingResizes.Remove(texture);
@@ -158,7 +170,17 @@ public class PreviewPainter
                         
                         if (renderTexture is { IsDisposed: false })
                         {
-                            renderTexture.DrawingSurface.Canvas.Restore();
+                            try
+                            {
+                                renderTexture.DrawingSurface.Canvas.Restore();
+                            }
+                            catch (Exception)
+                            {
+                                repaintingTextures.Remove(texture);
+                                dirtyTextures.Remove(texture);
+                                pendingResizes.Remove(texture);
+                                return;
+                            }
                         }
 
                         painterInstance.RequestRepaint?.Invoke();

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

@@ -638,7 +638,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
 
     protected void RenderFrame(PixelSize size)
     {
-        if (resources != null)
+        if (resources != null && !resources.IsDisposed)
         {
             if (size.Width == 0 || size.Height == 0)
             {