gifanalyzer: decode Graphic Control Extension
This commit is contained in:
parent
0f780f1e3f
commit
6bfb34fd19
@ -26,11 +26,12 @@
|
||||
|
||||
static void read_image(FILE * theFile);
|
||||
static void read_palette(FILE * theFile, int count);
|
||||
static void read_extension(FILE * theFile);
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
FILE* theFile;
|
||||
uint8_t buffer[256];
|
||||
uint8_t buffer[8];
|
||||
uint16_t w,h;
|
||||
|
||||
if(argc < 2)
|
||||
@ -78,19 +79,27 @@ int main(int argc, char* argv[])
|
||||
printf("Color palette:\n");
|
||||
read_palette(theFile, color_table_size);
|
||||
|
||||
int i = 0;
|
||||
do {
|
||||
fread(buffer,1,1,theFile);
|
||||
printf("%02X ", buffer[0]);
|
||||
i++;
|
||||
} while (buffer[0] != ',');
|
||||
printf("\n");
|
||||
|
||||
if (i > 1)
|
||||
printf("Skipped %d meaningless bytes before image descriptor\n",i);
|
||||
|
||||
while (fread(buffer,1,1,theFile) == 1)
|
||||
{
|
||||
if (buffer[0] == ';') // 0x3B
|
||||
{
|
||||
printf("0x3B GIF Trailer Byte\n");
|
||||
break;
|
||||
}
|
||||
else switch (buffer[0])
|
||||
{
|
||||
case '!': // 0x21
|
||||
read_extension(theFile);
|
||||
break;
|
||||
case ',': // 0x2C
|
||||
read_image(theFile);
|
||||
break;
|
||||
default:
|
||||
printf("%02X ", buffer[0]);
|
||||
}
|
||||
}
|
||||
|
||||
printf("offset : %lu\n", ftell(theFile));
|
||||
fclose(theFile);
|
||||
}
|
||||
|
||||
@ -119,6 +128,9 @@ static void read_image(FILE * theFile)
|
||||
if (buffer[0]&0x80)
|
||||
read_palette(theFile, color_table_size);
|
||||
|
||||
fread(buffer,1,1,theFile);
|
||||
printf("\tLZW Minimum Code Size : %d\n", buffer[0]);
|
||||
|
||||
while (!feof(theFile))
|
||||
{
|
||||
fread(buffer,1,1,theFile);
|
||||
@ -144,3 +156,50 @@ static void read_palette(FILE * theFile, int count)
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user