Skip to content

Commit

Permalink
Changed area based undo working!
Browse files Browse the repository at this point in the history
  • Loading branch information
flabbet committed Dec 16, 2021
1 parent 6639709 commit c84b7bb
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 72 deletions.
2 changes: 1 addition & 1 deletion PixiEditor/Models/DataHolders/Document/Document.Layers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -362,9 +362,9 @@ public void RemoveLayer(int layerIndex, bool addToUndo = true)

bool wasActive = Layers[layerIndex].IsActive;

StorageBasedChange change = new(this, new[] { Layers[layerIndex] });
if (addToUndo)
{
StorageBasedChange change = new(this, new[] { Layers[layerIndex] });
UndoManager.AddUndoChange(
change.ToChange(RestoreLayersProcess, RemoveLayerProcess, new object[] { Layers[layerIndex].LayerGuid }));
}
Expand Down
11 changes: 6 additions & 5 deletions PixiEditor/Models/Tools/BitmapOperationTool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,12 @@ private void InitializeStorageBasedChange(SKRectI toolSessionRect)
if (toolSize != null)
{
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) });
}
Expand Down
120 changes: 54 additions & 66 deletions PixiEditor/Models/Undo/StorageBasedChange.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ public void SaveLayersOnDevice()
Surface targetSizeSurface = new Surface(finalRect.Width, finalRect.Height);

targetSizeSurface.SkiaSurface.Canvas.DrawImage(image, finalRect, SKRect.Create(0, 0, finalRect.Width, finalRect.Height), Surface.ReplacingPaint);
DebugSavePng(targetSizeSurface, storedLayer);

Exporter.SaveAsGZippedBytes(storedLayer.StoredPngLayerName, targetSizeSurface);
}
Expand All @@ -110,19 +109,6 @@ public void SaveLayersOnDevice()
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>
/// Loads saved layers from disk.
/// </summary>
Expand All @@ -134,58 +120,24 @@ public Layer[] LoadLayersFromDevice()
{
UndoLayer storedLayer = StoredLayers[i];
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
File.Delete(StoredLayers[i].StoredPngLayerName + ".png");
#endif

File.Delete(StoredLayers[i].StoredPngLayerName);
}

Expand Down Expand Up @@ -358,17 +310,53 @@ public static void BasicUndoProcess(Layer[] layers, UndoLayer[] data, object[] a
for (int i = 0; i < layers.Length; 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;
}
}
}

0 comments on commit c84b7bb

Please sign in to comment.