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_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++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user