ChunkyImageTests.cs 4.4 KB

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