/****************************************************

	TIFF Graphic Data File Display Window Program

*****************************************************/
#include    <stdio.h>
#include	<stdlib.h>
#include    <egb.h>
#include    <mos.h>

#define PAGE0   0
#define	PAGE1	0x040000

#define SHORT   short int
#define UCHAR   unsigned char

#define	WLX		wfp->wd_lx
#define	WLY		wfp->wd_ly
#define	WRX		wfp->wd_rx
#define	WRY		wfp->wd_ry
#define	WFRA	wfp->wd_fra
#define	WBAK	wfp->wd_bak

typedef struct wdtmp {
	SHORT	wd_mode;
	SHORT	wd_lx, wd_ly;
	SHORT	wd_rx, wd_ry;
	char	*wd_img;
	struct	wdtmp *wd_forwfp;
	struct	wdtmp *wd_nxtwfp;

	SHORT	wd_fntsiz;
	SHORT	wd_x, wd_y;		/* ｸﾞﾗﾌｨｯｸ座標 */
	SHORT	wd_len;
	char	wd_buf[256];
	SHORT	wd_dx, wd_dy;	/* ｸﾞﾗﾌｨｯｸ･表示座標 */
	SHORT	wd_cx, wd_cy;	/* ｺﾝｿ-ﾙ座標 */
	SHORT	wd_mx, wd_my;	/* ｺﾝｿ-ﾙ･ｻｲｽﾞ */
	SHORT	wd_tab;
	SHORT	wd_offx;

	SHORT	wd_fra, wd_bak, wd_chr;

	SHORT	wd_valsiz;
	SHORT	wd_valtop;
	int		wd_entsiz;
	int		wd_bufsiz;
	char	*wd_bftop;
	char	*wd_bfbtm;
	char	*wd_dptop;
	UCHAR	*wd_dpptr;
	SHORT	wd_dpflg;

	char	wd_ttl[80];
} WINDFP;

typedef struct {
	int		im_page;			/* 0x00000 or 0x40000 */
	int		im_off;				/* Disp Offset */
	int		im_x, im_y;			/* Display Point */
	int		im_sx,im_sy;		/* Display Size */
	char	*im_adr;			/* img address */
	int		im_ix,im_iy;		/* img Display Point */
	int		im_isx,im_isy;		/* img size */
} IMG_PARA;

typedef struct {
	SHORT	tf_tag;
	SHORT	tf_type;
	int		tf_len;
	int		tf_data;
} TIF_IFD;

extern void		IMG_move(IMG_PARA *para);
extern WINDFP	*WIN_dmyopen(int x1,int y1,int x2,int y2);
extern char		*subname(char *nam);

