gifanalyzer: decode Graphic Control Extension

This commit is contained in:
Thomas Bernard 2018-01-30 15:05:23 +01:00
parent 0f780f1e3f
commit 6bfb34fd19

View File

@ -26,11 +26,12 @@
static void read_image(FILE * theFile); static void read_image(FILE * theFile);
static void read_palette(FILE * theFile, int count); static void read_palette(FILE * theFile, int count);
static void read_extension(FILE * theFile);
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
FILE* theFile; FILE* theFile;
uint8_t buffer[256]; uint8_t buffer[8];
uint16_t w,h; uint16_t w,h;
if(argc < 2) if(argc < 2)
@ -78,19 +79,27 @@ int main(int argc, char* argv[])
printf("Color palette:\n"); printf("Color palette:\n");
read_palette(theFile, color_table_size); read_palette(theFile, color_table_size);
int i = 0; while (fread(buffer,1,1,theFile) == 1)
do { {
fread(buffer,1,1,theFile); if (buffer[0] == ';') // 0x3B
printf("%02X ", buffer[0]); {
i++; printf("0x3B GIF Trailer Byte\n");
} while (buffer[0] != ','); break;
printf("\n"); }
else switch (buffer[0])
if (i > 1) {
printf("Skipped %d meaningless bytes before image descriptor\n",i); case '!': // 0x21
read_extension(theFile);
read_image(theFile); break;
case ',': // 0x2C
read_image(theFile);
break;
default:
printf("%02X ", buffer[0]);
}
}
printf("offset : %lu\n", ftell(theFile));
fclose(theFile); fclose(theFile);
} }
@ -119,6 +128,9 @@ static void read_image(FILE * theFile)
if (buffer[0]&0x80) if (buffer[0]&0x80)
read_palette(theFile, color_table_size); read_palette(theFile, color_table_size);
fread(buffer,1,1,theFile);
printf("\tLZW Minimum Code Size : %d\n", buffer[0]);
while (!feof(theFile)) while (!feof(theFile))
{ {
fread(buffer,1,1,theFile); fread(buffer,1,1,theFile);
@ -144,3 +156,50 @@ static void read_palette(FILE * theFile, int count)
if ((i+1)%8 ==0)puts(""); if ((i+1)%8 ==0)puts("");
} }
} }
static void read_extension(FILE * theFile)
{
uint8_t extension_id;
uint8_t buffer[256];
int block_index = 0;
int i;
fread(&extension_id,1,1,theFile);
printf("extension 0x%02X ", extension_id);
switch (extension_id)
{
case 0xF9:
printf("Graphic Control Extension :");
break;
default:
break;
}
putchar('\n');
while (fread(buffer,1,1,theFile) == 1) // Block size
{
if (buffer[0] == 0)
break;
fread(buffer+1,1,buffer[0],theFile);
switch (extension_id)
{
case 0xF9:
if (block_index == 0)
{
printf("\tDisposal method=%d, User Input Flag=%d, Transparent Color Flag=%d (Index %d=0x%02X)\n",
(buffer[1] & 0x1C) >> 2, (buffer[1] & 0x02) >> 1, (buffer[1] & 0x01),
buffer[4], buffer[4]);
printf("\tDelay Time : %lums\n", (((unsigned long)buffer[3] << 8) | buffer[2]) * 10);
}
break;
default:
printf("#%02d %3dbytes ", block_index, buffer[0]);
for (i = 1; i <= buffer[0]; i++)
printf("%02X ", buffer[i]);
printf("| ");
for (i = 1; i <= buffer[0]; i++)
putchar((buffer[i] >= ' ' && buffer[i] < 128)?buffer[i]:'.');
putchar('\n');
}
block_index++;
}
}