
/*****************************************************************************/
/****  Header file gif.h                                       	          ****/
/****  di Alberto Geneletti	version 1.0	giugno 1993               ****/
/****                                                                     ****/
/****  Definisce l'oggetto GIFImage, utilizzato dalla Class Lib AG-GIF    ****/
/****  per la codifica e la decodifica del formato GIF della Compuserve.  ****/
/****  Tale classe eredita la classe PseudoColorImage, definita in        ****/
/****  image.h, e definisce poi altre member function, quali:             ****/
/****                                                                     ****/
/****  	GIFImage.Load(filename)  	Decodifica l'intero file filename ****/
/****   			 e ne memorizza il contenuto in GIFImage. ****/
/****   GIFImage.Save(filename)		 Codifica la GIFImage in un file. ****/
/****                                                                     ****/
/****   GIFImage.OpenGIF(filename)                 Per il parsing a basso ****/
/****   GIFImage.GetNextChunk()                   livello di un file GIF. ****/
/****   GIFImage.GetBlockOfData(buffer)        Man mano che il file viene ****/
/****   GIFImage.IgnoreCurrentChunk()       letto, i campi della GIFImage ****/
/****   GIFImage.GetBitMap()                     divengono significativi. ****/
/****   GIFImage.GetCommentExtension()                                    ****/
/****   GIFImage.Close()                                                  ****/
/****                                                                     ****/
/****   GIFImage.PutBitMap()            Per la codifica della sola bitmap ****/
/****                                                                     ****/
/*****************************************************************************/

#ifndef GIF_H
#define GIF_H

#include <stdio.h>
#include "image.h"
#include "systems.h"

/***************** Caratteri di Controllo ************************************/

#define IMAGE_SEPARATOR            ','
#define EXTENSION_INTRODUCER       '!'
#define GIF_TERMINATOR             ';'

/***************** Codici di errore generici *********************************/

#define OK                         0x0000
#define ALLOCATION_ERROR           0xFFFE
#define CORRUPTED_GIF_FILE         0xFFFF

/****************** Flag di stato ********************************************/

#define IDLE         0x0000
#define FILE_OPEN    0x0002
#define READING_DATA 0x0004

/***************** Valori restituiti da OpenGIF ******************************/

#define FILE_NOT_FOUND             0x0003
#define NOT_A_GIF_FILE             0x0004

/***************** Valori restituiti da SaveGIF ******************************/

#define FILE_EXIST                 0x0006
#define OUT_OF_DISK_SPACE          0x0007


/***************** Valori restituiti da GetNextChunk *************************/

#define IMAGE                      IMAGE_SEPARATOR
#define CONTROL                    0x00f9
#define COMMENT                    0x00fe
#define PLAINTEXT                  0x0001
#define APPLICATION                0x00ff
#define NO_MORE_CHUNKS             GIF_TERMINATOR
#define UNKNOWN_EXTENSION          0x0005

/***************** Valori restituiti da AmigaShow ****************************/

#define UNSUPPORTED_DEPTH	0x00ff
#define LIBRARY_ERROR 	  	0x00fe

/**** Flag di Allocazione per il campo AllocationFlags ***********************/

#define NO_BLOCK_ALLOCATED           0x0000
#define AUTOALLOCATED_SCR_DESCRIPTOR 0x0002
#define AUTOALLOCATED_GLOBAL_CMAP    0x0004
#define AUTOALLOCATED_IMG_DESCRIPTOR 0x0008
#define AUTOALLOCATED_LOCAL_CMAP     0x0010
#define AUTOALLOCATED_GRAF_CTRL      0x0040
#define AUTOALLOCATED_COMMENT        0x0080
#define AUTOALLOCATED_PLAIN_TEXT     0x0100
#define AUTOALLOCATED_APPLICATION    0x0200

/***************** Blocchi del GIF87a ****************************************/

typedef struct SD {
	unsigned char LSBWidth;
	unsigned char MSBWidth;
	unsigned char LSBHeight;
	unsigned char MSBHeight;
	unsigned char PackedFields;
	unsigned char BackGround;
	unsigned char Aspect;
} ScreenDescriptor;

typedef struct ID {
	unsigned char LSBLeftOffset;
	unsigned char MSBLeftOffset;
	unsigned char LSBTopOffset;
	unsigned char MSBTopOffset;
	unsigned char LSBWidth;
	unsigned char MSBWidth;
	unsigned char LSBHeight;
	unsigned char MSBHeight;
	unsigned char PackedFields;
} ImageDescriptor;

