home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
look
/
source
/
tiff.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
17KB
|
708 lines
/****************************************************
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(¶);
}
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;
}