home *** CD-ROM | disk | FTP | other *** search
- /// "Defines for Include"
- #define __USE_SYSBASE
- ///
-
- /// "Include files"
- #include <proto/exec.h>
- #include <proto/dos.h>
- #include <proto/iffparse.h>
- #include <datatypes/pictureclass.h>
- ///
-
- /// "Defines for program"
- #define TEMPLATE "IFFIMAGE/A,DESTINATION/A"
- #define USAGE_STR "Usage: ExtractBody IFFIMAGE DESTINATION\n"
- ///
-
- char Version[] = "$VER: ExtractBody 37.2 (03.6.95)";
-
- /// "Funtion prototypes"
- ULONG Main( VOID );
- VOID SPrintf( STRPTR, STRPTR, ... );
- ///
-
- /// "Global vars"
- struct ExecBase *SysBase;
- struct DosLibrary *DOSBase;
- struct Library *IFFParseBase;
- ///
-
- /// "Main program"
- __saveds ULONG Main( VOID )
- {
- struct RDArgs *Args = NULL;
- struct IFFHandle *IFFFile;
- struct StoredProperty *Chunk;
- struct BitMapHeader *BMHead;
- LONG ArgsArray[] = { 0, 0 };
- ULONG RetCode = RETURN_FAIL;
- BPTR SrcFile, DestFileH, DestFileC;
- UBYTE Buffer[100], BodyBuffer[1024], *SrcFileName, DestFileNameH[100];
- UBYTE DestFileNameC[100], *StructName;
-
- SysBase = (*((struct ExecBase **) 0x00000004));
-
- if( ! ( DOSBase = (struct DosLibrary *)OpenLibrary( "dos.library", 37 ) ) )
- goto CloseUp;
-
- if( ! ( IFFParseBase = OpenLibrary( "iffparse.library", 37 ) ) )
- goto CloseUp;
-
- if( ! ( Args = (struct RDArgs *)ReadArgs( TEMPLATE, ArgsArray, NULL ) ) ) {
- PutStr( USAGE_STR );
- goto CloseUp;
- }
-
- SrcFileName = (UBYTE *)(ArgsArray[0]);
- SPrintf( DestFileNameH, "%s.h", ArgsArray[1] );
- SPrintf( DestFileNameC, "%s.c", ArgsArray[1] );
- StructName = FilePart( (UBYTE *)(ArgsArray[1]) );
- RetCode = RETURN_OK;
-
- if( SrcFile = Open( SrcFileName, MODE_OLDFILE ) ) {
- if( (DestFileH = Open( DestFileNameH, MODE_NEWFILE )) && (DestFileC = Open( DestFileNameC, MODE_NEWFILE )) ) {
- if( IFFFile = AllocIFF() ) {
- InitIFFasDOS( IFFFile );
- IFFFile->iff_Stream = SrcFile;
- PropChunk( IFFFile, ID_ILBM, ID_BMHD );
- PropChunk( IFFFile, ID_ILBM, ID_CMAP );
- StopChunk( IFFFile, ID_ILBM, ID_BODY );
- if( ! OpenIFF( IFFFile, IFFF_READ ) ) {
- ParseIFF( IFFFile, IFFPARSE_SCAN );
- if( Chunk = FindProp( IFFFile, ID_ILBM, ID_BMHD ) ) {
- UWORD Bytes;
-
- BMHead = Chunk->sp_Data;
- FPuts( DestFileH, "/* File generated by ExtractBody by Sandro Tolaini */\n\n" );
- FPuts( DestFileC, "/* File generated by ExtractBody by Sandro Tolaini */\n\n" );
-
- FPuts( DestFileH, "#define BODY_" );
- FPuts( DestFileH, StructName );
- SPrintf( Buffer, "_Width %lu\n", (ULONG)(BMHead->bmh_Width) );
- FPuts( DestFileH, Buffer );
-
- FPuts( DestFileH, "#define BODY_" );
- FPuts( DestFileH, StructName );
- SPrintf( Buffer, "_Height %lu\n", (ULONG)(BMHead->bmh_Height) );
- FPuts( DestFileH, Buffer );
-
- FPuts( DestFileH, "#define BODY_" );
- FPuts( DestFileH, StructName );
- SPrintf( Buffer, "_Depth %lu\n", (ULONG)(BMHead->bmh_Depth) );
- FPuts( DestFileH, Buffer );
-
- FPuts( DestFileH, "#define BODY_" );
- FPuts( DestFileH, StructName );
- SPrintf( Buffer, "_Masking %lu\n", (ULONG)(BMHead->bmh_Masking) );
- FPuts( DestFileH, Buffer );
-
- FPuts( DestFileH, "#define BODY_" );
- FPuts( DestFileH, StructName );
- SPrintf( Buffer, "_Transparent %lu\n", (ULONG)(BMHead->bmh_Transparent) );
- FPuts( DestFileH, Buffer );
-
- FPuts( DestFileH, "#define BODY_" );
- FPuts( DestFileH, StructName );
- SPrintf( Buffer, "_Compression %lu\n", (ULONG)(BMHead->bmh_Compression) );
- FPuts( DestFileH, Buffer );
-
- FPuts( DestFileH, "\nextern unsigned long BODY_" );
- FPuts( DestFileH, StructName );
- FPuts( DestFileH, "_Colors[];\n" );
-
- FPuts( DestFileH, "\nextern unsigned char BODY_" );
- FPuts( DestFileH, StructName );
- FPuts( DestFileH, "_Data[];\n" );
-
- if( Chunk = FindProp( IFFFile, ID_ILBM, ID_CMAP ) ) {
- UBYTE *DataPtr = (UBYTE *)(Chunk->sp_Data);
- UWORD i;
-
- FPuts( DestFileC, "unsigned long BODY_" );
- FPuts( DestFileC, StructName );
- FPuts( DestFileC, "_Colors[] = {\n" );
- for( i=0; i<((Chunk->sp_Size)/3); i++, DataPtr+=3 ) {
- SPrintf( Buffer, "\t0x%08.lx, 0x%08.lx, 0x%08.lx,\n", (*(DataPtr)*0x01010101), (*(DataPtr+1)*0x01010101), (*(DataPtr+2)*0x01010101) );
- FPuts( DestFileC, Buffer );
- }
- FPuts( DestFileC, "};\n" );
- }
-
- FPuts( DestFileC, "\nunsigned char BODY_" );
- FPuts( DestFileC, StructName );
- FPuts( DestFileC, "_Data[] = {\n" );
- while( ( Bytes = ReadChunkBytes( IFFFile, &BodyBuffer, 1024 ) ) > 0 ) {
- UBYTE *BodyData = BodyBuffer;
- UWORD x, y;
-
- for( x=0; x<(Bytes/8); x++) {
- FPuts( DestFileC, "\t" );
- for( y=0; y<8; y++, BodyData++ ) {
- SPrintf( Buffer, "0x%02.lx, ", (LONG)(*BodyData) );
- FPuts( DestFileC, Buffer );
- }
- FPuts( DestFileC, "\n" );
- }
- if( Bytes%8 ) FPuts( DestFileC, "\t" );
- for( y=0; y<(Bytes%8); y++, BodyData++ ) {
- SPrintf( Buffer, "0x%02.lx, ", (LONG)(*BodyData) );
- FPuts( DestFileC, Buffer );
- }
- }
- FPuts( DestFileC, "\n};\n" );
- }
- CloseIFF( IFFFile );
- }
- FreeIFF( IFFFile );
- }
- Close( DestFileC );
- Close( DestFileH );
- }
- Close( SrcFile );
- }
-
- CloseUp:
- if( Args ) FreeArgs( Args );
- if( IFFParseBase ) CloseLibrary( IFFParseBase );
- if( DOSBase ) CloseLibrary( (struct Library *)DOSBase );
- return( RetCode );
- }
- ///
-
- /// "Support functions"
- UWORD StuffChar[] = { 0x16C0, 0x4E75 };
-
- VOID SPrintf( STRPTR Buffer, STRPTR Msg, ... )
- {
- RawDoFmt( Msg, (APTR)( &Msg + 1 ), (VOID (*)())StuffChar, Buffer );
- }
- ///
-
-