/***************** Blocchi di estensione del GIF89a **************************/

typedef struct GCE {
	unsigned char Size;
	unsigned char Flags;
	unsigned char LSBDelay;
        unsigned char MSBDelay;
	unsigned char TransparentColor;
	unsigned char BlockTerminator;
} GraphicControlExtension;

typedef struct PTE {
	unsigned char Size;
	unsigned char LSBLeftOffset;
	unsigned char MSBLeftOffset;
	unsigned char LSBTopOffset;
	unsigned char MSBTopOffset;
	unsigned char LSBGridWidth;
	unsigned char MSBGridWidth;
	unsigned char LSBGridHeight;
	unsigned char MSBGridHeight;
	unsigned char LSBCellWidth;
	unsigned char MSBCelleHeight;
	unsigned char ForeGround;
	unsigned char BackGround;
} PlainTextExtension;

typedef struct AE {
	unsigned char Size;
	char Identifier[8];
	char AutenticationCode[3];
} ApplicationExtension;

/**** Definizione della classe GIFImage **************************************/

typedef struct GI {

	/* Ereditiamo la Classe PseudoColorImage *****************************/

	int16 Width;
	int16 Height;
	int16 Depth;
	int16 AllocationFlags;
	int16 NColors;
	Colormap *ColorMap;
	char huge *BitMap;
	int (*Display)();
	void (*ShowWorkInProgress)();

	/* Puntatori a strutture specifiche del formato GIF ******************/

	char   		        Signature[6];
	ScreenDescriptor        *ScreenDescriptor;
	int                     NGlobalColors;
	Colormap 	        *GlobalColorMap;
	ImageDescriptor         *ImageDescriptor;
	int                     NLocalColors;
	Colormap 	        *LocalColorMap;
	char                    *CommentExtension;
	GraphicControlExtension *GraphicControlExtension;
	PlainTextExtension      *PlainTextExtension;
	ApplicationExtension    *ApplicationExtension;
	int                     InitialCodeSize;
	int 			Status;
	boolean			InterLace;

	/* Estensioni per la gestione dei file *******************************/

	FILE 			*FD;
	int	 		(*Open)();
	void 			(*Close)();
        int 			(*Load)();
	int 			(*Save)();

	/* Estendiamo poi la classe con nuovi metodi specifici ***************/

	boolean 		(*GetBitMap)();
	int                     (*PutBitMap)();
	int 			(*GetNextChunk)();
	int 			(*GetBlockOfData)();
	int 			(*IgnoreCurrentChunk)();
        int 			(*GetCommentExtension)();
	void 			(*FreeAll)();

} GIFImage;

/**** Prototipi di tutte le funzioni, a partire da quelle di gif.c ***********/

GIFImage *CreateGIFImage(PseudoColorImage 	 *Image,       
			 boolean		 InterLace,
			 char                    *Comment,
			 int (*Display)(),
			 void (*ShowWorkInProgress)());
void DestroyGIFImage(GIFImage *GIFIm);

/**************** gifparse.c *************************************************/

int	OpenGIF(char *FileName, GIFImage *GIFIm);	  
void 	CloseGIF(GIFImage *GIFIm);
void 	FreeAll(GIFImage *GIFIm);
int 	GetNextChunk(GIFImage *GIFIm);
int 	GetBlockOfData(char *Buff, GIFImage *GIFIm);
int 	IgnoreCurrentChunk(GIFImage *GIFIm);
int     GetCommentExtension(GIFImage *GIFIm);
int 	LoadGIF(char * FileName,GIFImage *GIFIm);

/**************** display.c **************************************************/

int 	VGAShowGIFImage(GIFImage *GIFIm);		  
int 	AmigaShow(GIFImage *GIFIm);

/**************** gifencode.c ************************************************/

int 	SaveGIF(char *FileName, GIFImage *GIFIm);       

/**************** giflzw.c ***************************************************/

int 	InitDecoder(GIFImage *GIFIm);			   
int 	GetCode(GIFImage *GIFIm);
int 	LZWReadByte (GIFImage *GIFIm);
void 	GetLine (char huge *Buff, GIFImage *GIFIm);
boolean GetBitMap(GIFImage *GIFIm);
int  	InitEncoder();
void 	ClearTable();
void 	SyncEncoder();
void 	PutCodeIntoBuffer(int code);
void 	EncodeByte(int NewChar);
void 	WriteBlockOfRasterData(int n);
void 	PutLine(int NLine, GIFImage *GIFIm);
int  	PutBitMap(GIFImage *GIFIm);

#endif