/jni/SDL_gfx/Test/TestImageFilter.c

https://github.com/kobr4/Lincity4droid · C · 538 lines · 325 code · 139 blank · 74 comment · 8 complexity · bf69438d8c3b4d5ce1234005d53a812d MD5 · raw file

  1. /*
  2. TestImageFilter
  3. Test program for MMX filter routines
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include "SDL.h"
  9. #ifdef WIN32
  10. #include <windows.h>
  11. #include "SDL_imageFilter.h"
  12. #ifndef bcmp
  13. #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n))
  14. #endif
  15. #else
  16. #include "SDL/SDL_imageFilter.h"
  17. #endif
  18. int total_count = 0;
  19. int ok_count = 0;
  20. void setup_src(unsigned char *src1, unsigned char *src2)
  21. {
  22. int i;
  23. src1[0]=1;
  24. src1[2]=1;
  25. src1[1]=4;
  26. src1[3]=3;
  27. src1[4]=33;
  28. for (i=5; i<14; i++) src1[i]=i;
  29. src1[14]=8;
  30. src2[0]=1;
  31. src2[1]=3;
  32. src2[2]=3;
  33. src2[3]=2;
  34. src2[4]=44;
  35. for (i=5; i<14; i++) src2[i]=14-i;
  36. src2[14]=10;
  37. }
  38. void print_result(char *label,unsigned char *src1, unsigned char *src2, unsigned char *dst)
  39. {
  40. char blabel[80];
  41. memset((void *)blabel,(int)' ',80);
  42. blabel[strlen(label)]=0;
  43. printf ("%s pos %2d %2d %2d %2d %2d %2d %2d %2d %2d .. %2d\n",blabel,0,1,2,3,4,5,6,7,8,14);
  44. printf ("%s src1 %02x %02x %02x %02x %02x %02x %02x %02x %02x .. %02x\n",blabel,src1[0],src1[1],src1[2],src1[3],src1[4],src1[5],src1[6],src1[7],src1[8],src1[14]);
  45. if (src2) {
  46. printf ("%s src2 %02x %02x %02x %02x %02x %02x %02x %02x %02x .. %02x\n",blabel,src2[0],src2[1],src2[2],src2[3],src2[4],src2[5],src2[6],src2[7],src2[8],src2[14]);
  47. }
  48. printf ("%s dest %02x %02x %02x %02x %02x %02x %02x %02x %02x .. %02x\n",label, dst[0], dst[1], dst[2], dst[3], dst[4], dst[5], dst[6], dst[7], dst[8],dst[14]);
  49. printf ("\n");
  50. }
  51. void print_compare(unsigned char *dst1, unsigned char *dst2)
  52. {
  53. total_count++;
  54. if (bcmp(dst1,dst2,15)==0) {
  55. printf ("OK\n");
  56. ok_count++;
  57. } else {
  58. printf ("ERROR\n");
  59. }
  60. }
  61. void print_line()
  62. {
  63. printf ("------------------------------------------------------------------------\n\n\n");
  64. }
  65. void pause()
  66. {
  67. char ch;
  68. do {
  69. ch = getchar();
  70. putchar('.');
  71. } while (ch != '\n');
  72. }
  73. /* ----------- main ---------- */
  74. int main(int argc, char *argv[])
  75. {
  76. unsigned char src1[15],src2[15],dstm[15],dstc[15];
  77. /* SDL_imageFilter Test */
  78. printf ("TestImageFilter\n\n");
  79. printf ("Testing an array of 15 bytes - first 8 bytes should be processed\n");
  80. printf ("by MMX or C code, the last 7 bytes only by C code.\n\n");
  81. print_line();
  82. SDL_imageFilterMMXon();
  83. setup_src(src1, src2);
  84. SDL_imageFilterBitAnd ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  85. print_result ("MMX BitAnd", src1, src2, dstm);
  86. SDL_imageFilterMMXoff();
  87. setup_src(src1, src2);
  88. SDL_imageFilterBitAnd ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  89. print_result (" C BitAnd", src1, src2, dstc);
  90. print_compare(dstm,dstc);
  91. print_line();
  92. SDL_imageFilterMMXon();
  93. setup_src(src1, src2);
  94. SDL_imageFilterBitOr ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  95. print_result ("MMX BitOr", src1, src2, dstm);
  96. SDL_imageFilterMMXoff();
  97. setup_src(src1, src2);
  98. SDL_imageFilterBitOr ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  99. print_result (" C BitOr", src1, src2, dstc);
  100. print_compare(dstm,dstc);
  101. print_line();
  102. SDL_imageFilterMMXon();
  103. setup_src(src1, src2);
  104. SDL_imageFilterAdd ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  105. print_result ("MMX Add", src1, src2, dstm);
  106. SDL_imageFilterMMXoff();
  107. setup_src(src1, src2);
  108. SDL_imageFilterAdd ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  109. print_result (" C Add", src1, src2, dstc);
  110. print_compare(dstm,dstc);
  111. print_line();
  112. SDL_imageFilterMMXon();
  113. setup_src(src1, src2);
  114. SDL_imageFilterAbsDiff ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  115. print_result ("MMX AbsDiff", src1, src2, dstm);
  116. SDL_imageFilterMMXoff();
  117. setup_src(src1, src2);
  118. SDL_imageFilterAbsDiff ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  119. print_result (" C AbsDiff", src1, src2, dstc);
  120. print_compare(dstm,dstc);
  121. print_line();
  122. SDL_imageFilterMMXon();
  123. setup_src(src1, src2);
  124. SDL_imageFilterMean ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  125. print_result ("MMX Mean", src1, src2, dstm);
  126. SDL_imageFilterMMXoff();
  127. setup_src(src1, src2);
  128. SDL_imageFilterMean ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  129. print_result (" C Mean", src1, src2, dstc);
  130. print_compare(dstm,dstc);
  131. print_line();
  132. SDL_imageFilterMMXon();
  133. setup_src(src1, src2);
  134. SDL_imageFilterSub ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  135. print_result ("MMX Sub", src1, src2, dstm);
  136. SDL_imageFilterMMXoff();
  137. setup_src(src1, src2);
  138. SDL_imageFilterSub ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  139. print_result (" C Sub", src1, src2, dstc);
  140. print_compare(dstm,dstc);
  141. print_line();
  142. SDL_imageFilterMMXon();
  143. setup_src(src1, src2);
  144. SDL_imageFilterMult ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  145. print_result ("MMX Mult", src1, src2, dstm);
  146. SDL_imageFilterMMXoff();
  147. setup_src(src1, src2);
  148. SDL_imageFilterMult ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  149. print_result (" C Mult", src1, src2, dstc);
  150. print_compare(dstm,dstc);
  151. print_line();
  152. SDL_imageFilterMMXon();
  153. setup_src(src1, src2);
  154. SDL_imageFilterMultNor ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  155. print_result ("ASM MultNor", src1, src2, dstm);
  156. SDL_imageFilterMMXoff();
  157. setup_src(src1, src2);
  158. SDL_imageFilterMultNor ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  159. print_result (" C MultNor", src1, src2, dstc);
  160. print_compare(dstm,dstc);
  161. print_line();
  162. SDL_imageFilterMMXon();
  163. setup_src(src1, src2);
  164. SDL_imageFilterMultDivby2 ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  165. print_result ("MMX MultDivby2", src1, src2, dstm);
  166. SDL_imageFilterMMXoff();
  167. setup_src(src1, src2);
  168. SDL_imageFilterMultDivby2 ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  169. print_result (" C MultDivby2", src1, src2, dstc);
  170. print_compare(dstm,dstc);
  171. print_line();
  172. SDL_imageFilterMMXon();
  173. setup_src(src1, src2);
  174. SDL_imageFilterMultDivby4 ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  175. print_result ("MMX MultDivby4", src1, src2, dstm);
  176. SDL_imageFilterMMXoff();
  177. setup_src(src1, src2);
  178. SDL_imageFilterMultDivby4 ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  179. print_result (" C MultDivby4", src1, src2, dstc);
  180. print_compare(dstm,dstc);
  181. print_line();
  182. SDL_imageFilterMMXon();
  183. setup_src(src1, src2);
  184. SDL_imageFilterDiv ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstm,15);
  185. print_result ("ASM Div", src1, src2, dstm);
  186. SDL_imageFilterMMXoff();
  187. setup_src(src1, src2);
  188. SDL_imageFilterDiv ((unsigned char *)src1,(unsigned char *)src2,(unsigned char *)dstc,15);
  189. print_result (" C Div", src1, src2, dstc);
  190. print_compare(dstm,dstc);
  191. print_line();
  192. SDL_imageFilterMMXon();
  193. setup_src(src1, src2);
  194. SDL_imageFilterBitNegation ((unsigned char *)src1,(unsigned char *)dstm,15);
  195. print_result ("MMX BitNegation", src1, NULL, dstm);
  196. SDL_imageFilterMMXoff();
  197. setup_src(src1, src2);
  198. SDL_imageFilterBitNegation ((unsigned char *)src1,(unsigned char *)dstc,15);
  199. print_result (" C BitNegation", src1, NULL, dstc);
  200. print_compare(dstm,dstc);
  201. print_line();
  202. SDL_imageFilterMMXon();
  203. setup_src(src1, src2);
  204. SDL_imageFilterAddByte ((unsigned char *)src1,(unsigned char *)dstm,15, 3);
  205. print_result ("MMX AddByte(3)", src1, NULL, dstm);
  206. SDL_imageFilterMMXoff();
  207. setup_src(src1, src2);
  208. SDL_imageFilterAddByte ((unsigned char *)src1,(unsigned char *)dstc,15, 3);
  209. print_result (" C AddByte(3)", src1, NULL, dstc);
  210. print_compare(dstm,dstc);
  211. print_line();
  212. SDL_imageFilterMMXon();
  213. setup_src(src1, src2);
  214. SDL_imageFilterAddByteToHalf ((unsigned char *)src1,(unsigned char *)dstm,15, 3);
  215. print_result ("MMX AddByteToHalf(3)", src1, NULL, dstm);
  216. SDL_imageFilterMMXoff();
  217. setup_src(src1, src2);
  218. SDL_imageFilterAddByteToHalf ((unsigned char *)src1,(unsigned char *)dstc,15, 3);
  219. print_result (" C AddByteToHalf(3)", src1, NULL, dstc);
  220. print_compare(dstm,dstc);
  221. print_line();
  222. SDL_imageFilterMMXon();
  223. setup_src(src1, src2);
  224. SDL_imageFilterSubByte ((unsigned char *)src1,(unsigned char *)dstm,15, 3);
  225. print_result ("MMX SubByte(3)", src1, NULL, dstm);
  226. SDL_imageFilterMMXoff();
  227. setup_src(src1, src2);
  228. SDL_imageFilterSubByte ((unsigned char *)src1,(unsigned char *)dstc,15, 3);
  229. print_result (" C SubByte(3)", src1, NULL, dstc);
  230. print_compare(dstm,dstc);
  231. print_line();
  232. SDL_imageFilterMMXon();
  233. setup_src(src1, src2);
  234. SDL_imageFilterShiftRight ((unsigned char *)src1,(unsigned char *)dstm,15, 1);
  235. print_result ("MMX ShiftRight(1)", src1, NULL, dstm);
  236. SDL_imageFilterMMXoff();
  237. setup_src(src1, src2);
  238. SDL_imageFilterShiftRight ((unsigned char *)src1,(unsigned char *)dstc,15, 1);
  239. print_result (" C ShiftRight(1)", src1, NULL, dstc);
  240. print_compare(dstm,dstc);
  241. print_line();
  242. SDL_imageFilterMMXon();
  243. setup_src(src1, src2);
  244. SDL_imageFilterMultByByte ((unsigned char *)src1,(unsigned char *)dstm,15, 3);
  245. print_result ("MMX MultByByte(3)", src1, NULL, dstm);
  246. SDL_imageFilterMMXoff();
  247. setup_src(src1, src2);
  248. SDL_imageFilterMultByByte ((unsigned char *)src1,(unsigned char *)dstc,15, 3);
  249. print_result (" C MultByByte(3)", src1, NULL, dstc);
  250. print_compare(dstm,dstc);
  251. print_line();
  252. SDL_imageFilterMMXon();
  253. setup_src(src1, src2);
  254. SDL_imageFilterShiftRightAndMultByByte ((unsigned char *)src1,(unsigned char *)dstm,15, 1, 3);
  255. print_result ("MMX ShiftRightAndMultByByte(1,3)", src1, NULL, dstm);
  256. SDL_imageFilterMMXoff();
  257. setup_src(src1, src2);
  258. SDL_imageFilterShiftRightAndMultByByte ((unsigned char *)src1,(unsigned char *)dstc,15, 1, 3);
  259. print_result (" C ShuftRightAndMultByByte(1,3)", src1, NULL, dstc);
  260. print_compare(dstm,dstc);
  261. print_line();
  262. SDL_imageFilterMMXon();
  263. setup_src(src1, src2);
  264. SDL_imageFilterShiftLeftByte ((unsigned char *)src1,(unsigned char *)dstm,15, 3);
  265. print_result ("MMX ShiftLeftByte(3)", src1, NULL, dstm);
  266. SDL_imageFilterMMXoff();
  267. setup_src(src1, src2);
  268. SDL_imageFilterShiftLeftByte ((unsigned char *)src1,(unsigned char *)dstc,15, 3);
  269. print_result (" C ShiftLeftByte(3)", src1, NULL, dstc);
  270. print_compare(dstm,dstc);
  271. print_line();
  272. SDL_imageFilterMMXon();
  273. setup_src(src1, src2);
  274. SDL_imageFilterShiftLeft ((unsigned char *)src1,(unsigned char *)dstm,15, 3);
  275. print_result ("MMX ShiftLeft(3)", src1, NULL, dstm);
  276. SDL_imageFilterMMXoff();
  277. setup_src(src1, src2);
  278. SDL_imageFilterShiftLeft ((unsigned char *)src1,(unsigned char *)dstc,15, 3);
  279. print_result (" C ShiftLeft(3)", src1, NULL, dstc);
  280. print_compare(dstm,dstc);
  281. print_line();
  282. SDL_imageFilterMMXon();
  283. setup_src(src1, src2);
  284. SDL_imageFilterBinarizeUsingThreshold ((unsigned char *)src1,(unsigned char *)dstm,15, 2);
  285. print_result ("MMX BinarizeUsingThreshold(2)", src1, NULL, dstm);
  286. SDL_imageFilterMMXoff();
  287. setup_src(src1, src2);
  288. SDL_imageFilterBinarizeUsingThreshold ((unsigned char *)src1,(unsigned char *)dstc,15, 2);
  289. print_result (" C BinarizeUsingThreshold(2)", src1, NULL, dstc);
  290. print_compare(dstm,dstc);
  291. print_line();
  292. SDL_imageFilterMMXon();
  293. setup_src(src1, src2);
  294. SDL_imageFilterClipToRange ((unsigned char *)src1,(unsigned char *)dstm,15, 1,7);
  295. print_result ("MMX ClipToRange(1,7)", src1, NULL, dstm);
  296. SDL_imageFilterMMXoff();
  297. setup_src(src1, src2);
  298. SDL_imageFilterClipToRange ((unsigned char *)src1,(unsigned char *)dstc,15, 1,7);
  299. print_result (" C ClipToRange(1,7)", src1, NULL, dstc);
  300. print_compare(dstm,dstc);
  301. print_line();
  302. SDL_imageFilterMMXon();
  303. setup_src(src1, src2);
  304. SDL_imageFilterNormalizeLinear ((unsigned char *)src1,(unsigned char *)dstm,15, 0,33,0,255);
  305. print_result ("MMX NormalizeLinear(0,33,0,255)", src1, NULL, dstm);
  306. SDL_imageFilterMMXoff();
  307. setup_src(src1, src2);
  308. SDL_imageFilterNormalizeLinear ((unsigned char *)src1,(unsigned char *)dstc,15, 0,33,0,255);
  309. print_result (" C NormalizeLinear(0,33,0,255)", src1, NULL, dstc);
  310. print_compare(dstm,dstc);
  311. print_line();
  312. /* Uint functions */
  313. /* Disabled, since broken */
  314. /*
  315. SDL_imageFilterMMXon();
  316. setup_src(src1, src2);
  317. SDL_imageFilterAddUint ((unsigned char *)src1,(unsigned char *)dstm,15, 0x01020304);
  318. print_result ("MMX AddUint(0x01020304)", src1, NULL, dstm);
  319. SDL_imageFilterMMXoff();
  320. setup_src(src1, src2);
  321. SDL_imageFilterAddUint ((unsigned char *)src1,(unsigned char *)dstc,15, 0x01020304);
  322. print_result (" C AddUint(0x01020304)", src1, NULL, dstc);
  323. print_compare(dstm,dstc);
  324. print_line();
  325. SDL_imageFilterMMXon();
  326. setup_src(src1, src2);
  327. SDL_imageFilterSubUint ((unsigned char *)src1,(unsigned char *)dstm,15, 0x01020304);
  328. print_result ("MMX SubUint(0x01020304)", src1, NULL, dstm);
  329. SDL_imageFilterMMXoff();
  330. setup_src(src1, src2);
  331. SDL_imageFilterSubUint ((unsigned char *)src1,(unsigned char *)dstc,15, 0x01020304);
  332. print_result (" C SubUint(0x01020304)", src1, NULL, dstc);
  333. print_compare(dstm,dstc);
  334. print_line();
  335. SDL_imageFilterMMXon();
  336. setup_src(src1, src2);
  337. SDL_imageFilterShiftRightUint ((unsigned char *)src1,(unsigned char *)dstm,15, 4);
  338. print_result ("MMX ShiftRightUint(4)", src1, NULL, dstm);
  339. SDL_imageFilterMMXoff();
  340. setup_src(src1, src2);
  341. SDL_imageFilterShiftRightUint ((unsigned char *)src1,(unsigned char *)dstc,15, 4);
  342. print_result (" C ShiftRightUint(4)", src1, NULL, dstc);
  343. print_compare(dstm,dstc);
  344. print_line();
  345. SDL_imageFilterMMXon();
  346. setup_src(src1, src2);
  347. SDL_imageFilterShiftLeftUint ((unsigned char *)src1,(unsigned char *)dstm,15, 4);
  348. print_result ("MMX ShiftLeftUint(4)", src1, NULL, dstm);
  349. SDL_imageFilterMMXoff();
  350. setup_src(src1, src2);
  351. SDL_imageFilterShiftLeftUint ((unsigned char *)src1,(unsigned char *)dstc,15, 4);
  352. print_result (" C ShiftLeftUint(4)", src1, NULL, dstc);
  353. print_compare(dstm,dstc);
  354. print_line();
  355. */
  356. #ifdef USE_MMX
  357. SDL_imageFilterMMXon();
  358. if (SDL_imageFilterMMXdetect())
  359. {
  360. printf("MMX was detected\n\n");
  361. }
  362. else
  363. {
  364. printf("MMX was NOT detected\n\n");
  365. }
  366. #else
  367. printf("MMX support disabled in SDL_gfx.\n\n");
  368. #endif
  369. printf ("Result: %i of %i passed OK.\n", ok_count, total_count);
  370. #ifdef WIN32
  371. printf("Press Enter to continue ...");
  372. pause();
  373. #endif
  374. exit(0);
  375. }