CommittedChunkStorage.cs 1.5 KB

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