ChunkyImageTests.cs 4.6 KB

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