The iff parsing code now accepts SPR# chunks with a "blank sprite", one that has zero dimensions.

This commit is contained in:
Fatbag 2012-05-31 07:38:10 -05:00
parent 31282d91f2
commit ec45a6ce82
3 changed files with 16 additions and 9 deletions

View file

@ -118,6 +118,8 @@ typedef struct IFFSprite_s
uint16_t Width;
uint8_t * IndexData;
uint8_t * BGRA32Data;
uint8_t InvalidDimensions;
} IFFSprite;
typedef struct IFFSpriteList_s

View file

@ -117,11 +117,15 @@ int iff_parse_spr(IFFChunk * ChunkInfo, const uint8_t * Buffer){
if(SpriteSize > b.Size || SpriteSize < 10)
return 0;
}
Sprite->Reserved = read_uint32xe(&b);
Sprite->Height = read_uint16xe(&b);
Sprite->Width = read_uint16xe(&b);
if(Sprite->Reserved != 0 || Sprite->Height == 0 || Sprite->Width == 0 || Sprite->Height > UINT_MAX/Sprite->Width/2)
return 0;
if(Sprite->Reserved != 0 || Sprite->Height == 0 || Sprite->Width == 0 || Sprite->Height > UINT_MAX/Sprite->Width/2){
/* This happens in the third sprite of every SPR# chunk in sprites.iff */
Sprite->InvalidDimensions = 1;
continue;
}
Sprite->IndexData = calloc(Sprite->Height*Sprite->Width, 2);
if(Sprite->IndexData == NULL)
return 0;
@ -229,6 +233,7 @@ int iff_depalette(IFFSprite * Sprite, const IFFPalette * Palette){
uint8_t Index = Sprite->IndexData[2*i + 0];
if(Index >= Palette->ColorCount){
free(Sprite->BGRA32Data);
Sprite->BGRA32Data = NULL;
return 0;
}
Sprite->BGRA32Data[4*i + 0] = Palette->Data[3*Index + 2];

View file

@ -309,13 +309,13 @@ int main(int argc, char *argv[]){
if(!strcmp(ChunkData->Type, "BMP_") || !strcmp(ChunkData->Type, "FBMP")){
size_t Width, Height;
char filename[32];
sprintf(filename, "%simg_%u_%.4x.png", OutDir, c, ChunkData->ChunkID);
sprintf(filename, "%sbmp_%u_%.4x.png", OutDir, c+1, ChunkData->ChunkID);
if(WritePNG(filename, ChunkData, NULL, &Width, &Height)){
fprintf(hFile, "<table class=\"center centerall\">\n");
fprintf(hFile, "<tr><th>Image</th></tr>\n");
fprintf(hFile, "<tr><td><img src=\"img_%u_%.4x.png\" width=\"%u\" height=\"%u\" alt=\"\" /></td></tr>\n",
c, ChunkData->ChunkID, Width, Height);
fprintf(hFile, "<tr><td><img src=\"bmp_%u_%.4x.png\" width=\"%u\" height=\"%u\" alt=\"\" /></td></tr>\n",
c+1, ChunkData->ChunkID, Width, Height);
fprintf(hFile, "</table>\n");
success++;
}
@ -563,14 +563,14 @@ int main(int argc, char *argv[]){
for(i=0; i<SpriteList->SpriteCount; i++){
IFFSprite * Sprite = &SpriteList->Sprites[i];
char filename[32];
sprintf(filename, "%sspr1_%u_%.4x_%u.png", OutDir, c, ChunkData->ChunkID, i+1);
sprintf(filename, "%sspr1_%u_%.4x_%u.png", OutDir, c+1, ChunkData->ChunkID, i+1);
fprintf(hFile, "<tr><td>%u</td><td>", i+1);
if(iff_depalette(Sprite, PaletteData) && WritePNG(filename, NULL, Sprite, NULL, NULL))
if(Sprite->IndexData && iff_depalette(Sprite, PaletteData) && WritePNG(filename, NULL, Sprite, NULL, NULL))
fprintf(hFile, "<img src=\"spr1_%u_%.4x_%u.png\" width=\"%u\" height=\"%u\" alt=\"\" />",
c, ChunkData->ChunkID, i+1, Sprite->Width, Sprite->Height);
c+1, ChunkData->ChunkID, i+1, Sprite->Width, Sprite->Height);
else
fprintf(hFile, "This sprite cannot be displayed.");
fprintf(hFile, Sprite->InvalidDimensions ? "Blank sprite" : "This sprite cannot be displayed.");
fprintf(hFile, "</td></tr>\n");
}
fprintf(hFile, "</table>\n");