DrawEllipse_UpdateableChange.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using SkiaSharp;
  2. namespace PixiEditor.ChangeableDocument.Changes.Drawing;
  3. internal class DrawEllipse_UpdateableChange : UpdateableChange
  4. {
  5. private readonly Guid memberGuid;
  6. private RectI location;
  7. private readonly SKColor strokeColor;
  8. private readonly SKColor fillColor;
  9. private readonly int strokeWidth;
  10. private readonly bool drawOnMask;
  11. private CommittedChunkStorage? storedChunks;
  12. [GenerateUpdateableChangeActions]
  13. public DrawEllipse_UpdateableChange(Guid memberGuid, RectI location, SKColor strokeColor, SKColor fillColor, int strokeWidth, bool drawOnMask)
  14. {
  15. this.memberGuid = memberGuid;
  16. this.location = location;
  17. this.strokeColor = strokeColor;
  18. this.fillColor = fillColor;
  19. this.strokeWidth = strokeWidth;
  20. this.drawOnMask = drawOnMask;
  21. }
  22. [UpdateChangeMethod]
  23. public void Update(RectI location)
  24. {
  25. this.location = location;
  26. }
  27. public override OneOf<Success, Error> InitializeAndValidate(Document target)
  28. {
  29. if (!DrawingChangeHelper.IsValidForDrawing(target, memberGuid, drawOnMask))
  30. return new Error();
  31. return new Success();
  32. }
  33. private HashSet<VecI> UpdateEllipse(Document target, ChunkyImage targetImage)
  34. {
  35. var oldAffectedChunks = targetImage.FindAffectedChunks();
  36. targetImage.CancelChanges();
  37. DrawingChangeHelper.ApplyClipsSymmetriesEtc(target, targetImage, memberGuid, drawOnMask);
  38. targetImage.EnqueueDrawEllipse(location, strokeColor, fillColor, strokeWidth);
  39. var affectedChunks = targetImage.FindAffectedChunks();
  40. affectedChunks.UnionWith(oldAffectedChunks);
  41. return affectedChunks;
  42. }
  43. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, out bool ignoreInUndo)
  44. {
  45. var image = DrawingChangeHelper.GetTargetImageOrThrow(target, memberGuid, drawOnMask);
  46. var chunks = UpdateEllipse(target, image);
  47. storedChunks = new CommittedChunkStorage(image, image.FindAffectedChunks());
  48. image.CommitChanges();
  49. ignoreInUndo = false;
  50. return DrawingChangeHelper.CreateChunkChangeInfo(memberGuid, chunks, drawOnMask);
  51. }
  52. public override OneOf<None, IChangeInfo, List<IChangeInfo>> ApplyTemporarily(Document target)
  53. {
  54. var image = DrawingChangeHelper.GetTargetImageOrThrow(target, memberGuid, drawOnMask);
  55. var chunks = UpdateEllipse(target, image);
  56. return DrawingChangeHelper.CreateChunkChangeInfo(memberGuid, chunks, drawOnMask);
  57. }
  58. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
  59. {
  60. ChunkyImage targetImage = DrawingChangeHelper.GetTargetImageOrThrow(target, memberGuid, drawOnMask);
  61. storedChunks!.ApplyChunksToImage(targetImage);
  62. storedChunks.Dispose();
  63. storedChunks = null;
  64. var changes = DrawingChangeHelper.CreateChunkChangeInfo(memberGuid, targetImage.FindAffectedChunks(), drawOnMask);
  65. targetImage.CommitChanges();
  66. return changes;
  67. }
  68. public override void Dispose()
  69. {
  70. storedChunks?.Dispose();
  71. }
  72. }