/* #define TEST */
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "egb.h"
#include "FMCFRB.H"
#include <msdos.cf>

#define  KBUF_SIZE	(640 * 480)
#define	 GBUF_SIZE32	(320 * 240 * 2)

#define  BITR(p1)	( (p1 & 0x03e0) >>  5 )
#define  BITG(p1)	( (p1 & 0x7c00) >> 10 )
#define  BITB(p1)	(  p1 & 0x1f )

typedef	struct {
	char *ptr ;
	short ds ;
	short sx,sy,ex,ey ;
}EGBPARM ;

char gwork[EgbWorkSize];	/* グラフィックワ−ク */
char palt[ 256*8+4 ] ;		/* パレット設定用 */

/* TIFFライブラリから呼ばれる，バッファに対する操作の関数*/
/* ユーザ側で用意して，登録しておく			*/
int read_data();
int put_data();
int read_file() ;

void setegb(), err() ;

void main( int ac,char **av )
{
	char outfile[16], infile[16], prefix[16];
	FILE *outfp;
	int  mode;			/* 1=2色 4=16色 8=256色 16=32k色 */
	int  i;
	unsigned int encode;		/* キ−入力ル−チン用ダミ− */
	short int *kbuf;		/* 重ね合わせ用バッファ */
	short int *gbuf;		/* EGB_get用バッファ */
	int bx,by;
	int r,g,b;
	int ovr;
	int aflg;
	int pix16[4];
	int ix,iy;			/* 読み込み位置	*/
	char txadd;
	int  txlen;

	EGBPARM egb_p;

#ifdef TEST
	printf("start\n");
#endif
	/********************************************************************
		パラメ−タチェック
	********************************************************************/
	if( ac < 2 ){
		printf("Usage\nrun386 %s -lOVERLAPLEVEL-pFILEPREFIX -oOUTFILENAME \n",av[0]);
		printf("	readfile readfile ...\n");
		exit( -1 );
	}

	/********************************************************************
		重ね合わせ用バッファ確保 & 初期化
	********************************************************************/
	kbuf = calloc( sizeof(short int), KBUF_SIZE );
	if( kbuf == NULL){
		printf("Fail to malloc kbuf\n");
		exit( -1 );
	}

	/* 読み込み用関数の登録 */
	TIFF_setReadFunc( read_file ) ;
	TIFF_setLoadFunc(  put_data, read_data ) ;

	/********************************************************************
		ア−ギュメント解析
	********************************************************************/
	_fill_char( outfile, sizeof(outfile), 0);
	_fill_char( prefix,  sizeof(prefix),  0);
	ovr = 256;
	ix = 0;
	iy = 0;
	for( i=1; i < ac; i++){
		if( '-' == av[i][0] ){
		/********************************************************
			オプション
			-o出力ファイル名
			-p入力ファイル名のプレフィックス
			-l重ねる濃度 0-256(default 256)
			-m移動座標X,Y(default 0,0)
		*********************************************************/
			if( strlen(av[i]) <= 2 ){
				printf("syntax error %s\n", av[i]);
				exit( -1 );
			}
			switch(av[i][1]){
			case 'o':
			case 'O':
				_fill_char( outfile, sizeof(outfile), 0);
				strcpy( outfile, av[i]+2);
				if( NULL == memchr(outfile, '.',sizeof(outfile)) ){
					strcat( outfile, ".tif");
				}
				break;
			case 'p':
			case 'P':
				_fill_char( prefix,  sizeof(prefix),  0);
				strcpy( prefix, av[i]+2);
				break;
			case 'l':
			case 'L':
				ovr = atoi( av[i]+2 );
				if( ovr < 0 || ovr > 256 ){
					printf("-loverlap(0-256)\n");
					exit( -1 );
				}
				break;
			case 'm':
			case 'M':
				txlen = _find_char(av[i], 255,    0  );
				txadd = _find_char(av[i], txlen, ',');
				if( txadd >= txlen ){ /* Y指定がない */
					printf("-mx,y\n");
					exit( -1 );
				}
				av[i][txadd] = (char)0; /* ','をNULLにセット	*/
				ix = atoi(&av[i][2]);
				iy = atoi(&av[i][txadd+1]);
				break;
			case 'a':
			case 'A':
				aflg = atoi( av[i]+2 );
				break;
			}
			continue;
		}

		/************************************************************
			ファイル->GVRAM
		*************************************************************/
		_fill_char( infile,  sizeof(infile),  0);
		strcpy( infile, prefix );
		strcat( infile, av[i]);
		FiletoGvram( infile, &mode, ix, iy );

		/***********************************************************
			GVRAM -> 重ね合わせ用バッファ
		*************************************************************/
		switch( mode ){
		case 2:	/* 2色 */
		case 4: /* 16色 */
			break;
		case 8: /* 256色 */
			GvramToBuf8( aflg, ovr, kbuf );
			break;
		case 16: /* 32k色 */
			GvramToBuf16( aflg, ovr, kbuf, ix, iy);
			break;
		}
	}

	/********************************************************************
		重ね合わせ用バッファ -> GVRAM
	********************************************************************/
	gbuf = malloc( GBUF_SIZE32 );
	if( gbuf == NULL ){
		printf("Fail to malloc gbuf\n");
		exit( -1 );
	}
	for( by=0; by < 480; by += 2){
		for( bx=0; bx < 640; bx += 2){
			pix16[0] = *(kbuf + bx   + by*640);
			pix16[1] = *(kbuf + bx+1 + by*640);
			pix16[2] = *(kbuf + bx   + (by+1)*640);
			pix16[3] = *(kbuf + bx+1 + (by+1)*640);
			r = (	((pix16[0]&0x3e0)>>5)  + ((pix16[1]&0x3e0)>>5)	+
				((pix16[2]&0x3e0)>>5)  + ((pix16[3]&0x3e0)>>5)	)/4;
			g = (	((pix16[0]&0x7c00)>>10) + ((pix16[1]&0x7c00)>>10) +
				((pix16[2]&0x7c00)>>10) + ((pix16[3]&0x7c00)>>10))/4;
			b = (	(pix16[0]&0x1f)   + (pix16[1]&0x1f) +
				(pix16[2]&0x1f)   + (pix16[3]&0x1f)	)/4;
			*(gbuf + bx/2 + by/2 * 320) =
				( ((r << 5)&0x3e0) | ((g << 10)&0x7c00) | (b&0x1f));
		}
	}

	mode = 16;
	setegb( mode, 320, 240 );

	egb_p.ptr = (char *)gbuf;
	egb_p.ds  = getds() ;
	egb_p.sx  = 0;
	egb_p.sy  = 0;
	egb_p.ex  = 319;
	egb_p.ey  = 239;
	EGB_putBlock( gwork, 0, (char *)&egb_p ) ;

	free( gbuf );

	/********************************************************************
		GVRAM -> outfile
	********************************************************************/
	if( 0 == outfile[0] ){
		/***********************************************************
			出力ファイル名が無いならキ−入力待ちしてreturn
		************************************************************/
		KYB_init();
		KYB_read(0, &encode);
		return;
	}

	if( (outfp = fopen( outfile, "wb" )) == NULL ){
		printf("Fail to open %s\n", outfile);
		exit( -1 ) ;
	}
#ifdef TEST
	printf("before save\n");
#endif
	TIFF_saveScreen( outfp, mode, 0, 0, 319, 239, 0, gwork );
	fclose( outfp ) ;

	return;
}


