Browse Source

Changed area based undo working!

flabbet 3 years ago
parent
commit
c84b7bb14a

+ 1 - 1
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -362,9 +362,9 @@ namespace PixiEditor.Models.DataHolders
 
 
             bool wasActive = Layers[layerIndex].IsActive;
             bool wasActive = Layers[layerIndex].IsActive;
 
 
-            StorageBasedChange change = new(this, new[] { Layers[layerIndex] });
             if (addToUndo)
             if (addToUndo)
             {
             {
+                StorageBasedChange change = new(this, new[] { Layers[layerIndex] });
                 UndoManager.AddUndoChange(
                 UndoManager.AddUndoChange(
                     change.ToChange(RestoreLayersProcess, RemoveLayerProcess, new object[] { Layers[layerIndex].LayerGuid }));
                     change.ToChange(RestoreLayersProcess, RemoveLayerProcess, new object[] { Layers[layerIndex].LayerGuid }));
             }
             }

+ 6 - 5
PixiEditor/Models/Tools/BitmapOperationTool.cs

@@ -57,11 +57,12 @@ namespace PixiEditor.Models.Tools
             if (toolSize != null)
             if (toolSize != null)
             {
             {
                 int halfSize = (int)Math.Ceiling(toolSize.Value / 2f);
                 int halfSize = (int)Math.Ceiling(toolSize.Value / 2f);
-                finalRect = SKRectI.Create(
-                    Math.Max(toolSessionRect.Left - halfSize, 0),
-                    Math.Max(toolSessionRect.Top - halfSize, 0),
-                    toolSessionRect.Width + halfSize,
-                    toolSessionRect.Height + halfSize);
+                finalRect.Inflate(halfSize, halfSize);
+            }
+
+            if (toolSessionRect.IsEmpty)
+            {
+                finalRect = SKRectI.Create(0, 0, doc.ActiveLayer.MaxWidth, doc.ActiveLayer.MaxHeight);
             }
             }
             _change = new StorageBasedChange(doc, new[] { new LayerChunk(doc.ActiveLayer, finalRect) });
             _change = new StorageBasedChange(doc, new[] { new LayerChunk(doc.ActiveLayer, finalRect) });
         }
         }

+ 54 - 66
PixiEditor/Models/Undo/StorageBasedChange.cs

@@ -99,7 +99,6 @@ namespace PixiEditor.Models.Undo
                     Surface targetSizeSurface = new Surface(finalRect.Width, finalRect.Height);
                     Surface targetSizeSurface = new Surface(finalRect.Width, finalRect.Height);
 
 
                     targetSizeSurface.SkiaSurface.Canvas.DrawImage(image, finalRect, SKRect.Create(0, 0, finalRect.Width, finalRect.Height), Surface.ReplacingPaint);
                     targetSizeSurface.SkiaSurface.Canvas.DrawImage(image, finalRect, SKRect.Create(0, 0, finalRect.Width, finalRect.Height), Surface.ReplacingPaint);
-                    DebugSavePng(targetSizeSurface, storedLayer);
 
 
                     Exporter.SaveAsGZippedBytes(storedLayer.StoredPngLayerName, targetSizeSurface);
                     Exporter.SaveAsGZippedBytes(storedLayer.StoredPngLayerName, targetSizeSurface);
                 }
                 }
@@ -110,19 +109,6 @@ namespace PixiEditor.Models.Undo
             layersToStore = new List<Guid>();
             layersToStore = new List<Guid>();
         }
         }
 
 
-        [Conditional("DEBUG")]
-        private static void DebugSavePng(Surface surface, UndoLayer storedLayer)
-        {
-            //Debug png visualization
-            using var targetSizeImage = surface.SkiaSurface.Snapshot();
-            using (var data = targetSizeImage.Encode(SKEncodedImageFormat.Png, 80))
-            using (var stream = File.OpenWrite(storedLayer.StoredPngLayerName + ".png"))
-            {
-                // save the data to a stream
-                data.SaveTo(stream);
-            }
-        }
-
         /// <summary>
         /// <summary>
         /// Loads saved layers from disk.
         /// Loads saved layers from disk.
         /// </summary>
         /// </summary>
