Blame util/giftool.c

Packit f1137c
/****************************************************************************
Packit f1137c
Packit f1137c
giftool.c - GIF transformation tool.
Packit f1137c
Packit f1137c
****************************************************************************/
Packit f1137c
Packit f1137c
#include <stdio.h>
Packit f1137c
#include <stdlib.h>
Packit f1137c
#include <string.h>
Packit f1137c
#include <fcntl.h>
Packit f1137c
#include <stdbool.h>
Packit f1137c
Packit f1137c
#include "getopt.h"
Packit f1137c
#include "getarg.h"
Packit f1137c
#include "gif_lib.h"
Packit f1137c
Packit f1137c
#define PROGRAM_NAME	"giftool"
Packit f1137c
Packit f1137c
#define MAX_OPERATIONS	256
Packit f1137c
#define MAX_IMAGES	2048
Packit f1137c
Packit f1137c
enum boolmode {numeric, onoff, tf, yesno};
Packit f1137c
Packit f1137c
char *putbool(bool flag, enum boolmode mode)
Packit f1137c
{
Packit f1137c
    if (flag)
Packit f1137c
	switch (mode) {
Packit f1137c
	case numeric: return "1"; break;
Packit f1137c
	case onoff:   return "on"; break;
Packit f1137c
	case tf:      return "true"; break;
Packit f1137c
	case yesno:   return "yes"; break;
Packit f1137c
	}
Packit f1137c
    else
Packit f1137c
	switch (mode) {
Packit f1137c
	case numeric: return "0"; break;
Packit f1137c
	case onoff:   return "off"; break;
Packit f1137c
	case tf:      return "false"; break;
Packit f1137c
	case yesno:   return "no"; break;
Packit f1137c
	}
Packit f1137c
Packit f1137c
    return "FAIL";	/* should never happen */
Packit f1137c
}
Packit f1137c
Packit f1137c
bool getbool(char *from)
Packit f1137c
{
Packit f1137c
    struct valmap {char *name; bool val;} 
Packit f1137c
    boolnames[] = {
Packit f1137c
	{"yes", true},
Packit f1137c
	{"on",  true},
Packit f1137c
	{"1",   true},
Packit f1137c
	{"t",   true},
Packit f1137c
	{"no",  false},
Packit f1137c
	{"off", false},
Packit f1137c
	{"0",   false},
Packit f1137c
	{"f",   false},
Packit f1137c
	{NULL,  false},
Packit f1137c
    }, *sp;
Packit f1137c
Packit f1137c
    for (sp = boolnames; sp->name; sp++)
Packit f1137c
	if (strcmp(sp->name, from) == 0)
Packit f1137c
	    return sp->val;
Packit f1137c
Packit f1137c
    (void)fprintf(stderr, 
Packit f1137c
		  "giftool: %s is not a valid boolean argument.\n",
Packit f1137c
		  sp->name);
Packit f1137c
    exit(EXIT_FAILURE);
Packit f1137c
}
Packit f1137c
Packit f1137c
struct operation {
Packit f1137c
    enum {
Packit f1137c
	aspect,
Packit f1137c
	delaytime,
Packit f1137c
	background,
Packit f1137c
	info,
Packit f1137c
	interlace,
Packit f1137c
	position,
Packit f1137c
	screensize,
Packit f1137c
	transparent,
Packit f1137c
	userinput,
Packit f1137c
	disposal,
Packit f1137c
    } mode;    
Packit f1137c
    union {
Packit f1137c
	GifByteType numerator;
Packit f1137c
	int delay;
Packit f1137c
	int color;
Packit f1137c
	int dispose;
Packit f1137c
	char *format;
Packit f1137c
	bool flag;
Packit f1137c
	struct {
Packit f1137c
	    int x, y;
Packit f1137c
	} p;
Packit f1137c
    };
Packit f1137c
};
Packit f1137c
Packit f1137c
int main(int argc, char **argv)
Packit f1137c
{
Packit f1137c
    extern char	*optarg;	/* set by getopt */
Packit f1137c
    extern int	optind;		/* set by getopt */
Packit f1137c
    struct operation operations[MAX_OPERATIONS];
Packit f1137c
    struct operation *top = operations;
Packit f1137c
    int selected[MAX_IMAGES], nselected = 0;
Packit f1137c
    bool have_selection = false;
Packit f1137c
    char *cp;
Packit f1137c
    int	i, status, ErrorCode;
Packit f1137c
    GifFileType *GifFileIn, *GifFileOut = (GifFileType *)NULL;
Packit f1137c
    struct operation *op;
Packit f1137c
Packit f1137c
    /*
Packit f1137c
     * Gather operations from the command line.  We use regular
Packit f1137c
     * getopt(3) here rather than Gershom's argument getter because
Packit f1137c
     * preserving the order of operations is important.
Packit f1137c
     */
Packit f1137c
    while ((status = getopt(argc, argv, "a:b:d:f:i:n:p:s:u:x:")) != EOF)
Packit f1137c
    {
Packit f1137c
	if (top >= operations + MAX_OPERATIONS) {
Packit f1137c
	    (void)fprintf(stderr, "giftool: too many operations.");
Packit f1137c
	    exit(EXIT_FAILURE);
Packit f1137c
	}
Packit f1137c
Packit f1137c
	switch (status)
Packit f1137c
	{
Packit f1137c
	case 'a':
Packit f1137c
	    top->mode = aspect;
Packit f1137c
	    top->numerator = (GifByteType)atoi(optarg);
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'b':
Packit f1137c
	    top->mode = background;
Packit f1137c
	    top->color = atoi(optarg);
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'd':
Packit f1137c
	    top->mode = delaytime;
Packit f1137c
	    top->delay = atoi(optarg);
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'f':
Packit f1137c
	    top->mode = info;
Packit f1137c
	    top->format = optarg;
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'i':
Packit f1137c
	    top->mode = interlace;
Packit f1137c
	    top->flag = getbool(optarg);
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'n':
Packit f1137c
	    have_selection = true;
Packit f1137c
	    nselected = 0;
Packit f1137c
	    cp = optarg;
Packit f1137c
	    for (;;)
Packit f1137c
	    {
Packit f1137c
		size_t span = strspn(cp, "0123456789");
Packit f1137c
Packit f1137c
		if (span > 0)
Packit f1137c
		{
Packit f1137c
		    selected[nselected++] = atoi(cp)-1;
Packit f1137c
		    cp += span;
Packit f1137c
		    if (*cp == '\0')
Packit f1137c
			break;
Packit f1137c
		    else if (*cp == ',')
Packit f1137c
			continue;
Packit f1137c
		}
Packit f1137c
Packit f1137c
		(void) fprintf(stderr, "giftool: bad selection.\n");
Packit f1137c
		exit(EXIT_FAILURE);
Packit f1137c
	    }
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'p':
Packit f1137c
	case 's':
Packit f1137c
	    if (status == 'p')
Packit f1137c
		top->mode = position;
Packit f1137c
	    else
Packit f1137c
		top->mode = screensize;
Packit f1137c
	    cp = strchr(optarg, ',');
Packit f1137c
	    if (cp == NULL)
Packit f1137c
	    {
Packit f1137c
		(void) fprintf(stderr, "giftool: missing comma in coordinate pair.\n");
Packit f1137c
		exit(EXIT_FAILURE);
Packit f1137c
	    }
Packit f1137c
	    top->p.x = atoi(optarg);
Packit f1137c
	    top->p.y = atoi(cp+1);
Packit f1137c
	    if (top->p.x < 0 || top->p.y < 0)
Packit f1137c
	    {
Packit f1137c
		(void) fprintf(stderr, "giftool: negative coordinate.\n");
Packit f1137c
		exit(EXIT_FAILURE);
Packit f1137c
	    }
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'u':
Packit f1137c
	    top->mode = userinput;
Packit f1137c
	    top->flag = getbool(optarg);
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case 'x':
Packit f1137c
	    top->mode = disposal;
Packit f1137c
	    top->dispose = atoi(optarg);
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	default:
Packit f1137c
	    fprintf(stderr, "usage: giftool [-b color] [-d delay] [-iI] [-t color] -[uU] [-x disposal]\n");
Packit f1137c
	    break;
Packit f1137c
	}
Packit f1137c
Packit f1137c
	++top;
Packit f1137c
    }	
Packit f1137c
Packit f1137c
    /* read in a GIF */
Packit f1137c
    if ((GifFileIn = DGifOpenFileHandle(0, &ErrorCode)) == NULL) {
Packit f1137c
	PrintGifError(ErrorCode);
Packit f1137c
	exit(EXIT_FAILURE);
Packit f1137c
    }
Packit f1137c
    if (DGifSlurp(GifFileIn) == GIF_ERROR) {
Packit f1137c
	PrintGifError(GifFileIn->Error);
Packit f1137c
	exit(EXIT_FAILURE);
Packit f1137c
    }
Packit f1137c
    if ((GifFileOut = EGifOpenFileHandle(1, &ErrorCode)) == NULL) {
Packit f1137c
	PrintGifError(ErrorCode);
Packit f1137c
	exit(EXIT_FAILURE);
Packit f1137c
    }
Packit f1137c
Packit f1137c
    /* if the selection is defaulted, compute it; otherwise bounds-check it */
Packit f1137c
    if (!have_selection)
Packit f1137c
	for (i = nselected = 0; i < GifFileIn->ImageCount; i++)
Packit f1137c
	    selected[nselected++] = i;
Packit f1137c
    else
Packit f1137c
	for (i = 0; i < nselected; i++)
Packit f1137c
	    if (selected[i] >= GifFileIn->ImageCount || selected[i] < 0)
Packit f1137c
	    {
Packit f1137c
		(void) fprintf(stderr,
Packit f1137c
			       "giftool: selection index out of bounds.\n");
Packit f1137c
		exit(EXIT_FAILURE);
Packit f1137c
	    }
Packit f1137c
Packit f1137c
    /* perform the operations we've gathered */
Packit f1137c
    for (op = operations; op < top; op++)
Packit f1137c
	switch (op->mode)
Packit f1137c
	{
Packit f1137c
	case background:
Packit f1137c
	    GifFileIn->SBackGroundColor = op->color; 
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case delaytime:
Packit f1137c
	    for (i = 0; i < nselected; i++)
Packit f1137c
	    {
Packit f1137c
		GraphicsControlBlock gcb;
Packit f1137c
Packit f1137c
		DGifSavedExtensionToGCB(GifFileIn, selected[i], &gcb;;
Packit f1137c
		gcb.DelayTime = op->delay;
Packit f1137c
		EGifGCBToSavedExtension(&gcb, GifFileIn, selected[i]);
Packit f1137c
	    }
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case info:
Packit f1137c
	    for (i = 0; i < nselected; i++) {
Packit f1137c
		SavedImage *ip = &GifFileIn->SavedImages[selected[i]];
Packit f1137c
		GraphicsControlBlock gcb;
Packit f1137c
		for (cp = op->format; *cp; cp++) {
Packit f1137c
		    if (*cp == '\\') 
Packit f1137c
		    {
Packit f1137c
			char c;
Packit f1137c
			switch (*++cp) 
Packit f1137c
			{
Packit f1137c
			case 'b':
Packit f1137c
			    (void)putchar('\b');
Packit f1137c
			    break;
Packit f1137c
			case 'e':
Packit f1137c
			    (void)putchar(0x1b);
Packit f1137c
			    break;
Packit f1137c
			case 'f':
Packit f1137c
			    (void)putchar('\f');
Packit f1137c
			    break;
Packit f1137c
			case 'n':
Packit f1137c
			    (void)putchar('\n');
Packit f1137c
			    break;
Packit f1137c
			case 'r':
Packit f1137c
			    (void)putchar('\r');
Packit f1137c
			    break;
Packit f1137c
			case 't':
Packit f1137c
			    (void)putchar('\t');
Packit f1137c
			    break;
Packit f1137c
			case 'v':
Packit f1137c
			    (void)putchar('\v');
Packit f1137c
			    break;
Packit f1137c
			case 'x':
Packit f1137c
			    switch (*++cp) {
Packit f1137c
			    case '0':
Packit f1137c
				c = (char)0x00;
Packit f1137c
				break;
Packit f1137c
			    case '1':
Packit f1137c
				c = (char)0x10;
Packit f1137c
				break;
Packit f1137c
			    case '2':
Packit f1137c
				c = (char)0x20;
Packit f1137c
				break;
Packit f1137c
			    case '3':
Packit f1137c
				c = (char)0x30;
Packit f1137c
				break;
Packit f1137c
			    case '4':
Packit f1137c
				c = (char)0x40;
Packit f1137c
				break;
Packit f1137c
			    case '5':
Packit f1137c
				c = (char)0x50;
Packit f1137c
				break;
Packit f1137c
			    case '6':
Packit f1137c
				c = (char)0x60;
Packit f1137c
				break;
Packit f1137c
			    case '7':
Packit f1137c
				c = (char)0x70;
Packit f1137c
				break;
Packit f1137c
			    case '8':
Packit f1137c
				c = (char)0x80;
Packit f1137c
				break;
Packit f1137c
			    case '9':
Packit f1137c
				c = (char)0x90;
Packit f1137c
				break;
Packit f1137c
			    case 'A':
Packit f1137c
			    case 'a':
Packit f1137c
				c = (char)0xa0;
Packit f1137c
				break;
Packit f1137c
			    case 'B':
Packit f1137c
			    case 'b':
Packit f1137c
				c = (char)0xb0;
Packit f1137c
				break;
Packit f1137c
			    case 'C':
Packit f1137c
			    case 'c':
Packit f1137c
				c = (char)0xc0;
Packit f1137c
				break;
Packit f1137c
			    case 'D':
Packit f1137c
			    case 'd':
Packit f1137c
				c = (char)0xd0;
Packit f1137c
				break;
Packit f1137c
			    case 'E':
Packit f1137c
			    case 'e':
Packit f1137c
				c = (char)0xe0;
Packit f1137c
				break;
Packit f1137c
			    case 'F':
Packit f1137c
			    case 'f':
Packit f1137c
				c = (char)0xf0;
Packit f1137c
				break;
Packit f1137c
			    default:
Packit f1137c
				return -1;
Packit f1137c
			    }
Packit f1137c
			    switch (*++cp) {
Packit f1137c
			    case '0':
Packit f1137c
				c += 0x00;
Packit f1137c
				break;
Packit f1137c
			    case '1':
Packit f1137c
				c += 0x01;
Packit f1137c
				break;
Packit f1137c
			    case '2':
Packit f1137c
				c += 0x02;
Packit f1137c
				break;
Packit f1137c
			    case '3':
Packit f1137c
				c += 0x03;
Packit f1137c
				break;
Packit f1137c
			    case '4':
Packit f1137c
				c += 0x04;
Packit f1137c
				break;
Packit f1137c
			    case '5':
Packit f1137c
				c += 0x05;
Packit f1137c
				break;
Packit f1137c
			    case '6':
Packit f1137c
				c += 0x06;
Packit f1137c
				break;
Packit f1137c
			    case '7':
Packit f1137c
				c += 0x07;
Packit f1137c
				break;
Packit f1137c
			    case '8':
Packit f1137c
				c += 0x08;
Packit f1137c
				break;
Packit f1137c
			    case '9':
Packit f1137c
				c += 0x09;
Packit f1137c
				break;
Packit f1137c
			    case 'A':
Packit f1137c
			    case 'a':
Packit f1137c
				c += 0x0a;
Packit f1137c
				break;
Packit f1137c
			    case 'B':
Packit f1137c
			    case 'b':
Packit f1137c
				c += 0x0b;
Packit f1137c
				break;
Packit f1137c
			    case 'C':
Packit f1137c
			    case 'c':
Packit f1137c
				c += 0x0c;
Packit f1137c
				break;
Packit f1137c
			    case 'D':
Packit f1137c
			    case 'd':
Packit f1137c
				c += 0x0d;
Packit f1137c
				break;
Packit f1137c
			    case 'E':
Packit f1137c
			    case 'e':
Packit f1137c
				c += 0x0e;
Packit f1137c
				break;
Packit f1137c
			    case 'F':
Packit f1137c
			    case 'f':
Packit f1137c
				c += 0x0f;
Packit f1137c
				break;
Packit f1137c
			    default:
Packit f1137c
				return -2;
Packit f1137c
			    }
Packit f1137c
			    putchar(c);
Packit f1137c
			    break;
Packit f1137c
			default:
Packit f1137c
			    putchar(*cp);
Packit f1137c
			    break;
Packit f1137c
			}
Packit f1137c
		    }
Packit f1137c
	    	    else if (*cp == '%')
Packit f1137c
		    {
Packit f1137c
			enum boolmode  boolfmt;
Packit f1137c
			SavedImage *sp = &GifFileIn->SavedImages[i];
Packit f1137c
Packit f1137c
			if (cp[1] == 't') {
Packit f1137c
			    boolfmt = tf;
Packit f1137c
			    ++cp;
Packit f1137c
			} else if (cp[1] == 'o') {
Packit f1137c
			    boolfmt = onoff;
Packit f1137c
			    ++cp;
Packit f1137c
			} else if (cp[1] == 'y') {
Packit f1137c
			    boolfmt = yesno;
Packit f1137c
			    ++cp;
Packit f1137c
			} else if (cp[1] == '1') {
Packit f1137c
			    boolfmt = numeric;
Packit f1137c
			    ++cp;
Packit f1137c
			} else
Packit f1137c
			    boolfmt = numeric;
Packit f1137c
Packit f1137c
			switch (*++cp) 
Packit f1137c
			{
Packit f1137c
			case '%':
Packit f1137c
			    putchar('%');
Packit f1137c
			    break;
Packit f1137c
			case 'a':
Packit f1137c
			    (void)printf("%d", GifFileIn->AspectByte);
Packit f1137c
			    break;
Packit f1137c
			case 'b':
Packit f1137c
			    (void)printf("%d", GifFileIn->SBackGroundColor);
Packit f1137c
			    break;
Packit f1137c
			case 'd':
Packit f1137c
			    DGifSavedExtensionToGCB(GifFileIn, 
Packit f1137c
						    selected[i], 
Packit f1137c
						    &gcb;;
Packit f1137c
			    (void)printf("%d", gcb.DelayTime);
Packit f1137c
			    break;
Packit f1137c
			case 'h':
Packit f1137c
			    (void)printf("%d", ip->ImageDesc.Height);
Packit f1137c
			    break;
Packit f1137c
			case 'n':
Packit f1137c
			    (void)printf("%d", selected[i]+1);
Packit f1137c
			    break;
Packit f1137c
			case 'p':
Packit f1137c
			    (void)printf("%d,%d", 
Packit f1137c
					 ip->ImageDesc.Left, ip->ImageDesc.Top);
Packit f1137c
			    break;
Packit f1137c
			case 's':
Packit f1137c
			    (void)printf("%d,%d", 
Packit f1137c
					 GifFileIn->SWidth, 
Packit f1137c
					 GifFileIn->SHeight);
Packit f1137c
			    break;
Packit f1137c
			case 'w':
Packit f1137c
			    (void)printf("%d", ip->ImageDesc.Width);
Packit f1137c
			    break;
Packit f1137c
			case 't':
Packit f1137c
			    DGifSavedExtensionToGCB(GifFileIn, 
Packit f1137c
						    selected[i], 
Packit f1137c
						    &gcb;;
Packit f1137c
			    (void)printf("%d", gcb.TransparentColor);
Packit f1137c
			    break;
Packit f1137c
			case 'u':
Packit f1137c
			    DGifSavedExtensionToGCB(GifFileIn, 
Packit f1137c
						    selected[i], 
Packit f1137c
						    &gcb;;
Packit f1137c
			    (void)printf("%s", putbool(gcb.UserInputFlag, boolfmt));
Packit f1137c
			    break;
Packit f1137c
			case 'v':
Packit f1137c
			    fputs(EGifGetGifVersion(GifFileIn), stdout);
Packit f1137c
			    break;
Packit f1137c
			case 'x':
Packit f1137c
			    DGifSavedExtensionToGCB(GifFileIn, 
Packit f1137c
						    selected[i], 
Packit f1137c
						    &gcb;;
Packit f1137c
			    (void)printf("%d", gcb.DisposalMode);
Packit f1137c
			    break;
Packit f1137c
			case 'z':
Packit f1137c
			    (void) printf("%s", putbool(sp->ImageDesc.ColorMap && sp->ImageDesc.ColorMap->SortFlag, boolfmt));
Packit f1137c
			    break;
Packit f1137c
			default:
Packit f1137c
			    (void)fprintf(stderr, 
Packit f1137c
					  "giftool: bad format %%%c\n", *cp);
Packit f1137c
			}
Packit f1137c
		    }
Packit f1137c
	    	    else
Packit f1137c
			(void)putchar(*cp);
Packit f1137c
		}
Packit f1137c
	    }
Packit f1137c
	    exit(EXIT_SUCCESS);
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case interlace:
Packit f1137c
	    for (i = 0; i < nselected; i++)
Packit f1137c
		GifFileIn->SavedImages[selected[i]].ImageDesc.Interlace = op->flag;
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case position:
Packit f1137c
	    for (i = 0; i < nselected; i++) {
Packit f1137c
		GifFileIn->SavedImages[selected[i]].ImageDesc.Left = op->p.x;
Packit f1137c
		GifFileIn->SavedImages[selected[i]].ImageDesc.Top  = op->p.y;
Packit f1137c
	    }
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case screensize:
Packit f1137c
	    GifFileIn->SWidth = op->p.x;
Packit f1137c
	    GifFileIn->SHeight = op->p.y;
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case transparent:
Packit f1137c
	    for (i = 0; i < nselected; i++)
Packit f1137c
	    {
Packit f1137c
		GraphicsControlBlock gcb;
Packit f1137c
Packit f1137c
		DGifSavedExtensionToGCB(GifFileIn, selected[i], &gcb;;
Packit f1137c
		gcb.TransparentColor = op->color;
Packit f1137c
		EGifGCBToSavedExtension(&gcb, GifFileIn, selected[i]);
Packit f1137c
	    }
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case userinput:
Packit f1137c
	    for (i = 0; i < nselected; i++)
Packit f1137c
	    {
Packit f1137c
		GraphicsControlBlock gcb;
Packit f1137c
Packit f1137c
		DGifSavedExtensionToGCB(GifFileIn, selected[i], &gcb;;
Packit f1137c
		gcb.UserInputFlag = op->flag;
Packit f1137c
		EGifGCBToSavedExtension(&gcb, GifFileIn, selected[i]);
Packit f1137c
	    }
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	case disposal:
Packit f1137c
	    for (i = 0; i < nselected; i++)
Packit f1137c
	    {
Packit f1137c
		GraphicsControlBlock gcb;
Packit f1137c
Packit f1137c
		DGifSavedExtensionToGCB(GifFileIn, selected[i], &gcb;;
Packit f1137c
		gcb.DisposalMode = op->dispose;
Packit f1137c
		EGifGCBToSavedExtension(&gcb, GifFileIn, selected[i]);
Packit f1137c
	    }
Packit f1137c
	    break;
Packit f1137c
Packit f1137c
	default:
Packit f1137c
	    (void)fprintf(stderr, "giftool: unknown operation mode\n");
Packit f1137c
	    exit(EXIT_FAILURE);
Packit f1137c
	}
Packit f1137c
Packit f1137c
    /* write out the results */
Packit f1137c
    GifFileOut->SWidth = GifFileIn->SWidth;
Packit f1137c
    GifFileOut->SHeight = GifFileIn->SHeight;
Packit f1137c
    GifFileOut->SColorResolution = GifFileIn->SColorResolution;
Packit f1137c
    GifFileOut->SBackGroundColor = GifFileIn->SBackGroundColor;
Packit f1137c
    GifFileOut->SColorMap = GifMakeMapObject(
Packit f1137c
				 GifFileIn->SColorMap->ColorCount,
Packit f1137c
				 GifFileIn->SColorMap->Colors);
Packit f1137c
Packit f1137c
    for (i = 0; i < GifFileIn->ImageCount; i++)
Packit f1137c
	(void) GifMakeSavedImage(GifFileOut, &GifFileIn->SavedImages[i]);
Packit f1137c
Packit a7154e
    EGifSpew(GifFileOut);
Packit a7154e
Packit a7154e
    if (DGifCloseFile(GifFileIn, &ErrorCode) == GIF_ERROR)
Packit f1137c
	PrintGifError(ErrorCode);
Packit f1137c
Packit f1137c
    return 0;
Packit f1137c
}
Packit f1137c
Packit f1137c
/* end */