/**************************************************
 *
 * fi_IFF.h
 *
 *   IFF file manipulation code header file
 *
 *    Copyright(c), 1990, 1991 Lloyd B. Eldred
 *                           & Fredrick R Homan
 **************************************************/
typedef unsigned char UBYTE;     /* 8 bits unsigned */
typedef unsigned short UWORD;    /* 16 bits unsigned */
typedef short WORD;		 /* 16 bits signed */
typedef long LONG;               /* 32 bits signed */
typedef unsigned long ULONG;
typedef struct {
   UWORD w,h;
   WORD x,y;
   UBYTE nPlanes;
   UBYTE masking;
   UBYTE compression;
   UBYTE pad1;
   UWORD transparentColor;
   UBYTE xAspect, yAspect;
   WORD pageWidth, pageHeight;
} BitMapHeader;

#define GIF 1
#define IFF 2
#define ANIM 3
#define HIRES 0x8000
#define LACE 0x4
#define HAM 0x800
#define HALFBRITE 0x80
#define TRUE 1
#define FALSE 0
#define is_odd(number) (number & 0x1)

#define MakeID(a,b,c,d) ( (LONG)(a)<<24L | (LONG)(b)<<16L | (c)<<8 | (d))

/*****************************************************************/
/*    IFF Groups                                                 */
/*****************************************************************/

#define ID_FORM MakeID('F','O','R','M')
#define ID_PROP MakeID('P','R','O','P')
#define ID_LIST MakeID('L','I','S','T')
#define ID_CAT  MakeID('C','A','T',' ')

void IFF_FORM(FILE *,LONG);
void IFF_PROP(FILE *,LONG);
void IFF_LIST(FILE *,LONG);
void IFF_CAT(FILE *,LONG);

/***************************************************************/ 
/* FORM type handling                                          */
/***************************************************************/

#define ID_ILBM MakeID('I','L','B','M')
#define ID_ANIM MakeID('A','N','I','M')
#define ID_SMUS MakeID('S','M','U','S')
#define ID_8SVX MakeID('8','S','V','X')
#define ID_ANBM MakeID('A','N','B','M')
#define ID_ACBM MakeID('A','C','B','M')

void IFF_ILBM(FILE *,LONG);
void IFF_ANIM(FILE *,LONG);
void IFF_SMUS(FILE *,LONG);
void IFF_8SVX(FILE *,LONG);
void IFF_ANBM(FILE *,LONG);
void IFF_ACBM(FILE *,LONG);

/*************************************************************/ 
/* Chunks that can appear anywhere                           */
/*************************************************************/

#define ID_NAME MakeID('N','A','M','E')
#define ID_copyright MakeID('(','c',')',' ')
#define ID_AUTH MakeID('A','U','T','H')
#define ID_ANNO MakeID('A','N','N','O')

void IFF_NAME(FILE *,LONG);
void IFF_copyright(FILE *,LONG);
void IFF_AUTH(FILE *,LONG);
void IFF_ANNO(FILE *,LONG);

/*************************************************************/ 
/* Chunks that are generally ILBM (pic) Chunks               */
/*************************************************************/

#define ID_BMHD MakeID('B','M','H','D')
#define ID_CAMG MakeID('C','A','M','G')
#define ID_CMAP MakeID('C','M','A','P')
#define ID_GRAB MakeID('G','R','A','B')
#define ID_DEST MakeID('D','E','S','T')
#define ID_SPRT MakeID('S','P','R','T')
#define ID_BODY MakeID('B','O','D','Y')
#define ID_CRNG MakeID('C','R','N','G')
#define ID_CCRT MakeID('C','C','R','T')
#define ID_DPPS MakeID('D','P','P','S')
#define ID_DPPV MakeID('D','P','P','V')
#define ID_DGVW MakeID('D','G','V','W')
#define ID_BHSM MakeID('B','H','S','M')
#define ID_BHCP MakeID('B','H','C','P')
#define ID_BHBA MakeID('B','H','B','A')
#define ID_ABIT MakeID('A','B','I','T')
    
void IFF_BMHD(FILE *,LONG,BitMapHeader *);
long IFF_CAMG(FILE *,LONG);
void IFF_CMAP(FILE *,LONG);
void IFF_GRAB(FILE *,LONG);
void IFF_DEST(FILE *,LONG);
void IFF_SPRT(FILE *,LONG);
void IFF_BODY(FILE *,LONG);
void IFF_CRNG(FILE *,LONG);
void IFF_CCRT(FILE *,LONG);
void IFF_DPPS(FILE *,LONG);
void IFF_DPPV(FILE *,LONG);
void IFF_DGVW(FILE *,LONG);
void IFF_BHSM(FILE *,LONG);
void IFF_BHCP(FILE *,LONG);
void IFF_BHBA(FILE *,LONG);
void IFF_ABIT(FILE *,LONG);

/************************************************************/
/* Useful chunks for SMUS files                             */
/************************************************************/
#define ID_SHDR MakeID('S','H','D','R')
#define ID_INS1 MakeID('I','N','S','1')
#define ID_INST MakeID('I','N','S','T')
#define ID_TRAK MakeID('T','R','A','K')
#define ID_IRev MakeID('I','R','e','v')
#define ID_BIAS MakeID('B','I','A','A')
#define ID_SNX1 MakeID('S','N','X','1')

