Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1976 lines
57 KiB
C
1976 lines
57 KiB
C
//-----------------------------------------------------------------------------
|
|
//
|
|
// ImageLib Sources
|
|
// Copyright (C) 2000-2002 by Denton Woods
|
|
// Last modified: 06/13/2002 <--Y2K Compliant! =]
|
|
//
|
|
// Filename: src-IL/src/il_convbuff.c
|
|
//
|
|
// Description: Converts between several image formats
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#include "il_internal.h"
|
|
#include "il_manip.h"
|
|
#ifdef ALTIVEC_GCC
|
|
#include "altivec_typeconversion.h"
|
|
#endif
|
|
#include <limits.h>
|
|
|
|
|
|
ILvoid* ILAPIENTRY iSwitchTypes(ILuint SizeOfData, ILenum SrcType, ILenum DestType, ILvoid *Buffer);
|
|
ILushort ILAPIENTRY ilFloatToHalf(ILuint i);
|
|
ILuint ILAPIENTRY ilHalfToFloat (ILushort y);
|
|
ILfloat ILAPIENTRY ilFloatToHalfOverflow();
|
|
|
|
#define CHECK_ALLOC() if (NewData == NULL) { \
|
|
if (Data != Buffer) \
|
|
ifree(Data); \
|
|
return IL_FALSE; \
|
|
}
|
|
|
|
ILAPI ILvoid* ILAPIENTRY ilConvertBuffer(ILuint SizeOfData, ILenum SrcFormat, ILenum DestFormat, ILenum SrcType, ILenum DestType, ILvoid *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;
|
|
ILvoid *Data = 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;
|
|
}
|
|
|
|
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;
|
|
|
|
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;
|
|
|
|
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;
|
|
|
|
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;
|
|
|
|
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_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_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().
|
|
ILvoid* ILAPIENTRY iSwitchTypes(ILuint SizeOfData, ILenum SrcType, ILenum DestType, ILvoid *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) {
|
|
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 = 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 = 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 = 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;
|
|
}
|
|
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 = 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 = 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 = 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;
|
|
}
|
|
break;
|
|
case IL_UNSIGNED_SHORT:
|
|
case IL_SHORT:
|
|
for (i = 0; i < Size; i++) {
|
|
IntPtr[i] = ((ILushort*)Buffer)[i] << 16;
|
|
}
|
|
break;
|
|
case IL_FLOAT:
|
|
for (i = 0; i < Size; i++) {
|
|
#if CLAMP_FLOATS
|
|
tempFloat = 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 = 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 = 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]);
|
|
}
|
|
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++) {
|
|
*(ILushort*)&tempFloat = ilHalfToFloat(((ILushort*)Buffer)[i]);
|
|
DblPtr[i] = tempFloat;
|
|
}
|
|
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);
|
|
}
|
|
case IL_FLOAT:
|
|
for (i = 0; i < Size; i++) {
|
|
tempFloat = ((ILfloat*)Buffer)[i];
|
|
*((ILushort*)&HalfPtr[i]) = ilFloatToHalf(*(ILuint*)&tempFloat);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
return NewData;
|
|
}
|
|
|
|
|
|
|
|
|