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