ClipCanvas_Change.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
  2. using PixiEditor.ChangeableDocument.ChangeInfos.Root;
  3. using PixiEditor.DrawingApi.Core.Numerics;
  4. using PixiEditor.Numerics;
  5. namespace PixiEditor.ChangeableDocument.Changes.Root;
  6. internal class ClipCanvas_Change : ResizeBasedChangeBase
  7. {
  8. private int frameToClip;
  9. [GenerateMakeChangeAction]
  10. public ClipCanvas_Change(int clipToFrame)
  11. {
  12. frameToClip = clipToFrame;
  13. }
  14. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
  15. {
  16. RectI? bounds = null;
  17. target.ForEveryMember((member) =>
  18. {
  19. if (member is LayerNode layer)
  20. {
  21. var layerBounds = layer.GetTightBounds(frameToClip);
  22. if (layerBounds.HasValue)
  23. {
  24. bounds ??= (RectI)layerBounds.Value;
  25. bounds = bounds.Value.Union((RectI)layerBounds.Value);
  26. }
  27. }
  28. });
  29. if (!bounds.HasValue || bounds.Value.IsZeroOrNegativeArea || bounds.Value == new RectI(VecI.Zero, target.Size))
  30. {
  31. ignoreInUndo = true;
  32. return new None();
  33. }
  34. RectI newBounds = bounds.Value;
  35. target.Size = newBounds.Size;
  36. target.VerticalSymmetryAxisX = Math.Clamp(_originalVerAxisX, 0, target.Size.X);
  37. target.HorizontalSymmetryAxisY = Math.Clamp(_originalHorAxisY, 0, target.Size.Y);
  38. target.ForEveryMember((member) =>
  39. {
  40. if (member is ImageLayerNode layer)
  41. {
  42. layer.ForEveryFrame(img =>
  43. {
  44. Resize(img, layer.Id, newBounds.Size, -newBounds.Pos, deletedChunks);
  45. });
  46. }
  47. if (member.EmbeddedMask is null)
  48. return;
  49. Resize(member.EmbeddedMask, member.Id, newBounds.Size, -newBounds.Pos, deletedMaskChunks);
  50. });
  51. ignoreInUndo = false;
  52. return new Size_ChangeInfo(newBounds.Size, target.VerticalSymmetryAxisX, target.HorizontalSymmetryAxisY);
  53. }
  54. }