home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
tetujin
/
src.lzh
/
TETUSUB.C
< prev
Wrap
C/C++ Source or Header
|
1995-02-23
|
71KB
|
2,858 lines
#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,
"モード",
"3×3ドット",
"変則5ドット",
"",
"",
"",
"",
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,
"モード",
"3×3ドット",
"変則5ドット",
"",
"",
"",
"",
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
},
{ "FFTフィルタ",
2,
"1辺の長さ(2のn乗)", 7, 1, 8,
"増幅率(%)", 200, 0, 999,
"", 0, 0, 100,
"", 0, 0, 100,
6,
"モード",
"FFT",
"スペクトル消しゴム",
"スペクトル増幅",
"スペクトルキャンセル",
"スペクトル定着",
"逆FFT",
(__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( ¶, mode, line ) ;
g_c_m_Filter( ¶, 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( ¶, d[4] ) ;
k = (100 - d[1]) / 5 ;
if( d[1] == 0 )
k = 256 ;
g_s_c_Filter( ¶, 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( ¶, d[4] ) ;
k = (100 - d[1]) / 5 ;
if( d[1] == 0 )
k = 256 ;
g_s_c_yFilter( ¶, 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( ¶, 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, ¶, 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, ¶, 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: // FFT
ret = g_fft2( ¶, d[0] ) ;
break ;
case 1: // スペクトル消しゴム
ret = g_fft2_mul( ¶, 0 ) ;
break ;
case 2: // スペクトル増幅
ret = g_fft2_mul( ¶, d[1]*256/100 ) ;
break ;
case 3: // スペクトルキャンセル
ret = g_fft2_can( ¶ ) ;
break ;
case 4: // スペクトル定着
ret = g_fft2_fix( ¶ ) ;
break ;
case 5: // 逆FFT
ret = g_fft2_inv( ¶ ) ;
break ;
case 6: // おまけ スペクトル再表示
ret = g_fft2_dsp( ¶ ) ;
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( ¶, d[1]*228/100 ) ;
k = (100 - d[2]) / 5 ;
if( d[2] == 0 )
k = 256 ;
g_s_c_Filter( ¶, 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( ¶, d[1]*228/100 ) ;
k = (100 - d[2]) / 5 ;
if( d[2] == 0 )
k = 256 ;
g_s_c_yFilter( ¶, 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( ¶, -d[1]*256*2/100 ) ;
g_c_m_Filter( ¶, 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( ¶, -d[1]*256*2/100 ) ;
g_c_m_yFilter( ¶, 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, "TIFF読込", "読 込", "取 消");
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, "TIFF保存", "保 存", "取 消");
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 ;
}