/*
* whirlgif.h
*
* Copyright (c) 1997,1998,1999 by Hans Dinsen-Hansen
* Copyright (c) 1995,1996 by Kevin Kadow
* Copyright (c) 1990,1991,1992 by Mark Podlipec.
* All rights reserved.
*
* This software may be freely copied, modified and redistributed
* without fee provided that this copyright notice is preserved
* intact on all copies and modified copies.
*
* There is no warranty or other guarantee of fitness of this software.
* It is provided solely "as is". The author(s) disclaim(s) all
* responsibility and liability with respect to this software's usage
* or its effect upon hardware or computer systems.
*
* The Graphics Interchange format (c) is the Copyright property of
* Compuserve Incorporated. Gif(sm) is a Service Mark property of
* Compuserve Incorporated.
*
*/
#define DA_REV 3.04
/* common includes */
#include <stdio.h>
#include <stdlib.h>
#ifdef _USE_STRINGS_H
#include <strings.h>
#else
#include <string.h>
#endif
#ifdef _FOPEN_TXT_OR_BIN
#define WRIBIN "wb"
#define REATXT "rt"
#define REABIN "rb"
#else
/* Usually there is no need to distinguish between binary and txt */
#define WRIBIN "w"
#define REATXT "r"
#define REABIN "r"
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
/* define constants and defaults */
/* Default amount of inter-frame time */
#define DEFAULT_TIME 10
/* If set to 1, Netscape 'loop' code will be added by default */
#define DEFAULT_LOOP 0
/* If set to 1, use the colormaps from all images, not just the first */
#define DEFAULT_USE_COLORMAP 0
/* Used in calculating the transparent color */
#define TRANS_NONE 1
#define TRANS_RGB 2
#define TRANS_MAP 3
#define DISP_NONE 0
#define DISP_NOT 1
#define DISP_BACK 2
#define DISP_PREV 3
#define DEFAULT_DISPOSAL DISP_NONE
/* set default disposal method here to any of the DISP_XXXX values */
#define BIGSTRING 256
#define MAXVAL 4096 /* maxval of lzw coding size */
#define MAXVALP 4096
#define TERMIN 'T'
#define LOOKUP 'L'
#define SEARCH 'S'
#define noOfArrays 20
/* defines the amount of memory set aside in the encoding for the
* LOOKUP type nodes; for a 256 color GIF, the number of LOOKUP
* nodes will be <= noOfArrays, for a 128 color GIF the number of
* LOOKUP nodes will be <= 2 * noOfArrays, etc. */
/* define shorthand for various types */
#define LONG int
#define ULONG unsigned int
#define BYTE char
#define UBYTE unsigned char
#define SHORT short
#define USHORT unsigned short
#define WORD short int
#define UWORD unsigned short int
/* definition of various structures */
typedef struct Transparency {
int type;
UBYTE valid;
UBYTE map;
UBYTE red;
UBYTE green;
UBYTE blue;
} Transparency;
typedef struct Global {
Transparency trans;
int left;
int top;
unsigned int time;
unsigned short disposal;
} Global;
typedef struct GifScreenHdr {
int width;
int height;
UBYTE m;
UBYTE cres;
UBYTE pixbits;
UBYTE bc;
UBYTE aspect;
} GifScreenHdr;
typedef union GifColor {
struct cmap {
UBYTE red;
UBYTE green;
UBYTE blue;
UBYTE pad;
} cmap;
ULONG pixel;
} GifColor;
typedef struct GifImageHdr {
int left;
int top;
int width;
int height;
UBYTE m;
UBYTE i;
UBYTE pixbits;
UBYTE reserved;
} GifImageHdr;
typedef struct GifTree {
char typ; /* terminating, lookup, or search */
int code; /* the code to be output */
UBYTE ix; /* the color map index */
struct GifTree **node, *nxt, *alt;
} GifTree;
/* define inline functions */
#define GifPutShort(i, fout) {fputc(i&0xff, fout); fputc(i>>8, fout);}
#define GifGetShort(fin) (Xgetc(fin) | Xgetc(fin)<<8)
/* forward declaration of the functions */
char *AddCodeToBuffer(int, short, char *);
void CalcTrans(char *);
void ClearTree(int, GifTree *);
void GifClearTable();
void GifComment(FILE *, char *);
void GifDecode(FILE *, UBYTE *, GifImageHdr);
void GifEncode(FILE *, UBYTE *, int, int);
void GifLoop(FILE *, unsigned int);
void GifReadFile(FILE *, char *, int);
void GifScreenHeader(FILE *, FILE *, int);
UBYTE *GifSendData(UBYTE *, int, UBYTE *);
void ReadImageHeader(FILE *);
void SetOffset(char *);
long sq(UBYTE, UBYTE);
void TheEnd();
void TheEnd1(char *);
void Usage();
void WriteImageHeader(FILE *);
UBYTE Xgetc(FILE *);