Browse Source

Flip Image works

flabbet 2 years ago
parent
commit
2b1c107901

+ 34 - 36
src/PixiEditor.ChangeableDocument/Changes/Root/FlipImage_Change.cs

@@ -11,7 +11,7 @@ namespace PixiEditor.ChangeableDocument.Changes.Root;
 internal sealed class FlipImage_Change : Change
 internal sealed class FlipImage_Change : Change
 {
 {
     private readonly FlipType flipType;
     private readonly FlipType flipType;
-    
+
     [GenerateMakeChangeAction]
     [GenerateMakeChangeAction]
     public FlipImage_Change(FlipType flipType)
     public FlipImage_Change(FlipType flipType)
     {
     {
@@ -25,23 +25,7 @@ internal sealed class FlipImage_Change : Change
 
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
     {
-        List<IChangeInfo> changes = new List<IChangeInfo>();
-
-        target.ForEveryMember(member =>
-        {
-            if (member is Layer layer)
-            {
-                FlipImage(layer.LayerImage);
-                changes.Add(new LayerImageChunks_ChangeInfo(member.GuidValue, layer.LayerImage.FindAffectedChunks()));
-                layer.LayerImage.CommitChanges();
-            }
-
-            if (member.Mask is not null)
-            {
-                FlipImage(member.Mask);
-                member.Mask.CommitChanges();
-            }
-        });
+        var changes = Flip(target);
         
         
         ignoreInUndo = false;
         ignoreInUndo = false;
         return changes;
         return changes;
@@ -54,7 +38,7 @@ internal sealed class FlipImage_Change : Change
             BlendMode = DrawingApi.Core.Surface.BlendMode.Src
             BlendMode = DrawingApi.Core.Surface.BlendMode.Src
         };
         };
         
         
-        /*using Surface originalSurface = new(img.LatestSize);
+        using Surface originalSurface = new(img.LatestSize);
         img.DrawMostUpToDateRegionOn(
         img.DrawMostUpToDateRegionOn(
             new(VecI.Zero, img.LatestSize), 
             new(VecI.Zero, img.LatestSize), 
             ChunkResolution.Full,
             ChunkResolution.Full,
@@ -62,31 +46,45 @@ internal sealed class FlipImage_Change : Change
             VecI.Zero);
             VecI.Zero);
 
 
         using Surface flipped = new Surface(img.LatestSize);
         using Surface flipped = new Surface(img.LatestSize);
+
+        bool flipX = flipType == FlipType.Horizontal;
+        bool flipY = flipType == FlipType.Vertical;
         
         
         flipped.DrawingSurface.Canvas.Save();
         flipped.DrawingSurface.Canvas.Save();
-        flipped.DrawingSurface.Canvas.Scale(flipType == FlipType.Horizontal ? -1 : 1, flipType == FlipType.Vertical ? -1 : 1);
+                flipped.DrawingSurface.Canvas.Scale(flipX ? -1 : 1, flipY ? -1 : 1, flipX ? img.LatestSize.X / 2f : 0,
+            flipY ? img.LatestSize.Y / 2f : 0f);
         flipped.DrawingSurface.Canvas.DrawSurface(originalSurface.DrawingSurface, 0, 0, paint);
         flipped.DrawingSurface.Canvas.DrawSurface(originalSurface.DrawingSurface, 0, 0, paint);
-        flipped.DrawingSurface.Canvas.Restore();*/
-
-        ChunkyImage copy = img.CloneFromCommitted();
-        using Surface originalSurface = new(img.LatestSize);
-        img.DrawMostUpToDateRegionOn(
-            new(VecI.Zero, img.LatestSize), 
-            ChunkResolution.Full,
-            originalSurface.DrawingSurface,
-            VecI.Zero);
+        flipped.DrawingSurface.Canvas.Restore();
         
         
         img.EnqueueClear();
         img.EnqueueClear();
-        Matrix3X3 matrix = Matrix3X3.Identity;
-
-        matrix.ScaleX = -1f;
-        img.EnqueueDrawImage(matrix, originalSurface, paint);
-
-        //img.EnqueueDrawChunkyImage(VecI.Zero, copy, flipType == FlipType.Horizontal, flipType == FlipType.Vertical);
+        img.EnqueueDrawImage(VecI.Zero, flipped);
     }
     }
 
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
     {
-        return new None();
+        return Flip(target);
+    }
+
+    private OneOf<None, IChangeInfo, List<IChangeInfo>> Flip(Document target)
+    {
+        List<IChangeInfo> changes = new List<IChangeInfo>();
+
+        target.ForEveryMember(member =>
+        {
+            if (member is Layer layer)
+            {
+                FlipImage(layer.LayerImage);
+                changes.Add(new LayerImageChunks_ChangeInfo(member.GuidValue, layer.LayerImage.FindAffectedChunks()));
+                layer.LayerImage.CommitChanges();
+            }
+
+            if (member.Mask is not null)
+            {
+                FlipImage(member.Mask);
+                member.Mask.CommitChanges();
+            }
+        });
+
+        return changes;
     }
     }
 }
 }

+ 9 - 0
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentManagerViewModel.cs

@@ -66,6 +66,15 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>
         
         
         ActiveDocument?.Operations.FlipImage(FlipType.Horizontal);
         ActiveDocument?.Operations.FlipImage(FlipType.Horizontal);
     }
     }
+    
+    [Command.Basic("PixiEditor.Document.FlipImageVertical", "Flip Image Vertically", "Flip Image Vertically", CanExecute = "PixiEditor.HasDocument")]
+    public void FlipImageVertically()
+    {
+        if (ActiveDocument is null)
+            return;
+        
+        ActiveDocument?.Operations.FlipImage(FlipType.Vertical);
+    }
 
 
     [Command.Basic("PixiEditor.Document.ToggleVerticalSymmetryAxis", "Toggle vertical symmetry axis", "Toggle vertical symmetry axis", CanExecute = "PixiEditor.HasDocument", IconPath = "SymmetryVertical.png")]
     [Command.Basic("PixiEditor.Document.ToggleVerticalSymmetryAxis", "Toggle vertical symmetry axis", "Toggle vertical symmetry axis", CanExecute = "PixiEditor.HasDocument", IconPath = "SymmetryVertical.png")]
     public void ToggleVerticalSymmetryAxis()
     public void ToggleVerticalSymmetryAxis()