#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <msdos.cf>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <wgb.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include <tifflib.h>
#include <guidbg.h>
#include "tetujin.h"
#include "poly.h"
#include "g_eff.h"
#include "fftspt.h"

#undef	SHADE_SIZE	/* gui.hでは2だがこのprogramに限って強制的に0 */
#define SHADE_SIZE 0
#define EFFECTCOUNT 11

/* abou */
int	alertId = -1 ;
int	messageId[4] = -1 ;
int	dspIconId = -1 ;
int	aboutOKBtnId = -1 ;
int	aboutNumId = -1 ;
/* desk */
int	baseDialogId = -1 ;
int	menubarId = -1 ;
int	menuId = -1 ;
int	mItemId[3] = -1 ;
int	SDKmenuId = -1 ;
int	SDKmItemId[3] = -1 ;
int	fileMenuId = -1 ;
int	fileMItemId[3] = -1 ;
int	effectMenuId = -1 ;
int	effectMItemId[EFFECTCOUNT] = -1 ;
int	effectSpaceMItemId = -1 ;
int	effectUndoMItemId = -1 ;
int	quitIconId = -1 ;
int	outIconId = -1 ;
/* error */
int	errorId = -1 ;
int	errorOKBtnId = -1 ;
int	errorIconId = -1 ;
int	errormessage[2] = -1 ;
/* set */
int	baseSetupDialogId = -1 ;
int	baseSetupDialogId2 = -1 ;
int	baseSetupMesId[10] = -1 ;
int	baseSetupModeTitleMesId = -1 ;
int	baseSetupNumId[4] = -1 ;
int	setupTIconId[6] = -1 ;
int	setupAreaTIconId[3] = -1 ;
int	baseSetupModeMesId[6] = -1 ;
int	baseScrId[4] = -1 ;
int	baseSDBtnId[2] = -1 ;
int	baseSetupTitleMesId = -1 ;
/* filesオプション用 */
int	fileSubDialogId = -1 ;
int	fileBtnId[3] = -1 ;
int	fileMesId[3] = -1 ;
/* window用影の存在 */
int	windowId = -1 ;
int	vscrollId = -1 ;
int	hscrollId = -1 ;

/* 実態(メインソースにて影から作りだす実態) */
GRAPHWIN window[WINCOUNT] = -1 ;	/* window実態kobj */

int boundWidth ;	/* 横の解像度(512/640) */

static int effectNum = -1 ;
BASICSET effectSet[EFFECTCOUNT] = {
							{ "平滑化フィルタ(RGB)",
	
							  3,
							  "混合比(0〜100)", 100, 0, 100,
							  "強さ(0〜100)", 80, 0, 100,
							  "輪郭線保存度(0〜100)", 50, 0, 100,
							  "", 0, 0, 100,

							  0,
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "平滑化フィルタ(Y)",
	
							  3,
							  "混合比(0〜100)", 100, 0, 100,
							  "強さ(0〜100)", 80, 0, 100,
							  "輪郭線保存度(0〜100)", 50, 0, 100,
							  "", 0, 0, 100,

							  0,
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "シャープネス(RGB)",
	
							  3,
							  "混合比(0〜100)", 100, 0, 100,
							  "強さ(0〜100)", 80, 0, 100,
							  "ノイズ阻止率(0〜100)", 50, 0, 100,
							  "", 0, 0, 100,

							  0,
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "シャープネス(Y)",
	
							  3,
							  "混合比(0〜100)", 100, 0, 100,
							  "強さ(0〜100)", 80, 0, 100,
							  "ノイズ阻止率(0〜100)", 50, 0, 100,
							  "", 0, 0, 100,

							  0,
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "メディアン・フィルタ(RGB)",
	
							  2,
							  "混合比(0〜100)", 100, 0, 100,
							  "輪郭線保存度(0〜100)", 30, 0, 100,
							  "", 0, 0, 100,
							  "", 0, 0, 100,

							  2,
							  "モード",
							  "３×３ドット",
							  "変則５ドット",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "メディアン・フィルタ(Y)",
	
							  2,
							  "混合比(0〜100)", 100, 0, 100,
							  "輪郭線保存度(0〜100)", 30, 0, 100,
							  "", 0, 0, 100,
							  "", 0, 0, 100,

							  2,
							  "モード",
							  "３×３ドット",
							  "変則５ドット",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "デジタイズ・スムーサ",
	
							  2,
							  "混合比(0〜100)", 100, 0, 100,
							  "ﾃﾞｨﾃｰﾙ保存度(0〜100)", 50, 0, 100,
							  "", 0, 0, 100,
							  "", 0, 0, 100,

							  4,
							  "モード",
							  "奇数ライン(弱)",
							  "奇数ライン(強)",
							  "偶数ライン(弱)",
							  "偶数ライン(強)",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "ファジィ・レガート",
	
							  2,
							  "混合比(0〜100)", 100, 0, 100,
							  "センサー(0〜100)", 88, 0, 100,
							  "", 0, 0, 100,
							  "", 0, 0, 100,

							  0,
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "輝度データの平坦化(要時間)",
	
							  3,
							  "混合比(0〜100)", 100, 0, 100,
							  "輝度最小値(0〜255)", 0, 0, 255,
							  "輝度最大値(0〜255)", 255, 0, 255,
							  "", 0, 0, 100,

							  2,
							  "輝度範囲の設定方法",
							  "手  動",
							  "自  動",
							  "",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "色の再配置(要長時間)",
	
							  1,
							  "混合比(0〜100)", 100, 0, 100,
							  "", 0, 0, 100,
							  "", 0, 0, 100,
							  "", 0, 0, 100,

							  3,
							  "モード",
							  "色の採集",
							  "色の平坦再配置",
							  "色の単純再配置",
							  "",
							  "",
							  "",
							  0,0,0,0,0,0,	/* mode flg */

							  0,

							  0
							},

							{ "ＦＦＴフィルタ",
	
							  2,
							  "１辺の長さ(２のｎ乗)", 7, 1, 8,
							  "増幅率(％)", 200, 0, 999,
							  "", 0, 0, 100,
							  "", 0, 0, 100,

							  6,
							  "モード",
							  "ＦＦＴ",
							  "ｽﾍﾟｸﾄﾙ消しゴム",
							  "ｽﾍﾟｸﾄﾙ増幅",
							  "ｽﾍﾟｸﾄﾙｷｬﾝｾﾙ",
							  "ｽﾍﾟｸﾄﾙ定着",
							  "逆ＦＦＴ",
							  (__MODE_AREA | 3),0,0,
							  (__MODE_GO),(__MODE_GO),(__MODE_GO),
							  					/* mode flg */
							  0,

							  0
							}
						} ;

char tifPath[100] ;			/*  読み込みパス名 */

// 領域指定用変数
int  areaMode = 0 ; /* エリア設定  0以上:各モード  -1:しない */
int  fixRectangleLx, fixRectangleLy ; /* 固定長方形指定用 */
char polygonBuffer[ 640*512/8 ] ;	/* ポリゴン指定作業領域 */

// 各種設定用パネルの表示状態を表すフラグ
int setDspFlg = 0 ;		/*  set dialog display flg */

// バッファ関係の変数
char *undoBuf = NULL ;		/*  アンドウバッファ  */
char *alphaBuf = NULL ;
int  undoLot = 0 ;

// 拡大表示用変数
int outMode = 0 ;		/*  0:normal display 1:拡大 display */
static int outLupx, outLupy ;	/*  拡大時の表示左上座標 */

// ウィンドウ関係の変数
static int actId ;			/*	どのウィンドウがアクティブかをしめす変数	*/
static int windowflg = 0 ;	/*	ウィンドウが何枚開いているかをしめす変数	*/

// セーブ関係の変数
static int saveMode = 0 ;		/*  save mode 0:1600万色 1:32768色 */
static int saveCompMode = 0 ;	/*  save mode 0:normal, 1:comp. */

extern char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/



/***** エフェクトコマンド実行ルーチン *****/

static execx, execy, execAreaMode ;		/* リード&ライト関数用の変数 */
static char *execOutBuf ;

/* アンドゥバッファからのリード関数 */
static int execRead1( int x, int y, unsigned char *a )
{
	if( x < 0 )x = 0 ;
	if( y < 0 )y = 0 ;
	if( x >= execx )x = execx - 1 ;
	if( y >= execy )y = execy - 1 ;

	DWORD( a ) = DWORD( undoBuf + (y*execx + x)*3 ) ;

	if( execAreaMode < 2 )
		a[3] = getArea( x, y ) ;
	else
		a[3] = 1 ;

	return NOERR ;
}

/* アウトプットバッファからのリード関数 */
static int execRead2( int x, int y, unsigned char *a )
{
	if( x < 0 )x = 0 ;
	if( y < 0 )y = 0 ;
	if( x >= execx )x = execx - 1 ;
	if( y >= execy )y = execy - 1 ;

	DWORD( a ) = DWORD( execOutBuf + (y*execx + x)*3 ) ;

	if( execAreaMode < 2 )
		a[3] = getArea( x, y ) ;
	else
		a[3] = 1 ;

	return NOERR ;
}

/* アウトプットバッファへのライト関数 */
static int execWrite( int x, int y, unsigned char *a )
{
	int d ;

	if( x < 0 )x = 0 ;
	if( y < 0 )y = 0 ;
	if( x >= execx )x = execx - 1 ;
	if( y >= execy )y = execy - 1 ;

	d = (y*execx + x)*3 ;
	WORD( execOutBuf + d ) = WORD( a ) ;
	BYTE( execOutBuf + d + 2 ) = BYTE( a + 2 ) ;

	return NOERR ;
}

/* マスクバッファからのリード関数 */
static int execMask( int x, int y )
{
	return 0 ;
}

