Loads a Halo formatted palette (.pal) file.
| 293 | |
| 294 | //! Loads a Halo formatted palette (.pal) file. |
| 295 | ILboolean ilLoadHaloPal(ILconst_string FileName) |
| 296 | { |
| 297 | ILHANDLE HaloFile; |
| 298 | HALOHEAD HaloHead; |
| 299 | ILushort *TempPal; |
| 300 | ILuint i, Size; |
| 301 | |
| 302 | if (!iCheckExtension(FileName, IL_TEXT("pal"))) { |
| 303 | ilSetError(IL_INVALID_EXTENSION); |
| 304 | return IL_FALSE; |
| 305 | } |
| 306 | |
| 307 | if (iCurImage == NULL) { |
| 308 | ilSetError(IL_ILLEGAL_OPERATION); |
| 309 | return IL_FALSE; |
| 310 | } |
| 311 | |
| 312 | HaloFile = iopenr(FileName); |
| 313 | if (HaloFile == NULL) { |
| 314 | ilSetError(IL_COULD_NOT_OPEN_FILE); |
| 315 | return IL_FALSE; |
| 316 | } |
| 317 | |
| 318 | if (iread(&HaloHead, sizeof(HALOHEAD), 1) != 1) |
| 319 | return IL_FALSE; |
| 320 | |
| 321 | if (HaloHead.Id != 'A' + ('H' << 8) || HaloHead.Version != 0xe3) { |
| 322 | icloser(HaloFile); |
| 323 | ilSetError(IL_ILLEGAL_FILE_VALUE); |
| 324 | return IL_FALSE; |
| 325 | } |
| 326 | |
| 327 | Size = (HaloHead.MaxIndex + 1) * 3; |
| 328 | TempPal = (ILushort*)ialloc(Size * sizeof(ILushort)); |
| 329 | if (TempPal == NULL) { |
| 330 | icloser(HaloFile); |
| 331 | return IL_FALSE; |
| 332 | } |
| 333 | |
| 334 | if (iread(TempPal, sizeof(ILushort), Size) != Size) { |
| 335 | icloser(HaloFile); |
| 336 | ifree(TempPal); |
| 337 | return IL_FALSE; |
| 338 | } |
| 339 | |
| 340 | if (iCurImage->Pal.Palette && iCurImage->Pal.PalSize > 0 && iCurImage->Pal.PalType != IL_PAL_NONE) { |
| 341 | ifree(iCurImage->Pal.Palette); |
| 342 | iCurImage->Pal.Palette = NULL; |
| 343 | } |
| 344 | iCurImage->Pal.PalType = IL_PAL_RGB24; |
| 345 | iCurImage->Pal.PalSize = Size; |
| 346 | iCurImage->Pal.Palette = (ILubyte*)ialloc(iCurImage->Pal.PalSize); |
| 347 | if (iCurImage->Pal.Palette == NULL) { |
| 348 | icloser(HaloFile); |
| 349 | return IL_FALSE; |
| 350 | } |
| 351 | |
| 352 | for (i = 0; i < iCurImage->Pal.PalSize; i++, TempPal++) { |
no test coverage detected