From 0f780f1e3f880b28cf2c44a7cd5b3fedf76a3d1e Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Tue, 30 Jan 2018 14:27:20 +0100 Subject: [PATCH] reorganize gifanalyzer.c --- tools/gifanalyzer/gifanalyzer.c | 60 +++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/tools/gifanalyzer/gifanalyzer.c b/tools/gifanalyzer/gifanalyzer.c index 7666765d..449ef767 100644 --- a/tools/gifanalyzer/gifanalyzer.c +++ b/tools/gifanalyzer/gifanalyzer.c @@ -3,6 +3,7 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program * Gif Analyzer tool + Copyright 2018 Thomas Bernard Copyright 2010 Adrien Destugues Grafx2 is free software; you can redistribute it and/or @@ -22,14 +23,15 @@ #include #include #include -#include + +static void read_image(FILE * theFile); +static void read_palette(FILE * theFile, int count); int main(int argc, char* argv[]) { FILE* theFile; uint8_t buffer[256]; uint16_t w,h; - uint16_t x,y; if(argc < 2) { @@ -74,35 +76,71 @@ int main(int argc, char* argv[]) if(buffer[2] != 0) printf("\t aspect ratio = %d/64\n", 15 + buffer[2]); printf("Color palette:\n"); - for (int i = 0; i < color_table_size; i++) - { - fread(buffer,1,3,theFile); - /*printf("\t%d: %u %u %u\t",i,buffer[0], buffer[1], buffer[2]);*/ - printf(" %3d: #%02x%02x%02x",i,buffer[0], buffer[1], buffer[2]); - if ((i+1)%8 ==0)puts(""); - } + 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); + read_image(theFile); + + fclose(theFile); +} + +static void read_image(FILE * theFile) +{ + uint8_t buffer[256]; + uint16_t x,y; + uint16_t w,h; + unsigned long total_bytes = 0, chunk_count = 0; + int color_table_size; + fread(&x,2,1,theFile); fread(&y,2,1,theFile); fread(&w,2,1,theFile); fread(&h,2,1,theFile); fread(buffer,1,1,theFile); + color_table_size = 1 << ((buffer[0]&0x07)+1); printf("Image descriptor\n"); printf("\tx=%d y=%d w=%d h=%d\n",x,y,w,h); printf("\t%sLocal Color Table (%d colors) %sSorted, %s\n", - (buffer[0]&0x80)?"":"No ", 1 << ((buffer[0]&0x07)+1), + (buffer[0]&0x80)?"":"No ", color_table_size, (buffer[0]&0x20)?"":"Not ", (buffer[0]&0x40)?"Interlaced":"Progressive"); - fclose(theFile); + if (buffer[0]&0x80) + read_palette(theFile, color_table_size); + + while (!feof(theFile)) + { + fread(buffer,1,1,theFile); + if (buffer[0] == 0) + break; + fread(buffer+1,1,buffer[0],theFile); + total_bytes += buffer[0]; + chunk_count++; + } + printf(" %lu bytes in %lu chunks\n", total_bytes, chunk_count); +} + +static void read_palette(FILE * theFile, int count) +{ + uint8_t buffer[3]; + int i; + + for (i = 0; i < count; i++) + { + fread(buffer,1,3,theFile); + /*printf("\t%d: %u %u %u\t",i,buffer[0], buffer[1], buffer[2]);*/ + printf(" %3d: #%02x%02x%02x",i,buffer[0], buffer[1], buffer[2]); + if ((i+1)%8 ==0)puts(""); + } }