il_fastconv.c
Upload User: wmy0603
Upload Date: 2022-05-02
Package Size: 1808k
Code Size: 6k
Development Platform:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. //
  3. // ImageLib Sources
  4. // Copyright (C) 2000-2008 by Denton Woods
  5. // Last modified: 07/07/2006
  6. //
  7. // Filename: src-IL/src/il_fastconv.c
  8. //
  9. // Description: Converts between several image formats
  10. //
  11. //-----------------------------------------------------------------------------
  12. #include "il_internal.h"
  13. #ifdef ALTIVEC_GCC
  14. #include "altivec_typeconversion.h"
  15. #endif
  16. ILboolean iFastConvert(ILenum DestFormat)
  17. {
  18. ILubyte *BytePtr = iCurImage->Data;
  19. ILushort *ShortPtr = (ILushort*)iCurImage->Data;
  20. ILuint *IntPtr = (ILuint*)iCurImage->Data;
  21. ILfloat *FloatPtr = (ILfloat*)iCurImage->Data;
  22. ILdouble *DblPtr = (ILdouble*)iCurImage->Data;
  23. #ifndef ALTIVEC_GCC
  24. ILuint SizeOfData, i=0;
  25. ILubyte TempByte = 0;
  26. ILushort TempShort = 0;
  27. ILuint TempInt = 0;
  28. ILfloat TempFloat = 0;
  29. ILdouble TempDbl = 0;
  30. #endif
  31. switch (DestFormat)
  32. {
  33. case IL_RGB:
  34. case IL_BGR:
  35. if (iCurImage->Format != IL_RGB && iCurImage->Format != IL_BGR)
  36. return IL_FALSE;
  37. switch (iCurImage->Type)
  38. {
  39. case IL_BYTE:
  40. case IL_UNSIGNED_BYTE:
  41. #ifdef ALTIVEC_GCC
  42. abc2cba_byte(BytePtr,iCurImage->SizeOfData,BytePtr);
  43. #else
  44. SizeOfData = iCurImage->SizeOfData / 3;
  45. #ifdef USE_WIN32_ASM
  46. __asm
  47. {
  48. mov ebx, BytePtr
  49. mov ecx, SizeOfData
  50. L1:
  51. mov al,[ebx+0]
  52. xchg al,[ebx+2]
  53. mov [ebx+0],al
  54. add ebx,3
  55. loop L1
  56. }
  57. #else
  58. for (i = 0; i < SizeOfData; i++) {
  59. TempByte = BytePtr[0];
  60. BytePtr[0] = BytePtr[2];
  61. BytePtr[2] = TempByte;
  62. BytePtr += 3;
  63. }
  64. #endif//USE_WIN32_ASM
  65. #endif
  66. return IL_TRUE;
  67. case IL_SHORT:
  68. case IL_UNSIGNED_SHORT:
  69. #ifdef ALTIVEC_GCC
  70. abc2cba_short(ShortPtr,iCurImage->SizeOfData,ShortPtr);
  71. #else
  72. SizeOfData = iCurImage->SizeOfData / 6;  // 3*2
  73. #ifdef USE_WIN32_ASM
  74. __asm
  75. {
  76. mov ebx, ShortPtr
  77. mov ecx, SizeOfData
  78. L2:
  79. mov ax,[ebx+0]
  80. xchg ax,[ebx+4]
  81. mov [ebx+0],ax
  82. add ebx,6
  83. loop L2
  84. }
  85. #else
  86. for (i = 0; i < SizeOfData; i++) {
  87. TempShort = ShortPtr[0];
  88. ShortPtr[0] = ShortPtr[2];
  89. ShortPtr[2] = TempShort;
  90. ShortPtr += 3;
  91. }
  92. #endif//USE_WIN32_ASM
  93. #endif
  94. return IL_TRUE;
  95. case IL_INT:
  96. case IL_UNSIGNED_INT:
  97. #ifdef ALTIVEC_GCC
  98. abc2cba_int(IntPtr,iCurImage->SizeOfData,IntPtr);
  99. #else
  100. SizeOfData = iCurImage->SizeOfData / 12;  // 3*4
  101. #ifdef USE_WIN32_ASM
  102. __asm
  103. {
  104. mov ebx, IntPtr
  105. mov ecx, SizeOfData
  106. L3:
  107. mov eax,[ebx+0]
  108. xchg eax,[ebx+8]
  109. mov [ebx+0],ax
  110. add ebx,12
  111. loop L3
  112. }
  113. #else
  114. for (i = 0; i < SizeOfData; i++) {
  115. TempInt = IntPtr[0];
  116. IntPtr[0] = IntPtr[2];
  117. IntPtr[2] = TempInt;
  118. IntPtr += 3;
  119. }
  120. #endif//USE_WIN32_ASM
  121. #endif
  122. return IL_TRUE;
  123. case IL_FLOAT:
  124. #ifdef ALTIVEC_GCC
  125. abc2cba_float(FloatPtr,iCurImage->SizeOfData,FloatPtr);
  126. #else
  127. SizeOfData = iCurImage->SizeOfData / 12;  // 3*4
  128. for (i = 0; i < SizeOfData; i++) {
  129. TempFloat = FloatPtr[0];
  130. FloatPtr[0] = FloatPtr[2];
  131. FloatPtr[2] = TempFloat;
  132. FloatPtr += 3;
  133. }
  134. #endif
  135. return IL_TRUE;
  136. case IL_DOUBLE:
  137. #ifdef ALTIVEC_GCC
  138. abc2cba_double(DblPtr,iCurImage->SizeOfData,DblPtr);
  139. #else
  140. SizeOfData = iCurImage->SizeOfData / 24;  // 3*8
  141. for (i = 0; i < SizeOfData; i++) {
  142. TempDbl = DblPtr[0];
  143. DblPtr[0] = DblPtr[2];
  144. DblPtr[2] = TempDbl;
  145. DblPtr += 3;
  146. }
  147. #endif
  148. return IL_TRUE;
  149. }
  150. break;
  151. case IL_RGBA:
  152. case IL_BGRA:
  153. if (iCurImage->Format != IL_RGBA && iCurImage->Format != IL_BGRA)
  154. return IL_FALSE;
  155. switch (iCurImage->Type)
  156. {
  157. case IL_BYTE:
  158. case IL_UNSIGNED_BYTE:
  159. #ifdef ALTIVEC_GCC
  160. abcd2cbad_byte(BytePtr,iCurImage->SizeOfData,BytePtr);
  161. #else
  162. SizeOfData = iCurImage->SizeOfData / 4;
  163. #ifdef USE_WIN32_ASM
  164. __asm
  165. {
  166. mov ebx, BytePtr
  167. mov ecx, SizeOfData
  168. L4:
  169. mov eax,[ebx]
  170. bswap eax
  171. ror eax,8
  172. mov [ebx], eax
  173. add ebx,4
  174. loop L4
  175. }
  176. #else
  177. for (i = 0; i < SizeOfData; i++) {
  178. TempByte = BytePtr[0];
  179. BytePtr[0] = BytePtr[2];
  180. BytePtr[2] = TempByte;
  181. BytePtr += 4;
  182. }
  183. #endif//USE_WIN32_ASM
  184. #endif
  185. return IL_TRUE;
  186. case IL_SHORT:
  187. case IL_UNSIGNED_SHORT:
  188. #ifdef ALTIVEC_GCC
  189. abcd2cbad_short(ShortPtr,iCurImage->SizeOfData,ShortPtr);
  190. #else
  191. SizeOfData = iCurImage->SizeOfData / 8;  // 4*2
  192. #ifdef USE_WIN32_ASM
  193. __asm
  194. {
  195. mov ebx, ShortPtr
  196. mov ecx, SizeOfData
  197. L5:
  198. mov ax,[ebx+0]
  199. xchg ax,[ebx+4]
  200. mov [ebx+0],ax
  201. add ebx,8
  202. loop L5
  203. }
  204. #else
  205. for (i = 0; i < SizeOfData; i++) {
  206. TempShort = ShortPtr[0];
  207. ShortPtr[0] = ShortPtr[2];
  208. ShortPtr[2] = TempShort;
  209. ShortPtr += 4;
  210. }
  211. #endif//USE_WIN32_ASM
  212. #endif
  213. return IL_TRUE;
  214. case IL_INT:
  215. case IL_UNSIGNED_INT:
  216. #ifdef ALTIVEC_GCC
  217. abcd2cbad_int(IntPtr,iCurImage->SizeOfData,IntPtr);
  218. #else
  219. SizeOfData = iCurImage->SizeOfData / 16;  // 4*4
  220. #ifdef USE_WIN32_ASM
  221. __asm
  222. {
  223. mov ebx, IntPtr
  224. mov ecx, SizeOfData
  225. L6:
  226. mov eax,[ebx+0]
  227. xchg eax,[ebx+8]
  228. mov [ebx+0],ax
  229. add ebx,16
  230. loop L6
  231. }
  232. #else
  233. for (i = 0; i < SizeOfData; i++) {
  234. TempInt = IntPtr[0];
  235. IntPtr[0] = IntPtr[2];
  236. IntPtr[2] = TempInt;
  237. IntPtr += 4;
  238. }
  239. #endif//USE_WIN32_ASM
  240. #endif
  241. return IL_TRUE;
  242. case IL_FLOAT:
  243. #ifdef ALTIVEC_GCC
  244. abcd2cbad_float(FloatPtr,iCurImage->SizeOfData,FloatPtr);
  245. #else
  246. SizeOfData = iCurImage->SizeOfData / 16;  // 4*4
  247. for (i = 0; i < SizeOfData; i++) {
  248. TempFloat = FloatPtr[0];
  249. FloatPtr[0] = FloatPtr[2];
  250. FloatPtr[2] = TempFloat;
  251. FloatPtr += 4;
  252. }
  253. #endif
  254. return IL_TRUE;
  255. case IL_DOUBLE:
  256. #ifdef ALTIVEC_GCC
  257. abcd2cbad_double(DblPtr,iCurImage->SizeOfData,DblPtr);
  258. #else
  259. SizeOfData = iCurImage->SizeOfData / 32;  // 4*8
  260. for (i = 0; i < SizeOfData; i++) {
  261. TempDbl = DblPtr[0];
  262. DblPtr[0] = DblPtr[2];
  263. DblPtr[2] = TempDbl;
  264. DblPtr += 4;
  265. }
  266. #endif
  267. return IL_TRUE;
  268. }
  269. }
  270. return IL_FALSE;
  271. }