| 16 | |
| 17 | |
| 18 | ILimage *iConvertPalette(ILimage *Image, ILenum DestFormat) |
| 19 | { |
| 20 | static const ILfloat LumFactor[3] = { 0.212671f, 0.715160f, 0.072169f }; // http://www.inforamp.net/~poynton/ and libpng's libpng.txt - Used for conversion to luminance. |
| 21 | ILimage *NewImage = NULL, *CurImage = NULL; |
| 22 | ILuint i, j, k, c, Size, LumBpp = 1; |
| 23 | ILfloat Resultf; |
| 24 | ILubyte *Temp = NULL; |
| 25 | ILboolean Converted; |
| 26 | ILboolean HasAlpha; |
| 27 | |
| 28 | NewImage = (ILimage*)icalloc(1, sizeof(ILimage)); // Much better to have it all set to 0. |
| 29 | if (NewImage == NULL) { |
| 30 | return IL_FALSE; |
| 31 | } |
| 32 | |
| 33 | ilCopyImageAttr(NewImage, Image); |
| 34 | |
| 35 | if (!Image->Pal.Palette || !Image->Pal.PalSize || Image->Pal.PalType == IL_PAL_NONE || Image->Bpp != 1) { |
| 36 | ilCloseImage(NewImage); |
| 37 | ilSetError(IL_ILLEGAL_OPERATION); |
| 38 | return NULL; |
| 39 | } |
| 40 | |
| 41 | if (DestFormat == IL_LUMINANCE || DestFormat == IL_LUMINANCE_ALPHA) { |
| 42 | if (NewImage->Pal.Palette) |
| 43 | ifree(NewImage->Pal.Palette); |
| 44 | if (DestFormat == IL_LUMINANCE_ALPHA) |
| 45 | LumBpp = 2; |
| 46 | |
| 47 | switch (iCurImage->Pal.PalType) |
| 48 | { |
| 49 | case IL_PAL_RGB24: |
| 50 | case IL_PAL_RGB32: |
| 51 | case IL_PAL_RGBA32: |
| 52 | Temp = (ILubyte*)ialloc(LumBpp * Image->Pal.PalSize / ilGetBppPal(Image->Pal.PalType)); |
| 53 | if (Temp == NULL) |
| 54 | goto alloc_error; |
| 55 | |
| 56 | Size = ilGetBppPal(Image->Pal.PalType); |
| 57 | for (i = 0, k = 0; i < Image->Pal.PalSize; i += Size, k += LumBpp) { |
| 58 | Resultf = 0.0f; |
| 59 | for (c = 0; c < Size; c++) { |
| 60 | Resultf += Image->Pal.Palette[i + c] * LumFactor[c]; |
| 61 | } |
| 62 | Temp[k] = (ILubyte)Resultf; |
| 63 | if (LumBpp == 2) { |
| 64 | if (iCurImage->Pal.PalType == IL_PAL_RGBA32) |
| 65 | Temp[k+1] = Image->Pal.Palette[i + 3]; |
| 66 | else |
| 67 | Temp[k+1] = 0xff; |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | break; |
| 72 | |
| 73 | case IL_PAL_BGR24: |
| 74 | case IL_PAL_BGR32: |
| 75 | case IL_PAL_BGRA32: |
no test coverage detected