#include <stdio.h>
#include <string.h>
#include <time.h>
#include "defines.h"
#include "astdio.h"
#include "aiggraph.h"
#include "astring.h"

extern unchar Def_16_Pal[16][3];

int zimhead(FILE *fp,unchar *fname,unchar *apdos,int fxvi,int x,int y,int wx,int wy,int fpress)
/* ＺＩＭ　ＰＲＯ／ＸＶＩ−６８Ｋヘッダー書き出し（ライブラリ対応）*/
{
int c;
time_t t;
unchar drv[MAXDRIVE],dir[MAXDIR],ext[MAXEXT],filename[MAXFILEEXT];
	/* マッチストリング */
	WrLenStr(fp,"FORMAT-A",16);
	
	/* ファイル種 */
	WrShort80(fp,0); /* ０＝イメージファイル */
	
	/* ファイル番号 */
	WrShort80(fp,0); /* 未使用 */
	
	/* マシン番号 */
	WrShort80(fp,1); /* １＝Ｘ６８０００ */
	
	/* マシン名 */
	WrLenStr(fp,"X68K",16);
	
	/* アプリケーション番号 */
	WrLong80(fp,fxvi? 3:1); /* Z'sSTAFF-PRO68K = 1 , Z'sSTAFF-XVI68K = 3 */
	
	/* ファイル名 */
	strsfn(fname,drv,dir,filename,ext);
	jstrupr(filename); /* 大文字化 */
	jstrupr(ext);
	strcat(filename,"."); /* ファイル名＋拡張子のみ */
	strcat(filename,ext);
	WrLenStr(fp,filename,32); /* 通称 */
	WrLenStr(fp,filename,16); /* OS上 */
	
	/* パスワード */
	WrLenStr(fp,"",16); /* 未使用 */
	
	/* アプリケーション名 */
	/* 通称 */
	/* 本当は通称も変えられそうなのだが、Ｚ'ｓＳＴＡＦＦ自体がこれをチェックしており、*/
	/* これが自分自身のと一致しない場合は外部ファイルと見なし、ロード時に縦横比変更を */
	/* 行なおうとする。また、ＳＴＡＦＦ−ＸＶＩにおいてはアナログパレットの設定が */
	/* うまくいかなくなる（パレットのデーターがあっていても：他機種からのデータを
	/* ＸＶＩ用に直すためのデータ変更がかかるためと思われる。ＸＶＩにはそのような機能が
	/* あることが実験から判った。）*/
	/* このため、アプリケーション名：通称の変更は出来ないようにすることにした */
	/* なお、ＯＳ上の名前は変更してもいいようである */
	WrLenStr(fp,fxvi? "Z'sSTAFF XVI68K":"Z'sSTAFF PRO68K",32);
	
	/* ＯＳ上 */
	if (apdos[0]==0) {
		WrLenStr(fp,fxvi? "STAFFXVI":"STAFF68K",16);
		/* V0.5のSTAFF-XVIのヘッダーではOS上の名前が"STAFF68K"になっているが */
		/* これはちょっとおかしいと思うので、ここでは正しそうな名前を入れる */
	} else {
		WrLenStr(fp,apdos,16);
	}
	
	/* 作成日時 */
	time(&t);
	WrLenStr(fp,zimdate(ctime(&t)),32); /* 現在の時刻 */
	
	/* 編集者名 */
	WrLenStr(fp,"X68KUSER",64);
	
	/* コメント領域 */
	WrLenStr(fp,"",256); /* 未使用 */
	
	/* リザーブ長 */
	WrShort80(fp,0); /* なし */
	
	/* 画像識別コード */
	c=3; // 矩形ライブラリの印
	if (wx==512) {
		switch (wy) {
			case 512: c=1; break; /* 512line */
			case 1024:c=2; break; /* 1024line */
			//default:  c=3; break; /* 矩形ライブラリ */
		}
	} /* wxが512でないときは矩形ライブラリ */
	WrShort80(fp,c);
	
	/* 矩形フラグ */
	WrShort80(fp,1); /* 長方形 */
	
	/* 再生データ領域：(x,y)-(x+wx-1,y+wy-1) */
	/* wx,wyを画面サイズいっぱいより大きくしないこと */
	/* wx : PRO 0〜511/XVI 0〜767 */
	/* wy : 0〜1023 PRO/XVI共 */
	WrShort80(fp,x);	/* minx */
	WrShort80(fp,y);	/* mixy */
	WrShort80(fp,x+wx-1);	/* maxx */
	WrShort80(fp,y+wy-1);	/* maxy */
	/* V0.5のSTAFF-XVIのヘッダーではmaxxが767になるはずが511になっている */
	/* これは明らかにバグだと思う */
	
	/* 縦方向倍率 */
	WrShort80(fp,0);
	
	/* プレーン数：ここはＸＶＩとＰＲＯで大きく違う */
	WrShort80(fp,fxvi? 1:0);	/* 拡張 */
	WrShort80(fp,fxvi? 1:5);	/* 緑 */
	WrShort80(fp,fxvi? 1:5);	/* 赤 */
	WrShort80(fp,fxvi? 1:5);	/* 青 */
	WrShort80(fp,fxvi? 0:1);	/* マスク */
	
	/* 圧縮フラグ */
	WrShort80(fp,fpress!=0);
	
	/* アナログデーター存在フラグ */
	if (fxvi>=2) { /* パレット有り */
		/* Ｚ'ｓＳＴＡＦＦ−ＸＶＩ内のアナログパレットデータは */
		/* ＢＲＧ＋未使用の順で、８倍した値が記録されているのでそれに従う */
		unchar pal[16][4],*p;
		int i,j;
		p=&pal[0][0];
		if (fxvi==2) { /* g16conv()用パレット=Def_16_pal書き込みモード */
			for (i=0;i<16;i++) {
				/* BRG <- RGB */
				if (i<8) j=i*2; else j=(i-8)*2+1;
				*p++=Def_16_Pal[j][2]*8;
				*p++=Def_16_Pal[j][0]*8;
				*p++=Def_16_Pal[j][1]*8;
				*p++=0; /* 未使用 */
			}
		} else { /* 現在のパレット書き込み */
			int c;
			for (i=0;i<16;i++) {
				if (i<8) j=i*2;	else j=(i-8)*2+1;
				c=RDGPAL1(j);
				*p++=(((c>>1)&0x1f)*8);  /* B */
				*p++=(((c>>6)&0x1f)*8);  /* R */
				*p++=(((c>>11)&0x1f)*8); /* G */
				*p++=0; /* 未使用 */
			}
		}
		WrShort80(fp,1); /* パレットあり */
		fwrite(pal,sizeof(pal),1,fp); /* 存在する時は常に６４バイト */
	} else {
		WrShort80(fp,0); /* パレットなし */
	}
	
	/* リザーブ長 */
	WrShort80(fp,0); /* なし */
	
	return(ferror(fp));
}