/* エフェクト実行 */
static int execEffect( FRAME areaFrame )
{
	int i, d[5] ;
	int ret ;

	execOutBuf = window[actId].buf16m ;		/* アウトプットバッファ */

	if( effectNum < 0 )return NOERR ;		/* effectの選択がなされてない */
	if( windowflg <= 0 )return NOERR ;		/* windowが開かれてない */
	if( execOutBuf == NULL )return NOERR ;	/* dataがない */
	if( undoBuf == NULL )return NOERR ;		/* アンドゥバッファがない */

	execx = window[actId].dx ;				/* 絵の横幅 */
	execy = window[actId].dy ;				/* 絵の縦幅 */
	if( areaFrame.lupx < 0 )areaFrame.lupx = 0 ;	/* はみだしを修正 */
	if( areaFrame.lupy < 0 )areaFrame.lupy = 0 ;
	if( areaFrame.rdwx > execx-1 )areaFrame.rdwx = execx-1 ;
	if( areaFrame.rdwy > execy-1 )areaFrame.rdwy = execy-1 ;

	execAreaMode = areaMode ;
						/* エリア設定モード(ﾎﾟﾘｺﾞﾝ,四角形,全体の区別)の抽出 */

	trans( window[actId].buf16m, undoBuf, execx*execy*3 ) ;	/* data→undoBuf */
	trans( window[actId].bufAlpha, alphaBuf, execx*execy ) ;

	for( i=0 ; i<4 ; i++ )					/* 設定値の抽出 */
		d[i] = effectSet[effectNum].set[i].prt ;
	d[4] = effectSet[effectNum].mode ;

	ret = NOERR ;

	switch( effectNum )						/* エフェクト関数の選択 */
	{
	case 0:
		ret = softnessFilter( areaFrame, d ) ;
		break ;
	case 1:
		ret = ySoftnessFilter( areaFrame, d ) ;
		break ;
	case 2:
		ret = sharpnessFilter( areaFrame, d ) ;
		break ;
	case 3:
		ret = ySharpnessFilter( areaFrame, d ) ;
		break ;
	case 4:
		ret = medianFilter( areaFrame, d ) ;
		break ;
	case 5:
		ret = yMedianFilter( areaFrame, d ) ;
		break ;
	case 6:
		ret = digitizeSmooth( areaFrame, d ) ;
		break ;
	case 7:
		ret = fuzzy( areaFrame, d ) ;
		break ;
	case 8:
		ret = histgram( areaFrame, d ) ;
		break ;
	case 9:
		ret = replace( areaFrame, d ) ;
		break ;
	case 10:
		ret = fftCnv( areaFrame, d ) ;
		break ;
	}

	cov16mTo32k( window[actId].buf16m, window[actId].buf32k, execx*execy ) ;
											/* 16M色から32K色への変換 */
	return ret ;
}

/*** デジタイズ･スムーサ ***/
static int digitizeSmooth( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int mode, line ;

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	mode = d[4] & 1 ;			/* モード */
	line = d[4] >> 1 ;			/* ライン */

	g_videoDigitizeSmoother( &para, mode, line ) ;

	g_c_m_Filter( &para, d[1]/5 ) ;

	return NOERR ;
}

/*** メディアン･フィルター ***/
static int medianFilter( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int k ;

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	g_medianFilter( &para, d[4] ) ;

	k = (100 - d[1]) / 5 ;
	if( d[1] == 0 )
		k = 256 ;

	g_s_c_Filter( &para, k ) ;

	return NOERR ;
}

static int yMedianFilter( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int k ;

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	g_yMedianFilter( &para, d[4] ) ;

	k = (100 - d[1]) / 5 ;
	if( d[1] == 0 )
		k = 256 ;

	g_s_c_yFilter( &para, k ) ;

	return NOERR ;
}

/*** ファジィレガート ***/
static int fuzzy( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int mode, fuzzySen ;

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	mode = 1 ;					/* モード 1 (RGBのみの処理) */
	fuzzySen = d[1]*256/100 ;	/* ファジィセンサの感度設定 */

	g_fuzzyLegato( &para, mode, fuzzySen ) ; /* ファジィレガート呼び出し */

	return NOERR ;
}

/*** 輝度ヒストグラム平坦化 ***/
static int histgram( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	g_histgramAverager( window[actId].buf32k, &para, d[4], d[1], d[2] ) ;

	return NOERR ;
}

/*** 色の再配置 ***/
static int replace( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int wkMax ;

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	wkMax = window[actId].dx * window[actId].dy ;	/* ワークエリアの大きさ */

	g_replaceColors( wkMax, window[actId].buf32k, &para, d[4] ) ;

	return NOERR ;
}

/*** fft変換 ***/
static int fftCnv( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int ret ;

		/* 引数の設定 */

//	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.mix = 256 ;			/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	switch( d[4] )						/* エフェクト関数の選択 */
	{
	case 0:						  // ＦＦＴ
		ret = g_fft2( &para, d[0] ) ;
		break ;
	case 1:						  // ｽﾍﾟｸﾄﾙ消しゴム
		ret = g_fft2_mul( &para, 0 ) ;
		break ;
	case 2:						  // ｽﾍﾟｸﾄﾙ増幅
		ret = g_fft2_mul( &para, d[1]*256/100 ) ;
		break ;
	case 3:						  // ｽﾍﾟｸﾄﾙｷｬﾝｾﾙ
		ret = g_fft2_can( &para ) ;
		break ;
	case 4:						  // ｽﾍﾟｸﾄﾙ定着
		ret = g_fft2_fix( &para ) ;
		break ;
	case 5:						  // 逆ＦＦＴ
		ret = g_fft2_inv( &para ) ;
		break ;
	case 6:						  // おまけ ｽﾍﾟｸﾄﾙ再表示
		ret = g_fft2_dsp( &para ) ;
		break ;
	}

	if( ret )
		return OUT_OF_MEMORY ;
	else
		return NOERR ;
}

/*** 平滑化フィルタ ***/
static int softnessFilter( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int k ;

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	g_softnessFilter( &para, d[1]*228/100 ) ;

	k = (100 - d[2]) / 5 ;
	if( d[2] == 0 )
		k = 256 ;

	g_s_c_Filter( &para, k ) ;

	return NOERR ;
}

static int ySoftnessFilter( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */
	int k ;

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	g_ySoftnessFilter( &para, d[1]*228/100 ) ;

	k = (100 - d[2]) / 5 ;
	if( d[2] == 0 )
		k = 256 ;

	g_s_c_yFilter( &para, k ) ;

	return NOERR ;
}

/*** シャープネス ***/
static int sharpnessFilter( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	g_softnessFilter( &para, -d[1]*256*2/100 ) ;

	g_c_m_Filter( &para, d[2]/5 ) ;

	return NOERR ;
}

static int ySharpnessFilter( FRAME areaFrame, int *d )
{
	BASICPARA para ;	/* 引数 */

		/* 引数の設定 */

	para.mix = d[0]*256/100 ;	/* ミクシングレートの指定 */
	para.alphaSen = 1 ;			/* アルファセンサON */
	para.maskSen = 0 ;			/* マスクセンサON (1以上でON) */
	para.colorMax = 255 ;		/* RGBデータの最大値255 */
	para.alphaMax = 1 ;			/* アルファデータの最大値 */

	para.lupx = areaFrame.lupx ;			/* 座表設定 */
	para.lupy = areaFrame.lupy ;
	para.rdwx = areaFrame.rdwx ;
	para.rdwy = areaFrame.rdwy ;

	para.read1 = execRead1 ;		/* read領域読み取り関数 */
	para.read2 = execRead2 ;		/* write領域読み取り関数 */
	para.write = execWrite ;		/* write領域書き込み関数 */
	para.mask = execMask ;			/* mask領域読み取り関数 */

	g_ySoftnessFilter( &para, -d[1]*256*2/100 ) ;

	g_c_m_yFilter( &para, d[2]/5 ) ;

	return NOERR ;
}

/***** ファイル操作ルーチン *****/

