/*
 *   tifload  ---  TIFFローダー        by N.Takahashi
 *
 *   'tiff2.c'の使い方を知るためのサンプルプログラム
 *
 *   使い方:  run386 tifload <TIFF_file1> [<TIFF_file2>]
 *
 *     例1. TIFF画像データを表示する
 *             run386 tifload sample.tif
 *
 *     例2. TIFF画像データを圧縮して保存する
 *             run386 tifload sample.tif compress.tif
 *          (sample.tifは､圧縮/非圧縮どちらでも可)
 */ 

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <dos.h>
#include <fcntl.h>
#include <EGB.h>

#include "tiff2.h"		/* これをincludeする */
#include "graph.h"		/* グラフィック表示のため */

/* Compile 方法 */
/*   hcc tifload tiff2 graph -stack 200000   */
						/* hccとは､FSW4収録のｺﾝﾊﾟｲﾗﾄﾞﾗｲﾊﾞCC(くり氏作)を
						   HighC1.7対応に変更したものです｡ くり様には､
						   大変感謝しています｡
						   CCは､タイムスタンプ比較機能を持っていますので､
						   ちょっとしたプログラミングには便利かと思います｡
						   ちなみに､上のように記述しておくと私の環境では､
						   ctrl+PF9でコンパイルをしてくれます｡
						 */

PALETTE16 *Pal16;
PALETTE256 *Pal256;

char *Gdata,*Gpal;	/* 画像データ&パレット */
int SizX;			/* 横サイズ */
int SizY;			/* 縦サイズ */
int Gcol=0;			/* 色数     */

char *Sv=NULL;


/* パレット調整 */
void adj_palette( char *pal, int col ) {
int i;
	if( pal!=NULL ) {
		for( i=0; i<col*3; i++ ) {
			*((unsigned short *)pal+i)=*((unsigned short *)pal+i)>>8;
		}
	}
}


void main( int argc, char *argv[] ) {
Tiff *tp;
int i,rt;

	if( argc<2 || argc>3 ) {
		printf( "usage: run386 tifload.exp <tiff_file> <save_file>\n" );
		exit( 1 );
	}
	if( argc==3 )
		Sv=argv[2];

	tp=Tiff_new();					/* Tiff_xxx関数の使用準備 */
	
	rt=Tiff_load( argv[1], tp );	/* Tiffデータを読み込む */
	if( rt!=0 ) {
		printf( "%s : %s\n", argv[1], Tiff_err[rt] ); /* エラーメッセージ */
		exit( 1 );
	}
	Tiff_decompress( tp );			/* Tiff展開 */
	
	Tiff_make_palette( tp );		/* パレットがない場合に作成する */
	
	Tiff_getgraph( &SizX, &SizY, &Gcol, &Gdata, &Gpal, tp );
									/* 画像情報を取り出す */
									
	if( Sv==NULL ) {
		adj_palette( Gpal, Gcol );	/* Tiffパレットの調整 */
									/* Tiff_load直後のパレットデータは､
									   そのままでは使いにくい			 */
		
		if( Gcol==16 ) {			/* 16色のときの画面設定 */
			Pal16=(PALETTE16 *)Gpal;
			G_screen( 3, 0 );
			G_screen( 3, 1 );
			G_active( 1, 2, 1 );
			for( i=0; i<16; i++ ) {
				G_palette( 
					i, Pal16->green[i], Pal16->red[i], Pal16->blue[i], 1
				 );
			}
			G_enlarge( 1, 1, 0, 0, 640, 480 );
		}
		else if( Gcol==256 ) {		/* 256色のときの画面設定 */
			Pal256=(PALETTE256 *)Gpal;
			G_screen( 12, 0 );
			G_active( 0, 1, 0 );
			for( i=0; i<256; i++ ) {
				G_palette( 
					i, Pal256->green[i], Pal256->red[i], Pal256->blue[i], 0
				 );
			}
			G_enlarge( 1, 1, 0, 0, 640, 480 );
		}
		else if( Gcol==32768 ) {	/* 32768色のときの画面設定 */
			G_screen( 10, 0 );
			G_screen( 10, 1 );
			G_active( 1, 2, 1 );
			G_enlarge( 2, 2, 0, 0, 320, 240 );
		}

		G_put( 0,0, SizX-1,SizY-1, Gdata );		/* 画像表示 */
		_getch();								/* 何かキーを押すまで待つ */
	}

	if( Sv!=NULL ) {
		Tiff_compress( tp );		/* Tiff圧縮 */
		rt=Tiff_save( Sv, tp );		/* Tiffデータを書き出す */
		if( rt!=0 ) {
			printf( "%s : %s\n", Sv, Tiff_err[rt] );	/* エラーメッセージ */
			exit( 1 );
		}
	}

	Tiff_delete( tp );				/* Tiff_xxx関数の使用終了 */
	G_dosterm();					/* DOS画面に戻す */
}
