CommittedChunkStorage.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using ChunkyImageLib.DataHolders;
  2. using PixiEditor.DrawingApi.Core.Numerics;
  3. using PixiEditor.DrawingApi.Core.Surface;
  4. using PixiEditor.DrawingApi.Core.Surface.PaintImpl;
  5. using PixiEditor.Numerics;
  6. namespace ChunkyImageLib;
  7. public class CommittedChunkStorage : IDisposable
  8. {
  9. private bool disposed = false;
  10. private List<(VecI, Chunk?)> savedChunks = new();
  11. private static Paint ReplacingPaint { get; } = new Paint() { BlendMode = BlendMode.Src };
  12. public CommittedChunkStorage(ChunkyImage image, HashSet<VecI> committedChunksToSave)
  13. {
  14. foreach (var chunkPos in committedChunksToSave)
  15. {
  16. Chunk copy = Chunk.Create();
  17. if (!image.DrawCommittedChunkOn(chunkPos, ChunkResolution.Full, copy.Surface.DrawingSurface, VecI.Zero, ReplacingPaint))
  18. {
  19. copy.Dispose();
  20. savedChunks.Add((chunkPos, null));
  21. continue;
  22. }
  23. savedChunks.Add((chunkPos, copy));
  24. }
  25. }
  26. public void ApplyChunksToImage(ChunkyImage image)
  27. {
  28. if (disposed)
  29. throw new ObjectDisposedException(nameof(CommittedChunkStorage));
  30. foreach (var (pos, chunk) in savedChunks)
  31. {
  32. if (chunk is null)
  33. image.EnqueueClearRegion(new(pos * ChunkPool.FullChunkSize, new(ChunkPool.FullChunkSize, ChunkPool.FullChunkSize)));
  34. else
  35. image.EnqueueDrawImage(pos * ChunkPool.FullChunkSize, chunk.Surface, ReplacingPaint);
  36. }
  37. }
  38. public void Dispose()
  39. {
  40. if (disposed)
  41. return;
  42. disposed = true;
  43. foreach (var (_, chunk) in savedChunks)
  44. {
  45. if (chunk is not null)
  46. chunk.Dispose();
  47. }
  48. }
  49. }