il_states.c
Upload User: wmy0603
Upload Date: 2022-05-02
Package Size: 1808k
Code Size: 31k
Development Platform:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. //
  3. // ImageLib Sources
  4. // Copyright (C) 2000-2009 by Denton Woods
  5. // Last modified: 03/07/2009
  6. //
  7. // Filename: src-IL/src/il_states.c
  8. //
  9. // Description: State machine
  10. //
  11. //
  12. // 20040223 XIX : now has a ilPngAlphaIndex member, so we can spit out png files with a transparent index, set to -1 for none
  13. //
  14. //-----------------------------------------------------------------------------
  15. #include "il_internal.h"
  16. #include "il_states.h"
  17. #include <stdlib.h>
  18. ILconst_string _ilVendor = IL_TEXT("Abysmal Software");
  19. ILconst_string _ilVersion = IL_TEXT("Developer's Image Library (DevIL) 1.7.8");
  20. char* _ilLoadExt = "" IL_BLP_EXT IL_BMP_EXT IL_CUT_EXT IL_DCX_EXT IL_DDS_EXT
  21. IL_DCM_EXT IL_DPX_EXT IL_EXR_EXT IL_FITS_EXT IL_FTX_EXT
  22. IL_GIF_EXT IL_HDR_EXT IL_ICNS_EXT IL_ICO_EXT IL_IFF_EXT
  23. IL_IWI_EXT IL_JPG_EXT IL_JP2_EXT IL_LIF_EXT IL_MDL_EXT
  24. IL_MNG_EXT IL_MP3_EXT IL_PCD_EXT IL_PCX_EXT IL_PIC_EXT
  25. IL_PIX_EXT IL_PNG_EXT IL_PNM_EXT IL_PSD_EXT IL_PSP_EXT
  26. IL_PXR_EXT IL_RAW_EXT IL_ROT_EXT IL_SGI_EXT IL_SUN_EXT
  27. IL_TEX_EXT IL_TGA_EXT IL_TIFF_EXT IL_TPL_EXT IL_UTX_EXT
  28. IL_VTF_EXT IL_WAL_EXT IL_WDP_EXT IL_XPM_EXT;
  29. char* _ilSaveExt = "" IL_BMP_EXT IL_CHEAD_EXT IL_DDS_EXT IL_EXR_EXT
  30. IL_HDR_EXT IL_JP2_EXT IL_JPG_EXT IL_PCX_EXT
  31. IL_PNG_EXT IL_PNM_EXT IL_PSD_EXT IL_RAW_EXT
  32. IL_SGI_EXT IL_TGA_EXT IL_TIFF_EXT IL_VTF_EXT
  33. IL_WBMP_EXT;
  34. //! Set all states to their defaults.
  35. void ilDefaultStates()
  36. {
  37. ilStates[ilCurrentPos].ilOriginSet = IL_FALSE;
  38. ilStates[ilCurrentPos].ilOriginMode = IL_ORIGIN_LOWER_LEFT;
  39. ilStates[ilCurrentPos].ilFormatSet = IL_FALSE;
  40. ilStates[ilCurrentPos].ilFormatMode = IL_BGRA;
  41. ilStates[ilCurrentPos].ilTypeSet = IL_FALSE;
  42. ilStates[ilCurrentPos].ilTypeMode = IL_UNSIGNED_BYTE;
  43. ilStates[ilCurrentPos].ilOverWriteFiles = IL_FALSE;
  44. ilStates[ilCurrentPos].ilAutoConvPal = IL_FALSE;
  45. ilStates[ilCurrentPos].ilDefaultOnFail = IL_FALSE;
  46. ilStates[ilCurrentPos].ilUseKeyColour = IL_FALSE;
  47. ilStates[ilCurrentPos].ilBlitBlend = IL_TRUE;
  48. ilStates[ilCurrentPos].ilCompression = IL_COMPRESS_ZLIB;
  49. ilStates[ilCurrentPos].ilInterlace = IL_FALSE;
  50. ilStates[ilCurrentPos].ilTgaCreateStamp = IL_FALSE;
  51. ilStates[ilCurrentPos].ilJpgQuality = 99;
  52. ilStates[ilCurrentPos].ilPngInterlace = IL_FALSE;
  53. ilStates[ilCurrentPos].ilTgaRle = IL_FALSE;
  54. ilStates[ilCurrentPos].ilBmpRle = IL_FALSE;
  55. ilStates[ilCurrentPos].ilSgiRle = IL_FALSE;
  56. ilStates[ilCurrentPos].ilJpgFormat = IL_JFIF;
  57. ilStates[ilCurrentPos].ilJpgProgressive = IL_FALSE;
  58. ilStates[ilCurrentPos].ilDxtcFormat = IL_DXT1;
  59. ilStates[ilCurrentPos].ilPcdPicNum = 2;
  60. ilStates[ilCurrentPos].ilPngAlphaIndex = -1;
  61. ilStates[ilCurrentPos].ilTgaId = NULL;
  62. ilStates[ilCurrentPos].ilTgaAuthName = NULL;
  63. ilStates[ilCurrentPos].ilTgaAuthComment = NULL;
  64. ilStates[ilCurrentPos].ilPngAuthName = NULL;
  65. ilStates[ilCurrentPos].ilPngTitle = NULL;
  66. ilStates[ilCurrentPos].ilPngDescription = NULL;
  67. //2003-09-01: added tiff strings
  68. ilStates[ilCurrentPos].ilTifDescription = NULL;
  69. ilStates[ilCurrentPos].ilTifHostComputer = NULL;
  70. ilStates[ilCurrentPos].ilTifDocumentName = NULL;
  71. ilStates[ilCurrentPos].ilTifAuthName = NULL;
  72. ilStates[ilCurrentPos].ilCHeader = NULL;
  73. ilStates[ilCurrentPos].ilQuantMode = IL_WU_QUANT;
  74. ilStates[ilCurrentPos].ilNeuSample = 15;
  75. ilStates[ilCurrentPos].ilQuantMaxIndexs = 256;
  76. ilStates[ilCurrentPos].ilKeepDxtcData = IL_FALSE;
  77. ilStates[ilCurrentPos].ilUseNVidiaDXT = IL_FALSE;
  78. ilStates[ilCurrentPos].ilUseSquishDXT = IL_FALSE;
  79. ilHints.MemVsSpeedHint = IL_FASTEST;
  80. ilHints.CompressHint = IL_USE_COMPRESSION;
  81. while (ilGetError() != IL_NO_ERROR);
  82. return;
  83. }
  84. //! Returns a constant string detailing aspects about this library.
  85. ILconst_string ILAPIENTRY ilGetString(ILenum StringName)
  86. {
  87. switch (StringName)
  88. {
  89. case IL_VENDOR:
  90. return (ILconst_string)_ilVendor;
  91. case IL_VERSION_NUM: //changed 2003-08-30: IL_VERSION changes //switch define ;-)
  92. return (ILconst_string)_ilVersion;
  93. case IL_LOAD_EXT:
  94. return (ILconst_string)_ilLoadExt;
  95. case IL_SAVE_EXT:
  96. return (ILconst_string)_ilSaveExt;
  97. case IL_TGA_ID_STRING:
  98. return (ILconst_string)ilStates[ilCurrentPos].ilTgaId;
  99. case IL_TGA_AUTHNAME_STRING:
  100. return (ILconst_string)ilStates[ilCurrentPos].ilTgaAuthName;
  101. case IL_TGA_AUTHCOMMENT_STRING:
  102. return (ILconst_string)ilStates[ilCurrentPos].ilTgaAuthComment;
  103. case IL_PNG_AUTHNAME_STRING:
  104. return (ILconst_string)ilStates[ilCurrentPos].ilPngAuthName;
  105. case IL_PNG_TITLE_STRING:
  106. return (ILconst_string)ilStates[ilCurrentPos].ilPngTitle;
  107. case IL_PNG_DESCRIPTION_STRING:
  108. return (ILconst_string)ilStates[ilCurrentPos].ilPngDescription;
  109. //2003-08-31: added tif strings
  110. case IL_TIFF_DESCRIPTION_STRING:
  111. return (ILconst_string)ilStates[ilCurrentPos].ilTifDescription;
  112. case IL_TIFF_HOSTCOMPUTER_STRING:
  113. return (ILconst_string)ilStates[ilCurrentPos].ilTifHostComputer;
  114. case IL_TIFF_DOCUMENTNAME_STRING:
  115. return (ILconst_string)ilStates[ilCurrentPos].ilTifDocumentName;
  116. case IL_TIFF_AUTHNAME_STRING:
  117. return (ILconst_string)ilStates[ilCurrentPos].ilTifAuthName;
  118. case IL_CHEAD_HEADER_STRING:
  119. return (ILconst_string)ilStates[ilCurrentPos].ilCHeader;
  120. default:
  121. ilSetError(IL_INVALID_ENUM);
  122. break;
  123. }
  124. return NULL;
  125. }
  126. // Clips a string to a certain length and returns a new string.
  127. char *iClipString(char *String, ILuint MaxLen)
  128. {
  129. char *Clipped;
  130. ILuint Length;
  131. if (String == NULL)
  132. return NULL;
  133. Length = ilCharStrLen(String);  //ilStrLen(String);
  134. Clipped = (char*)ialloc((MaxLen + 1) * sizeof(char) /*sizeof(ILchar)*/);  // Terminating NULL makes it +1.
  135. if (Clipped == NULL) {
  136. return NULL;
  137. }
  138. memcpy(Clipped, String, MaxLen * sizeof(char) /*sizeof(ILchar)*/);
  139. Clipped[Length] = 0;
  140. return Clipped;
  141. }
  142. // Returns format-specific strings, truncated to MaxLen (not counting the terminating NULL).
  143. char *iGetString(ILenum StringName)
  144. {
  145. switch (StringName)
  146. {
  147. case IL_TGA_ID_STRING:
  148. return iClipString(ilStates[ilCurrentPos].ilTgaId, 254);
  149. case IL_TGA_AUTHNAME_STRING:
  150. return iClipString(ilStates[ilCurrentPos].ilTgaAuthName, 40);
  151. case IL_TGA_AUTHCOMMENT_STRING:
  152. return iClipString(ilStates[ilCurrentPos].ilTgaAuthComment, 80);
  153. case IL_PNG_AUTHNAME_STRING:
  154. return iClipString(ilStates[ilCurrentPos].ilPngAuthName, 255);
  155. case IL_PNG_TITLE_STRING:
  156. return iClipString(ilStates[ilCurrentPos].ilPngTitle, 255);
  157. case IL_PNG_DESCRIPTION_STRING:
  158. return iClipString(ilStates[ilCurrentPos].ilPngDescription, 255);
  159. //changed 2003-08-31...here was a serious copy and paste bug ;-)
  160. case IL_TIFF_DESCRIPTION_STRING:
  161. return iClipString(ilStates[ilCurrentPos].ilTifDescription, 255);
  162. case IL_TIFF_HOSTCOMPUTER_STRING:
  163. return iClipString(ilStates[ilCurrentPos].ilTifHostComputer, 255);
  164. case IL_TIFF_DOCUMENTNAME_STRING:
  165. return iClipString(ilStates[ilCurrentPos].ilTifDocumentName, 255);
  166. case IL_TIFF_AUTHNAME_STRING:
  167. return iClipString(ilStates[ilCurrentPos].ilTifAuthName, 255);
  168. case IL_CHEAD_HEADER_STRING:
  169. return iClipString(ilStates[ilCurrentPos].ilCHeader, 32);
  170. default:
  171. ilSetError(IL_INVALID_ENUM);
  172. }
  173. return NULL;
  174. }
  175. //! Enables a mode
  176. ILboolean ILAPIENTRY ilEnable(ILenum Mode)
  177. {
  178. return ilAble(Mode, IL_TRUE);
  179. }
  180. //! Disables a mode
  181. ILboolean ILAPIENTRY ilDisable(ILenum Mode)
  182. {
  183. return ilAble(Mode, IL_FALSE);
  184. }
  185. // Internal function that sets the Mode equal to Flag
  186. ILboolean ilAble(ILenum Mode, ILboolean Flag)
  187. {
  188. switch (Mode)
  189. {
  190. case IL_ORIGIN_SET:
  191. ilStates[ilCurrentPos].ilOriginSet = Flag;
  192. break;
  193. case IL_FORMAT_SET:
  194. ilStates[ilCurrentPos].ilFormatSet = Flag;
  195. break;
  196. case IL_TYPE_SET:
  197. ilStates[ilCurrentPos].ilTypeSet = Flag;
  198. break;
  199. case IL_FILE_OVERWRITE:
  200. ilStates[ilCurrentPos].ilOverWriteFiles = Flag;
  201. break;
  202. case IL_CONV_PAL:
  203. ilStates[ilCurrentPos].ilAutoConvPal = Flag;
  204. break;
  205. case IL_DEFAULT_ON_FAIL:
  206. ilStates[ilCurrentPos].ilDefaultOnFail = Flag;
  207. break;
  208. case IL_USE_KEY_COLOUR:
  209. ilStates[ilCurrentPos].ilUseKeyColour = Flag;
  210. break;
  211. case IL_BLIT_BLEND:
  212. ilStates[ilCurrentPos].ilBlitBlend = Flag;
  213. break;
  214. case IL_SAVE_INTERLACED:
  215. ilStates[ilCurrentPos].ilInterlace = Flag;
  216. break;
  217. case IL_JPG_PROGRESSIVE:
  218. ilStates[ilCurrentPos].ilJpgProgressive = Flag;
  219. break;
  220. case IL_NVIDIA_COMPRESS:
  221. ilStates[ilCurrentPos].ilUseNVidiaDXT = Flag;
  222. break;
  223. case IL_SQUISH_COMPRESS:
  224. ilStates[ilCurrentPos].ilUseSquishDXT = Flag;
  225. break;
  226. default:
  227. ilSetError(IL_INVALID_ENUM);
  228. return IL_FALSE;
  229. }
  230. return IL_TRUE;
  231. }
  232. //! Checks whether the mode is enabled.
  233. ILboolean ILAPIENTRY ilIsEnabled(ILenum Mode)
  234. {
  235. switch (Mode)
  236. {
  237. case IL_ORIGIN_SET:
  238. return ilStates[ilCurrentPos].ilOriginSet;
  239. case IL_FORMAT_SET:
  240. return ilStates[ilCurrentPos].ilFormatSet;
  241. case IL_TYPE_SET:
  242. return ilStates[ilCurrentPos].ilTypeSet;
  243. case IL_FILE_OVERWRITE:
  244. return ilStates[ilCurrentPos].ilOverWriteFiles;
  245. case IL_CONV_PAL:
  246. return ilStates[ilCurrentPos].ilAutoConvPal;
  247. case IL_DEFAULT_ON_FAIL:
  248. return ilStates[ilCurrentPos].ilDefaultOnFail;
  249. case IL_USE_KEY_COLOUR:
  250. return ilStates[ilCurrentPos].ilUseKeyColour;
  251. case IL_BLIT_BLEND:
  252. return ilStates[ilCurrentPos].ilBlitBlend;
  253. case IL_SAVE_INTERLACED:
  254. return ilStates[ilCurrentPos].ilInterlace;
  255. case IL_JPG_PROGRESSIVE:
  256. return ilStates[ilCurrentPos].ilJpgProgressive;
  257. case IL_NVIDIA_COMPRESS:
  258. return ilStates[ilCurrentPos].ilUseNVidiaDXT;
  259. case IL_SQUISH_COMPRESS:
  260. return ilStates[ilCurrentPos].ilUseSquishDXT;
  261. default:
  262. ilSetError(IL_INVALID_ENUM);
  263. }
  264. return IL_FALSE;
  265. }
  266. //! Checks whether the mode is disabled.
  267. ILboolean ILAPIENTRY ilIsDisabled(ILenum Mode)
  268. {
  269. return !ilIsEnabled(Mode);
  270. }
  271. //! Sets Param equal to the current value of the Mode
  272. void ILAPIENTRY ilGetBooleanv(ILenum Mode, ILboolean *Param)
  273. {
  274. if (Param == NULL) {
  275. ilSetError(IL_INVALID_PARAM);
  276. return;
  277. }
  278. *Param = ilGetInteger(Mode);
  279. return;
  280. }
  281. //! Returns the current value of the Mode
  282. ILboolean ILAPIENTRY ilGetBoolean(ILenum Mode)
  283. {
  284. ILboolean Temp;
  285. Temp = IL_FALSE;
  286. ilGetBooleanv(Mode, &Temp);
  287. return Temp;
  288. }
  289. ILimage *iGetBaseImage(void);
  290. //! Internal function to figure out where we are in an image chain.
  291. //@TODO: This may get much more complex with mipmaps under faces, etc.
  292. ILuint iGetActiveNum(ILenum Type)
  293. {
  294. ILimage *BaseImage;
  295. ILuint Num = 0;
  296. if (iCurImage == NULL) {
  297. ilSetError(IL_ILLEGAL_OPERATION);
  298. return 0;
  299. }
  300. BaseImage = iGetBaseImage();
  301. if (BaseImage == iCurImage)
  302. return 0;
  303. switch (Type)
  304. {
  305. case IL_ACTIVE_IMAGE:
  306. BaseImage = BaseImage->Next;
  307. do {
  308. if (BaseImage == NULL)
  309. return 0;
  310. Num++;
  311. if (BaseImage == iCurImage)
  312. return Num;
  313. } while ((BaseImage = BaseImage->Next));
  314. break;
  315. case IL_ACTIVE_MIPMAP:
  316. BaseImage = BaseImage->Mipmaps;
  317. do {
  318. if (BaseImage == NULL)
  319. return 0;
  320. Num++;
  321. if (BaseImage == iCurImage)
  322. return Num;
  323. } while ((BaseImage = BaseImage->Mipmaps));
  324. break;
  325. case IL_ACTIVE_LAYER:
  326. BaseImage = BaseImage->Layers;
  327. do {
  328. if (BaseImage == NULL)
  329. return 0;
  330. Num++;
  331. if (BaseImage == iCurImage)
  332. return Num;
  333. } while ((BaseImage = BaseImage->Layers));
  334. break;
  335. case IL_ACTIVE_FACE:
  336. BaseImage = BaseImage->Faces;
  337. do {
  338. if (BaseImage == NULL)
  339. return 0;
  340. Num++;
  341. if (BaseImage == iCurImage)
  342. return Num;
  343. } while ((BaseImage = BaseImage->Faces));
  344. break;
  345. }
  346. //@TODO: Any error needed here?
  347. return 0;
  348. }
  349. //! Sets Param equal to the current value of the Mode
  350. void ILAPIENTRY ilGetIntegerv(ILenum Mode, ILint *Param)
  351. {
  352. if (Param == NULL) {
  353. ilSetError(IL_INVALID_PARAM);
  354. return;
  355. }
  356. *Param = 0;
  357. switch (Mode) {
  358. // Integer values
  359. case IL_COMPRESS_MODE:
  360. *Param = ilStates[ilCurrentPos].ilCompression;
  361. break;
  362. case IL_CUR_IMAGE:
  363. if (iCurImage == NULL) {
  364. ilSetError(IL_ILLEGAL_OPERATION);
  365. break;
  366. }
  367. *Param = ilGetCurName();
  368. break;
  369. case IL_FORMAT_MODE:
  370. *Param = ilStates[ilCurrentPos].ilFormatMode;
  371. break;
  372. case IL_INTERLACE_MODE:
  373. *Param = ilStates[ilCurrentPos].ilInterlace;
  374. break;
  375. case IL_KEEP_DXTC_DATA:
  376. *Param = ilStates[ilCurrentPos].ilKeepDxtcData;
  377. break;
  378. case IL_ORIGIN_MODE:
  379. *Param = ilStates[ilCurrentPos].ilOriginMode;
  380. break;
  381. case IL_MAX_QUANT_INDICES:
  382. *Param = ilStates[ilCurrentPos].ilQuantMaxIndexs;
  383. break;
  384. case IL_NEU_QUANT_SAMPLE:
  385. *Param = ilStates[ilCurrentPos].ilNeuSample;
  386. break;
  387. case IL_QUANTIZATION_MODE:
  388. *Param = ilStates[ilCurrentPos].ilQuantMode;
  389. break;
  390. case IL_TYPE_MODE:
  391. *Param = ilStates[ilCurrentPos].ilTypeMode;
  392. break;
  393. case IL_VERSION_NUM:
  394. *Param = IL_VERSION;
  395. break;
  396. // Image specific values
  397. case IL_ACTIVE_IMAGE:
  398. case IL_ACTIVE_MIPMAP:
  399. case IL_ACTIVE_LAYER:
  400. *Param = iGetActiveNum(Mode);
  401. break;
  402. // Format-specific values
  403. case IL_BMP_RLE:
  404. *Param = ilStates[ilCurrentPos].ilBmpRle;
  405. break;
  406. case IL_DXTC_FORMAT:
  407. *Param = ilStates[ilCurrentPos].ilDxtcFormat;
  408. break;
  409. case IL_JPG_QUALITY:
  410. *Param = ilStates[ilCurrentPos].ilJpgQuality;
  411. break;
  412. case IL_JPG_SAVE_FORMAT:
  413. *Param = ilStates[ilCurrentPos].ilJpgFormat;
  414. break;
  415. case IL_PCD_PICNUM:
  416. *Param = ilStates[ilCurrentPos].ilPcdPicNum;
  417. break;
  418. case IL_PNG_ALPHA_INDEX:
  419. *Param = ilStates[ilCurrentPos].ilPngAlphaIndex;
  420. break;
  421. case IL_PNG_INTERLACE:
  422. *Param = ilStates[ilCurrentPos].ilPngInterlace;
  423. break;
  424. case IL_SGI_RLE:
  425. *Param = ilStates[ilCurrentPos].ilSgiRle;
  426. break;
  427. case IL_TGA_CREATE_STAMP:
  428. *Param = ilStates[ilCurrentPos].ilTgaCreateStamp;
  429. break;
  430. case IL_TGA_RLE:
  431. *Param = ilStates[ilCurrentPos].ilTgaRle;
  432. break;
  433. // Boolean values
  434. case IL_CONV_PAL:
  435. *Param = ilStates[ilCurrentPos].ilAutoConvPal;
  436. break;
  437. case IL_DEFAULT_ON_FAIL:
  438. *Param = ilStates[ilCurrentPos].ilDefaultOnFail;
  439. break;
  440. case IL_FILE_MODE:
  441. *Param = ilStates[ilCurrentPos].ilOverWriteFiles;
  442. break;
  443. case IL_FORMAT_SET:
  444. *Param = ilStates[ilCurrentPos].ilFormatSet;
  445. break;
  446. case IL_ORIGIN_SET:
  447. *Param = ilStates[ilCurrentPos].ilOriginSet;
  448. break;
  449. case IL_TYPE_SET:
  450. *Param = ilStates[ilCurrentPos].ilTypeSet;
  451. break;
  452. case IL_USE_KEY_COLOUR:
  453. *Param = ilStates[ilCurrentPos].ilUseKeyColour;
  454. break;
  455. case IL_BLIT_BLEND:
  456. *Param = ilStates[ilCurrentPos].ilBlitBlend;
  457. break;
  458. case IL_JPG_PROGRESSIVE:
  459. *Param = ilStates[ilCurrentPos].ilJpgProgressive;
  460. break;
  461. case IL_NVIDIA_COMPRESS:
  462. *Param = ilStates[ilCurrentPos].ilUseNVidiaDXT;
  463. break;
  464. case IL_SQUISH_COMPRESS:
  465. *Param = ilStates[ilCurrentPos].ilUseSquishDXT;
  466. break;
  467. default:
  468.             iGetIntegervImage(iCurImage, Mode, Param);
  469. }
  470. return;
  471. }
  472. //@TODO rename to ilGetImageIntegerv for 1.6.9 and make it public
  473. //! Sets Param equal to the current value of the Mode
  474. void ILAPIENTRY iGetIntegervImage(ILimage *Image, ILenum Mode, ILint *Param)
  475. {
  476.     ILimage *SubImage;
  477.     if (Image == NULL) {
  478.         ilSetError(IL_ILLEGAL_OPERATION);
  479.         return;
  480.     }
  481.     if (Param == NULL) {
  482.         ilSetError(IL_INVALID_PARAM);
  483.         return;
  484.     }
  485.     *Param = 0;
  486.     switch (Mode)
  487.     {
  488.         case IL_DXTC_DATA_FORMAT:
  489.             if (Image->DxtcData == NULL || Image->DxtcSize == 0) {
  490.                  *Param = IL_DXT_NO_COMP;
  491.                  break;
  492.             }
  493.             *Param = Image->DxtcFormat;
  494.             break;
  495.             ////
  496.         case IL_IMAGE_BITS_PER_PIXEL:
  497.             //changed 20040610 to channel count (Bpp) times Bytes per channel
  498.             *Param = (Image->Bpp << 3)*Image->Bpc;
  499.             break;
  500.         case IL_IMAGE_BYTES_PER_PIXEL:
  501.             //changed 20040610 to channel count (Bpp) times Bytes per channel
  502.             *Param = Image->Bpp*Image->Bpc;
  503.             break;
  504.         case IL_IMAGE_BPC:
  505.             *Param = Image->Bpc;
  506.             break;
  507.         case IL_IMAGE_CHANNELS:
  508.             *Param = Image->Bpp;
  509.             break;
  510.         case IL_IMAGE_CUBEFLAGS:
  511.             *Param = Image->CubeFlags;
  512.             break;
  513.         case IL_IMAGE_DEPTH:
  514.             *Param = Image->Depth;
  515.             break;
  516.         case IL_IMAGE_DURATION:
  517.             *Param = Image->Duration;
  518.             break;
  519.         case IL_IMAGE_FORMAT:
  520.             *Param = Image->Format;
  521.             break;
  522.         case IL_IMAGE_HEIGHT:
  523.             *Param = Image->Height;
  524.             break;
  525.         case IL_IMAGE_SIZE_OF_DATA:
  526.             *Param = Image->SizeOfData;
  527.             break;
  528.         case IL_IMAGE_OFFX:
  529.             *Param = Image->OffX;
  530.             break;
  531.         case IL_IMAGE_OFFY:
  532.             *Param = Image->OffY;
  533.             break;
  534.         case IL_IMAGE_ORIGIN:
  535.             *Param = Image->Origin;
  536.             break;
  537.         case IL_IMAGE_PLANESIZE:
  538.             *Param = Image->SizeOfPlane;
  539.             break;
  540.         case IL_IMAGE_TYPE:
  541.             *Param = Image->Type;
  542.             break;
  543.         case IL_IMAGE_WIDTH:
  544.             *Param = Image->Width;
  545.             break;
  546.         case IL_NUM_FACES:
  547.             for (SubImage = Image->Faces; SubImage; SubImage = SubImage->Faces)
  548.                 (*Param)++;
  549.             break;
  550.         case IL_NUM_IMAGES:
  551.             for (SubImage = Image->Next; SubImage; SubImage = SubImage->Next)
  552.                 (*Param)++;
  553.             break;
  554.         case IL_NUM_LAYERS:
  555.             for (SubImage = Image->Layers; SubImage; SubImage = SubImage->Layers)
  556.                 (*Param)++;
  557.             break;
  558.         case IL_NUM_MIPMAPS:
  559. for (SubImage = Image->Mipmaps; SubImage; SubImage = SubImage->Mipmaps)
  560.                 (*Param)++;
  561.             break;
  562.         case IL_PALETTE_TYPE:
  563.              *Param = Image->Pal.PalType;
  564.              break;
  565.         case IL_PALETTE_BPP:
  566.              *Param = ilGetBppPal(Image->Pal.PalType);
  567.              break;
  568.         case IL_PALETTE_NUM_COLS:
  569.              if (!Image->Pal.Palette || !Image->Pal.PalSize || Image->Pal.PalType == IL_PAL_NONE)
  570.                   *Param = 0;
  571.              else
  572.                   *Param = Image->Pal.PalSize / ilGetBppPal(Image->Pal.PalType);
  573.              break;
  574.         case IL_PALETTE_BASE_TYPE:
  575.              switch (Image->Pal.PalType)
  576.              {
  577.                   case IL_PAL_RGB24:
  578.                       *Param = IL_RGB;
  579.       break;
  580.                   case IL_PAL_RGB32:
  581.                       *Param = IL_RGBA; // Not sure
  582.       break;
  583.                   case IL_PAL_RGBA32:
  584.                       *Param = IL_RGBA;
  585.       break;
  586.                   case IL_PAL_BGR24:
  587.                       *Param = IL_BGR;
  588.       break;
  589.                   case IL_PAL_BGR32:
  590.                       *Param = IL_BGRA; // Not sure
  591.       break;
  592.                   case IL_PAL_BGRA32:
  593.                       *Param = IL_BGRA;
  594.       break;
  595.              }
  596.              break;
  597.         default:
  598.              ilSetError(IL_INVALID_ENUM);
  599.     }
  600. }
  601. //! Returns the current value of the Mode
  602. ILint ILAPIENTRY ilGetInteger(ILenum Mode)
  603. {
  604. ILint Temp;
  605. Temp = 0;
  606. ilGetIntegerv(Mode, &Temp);
  607. return Temp;
  608. }
  609. //! Sets the default origin to be used.
  610. ILboolean ILAPIENTRY ilOriginFunc(ILenum Mode)
  611. {
  612. switch (Mode)
  613. {
  614. case IL_ORIGIN_LOWER_LEFT:
  615. case IL_ORIGIN_UPPER_LEFT:
  616. ilStates[ilCurrentPos].ilOriginMode = Mode;
  617. break;
  618. default:
  619. ilSetError(IL_INVALID_PARAM);
  620. return IL_FALSE;
  621. }
  622. return IL_TRUE;
  623. }
  624. //! Sets the default format to be used.
  625. ILboolean ILAPIENTRY ilFormatFunc(ILenum Mode)
  626. {
  627. switch (Mode)
  628. {
  629. //case IL_COLOUR_INDEX:
  630. case IL_RGB:
  631. case IL_RGBA:
  632. case IL_BGR:
  633. case IL_BGRA:
  634. case IL_LUMINANCE:
  635. case IL_LUMINANCE_ALPHA:
  636. ilStates[ilCurrentPos].ilFormatMode = Mode;
  637. break;
  638. default:
  639. ilSetError(IL_INVALID_PARAM);
  640. return IL_FALSE;
  641. }
  642. return IL_TRUE;
  643. }
  644. //! Sets the default type to be used.
  645. ILboolean ILAPIENTRY ilTypeFunc(ILenum Mode)
  646. {
  647. switch (Mode)
  648. {
  649. case IL_BYTE:
  650. case IL_UNSIGNED_BYTE:
  651. case IL_SHORT:
  652. case IL_UNSIGNED_SHORT:
  653. case IL_INT:
  654. case IL_UNSIGNED_INT:
  655. case IL_FLOAT:
  656. case IL_DOUBLE:
  657. ilStates[ilCurrentPos].ilTypeMode = Mode;
  658. break;
  659. default:
  660. ilSetError(IL_INVALID_PARAM);
  661. return IL_FALSE;
  662. }
  663. return IL_TRUE;
  664. }
  665. ILboolean ILAPIENTRY ilCompressFunc(ILenum Mode)
  666. {
  667. switch (Mode)
  668. {
  669. case IL_COMPRESS_NONE:
  670. case IL_COMPRESS_RLE:
  671. //case IL_COMPRESS_LZO:
  672. case IL_COMPRESS_ZLIB:
  673. ilStates[ilCurrentPos].ilCompression = Mode;
  674. break;
  675. default:
  676. ilSetError(IL_INVALID_PARAM);
  677. return IL_FALSE;
  678. }
  679. return IL_TRUE;
  680. }
  681. //! Pushes the states indicated by Bits onto the state stack
  682. void ILAPIENTRY ilPushAttrib(ILuint Bits)
  683. {
  684. // Should we check here to see if ilCurrentPos is negative?
  685. if (ilCurrentPos >= IL_ATTRIB_STACK_MAX - 1) {
  686. ilCurrentPos = IL_ATTRIB_STACK_MAX - 1;
  687. ilSetError(IL_STACK_OVERFLOW);
  688. return;
  689. }
  690. ilCurrentPos++;
  691. // memcpy(&ilStates[ilCurrentPos], &ilStates[ilCurrentPos - 1], sizeof(IL_STATES));
  692. ilDefaultStates();
  693. if (Bits & IL_ORIGIN_BIT) {
  694. ilStates[ilCurrentPos].ilOriginMode = ilStates[ilCurrentPos-1].ilOriginMode;
  695. ilStates[ilCurrentPos].ilOriginSet  = ilStates[ilCurrentPos-1].ilOriginSet;
  696. }
  697. if (Bits & IL_FORMAT_BIT) {
  698. ilStates[ilCurrentPos].ilFormatMode = ilStates[ilCurrentPos-1].ilFormatMode;
  699. ilStates[ilCurrentPos].ilFormatSet  = ilStates[ilCurrentPos-1].ilFormatSet;
  700. }
  701. if (Bits & IL_TYPE_BIT) {
  702. ilStates[ilCurrentPos].ilTypeMode = ilStates[ilCurrentPos-1].ilTypeMode;
  703. ilStates[ilCurrentPos].ilTypeSet  = ilStates[ilCurrentPos-1].ilTypeSet;
  704. }
  705. if (Bits & IL_FILE_BIT) {
  706. ilStates[ilCurrentPos].ilOverWriteFiles = ilStates[ilCurrentPos-1].ilOverWriteFiles;
  707. }
  708. if (Bits & IL_PAL_BIT) {
  709. ilStates[ilCurrentPos].ilAutoConvPal = ilStates[ilCurrentPos-1].ilAutoConvPal;
  710. }
  711. if (Bits & IL_LOADFAIL_BIT) {
  712. ilStates[ilCurrentPos].ilDefaultOnFail = ilStates[ilCurrentPos-1].ilDefaultOnFail;
  713. }
  714. if (Bits & IL_COMPRESS_BIT) {
  715. ilStates[ilCurrentPos].ilCompression = ilStates[ilCurrentPos-1].ilCompression;
  716. }
  717. if (Bits & IL_FORMAT_SPECIFIC_BIT) {
  718. ilStates[ilCurrentPos].ilTgaCreateStamp = ilStates[ilCurrentPos-1].ilTgaCreateStamp;
  719. ilStates[ilCurrentPos].ilJpgQuality = ilStates[ilCurrentPos-1].ilJpgQuality;
  720. ilStates[ilCurrentPos].ilPngInterlace = ilStates[ilCurrentPos-1].ilPngInterlace;
  721. ilStates[ilCurrentPos].ilTgaRle = ilStates[ilCurrentPos-1].ilTgaRle;
  722. ilStates[ilCurrentPos].ilBmpRle = ilStates[ilCurrentPos-1].ilBmpRle;
  723. ilStates[ilCurrentPos].ilSgiRle = ilStates[ilCurrentPos-1].ilSgiRle;
  724. ilStates[ilCurrentPos].ilJpgFormat = ilStates[ilCurrentPos-1].ilJpgFormat;
  725. ilStates[ilCurrentPos].ilDxtcFormat = ilStates[ilCurrentPos-1].ilDxtcFormat;
  726. ilStates[ilCurrentPos].ilPcdPicNum = ilStates[ilCurrentPos-1].ilPcdPicNum;
  727. ilStates[ilCurrentPos].ilPngAlphaIndex = ilStates[ilCurrentPos-1].ilPngAlphaIndex;
  728. // Strings
  729. if (ilStates[ilCurrentPos].ilTgaId)
  730. ifree(ilStates[ilCurrentPos].ilTgaId);
  731. if (ilStates[ilCurrentPos].ilTgaAuthName)
  732. ifree(ilStates[ilCurrentPos].ilTgaAuthName);
  733. if (ilStates[ilCurrentPos].ilTgaAuthComment)
  734. ifree(ilStates[ilCurrentPos].ilTgaAuthComment);
  735. if (ilStates[ilCurrentPos].ilPngAuthName)
  736. ifree(ilStates[ilCurrentPos].ilPngAuthName);
  737. if (ilStates[ilCurrentPos].ilPngTitle)
  738. ifree(ilStates[ilCurrentPos].ilPngTitle);
  739. if (ilStates[ilCurrentPos].ilPngDescription)
  740. ifree(ilStates[ilCurrentPos].ilPngDescription);
  741. //2003-09-01: added tif strings
  742. if (ilStates[ilCurrentPos].ilTifDescription)
  743. ifree(ilStates[ilCurrentPos].ilTifDescription);
  744. if (ilStates[ilCurrentPos].ilTifHostComputer)
  745. ifree(ilStates[ilCurrentPos].ilTifHostComputer);
  746. if (ilStates[ilCurrentPos].ilTifDocumentName)
  747. ifree(ilStates[ilCurrentPos].ilTifDocumentName);
  748. if (ilStates[ilCurrentPos].ilTifAuthName)
  749. ifree(ilStates[ilCurrentPos].ilTifAuthName);
  750. if (ilStates[ilCurrentPos].ilCHeader)
  751. ifree(ilStates[ilCurrentPos].ilCHeader);
  752. ilStates[ilCurrentPos].ilTgaId = strdup(ilStates[ilCurrentPos-1].ilTgaId);
  753. ilStates[ilCurrentPos].ilTgaAuthName = strdup(ilStates[ilCurrentPos-1].ilTgaAuthName);
  754. ilStates[ilCurrentPos].ilTgaAuthComment = strdup(ilStates[ilCurrentPos-1].ilTgaAuthComment);
  755. ilStates[ilCurrentPos].ilPngAuthName = strdup(ilStates[ilCurrentPos-1].ilPngAuthName);
  756. ilStates[ilCurrentPos].ilPngTitle = strdup(ilStates[ilCurrentPos-1].ilPngTitle);
  757. ilStates[ilCurrentPos].ilPngDescription = strdup(ilStates[ilCurrentPos-1].ilPngDescription);
  758. //2003-09-01: added tif strings
  759. ilStates[ilCurrentPos].ilTifDescription = strdup(ilStates[ilCurrentPos-1].ilTifDescription);
  760. ilStates[ilCurrentPos].ilTifHostComputer = strdup(ilStates[ilCurrentPos-1].ilTifHostComputer);
  761. ilStates[ilCurrentPos].ilTifDocumentName = strdup(ilStates[ilCurrentPos-1].ilTifDocumentName);
  762. ilStates[ilCurrentPos].ilTifAuthName = strdup(ilStates[ilCurrentPos-1].ilTifAuthName);
  763. ilStates[ilCurrentPos].ilCHeader = strdup(ilStates[ilCurrentPos-1].ilCHeader);
  764. }
  765. return;
  766. }
  767. // @TODO:  Find out how this affects strings!!!
  768. //! Pops the last entry off the state stack into the current states
  769. void ILAPIENTRY ilPopAttrib()
  770. {
  771. if (ilCurrentPos <= 0) {
  772. ilCurrentPos = 0;
  773. ilSetError(IL_STACK_UNDERFLOW);
  774. return;
  775. }
  776. // Should we check here to see if ilCurrentPos is too large?
  777. ilCurrentPos--;
  778. return;
  779. }
  780. //! Specifies implementation-dependent performance hints
  781. void ILAPIENTRY ilHint(ILenum Target, ILenum Mode)
  782. {
  783. switch (Target)
  784. {
  785. case IL_MEM_SPEED_HINT:
  786. switch (Mode)
  787. {
  788. case IL_FASTEST:
  789. ilHints.MemVsSpeedHint = Mode;
  790. break;
  791. case IL_LESS_MEM:
  792. ilHints.MemVsSpeedHint = Mode;
  793. break;
  794. case IL_DONT_CARE:
  795. ilHints.MemVsSpeedHint = IL_FASTEST;
  796. break;
  797. default:
  798. ilSetError(IL_INVALID_ENUM);
  799. return;
  800. }
  801. break;
  802. case IL_COMPRESSION_HINT:
  803. switch (Mode)
  804. {
  805. case IL_USE_COMPRESSION:
  806. ilHints.CompressHint = Mode;
  807. break;
  808. case IL_NO_COMPRESSION:
  809. ilHints.CompressHint = Mode;
  810. break;
  811. case IL_DONT_CARE:
  812. ilHints.CompressHint = IL_NO_COMPRESSION;
  813. break;
  814. default:
  815. ilSetError(IL_INVALID_ENUM);
  816. return;
  817. }
  818. break;
  819. default:
  820. ilSetError(IL_INVALID_ENUM);
  821. return;
  822. }
  823. return;
  824. }
  825. ILenum iGetHint(ILenum Target)
  826. {
  827. switch (Target)
  828. {
  829. case IL_MEM_SPEED_HINT:
  830. return ilHints.MemVsSpeedHint;
  831. case IL_COMPRESSION_HINT:
  832. return ilHints.CompressHint;
  833. default:
  834. ilSetError(IL_INTERNAL_ERROR);
  835. return 0;
  836. }
  837. }
  838. void ILAPIENTRY ilSetString(ILenum Mode, const char *String)
  839. {
  840. if (String == NULL) {
  841. ilSetError(IL_INVALID_PARAM);
  842. return;
  843. }
  844. switch (Mode)
  845. {
  846. case IL_TGA_ID_STRING:
  847. if (ilStates[ilCurrentPos].ilTgaId)
  848. ifree(ilStates[ilCurrentPos].ilTgaId);
  849. ilStates[ilCurrentPos].ilTgaId = strdup(String);
  850. break;
  851. case IL_TGA_AUTHNAME_STRING:
  852. if (ilStates[ilCurrentPos].ilTgaAuthName)
  853. ifree(ilStates[ilCurrentPos].ilTgaAuthName);
  854. ilStates[ilCurrentPos].ilTgaAuthName = strdup(String);
  855. break;
  856. case IL_TGA_AUTHCOMMENT_STRING:
  857. if (ilStates[ilCurrentPos].ilTgaAuthComment)
  858. ifree(ilStates[ilCurrentPos].ilTgaAuthComment);
  859. ilStates[ilCurrentPos].ilTgaAuthComment = strdup(String);
  860. break;
  861. case IL_PNG_AUTHNAME_STRING:
  862. if (ilStates[ilCurrentPos].ilPngAuthName)
  863. ifree(ilStates[ilCurrentPos].ilPngAuthName);
  864. ilStates[ilCurrentPos].ilPngAuthName = strdup(String);
  865. break;
  866. case IL_PNG_TITLE_STRING:
  867. if (ilStates[ilCurrentPos].ilPngTitle)
  868. ifree(ilStates[ilCurrentPos].ilPngTitle);
  869. ilStates[ilCurrentPos].ilPngTitle = strdup(String);
  870. break;
  871. case IL_PNG_DESCRIPTION_STRING:
  872. if (ilStates[ilCurrentPos].ilPngDescription)
  873. ifree(ilStates[ilCurrentPos].ilPngDescription);
  874. ilStates[ilCurrentPos].ilPngDescription = strdup(String);
  875. break;
  876. //2003-09-01: added tif strings
  877. case IL_TIFF_DESCRIPTION_STRING:
  878. if (ilStates[ilCurrentPos].ilTifDescription)
  879. ifree(ilStates[ilCurrentPos].ilTifDescription);
  880. ilStates[ilCurrentPos].ilTifDescription = strdup(String);
  881. break;
  882. case IL_TIFF_HOSTCOMPUTER_STRING:
  883. if (ilStates[ilCurrentPos].ilTifHostComputer)
  884. ifree(ilStates[ilCurrentPos].ilTifHostComputer);
  885. ilStates[ilCurrentPos].ilTifHostComputer = strdup(String);
  886. break;
  887. case IL_TIFF_DOCUMENTNAME_STRING:
  888. if (ilStates[ilCurrentPos].ilTifDocumentName)
  889. ifree(ilStates[ilCurrentPos].ilTifDocumentName);
  890. ilStates[ilCurrentPos].ilTifDocumentName = strdup(String);
  891. break;
  892. case IL_TIFF_AUTHNAME_STRING:
  893. if (ilStates[ilCurrentPos].ilTifAuthName)
  894. ifree(ilStates[ilCurrentPos].ilTifAuthName);
  895. ilStates[ilCurrentPos].ilTifAuthName = strdup(String);
  896. break;
  897. case IL_CHEAD_HEADER_STRING:
  898. if (ilStates[ilCurrentPos].ilCHeader)
  899. ifree(ilStates[ilCurrentPos].ilCHeader);
  900. ilStates[ilCurrentPos].ilCHeader = strdup(String);
  901. break;
  902. default:
  903. ilSetError(IL_INVALID_ENUM);
  904. }
  905. return;
  906. }
  907. void ILAPIENTRY ilSetInteger(ILenum Mode, ILint Param)
  908. {
  909. LOG_ADVANCED(IL_LOG_INFO, "ilInteger %u set to %d", Mode, Param);
  910. switch (Mode)
  911. {
  912. // Integer values
  913. case IL_FORMAT_MODE:
  914. ilFormatFunc(Param);
  915. return;
  916. case IL_KEEP_DXTC_DATA:
  917. if (Param == IL_FALSE || Param == IL_TRUE) {
  918. ilStates[ilCurrentPos].ilKeepDxtcData = Param;
  919. return;
  920. }
  921. break;
  922. case IL_MAX_QUANT_INDICES:
  923. if (Param >= 2 && Param <= 256) {
  924. ilStates[ilCurrentPos].ilQuantMaxIndexs = Param;
  925. return;
  926. }
  927. break;
  928. case IL_NEU_QUANT_SAMPLE:
  929. if (Param >= 1 && Param <= 30) {
  930. ilStates[ilCurrentPos].ilNeuSample = Param;
  931. return;
  932. }
  933. break;
  934. case IL_ORIGIN_MODE:
  935. ilOriginFunc(Param);
  936. return;
  937. case IL_QUANTIZATION_MODE:
  938. if (Param == IL_WU_QUANT || Param == IL_NEU_QUANT) {
  939. ilStates[ilCurrentPos].ilQuantMode = Param;
  940. return;
  941. }
  942. break;
  943. case IL_TYPE_MODE:
  944. ilTypeFunc(Param);
  945. return;
  946. // Image specific values
  947. case IL_IMAGE_DURATION:
  948. if (iCurImage == NULL) {
  949. ilSetError(IL_ILLEGAL_OPERATION);
  950. break;
  951. }
  952. iCurImage->Duration = Param;
  953. return;
  954. case IL_IMAGE_OFFX:
  955. if (iCurImage == NULL) {
  956. ilSetError(IL_ILLEGAL_OPERATION);
  957. break;
  958. }
  959. iCurImage->OffX = Param;
  960. return;
  961. case IL_IMAGE_OFFY:
  962. if (iCurImage == NULL) {
  963. ilSetError(IL_ILLEGAL_OPERATION);
  964. break;
  965. }
  966. iCurImage->OffY = Param;
  967. return;
  968. case IL_IMAGE_CUBEFLAGS:
  969. if (iCurImage == NULL) {
  970. ilSetError(IL_ILLEGAL_OPERATION);
  971. break;
  972. }
  973. iCurImage->CubeFlags = Param;
  974. break;
  975.  
  976. // Format specific values
  977. case IL_BMP_RLE:
  978. if (Param == IL_FALSE || Param == IL_TRUE) {
  979. ilStates[ilCurrentPos].ilBmpRle = Param;
  980. return;
  981. }
  982. break;
  983. case IL_DXTC_FORMAT:
  984. if (Param >= IL_DXT1 || Param <= IL_DXT5 || Param == IL_DXT1A) {
  985. ilStates[ilCurrentPos].ilDxtcFormat = Param;
  986. return;
  987. }
  988. break;
  989. case IL_JPG_SAVE_FORMAT:
  990. if (Param == IL_JFIF || Param == IL_EXIF) {
  991. ilStates[ilCurrentPos].ilJpgFormat = Param;
  992. return;
  993. }
  994. break;
  995. case IL_JPG_QUALITY:
  996. if (Param >= 0 && Param <= 99) {
  997. ilStates[ilCurrentPos].ilJpgQuality = Param;
  998. return;
  999. }
  1000. break;
  1001. case IL_PNG_INTERLACE:
  1002. if (Param == IL_FALSE || Param == IL_TRUE) {
  1003. ilStates[ilCurrentPos].ilPngInterlace = Param;
  1004. return;
  1005. }
  1006. break;
  1007. case IL_PCD_PICNUM:
  1008. if (Param >= 0 || Param <= 2) {
  1009. ilStates[ilCurrentPos].ilPcdPicNum = Param;
  1010. return;
  1011. }
  1012. break;
  1013. case IL_PNG_ALPHA_INDEX:
  1014. if (Param >= -1 || Param <= 255) {
  1015. ilStates[ilCurrentPos].ilPngAlphaIndex=Param;
  1016. return;
  1017. }
  1018. break;
  1019. case IL_SGI_RLE:
  1020. if (Param == IL_FALSE || Param == IL_TRUE) {
  1021. ilStates[ilCurrentPos].ilSgiRle = Param;
  1022. return;
  1023. }
  1024. break;
  1025. case IL_TGA_CREATE_STAMP:
  1026. if (Param == IL_FALSE || Param == IL_TRUE) {
  1027. ilStates[ilCurrentPos].ilTgaCreateStamp = Param;
  1028. return;
  1029. }
  1030. break;
  1031. case IL_TGA_RLE:
  1032. if (Param == IL_FALSE || Param == IL_TRUE) {
  1033. ilStates[ilCurrentPos].ilTgaRle = Param;
  1034. return;
  1035. }
  1036. break;
  1037. default:
  1038. ilSetError(IL_INVALID_ENUM);
  1039. return;
  1040. }
  1041. ilSetError(IL_INVALID_PARAM);  // Parameter not in valid bounds.
  1042. return;
  1043. }
  1044. ILint iGetInt(ILenum Mode)
  1045. {
  1046. //like ilGetInteger(), but sets another error on failure
  1047. //call ilGetIntegerv() for more robust code
  1048. ILenum err;
  1049. ILint r = -1;
  1050. ilGetIntegerv(Mode, &r);
  1051. //check if an error occured, set another error
  1052. err = ilGetError();
  1053. if (r == -1 && err == IL_INVALID_ENUM)
  1054. ilSetError(IL_INTERNAL_ERROR);
  1055. else
  1056. ilSetError(err); //restore error
  1057. return r;
  1058. }