void IFF_SHDR(FILE *,LONG);
void IFF_INS1(FILE *,LONG);
void IFF_INST(FILE *,LONG);
void IFF_TRAK(FILE *,LONG);
void IFF_IRev(FILE *,LONG);
void IFF_BIAS(FILE *,LONG);
void IFF_SNX1(FILE *,LONG);

/************************************************************/
/* Useful chunks for 8SVX Sampled sounds                    */
/************************************************************/

#define ID_VHDR MakeID('V','H','D','R')
#define ID_ATAK MakeID('A','T','A','K')
#define ID_RLSE MakeID('R','L','S','E')
#define ID_CHAN MakeID('C','H','A','N')
#define ID_PAN  MakeID('P','A','N',' ')

void IFF_VHDR(FILE *,LONG);
void IFF_ATAK(FILE *,LONG);
void IFF_RLSE(FILE *,LONG);
void IFF_CHAN(FILE *,LONG);
void IFF_PAN(FILE *,LONG);

/************************************************************/
/* Useful chunks for non-picture files (headers in general) */
/************************************************************/

#define ID_ANHD MakeID('A','N','H','D')
#define ID_DLTA MakeID('D','L','T','A')
#define ID_FSQN MakeID('F','S','Q','N')

void IFF_ANHD(FILE *,LONG);
void IFF_DLTA(FILE *,LONG);
void IFF_FSQN(FILE *,LONG);

/*************************************************************/
/*    Miscellaneous IFF utility functions                    */
/*************************************************************/

void IFF_ID(FILE *, char *);
LONG IFF_size(FILE *);
void IFF_GotoEnd(FILE *, LONG);

/***********************************************************/
/* IFF2.c headers                                          */
/***********************************************************/

#define ID_FTXT MakeID('F','T','X','T')
#define ID_CHRS MakeID('C','H','R','S')
#define ID_FONS MakeID('F','O','N','S')
#define ID_AIFF MakeID('A','I','F','F')
#define ID_BANK MakeID('B','A','N','K')
#define ID_HEAD MakeID('H','E','A','D')
#define ID_MIDI MakeID('M','I','D','I')
#define ID_PGTB MakeID('P','G','T','B')
#define ID_SYTH MakeID('S','Y','T','H')
#define ID_WORD MakeID('W','O','R','D')
#define ID_C100 MakeID('C','1','0','0')
#define ID_PDEF MakeID('P','D','E','F')
#define ID_SHAK MakeID('S','H','A','K')
#define ID_VDEO MakeID('V','D','E','O')
#define ID_SAMP MakeID('S','A','M','P')
#define ID_TDDD MakeID('T','D','D','D')
#define ID_SC3D MakeID('S','C','3','D')
#define ID_TEXT MakeID('T','E','X','T')
#define ID_FNTR MakeID('F','N','T','R')
#define ID_FNTV MakeID('F','N','T','V')
#define ID_GSCR MakeID('G','S','C','R')
#define ID_PICS MakeID('P','I','C','S')
#define ID_PLBM MakeID('P','L','B','M')
#define ID_USCR MakeID('U','S','C','R')
#define ID_UVOX MakeID('U','V','O','X')
#define ID_CLIP MakeID('C','L','I','P')
#define ID_ARC  MakeID('A','R','C',' ')
#define ID_ATXT MakeID('A','T','X','T')
#define ID_PTXT MakeID('P','T','X','T')
#define ID_RGBX MakeID('R','G','B','X')
#define ID_CDAT MakeID('C','D','A','T')
#define ID_MSMP MakeID('M','S','M','P')
#define ID_FIGR MakeID('F','I','G','R')
#define ID_MOVI MakeID('M','O','V','I')

void IFF_FTXT(FILE *,LONG);
void IFF_CHRS(FILE *,LONG);
void IFF_FONS(FILE *,LONG);
void IFF_AIFF(FILE *,LONG);
void IFF_BANK(FILE *,LONG);
void IFF_HEAD(FILE *,LONG);
void IFF_MIDI(FILE *,LONG);
void IFF_PGTB(FILE *,LONG);
void IFF_SYTH(FILE *,LONG);
void IFF_WORD(FILE *,LONG);
void IFF_C100(FILE *,LONG);
void IFF_PDEF(FILE *,LONG);
void IFF_SHAK(FILE *,LONG);
void IFF_VDEO(FILE *,LONG);
void IFF_SAMP(FILE *,LONG);
void IFF_TDDD(FILE *,LONG);
void IFF_SC3D(FILE *,LONG);
void IFF_TEXT(FILE *,LONG);
void IFF_FNTR(FILE *,LONG);
void IFF_FNTV(FILE *,LONG);
void IFF_GSCR(FILE *,LONG);
void IFF_PICS(FILE *,LONG);
void IFF_PLBM(FILE *,LONG);
void IFF_USCR(FILE *,LONG);
void IFF_UVOX(FILE *,LONG);
void IFF_CLIP(FILE *,LONG);
void IFF_ARC(FILE *,LONG);
void IFF_ATXT(FILE *,LONG);
void IFF_PTXT(FILE *,LONG);
void IFF_RGBX(FILE *,LONG);
void IFF_CDAT(FILE *,LONG);
void IFF_MSMP(FILE *,LONG);
void IFF_FIGR(FILE *,LONG);
void IFF_MOVI(FILE *,LONG);

