/**************************************************
 *
 * ILBM.c
 *
 *   IFF-ILBM file manipulation code
 *
 *    Copyright(c), 1990, 1991 Lloyd B. Eldred
 *                           & Fredrick R Homan
 **************************************************/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "fi_IFF.h"

extern UBYTE VERBOSE, TERSE,COMMENT,ANIM_FLAG;  /* Yuck, global variables... */

void IFF_ILBM(picfile,size)
FILE *picfile;
LONG size;

{
   union chunk_ID{
       char text_ID[4];
       LONG long_ID;} chunk;

   LONG ch_size,offset,vpmodes;
   BitMapHeader *BMHD;
   int bmhd_found = FALSE;
   int camg_found = FALSE;
   int i,colors;
        
   if(!TERSE && !ANIM_FLAG) 
      printf("    ILBM (Interleaved Bit Map)\n");
   if(ANIM_FLAG && VERBOSE) 
      printf("    ILBM (Interleaved Bit Map)\n");
   if(TERSE && !ANIM_FLAG) printf("ILBM ");
   offset=0;
   
   while(offset <= (size-8)){
      IFF_ID(picfile,chunk.text_ID);
      ch_size = IFF_size(picfile);
      offset += (8+ch_size+is_odd(ch_size));
                    
      switch(chunk.long_ID){
         case ID_BMHD :
            BMHD = malloc(sizeof(BitMapHeader));
            if(BMHD == NULL){
               printf(" Can't allocate memory for BMHD structure.\n");
               fi_exit();
            }
            IFF_BMHD(picfile,ch_size,BMHD);
            bmhd_found = TRUE;
            if(VERBOSE) {
               printf("      BMHD (Bit Map HeaDer chunk)\n");
               printf("        Width        : %d\n"
                       "        Height       : %d\n"
                       "        # bit planes : %d\n",
                       BMHD->w,BMHD->h,BMHD->nPlanes);
            }
            if(TERSE) printf("   %d   %d   %d\n",
                BMHD->w,BMHD->h,BMHD->nPlanes);
            break;
         case ID_CMAP :
            IFF_CMAP(picfile,ch_size);
            break;
         case ID_BODY :
            IFF_BODY(picfile,ch_size);
            break;
         case ID_ANHD :
            IFF_ANHD(picfile,ch_size);
            break;
         case ID_GRAB :
            IFF_GRAB(picfile,ch_size);
            break;
         case ID_DEST :
            IFF_DEST(picfile,ch_size);
            break;
         case ID_SPRT :
            IFF_SPRT(picfile,ch_size);
            break;
         case ID_CAMG :
            vpmodes=IFF_CAMG(picfile,ch_size);
            camg_found = TRUE;
            if(VERBOSE){
                printf("      CAMG (Amiga Display Mode) chunk.\n");
                if(vpmodes & HIRES) printf("         HiRes flag set\n");
                if(vpmodes & LACE) printf("         Interlace flag set\n");
                if(vpmodes & HAM) printf("         HAM mode flag set\n");
                if(vpmodes & HALFBRITE) 
                    printf("         Halfbright mode flag set\n");
            }
            break;
         case ID_CRNG :
            IFF_CRNG(picfile,ch_size);
            break;
         case ID_CCRT :
            IFF_CCRT(picfile,ch_size);
            break;
         case ID_NAME :
            IFF_NAME(picfile,ch_size);
            break;
         case ID_copyright :
            IFF_copyright(picfile,ch_size);
            break;
         case ID_AUTH :  
            IFF_AUTH(picfile,ch_size);
            break;
         case ID_ANNO :
            IFF_ANNO(picfile,ch_size);
            break;
         case ID_CHRS :
            IFF_CHRS(picfile,ch_size);
            break;
         case ID_TEXT :
            IFF_TEXT(picfile,ch_size);
            break;
         case ID_DPPS :
            IFF_DPPS(picfile,ch_size);
            break;
         case ID_DPPV :
            IFF_DPPV(picfile,ch_size);
            break;
         case ID_DGVW :
            IFF_DGVW(picfile,ch_size);
            break;
         case ID_BHSM :
            IFF_BHSM(picfile,ch_size);
            break;
         case ID_BHCP :
            IFF_BHCP(picfile,ch_size);
            break;
         case ID_BHBA :
            IFF_BHBA(picfile,ch_size);
            break;
         case ID_DLTA :
            IFF_DLTA(picfile,ch_size);
            break;
         default:
            if(VERBOSE) printf(
               "     Inappropriate sub chunk for ILBM: %4s\n",chunk.text_ID);
            IFF_GotoEnd(picfile,ch_size);
      } /* end of switch */
      
   } /* end of while */

   IFF_GotoEnd(picfile,size-offset);

   if(!VERBOSE && !TERSE && !COMMENT){   /* Normal mode ? */
      if(bmhd_found && camg_found){
         printf("         Width  : %d", BMHD->w);
         if(vpmodes & HIRES) printf("  HiRes");
         printf("\n");
         printf("         Height : %d",BMHD->h);
         if(vpmodes & LACE) printf("   Interlaced");
         printf("\n");
         printf("         Colors :");
         if(vpmodes & HAM) printf(" 4096  HAM\n");
         else{  /* not HAM */
            colors=1;
            for(i=1; i< (BMHD->nPlanes); i++) colors *= 2;
            printf(" %d ",colors);
            if(vpmodes & HALFBRITE) printf("   Extra Halfbright");
            printf("\n");         
         } /* end of else */
      
      } /* end of both found */
      
      else if(bmhd_found)printf("        Width        : %d\n"
                       "        Height       : %d\n"
                       "        # bit planes : %d\n",
                       BMHD->w,BMHD->h,BMHD->nPlanes);
      else if(camg_found){
                if(vpmodes & HIRES) printf("      HiRes flag set\n");
                if(vpmodes & LACE) printf("      Interlace flag set\n");
                if(vpmodes & HAM) printf("      HAM mode flag set\n");
                if(vpmodes & HALFBRITE) 
                    printf("      Extra Halfbright mode flag set\n");
               }
   } /* end of if(NORMAL) */
   
   if(VERBOSE) printf("    End of ILBM chunk\n");
   if(bmhd_found) free(BMHD);
      
}/* end of IFF_ILBM */

