Przeglądaj źródła

Fixed resize bug!

Krzysztof Krysiński 3 lat temu
rodzic
commit
fb3be16386

+ 20 - 2
PixiEditor/Models/DataHolders/Document/Document.Operations.cs

@@ -7,6 +7,7 @@ using SkiaSharp;
 using System;
 using System;
 using System.Linq;
 using System.Linq;
 using System.Windows;
 using System.Windows;
+using Windows.Graphics;
 
 
 namespace PixiEditor.Models.DataHolders
 namespace PixiEditor.Models.DataHolders
 {
 {
@@ -31,12 +32,19 @@ namespace PixiEditor.Models.DataHolders
             int offsetX = GetOffsetXForAnchor(Width, width, anchor);
             int offsetX = GetOffsetXForAnchor(Width, width, anchor);
             int offsetY = GetOffsetYForAnchor(Height, height, anchor);
             int offsetY = GetOffsetYForAnchor(Height, height, anchor);
 
 
+            int widthDiff = width - oldWidth;
+            int heightDiff = height - oldHeight;
+
+            PixelSize diff = new PixelSize(widthDiff, heightDiff);
+
             Thickness[] oldOffsets = Layers.Select(x => x.Offset).ToArray();
             Thickness[] oldOffsets = Layers.Select(x => x.Offset).ToArray();
+            PixelSize[] oldRects = Layers.Select(x => x.GetSize()).ToArray();
+            PixelSize[] newRects = Layers.Select(x => x.GetSize() + diff).ToArray();
             Thickness[] newOffsets = Layers.Select(x => new Thickness(offsetX + x.OffsetX, offsetY + x.OffsetY, 0, 0))
             Thickness[] newOffsets = Layers.Select(x => new Thickness(offsetX + x.OffsetX, offsetY + x.OffsetY, 0, 0))
                 .ToArray();
                 .ToArray();
 
 
-            object[] processArgs = { newOffsets, width, height };
-            object[] reverseProcessArgs = { oldOffsets, Width, Height };
+            object[] processArgs = { newOffsets, width, height, newRects };
+            object[] reverseProcessArgs = { oldOffsets, Width, Height, oldRects };
 
 
             ResizeCanvas(newOffsets, width, height);
             ResizeCanvas(newOffsets, width, height);
             UndoManager.AddUndoChange(new Change(
             UndoManager.AddUndoChange(new Change(
@@ -269,8 +277,18 @@ namespace PixiEditor.Models.DataHolders
             Thickness[] offset = (Thickness[])arguments[0];
             Thickness[] offset = (Thickness[])arguments[0];
             int width = (int)arguments[1];
             int width = (int)arguments[1];
             int height = (int)arguments[2];
             int height = (int)arguments[2];
+            PixelSize[] layersBounds = (PixelSize[])arguments[3];
             ResizeCanvas(offset, width, height);
             ResizeCanvas(offset, width, height);
+            RestoreLayerBounds(layersBounds);
             DocumentSizeChanged?.Invoke(this, new DocumentSizeChangedEventArgs(oldWidth, oldHeight, width, height));
             DocumentSizeChanged?.Invoke(this, new DocumentSizeChangedEventArgs(oldWidth, oldHeight, width, height));
         }
         }
+
+        private void RestoreLayerBounds(PixelSize[] layersBounds)
+        {
+            for (int i = 0; i < layersBounds.Length; i++)
+            {
+                Layers[i].DynamicResizeAbsolute(new Int32Rect(Layers[i].OffsetX, Layers[i].OffsetY, layersBounds[i].Width, layersBounds[i].Height));
+            }
+        }
     }
     }
 }
 }

+ 4 - 2
PixiEditor/Models/DataHolders/Document/Document.cs

@@ -132,11 +132,13 @@ namespace PixiEditor.Models.DataHolders
             Thickness[] oldOffsets = Layers.Select(x => x.Offset).ToArray();
             Thickness[] oldOffsets = Layers.Select(x => x.Offset).ToArray();
             int oldWidth = Width;
             int oldWidth = Width;
             int oldHeight = Height;
             int oldHeight = Height;
+            PixelSize diff = new PixelSize(width - oldWidth, height - oldHeight);
+            PixelSize[] oldSize = Layers.Select(x => x.GetSize()).ToArray();
 
 
             MoveOffsets(Layers, moveVector);
             MoveOffsets(Layers, moveVector);
 
 
-            object[] reverseArguments = { oldOffsets, oldWidth, oldHeight };
-            object[] processArguments = { Layers.Select(x => x.Offset).ToArray(), width, height };
+            object[] reverseArguments = { oldOffsets, oldWidth, oldHeight, oldSize };
+            object[] processArguments = { Layers.Select(x => x.Offset).ToArray(), width, height, Layers.Select(x => x.GetSize() + diff).ToArray() };
 
 
             ResizeCanvasProcess(processArguments);
             ResizeCanvasProcess(processArguments);
 
 

+ 22 - 0
PixiEditor/Models/DataHolders/PixelSize.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PixiEditor.Models.DataHolders
+{
+    public struct PixelSize
+    {
+        public int Height { get; set; }
+        public int Width { get; set; }
+
+        public PixelSize(int height, int width)
+        {
+            Height = height;
+            Width = width;
+        }
+
+        public static PixelSize operator +(PixelSize first, PixelSize second) => new PixelSize(first.Width + second.Width, first.Height + second.Height);
+    }
+}

