PixelTest.cpp 11 KB

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