/*
 
 * 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 *);