2
0

unit-Image.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. #include <catch2/catch.hpp>
  2. #if defined(__clang__)
  3. #pragma clang diagnostic ignored "-Wkeyword-macro"
  4. #elif defined(__GNUC__) || defined(__GNUG__)
  5. #pragma GCC diagnostic push
  6. #elif defined(_MSC_VER)
  7. #endif
  8. #define private public
  9. #include <gul/Image.h>
  10. #undef private
  11. #include <iostream>
  12. using namespace gul;
  13. TEST_CASE("Accessing Pixels")
  14. {
  15. gul::Image I;
  16. I.resize(10,10);
  17. REQUIRE( std::distance( &I.r(0,0) , &I.g(0,0 )) == 1 );
  18. REQUIRE( std::distance( &I.r(0,0) , &I.b(0,0 )) == 2 );
  19. REQUIRE( std::distance( &I.r(0,0) , &I.a(0,0 )) == 3 );
  20. WHEN("We make the first pixel equal to 0xAABBCCDD")
  21. {
  22. I(0,0,0) = 0xDD;
  23. I(0,0,1) = 0xCC;
  24. I(0,0,2) = 0xBB;
  25. I(0,0,3) = 0xAA;
  26. I(5,5,0) = 0x44;
  27. I(5,5,1) = 0x33;
  28. I(5,5,2) = 0x22;
  29. I(5,5,3) = 0x11;
  30. THEN("We can access each component")
  31. {
  32. REQUIRE( I.r(0,0) == 0xDD );
  33. REQUIRE( I.g(0,0) == 0xCC );
  34. REQUIRE( I.b(0,0) == 0xBB );
  35. REQUIRE( I.a(0,0) == 0xAA );
  36. REQUIRE( I.r(5,5) == 0x44 );
  37. REQUIRE( I.g(5,5) == 0x33 );
  38. REQUIRE( I.b(5,5) == 0x22 );
  39. REQUIRE( I.a(5,5) == 0x11 );
  40. }
  41. }
  42. }
  43. TEST_CASE("Constructors")
  44. {
  45. gul::Image I;
  46. I.resize(10,10);
  47. I.r = 0xAA;
  48. I.g = 0xBB;
  49. I.b = 0xCC;
  50. I.a = 0xDD;
  51. WHEN("We copy construct")
  52. {
  53. gul::Image J(I);
  54. REQUIRE(I.getWidth() == J.getWidth());
  55. REQUIRE(I.getHeight() == J.getHeight());
  56. for(uint32_t v=0;v<10;v++)
  57. {
  58. for(uint32_t u=0;u<10;u++)
  59. {
  60. REQUIRE( J.r(u,v) == 0xAA );
  61. REQUIRE( J.g(u,v) == 0xBB );
  62. REQUIRE( J.b(u,v) == 0xCC );
  63. REQUIRE( J.a(u,v) == 0xDD );
  64. }
  65. }
  66. }
  67. WHEN("We copy")
  68. {
  69. gul::Image J;
  70. J.resize(10,10);
  71. J = I;
  72. REQUIRE(I.getWidth() == J.getWidth());
  73. REQUIRE(I.getHeight() == J.getHeight());
  74. for(uint32_t v=0;v<10;v++)
  75. {
  76. for(uint32_t u=0;u<10;u++)
  77. {
  78. REQUIRE( J.r(u,v) == 0xAA );
  79. REQUIRE( J.g(u,v) == 0xBB );
  80. REQUIRE( J.b(u,v) == 0xCC );
  81. REQUIRE( J.a(u,v) == 0xDD );
  82. }
  83. }
  84. }
  85. WHEN("We move")
  86. {
  87. gul::Image J;
  88. J.resize(10,10);
  89. gul::Image K(I);
  90. J = std::move(K);
  91. REQUIRE(I.getWidth() == J.getWidth());
  92. REQUIRE(I.getHeight() == J.getHeight());
  93. for(uint32_t v=0;v<10;v++)
  94. {
  95. for(uint32_t u=0;u<10;u++)
  96. {
  97. REQUIRE( J.r(u,v) == 0xAA );
  98. REQUIRE( J.g(u,v) == 0xBB );
  99. REQUIRE( J.b(u,v) == 0xCC );
  100. REQUIRE( J.a(u,v) == 0xDD );
  101. }
  102. }
  103. }
  104. WHEN("We move Construct")
  105. {
  106. gul::Image K(I);
  107. gul::Image J(std::move(K));
  108. REQUIRE(I.getWidth() == J.getWidth());
  109. REQUIRE(I.getHeight() == J.getHeight());
  110. for(uint32_t v=0;v<10;v++)
  111. {
  112. for(uint32_t u=0;u<10;u++)
  113. {
  114. REQUIRE( J.r(u,v) == 0xAA );
  115. REQUIRE( J.g(u,v) == 0xBB );
  116. REQUIRE( J.b(u,v) == 0xCC );
  117. REQUIRE( J.a(u,v) == 0xDD );
  118. }
  119. }
  120. }
  121. }
  122. TEST_CASE("Copying Channels")
  123. {
  124. gul::Image I;
  125. I.resize(10,10);
  126. WHEN("Set a channel equal to a constant")
  127. {
  128. I.r = 0xAA;
  129. I.g = 0xBB;
  130. I.b = 0xCC;
  131. I.a = 0xDD;
  132. THEN("All the values in that channel becomes the same")
  133. {
  134. for(uint32_t v=0;v<10;v++)
  135. {
  136. for(uint32_t u=0;u<10;u++)
  137. {
  138. REQUIRE( I.r(u,v) == 0xAA );
  139. REQUIRE( I.g(u,v) == 0xBB );
  140. REQUIRE( I.b(u,v) == 0xCC );
  141. REQUIRE( I.a(u,v) == 0xDD );
  142. }
  143. }
  144. }
  145. }
  146. WHEN("Set a channel equal to a floating point constant")
  147. {
  148. I.r = 0.25f;
  149. I.g = 0.5f;
  150. I.b = 0.75f;
  151. I.a = 1.0f;
  152. THEN("All the values in that channel becomes the same")
  153. {
  154. for(uint32_t v=0;v<10;v++)
  155. {
  156. for(uint32_t u=0;u<10;u++)
  157. {
  158. REQUIRE( I.r(u,v) == 63 );
  159. REQUIRE( I.g(u,v) == 127 );
  160. REQUIRE( I.b(u,v) == 191 );
  161. REQUIRE( I.a(u,v) == 255 );
  162. }
  163. }
  164. }
  165. }
  166. WHEN("Copy one channel into another")
  167. {
  168. I.r = 0xAA;
  169. I.g = 0x00;
  170. I.b = 0x00;
  171. I.a = 0x00;
  172. I.g = I.r;
  173. THEN("All the values in that channel becomes the same")
  174. {
  175. for(uint32_t v=0;v<10;v++)
  176. {
  177. for(uint32_t u=0;u<10;u++)
  178. {
  179. //std::cout << u << ", " << v << ": " << std::hex << I(u,v) << std::endl;
  180. REQUIRE( I.r(u,v) == 0xAA );
  181. REQUIRE( I.g(u,v) == 0xAA );
  182. REQUIRE( I.b(u,v) == 0x00 );
  183. REQUIRE( I.a(u,v) == 0x00 );
  184. }
  185. }
  186. }
  187. }
  188. }
  189. TEST_CASE("Adding two channels")
  190. {
  191. gul::Image I;
  192. I.resize(10,10);
  193. I.r = 0x10;
  194. I.g = 0x20;
  195. WHEN("Set a channel equal to a constant")
  196. {
  197. I.a = I.r + I.g;
  198. THEN("All the values in that channel becomes the same")
  199. {
  200. for(uint32_t v=0;v<10;v++)
  201. {
  202. for(uint32_t u=0;u<10;u++)
  203. {
  204. REQUIRE( I.r(u,v) == 0x10 );
  205. REQUIRE( I.g(u,v) == 0x20 );
  206. REQUIRE( I.a(u,v) == (0x10+0x20) );
  207. }
  208. }
  209. }
  210. }
  211. }
  212. TEST_CASE("Multiplying two channels treats each compoinent as a float between 0-1")
  213. {
  214. gul::Image I;
  215. I.resize(10,10);
  216. WHEN("We multiply by 255*255")
  217. {
  218. I.r = 255;
  219. I.g = 255;
  220. I.b = 0;
  221. I.a = I.r * I.g;
  222. THEN("All the values in that channel becomes the same")
  223. {
  224. for(uint32_t v=0;v<10;v++)
  225. {
  226. for(uint32_t u=0;u<10;u++)
  227. {
  228. REQUIRE( I.r(u,v) == 255 );
  229. REQUIRE( I.g(u,v) == 255 );
  230. REQUIRE( I.b(u,v) == 0 );
  231. REQUIRE( I.a(u,v) == 255 );
  232. }
  233. }
  234. }
  235. }
  236. WHEN("We multiply by 255*0")
  237. {
  238. I.r = 255;
  239. I.g = 0;
  240. I.b = 0;
  241. I.a = I.r * I.g;
  242. THEN("All the values in that channel becomes the same")
  243. {
  244. for(uint32_t v=0;v<10;v++)
  245. {
  246. for(uint32_t u=0;u<10;u++)
  247. {
  248. REQUIRE( I.r(u,v) == 255 );
  249. REQUIRE( I.g(u,v) == 0 );
  250. REQUIRE( I.b(u,v) == 0 );
  251. REQUIRE( I.a(u,v) == 0 );
  252. }
  253. }
  254. }
  255. }
  256. WHEN("We multiply by 255*127 == 127")
  257. {
  258. I.r = 255;
  259. I.g = 127;
  260. I.b = 0;
  261. I.a = I.r * I.g;
  262. THEN("All the values in that channel becomes the same")
  263. {
  264. for(uint32_t v=0;v<10;v++)
  265. {
  266. for(uint32_t u=0;u<10;u++)
  267. {
  268. REQUIRE( I.r(u,v) == 255 );
  269. REQUIRE( I.g(u,v) == 127 );
  270. REQUIRE( I.b(u,v) == 0 );
  271. REQUIRE( I.a(u,v) == 127 );
  272. }
  273. }
  274. }
  275. }
  276. WHEN("We multiply by 127*127 == 63")
  277. {
  278. I.r = 127;
  279. I.g = 127;
  280. I.b = 0;
  281. I.a = I.r * I.g;
  282. THEN("All the values in that channel becomes the same")
  283. {
  284. for(uint32_t v=0;v<10;v++)
  285. {
  286. for(uint32_t u=0;u<10;u++)
  287. {
  288. REQUIRE( I.r(u,v) == 127 );
  289. REQUIRE( I.g(u,v) == 127 );
  290. REQUIRE( I.b(u,v) == 0 );
  291. REQUIRE( I.a(u,v) == 63 );
  292. }
  293. }
  294. }
  295. }
  296. }
  297. TEST_CASE("AXBY on two channels")
  298. {
  299. gul::Image I;
  300. I.resize(10,10);
  301. I.r = 0x08;
  302. I.g = 0x08;
  303. I.b = 255;
  304. WHEN("We perform some math")
  305. {
  306. I.a = 0.5f*I.r + 0.25f*I.g + 0.25f*I.g;
  307. THEN("All the values in that channel becomes the same")
  308. {
  309. for(uint32_t v=0;v<10;v++)
  310. {
  311. for(uint32_t u=0;u<10;u++)
  312. {
  313. REQUIRE( I.a(u,v) == 0x04+0x02+0x02);
  314. }
  315. }
  316. }
  317. }
  318. WHEN("We perform some math")
  319. {
  320. I.a = I.r*0.5f + 0.25f*I.g + 0.25f*I.g + 0.5f;
  321. THEN("All the values in that channel becomes the same")
  322. {
  323. for(uint32_t v=0;v<10;v++)
  324. {
  325. for(uint32_t u=0;u<10;u++)
  326. {
  327. REQUIRE( I.a(u,v) == 0x04+0x02+0x02 + 127);
  328. }
  329. }
  330. }
  331. }
  332. WHEN("We perform some math")
  333. {
  334. I.a = I.r*0.5f + 0.5f + 0.25f*I.g + 0.25f*I.g;
  335. THEN("All the values in that channel becomes the same")
  336. {
  337. for(uint32_t v=0;v<10;v++)
  338. {
  339. for(uint32_t u=0;u<10;u++)
  340. {
  341. REQUIRE( I.a(u,v) == 0x04+0x02+0x02 + 127);
  342. }
  343. }
  344. }
  345. }
  346. }
  347. TEST_CASE("Adding number to Channel")
  348. {
  349. gul::Image I;
  350. I.resize(10,10);
  351. I.r = 0;
  352. I.g = 0;
  353. I.b = 0;
  354. WHEN("We add a number to a channel")
  355. {
  356. I.a = I.r + 0.5f;
  357. THEN("All the values in that channel are increased by that value")
  358. {
  359. for(uint32_t v=0;v<10;v++)
  360. {
  361. for(uint32_t u=0;u<10;u++)
  362. {
  363. REQUIRE( I.a(u,v) == 127);
  364. REQUIRE( I.r(u,v) == 0);
  365. REQUIRE( I.g(u,v) == 0);
  366. REQUIRE( I.b(u,v) == 0);
  367. }
  368. }
  369. }
  370. }
  371. WHEN("We add a number to a channel")
  372. {
  373. I.a = 0.5f + I.r;
  374. THEN("All the values in that channel are increased by that value")
  375. {
  376. for(uint32_t v=0;v<10;v++)
  377. {
  378. for(uint32_t u=0;u<10;u++)
  379. {
  380. REQUIRE( I.a(u,v) == 127);
  381. REQUIRE( I.r(u,v) == 0);
  382. REQUIRE( I.g(u,v) == 0);
  383. REQUIRE( I.b(u,v) == 0);
  384. }
  385. }
  386. }
  387. }
  388. }
  389. TEST_CASE("Subtracting number from a Channel")
  390. {
  391. gul::Image I;
  392. I.resize(10,10);
  393. I.r = 255;
  394. I.g = 0;
  395. I.b = 0;
  396. WHEN("We subtract a number from a channel")
  397. {
  398. I.a = I.r - 0.5f;
  399. uint8_t actual_value = 127;// - static_cast<uint8_t>(255.0f*0.5f);
  400. THEN("All the values in that channel are decreased by that value")
  401. {
  402. for(uint32_t v=0;v<10;v++)
  403. {
  404. for(uint32_t u=0;u<10;u++)
  405. {
  406. REQUIRE( I.a(u,v) == actual_value);
  407. REQUIRE( I.r(u,v) == 255);
  408. REQUIRE( I.g(u,v) == 0);
  409. REQUIRE( I.b(u,v) == 0);
  410. }
  411. }
  412. }
  413. }
  414. WHEN("We subtract a channel from a number")
  415. {
  416. I.g = 128;
  417. I.a = 1.0f - I.g;
  418. uint8_t actual_value = static_cast<uint8_t>( (1.0f - 128.0f/255.0f)*255 );
  419. THEN("All the values in that channel are increased by that value")
  420. {
  421. for(uint32_t v=0;v<10;v++)
  422. {
  423. for(uint32_t u=0;u<10;u++)
  424. {
  425. REQUIRE( I.a(u,v) == actual_value);
  426. REQUIRE( I.r(u,v) == 255);
  427. REQUIRE( I.g(u,v) == 128);
  428. REQUIRE( I.b(u,v) == 0);
  429. }
  430. }
  431. }
  432. }
  433. }
  434. TEST_CASE("Multiplying a number by a channel")
  435. {
  436. gul::Image I;
  437. I.resize(10,10);
  438. I.r = 10;
  439. I.g = 0;
  440. I.b = 0;
  441. WHEN("We multi a number from a channel")
  442. {
  443. I.a = 2.0f*I.r;
  444. THEN("All the values in that channel are decreased by that value")
  445. {
  446. for(uint32_t v=0;v<10;v++)
  447. {
  448. for(uint32_t u=0;u<10;u++)
  449. {
  450. REQUIRE( I.a(u,v) == 20);
  451. REQUIRE( I.r(u,v) == 10);
  452. REQUIRE( I.g(u,v) == 0);
  453. REQUIRE( I.b(u,v) == 0);
  454. }
  455. }
  456. }
  457. }
  458. WHEN("We multi a number from a channel")
  459. {
  460. I.a = I.r*2.0f;
  461. auto x = I.r*2.0f;
  462. THEN("All the values in that channel are decreased by that value")
  463. {
  464. for(uint32_t v=0;v<10;v++)
  465. {
  466. for(uint32_t u=0;u<10;u++)
  467. {
  468. REQUIRE( I.a(u,v) == 20);
  469. REQUIRE( I.r(u,v) == 10);
  470. REQUIRE( I.g(u,v) == 0);
  471. REQUIRE( I.b(u,v) == 0);
  472. }
  473. }
  474. }
  475. }
  476. }
  477. TEST_CASE("Basic Math on two channels")
  478. {
  479. gul::Image I;
  480. I.resize(10,10);
  481. I.r = 0;
  482. I.g = 100;
  483. I.b = 255;
  484. WHEN("We perform some math")
  485. {
  486. I.a = I.b - 1.0f;
  487. THEN("All the values in that channel becomes the same")
  488. {
  489. for(uint32_t v=0;v<10;v++)
  490. {
  491. for(uint32_t u=0;u<10;u++)
  492. {
  493. REQUIRE( I.a(u,v) == 0);
  494. }
  495. }
  496. }
  497. }
  498. WHEN("We perform some math")
  499. {
  500. I.a = -1.0f + I.b;
  501. THEN("All the values in that channel becomes the same")
  502. {
  503. for(uint32_t v=0;v<10;v++)
  504. {
  505. for(uint32_t u=0;u<10;u++)
  506. {
  507. REQUIRE( I.a(u,v) == 0);
  508. }
  509. }
  510. }
  511. }
  512. WHEN("We perform some math")
  513. {
  514. I.a = I.b * 0.5f;
  515. THEN("All the values in that channel becomes the same")
  516. {
  517. for(uint32_t v=0;v<10;v++)
  518. {
  519. for(uint32_t u=0;u<10;u++)
  520. {
  521. REQUIRE( I.a(u,v) == 127);
  522. }
  523. }
  524. }
  525. }
  526. }
  527. TEST_CASE("Static functions")
  528. {
  529. auto x = gul::Image::X(255,255);
  530. auto y = gul::Image::Y(255,255);
  531. THEN("All the values in that channel becomes the same")
  532. {
  533. for(uint32_t v=0;v<255;v++)
  534. {
  535. for(uint32_t u=0;u<255;u++)
  536. {
  537. REQUIRE( uint32_t(x(u,v)*255) == u);
  538. REQUIRE( uint32_t(y(u,v)*255) == v);
  539. }
  540. }
  541. }
  542. }
  543. TEST_CASE("Mix functions")
  544. {
  545. gul::Image I;
  546. I.resize(10,10);
  547. THEN("All the values in that channel becomes the same")
  548. {
  549. I.r = 10;
  550. I.g = 20;
  551. I.a = mix( I.r, I.g, 0.5f);
  552. for(uint32_t v=0;v<10;v++)
  553. {
  554. for(uint32_t u=0;u<10;u++)
  555. {
  556. REQUIRE( I.a(u,v) == 15);
  557. }
  558. }
  559. }
  560. THEN("All the values in that channel becomes the same")
  561. {
  562. I.r = 10;
  563. I.g = 20;
  564. I.b = 128;
  565. I.a = mix( I.r, I.g, I.b);
  566. for(uint32_t v=0;v<10;v++)
  567. {
  568. for(uint32_t u=0;u<10;u++)
  569. {
  570. REQUIRE( I.a(u,v) == 15);
  571. }
  572. }
  573. }
  574. }
  575. TEST_CASE("apply functions")
  576. {
  577. gul::Image I;
  578. I.resize(255,255);
  579. THEN("All the values in that channel becomes the same")
  580. {
  581. I.r.apply( [](float u, float v)
  582. {
  583. (void)v;
  584. return u;
  585. }
  586. );
  587. I.g.apply( [](float u, float v)
  588. {
  589. (void)u;
  590. return v;
  591. }
  592. );
  593. I.b = [](float u, float v)
  594. {
  595. (void)u;
  596. return v;
  597. };
  598. for(uint32_t v=0;v<255;v++)
  599. {
  600. for(uint32_t u=0;u<255;u++)
  601. {
  602. REQUIRE( I.r(u,v) == u);
  603. REQUIRE( I.g(u,v) == v);
  604. REQUIRE( I.b(u,v) == v);
  605. }
  606. }
  607. }
  608. }
  609. SCENARIO("Test 3-channel")
  610. {
  611. gul::Image I(8,8,3);
  612. REQUIRE( I.size() == 8*8*3 );
  613. // +-+-+-+-+-+-+
  614. // |r|g|b|r|g|b|
  615. // +-+-+-+-+-+-+
  616. REQUIRE( std::distance( &I(0,0,0), &I(1,0,0) ) == 3 );
  617. REQUIRE( std::distance( &I(0,0,0), &I(1,0,1) ) == 4 );
  618. REQUIRE( std::distance( &I(0,0,0), &I(1,0,2) ) == 5 );
  619. REQUIRE( std::distance( &I(0,0,0), &I.r(1,0) ) == 3 );
  620. REQUIRE( std::distance( &I(0,0,0), &I.g(1,0) ) == 4 );
  621. REQUIRE( std::distance( &I(0,0,0), &I.b(1,0) ) == 5 );
  622. REQUIRE( std::distance( &I(0,0,0), &I.a(1,0) ) == 5 );
  623. }
  624. SCENARIO("Test 2-channel")
  625. {
  626. gul::Image I(8,8,2);
  627. REQUIRE( I.size() == 8*8*2 );
  628. // +-+-+-+-+-+-+
  629. // |r|g|r|g|r|g|
  630. // +-+-+-+-+-+-+
  631. REQUIRE( std::distance( &I(0,0,0), &I(1,0,0) ) == 2 );
  632. REQUIRE( std::distance( &I(0,0,0), &I(1,0,1) ) == 3 );
  633. // blue and alpha both point to green
  634. REQUIRE( std::distance( &I(0,0,0), &I.r(1,0) ) == 2 );
  635. REQUIRE( std::distance( &I(0,0,0), &I.g(1,0) ) == 3 );
  636. REQUIRE( std::distance( &I(0,0,0), &I.b(1,0) ) == 3 );
  637. REQUIRE( std::distance( &I(0,0,0), &I.a(1,0) ) == 3 );
  638. }
  639. SCENARIO("Test 1-channel")
  640. {
  641. gul::Image I(8,8,1);
  642. REQUIRE( I.size() == 8*8*1 );
  643. // +-+-+-+-+-+-+
  644. // |r|g|r|g|r|g|
  645. // +-+-+-+-+-+-+
  646. REQUIRE( std::distance( &I(0,0,0), &I(1,0,0) ) == 1 );
  647. REQUIRE( std::distance( &I(0,0,0), &I(2,0,0) ) == 2 );
  648. REQUIRE( std::distance( &I(0,0,0), &I(3,0,0) ) == 3 );
  649. // all point to the same channel (r)
  650. REQUIRE( std::distance( &I(0,0,0), &I.r(1,0) ) == 1 );
  651. REQUIRE( std::distance( &I(0,0,0), &I.g(1,0) ) == 1 );
  652. REQUIRE( std::distance( &I(0,0,0), &I.b(1,0) ) == 1 );
  653. REQUIRE( std::distance( &I(0,0,0), &I.a(1,0) ) == 1 );
  654. }
  655. SCENARIO("gul::ImageMM")
  656. {
  657. gul::ImageMM MM;
  658. MM.resize(16,16);
  659. MM.allocateMipMaps();
  660. REQUIRE( MM.getLevelCount() == 4);
  661. }
  662. SCENARIO("gul::ImageArray")
  663. {
  664. gul::ImageArray MM;
  665. MM.resize(16,16);
  666. MM.allocateMipMaps();
  667. REQUIRE( MM.getLevelCount() == 4);
  668. }