/*************************************************************/ 
/* Chunks that are generally ILBM (pic) Chunks               */
/*************************************************************/
    
void IFF_BMHD(picfile,size,BMHD) /* Read BitMapHeaDer block */
FILE *picfile;
LONG size;
BitMapHeader *BMHD;
{
   unsigned char c1,c2,c3,c4;
	
   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   BMHD->w = (UWORD)c2 + ((UWORD)c1) * 256; /* raster width */
   
	fi_getc(picfile,&c3);
   fi_getc(picfile,&c4);
   BMHD->h = (UWORD)c4 + ((UWORD)c3) * 256; /* raster height */
   		
   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   BMHD->x = (UWORD)c2 + ((UWORD)c1) * 256; /* x pos of image */
  
	fi_getc(picfile,&c3);
   fi_getc(picfile,&c4);
   BMHD->y = (UWORD)c4 + ((UWORD)c3) * 256; /* y pos of image */
   		
   fi_getc(picfile,&c1);
   BMHD->nPlanes=(UBYTE)c1; /* # of source bit planes */
   
   fi_getc(picfile,&c1);
   BMHD->masking=(UBYTE)c1;/* masking technique */
   
   fi_getc(picfile,&c1);
   BMHD->compression=(UBYTE)c1;  /* compression technique */

   fi_getc(picfile,&c1);  /* pad byte */
   
	fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   BMHD->transparentColor = (UWORD)c2 + ((UWORD)c1) * 256; 
                              /* trans color # */

   fi_getc(picfile,&c1);
   BMHD->xAspect=(UBYTE)c1;  /* pixel aspect ratio */
   
   fi_getc(picfile,&c1);
   BMHD->yAspect=(UBYTE)c1;  /* pixel aspect ratio */

	fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   BMHD->pageWidth = (UWORD)c2 + ((UWORD)c1) * 256; /* source page width */

	fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   BMHD->pageHeight = (UWORD)c2 + ((UWORD)c1) * 256; /* source page Height */

   if(size!=20) IFF_GotoEnd(picfile,size-20);

} /* end of IFF_BMHD */		

long IFF_CAMG(picfile,size)   /* Deal with CAMG chunk */
FILE *picfile;
LONG size;
{
   long vpmode;
   char c1,c2,c3,c4;
      
   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   fi_getc(picfile,&c3);
   fi_getc(picfile,&c4);

	vpmode = makelong(c1,c2,c3,c4);

   if(size !=4) IFF_GotoEnd(picfile,size-4);

   return(vpmode);
           
} /* end of IFF_CAMG */

void IFF_CMAP(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      CMAP (color map) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
   
} /* end of IFF_CMAP */

void IFF_GRAB(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      GRAB (brush handle) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
   
  
} /* end of IFF_GRAB */

void IFF_DEST(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      DEST (bitplane destination) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
   
  
} /* end of IFF_DEST */

void IFF_SPRT(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      SPRT (Sprite) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
   
  
} /* end of IFF_SPRT */

void IFF_BODY(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      BODY (data) chunk.\n");

   IFF_GotoEnd(picfile,size);
 
} /* end of IFF_BODY */

void IFF_CRNG(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      CRNG (color cycling) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
  
} /* end of IFF_CRNG */

void IFF_CCRT(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      CCRT (color cycling) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
  
} /* end of IFF_CCRT */


void IFF_DPPV(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      DPPV (Deluxe Paint II perspective) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_DPPV */

void IFF_DPPS(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      DPPS (Deluxe Paint III perspective) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_DPPS */

void IFF_DGVW(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      DGVW (Digi-View control panel settings) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_DGVW */

void IFF_BHSM(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      BHSM (Photon Paint private) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_BHSM */

void IFF_BHCP(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      BHCP (Photon Paint private) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_BHCP */

void IFF_BHBA(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      BHBA (Photon Paint private) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_BHBA */

void IFF_ABIT(picfile,size)
FILE *picfile;
LONG size;

{
   if(VERBOSE) printf("      ABIT (Amiga BITplanes) chunk.\n");

   IFF_GotoEnd(picfile,size);
 
} /* end of IFF_ABIT */

