home *** CD-ROM | disk | FTP | other *** search
- /**************************************************
- *
- * 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 */
-
-