ChunkyImageTests.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using ChunkyImageLib;
  2. using ChunkyImageLib.DataHolders;
  3. using Drawie.Backend.Core.Bridge;
  4. using Drawie.Backend.Core.ColorsImpl;
  5. using Drawie.Backend.Core.Surfaces;
  6. using Drawie.Backend.Core.Surfaces.ImageData;
  7. using Drawie.Numerics;
  8. using Drawie.Skia;
  9. using Xunit;
  10. namespace ChunkyImageLibTest;
  11. public class ChunkyImageTests
  12. {
  13. public ChunkyImageTests()
  14. {
  15. try
  16. {
  17. DrawingBackendApi.SetupBackend(new SkiaDrawingBackend(), null);
  18. }
  19. catch { }
  20. }
  21. [Fact]
  22. public void Dispose_ComplexImage_ReturnsAllChunks()
  23. {
  24. ChunkyImage image = new ChunkyImage(new VecI(ChunkyImage.FullChunkSize, ChunkyImage.FullChunkSize), ColorSpace.CreateSrgb());
  25. image.EnqueueDrawRectangle(new(new(5, 5), new(80, 80), 0, 2, Colors.AliceBlue, Colors.Snow));
  26. using (Chunk target = Chunk.Create(ColorSpace.CreateSrgb()))
  27. {
  28. image.DrawMostUpToDateChunkOn(new(0, 0), ChunkResolution.Full, target.Surface.DrawingSurface, VecI.Zero);
  29. image.CancelChanges();
  30. image.EnqueueResize(new(ChunkyImage.FullChunkSize * 4, ChunkyImage.FullChunkSize * 4));
  31. image.EnqueueDrawRectangle(new(VecD.Zero, image.CommittedSize, 0, 2, Colors.AliceBlue, Colors.Snow, BlendMode.Multiply));
  32. image.CommitChanges();
  33. image.SetBlendMode(BlendMode.Overlay);
  34. image.EnqueueDrawRectangle(new(VecD.Zero, image.CommittedSize, 0, 2, Colors.AliceBlue, Colors.Snow, BlendMode.Multiply));
  35. image.EnqueueDrawRectangle(new(VecD.Zero, image.CommittedSize, 0, 2, Colors.AliceBlue, Colors.Snow));
  36. image.CommitChanges();
  37. image.SetBlendMode(BlendMode.Screen);
  38. image.EnqueueDrawRectangle(new(VecD.Zero, image.CommittedSize, 0, 2, Colors.AliceBlue, Colors.Snow));
  39. image.CancelChanges();
  40. image.SetBlendMode(BlendMode.SrcOver);
  41. image.EnqueueDrawRectangle(new(VecD.Zero, image.CommittedSize, 0, 2, Colors.AliceBlue, Colors.Snow));
  42. }
  43. image.Dispose();
  44. Assert.Equal(0, Chunk.ChunkCounter);
  45. }
  46. [Fact]
  47. public void GetCommittedPixel_RedImage_ReturnsRedPixel()
  48. {
  49. const int chunkSize = ChunkyImage.FullChunkSize;
  50. ChunkyImage image = new ChunkyImage(new VecI(chunkSize * 2), ColorSpace.CreateSrgb());
  51. image.EnqueueDrawRectangle
  52. (new ShapeData(new VecD(chunkSize), new VecD(chunkSize * 2), 0, 0, Colors.Transparent, Colors.Red));
  53. image.CommitChanges();
  54. Assert.Equal(Colors.Red, image.GetCommittedPixel(new VecI(chunkSize + chunkSize / 2)));
  55. image.Dispose();
  56. Assert.Equal(0, Chunk.ChunkCounter);
  57. }
  58. [Fact]
  59. public void GetMostUpToDatePixel_BlendModeSrc_ReturnsCorrectPixel()
  60. {
  61. const int chunkSize = ChunkyImage.FullChunkSize;
  62. ChunkyImage image = new ChunkyImage(new VecI(chunkSize * 2), ColorSpace.CreateSrgb());
  63. image.EnqueueDrawRectangle
  64. (new ShapeData(new VecD(chunkSize), new VecD(chunkSize * 2), 0, 0, Colors.Transparent, Colors.Red));
  65. Assert.Equal(Colors.Red, image.GetMostUpToDatePixel(new VecI(chunkSize + chunkSize / 2)));
  66. image.Dispose();
  67. Assert.Equal(0, Chunk.ChunkCounter);
  68. }
  69. [Fact]
  70. public void GetMostUpToDatePixel_BlendModeSrcOver_ReturnsCorrectPixel()
  71. {
  72. const int chunkSize = ChunkyImage.FullChunkSize;
  73. ChunkyImage image = new ChunkyImage(new VecI(chunkSize * 2), ColorSpace.CreateSrgb());
  74. image.EnqueueDrawRectangle
  75. (new ShapeData(new VecD(chunkSize), new VecD(chunkSize * 2), 0, 0, Colors.Transparent, Colors.Red));
  76. image.CommitChanges();
  77. image.SetBlendMode(BlendMode.SrcOver);
  78. image.EnqueueDrawRectangle(new ShapeData(
  79. new VecD(chunkSize),
  80. new VecD(chunkSize * 2),
  81. 0,
  82. 0,
  83. Colors.Transparent,
  84. new Color(0, 255, 0, 128)));
  85. Assert.Equal(new Color(127, 128, 0), image.GetMostUpToDatePixel(new VecI(chunkSize + chunkSize / 2)));
  86. image.Dispose();
  87. Assert.Equal(0, Chunk.ChunkCounter);
  88. }
  89. [Fact]
  90. public void EnqueueDrawRectangle_OutsideOfImage_PartsAreNotDrawn()
  91. {
  92. const int chunkSize = ChunkyImage.FullChunkSize;
  93. using ChunkyImage image = new(new VecI(chunkSize), ColorSpace.CreateSrgb());
  94. image.EnqueueDrawRectangle(new ShapeData(
  95. VecD.Zero,
  96. new VecD(chunkSize * 10),
  97. 0,
  98. 0,
  99. Colors.Transparent,
  100. Colors.Red));
  101. image.CommitChanges();
  102. Assert.Collection(
  103. image.FindAllChunks(),
  104. elem => Assert.Equal(VecI.Zero, elem));
  105. }
  106. }