/*
*	Yamana's Otomeza Plug-in Tool
*		Ｘwindow Ｂit Ｍap セーバ
*	
*	1995.08.07	
*	1995.08.12	異常な遅さを誇っていたので一気に５倍程度高速化した
*	
*/

#include	"otome_pi.h"

const char	longname[]	= "FILE  : XBM saver";
const char	extend[]	= "XBM";

#define		USE_FILE	PI_SAVE
#include	"otome_pi.c"


char	*readbuf,*buf;
char	*bufp;

/*************************************************************************/

#define	COLUMN	12
#define	TMPSIZE	(Width*7)	/* これくらいで大丈夫のはずなんだが… */

#define	to16a(c)	(( (c)<0x0a ) ? (c)+'0': (c)-0x0a+'a' )

int XBM_write( wbuf, Width, fp )
char	*wbuf;
int 	Width;
FILE	*fp;
{
	static unsigned int	column=0;
	int 	i,p;
	char	*tmp = wbuf+Width;
	
	for( i=0,p=0; i<Width ; i++,column++ )
	{	
		if( column>0 )
			tmp[ p++ ] = ',';
		if( (column % COLUMN)==0 )
			strcpy( tmp+p, "\r\n " ),p+=3;
		
		strcpy( tmp+p, " 0x" ),p+=3;
		tmp[ p++ ] = to16a( wbuf[i] >>4 );
		tmp[ p++ ] = to16a( wbuf[i] & 0xf);
	}
	if( fwrite( tmp, 1, p, fp ) == p )
		return NOERR;
	else
		return ERROR;
	
}

/***********************/

int vramWidth;

int getcol16(image,x,y)
char	*image;
int 	x,y;
{	
	return (image[ (x>>1) + y*vramWidth ] >> ((x & 1)? 4:0))& 0x0f ;
}

int getcol256(image,x,y)
char	*image;
int 	x,y;
{	
	return (image[ x + y*vramWidth ] );
}

int XBM_writeData( image, col, pix, size, name, fp )
char	*image,*name;
int 	col,pix;
POINT	*size;
FILE	*fp;
{
	int 	Bit[] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
	int 	x,y;
	int 	Width,realWidth;
	int 	(*getcol)();
	char	*wbuf;
	
	fputs( "static char "	,fp );
	fputs(  name			,fp );
	fputs( "_bits[] = {"	,fp );
	
	
	/* 乙女座からは32ドット単位で渡される */
	vramWidth = (size->x+31)& 0xffe0 ;
	realWidth = (size->x+ 7)& 0xfff8 ;	/* しかし記録は 8ビット単位 */
	
	if( pix==4 )
	{	vramWidth >>= 1;
		getcol = getcol16;
	}else
		getcol = getcol256;
	
	Width = realWidth>>3;
	
	if( (wbuf=PI_MALLOC( Width+ TMPSIZE ))==NULL )	return PI_ERROR_NO_MEMORY;
	
	for( y=0; y<size->y ; y++ )
	{
		for( x=0; x< Width; x++ )
			wbuf[x] = 0;
		
		for( x=0; x<realWidth ; x++ )
		{	if( getcol(image,x,y) == col )
				wbuf[ x>>3 ] |= Bit[x & 7];
		}
		
		if( XBM_write( wbuf, Width, fp ) )
			return ERROR;
		
	}
	
	fputs( "};\r\n", fp );
	PI_FREE( wbuf );
	
	return NOERR;
}


/***********************/

void del_ext( name, str )
char	*name,*str;
{
	for( ; *str!='\0' && *str!='.' ; name++,str++ )
		*name = ((*str>='A' && *str<='Z') ? (*str+' ') : *str );
	*name = '\0';
}

int XBM_writeSize( size, name,fp )
POINT	*size;
char	*name;
FILE	*fp;
{
	char	tmp[8];
	
	/* ディスクが一杯とかいろいろ...最初だけチェックすれば大丈夫 */
	if( fputs( "#define ",fp ) )	return ERROR;
	fputs(  name		,fp );
	fputs( "_width "	,fp );
	itoa( size->x, tmp, 10 );fputs( tmp, fp );
	fputs( "\r\n"		,fp );
	
	fputs( "#define "	,fp );
	fputs(  name		,fp );
	fputs( "_height "	,fp );
	itoa( size->y, tmp, 10 );fputs( tmp, fp );
	fputs( "\r\n"		,fp );
	
	return NOERR;
}

/***********************/


int APL_exec()
{
	FILE	*fp;
	char	name[16];
	int 	ret;
	
	if( pi_imge->pix >8 )	return ERROR;
	
	if( (fp = fopen( PI_FNAME, "wb" )) == NULL )
		return PI_ERROR_FILE_OPEN;
	
	del_ext( name, PI_FNAME );
	XBM_writeSize(  &pi_imge->size, name, fp );
	
//	printf("color = %d",PI_FORECOL );	/* V1.3b じゃ得られないんだね */
	
	ret = XBM_writeData( pi_imge->image, PI_FORECOL, pi_imge->pix,
					&pi_imge->size, name, fp );
	
	fclose( fp );
	if( ret )	remove( PI_FNAME );
	
	return ret;
}