/* LOAD */
/*	initDataIGRDSK:fileMItemId[1]:MJ_MITEML40の呼び出し関数	*/
int	fileFunc1(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int		i, ret ;
	char 	*namePoint ;
	char	path[100] ;
	char	*ExtStr[] = { "*.TIF", NULL } ;

	/* メニューを使えないようにする */
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	/*	ウィンドウをこれ以上表示できない */
	if( windowflg == WINCOUNT )
	{
		ret = OUT_OF_WINDOW ;
		goto e00 ;
	}

	_rstrncpy( path, tifPath, 80 ) ;	/* pathにパス名をcopy */
	ret = fileSelecter( path, ExtStr, "ＴＩＦＦ読込", "読  込", "取  消");
	if( ret )
	{
		/* メニューを使えるように戻す */
		MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
		return NOERR ;
	}
	else
	{
		/* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
		file_kakuchousi_set( tifPath, path, ".TIF" ) ;
	}

	namePoint = path ;
	for( i=0 ; i<80 ; i++ )
	{
		char s ;

		s = path[i] ;
		if( (s == '\\') || (s == ':') )namePoint = path + i + 1 ;
		if( s == '\0' )break ;
	}

	char *work ;
	int comp, fill ;
	long strip, clut ;
	int lot ;
	char *buf ;
	int col, dx, dy ;

	if( tiffCheckHead( tifPath, &col, &dx, &dy, &comp, &fill, &strip, &clut) )
	{
		ret = ILLEGAL_DATA ;
		goto e00 ;
	}

	lot = TL_getLot() ;
	if( (buf = (char *)TL_mallocMemory( lot, dx * dy * 6 )) == NULL )
	{
		if( lot )
			TL_freeLot( lot ) ;
		ret = OUT_OF_MEMORY ;
		goto e00 ;
	}

	if
	(
	  ( work = (char *)TL_malloc( 
			DECOMP_WORK_SIZE + LOADBUFSIZE + EXPBUFSIZE + MinMem ) )
				 == NULL
	)
	{
		ret = OUT_OF_MEMORY ;
		TL_freeLot( lot ) ;
		goto e00 ;
	}

	SetMouse32k( 81, 0x7fff, 0x0 ) ;	/* マウスカーソルをウエイト表示に */
	ret = tifLoad16m( work, tifPath, buf, &dx, &dy ) ;
	if( ret )
	{
		TL_free( work ) ;
		TL_freeLot( lot ) ;
		goto e00 ;
	}

	/* alpha領域clear */
	for( i=dx*dy*3 ; i<dx*dy*4 ; i += 4 )
		DWORD( buf + i ) = 0 ;

	cov16mTo32k( buf, buf + dx*dy*4, dx*dy ) ;

	TL_free( work ) ;
	ret = geneWindow( namePoint, tifPath, lot,
						buf, buf + dx*dy*3, buf + dx*dy*4, dx, dy ) ;

e00:
	SetMouse32k( 80, 0x7fff, 0x0 ) ;

	/* メニューを使えるように戻す */
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	if( ret )
			errorCheck( ret ) ;
	return NOERR ;
}

/* SAVE */
/*	initDataIGRDSK:fileMItemId[2]:MJ_MITEML40の呼び出し関数	*/
int	fileFunc2(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int		ret ;
	char	path[100] ;
	char	*ExtStr[] = { "*.TIF", NULL } ;

	/* メニューを使えないようにする */
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	/*	ウィンドウが開かれてない */
	if( (windowflg == 0) || (window[actId].buf16m == NULL) )
	{
		ret = NO_WINDOW ;
		goto e00 ;
	}

	_rstrncpy( path, window[actId].savePath, 80 ) ;	/* pathにパス名をcopy */
	ret = fileSelecter2( path, ExtStr, "ＴＩＦＦ保存", "保  存", "取  消");
	if( ret )
	{
		/* メニューを使えるように戻す */
		MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
		return NOERR ;
	}
	else
	{
		/* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
		file_kakuchousi_set( window[actId].savePath, path, ".TIF" ) ;
	}

	char *work ;

	if( (work=(char *)TL_malloc(COMP_WORK_SIZE+SAVEBUFSIZE+GETBUFSIZE))
			 == NULL )
	{
		ret = OUT_OF_MEMORY ;
		goto e00 ;
	}

	SetMouse32k( 81, 0x7fff, 0x0 ) ;	/* マウスカーソルをウエイト表示に */
	if( saveMode == 0 )
		ret = tifSave32kAnd16m(
			work, window[actId].savePath, window[actId].buf16m,
			24, saveCompMode, window[actId].dx, window[actId].dy ) ;
	else
		ret = tifSave32kAnd16m(
			work, window[actId].savePath, window[actId].buf32k,
			16, saveCompMode, window[actId].dx, window[actId].dy ) ;
	SetMouse32k( 80, 0x7fff, 0x0 ) ;
	if( ret )
	{
		TL_free( work ) ;
		goto e00 ;
	}
	TL_free( work ) ;

e00:
	/* メニューを使えるように戻す */
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	if( ret )
			errorCheck( ret ) ;
	return NOERR ;
}


/***** エフェクトコマンド設定ルーチン *****/

/*	initDataIGRDSK:effectMItemId[0〜10]:MJ_MITEML40の呼び出し関数	*/
int	effectFunc(kobj)
int		kobj ;
				//int		messId ;
				//int		argc ;
				//EVENT	*pev ;
				//int		trigger ;
{
	int i ;
	int    alertobj ;      /*   現在のALERTOBJを退避する変数　　  */
	int n ;

	for( i=0 ; i<EFFECTCOUNT ; i++ )
	{
		if( kobj == effectMItemId[i] )
			break ;
	}
	if( i >= EFFECTCOUNT )return NOERR ;

	/* メニューを使えないようにする */
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	effectNum = i ;
	n = i ;
	setEffect( &(effectSet[i]) ) ;	/* 操作パネルの初期設定 */

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( baseSetupDialogId ) ;
	MMI_SendMessage( baseSetupDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	MMI_SendMessage( baseSetupDialogId, MM_SHOW, 0 ) ; /* 見せる */

	setDspFlg = 1 ;
	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */
	setDspFlg = 0 ;

	MMI_SendMessage( baseSetupDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseSetupDialogId, MM_DETACH, 0 ) ;
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( windowflg && (effectNum >= 0) )
	{
		if( undoBuf == NULL )
			makeUndoBuf() ;

		if( undoBuf == NULL )
			errorCheck( OUT_OF_MEMORY ) ;				/* undoBufがない */
		else
		{
			areaMode = effectSet[effectNum].areaMode ;

			if( effectSet[effectNum].modeFlg[effectSet[effectNum].mode]
			 & __MODE_GO )
			{
				FRAME fr = {0,0,0,0} ;

				SetMouse32k( 81, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
				execEffect( fr ) ;				/* effect実行ルーチンに */
				SetMouse32k( 80, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
				showActWindow() ;
				MMI_FlushEvnt() ;	/* イベントをフラッシュ */
				areaMode = -1 ;
			}

			if( effectSet[effectNum].modeFlg[effectSet[effectNum].mode]
			 & __MODE_AREA )
			{
				areaMode
				= effectSet[effectNum].modeFlg[effectSet[effectNum].mode]
				& 0xff ;
			}
		}
	}

	if( n == 10 )	/* FFTのための特別処置 */
	{
		if( effectNum >= 0 )
		{
			fixRectangleLx = 1 << effectSet[effectNum].set[0].prt ;
			fixRectangleLy = 1 << effectSet[effectNum].set[0].prt ;

			if( effectSet[effectNum].mode == 1
			 || effectSet[effectNum].mode == 2
			)
			{
				FRAME fr = {0,0,0,0} ;
				int md ;

				if( g_fft2_readFlg() == 2 )
				{
					md = effectSet[effectNum].mode ;
					effectSet[effectNum].mode = 6 ;
					SetMouse32k( 81, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
					execEffect( fr ) ;				/* effect実行ルーチンに */
					SetMouse32k( 80, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
					showActWindow() ;
					MMI_FlushEvnt() ;	/* イベントをフラッシュ */
					effectSet[effectNum].mode = md ;
				}
			}
		}
		else
		{
			g_fft2_clr() ;
		}
	}

	/* メニューを使えるように戻す */
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/* 設定パネルの初期設定 */
static setEffect( BASICSET *set )
{
	HYPER hyp ;
	FRAME frm ;
	int dx, dy, i ;

/* まっ先にセンタリングするから,後でアタッチ,デタッチをしても位置がずれない */
	MMI_SendMessage( baseSetupDialogId, MM_GETHYPER, 1, &hyp ) ; /* ｾﾝﾀﾘﾝｸﾞ */
	dx = hyp.fr.rdwx - hyp.fr.lupx ;
	dy = hyp.fr.rdwy - hyp.fr.lupy ;
	frm.lupx = 256 - dx / 2 ;
	frm.lupy = 240 - dy / 2 ;
	frm.rdwx = hyp.fr.lupx + dx ;
	frm.rdwy = hyp.fr.lupy + dy ;
	MMI_SendMessage( baseSetupDialogId, MM_MOVE, 1, &frm ) ;

	/*	タイトルを設定する  */
	MMI_SendMessage( baseSetupTitleMesId, MM_SETMSG, 1, set->title ) ;

	/*  各種設定項目  */
	for( i=0 ; i<4 ; i++ )
	{
		MMI_SendMessage( baseSetupMesId[i], MM_SETMSG,
											1, (set->set[i]).title ) ;
		MMI_SendMessage( baseSetupNumId[i], MM_SETNUMBOX, 5,
			 (set->set[i]).prt, (set->set[i]).min, (set->set[i]).max, 1, 0 ) ;
		MMI_SendMessage( baseScrId[i], MM_SETSCROLL, 5,
			 (set->set[i]).prt, (set->set[i]).min, (set->set[i]).max, 1, 1 ) ;
	}

	/*	モードのタイトルを設定する  */
	MMI_SendMessage( baseSetupModeTitleMesId, MM_SETMSG, 1, set->modeTitle ) ;
	for( i=0 ; i<6 ; i++ )
		MMI_SendMessage( baseSetupModeMesId[i], MM_SETMSG,
														1, set->modeName[i] ) ;
	/* 選択されたモードのボタン設定 */
	for( i=0 ; i<6 ; i++ )
		MTL_resetFlagObj( setupTIconId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
	MTL_setFlagObj( setupTIconId[ set->mode ], (MS_UNSELECT | MS_TOGGLE) ) ;

	/* 選択されたエリアモードのボタン設定 */
	for( i=0 ; i<3 ; i++ )
		MTL_resetFlagObj( setupAreaTIconId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
	MTL_setFlagObj( setupAreaTIconId[ set->areaMode ],
							(MS_UNSELECT | MS_TOGGLE) );

	/* エリアモードの選択の必要ないモードの場合､それを消す */
	if( set->modeFlg[ set->mode ] )
	{
		for( i=0 ; i<3 ; i++ )
		{
			MTL_setAtrObj( setupAreaTIconId[i], MS_INACTIVEL40 ) ;
		}
		for( i=4 ; i<8 ; i++ )
		{
			MTL_resetAtrObj( baseSetupMesId[i], (~MS_DSPONLYL40) ) ;
			MTL_setAtrObj( baseSetupMesId[i], MS_INACTIVEL40 ) ;
		}
	}
	else
	{
		/* エリアモードのボタン設定 */
		for( i=0 ; i<3 ; i++ )
		{
			MTL_resetAtrObj( setupAreaTIconId[i], (~MS_DSPONLYL40) ) ;
		}
		for( i=4 ; i<8 ; i++ )
		{
//			MTL_resetAtrObj( baseSetupMesId[i], (~MS_DSPONLYL40) ) ;
			MTL_setAtrObj( baseSetupMesId[i], MS_DSPONLYL40 ) ;
		}
	}

	/*  各種設定項目のアタッチorデタッチの設定  */
	for( i=0 ; i<4 ; i++ )
	{
		if( i<(set->setNum) )
		{
			MMI_SendMessage( baseSetupNumId[i], MM_ATTACH,
											1, baseSetupDialogId2 ) ;
			MMI_SendMessage( baseScrId[i], MM_ATTACH,
											1, baseSetupDialogId2 ) ;
		}
		else
		{
			MMI_SendMessage( baseSetupNumId[i], MM_DETACH, 0 ) ;
			MMI_SendMessage( baseScrId[i], MM_DETACH, 0 ) ;
		}
	}

	/*  モードのアタッチorデタッチの設定  */
	for( i=0 ; i<6 ; i++ )
	{
		/* 文字をボタンの上に持ってくるために,一端デタッチする */
		MMI_SendMessage( baseSetupModeMesId[i], MM_DETACH, 0 ) ;

		if( i<(set->modeNum) )
		{
			MMI_SendMessage( setupTIconId[i], MM_ATTACH,
											1, baseSetupDialogId2 ) ;
			MMI_SendMessage( baseSetupModeMesId[i], MM_ATTACH,
											1, baseSetupDialogId2 ) ;
									/* 文字はボタンの後に,アタッチする */
		}
		else
		{
			MMI_SendMessage( setupTIconId[i], MM_DETACH, 0 ) ;
		}
	}

	MMI_SendMessage( baseSetupDialogId, MM_MOVE, 1, &(hyp.fr) ) ;

	return NOERR ;
}

/* 数値設定 */
/*	initDataIGRSET:baseSetupNumId[0]:MJ_NUMBOXL40の呼び出し関数	*/
/*	initDataIGRSET:baseSetupNumId[1]:MJ_NUMBOXL40の呼び出し関数	*/
/*	initDataIGRSET:baseSetupNumId[2]:MJ_NUMBOXL40の呼び出し関数	*/
/*	initDataIGRSET:baseSetupNumId[3]:MJ_NUMBOXL40の呼び出し関数	*/
int	baseSetupNumFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int		i, prt , max , min , d1 , d2 ;

	for( i=0 ; i<4 ; i++ )
	{
		if( kobj == baseSetupNumId[i] )
			break ;
	}
	MMI_SendMessage( kobj, MM_GETNUMBOX, 5, &prt, &min, &max, &d1, &d2 ) ;
	MMI_SendMessage( baseScrId[i], MM_SETSCROLL,
										 5,	prt, min, max, 1, 1 ) ;
	MMI_SendMessage( baseScrId[i], MM_SHOW, 0 ) ;
	effectSet[effectNum].set[i].prt = prt ;

	return NOERR ;
}

/* スクロール設定 */
/*	initDataIGRSET:baseScrId[0]:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIGRSET:baseScrId[1]:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIGRSET:baseScrId[2]:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIGRSET:baseScrId[3]:MJ_SCRLL40の呼び出し関数	*/
int	baseSetupScrFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int		i, prt , max , min , d1 , d2 ;

	for( i=0 ; i<4 ; i++ )
	{
		if( kobj == baseScrId[i] )
			break ;
	}
	MMI_SendMessage( kobj, MM_GETSCROLL, 5, &prt, &min, &max, &d1, &d2 ) ;
	MMI_SendMessage( baseSetupNumId[i], MM_SETNUMBOX,
										 5,	prt, min, max, 1, 0 ) ;
	MMI_SendMessage( baseSetupNumId[i], MM_SHOW, 0 ) ;
	effectSet[effectNum].set[i].prt = prt ;

	return NOERR ;
}

/* モード設定 */
/*	initDataIGRSET:setupTIconId[0〜5]:MJ_TICONL40の呼び出し関数	*/
int	baseSetupTIconFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i, j ;

	for( i=0 ; i<6 ; i++ )
	{
		if( kobj == setupTIconId[i] )
			break ;
	}
	if( i < 6 )
	{
		MTL_setFlagObj( setupTIconId[i], MS_UNSELECT ) ;
		MTL_resetFlagObj( setupTIconId[ effectSet[effectNum].mode ],
							(~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setupTIconId[ effectSet[effectNum].mode ],
							MM_SHOW, 0 ) ;
		effectSet[effectNum].mode = i ;

		if( effectSet[effectNum].modeFlg[effectSet[effectNum].mode] )
		{
			/* エリアモードのボタン設定 */
			for( j=0 ; j<3 ; j++ )
			{
				MTL_setAtrObj( setupAreaTIconId[j], MS_INACTIVEL40 ) ;
				MMI_SendMessage( setupAreaTIconId[j], MM_SHOW, 0 ) ;
			}
			for( j=4 ; j<8 ; j++ )
			{
				MTL_resetAtrObj( baseSetupMesId[j], (~MS_DSPONLYL40) ) ;
				MTL_setAtrObj( baseSetupMesId[j], MS_INACTIVEL40 ) ;
				MMI_SendMessage( baseSetupMesId[j], MM_SHOW, 0 ) ;
			}
		}
		else
		{
			/* エリアモードのボタン設定 */
			for( j=0 ; j<3 ; j++ )
			{
				MTL_resetAtrObj( setupAreaTIconId[j], (~MS_DSPONLYL40) ) ;
				MMI_SendMessage( setupAreaTIconId[j], MM_SHOW, 0 ) ;
			}
			for( j=4 ; j<8 ; j++ )
			{
//				MTL_resetAtrObj( baseSetupMesId[j], (~MS_DSPONLYL40) ) ;
				MTL_setAtrObj( baseSetupMesId[j], MS_DSPONLYL40 ) ;
				MMI_SendMessage( baseSetupMesId[j], MM_SHOW, 0 ) ;
			}
		}
	}
	return NOERR ;
}

/* エリア設定モード設定 */
/*	initDataIGRSET:setupAreaTIconId[0]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIGRSET:setupAreaTIconId[1]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIGRSET:setupAreaTIconId[2]:MJ_TICONL40の呼び出し関数	*/
int	baseSetupAreaTIconFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	for( i=0 ; i<3 ; i++ )
	{
		if( kobj == setupAreaTIconId[i] )
			break ;
	}
	if( i < 3 )
	{
		MTL_setFlagObj( setupAreaTIconId[i], MS_UNSELECT ) ;
		MTL_resetFlagObj( setupAreaTIconId[ effectSet[effectNum].areaMode ],
							(~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setupAreaTIconId[ effectSet[effectNum].areaMode ],
							MM_SHOW, 0 ) ;
		effectSet[effectNum].areaMode = i ;
	}
	return NOERR ;
}

/* 実行or取消 */
/*	initDataIGRSET:baseSDBtnId[1]:MJ_DBUTTONL40の呼び出し関数	*/
/*	initDataIGRSET:baseSDBtnId[0]:MJ_DBUTTONL40の呼び出し関数	*/
int	baseSetupOkFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj != baseSDBtnId[0] )
		effectNum = -1 ;

	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/***** 画面拡大設定ルーチン *****/

/* 拡大時において,マウス関係のイベント実行時に,ここを経由 */
static int outFuncSub( EVENT *pev )
{
	int x, y ;

	if( pev->what == EVMOSDN && pev->shift == SRIGHTBTN )
	{
		if( 
			MTL_checkFlagObj( alertId, MS_DSP ) == 0
		&&	MTL_checkFlagObj( SDKmenuId, MS_DSP ) == 0
		&&	MTL_checkFlagObj( fileMenuId, MS_DSP ) == 0
		&&	MTL_checkFlagObj( effectMenuId, MS_DSP ) == 0
		&&	effectNum >= 0
		&&	setDspFlg == 0
		)
		{
				effectFunc( effectMItemId[effectNum] ) ;
		}
	}

	if( outMode )		/* 拡大設定 */
	{
		x = ((POINT *)&(pev->info))->x ;
		y = ((POINT *)&(pev->info))->y ;
		setDisplayArea( x, y ) ;	/* カーソルを画面の中に入れる関数 */
	}

	switch( pev->what )
	{
	case EVMOSDN:
		MMI_MosOnMethods() ;
		break ;
	case EVMOSUP:
		MMI_MosOffMethods() ;
		break ;
	case EVMOSMOVE:
		MMI_MosMoveMethods( pev ) ;
		break ;
	case EVMOSDRAG:
		MMI_MosDragMethods( pev ) ;
		break ;
	}
	return NOERR ;
}

/* 拡大ON,OFF SWITCH */
/*	initDataIGRDSK:outIconId:MJ_ICONL40の呼び出し関数	*/
int	displayOutFunc(kobj)
int		kobj ;
				// int		messId ;
				// int		argc ;
				// EVENT	*pev ;
				// int		trigger ;
{
	if( outMode == 0 )		/* 拡大設定 */
	{
		MMI_displayOut( 2, 2 ) ;
		MMI_displayOutStart() ;
		outMode = 1 ;
		outLupx = 256 ; outLupy = 0 ;
		setDisplayArea( 256, 0 ) ;

		MMI_SendMessage( kobj , MM_SETSHAPE , 1 , 298 ) ;
		MMI_SendMessage( kobj , MM_SHOW , 0 ) ;
	}
	else					/* 拡大解除 */
	{
		MMI_displayOut( 1, 1 ) ;
		MMI_displayOutEnd() ;

		EGB_displayStart( guiEgbPtr, 3, 0, 0 ) ;
		EGB_displayStart( guiEgbPtr, 2, 1, 1 ) ;
		EGB_displayStart( guiEgbPtr, 0, 0, 0 ) ;
		EGB_displayStart( guiEgbPtr, 1, 0, 0 ) ;
		EGB_displayStart( guiEgbPtr, 3, boundWidth, 480 ) ;

		MMI_SendMessage( kobj , MM_SETSHAPE , 1 , 297 ) ;
		MMI_SendMessage( kobj , MM_SHOW , 0 ) ;
		outMode = 0 ;
	}

	return NOERR ;
}

/* 注意!!! これらは絶対にstaticでなければいけない */
static int ( *eventFunc0 )( EVENT * ) ;
static int ( *eventFunc1 )( EVENT * ) ;
static int ( *eventFunc3 )( EVENT * ) ;
static int ( *eventFunc4 )( EVENT * ) ;
static int hookFlg = 0 ;

/* hook start */
static int	hookStart()
{
	if( hookFlg )return NOERR ;

	MMI_GetExecEvent( 0, &eventFunc0 ) ;
	MMI_GetExecEvent( 1, &eventFunc1 ) ;
	MMI_GetExecEvent( 3, &eventFunc3 ) ;
	MMI_GetExecEvent( 4, &eventFunc4 ) ;
	MMI_SetExecEvent( 0, outFuncSub ) ;
	MMI_SetExecEvent( 1, outFuncSub ) ;
	MMI_SetExecEvent( 3, outFuncSub ) ;
	MMI_SetExecEvent( 4, outFuncSub ) ;
	hookFlg = 1 ;

	return NOERR ;
}

/* hook end */
static int	hookEnd()
{
	MMI_SetExecEvent( 0, eventFunc0 ) ;
	MMI_SetExecEvent( 1, eventFunc1 ) ;
	MMI_SetExecEvent( 3, eventFunc3 ) ;
	MMI_SetExecEvent( 4, eventFunc4 ) ;
	hookFlg = 0 ;

	return NOERR ;
}


/***** ウィンドウ操作関数 *****/

/* ウィンドウのユーザー関数 */
/*	initDataIGRWIN:windowId:MJ_WINDOWL40の呼び出し関数	*/
int	windowFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	FRAME		org ;
	FRAME		size ;
	HYPER		winhyp , vschyp, hschyp  ;

	char		para[64] ;
	int			act ;
	int 		dx, dy ;
	int 		sw, x, y ;
	int			ret ;
	int			error ;

	WINCLIP		*pwclp ;			/* 枠用の関数の為の変数 */
	WINCLIP		*pstackVisible ;
	WINCLIP		*pstackClip ;
	WINCTRL		*pctrl ;
	POINT		origin ;
	POINT		dspOrigin ;

	/* クリップ枠とビジブル枠を退避する入れ子の関数 */
	void pushWaku()
	{
		origin.y = origin.x = 0 ;
		MG_PushOrigin( &origin, &dspOrigin ) ;
		MMI_GetControl( &pctrl ) ;
		pwclp = WIN_getClipMemory( &pctrl->bound, NULL ) ;
		WIN_pushVisible( WIN_copyClip( pwclp ), &pstackVisible ) ;
		WIN_pushClip( pwclp, &pstackClip ) ;
	}

	/* クリップ枠とビジブル枠を元に戻す入れ子の関数 */
	void popWaku()
	{
		WIN_popClip( pstackClip ) ;
		WIN_popVisible( pstackVisible ) ;
		MG_PopOrigin( &dspOrigin ) ;
	}

	/* クリップ枠の絵を表示する入れ子の関数 */
	void showWaku()
	{
		char *buf ;

		MG_mosDisp( 2 );
		buf = window[act].buf32k ;
		if( buf != NULL )
		{
			EGB_writeMode(guiEgbPtr,0);	/* XORモードでここに入る場合もあり */
			EGB_paintMode(guiEgbPtr,0x222);

			DWORD( para + 0 ) = (unsigned int)buf ;
			WORD( para + 4 ) = getds() ;
			WORD( para + 6 ) = - window[act].ox ;
			WORD( para + 8 ) = - window[act].oy ;
			WORD( para + 10 ) = - window[act].ox + window[act].dx - 1 ;
			WORD( para + 12 ) = - window[act].oy + window[act].dy - 1 ;
			WGB_putBlock( guiEgbPtr, 1, para ) ;
		}
		MG_mosDisp( 3 );
	}

	error = ILLEGAL_FUNCTION ;

	/*	どのウィンドウから呼ばれたか調べる		*/
	for( act = 0 ; act < WINCOUNT ; act ++ )
		if( window[act].windowId == kobj )
			 break ;

	/* SHOW */
	if( messId == MM_SHOW )
	{
		showWaku() ;

		error = NOERR ;
	}

	/*	リサイズの時の処理		*/
	else if( messId == MM_UPDATE )
	{
		MMI_SendMessage( kobj , MM_GETUSER , 2 , &org , &size ) ;
		MMI_SendMessage( kobj , MM_GETHYPER , 1 , &winhyp ) ;

	/*		ユーザー領域のリサイズ処理								*/
		/* 	影とスクロールバーの分 内側によせる(SHADE_SIZE + BAR_SIZE)	*/
		/*	SHADE_SIZE : GUI.H参照		BAR_SIZE : gratst.H参照			*/
		org.rdwx = winhyp.fr.rdwx - 
				 ( SHADE_SIZE + BAR_SIZE ) - winhyp.fr.lupx - org.lupx + 1 ;
		org.rdwy = winhyp.fr.rdwy -
				 ( SHADE_SIZE + BAR_SIZE ) - winhyp.fr.lupy - org.lupy + 1 ;
		MMI_SendMessage( kobj , MM_SETUSER, 2, &org, &size );

	/*		スクロールバーのリサイズ処理							*/
		MMI_SendMessage( window[act].hscrollId , MM_GETHYPER , 1, &hschyp ) ;
		hschyp.fr.lupy = winhyp.fr.lupy + org.lupy + org.rdwy ;
		hschyp.fr.rdwx = winhyp.fr.lupx + org.lupx + org.rdwx ;
		hschyp.fr.rdwy = hschyp.fr.lupy + BAR_SIZE ;
		MMI_SendMessage( window[act].hscrollId , MM_SETHYPER , 1, &hschyp ) ;

		MMI_SendMessage( window[act].vscrollId , MM_GETHYPER , 1, &vschyp ) ;
		vschyp.fr.lupx = winhyp.fr.lupx + org.lupx + org.rdwx ;
		vschyp.fr.rdwy = winhyp.fr.lupy + org.lupy + org.rdwy ;
		vschyp.fr.rdwx = vschyp.fr.lupx + BAR_SIZE ;
		MMI_SendMessage( window[act].vscrollId , MM_SETHYPER , 1, &vschyp ) ;

	/*	スクロールバーの設定		*/
		dx = window[act].dx ;
		dy = window[act].dy ;
		if( (dx - window[act].ox) < org.rdwx )
			window[act].ox = dx - org.rdwx ;
		if( (dy - window[act].oy) < org.rdwy )
			window[act].oy = dy - org.rdwy ;
		MMI_SendMessage( window[act].hscrollId, MM_SETSCROLL, 5, 
					org.rdwx - 1 + window[act].ox, org.rdwx - 1, dx - 1,
							org.rdwx, 1 ) ;
		MMI_SendMessage( window[act].vscrollId, MM_SETSCROLL, 5, 
					org.rdwy - 1 + window[act].oy, org.rdwy - 1, dy - 1,
							org.rdwy, 1 ) ;

		error = NOERR ;
	}

	/*	移動時の処理			*/
	else if( messId == MM_MOVE )
	{
		error = NOERR ;
	}

	/*	mouseが押された時の処理			*/
	else if( messId == MM_MOUSEON )
	{
		FRAME areaFrame ;	/* 領域指定の対角座表 */

		if( effectNum >= 0 && areaMode >= 0 )
		{
			switch( areaMode )
			{
			case 0:		/* ポリゴン指定 */
				if( (ret = polygon1( actId, &areaFrame )) == NOERR )
					polygon2() ;
				break ;
			case 1:		/* 四角形指定 */
				if( (ret = rectangle1( actId, &areaFrame )) == NOERR )
					rectangle2() ;
				break ;
			case 3:		/* 大きさ固定四角形指定 */
				ret = fixRectangle( actId, &areaFrame ) ;
				break ;
			case 2: /* 全画面指定はここで処理する(ﾒﾘｯﾄはWGB関数が使えること) */
				ret = 0 ;
				MOS_rdpos(&sw,&x,&y) ;
				if( sw == 0 )	/* ここで押してないのはやる気なし */
				{
					ret = -1 ;
					MMI_FlushEvnt() ;	/* イベントをフラッシュ */
					break ;
				} /* こうしないとwindow切り替え時にeffectが実行されてしまう */
				MG_mosDisp( 2 );
				EGB_color(guiEgbPtr,0,0x7fff);
				EGB_paintMode(guiEgbPtr,0x222);
				EGB_writeMode(guiEgbPtr,4);
				WORD( para + 0 ) = - window[act].ox ;
				WORD( para + 2 ) = - window[act].oy ;
				WORD( para + 4 ) = - window[act].ox + window[act].dx - 1 ;
				WORD( para + 6 ) = - window[act].oy + window[act].dy - 1 ;
				WGB_rectangle(guiEgbPtr,para);
				do
				{
					MOS_rdpos(&sw,&x,&y) ;
					if( sw > 1 )ret = -1 ;
				}while( sw ) ;
				WGB_rectangle(guiEgbPtr,para);
				EGB_writeMode(guiEgbPtr,0);
				MG_mosDisp( 3 );

				areaFrame.lupx = 0 ;	/* エリア指定は全画面に */
				areaFrame.lupy = 0 ;
				areaFrame.rdwx = window[act].dx - 1 ;
				areaFrame.rdwy = window[act].dy - 1 ;
				MMI_FlushEvnt() ;	/* イベントをフラッシュ */
				break ;
			}
			if( ret == 0 )
			{
				if( undoBuf == NULL )	/* アンドゥバッファがない */
					makeUndoBuf() ;

				if( undoBuf == NULL )
				{
					pushWaku() ;
					errorCheck( OUT_OF_MEMORY ) ;	/* undoBufがない */
					popWaku() ;
				}
				else
				{
					SetMouse32k( 81, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
					ret = execEffect( areaFrame ) ;	/* effect実行ルーチンに */
					SetMouse32k( 80, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
					showWaku() ;
					MMI_FlushEvnt() ;	/* イベントをフラッシュ */
					if( ret )
					{
						pushWaku() ;
						errorCheck( ret ) ;
						popWaku() ;
					}
				}
			}
		}

		error = NOERR ;
	}

	/*	消去の時の処理			*/
	else if( messId == MM_ERASE )
	{
		/*	ウィンドウの表示枚数を1枚減らす		*/
		windowflg-- ;
		if( windowflg == 0 )
		{
			if( undoLot )					/* 1994 9 29 バグの個所と見る */
				TL_freeLot( undoLot ) ;	/* 今までのアンドゥバッファはチャラ */
			undoLot =  0 ;	/* lot=0はsystemが利用しているので0はlot未取得に */
		}
		/*	表示してないことをしめすためwindowIdを負にする	*/
		window[act].windowId = -(window[act].windowId) ;
		TL_freeLot( window[act].lot ) ;
		window[act].buf16m = NULL ;		/* 各バッファアドレスをNULLに */
		window[act].bufAlpha = NULL ;
		window[act].buf32k = NULL ;
		window[act].loadPath[0] = 0 ;	/* file名を消す */
		window[act].savePath[0] = 0 ;

		error = NOERR ;
	}

	/*	アクティブになった時の処理		*/
	else if( messId == MM_WAKE )
	{
		actId = act ;

		makeUndoBuf() ;			/* アンドゥバッファ作成 */

		int x0, y0, x1, y1 ;	/* windowﾕｰｻﾞｴﾘｱ検出用変数 */

		MMI_SendMessage( kobj , MM_GETUSER , 2 , &org , &size ) ;
		MMI_SendMessage( kobj , MM_GETHYPER , 1 , &winhyp ) ;
		x0 = winhyp.fr.lupx + org.lupx ;
		y0 = winhyp.fr.lupy + org.lupy ;
		x1 = x0 + org.rdwx - 1 ;
		y1 = y0 + org.rdwy - 1 ;

		MOS_rdpos(&sw,&x,&y);
		if	/* ユーザエリア内でマウスが押されてる場合リリースまで待つ */
		(
			(x >= x0) && (x <= x1) &&
			(y >= y0) && (y <= y1)
		)
		{
			while( sw )
			{
				 MOS_rdpos(&sw,&x,&y) ;
			}
			MMI_FlushEvnt() ;	/* イベントをフラッシュ */
		}	/* こうしないとwindow切り替え時にeffectが実行されてしまう */

		error = NOERR ;
	}

	return error ;
}

/* ウインドウのスクロール操作時に呼ばれる関数 */
/*	initDataIGRWIN:vscrollId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIGRWIN:hscrollId:MJ_SCRLL40の呼び出し関数	*/
int	scrollFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int		prt , max , min , len , page ;

	if( kobj == window[actId].hscrollId )
	{
		MMI_SendMessage( window[actId].hscrollId, MM_GETSCROLL,
								 5, &prt, &min, &max, &len, &page) ;
		window[actId].ox = prt - min ;
	}
	else if( kobj == window[actId].vscrollId )
	{
		MMI_SendMessage( window[actId].vscrollId, MM_GETSCROLL,
								 5, &prt, &min, &max, &len, &page) ;
		window[actId].oy = prt - min ;
	}

	showActWindow() ;

	return NOERR ;
}

/* ウインドウユーザエリア再表示 */
static int showActWindow()
{
	char para[64] ;
	char *buf ;

	WINCLIP	*pwclp ;
	WINCLIP *pstackVisible ;
	WINCLIP	*pstackClip ;
	HYPER	hyp ;
	FRAME	oFr, sFr, cFr ;
	POINT	origin, dspOrigin ;

	if( window[actId].windowId < 0 )return NOERR ;

	/* クリップ枠,ビジブル枠をウインドウユーザエリア枠に設定 */
	MMI_SendMessage( window[actId].windowId, MM_GETHYPER, 1, &hyp ) ;
	MMI_SendMessage( window[actId].windowId, MM_GETUSER, 2, &oFr, &sFr ) ;
	cFr.lupx = dspOrigin.x = hyp.fr.lupx + oFr.lupx ;
	cFr.lupy = dspOrigin.y = hyp.fr.lupy + oFr.lupy ;
	cFr.rdwx = cFr.lupx + oFr.rdwx - 1 ;
	cFr.rdwy = cFr.lupy + oFr.rdwy - 1 ;
	MG_PushOrigin( &dspOrigin, &origin ) ;
	pwclp = WIN_getClipMemory( &cFr, NULL ) ;
	WIN_pushVisible( WIN_copyClip( pwclp ), &pstackVisible ) ;
	WIN_pushClip( pwclp, &pstackClip ) ;

	/* 再表示実行 */
	MG_mosDisp( 2 );
	buf = window[actId].buf32k ;
	if( buf != NULL )
	{
		EGB_writeMode(guiEgbPtr,0);	/* XORモードでここに入る場合もあるため */
		EGB_paintMode(guiEgbPtr,0x222);

		DWORD( para + 0 ) = (unsigned int)buf ;
		WORD( para + 4 ) = getds() ;
		WORD( para + 6 ) = - window[actId].ox ;
		WORD( para + 8 ) = - window[actId].oy ;
		WORD( para + 10 ) = - window[actId].ox + window[actId].dx - 1 ;
		WORD( para + 12 ) = - window[actId].oy + window[actId].dy - 1 ;
		WGB_putBlock( guiEgbPtr, 1, para ) ;
	}
	MG_mosDisp( 3 );

	/* クリップ枠,ビジブル枠を元に戻す */
	WIN_popClip( pstackClip ) ;
	WIN_popVisible( pstackVisible ) ;
	MG_PopOrigin( &origin ) ;

	return NOERR ;
}


/***** アンドゥ *****/

/* アンドゥバッファ作成 */
int makeUndoBuf()
{
	int dx, dy, ret ;

	dx = window[actId].dx ;
	dy = window[actId].dy ;

	/* undoBuf */
	if( undoLot )
	{
		TL_freeLot( undoLot ) ;	/* 今までのバッファはチャラに */
		undoLot =  0 ;	/* lot=0はsystemが利用しているので0はlot未取得に */
	}
	undoLot =  TL_getLot() ;
	undoBuf = (char *)TL_mallocMemory( undoLot, dx * dy * 4 ) ;
						/* NULLだとeffectルーチンは作業を始めない */

	if( undoBuf )	/* 残りMEMORYが少ないときはやめ */
	{
		if( checkMemory() < MinMem )
		{
			TL_freeLot( undoLot ) ;
			undoLot =  0 ;
			undoBuf = NULL ;
		}
	}
	else	/* 元々だめなら全部なかったことに */
	{
		if( undoLot )
		{
			TL_freeLot( undoLot ) ;
			undoLot =  0 ;
			undoBuf = NULL ;
		}
	}

	if( undoBuf != NULL )
	{
		alphaBuf = undoBuf + dx * dy * 3 ;
		if( window[actId].buf16m )
		{
			trans( window[actId].buf16m, undoBuf, dx*dy*3 ) ;
			trans( window[actId].bufAlpha, alphaBuf, dx*dy ) ;
		}
		ret = NOERR ;
	}
	else
	{
		alphaBuf = NULL ;
		ret = OUT_OF_MEMORY ;
	}

	return ret ;
}

/* アンドゥ関数 */
/*	initDataIGRDSK:effectUndoMItemId:MJ_MITEML40の呼び出し関数	*/
int	undoFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( windowflg && window[actId].buf16m && undoBuf )
	{
		int dx, dy ;

		SetMouse32k( 81, 0x7fff, 0x0 ) ;	/* マウスカーソルwait表示 */

		dx = window[actId].dx ;
		dy = window[actId].dy ;

		transExg( undoBuf, window[actId].buf16m, dx*dy*3 ) ;
		transExg( alphaBuf, window[actId].bufAlpha, dx*dy ) ;
		cov16mTo32k( window[actId].buf16m, window[actId].buf32k, dx*dy ) ;

		showActWindow() ;

		SetMouse32k( 80, 0x7fff, 0x0 ) ;	/* マウスカーソル表示変更 */
	}

	return NOERR ;
}



/*
 ************************
 *		汎用ルーチン    *
 ************************
*/

/* Window新規作成 */
/* 引数 タイトル,パス名,ロット,1600万色バッファ,32k色バッファ,絵の横幅,縦幅 */
static int geneWindow( char *title, char *path, int lot,
char *buf16m, char *bufAlpha, char *buf32k, int dx, int dy )
{
	int		no ;
	int		wid;	/*	ウィンドウ			*/
	int		vsid;	/*	スクロールバー		*/
	int		hsid;	/*	スクロールバー		*/
	HYPER	winhyp ;
	HYPER	vschyp ;
	HYPER	hschyp ;
	FRAME		org ;
	FRAME		size ;

	/*	ウィンドウをこれ以上表示できない */
	if( windowflg == WINCOUNT )
		return OUT_OF_WINDOW ;

	/*	何番目のウィンドウが表示できるか調べる		*/
	for( no = 0 ; no < WINCOUNT ; no++ )
		if( window[no].windowId < 0 )
			break ;

	actId = no;
	window[no].windowId = -(window[no].windowId) ;
	wid = window[no].windowId ;
	vsid = window[no].vscrollId ;
	hsid = window[no].hscrollId ;

	_rstrncpy( window[no].loadPath, path, 80 ) ;	/* パス名をcopy */
	window[no].lot = lot ;
	window[no].buf16m = buf16m ;
	window[no].bufAlpha = bufAlpha ;
	window[no].buf32k = buf32k ;
	window[no].dx = dx ;
	window[no].dy = dy ;
	window[no].ox = 0 ;
	window[no].oy = 0 ;

	/*	もとの大きさを取得	*/
	MMI_SendMessage( windowId , MM_GETHYPER , 1 , &winhyp );
	MMI_SendMessage( vscrollId , MM_GETHYPER , 1 , &vschyp );
	MMI_SendMessage( hscrollId , MM_GETHYPER , 1 , &hschyp );
	MMI_SendMessage( windowId , MM_GETUSER , 2 , &org , &size );

	/* 小さい絵のときはウインドウのサイズを縮める */
	if( dx < org.rdwx )
	{
		org.rdwx = dx ;
		winhyp.fr.rdwx = org.rdwx
			   + ( SHADE_SIZE + BAR_SIZE ) + winhyp.fr.lupx + org.lupx - 1 ;
	}
	if( dy < org.rdwy )
	{
		org.rdwy = dy ;
		winhyp.fr.rdwy = org.rdwy
			   + ( SHADE_SIZE + BAR_SIZE ) + winhyp.fr.lupy + org.lupy - 1 ;
	}
	size.rdwx = dx + ( SHADE_SIZE + BAR_SIZE ) + org.lupx ;
	size.rdwy = dy + ( SHADE_SIZE + BAR_SIZE ) + org.lupy ;

	/*		スクロールバーのリサイズ処理							*/
	vschyp.fr.lupx = winhyp.fr.lupx + org.lupx + org.rdwx ;
	vschyp.fr.rdwy = winhyp.fr.lupy + org.lupy + org.rdwy ;
	vschyp.fr.rdwx = vschyp.fr.lupx + BAR_SIZE ;

	hschyp.fr.lupy = winhyp.fr.lupy + org.lupy + org.rdwy ;
	hschyp.fr.rdwx = winhyp.fr.lupx + org.lupx + org.rdwx ;
	hschyp.fr.rdwy = hschyp.fr.lupy + BAR_SIZE ;

	/* ウインドウの大きさの設定 */
	MMI_SendMessage( window[no].windowId , MM_SETHYPER , 1 , &winhyp ) ;
	MMI_SendMessage( window[no].vscrollId , MM_SETHYPER , 1 , &vschyp ) ;
	MMI_SendMessage( window[no].hscrollId , MM_SETHYPER , 1 , &hschyp ) ;
	MMI_SendMessage( window[no].windowId , MM_SETUSER , 2 , &org , &size ) ;

	/*	それぞれの部品をくっつける		*/
	MMI_SendMessage( vsid , MM_ATTACH , 1 , wid );
	MMI_SendMessage( hsid , MM_ATTACH , 1 , wid );
	MMI_SendMessage( wid , MM_ATTACH , 1 , baseDialogId ) ;

	/*	ウィンドウのタイトルを設定する			*/
	_rstrncpy( window[no].name , title , 20 ) ;
	window[no].name[19] = 0 ;
	MMI_SendMessage( wid , MM_SETMSG , 1 , window[no].name ) ;

	/*	スクロールバーの値を設定する			*/
	MMI_SendMessage( hsid , MM_SETSCROLL , 5 , 
						org.rdwx - 1, org.rdwx - 1, dx - 1,
							org.rdwx, 1 ) ;
	MMI_SendMessage( vsid , MM_SETSCROLL , 5 , 
						org.rdwy - 1, org.rdwy - 1, dy - 1,
							org.rdwy, 1 ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	/*	ウィンドウをアクティブにして表示する		*/
	MMI_SendMessage( window[no].windowId , MM_WAKE , 0 ) ;
	MMI_SendMessage( window[no].windowId , MM_SHOW , 0 ) ;

	/*	ウィンドウの表示枚数を1枚増やす		*/
	windowflg++ ;

	return NOERR ;
}

/* カーソルが表示領域に来るようにスクロールさせる */
setDisplayArea( int x, int y )
{
	if( outMode == 0 )return NOERR ;

	if( (x - outLupx) > (boundWidth/2-1) )
	{
		outLupx = x - (boundWidth/2-1) ;
	}
	if( outLupx > x )
	{
		outLupx = x ;
	}
	if( (y - outLupy) > 239 )
	{
		outLupy = y - 239 ;
	}
	if( outLupy > y )
	{
		outLupy = y ;
	}

	if( outLupx < 0 )outLupx = 0 ;
	if( outLupy < 0 )outLupy = 0 ;
	if( outLupx > (boundWidth/2) )outLupx = (boundWidth/2) ;
	if( outLupy > 240 )outLupy = 240 ;
	EGB_displayStart( guiEgbPtr, 1, outLupx, outLupy ) ;

	return NOERR ;
}

/* ウィンドウ番号noを基準としたポリゴンor四角形指定 */

static polygonLupx, polygonLupy ;

/* ポリゴン指定を実行しポリゴンの形をXORで描いて残しておく */
polygon1( int no, FRAME *fr )
{
	FRAME org, size ;
	HYPER winhyp ;
	char para[64] ;
	int ret ;
	int lux, luy, rdx, rdy ;

	if( window[no].windowId < 0 )return -1 ;
	MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
	MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;

	polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
	polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;

	WORD( para + 0 ) = 0 ;
	WORD( para + 2 ) = 0 ;
//	WORD( para + 4 ) = 511 ;
	WORD( para + 4 ) = 639 ;
	WORD( para + 6 ) = 479 ;
	EGB_viewport( guiEgbPtr, para ) ;


//	polygon_rectangle_init( guiEgbPtr, polygonBuffer,
//								512, 480, 0x7fff, setDisplayArea ) ;
	polygon_rectangle_init( guiEgbPtr, polygonBuffer,
								640, 480, 0x7fff, setDisplayArea ) ;
	/* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */

	MG_mosDisp( 0 );
	ret = polygon_1st( &lux, &luy, &rdx, &rdy ) ;
	MG_mosDisp( 1 );

	fr->lupx = lux - polygonLupx ;
	fr->lupy = luy - polygonLupy ;
	fr->rdwx = rdx - polygonLupx ;
	fr->rdwy = rdy - polygonLupy ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return ret ;
}

/* ポリゴンの形をXORで描く */
polygon2()
{
	MG_mosDisp( 0 );
	polygon_2nd() ;
	MG_mosDisp( 1 );

	return NOERR ;
}

/* 四角形指定を実行し四角形の形をXORで描いて残しておく */
rectangle1( int no, FRAME *fr )
{
	FRAME org, size ;
	HYPER winhyp ;
	char para[64] ;
	int ret ;
	int lux, luy, rdx, rdy ;

	if( window[no].windowId < 0 )return -1 ;
	MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
	MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;

	polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
	polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;

	WORD( para + 0 ) = 0 ;
	WORD( para + 2 ) = 0 ;
//	WORD( para + 4 ) = 511 ;
	WORD( para + 4 ) = 639 ;
	WORD( para + 6 ) = 479 ;
	EGB_viewport( guiEgbPtr, para ) ;

//	polygon_rectangle_init( guiEgbPtr, polygonBuffer,
//								512, 480, 0x7fff, setDisplayArea ) ;
	polygon_rectangle_init( guiEgbPtr, polygonBuffer,
								640, 480, 0x7fff, setDisplayArea ) ;
	/* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */

	MG_mosDisp( 0 );
	ret = rectangle_1st( &lux, &luy, &rdx, &rdy ) ;
	MG_mosDisp( 1 );

	fr->lupx = lux - polygonLupx ;
	fr->lupy = luy - polygonLupy ;
	fr->rdwx = rdx - polygonLupx ;
	fr->rdwy = rdy - polygonLupy ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return ret ;
}

/* ポリゴンの形をXORで描く */
rectangle2()
{
	MG_mosDisp( 0 );
	rectangle_2nd() ;
	MG_mosDisp( 1 );

	return NOERR ;
}

/* ポリゴンor四角形の領域判定値を取得(領域内なら1 外なら0) */
static getArea( x, y )
{
	return polygon_rectangle_read( x + polygonLupx, y + polygonLupy ) ;
}

/* 大きさ固定の長方形指定を実行し左上の座標を得る */
fixRectangle( int no, FRAME *fr )
{
	FRAME org, size ;
	HYPER winhyp ;
	char para[64] ;
	int ret ;
	int lux, luy ;

	if( window[no].windowId < 0 )return -1 ;
	MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
	MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;

	polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
	polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;

	WORD( para + 0 ) = 0 ;
	WORD( para + 2 ) = 0 ;
//	WORD( para + 4 ) = 511 ;
	WORD( para + 4 ) = 639 ;
	WORD( para + 6 ) = 479 ;
	EGB_viewport( guiEgbPtr, para ) ;

//	polygon_rectangle_init( guiEgbPtr, polygonBuffer,
//								512, 480, 0x7fff, setDisplayArea ) ;
	polygon_rectangle_init( guiEgbPtr, polygonBuffer,
								640, 480, 0x7fff, setDisplayArea ) ;
	/* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */

	MG_mosDisp( 0 );
	ret = fixRectangle_1st( fixRectangleLx, fixRectangleLy, &lux, &luy ) ;
	MG_mosDisp( 1 );

	lux = lux - polygonLupx ;
	luy = luy - polygonLupy ;

	if( lux+fixRectangleLx-1 < 0 )ret = -1 ;	/* 完全にはみだし */
	if( luy+fixRectangleLy-1 < 0 )ret = -1 ;
	if( lux > window[no].dx-1 )ret = -1 ;
	if( luy > window[no].dy-1 )ret = -1 ;

	fr->lupx = lux ;
	fr->lupy = luy ;
	fr->rdwx = lux ;
	fr->rdwy = luy ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return ret ;
}

/* 残りメモリをチェック */
static int checkMemory()
{
/*
	int ph, lg ;

	ph = TL_checkMemory( 0 ) ;
	lg = TL_checkMemory( 2 ) ;

	return (( ph < lg ) ? ph : lg )*4096 ;
*/
	return TL_checkMemory( 1 )*4096 ;
}

/* 転送 buf1 → buf2 n Byte */
static int trans( char *buf1, char *buf2, int n )
{
	int i, j, n1, n2 ;

	n1 = ( n / 4 ) << 2 ;
	n2 = n % 4 ;
	for( i=0 ; i<n1 ; i += 4 )
		DWORD( buf2 + i ) = DWORD( buf1 + i ) ;
	if( n2 )
		for( j=0 ; j<n2 ; j++ )
			BYTE( buf2 + i + j ) = BYTE( buf1 + i + j ) ;
	return NOERR ;
}

/* 交換 buf1 ←→ buf2 n Byte */
static int transExg( char *buf1, char *buf2, int n )
{
	int i, j, n1, n2, temp ;

	n1 = ( n / 4 ) << 2 ;
	n2 = n % 4 ;
	for( i=0 ; i<n1 ; i += 4 )
	{
		temp = DWORD( buf1 + i ) ;
		DWORD( buf1 + i ) = DWORD( buf2 + i ) ;
		DWORD( buf2 + i ) = temp ;
	}
	if( n2 )
		for( j=0 ; j<n2 ; j++ )
		{
			temp = BYTE( buf1 + i + j ) ;
			BYTE( buf1 + i + j ) = BYTE( buf2 + i + j ) ;
			BYTE( buf2 + i + j ) = temp ;
		}
	return NOERR ;
}

/* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
file_kakuchousi_set( fullname, name, kakuchou )
char fullname[], name[], kakuchou[];
{
	int i;

	for( i=0 ; i<76 ; i++ ){
		fullname[i] = name[i];
		if( name[i] == '.' || name[i] == (char)0 )goto mov01;
	}
	return ILLEGAL_FILENAME;		/* bad file name */
mov01:	if( i == 0 )return ILLEGAL_FILENAME;
	if( name[i-1] == '\\' )return ILLEGAL_FILENAME;
	DWORD( fullname + i ) = DWORD( kakuchou );
	fullname[i+4] = (char)0;
	return NOERR;
}

/*	ファイル選択	*/
int	fileSelecter( path, ExtStr, title, exec, cncl )
char	*path ;
char	**ExtStr ;
char	*title ;
char	*exec ;
char	*cncl ;
{
	char pathName[100], name[20] ;
	int				 i, j, n ;
	unsigned int	MSlctCnt ;
	int		  Atr, ret, ret2 ;
	FRAME			     Frm ;
	int 			alertobj ;

	ret2 = NOERR ;

	FDG_GetFrame( &Frm ) ;	/* センタリング */
	Frm.lupx = 256 - ( Frm.rdwx - Frm.lupx ) / 2 ;
	Frm.lupy = 240 - ( Frm.rdwy - Frm.lupy ) / 2 ;
	FDG_SetFrame( Frm ) ;
	/* センタリングの後fileSubDialogIdをデタッチすると,位置がずれない */
	MMI_SendMessage( fileSubDialogId, MM_DETACH, 0 ) ;

	n = 0 ;
	for( i=0 ; i<79 ; i++ )
	{
		pathName[i] = path[i] ;
		if( path[i] == '\\' )
			n++ ;
		if( path[i] == '\0' )
			break ;
	}
	if( n <= 1 )
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				i++ ;
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+j] ;
		}
	}
	else
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+1+j] ;
		}
	}

	ret = FDG_SetFileText( name ) ;
	ret = FDG_SetTitle( title, exec, cncl ) ;

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( FDG_GetMainID() ) ;
	ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY,
		 pathName, ExtStr,	&MSlctCnt) ;	/* LOAD時にはテキストをださない */
	if( ret < 0 )	/* PATHが間違ってる場合はカレントディレクトリで */
	{
		name[0] = '\0' ;
		ret = FDG_SetFileText( name ) ;
		ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY,
			 NULL, ExtStr,	&MSlctCnt) ;
	}
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( (ret == 1) && (MSlctCnt > 0) )	/*	正しくファイル名を収得したか？	*/
	{
		FDG_GetPathName( path, &Atr, 0 ) ;
	}
	else
	{
		ret2 = 1 ;
	}
	return ret2 ;
}

