/** raw2ilbm.c ************************************************************** /* Read in a "raw" bitmap (dump of the bitplanes in a screen) */ /* Display it, and write it out as an ILBM file. */ /* 23-Jan-86 */ /* */ /* Usage from CLI: 'Raw2ILBM source dest fmt(low,med,hi) */ /* nplanes' */ /* Supports the three common Amiga screen formats. */ /* 'low' is 320x200, */ /* 'med' is 640x200, */ /* 'hi' is 640x400. */ /* 'nplanes' is the number of bitplanes. */ /* The default is low-resolution, 5 bitplanes */ /* (32 colors per pixel). */ /* */ /* By Jerry Morrison and Steve Shaw, Electronic Arts. */ /* This software is in the public domain. */ /* */ /* This version for the Commodore-Amiga computer. */ /* */ /****************************************************************/ #include "iff/intuall.h" #include "libraries/dos.h" #include "libraries/dosextens.h" #include "iff/ilbm.h" #include "iff/putpict.h" #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) /* general usage pointers */ LONG IconBase; /* Actually, "struct IconBase *" if you've got some ".h" file*/ struct GfxBase *GfxBase; /* Globals for displaying an image */ struct RastPort rP; struct RasInfo rasinfo; struct View v = {0}; struct ViewPort vp = {0}; struct View *oldView = 0; /* so we can restore it */ /* ---------------------------------- */ DisplayPic(bm, colorMap) struct BitMap *bm; UWORD *colorMap; { oldView = GfxBase->ActiView; /* so we can restore it */ InitView(&v); InitVPort(&vp); v.ViewPort = &vp; InitRastPort(&rP); rP.BitMap = bm; rasinfo.BitMap = bm; /* Always show the upper left-hand corner of this picture. */ rasinfo.RxOffset = 0; rasinfo.RyOffset = 0; vp.DWidth = bm->BytesPerRow*8; /* Physical display WIDTH */ vp.DHeight = bm->Rows; /* Display height */ /* Always display it in upper left corner of screen.*/ if (vp.DWidth <= 320) vp.Modes = 0; else vp.Modes = HIRES; if (vp.DHeight > 200) { v.Modes |= LACE; vp.Modes |= LACE; } vp.RasInfo = &rasinfo; MakeVPort(&v,&vp); MrgCop(&v); LoadView(&v); /* show the picture */ WaitBlit(); WaitTOF(); if (colorMap) LoadRGB4(&vp, colorMap,(1 << bm->Depth)); } UnDispPict() { if (oldView) { LoadView(oldView); /* switch back to old view */ FreeVPortCopLists(&vp); FreeCprList(v.LOFCprList); } } PrintS(msg) char *msg; { printf(msg); } void GoodBye(msg) char *msg; { PrintS(msg); PrintS("\n"); exit(0); } struct BitMap bitmap = {0}; SHORT cmap[32]; AllocBitMap(bm) struct BitMap *bm; { int i; LONG psz = bm->BytesPerRow*bm->Rows; UBYTE *p = (UBYTE *)AllocMem(bm->Depth*psz, MEMF_CHIP|MEMF_PUBLIC); for (i=0; iDepth; i++) { bm->Planes[i] = p; p += psz; } } FreeBitMap(bm) struct BitMap *bm; { if (bitmap.Planes[0]) { FreeMem(bitmap.Planes[0], bitmap.BytesPerRow * bitmap.Rows * bitmap.Depth); } } BOOL LoadBitMap(file,bm,cols) LONG file; struct BitMap *bm; SHORT *cols; { SHORT i; LONG nb,plsize; plsize = bm->BytesPerRow*bm->Rows; for (i=0; iDepth; i++) { nb = Read(file, bm->Planes[i], plsize); if (nbPlanes[i],plsize,1); } if (cols) { nb = Read(file, cols, (1<Depth)*2); /* load color map */ return( (BOOL) (nb == (1<Depth)*2) ); } return((BOOL) FALSE); } /** main() ******************************************************************/ UBYTE defSwitch[] = "b"; #define BUFSIZE 16000 static SHORT maxDepth[3] = {5,4,4}; void main(argc, argv) int argc; char **argv; { SHORT fmt,depth,pwidth,pheight; UBYTE *buffer; BOOL hadCmap; LONG file; if( !(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0)) ) GoodBye("No graphics.library"); if( !(IconBase = OpenLibrary("icon.library",0)) ) GoodBye("No icon.library"); if (argc) { if (argc < 3) { printf( "Usage from CLI: 'Raw2ILBM source dest fmt(low,med,hi) nplanes'\n"); goto bailout; } fmt = 0; depth = 5; if (argc>3) switch(*argv[3]) { case 'l': fmt = 0; break; case 'm': fmt = 1; break; case 'h': fmt = 2; break; } if (argc>4) depth = *argv[4]-'0'; depth = MAX(1, MIN(maxDepth[fmt],depth)); pwidth = fmt? 640: 320; pheight = (fmt>1)? 400: 200; InitBitMap(&bitmap, depth, pwidth, pheight); AllocBitMap(&bitmap); file = Open(argv[1], MODE_OLDFILE); if (file) { DisplayPic(&bitmap,NULL); hadCmap = LoadBitMap(file,&bitmap, cmap); if (hadCmap) LoadRGB4(&vp, cmap, 1<