Browse Source

Fix crash when undoing, redoing, and undoing a no-op resize operation

Equbuxu 1 year ago
parent
commit
6746b68490

+ 1 - 7
src/PixiEditor.ChangeableDocument/Changes/Root/ClipCanvas_Change.cs

@@ -24,7 +24,7 @@ internal class ClipCanvas_Change : ResizeBasedChangeBase
             }
             }
         });
         });
 
 
-        if (!bounds.HasValue)
+        if (!bounds.HasValue || bounds.Value.IsZeroOrNegativeArea || bounds.Value == new RectI(VecI.Zero, target.Size))
         {
         {
             ignoreInUndo = true;
             ignoreInUndo = true;
             return new None();
             return new None();
@@ -48,12 +48,6 @@ internal class ClipCanvas_Change : ResizeBasedChangeBase
             
             
             Resize(member.Mask, member.GuidValue, newBounds.Size, -newBounds.Pos, deletedMaskChunks);
             Resize(member.Mask, member.GuidValue, newBounds.Size, -newBounds.Pos, deletedMaskChunks);
         });
         });
-        
-        if (newBounds.IsZeroOrNegativeArea)
-        {
-            ignoreInUndo = true;
-            return new None();
-        }
 
 
         ignoreInUndo = false;
         ignoreInUndo = false;
         return new Size_ChangeInfo(newBounds.Size, target.VerticalSymmetryAxisX, target.HorizontalSymmetryAxisY);
         return new Size_ChangeInfo(newBounds.Size, target.VerticalSymmetryAxisX, target.HorizontalSymmetryAxisY);

+ 3 - 3
src/PixiEditor.ChangeableDocument/Changes/Root/ResizeBasedChangeBase.cs

@@ -19,6 +19,9 @@ internal abstract class ResizeBasedChangeBase : Change
         return true;
         return true;
     }
     }
     
     
+    /// <summary>
+    /// Notice: this commits image changes, you won't have a chance to revert or set ignoreInUndo to true
+    /// </summary>
     protected virtual void Resize(ChunkyImage img, Guid memberGuid, VecI size, VecI offset, Dictionary<Guid, CommittedChunkStorage> deletedChunksDict)
     protected virtual void Resize(ChunkyImage img, Guid memberGuid, VecI size, VecI offset, Dictionary<Guid, CommittedChunkStorage> deletedChunksDict)
     {
     {
         img.EnqueueResize(size);
         img.EnqueueResize(size);
@@ -31,9 +34,6 @@ internal abstract class ResizeBasedChangeBase : Change
     
     
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
     {
-        if (target.Size == _originalSize)
-            return new None();
-
         target.Size = _originalSize;
         target.Size = _originalSize;
         target.ForEveryMember((member) =>
         target.ForEveryMember((member) =>
         {
         {