home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
487.lha
/
FileID_v1.30
/
ILBM.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-11
|
11KB
|
431 lines
/**************************************************
*
* 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 */