/*
	ARTemis (Graphic Editor for FM-TOWNS)
	(c) MATSUUCHI Ryosuke 1992-1993

	mag.c
*/


#define	USEMAG	0


#include <stdio.h>
#include <process.h>
#include <egb.h>
#include <conio.h>
#include <ryosuke.h>
#include <usrlib.h>
#include <memory.h>
#include <snd.h>
#include <msdos.cf>


#if USEMAG


static void _setplt(int plt, int g, int r, int b)
{
	char pal_[4+8*16];
	DWORD(pal_ + 0) = 1;
	DWORD(pal_ + 4) = plt;
	BYTE (pal_ + 8) = b<<4;
	BYTE (pal_ + 9) = r<<4;
	BYTE (pal_ +10) = g<<4;
	BYTE (pal_ +11) = 0;
	EGB_palette(EGB_work,0,pal_);
}


#endif


int MAG_easyLoad(char *fname)
{
#if USEMAG
	FILE *fp_a, *fp_b, *fp_p;
	int i,j,k;
	if ((fp_a = fopen(fname, "rb")) == NULL)	// フラグＡ読出用
		return -1;
	if ((fp_b = fopen(fname, "rb")) == NULL)	// フラグＢ読出用
		return -1;
	if ((fp_p = fopen(fname, "rb")) == NULL)	// ピクセルデータ読出用
		return -1;

	// チェック／コメント領域をよみとばす
	for (i=0; i<32; i++)
		fgetc(fp_a);
	int c;
	do {
		c = fgetc(fp_a);
	} while (c != 0x1a);

	// ヘッダ領域のファイル内オフセットを記録する
	int ofs_head;
	ofs_head = ftell(fp_a);

	// ヘッダを読み込んで調べる
	char head[32];
	fread(head, 1,32, fp_a);
	int ofs_a, ofs_b, ofs_pix, siz_b, siz_pix;
	ofs_a = DWORD(head+12);
	ofs_b = DWORD(head+16);
	siz_b = DWORD(head+20);
	ofs_pix = DWORD(head+24);
	siz_pix = DWORD(head+28);
	
	// パレットを読み込んで設定する
	for (i=0; i<16; i++) {
		int g,r,b;
		g = fgetc(fp_a) >> 4;
		r = fgetc(fp_a) >> 4;
		b = fgetc(fp_a) >> 4;
		_setplt(i, g,r,b);
	}
	
	// フラグＡ／Ｂ, ピクセルデータ用のファイル読出位置を設定する
	fseek(fp_a, ofs_head + ofs_a, SEEK_SET);
	fseek(fp_b, ofs_head + ofs_b, SEEK_SET);
	fseek(fp_p, ofs_head + ofs_pix, SEEK_SET);

	// １ラインずつ展開していく
	char fbbuf1[80], fbbuf2[80];
	char linebuf[17][640];
	for (i=0; i<400; i++) {
		char *lbp;
		lbp = linebuf[i % 17];

		// １ライン分のフラグＢ(80 bytes)を展開する
		for (j=0; j<((640/4)/2)/8; j++) {
			int a;  static char mask[] = {128,64,32,16,8,4,2,1};
			a = fgetc(fp_a);
			for (k=0; k<8; k++) {
				if ((a & mask[k]) != 0)
					fbbuf1[j*8+k] = fgetc(fp_b);
				else
					fbbuf1[j*8+k] = 0;
			}
		}
		if (i > 0) {
			for (j=0; j<80; j++)
				fbbuf1[j] ^= fbbuf2[j];
		}
		memcpy(fbbuf2, fbbuf1, 80);
		// １ラインぶんのピクセルを展開する
		static int ofsx[] = {0,-1,-2,-4,0,-1,0,-1,-2,0,-1,-2,0,-1,-2,0};
		static int ofsy[] = {0,0,0,0,-1,-1,-2,-2,-2,-4,-4,-4,-8,-8,-8,-16};
		for (j=0; j<160; j++) {
			int b,rx,ry,x,y;
			b = ((j&1)==0 ? (fbbuf1[j/2]>>4) : (fbbuf1[j/2]&15));
			x = j*4;
			y = i;
			if (b == 0) {
				int c;
				c = fgetc(fp_p);
				lbp[j*2] = (c>>4) + (c&15)*16;
				c = fgetc(fp_p);
				lbp[j*2+1] = (c>>4) + (c&15)*16;
			} else {
				rx = j*4 + ofsx[b]*4;
				ry = i   + ofsy[b];
				*(short int *)&lbp[j*2] = *(short int *)&linebuf[ry%17][rx/2];
			}
		}

		{
			para_putBlock para;
			para.buf = lbp;
			para.bufsel = getds();
			para.x1 = 0;
			para.x2 = 639;
			para.y1 = para.y2 = i;
			EGB_putBlock(EGB_work, 0, (char*)&para);
		}
	}
	fclose(fp_p);
	fclose(fp_b);
	fclose(fp_a);
#else
	return 0;
#endif
}


#if USEMAG

#define	fAlen	256

static	FILE	*fA_fp;
static	int		fA_ofs;
static	char	fAbuf[fAlen];
static	int		fAbyteptr, fAbitptr;

static void fAinit(FILE *fp, int ofs)
{
	fA_fp = fp;
	fA_ofs = ofs;
	fAbyteptr = fAbitptr = 0;
	fAbuf[0] = 0;
}

