| 74 | |
| 75 | |
| 76 | ILboolean iLoadWalInternal() |
| 77 | { |
| 78 | WALHEAD Header; |
| 79 | ILimage *Mipmaps[3], *CurImage; |
| 80 | ILuint i, NewW, NewH; |
| 81 | |
| 82 | if (iCurImage == NULL) { |
| 83 | ilSetError(IL_ILLEGAL_OPERATION); |
| 84 | return IL_FALSE; |
| 85 | } |
| 86 | CurImage = iCurImage; |
| 87 | |
| 88 | |
| 89 | // Read header |
| 90 | iread(&Header.FileName, 1, 32); |
| 91 | Header.Width = GetLittleUInt(); |
| 92 | Header.Height = GetLittleUInt(); |
| 93 | |
| 94 | for (i = 0; i < 4; i++) |
| 95 | Header.Offsets[i] = GetLittleUInt(); |
| 96 | |
| 97 | iread(Header.AnimName, 1, 32); |
| 98 | Header.Flags = GetLittleUInt(); |
| 99 | Header.Contents = GetLittleUInt(); |
| 100 | Header.Value = GetLittleUInt(); |
| 101 | |
| 102 | if (!ilTexImage(Header.Width, Header.Height, 1, 1, IL_COLOUR_INDEX, IL_UNSIGNED_BYTE, NULL)) |
| 103 | return IL_FALSE; |
| 104 | |
| 105 | for (i = 0; i < 3; i++) { |
| 106 | Mipmaps[i] = (ILimage*)icalloc(sizeof(ILimage), 1); |
| 107 | if (Mipmaps[i] == NULL) |
| 108 | goto cleanup_error; |
| 109 | Mipmaps[i]->Pal.Palette = (ILubyte*)ialloc(768); |
| 110 | if (Mipmaps[i]->Pal.Palette == NULL) |
| 111 | goto cleanup_error; |
| 112 | memcpy(Mipmaps[i]->Pal.Palette, ilDefaultQ2Pal, 768); |
| 113 | Mipmaps[i]->Pal.PalType = IL_PAL_RGB24; |
| 114 | } |
| 115 | |
| 116 | NewW = Header.Width; |
| 117 | NewH = Header.Height; |
| 118 | for (i = 0; i < 3; i++) { |
| 119 | NewW /= 2; |
| 120 | NewH /= 2; |
| 121 | iCurImage = Mipmaps[i]; |
| 122 | if (!ilTexImage(NewW, NewH, 1, 1, IL_COLOUR_INDEX, IL_UNSIGNED_BYTE, NULL)) |
| 123 | goto cleanup_error; |
| 124 | // Don't set until now so ilTexImage won't get rid of the palette. |
| 125 | Mipmaps[i]->Pal.PalSize = 768; |
| 126 | Mipmaps[i]->Origin = IL_ORIGIN_UPPER_LEFT; |
| 127 | } |
| 128 | |
| 129 | iCurImage = CurImage; |
| 130 | ilCloseImage(iCurImage->Mipmaps); |
| 131 | iCurImage->Mipmaps = Mipmaps[0]; |
| 132 | Mipmaps[0]->Mipmaps = Mipmaps[1]; |
| 133 | Mipmaps[1]->Mipmaps = Mipmaps[2]; |
no test coverage detected