home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / Outils / Conversion / Gfx / ExtractBody372.lha / ExtractBody.c next >
Encoding:
C/C++ Source or Header  |  1995-06-03  |  5.4 KB  |  181 lines

  1. /// "Defines for Include"
  2. #define __USE_SYSBASE
  3. ///
  4.  
  5. /// "Include files"
  6. #include <proto/exec.h>
  7. #include <proto/dos.h>
  8. #include <proto/iffparse.h>
  9. #include <datatypes/pictureclass.h>
  10. ///
  11.  
  12. /// "Defines for program"
  13. #define TEMPLATE "IFFIMAGE/A,DESTINATION/A"
  14. #define USAGE_STR "Usage: ExtractBody IFFIMAGE DESTINATION\n"
  15. ///
  16.  
  17. char Version[] = "$VER: ExtractBody 37.2 (03.6.95)";
  18.  
  19. /// "Funtion prototypes"
  20. ULONG Main( VOID );
  21. VOID SPrintf( STRPTR, STRPTR, ... );
  22. ///
  23.  
  24. /// "Global vars"
  25. struct ExecBase *SysBase;
  26. struct DosLibrary *DOSBase;
  27. struct Library *IFFParseBase;
  28. ///
  29.  
  30. /// "Main program"
  31. __saveds ULONG Main( VOID )
  32. {
  33.     struct RDArgs *Args = NULL;
  34.     struct IFFHandle *IFFFile;
  35.     struct StoredProperty *Chunk;
  36.     struct BitMapHeader *BMHead;
  37.     LONG ArgsArray[] = { 0, 0 };
  38.     ULONG RetCode = RETURN_FAIL;
  39.     BPTR SrcFile, DestFileH, DestFileC;
  40.     UBYTE Buffer[100], BodyBuffer[1024], *SrcFileName, DestFileNameH[100];
  41.     UBYTE DestFileNameC[100], *StructName;
  42.  
  43.     SysBase = (*((struct ExecBase **) 0x00000004));
  44.  
  45.     if( ! ( DOSBase = (struct DosLibrary *)OpenLibrary( "dos.library", 37 ) ) )
  46.         goto CloseUp;
  47.  
  48.     if( ! ( IFFParseBase = OpenLibrary( "iffparse.library", 37 ) ) )
  49.         goto CloseUp; 
  50.  
  51.     if( ! ( Args = (struct RDArgs *)ReadArgs( TEMPLATE, ArgsArray, NULL ) ) ) {
  52.         PutStr( USAGE_STR );
  53.         goto CloseUp;
  54.     }
  55.  
  56.     SrcFileName = (UBYTE *)(ArgsArray[0]);
  57.     SPrintf( DestFileNameH, "%s.h", ArgsArray[1] );
  58.     SPrintf( DestFileNameC, "%s.c", ArgsArray[1] );
  59.     StructName = FilePart( (UBYTE *)(ArgsArray[1]) );
  60.     RetCode = RETURN_OK;
  61.  
  62.     if( SrcFile = Open( SrcFileName, MODE_OLDFILE ) ) {
  63.         if( (DestFileH = Open( DestFileNameH, MODE_NEWFILE )) && (DestFileC = Open( DestFileNameC, MODE_NEWFILE )) ) {
  64.             if( IFFFile = AllocIFF() ) {
  65.                 InitIFFasDOS( IFFFile );
  66.                 IFFFile->iff_Stream = SrcFile;
  67.                 PropChunk( IFFFile, ID_ILBM, ID_BMHD );
  68.                 PropChunk( IFFFile, ID_ILBM, ID_CMAP );
  69.                 StopChunk( IFFFile, ID_ILBM, ID_BODY );
  70.                 if( ! OpenIFF( IFFFile, IFFF_READ ) ) {
  71.                     ParseIFF( IFFFile, IFFPARSE_SCAN );
  72.                     if( Chunk = FindProp( IFFFile, ID_ILBM, ID_BMHD ) ) {
  73.                         UWORD Bytes;
  74.  
  75.                         BMHead = Chunk->sp_Data;
  76.                         FPuts( DestFileH, "/* File generated by ExtractBody by Sandro Tolaini */\n\n" );
  77.                         FPuts( DestFileC, "/* File generated by ExtractBody by Sandro Tolaini */\n\n" );
  78.  
  79.                         FPuts( DestFileH, "#define BODY_" );
  80.                         FPuts( DestFileH, StructName );
  81.                         SPrintf( Buffer, "_Width %lu\n", (ULONG)(BMHead->bmh_Width) );
  82.                         FPuts( DestFileH, Buffer );
  83.  
  84.                         FPuts( DestFileH, "#define BODY_" );
  85.                         FPuts( DestFileH, StructName );
  86.                         SPrintf( Buffer, "_Height %lu\n", (ULONG)(BMHead->bmh_Height) );
  87.                         FPuts( DestFileH, Buffer );
  88.  
  89.                         FPuts( DestFileH, "#define BODY_" );
  90.                         FPuts( DestFileH, StructName );
  91.                         SPrintf( Buffer, "_Depth %lu\n", (ULONG)(BMHead->bmh_Depth) );
  92.                         FPuts( DestFileH, Buffer );
  93.  
  94.                         FPuts( DestFileH, "#define BODY_" );
  95.                         FPuts( DestFileH, StructName );
  96.                         SPrintf( Buffer, "_Masking %lu\n", (ULONG)(BMHead->bmh_Masking) );
  97.                         FPuts( DestFileH, Buffer );
  98.  
  99.                         FPuts( DestFileH, "#define BODY_" );
  100.                         FPuts( DestFileH, StructName );
  101.                         SPrintf( Buffer, "_Transparent %lu\n", (ULONG)(BMHead->bmh_Transparent) );
  102.                         FPuts( DestFileH, Buffer );
  103.  
  104.                         FPuts( DestFileH, "#define BODY_" );
  105.                         FPuts( DestFileH, StructName );
  106.                         SPrintf( Buffer, "_Compression %lu\n", (ULONG)(BMHead->bmh_Compression) );
  107.                         FPuts( DestFileH, Buffer );
  108.  
  109.                         FPuts( DestFileH, "\nextern unsigned long BODY_" );
  110.                         FPuts( DestFileH, StructName );
  111.                         FPuts( DestFileH, "_Colors[];\n" );
  112.  
  113.                         FPuts( DestFileH, "\nextern unsigned char BODY_" );
  114.                         FPuts( DestFileH, StructName );
  115.                         FPuts( DestFileH, "_Data[];\n" );
  116.  
  117.                         if( Chunk = FindProp( IFFFile, ID_ILBM, ID_CMAP ) ) {
  118.                             UBYTE *DataPtr = (UBYTE *)(Chunk->sp_Data);
  119.                             UWORD i;
  120.  
  121.                             FPuts( DestFileC, "unsigned long BODY_" );
  122.                             FPuts( DestFileC, StructName );
  123.                             FPuts( DestFileC, "_Colors[] = {\n" );
  124.                             for( i=0; i<((Chunk->sp_Size)/3); i++, DataPtr+=3 ) {
  125.                                 SPrintf( Buffer, "\t0x%08.lx, 0x%08.lx, 0x%08.lx,\n", (*(DataPtr)*0x01010101), (*(DataPtr+1)*0x01010101), (*(DataPtr+2)*0x01010101) );
  126.                                 FPuts( DestFileC, Buffer );
  127.                             }
  128.                             FPuts( DestFileC, "};\n" );
  129.                         }
  130.  
  131.                         FPuts( DestFileC, "\nunsigned char BODY_" );
  132.                         FPuts( DestFileC, StructName );
  133.                         FPuts( DestFileC, "_Data[] = {\n" );
  134.                         while( ( Bytes = ReadChunkBytes( IFFFile, &BodyBuffer, 1024 ) ) > 0 ) {
  135.                             UBYTE *BodyData = BodyBuffer;
  136.                             UWORD x, y;
  137.  
  138.                             for( x=0; x<(Bytes/8); x++) {
  139.                                 FPuts( DestFileC, "\t" );
  140.                                 for( y=0; y<8; y++, BodyData++ ) {
  141.                                     SPrintf( Buffer, "0x%02.lx, ", (LONG)(*BodyData) );
  142.                                     FPuts( DestFileC, Buffer );
  143.                                 }
  144.                                 FPuts( DestFileC, "\n" );
  145.                             }
  146.                             if( Bytes%8 ) FPuts( DestFileC, "\t" );
  147.                             for( y=0; y<(Bytes%8); y++, BodyData++ ) {
  148.                                 SPrintf( Buffer, "0x%02.lx, ", (LONG)(*BodyData) );
  149.                                 FPuts( DestFileC, Buffer );
  150.                             }
  151.                         }
  152.                         FPuts( DestFileC, "\n};\n" );
  153.                     }
  154.                     CloseIFF( IFFFile );
  155.                 }
  156.                 FreeIFF( IFFFile );
  157.             }
  158.             Close( DestFileC );
  159.             Close( DestFileH );
  160.         }
  161.         Close( SrcFile );
  162.     }
  163.  
  164. CloseUp:
  165.     if( Args ) FreeArgs( Args );
  166.     if( IFFParseBase ) CloseLibrary( IFFParseBase );
  167.     if( DOSBase ) CloseLibrary( (struct Library *)DOSBase );
  168.     return( RetCode );
  169. }
  170. ///
  171.  
  172. /// "Support functions"
  173. UWORD StuffChar[] = { 0x16C0, 0x4E75 };
  174.  
  175. VOID SPrintf( STRPTR Buffer, STRPTR Msg, ... )
  176. {
  177.     RawDoFmt( Msg, (APTR)( &Msg + 1 ), (VOID (*)())StuffChar, Buffer );
  178. }
  179. ///
  180.  
  181.