@@ -134,58 +120,24 @@ namespace PixiEditor.Models.Undo
             {
             {
                 UndoLayer storedLayer = StoredLayers[i];
                 UndoLayer storedLayer = StoredLayers[i];
                 var bitmap = Importer.LoadFromGZippedBytes(storedLayer.StoredPngLayerName);
                 var bitmap = Importer.LoadFromGZippedBytes(storedLayer.StoredPngLayerName);
-                var foundLayer = Document.Layers.FirstOrDefault(x => x.LayerGuid == storedLayer.LayerGuid);
-                if (foundLayer != null)
-                {
-                    Surface targetSizeSurface = new Surface(storedLayer.Width, storedLayer.Height);
-                    using var foundLayerSnapshot = foundLayer.LayerBitmap.SkiaSurface.Snapshot();
-                    targetSizeSurface.SkiaSurface.Canvas.DrawImage(
-                        foundLayerSnapshot,
-                        SKRect.Create(storedLayer.OffsetX - foundLayer.OffsetX, storedLayer.OffsetY - foundLayer.OffsetY, storedLayer.Width, storedLayer.Height),
-                        SKRect.Create(0, 0, storedLayer.Width, storedLayer.Height),
-                        Surface.ReplacingPaint);
-
-                    foundLayer.Offset = new Thickness(storedLayer.OffsetX, storedLayer.OffsetY, 0, 0);
-
-                    SKRect finalRect = SKRect.Create(
-                        storedLayer.SerializedRect.Left - foundLayer.OffsetX,
-                        storedLayer.SerializedRect.Top - foundLayer.OffsetY,
-                        storedLayer.SerializedRect.Width,
-                        storedLayer.SerializedRect.Height);
-
-                    using var snapshot = bitmap.SkiaSurface.Snapshot();
-
-                    targetSizeSurface.SkiaSurface.Canvas.DrawImage(
-                        snapshot,
-                        finalRect,
-                        Surface.ReplacingPaint);
-
-                    foundLayer.LayerBitmap = targetSizeSurface;
-
-                    layers[i] = foundLayer;
-                }
-                else
+                layers[i] = new Layer(storedLayer.Name, bitmap)
                 {
                 {
-                    layers[i] = new Layer(storedLayer.Name, bitmap)
-                    {
-                        Width = storedLayer.Width,
-                        Height = storedLayer.Height,
-                        Offset = new Thickness(storedLayer.OffsetX, storedLayer.OffsetY, 0, 0),
-                        Opacity = storedLayer.Opacity,
-                        MaxWidth = storedLayer.MaxWidth,
-                        MaxHeight = storedLayer.MaxHeight,
-                        IsVisible = storedLayer.IsVisible,
-                        IsActive = storedLayer.IsActive,
-                        LayerHighlightColor = storedLayer.LayerHighlightColor
-                    };
-
-                    layers[i].ChangeGuid(storedLayer.LayerGuid);
-                }
+                    Width = storedLayer.Width,
+                    Height = storedLayer.Height,
+                    Offset = new Thickness(storedLayer.OffsetX, storedLayer.OffsetY, 0, 0),
+                    Opacity = storedLayer.Opacity,
+                    MaxWidth = storedLayer.MaxWidth,
+                    MaxHeight = storedLayer.MaxHeight,
+                    IsVisible = storedLayer.IsVisible,
+                    IsActive = storedLayer.IsActive,
+                    LayerHighlightColor = storedLayer.LayerHighlightColor
+                };
+
+                layers[i].ChangeGuid(storedLayer.LayerGuid);
 
 
 #if DEBUG
 #if DEBUG
                 File.Delete(StoredLayers[i].StoredPngLayerName + ".png");
                 File.Delete(StoredLayers[i].StoredPngLayerName + ".png");
 #endif
 #endif
-
                 File.Delete(StoredLayers[i].StoredPngLayerName);
                 File.Delete(StoredLayers[i].StoredPngLayerName);
             }
             }
 
 
@@ -358,17 +310,53 @@ namespace PixiEditor.Models.Undo
                 for (int i = 0; i < layers.Length; i++)
                 for (int i = 0; i < layers.Length; i++)
                 {
                 {
                     Layer layer = layers[i];
                     Layer layer = layers[i];
+                    UndoLayer layerData = data[i];
+                    var foundLayer = document.Layers.FirstOrDefault(x => x.LayerGuid == layerData.LayerGuid);
 
 
-                    document.RemoveLayer(data[i].LayerIndex, false);
-                    document.Layers.Insert(data[i].LayerIndex, layer);
+                    if (foundLayer != null)
+                    {
+                        ApplyChunkToLayer(foundLayer, layerData, layer.LayerBitmap);
+                    }
+                    else
+                    {
+                        document.RemoveLayer(layerData.LayerIndex, false);
+                        document.Layers.Insert(layerData.LayerIndex, layer);
+                    }
 
 
-                    if (data[i].IsActive)
+                    if (layerData.IsActive)
                     {
                     {
-                        document.SetMainActiveLayer(data[i].LayerIndex);
+                        document.SetMainActiveLayer(layerData.LayerIndex);
                     }
                     }
                 }
                 }
-
             }
             }
         }
         }
+
+        private static void ApplyChunkToLayer(Layer layer, UndoLayer layerData, Surface chunk)
+        {
+            Surface targetSizeSurface = new Surface(layerData.Width, layerData.Height);
+            using var foundLayerSnapshot = layer.LayerBitmap.SkiaSurface.Snapshot();
+            targetSizeSurface.SkiaSurface.Canvas.DrawImage(
+                foundLayerSnapshot,
+                SKRect.Create(layerData.OffsetX - layer.OffsetX, layerData.OffsetY - layer.OffsetY, layerData.Width, layerData.Height),
+                SKRect.Create(0, 0, layerData.Width, layerData.Height),
+                Surface.ReplacingPaint);
+
+            layer.Offset = new Thickness(layerData.OffsetX, layerData.OffsetY, 0, 0);
+
+            SKRect finalRect = SKRect.Create(
+                layerData.SerializedRect.Left - layer.OffsetX,
+                layerData.SerializedRect.Top - layer.OffsetY,
+                layerData.SerializedRect.Width,
+                layerData.SerializedRect.Height);
+
+            using var snapshot = chunk.SkiaSurface.Snapshot();
+
+            targetSizeSurface.SkiaSurface.Canvas.DrawImage(
+                snapshot,
+                finalRect,
+                Surface.ReplacingPaint);
+
+            layer.LayerBitmap = targetSizeSurface;
+        }
     }
     }
 }
 }