Skip to content

Commit

Permalink
Rewrite ApplyChunksToLayer
Browse files Browse the repository at this point in the history
  • Loading branch information
Equbuxu committed Feb 16, 2022
1 parent a5ed89e commit d8d41b2
Showing 1 changed file with 7 additions and 46 deletions.
53 changes: 7 additions & 46 deletions PixiEditor/Models/Undo/StorageBasedChange.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using PixiEditor.Models.DataHolders;
using PixiEditor.Helpers.Extensions;
using PixiEditor.Models.DataHolders;
using PixiEditor.Models.IO;
using PixiEditor.Models.Layers;
using SkiaSharp;
Expand Down Expand Up @@ -354,7 +355,7 @@ public static void BasicUndoProcess(Layer[] layers, UndoLayer[] data, object[] a

if (foundLayer != null)
{
ApplyChunkToLayer(foundLayer, layerData, layer.LayerBitmap);
ApplyChunkToLayer(foundLayer, layerData.SerializedRect, layer.LayerBitmap);
}
else
{
Expand All @@ -370,52 +371,12 @@ public static void BasicUndoProcess(Layer[] layers, UndoLayer[] data, object[] a
}
}

private static void ApplyChunkToLayer(Layer layer, UndoLayer layerData, Surface chunk)
private static void ApplyChunkToLayer(Layer layer, SKRectI rect, Surface chunk)
{
int targetWidth = Math.Max(chunk.Width, layer.Width);
int targetHeight = Math.Max(chunk.Height, layer.Height);

int targetOffsetX = Math.Min(layerData.OffsetX, layerData.SerializedRect.Left);
int targetOffsetY = Math.Min(layerData.OffsetY, layerData.SerializedRect.Top);

int offsetDiffX = layerData.OffsetX - layerData.SerializedRect.Left;
int offsetDiffY = layerData.OffsetY - layerData.SerializedRect.Top;

targetWidth += Math.Abs(offsetDiffX);
targetHeight += Math.Abs(offsetDiffY);

targetOffsetX = Math.Max(0, targetOffsetX);
targetOffsetY = Math.Max(0, targetOffsetY);

targetWidth = Math.Clamp(targetWidth, 0, layerData.MaxWidth - targetOffsetX);
targetHeight = Math.Clamp(targetHeight, 0, layerData.MaxHeight - targetOffsetY);

Surface targetSizeSurface = new Surface(targetWidth, targetHeight);
using var foundLayerSnapshot = layer.LayerBitmap.SkiaSurface.Snapshot();
targetSizeSurface.SkiaSurface.Canvas.DrawImage(
foundLayerSnapshot,
SKRect.Create(0, 0, layer.Width, layer.Height),
SKRect.Create(offsetDiffX > 0 ? layer.OffsetX : 0, offsetDiffY > 0 ? layer.OffsetY : 0, layer.Width, layer.Height),
Surface.ReplacingPaint);

layer.Offset = new Thickness(targetOffsetX, targetOffsetY, 0, 0);

SKRect finalRect = SKRect.Create(
layerData.SerializedRect.Left - targetOffsetX,
layerData.SerializedRect.Top - targetOffsetY,
layerData.SerializedRect.Width,
layerData.SerializedRect.Height);

layer.DynamicResizeAbsolute(rect.ToInt32Rect());
using var snapshot = chunk.SkiaSurface.Snapshot();

targetSizeSurface.SkiaSurface.Canvas.DrawImage(
snapshot,
finalRect,
Surface.ReplacingPaint);

//DebugSavePng(targetSizeSurface, layerData);

layer.LayerBitmap = targetSizeSurface;
layer.LayerBitmap.SkiaSurface.Canvas.DrawImage(snapshot, new SKPoint(rect.Left - layer.OffsetX, rect.Top - layer.OffsetY), Surface.ReplacingPaint);
layer.InvokeLayerBitmapChange(rect.ToInt32Rect());
}

public void Dispose()
Expand Down

0 comments on commit d8d41b2

Please sign in to comment.