static void fAout(int bit)
{
	static char _bit[] = {128,64,32,16,8,4,2,1};
	if (bit)
		fAbuf[fAbyteptr] |= _bit[fAbitptr];
	fAbitptr++;
	if (fAbitptr >= 8) {
		fAbitptr = 0;
		fAbyteptr++;
		if (fAbyteptr >= fAlen) {
			int curofs;
			curofs = ftell(fA_fp);
			fseek(fA_fp, fA_ofs, SEEK_SET);
			fwrite(fAbuf, 1, fAlen, fA_fp);
			fseek(fA_fp, curofs, SEEK_SET);
			fA_ofs += fAlen;
			fAbyteptr = 0;
		}
		fAbuf[fAbyteptr] = 0;
	}
}

static void fAbyteflush()
{
	if (fAbitptr != 0) {
		fAbyteptr++;
		fAbitptr = 0;
		if (fAbyteptr >= fAlen) {
			int curofs;
			curofs = ftell(fA_fp);
			fseek(fA_fp, fA_ofs, SEEK_SET);
			fwrite(fAbuf, 1, fAlen, fA_fp);
			fseek(fA_fp, curofs, SEEK_SET);
			fA_ofs += fAlen;
			fAbyteptr = 0;
		}
		fAbuf[fAbyteptr] = 0;
	}
}

static void fAflush()
{
	int len;
	len = fAbyteptr + (fAbitptr+7)/8;
	if (len > 0) {
		int curofs;
		curofs = ftell(fA_fp);
		fseek(fA_fp, fA_ofs, SEEK_SET);
		fwrite(fAbuf, 1, len, fA_fp);
		fseek(fA_fp, curofs, SEEK_SET);
		fA_ofs += len;
	}
	fAbyteptr = fAbitptr = 0;
	fAbuf[fAbyteptr] = 0;
}

#endif


#if 0

int MAG_save(char *fname, int x1, int y1, int xlen, int ylen, char *memo)
// memo : MAGファイルに書き込むメモ．
{
	FILE *fp;
	if ((fp = fopen(fname, "wb")) == NULL) {
		return -1;
	}
	// チェックデータ／コメントを書き込む
	{
		char chkdata[32];
		memcpy(chkdata, "MAKI02  ", 8);
		memcpy(chkdata+8, "TOWNS", 4);
		memcpy(chkdata+12, ">謎<              ", 18);
		memset(chkdata+30,0,2);
		fwrite(chkdata, 1,32, fp);
		{
			_setmode(fp, _TEXT);
			char *p;
			for (p=memo; *p!=0; p++)
				fputc(*p, fp);
			_setmode(fp, _BINARY);
		}
		fputc(0x1a, fp);
	}
	// ヘッダ先頭のファイル内オフセットを記録する
	int ofs_head;
	ofs_head = ftell(fp);
	// ダミーヘッダを作成する
	{
		char dmy[32];
		fwrite(dmy, 1,32, fp);
	}
	// ダミーパレットを作成する
	{
		char dmy[48];
		fwrite(dmy, 1, 48, fp);
	}
	// セーブ範囲のＸ座標を８単位に補正し、フラグＡのサイズを計算する
	int siz_a,ofs_a,ofs_b;
	{
		int x2;
		x2 = x1 + xlen -1;
		x1 = x1 - x1 % 8;
		x2 = x2 - x2 % 8 + 7;
		xlen = x2-x1+1;
		siz_a = ((xlen/4+7)/8)*ylen;	// アブナーイ！
			// フラグＡが、１ラインについてバイト境界におさまらなかったら、
			// どうすればいいんだろう．．．
		if (siz_a & 1)
			siz_a++;
	}
	ofs_a = ftell(fp);
	ofs_b = ofs_a + siz_a;
	// ダミーのフラグＡを出力
	{
		int i;
		for (i=0; i<siz_a; i++)
			fputc(0, fp);
	}
	// フラグＡ, Ｂを出力していく
	{
		static int ofsx[] = {0,-1,-2,-4,0,-1,0,-1,-2,0,-1,-2,0,-1,-2,0};
		static int ofsy[] = {0,0,0,0,-1,-1,-2,-2,-2,-4,-4,-4,-8,-8,-8,-16};
		int y,x;
		char linebuf[17][xlen];
		for (y=0; y < ylen; y++) {
			char *lbp;
			lbp = linebuf[y % 17];
			grgetblk(lbp, x1,y1+y, xlen,1);
			for (x=0; x<xlen; x+=8) {
				int pixel;
				// ８ドットのうち、はじめの４ドット（１ピクセル）を処理
				pixel = *(short int *)(lbp + x/2);
				int b;
				bool found;
				found = NO;
				for (b=1; b<=15; b++) {
					int sx,sy;
					sx = x+ofsx[b]*4;
					sy = y+ofsy[b];
					if (sx<0)
						continue;
					if (sy<0)
						break;
					if (pixel == *(short int *)(linebuf[sy % 17] + sx/2))
						found = YES;
						
					
					
					
					

				}

				// ８ドットのうち、２つめの４ドット（１ピクセル）を処理

				// フラグＢを出力
			}
		}
	}
	
	
	
	
	
	
	
}

#endif

// end of mag.c
