PixelTest.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. 
  2. #include "../testTools.h"
  3. #include "../../DFPSR/api/imageAPI.h"
  4. START_TEST(Pixel)
  5. { // ImageU8
  6. ImageU8 image;
  7. // Writing to a null image is always ignored
  8. image_writePixel(image, 0, 0, 137);
  9. image_writePixel(image, -37, 564, 84);
  10. // Reading from a null image always returns zero, even if a border color is given
  11. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 0), 0);
  12. ASSERT_EQUAL(image_readPixel_clamp(image, -2, 68), 0);
  13. ASSERT_EQUAL(image_readPixel_tile(image, 0, 0), 0);
  14. ASSERT_EQUAL(image_readPixel_tile(image, 43, 213), 0);
  15. ASSERT_EQUAL(image_readPixel_border(image, 0, 0, 26), 0);
  16. ASSERT_EQUAL(image_readPixel_border(image, -36, -58, 26), 0);
  17. // Creating a 2x2 image
  18. image = image_create_U8(2, 2);
  19. // Saturated writes
  20. image_writePixel(image, 0, 0, -1);
  21. image_writePixel(image, 1, 0, 256);
  22. image_writePixel(image, 0, 1, -56456);
  23. image_writePixel(image, 1, 1, 76546);
  24. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 0), 0);
  25. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 0), 255);
  26. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 1), 0);
  27. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 1), 255);
  28. // Writing pixels
  29. image_writePixel(image, 0, 0, 12);
  30. image_writePixel(image, 1, 0, 34);
  31. image_writePixel(image, 0, 1, 56);
  32. image_writePixel(image, 1, 1, 78);
  33. // Writing pixels out of bound is also ignored
  34. image_writePixel(image, -1, 0, 45);
  35. image_writePixel(image, 1, 2, 15);
  36. image_writePixel(image, -463, 175, 245);
  37. image_writePixel(image, 987463, -75563, 64);
  38. // Sample inside
  39. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 0), 12);
  40. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 0), 34);
  41. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 1), 56);
  42. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 1), 78);
  43. ASSERT_EQUAL(image_readPixel_tile(image, 0, 0), 12);
  44. ASSERT_EQUAL(image_readPixel_tile(image, 1, 0), 34);
  45. ASSERT_EQUAL(image_readPixel_tile(image, 0, 1), 56);
  46. ASSERT_EQUAL(image_readPixel_tile(image, 1, 1), 78);
  47. ASSERT_EQUAL(image_readPixel_border(image, 0, 0, 23), 12);
  48. ASSERT_EQUAL(image_readPixel_border(image, 1, 0, 75), 34);
  49. ASSERT_EQUAL(image_readPixel_border(image, 0, 1, 34), 56);
  50. ASSERT_EQUAL(image_readPixel_border(image, 1, 1, 21), 78);
  51. // Sample outside
  52. ASSERT_EQUAL(image_readPixel_clamp(image, -3, 0), 12);
  53. ASSERT_EQUAL(image_readPixel_clamp(image, 0, -1), 12);
  54. ASSERT_EQUAL(image_readPixel_clamp(image, 4, 0), 34);
  55. ASSERT_EQUAL(image_readPixel_clamp(image, 1, -1), 34);
  56. ASSERT_EQUAL(image_readPixel_clamp(image, -4, 1), 56);
  57. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 2), 56);
  58. ASSERT_EQUAL(image_readPixel_clamp(image, 2, 1), 78);
  59. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 5), 78);
  60. ASSERT_EQUAL(image_readPixel_clamp(image, -24, -63), 12);
  61. ASSERT_EQUAL(image_readPixel_clamp(image, 37, -45), 34);
  62. ASSERT_EQUAL(image_readPixel_clamp(image, -1, 2), 56);
  63. ASSERT_EQUAL(image_readPixel_clamp(image, 34, 5), 78);
  64. // Borders are returned as is without saturation, which can be used for unique error codes
  65. ASSERT_EQUAL(image_readPixel_border(image, -23854, -61456, -23), -23);
  66. ASSERT_EQUAL(image_readPixel_border(image, 7564, 254, 376), 376);
  67. ASSERT_EQUAL(image_readPixel_border(image, -1457, 734166, 3), 3);
  68. ASSERT_EQUAL(image_readPixel_border(image, 62489, -17350, 1245), 1245);
  69. ASSERT_EQUAL(image_readPixel_border(image, 0, -1, 128), 128);
  70. ASSERT_EQUAL(image_readPixel_border(image, 1, -1, 498), 498);
  71. ASSERT_EQUAL(image_readPixel_border(image, 0, 2, -25), -25);
  72. ASSERT_EQUAL(image_readPixel_border(image, 1, 2, 47), 47);
  73. }
  74. { // ImageF32
  75. ImageF32 image;
  76. // Writing to a null image is always ignored
  77. image_writePixel(image, 0, 0, 137.0f);
  78. image_writePixel(image, -37, 564, 84.0f);
  79. // Reading from a null image always returns zero, even if a border color is given
  80. ASSERT_NEAR(image_readPixel_clamp(image, 0, 0), 0.0f);
  81. ASSERT_NEAR(image_readPixel_clamp(image, -2, 68), 0.0f);
  82. ASSERT_NEAR(image_readPixel_tile(image, 0, 0), 0.0f);
  83. ASSERT_NEAR(image_readPixel_tile(image, 43, 213), 0.0f);
  84. ASSERT_NEAR(image_readPixel_border(image, 0, 0, 26.0f), 0.0f);
  85. ASSERT_NEAR(image_readPixel_border(image, -36, -58, 26.0f), 0.0f);
  86. // Creating a 2x2 image
  87. image = image_create_F32(2, 2);
  88. // Writing pixels
  89. image_writePixel(image, 0, 0, 12.3f);
  90. image_writePixel(image, 1, 0, 23.4f);
  91. image_writePixel(image, 0, 1, 34.5f);
  92. image_writePixel(image, 1, 1, 45.6f);
  93. // Writing pixels out of bound is also ignored
  94. image_writePixel(image, -1, 0, 45.652f);
  95. image_writePixel(image, 1, 2, 15.459f);
  96. image_writePixel(image, -463, 175, 245.516f);
  97. image_writePixel(image, 987463, -75563, 64.342f);
  98. // Sample inside
  99. ASSERT_NEAR(image_readPixel_clamp(image, 0, 0), 12.3f);
  100. ASSERT_NEAR(image_readPixel_clamp(image, 1, 0), 23.4f);
  101. ASSERT_NEAR(image_readPixel_clamp(image, 0, 1), 34.5f);
  102. ASSERT_NEAR(image_readPixel_clamp(image, 1, 1), 45.6f);
  103. ASSERT_NEAR(image_readPixel_tile(image, 0, 0), 12.3f);
  104. ASSERT_NEAR(image_readPixel_tile(image, 1, 0), 23.4f);
  105. ASSERT_NEAR(image_readPixel_tile(image, 0, 1), 34.5f);
  106. ASSERT_NEAR(image_readPixel_tile(image, 1, 1), 45.6f);
  107. ASSERT_NEAR(image_readPixel_border(image, 0, 0, 23.53f), 12.3f);
  108. ASSERT_NEAR(image_readPixel_border(image, 1, 0, 75.16f), 23.4f);
  109. ASSERT_NEAR(image_readPixel_border(image, 0, 1, 23.48f), 34.5f);
  110. ASSERT_NEAR(image_readPixel_border(image, 1, 1, 21.64f), 45.6f);
  111. // Sample outside
  112. ASSERT_NEAR(image_readPixel_clamp(image, -3, 0), 12.3f);
  113. ASSERT_NEAR(image_readPixel_clamp(image, 0, -1), 12.3f);
  114. ASSERT_NEAR(image_readPixel_clamp(image, 4, 0), 23.4f);
  115. ASSERT_NEAR(image_readPixel_clamp(image, 1, -1), 23.4f);
  116. ASSERT_NEAR(image_readPixel_clamp(image, -4, 1), 34.5f);
  117. ASSERT_NEAR(image_readPixel_clamp(image, 0, 2), 34.5f);
  118. ASSERT_NEAR(image_readPixel_clamp(image, 2, 1), 45.6f);
  119. ASSERT_NEAR(image_readPixel_clamp(image, 1, 5), 45.6f);
  120. ASSERT_NEAR(image_readPixel_clamp(image, -24, -63), 12.3f);
  121. ASSERT_NEAR(image_readPixel_clamp(image, 37, -45), 23.4f);
  122. ASSERT_NEAR(image_readPixel_clamp(image, -1, 2), 34.5f);
  123. ASSERT_NEAR(image_readPixel_clamp(image, 34, 5), 45.6f);
  124. // Borders are returned as is, because float doesn't require saturation
  125. ASSERT_NEAR(image_readPixel_border(image, -23854, -61456, -23.4f), -23.4f);
  126. ASSERT_NEAR(image_readPixel_border(image, 7564, 254, 376.8f), 376.8f);
  127. ASSERT_NEAR(image_readPixel_border(image, -1457, 734166, 3.0f), 3.0f);
  128. ASSERT_NEAR(image_readPixel_border(image, 62489, -17350, 1245.2f), 1245.2f);
  129. ASSERT_NEAR(image_readPixel_border(image, 0, -1, 128.0f), 128.0f);
  130. ASSERT_NEAR(image_readPixel_border(image, 1, -1, 498.4f), 498.4f);
  131. ASSERT_NEAR(image_readPixel_border(image, 0, 2, -25.9f), -25.9f);
  132. ASSERT_NEAR(image_readPixel_border(image, 1, 2, 47.1f), 47.1f);
  133. }
  134. { // ImageRgbaU8
  135. ImageRgbaU8 image;
  136. // Writing to a null image is always ignored
  137. image_writePixel(image, 0, 0, ColorRgbaI32(25, 73, 8, 43));
  138. image_writePixel(image, -37, 564, ColorRgbaI32(86, 45, 68, 14));
  139. // Reading from a null image always returns zero, even if a border color is given
  140. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 0), ColorRgbaI32(0, 0, 0, 0));
  141. ASSERT_EQUAL(image_readPixel_clamp(image, -2, 68), ColorRgbaI32(0, 0, 0, 0));
  142. ASSERT_EQUAL(image_readPixel_tile(image, 0, 0), ColorRgbaI32(0, 0, 0, 0));
  143. ASSERT_EQUAL(image_readPixel_tile(image, 43, 213), ColorRgbaI32(0, 0, 0, 0));
  144. ASSERT_EQUAL(image_readPixel_border(image, 0, 0, ColorRgbaI32(65, 96, 135, 57)), ColorRgbaI32(0, 0, 0, 0));
  145. ASSERT_EQUAL(image_readPixel_border(image, -36, -58, ColorRgbaI32(12, 75, 58, 53)), ColorRgbaI32(0, 0, 0, 0));
  146. // Creating a 2x2 image
  147. image = image_create_RgbaU8(2, 2);
  148. // Writing pixels with saturation
  149. image_writePixel(image, 0, 0, ColorRgbaI32(-36, 7645, -75, 345)); // Saturated to (0, 255, 0, 255)
  150. image_writePixel(image, 1, 0, ColorRgbaI32(1000, 477, 684, 255)); // Saturated to (255, 255, 255, 255)
  151. image_writePixel(image, 0, 1, ColorRgbaI32(-1, 0, 255, 256)); // Saturated to (0, 0, 255, 255)
  152. image_writePixel(image, 1, 1, ColorRgbaI32(0, 25, 176, 255)); // No effect from saturation
  153. // Writing pixels out of bound is also ignored
  154. image_writePixel(image, -1, 0, ColorRgbaI32(-57, 486, 65, 377));
  155. image_writePixel(image, 1, 2, ColorRgbaI32(7, 4, 6, 84));
  156. image_writePixel(image, -463, 175, ColorRgbaI32(86, 0, 47, 255));
  157. image_writePixel(image, 987463, -75563, ColorRgbaI32(55, 86, 55, 123));
  158. // Sample inside
  159. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 0), ColorRgbaI32(0, 255, 0, 255));
  160. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 0), ColorRgbaI32(255, 255, 255, 255));
  161. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 1), ColorRgbaI32(0, 0, 255, 255));
  162. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 1), ColorRgbaI32(0, 25, 176, 255));
  163. ASSERT_EQUAL(image_readPixel_tile(image, 0, 0), ColorRgbaI32(0, 255, 0, 255));
  164. ASSERT_EQUAL(image_readPixel_tile(image, 1, 0), ColorRgbaI32(255, 255, 255, 255));
  165. ASSERT_EQUAL(image_readPixel_tile(image, 0, 1), ColorRgbaI32(0, 0, 255, 255));
  166. ASSERT_EQUAL(image_readPixel_tile(image, 1, 1), ColorRgbaI32(0, 25, 176, 255));
  167. ASSERT_EQUAL(image_readPixel_border(image, 0, 0, ColorRgbaI32(54, 37, 66, 36)), ColorRgbaI32(0, 255, 0, 255));
  168. ASSERT_EQUAL(image_readPixel_border(image, 1, 0, ColorRgbaI32(12, 75, 58, 47)), ColorRgbaI32(255, 255, 255, 255));
  169. ASSERT_EQUAL(image_readPixel_border(image, 0, 1, ColorRgbaI32(75, 68, 72, 44)), ColorRgbaI32(0, 0, 255, 255));
  170. ASSERT_EQUAL(image_readPixel_border(image, 1, 1, ColorRgbaI32(86, 45, 77, 34)), ColorRgbaI32(0, 25, 176, 255));
  171. // Sample outside
  172. ASSERT_EQUAL(image_readPixel_clamp(image, -3, 0), ColorRgbaI32(0, 255, 0, 255));
  173. ASSERT_EQUAL(image_readPixel_clamp(image, 0, -1), ColorRgbaI32(0, 255, 0, 255));
  174. ASSERT_EQUAL(image_readPixel_clamp(image, 4, 0), ColorRgbaI32(255, 255, 255, 255));
  175. ASSERT_EQUAL(image_readPixel_clamp(image, 1, -1), ColorRgbaI32(255, 255, 255, 255));
  176. ASSERT_EQUAL(image_readPixel_clamp(image, -4, 1), ColorRgbaI32(0, 0, 255, 255));
  177. ASSERT_EQUAL(image_readPixel_clamp(image, 0, 2), ColorRgbaI32(0, 0, 255, 255));
  178. ASSERT_EQUAL(image_readPixel_clamp(image, 2, 1), ColorRgbaI32(0, 25, 176, 255));
  179. ASSERT_EQUAL(image_readPixel_clamp(image, 1, 5), ColorRgbaI32(0, 25, 176, 255));
  180. ASSERT_EQUAL(image_readPixel_clamp(image, -24, -63), ColorRgbaI32(0, 255, 0, 255));
  181. ASSERT_EQUAL(image_readPixel_clamp(image, 37, -45), ColorRgbaI32(255, 255, 255, 255));
  182. ASSERT_EQUAL(image_readPixel_clamp(image, -1, 2), ColorRgbaI32(0, 0, 255, 255));
  183. ASSERT_EQUAL(image_readPixel_clamp(image, 34, 5), ColorRgbaI32(0, 25, 176, 255));
  184. // Borders are returned as is without saturation, which can be used for unique error codes
  185. ASSERT_EQUAL(image_readPixel_border(image, -23854, -61456, ColorRgbaI32(-1, -1, -1, -1)), ColorRgbaI32(-1, -1, -1, -1));
  186. ASSERT_EQUAL(image_readPixel_border(image, 7564, 254, ColorRgbaI32(1245, 84, -215, 43)), ColorRgbaI32(1245, 84, -215, 43));
  187. ASSERT_EQUAL(image_readPixel_border(image, -1457, 734166, ColorRgbaI32(2000, 5, 2, 7)), ColorRgbaI32(2000, 5, 2, 7));
  188. ASSERT_EQUAL(image_readPixel_border(image, 62489, -17350, ColorRgbaI32(253, 46, 1574, 64)), ColorRgbaI32(253, 46, 1574, 64));
  189. ASSERT_EQUAL(image_readPixel_border(image, 0, -1, ColorRgbaI32(0, 0, 0, -1)), ColorRgbaI32(0, 0, 0, -1));
  190. ASSERT_EQUAL(image_readPixel_border(image, 1, -1, ColorRgbaI32(99, 99, 99, 99)), ColorRgbaI32(99, 99, 99, 99));
  191. ASSERT_EQUAL(image_readPixel_border(image, 0, 2, ColorRgbaI32(1, 2, 3, 4)), ColorRgbaI32(1, 2, 3, 4));
  192. ASSERT_EQUAL(image_readPixel_border(image, 1, 2, ColorRgbaI32(-1, -2, -3, -4)), ColorRgbaI32(-1, -2, -3, -4));
  193. }
  194. END_TEST