/*	ファイル選択オプション付き	*/
int	fileSelecter2( path, ExtStr, title, exec, cncl )
char	*path ;
char	**ExtStr ;
char	*title ;
char	*exec ;
char	*cncl ;
{
	char pathName[100], name[20] ;
	int				 i, j, n ;
	unsigned int	MSlctCnt ;
	int		  Atr, ret, ret2 ;
	FRAME 				 Frm ;
	int 			  baseId ;
	int 			alertobj ;

	ret2 = NOERR ;

	FDG_GetFrame( &Frm ) ;	/* センタリング */
	Frm.lupx = 256 - ( Frm.rdwx - Frm.lupx ) / 2 ;
	Frm.lupy = 240 - ( Frm.rdwy - Frm.lupy ) / 2 ;
	FDG_SetFrame( Frm ) ;
	/* センタリングの後fileSubDialogIdをアタッチすると,位置がずれない */
	baseId = FDG_GetMainID() ;
	MMI_SendMessage( fileSubDialogId, MM_ATTACH, 1, baseId ) ;
	MTL_setFlagObj( fileBtnId[saveMode], (MS_UNSELECT | MS_TOGGLE) ) ;
	if( saveCompMode )
		MTL_setFlagObj( fileBtnId[2], MS_TOGGLE ) ;
	else
		MTL_resetFlagObj( fileBtnId[2], (~MS_TOGGLE) ) ;

	n = 0 ;
	for( i=0 ; i<79 ; i++ )
	{
		pathName[i] = path[i] ;
		if( path[i] == '\\' )
			n++ ;
		if( path[i] == '\0' )
			break ;
	}
	if( n <= 1 )
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				i++ ;
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+j] ;
		}
	}
	else
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+1+j] ;
		}
	}

	ret = FDG_SetFileText( name ) ;
	ret = FDG_SetTitle( title, exec, cncl ) ;

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( FDG_GetMainID() ) ;
	ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
		 pathName, ExtStr,	&MSlctCnt) ;
	if( ret < 0 )	/* PATHが間違ってる場合はカレントディレクトリで */
	{
		name[0] = '\0' ;
		ret = FDG_SetFileText( name ) ;
		ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
			 NULL, ExtStr,	&MSlctCnt) ;
	}
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( (ret == 1) && (MSlctCnt > 0) )	/*	正しくファイル名を収得したか？	*/
	{
		FDG_GetPathName( path, &Atr, 0 ) ;
	}
	else
	{
		ret2 = 1 ;
	}
	return ret2 ;
}

