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

Visual C++

  1. //-----------------------------------------------------------------------------
  2. //
  3. // ImageLib Sources
  4. // Copyright (C) 2000-2008 by Denton Woods
  5. // Last modified: 01/08/2007
  6. //
  7. // Filename: src-IL/src/il_convbuff.c
  8. //
  9. // Description: Converts between several image formats
  10. //
  11. //-----------------------------------------------------------------------------
  12. #include "il_internal.h"
  13. #undef NOINLINE
  14. #undef INLINE
  15. #define INLINE
  16. #include "il_manip.h"
  17. #ifdef ALTIVEC_GCC
  18. #include "altivec_typeconversion.h"
  19. #endif
  20. #include <limits.h>
  21. void* ILAPIENTRY iSwitchTypes(ILuint SizeOfData, ILenum SrcType, ILenum DestType, void *Buffer);
  22. ILushort ILAPIENTRY ilFloatToHalf(ILuint i);
  23. ILuint   ILAPIENTRY ilHalfToFloat (ILushort y);
  24. ILfloat  /*ILAPIENTRY*/ ilFloatToHalfOverflow();
  25. ILimage *iConvertPalette(ILimage *Image, ILenum DestFormat);
  26. #define CHECK_ALLOC()  if (NewData == NULL) { 
  27. if (Data != Buffer) 
  28. ifree(Data); 
  29. return IL_FALSE; 
  30. }
  31. ILAPI void* ILAPIENTRY ilConvertBuffer(ILuint SizeOfData, ILenum SrcFormat, ILenum DestFormat, ILenum SrcType, ILenum DestType, ILpal *SrcPal, void *Buffer)
  32. {
  33. //static const ILfloat LumFactor[3] = { 0.299f, 0.587f, 0.114f };  // Used for conversion to luminance
  34. //static const ILfloat LumFactor[3] = { 0.3086f, 0.6094f, 0.0820f };  // http://www.sgi.com/grafica/matrix/index.html
  35. static const ILfloat LumFactor[3] = { 0.212671f, 0.715160f, 0.072169f };  // http://www.inforamp.net/~poynton/ and libpng's libpng.txt
  36. ILubyte *NewData = NULL;
  37. ILuint i, j, c, Size;
  38. ILfloat Resultf;
  39. ILdouble Resultd;
  40. ILuint NumPix;  // Really number of pixels * bpp.
  41. ILuint BpcDest;
  42. void *Data = NULL;
  43. ILimage *PalImage = NULL, *TempImage = NULL;
  44. if (SizeOfData == 0 || Buffer == NULL) {
  45. ilSetError(IL_INVALID_PARAM);
  46. return NULL;
  47. }
  48. Data = iSwitchTypes(SizeOfData, SrcType, DestType, Buffer);
  49. if (Data == NULL)
  50. return NULL;
  51. BpcDest = ilGetBpcType(DestType);
  52. NumPix = SizeOfData / ilGetBpcType(SrcType);
  53. if (DestFormat == SrcFormat) {
  54. NewData = (ILubyte*)ialloc(NumPix * BpcDest);
  55. if (NewData == NULL) {
  56. return IL_FALSE;
  57. }
  58. memcpy(NewData, Data, NumPix * BpcDest);
  59. if (Data != Buffer)
  60. ifree(Data);
  61. return NewData;
  62. }
  63. // Colour-indexed images are special here
  64. if (SrcFormat == IL_COLOUR_INDEX) {
  65. // We create a temporary palette image so that we can send it to iConvertPalette.
  66. PalImage = (ILimage*)icalloc(1, sizeof(ILimage));  // Much better to have it all set to 0.
  67. if (PalImage == NULL)
  68. return NULL;
  69. // Populate the temporary palette image.
  70. PalImage->Pal.Palette = SrcPal->Palette;
  71. PalImage->Pal.PalSize = SrcPal->PalSize;
  72. PalImage->Pal.PalType = SrcPal->PalType;
  73. PalImage->Width = NumPix;
  74. PalImage->Height = 1;
  75. PalImage->Depth = 1;
  76. PalImage->Format = IL_COLOUR_INDEX;
  77. PalImage->Type = IL_UNSIGNED_BYTE;
  78. PalImage->Data = Buffer;
  79. PalImage->Bpp = 1;
  80. PalImage->SizeOfData = SizeOfData;
  81. // Convert the paletted image to a different format.
  82. TempImage = iConvertPalette(PalImage, DestFormat);
  83. if (TempImage == NULL) {
  84. // So that we do not delete the original palette or data.
  85. PalImage->Pal.Palette = NULL;
  86. PalImage->Data = NULL;
  87. ilCloseImage(PalImage);
  88. return NULL;
  89. }
  90. // Set TempImage->Data to NULL so that we can preserve it via NewData, or
  91. //  else it would get wiped out by ilCloseImage.
  92. NewData = TempImage->Data;
  93. TempImage->Data = NULL;
  94. // So that we do not delete the original palette or data.
  95. PalImage->Pal.Palette = NULL;
  96. PalImage->Data = NULL;
  97. // Clean up here.
  98. ilCloseImage(PalImage);
  99. ilCloseImage(TempImage);
  100. return NewData;
  101. }
  102. switch (SrcFormat)
  103. {
  104. case IL_RGB:
  105. switch (DestFormat)
  106. {
  107. case IL_BGR:
  108. NewData = (ILubyte*)ialloc(NumPix * BpcDest);
  109. CHECK_ALLOC();
  110. switch (DestType)
  111. {
  112. case IL_UNSIGNED_BYTE:
  113. case IL_BYTE:
  114. #ifdef ALTIVEC_GCC
  115. abc2cba_byte((ILubyte*)Data,NumPix * BpcDest,NewData);
  116. #else
  117. for (i = 0; i < NumPix; i += 3) {
  118. NewData[i] = ((ILubyte*)(Data))[i+2];
  119. NewData[i+1] = ((ILubyte*)(Data))[i+1];
  120. NewData[i+2] = ((ILubyte*)(Data))[i];
  121. }
  122. #endif
  123. break;
  124. case IL_UNSIGNED_SHORT:
  125. case IL_SHORT:
  126. case IL_HALF:
  127. #ifdef ALTIVEC_GCC
  128. abc2cba_short((ILushort*)Data,NumPix * BpcDest,(ILushort*)NewData);
  129. #else
  130. for (i = 0; i < NumPix; i += 3) {
  131. ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
  132. ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
  133. ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
  134. }
  135. #endif
  136. break;
  137. case IL_UNSIGNED_INT:
  138. case IL_INT:
  139. #ifdef ALTIVEC_GCC
  140. abc2cba_int((ILuint*)Data,NumPix * BpcDest,(ILuint*)NewData);
  141. #else
  142. for (i = 0; i < NumPix; i += 3) {
  143. ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
  144. ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
  145. ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
  146. }
  147. #endif
  148. break;
  149. case IL_FLOAT:
  150. #ifdef ALTIVEC_GCC
  151. abc2cba_float(Data,NumPix * BpcDest,NewData);
  152. #else
  153. for (i = 0; i < NumPix; i += 3) {
  154. ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
  155. ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
  156. ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
  157. }
  158. #endif
  159. break;
  160. case IL_DOUBLE:
  161. #ifdef ALTIVEC_GCC
  162. abc2cba_double((ILdouble*)Data,NumPix * BpcDest,(ILdouble*)NewData);
  163. #else
  164. for (i = 0; i < NumPix; i += 3) {
  165. ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
  166. ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
  167. ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
  168. }
  169. break;
  170. #endif
  171. }
  172. break;
  173. case IL_RGBA:
  174. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
  175. CHECK_ALLOC();
  176. switch (DestType)
  177. {
  178. case IL_UNSIGNED_BYTE:
  179. case IL_BYTE:
  180. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  181. NewData[j] = ((ILubyte*)(Data))[i];
  182. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  183. NewData[j+2] = ((ILubyte*)(Data))[i+2];
  184. NewData[j+3] = UCHAR_MAX;
  185. }
  186. break;
  187. case IL_UNSIGNED_SHORT:
  188. case IL_SHORT:
  189. case IL_HALF:
  190. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  191. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
  192. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  193. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
  194. ((ILushort*)(NewData))[j+3] = USHRT_MAX;
  195. }
  196. break;
  197. case IL_UNSIGNED_INT:
  198. case IL_INT:
  199. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  200. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
  201. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  202. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
  203. ((ILuint*)(NewData))[j+3] = UINT_MAX;
  204. }
  205. break;
  206. case IL_FLOAT:
  207. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  208. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
  209. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  210. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
  211. ((ILfloat*)(NewData))[j+3] = 1.0f;
  212. }
  213. break;
  214. case IL_DOUBLE:
  215. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  216. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
  217. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  218. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
  219. ((ILdouble*)(NewData))[j+3] = 1.0;
  220. }
  221. break;
  222. }
  223. break;
  224. case IL_BGRA:
  225. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
  226. CHECK_ALLOC();
  227. switch (DestType)
  228. {
  229. case IL_UNSIGNED_BYTE:
  230. case IL_BYTE:
  231. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  232. NewData[j] = ((ILubyte*)(Data))[i+2];
  233. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  234. NewData[j+2] = ((ILubyte*)(Data))[i];
  235. NewData[j+3] = UCHAR_MAX;
  236. }
  237. break;
  238. case IL_UNSIGNED_SHORT:
  239. case IL_SHORT:
  240. case IL_HALF:
  241. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  242. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
  243. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  244. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
  245. ((ILushort*)(NewData))[j+3] = USHRT_MAX;
  246. }
  247. break;
  248. case IL_UNSIGNED_INT:
  249. case IL_INT:
  250. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  251. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
  252. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  253. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
  254. ((ILuint*)(NewData))[j+3] = UINT_MAX;
  255. }
  256. break;
  257. case IL_FLOAT:
  258. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  259. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
  260. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  261. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
  262. ((ILfloat*)(NewData))[j+3] = 1.0f;
  263. }
  264. break;
  265. case IL_DOUBLE:
  266. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  267. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
  268. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  269. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
  270. ((ILdouble*)(NewData))[j+3] = 1.0f;
  271. }
  272. break;
  273. }
  274. break;
  275. case IL_LUMINANCE:
  276. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
  277. CHECK_ALLOC();
  278. Size = NumPix / 3;
  279. switch (DestType)
  280. {
  281. case IL_UNSIGNED_BYTE:
  282. case IL_BYTE:
  283. for (i = 0; i < Size; i++) {
  284. Resultf = 0;
  285. for (c = 0; c < 3; c++) {
  286. Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[c];
  287. }
  288. NewData[i] = (ILubyte)Resultf;
  289. }
  290. break;
  291. case IL_UNSIGNED_SHORT:
  292. case IL_SHORT:
  293. case IL_HALF:
  294. for (i = 0; i < Size; i++) {
  295. Resultf = 0;
  296. for (c = 0; c < 3; c++) {
  297. Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[c];
  298. }
  299. ((ILushort*)(NewData))[i] = (ILushort)Resultf;
  300. }
  301. break;
  302. case IL_UNSIGNED_INT:
  303. case IL_INT:
  304. for (i = 0; i < Size; i++) {
  305. Resultf = 0;
  306. for (c = 0; c < 3; c++) {
  307. Resultf += ((ILuint*)(Data))[i * 3 + c] * LumFactor[c];
  308. }
  309. ((ILuint*)(NewData))[i] = (ILuint)Resultf;
  310. }
  311. break;
  312. case IL_FLOAT:
  313. for (i = 0; i < Size; i++) {
  314. Resultf = 0;
  315. for (c = 0; c < 3; c++) {
  316. Resultf += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[c];
  317. }
  318. ((ILfloat*)(NewData))[i] = Resultf;
  319. }
  320. break;
  321. case IL_DOUBLE:
  322. for (i = 0; i < Size; i++) {
  323. Resultd = 0;
  324. for (c = 0; c < 3; c++) {
  325. Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[c];
  326. }
  327. ((ILdouble*)(NewData))[i] = Resultd;
  328. }
  329. break;
  330. }
  331. break;
  332. case IL_LUMINANCE_ALPHA:
  333. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3 * 2);
  334. CHECK_ALLOC();
  335. Size = NumPix / 3;
  336. switch (DestType)
  337. {
  338. case IL_UNSIGNED_BYTE:
  339. case IL_BYTE:
  340. for (i = 0; i < Size; i++) {
  341. Resultf = 0;
  342. for (c = 0; c < 3; c++) {
  343. Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[c];
  344. }
  345. NewData[i*2] = (ILubyte)Resultf;
  346. NewData[i*2+1] = UCHAR_MAX;
  347. }
  348. break;
  349. case IL_UNSIGNED_SHORT:
  350. case IL_SHORT:
  351. case IL_HALF:
  352. for (i = 0; i < Size; i++) {
  353. Resultf = 0;
  354. for (c = 0; c < 3; c++) {
  355. Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[c];
  356. }
  357. ((ILushort*)(NewData))[i*2] = (ILushort)Resultf;
  358. ((ILushort*)(NewData))[i*2+1] = USHRT_MAX;
  359. }
  360. break;
  361. case IL_UNSIGNED_INT:
  362. case IL_INT:
  363. for (i = 0; i < Size; i++) {
  364. Resultf = 0;
  365. for (c = 0; c < 3; c++) {
  366. Resultf += ((ILuint*)(Data))[i * 3 + c] * LumFactor[c];
  367. }
  368. ((ILuint*)(NewData))[i*2] = (ILuint)Resultf;
  369. ((ILuint*)(NewData))[i*2+1] = UINT_MAX;
  370. }
  371. break;
  372. case IL_FLOAT:
  373. for (i = 0; i < Size; i++) {
  374. Resultf = 0;
  375. for (c = 0; c < 3; c++) {
  376. Resultf += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[c];
  377. }
  378. ((ILfloat*)(NewData))[i*2] = Resultf;
  379. ((ILfloat*)(NewData))[i*2+1] = 1.0f;
  380. }
  381. break;
  382. case IL_DOUBLE:
  383. for (i = 0; i < Size; i++) {
  384. Resultd = 0;
  385. for (c = 0; c < 3; c++) {
  386. Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[c];
  387. }
  388. ((ILdouble*)(NewData))[i*2] = Resultd;
  389. ((ILdouble*)(NewData))[i*2+1] = 1.0;
  390. }
  391. break;
  392. }
  393. break;
  394. case IL_ALPHA:
  395. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
  396. CHECK_ALLOC();
  397. memset(NewData, 0, NumPix * BpcDest);
  398. break;
  399. default:
  400. ilSetError(IL_INVALID_CONVERSION);
  401. if (Data != Buffer)
  402. ifree(Data);
  403. return NULL;
  404. }
  405. break;
  406. case IL_RGBA:
  407. switch (DestFormat)
  408. {
  409. case IL_BGRA:
  410. NewData = (ILubyte*)ialloc(NumPix * BpcDest);
  411. CHECK_ALLOC();
  412. switch (DestType)
  413. {
  414. case IL_UNSIGNED_BYTE:
  415. case IL_BYTE:
  416. #ifdef ALTIVEC_GCC
  417. abcd2cbad_byte(NewData,iCurImage->SizeOfData,NewData);
  418. #else
  419. for (i = 0; i < NumPix; i += 4) {
  420. NewData[i] = ((ILubyte*)(Data))[i+2];
  421. NewData[i+1] = ((ILubyte*)(Data))[i+1];
  422. NewData[i+2] = ((ILubyte*)(Data))[i];
  423. NewData[i+3] = ((ILubyte*)(Data))[i+3];
  424. }
  425. #endif
  426. break;
  427. case IL_UNSIGNED_SHORT:
  428. case IL_SHORT:
  429. case IL_HALF:
  430. #ifdef ALTIVEC_GCC
  431. abcd2cbad_short((ILushort*)Data,iCurImage->SizeOfData,(ILushort*)NewData);
  432. #else
  433. for (i = 0; i < NumPix; i += 4) {
  434. ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
  435. ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
  436. ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
  437. ((ILushort*)(NewData))[i+3] = ((ILushort*)(Data))[i+3];
  438. }
  439. #endif
  440. break;
  441. case IL_UNSIGNED_INT:
  442. case IL_INT:
  443. #ifdef ALTIVEC_GCC
  444. abcd2cbad_int((ILuint*)Data,iCurImage->SizeOfData,(ILuint*)NewData);
  445. #else
  446. for (i = 0; i < NumPix; i += 4) {
  447. ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
  448. ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
  449. ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
  450. ((ILuint*)(NewData))[i+3] = ((ILuint*)(Data))[i+3];
  451. }
  452. #endif
  453. break;
  454. case IL_FLOAT:
  455. #ifdef ALTIVEC_GCC
  456. abcd2cbad_float(Data,iCurImage->SizeOfData,NewData);
  457. #else
  458. for (i = 0; i < NumPix; i += 4) {
  459. ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
  460. ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
  461. ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
  462. ((ILfloat*)(NewData))[i+3] = ((ILfloat*)(Data))[i+3];
  463. }
  464. #endif
  465. break;
  466. case IL_DOUBLE:
  467. #ifdef ALTIVEC_GCC
  468. abcd2cbad_double((ILdouble*)Data,iCurImage->SizeOfData,(ILdouble*)NewData);
  469. #else
  470. for (i = 0; i < NumPix; i += 4) {
  471. ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
  472. ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
  473. ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
  474. ((ILdouble*)(NewData))[i+3] = ((ILdouble*)(Data))[i+3];
  475. }
  476. #endif
  477. break;
  478. }
  479. break;
  480. case IL_RGB:
  481. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
  482. CHECK_ALLOC();
  483. switch (DestType)
  484. {
  485. case IL_UNSIGNED_BYTE:
  486. case IL_BYTE:
  487. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  488. NewData[j] = ((ILubyte*)(Data))[i];
  489. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  490. NewData[j+2] = ((ILubyte*)(Data))[i+2];
  491. }
  492. break;
  493. case IL_UNSIGNED_SHORT:
  494. case IL_SHORT:
  495. case IL_HALF:
  496. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  497. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
  498. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  499. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
  500. }
  501. break;
  502. case IL_UNSIGNED_INT:
  503. case IL_INT:
  504. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  505. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
  506. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  507. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
  508. }
  509. break;
  510. case IL_FLOAT:
  511. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  512. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
  513. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  514. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
  515. }
  516. break;
  517. case IL_DOUBLE:
  518. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  519. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
  520. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  521. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
  522. }
  523. break;
  524. }
  525. break;
  526. case IL_BGR:
  527. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
  528. CHECK_ALLOC();
  529. switch (DestType)
  530. {
  531. case IL_UNSIGNED_BYTE:
  532. case IL_BYTE:
  533. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  534. NewData[j] = ((ILubyte*)(Data))[i+2];
  535. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  536. NewData[j+2] = ((ILubyte*)(Data))[i];
  537. }
  538. break;
  539. case IL_UNSIGNED_SHORT:
  540. case IL_SHORT:
  541. case IL_HALF:
  542. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  543. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
  544. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  545. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
  546. }
  547. break;
  548. case IL_UNSIGNED_INT:
  549. case IL_INT:
  550. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  551. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
  552. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  553. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
  554. }
  555. break;
  556. case IL_FLOAT:
  557. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  558. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
  559. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  560. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
  561. }
  562. break;
  563. case IL_DOUBLE:
  564. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  565. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
  566. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  567. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
  568. }
  569. break;
  570. }
  571. break;
  572. case IL_LUMINANCE:
  573. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
  574. CHECK_ALLOC();
  575. Size = NumPix / 4;
  576. switch (DestType)
  577. {
  578. case IL_UNSIGNED_BYTE:
  579. case IL_BYTE:
  580. for (i = 0; i < Size; i++) {
  581. Resultf = 0.0f;
  582. for (c = 0; c < 3; c++) {
  583. Resultf += ((ILubyte*)(Data))[i * 4 + c] * LumFactor[c];
  584. }
  585. NewData[i] = (ILubyte)Resultf;
  586. }
  587. break;
  588. case IL_UNSIGNED_SHORT:
  589. case IL_SHORT:
  590. case IL_HALF:
  591. for (i = 0; i < Size; i++) {
  592. Resultf = 0.0f;
  593. for (c = 0; c < 3; c++) {
  594. Resultf += ((ILushort*)(Data))[i * 4 + c] * LumFactor[c];
  595. }
  596. ((ILushort*)(NewData))[i] = (ILushort)Resultf;
  597. }
  598. break;
  599. case IL_UNSIGNED_INT:
  600. case IL_INT:
  601. for (i = 0; i < Size; i++) {
  602. Resultd = 0.0;
  603. for (c = 0; c < 3; c++) {
  604. Resultd += ((ILuint*)(Data))[i * 4 + c] * LumFactor[c];
  605. }
  606. ((ILuint*)(NewData))[i] = (ILuint)Resultd;
  607. }
  608. break;
  609. case IL_FLOAT:
  610. for (i = 0; i < Size; i++) {
  611. Resultd = 0.0;
  612. for (c = 0; c < 3; c++) {
  613. Resultd += ((ILfloat*)(Data))[i * 4 + c] * LumFactor[c];
  614. }
  615. ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
  616. }
  617. break;
  618. case IL_DOUBLE:
  619. for (i = 0; i < Size; i++) {
  620. Resultd = 0.0;
  621. for (c = 0; c < 3; c++) {
  622. Resultd += ((ILdouble*)(Data))[i * 4 + c] * LumFactor[c];
  623. }
  624. ((ILdouble*)(NewData))[i] = Resultd;
  625. }
  626. break;
  627. }
  628. break;
  629. case IL_LUMINANCE_ALPHA:
  630. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4 * 2);
  631. CHECK_ALLOC();
  632. Size = NumPix / 4 * 2;
  633. switch (DestType)
  634. {
  635. case IL_UNSIGNED_BYTE:
  636. case IL_BYTE:
  637. for (i = 0; i < Size; i += 2) {
  638. Resultf = 0.0f;
  639. for (c = 0; c < 3; c++) {
  640. Resultf += ((ILubyte*)(Data))[i * 2 + c] * LumFactor[c];
  641. }
  642. NewData[i] = (ILubyte)Resultf;
  643. NewData[i+1] = ((ILubyte*)(Data))[i * 2 + 3];
  644. }
  645. break;
  646. case IL_UNSIGNED_SHORT:
  647. case IL_SHORT:
  648. case IL_HALF:
  649. for (i = 0; i < Size; i += 2) {
  650. Resultf = 0.0f;
  651. for (c = 0; c < 3; c++) {
  652. Resultf += ((ILushort*)(Data))[i * 2 + c] * LumFactor[c];
  653. }
  654. ((ILushort*)(NewData))[i] = (ILushort)Resultf;
  655. ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i * 2 + 3];
  656. }
  657. break;
  658. case IL_UNSIGNED_INT:
  659. case IL_INT:
  660. for (i = 0; i < Size; i += 2) {
  661. Resultd = 0.0;
  662. for (c = 0; c < 3; c++) {
  663. Resultd += ((ILuint*)(Data))[i * 2 + c] * LumFactor[c];
  664. }
  665. ((ILuint*)(NewData))[i] = (ILuint)Resultd;
  666. ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i * 2 + 3];
  667. }
  668. break;
  669. case IL_FLOAT:
  670. for (i = 0; i < Size; i += 2) {
  671. Resultd = 0.0;
  672. for (c = 0; c < 3; c++) {
  673. Resultd += ((ILfloat*)(Data))[i * 2 + c] * LumFactor[c];
  674. }
  675. ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
  676. ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i * 2 + 3];
  677. }
  678. break;
  679. case IL_DOUBLE:
  680. for (i = 0; i < Size; i += 2) {
  681. Resultd = 0.0;
  682. for (c = 0; c < 3; c++) {
  683. Resultd += ((ILdouble*)(Data))[i * 2 + c] * LumFactor[c];
  684. }
  685. ((ILdouble*)(NewData))[i] = Resultd;
  686. ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i * 2 + 3];
  687. }
  688. break;
  689. }
  690. break;
  691. case IL_ALPHA:
  692. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
  693. CHECK_ALLOC();
  694. Size = NumPix / 4;
  695. switch (DestType)
  696. {
  697. case IL_UNSIGNED_BYTE:
  698. case IL_BYTE:
  699. for (i = 0; i < Size; i++) {
  700. NewData[i] = ((ILubyte*)(Data))[i * 4 + 3];
  701. }
  702. break;
  703. case IL_UNSIGNED_SHORT:
  704. case IL_SHORT:
  705. case IL_HALF:
  706. for (i = 0; i < Size; i++) {
  707. ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i * 4 + 3];
  708. }
  709. break;
  710. case IL_UNSIGNED_INT:
  711. case IL_INT:
  712. for (i = 0; i < Size; i++) {
  713. ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i * 4 + 3];
  714. }
  715. break;
  716. case IL_FLOAT:
  717. for (i = 0; i < Size; i++) {
  718. ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i * 4 + 3];
  719. }
  720. break;
  721. case IL_DOUBLE:
  722. for (i = 0; i < Size; i++) {
  723. ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i * 4 + 3];
  724. }
  725. break;
  726. }
  727. break;
  728. default:
  729. ilSetError(IL_INVALID_CONVERSION);
  730. if (Data != Buffer)
  731. ifree(Data);
  732. return NULL;
  733. }
  734. break;
  735. case IL_BGR:
  736. switch (DestFormat)
  737. {
  738. case IL_RGB:
  739. NewData = (ILubyte*)ialloc(NumPix * BpcDest);
  740. CHECK_ALLOC();
  741. switch (DestType)
  742. {
  743. case IL_UNSIGNED_BYTE:
  744. case IL_BYTE:
  745. #ifdef ALTIVEC_GCC
  746. abc2cba_byte(((ILubyte*)Data),NumPix * BpcDest,NewData);
  747. #else
  748. for (i = 0; i < NumPix; i += 3) {
  749. NewData[i] = ((ILubyte*)(Data))[i+2];
  750. NewData[i+1] = ((ILubyte*)(Data))[i+1];
  751. NewData[i+2] = ((ILubyte*)(Data))[i];
  752. }
  753. #endif
  754. break;
  755. case IL_UNSIGNED_SHORT:
  756. case IL_SHORT:
  757. case IL_HALF:
  758. #ifdef ALTIVEC_GCC
  759. abc2cba_short((ILushort*)Data,NumPix * BpcDest,(ILushort*)NewData);
  760. #else
  761. for (i = 0; i < NumPix; i += 3) {
  762. ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
  763. ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
  764. ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
  765. }
  766. #endif
  767. break;
  768. case IL_UNSIGNED_INT:
  769. case IL_INT:
  770. #ifdef ALTIVEC_GCC
  771. abc2cba_int((ILuint*)Data,NumPix * BpcDest,(ILuint*)NewData);
  772. #else
  773. for (i = 0; i < NumPix; i += 3) {
  774. ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
  775. ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
  776. ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
  777. }
  778. #endif
  779. break;
  780. case IL_FLOAT:
  781. #ifdef ALTIVEC_GCC
  782. abc2cba_float(Data,NumPix * BpcDest,NewData);
  783. #else
  784. for (i = 0; i < NumPix; i += 3) {
  785. ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
  786. ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
  787. ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
  788. }
  789. #endif
  790. break;
  791. case IL_DOUBLE:
  792. #ifdef ALTIVEC_GCC
  793. abc2cba_double((ILdouble*)Data,iCurImage->SizeOfData,(ILdouble*)NewData);
  794. #else
  795. for (i = 0; i < NumPix; i += 3) {
  796. ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
  797. ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
  798. ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
  799. }
  800. #endif
  801. break;
  802. }
  803. break;
  804. case IL_BGRA:
  805. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
  806. CHECK_ALLOC();
  807. switch (DestType)
  808. {
  809. case IL_UNSIGNED_BYTE:
  810. case IL_BYTE:
  811. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  812. NewData[j] = ((ILubyte*)(Data))[i];
  813. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  814. NewData[j+2] = ((ILubyte*)(Data))[i+2];
  815. NewData[j+3] = UCHAR_MAX;
  816. }
  817. break;
  818. case IL_UNSIGNED_SHORT:
  819. case IL_SHORT:
  820. case IL_HALF:
  821. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  822. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
  823. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  824. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
  825. ((ILushort*)(NewData))[j+3] = USHRT_MAX;
  826. }
  827. break;
  828. case IL_UNSIGNED_INT:
  829. case IL_INT:
  830. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  831. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
  832. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  833. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
  834. ((ILuint*)(NewData))[j+3] = UINT_MAX;
  835. }
  836. break;
  837. case IL_FLOAT:
  838. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  839. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
  840. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  841. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
  842. ((ILfloat*)(NewData))[j+3] = 1.0f;
  843. }
  844. break;
  845. case IL_DOUBLE:
  846. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  847. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
  848. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  849. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
  850. ((ILdouble*)(NewData))[j+3] = 1.0;
  851. }
  852. break;
  853. }
  854. break;
  855. case IL_RGBA:
  856. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
  857. CHECK_ALLOC();
  858. switch (DestType)
  859. {
  860. case IL_UNSIGNED_BYTE:
  861. case IL_BYTE:
  862. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  863. NewData[j] = ((ILubyte*)(Data))[i+2];
  864. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  865. NewData[j+2] = ((ILubyte*)(Data))[i];
  866. NewData[j+3] = UCHAR_MAX;
  867. }
  868. break;
  869. case IL_UNSIGNED_SHORT:
  870. case IL_SHORT:
  871. case IL_HALF:
  872. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  873. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
  874. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  875. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
  876. ((ILushort*)(NewData))[j+3] = USHRT_MAX;
  877. }
  878. break;
  879. case IL_UNSIGNED_INT:
  880. case IL_INT:
  881. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  882. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
  883. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  884. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
  885. ((ILuint*)(NewData))[j+3] = UINT_MAX;
  886. }
  887. break;
  888. case IL_FLOAT:
  889. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  890. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
  891. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  892. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
  893. ((ILfloat*)(NewData))[j+3] = 1.0f;
  894. }
  895. break;
  896. case IL_DOUBLE:
  897. for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
  898. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
  899. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  900. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
  901. ((ILdouble*)(NewData))[j+3] = 1.0;
  902. }
  903. break;
  904. }
  905. break;
  906. case IL_LUMINANCE:
  907. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
  908. CHECK_ALLOC();
  909. Size = NumPix / 3;
  910. switch (DestType)
  911. {
  912. case IL_UNSIGNED_BYTE:
  913. case IL_BYTE:
  914. for (i = 0; i < Size; i++) {
  915. Resultf = 0.0f;  j = 2;
  916. for (c = 0; c < 3; c++, j--) {
  917. Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[j];
  918. }
  919. NewData[i] = (ILubyte)Resultf;
  920. }
  921. break;
  922. case IL_UNSIGNED_SHORT:
  923. case IL_SHORT:
  924. case IL_HALF:
  925. for (i = 0; i < Size; i++) {
  926. Resultf = 0.0f;  j = 2;
  927. for (c = 0; c < 3; c++, j--) {
  928. Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[j];
  929. }
  930. ((ILushort*)(NewData))[i] = (ILushort)Resultf;
  931. }
  932. break;
  933. case IL_UNSIGNED_INT:
  934. case IL_INT:
  935. for (i = 0; i < Size; i++) {
  936. Resultd = 0.0f;  j = 2;
  937. for (c = 0; c < 3; c++, j--) {
  938. Resultd += ((ILuint*)(Data))[i * 3 + c] * LumFactor[j];
  939. }
  940. ((ILuint*)(NewData))[i] = (ILuint)Resultd;
  941. }
  942. break;
  943. case IL_FLOAT:
  944. for (i = 0; i < Size; i++) {
  945. Resultd = 0.0f;  j = 2;
  946. for (c = 0; c < 3; c++, j--) {
  947. Resultd += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[j];
  948. }
  949. ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
  950. }
  951. break;
  952. case IL_DOUBLE:
  953. for (i = 0; i < Size; i++) {
  954. Resultd = 0.0f;  j = 2;
  955. for (c = 0; c < 3; c++, j--) {
  956. Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[j];
  957. }
  958. ((ILdouble*)(NewData))[i] = Resultd;
  959. }
  960. break;
  961. }
  962. break;
  963. case IL_LUMINANCE_ALPHA:
  964. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3 * 2);
  965. CHECK_ALLOC();
  966. Size = NumPix / 3;
  967. switch (DestType)
  968. {
  969. case IL_UNSIGNED_BYTE:
  970. case IL_BYTE:
  971. for (i = 0; i < Size; i++) {
  972. Resultf = 0;
  973. for (c = 0; c < 3; c++) {
  974. Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[c];
  975. }
  976. NewData[i*2] = (ILubyte)Resultf;
  977. NewData[i*2+1] = UCHAR_MAX;
  978. }
  979. break;
  980. case IL_UNSIGNED_SHORT:
  981. case IL_SHORT:
  982. case IL_HALF:
  983. for (i = 0; i < Size; i++) {
  984. Resultf = 0;
  985. for (c = 0; c < 3; c++) {
  986. Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[c];
  987. }
  988. ((ILushort*)(NewData))[i*2] = (ILushort)Resultf;
  989. ((ILushort*)(NewData))[i*2+1] = USHRT_MAX;
  990. }
  991. break;
  992. case IL_UNSIGNED_INT:
  993. case IL_INT:
  994. for (i = 0; i < Size; i++) {
  995. Resultf = 0;
  996. for (c = 0; c < 3; c++) {
  997. Resultf += ((ILuint*)(Data))[i * 3 + c] * LumFactor[c];
  998. }
  999. ((ILuint*)(NewData))[i*2] = (ILuint)Resultf;
  1000. ((ILuint*)(NewData))[i*2+1] = UINT_MAX;
  1001. }
  1002. break;
  1003. case IL_FLOAT:
  1004. for (i = 0; i < Size; i++) {
  1005. Resultf = 0;
  1006. for (c = 0; c < 3; c++) {
  1007. Resultf += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[c];
  1008. }
  1009. ((ILfloat*)(NewData))[i*2] = Resultf;
  1010. ((ILfloat*)(NewData))[i*2+1] = 1.0f;
  1011. }
  1012. break;
  1013. case IL_DOUBLE:
  1014. for (i = 0; i < Size; i++) {
  1015. Resultd = 0;
  1016. for (c = 0; c < 3; c++) {
  1017. Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[c];
  1018. }
  1019. ((ILdouble*)(NewData))[i*2] = Resultd;
  1020. ((ILdouble*)(NewData))[i*2+1] = 1.0;
  1021. }
  1022. break;
  1023. }
  1024. break;
  1025. case IL_ALPHA:
  1026. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
  1027. CHECK_ALLOC();
  1028. memset(NewData, 0, NumPix * BpcDest / 3);
  1029. break;
  1030. default:
  1031. ilSetError(IL_INVALID_CONVERSION);
  1032. if (Data != Buffer)
  1033. ifree(Data);
  1034. return NULL;
  1035. }
  1036. break;
  1037. case IL_BGRA:
  1038. switch (DestFormat)
  1039. {
  1040. case IL_RGBA:
  1041. NewData = (ILubyte*)ialloc(NumPix * BpcDest);
  1042. CHECK_ALLOC();
  1043. switch (DestType)
  1044. {
  1045. case IL_UNSIGNED_BYTE:
  1046. case IL_BYTE:
  1047. #ifdef ALTIVEC_GCC
  1048. abcd2cbad_byte(NewData,iCurImage->SizeOfData,NewData);
  1049. #else
  1050. for (i = 0; i < NumPix; i += 4) {
  1051. NewData[i] = ((ILubyte*)(Data))[i+2];
  1052. NewData[i+1] = ((ILubyte*)(Data))[i+1];
  1053. NewData[i+2] = ((ILubyte*)(Data))[i];
  1054. NewData[i+3] = ((ILubyte*)(Data))[i+3];
  1055. }
  1056. #endif
  1057. break;
  1058. case IL_UNSIGNED_SHORT:
  1059. case IL_SHORT:
  1060. case IL_HALF:
  1061. #ifdef ALTIVEC_GCC
  1062. abcd2cbad_short((ILushort*)Data,iCurImage->SizeOfData,(ILushort*)NewData);
  1063. #else
  1064. for (i = 0; i < NumPix; i += 4) {
  1065. ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
  1066. ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
  1067. ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
  1068. ((ILushort*)(NewData))[i+3] = ((ILushort*)(Data))[i+3];
  1069. }
  1070. #endif
  1071. break;
  1072. case IL_UNSIGNED_INT:
  1073. case IL_INT:
  1074. #ifdef ALTIVEC_GCC
  1075. abcd2cbad_int((ILuint*)NewData,iCurImage->SizeOfData,(ILuint*)NewData);
  1076. #else
  1077. for (i = 0; i < NumPix; i += 4) {
  1078. ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
  1079. ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
  1080. ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
  1081. ((ILuint*)(NewData))[i+3] = ((ILuint*)(Data))[i+3];
  1082. }
  1083. #endif
  1084. break;
  1085. case IL_FLOAT:
  1086. #ifdef ALTIVEC_GCC
  1087. abcd2cbad_float(NewData,iCurImage->SizeOfData,NewData);
  1088. #else
  1089. for (i = 0; i < NumPix; i += 4) {
  1090. ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
  1091. ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
  1092. ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
  1093. ((ILfloat*)(NewData))[i+3] = ((ILfloat*)(Data))[i+3];
  1094. }
  1095. #endif
  1096. break;
  1097. case IL_DOUBLE:
  1098. #ifdef ALTIVEC_GCC
  1099. abcd2cbad_double((ILdouble*)Data,iCurImage->SizeOfData,(ILdouble*)NewData);
  1100. #else
  1101. for (i = 0; i < NumPix; i += 4) {
  1102. ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
  1103. ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
  1104. ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
  1105. ((ILdouble*)(NewData))[i+3] = ((ILdouble*)(Data))[i+3];
  1106. }
  1107. #endif
  1108. break;
  1109. }
  1110. break;
  1111. case IL_BGR:
  1112. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
  1113. CHECK_ALLOC();
  1114. switch (DestType)
  1115. {
  1116. case IL_UNSIGNED_BYTE:
  1117. case IL_BYTE:
  1118. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1119. NewData[j] = ((ILubyte*)(Data))[i];
  1120. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  1121. NewData[j+2] = ((ILubyte*)(Data))[i+2];
  1122. }
  1123. break;
  1124. case IL_UNSIGNED_SHORT:
  1125. case IL_SHORT:
  1126. case IL_HALF:
  1127. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1128. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
  1129. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  1130. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
  1131. }
  1132. break;
  1133. case IL_UNSIGNED_INT:
  1134. case IL_INT:
  1135. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1136. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
  1137. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  1138. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
  1139. }
  1140. break;
  1141. case IL_FLOAT:
  1142. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1143. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
  1144. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  1145. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
  1146. }
  1147. break;
  1148. case IL_DOUBLE:
  1149. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1150. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
  1151. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  1152. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
  1153. }
  1154. break;
  1155. }
  1156. break;
  1157. case IL_RGB:
  1158. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
  1159. CHECK_ALLOC();
  1160. switch (DestType)
  1161. {
  1162. case IL_UNSIGNED_BYTE:
  1163. case IL_BYTE:
  1164. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1165. NewData[j] = ((ILubyte*)(Data))[i+2];
  1166. NewData[j+1] = ((ILubyte*)(Data))[i+1];
  1167. NewData[j+2] = ((ILubyte*)(Data))[i];
  1168. }
  1169. break;
  1170. case IL_UNSIGNED_SHORT:
  1171. case IL_SHORT:
  1172. case IL_HALF:
  1173. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1174. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
  1175. ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
  1176. ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
  1177. }
  1178. break;
  1179. case IL_UNSIGNED_INT:
  1180. case IL_INT:
  1181. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1182. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
  1183. ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
  1184. ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
  1185. }
  1186. break;
  1187. case IL_FLOAT:
  1188. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1189. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
  1190. ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
  1191. ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
  1192. }
  1193. break;
  1194. case IL_DOUBLE:
  1195. for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
  1196. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
  1197. ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
  1198. ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
  1199. }
  1200. break;
  1201. }
  1202. break;
  1203. case IL_LUMINANCE:
  1204. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
  1205. CHECK_ALLOC();
  1206. Size = NumPix / 4;
  1207. switch (DestType)
  1208. {
  1209. case IL_UNSIGNED_BYTE:
  1210. case IL_BYTE:
  1211. for (i = 0; i < Size; i++) {
  1212. Resultf = 0.0f;  j = 2;
  1213. for (c = 0; c < 3; c++, j--) {
  1214. Resultf += ((ILubyte*)(Data))[i * 4 + c] * LumFactor[j];
  1215. }
  1216. NewData[i] = (ILubyte)Resultf;
  1217. }
  1218. break;
  1219. case IL_UNSIGNED_SHORT:
  1220. case IL_SHORT:
  1221. case IL_HALF:
  1222. for (i = 0; i < Size; i++) {
  1223. Resultf = 0.0f;  j = 2;
  1224. for (c = 0; c < 3; c++, j--) {
  1225. Resultf += ((ILushort*)(Data))[i * 4 + c] * LumFactor[j];
  1226. }
  1227. ((ILushort*)(NewData))[i] = (ILushort)Resultf;
  1228. }
  1229. break;
  1230. case IL_UNSIGNED_INT:
  1231. case IL_INT:
  1232. for (i = 0; i < Size; i++) {
  1233. Resultd = 0.0f;  j = 2;
  1234. for (c = 0; c < 3; c++, j--) {
  1235. Resultd += ((ILuint*)(Data))[i * 4 + c] * LumFactor[j];
  1236. }
  1237. ((ILuint*)(NewData))[i] = (ILuint)Resultd;
  1238. }
  1239. break;
  1240. case IL_FLOAT:
  1241. for (i = 0; i < Size; i++) {
  1242. Resultd = 0.0f;  j = 2;
  1243. for (c = 0; c < 3; c++, j--) {
  1244. Resultd += ((ILfloat*)(Data))[i * 4 + c] * LumFactor[j];
  1245. }
  1246. ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
  1247. }
  1248. break;
  1249. case IL_DOUBLE:
  1250. for (i = 0; i < Size; i++) {
  1251. Resultd = 0.0f;  j = 2;
  1252. for (c = 0; c < 3; c++, j--) {
  1253. Resultd += ((ILdouble*)(Data))[i * 4 + c] * LumFactor[j];
  1254. }
  1255. ((ILdouble*)(NewData))[i] = Resultd;
  1256. }
  1257. break;
  1258. }
  1259. break;
  1260. case IL_LUMINANCE_ALPHA:
  1261. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4 * 2);
  1262. CHECK_ALLOC();
  1263. Size = NumPix / 4 * 2;
  1264. switch (DestType)
  1265. {
  1266. case IL_UNSIGNED_BYTE:
  1267. case IL_BYTE:
  1268. for (i = 0; i < Size; i += 2) {
  1269. Resultf = 0.0f;
  1270. for (c = 0; c < 3; c++) {
  1271. Resultf += ((ILubyte*)(Data))[i * 2 + c] * LumFactor[c];
  1272. }
  1273. NewData[i] = (ILubyte)Resultf;
  1274. NewData[i+1] = ((ILubyte*)(Data))[i * 2 + 3];
  1275. }
  1276. break;
  1277. case IL_UNSIGNED_SHORT:
  1278. case IL_SHORT:
  1279. case IL_HALF:
  1280. for (i = 0; i < Size; i += 2) {
  1281. Resultf = 0.0f;
  1282. for (c = 0; c < 3; c++) {
  1283. Resultf += ((ILushort*)(Data))[i * 2 + c] * LumFactor[c];
  1284. }
  1285. ((ILushort*)(NewData))[i] = (ILushort)Resultf;
  1286. ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i * 2 + 3];
  1287. }
  1288. break;
  1289. case IL_UNSIGNED_INT:
  1290. case IL_INT:
  1291. for (i = 0; i < Size; i += 2) {
  1292. Resultd = 0.0;
  1293. for (c = 0; c < 3; c++) {
  1294. Resultd += ((ILuint*)(Data))[i * 2 + c] * LumFactor[c];
  1295. }
  1296. ((ILuint*)(NewData))[i] = (ILuint)Resultd;
  1297. ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i * 2 + 3];
  1298. }
  1299. break;
  1300. case IL_FLOAT:
  1301. for (i = 0; i < Size; i += 2) {
  1302. Resultd = 0.0;
  1303. for (c = 0; c < 3; c++) {
  1304. Resultd += ((ILfloat*)(Data))[i * 2 + c] * LumFactor[c];
  1305. }
  1306. ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
  1307. ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i * 2 + 3];
  1308. }
  1309. break;
  1310. case IL_DOUBLE:
  1311. for (i = 0; i < Size; i += 2) {
  1312. Resultd = 0.0;
  1313. for (c = 0; c < 3; c++) {
  1314. Resultd += ((ILdouble*)(Data))[i * 2 + c] * LumFactor[c];
  1315. }
  1316. ((ILdouble*)(NewData))[i] = Resultd;
  1317. ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i * 2 + 3];
  1318. }
  1319. break;
  1320. }
  1321. break;
  1322. case IL_ALPHA:
  1323. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
  1324. CHECK_ALLOC();
  1325. Size = NumPix / 4;
  1326. switch (DestType)
  1327. {
  1328. case IL_UNSIGNED_BYTE:
  1329. case IL_BYTE:
  1330. for (i = 0; i < Size; i++) {
  1331. NewData[i] = ((ILubyte*)(Data))[i * 4 + 3];
  1332. }
  1333. break;
  1334. case IL_UNSIGNED_SHORT:
  1335. case IL_SHORT:
  1336. case IL_HALF:
  1337. for (i = 0; i < Size; i++) {
  1338. ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i * 4 + 3];
  1339. }
  1340. break;
  1341. case IL_UNSIGNED_INT:
  1342. case IL_INT:
  1343. for (i = 0; i < Size; i++) {
  1344. ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i * 4 + 3];
  1345. }
  1346. break;
  1347. case IL_FLOAT:
  1348. for (i = 0; i < Size; i++) {
  1349. ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i * 4 + 3];
  1350. }
  1351. break;
  1352. case IL_DOUBLE:
  1353. for (i = 0; i < Size; i++) {
  1354. ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i * 4 + 3];
  1355. }
  1356. break;
  1357. }
  1358. break;
  1359. default:
  1360. ilSetError(IL_INVALID_CONVERSION);
  1361. if (Data != Buffer)
  1362. ifree(Data);
  1363. return NULL;
  1364. }
  1365. break;
  1366. case IL_LUMINANCE:
  1367. switch (DestFormat)
  1368. {
  1369. case IL_RGB:
  1370. case IL_BGR:
  1371. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3);
  1372. CHECK_ALLOC();
  1373. switch (DestType)
  1374. {
  1375. case IL_UNSIGNED_BYTE:
  1376. case IL_BYTE:
  1377. for (i = 0, j = 0; i < NumPix; i++, j += 3) {
  1378. for (c = 0; c < 3; c++) {
  1379. NewData[j + c] = ((ILubyte*)(Data))[i];
  1380. }
  1381. }
  1382. break;
  1383. case IL_UNSIGNED_SHORT:
  1384. case IL_SHORT:
  1385. case IL_HALF:
  1386. for (i = 0, j = 0; i < NumPix; i++, j += 3) {
  1387. for (c = 0; c < 3; c++) {
  1388. ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
  1389. }
  1390. }
  1391. break;
  1392. case IL_UNSIGNED_INT:
  1393. case IL_INT:
  1394. for (i = 0, j = 0; i < NumPix; i++, j += 3) {
  1395. for (c = 0; c < 3; c++) {
  1396. ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
  1397. }
  1398. }
  1399. break;
  1400. case IL_FLOAT:
  1401. for (i = 0, j = 0; i < NumPix; i++, j += 3) {
  1402. for (c = 0; c < 3; c++) {
  1403. ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
  1404. }
  1405. }
  1406. break;
  1407. case IL_DOUBLE:
  1408. for (i = 0, j = 0; i < NumPix; i++, j += 3) {
  1409. for (c = 0; c < 3; c++) {
  1410. ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
  1411. }
  1412. }
  1413. break;
  1414. }
  1415. break;
  1416. case IL_RGBA:
  1417. case IL_BGRA:
  1418. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4);
  1419. CHECK_ALLOC();
  1420. switch (DestType)
  1421. {
  1422. case IL_UNSIGNED_BYTE:
  1423. case IL_BYTE:
  1424. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1425. for (c = 0; c < 3; c++) {
  1426. NewData[j + c] = ((ILubyte*)(Data))[i];
  1427. }
  1428. NewData[j + 3] = UCHAR_MAX;  // Full opacity
  1429. }
  1430. break;
  1431. case IL_UNSIGNED_SHORT:
  1432. case IL_SHORT:
  1433. case IL_HALF:
  1434. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1435. for (c = 0; c < 3; c++) {
  1436. ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
  1437. }
  1438. ((ILushort*)(NewData))[j + 3] = USHRT_MAX;  // Full opacity
  1439. }
  1440. break;
  1441. case IL_UNSIGNED_INT:
  1442. case IL_INT:
  1443. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1444. for (c = 0; c < 3; c++) {
  1445. ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
  1446. }
  1447. ((ILuint*)(NewData))[j + 3] = UINT_MAX;  // Full opacity
  1448. }
  1449. break;
  1450. case IL_FLOAT:
  1451. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1452. for (c = 0; c < 3; c++) {
  1453. ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
  1454. }
  1455. ((ILfloat*)(NewData))[j + 3] = 1.0f;  // Full opacity
  1456. }
  1457. break;
  1458. case IL_DOUBLE:
  1459. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1460. for (c = 0; c < 3; c++) {
  1461. ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
  1462. }
  1463. ((ILdouble*)(NewData))[j + 3] = 1.0;  // Full opacity
  1464. }
  1465. break;
  1466. }
  1467. break;
  1468. case IL_LUMINANCE_ALPHA:
  1469. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 2);
  1470. CHECK_ALLOC();
  1471. switch (DestType)
  1472. {
  1473. case IL_UNSIGNED_BYTE:
  1474. case IL_BYTE:
  1475. for (i = 0; i < NumPix; i++) {
  1476. NewData[i * 2] = ((ILubyte*)(Data))[i];
  1477. NewData[i * 2 + 1] = UCHAR_MAX;  // Full opacity
  1478. }
  1479. break;
  1480. case IL_UNSIGNED_SHORT:
  1481. case IL_SHORT:
  1482. case IL_HALF:
  1483. for (i = 0; i < NumPix; i++) {
  1484. ((ILushort*)(NewData))[i * 2] = ((ILushort*)(Data))[i];
  1485. ((ILushort*)(NewData))[i * 2 + 1] = USHRT_MAX;  // Full opacity
  1486. }
  1487. break;
  1488. case IL_UNSIGNED_INT:
  1489. case IL_INT:
  1490. for (i = 0; i < NumPix; i++) {
  1491. ((ILuint*)(NewData))[i * 2] = ((ILuint*)(Data))[i];
  1492. ((ILuint*)(NewData))[i * 2 + 1] = UINT_MAX;  // Full opacity
  1493. }
  1494. break;
  1495. case IL_FLOAT:
  1496. for (i = 0; i < NumPix; i++) {
  1497. ((ILfloat*)(NewData))[i * 2] = ((ILfloat*)(Data))[i];
  1498. ((ILfloat*)(NewData))[i * 2 + 1] = 1.0f;  // Full opacity
  1499. }
  1500. break;
  1501. case IL_DOUBLE:
  1502. for (i = 0; i < NumPix; i++) {
  1503. ((ILdouble*)(NewData))[i * 2] = ((ILdouble*)(Data))[i];
  1504. ((ILdouble*)(NewData))[i * 2 + 1] = 1.0;  // Full opacity
  1505. }
  1506. break;
  1507. }
  1508. break;
  1509. case IL_ALPHA:
  1510. NewData = (ILubyte*)ialloc(NumPix * BpcDest);
  1511. CHECK_ALLOC();
  1512. memset(NewData, 0, NumPix * BpcDest);
  1513. break;
  1514. /*case IL_COLOUR_INDEX:
  1515. NewData = (ILubyte*)ialloc(iCurImage->SizeOfData);
  1516. NewImage->Pal.Palette = (ILubyte*)ialloc(768);
  1517. if (NewData == NULL || NewImage->Pal.Palette) {
  1518. ifree(NewImage);
  1519. return IL_FALSE;
  1520. }
  1521. // Fill the palette
  1522. for (i = 0; i < 256; i++) {
  1523. for (c = 0; c < 3; c++) {
  1524. NewImage->Pal.Palette[i * 3 + c] = (ILubyte)i;
  1525. }
  1526. }
  1527. // Copy the data
  1528. for (i = 0; i < iCurImage->SizeOfData; i++) {
  1529. NewData[i] = iCurImage->Data[i];
  1530. }
  1531. break;*/
  1532. default:
  1533. ilSetError(IL_INVALID_CONVERSION);
  1534. if (Data != Buffer)
  1535. ifree(Data);
  1536. return NULL;
  1537. }
  1538. break;
  1539. case IL_LUMINANCE_ALPHA:
  1540. switch (DestFormat)
  1541. {
  1542. case IL_RGB:
  1543. case IL_BGR:
  1544. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2 * 3);
  1545. CHECK_ALLOC();
  1546. switch (DestType)
  1547. {
  1548. case IL_UNSIGNED_BYTE:
  1549. case IL_BYTE:
  1550. for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
  1551. for (c = 0; c < 3; c++) {
  1552. NewData[j + c] = ((ILubyte*)(Data))[i];
  1553. }
  1554. }
  1555. break;
  1556. case IL_UNSIGNED_SHORT:
  1557. case IL_SHORT:
  1558. case IL_HALF:
  1559. for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
  1560. for (c = 0; c < 3; c++) {
  1561. ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
  1562. }
  1563. }
  1564. break;
  1565. case IL_UNSIGNED_INT:
  1566. case IL_INT:
  1567. for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
  1568. for (c = 0; c < 3; c++) {
  1569. ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
  1570. }
  1571. }
  1572. break;
  1573. case IL_FLOAT:
  1574. for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
  1575. for (c = 0; c < 3; c++) {
  1576. ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
  1577. }
  1578. }
  1579. break;
  1580. case IL_DOUBLE:
  1581. for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
  1582. for (c = 0; c < 3; c++) {
  1583. ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
  1584. }
  1585. }
  1586. break;
  1587. }
  1588. break;
  1589. case IL_RGBA:
  1590. case IL_BGRA:
  1591. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2 * 4);
  1592. CHECK_ALLOC();
  1593. switch (DestType)
  1594. {
  1595. case IL_UNSIGNED_BYTE:
  1596. case IL_BYTE:
  1597. for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
  1598. for (c = 0; c < 3; c++) {
  1599. NewData[j + c] = ((ILubyte*)(Data))[i];
  1600. }
  1601. NewData[j + 3] = ((ILubyte*)(Data))[i+1];
  1602. }
  1603. break;
  1604. case IL_UNSIGNED_SHORT:
  1605. case IL_SHORT:
  1606. case IL_HALF:
  1607. for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
  1608. for (c = 0; c < 3; c++) {
  1609. ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
  1610. }
  1611. ((ILushort*)(NewData))[j + 3] = ((ILushort*)(Data))[i+1];
  1612. }
  1613. break;
  1614. case IL_UNSIGNED_INT:
  1615. case IL_INT:
  1616. for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
  1617. for (c = 0; c < 3; c++) {
  1618. ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
  1619. }
  1620. ((ILuint*)(NewData))[j + 3] = ((ILuint*)(Data))[i+1];
  1621. }
  1622. break;
  1623. case IL_FLOAT:
  1624. for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
  1625. for (c = 0; c < 3; c++) {
  1626. ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
  1627. }
  1628. ((ILfloat*)(NewData))[j + 3] = ((ILfloat*)(Data))[i+1];
  1629. }
  1630. break;
  1631. case IL_DOUBLE:
  1632. for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
  1633. for (c = 0; c < 3; c++) {
  1634. ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
  1635. }
  1636. ((ILdouble*)(NewData))[j + 3] = ((ILdouble*)(Data))[i+1];
  1637. }
  1638. break;
  1639. }
  1640. break;
  1641. case IL_LUMINANCE:
  1642. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2);
  1643. CHECK_ALLOC();
  1644. switch (DestType)
  1645. {
  1646. case IL_UNSIGNED_BYTE:
  1647. case IL_BYTE:
  1648. for (i = 0, j = 0; i < NumPix; i += 2, j++) {
  1649. NewData[j] = ((ILubyte*)(Data))[i];
  1650. }
  1651. break;
  1652. case IL_UNSIGNED_SHORT:
  1653. case IL_SHORT:
  1654. case IL_HALF:
  1655. for (i = 0, j = 0; i < NumPix; i += 2, j++) {
  1656. ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
  1657. }
  1658. break;
  1659. case IL_UNSIGNED_INT:
  1660. case IL_INT:
  1661. for (i = 0, j = 0; i < NumPix; i += 2, j++) {
  1662. ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
  1663. }
  1664. break;
  1665. case IL_FLOAT:
  1666. for (i = 0, j = 0; i < NumPix; i += 2, j++) {
  1667. ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
  1668. }
  1669. break;
  1670. case IL_DOUBLE:
  1671. for (i = 0, j = 0; i < NumPix; i += 2, j++) {
  1672. ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
  1673. }
  1674. break;
  1675. }
  1676. break;
  1677. case IL_ALPHA:
  1678. NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2);
  1679. CHECK_ALLOC();
  1680. Size = NumPix / 2;
  1681. switch (DestType)
  1682. {
  1683. case IL_UNSIGNED_BYTE:
  1684. case IL_BYTE:
  1685. for (i = 0; i < Size; i++) {
  1686. NewData[i] = ((ILubyte*)(Data))[i * 2 + 3];
  1687. }
  1688. break;
  1689. case IL_UNSIGNED_SHORT:
  1690. case IL_SHORT:
  1691. case IL_HALF:
  1692. for (i = 0; i < Size; i++) {
  1693. ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i * 2 + 3];
  1694. }
  1695. break;
  1696. case IL_UNSIGNED_INT:
  1697. case IL_INT:
  1698. for (i = 0; i < Size; i++) {
  1699. ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i * 2 + 3];
  1700. }
  1701. break;
  1702. case IL_FLOAT:
  1703. for (i = 0; i < Size; i++) {
  1704. ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i * 2 + 3];
  1705. }
  1706. break;
  1707. case IL_DOUBLE:
  1708. for (i = 0; i < Size; i++) {
  1709. ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i * 2 + 3];
  1710. }
  1711. break;
  1712. }
  1713. break;
  1714. /*case IL_COLOUR_INDEX:
  1715. NewData = (ILubyte*)ialloc(iCurImage->SizeOfData);
  1716. NewImage->Pal.Palette = (ILubyte*)ialloc(768);
  1717. if (NewData == NULL || NewImage->Pal.Palette) {
  1718. ifree(NewImage);
  1719. return IL_FALSE;
  1720. }
  1721. // Fill the palette
  1722. for (i = 0; i < 256; i++) {
  1723. for (c = 0; c < 3; c++) {
  1724. NewImage->Pal.Palette[i * 3 + c] = (ILubyte)i;
  1725. }
  1726. }
  1727. // Copy the data
  1728. for (i = 0; i < iCurImage->SizeOfData; i++) {
  1729. NewData[i] = iCurImage->Data[i];
  1730. }
  1731. break;*/
  1732. default:
  1733. ilSetError(IL_INVALID_CONVERSION);
  1734. if (Data != Buffer)
  1735. ifree(Data);
  1736. return NULL;
  1737. }
  1738. break;
  1739. case IL_ALPHA:
  1740. switch (DestFormat)
  1741. {
  1742. case IL_RGB:
  1743. case IL_BGR:
  1744. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3);
  1745. CHECK_ALLOC();
  1746. switch (DestType)
  1747. {
  1748. case IL_UNSIGNED_BYTE:
  1749. case IL_BYTE:
  1750. case IL_UNSIGNED_SHORT:
  1751. case IL_SHORT:
  1752. case IL_HALF:
  1753. case IL_UNSIGNED_INT:
  1754. case IL_INT:
  1755. case IL_FLOAT:
  1756. case IL_DOUBLE:
  1757. memset(NewData, 0, NumPix * BpcDest * 3);  // Easy enough
  1758. break;
  1759. //@TODO: Do we need to a check for default: (error)?
  1760. }
  1761. break;
  1762. case IL_RGBA:
  1763. case IL_BGRA:
  1764. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4);
  1765. CHECK_ALLOC();
  1766. switch (DestType)
  1767. {
  1768. case IL_UNSIGNED_BYTE:
  1769. case IL_BYTE:
  1770. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1771. for (c = 0; c < 3; c++) {
  1772. NewData[j + c] = 0;
  1773. }
  1774. NewData[j + 3] = ((ILubyte*)(Data))[i];  // Only value that matters
  1775. }
  1776. break;
  1777. case IL_UNSIGNED_SHORT:
  1778. case IL_SHORT:
  1779. case IL_HALF:
  1780. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1781. for (c = 0; c < 3; c++) {
  1782. ((ILushort*)(NewData))[j + c] = 0;
  1783. }
  1784. ((ILushort*)(NewData))[j + 3] = ((ILushort*)(Data))[i];
  1785. }
  1786. break;
  1787. case IL_UNSIGNED_INT:
  1788. case IL_INT:
  1789. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1790. for (c = 0; c < 3; c++) {
  1791. ((ILuint*)(NewData))[j + c] = 0;
  1792. }
  1793. ((ILuint*)(NewData))[j + 3] = ((ILuint*)(Data))[i];
  1794. }
  1795. break;
  1796. case IL_FLOAT:
  1797. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1798. for (c = 0; c < 3; c++) {
  1799. ((ILfloat*)(NewData))[j + c] = 0;
  1800. }
  1801. ((ILfloat*)(NewData))[j + 3] = ((ILfloat*)(Data))[i];
  1802. }
  1803. break;
  1804. case IL_DOUBLE:
  1805. for (i = 0, j = 0; i < NumPix; i++, j += 4) {
  1806. for (c = 0; c < 3; c++) {
  1807. ((ILdouble*)(NewData))[j + c] = 0;
  1808. }
  1809. ((ILdouble*)(NewData))[j + 3] = ((ILdouble*)(Data))[i];
  1810. }
  1811. break;
  1812. }
  1813. break;
  1814. case IL_LUMINANCE_ALPHA:
  1815. NewData = (ILubyte*)ialloc(NumPix * BpcDest * 2);
  1816. CHECK_ALLOC();
  1817. switch (DestType)
  1818. {
  1819. case IL_UNSIGNED_BYTE:
  1820. case IL_BYTE:
  1821. for (i = 0; i < NumPix; i++) {
  1822. NewData[i * 2] = 0;
  1823. NewData[i * 2 + 1] = ((ILubyte*)(Data))[i];
  1824. }
  1825. break;
  1826. case IL_UNSIGNED_SHORT:
  1827. case IL_SHORT:
  1828. case IL_HALF:
  1829. for (i = 0; i < NumPix; i++) {
  1830. ((ILushort*)(NewData))[i * 2] = 0;
  1831. ((ILushort*)(NewData))[i * 2 + 1] = ((ILushort*)(Data))[i];
  1832. }
  1833. break;
  1834. case IL_UNSIGNED_INT:
  1835. case IL_INT:
  1836. for (i = 0; i < NumPix; i++) {
  1837. ((ILuint*)(NewData))[i * 2] = 0;
  1838. ((ILuint*)(NewData))[i * 2 + 1] = ((ILuint*)(Data))[i];
  1839. }
  1840. break;
  1841. case IL_FLOAT:
  1842. for (i = 0; i < NumPix; i++) {
  1843. ((ILfloat*)(NewData))[i * 2] = 0;
  1844. ((ILfloat*)(NewData))[i * 2 + 1] = ((ILfloat*)(Data))[i];
  1845. }
  1846. break;
  1847. case IL_DOUBLE:
  1848. for (i = 0; i < NumPix; i++) {
  1849. ((ILdouble*)(NewData))[i * 2] = 0;
  1850. ((ILdouble*)(NewData))[i * 2 + 1] = ((ILdouble*)(Data))[i];
  1851. }
  1852. break;
  1853. }
  1854. break;
  1855. /*case IL_COLOUR_INDEX:
  1856. NewData = (ILubyte*)ialloc(iCurImage->SizeOfData);
  1857. NewImage->Pal.Palette = (ILubyte*)ialloc(768);
  1858. if (NewData == NULL || NewImage->Pal.Palette) {
  1859. ifree(NewImage);
  1860. return IL_FALSE;
  1861. }
  1862. // Fill the palette
  1863. for (i = 0; i < 256; i++) {
  1864. for (c = 0; c < 3; c++) {
  1865. NewImage->Pal.Palette[i * 3 + c] = (ILubyte)i;
  1866. }
  1867. }
  1868. // Copy the data
  1869. for (i = 0; i < iCurImage->SizeOfData; i++) {
  1870. NewData[i] = iCurImage->Data[i];
  1871. }
  1872. break;*/
  1873. default:
  1874. ilSetError(IL_INVALID_CONVERSION);
  1875. if (Data != Buffer)
  1876. ifree(Data);
  1877. return NULL;
  1878. }
  1879. break;
  1880. }
  1881. if (Data != Buffer)
  1882. ifree(Data);
  1883. return NewData;
  1884. }
  1885. // Really shouldn't have to check for default, as in above ilConvertBuffer().
  1886. //  This now converts better from lower bpp to higher bpp.  For example, when
  1887. //  converting from 8 bpp to 16 bpp, if the value is 0xEC, the new value is 0xECEC.
  1888. void* ILAPIENTRY iSwitchTypes(ILuint SizeOfData, ILenum SrcType, ILenum DestType, void *Buffer)
  1889. {
  1890. ILuint BpcSrc, BpcDest, Size, i;
  1891. ILubyte *NewData, *BytePtr;
  1892. ILushort *ShortPtr;
  1893. ILuint *IntPtr;
  1894. ILfloat *FloatPtr, tempFloat;
  1895. ILdouble *DblPtr, tempDouble;
  1896. ILushort *HalfPtr;
  1897. BpcSrc = ilGetBpcType(SrcType);
  1898. BpcDest = ilGetBpcType(DestType);
  1899. if (BpcSrc == 0 || BpcDest == 0) {
  1900. ilSetError(IL_INTERNAL_ERROR);
  1901. return IL_FALSE;
  1902. }
  1903. Size = SizeOfData / BpcSrc;
  1904. if (BpcSrc == BpcDest) {
  1905. return Buffer;
  1906. }
  1907. NewData = (ILubyte*)ialloc(Size * BpcDest);
  1908. if (NewData == NULL) {
  1909. return IL_FALSE;
  1910. }
  1911. switch (DestType)
  1912. {
  1913. case IL_UNSIGNED_BYTE:
  1914. case IL_BYTE:
  1915. BytePtr = (ILubyte*)NewData;
  1916. switch (SrcType)
  1917. {
  1918. case IL_UNSIGNED_SHORT:
  1919. case IL_SHORT:
  1920. for (i = 0; i < Size; i++) {
  1921. BytePtr[i] = ((ILushort*)Buffer)[i] >> 8;
  1922. }
  1923. break;
  1924. case IL_UNSIGNED_INT:
  1925. case IL_INT:
  1926. for (i = 0; i < Size; i++) {
  1927. BytePtr[i] = ((ILuint*)Buffer)[i] >> 24;
  1928. }
  1929. break;
  1930. case IL_FLOAT:
  1931. for (i = 0; i < Size; i++) {
  1932. #if CLAMP_FLOATS
  1933. tempFloat = IL_CLAMP(((ILfloat*)Buffer)[i]);
  1934. BytePtr[i] = (ILubyte)(tempFloat * UCHAR_MAX);
  1935. #else
  1936. BytePtr[i] = (ILubyte)(((ILfloat*)Buffer)[i] * UCHAR_MAX);
  1937. #endif
  1938. }
  1939. break;
  1940. case IL_HALF:
  1941. for (i = 0; i < Size; i++) {
  1942. #if CLAMP_HALF
  1943. *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
  1944. tempFloat = IL_CLAMP(tempFloat);
  1945. BytePtr[i] = (ILubyte)(tempFloat * UCHAR_MAX);
  1946. #else
  1947. *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
  1948. BytePtr[i] = (ILubyte)(tempFloat * UCHAR_MAX);
  1949. #endif
  1950. }
  1951. break;
  1952. case IL_DOUBLE:
  1953. for (i = 0; i < Size; i++) {
  1954. #if CLAMP_DOUBLES
  1955. tempDouble = IL_CLAMP(((ILdouble*)Buffer)[i]);
  1956. BytePtr[i] = (ILubyte)(tempDouble * UCHAR_MAX);
  1957. #else
  1958. BytePtr[i] = (ILubyte)( ((ILdouble*)Buffer)[i] * UCHAR_MAX);
  1959. #endif
  1960. }
  1961. break;
  1962. }
  1963. break;
  1964. case IL_UNSIGNED_SHORT:
  1965. case IL_SHORT:
  1966. ShortPtr = (ILushort*)NewData;
  1967. switch (SrcType)
  1968. {
  1969. case IL_UNSIGNED_BYTE:
  1970. case IL_BYTE:
  1971. for (i = 0; i < Size; i++) {
  1972. ShortPtr[i] = (((ILubyte*)Buffer)[i] << 8) | ((ILubyte*)Buffer)[i];
  1973. }
  1974. break;
  1975. case IL_UNSIGNED_INT:
  1976. case IL_INT:
  1977. for (i = 0; i < Size; i++) {
  1978. ShortPtr[i] = ((ILuint*)Buffer)[i] >> 16;
  1979. }
  1980. break;
  1981. case IL_FLOAT:
  1982. for (i = 0; i < Size; i++) {
  1983. #if CLAMP_FLOATS
  1984. tempFloat = IL_CLAMP(((ILfloat*)Buffer)[i]);
  1985. ShortPtr[i] = (ILushort)(tempFloat * USHRT_MAX);
  1986. #else
  1987. ShortPtr[i] = (ILushort)( ((ILfloat*)Buffer)[i] * USHRT_MAX);
  1988. #endif
  1989. }
  1990. break;
  1991. case IL_HALF:
  1992. for (i = 0; i < Size; i++) {
  1993. #if CLAMP_FLOATS
  1994. *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
  1995. tempFloat = IL_CLAMP(tempFloat);
  1996. ShortPtr[i] = (ILushort)(tempFloat * USHRT_MAX);
  1997. #else
  1998. *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
  1999. ShortPtr[i] = (ILushort)(tempFloat * USHRT_MAX);
  2000. #endif
  2001. }
  2002. break;
  2003. case IL_DOUBLE:
  2004. for (i = 0; i < Size; i++) {
  2005. #if CLAMP_DOUBLES
  2006. tempDouble = IL_CLAMP(((ILdouble*)Buffer)[i]);
  2007. ShortPtr[i] = (ILushort)(tempDouble * USHRT_MAX);
  2008. #else
  2009. ShortPtr[i] = (ILushort)( ((ILdouble*)Buffer)[i] * USHRT_MAX);
  2010. #endif
  2011. }
  2012. break;
  2013. }
  2014. break;
  2015. case IL_UNSIGNED_INT:
  2016. case IL_INT:
  2017. IntPtr = (ILuint*)NewData;
  2018. switch (SrcType)
  2019. {
  2020. case IL_UNSIGNED_BYTE:
  2021. case IL_BYTE:
  2022. for (i = 0; i < Size; i++) {
  2023. IntPtr[i] = (((ILubyte*)Buffer)[i] << 24) | (((ILubyte*)Buffer)[i] << 16) | 
  2024. (((ILubyte*)Buffer)[i] << 8) | ((ILubyte*)Buffer)[i];
  2025. }
  2026. break;
  2027. case IL_UNSIGNED_SHORT:
  2028. case IL_SHORT:
  2029. for (i = 0; i < Size; i++) {
  2030. IntPtr[i] = (((ILushort*)Buffer)[i] << 16) | ((ILushort*)Buffer)[i];
  2031. }
  2032. break;
  2033. case IL_FLOAT:
  2034. for (i = 0; i < Size; i++) {
  2035. #if CLAMP_FLOATS
  2036. tempFloat = IL_CLAMP(((ILfloat*)Buffer)[i]);
  2037. IntPtr[i] = (ILuint)(tempFloat * UINT_MAX);
  2038. #else
  2039. IntPtr[i] = (ILuint)( ((ILfloat*)Buffer)[i] * UINT_MAX);
  2040. #endif
  2041. }
  2042. break;
  2043. case IL_HALF:
  2044. for (i = 0; i < Size; i++) {
  2045. #if CLAMP_FLOATS
  2046. *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
  2047. tempFloat = IL_CLAMP(tempFloat);
  2048. IntPtr[i] = (ILuint)(tempFloat * UINT_MAX);
  2049. #else
  2050. *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
  2051. IntPtr[i] = (ILuint)(tempFloat * UINT_MAX);
  2052. #endif
  2053. }
  2054. break;
  2055. case IL_DOUBLE:
  2056. for (i = 0; i < Size; i++) {
  2057. #if CLAMP_DOUBLES
  2058. tempDouble = IL_CLAMP(((ILdouble*)Buffer)[i]);
  2059. IntPtr[i] = (ILuint)(tempDouble * UINT_MAX);
  2060. #else
  2061. IntPtr[i] = (ILuint)( ((ILdouble*)Buffer)[i] * UINT_MAX);
  2062. #endif
  2063. }
  2064. break;
  2065. }
  2066. break;
  2067. // @TODO:  Handle signed better.
  2068. case IL_FLOAT:
  2069. FloatPtr = (ILfloat*)NewData;
  2070. switch (SrcType)
  2071. {
  2072. case IL_UNSIGNED_BYTE:
  2073. for (i = 0; i < Size; i++) {
  2074. FloatPtr[i] = ((ILubyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
  2075. }
  2076. break;
  2077. case IL_BYTE:
  2078. for (i = 0; i < Size; i++) {
  2079. FloatPtr[i] = ((ILbyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
  2080. }
  2081. break;
  2082. case IL_UNSIGNED_SHORT:
  2083. for (i = 0; i < Size; i++) {
  2084. FloatPtr[i] = ((ILushort*)Buffer)[i] / (ILfloat)USHRT_MAX;
  2085. }
  2086. break;
  2087. case IL_SHORT:
  2088. for (i = 0; i < Size; i++) {
  2089. FloatPtr[i] = ((ILshort*)Buffer)[i] / (ILfloat)USHRT_MAX;
  2090. }
  2091. break;
  2092. case IL_UNSIGNED_INT:
  2093. for (i = 0; i < Size; i++) {
  2094. FloatPtr[i] = (ILfloat)((ILuint*)Buffer)[i] / (ILfloat)UINT_MAX;
  2095. }
  2096. break;
  2097. case IL_INT:
  2098. for (i = 0; i < Size; i++) {
  2099. FloatPtr[i] = (ILfloat)((ILint*)Buffer)[i] / (ILfloat)UINT_MAX;
  2100. }
  2101. break;
  2102. case IL_HALF:
  2103. for (i = 0; i < Size; i++) {
  2104. *((ILuint*)&FloatPtr[i]) = ilHalfToFloat(((ILushort*)Buffer)[i]);
  2105. }
  2106. case IL_DOUBLE:
  2107. for (i = 0; i < Size; i++) {
  2108. FloatPtr[i] = (ILfloat)((ILdouble*)Buffer)[i];
  2109. }
  2110. break;
  2111. }
  2112. break;
  2113. case IL_DOUBLE:
  2114. DblPtr = (ILdouble*)NewData;
  2115. switch (SrcType)
  2116. {
  2117. case IL_UNSIGNED_BYTE:
  2118. for (i = 0; i < Size; i++) {
  2119. DblPtr[i] = ((ILubyte*)Buffer)[i] / (ILdouble)UCHAR_MAX;
  2120. }
  2121. break;
  2122. case IL_BYTE:
  2123. for (i = 0; i < Size; i++) {
  2124. DblPtr[i] = ((ILbyte*)Buffer)[i] / (ILdouble)UCHAR_MAX;
  2125. }
  2126. break;
  2127. case IL_UNSIGNED_SHORT:
  2128. for (i = 0; i < Size; i++) {
  2129. DblPtr[i] = ((ILushort*)Buffer)[i] / (ILdouble)USHRT_MAX;
  2130. }
  2131. break;
  2132. case IL_SHORT:
  2133. for (i = 0; i < Size; i++) {
  2134. DblPtr[i] = ((ILshort*)Buffer)[i] / (ILdouble)USHRT_MAX;
  2135. }
  2136. break;
  2137. case IL_UNSIGNED_INT:
  2138. for (i = 0; i < Size; i++) {
  2139. DblPtr[i] = ((ILuint*)Buffer)[i] / (ILdouble)UINT_MAX;
  2140. }
  2141. break;
  2142. case IL_INT:
  2143. for (i = 0; i < Size; i++) {
  2144. DblPtr[i] = ((ILint*)Buffer)[i] / (ILdouble)UINT_MAX;
  2145. }
  2146. break;
  2147. case IL_HALF:
  2148. for (i = 0; i < Size; i++) {
  2149. *(ILushort*)&tempFloat = ilHalfToFloat(((ILushort*)Buffer)[i]);
  2150. DblPtr[i] = tempFloat;
  2151. }
  2152. case IL_FLOAT:
  2153. for (i = 0; i < Size; i++) {
  2154. DblPtr[i] = ((ILfloat*)Buffer)[i];
  2155. }
  2156. break;
  2157. }
  2158. break;
  2159. case IL_HALF:
  2160. HalfPtr = (ILushort*)NewData;
  2161. switch (SrcType)
  2162. {
  2163. case IL_UNSIGNED_BYTE:
  2164. for (i = 0; i < Size; i++) {
  2165. tempFloat = ((ILubyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
  2166. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2167. }
  2168. break;
  2169. case IL_BYTE:
  2170. for (i = 0; i < Size; i++) {
  2171. tempFloat = ((ILbyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
  2172. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2173. }
  2174. break;
  2175. case IL_UNSIGNED_SHORT:
  2176. for (i = 0; i < Size; i++) {
  2177. tempFloat = ((ILushort*)Buffer)[i] / (ILfloat)USHRT_MAX;
  2178. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2179. }
  2180. break;
  2181. case IL_SHORT:
  2182. for (i = 0; i < Size; i++) {
  2183. tempFloat = ((ILshort*)Buffer)[i] / (ILfloat)USHRT_MAX;
  2184. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2185. }
  2186. break;
  2187. case IL_UNSIGNED_INT:
  2188. for (i = 0; i < Size; i++) {
  2189. tempFloat = ((ILuint*)Buffer)[i] / (ILfloat)UINT_MAX;
  2190. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2191. }
  2192. break;
  2193. case IL_INT:
  2194. for (i = 0; i < Size; i++) {
  2195. tempFloat = ((ILint*)Buffer)[i] / (ILfloat)UINT_MAX;
  2196. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2197. }
  2198. break;
  2199. case IL_DOUBLE:
  2200. for (i = 0; i < Size; i++) {
  2201. tempFloat = (ILfloat)((ILdouble*)Buffer)[i];
  2202. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2203. }
  2204. case IL_FLOAT:
  2205. for (i = 0; i < Size; i++) {
  2206. tempFloat = ((ILfloat*)Buffer)[i];
  2207. *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
  2208. }
  2209. break;
  2210. }
  2211. break;
  2212. }
  2213. return NewData;
  2214. }