#ifndef GIF_H
#define GIF_H

#define MAXCOLORMAPSIZE	256
#define MAXBIGMAPSIZE	512
#define CM_RED          0
#define CM_GREEN        1
#define CM_BLUE         2

/*
 * Return values from gif_get_setup.
 */
#define	GIF_SUCCESS		 0
#define	GIF_NOT_GIF		-1
#define	GIF_NO_SPACE	-2
#define	GIF_EMPTY		-3
#define	GIF_EOF			-4

#define CHECK( thing, msg ) { if (!(thing)) { gif_error( msg ); return; }}

typedef unsigned char gif_pixel;


struct GIFLogicalScreen {
    FILE      		*GIF_file;	/* Input or output file. */
	short			width;
	short			height;
	unsigned char	packedFields;
	unsigned char	backColorIndex;
	unsigned char	pixelAspectRatio;
	/* unpacked fields */
	short			globalColorTableFlag;
	short			colorResolution;
	short			sortFlag;
	short			globalColorTableSizeBits;
	/* calculated field */
	short			globalColorTableSize;
	/* Global Color Map */
	unsigned char	colorMap[MAXCOLORMAPSIZE][3];
	/* current Mac color Info */
	short			colorCount;
	unsigned char	macColorMap[MAXCOLORMAPSIZE][3];
/* for collecting colors */
	short			allColorCount;
	unsigned char	allColorRed[MAXBIGMAPSIZE];
	unsigned char	allColorGreen[MAXBIGMAPSIZE];
	unsigned char	allColorBlue[MAXBIGMAPSIZE];
	long			allColorUsage[MAXBIGMAPSIZE];
};

typedef struct GIFLogicalScreen GIFLogicalScreen;
typedef GIFLogicalScreen *GIFLogicalScreenPtr, **GIFLogicalScreenHandle;

struct GIFImageDescriptor {
	short			leftPos;
	short			topPos;
	short			imageWidth;
	short			imageHeight;
	unsigned char	packedFields;
	/* unpacked fields */
	short			localColorTableFlag;
	short			interlaceFlag;
	short			sortFlag;
	/* 2 reserved bits */
	short			localColorTableSizeBits;
	/* calculated fields */
	short			localColorTableSize;
	short			curPass;
	short			curLine;
	unsigned char	colorMap[MAXCOLORMAPSIZE][3];
	long			colorMapUsage[MAXCOLORMAPSIZE];
};

typedef struct GIFImageDescriptor GIFImageDescriptor;
typedef GIFImageDescriptor *GIFImageDescriptorPtr, **GIFImageDescriptorHandle;

void	AdjustGIFScrollbars(WindowPtr window, Boolean needsResize);
void	AdjustGIFScrollSizes(WindowPtr window);
void	ScrollGIFWindow(WindowPtr window, short amount, short scrollType);
void	DestroyOffscreenBitMap(GrafPtr oldOffscreen);
Boolean CreateOffscreenBitMap(GrafPtr *newOffscreen, Rect *inBounds);
void	BitMapToWind(DocumentPeek whichDoc);
void	GIF_CloseWindow(WindowPtr window);


#define		kBitmapBased	0
#define		kGWorldBased	1
#define		kPictHeaderSize	512
#endif