/* 色数モードの設定 */
/*	initDataIGRFILE:fileBtnId[0]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIGRFILE:fileBtnId[1]:MJ_TICONL40の呼び出し関数	*/
int	fileModeSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	for( i=0 ; i<2 ; i++ )
	{
		if( kobj == fileBtnId[i] )
			break ;
	}
	if( i < 2 )
	{
		MTL_setFlagObj( fileBtnId[i], MS_UNSELECT ) ;
		MTL_resetFlagObj( fileBtnId[saveMode],
							(~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( fileBtnId[saveMode], MM_SHOW, 0 ) ;
		saveMode = i ;
	}
	return NOERR ;
}

/* 圧縮モードの設定 */
/*	initDataIGRFILE:fileBtnId[2]:MJ_TICONL40の呼び出し関数	*/
int	fileCompModeSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( MTL_checkFlagObj( kobj, MS_TOGGLE ) )
		saveCompMode = 1 ;
	else
		saveCompMode = 0 ;
	return NOERR ;
}

/*	パレット設定 (これは16色モード専用のもので32k色では使わない)	*/
int	setTmenuPalette()
{
	char	para[16*8+4] ;
	int		ptr ;

	ptr = 4 ;

	void 	set1Pal( int col, int b, int r, int g )
	{
		DWORD(para + ptr) = col ;
		BYTE(para + ptr + 4) = b * 16 ;
		BYTE(para + ptr + 5) = r * 16 ;
		BYTE(para + ptr + 6) = g * 16 ;
		BYTE(para + ptr + 7) = 0 ;
		ptr += 8 ;
	}

	DWORD(para + 0) = 16 ;
	set1Pal( 0, 0, 0, 0 ) ;
	set1Pal( 1, 4, 4, 8 ) ;
	set1Pal( 2, 4, 12, 6 ) ;
	set1Pal( 3, 5, 5, 5 ) ;		// 		set1Pal( 3, 10, 15, 12 ) ;
	set1Pal( 4, 9, 9, 9 ) ;
	set1Pal( 5, 7, 0, 12 ) ;
	set1Pal( 6, 12, 12, 12 ) ;
	set1Pal( 7, 7, 7, 7 ) ;
	set1Pal( 8, 2, 2, 2 ) ;
	set1Pal( 9, 8, 10, 12 ) ;	/* file selector */
	set1Pal( 10, 0, 13, 0 ) ;
	set1Pal( 11, 10, 0, 0 ) ;
	set1Pal( 12, 0, 0, 15 ) ;
	set1Pal( 13, 15, 0, 15 ) ;
	set1Pal( 14, 0, 15, 13 ) ;
	set1Pal( 15, 15, 15, 15 ) ;

	EGB_setTmenuPalette( para ) ;

	return NOERR ;
}

