/*************************************************************************** * Old2ILBM.c v2 -- Convert old format .pic file to ILBM file * by Carolyn Scheppner CBM 02/86 * Using IFF rtns by J.Morrison and S.Shaw of Electronic Arts * * Note: This program does not create a .info file for * the new IFF file. If need an icon for the file, * (ex. for Graphicraft), copy the .info file * for another picture and rename it to your * IFF file name with a .info suffix. * * Alink information: * FROM LIB:LStartup.obj,Old2ILBM.o,iffw.o,ilbmw.o,packer.o * TO Old2ILBM * LIBRARY LIB:lc.lib,LIB:amiga.lib * * Note: B: assigned to libs: and SRC: assigned to dir of .o files * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #define bufSize 512 struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; ULONG DosBase; struct BitMap oldBitMap; struct OldHeader { WORD filetype; /* 0x0000 = pic */ WORD compression; /* 0x0000 (not implemented) */ WORD planes; /* 0x0000 or x0005 means 5 planes */ WORD mini; /* 0x0000 */ ULONG datasize; /* 0x0000FA00 for 320x200, 5 planes */ WORD xorig; /* 0x0000 */ WORD yorig; /* 0x0000 */ WORD height; /* in bits */ WORD width; /* may in bytes ! */ } oldHeader = {0}; struct OldColor { /* Old .pic colorTable format */ BYTE red; /* 0x00 to 0x0f R */ BYTE green; /* 0x00 to 0x0f G */ BYTE blue; /* 0x00 to 0x0f B */ BYTE pad; /* 0x00 */ } oldColor = {0}; WORD colorTable[32]; /* Amiga colorTable, each WORD is 0x0RGB */ int depth, width, height, i; /* main() */ void main(argc,argv) int argc; char **argv; { LONG oldfile; LONG newfile; IFFP iffp = NO_FILE; WORD colortemp; int planebytes; printf("\nOLd2ILBM v2 - Converts old format .pic to IFF\n\n"); if (argc < 3) printf(" Usage: 'Old2ILBM oldfilename newfilename'\n\n"); else { if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL) cleanexit(-1); if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0))==NULL) cleanexit(-1); if ((DosBase = OpenLibrary("dos.library",0))==NULL) cleanexit(-1); if ((oldfile = Open(argv[1], MODE_OLDFILE))==NULL) printf("Can't open %s\n\n",argv[1]); else { if ((newfile = Open(argv[2], MODE_NEWFILE))==NULL) printf("Can't open %s\n\n",argv[2]); else { printf(" Note: This program does not create a .info file\n"); printf(" for the IFF picture file. If you need an\n"); printf(" icon, copy a picture .info file from your\n"); printf(" IFF paint package and give it the same name\n"); printf(" as your picture file adding a .info suffix.\n\n"); Read(oldfile,(BYTE *)&oldHeader,20); width = oldHeader.width; if (width == 40) width = 320; /* may have been in bytes */ if (width == 80) width = 640; height = oldHeader.height; depth = oldHeader.planes; if (depth == 0) depth = 5; InitBitMap(&oldBitMap,depth,width,height); for(i=0; i < depth; i++) { if((oldBitMap.Planes[i] = (PLANEPTR)AllocRaster(width,height)) == NULL) { printf("Can't allocate RAM for bitmap.\n"); cleanexit(-1); } } printf("\nConverting '%s' to IFF '%s'...\n\n", argv[1],argv[2]); for (i=0; i < (1< location of <0, 0>, * a NULL mask, and a locally-allocated buffer. It also assumes you want to * write out all the bitplanes in the BitMap. * ***************************************************************************/ Point2D nullPoint = {0, 0}; IFFP PutPicture(file, bitmap, colorMap) LONG file; struct BitMap *bitmap; WORD *colorMap; { BYTE buffer[bufSize]; return( PutAnILBM(file, bitmap, NULL, colorMap, bitmap->Depth, &nullPoint, buffer, bufSize) ); } /** PutAnILBM() ************************************************************ * * Write an entire BitMap as a FORM ILBM in an IFF file. * This version works for any display mode (C. Scheppner). * * Normal return result is IFF_OKAY. * * The utility program IFFCheck would print the following outline of the * resulting file: * * FORM ILBM * BMHD * CMAP * BODY (compressed) * ***************************************************************************/ #define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);} IFFP PutAnILBM(file, bitmap, mask, colorMap, depth, xy, buffer, bufsize) LONG file; struct BitMap *bitmap; BYTE *mask; WORD *colorMap; UBYTE depth; Point2D *xy; BYTE *buffer; LONG bufsize; { BitMapHeader bmHdr; GroupContext fileContext, formContext; IFFP ifferr; WORD pageWidth, pageHeight; pageWidth = (bitmap->BytesPerRow) << 3; pageHeight = bitmap->Rows; ifferr = InitBMHdr(&bmHdr, bitmap, mskNone, cmpByteRun1, 0, pageWidth, pageHeight); /* You could write an uncompressed image by passing cmpNone instead * of cmpByteRun1 to InitBMHdr. */ bmHdr.nPlanes = depth; /* This must be <= bitmap->Depth */ if (mask != NULL) bmHdr.masking = mskHasMask; bmHdr.x = xy->x; bmHdr.y = xy->y; CkErr( OpenWIFF(file, &fileContext, szNotYetKnown) ); CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext)); CkErr( PutBMHD(&formContext, &bmHdr) ); CkErr( PutCMAP(&formContext, colorMap, depth) ); CkErr( PutBODY(&formContext, bitmap, mask, &bmHdr, buffer, bufsize) ); CkErr( EndWGroup(&formContext) ); CkErr( CloseWGroup(&fileContext) ); return( ifferr ); }