testpalette.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. /*
  2. Copyright (C) 1997-2025 Sam Lantinga <[email protected]>
  3. This software is provided 'as-is', without any express or implied
  4. warranty. In no event will the authors be held liable for any damages
  5. arising from the use of this software.
  6. Permission is granted to anyone to use this software for any purpose,
  7. including commercial applications, and to alter it and redistribute it
  8. freely.
  9. */
  10. /* Simple program: Move N sprites around on the screen as fast as possible */
  11. #include <SDL3/SDL.h>
  12. #include <SDL3/SDL_test_memory.h>
  13. #include <SDL3/SDL_main.h>
  14. #ifdef SDL_PLATFORM_EMSCRIPTEN
  15. #include <emscripten/emscripten.h>
  16. #endif
  17. #define WINDOW_WIDTH 640
  18. #define WINDOW_HEIGHT 480
  19. static const SDL_Color Palette[256] = {
  20. { 255, 0, 0, SDL_ALPHA_OPAQUE },
  21. { 255, 5, 0, SDL_ALPHA_OPAQUE },
  22. { 255, 11, 0, SDL_ALPHA_OPAQUE },
  23. { 255, 17, 0, SDL_ALPHA_OPAQUE },
  24. { 255, 23, 0, SDL_ALPHA_OPAQUE },
  25. { 255, 29, 0, SDL_ALPHA_OPAQUE },
  26. { 255, 35, 0, SDL_ALPHA_OPAQUE },
  27. { 255, 41, 0, SDL_ALPHA_OPAQUE },
  28. { 255, 47, 0, SDL_ALPHA_OPAQUE },
  29. { 255, 53, 0, SDL_ALPHA_OPAQUE },
  30. { 255, 59, 0, SDL_ALPHA_OPAQUE },
  31. { 255, 65, 0, SDL_ALPHA_OPAQUE },
  32. { 255, 71, 0, SDL_ALPHA_OPAQUE },
  33. { 255, 77, 0, SDL_ALPHA_OPAQUE },
  34. { 255, 83, 0, SDL_ALPHA_OPAQUE },
  35. { 255, 89, 0, SDL_ALPHA_OPAQUE },
  36. { 255, 95, 0, SDL_ALPHA_OPAQUE },
  37. { 255, 101, 0, SDL_ALPHA_OPAQUE },
  38. { 255, 107, 0, SDL_ALPHA_OPAQUE },
  39. { 255, 113, 0, SDL_ALPHA_OPAQUE },
  40. { 255, 119, 0, SDL_ALPHA_OPAQUE },
  41. { 255, 125, 0, SDL_ALPHA_OPAQUE },
  42. { 255, 131, 0, SDL_ALPHA_OPAQUE },
  43. { 255, 137, 0, SDL_ALPHA_OPAQUE },
  44. { 255, 143, 0, SDL_ALPHA_OPAQUE },
  45. { 255, 149, 0, SDL_ALPHA_OPAQUE },
  46. { 255, 155, 0, SDL_ALPHA_OPAQUE },
  47. { 255, 161, 0, SDL_ALPHA_OPAQUE },
  48. { 255, 167, 0, SDL_ALPHA_OPAQUE },
  49. { 255, 173, 0, SDL_ALPHA_OPAQUE },
  50. { 255, 179, 0, SDL_ALPHA_OPAQUE },
  51. { 255, 185, 0, SDL_ALPHA_OPAQUE },
  52. { 255, 191, 0, SDL_ALPHA_OPAQUE },
  53. { 255, 197, 0, SDL_ALPHA_OPAQUE },
  54. { 255, 203, 0, SDL_ALPHA_OPAQUE },
  55. { 255, 209, 0, SDL_ALPHA_OPAQUE },
  56. { 255, 215, 0, SDL_ALPHA_OPAQUE },
  57. { 255, 221, 0, SDL_ALPHA_OPAQUE },
  58. { 255, 227, 0, SDL_ALPHA_OPAQUE },
  59. { 255, 233, 0, SDL_ALPHA_OPAQUE },
  60. { 255, 239, 0, SDL_ALPHA_OPAQUE },
  61. { 255, 245, 0, SDL_ALPHA_OPAQUE },
  62. { 255, 251, 0, SDL_ALPHA_OPAQUE },
  63. { 253, 255, 0, SDL_ALPHA_OPAQUE },
  64. { 247, 255, 0, SDL_ALPHA_OPAQUE },
  65. { 241, 255, 0, SDL_ALPHA_OPAQUE },
  66. { 235, 255, 0, SDL_ALPHA_OPAQUE },
  67. { 229, 255, 0, SDL_ALPHA_OPAQUE },
  68. { 223, 255, 0, SDL_ALPHA_OPAQUE },
  69. { 217, 255, 0, SDL_ALPHA_OPAQUE },
  70. { 211, 255, 0, SDL_ALPHA_OPAQUE },
  71. { 205, 255, 0, SDL_ALPHA_OPAQUE },
  72. { 199, 255, 0, SDL_ALPHA_OPAQUE },
  73. { 193, 255, 0, SDL_ALPHA_OPAQUE },
  74. { 187, 255, 0, SDL_ALPHA_OPAQUE },
  75. { 181, 255, 0, SDL_ALPHA_OPAQUE },
  76. { 175, 255, 0, SDL_ALPHA_OPAQUE },
  77. { 169, 255, 0, SDL_ALPHA_OPAQUE },
  78. { 163, 255, 0, SDL_ALPHA_OPAQUE },
  79. { 157, 255, 0, SDL_ALPHA_OPAQUE },
  80. { 151, 255, 0, SDL_ALPHA_OPAQUE },
  81. { 145, 255, 0, SDL_ALPHA_OPAQUE },
  82. { 139, 255, 0, SDL_ALPHA_OPAQUE },
  83. { 133, 255, 0, SDL_ALPHA_OPAQUE },
  84. { 127, 255, 0, SDL_ALPHA_OPAQUE },
  85. { 121, 255, 0, SDL_ALPHA_OPAQUE },
  86. { 115, 255, 0, SDL_ALPHA_OPAQUE },
  87. { 109, 255, 0, SDL_ALPHA_OPAQUE },
  88. { 103, 255, 0, SDL_ALPHA_OPAQUE },
  89. { 97, 255, 0, SDL_ALPHA_OPAQUE },
  90. { 91, 255, 0, SDL_ALPHA_OPAQUE },
  91. { 85, 255, 0, SDL_ALPHA_OPAQUE },
  92. { 79, 255, 0, SDL_ALPHA_OPAQUE },
  93. { 73, 255, 0, SDL_ALPHA_OPAQUE },
  94. { 67, 255, 0, SDL_ALPHA_OPAQUE },
  95. { 61, 255, 0, SDL_ALPHA_OPAQUE },
  96. { 55, 255, 0, SDL_ALPHA_OPAQUE },
  97. { 49, 255, 0, SDL_ALPHA_OPAQUE },
  98. { 43, 255, 0, SDL_ALPHA_OPAQUE },
  99. { 37, 255, 0, SDL_ALPHA_OPAQUE },
  100. { 31, 255, 0, SDL_ALPHA_OPAQUE },
  101. { 25, 255, 0, SDL_ALPHA_OPAQUE },
  102. { 19, 255, 0, SDL_ALPHA_OPAQUE },
  103. { 13, 255, 0, SDL_ALPHA_OPAQUE },
  104. { 7, 255, 0, SDL_ALPHA_OPAQUE },
  105. { 1, 255, 0, SDL_ALPHA_OPAQUE },
  106. { 0, 255, 3, SDL_ALPHA_OPAQUE },
  107. { 0, 255, 9, SDL_ALPHA_OPAQUE },
  108. { 0, 255, 15, SDL_ALPHA_OPAQUE },
  109. { 0, 255, 21, SDL_ALPHA_OPAQUE },
  110. { 0, 255, 27, SDL_ALPHA_OPAQUE },
  111. { 0, 255, 33, SDL_ALPHA_OPAQUE },
  112. { 0, 255, 39, SDL_ALPHA_OPAQUE },
  113. { 0, 255, 45, SDL_ALPHA_OPAQUE },
  114. { 0, 255, 51, SDL_ALPHA_OPAQUE },
  115. { 0, 255, 57, SDL_ALPHA_OPAQUE },
  116. { 0, 255, 63, SDL_ALPHA_OPAQUE },
  117. { 0, 255, 69, SDL_ALPHA_OPAQUE },
  118. { 0, 255, 75, SDL_ALPHA_OPAQUE },
  119. { 0, 255, 81, SDL_ALPHA_OPAQUE },
  120. { 0, 255, 87, SDL_ALPHA_OPAQUE },
  121. { 0, 255, 93, SDL_ALPHA_OPAQUE },
  122. { 0, 255, 99, SDL_ALPHA_OPAQUE },
  123. { 0, 255, 105, SDL_ALPHA_OPAQUE },
  124. { 0, 255, 111, SDL_ALPHA_OPAQUE },
  125. { 0, 255, 117, SDL_ALPHA_OPAQUE },
  126. { 0, 255, 123, SDL_ALPHA_OPAQUE },
  127. { 0, 255, 129, SDL_ALPHA_OPAQUE },
  128. { 0, 255, 135, SDL_ALPHA_OPAQUE },
  129. { 0, 255, 141, SDL_ALPHA_OPAQUE },
  130. { 0, 255, 147, SDL_ALPHA_OPAQUE },
  131. { 0, 255, 153, SDL_ALPHA_OPAQUE },
  132. { 0, 255, 159, SDL_ALPHA_OPAQUE },
  133. { 0, 255, 165, SDL_ALPHA_OPAQUE },
  134. { 0, 255, 171, SDL_ALPHA_OPAQUE },
  135. { 0, 255, 177, SDL_ALPHA_OPAQUE },
  136. { 0, 255, 183, SDL_ALPHA_OPAQUE },
  137. { 0, 255, 189, SDL_ALPHA_OPAQUE },
  138. { 0, 255, 195, SDL_ALPHA_OPAQUE },
  139. { 0, 255, 201, SDL_ALPHA_OPAQUE },
  140. { 0, 255, 207, SDL_ALPHA_OPAQUE },
  141. { 0, 255, 213, SDL_ALPHA_OPAQUE },
  142. { 0, 255, 219, SDL_ALPHA_OPAQUE },
  143. { 0, 255, 225, SDL_ALPHA_OPAQUE },
  144. { 0, 255, 231, SDL_ALPHA_OPAQUE },
  145. { 0, 255, 237, SDL_ALPHA_OPAQUE },
  146. { 0, 255, 243, SDL_ALPHA_OPAQUE },
  147. { 0, 255, 249, SDL_ALPHA_OPAQUE },
  148. { 0, 255, 255, SDL_ALPHA_OPAQUE },
  149. { 0, 249, 255, SDL_ALPHA_OPAQUE },
  150. { 0, 243, 255, SDL_ALPHA_OPAQUE },
  151. { 0, 237, 255, SDL_ALPHA_OPAQUE },
  152. { 0, 231, 255, SDL_ALPHA_OPAQUE },
  153. { 0, 225, 255, SDL_ALPHA_OPAQUE },
  154. { 0, 219, 255, SDL_ALPHA_OPAQUE },
  155. { 0, 213, 255, SDL_ALPHA_OPAQUE },
  156. { 0, 207, 255, SDL_ALPHA_OPAQUE },
  157. { 0, 201, 255, SDL_ALPHA_OPAQUE },
  158. { 0, 195, 255, SDL_ALPHA_OPAQUE },
  159. { 0, 189, 255, SDL_ALPHA_OPAQUE },
  160. { 0, 183, 255, SDL_ALPHA_OPAQUE },
  161. { 0, 177, 255, SDL_ALPHA_OPAQUE },
  162. { 0, 171, 255, SDL_ALPHA_OPAQUE },
  163. { 0, 165, 255, SDL_ALPHA_OPAQUE },
  164. { 0, 159, 255, SDL_ALPHA_OPAQUE },
  165. { 0, 153, 255, SDL_ALPHA_OPAQUE },
  166. { 0, 147, 255, SDL_ALPHA_OPAQUE },
  167. { 0, 141, 255, SDL_ALPHA_OPAQUE },
  168. { 0, 135, 255, SDL_ALPHA_OPAQUE },
  169. { 0, 129, 255, SDL_ALPHA_OPAQUE },
  170. { 0, 123, 255, SDL_ALPHA_OPAQUE },
  171. { 0, 117, 255, SDL_ALPHA_OPAQUE },
  172. { 0, 111, 255, SDL_ALPHA_OPAQUE },
  173. { 0, 105, 255, SDL_ALPHA_OPAQUE },
  174. { 0, 99, 255, SDL_ALPHA_OPAQUE },
  175. { 0, 93, 255, SDL_ALPHA_OPAQUE },
  176. { 0, 87, 255, SDL_ALPHA_OPAQUE },
  177. { 0, 81, 255, SDL_ALPHA_OPAQUE },
  178. { 0, 75, 255, SDL_ALPHA_OPAQUE },
  179. { 0, 69, 255, SDL_ALPHA_OPAQUE },
  180. { 0, 63, 255, SDL_ALPHA_OPAQUE },
  181. { 0, 57, 255, SDL_ALPHA_OPAQUE },
  182. { 0, 51, 255, SDL_ALPHA_OPAQUE },
  183. { 0, 45, 255, SDL_ALPHA_OPAQUE },
  184. { 0, 39, 255, SDL_ALPHA_OPAQUE },
  185. { 0, 33, 255, SDL_ALPHA_OPAQUE },
  186. { 0, 27, 255, SDL_ALPHA_OPAQUE },
  187. { 0, 21, 255, SDL_ALPHA_OPAQUE },
  188. { 0, 15, 255, SDL_ALPHA_OPAQUE },
  189. { 0, 9, 255, SDL_ALPHA_OPAQUE },
  190. { 0, 3, 255, SDL_ALPHA_OPAQUE },
  191. { 1, 0, 255, SDL_ALPHA_OPAQUE },
  192. { 7, 0, 255, SDL_ALPHA_OPAQUE },
  193. { 13, 0, 255, SDL_ALPHA_OPAQUE },
  194. { 19, 0, 255, SDL_ALPHA_OPAQUE },
  195. { 25, 0, 255, SDL_ALPHA_OPAQUE },
  196. { 31, 0, 255, SDL_ALPHA_OPAQUE },
  197. { 37, 0, 255, SDL_ALPHA_OPAQUE },
  198. { 43, 0, 255, SDL_ALPHA_OPAQUE },
  199. { 49, 0, 255, SDL_ALPHA_OPAQUE },
  200. { 55, 0, 255, SDL_ALPHA_OPAQUE },
  201. { 61, 0, 255, SDL_ALPHA_OPAQUE },
  202. { 67, 0, 255, SDL_ALPHA_OPAQUE },
  203. { 73, 0, 255, SDL_ALPHA_OPAQUE },
  204. { 79, 0, 255, SDL_ALPHA_OPAQUE },
  205. { 85, 0, 255, SDL_ALPHA_OPAQUE },
  206. { 91, 0, 255, SDL_ALPHA_OPAQUE },
  207. { 97, 0, 255, SDL_ALPHA_OPAQUE },
  208. { 103, 0, 255, SDL_ALPHA_OPAQUE },
  209. { 109, 0, 255, SDL_ALPHA_OPAQUE },
  210. { 115, 0, 255, SDL_ALPHA_OPAQUE },
  211. { 121, 0, 255, SDL_ALPHA_OPAQUE },
  212. { 127, 0, 255, SDL_ALPHA_OPAQUE },
  213. { 133, 0, 255, SDL_ALPHA_OPAQUE },
  214. { 139, 0, 255, SDL_ALPHA_OPAQUE },
  215. { 145, 0, 255, SDL_ALPHA_OPAQUE },
  216. { 151, 0, 255, SDL_ALPHA_OPAQUE },
  217. { 157, 0, 255, SDL_ALPHA_OPAQUE },
  218. { 163, 0, 255, SDL_ALPHA_OPAQUE },
  219. { 169, 0, 255, SDL_ALPHA_OPAQUE },
  220. { 175, 0, 255, SDL_ALPHA_OPAQUE },
  221. { 181, 0, 255, SDL_ALPHA_OPAQUE },
  222. { 187, 0, 255, SDL_ALPHA_OPAQUE },
  223. { 193, 0, 255, SDL_ALPHA_OPAQUE },
  224. { 199, 0, 255, SDL_ALPHA_OPAQUE },
  225. { 205, 0, 255, SDL_ALPHA_OPAQUE },
  226. { 211, 0, 255, SDL_ALPHA_OPAQUE },
  227. { 217, 0, 255, SDL_ALPHA_OPAQUE },
  228. { 223, 0, 255, SDL_ALPHA_OPAQUE },
  229. { 229, 0, 255, SDL_ALPHA_OPAQUE },
  230. { 235, 0, 255, SDL_ALPHA_OPAQUE },
  231. { 241, 0, 255, SDL_ALPHA_OPAQUE },
  232. { 247, 0, 255, SDL_ALPHA_OPAQUE },
  233. { 253, 0, 255, SDL_ALPHA_OPAQUE },
  234. { 255, 0, 251, SDL_ALPHA_OPAQUE },
  235. { 255, 0, 245, SDL_ALPHA_OPAQUE },
  236. { 255, 0, 239, SDL_ALPHA_OPAQUE },
  237. { 255, 0, 233, SDL_ALPHA_OPAQUE },
  238. { 255, 0, 227, SDL_ALPHA_OPAQUE },
  239. { 255, 0, 221, SDL_ALPHA_OPAQUE },
  240. { 255, 0, 215, SDL_ALPHA_OPAQUE },
  241. { 255, 0, 209, SDL_ALPHA_OPAQUE },
  242. { 255, 0, 203, SDL_ALPHA_OPAQUE },
  243. { 255, 0, 197, SDL_ALPHA_OPAQUE },
  244. { 255, 0, 191, SDL_ALPHA_OPAQUE },
  245. { 255, 0, 185, SDL_ALPHA_OPAQUE },
  246. { 255, 0, 179, SDL_ALPHA_OPAQUE },
  247. { 255, 0, 173, SDL_ALPHA_OPAQUE },
  248. { 255, 0, 167, SDL_ALPHA_OPAQUE },
  249. { 255, 0, 161, SDL_ALPHA_OPAQUE },
  250. { 255, 0, 155, SDL_ALPHA_OPAQUE },
  251. { 255, 0, 149, SDL_ALPHA_OPAQUE },
  252. { 255, 0, 143, SDL_ALPHA_OPAQUE },
  253. { 255, 0, 137, SDL_ALPHA_OPAQUE },
  254. { 255, 0, 131, SDL_ALPHA_OPAQUE },
  255. { 255, 0, 125, SDL_ALPHA_OPAQUE },
  256. { 255, 0, 119, SDL_ALPHA_OPAQUE },
  257. { 255, 0, 113, SDL_ALPHA_OPAQUE },
  258. { 255, 0, 107, SDL_ALPHA_OPAQUE },
  259. { 255, 0, 101, SDL_ALPHA_OPAQUE },
  260. { 255, 0, 95, SDL_ALPHA_OPAQUE },
  261. { 255, 0, 89, SDL_ALPHA_OPAQUE },
  262. { 255, 0, 83, SDL_ALPHA_OPAQUE },
  263. { 255, 0, 77, SDL_ALPHA_OPAQUE },
  264. { 255, 0, 71, SDL_ALPHA_OPAQUE },
  265. { 255, 0, 65, SDL_ALPHA_OPAQUE },
  266. { 255, 0, 59, SDL_ALPHA_OPAQUE },
  267. { 255, 0, 53, SDL_ALPHA_OPAQUE },
  268. { 255, 0, 47, SDL_ALPHA_OPAQUE },
  269. { 255, 0, 41, SDL_ALPHA_OPAQUE },
  270. { 255, 0, 35, SDL_ALPHA_OPAQUE },
  271. { 255, 0, 29, SDL_ALPHA_OPAQUE },
  272. { 255, 0, 23, SDL_ALPHA_OPAQUE },
  273. { 255, 0, 17, SDL_ALPHA_OPAQUE },
  274. { 255, 0, 11, SDL_ALPHA_OPAQUE },
  275. { 255, 0, 5, SDL_ALPHA_OPAQUE }
  276. };
  277. static SDL_Renderer *renderer;
  278. static SDL_Palette *palette;
  279. static SDL_Texture *texture;
  280. static SDL_Texture *black_texture1;
  281. static SDL_Texture *black_texture2;
  282. static SDL_Texture *white_texture1;
  283. static SDL_Texture *white_texture2;
  284. static int palettePos = 0;
  285. static int paletteDir = -1;
  286. static bool done;
  287. static SDL_Texture *CreateTexture(const void *pixels, int pitch)
  288. {
  289. SDL_Texture *tex = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_INDEX8, SDL_TEXTUREACCESS_STATIC, 256, 1);
  290. if (!tex) {
  291. return NULL;
  292. }
  293. SDL_UpdateTexture(tex, NULL, pixels, pitch);
  294. SDL_SetTexturePalette(tex, palette);
  295. return tex;
  296. }
  297. static bool CreateTextures()
  298. {
  299. Uint8 data[256];
  300. int i;
  301. palette = SDL_CreatePalette(256);
  302. if (!palette) {
  303. return false;
  304. }
  305. for (i = 0; i < SDL_arraysize(data); i++) {
  306. data[i] = i;
  307. }
  308. texture = CreateTexture(data, SDL_arraysize(data));
  309. if (!texture) {
  310. return false;
  311. }
  312. black_texture1 = CreateTexture(data, SDL_arraysize(data));
  313. if (!black_texture1) {
  314. return false;
  315. }
  316. black_texture2 = CreateTexture(data, SDL_arraysize(data));
  317. if (!black_texture2) {
  318. return false;
  319. }
  320. white_texture1 = CreateTexture(data, SDL_arraysize(data));
  321. if (!white_texture1) {
  322. return false;
  323. }
  324. white_texture2 = CreateTexture(data, SDL_arraysize(data));
  325. if (!white_texture2) {
  326. return false;
  327. }
  328. return true;
  329. }
  330. static void UpdatePalette(int pos)
  331. {
  332. int paletteSize = (int)SDL_arraysize(Palette);
  333. if (pos == 0) {
  334. SDL_SetPaletteColors(palette, Palette, 0, paletteSize);
  335. } else {
  336. SDL_SetPaletteColors(palette, Palette + pos, 0, paletteSize - pos);
  337. SDL_SetPaletteColors(palette, Palette, paletteSize - pos, pos);
  338. }
  339. }
  340. static void loop(void)
  341. {
  342. SDL_Event event;
  343. SDL_FRect src = { 1.0f, 0.0f, 1.0f, 1.0f };
  344. SDL_FRect dst1 = { 0.0f, 0.0f, 32.0f, 32.0f };
  345. SDL_FRect dst2 = { 0.0f, WINDOW_HEIGHT - 32.0f, 32.0f, 32.0f };
  346. SDL_FRect dst3 = { WINDOW_WIDTH - 32.0f, 0.0f, 32.0f, 32.0f };
  347. SDL_FRect dst4 = { WINDOW_WIDTH - 32.0f, WINDOW_HEIGHT - 32.0f, 32.0f, 32.0f };
  348. SDL_FRect dst5 = { 0.0f, 32.0f + 2.0f, 32.0f, 32.0f };
  349. SDL_FRect dst6 = { WINDOW_WIDTH - 32.0f, 32.0f + 2.0f, 32.0f, 32.0f };
  350. const SDL_Color black = { 0, 0, 0, SDL_ALPHA_OPAQUE };
  351. const SDL_Color white = { 255, 255, 255, SDL_ALPHA_OPAQUE };
  352. const SDL_Color red = { 255, 0, 0, SDL_ALPHA_OPAQUE };
  353. const SDL_Color blue = { 0, 0, 255, SDL_ALPHA_OPAQUE };
  354. /* Check for events */
  355. while (SDL_PollEvent(&event)) {
  356. switch (event.type) {
  357. case SDL_EVENT_KEY_UP:
  358. switch (event.key.key) {
  359. case SDLK_LEFT:
  360. paletteDir = 1;
  361. break;
  362. case SDLK_RIGHT:
  363. paletteDir = -1;
  364. break;
  365. case SDLK_ESCAPE:
  366. done = true;
  367. break;
  368. default:
  369. break;
  370. }
  371. break;
  372. case SDL_EVENT_QUIT:
  373. done = true;
  374. break;
  375. default:
  376. break;
  377. }
  378. }
  379. SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
  380. SDL_RenderClear(renderer);
  381. /* Draw the rainbow texture */
  382. UpdatePalette(palettePos);
  383. palettePos += paletteDir;
  384. if (palettePos < 0) {
  385. palettePos = SDL_arraysize(Palette) - 1;
  386. } else if (palettePos >= SDL_arraysize(Palette)) {
  387. palettePos = 0;
  388. }
  389. SDL_RenderTexture(renderer, texture, NULL, NULL);
  390. /* Draw one square with black, and one square with white
  391. * This tests changing palette colors within a single frame
  392. */
  393. SDL_SetPaletteColors(palette, &black, 1, 1);
  394. SDL_SetRenderDrawColor(renderer, black.r, black.g, black.b, black.a);
  395. SDL_RenderDebugText(renderer, dst1.x + 32.0f + 2.0f, dst1.y + 12, "Black");
  396. SDL_RenderTexture(renderer, black_texture1, &src, &dst1);
  397. SDL_RenderDebugText(renderer, dst2.x + 32.0f + 2.0f, dst2.y + 12, "Black");
  398. SDL_RenderTexture(renderer, black_texture2, &src, &dst2);
  399. SDL_SetPaletteColors(palette, &white, 1, 1);
  400. SDL_SetRenderDrawColor(renderer, white.r, white.g, white.b, white.a);
  401. SDL_RenderDebugText(renderer, dst3.x - 40.0f - 2.0f, dst3.y + 12, "White");
  402. SDL_RenderTexture(renderer, white_texture1, &src, &dst3);
  403. SDL_RenderDebugText(renderer, dst4.x - 40.0f - 2.0f, dst4.y + 12, "White");
  404. SDL_RenderTexture(renderer, white_texture2, &src, &dst4);
  405. /* Draw the same textures again with different colors */
  406. SDL_SetPaletteColors(palette, &red, 1, 1);
  407. SDL_SetRenderDrawColor(renderer, red.r, red.g, red.b, red.a);
  408. SDL_RenderDebugText(renderer, dst5.x + 32.0f + 2.0f, dst5.y + 12, "Red");
  409. SDL_RenderTexture(renderer, black_texture1, &src, &dst5);
  410. SDL_SetPaletteColors(palette, &blue, 1, 1);
  411. SDL_SetRenderDrawColor(renderer, blue.r, blue.g, blue.b, blue.a);
  412. SDL_RenderDebugText(renderer, dst6.x - 40.0f - 2.0f, dst6.y + 12, "Blue");
  413. SDL_RenderTexture(renderer, white_texture1, &src, &dst6);
  414. SDL_RenderPresent(renderer);
  415. SDL_Delay(10);
  416. #ifdef SDL_PLATFORM_EMSCRIPTEN
  417. if (done) {
  418. emscripten_cancel_main_loop();
  419. }
  420. #endif
  421. }
  422. int main(int argc, char *argv[])
  423. {
  424. SDL_Window *window = NULL;
  425. int i, return_code = -1;
  426. SDLTest_TrackAllocations();
  427. for (i = 1; i < argc; ++i) {
  428. if (SDL_strcmp(argv[1], "--renderer") == 0 && argv[i + 1]) {
  429. ++i;
  430. SDL_SetHint(SDL_HINT_RENDER_DRIVER, argv[i]);
  431. } else {
  432. SDL_Log("Usage: %s [--renderer driver]", argv[0]);
  433. return_code = 1;
  434. goto quit;
  435. }
  436. }
  437. if (!SDL_CreateWindowAndRenderer("testpalette", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_RESIZABLE, &window, &renderer)) {
  438. SDL_Log("SDL_CreateWindowAndRenderer failed: %s", SDL_GetError());
  439. return_code = 2;
  440. goto quit;
  441. }
  442. if (!CreateTextures()) {
  443. SDL_Log("Couldn't create textures: %s", SDL_GetError());
  444. return_code = 3;
  445. goto quit;
  446. }
  447. /* Main render loop */
  448. done = false;
  449. #ifdef SDL_PLATFORM_EMSCRIPTEN
  450. emscripten_set_main_loop(loop, 0, 1);
  451. #else
  452. while (!done) {
  453. loop();
  454. }
  455. #endif
  456. return_code = 0;
  457. quit:
  458. SDL_DestroyPalette(palette);
  459. SDL_DestroyRenderer(renderer);
  460. SDL_DestroyWindow(window);
  461. SDL_Quit();
  462. SDLTest_LogAllocations();
  463. return return_code;
  464. }