home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d185
/
iff.lha
/
SOURCE
/
Raw2ILBM.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-12-13
|
5KB
|
196 lines
/** 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; i<bm->Depth; 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; i<bm->Depth; i++) {
nb = Read(file, bm->Planes[i], plsize);
if (nb<plsize) BltClear(bm->Planes[i],plsize,1);
}
if (cols) {
nb = Read(file, cols, (1<<bm->Depth)*2); /* load color map */
return( (BOOL) (nb == (1<<bm->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<<bitmap.Depth);
Close(file);
file = Open(argv[2], MODE_NEWFILE);
buffer = (UBYTE *)AllocMem(BUFSIZE, MEMF_CHIP|MEMF_PUBLIC);
PutPict(file, &bitmap, pwidth, pheight,
hadCmap? cmap: NULL, buffer, BUFSIZE);
Close(file);
FreeMem(buffer,BUFSIZE);
}
else printf(" Couldn't open file '%s' \n",argv[2]);
}
UnDispPict();
FreeBitMap(&bitmap);
bailout:
CloseLibrary(GfxBase);
CloseLibrary(IconBase);
exit(0);
}