home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 3
/
goldfish_volume_3.bin
/
files
/
fish
/
disks
/
d1104.lha
/
Programs
/
Image2C
/
i2c.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-19
|
25KB
|
683 lines
/****************************************************************************
*
* I2C (Image2'C') 1.2
* Copyright © 1994,1995 Udo Schuermann
* All rights reserved
*
* This program uses iffparse.library to load an ILBM from a FORM IFF
* (in plain English, it loads an IFF picture) and produces output that
* can be used directly as part of a struct Image in your 'C' source
* code.
*
* I make this code available as a demonstration of an exceedingly simple,
* yet functional program that uses iffparse.library and does something
* moderately useful with it. Of some interest might be the fact that
* the program extracts a number of additional properties from the file,
* if they are present: ANNO, AUTH, (c), and FVER chunks are inserted in
* the output file as comments. Hopefully, none of these contain the end-
* comment symbol... :-7
*
* THIS PROGRAM MAY *NOT* BE DISTRIBUTED WITHOUT SOURCE CODE AND ALL
* NOTICES INTACT. YOU MAY NOT SELL THIS PROGRAM OR INCLUDE IT WITH
* A COMMERCIAL PRODUCT WITHOUT EXPRESS WRITTEN PERMISSION FROM THE
* AUTHOR. IT IS PERMITTED TO DISTRIBUTE THIS PROGRAM BY ELECTRONIC
* MEANS (USENET), OR AS PART OF FRED FISH'S CD-ROMS OR RELATED
* COLLECTIONS. YOU MAY USE IT FOR INSTRUCTIONAL PURPOSES, AND EVEN
* GIVE IT TO FRIENDS, BUT DON'T YOU SELL IT OR YOUR NAME SHALL BE
* FOREVER STAINED.
*
* Commodore is dead. Long live the Amiga!
*
* Share and enjoy! ;-)
*
* ---------------------------------------------------------------------
*
* This program uses the following CLI template (I am not using standard
* code for that, but am parsing the command line on my own):
*
* ILBMFILE/A,SYMPREFIX/A,NOINFO/S,NOPENS/S,NODATA/S,NOIMAGESTRUCT/S,
* NORGB4/S,USEIFDEFS/S,NOCHIP/S
*
* ILBMFILE/A Must always be given. This is the IFF ILBM input
* file to be converted. I2C supports images up to
* 8 bitplanes deep (actually, any bitplane oriented
* ILBM)
*
* SYMPREFIX/A Must always be given. The symbol prefix for this
* image file. This forms the prefix to all symbols
* in the file.
* Example: A prefix of "myImage_" will generate
* symbols such as "UWORD myImage_ImageData[]"
*
* NOINFO/S This switch will cause image information, such
* such as height, width, depth, number of colors
* to be omitted. See also NOIMAGESTRUCT below!
*
* NOPENS/S This switch will cause pens (used by LoadRGB32()
* for example) to be omitted.
*
* NODATA/S This switch will cause the actual image data to
* be omitted. See also NOIMAGESTRUCT below!
*
* NOIMAGESTRUCT/S This switch will cause a "struct Image ..." item
* to be omitted. This item requires the presence
* of INFO and DATA items; if you specify that either
* or both of those should not be included (NOINFO
* and/or NODATA) but you do not also specify the
* NOIMAGESTRUCT, then I2C will reverse your decision
* on NOINFO and/or NODATA so that the Image struct
* can be built.
*
* ADDRGB4/S This switch will cause register color values to
* be added. Such values are 12-bit only and are
* probably of use only for older software. It is
* for this reason that this is the only switch that
* needs to be specified to add something to the
* code; i.e. if not specified you will NOT get the
* information for this item.
*
* USEIFDEFS/S This switch encloses the INFO, PENS, DATA, IMG,
* and RGB4 sections with #ifdef/#endif constructs
* to allow you to build a source file with ALL
* information, but decide at a later time which
* portions the compiler should include or ignore.
* Use of this switch enables an additional level
* of flexibility, which you may or may not find
* of use.
*
* The following #define statements used BEFORE you
* #include the source code generated by I2C will
* tell the compiler which portions of the file to
* use and which to ignore:
*
* #define I2C_IMAGE_INFO Accept image info
* #define I2C_IMAGE_PENS Accept RGB32 pens
* #define I2C_IMAGE_RGB4 Accept 4-bit pens
* #define I2C_IMAGE_DATA Accept image data
* #define I2C_IMAGE_IMG Accept struct Image
*
* NOCHIP/S Omit the __chip attribute on structures. This may
* be desirable if you are going to remap image colors
* anyway and won't be needing the original in chip
* RAM.
*
* If you are not clear on some of the points described above, you are
* hereby STRONGLY advised to run the program on a test image and see what
* the resulting output file contains. Try this:
*
* I2C TestImage.IFF MyTest_ USEIFDEFS
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <exec/types.h>
#include <libraries/iffparse.h>
#include <proto/dos.h>
#include <proto/iffparse.h>
/* If we define __MYDATE__ from the commandline, then we'll use that instead of
* redefining it to the standard Amiga __AMIGADATE__ (which is broken in SAS/C
* 6.51 whenever both the month and the day require two digits.)
*/
#ifndef __MYDATE__
#define __MYDATE__ __AMIGADATE__
#endif
#define VERSION "1.2"
char const VER[] = "$VER: Image2'C' "VERSION" "__MYDATE__;
BOOL AddINFO = TRUE;
BOOL AddPENS = TRUE;
BOOL AddDATA = TRUE;
BOOL AddRGB4 = FALSE;
BOOL AddIMG = TRUE;
BOOL UseIFDEFs = FALSE;
BOOL UseCHIP = TRUE;
char *ILBMFILE = NULL;
char *SYMPREFIX = NULL;
struct IFFHandle *OpenFileAsIFF( char *filename ) {
struct IFFHandle *iff;
if( iff = AllocIFF() ) {
if( iff->iff_Stream = (ULONG)Open(filename,MODE_OLDFILE) ) { /* open the file stream */
InitIFFasDOS( iff ); /* initialize this as a DOS stream */
if( OpenIFF( iff, IFFF_READ ) == 0 ) /* now open it as an IFF */
return iff; /* and return read-to-go IFF handle */
else
Close( iff->iff_Stream ); /* not an IFF file; close file */
} else
fprintf(stderr,"File unavailable (%s)!\n",filename);
FreeIFF( iff ); /* free the iff handle */
} else
fprintf(stderr,"Out of memory opening (%s)!\n",filename);
return NULL; /* return failure */
} /* OpenFileAsIFF() */
#define ID_ILBM MAKE_ID('I','L','B','M')
#define ID_BMHD MAKE_ID('B','M','H','D')
#define ID_CMAP MAKE_ID('C','M','A','P')
#define ID_BODY MAKE_ID('B','O','D','Y')
#define ID_AUTH MAKE_ID('A','U','T','H')
#define ID_CPRT MAKE_ID('(','c',')',' ')
#define ID_ANNO MAKE_ID('A','N','N','O')
#define ID_FVER MAKE_ID('F','V','E','R')
#define mskHasMask 1 /* the only mask that REALLY needs handling */
#define ByteRun1 1 /* the only compression we understand */
typedef UBYTE Masking;
typedef UBYTE Compression;
struct BitMapHeader {
UWORD w, h;
WORD x, y;
UBYTE nPlanes;
Masking masking;
Compression compression;
UBYTE reserved1;
UWORD transparentColor;
UBYTE xAspect, yAspect;
WORD pageWidth, pageHeight;
};
/* The ByteToWordStream() function, along with a limited set of global variables,
* permits us to produce really lovely, and well-formatted output.
*
* OnNewLine is externally set to 1 whenever we have finished with a scanline so
* that the next time we call ByteToWordStream, we start nicely on a new line.
* If you never use OnNewLine, then all data is merely dumped one word after
* another. NO FUNCTIONALITY IS LOST, it just won't look nice. Your compiler
* doesn't care. Lines are ALWAYS limited to 11 words per line.
*
* LineHeader, if not set to a "" string, is printed before a new line is output,
* so we can print the nice "/× Plane 2 ×/" items before the new plane actually
* begins, but still give this function the chance to clean up the previous line
* by adding a comma and newline to it, etc.
* If you never use LineHeader, you will simply be missing the human-readable
* markers for the bit planes. No biggie. Again, your compiler couldn't care
* less.
*/
#define WORDS_PER_LINE 11
UBYTE OnNewLine = 0;
char LineHeader[64] = "";
void ByteToWordStream( char c ) {
static char prev;
static UBYTE odd=0;
static UBYTE needComma=0;
static UBYTE onLine=0;
if( odd ) {
odd = 0;
if( needComma ) /* prevents leading comma AND unnecessary trailing comma */
printf(",");
else
needComma = 1;
if( (onLine == WORDS_PER_LINE) || OnNewLine ) {
printf("\n");
onLine = 0;
OnNewLine = 0;
}
if( *LineHeader ) {
printf("%s",LineHeader);
*LineHeader = '\0';
}
if( onLine == 0 )
printf(" ");
printf("0x%02x%02x",prev,c);
onLine++;
} else
odd = 1;
prev = c;
} /* ByteToWordStream() */
/* These are all the properties in the IFF FORM ILBM that we are interested in.
* We use a PropChunk() in conjunction with FindProp() in our main() function to
* locate these and then obtain a pointer to their data. If a pointer is NULL,
* then no such property exists in the IFF FORM ILBM.
*/
struct StoredProperty *auth_prop,*cprt_prop,*anno_prop,*fver_prop;
/* Here is our nifty routine that scans the ILBM and creates nice 'C' code!
* Here is how it works: Most common ILBMs are stored in this way:
*
* (Scanline 1, Plane 1)(mask)(Scanline 1, Plane 2)(mask)(Scanline 1, Plane 3)(mask)
* (Scanline 2, Plane 1)(mask)(Scanline 2, Plane 2)(mask)(Scanline 2, Plane 3)(mask)
* (Scanline 3, Plane 1)(mask)(Scanline 3, Plane 2)(mask)(Scanline 3, Plane 3)(mask)
* (Scanline 4, Plane 1)(mask)(Scanline 4, Plane 2)(mask)(Scanline 4, Plane 3)(mask)
* (Scanline 5, Plane 1)(mask)(Scanline 5, Plane 2)(mask)(Scanline 5, Plane 3)(mask)
*
* In order to extract only Plane 1 information, one scanline at a time,
* we'd have to skip information in the file, i.e. read (Scanline 1, Plane 1)
* and then skip (Scanline 1, Plane 2) and (Scanline 1, Plane 3)
* This, in fact, is what we do. This process is quite fast, especially
* with small images, and allows us to work without additional image buffers,
* which is something nice, too.
* Once we have Plane 1 extracted, we start from the beginning again and
* now we skip (Scanline 1, Plane 1), process (Scanline 1, Plane 2) and again
* skip (Scanline 1, Plane 3). We continue once again through the whole file,
* extracting all scanlines for the 2nd plane.
* And the 3rd plane is handled the same way. Once we have processed all
* bitplanes, we're done!
* All this is handled with 3 nested while-loops.
*/
void CreateSource(struct IFFHandle *iff,
struct BitMapHeader *bmhd,
UBYTE *cmap,
struct ContextNode *body_context,
char *Filename,
char *ID ) {
ULONG n;
UWORD ColorReg;
UBYTE *colors;
ULONG bodysize;
char *bodybuffer;
char *iffInfo;
BOOL Mask = bmhd->masking;
printf("/* Source created by Image2'C' "VERSION"\n"
" * Copyright \© 1994,1995 Udo Schuermann\n"
" * All rights reserved\n"
" *\n");
printf(" * · Inputfile: \"%s\"\n",
Filename);
if( AddDATA && !UseCHIP )
printf(" * · Image data is not stored in Chip RAM\n");
if( UseIFDEFs )
printf(" * · #ifdef/#endif pairs permit selective activation of sections\n");
printf(" * · Symbol prefix = \"%s\"\n",SYMPREFIX);
printf(" *\n");
if( fver_prop )
if( iffInfo = (UBYTE *)fver_prop->sp_Data )
printf(" * Version: %s=n",iffInfo);
if( auth_prop )
if( iffInfo = (UBYTE *)auth_prop->sp_Data )
printf(" * Author: %s\n",iffInfo);
if( cprt_prop )
if( iffInfo = (UBYTE *)cprt_prop->sp_Data )
printf(" * Copyright: %s\n",iffInfo);
if( anno_prop )
if( iffInfo = (UBYTE *)anno_prop->sp_Data )
printf(" * %s\n",iffInfo);
printf(" */\n\n");
if( AddIMG ) {
AddINFO = TRUE; /* we MUST have this part */
AddDATA = TRUE; /* same with this one! */
if( UseIFDEFs ) {
printf("#ifdef I2C_IMAGE_IMG\n");
printf("/* make sure we have all components for the (struct Image) stuff */\n");
printf("#ifndef I2C_IMAGE_INFO\n");
printf("#define I2C_IMAGE_INFO\n");
printf("#endif\n");
printf("#ifndef I2C_IMAGE_DATA\n");
printf("#define I2C_IMAGE_DATA\n");
printf("#endif\n");
printf("#endif\n\n");
}
}
if( AddINFO ) {
if( UseIFDEFs )
printf("#ifdef I2C_IMAGE_INFO\n");
printf("/* Image information */\n");
printf("#define %sImageWide %d /* pixels */\n",ID,bmhd->w);
printf("#define %sImageHigh %d /* lines */\n",ID,bmhd->h);
printf("#define %sImageDeep %d /* bit planes */\n",ID,bmhd->nPlanes);
printf("#define %sImageColors %ld /* planes^2 */\n",ID,1L<<bmhd->nPlanes);
if( UseIFDEFs )
printf("#endif\n");
}
if( AddPENS ) {
if( UseIFDEFs )
printf("\n#ifdef I2C_IMAGE_PENS");
printf("\n/* Register color table (32 bit RGB register values)\n"
" * Leading these is a WORD with total count and a word\n"
" * with the first color to be obtained. We'll start\n"
" * with the first color there (0)\n"
" */\n");
printf("ULONG %sColorPENS[] = {\n",ID);
n = 1L<<bmhd->nPlanes;
printf(" (%dL<<16)+0,\n",n);
colors = cmap;
while( n-- ) {
printf(" 0x%02x%02x%02x%02x, 0x%02x%02x%02x%02x, 0x%02x%02x%02x%02x",
*colors,*colors,*colors,*colors,
*(colors+1),*(colors+1),*(colors+1),*(colors+1),
*(colors+2),*(colors+2),*(colors+2),*(colors+2));
colors += 3;
printf(",\n");
} /* while */
printf(" 0\n"); /* is this one really necessary? */
printf("}; /* %sColorPENS[] */\n",ID);
if( UseIFDEFs )
printf("#endif\n");
}
if( AddRGB4 ) {
if( UseIFDEFs )
printf("\n#ifdef I2C_IMAGE_RGB4");
printf("\n/* Register color table (4-bit RGB register values):\n"
" * One packed register value for each `ImageColors`\n"
" * This table is compatible with the LoadRGB4() function\n"
" * BUT IS ACCURATE ONLY TO 4 BITS (I.E. A 12-BIT PALETTE)\n"
" */\n");
printf("UWORD %sColorRGB4[] = {\n",ID);
n = 1L<<bmhd->nPlanes;
colors = cmap;
while( n-- ) {
ColorReg = (((UWORD)(*colors) & 0x00f0) << 4) | ((UWORD)(*(colors+1))) & 0x00f0 | (((UWORD)(*(colors+2))) &0x00f0) >> 4;
printf(" 0x%03x",ColorReg);
colors += 3;
if( n )
printf(",\n");
else
printf("\n");
} /* while */
printf("}; /* %sColorRGB4[] */\n",ID);
if( UseIFDEFs )
printf("#endif\n");
}
if( AddDATA )
if( bodybuffer = malloc(bodysize=body_context->cn_Size) ) {
if( (bodysize = ReadChunkBytes( iff, bodybuffer, body_context->cn_Size )) == body_context->cn_Size ) {
char *p;
UBYTE n;
UWORD Wide = ((bmhd->w + 15) >> 4) * 2; /* actual width of a scanline in bytes */
UWORD Plane; /* Bitplane being output to the 'C' file */
UWORD curPlane; /* Bitplane being scanned out of the IFF file */
UWORD curLine; /* Scanline being scanned out of the IFF file */
UWORD curWide; /* What's been output from the scanline */
if( UseIFDEFs )
printf("\n#ifdef I2C_IMAGE_DATA");
printf("\n/* Image data,%s one scanline at a time */\n",((bmhd->nPlanes > 1)?" plane-by-plane, and":""));
printf("UWORD %s%sImageData[] = {\n",(UseCHIP?"__chip ":""),ID);
Plane = 1;
while( Plane <= bmhd->nPlanes ) {
if( bmhd->nPlanes > 1 )
sprintf(LineHeader," /* Plane %d */\n",Plane);
p = bodybuffer; /* point at the beginning of the buffer */
curPlane = 1;
curLine = bmhd->h;
while( curLine ) {
if( bmhd->compression == 1 ) {
curWide = Wide;
while( curWide ) {
n = *p++; /* get a character from the buffer */
if( (n >= 0) && (n <= 0x7f) ) { /* this is a 'copy next n bytes literally' code? */
n++;
curWide -= n;
if( Plane == curPlane ) {
while( n-- )
ByteToWordStream(*p++);
} else
p += n;
} else
if( n != -128 ) { /* this is a 'duplicate next byte n times' code? */
char c = *p++;
n = 1 - n;
curWide -= n;
if( Plane == curPlane ) {
while( n-- )
ByteToWordStream(c);
}
}
} /* while */
/* if we have a standard mask, we'll just skip and ignore it. Tough luck, mate! */
if( Mask == mskHasMask ) {
curWide = Wide;
while( curWide ) {
n = *p++; /* get a character from the buffer */
if( (n >= 0) && (n <= 0x7f) ) { /* this is a 'copy next n bytes literally' code? */
n++;
curWide -= n;
while( n-- )
p++;
} else
if( n != -128 ) { /* this is a 'duplicate next byte n times' code? */
p++;
n = 1 - n;
curWide -= n;
}
} /* while */
}
} else {
/* UNCOMPRESSED; the same code structure would work as we used above, but we've
* optimized this a bit to avoid excessive checking of (Plane==curPlane)...
*/
curWide = Wide;
if( Plane == curPlane ) {
while( curWide-- )
ByteToWordStream(*p++);
} else
p += curWide;
/* if we have a standard mask, we'll just skip and ignore it. Tough luck, mate! */
if( Mask == mskHasMask )
p += curWide;
}
if( curPlane == bmhd->nPlanes ) { /* reached last plane info for this scanline? */
curPlane = 1;
curLine--;
OnNewLine = 1;
} else
curPlane++;
} /* while */
Plane++;
} /* while */
printf("\n}; /* %sImageData[] */\n",ID);
if( UseIFDEFs )
printf("#endif\n");
if( AddIMG ) {
if( UseIFDEFs )
printf("\n#ifdef I2C_IMAGE_IMG");
printf("\nstruct Image %sImage = {0,0,%sImageWide,%sImageHigh,%sImageDeep,%sImageData,0x%02x,0,NULL};\n",
ID,ID,ID,ID,ID,(1<<bmhd->nPlanes)-1);
if( UseIFDEFs )
printf("#endif\n");
}
} else
fprintf(stderr,"Read only %ld bytes instead of %ld from BODY chunk of file (%s)\n",bodysize,body_context->cn_Size,ILBMFILE);
free( bodybuffer );
} else
fprintf(stderr,"No memory to load %ld bytes from BODY chunk of file (%s)\n",body_context->cn_Size,ILBMFILE);
} /* CreateSource() */
#ifdef DEBUG
#define MASKING(n) (n==0?"None":(n==1?"Mask":(n==2?"Transparent":(n==3?"Lasso":"<unknown>"))))
#define COMPRESS(n) (n==0?"None":(n==1?"ByteRun1":"<unknown>"))
#endif
int main( int argc, char *argv[] ) {
struct IFFHandle *IFF;
struct StoredProperty *bmhd_prop,*cmap_prop;
struct ContextNode *body_context;
int argn;
BOOL badargs = FALSE;
for( argn=1; argn<argc; argn++ ) {
if( strnicmp("ILBMFILE",argv[argn],8) == 0 ) {
if( argv[argn][8] == '=' )
ILBMFILE = &argv[argn][9];
else {
argn++;
if( argn < argc )
ILBMFILE = argv[argn];
else {
fprintf(stderr,"No argument for ILBMFILE key\n");
badargs = TRUE;
}
}
} else
if( strnicmp("SYMPREFIX",argv[argn],9) == 0 ) {
if( argv[argn][9] == '=' )
SYMPREFIX = &argv[argn][10];
else {
argn++;
if( argn < argc )
SYMPREFIX = argv[argn];
else {
fprintf(stderr,"No argument for SYMPREFIX key\n");
badargs = TRUE;
}
}
} else
if( stricmp("NOINFO",argv[argn]) == 0 ) {
AddINFO = FALSE;
} else
if( stricmp("NOPENS",argv[argn]) == 0 ) {
AddPENS = FALSE;
} else
if( stricmp("NODATA",argv[argn]) == 0 ) {
AddDATA = FALSE;
} else
if( stricmp("NOIMAGESTRUCT",argv[argn]) == 0 ) {
AddIMG = FALSE;
} else
if( stricmp("NOIMG",argv[argn]) == 0 ) {
AddIMG = FALSE;
} else
if( stricmp("ADDRGB4",argv[argn]) == 0 ) {
AddRGB4 = TRUE;
} else
if( stricmp("USEIFDEFS",argv[argn]) == 0 ) {
UseIFDEFs = TRUE;
} else
if( stricmp("NOCHIP",argv[argn]) == 0 ) {
UseCHIP = FALSE;
} else {
if( ILBMFILE )
if( SYMPREFIX ) {
fprintf(stderr,"Too many arguments; don't know what do to with \"%s\"\n",argv[argn]);
badargs = TRUE;
} else
SYMPREFIX = argv[argn];
else
ILBMFILE = argv[argn];
}
}
if( (ILBMFILE == NULL) || (SYMPREFIX == NULL) || badargs ) {
if( badargs )
fprintf(stderr,"\n");
fprintf(stderr,"Image2'C' "VERSION"\n"
"Copyright © 1994,1995 Udo Schuermann\n"
"All rights reserved\n\n"
"Template: ILBMFILE/A,SYMPREFIX/A,NOINFO/S,NOPENS/S,NODATA/S,NOIMG=NOIMAGESTRUCT/S,ADDRGB4/S,USEIFDEFS/S,NOCHIP/S\n"
" ILBMFILE/A An IFF ILBM (picture) file\n"
" SYMPREFIX/A Prefix for symbols (may be \"\")\n"
" NOINFO/S Suppress image size/depth information\n"
" NOPENS/S Suppress RGB32 pens\n"
" NODATA/S Suppress image data\n"
" NOIMG=NOIMAGESTRUCT/S Suppress \"struct Image...\"\n"
" ADDRGB4/S Add old 4-bit RGB color table\n"
" USEIFDEFS/S Enclose sections with #ifdef/#endif pairs\n"
" NOCHIP/S Omit the __chip attribute on structs\n");
exit(10);
}
if( IFF = OpenFileAsIFF( ILBMFILE ) ) { /* open file for IFF parsing */
struct BitMapHeader *bmhd;
UBYTE *cmap;
int error;
PropChunk( IFF, ID_ILBM, ID_AUTH ); /* collect AUTH (if any) */
PropChunk( IFF, ID_ILBM, ID_CPRT ); /* collect (c) (if any) */
PropChunk( IFF, ID_ILBM, ID_ANNO ); /* collect ANNO (if any) */
PropChunk( IFF, ID_ILBM, ID_FVER ); /* collect FVER (if any) */
if( error = PropChunk( IFF, ID_ILBM, ID_BMHD ) ) /* collect BMHD */
fprintf(stderr,"Error %ld with PropChunk(ILBM,BMHD) in file (%s)\n",error,ILBMFILE);
if( error = PropChunk( IFF, ID_ILBM, ID_CMAP ) ) /* collect CMAP */
fprintf(stderr,"Error %ld with PropChunk(ILBM,CMAP) in file (%s)\n",error,ILBMFILE);
if( error = StopChunk( IFF, ID_ILBM, ID_BODY ) ) /* stop when we reach BODY */
fprintf(stderr,"Error %ld with StopChunk(ILBM,BODY) in file (%s)\n",error,ILBMFILE);
if( ParseIFF( IFF, IFFPARSE_SCAN ) == 0 ) { /* Let's BOOGIE!!! (we stop at BODY) */
auth_prop = FindProp( IFF, ID_ILBM, ID_AUTH ); /* get pointer to AUTH, if any */
cprt_prop = FindProp( IFF, ID_ILBM, ID_CPRT );
anno_prop = FindProp( IFF, ID_ILBM, ID_ANNO );
fver_prop = FindProp( IFF, ID_ILBM, ID_FVER );
if( bmhd_prop = FindProp( IFF, ID_ILBM, ID_BMHD ) ) { /* get pointer to BMHD; required! */
bmhd = (struct BitMapHeader *)bmhd_prop->sp_Data;
if( cmap_prop = FindProp( IFF, ID_ILBM, ID_CMAP ) ) { /* get pointer to CMAP; required! */
cmap = (UBYTE *)cmap_prop->sp_Data;
if( body_context = CurrentChunk( IFF ) ) { /* where we stopped is the BODY chunk */
#ifdef DEBUG
fprintf(stderr,"BMHD.width = %4d\n",bmhd->w);
fprintf(stderr,"BMHD.height = %4d\n",bmhd->h);
fprintf(stderr,"BMHD.depth = %4d\n",bmhd->nPlanes);
fprintf(stderr,"BMHD.masking = %s\n",MASKING(bmhd->masking));
fprintf(stderr,"BMHD.compression = %s\n",COMPRESS(bmhd->compression));
fprintf(stderr,"BMHD.transpColor = %4d\n",bmhd->transparentColor);
fprintf(stderr,"BMHD.Aspect (x:y)= %d:%d\n",bmhd->xAspect,bmhd->yAspect);
fprintf(stderr,"\n");
fprintf(stderr,"CMAP.SIZE = %ld\n",cmap_prop->sp_Size);
fprintf(stderr,"\n");
fprintf(stderr,"BODY.SIZE = %ld\n",body_context->cn_Size);
#endif
/* make sure we can handle the masking and compression that is used */
if(((bmhd->compression == 0) || (bmhd->compression == 1)) &&
((bmhd->masking == 0) || (bmhd->masking == 1) || (bmhd->masking == 2) ||
(bmhd->masking == 3)))
CreateSource( IFF, bmhd, cmap, body_context, ILBMFILE, SYMPREFIX );
else {
/* error messages as to why we can't process this file */
printf("Sorry, I do not know how to handle images (%s) with compression code %d!\n",
ILBMFILE,bmhd->compression);
}
} else
fprintf(stderr,"Missing BODY chunk in file (%s)\n",ILBMFILE);
} else
fprintf(stderr,"Missing CMAP chunk in file (%s)\n",ILBMFILE);
} else
fprintf(stderr,"Missing BMHD chunk in file (%s)\n",ILBMFILE);
} else
fprintf(stderr,"File (%s) seems to contain no images\n",ILBMFILE);
CloseIFF( IFF ); /* close iff parsing */
Close( IFF->iff_Stream ); /* close file stream */
FreeIFF( IFF ); /* free associated internal structures */
} else
fprintf(stderr,"File (%s) unavailable or not a FORM IFF\n",ILBMFILE);
} /* main() */