+ 2 - 0
PixiEditor/Models/Layers/Layer.cs

@@ -9,6 +9,7 @@ using System.Collections.Generic;
 using System.Diagnostics;
 using System.Diagnostics;
 using System.Linq;
 using System.Linq;
 using System.Windows;
 using System.Windows;
+using Windows.Graphics;
 
 
 namespace PixiEditor.Models.Layers
 namespace PixiEditor.Models.Layers
 {
 {
@@ -525,6 +526,7 @@ namespace PixiEditor.Models.Layers
         }
         }
 
 
         public SKRectI GetRect() => SKRectI.Create(OffsetX, OffsetY, Width, Height);
         public SKRectI GetRect() => SKRectI.Create(OffsetX, OffsetY, Width, Height);
+        public PixelSize GetSize() => new PixelSize(Width, Height);
 
 
         public void CropIntersect(SKRectI rect)
         public void CropIntersect(SKRectI rect)
         {
         {

+ 1 - 1
PixiEditor/Models/Tools/BitmapOperationTool.cs

@@ -56,7 +56,7 @@ namespace PixiEditor.Models.Tools
             Document doc = ViewModels.ViewModelMain.Current.BitmapManager.ActiveDocument;
             Document doc = ViewModels.ViewModelMain.Current.BitmapManager.ActiveDocument;
             var toolSize = Toolbar.GetSetting<SizeSetting>("ToolSize");
             var toolSize = Toolbar.GetSetting<SizeSetting>("ToolSize");
             SKRectI finalRect = toolSessionRect;
             SKRectI finalRect = toolSessionRect;
-            if (toolSize != null)
+            if (toolSize != null && toolSize.Value > 1)
             {
             {
                 int halfSize = (int)Math.Ceiling(toolSize.Value / 2f);
                 int halfSize = (int)Math.Ceiling(toolSize.Value / 2f);
                 finalRect.Inflate(halfSize, halfSize);
                 finalRect.Inflate(halfSize, halfSize);

+ 19 - 2
PixiEditor/Models/Undo/StorageBasedChange.cs

@@ -98,6 +98,8 @@ namespace PixiEditor.Models.Undo
 
 
                     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);
                 }
                 }
 
 
@@ -112,7 +114,7 @@ namespace PixiEditor.Models.Undo
         {
         {
             //Debug png visualization
             //Debug png visualization
             using var targetSizeImage = surface.SkiaSurface.Snapshot();
             using var targetSizeImage = surface.SkiaSurface.Snapshot();
-            using (var data = targetSizeImage.Encode(SKEncodedImageFormat.Png, 80))
+            using (var data = targetSizeImage.Encode(SKEncodedImageFormat.Png, 100))
             using (var stream = File.OpenWrite(storedLayer.StoredPngLayerName + ".png"))
             using (var stream = File.OpenWrite(storedLayer.StoredPngLayerName + ".png"))
             {
             {
                 // save the data to a stream
                 // save the data to a stream
@@ -360,6 +362,19 @@ namespace PixiEditor.Models.Undo
             int targetOffsetX = Math.Min(layerData.OffsetX, layerData.SerializedRect.Left);
             int targetOffsetX = Math.Min(layerData.OffsetX, layerData.SerializedRect.Left);
             int targetOffsetY = Math.Min(layerData.OffsetY, layerData.SerializedRect.Top);
             int targetOffsetY = Math.Min(layerData.OffsetY, layerData.SerializedRect.Top);
 
 
+            bool applyOffsetDiffX = layerData.OffsetX < layerData.SerializedRect.Left && chunk.Width > layer.Width;
+            bool applyOffsetDiffY = layerData.OffsetY < layerData.SerializedRect.Top && chunk.Height > layer.Height;
+
+            if(applyOffsetDiffX)
+            {
+                targetWidth += layerData.SerializedRect.Left;
+            }
+
+            if(applyOffsetDiffY)
+            {
+                targetHeight += layerData.SerializedRect.Top;
+            }
+
             targetOffsetX = Math.Max(0, targetOffsetX);
             targetOffsetX = Math.Max(0, targetOffsetX);
             targetOffsetY = Math.Max(0, targetOffsetY);
             targetOffsetY = Math.Max(0, targetOffsetY);
 
 
@@ -375,7 +390,7 @@ namespace PixiEditor.Models.Undo
 
 
             SKRect finalRect = SKRect.Create(
             SKRect finalRect = SKRect.Create(
                 layerData.SerializedRect.Left - layer.OffsetX,
                 layerData.SerializedRect.Left - layer.OffsetX,
-                layerData.SerializedRect.Top - layer.OffsetY,
+                layerData.SerializedRect.Top - layer.OffsetY, 
                 layerData.SerializedRect.Width,
                 layerData.SerializedRect.Width,
                 layerData.SerializedRect.Height);
                 layerData.SerializedRect.Height);
 
 
@@ -386,6 +401,8 @@ namespace PixiEditor.Models.Undo
                 finalRect,
                 finalRect,
                 Surface.ReplacingPaint);
                 Surface.ReplacingPaint);
 
 
+            //DebugSavePng(targetSizeSurface, layerData);
+
             layer.LayerBitmap = targetSizeSurface;
             layer.LayerBitmap = targetSizeSurface;
         }
         }