/* スリープ時の設定 */
int sleepSet()
{
	/*	拡大表示中は元にもどす	*/
	if( outMode )
		displayOutFunc( outIconId ) ;

	hookEnd() ;
	return NOERR ;
}

/* 起こされた時の設定 */
int wakeSet()
{
	hookStart() ;
	return NOERR ;
}

/*	終了処理	*/
int	quitFunc()
{
	hookEnd() ;
	g_fft2_clr() ;	/* fft ルーチン終了 */
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	終了可能なら終了する処理	*/
int	quitFunc2()
{
	if( MTL_checkAtrObj( baseDialogId, MS_DSPONLYL40 ) == 0 )
	{
		hookEnd() ;
		g_fft2_clr() ;	/* fft ルーチン終了 */
		MMI_SetHaltFlag( TRUE ) ;
		return NOERR ;
	}
	return ILLEGAL_FUNCTION ;
}

/*	あばうと表示	*/
int	aboutFunc()
{
	MMI_SendMessage( aboutNumId, MM_SETNUMBOX, 5,
			 checkMemory(), 0, 0x7fffffff, 1, 0 ) ;

	MMI_SendMessage( alertId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	MMI_SendMessage( alertId, MM_SHOW, 0 ) ;
	return NOERR ;
}

/*	あばうと表示確認	*/
int	aboutOKFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SendMessage( alertId, MM_ERASE, 0 ) ;
	MMI_SendMessage( alertId, MM_DETACH, 0 ) ;
	return NOERR ;
}

/* error 表示ルーチン */
int errorCheck(number)
int number;
{
/*
#define	OUT_OF_MEMORY		7
#define	ILLEGAL_FILENAME	55
#define	ILLEGAL_DATA		58
#define	CANT_LOAD			1
#define	READ_FAIL			1
#define	CANT_SAVE			2
#define	WRITE_FAIL			2
#define	OUT_OF_WINDOW		1001
#define	NO_WINDOW			1002
*/

	MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "エラーが発生しました｡" ) ;
	if( number == OUT_OF_MEMORY )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "メモリが足りません。" ) ;
	if( number == ILLEGAL_FILENAME )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "ファイル名が正しくありません｡" ) ;
	if( number == ILLEGAL_DATA )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "未知のデータ形式です｡" ) ;
	if( number == READ_FAIL )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "ロードできませんでした｡" ) ;
	if( number == WRITE_FAIL )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "セーブできませんでした｡" ) ;
	if( number == OUT_OF_WINDOW )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "これ以上ウィンドウは開けません｡" ) ;
	if( number == NO_WINDOW )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "ウィンドウが開かれてません｡" ) ;

	int wakeObj ;

	wakeObj = MMI_GetWakeObj() ;
	MMI_SetWakeObj( UNUSED ) ;

	MMI_SendMessage( errorId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	MMI_SendMessage( errorId, MM_SHOW, 0 ) ;

	MMI_ExecSystem() ;

	MMI_SendMessage( errorId, MM_ERASE, 0 ) ;
	MMI_SendMessage( errorId, MM_DETACH, 0 ) ;

	MMI_SetWakeObj( wakeObj ) ;

	return NOERR;
}

/*	エラー表示確認	*/
int	errorOKFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/* 準備 */
int startSet()
{
	int i ;

	hookStart() ;

	for( i=0 ; i<EFFECTCOUNT ; i++ )
	{
		if( effectSet[i].title[0] )
			MMI_SendMessage( effectMItemId[i], MM_SETMSG,
										1, effectSet[i].title ) ;
		else
			MMI_SendMessage( effectMItemId[i], MM_DETACH, 0 ) ;

	}
	return NOERR ;
}