/************************************************************
	ファイルから画面に画像を入力(2,16,256,32k色)
	input  infile...ファイル名
	output mode.....2 or 4 or 8 or 16(画面モ−ド)
*************************************************************/
int	FileToGvram( char *infile, int *mode, int ix, int iy)
{
	char filename[16];
	FILE *dummy;
	int i;
	static char add[3][5]={
		".tif\0",".mag\0",".jpg\0"
	};

#ifdef TEST
	printf("infile = %s\n",infile);
#endif
	/************************************************************
		ファイル名補完
	*************************************************************/
	if( NULL == memchr(infile, '.', 16) ){
		for(i=0; i<=2; i++){
			_fill_char( filename,  sizeof(filename),  0);
			strcpy( filename, infile);
			strcat( filename, add[i]);
#ifdef TEST
			printf("make filename = %s\n",filename);
#endif
			if( (dummy = fopen( filename, "rb" )) != NULL){
				close( dummy );
				break;
			}
		}
		if( i > 2 ){
			printf("Fail to inputopen %s.*\n", infile);
			exit( -1 ) ;
		}
		infile = filename;
	}

	/************************************************************
		各フォ−マットに応じたreadル−チンをコ−ル
		readル−チンは､各自でファイルをオ−プン､クロ−ズする
		ix, iyに表示する｡
	*************************************************************/
	if( NULL != strstr( infile, ".tif") ){
		TIFF_loadScreen( infile, mode, ix, iy );
	}
	else if( NULL != strstr( infile, ".mag") ){
		/* まぐろ */
	}
	else if( NULL != strstr( infile, ".jpg") ){
		/* jpeg */
	}
	else {
		printf("File name error %s\n",infile);
		exit( -1 );
	}
	return 0;
}
