summaryrefslogtreecommitdiff
path: root/DevIL/src-IL/src/il_convbuff.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'DevIL/src-IL/src/il_convbuff.cpp')
-rw-r--r--DevIL/src-IL/src/il_convbuff.cpp2315
1 files changed, 2315 insertions, 0 deletions
diff --git a/DevIL/src-IL/src/il_convbuff.cpp b/DevIL/src-IL/src/il_convbuff.cpp
new file mode 100644
index 00000000..c9e0d508
--- /dev/null
+++ b/DevIL/src-IL/src/il_convbuff.cpp
@@ -0,0 +1,2315 @@
+//-----------------------------------------------------------------------------
+//
+// ImageLib Sources
+// Copyright (C) 2000-2008 by Denton Woods
+// Last modified: 01/08/2007
+//
+// Filename: src-IL/src/il_convbuff.c
+//
+// Description: Converts between several image formats
+//
+//-----------------------------------------------------------------------------
+
+
+#include "il_internal.h"
+#ifdef ALTIVEC_GCC
+#include "altivec_typeconversion.h"
+#endif
+#include <limits.h>
+
+
+void* ILAPIENTRY iSwitchTypes(ILuint SizeOfData, ILenum SrcType, ILenum DestType, void *Buffer);
+
+//ILushort ILAPIENTRY ilFloatToHalf(ILuint i);
+//ILuint ILAPIENTRY ilHalfToFloat (ILushort y);
+//ILfloat /*ILAPIENTRY*/ ilFloatToHalfOverflow();
+
+ILimage *iConvertPalette(ILimage *Image, ILenum DestFormat);
+
+#define CHECK_ALLOC() if (NewData == NULL) { \
+ if (Data != Buffer) \
+ ifree(Data); \
+ return IL_FALSE; \
+ }
+
+ILAPI void* ILAPIENTRY ilConvertBuffer(ILuint SizeOfData, ILenum SrcFormat, ILenum DestFormat, ILenum SrcType, ILenum DestType, ILpal *SrcPal, void *Buffer)
+{
+ //static const ILfloat LumFactor[3] = { 0.299f, 0.587f, 0.114f }; // Used for conversion to luminance
+ //static const ILfloat LumFactor[3] = { 0.3086f, 0.6094f, 0.0820f }; // http://www.sgi.com/grafica/matrix/index.html
+ static const ILfloat LumFactor[3] = { 0.212671f, 0.715160f, 0.072169f }; // http://www.inforamp.net/~poynton/ and libpng's libpng.txt
+
+ ILubyte *NewData = NULL;
+ ILuint i, j, c, Size;
+ ILfloat Resultf;
+ ILdouble Resultd;
+ ILuint NumPix; // Really number of pixels * bpp.
+ ILuint BpcDest;
+ void *Data = NULL;
+ ILimage *PalImage = NULL, *TempImage = NULL;
+
+ if (SizeOfData == 0 || Buffer == NULL) {
+ ilSetError(IL_INVALID_PARAM);
+ return NULL;
+ }
+
+ Data = iSwitchTypes(SizeOfData, SrcType, DestType, Buffer);
+ if (Data == NULL)
+ return NULL;
+
+ BpcDest = ilGetBpcType(DestType);
+ NumPix = SizeOfData / ilGetBpcType(SrcType);
+
+ if (DestFormat == SrcFormat) {
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest);
+ if (NewData == NULL) {
+ return IL_FALSE;
+ }
+ memcpy(NewData, Data, NumPix * BpcDest);
+ if (Data != Buffer)
+ ifree(Data);
+
+ return NewData;
+ }
+
+ // Colour-indexed images are special here
+ if (SrcFormat == IL_COLOUR_INDEX) {
+ // We create a temporary palette image so that we can send it to iConvertPalette.
+ PalImage = (ILimage*)icalloc(1, sizeof(ILimage)); // Much better to have it all set to 0.
+ if (PalImage == NULL)
+ return NULL;
+ // Populate the temporary palette image.
+ PalImage->Pal.Palette = SrcPal->Palette;
+ PalImage->Pal.PalSize = SrcPal->PalSize;
+ PalImage->Pal.PalType = SrcPal->PalType;
+ PalImage->Width = NumPix;
+ PalImage->Height = 1;
+ PalImage->Depth = 1;
+ PalImage->Format = IL_COLOUR_INDEX;
+ PalImage->Type = IL_UNSIGNED_BYTE;
+ PalImage->Data = Buffer;
+ PalImage->Bpp = 1;
+ PalImage->SizeOfData = SizeOfData;
+
+ // Convert the paletted image to a different format.
+ TempImage = iConvertPalette(PalImage, DestFormat);
+ if (TempImage == NULL) {
+ // So that we do not delete the original palette or data.
+ PalImage->Pal.Palette = NULL;
+ PalImage->Data = NULL;
+ ilCloseImage(PalImage);
+ return NULL;
+ }
+
+ // Set TempImage->Data to NULL so that we can preserve it via NewData, or
+ // else it would get wiped out by ilCloseImage.
+ NewData = TempImage->Data;
+ TempImage->Data = NULL;
+ // So that we do not delete the original palette or data.
+ PalImage->Pal.Palette = NULL;
+ PalImage->Data = NULL;
+
+ // Clean up here.
+ ilCloseImage(PalImage);
+ ilCloseImage(TempImage);
+ return NewData;
+ }
+
+ switch (SrcFormat)
+ {
+ case IL_RGB:
+ switch (DestFormat)
+ {
+ case IL_BGR:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ #ifdef ALTIVEC_GCC
+ abc2cba_byte((ILubyte*)Data,NumPix * BpcDest,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ NewData[i] = ((ILubyte*)(Data))[i+2];
+ NewData[i+1] = ((ILubyte*)(Data))[i+1];
+ NewData[i+2] = ((ILubyte*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ #ifdef ALTIVEC_GCC
+ abc2cba_short((ILushort*)Data,NumPix * BpcDest,(ILushort*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ #ifdef ALTIVEC_GCC
+ abc2cba_int((ILuint*)Data,NumPix * BpcDest,(ILuint*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_FLOAT:
+ #ifdef ALTIVEC_GCC
+ abc2cba_float(Data,NumPix * BpcDest,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_DOUBLE:
+ #ifdef ALTIVEC_GCC
+ abc2cba_double((ILdouble*)Data,NumPix * BpcDest,(ILdouble*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
+ }
+ break;
+ #endif
+ }
+ break;
+
+ case IL_RGBA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ NewData[j] = ((ILubyte*)(Data))[i];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i+2];
+ NewData[j+3] = UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[j+3] = USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[j+3] = UINT_MAX;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[j+3] = 1.0f;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[j+3] = 1.0;
+ }
+ break;
+ }
+ break;
+
+ case IL_BGRA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ NewData[j] = ((ILubyte*)(Data))[i+2];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i];
+ NewData[j+3] = UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[j+3] = USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[j+3] = UINT_MAX;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[j+3] = 1.0f;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[j+3] = 1.0f;
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
+ CHECK_ALLOC();
+ Size = NumPix / 3;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ NewData[i] = (ILubyte)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILushort*)(NewData))[i] = (ILushort)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILuint*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILuint*)(NewData))[i] = (ILuint)Resultf;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILfloat*)(NewData))[i] = Resultf;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILdouble*)(NewData))[i] = Resultd;
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3 * 2);
+ CHECK_ALLOC();
+ Size = NumPix / 3;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ NewData[i*2] = (ILubyte)Resultf;
+ NewData[i*2+1] = UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILushort*)(NewData))[i*2] = (ILushort)Resultf;
+ ((ILushort*)(NewData))[i*2+1] = USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILuint*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILuint*)(NewData))[i*2] = (ILuint)Resultf;
+ ((ILuint*)(NewData))[i*2+1] = UINT_MAX;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILfloat*)(NewData))[i*2] = Resultf;
+ ((ILfloat*)(NewData))[i*2+1] = 1.0f;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILdouble*)(NewData))[i*2] = Resultd;
+ ((ILdouble*)(NewData))[i*2+1] = 1.0;
+ }
+ break;
+ }
+ break;
+
+ case IL_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
+ CHECK_ALLOC();
+ memset(NewData, 0, NumPix * BpcDest);
+ break;
+
+ default:
+ ilSetError(IL_INVALID_CONVERSION);
+ if (Data != Buffer)
+ ifree(Data);
+ return NULL;
+ }
+ break;
+
+ case IL_RGBA:
+ switch (DestFormat)
+ {
+ case IL_BGRA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_byte(NewData,iCurImage->SizeOfData,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ NewData[i] = ((ILubyte*)(Data))[i+2];
+ NewData[i+1] = ((ILubyte*)(Data))[i+1];
+ NewData[i+2] = ((ILubyte*)(Data))[i];
+ NewData[i+3] = ((ILubyte*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_short((ILushort*)Data,iCurImage->SizeOfData,(ILushort*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[i+3] = ((ILushort*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_int((ILuint*)Data,iCurImage->SizeOfData,(ILuint*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[i+3] = ((ILuint*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_FLOAT:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_float(Data,iCurImage->SizeOfData,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[i+3] = ((ILfloat*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_DOUBLE:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_double((ILdouble*)Data,iCurImage->SizeOfData,(ILdouble*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[i+3] = ((ILdouble*)(Data))[i+3];
+ }
+ #endif
+ break;
+ }
+ break;
+
+ case IL_RGB:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ NewData[j] = ((ILubyte*)(Data))[i];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i+2];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
+ }
+ break;
+ }
+ break;
+
+ case IL_BGR:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ NewData[j] = ((ILubyte*)(Data))[i+2];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
+ CHECK_ALLOC();
+ Size = NumPix / 4;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0.0f;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILubyte*)(Data))[i * 4 + c] * LumFactor[c];
+ }
+ NewData[i] = (ILubyte)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0.0f;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILushort*)(Data))[i * 4 + c] * LumFactor[c];
+ }
+ ((ILushort*)(NewData))[i] = (ILushort)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILuint*)(Data))[i * 4 + c] * LumFactor[c];
+ }
+ ((ILuint*)(NewData))[i] = (ILuint)Resultd;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILfloat*)(Data))[i * 4 + c] * LumFactor[c];
+ }
+ ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILdouble*)(Data))[i * 4 + c] * LumFactor[c];
+ }
+ ((ILdouble*)(NewData))[i] = Resultd;
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4 * 2);
+ CHECK_ALLOC();
+ Size = NumPix / 4 * 2;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i += 2) {
+ Resultf = 0.0f;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILubyte*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ NewData[i] = (ILubyte)Resultf;
+ NewData[i+1] = ((ILubyte*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i += 2) {
+ Resultf = 0.0f;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILushort*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILushort*)(NewData))[i] = (ILushort)Resultf;
+ ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i += 2) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILuint*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILuint*)(NewData))[i] = (ILuint)Resultd;
+ ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i += 2) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILfloat*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
+ ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i += 2) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILdouble*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILdouble*)(NewData))[i] = Resultd;
+ ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i * 2 + 3];
+ }
+ break;
+ }
+ break;
+
+ case IL_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
+ CHECK_ALLOC();
+ Size = NumPix / 4;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ NewData[i] = ((ILubyte*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i * 4 + 3];
+ }
+ break;
+ }
+ break;
+
+ default:
+ ilSetError(IL_INVALID_CONVERSION);
+ if (Data != Buffer)
+ ifree(Data);
+ return NULL;
+ }
+ break;
+
+ case IL_BGR:
+ switch (DestFormat)
+ {
+ case IL_RGB:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ #ifdef ALTIVEC_GCC
+ abc2cba_byte(((ILubyte*)Data),NumPix * BpcDest,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ NewData[i] = ((ILubyte*)(Data))[i+2];
+ NewData[i+1] = ((ILubyte*)(Data))[i+1];
+ NewData[i+2] = ((ILubyte*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ #ifdef ALTIVEC_GCC
+ abc2cba_short((ILushort*)Data,NumPix * BpcDest,(ILushort*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ #ifdef ALTIVEC_GCC
+ abc2cba_int((ILuint*)Data,NumPix * BpcDest,(ILuint*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_FLOAT:
+ #ifdef ALTIVEC_GCC
+ abc2cba_float(Data,NumPix * BpcDest,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
+ }
+ #endif
+ break;
+ case IL_DOUBLE:
+ #ifdef ALTIVEC_GCC
+ abc2cba_double((ILdouble*)Data,iCurImage->SizeOfData,(ILdouble*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 3) {
+ ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
+ }
+ #endif
+ break;
+ }
+ break;
+
+ case IL_BGRA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ NewData[j] = ((ILubyte*)(Data))[i];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i+2];
+ NewData[j+3] = UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[j+3] = USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[j+3] = UINT_MAX;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[j+3] = 1.0f;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[j+3] = 1.0;
+ }
+ break;
+ }
+ break;
+
+ case IL_RGBA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4 / 3);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ NewData[j] = ((ILubyte*)(Data))[i+2];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i];
+ NewData[j+3] = UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[j+3] = USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[j+3] = UINT_MAX;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[j+3] = 1.0f;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 3, j += 4) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[j+3] = 1.0;
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
+ CHECK_ALLOC();
+ Size = NumPix / 3;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[j];
+ }
+ NewData[i] = (ILubyte)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[j];
+ }
+ ((ILushort*)(NewData))[i] = (ILushort)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultd += ((ILuint*)(Data))[i * 3 + c] * LumFactor[j];
+ }
+ ((ILuint*)(NewData))[i] = (ILuint)Resultd;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultd += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[j];
+ }
+ ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[j];
+ }
+ ((ILdouble*)(NewData))[i] = Resultd;
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3 * 2);
+ CHECK_ALLOC();
+ Size = NumPix / 3;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILubyte*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ NewData[i*2] = (ILubyte)Resultf;
+ NewData[i*2+1] = UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILushort*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILushort*)(NewData))[i*2] = (ILushort)Resultf;
+ ((ILushort*)(NewData))[i*2+1] = USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILuint*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILuint*)(NewData))[i*2] = (ILuint)Resultf;
+ ((ILuint*)(NewData))[i*2+1] = UINT_MAX;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILfloat*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILfloat*)(NewData))[i*2] = Resultf;
+ ((ILfloat*)(NewData))[i*2+1] = 1.0f;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILdouble*)(Data))[i * 3 + c] * LumFactor[c];
+ }
+ ((ILdouble*)(NewData))[i*2] = Resultd;
+ ((ILdouble*)(NewData))[i*2+1] = 1.0;
+ }
+ break;
+ }
+ break;
+
+ case IL_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 3);
+ CHECK_ALLOC();
+ memset(NewData, 0, NumPix * BpcDest / 3);
+ break;
+
+ default:
+ ilSetError(IL_INVALID_CONVERSION);
+ if (Data != Buffer)
+ ifree(Data);
+ return NULL;
+ }
+ break;
+
+ case IL_BGRA:
+ switch (DestFormat)
+ {
+ case IL_RGBA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_byte(NewData,iCurImage->SizeOfData,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ NewData[i] = ((ILubyte*)(Data))[i+2];
+ NewData[i+1] = ((ILubyte*)(Data))[i+1];
+ NewData[i+2] = ((ILubyte*)(Data))[i];
+ NewData[i+3] = ((ILubyte*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_short((ILushort*)Data,iCurImage->SizeOfData,(ILushort*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[i+2] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[i+3] = ((ILushort*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_int((ILuint*)NewData,iCurImage->SizeOfData,(ILuint*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[i+2] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[i+3] = ((ILuint*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_FLOAT:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_float(NewData,iCurImage->SizeOfData,NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[i+2] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[i+3] = ((ILfloat*)(Data))[i+3];
+ }
+ #endif
+ break;
+ case IL_DOUBLE:
+ #ifdef ALTIVEC_GCC
+ abcd2cbad_double((ILdouble*)Data,iCurImage->SizeOfData,(ILdouble*)NewData);
+ #else
+ for (i = 0; i < NumPix; i += 4) {
+ ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[i+2] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[i+3] = ((ILdouble*)(Data))[i+3];
+ }
+ #endif
+ break;
+ }
+ break;
+
+ case IL_BGR:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ NewData[j] = ((ILubyte*)(Data))[i];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i+2];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i+2];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i+2];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i+2];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i+2];
+ }
+ break;
+ }
+ break;
+
+ case IL_RGB:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3 / 4);
+ CHECK_ALLOC();
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ NewData[j] = ((ILubyte*)(Data))[i+2];
+ NewData[j+1] = ((ILubyte*)(Data))[i+1];
+ NewData[j+2] = ((ILubyte*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i+2];
+ ((ILushort*)(NewData))[j+1] = ((ILushort*)(Data))[i+1];
+ ((ILushort*)(NewData))[j+2] = ((ILushort*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i+2];
+ ((ILuint*)(NewData))[j+1] = ((ILuint*)(Data))[i+1];
+ ((ILuint*)(NewData))[j+2] = ((ILuint*)(Data))[i];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i+2];
+ ((ILfloat*)(NewData))[j+1] = ((ILfloat*)(Data))[i+1];
+ ((ILfloat*)(NewData))[j+2] = ((ILfloat*)(Data))[i];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 4, j += 3) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i+2];
+ ((ILdouble*)(NewData))[j+1] = ((ILdouble*)(Data))[i+1];
+ ((ILdouble*)(NewData))[j+2] = ((ILdouble*)(Data))[i];
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
+ CHECK_ALLOC();
+ Size = NumPix / 4;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultf += ((ILubyte*)(Data))[i * 4 + c] * LumFactor[j];
+ }
+ NewData[i] = (ILubyte)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ Resultf = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultf += ((ILushort*)(Data))[i * 4 + c] * LumFactor[j];
+ }
+ ((ILushort*)(NewData))[i] = (ILushort)Resultf;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultd += ((ILuint*)(Data))[i * 4 + c] * LumFactor[j];
+ }
+ ((ILuint*)(NewData))[i] = (ILuint)Resultd;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultd += ((ILfloat*)(Data))[i * 4 + c] * LumFactor[j];
+ }
+ ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ Resultd = 0.0f; j = 2;
+ for (c = 0; c < 3; c++, j--) {
+ Resultd += ((ILdouble*)(Data))[i * 4 + c] * LumFactor[j];
+ }
+ ((ILdouble*)(NewData))[i] = Resultd;
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4 * 2);
+ CHECK_ALLOC();
+ Size = NumPix / 4 * 2;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i += 2) {
+ Resultf = 0.0f;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILubyte*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ NewData[i] = (ILubyte)Resultf;
+ NewData[i+1] = ((ILubyte*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i += 2) {
+ Resultf = 0.0f;
+ for (c = 0; c < 3; c++) {
+ Resultf += ((ILushort*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILushort*)(NewData))[i] = (ILushort)Resultf;
+ ((ILushort*)(NewData))[i+1] = ((ILushort*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i += 2) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILuint*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILuint*)(NewData))[i] = (ILuint)Resultd;
+ ((ILuint*)(NewData))[i+1] = ((ILuint*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i += 2) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILfloat*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILfloat*)(NewData))[i] = (ILfloat)Resultd;
+ ((ILfloat*)(NewData))[i+1] = ((ILfloat*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i += 2) {
+ Resultd = 0.0;
+ for (c = 0; c < 3; c++) {
+ Resultd += ((ILdouble*)(Data))[i * 2 + c] * LumFactor[c];
+ }
+ ((ILdouble*)(NewData))[i] = Resultd;
+ ((ILdouble*)(NewData))[i+1] = ((ILdouble*)(Data))[i * 2 + 3];
+ }
+ break;
+ }
+ break;
+
+ case IL_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 4);
+ CHECK_ALLOC();
+ Size = NumPix / 4;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ NewData[i] = ((ILubyte*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i * 4 + 3];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i * 4 + 3];
+ }
+ break;
+ }
+ break;
+
+ default:
+ ilSetError(IL_INVALID_CONVERSION);
+ if (Data != Buffer)
+ ifree(Data);
+ return NULL;
+ }
+ break;
+
+
+ case IL_LUMINANCE:
+ switch (DestFormat)
+ {
+ case IL_RGB:
+ case IL_BGR:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i++, j += 3) {
+ for (c = 0; c < 3; c++) {
+ NewData[j + c] = ((ILubyte*)(Data))[i];
+ }
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i++, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
+ }
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i++, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
+ }
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i++, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
+ }
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i++, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
+ }
+ }
+ break;
+ }
+ break;
+
+ case IL_RGBA:
+ case IL_BGRA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ NewData[j + c] = ((ILubyte*)(Data))[i];
+ }
+ NewData[j + 3] = UCHAR_MAX; // Full opacity
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
+ }
+ ((ILushort*)(NewData))[j + 3] = USHRT_MAX; // Full opacity
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
+ }
+ ((ILuint*)(NewData))[j + 3] = UINT_MAX; // Full opacity
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
+ }
+ ((ILfloat*)(NewData))[j + 3] = 1.0f; // Full opacity
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
+ }
+ ((ILdouble*)(NewData))[j + 3] = 1.0; // Full opacity
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 2);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < NumPix; i++) {
+ NewData[i * 2] = ((ILubyte*)(Data))[i];
+ NewData[i * 2 + 1] = UCHAR_MAX; // Full opacity
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < NumPix; i++) {
+ ((ILushort*)(NewData))[i * 2] = ((ILushort*)(Data))[i];
+ ((ILushort*)(NewData))[i * 2 + 1] = USHRT_MAX; // Full opacity
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < NumPix; i++) {
+ ((ILuint*)(NewData))[i * 2] = ((ILuint*)(Data))[i];
+ ((ILuint*)(NewData))[i * 2 + 1] = UINT_MAX; // Full opacity
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < NumPix; i++) {
+ ((ILfloat*)(NewData))[i * 2] = ((ILfloat*)(Data))[i];
+ ((ILfloat*)(NewData))[i * 2 + 1] = 1.0f; // Full opacity
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < NumPix; i++) {
+ ((ILdouble*)(NewData))[i * 2] = ((ILdouble*)(Data))[i];
+ ((ILdouble*)(NewData))[i * 2 + 1] = 1.0; // Full opacity
+ }
+ break;
+ }
+ break;
+
+ case IL_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest);
+ CHECK_ALLOC();
+ memset(NewData, 0, NumPix * BpcDest);
+ break;
+
+ /*case IL_COLOUR_INDEX:
+ NewData = (ILubyte*)ialloc(iCurImage->SizeOfData);
+ NewImage->Pal.Palette = (ILubyte*)ialloc(768);
+ if (NewData == NULL || NewImage->Pal.Palette) {
+ ifree(NewImage);
+ return IL_FALSE;
+ }
+
+ // Fill the palette
+ for (i = 0; i < 256; i++) {
+ for (c = 0; c < 3; c++) {
+ NewImage->Pal.Palette[i * 3 + c] = (ILubyte)i;
+ }
+ }
+ // Copy the data
+ for (i = 0; i < iCurImage->SizeOfData; i++) {
+ NewData[i] = iCurImage->Data[i];
+ }
+ break;*/
+
+ default:
+ ilSetError(IL_INVALID_CONVERSION);
+ if (Data != Buffer)
+ ifree(Data);
+ return NULL;
+ }
+ break;
+
+
+ case IL_LUMINANCE_ALPHA:
+ switch (DestFormat)
+ {
+ case IL_RGB:
+ case IL_BGR:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2 * 3);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
+ for (c = 0; c < 3; c++) {
+ NewData[j + c] = ((ILubyte*)(Data))[i];
+ }
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
+ }
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
+ }
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
+ }
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 3) {
+ for (c = 0; c < 3; c++) {
+ ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
+ }
+ }
+ break;
+ }
+ break;
+
+ case IL_RGBA:
+ case IL_BGRA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2 * 4);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
+ for (c = 0; c < 3; c++) {
+ NewData[j + c] = ((ILubyte*)(Data))[i];
+ }
+ NewData[j + 3] = ((ILubyte*)(Data))[i+1];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILushort*)(NewData))[j + c] = ((ILushort*)(Data))[i];
+ }
+ ((ILushort*)(NewData))[j + 3] = ((ILushort*)(Data))[i+1];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILuint*)(NewData))[j + c] = ((ILuint*)(Data))[i];
+ }
+ ((ILuint*)(NewData))[j + 3] = ((ILuint*)(Data))[i+1];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILfloat*)(NewData))[j + c] = ((ILfloat*)(Data))[i];
+ }
+ ((ILfloat*)(NewData))[j + 3] = ((ILfloat*)(Data))[i+1];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 2, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILdouble*)(NewData))[j + c] = ((ILdouble*)(Data))[i];
+ }
+ ((ILdouble*)(NewData))[j + 3] = ((ILdouble*)(Data))[i+1];
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i += 2, j++) {
+ NewData[j] = ((ILubyte*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i += 2, j++) {
+ ((ILushort*)(NewData))[j] = ((ILushort*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i += 2, j++) {
+ ((ILuint*)(NewData))[j] = ((ILuint*)(Data))[i];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i += 2, j++) {
+ ((ILfloat*)(NewData))[j] = ((ILfloat*)(Data))[i];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i += 2, j++) {
+ ((ILdouble*)(NewData))[j] = ((ILdouble*)(Data))[i];
+ }
+ break;
+ }
+ break;
+
+ case IL_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest / 2);
+ CHECK_ALLOC();
+ Size = NumPix / 2;
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ NewData[i] = ((ILubyte*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ ((ILushort*)(NewData))[i] = ((ILushort*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ ((ILuint*)(NewData))[i] = ((ILuint*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ ((ILfloat*)(NewData))[i] = ((ILfloat*)(Data))[i * 2 + 3];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ ((ILdouble*)(NewData))[i] = ((ILdouble*)(Data))[i * 2 + 3];
+ }
+ break;
+ }
+ break;
+
+ /*case IL_COLOUR_INDEX:
+ NewData = (ILubyte*)ialloc(iCurImage->SizeOfData);
+ NewImage->Pal.Palette = (ILubyte*)ialloc(768);
+ if (NewData == NULL || NewImage->Pal.Palette) {
+ ifree(NewImage);
+ return IL_FALSE;
+ }
+
+ // Fill the palette
+ for (i = 0; i < 256; i++) {
+ for (c = 0; c < 3; c++) {
+ NewImage->Pal.Palette[i * 3 + c] = (ILubyte)i;
+ }
+ }
+ // Copy the data
+ for (i = 0; i < iCurImage->SizeOfData; i++) {
+ NewData[i] = iCurImage->Data[i];
+ }
+ break;*/
+
+ default:
+ ilSetError(IL_INVALID_CONVERSION);
+ if (Data != Buffer)
+ ifree(Data);
+ return NULL;
+ }
+ break;
+
+
+ case IL_ALPHA:
+ switch (DestFormat)
+ {
+ case IL_RGB:
+ case IL_BGR:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 3);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ case IL_FLOAT:
+ case IL_DOUBLE:
+ memset(NewData, 0, NumPix * BpcDest * 3); // Easy enough
+ break;
+ //@TODO: Do we need to a check for default: (error)?
+ }
+ break;
+
+ case IL_RGBA:
+ case IL_BGRA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 4);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ NewData[j + c] = 0;
+ }
+ NewData[j + 3] = ((ILubyte*)(Data))[i]; // Only value that matters
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILushort*)(NewData))[j + c] = 0;
+ }
+ ((ILushort*)(NewData))[j + 3] = ((ILushort*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILuint*)(NewData))[j + c] = 0;
+ }
+ ((ILuint*)(NewData))[j + 3] = ((ILuint*)(Data))[i];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILfloat*)(NewData))[j + c] = 0;
+ }
+ ((ILfloat*)(NewData))[j + 3] = ((ILfloat*)(Data))[i];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0, j = 0; i < NumPix; i++, j += 4) {
+ for (c = 0; c < 3; c++) {
+ ((ILdouble*)(NewData))[j + c] = 0;
+ }
+ ((ILdouble*)(NewData))[j + 3] = ((ILdouble*)(Data))[i];
+ }
+ break;
+ }
+ break;
+
+ case IL_LUMINANCE_ALPHA:
+ NewData = (ILubyte*)ialloc(NumPix * BpcDest * 2);
+ CHECK_ALLOC();
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < NumPix; i++) {
+ NewData[i * 2] = 0;
+ NewData[i * 2 + 1] = ((ILubyte*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ case IL_HALF:
+ for (i = 0; i < NumPix; i++) {
+ ((ILushort*)(NewData))[i * 2] = 0;
+ ((ILushort*)(NewData))[i * 2 + 1] = ((ILushort*)(Data))[i];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < NumPix; i++) {
+ ((ILuint*)(NewData))[i * 2] = 0;
+ ((ILuint*)(NewData))[i * 2 + 1] = ((ILuint*)(Data))[i];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < NumPix; i++) {
+ ((ILfloat*)(NewData))[i * 2] = 0;
+ ((ILfloat*)(NewData))[i * 2 + 1] = ((ILfloat*)(Data))[i];
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < NumPix; i++) {
+ ((ILdouble*)(NewData))[i * 2] = 0;
+ ((ILdouble*)(NewData))[i * 2 + 1] = ((ILdouble*)(Data))[i];
+ }
+ break;
+ }
+ break;
+
+
+ /*case IL_COLOUR_INDEX:
+ NewData = (ILubyte*)ialloc(iCurImage->SizeOfData);
+ NewImage->Pal.Palette = (ILubyte*)ialloc(768);
+ if (NewData == NULL || NewImage->Pal.Palette) {
+ ifree(NewImage);
+ return IL_FALSE;
+ }
+
+ // Fill the palette
+ for (i = 0; i < 256; i++) {
+ for (c = 0; c < 3; c++) {
+ NewImage->Pal.Palette[i * 3 + c] = (ILubyte)i;
+ }
+ }
+ // Copy the data
+ for (i = 0; i < iCurImage->SizeOfData; i++) {
+ NewData[i] = iCurImage->Data[i];
+ }
+ break;*/
+
+ default:
+ ilSetError(IL_INVALID_CONVERSION);
+ if (Data != Buffer)
+ ifree(Data);
+ return NULL;
+ }
+ break;
+ }
+
+ if (Data != Buffer)
+ ifree(Data);
+
+ return NewData;
+}
+
+
+// Really shouldn't have to check for default, as in above ilConvertBuffer().
+// This now converts better from lower bpp to higher bpp. For example, when
+// converting from 8 bpp to 16 bpp, if the value is 0xEC, the new value is 0xECEC
+// instead of 0xEC00.
+void* ILAPIENTRY iSwitchTypes(ILuint SizeOfData, ILenum SrcType, ILenum DestType, void *Buffer)
+{
+ ILuint BpcSrc, BpcDest, Size, i;
+ ILubyte *NewData, *BytePtr;
+ ILushort *ShortPtr;
+ ILuint *IntPtr;
+ ILfloat *FloatPtr, tempFloat;
+ ILdouble *DblPtr, tempDouble;
+ ILushort *HalfPtr;
+
+ BpcSrc = ilGetBpcType(SrcType);
+ BpcDest = ilGetBpcType(DestType);
+
+ if (BpcSrc == 0 || BpcDest == 0) {
+ ilSetError(IL_INTERNAL_ERROR);
+ return IL_FALSE;
+ }
+
+ Size = SizeOfData / BpcSrc;
+
+ //if (BpcSrc == BpcDest) {
+ if (SrcType == DestType) {
+ return Buffer;
+ }
+
+ NewData = (ILubyte*)ialloc(Size * BpcDest);
+ if (NewData == NULL) {
+ return IL_FALSE;
+ }
+
+ switch (DestType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ BytePtr = (ILubyte*)NewData;
+ switch (SrcType)
+ {
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ for (i = 0; i < Size; i++) {
+ BytePtr[i] = ((ILushort*)Buffer)[i] >> 8;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ BytePtr[i] = ((ILuint*)Buffer)[i] >> 24;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_FLOATS
+ tempFloat = IL_CLAMP(((ILfloat*)Buffer)[i]);
+ BytePtr[i] = (ILubyte)(tempFloat * UCHAR_MAX);
+ #else
+ BytePtr[i] = (ILubyte)(((ILfloat*)Buffer)[i] * UCHAR_MAX);
+ #endif
+ }
+ break;
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_HALF
+ *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ tempFloat = IL_CLAMP(tempFloat);
+ BytePtr[i] = (ILubyte)(tempFloat * UCHAR_MAX);
+ #else
+ *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ BytePtr[i] = (ILubyte)(tempFloat * UCHAR_MAX);
+ #endif
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_DOUBLES
+ tempDouble = IL_CLAMP(((ILdouble*)Buffer)[i]);
+ BytePtr[i] = (ILubyte)(tempDouble * UCHAR_MAX);
+ #else
+ BytePtr[i] = (ILubyte)( ((ILdouble*)Buffer)[i] * UCHAR_MAX);
+ #endif
+ }
+ break;
+ }
+ break;
+
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ ShortPtr = (ILushort*)NewData;
+ switch (SrcType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ ShortPtr[i] = (((ILubyte*)Buffer)[i] << 8) | ((ILubyte*)Buffer)[i];
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ ShortPtr[i] = ((ILuint*)Buffer)[i] >> 16;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_FLOATS
+ tempFloat = IL_CLAMP(((ILfloat*)Buffer)[i]);
+ ShortPtr[i] = (ILushort)(tempFloat * USHRT_MAX);
+ #else
+ ShortPtr[i] = (ILushort)( ((ILfloat*)Buffer)[i] * USHRT_MAX);
+ #endif
+ }
+ break;
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_FLOATS
+ *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ tempFloat = IL_CLAMP(tempFloat);
+ ShortPtr[i] = (ILushort)(tempFloat * USHRT_MAX);
+ #else
+ *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ ShortPtr[i] = (ILushort)(tempFloat * USHRT_MAX);
+ #endif
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_DOUBLES
+ tempDouble = IL_CLAMP(((ILdouble*)Buffer)[i]);
+ ShortPtr[i] = (ILushort)(tempDouble * USHRT_MAX);
+ #else
+ ShortPtr[i] = (ILushort)( ((ILdouble*)Buffer)[i] * USHRT_MAX);
+ #endif
+ }
+ break;
+ }
+ break;
+
+ case IL_UNSIGNED_INT:
+ case IL_INT:
+ IntPtr = (ILuint*)NewData;
+ switch (SrcType)
+ {
+ case IL_UNSIGNED_BYTE:
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ IntPtr[i] = (((ILubyte*)Buffer)[i] << 24) | (((ILubyte*)Buffer)[i] << 16) |
+ (((ILubyte*)Buffer)[i] << 8) | ((ILubyte*)Buffer)[i];
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ case IL_SHORT:
+ for (i = 0; i < Size; i++) {
+ IntPtr[i] = (((ILushort*)Buffer)[i] << 16) | ((ILushort*)Buffer)[i];
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_FLOATS
+ tempFloat = IL_CLAMP(((ILfloat*)Buffer)[i]);
+ IntPtr[i] = (ILuint)(tempFloat * UINT_MAX);
+ #else
+ IntPtr[i] = (ILuint)( ((ILfloat*)Buffer)[i] * UINT_MAX);
+ #endif
+ }
+ break;
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_FLOATS
+ *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ tempFloat = IL_CLAMP(tempFloat);
+ IntPtr[i] = (ILuint)(tempFloat * UINT_MAX);
+ #else
+ *((ILuint*)&tempFloat) = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ IntPtr[i] = (ILuint)(tempFloat * UINT_MAX);
+ #endif
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ #if CLAMP_DOUBLES
+ tempDouble = IL_CLAMP(((ILdouble*)Buffer)[i]);
+ IntPtr[i] = (ILuint)(tempDouble * UINT_MAX);
+ #else
+ IntPtr[i] = (ILuint)( ((ILdouble*)Buffer)[i] * UINT_MAX);
+ #endif
+ }
+ break;
+ }
+ break;
+
+ // @TODO: Handle signed better.
+ case IL_FLOAT:
+ FloatPtr = (ILfloat*)NewData;
+ switch (SrcType)
+ {
+ case IL_UNSIGNED_BYTE:
+ for (i = 0; i < Size; i++) {
+ FloatPtr[i] = ((ILubyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
+ }
+ break;
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ FloatPtr[i] = ((ILbyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ for (i = 0; i < Size; i++) {
+ FloatPtr[i] = ((ILushort*)Buffer)[i] / (ILfloat)USHRT_MAX;
+ }
+ break;
+ case IL_SHORT:
+ for (i = 0; i < Size; i++) {
+ FloatPtr[i] = ((ILshort*)Buffer)[i] / (ILfloat)USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ for (i = 0; i < Size; i++) {
+ FloatPtr[i] = (ILfloat)((ILuint*)Buffer)[i] / (ILfloat)UINT_MAX;
+ }
+ break;
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ FloatPtr[i] = (ILfloat)((ILint*)Buffer)[i] / (ILfloat)UINT_MAX;
+ }
+ break;
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ *((ILuint*)&FloatPtr[i]) = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ FloatPtr[i] = (ILfloat)((ILdouble*)Buffer)[i];
+ }
+ break;
+ }
+ break;
+
+ case IL_DOUBLE:
+ DblPtr = (ILdouble*)NewData;
+ switch (SrcType)
+ {
+ case IL_UNSIGNED_BYTE:
+ for (i = 0; i < Size; i++) {
+ DblPtr[i] = ((ILubyte*)Buffer)[i] / (ILdouble)UCHAR_MAX;
+ }
+ break;
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ DblPtr[i] = ((ILbyte*)Buffer)[i] / (ILdouble)UCHAR_MAX;
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ for (i = 0; i < Size; i++) {
+ DblPtr[i] = ((ILushort*)Buffer)[i] / (ILdouble)USHRT_MAX;
+ }
+ break;
+ case IL_SHORT:
+ for (i = 0; i < Size; i++) {
+ DblPtr[i] = ((ILshort*)Buffer)[i] / (ILdouble)USHRT_MAX;
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ for (i = 0; i < Size; i++) {
+ DblPtr[i] = ((ILuint*)Buffer)[i] / (ILdouble)UINT_MAX;
+ }
+ break;
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ DblPtr[i] = ((ILint*)Buffer)[i] / (ILdouble)UINT_MAX;
+ }
+ break;
+ case IL_HALF:
+ for (i = 0; i < Size; i++) {
+ *(ILuint*)&tempFloat = ilHalfToFloat(((ILushort*)Buffer)[i]);
+ DblPtr[i] = tempFloat;
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ DblPtr[i] = ((ILfloat*)Buffer)[i];
+ }
+ break;
+ }
+ break;
+
+ case IL_HALF:
+ HalfPtr = (ILushort*)NewData;
+ switch (SrcType)
+ {
+ case IL_UNSIGNED_BYTE:
+ for (i = 0; i < Size; i++) {
+ tempFloat = ((ILubyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ case IL_BYTE:
+ for (i = 0; i < Size; i++) {
+ tempFloat = ((ILbyte*)Buffer)[i] / (ILfloat)UCHAR_MAX;
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ case IL_UNSIGNED_SHORT:
+ for (i = 0; i < Size; i++) {
+ tempFloat = ((ILushort*)Buffer)[i] / (ILfloat)USHRT_MAX;
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ case IL_SHORT:
+ for (i = 0; i < Size; i++) {
+ tempFloat = ((ILshort*)Buffer)[i] / (ILfloat)USHRT_MAX;
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ case IL_UNSIGNED_INT:
+ for (i = 0; i < Size; i++) {
+ tempFloat = ((ILuint*)Buffer)[i] / (ILfloat)UINT_MAX;
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ case IL_INT:
+ for (i = 0; i < Size; i++) {
+ tempFloat = ((ILint*)Buffer)[i] / (ILfloat)UINT_MAX;
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ case IL_DOUBLE:
+ for (i = 0; i < Size; i++) {
+ tempFloat = (ILfloat)((ILdouble*)Buffer)[i];
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ case IL_FLOAT:
+ for (i = 0; i < Size; i++) {
+ tempFloat = ((ILfloat*)Buffer)[i];
+ *((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
+ }
+ break;
+ }
+ break;
+ }
+
+
+ return NewData;
+}
+
+
+
+