[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

/*--------------------------------------------------------------*/
/*								*/
/*			bmprintc.c				*/
/*								*/
/* print out a C-language representation of data for bitmap	*/
/*								*/
/* By Jerry Morrison and Steve Shaw, Electronic Arts.		*/
/* This software is in the public domain.			*/
/*								*/
/* This version for the Amiga computer.				*/
/* Cleaned up and modified a bit by Chuck McManis, Aug 1988	*/
/* Modified 05/91 by CBM for use with iffparse modules          */
/*								*/
/*--------------------------------------------------------------*/

#include "iffp/ilbmapp.h"
#include <stdio.h>

#define NO  0
#define YES 1

void PSprite(struct BitMap *bm, FILE *fp, UBYTE *name, int p, BOOL dohead);
void PrCRLF(FILE *fp);
void PrintBob(struct BitMap *bm, FILE *fp, UBYTE *name);
void PrintSprite(struct BitMap *bm, FILE *fp, UBYTE *name,
		 BOOL attach, BOOL dohdr);

static BOOL doCRLF;
char sp_colors[] = ".oO@";

void PrCRLF(FILE *fp)
{
	if (doCRLF)
		fprintf(fp, "%c%c", 0xD, 0xA);
	else
		fprintf(fp, "\n");
}

void PrintBob(struct BitMap *bm, FILE *fp, UBYTE *name)
{
	register UWORD 	*wp;	/* Pointer to the bitmap data */

	short 	p,i,j,nb;	/* temporaries */
	short 	nwords = (bm->BytesPerRow/2)*bm->Rows;

	fprintf(fp, "/*----- bitmap : w = %ld, h = %ld ------ */",
		    bm->BytesPerRow*8, bm->Rows);

	PrCRLF(fp);

	for (p = 0; p < bm->Depth; ++p) {	/* For each bit plane */
		wp = (UWORD *)bm->Planes[p];
		fprintf(fp, "/*------ plane # %ld: --------*/", p);
		PrCRLF(fp);
		fprintf(fp, "UWORD %s%c[%ld] = { ", name, (p?('0'+p):' '), nwords);
		PrCRLF(fp);
		for (j = 0; j < bm->Rows; j++, wp += (bm->BytesPerRow >> 1)) {
			fprintf(fp, "	");
			for (nb = 0; nb < (bm->BytesPerRow) >> 1; nb++)
				fprintf(fp, "0x%04x,", *(wp+nb));
			if (bm->BytesPerRow <= 6) {
 				fprintf(fp, "\t/* ");
				for (nb = 0; nb < (bm->BytesPerRow) >> 1; nb++)
					for (i=0 ; i<16; i++)
						fprintf(fp, "%c",
					    (((*(wp+nb)>>(15-i))&1) ? '*' : '.'));
				fprintf(fp, " */");
			}
			PrCRLF(fp);

		}
		fprintf(fp,"	};");
		PrCRLF(fp);
	}
}



void PSprite(struct BitMap *bm, FILE *fp, UBYTE *name, int p, BOOL dohead)
{
	UWORD 	*wp0, *wp1;	/* Pointer temporaries 	*/
	short 	i, j, nwords,	/* Counter temporaries 	*/
		color;		/* pixel color		*/
	short 	wplen = bm->BytesPerRow/2;

	nwords =  2*bm->Rows + (dohead?4:0);
	wp0 = (UWORD *)bm->Planes[p];
	wp1 = (UWORD *)bm->Planes[p+1];

	fprintf(fp, "UWORD %s[%ld] = {", name, nwords);
	PrCRLF(fp);

	if (dohead) {
		fprintf(fp,"  0x0000, 0x0000, /* VStart, VStop */");
		PrCRLF(fp);
	}
	for (j=0 ; j < bm->Rows; j++) {
		fprintf(fp, "  0x%04x, 0x%04x", *wp0, *wp1);
		if (dohead || (j != bm->Rows-1)) {
			fprintf(fp, ",");
		}
		fprintf(fp, "\t/*  ");
		for (i = 0; i < 16; i++) {
			color = ((*wp1 >> (14-i)) & 2) + ((*wp0 >> (15-i)) & 1);
			fprintf(fp, "%c", sp_colors[color]);
		}
		fprintf(fp,"  */");
		PrCRLF(fp);
		wp0 += wplen;
		wp1 += wplen;
	}
	if (dohead)
		fprintf(fp, "  0x0000, 0x0000 }; /* End of Sprite */");
	else
		fprintf(fp," };");
	PrCRLF(fp);
	PrCRLF(fp);
}

void PrintSprite(struct BitMap *bm, FILE *fp, UBYTE *name,
		 BOOL attach, BOOL dohdr)
{
	fprintf(fp,"/*----- Sprite format: h = %ld ------ */", bm->Rows);
	PrCRLF(fp);

	if (bm->Depth > 1) {
		fprintf(fp, "/*--Sprite containing lower order two planes:   */");
		PrCRLF(fp);
		PSprite(bm, fp, name, 0, dohdr);
	}
	if (attach && (bm->Depth > 3) ) {
		strcat(name, "1");
		fprintf(fp, "/*--Sprite containing higher order two planes:   */");
		PrCRLF(fp);
		PSprite(bm, fp, name, 2, dohdr);
	}
}

#define BOB 	0
#define SPRITE 	1

/* BMPrintCRep
 * Passed pointer to BitMap structure, C filehandle opened for write,
 * name associated with file, and string describing the output
 * format desired (see cases below), outputs C representation of the ILBM.
 */
void BMPrintCRep(struct BitMap *bm, FILE *fp, UBYTE *name, UBYTE *fmt)
{
	BOOL attach, doHdr;
	char c;
	SHORT type;

	doCRLF = NO;
	doHdr = YES;
	type = BOB;
	attach = NO;
	while ( (c=*fmt++) != 0 )
		switch (c) {
			case 'b':
				type = BOB;
				break;
			case 's':
				type = SPRITE;
				attach = NO;
				break;
			case 'a':
				type = SPRITE;
				attach = YES;
				break;
			case 'n':
				doHdr = NO;
				break;
			case 'c':
				doCRLF = YES;
				break;
		}
	switch(type) {
		case BOB:
			PrintBob(bm, fp, name);
			break;
		case SPRITE:
			PrintSprite(bm, fp, name, attach, doHdr);
			break;
	}
}