void	TIF_disp(register WINDFP *wfp)
{
	IMG_PARA para;

	para.im_off = para.im_page = 0;
	para.im_x = wfp->wd_dx; para.im_y = wfp->wd_dy;
	para.im_sx = (wfp->wd_mx < (wfp->wd_x - wfp->wd_cx) ? wfp->wd_mx : 
							   (wfp->wd_x - wfp->wd_cx)); 
	para.im_sy = (wfp->wd_my < (wfp->wd_y - wfp->wd_cy) ? wfp->wd_my : 
							   (wfp->wd_y - wfp->wd_cy)); 
	para.im_adr = wfp->wd_bftop;
	para.im_ix = wfp->wd_cx; para.im_iy = wfp->wd_cy;
	para.im_isx = wfp->wd_x; para.im_isy = wfp->wd_y;
	IMG_move(&para);
}
void	TIF_seek(register WINDFP *wfp)
{
	int		b,x,y,sx=0,sy=0;

	MOS_rdpos(&b,&x,&y);
	wrtmos(2);
	MOS_horizon(WRX-18,WRX-8);
	MOS_vertical(WLY + 20,WRY - 32);
	do {
		MOS_rdpos(&b,&x,&y);
		if ( x >= (WRX - 18) && x <= WRX ) {
			if ( y >= (WLY + 20) && y <= (WLY + 36) ) {
				if ( (wfp->wd_cy -= 8) < 0 )
					wfp->wd_cy = 0;
				TIF_disp(wfp);
			} else if ( y >= (WRY - 38) && y <= (WRY - 20) ) {
				if ( (wfp->wd_cy + wfp->wd_my + 8) <= wfp->wd_y ) {
					wfp->wd_cy += 8;
					TIF_disp(wfp);
				}
			}
		}
	} while ( (b & 1) != 0 );
	MOS_horizon(0,1023);
	MOS_vertical(0,511);
	wrtmos(0);
}
void	TIF_xseek(register WINDFP *wfp)
{
	int		b,x,y,sx=0,sy=0;

	wrtmos(2);
	MOS_horizon(WLX,WRX-28);
	MOS_vertical(WRY-18,WRY-2);
	do {
		MOS_rdpos(&b,&x,&y);
		if ( x < (WLX + 18) && y >= (WRY - 18) ) {
			if ( wfp->wd_cx > 0 ) {
				wfp->wd_cx -= 8;
				TIF_disp(wfp);
			}
		} else if ( x >= (WRX - 36) && x < (WRX - 20) && 
					y >= (WRY - 18) ) {
			if ( (wfp->wd_cx + wfp->wd_mx + 8) <= wfp->wd_x ) {
				wfp->wd_cx += 8;
				TIF_disp(wfp);
			}
		}
	} while ( (b & 1) != 0 );
	MOS_horizon(0,1023);
	MOS_vertical(0,511);
	wrtmos(0);
}
void	TIF_move(register WINDFP *wfp)
{
	wfp->wd_mode = 0x0003;
	WIN_move(wfp);
	wfp->wd_dx = WLX + 4; wfp->wd_dy = WLY + 24;
}
void	TIF_size(register WINDFP *wfp)
{
	wfp->wd_mode = 0x0003;
	WIN_size(wfp);
	wfp->wd_dx = WLX + 4; wfp->wd_dy = WLY + 24;
	if ( (wfp->wd_mx = (WRX - 22) - (WLX + 4)) > wfp->wd_x )
		wfp->wd_mx = wfp->wd_x; 
	if ( (wfp->wd_my = (WRY - 20) - (WLY + 24)) > wfp->wd_y )
		wfp->wd_my = wfp->wd_y;
	wfp->wd_cx = wfp->wd_cy = 0;
	TIF_disp(wfp);
}
void	TIF_subcom(WINDFP *wfp)
{
	char	tmp[80];

	sprintf(tmp,"%dBit %dx%d Graphic Data....",(int)wfp->wd_len,
										   (int)wfp->wd_x,(int)wfp->wd_y);
	MSG_disp(tmp,13);
}
void	TIF_select(register WINDFP *wfp)
{
	int		b,x,y;

	MOS_rdpos(&b,&x,&y);
	if ( x <= (WLX + 16) && y <= (WLY + 16) )
		WIN_close(wfp);
	else if ( x >= (WRX - 16) && y >= (WRY - 16) )
		TIF_size(wfp);
	else if ( x >= (WRX - 16) && y <= (WLY + 16) )
		TIF_subcom(wfp); 
	else if ( x >= (WRX - 18) )
		TIF_seek(wfp);
	else if ( y <= (WLY + 20) )
		TIF_move(wfp);
	else if ( x < (WRX - 16) && y >= (WRY - 20) )
		TIF_xseek(wfp);
}
void	TIF_get1(WINDFP *wfp,FILE *fp)
{
	int		x,y,sx,sy,ex,sz;
	int		mk,bf,ch;
	char	*p;

	sx = wfp->wd_x; sy = wfp->wd_y;
	wfp->wd_x = ex = (sx + 1) & 0xfffe;
	sz = sy * ex / 2;
	if ( (wfp->wd_bftop = p = malloc(sz)) == NULL )
		return;
	memset(p,0x88,sz);
	for ( mk = y = 0 ; y < sy ; y++ ) {
		for ( x = 0 ; x < sx ; x++ ) {
			if ( (mk >>= 1) == 0 ) { bf = getc(fp); mk = 0x80; }
			if ( (bf & mk) == 0 ) ch = 0x08; else ch = 0x0f;
			if ( (x & 1) == 0 ) *p = ch; else *(p++) |= (ch << 4);
		}
		if ( ex != sx )
			*(p++) |= 0x80;
		if ( (y & 15) == 15 ) {
			if ( y > wfp->wd_my ) wfp->wd_cy = y - wfp->wd_my;
			TIF_disp(wfp);
		}
	}
}
void	TIF_get4(WINDFP *wfp,FILE *fp)
{
	int		i,x,y,sx,sy,ex,sz;
	char	*p;

	sx = wfp->wd_x; sy = wfp->wd_y;
	wfp->wd_x = ex = (sx + 1) & 0xfffe;
	sz = sy * ex / 2;
	if ( (wfp->wd_bftop = p = malloc(sz)) == NULL )
		return;
	fread(p,1,sz,fp);
	if ( sx != ex ) {
		i = ex / 2;
		for ( y = 0 ; y < sy ; y++ ) {
			*(p+i-1) |= 0x80;
			p += i;
		}
	}
}
/***************************************************************
void	TIF_get8(WINDFP *wfp,FILE *fp)
{
	int		b,r,g;
	int		j,i,n;
	int		x,y,sx,sy,ex,sz;
	char	*p;
	unsigned char *dm,*dp,*s;
	static SHORT ptn[]={ 0x0000,0x0f00,0x00f0,0x0ff0,
						 0xf00f,0xff0f,0xf0ff,0xffff };

	sx = wfp->wd_x;
	wfp->wd_x &= 0xfffe; wfp->wd_y &= 0xfffe;
	ex = wfp->wd_x; sy = wfp->wd_y;
	sz = sy * ex / 2;
	if ( (wfp->wd_bftop = p = malloc(sz)) == NULL )
		return;
	if ( (dm = malloc(sx*2)) == NULL ) {
		free(p); wfp->wd_bftop = NULL;
		return;
	}
	memset(p,0x88,sz);
	if ( wfp->wd_tab != 0 )
		s = wfp->wd_dpptr;
	else {
		if ( (s = malloc(768)) == NULL ) {
			free(dm); free(p); wfp->wd_bftop = NULL;
			return;
		}
		for ( j = i = 0 ; i < 256 ; i++,j+=3 ) {
			s[i * 3] = j;
			s[i * 3 + 1] = j;
			s[i * 3 + 2] = j;
		}
	}
	for ( y = 0 ; y < sy ; y+=2 ) {
		fread(dm,1,sx * 2,fp);
		for ( dp = dm,x = 0 ; x < sx ; x+=2,p++,dp+=2 ) {
			b = s[*dp * 3] >> 4;
			r = s[*dp * 3 + 1] >> 4;
			g = s[*dp * 3 + 2] >> 4;
            b = ptn[b & 7] & (b > 7 ? 0x9999 : 0x1111);
            r = ptn[r & 7] & (r > 7 ? 0xAAAA : 0x2222);
            g = ptn[g & 7] & (g > 7 ? 0xCCCC : 0x4444);
            i = b | r | g;
            *p = i >> 8; *(p + (ex / 2)) = i & 0xff;
		}
		p += (ex / 2);
		if ( (y & 15) == 14 ) {
			if ( y > wfp->wd_my ) wfp->wd_cy = y - wfp->wd_my;
			TIF_disp(wfp);
		}
	}
	free(s);
	free(dm);
}
********************************************************************/
void	TIF_get8(WINDFP *wfp,FILE *fp)
{
	int		b,r,g;
	int		j,i,n;
	int		x,y,sx,sy,ex,sz;
	char	*p;
	unsigned char *dm,*dp,*s;
	static char bit[]={ 1,1,1,2,1,2,2,3 };

	sx = wfp->wd_x; sy = wfp->wd_y;
	wfp->wd_x = ex = (sx + 1) & 0xfffe;
	sz = sy * ex / 2;
	if ( (wfp->wd_bftop = p = malloc(sz+1)) == NULL )
		return;
	if ( (dm = malloc(sx)) == NULL ) {
		free(p); wfp->wd_bftop = NULL;
		return;
	}
	memset(p,0x88,sz);
	s = wfp->wd_dpptr;
	for ( y = 0 ; y < sy ; y++ ) {
		fread(dm,1,sx,fp);
		if ( wfp->wd_tab != 0 ) {
			for ( dp = dm,x = 0 ; x < sx ; x++ ) {
				i = *(dp++); j = 0;
				b = s[i*3]; r = s[i*3+1]; g = s[i*3+2]; i = 0;
				if ( (n = b + r + g) == 0 ) n = 1;
				if ( (b * 100 / n) > 30 ) { j |= 0x01; i += b; }
				if ( (r * 100 / n) > 30 ) { j |= 0x02; i += r; }
				if ( (g * 100 / n) > 30 ) { j |= 0x04; i += g; }
				if ( (i / bit[j]) > 150 ) j |= 0x08;

				if ( (x & 1) == 0 ) 
					*p = j;
				else 
					*(p++) |= (j << 4);
			}
		} else {
			for ( dp = dm,x = 0 ; x < sx ; x++ ) {
				i = *(dp++); j = 0;
				if ( (i & 0x03) != 0 ) j |= 0x01;
				if ( (i & 0x1C) != 0 ) j |= 0x02;
				if ( (i & 0xE0) != 0 ) j |= 0x04; 
				if ( (i & 0x92) != 0 ) j |= 0x08;
				if ( (x & 1) == 0 ) 
					*p = j;
				else 
					*(p++) |= (j << 4);
			}
		}
		if ( ex != sx )
			*(p++) |= 0x80;
		if ( (y & 15) == 15 ) {
			if ( y > wfp->wd_my ) wfp->wd_cy = y - wfp->wd_my;
			TIF_disp(wfp);
		}
	}
	free(dm);
	if ( wfp->wd_tab != 0 )
		free(wfp->wd_dpptr);
}
void	TIF_get16(WINDFP *wfp,FILE *fp)
{
    int     i,b,r,g;
    int     x,y,sx,sy,ex,sz;
    char    *p;
	static SHORT ptn[]={ 0x0000,0x0f00,0x00f0,0x0ff0,
						 0xf00f,0xff0f,0xf0ff,0xffff };

	sx = wfp->wd_x; sy = wfp->wd_y;
	wfp->wd_x *= 2; wfp->wd_y *= 2;
    ex = (sx + 1) & 0xfffe;
    sz = sy * sx * 2;
    if ( (wfp->wd_bftop = p = malloc(sz)) == NULL )
        return;
	memset(p,0x88,sz);
    for ( y = 0 ; y < sy ; y++,p += sx ) {
        for ( x = 0 ; x < sx ; x++,p++ ) {
            fread(&i,2,1,fp);
            b = (i >> 1) & 15; b = ptn[b & 7] & (b > 7 ? 0x9999 : 0x1111);
            r = (i >> 6) & 15; r = ptn[r & 7] & (r > 7 ? 0xAAAA : 0x2222);
            g = (i >> 11) & 15;g = ptn[g & 7] & (g > 7 ? 0xCCCC : 0x4444);
            i = b | r | g;
            *p = i >> 8; *(p + sx) = i & 0xff;
        }
		if ( (y & 7) == 7 ) {
			if ( (y * 2) > wfp->wd_my ) wfp->wd_cy = (y * 2) - wfp->wd_my;
			TIF_disp(wfp);
		}
    }
}
int		swap(char *p)
{
	int		i;
	char	*s;

	s = (char *)&i;
	p += 4;
	*(s++) = *(--p); 
	*(s++) = *(--p); 
	*(s++) = *(--p); 
	*(s++) = *(--p); 
	return i;
}
void	TIF_open(WINDFP *wfp,FILE *fp)
{
	int		i,l;
	TIF_IFD	ifd;
	char	tmp[8];

	if ( fread(tmp,1,4,fp) < 4 )
		return;
	if ( tmp[0] != 0x49 || tmp[1] != 0x49 || tmp[2] != 0x2A )
		return;
	if ( fread(&l,4,1,fp) < 1 )
		return;
	fseek(fp,l,0); i = 0;
	if ( fread(&i,2,1,fp) < 1 )
		return;
	while ( i-- > 0) {
		if ( fread(&ifd,sizeof(TIF_IFD),1,fp) < 1 )
			return;
		if ( ifd.tf_tag == 0 ) break;
		switch(ifd.tf_tag){
			case 0x0100: wfp->wd_x = ifd.tf_data; break;
			case 0x0101: wfp->wd_y = ifd.tf_data; break;
			case 0x0102: wfp->wd_len = ifd.tf_data; break;
			case 0x0111: l = ifd.tf_data; break;
		}
	}
	fseek(fp,l,0);
}
void	PIC_open(WINDFP *wfp,FILE *fp)
{
	wfp->wd_x = 320; wfp->wd_y = 240;
	wfp->wd_len = 16;
}
void	GRP_open(WINDFP *wfp,FILE *fp)
{
	long		l;
	char	tmp[8];

	if ( fread(tmp,1,4,fp) < 4 )
		return;
	if ( fread(tmp,1,4,fp) < 4 )
		return;
	wfp->wd_x = swap(tmp);
	if ( fread(tmp,1,4,fp) < 4 )
		return;
	wfp->wd_y = swap(tmp);
	if ( fread(tmp,1,4,fp) < 4 )
		return;
	if ( (wfp->wd_len = swap(tmp)) == 15 )
		wfp->wd_len = 16;
	switch(wfp->wd_len) {
		case 4: l = 0x0050l; break;
		case 8:
			fseek(fp,0x0020l,0);
			if ( (wfp->wd_dpptr = malloc(768)) != NULL ) {
				wfp->wd_tab = 1;
				fread(wfp->wd_dpptr,1,768,fp);
			}
			l = 0x0320l; 
			break;
		case 16: l = 0x0020l; break;
	}
	fseek(fp,l,0);
}
void	GED_open(WINDFP *wfp,FILE *fp)
{
	SHORT	i;

	fseek(fp,0x000Cl,0);
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_x = i + 1;
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_y = i + 1;
	wfp->wd_len = 16;
	fseek(fp,0x0100l,0);
}
void	FIG_open(WINDFP *wfp,FILE *fp)
{
	SHORT	i;

	fseek(fp,0x000Cl,0);
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_x = i + 1;
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_y = i + 1;
	wfp->wd_len = 16;
	fseek(fp,0x0100l,0);
}
void	P16_open(WINDFP *wfp,FILE *fp)
{
	SHORT	i;

	fseek(fp,0x0082l,0);
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_x = i + 1;
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_y = i + 1;
	wfp->wd_len = 4;
	fseek(fp,0x0086l,0);
}
void	P25_open(WINDFP *wfp,FILE *fp)
{
	SHORT	i;

	fseek(fp,0x0622l,0);
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_x = i + 1;
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_y = i + 1;
	wfp->wd_len = 16;
	fseek(fp,0x0626l,0);
}
void	P32_open(WINDFP *wfp,FILE *fp)
{
	SHORT	i;

	fseek(fp,0x01E2l,0);
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_x = i + 1;
	if ( fread(&i,2,1,fp) < 1 )
		return;
	wfp->wd_y = i + 1;
	wfp->wd_len = 16;
	fseek(fp,0x01E6l,0);
}
int		GIF_pix(int pix,int gcf,char *gctb,FILE *fp)
{
	static char bit[]={ 1,1,1,2,1,2,2,3 };
	int		i,j,n,r,g,b;

	if ( (n = dmy_getc(fp)) == EOF )
		return EOF;

	if ( gcf != 0 ) {
		r = gctb[n * 3]; g = gctb[n * 3 + 1]; b = gctb[n * 3 + 2];
		j = i =0;
		if ( (n = b + r + g) == 0 ) n = 1;
		if ( (b * 100 / n) > 30 ) { j |= 0x01; i += b; }
		if ( (r * 100 / n) > 30 ) { j |= 0x02; i += r; }
		if ( (g * 100 / n) > 30 ) { j |= 0x04; i += g; }
		if ( (i / bit[j]) > 150 ) j |= 0x08;
	} else {
		if ( pix == 4 ) j = n;
		else if ( pix > 4 ) j = n >> (pix - 4);
		else j = n;
	}
	return j;
}
void	GIF_open(WINDFP *wfp,FILE *fp)
{
	int		i,j,n,x,y;
	int		pix,gcf,sku,sz;
	SHORT	si,dx,dy,mx,my,ex;
	char	*p,*gctb;
	char	tmp[16];
	static SHORT skutb[4]={ 8,8,4,2 };
	static SHORT skusp[4]={ 0,4,2,1 };

    fread(tmp,1,6,fp);
    if ( strncmp(tmp,"GIF87a",6) != 0 )
		return;

    fread(&si,2,1,fp);
	wfp->wd_x = ex = (si + 1) & 0xfffe;
    fread(&si,2,1,fp);
	wfp->wd_y = si;
	sz = si * ex / 2;
	if ( (wfp->wd_bftop = p = malloc(sz)) == NULL )
		goto ERROR;
	memset(p,0x88,sz);

    fread(tmp,1,3,fp);
    pix = (tmp[0] & 7) + 1; wfp->wd_len = pix + 100;
    if ( (gcf = tmp[0] & 0x80) != 0 ) {
		if ( (gctb = malloc((1 << pix) * 3)) == NULL ) {
			free(wfp->wd_bftop); wfp->wd_bftop = NULL;
			return;
		}
		fread(gctb,3,1 << pix,fp);
	}

NEXTDISP:
    fread(tmp,1,1,fp);
    if ( tmp[0] != ',' )
        goto ERROR;
    fread(&dx,2,1,fp);
    fread(&dy,2,1,fp);
    fread(&mx,2,1,fp);
    fread(&my,2,1,fp);
    fread(tmp,1,1,fp);
    if ( (tmp[0] & 0x80) != 0 )
		fread(gctb,3,1 << pix,fp);

    if ( (sku = tmp[0] & 0x40) == 0 ) {
		for ( y = 0 ; y < my ; y++ ) {
			p = wfp->wd_bftop + (dx / 2) + (ex / 2) * (dy + y);
			for ( x = 0 ; x < mx ; x++ ) {
				if ( (i = GIF_pix(pix,gcf,gctb,fp)) == EOF )
					goto ERROR;
				if ( (x & 1) == 0 ) { *p &= 0xf0; *p |= i; }
				else { *p &= 0x0f; *(p++) |= (i << 4); }
			}
			if ( (y & 15) == 15 ) {
				if ( y > wfp->wd_my ) wfp->wd_cy = y - wfp->wd_my;
				TIF_disp(wfp);
			}
		}
	} else {
		for ( j = 0 ; j < 4 ; j++ ) {
			n = skutb[j];
			for ( y = skusp[j] ; y < my ; y += n ) {
				p = wfp->wd_bftop + (dx / 2) + (ex / 2) * (dy + y);
				for ( x = 0 ; x < mx ; x++ ) {
					if ( (i = GIF_pix(pix,gcf,gctb,fp)) == EOF )
						goto ERROR;
					if ( (x & 1) == 0 ) { *p &= 0xf0; *p |= i; }
					else { *p &= 0x0f; *(p++) |= (i << 4); }
				}
			}
			TIF_disp(wfp);
		}
	}
	dmy_close();
	goto NEXTDISP;

ERROR:
	if ( gcf != 0 ) free(gctb);
	dmy_close();
	return;
}
WINDFP  *GRA_open(char *file,int lx,int ly,int rx,int ry,int fra,int bak)
{
	int		md;
	register WINDFP	*wfp;
	FILE	*fp;
	char	*sub;

	sub = subname(file) + 9;
	if ( strcmp(sub,"TIF") == 0 )     md = 0;
	else if ( strcmp(sub,"PIC") == 0 ) md = 1;
	else if ( strcmp(sub,"GED") == 0 ) md = 2;
	else if ( strcmp(sub,"FIG") == 0 ) md = 3;
	else if ( strcmp(sub,"P16") == 0 ) md = 4;
	else if ( strcmp(sub,"P25") == 0 ) md = 5;
	else if ( strcmp(sub,"P32") == 0 ) md = 6;
	else if ( strcmp(sub,"GRP") == 0 ) md = 7;
	else if ( strcmp(sub,"GIF") == 0 ) md = 8;
	else return NULL;

	lx &= 0xfffe; rx &= 0xfffe;
	if ( (fp = fopen(file,"rb")) == NULL )
		return NULL;
	if ( (wfp = WIN_dmyopen(lx,ly,rx,ry)) == NULL ) {
		fclose(fp);
		return NULL;
	}
	fbox(lx,ly,rx,ry,fra,bak,0);
	wfp->wd_entsiz = 0;
	wfp->wd_mode = 0x0003;
	wfp->wd_fra = wfp->wd_chr = fra; wfp->wd_bak = bak;
	wfp->wd_dx = lx + 4; wfp->wd_dy = ly + 24;
	wfp->wd_mx = (rx - 22) - (lx + 4); wfp->wd_my = (ry - 20) - (ly + 24);
	wfp->wd_cx = wfp->wd_cy = 0;
	wfp->wd_bftop = NULL;
	wfp->wd_x = wfp->wd_y = wfp->wd_len = wfp->wd_tab = 0;
	strcpy(wfp->wd_ttl,file);
	WIN_display(wfp);

	switch(md) {
		case 0: TIF_open(wfp,fp); break;
		case 1: PIC_open(wfp,fp); break;
		case 2: GED_open(wfp,fp); break;
		case 3: FIG_open(wfp,fp); break;
		case 4: P16_open(wfp,fp); break;
		case 5: P25_open(wfp,fp); break;
		case 6: P32_open(wfp,fp); break;
		case 7: GRP_open(wfp,fp); break;
		case 8: GIF_open(wfp,fp); break;
	}
	if ( wfp->wd_len == 0 )
		goto ERROR;

	switch(wfp->wd_len) {
		case 1: TIF_get1(wfp,fp); break;
		case 4: TIF_get4(wfp,fp); break;
		case 8: TIF_get8(wfp,fp); break;
		case 16: TIF_get16(wfp,fp); break;
	}
	if ( wfp->wd_len >= 100 )
		wfp->wd_len -= 100;

	if ( wfp->wd_bftop == NULL )
		goto ERROR;

	wfp->wd_mode = 0x0003;
	TIF_disp(wfp);
	fclose(fp);
	return wfp;
ERROR:
	WIN_close(wfp);
	fclose(fp);
	return NULL;
}
