blob: 7e9fd1188577b78ae3f6611be709ecdbd709b1e6 [file] [log] [blame]
/*
* gifdump.c
*
* Copyright (C) 2003-2011 Cosmin Truta.
* This software is distributed under the same licensing and warranty terms
* as gifread.c.
*/
#include "gifread.h"
#include <stdio.h>
/*
* Dumps the structure of a GIF image file.
*/
int GIFDump(const char *filename)
{
int result;
FILE *stream;
struct GIFScreen screen;
struct GIFImage image;
struct GIFExtension ext;
struct GIFGraphicCtlExt graphicExt;
int loop;
stream = fopen(filename, "rb");
if (stream == NULL)
{
fprintf(stderr, "Error: Can't open %s\n", filename);
return -1;
}
result = 0;
printf("File: %s\n", filename);
GIFReadScreen(&screen, stream);
printf("Screen: %u x %u\n", screen.Width, screen.Height);
if (screen.GlobalColorFlag)
printf(" Global colors: %u\n", screen.GlobalNumColors);
if (screen.PixelAspectRatio != 0)
printf(" Pixel aspect ratio = %u\n", screen.PixelAspectRatio);
GIFInitImage(&image, &screen, NULL);
GIFInitExtension(&ext, &screen, 256);
loop = 1;
while (loop)
{
switch (GIFReadNextBlock(&image, &ext, stream))
{
case GIF_TERMINATOR: /* ';' */
loop = 0;
break;
case GIF_IMAGE: /* ',' */
++result;
printf("Image: %u x %u @ (%u, %u)\n",
image.Width, image.Height, image.LeftPos, image.TopPos);
if (image.LocalColorFlag)
printf(" Local colors: %u\n", image.LocalNumColors);
printf(" Interlaced: %s\n", image.InterlaceFlag ? "YES" : "NO");
break;
case GIF_EXTENSION: /* '!' */
if (ext.Label == GIF_GRAPHICCTL)
{
GIFGetGraphicCtl(&graphicExt, &ext);
printf("Graphic Control Extension: 0x%02X\n", ext.Label);
printf(" Disposal method: %u\n", graphicExt.DisposalMethod);
printf(" User input flag: %u\n", graphicExt.InputFlag);
printf(" Delay time : %u\n", graphicExt.DelayTime);
if (graphicExt.TransparentFlag)
printf(" Transparent : %u\n", graphicExt.Transparent);
}
else
printf("Extension: 0x%02X\n", ext.Label);
break;
default:
result = -1;
fprintf(stderr, "Error: Unexpected data in %s\n", filename);
loop = 0;
}
}
fclose(stream);
if (result == 0)
fprintf(stderr, "Error: No image in %s\n", filename);
return result;
}
/*
* main
*/
int main(int argc, char *argv[])
{
int result;
int i;
if (argc <= 1)
{
printf("Usage: gifdump <files.gif...>\n");
return 0;
}
result = 0;
for (i = 1; i < argc; ++i)
{
if (GIFDump(argv[i]) <= 0)
result = 1;
}
return result;
}