ResizeBasedChangeBase.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using PixiEditor.ChangeableDocument.ChangeInfos.Root;
  2. using PixiEditor.DrawingApi.Core.Numerics;
  3. namespace PixiEditor.ChangeableDocument.Changes.Root;
  4. internal abstract class ResizeBasedChangeBase : Change
  5. {
  6. protected VecI _originalSize;
  7. protected int _originalHorAxisY;
  8. protected int _originalVerAxisX;
  9. protected Dictionary<Guid, CommittedChunkStorage> deletedChunks = new();
  10. protected Dictionary<Guid, CommittedChunkStorage> deletedMaskChunks = new();
  11. public override bool InitializeAndValidate(Document target)
  12. {
  13. _originalSize = target.Size;
  14. _originalHorAxisY = target.HorizontalSymmetryAxisY;
  15. _originalVerAxisX = target.VerticalSymmetryAxisX;
  16. return true;
  17. }
  18. protected virtual void Resize(ChunkyImage img, Guid memberGuid, VecI size, VecI offset, Dictionary<Guid, CommittedChunkStorage> deletedChunksDict)
  19. {
  20. img.EnqueueResize(size);
  21. img.EnqueueClear();
  22. img.EnqueueDrawChunkyImage(offset, img);
  23. deletedChunksDict.Add(memberGuid, new CommittedChunkStorage(img, img.FindAffectedChunks()));
  24. img.CommitChanges();
  25. }
  26. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
  27. {
  28. target.Size = _originalSize;
  29. target.ForEveryMember((member) =>
  30. {
  31. if (member is Layer layer)
  32. {
  33. layer.LayerImage.EnqueueResize(_originalSize);
  34. deletedChunks[layer.GuidValue].ApplyChunksToImage(layer.LayerImage);
  35. layer.LayerImage.CommitChanges();
  36. }
  37. if (member.Mask is null)
  38. return;
  39. member.Mask.EnqueueResize(_originalSize);
  40. deletedMaskChunks[member.GuidValue].ApplyChunksToImage(member.Mask);
  41. member.Mask.CommitChanges();
  42. });
  43. target.HorizontalSymmetryAxisY = _originalHorAxisY;
  44. target.VerticalSymmetryAxisX = _originalVerAxisX;
  45. DisposeDeletedChunks();
  46. return new Size_ChangeInfo(_originalSize, _originalVerAxisX, _originalHorAxisY);
  47. }
  48. private void DisposeDeletedChunks()
  49. {
  50. foreach (var stored in deletedChunks)
  51. stored.Value.Dispose();
  52. deletedChunks = new();
  53. foreach (var stored in deletedMaskChunks)
  54. stored.Value.Dispose();
  55. deletedMaskChunks = new();
  56. }
  57. public override void Dispose()
  58. {
  59. DisposeDeletedChunks();
  60. }
  61. }