/*****************************************************************************/
/* べたファイル表示 */
/*****************************************************************************/

#include <stdio.h>
#include <iocslib.h>
#include "defines.h"
#include "abuff.h"
#include "aiggraph.h"

/* SUPER()を使うため、GCD -OS すること */

/*****************************************************************************/

int beta_disp(fp,fnonclr,fofmem,x,y,wx,wy,fpal,crt)
FILE *fp;
int fnonclr,fofmem,x,y,wx,wy,crt,fpal;
{
int ssp,c,size,lsize,stp,col;
unchar *buff;
unsint *gr,*gram=(unsint *)GRAM,cc;
void (*grdisp)();
	/* ファイル先頭へ戻す：ヘッダー確認のため読み出されているから */
	rewind(fp);
	
	/* 画面設定 */
	if (!fnonclr) {
		/* べたのnon-clearは画面モードが違ってもいけるようにする */
		if (CRTMOD(-1)!=crt) CRTMOD(crt);
		G_CLR_ON(); /* Graphic ON */
	}
	
	/* 定数設定 */
	size=wx*wy;
	lsize=512;
	stp=1;
	if (crt<=7 || crt==16) { /* 16色 */
		col=2;
		if (fpal) pal16set(); /* palet set */
		stp=2;
		size=(wx+1)/2*wy;
		if (crt<=3||crt==16) lsize=1024;
		grdisp=(lsize==512? gr16_512:gr16_1024);
	}
	else
	if (crt>=8  && crt<=11) { /* 256色 */
		col=1;
		if (fpal) pal256set(); /* palet set */
		grdisp=gr512;
	}
	else
	if (crt>=12 && crt<=15) { /* 65536色 */
		col=0;
		size*=2;
		grdisp=gr64k;
	}
	
	/* 読み込みバッファー確保 */
	buff=(!fofmem? newmalloc(size):NULL);
	
	/* 表示 */
	if (buff!=NULL) { /* バッファーがとれる時 */
		c=1;
		if (fread(buff,size,1,fp)==1) {	/* いっぺんに全部読み込む */
			grdisp(buff,x,y,wx,wy);
			c=0;
		}
		free(buff);
		return(c);
	}
	
	/* 一気に読み込むバッファーがとれない時 */
	/* 本当はもう少し速くできるけど手抜き */
	gram+=(x+y*lsize);
	ssp=SUPER(0);
	for (y=0;y<wy;y++) {
		gr=gram;
		for (x=0;x<wx;x+=stp) {
		    int c0;
			if (col==0) { /* 65536 */
				if (fread(&cc,sizeof(unsint),1,fp)==0) {
					c=1;
					goto END;
				}
			} else {
				if ((c0=fgetc(fp))==-1) {
					c=1;
					goto END;
				}
				cc=c0;
				if (col==2) { /* 16 */
					*gr++=(unsint)(cc>>4);
					if (x+1>=wx) break;
					cc&=0x0f;
				}
			}
			*gr++=cc;
		}
		gram+=lsize; /* to next line top */
	}
	c=0;
    END:;
	if (ssp>=0) SUPER(ssp); /* 元からスーパーバイザーの時は何もしない */
	return(c);
}

/*****************************************************************************/
