home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d170
/
surf.lha
/
Surf
/
src
/
writeilbm.c
< prev
Wrap
C/C++ Source or Header
|
1988-11-22
|
6KB
|
202 lines
#include <stdio.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <graphics/gfxmacros.h>
#ifdef MANX
#include <functions.h>
#endif
#include "mytypes.h"
extern int PackRow();
/*
* following definitions cut from ilbm.h file
*/
typedef UBYTE Masking; /* Choice of masking technique.*/
#define mskNone 0
#define mskHasMask 1
#define mskHasTransparentColor 2
#define mskLasso 3
typedef UBYTE Compression; /* Choice of compression algorithm applied to
* each row of the source and mask planes. "cmpByteRun1" is the byte run
* encoding generated by Mac's PackBits. See Packer.h . */
#define cmpNone 0
#define cmpByteRun1 1
/* Aspect ratios: The proper fraction xAspect/yAspect represents the pixel
* aspect ratio pixel_width/pixel_height.
*
* For the 4 Amiga display modes:
* 320 x 200: 10/11 (these pixels are taller than they are wide)
* 320 x 400: 20/11
* 640 x 200: 5/11
* 640 x 400: 10/11 */
#define x320x200Aspect 10
#define y320x200Aspect 11
#define x320x400Aspect 20
#define y320x400Aspect 11
#define x640x200Aspect 5
#define y640x200Aspect 11
#define x640x400Aspect 10
#define y640x400Aspect 11
/* A BitMapHeader is stored in a BMHD chunk. */
typedef struct {
UWORD w, h; /* raster width & height in pixels */
WORD x, y; /* position for this image */
UBYTE nPlanes; /* # source bitplanes */
Masking masking; /* masking technique */
Compression compression; /* compression algoithm */
UBYTE pad1; /* UNUSED. For consistency, put 0 here.*/
UWORD transparentColor; /* transparent "color number" */
UBYTE xAspect, yAspect; /* aspect ratio, a rational number x/y */
WORD pageWidth, pageHeight; /* source "page" size in pixels */
} BitMapHeader;
/* RowBytes computes the number of bytes in a row, from the width in pixels.*/
#define RowBytes(w) (((w) + 15) >> 4 << 1)
#define IDSIZE 4
WriteIlbm( filename, win, scrn,packflag )
char *filename;
struct NewWindow *win;
struct NewScreen *scrn;
bool packflag;
{
FILE *ofile;
long formpos; /* position of length following 'FORM' */
long formsize;
struct ViewPort *vp;
ofile = fopen(filename,"w");
if( !ofile ) {
return;
}
fwrite("FORM", IDSIZE, 1, ofile);
formpos = ftell( ofile );
fwrite( &formsize, sizeof(formsize), 1, ofile); /* will be rewritten */
fwrite( "ILBMBMHD", IDSIZE*2, 1, ofile );
{
BitMapHeader bmhdr;
long bmhdrsize;
static UBYTE xaspect[2][2]= { { x320x200Aspect, x320x400Aspect },
{ x640x200Aspect, x640x400Aspect }};
static UBYTE yaspect[2][2]= { { y320x200Aspect, y320x400Aspect },
{ y640x200Aspect, y640x400Aspect }};
int wx, wy;
bmhdrsize = 20;
fwrite( &bmhdrsize, sizeof(bmhdrsize), 1, ofile);
bmhdr.x = bmhdr.y = 0;
bmhdr.w = win->Width;
bmhdr.h = win->Height;
bmhdr.nPlanes = scrn->Depth;
bmhdr.masking = mskNone;
bmhdr.compression = packflag ?cmpByteRun1: cmpNone;
bmhdr.pad1 = 0;
wx = (scrn->Width == 320)? 0: 1;
wy = (scrn->Height == 200)? 0: 1;
bmhdr.xAspect = xaspect[wx][wy];
bmhdr.yAspect = yaspect[wx][wy];
bmhdr.pageHeight = win->Height;
bmhdr.pageWidth = scrn->Width;
bmhdr.transparentColor = 0;
fwrite(&bmhdr, bmhdrsize, 1, ofile );
}
fwrite("CMAP",IDSIZE, 1, ofile);
vp = &win->Screen->ViewPort;
{
long cmapsize;
long i;
UWORD value;
UBYTE col[3];
int numentries;
numentries = (1<< scrn->Depth );
cmapsize = numentries*3;
fwrite( &cmapsize, sizeof(cmapsize), 1,ofile);
for( i = 0; i < numentries; i++ ) {
value = GetRGB4(vp->ColorMap, i);
col[2] = (value & 0xf) << 4; /* blue */
col[1] = value & 0xf0; /* green */
col[0] = (value & 0xf00) >> 4; /* red */
fwrite(col, 3, 1, ofile);
}
}
fwrite("CAMG", IDSIZE, 1, ofile);
{
long viewmode;
long viewmodesize;
viewmodesize = sizeof(viewmode);
viewmode = scrn->ViewModes;
fwrite(&viewmodesize, sizeof(viewmodesize), 1, ofile);
fwrite(&viewmode, sizeof(viewmode), 1, ofile );
}
fwrite("BODY", IDSIZE,1, ofile);
{
struct BitMap *bm;
long bodypos,
bodysize;
UBYTE *bmd[16]; /* assume as many as 16 bit planes :-) */
int row;
int plane;
int rowlength; /* in bytes */
char outbuff[200]; /* largest enough for a row 1600 bits wide */
bodypos = ftell(ofile);
fwrite( &bodysize, sizeof(bodysize), 1, ofile);
bm = vp->RasInfo->BitMap;
rowlength = RowBytes(scrn->Width);
for( plane = 0; plane < scrn->Depth; plane++ ) {
bmd[plane] = bm->Planes[plane] + rowlength * win->TopEdge;
}
/*
* write actual bitplanes
*/
for( row = 0; row < win->Height; row++ ) {
for( plane = 0; plane < scrn->Depth; plane++ ) {
if( packflag ) {
int packedsize;
packedsize = PackRow(bmd[plane],outbuff, rowlength );
fwrite(outbuff, packedsize, 1, ofile);
}
else {
fwrite(bmd[plane], rowlength, 1, ofile );
}
bmd[plane] += rowlength;
}
}
bodysize = ftell(ofile) -( bodypos + 4);
/*
* fill out body to make even
*/
if( bodysize & 1 ) {
fputc(0,ofile);
bodysize++;
}
formsize = ftell(ofile) -( formpos + 4);
fseek( ofile, bodypos, 0L );
fwrite( &bodysize, sizeof(bodysize), 1, ofile);
}
fseek( ofile, formpos, 0L );
fwrite( &formsize, sizeof(formsize), 1, ofile);
fclose(ofile);
}