
/*****************************************************************************/
/****  File sorgente gif.c                                    	          ****/
/****  di Alberto Geneletti	version 1.0	giugno 1993               ****/
/****                                                                     ****/
/****  Constructor e Desctructor della classe GIFImage.                   ****/
/****  Permette di clonare un'oggetto PseudoColorImage per la codifica,   ****/
/****  di specificare un testo da aggiungere come CommentExtension, di    ****/
/****  settare la modalita' Interlace.                                    ****/
/****  Nel caso non sia specificata alcuna PseudoColorImage, viene effet- ****/
/****  tuata l'inizializzazione necessaria alla decodifica.               ****/
/****  In ogni caso viene sempre allocato il minimo indispensabile; si    ****/
/****  tiene inoltre traccia di quello che e' stato allocato in modo au-  ****/
/****  tomatico, in modo da non rischiare il crash liberando qualcosa che ****/
/****  sia stata passata sullo stack.                                     ****/
/*****************************************************************************/

#include "gif.h"

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

	GIFImage *NewGIFImage;

	if(!(NewGIFImage = (GIFImage *)malloc(sizeof(GIFImage))))
		return(NULL);

	if(Image){
		NewGIFImage->Width		= Image->Width;
		NewGIFImage->Height		= Image->Height;
		NewGIFImage->Depth		= Image->Depth;
		NewGIFImage->AllocationFlags	= Image->AllocationFlags;
		NewGIFImage->NColors		= Image->NColors;
		NewGIFImage->ColorMap		= Image->ColorMap;
		NewGIFImage->GlobalColorMap     = Image->ColorMap;
		NewGIFImage->BitMap		= Image->BitMap;
		NewGIFImage->Display		= (Display ?
			     			   Display : Image->Display);
		NewGIFImage->ShowWorkInProgress = (ShowWorkInProgress ?
		             ShowWorkInProgress : Image->ShowWorkInProgress);
	}
	else {
		NewGIFImage->Width    		= 0;
		NewGIFImage->Height   		= 0;
		NewGIFImage->Depth    		= 0;
		NewGIFImage->AllocationFlags	= NOTHING_AUTOALLOCATED;
		NewGIFImage->NColors		= 0;
		NewGIFImage->ColorMap		= NULL;
		NewGIFImage->BitMap		= NULL;
		NewGIFImage->Display		= (Display ?
						   Display : StubERR);
		NewGIFImage->ShowWorkInProgress = (ShowWorkInProgress ?
			     ShowWorkInProgress : StubNOP);


	}

	NewGIFImage->InterLace			= InterLace;
	NewGIFImage->Status  			= IDLE;
	NewGIFImage->FD				= NULL;
	NewGIFImage->ScreenDescriptor           = NULL;
	NewGIFImage->NGlobalColors    		= NewGIFImage->NColors;
	NewGIFImage->GlobalColorMap 		= NewGIFImage->ColorMap;
	NewGIFImage->ImageDescriptor 		= NULL;
	NewGIFImage->NLocalColors		= 0;
	NewGIFImage->LocalColorMap 		= NULL;
	NewGIFImage->GraphicControlExtension 	= NULL;
	NewGIFImage->CommentExtension 		= Comment;
	NewGIFImage->PlainTextExtension 	= NULL;
	NewGIFImage->ApplicationExtension 	= NULL;

	NewGIFImage->Load			= LoadGIF;
	NewGIFImage->Save			= SaveGIF;
	NewGIFImage->Open     			= OpenGIF;
	NewGIFImage->Close    			= CloseGIF;
	NewGIFImage->GetNextChunk 		= GetNextChunk;
	NewGIFImage->GetBlockOfData 		= GetBlockOfData;
	NewGIFImage->IgnoreCurrentChunk 	= IgnoreCurrentChunk;
	NewGIFImage->FreeAll 			= FreeAll;
	NewGIFImage->GetBitMap 			= GetBitMap;
	NewGIFImage->PutBitMap                  = PutBitMap;
        NewGIFImage->GetCommentExtension	= GetCommentExtension;

	return(NewGIFImage);
}


void DestroyGIFImage(GIFImage *GIFIm)
{
	if(!GIFIm)
		return;
	CloseGIF(GIFIm);
	FreeAll(GIFIm);
	free(GIFIm);
	return;
}


void FreeAll(GIFImage *GIFIm)
{
	if(!GIFIm)
		return;

	if(GIFIm->AllocationFlags & AUTOALLOCATED_SCR_DESCRIPTOR) {
		free(GIFIm->ScreenDescriptor);
		GIFIm->ScreenDescriptor = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_GLOBAL_CMAP) {
		free(GIFIm->GlobalColorMap);
		GIFIm->GlobalColorMap = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_IMG_DESCRIPTOR) {
		free(GIFIm->ImageDescriptor);
		GIFIm->ImageDescriptor = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_LOCAL_CMAP) {
		free(GIFIm->LocalColorMap);
		GIFIm->LocalColorMap = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_BITMAP) {
		farfree(GIFIm->BitMap);
		GIFIm->BitMap = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_GRAF_CTRL) {
		free(GIFIm->GraphicControlExtension);
		GIFIm->GraphicControlExtension = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_COMMENT) {
		free(GIFIm->CommentExtension);
		GIFIm->CommentExtension = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_PLAIN_TEXT) {
		free(GIFIm->PlainTextExtension);
		GIFIm->PlainTextExtension = NULL;
	}

	if(GIFIm->AllocationFlags & AUTOALLOCATED_APPLICATION) {
		free(GIFIm->ApplicationExtension);
		GIFIm->ApplicationExtension = NULL;
	}

	GIFIm->AllocationFlags 	= NOTHING_AUTOALLOCATED;
	GIFIm->Width		= 0;
	GIFIm->Height 		= 0;
	GIFIm->Depth 		= 0;
	GIFIm->NColors  	= 0;
}
