testautomation_surface.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. /**
  2. * Original code: automated SDL surface test written by Edgar Simo "bobbens"
  3. * Adapted/rewritten for test lib by Andreas Schiffler
  4. */
  5. /* Supress C4996 VS compiler warnings for unlink() */
  6. #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
  7. #define _CRT_SECURE_NO_DEPRECATE
  8. #endif
  9. #if defined(_MSC_VER) && !defined(_CRT_NONSTDC_NO_DEPRECATE)
  10. #define _CRT_NONSTDC_NO_DEPRECATE
  11. #endif
  12. #include <stdio.h>
  13. #ifndef _MSC_VER
  14. #include <unistd.h>
  15. #endif
  16. #include <sys/stat.h>
  17. #include <SDL3/SDL.h>
  18. #include <SDL3/SDL_test.h>
  19. #include "testautomation_images.h"
  20. /* ================= Test Case Implementation ================== */
  21. /* Shared test surface */
  22. static SDL_Surface *referenceSurface = NULL;
  23. static SDL_Surface *testSurface = NULL;
  24. /* Helper functions for the test cases */
  25. #define TEST_SURFACE_WIDTH testSurface->w
  26. #define TEST_SURFACE_HEIGHT testSurface->h
  27. /* Fixture */
  28. /* Create a 32-bit writable surface for blitting tests */
  29. static void surfaceSetUp(void *arg)
  30. {
  31. int result;
  32. SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
  33. SDL_BlendMode currentBlendMode;
  34. referenceSurface = SDLTest_ImageBlit(); /* For size info */
  35. testSurface = SDL_CreateSurface(referenceSurface->w, referenceSurface->h, SDL_PIXELFORMAT_RGBA32);
  36. SDLTest_AssertCheck(testSurface != NULL, "Check that testSurface is not NULL");
  37. if (testSurface != NULL) {
  38. /* Disable blend mode for target surface */
  39. result = SDL_SetSurfaceBlendMode(testSurface, blendMode);
  40. SDLTest_AssertCheck(result == 0, "Validate result from SDL_SetSurfaceBlendMode, expected: 0, got: %i", result);
  41. result = SDL_GetSurfaceBlendMode(testSurface, &currentBlendMode);
  42. SDLTest_AssertCheck(result == 0, "Validate result from SDL_GetSurfaceBlendMode, expected: 0, got: %i", result);
  43. SDLTest_AssertCheck(currentBlendMode == blendMode, "Validate blendMode, expected: %i, got: %i", blendMode, currentBlendMode);
  44. }
  45. }
  46. static void surfaceTearDown(void *arg)
  47. {
  48. SDL_DestroySurface(referenceSurface);
  49. referenceSurface = NULL;
  50. SDL_DestroySurface(testSurface);
  51. testSurface = NULL;
  52. }
  53. /**
  54. * Helper that clears the test surface
  55. */
  56. static void clearTestSurface()
  57. {
  58. int ret;
  59. Uint32 color;
  60. /* Clear surface. */
  61. color = SDL_MapRGBA(testSurface->format, 0, 0, 0, 0);
  62. SDLTest_AssertPass("Call to SDL_MapRGBA()");
  63. ret = SDL_FillSurfaceRect(testSurface, NULL, color);
  64. SDLTest_AssertPass("Call to SDL_FillSurfaceRect()");
  65. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_FillSurfaceRect, expected: 0, got: %i", ret);
  66. }
  67. /**
  68. * Helper that blits in a specific blend mode, -1 for basic blitting, -2 for color mod, -3 for alpha mod, -4 for mixed blend modes.
  69. */
  70. static void testBlitBlendMode(int mode)
  71. {
  72. int ret;
  73. int i, j, ni, nj;
  74. SDL_Surface *face;
  75. SDL_Rect rect;
  76. int nmode;
  77. SDL_BlendMode bmode;
  78. int checkFailCount1;
  79. int checkFailCount2;
  80. int checkFailCount3;
  81. int checkFailCount4;
  82. /* Check test surface */
  83. SDLTest_AssertCheck(testSurface != NULL, "Verify testSurface is not NULL");
  84. if (testSurface == NULL) {
  85. return;
  86. }
  87. /* Create sample surface */
  88. face = SDLTest_ImageFace();
  89. SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
  90. if (face == NULL) {
  91. return;
  92. }
  93. /* Reset alpha modulation */
  94. ret = SDL_SetSurfaceAlphaMod(face, 255);
  95. SDLTest_AssertPass("Call to SDL_SetSurfaceAlphaMod()");
  96. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceAlphaMod(), expected: 0, got: %i", ret);
  97. /* Reset color modulation */
  98. ret = SDL_SetSurfaceColorMod(face, 255, 255, 255);
  99. SDLTest_AssertPass("Call to SDL_SetSurfaceColorMod()");
  100. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceColorMod(), expected: 0, got: %i", ret);
  101. /* Reset color key */
  102. ret = SDL_SetSurfaceColorKey(face, SDL_FALSE, 0);
  103. SDLTest_AssertPass("Call to SDL_SetSurfaceColorKey()");
  104. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceColorKey(), expected: 0, got: %i", ret);
  105. /* Clear the test surface */
  106. clearTestSurface();
  107. /* Target rect size */
  108. rect.w = face->w;
  109. rect.h = face->h;
  110. /* Steps to take */
  111. ni = testSurface->w - face->w;
  112. nj = testSurface->h - face->h;
  113. /* Optionally set blend mode. */
  114. if (mode >= 0) {
  115. ret = SDL_SetSurfaceBlendMode(face, (SDL_BlendMode)mode);
  116. SDLTest_AssertPass("Call to SDL_SetSurfaceBlendMode()");
  117. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceBlendMode(..., %i), expected: 0, got: %i", mode, ret);
  118. }
  119. /* Test blend mode. */
  120. checkFailCount1 = 0;
  121. checkFailCount2 = 0;
  122. checkFailCount3 = 0;
  123. checkFailCount4 = 0;
  124. for (j = 0; j <= nj; j += 4) {
  125. for (i = 0; i <= ni; i += 4) {
  126. if (mode == -2) {
  127. /* Set color mod. */
  128. ret = SDL_SetSurfaceColorMod(face, (255 / nj) * j, (255 / ni) * i, (255 / nj) * j);
  129. if (ret != 0) {
  130. checkFailCount2++;
  131. }
  132. } else if (mode == -3) {
  133. /* Set alpha mod. */
  134. ret = SDL_SetSurfaceAlphaMod(face, (255 / ni) * i);
  135. if (ret != 0) {
  136. checkFailCount3++;
  137. }
  138. } else if (mode == -4) {
  139. /* Crazy blending mode magic. */
  140. nmode = (i / 4 * j / 4) % 4;
  141. if (nmode == 0) {
  142. bmode = SDL_BLENDMODE_NONE;
  143. } else if (nmode == 1) {
  144. bmode = SDL_BLENDMODE_BLEND;
  145. } else if (nmode == 2) {
  146. bmode = SDL_BLENDMODE_ADD;
  147. } else if (nmode == 3) {
  148. bmode = SDL_BLENDMODE_MOD;
  149. } else {
  150. /* Should be impossible, but some static checkers are too imprecise and will complain */
  151. SDLTest_LogError("Invalid: nmode=%d", nmode);
  152. return;
  153. }
  154. ret = SDL_SetSurfaceBlendMode(face, bmode);
  155. if (ret != 0) {
  156. checkFailCount4++;
  157. }
  158. }
  159. /* Blitting. */
  160. rect.x = i;
  161. rect.y = j;
  162. ret = SDL_BlitSurface(face, NULL, testSurface, &rect);
  163. if (ret != 0) {
  164. checkFailCount1++;
  165. }
  166. }
  167. }
  168. SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_BlitSurface, expected: 0, got: %i", checkFailCount1);
  169. SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_SetSurfaceColorMod, expected: 0, got: %i", checkFailCount2);
  170. SDLTest_AssertCheck(checkFailCount3 == 0, "Validate results from calls to SDL_SetSurfaceAlphaMod, expected: 0, got: %i", checkFailCount3);
  171. SDLTest_AssertCheck(checkFailCount4 == 0, "Validate results from calls to SDL_SetSurfaceBlendMode, expected: 0, got: %i", checkFailCount4);
  172. /* Clean up */
  173. SDL_DestroySurface(face);
  174. face = NULL;
  175. }
  176. /* Helper to check that a file exists */
  177. static void AssertFileExist(const char *filename)
  178. {
  179. struct stat st;
  180. int ret = stat(filename, &st);
  181. SDLTest_AssertCheck(ret == 0, "Verify file '%s' exists", filename);
  182. }
  183. /* Test case functions */
  184. /**
  185. * \brief Tests sprite saving and loading
  186. */
  187. int surface_testSaveLoadBitmap(void *arg)
  188. {
  189. int ret;
  190. const char *sampleFilename = "testSaveLoadBitmap.bmp";
  191. SDL_Surface *face;
  192. SDL_Surface *rface;
  193. /* Create sample surface */
  194. face = SDLTest_ImageFace();
  195. SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
  196. if (face == NULL) {
  197. return TEST_ABORTED;
  198. }
  199. /* Delete test file; ignore errors */
  200. unlink(sampleFilename);
  201. /* Save a surface */
  202. ret = SDL_SaveBMP(face, sampleFilename);
  203. SDLTest_AssertPass("Call to SDL_SaveBMP()");
  204. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SaveBMP, expected: 0, got: %i", ret);
  205. AssertFileExist(sampleFilename);
  206. /* Load a surface */
  207. rface = SDL_LoadBMP(sampleFilename);
  208. SDLTest_AssertPass("Call to SDL_LoadBMP()");
  209. SDLTest_AssertCheck(rface != NULL, "Verify result from SDL_LoadBMP is not NULL");
  210. if (rface != NULL) {
  211. SDLTest_AssertCheck(face->w == rface->w, "Verify width of loaded surface, expected: %i, got: %i", face->w, rface->w);
  212. SDLTest_AssertCheck(face->h == rface->h, "Verify height of loaded surface, expected: %i, got: %i", face->h, rface->h);
  213. }
  214. /* Delete test file; ignore errors */
  215. unlink(sampleFilename);
  216. /* Clean up */
  217. SDL_DestroySurface(face);
  218. face = NULL;
  219. SDL_DestroySurface(rface);
  220. rface = NULL;
  221. return TEST_COMPLETED;
  222. }
  223. /**
  224. * Tests surface conversion.
  225. */
  226. int surface_testSurfaceConversion(void *arg)
  227. {
  228. SDL_Surface *rface = NULL, *face = NULL;
  229. int ret = 0;
  230. /* Create sample surface */
  231. face = SDLTest_ImageFace();
  232. SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
  233. if (face == NULL) {
  234. return TEST_ABORTED;
  235. }
  236. /* Set transparent pixel as the pixel at (0,0) */
  237. if (face->format->palette) {
  238. ret = SDL_SetSurfaceColorKey(face, SDL_RLEACCEL, *(Uint8 *)face->pixels);
  239. SDLTest_AssertPass("Call to SDL_SetSurfaceColorKey()");
  240. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceColorKey, expected: 0, got: %i", ret);
  241. }
  242. /* Convert to 32 bit to compare. */
  243. rface = SDL_ConvertSurface(face, testSurface->format);
  244. SDLTest_AssertPass("Call to SDL_ConvertSurface()");
  245. SDLTest_AssertCheck(rface != NULL, "Verify result from SDL_ConvertSurface is not NULL");
  246. /* Compare surface. */
  247. ret = SDLTest_CompareSurfaces(rface, face, 0);
  248. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  249. /* Clean up. */
  250. SDL_DestroySurface(face);
  251. face = NULL;
  252. SDL_DestroySurface(rface);
  253. rface = NULL;
  254. return TEST_COMPLETED;
  255. }
  256. /**
  257. * Tests surface conversion across all pixel formats.
  258. */
  259. int surface_testCompleteSurfaceConversion(void *arg)
  260. {
  261. Uint32 pixel_formats[] = {
  262. SDL_PIXELFORMAT_INDEX8,
  263. SDL_PIXELFORMAT_RGB332,
  264. SDL_PIXELFORMAT_RGB444,
  265. SDL_PIXELFORMAT_BGR444,
  266. SDL_PIXELFORMAT_RGB555,
  267. SDL_PIXELFORMAT_BGR555,
  268. SDL_PIXELFORMAT_ARGB4444,
  269. SDL_PIXELFORMAT_RGBA4444,
  270. SDL_PIXELFORMAT_ABGR4444,
  271. SDL_PIXELFORMAT_BGRA4444,
  272. SDL_PIXELFORMAT_ARGB1555,
  273. SDL_PIXELFORMAT_RGBA5551,
  274. SDL_PIXELFORMAT_ABGR1555,
  275. SDL_PIXELFORMAT_BGRA5551,
  276. SDL_PIXELFORMAT_RGB565,
  277. SDL_PIXELFORMAT_BGR565,
  278. SDL_PIXELFORMAT_RGB24,
  279. SDL_PIXELFORMAT_BGR24,
  280. SDL_PIXELFORMAT_RGB888,
  281. SDL_PIXELFORMAT_RGBX8888,
  282. SDL_PIXELFORMAT_BGR888,
  283. SDL_PIXELFORMAT_BGRX8888,
  284. SDL_PIXELFORMAT_ARGB8888,
  285. SDL_PIXELFORMAT_RGBA8888,
  286. SDL_PIXELFORMAT_ABGR8888,
  287. SDL_PIXELFORMAT_BGRA8888,
  288. SDL_PIXELFORMAT_ARGB2101010,
  289. };
  290. SDL_Surface *face = NULL, *cvt1, *cvt2, *final;
  291. SDL_PixelFormat *fmt1, *fmt2;
  292. int i, j, ret = 0;
  293. /* Create sample surface */
  294. face = SDLTest_ImageFace();
  295. SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
  296. if (face == NULL) {
  297. return TEST_ABORTED;
  298. }
  299. /* Set transparent pixel as the pixel at (0,0) */
  300. if (face->format->palette) {
  301. ret = SDL_SetSurfaceColorKey(face, SDL_RLEACCEL, *(Uint8 *)face->pixels);
  302. SDLTest_AssertPass("Call to SDL_SetSurfaceColorKey()");
  303. SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceColorKey, expected: 0, got: %i", ret);
  304. }
  305. for (i = 0; i < SDL_arraysize(pixel_formats); ++i) {
  306. for (j = 0; j < SDL_arraysize(pixel_formats); ++j) {
  307. fmt1 = SDL_CreatePixelFormat(pixel_formats[i]);
  308. SDL_assert(fmt1 != NULL);
  309. cvt1 = SDL_ConvertSurface(face, fmt1);
  310. SDL_assert(cvt1 != NULL);
  311. fmt2 = SDL_CreatePixelFormat(pixel_formats[j]);
  312. SDL_assert(fmt1 != NULL);
  313. cvt2 = SDL_ConvertSurface(cvt1, fmt2);
  314. SDL_assert(cvt2 != NULL);
  315. if (fmt1->BytesPerPixel == face->format->BytesPerPixel &&
  316. fmt2->BytesPerPixel == face->format->BytesPerPixel &&
  317. (fmt1->Amask != 0) == (face->format->Amask != 0) &&
  318. (fmt2->Amask != 0) == (face->format->Amask != 0)) {
  319. final = SDL_ConvertSurface(cvt2, face->format);
  320. SDL_assert(final != NULL);
  321. /* Compare surface. */
  322. ret = SDLTest_CompareSurfaces(face, final, 0);
  323. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  324. SDL_DestroySurface(final);
  325. }
  326. SDL_DestroySurface(cvt1);
  327. SDL_DestroyPixelFormat(fmt1);
  328. SDL_DestroySurface(cvt2);
  329. SDL_DestroyPixelFormat(fmt2);
  330. }
  331. }
  332. /* Clean up. */
  333. SDL_DestroySurface(face);
  334. return TEST_COMPLETED;
  335. }
  336. /**
  337. * \brief Tests sprite loading. A failure case.
  338. */
  339. int surface_testLoadFailure(void *arg)
  340. {
  341. SDL_Surface *face = SDL_LoadBMP("nonexistant.bmp");
  342. SDLTest_AssertCheck(face == NULL, "SDL_CreateLoadBmp");
  343. return TEST_COMPLETED;
  344. }
  345. /**
  346. * \brief Tests some blitting routines.
  347. */
  348. int surface_testBlit(void *arg)
  349. {
  350. int ret;
  351. SDL_Surface *compareSurface;
  352. /* Basic blitting */
  353. testBlitBlendMode(-1);
  354. /* Verify result by comparing surfaces */
  355. compareSurface = SDLTest_ImageBlit();
  356. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  357. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  358. /* Clean up. */
  359. SDL_DestroySurface(compareSurface);
  360. return TEST_COMPLETED;
  361. }
  362. /**
  363. * \brief Tests some blitting routines with color mod
  364. */
  365. int surface_testBlitColorMod(void *arg)
  366. {
  367. int ret;
  368. SDL_Surface *compareSurface;
  369. /* Basic blitting with color mod */
  370. testBlitBlendMode(-2);
  371. /* Verify result by comparing surfaces */
  372. compareSurface = SDLTest_ImageBlitColor();
  373. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  374. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  375. /* Clean up. */
  376. SDL_DestroySurface(compareSurface);
  377. return TEST_COMPLETED;
  378. }
  379. /**
  380. * \brief Tests some blitting routines with alpha mod
  381. */
  382. int surface_testBlitAlphaMod(void *arg)
  383. {
  384. int ret;
  385. SDL_Surface *compareSurface;
  386. /* Basic blitting with alpha mod */
  387. testBlitBlendMode(-3);
  388. /* Verify result by comparing surfaces */
  389. compareSurface = SDLTest_ImageBlitAlpha();
  390. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  391. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  392. /* Clean up. */
  393. SDL_DestroySurface(compareSurface);
  394. return TEST_COMPLETED;
  395. }
  396. /**
  397. * \brief Tests some more blitting routines.
  398. */
  399. int surface_testBlitBlendNone(void *arg)
  400. {
  401. int ret;
  402. SDL_Surface *compareSurface;
  403. /* Basic blitting */
  404. testBlitBlendMode(SDL_BLENDMODE_NONE);
  405. /* Verify result by comparing surfaces */
  406. compareSurface = SDLTest_ImageBlitBlendNone();
  407. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  408. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  409. /* Clean up. */
  410. SDL_DestroySurface(compareSurface);
  411. return TEST_COMPLETED;
  412. }
  413. /**
  414. * \brief Tests some more blitting routines.
  415. */
  416. int surface_testBlitBlendBlend(void *arg)
  417. {
  418. int ret;
  419. SDL_Surface *compareSurface;
  420. /* Blend blitting */
  421. testBlitBlendMode(SDL_BLENDMODE_BLEND);
  422. /* Verify result by comparing surfaces */
  423. compareSurface = SDLTest_ImageBlitBlend();
  424. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  425. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  426. /* Clean up. */
  427. SDL_DestroySurface(compareSurface);
  428. return TEST_COMPLETED;
  429. }
  430. /**
  431. * \brief Tests some more blitting routines.
  432. */
  433. int surface_testBlitBlendAdd(void *arg)
  434. {
  435. int ret;
  436. SDL_Surface *compareSurface;
  437. /* Add blitting */
  438. testBlitBlendMode(SDL_BLENDMODE_ADD);
  439. /* Verify result by comparing surfaces */
  440. compareSurface = SDLTest_ImageBlitBlendAdd();
  441. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  442. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  443. /* Clean up. */
  444. SDL_DestroySurface(compareSurface);
  445. return TEST_COMPLETED;
  446. }
  447. /**
  448. * \brief Tests some more blitting routines.
  449. */
  450. int surface_testBlitBlendMod(void *arg)
  451. {
  452. int ret;
  453. SDL_Surface *compareSurface;
  454. /* Mod blitting */
  455. testBlitBlendMode(SDL_BLENDMODE_MOD);
  456. /* Verify result by comparing surfaces */
  457. compareSurface = SDLTest_ImageBlitBlendMod();
  458. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  459. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  460. /* Clean up. */
  461. SDL_DestroySurface(compareSurface);
  462. return TEST_COMPLETED;
  463. }
  464. /**
  465. * \brief Tests some more blitting routines with loop
  466. */
  467. int surface_testBlitBlendLoop(void *arg)
  468. {
  469. int ret;
  470. SDL_Surface *compareSurface;
  471. /* All blitting modes */
  472. testBlitBlendMode(-4);
  473. /* Verify result by comparing surfaces */
  474. compareSurface = SDLTest_ImageBlitBlendAll();
  475. ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0);
  476. SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
  477. /* Clean up. */
  478. SDL_DestroySurface(compareSurface);
  479. return TEST_COMPLETED;
  480. }
  481. int surface_testOverflow(void *arg)
  482. {
  483. char buf[1024];
  484. const char *expectedError;
  485. SDL_Surface *surface;
  486. SDL_memset(buf, '\0', sizeof(buf));
  487. expectedError = "Parameter 'width' is invalid";
  488. surface = SDL_CreateSurface(-3, 100, SDL_PIXELFORMAT_INDEX8);
  489. SDLTest_AssertCheck(surface == NULL, "Should detect negative width");
  490. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  491. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  492. surface = SDL_CreateSurfaceFrom(buf, -1, 1, 4, SDL_PIXELFORMAT_INDEX8);
  493. SDLTest_AssertCheck(surface == NULL, "Should detect negative width");
  494. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  495. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  496. surface = SDL_CreateSurfaceFrom(buf, -1, 1, 4, SDL_PIXELFORMAT_RGBA8888);
  497. SDLTest_AssertCheck(surface == NULL, "Should detect negative width");
  498. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  499. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  500. expectedError = "Parameter 'height' is invalid";
  501. surface = SDL_CreateSurface(100, -3, SDL_PIXELFORMAT_INDEX8);
  502. SDLTest_AssertCheck(surface == NULL, "Should detect negative height");
  503. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  504. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  505. surface = SDL_CreateSurfaceFrom(buf, 1, -1, 4, SDL_PIXELFORMAT_INDEX8);
  506. SDLTest_AssertCheck(surface == NULL, "Should detect negative height");
  507. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  508. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  509. surface = SDL_CreateSurfaceFrom(buf, 1, -1, 4, SDL_PIXELFORMAT_RGBA8888);
  510. SDLTest_AssertCheck(surface == NULL, "Should detect negative height");
  511. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  512. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  513. expectedError = "Parameter 'pitch' is invalid";
  514. surface = SDL_CreateSurfaceFrom(buf, 4, 1, -1, SDL_PIXELFORMAT_INDEX8);
  515. SDLTest_AssertCheck(surface == NULL, "Should detect negative pitch");
  516. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  517. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  518. surface = SDL_CreateSurfaceFrom(buf, 1, 1, -1, SDL_PIXELFORMAT_RGBA8888);
  519. SDLTest_AssertCheck(surface == NULL, "Should detect negative pitch");
  520. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  521. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  522. surface = SDL_CreateSurfaceFrom(buf, 1, 1, 0, SDL_PIXELFORMAT_RGBA8888);
  523. SDLTest_AssertCheck(surface == NULL, "Should detect zero pitch");
  524. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  525. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  526. surface = SDL_CreateSurfaceFrom(NULL, 1, 1, 0, SDL_PIXELFORMAT_RGBA8888);
  527. SDLTest_AssertCheck(surface != NULL, "Allow zero pitch for partially set up surfaces: %s",
  528. surface != NULL ? "(success)" : SDL_GetError());
  529. SDL_DestroySurface(surface);
  530. /* Less than 1 byte per pixel: the pitch can legitimately be less than
  531. * the width, but it must be enough to hold the appropriate number of
  532. * bits per pixel. SDL_PIXELFORMAT_INDEX4LSB* needs 1 byte per 2 pixels. */
  533. surface = SDL_CreateSurfaceFrom(buf, 6, 1, 3, SDL_PIXELFORMAT_INDEX4LSB);
  534. SDLTest_AssertCheck(surface != NULL, "6px * 4 bits per px fits in 3 bytes: %s",
  535. surface != NULL ? "(success)" : SDL_GetError());
  536. SDL_DestroySurface(surface);
  537. surface = SDL_CreateSurfaceFrom(buf, 6, 1, 3, SDL_PIXELFORMAT_INDEX4LSB);
  538. SDLTest_AssertCheck(surface != NULL, "6px * 4 bits per px fits in 3 bytes: %s",
  539. surface != NULL ? "(success)" : SDL_GetError());
  540. SDL_DestroySurface(surface);
  541. surface = SDL_CreateSurfaceFrom(buf, 7, 1, 3, SDL_PIXELFORMAT_INDEX4LSB);
  542. SDLTest_AssertCheck(surface == NULL, "Should detect pitch < width * bpp");
  543. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  544. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  545. surface = SDL_CreateSurfaceFrom(buf, 7, 1, 3, SDL_PIXELFORMAT_INDEX4LSB);
  546. SDLTest_AssertCheck(surface == NULL, "Should detect pitch < width * bpp");
  547. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  548. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  549. surface = SDL_CreateSurfaceFrom(buf, 7, 1, 4, SDL_PIXELFORMAT_INDEX4LSB);
  550. SDLTest_AssertCheck(surface != NULL, "7px * 4 bits per px fits in 4 bytes: %s",
  551. surface != NULL ? "(success)" : SDL_GetError());
  552. SDL_DestroySurface(surface);
  553. surface = SDL_CreateSurfaceFrom(buf, 7, 1, 4, SDL_PIXELFORMAT_INDEX4LSB);
  554. SDLTest_AssertCheck(surface != NULL, "7px * 4 bits per px fits in 4 bytes: %s",
  555. surface != NULL ? "(success)" : SDL_GetError());
  556. SDL_DestroySurface(surface);
  557. /* SDL_PIXELFORMAT_INDEX1* needs 1 byte per 8 pixels. */
  558. surface = SDL_CreateSurfaceFrom(buf, 16, 1, 2, SDL_PIXELFORMAT_INDEX1LSB);
  559. SDLTest_AssertCheck(surface != NULL, "16px * 1 bit per px fits in 2 bytes: %s",
  560. surface != NULL ? "(success)" : SDL_GetError());
  561. SDL_DestroySurface(surface);
  562. surface = SDL_CreateSurfaceFrom(buf, 16, 1, 2, SDL_PIXELFORMAT_INDEX1LSB);
  563. SDLTest_AssertCheck(surface != NULL, "16px * 1 bit per px fits in 2 bytes: %s",
  564. surface != NULL ? "(success)" : SDL_GetError());
  565. SDL_DestroySurface(surface);
  566. surface = SDL_CreateSurfaceFrom(buf, 17, 1, 2, SDL_PIXELFORMAT_INDEX1LSB);
  567. SDLTest_AssertCheck(surface == NULL, "Should detect pitch < width * bpp");
  568. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  569. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  570. surface = SDL_CreateSurfaceFrom(buf, 17, 1, 2, SDL_PIXELFORMAT_INDEX1LSB);
  571. SDLTest_AssertCheck(surface == NULL, "Should detect pitch < width * bpp");
  572. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  573. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  574. surface = SDL_CreateSurfaceFrom(buf, 17, 1, 3, SDL_PIXELFORMAT_INDEX1LSB);
  575. SDLTest_AssertCheck(surface != NULL, "17px * 1 bit per px fits in 3 bytes: %s",
  576. surface != NULL ? "(success)" : SDL_GetError());
  577. SDL_DestroySurface(surface);
  578. surface = SDL_CreateSurfaceFrom(buf, 17, 1, 3, SDL_PIXELFORMAT_INDEX1LSB);
  579. SDLTest_AssertCheck(surface != NULL, "17px * 1 bit per px fits in 3 bytes: %s",
  580. surface != NULL ? "(success)" : SDL_GetError());
  581. SDL_DestroySurface(surface);
  582. /* SDL_PIXELFORMAT_INDEX8 and SDL_PIXELFORMAT_RGB332 require 1 byte per pixel. */
  583. surface = SDL_CreateSurfaceFrom(buf, 5, 1, 5, SDL_PIXELFORMAT_RGB332);
  584. SDLTest_AssertCheck(surface != NULL, "5px * 8 bits per px fits in 5 bytes: %s",
  585. surface != NULL ? "(success)" : SDL_GetError());
  586. SDL_DestroySurface(surface);
  587. surface = SDL_CreateSurfaceFrom(buf, 5, 1, 5, SDL_PIXELFORMAT_INDEX8);
  588. SDLTest_AssertCheck(surface != NULL, "5px * 8 bits per px fits in 5 bytes: %s",
  589. surface != NULL ? "(success)" : SDL_GetError());
  590. SDL_DestroySurface(surface);
  591. surface = SDL_CreateSurfaceFrom(buf, 6, 1, 5, SDL_PIXELFORMAT_RGB332);
  592. SDLTest_AssertCheck(surface == NULL, "Should detect pitch < width * bpp");
  593. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  594. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  595. surface = SDL_CreateSurfaceFrom(buf, 6, 1, 5, SDL_PIXELFORMAT_INDEX8);
  596. SDLTest_AssertCheck(surface == NULL, "Should detect pitch < width * bpp");
  597. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  598. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  599. /* Everything else requires more than 1 byte per pixel, and rounds up
  600. * each pixel to an integer number of bytes (e.g. RGB555 is really
  601. * XRGB1555, with 1 bit per pixel wasted). */
  602. surface = SDL_CreateSurfaceFrom(buf, 3, 1, 6, SDL_PIXELFORMAT_RGB555);
  603. SDLTest_AssertCheck(surface != NULL, "3px * 15 (really 16) bits per px fits in 6 bytes: %s",
  604. surface != NULL ? "(success)" : SDL_GetError());
  605. SDL_DestroySurface(surface);
  606. surface = SDL_CreateSurfaceFrom(buf, 3, 1, 6, SDL_PIXELFORMAT_RGB555);
  607. SDLTest_AssertCheck(surface != NULL, "5px * 15 (really 16) bits per px fits in 6 bytes: %s",
  608. surface != NULL ? "(success)" : SDL_GetError());
  609. SDL_DestroySurface(surface);
  610. surface = SDL_CreateSurfaceFrom(buf, 4, 1, 6, SDL_PIXELFORMAT_RGB555);
  611. SDLTest_AssertCheck(surface == NULL, "4px * 15 (really 16) bits per px doesn't fit in 6 bytes");
  612. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  613. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  614. surface = SDL_CreateSurfaceFrom(buf, 4, 1, 6, SDL_PIXELFORMAT_XRGB1555);
  615. SDLTest_AssertCheck(surface == NULL, "4px * 15 (really 16) bits per px doesn't fit in 6 bytes");
  616. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  617. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  618. if (sizeof(size_t) == 4 && sizeof(int) >= 4) {
  619. expectedError = "Out of memory";
  620. surface = SDL_CreateSurface(SDL_MAX_SINT32, 1, SDL_PIXELFORMAT_INDEX8);
  621. SDLTest_AssertCheck(surface == NULL, "Should detect overflow in width + alignment");
  622. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  623. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  624. surface = SDL_CreateSurface(SDL_MAX_SINT32 / 2, 1, SDL_PIXELFORMAT_ARGB8888);
  625. SDLTest_AssertCheck(surface == NULL, "Should detect overflow in width * bytes per pixel");
  626. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  627. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  628. surface = SDL_CreateSurface((1 << 29) - 1, (1 << 29) - 1, SDL_PIXELFORMAT_INDEX8);
  629. SDLTest_AssertCheck(surface == NULL, "Should detect overflow in width * height");
  630. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  631. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  632. surface = SDL_CreateSurface((1 << 15) + 1, (1 << 15) + 1, SDL_PIXELFORMAT_ARGB8888);
  633. SDLTest_AssertCheck(surface == NULL, "Should detect overflow in width * height * bytes per pixel");
  634. SDLTest_AssertCheck(SDL_strcmp(SDL_GetError(), expectedError) == 0,
  635. "Expected \"%s\", got \"%s\"", expectedError, SDL_GetError());
  636. } else {
  637. SDLTest_Log("Can't easily overflow size_t on this platform");
  638. }
  639. return TEST_COMPLETED;
  640. }
  641. /* ================= Test References ================== */
  642. /* Surface test cases */
  643. static const SDLTest_TestCaseReference surfaceTest1 = {
  644. (SDLTest_TestCaseFp)surface_testSaveLoadBitmap, "surface_testSaveLoadBitmap", "Tests sprite saving and loading.", TEST_ENABLED
  645. };
  646. static const SDLTest_TestCaseReference surfaceTest2 = {
  647. (SDLTest_TestCaseFp)surface_testBlit, "surface_testBlit", "Tests basic blitting.", TEST_ENABLED
  648. };
  649. static const SDLTest_TestCaseReference surfaceTest3 = {
  650. (SDLTest_TestCaseFp)surface_testBlitBlendNone, "surface_testBlitBlendNone", "Tests blitting routines with none blending mode.", TEST_ENABLED
  651. };
  652. static const SDLTest_TestCaseReference surfaceTest4 = {
  653. (SDLTest_TestCaseFp)surface_testLoadFailure, "surface_testLoadFailure", "Tests sprite loading. A failure case.", TEST_ENABLED
  654. };
  655. static const SDLTest_TestCaseReference surfaceTest5 = {
  656. (SDLTest_TestCaseFp)surface_testSurfaceConversion, "surface_testSurfaceConversion", "Tests surface conversion.", TEST_ENABLED
  657. };
  658. static const SDLTest_TestCaseReference surfaceTest6 = {
  659. (SDLTest_TestCaseFp)surface_testCompleteSurfaceConversion, "surface_testCompleteSurfaceConversion", "Tests surface conversion across all pixel formats", TEST_ENABLED
  660. };
  661. static const SDLTest_TestCaseReference surfaceTest7 = {
  662. (SDLTest_TestCaseFp)surface_testBlitColorMod, "surface_testBlitColorMod", "Tests some blitting routines with color mod.", TEST_ENABLED
  663. };
  664. static const SDLTest_TestCaseReference surfaceTest8 = {
  665. (SDLTest_TestCaseFp)surface_testBlitAlphaMod, "surface_testBlitAlphaMod", "Tests some blitting routines with alpha mod.", TEST_ENABLED
  666. };
  667. /* TODO: rewrite test case, define new test data and re-enable; current implementation fails */
  668. static const SDLTest_TestCaseReference surfaceTest9 = {
  669. (SDLTest_TestCaseFp)surface_testBlitBlendLoop, "surface_testBlitBlendLoop", "Test blitting routines with various blending modes", TEST_DISABLED
  670. };
  671. /* TODO: rewrite test case, define new test data and re-enable; current implementation fails */
  672. static const SDLTest_TestCaseReference surfaceTest10 = {
  673. (SDLTest_TestCaseFp)surface_testBlitBlendBlend, "surface_testBlitBlendBlend", "Tests blitting routines with blend blending mode.", TEST_DISABLED
  674. };
  675. /* TODO: rewrite test case, define new test data and re-enable; current implementation fails */
  676. static const SDLTest_TestCaseReference surfaceTest11 = {
  677. (SDLTest_TestCaseFp)surface_testBlitBlendAdd, "surface_testBlitBlendAdd", "Tests blitting routines with add blending mode.", TEST_DISABLED
  678. };
  679. static const SDLTest_TestCaseReference surfaceTest12 = {
  680. (SDLTest_TestCaseFp)surface_testBlitBlendMod, "surface_testBlitBlendMod", "Tests blitting routines with mod blending mode.", TEST_ENABLED
  681. };
  682. static const SDLTest_TestCaseReference surfaceTestOverflow = {
  683. surface_testOverflow, "surface_testOverflow", "Test overflow detection.", TEST_ENABLED
  684. };
  685. /* Sequence of Surface test cases */
  686. static const SDLTest_TestCaseReference *surfaceTests[] = {
  687. &surfaceTest1, &surfaceTest2, &surfaceTest3, &surfaceTest4, &surfaceTest5,
  688. &surfaceTest6, &surfaceTest7, &surfaceTest8, &surfaceTest9, &surfaceTest10,
  689. &surfaceTest11, &surfaceTest12, &surfaceTestOverflow, NULL
  690. };
  691. /* Surface test suite (global) */
  692. SDLTest_TestSuiteReference surfaceTestSuite = {
  693. "Surface",
  694. surfaceSetUp,
  695. surfaceTests,
  696. surfaceTearDown
  697. };