summaryrefslogtreecommitdiff
path: root/DevIL/src-IL/src/il_states.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'DevIL/src-IL/src/il_states.cpp')
-rw-r--r--DevIL/src-IL/src/il_states.cpp1192
1 files changed, 1192 insertions, 0 deletions
diff --git a/DevIL/src-IL/src/il_states.cpp b/DevIL/src-IL/src/il_states.cpp
new file mode 100644
index 00000000..96291887
--- /dev/null
+++ b/DevIL/src-IL/src/il_states.cpp
@@ -0,0 +1,1192 @@
+//-----------------------------------------------------------------------------
+//
+// ImageLib Sources
+// Copyright (C) 2000-2009 by Denton Woods
+// Last modified: 03/07/2009
+//
+// Filename: src-IL/src/il_states.c
+//
+// Description: State machine
+//
+//
+// 20040223 XIX : now has a ilPngAlphaIndex member, so we can spit out png files with a transparent index, set to -1 for none
+//
+//-----------------------------------------------------------------------------
+
+
+#include "il_internal.h"
+#include "il_states.h"
+//#include <malloc.h>
+#include <stdlib.h>
+
+ILconst_string _ilVendor = IL_TEXT("Abysmal Software");
+ILconst_string _ilVersion = IL_TEXT("Developer's Image Library (DevIL) 1.7.8");
+
+
+char* _ilLoadExt = "" IL_BLP_EXT IL_BMP_EXT IL_CUT_EXT IL_DCX_EXT IL_DDS_EXT
+ IL_DCM_EXT IL_DPX_EXT IL_EXR_EXT IL_FITS_EXT IL_FTX_EXT
+ IL_GIF_EXT IL_HDR_EXT IL_ICNS_EXT IL_ICO_EXT IL_IFF_EXT
+ IL_IWI_EXT IL_JPG_EXT IL_JP2_EXT IL_LIF_EXT IL_MDL_EXT
+ IL_MNG_EXT IL_MP3_EXT IL_PCD_EXT IL_PCX_EXT IL_PIC_EXT
+ IL_PIX_EXT IL_PNG_EXT IL_PNM_EXT IL_PSD_EXT IL_PSP_EXT
+ IL_PXR_EXT IL_RAW_EXT IL_ROT_EXT IL_SGI_EXT IL_SUN_EXT
+ IL_TEX_EXT IL_TGA_EXT IL_TIF_EXT IL_TPL_EXT IL_UTX_EXT
+ IL_VTF_EXT IL_WAL_EXT IL_WDP_EXT IL_XPM_EXT;
+
+char* _ilSaveExt = "" IL_BMP_EXT IL_CHEAD_EXT IL_DDS_EXT IL_EXR_EXT
+ IL_HDR_EXT IL_JP2_EXT IL_JPG_EXT IL_PCX_EXT
+ IL_PNG_EXT IL_PNM_EXT IL_PSD_EXT IL_RAW_EXT
+ IL_SGI_EXT IL_TGA_EXT IL_TIF_EXT IL_VTF_EXT
+ IL_WBMP_EXT;
+
+
+//! Set all states to their defaults.
+void ilDefaultStates()
+{
+ ilStates[ilCurrentPos].ilOriginSet = IL_FALSE;
+ ilStates[ilCurrentPos].ilOriginMode = IL_ORIGIN_LOWER_LEFT;
+ ilStates[ilCurrentPos].ilFormatSet = IL_FALSE;
+ ilStates[ilCurrentPos].ilFormatMode = IL_BGRA;
+ ilStates[ilCurrentPos].ilTypeSet = IL_FALSE;
+ ilStates[ilCurrentPos].ilTypeMode = IL_UNSIGNED_BYTE;
+ ilStates[ilCurrentPos].ilOverWriteFiles = IL_FALSE;
+ ilStates[ilCurrentPos].ilAutoConvPal = IL_FALSE;
+ ilStates[ilCurrentPos].ilDefaultOnFail = IL_FALSE;
+ ilStates[ilCurrentPos].ilUseKeyColour = IL_FALSE;
+ ilStates[ilCurrentPos].ilBlitBlend = IL_TRUE;
+ ilStates[ilCurrentPos].ilCompression = IL_COMPRESS_ZLIB;
+ ilStates[ilCurrentPos].ilInterlace = IL_FALSE;
+
+ ilStates[ilCurrentPos].ilTgaCreateStamp = IL_FALSE;
+ ilStates[ilCurrentPos].ilJpgQuality = 99;
+ ilStates[ilCurrentPos].ilPngInterlace = IL_FALSE;
+ ilStates[ilCurrentPos].ilTgaRle = IL_FALSE;
+ ilStates[ilCurrentPos].ilBmpRle = IL_FALSE;
+ ilStates[ilCurrentPos].ilSgiRle = IL_FALSE;
+ ilStates[ilCurrentPos].ilJpgFormat = IL_JFIF;
+ ilStates[ilCurrentPos].ilJpgProgressive = IL_FALSE;
+ ilStates[ilCurrentPos].ilDxtcFormat = IL_DXT1;
+ ilStates[ilCurrentPos].ilPcdPicNum = 2;
+ ilStates[ilCurrentPos].ilPngAlphaIndex = -1;
+ ilStates[ilCurrentPos].ilVtfCompression = IL_DXT_NO_COMP;
+
+ ilStates[ilCurrentPos].ilTgaId = NULL;
+ ilStates[ilCurrentPos].ilTgaAuthName = NULL;
+ ilStates[ilCurrentPos].ilTgaAuthComment = NULL;
+ ilStates[ilCurrentPos].ilPngAuthName = NULL;
+ ilStates[ilCurrentPos].ilPngTitle = NULL;
+ ilStates[ilCurrentPos].ilPngDescription = NULL;
+
+ //2003-09-01: added tiff strings
+ ilStates[ilCurrentPos].ilTifDescription = NULL;
+ ilStates[ilCurrentPos].ilTifHostComputer = NULL;
+ ilStates[ilCurrentPos].ilTifDocumentName = NULL;
+ ilStates[ilCurrentPos].ilTifAuthName = NULL;
+ ilStates[ilCurrentPos].ilCHeader = NULL;
+
+ ilStates[ilCurrentPos].ilQuantMode = IL_WU_QUANT;
+ ilStates[ilCurrentPos].ilNeuSample = 15;
+ ilStates[ilCurrentPos].ilQuantMaxIndexs = 256;
+
+ ilStates[ilCurrentPos].ilKeepDxtcData = IL_FALSE;
+ ilStates[ilCurrentPos].ilUseNVidiaDXT = IL_FALSE;
+ ilStates[ilCurrentPos].ilUseSquishDXT = IL_FALSE;
+
+
+
+
+ ilHints.MemVsSpeedHint = IL_FASTEST;
+ ilHints.CompressHint = IL_USE_COMPRESSION;
+
+ while (ilGetError() != IL_NO_ERROR);
+
+ return;
+}
+
+
+//! Returns a constant string detailing aspects about this library.
+ILconst_string ILAPIENTRY ilGetString(ILenum StringName)
+{
+ switch (StringName)
+ {
+ case IL_VENDOR:
+ return (ILconst_string)_ilVendor;
+ case IL_VERSION_NUM: //changed 2003-08-30: IL_VERSION changes //switch define ;-)
+ return (ILconst_string)_ilVersion;
+ case IL_LOAD_EXT:
+ return (ILconst_string)_ilLoadExt;
+ case IL_SAVE_EXT:
+ return (ILconst_string)_ilSaveExt;
+ case IL_TGA_ID_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilTgaId;
+ case IL_TGA_AUTHNAME_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilTgaAuthName;
+ case IL_TGA_AUTHCOMMENT_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilTgaAuthComment;
+ case IL_PNG_AUTHNAME_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilPngAuthName;
+ case IL_PNG_TITLE_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilPngTitle;
+ case IL_PNG_DESCRIPTION_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilPngDescription;
+ //2003-08-31: added tif strings
+ case IL_TIF_DESCRIPTION_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilTifDescription;
+ case IL_TIF_HOSTCOMPUTER_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilTifHostComputer;
+ case IL_TIF_DOCUMENTNAME_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilTifDocumentName;
+ case IL_TIF_AUTHNAME_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilTifAuthName;
+ case IL_CHEAD_HEADER_STRING:
+ return (ILconst_string)ilStates[ilCurrentPos].ilCHeader;
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ break;
+ }
+ return NULL;
+}
+
+
+// Clips a string to a certain length and returns a new string.
+char *iClipString(char *String, ILuint MaxLen)
+{
+ char *Clipped;
+ ILuint Length;
+
+ if (String == NULL)
+ return NULL;
+
+ Length = ilCharStrLen(String); //ilStrLen(String);
+
+ Clipped = (char*)ialloc((MaxLen + 1) * sizeof(char) /*sizeof(ILchar)*/); // Terminating NULL makes it +1.
+ if (Clipped == NULL) {
+ return NULL;
+ }
+
+ memcpy(Clipped, String, MaxLen * sizeof(char) /*sizeof(ILchar)*/);
+ Clipped[Length] = 0;
+
+ return Clipped;
+}
+
+
+// Returns format-specific strings, truncated to MaxLen (not counting the terminating NULL).
+char *iGetString(ILenum StringName)
+{
+ switch (StringName)
+ {
+ case IL_TGA_ID_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilTgaId, 254);
+ case IL_TGA_AUTHNAME_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilTgaAuthName, 40);
+ case IL_TGA_AUTHCOMMENT_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilTgaAuthComment, 80);
+ case IL_PNG_AUTHNAME_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilPngAuthName, 255);
+ case IL_PNG_TITLE_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilPngTitle, 255);
+ case IL_PNG_DESCRIPTION_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilPngDescription, 255);
+
+ //changed 2003-08-31...here was a serious copy and paste bug ;-)
+ case IL_TIF_DESCRIPTION_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilTifDescription, 255);
+ case IL_TIF_HOSTCOMPUTER_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilTifHostComputer, 255);
+ case IL_TIF_DOCUMENTNAME_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilTifDocumentName, 255);
+ case IL_TIF_AUTHNAME_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilTifAuthName, 255);
+ case IL_CHEAD_HEADER_STRING:
+ return iClipString(ilStates[ilCurrentPos].ilCHeader, 32);
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ }
+ return NULL;
+}
+
+
+//! Enables a mode
+ILboolean ILAPIENTRY ilEnable(ILenum Mode)
+{
+ return ilAble(Mode, IL_TRUE);
+}
+
+
+//! Disables a mode
+ILboolean ILAPIENTRY ilDisable(ILenum Mode)
+{
+ return ilAble(Mode, IL_FALSE);
+}
+
+
+// Internal function that sets the Mode equal to Flag
+ILboolean ilAble(ILenum Mode, ILboolean Flag)
+{
+ switch (Mode)
+ {
+ case IL_ORIGIN_SET:
+ ilStates[ilCurrentPos].ilOriginSet = Flag;
+ break;
+ case IL_FORMAT_SET:
+ ilStates[ilCurrentPos].ilFormatSet = Flag;
+ break;
+ case IL_TYPE_SET:
+ ilStates[ilCurrentPos].ilTypeSet = Flag;
+ break;
+ case IL_FILE_OVERWRITE:
+ ilStates[ilCurrentPos].ilOverWriteFiles = Flag;
+ break;
+ case IL_CONV_PAL:
+ ilStates[ilCurrentPos].ilAutoConvPal = Flag;
+ break;
+ case IL_DEFAULT_ON_FAIL:
+ ilStates[ilCurrentPos].ilDefaultOnFail = Flag;
+ break;
+ case IL_USE_KEY_COLOUR:
+ ilStates[ilCurrentPos].ilUseKeyColour = Flag;
+ break;
+ case IL_BLIT_BLEND:
+ ilStates[ilCurrentPos].ilBlitBlend = Flag;
+ break;
+ case IL_SAVE_INTERLACED:
+ ilStates[ilCurrentPos].ilInterlace = Flag;
+ break;
+ case IL_JPG_PROGRESSIVE:
+ ilStates[ilCurrentPos].ilJpgProgressive = Flag;
+ break;
+ case IL_NVIDIA_COMPRESS:
+ ilStates[ilCurrentPos].ilUseNVidiaDXT = Flag;
+ break;
+ case IL_SQUISH_COMPRESS:
+ ilStates[ilCurrentPos].ilUseSquishDXT = Flag;
+ break;
+
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ return IL_FALSE;
+ }
+
+ return IL_TRUE;
+}
+
+
+//! Checks whether the mode is enabled.
+ILboolean ILAPIENTRY ilIsEnabled(ILenum Mode)
+{
+ switch (Mode)
+ {
+ case IL_ORIGIN_SET:
+ return ilStates[ilCurrentPos].ilOriginSet;
+ case IL_FORMAT_SET:
+ return ilStates[ilCurrentPos].ilFormatSet;
+ case IL_TYPE_SET:
+ return ilStates[ilCurrentPos].ilTypeSet;
+ case IL_FILE_OVERWRITE:
+ return ilStates[ilCurrentPos].ilOverWriteFiles;
+ case IL_CONV_PAL:
+ return ilStates[ilCurrentPos].ilAutoConvPal;
+ case IL_DEFAULT_ON_FAIL:
+ return ilStates[ilCurrentPos].ilDefaultOnFail;
+ case IL_USE_KEY_COLOUR:
+ return ilStates[ilCurrentPos].ilUseKeyColour;
+ case IL_BLIT_BLEND:
+ return ilStates[ilCurrentPos].ilBlitBlend;
+ case IL_SAVE_INTERLACED:
+ return ilStates[ilCurrentPos].ilInterlace;
+ case IL_JPG_PROGRESSIVE:
+ return ilStates[ilCurrentPos].ilJpgProgressive;
+ case IL_NVIDIA_COMPRESS:
+ return ilStates[ilCurrentPos].ilUseNVidiaDXT;
+ case IL_SQUISH_COMPRESS:
+ return ilStates[ilCurrentPos].ilUseSquishDXT;
+
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ }
+
+ return IL_FALSE;
+}
+
+
+//! Checks whether the mode is disabled.
+ILboolean ILAPIENTRY ilIsDisabled(ILenum Mode)
+{
+ return !ilIsEnabled(Mode);
+}
+
+
+//! Sets Param equal to the current value of the Mode
+void ILAPIENTRY ilGetBooleanv(ILenum Mode, ILboolean *Param)
+{
+ if (Param == NULL) {
+ ilSetError(IL_INVALID_PARAM);
+ return;
+ }
+
+ *Param = ilGetInteger(Mode);
+
+ return;
+}
+
+
+//! Returns the current value of the Mode
+ILboolean ILAPIENTRY ilGetBoolean(ILenum Mode)
+{
+ ILboolean Temp;
+ Temp = IL_FALSE;
+ ilGetBooleanv(Mode, &Temp);
+ return Temp;
+}
+
+
+ILimage *iGetBaseImage(void);
+
+//! Internal function to figure out where we are in an image chain.
+//@TODO: This may get much more complex with mipmaps under faces, etc.
+ILuint iGetActiveNum(ILenum Type)
+{
+ ILimage *BaseImage;
+ ILuint Num = 0;
+
+ if (iCurImage == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ return 0;
+ }
+
+ BaseImage = iGetBaseImage();
+ if (BaseImage == iCurImage)
+ return 0;
+
+ switch (Type)
+ {
+ case IL_ACTIVE_IMAGE:
+ BaseImage = BaseImage->Next;
+ do {
+ if (BaseImage == NULL)
+ return 0;
+ Num++;
+ if (BaseImage == iCurImage)
+ return Num;
+ } while ((BaseImage = BaseImage->Next));
+ break;
+ case IL_ACTIVE_MIPMAP:
+ BaseImage = BaseImage->Mipmaps;
+ do {
+ if (BaseImage == NULL)
+ return 0;
+ Num++;
+ if (BaseImage == iCurImage)
+ return Num;
+ } while ((BaseImage = BaseImage->Mipmaps));
+ break;
+ case IL_ACTIVE_LAYER:
+ BaseImage = BaseImage->Layers;
+ do {
+ if (BaseImage == NULL)
+ return 0;
+ Num++;
+ if (BaseImage == iCurImage)
+ return Num;
+ } while ((BaseImage = BaseImage->Layers));
+ break;
+ case IL_ACTIVE_FACE:
+ BaseImage = BaseImage->Faces;
+ do {
+ if (BaseImage == NULL)
+ return 0;
+ Num++;
+ if (BaseImage == iCurImage)
+ return Num;
+ } while ((BaseImage = BaseImage->Faces));
+ break;
+ }
+
+ //@TODO: Any error needed here?
+
+ return 0;
+}
+
+
+//! Sets Param equal to the current value of the Mode
+void ILAPIENTRY ilGetIntegerv(ILenum Mode, ILint *Param)
+{
+ if (Param == NULL) {
+ ilSetError(IL_INVALID_PARAM);
+ return;
+ }
+
+ *Param = 0;
+
+ switch (Mode) {
+ // Integer values
+ case IL_COMPRESS_MODE:
+ *Param = ilStates[ilCurrentPos].ilCompression;
+ break;
+ case IL_CUR_IMAGE:
+ if (iCurImage == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ break;
+ }
+ *Param = ilGetCurName();
+ break;
+ case IL_FORMAT_MODE:
+ *Param = ilStates[ilCurrentPos].ilFormatMode;
+ break;
+ case IL_INTERLACE_MODE:
+ *Param = ilStates[ilCurrentPos].ilInterlace;
+ break;
+ case IL_KEEP_DXTC_DATA:
+ *Param = ilStates[ilCurrentPos].ilKeepDxtcData;
+ break;
+ case IL_ORIGIN_MODE:
+ *Param = ilStates[ilCurrentPos].ilOriginMode;
+ break;
+ case IL_MAX_QUANT_INDICES:
+ *Param = ilStates[ilCurrentPos].ilQuantMaxIndexs;
+ break;
+ case IL_NEU_QUANT_SAMPLE:
+ *Param = ilStates[ilCurrentPos].ilNeuSample;
+ break;
+ case IL_QUANTIZATION_MODE:
+ *Param = ilStates[ilCurrentPos].ilQuantMode;
+ break;
+ case IL_TYPE_MODE:
+ *Param = ilStates[ilCurrentPos].ilTypeMode;
+ break;
+ case IL_VERSION_NUM:
+ *Param = IL_VERSION;
+ break;
+
+ // Image specific values
+ case IL_ACTIVE_IMAGE:
+ case IL_ACTIVE_MIPMAP:
+ case IL_ACTIVE_LAYER:
+ *Param = iGetActiveNum(Mode);
+ break;
+
+ // Format-specific values
+ case IL_BMP_RLE:
+ *Param = ilStates[ilCurrentPos].ilBmpRle;
+ break;
+ case IL_DXTC_FORMAT:
+ *Param = ilStates[ilCurrentPos].ilDxtcFormat;
+ break;
+ case IL_JPG_QUALITY:
+ *Param = ilStates[ilCurrentPos].ilJpgQuality;
+ break;
+ case IL_JPG_SAVE_FORMAT:
+ *Param = ilStates[ilCurrentPos].ilJpgFormat;
+ break;
+ case IL_PCD_PICNUM:
+ *Param = ilStates[ilCurrentPos].ilPcdPicNum;
+ break;
+ case IL_PNG_ALPHA_INDEX:
+ *Param = ilStates[ilCurrentPos].ilPngAlphaIndex;
+ break;
+ case IL_PNG_INTERLACE:
+ *Param = ilStates[ilCurrentPos].ilPngInterlace;
+ break;
+ case IL_SGI_RLE:
+ *Param = ilStates[ilCurrentPos].ilSgiRle;
+ break;
+ case IL_TGA_CREATE_STAMP:
+ *Param = ilStates[ilCurrentPos].ilTgaCreateStamp;
+ break;
+ case IL_TGA_RLE:
+ *Param = ilStates[ilCurrentPos].ilTgaRle;
+ break;
+ case IL_VTF_COMP:
+ *Param = ilStates[ilCurrentPos].ilVtfCompression;
+ break;
+
+ // Boolean values
+ case IL_CONV_PAL:
+ *Param = ilStates[ilCurrentPos].ilAutoConvPal;
+ break;
+ case IL_DEFAULT_ON_FAIL:
+ *Param = ilStates[ilCurrentPos].ilDefaultOnFail;
+ break;
+ case IL_FILE_MODE:
+ *Param = ilStates[ilCurrentPos].ilOverWriteFiles;
+ break;
+ case IL_FORMAT_SET:
+ *Param = ilStates[ilCurrentPos].ilFormatSet;
+ break;
+ case IL_ORIGIN_SET:
+ *Param = ilStates[ilCurrentPos].ilOriginSet;
+ break;
+ case IL_TYPE_SET:
+ *Param = ilStates[ilCurrentPos].ilTypeSet;
+ break;
+ case IL_USE_KEY_COLOUR:
+ *Param = ilStates[ilCurrentPos].ilUseKeyColour;
+ break;
+ case IL_BLIT_BLEND:
+ *Param = ilStates[ilCurrentPos].ilBlitBlend;
+ break;
+ case IL_JPG_PROGRESSIVE:
+ *Param = ilStates[ilCurrentPos].ilJpgProgressive;
+ break;
+ case IL_NVIDIA_COMPRESS:
+ *Param = ilStates[ilCurrentPos].ilUseNVidiaDXT;
+ break;
+ case IL_SQUISH_COMPRESS:
+ *Param = ilStates[ilCurrentPos].ilUseSquishDXT;
+ break;
+
+ default:
+ iGetIntegervImage(iCurImage, Mode, Param);
+ }
+
+ return;
+}
+
+//@TODO rename to ilGetImageIntegerv for 1.6.9 and make it public
+//! Sets Param equal to the current value of the Mode
+void ILAPIENTRY iGetIntegervImage(ILimage *Image, ILenum Mode, ILint *Param)
+{
+ ILimage *SubImage;
+ if (Image == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ return;
+ }
+ if (Param == NULL) {
+ ilSetError(IL_INVALID_PARAM);
+ return;
+ }
+ *Param = 0;
+
+ switch (Mode)
+ {
+ case IL_DXTC_DATA_FORMAT:
+ if (Image->DxtcData == NULL || Image->DxtcSize == 0) {
+ *Param = IL_DXT_NO_COMP;
+ break;
+ }
+ *Param = Image->DxtcFormat;
+ break;
+ ////
+ case IL_IMAGE_BITS_PER_PIXEL:
+ //changed 20040610 to channel count (Bpp) times Bytes per channel
+ *Param = (Image->Bpp << 3)*Image->Bpc;
+ break;
+ case IL_IMAGE_BYTES_PER_PIXEL:
+ //changed 20040610 to channel count (Bpp) times Bytes per channel
+ *Param = Image->Bpp*Image->Bpc;
+ break;
+ case IL_IMAGE_BPC:
+ *Param = Image->Bpc;
+ break;
+ case IL_IMAGE_CHANNELS:
+ *Param = Image->Bpp;
+ break;
+ case IL_IMAGE_CUBEFLAGS:
+ *Param = Image->CubeFlags;
+ break;
+ case IL_IMAGE_DEPTH:
+ *Param = Image->Depth;
+ break;
+ case IL_IMAGE_DURATION:
+ *Param = Image->Duration;
+ break;
+ case IL_IMAGE_FORMAT:
+ *Param = Image->Format;
+ break;
+ case IL_IMAGE_HEIGHT:
+ *Param = Image->Height;
+ break;
+ case IL_IMAGE_SIZE_OF_DATA:
+ *Param = Image->SizeOfData;
+
+ break;
+ case IL_IMAGE_OFFX:
+ *Param = Image->OffX;
+ break;
+ case IL_IMAGE_OFFY:
+ *Param = Image->OffY;
+ break;
+ case IL_IMAGE_ORIGIN:
+ *Param = Image->Origin;
+ break;
+ case IL_IMAGE_PLANESIZE:
+ *Param = Image->SizeOfPlane;
+ break;
+ case IL_IMAGE_TYPE:
+ *Param = Image->Type;
+ break;
+ case IL_IMAGE_WIDTH:
+ *Param = Image->Width;
+ break;
+ case IL_NUM_FACES:
+ for (SubImage = Image->Faces; SubImage; SubImage = SubImage->Faces)
+ (*Param)++;
+ break;
+ case IL_NUM_IMAGES:
+ for (SubImage = Image->Next; SubImage; SubImage = SubImage->Next)
+ (*Param)++;
+ break;
+ case IL_NUM_LAYERS:
+ for (SubImage = Image->Layers; SubImage; SubImage = SubImage->Layers)
+ (*Param)++;
+ break;
+ case IL_NUM_MIPMAPS:
+ for (SubImage = Image->Mipmaps; SubImage; SubImage = SubImage->Mipmaps)
+ (*Param)++;
+ break;
+
+ case IL_PALETTE_TYPE:
+ *Param = Image->Pal.PalType;
+ break;
+ case IL_PALETTE_BPP:
+ *Param = ilGetBppPal(Image->Pal.PalType);
+ break;
+ case IL_PALETTE_NUM_COLS:
+ if (!Image->Pal.Palette || !Image->Pal.PalSize || Image->Pal.PalType == IL_PAL_NONE)
+ *Param = 0;
+ else
+ *Param = Image->Pal.PalSize / ilGetBppPal(Image->Pal.PalType);
+ break;
+ case IL_PALETTE_BASE_TYPE:
+ switch (Image->Pal.PalType)
+ {
+ case IL_PAL_RGB24:
+ *Param = IL_RGB;
+ case IL_PAL_RGB32:
+ *Param = IL_RGBA; // Not sure
+ case IL_PAL_RGBA32:
+ *Param = IL_RGBA;
+ case IL_PAL_BGR24:
+ *Param = IL_BGR;
+ case IL_PAL_BGR32:
+ *Param = IL_BGRA; // Not sure
+ case IL_PAL_BGRA32:
+ *Param = IL_BGRA;
+ }
+ break;
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ }
+}
+
+
+
+//! Returns the current value of the Mode
+ILint ILAPIENTRY ilGetInteger(ILenum Mode)
+{
+ ILint Temp;
+ Temp = 0;
+ ilGetIntegerv(Mode, &Temp);
+ return Temp;
+}
+
+
+//! Sets the default origin to be used.
+ILboolean ILAPIENTRY ilOriginFunc(ILenum Mode)
+{
+ switch (Mode)
+ {
+ case IL_ORIGIN_LOWER_LEFT:
+ case IL_ORIGIN_UPPER_LEFT:
+ ilStates[ilCurrentPos].ilOriginMode = Mode;
+ break;
+ default:
+ ilSetError(IL_INVALID_PARAM);
+ return IL_FALSE;
+ }
+ return IL_TRUE;
+}
+
+
+//! Sets the default format to be used.
+ILboolean ILAPIENTRY ilFormatFunc(ILenum Mode)
+{
+ switch (Mode)
+ {
+ //case IL_COLOUR_INDEX:
+ case IL_RGB:
+ case IL_RGBA:
+ case IL_BGR:
+ case IL_BGRA:
+ case IL_LUMINANCE:
+ case IL_LUMINANCE_ALPHA:
+ ilStates[ilCurrentPos].ilFormatMode = Mode;
+ break;
+ default:
+ ilSetError(IL_INVALID_PARAM);
+ return IL_FALSE;
+ }
+ return IL_TRUE;
+}
+
+
+//! Sets the default type to be used.
+ILboolean ILAPIENTRY ilTypeFunc(ILenum Mode)
+{
+ switch (Mode)
+ {
+ case IL_BYTE:
+ case IL_UNSIGNED_BYTE:
+ case IL_SHORT:
+ case IL_UNSIGNED_SHORT:
+ case IL_INT:
+ case IL_UNSIGNED_INT:
+ case IL_FLOAT:
+ case IL_DOUBLE:
+ ilStates[ilCurrentPos].ilTypeMode = Mode;
+ break;
+ default:
+ ilSetError(IL_INVALID_PARAM);
+ return IL_FALSE;
+ }
+ return IL_TRUE;
+}
+
+
+ILboolean ILAPIENTRY ilCompressFunc(ILenum Mode)
+{
+ switch (Mode)
+ {
+ case IL_COMPRESS_NONE:
+ case IL_COMPRESS_RLE:
+ //case IL_COMPRESS_LZO:
+ case IL_COMPRESS_ZLIB:
+ ilStates[ilCurrentPos].ilCompression = Mode;
+ break;
+ default:
+ ilSetError(IL_INVALID_PARAM);
+ return IL_FALSE;
+ }
+ return IL_TRUE;
+}
+
+
+//! Pushes the states indicated by Bits onto the state stack
+void ILAPIENTRY ilPushAttrib(ILuint Bits)
+{
+ // Should we check here to see if ilCurrentPos is negative?
+
+ if (ilCurrentPos >= IL_ATTRIB_STACK_MAX - 1) {
+ ilCurrentPos = IL_ATTRIB_STACK_MAX - 1;
+ ilSetError(IL_STACK_OVERFLOW);
+ return;
+ }
+
+ ilCurrentPos++;
+
+ // memcpy(&ilStates[ilCurrentPos], &ilStates[ilCurrentPos - 1], sizeof(IL_STATES));
+
+ ilDefaultStates();
+
+ if (Bits & IL_ORIGIN_BIT) {
+ ilStates[ilCurrentPos].ilOriginMode = ilStates[ilCurrentPos-1].ilOriginMode;
+ ilStates[ilCurrentPos].ilOriginSet = ilStates[ilCurrentPos-1].ilOriginSet;
+ }
+ if (Bits & IL_FORMAT_BIT) {
+ ilStates[ilCurrentPos].ilFormatMode = ilStates[ilCurrentPos-1].ilFormatMode;
+ ilStates[ilCurrentPos].ilFormatSet = ilStates[ilCurrentPos-1].ilFormatSet;
+ }
+ if (Bits & IL_TYPE_BIT) {
+ ilStates[ilCurrentPos].ilTypeMode = ilStates[ilCurrentPos-1].ilTypeMode;
+ ilStates[ilCurrentPos].ilTypeSet = ilStates[ilCurrentPos-1].ilTypeSet;
+ }
+ if (Bits & IL_FILE_BIT) {
+ ilStates[ilCurrentPos].ilOverWriteFiles = ilStates[ilCurrentPos-1].ilOverWriteFiles;
+ }
+ if (Bits & IL_PAL_BIT) {
+ ilStates[ilCurrentPos].ilAutoConvPal = ilStates[ilCurrentPos-1].ilAutoConvPal;
+ }
+ if (Bits & IL_LOADFAIL_BIT) {
+ ilStates[ilCurrentPos].ilDefaultOnFail = ilStates[ilCurrentPos-1].ilDefaultOnFail;
+ }
+ if (Bits & IL_COMPRESS_BIT) {
+ ilStates[ilCurrentPos].ilCompression = ilStates[ilCurrentPos-1].ilCompression;
+ }
+ if (Bits & IL_FORMAT_SPECIFIC_BIT) {
+ ilStates[ilCurrentPos].ilTgaCreateStamp = ilStates[ilCurrentPos-1].ilTgaCreateStamp;
+ ilStates[ilCurrentPos].ilJpgQuality = ilStates[ilCurrentPos-1].ilJpgQuality;
+ ilStates[ilCurrentPos].ilPngInterlace = ilStates[ilCurrentPos-1].ilPngInterlace;
+ ilStates[ilCurrentPos].ilTgaRle = ilStates[ilCurrentPos-1].ilTgaRle;
+ ilStates[ilCurrentPos].ilBmpRle = ilStates[ilCurrentPos-1].ilBmpRle;
+ ilStates[ilCurrentPos].ilSgiRle = ilStates[ilCurrentPos-1].ilSgiRle;
+ ilStates[ilCurrentPos].ilJpgFormat = ilStates[ilCurrentPos-1].ilJpgFormat;
+ ilStates[ilCurrentPos].ilDxtcFormat = ilStates[ilCurrentPos-1].ilDxtcFormat;
+ ilStates[ilCurrentPos].ilPcdPicNum = ilStates[ilCurrentPos-1].ilPcdPicNum;
+
+ ilStates[ilCurrentPos].ilPngAlphaIndex = ilStates[ilCurrentPos-1].ilPngAlphaIndex;
+
+ // Strings
+ if (ilStates[ilCurrentPos].ilTgaId)
+ ifree(ilStates[ilCurrentPos].ilTgaId);
+ if (ilStates[ilCurrentPos].ilTgaAuthName)
+ ifree(ilStates[ilCurrentPos].ilTgaAuthName);
+ if (ilStates[ilCurrentPos].ilTgaAuthComment)
+ ifree(ilStates[ilCurrentPos].ilTgaAuthComment);
+ if (ilStates[ilCurrentPos].ilPngAuthName)
+ ifree(ilStates[ilCurrentPos].ilPngAuthName);
+ if (ilStates[ilCurrentPos].ilPngTitle)
+ ifree(ilStates[ilCurrentPos].ilPngTitle);
+ if (ilStates[ilCurrentPos].ilPngDescription)
+ ifree(ilStates[ilCurrentPos].ilPngDescription);
+
+ //2003-09-01: added tif strings
+ if (ilStates[ilCurrentPos].ilTifDescription)
+ ifree(ilStates[ilCurrentPos].ilTifDescription);
+ if (ilStates[ilCurrentPos].ilTifHostComputer)
+ ifree(ilStates[ilCurrentPos].ilTifHostComputer);
+ if (ilStates[ilCurrentPos].ilTifDocumentName)
+ ifree(ilStates[ilCurrentPos].ilTifDocumentName);
+ if (ilStates[ilCurrentPos].ilTifAuthName)
+ ifree(ilStates[ilCurrentPos].ilTifAuthName);
+
+ if (ilStates[ilCurrentPos].ilCHeader)
+ ifree(ilStates[ilCurrentPos].ilCHeader);
+
+ ilStates[ilCurrentPos].ilTgaId = strdup(ilStates[ilCurrentPos-1].ilTgaId);
+ ilStates[ilCurrentPos].ilTgaAuthName = strdup(ilStates[ilCurrentPos-1].ilTgaAuthName);
+ ilStates[ilCurrentPos].ilTgaAuthComment = strdup(ilStates[ilCurrentPos-1].ilTgaAuthComment);
+ ilStates[ilCurrentPos].ilPngAuthName = strdup(ilStates[ilCurrentPos-1].ilPngAuthName);
+ ilStates[ilCurrentPos].ilPngTitle = strdup(ilStates[ilCurrentPos-1].ilPngTitle);
+ ilStates[ilCurrentPos].ilPngDescription = strdup(ilStates[ilCurrentPos-1].ilPngDescription);
+
+ //2003-09-01: added tif strings
+ ilStates[ilCurrentPos].ilTifDescription = strdup(ilStates[ilCurrentPos-1].ilTifDescription);
+ ilStates[ilCurrentPos].ilTifHostComputer = strdup(ilStates[ilCurrentPos-1].ilTifHostComputer);
+ ilStates[ilCurrentPos].ilTifDocumentName = strdup(ilStates[ilCurrentPos-1].ilTifDocumentName);
+ ilStates[ilCurrentPos].ilTifAuthName = strdup(ilStates[ilCurrentPos-1].ilTifAuthName);
+
+ ilStates[ilCurrentPos].ilCHeader = strdup(ilStates[ilCurrentPos-1].ilCHeader);
+ }
+
+ return;
+}
+
+
+// @TODO: Find out how this affects strings!!!
+
+//! Pops the last entry off the state stack into the current states
+void ILAPIENTRY ilPopAttrib()
+{
+ if (ilCurrentPos <= 0) {
+ ilCurrentPos = 0;
+ ilSetError(IL_STACK_UNDERFLOW);
+ return;
+ }
+
+ // Should we check here to see if ilCurrentPos is too large?
+ ilCurrentPos--;
+
+ return;
+}
+
+
+//! Specifies implementation-dependent performance hints
+void ILAPIENTRY ilHint(ILenum Target, ILenum Mode)
+{
+ switch (Target)
+ {
+ case IL_MEM_SPEED_HINT:
+ switch (Mode)
+ {
+ case IL_FASTEST:
+ ilHints.MemVsSpeedHint = Mode;
+ break;
+ case IL_LESS_MEM:
+ ilHints.MemVsSpeedHint = Mode;
+ break;
+ case IL_DONT_CARE:
+ ilHints.MemVsSpeedHint = IL_FASTEST;
+ break;
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ return;
+ }
+ break;
+
+ case IL_COMPRESSION_HINT:
+ switch (Mode)
+ {
+ case IL_USE_COMPRESSION:
+ ilHints.CompressHint = Mode;
+ break;
+ case IL_NO_COMPRESSION:
+ ilHints.CompressHint = Mode;
+ break;
+ case IL_DONT_CARE:
+ ilHints.CompressHint = IL_NO_COMPRESSION;
+ break;
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ return;
+ }
+ break;
+
+
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ return;
+ }
+
+ return;
+}
+
+
+ILenum iGetHint(ILenum Target)
+{
+ switch (Target)
+ {
+ case IL_MEM_SPEED_HINT:
+ return ilHints.MemVsSpeedHint;
+ case IL_COMPRESSION_HINT:
+ return ilHints.CompressHint;
+ default:
+ ilSetError(IL_INTERNAL_ERROR);
+ return 0;
+ }
+}
+
+
+void ILAPIENTRY ilSetString(ILenum Mode, const char *String)
+{
+ if (String == NULL) {
+ ilSetError(IL_INVALID_PARAM);
+ return;
+ }
+
+ switch (Mode)
+ {
+ case IL_TGA_ID_STRING:
+ if (ilStates[ilCurrentPos].ilTgaId)
+ ifree(ilStates[ilCurrentPos].ilTgaId);
+ ilStates[ilCurrentPos].ilTgaId = strdup(String);
+ break;
+ case IL_TGA_AUTHNAME_STRING:
+ if (ilStates[ilCurrentPos].ilTgaAuthName)
+ ifree(ilStates[ilCurrentPos].ilTgaAuthName);
+ ilStates[ilCurrentPos].ilTgaAuthName = strdup(String);
+ break;
+ case IL_TGA_AUTHCOMMENT_STRING:
+ if (ilStates[ilCurrentPos].ilTgaAuthComment)
+ ifree(ilStates[ilCurrentPos].ilTgaAuthComment);
+ ilStates[ilCurrentPos].ilTgaAuthComment = strdup(String);
+ break;
+ case IL_PNG_AUTHNAME_STRING:
+ if (ilStates[ilCurrentPos].ilPngAuthName)
+ ifree(ilStates[ilCurrentPos].ilPngAuthName);
+ ilStates[ilCurrentPos].ilPngAuthName = strdup(String);
+ break;
+ case IL_PNG_TITLE_STRING:
+ if (ilStates[ilCurrentPos].ilPngTitle)
+ ifree(ilStates[ilCurrentPos].ilPngTitle);
+ ilStates[ilCurrentPos].ilPngTitle = strdup(String);
+ break;
+ case IL_PNG_DESCRIPTION_STRING:
+ if (ilStates[ilCurrentPos].ilPngDescription)
+ ifree(ilStates[ilCurrentPos].ilPngDescription);
+ ilStates[ilCurrentPos].ilPngDescription = strdup(String);
+ break;
+
+ //2003-09-01: added tif strings
+ case IL_TIF_DESCRIPTION_STRING:
+ if (ilStates[ilCurrentPos].ilTifDescription)
+ ifree(ilStates[ilCurrentPos].ilTifDescription);
+ ilStates[ilCurrentPos].ilTifDescription = strdup(String);
+ break;
+ case IL_TIF_HOSTCOMPUTER_STRING:
+ if (ilStates[ilCurrentPos].ilTifHostComputer)
+ ifree(ilStates[ilCurrentPos].ilTifHostComputer);
+ ilStates[ilCurrentPos].ilTifHostComputer = strdup(String);
+ break;
+ case IL_TIF_DOCUMENTNAME_STRING:
+ if (ilStates[ilCurrentPos].ilTifDocumentName)
+ ifree(ilStates[ilCurrentPos].ilTifDocumentName);
+ ilStates[ilCurrentPos].ilTifDocumentName = strdup(String);
+ break;
+ case IL_TIF_AUTHNAME_STRING:
+ if (ilStates[ilCurrentPos].ilTifAuthName)
+ ifree(ilStates[ilCurrentPos].ilTifAuthName);
+ ilStates[ilCurrentPos].ilTifAuthName = strdup(String);
+ break;
+
+ case IL_CHEAD_HEADER_STRING:
+ if (ilStates[ilCurrentPos].ilCHeader)
+ ifree(ilStates[ilCurrentPos].ilCHeader);
+ ilStates[ilCurrentPos].ilCHeader = strdup(String);
+ break;
+
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ }
+
+ return;
+}
+
+
+void ILAPIENTRY ilSetInteger(ILenum Mode, ILint Param)
+{
+ switch (Mode)
+ {
+ // Integer values
+ case IL_FORMAT_MODE:
+ ilFormatFunc(Param);
+ return;
+ case IL_KEEP_DXTC_DATA:
+ if (Param == IL_FALSE || Param == IL_TRUE) {
+ ilStates[ilCurrentPos].ilKeepDxtcData = Param;
+ return;
+ }
+ break;
+ case IL_MAX_QUANT_INDICES:
+ if (Param >= 2 && Param <= 256) {
+ ilStates[ilCurrentPos].ilQuantMaxIndexs = Param;
+ return;
+ }
+ break;
+ case IL_NEU_QUANT_SAMPLE:
+ if (Param >= 1 && Param <= 30) {
+ ilStates[ilCurrentPos].ilNeuSample = Param;
+ return;
+ }
+ break;
+ case IL_ORIGIN_MODE:
+ ilOriginFunc(Param);
+ return;
+ case IL_QUANTIZATION_MODE:
+ if (Param == IL_WU_QUANT || Param == IL_NEU_QUANT) {
+ ilStates[ilCurrentPos].ilQuantMode = Param;
+ return;
+ }
+ break;
+ case IL_TYPE_MODE:
+ ilTypeFunc(Param);
+ return;
+
+ // Image specific values
+ case IL_IMAGE_DURATION:
+ if (iCurImage == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ break;
+ }
+ iCurImage->Duration = Param;
+ return;
+ case IL_IMAGE_OFFX:
+ if (iCurImage == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ break;
+ }
+ iCurImage->OffX = Param;
+ return;
+ case IL_IMAGE_OFFY:
+ if (iCurImage == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ break;
+ }
+ iCurImage->OffY = Param;
+ return;
+ case IL_IMAGE_CUBEFLAGS:
+ if (iCurImage == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ break;
+ }
+ iCurImage->CubeFlags = Param;
+ break;
+
+ // Format specific values
+ case IL_BMP_RLE:
+ if (Param == IL_FALSE || Param == IL_TRUE) {
+ ilStates[ilCurrentPos].ilBmpRle = Param;
+ return;
+ }
+ break;
+ case IL_DXTC_FORMAT:
+ if (Param >= IL_DXT1 || Param <= IL_DXT5 || Param == IL_DXT1A) {
+ ilStates[ilCurrentPos].ilDxtcFormat = Param;
+ return;
+ }
+ break;
+ case IL_JPG_SAVE_FORMAT:
+ if (Param == IL_JFIF || Param == IL_EXIF) {
+ ilStates[ilCurrentPos].ilJpgFormat = Param;
+ return;
+ }
+ break;
+ case IL_JPG_QUALITY:
+ if (Param >= 0 && Param <= 99) {
+ ilStates[ilCurrentPos].ilJpgQuality = Param;
+ return;
+ }
+ break;
+ case IL_PNG_INTERLACE:
+ if (Param == IL_FALSE || Param == IL_TRUE) {
+ ilStates[ilCurrentPos].ilPngInterlace = Param;
+ return;
+ }
+ break;
+ case IL_PCD_PICNUM:
+ if (Param >= 0 || Param <= 2) {
+ ilStates[ilCurrentPos].ilPcdPicNum = Param;
+ return;
+ }
+ break;
+ case IL_PNG_ALPHA_INDEX:
+ if (Param >= -1 || Param <= 255) {
+ ilStates[ilCurrentPos].ilPngAlphaIndex=Param;
+ return;
+ }
+ break;
+ case IL_SGI_RLE:
+ if (Param == IL_FALSE || Param == IL_TRUE) {
+ ilStates[ilCurrentPos].ilSgiRle = Param;
+ return;
+ }
+ break;
+ case IL_TGA_CREATE_STAMP:
+ if (Param == IL_FALSE || Param == IL_TRUE) {
+ ilStates[ilCurrentPos].ilTgaCreateStamp = Param;
+ return;
+ }
+ break;
+ case IL_TGA_RLE:
+ if (Param == IL_FALSE || Param == IL_TRUE) {
+ ilStates[ilCurrentPos].ilTgaRle = Param;
+ return;
+ }
+ break;
+ case IL_VTF_COMP:
+ if (Param == IL_DXT1 || Param == IL_DXT5 || Param == IL_DXT3 || Param == IL_DXT1A || Param == IL_DXT_NO_COMP) {
+ ilStates[ilCurrentPos].ilVtfCompression = Param;
+ return;
+ }
+ break;
+
+ default:
+ ilSetError(IL_INVALID_ENUM);
+ return;
+ }
+
+ ilSetError(IL_INVALID_PARAM); // Parameter not in valid bounds.
+ return;
+}
+
+
+
+ILint iGetInt(ILenum Mode)
+{
+ //like ilGetInteger(), but sets another error on failure
+
+ //call ilGetIntegerv() for more robust code
+ ILenum err;
+ ILint r = -1;
+
+ ilGetIntegerv(Mode, &r);
+
+ //check if an error occured, set another error
+ err = ilGetError();
+ if (r == -1 && err == IL_INVALID_ENUM)
+ ilSetError(IL_INTERNAL_ERROR);
+ else
+ ilSetError(err); //restore error
+
+ return r;
+}