
#include <stdio.h>
#include <stdlib.h>
#include <egb.h>
#include <strings.h>
#include <conio.h>
#include <msdos.cf>
#include <ext1/tifflib.h>
#include "sftlib.h"

extern char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/

static int read_data() ;
static int put_data() ;


FILE *fp ; /* TIFF FILE STREAM */
int x,y ;  /* TIFF SIZE */
int x1, y1 ; /* PUT CORD */
int bpp;   /* TIFF MODE 1 4 8 16 24 */

#define LOADBUFSIZE	 10	/* ファイル読み込みバッファ */
#define EXPBUFSIZE   10	/* 展開用バッファ */

int tiff_prt( char *tiffname, int xs, int ys, int xe, int ye )
{
    int  d_line, xse, yse, dfx, dfy;
    int  comp, fill ; /* TIFF 属性 */
    long strip, clut, dw;
    char lbp[LOADBUFSIZE*1024];   /* ロードバッファ */
    char dbp[EXPBUFSIZE*1024];    /* 展開バッファ */
    char cbuf[DECOMP_WORK_SIZE];  /* 圧縮展開用ワーク */

	if( (fp = fopen( tiffname, "rb" )) == NULL ) /* ファイルオープン */
		goto RETURN0;


	fread( lbp, 1, LOADBUFSIZE*1024, fp ) ;	/* 最初のデータロード */

	if( TIFF_getHead( lbp, LOADBUFSIZE*1024 ) < 0 ) goto RETURN1;

	/* タグの内容のチェック */
	if( ( bpp = TIFF_checkMode( &x,&y,&comp,&fill,&strip,&clut )) < 0 ) 
		goto RETURN1 ;

	if( bpp!=1 && bpp!=4 ) goto RETURN1;    /* 16色TIFF 以外の時 */
	xse=_abs(xe-xs+1)-x; yse=_abs(ye-ys+1)-y;
	if( xse < 0 || yse < 0 ) goto RETURN1;  /* TIFF が大きい時 */
	
    x1=xs+xse/2; y1=ys+yse/2;

	/* バッファ操作関数の登録 */
	TIFF_setLoadFunc(  put_data, read_data ) ;

	dw = x ;
	/* 16色モードの場合,横方向を8ドット単位で扱うため，一行のデータ
	   サイズを計算する際に，8ドット単位に調整しておく必要があります  */
	if( bpp == 4) {
		if( dw & 7 )
			dw += 8 - (dw & 7) ;
	} 
	
	/* 展開用バッファに何行分のデータが入るか計算します 	*/
	d_line = (EXPBUFSIZE*1024) / ((dw * bpp + 7)/ 8) ;

/* パレットの設定 は実行せず */
/*	if( clut != 0 ) {
**		TIFF_getPal( palt ) ;
**		EGB_palette( gwork, 0, palt ) ;
**	}
*/
	/* TIFFデータの表示  */
	TIFF_loadImage( bpp, x,y, strip,  fill, comp, dbp, dw, d_line, cbuf ) ;


    RETURN1:
	fclose(fp);
    RETURN0:
	return 0;
}

/*
	TIFFライブラリの中から呼ばれる関数
*/
/* バッファにデータをロードします 						*/
/*    ファイルからロードする場合は freadを使います 	*/
read_data( bp, size )
char *bp ;
int size ;
{
	if( fread( bp, 1, size, fp ) != size ) 
		return -1 ;
	return 0 ;
}

/* 展開されたものを表示します 							*/
/*    そのまま表示する場合は, EGB_putBlockを使います 	*/
put_data( buf, lofs, lines ) 
char *buf ;
int lofs, lines ;
{
	struct {
		char *bp ;
		short sel ;
		short sx,sy,ex,ey ;
	} p ;		/* EGB_putBlockのパラメータ */

	p.bp = buf ;
	p.sel = getds() ;
	p.sx = x1 ;
	p.ex = x1+ x -1 ;
	p.sy = y1+ lofs ;
	p.ey = y1+ lofs + lines -1 ;
	if( bpp == 1 ) {
		EGB_putBlockColor( guiEgbPtr, 0, (char *)&p ) ;
	} else {
		EGB_putBlock( guiEgbPtr , 0, (char *)&p ) ;
	}
	return 0 ;
}



