ILboolean ILAPIENTRY ilRegisterSave(ILconst_string Ext, IL_SAVEPROC Save) { iFormatS *TempNode, *NewNode; TempNode = SaveProcs; if (TempNode != NULL) { while (TempNode->Next != NULL) { TempNode = TempNode->Next; if (!iStrCmp(TempNode->Ext, Ext)) { // already registered return IL_TRUE; } } } NewNode = (iFormatS*)ialloc(sizeof(iFormatL)); if (NewNode == NULL) { return IL_FALSE; } if (SaveProcs == NULL) { SaveProcs = NewNode; } else { TempNode->Next = NewNode; } NewNode->Ext = ilStrDup(Ext); NewNode->Save = Save; NewNode->Next = NULL; return IL_TRUE; }
ILboolean ILAPIENTRY ilRegisterLoad(ILconst_string Ext, IL_LOADPROC Load) { iFormatL *TempNode, *NewNode; TempNode = LoadProcs; if (TempNode != NULL) { while (TempNode->Next != NULL) { TempNode = TempNode->Next; if (!iStrCmp(TempNode->Ext, Ext)) { // already registered return IL_TRUE; } } } NewNode = (iFormatL*)ialloc(sizeof(iFormatL)); if (NewNode == NULL) { return IL_FALSE; } if (LoadProcs == NULL) { LoadProcs = NewNode; } else { TempNode->Next = NewNode; } NewNode->Ext = ilStrDup(Ext); NewNode->Load = Load; NewNode->Next = NULL; return IL_TRUE; }
//! Pushes the states indicated by Bits onto the state stack ILvoid 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 = ilStrDup(ilStates[ilCurrentPos-1].ilTgaId); ilStates[ilCurrentPos].ilTgaAuthName = ilStrDup(ilStates[ilCurrentPos-1].ilTgaAuthName); ilStates[ilCurrentPos].ilTgaAuthComment = ilStrDup(ilStates[ilCurrentPos-1].ilTgaAuthComment); ilStates[ilCurrentPos].ilPngAuthName = ilStrDup(ilStates[ilCurrentPos-1].ilPngAuthName); ilStates[ilCurrentPos].ilPngTitle = ilStrDup(ilStates[ilCurrentPos-1].ilPngTitle); ilStates[ilCurrentPos].ilPngDescription = ilStrDup(ilStates[ilCurrentPos-1].ilPngDescription); //2003-09-01: added tif strings ilStates[ilCurrentPos].ilTifDescription = ilStrDup(ilStates[ilCurrentPos-1].ilTifDescription); ilStates[ilCurrentPos].ilTifHostComputer = ilStrDup(ilStates[ilCurrentPos-1].ilTifHostComputer); ilStates[ilCurrentPos].ilTifDocumentName = ilStrDup(ilStates[ilCurrentPos-1].ilTifDocumentName); ilStates[ilCurrentPos].ilTifAuthName = ilStrDup(ilStates[ilCurrentPos-1].ilTifAuthName); ilStates[ilCurrentPos].ilCHeader = ilStrDup(ilStates[ilCurrentPos-1].ilCHeader); } return; }
ILvoid 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 = ilStrDup(String); break; case IL_TGA_AUTHNAME_STRING: if (ilStates[ilCurrentPos].ilTgaAuthName) ifree(ilStates[ilCurrentPos].ilTgaAuthName); ilStates[ilCurrentPos].ilTgaAuthName = ilStrDup(String); break; case IL_TGA_AUTHCOMMENT_STRING: if (ilStates[ilCurrentPos].ilTgaAuthComment) ifree(ilStates[ilCurrentPos].ilTgaAuthComment); ilStates[ilCurrentPos].ilTgaAuthComment = ilStrDup(String); break; case IL_PNG_AUTHNAME_STRING: if (ilStates[ilCurrentPos].ilPngAuthName) ifree(ilStates[ilCurrentPos].ilPngAuthName); ilStates[ilCurrentPos].ilPngAuthName = ilStrDup(String); break; case IL_PNG_TITLE_STRING: if (ilStates[ilCurrentPos].ilPngTitle) ifree(ilStates[ilCurrentPos].ilPngTitle); ilStates[ilCurrentPos].ilPngTitle = ilStrDup(String); break; case IL_PNG_DESCRIPTION_STRING: if (ilStates[ilCurrentPos].ilPngDescription) ifree(ilStates[ilCurrentPos].ilPngDescription); ilStates[ilCurrentPos].ilPngDescription = ilStrDup(String); break; //2003-09-01: added tif strings case IL_TIF_DESCRIPTION_STRING: if (ilStates[ilCurrentPos].ilTifDescription) ifree(ilStates[ilCurrentPos].ilTifDescription); ilStates[ilCurrentPos].ilTifDescription = ilStrDup(String); break; case IL_TIF_HOSTCOMPUTER_STRING: if (ilStates[ilCurrentPos].ilTifHostComputer) ifree(ilStates[ilCurrentPos].ilTifHostComputer); ilStates[ilCurrentPos].ilTifHostComputer = ilStrDup(String); break; case IL_TIF_DOCUMENTNAME_STRING: if (ilStates[ilCurrentPos].ilTifDocumentName) ifree(ilStates[ilCurrentPos].ilTifDocumentName); ilStates[ilCurrentPos].ilTifDocumentName = ilStrDup(String); break; case IL_TIF_AUTHNAME_STRING: if (ilStates[ilCurrentPos].ilTifAuthName) ifree(ilStates[ilCurrentPos].ilTifAuthName); ilStates[ilCurrentPos].ilTifAuthName = ilStrDup(String); break; case IL_CHEAD_HEADER_STRING: if (ilStates[ilCurrentPos].ilCHeader) ifree(ilStates[ilCurrentPos].ilCHeader); ilStates[ilCurrentPos].ilCHeader = ilStrDup(String); break; default: ilSetError(IL_INVALID_ENUM); } return; }
ILboolean ILAPIENTRY ilRegisterLoad(const ILstring Ext, IL_LOADPROC Load) { iFormatL *TempNode, *NewNode; TempNode = LoadProcs; if (TempNode != NULL) { while (TempNode->Next != NULL) { TempNode = TempNode->Next; #ifndef _UNICODE if (!stricmp(TempNode->Ext, Ext)) { // already registered #else if (!wcsicmp(TempNode->Ext, Ext)) { #endif//_UNICODE return IL_TRUE; } } } NewNode = (iFormatL*)ialloc(sizeof(iFormatL)); if (NewNode == NULL) { return IL_FALSE; } if (LoadProcs == NULL) { LoadProcs = NewNode; } else { TempNode->Next = NewNode; } #ifndef _UNICODE NewNode->Ext = ilStrDup(Ext); #else NewNode->Ext = _wcsdup(Ext); #endif//_UNICODE NewNode->Load = Load; NewNode->Next = NULL; return IL_TRUE; } ILboolean ILAPIENTRY ilRegisterSave(const ILstring Ext, IL_SAVEPROC Save) { iFormatS *TempNode, *NewNode; TempNode = SaveProcs; if (TempNode != NULL) { while (TempNode->Next != NULL) { TempNode = TempNode->Next; #ifndef _UNICODE if (!stricmp(TempNode->Ext, Ext)) { // already registered #else if (!_wcsicmp(TempNode->Ext, Ext)) { #endif//_UNICODE return IL_TRUE; } } } NewNode = (iFormatS*)ialloc(sizeof(iFormatL)); if (NewNode == NULL) { return IL_FALSE; } if (SaveProcs == NULL) { SaveProcs = NewNode; } else { TempNode->Next = NewNode; } #ifndef _UNICODE NewNode->Ext = ilStrDup(Ext); #else NewNode->Ext = _wcsdup(Ext); #endif//_UNICODE NewNode->Save = Save; NewNode->Next = NULL; return IL_TRUE; } //! Unregisters a load extension - doesn't have to be called. ILboolean ILAPIENTRY ilRemoveLoad(const ILstring Ext) { iFormatL *TempNode = LoadProcs, *PrevNode = NULL; while (TempNode != NULL) { #ifndef _UNICODE if (!stricmp(Ext, TempNode->Ext)) { #else if (_wcsicmp(Ext, TempNode->Ext)) { #endif//_UNICODE if (PrevNode == NULL) { // first node in the list LoadProcs = TempNode->Next; ifree((void*)TempNode->Ext); ifree(TempNode); } else { PrevNode->Next = TempNode->Next; ifree((void*)TempNode->Ext); ifree(TempNode); } return IL_TRUE; } PrevNode = TempNode; TempNode = TempNode->Next; } return IL_FALSE; } //! Unregisters a save extension - doesn't have to be called. ILboolean ILAPIENTRY ilRemoveSave(const ILstring Ext) { iFormatS *TempNode = SaveProcs, *PrevNode = NULL; while (TempNode != NULL) { #ifndef _UNICODE if (!stricmp(Ext, TempNode->Ext)) { #else if (_wcsicmp(Ext, TempNode->Ext)) { #endif//_UNICODE if (PrevNode == NULL) { // first node in the list SaveProcs = TempNode->Next; ifree((void*)TempNode->Ext); ifree(TempNode); } else { PrevNode->Next = TempNode->Next; ifree((void*)TempNode->Ext); ifree(TempNode); } return IL_TRUE; } PrevNode = TempNode; TempNode = TempNode->Next; } return IL_FALSE; } // Automatically removes all registered formats. ILvoid ilRemoveRegistered() { iFormatL *TempNodeL = LoadProcs; iFormatS *TempNodeS = SaveProcs; while (LoadProcs != NULL) { TempNodeL = LoadProcs->Next; ifree((void*)LoadProcs->Ext); ifree(LoadProcs); LoadProcs = TempNodeL; } while (SaveProcs != NULL) { TempNodeS = SaveProcs->Next; ifree((void*)SaveProcs->Ext); ifree(SaveProcs); SaveProcs = TempNodeS; } return; } ILboolean iRegisterLoad(const ILstring FileName) { iFormatL *TempNode = LoadProcs; ILstring Ext = iGetExtension(FileName); ILenum Error; if (!Ext) return IL_FALSE; while (TempNode != NULL) { #ifndef _UNICODE if (!stricmp(Ext, TempNode->Ext)) { #else if (_wcsicmp(Ext, TempNode->Ext)) { #endif//_UNICODE Error = TempNode->Load(FileName); if (Error == IL_NO_ERROR || Error == 0) { // 0 and IL_NO_ERROR are both valid. return IL_TRUE; } else { ilSetError(Error); return IL_FALSE; } } TempNode = TempNode->Next; } return IL_FALSE; } ILboolean iRegisterSave(const ILstring FileName) { iFormatS *TempNode = SaveProcs; ILstring Ext = iGetExtension(FileName); ILenum Error; if (!Ext) return IL_FALSE; while (TempNode != NULL) { #ifndef _UNICODE if (!stricmp(Ext, TempNode->Ext)) { #else if (_wcsicmp(Ext, TempNode->Ext)) { #endif//_UNICODE Error = TempNode->Save(FileName); if (Error == IL_NO_ERROR || Error == 0) { // 0 and IL_NO_ERROR are both valid. return IL_TRUE; } else { ilSetError(Error); return IL_FALSE; } } TempNode = TempNode->Next; } return IL_FALSE; } // // "Reporting" functions // ILvoid ILAPIENTRY ilRegisterOrigin(ILenum Origin) { switch (Origin) { case IL_ORIGIN_LOWER_LEFT: case IL_ORIGIN_UPPER_LEFT: iCurImage->Origin = Origin; break; default: ilSetError(IL_INVALID_ENUM); } return; } ILvoid ILAPIENTRY ilRegisterFormat(ILenum Format) { switch (Format) { case IL_COLOUR_INDEX: case IL_RGB: case IL_RGBA: case IL_BGR: case IL_BGRA: case IL_LUMINANCE: case IL_LUMINANCE_ALPHA: iCurImage->Format = Format; break; default: ilSetError(IL_INVALID_ENUM); } return; } ILboolean ILAPIENTRY ilRegisterMipNum(ILuint Num) { ILimage *Next, *Prev; ilBindImage(ilGetCurName()); // Make sure the current image is actually bound. ilCloseImage(iCurImage->Mipmaps); // Close any current mipmaps. iCurImage->Mipmaps = NULL; if (Num == 0) // Just gets rid of all the mipmaps. return IL_TRUE; iCurImage->Mipmaps = ilNewImage(1, 1, 1, 1, 1); if (iCurImage->Mipmaps == NULL) return IL_FALSE; Next = iCurImage->Mipmaps; Num--; while (Num) { Next->Next = ilNewImage(1, 1, 1, 1, 1); if (Next->Next == NULL) { // Clean up before we error out. Prev = iCurImage->Mipmaps; while (Prev) { Next = Prev->Next; ilCloseImage(Prev); Prev = Next; } return IL_FALSE; } Next = Next->Next; Num--; } return IL_TRUE; }