home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
GUISUB.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-19
|
32KB
|
1,124 lines
/*====================================================
ARTemis
(version 1.3)
FM-TOWNS 用ペイントツール
by 松内 良介 1994
====================================================*/
/*
guisub.c
拡張ライブラリII をもっとラクに使うための補助関数群
兄弟ウィンドウ関係の取得/設定
ウィンドウのユーザー枠の座標を得る
描画原点を(0,0)に設定/復帰
クリップ/ビジブル領域を画面全体に設定/復帰
12ドット文字表示
int RM_init(void)
void RM_end(void)
void RM_getHyper(int objId, HYPER *hyp)
void RM_getFrame(int idObj, FRAME *fr)
void RM_setHyper(int objId, HYPER *hyp)
void RM_setFrame(int objId, FRAME *fr);
void RM_offsetFrame(int id, int dx,int dy);
void RM_setChColor(int objId, int col)
void RM_moveCenter(int objId)
void RM_getMoveFrame(FRAME *fr)
void RM_getWinUserFrame(int id, FRAME *user)
void RM_raise(int kobj)
int RM_isTopInBros(int kobj)
void RM_setOriginZero(void)
void RM_recoverOrigin(void)
void RM_setClipVisibleAllScr(void)
void RM_setClipAnyFrame(int id, FRAME *fr)
void RM_recoverClipVisible(void)
void RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
void RM_adjustWinUser(int idWin, FRAME *parm)
int RM_callSimpleFDG(int baseId, int noselId,
char *title,char *ok,char *cancel,
char *wildext, int flag, char *pathbuf)
void RM_execDialog(int idDlg, int idAlertAttachHyp, int idSelectiveHyp)
void RM_putstring12(char *egbwork, int x,int y, char *str,
int col, int bold)
void RM_setScrollRange(int idSBar, int nDisp, int nAll, int bRedraw)
void RM_setScrollPos(int idSBar, int nPos, int bRedraw)
int RM_getScrollPos(int idSBar)
void RM_setClipWinUser(int idWin, WINCLIP **clipstack)
void RM_resetClipWinUser(WINCLIP *clipstack)
void RM_roundFramePosition(int idWin, int nx, int ny)
void RM_initRadioButton(int *idBtnAry, int btnNum, int *sel)
void RM_pushRadioButton(int idBtn,int idBase,
int *idBtnAry, int btnNum, int *sel)
void RM_setMosCsr(int colorMode, int csrType)
void RM_setFileDlgStyle(int style)
void RM_setNumBoxValue(int id, int n, int bRedraw);
int RM_getNumBoxValue(int id);
void RM_getScreenSize(int *wid, int *ht);
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <ctype.h>
#include <fnt.h>
#include <egb.h>
#include <wgb.h>
#include <msdos.cf>
#include "guisub.h"
#include "egbmac.h"
#include "wgbmac.h"
#define _iskanji(c) (((c)&0xff) >= 0x81 && ((c)&0xff)<=0x9f || \
((c)&0xff) >= 0xe0 && ((c)&0xff)<=0xfc)
#define _iskanji1(kcode) ((((kcode)>>8)&0xff) <= 0x97)
#define WHITE 15
#define BLACK 8
#define WINBACK 6
#define RED 10
#define GRAY 7
/*--------------------------------------------------------*/
/* このモジュールの初期化 */
/*--------------------------------------------------------*/
static int font12seg; // 12dot font が存在するセグメント
int RM_init(void)
{
extern int mma_allocSeg(char* segname);
font12seg = mma_allocSeg("FONT");
return 0;
}
void RM_end(void)
{
}
/*--------------------------------------------------------*/
/* ハイパー/枠の設定・取得 */
/*--------------------------------------------------------*/
void RM_getHyper(int objId, HYPER *hyp)
{
MMI_SendMessage(objId, MM_GETHYPER, 1, hyp);
}
void RM_getFrame(int idObj, FRAME *fr)
{
HYPER hyp;
MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
*fr = hyp.fr;
}
void RM_setHyper(int objId, HYPER *hyp)
{
MMI_SendMessage(objId, MM_SETHYPER, 1, hyp);
}
void RM_setFrame(int id, FRAME *fr)
{
HYPER hyp;
MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
hyp.fr = *fr;
MMI_SendMessage(id, MM_SETHYPER, 1, &hyp);
}
void RM_offsetFrame(int id,int dx,int dy)
{
HYPER hyp;
MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
hyp.fr.lupx += dx;
hyp.fr.lupy += dy;
hyp.fr.rdwx += dx;
hyp.fr.rdwy += dy;
MMI_SendMessage(id, MM_SETHYPER, 1, &hyp);
}
void RM_setChColor(int idObj, int col)
{
HYPER hyp;
MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
hyp.clr.ch = col;
MMI_SendMessage(idObj, MM_SETHYPER, 1, &hyp);
}
void RM_moveCenter(int objId)
{
HYPER h;
FRAME fr,frScr;
WINCTRL *pCtrl;
int wid,ht;
MMI_GetControl(&pCtrl);
frScr = pCtrl->bound;
MMI_SendMessage(objId, MM_GETHYPER, 1, &h);
wid = h.fr.rdwx - h.fr.lupx + 1;
ht = h.fr.rdwy - h.fr.lupy + 1;
fr.lupx = ((frScr.rdwx - frScr.lupx+1) - wid) / 2;
fr.lupy = ((frScr.rdwy - frScr.lupy+1) - ht ) / 2;
fr.rdwx = fr.lupx + wid - 1;
fr.rdwy = fr.lupy + ht - 1;
MMI_SendMessage(objId, MM_MOVE, 1, &fr);
}
void RM_getMoveFrame(FRAME *fr)
{
WINCTRL *ctrl;
MMI_GetControl(&ctrl);
if (fr != NULL)
*fr = ctrl->move;
}
/*--------------------------------------------------------*/
/* 兄弟ウィンドウ関係の取得/設定 */
/*--------------------------------------------------------*/
void RM_raise(int kobj)
/* 兄弟ウィンドウ内で一番上にもってくる */
{
int base;
base = TL_getObjectPtr(kobj)->base;
if (base < 0)
return;
MMI_SendMessage(kobj, MM_DETACH, 0);
MMI_SendMessage(kobj, MM_ATTACH, 2, base, -1) ;
}
int RM_isTopInBros(int kobj)
/* 兄弟ウィンドウ内で一番上かどうかを調べる */
{
OBJECT *pobj,*pbase;
pobj = TL_getObjectPtr(kobj);
pbase = TL_getObjectPtr(pobj->base);
if (pbase->slave == pobj->llevel)
return 1;
else
return 0;
}
/*--------------------------------------------------------*/
/* ウィンドウのユーザー枠の座標を得る */
/*--------------------------------------------------------*/
void RM_getWinUserFrame(int id, FRAME *user)
{
HYPER hyp;
FRAME frUser,frResize;
MMI_SendMessage(id, MM_GETUSER, 2, &frUser, &frResize);
MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
frUser.lupx += hyp.fr.lupx;
frUser.lupy += hyp.fr.lupy;
frUser.rdwx = frUser.lupx + frUser.rdwx - 1;
frUser.rdwy = frUser.lupy + frUser.rdwy - 1;
if (user != NULL)
*user = frUser;
}
/*--------------------------------------------------------*/
/* 描画原点を(0,0)に設定/復帰 */
/*--------------------------------------------------------*/
typedef struct stag_orig {
struct stag_orig *next;
POINT ptOrigStack;
} ORIGSTACK;
static ORIGSTACK *ostack = NULL;
void RM_setOriginZero(void)
{
static POINT ptNewOrig = {0,0};
ORIGSTACK *pos;
pos = TL_calloc(1, sizeof(ORIGSTACK));
pos->next = ostack;
ostack = pos;
MG_PushOrigin(&ptNewOrig, &pos->ptOrigStack);
}
void RM_recoverOrigin(void)
{
ORIGSTACK *pos;
pos = ostack;
ostack = ostack->next;
MG_PopOrigin(&pos->ptOrigStack);
TL_free(pos);
}
/*--------------------------------------------------------*/
/* クリップ/ビジブル領域を画面全体に設定/復帰 */
/*--------------------------------------------------------*/
typedef struct _tag_cvstack {
struct _tag_cvstack *next;
WINCLIP *pwcClipStack;
WINCLIP *pwcVisibleStack;
int type;
} CVSTACK;
#define STACK_PUSHCLIP 0
#define STACK_BEGINUPDATE 1
static CVSTACK *cvstack = NULL;
void RM_setClipVisibleAllScr(void)
{
CVSTACK *pcv;
FRAME frAllScr;
WINCLIP *pWinClip;
WINCTRL *pWinCtrl;
/* 画面全体を表す WINCLIP リストを作成 */
MMI_GetControl(&pWinCtrl);
frAllScr = pWinCtrl->bound;
pWinClip = WIN_getClipMemory(&frAllScr, NULL);
/* CVSTACKを作成、リストに追加 */
pcv = TL_calloc(1, sizeof(CVSTACK));
pcv->next = cvstack;
cvstack = pcv;
/* pWinClip をクリップ領域・ビジブル領域として設定 */
WIN_pushVisible(WIN_copyClip(pWinClip), &(pcv->pwcVisibleStack));
WIN_pushClip(pWinClip, &(pcv->pwcClipStack));
pcv->type = STACK_PUSHCLIP;
}
void RM_setClipAnyFrame(int id, FRAME *fr)
{
CVSTACK *pcv;
/* CVSTACKを作成、リストに追加 */
pcv = TL_calloc(1, sizeof(CVSTACK));
pcv->next = cvstack;
cvstack = pcv;
/* クリップ領域を設定 */
pcv->pwcVisibleStack = NULL;
HYPER hyp;
FRAME frBackup;
RM_getHyper(id, &hyp);
frBackup = hyp.fr;
hyp.fr = *fr;
RM_setHyper(id, &hyp);
WIN_beginUpDateObj(id, &(pcv->pwcClipStack));
hyp.fr = frBackup;
RM_setHyper(id, &hyp);
pcv->type = STACK_BEGINUPDATE;
}
void RM_recoverClipVisible(void)
{
CVSTACK *pcv;
pcv = cvstack;
cvstack = cvstack->next;
if (pcv->type == STACK_PUSHCLIP)
{
if (pcv->pwcClipStack != NULL)
WIN_popClip(pcv->pwcClipStack);
if (pcv->pwcVisibleStack != NULL)
WIN_popVisible(pcv->pwcVisibleStack);
}
else if (pcv->type == STACK_BEGINUPDATE)
{
if (pcv->pwcClipStack != NULL)
WIN_endUpDateObj(pcv->pwcClipStack);
if (pcv->pwcVisibleStack != NULL)
WIN_popVisible(pcv->pwcVisibleStack);
}
TL_free(pcv);
}
/*--------------------------------------------------------*/
/* 他の部品をベースに部品の位置・大きさを設定 */
/*--------------------------------------------------------*/
void RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
{
HYPER hyp, hypBase;
MMI_SendMessage(kobj, MM_GETHYPER, 1, &hyp);
MMI_SendMessage(baseobj, MM_GETHYPER, 1, &hypBase);
#define DO(t1, t2, t3) \
if (parm->t1 >= 0) \
hyp.fr.t1 = hypBase.fr.t2 + parm->t1; \
else \
hyp.fr.t1 = hypBase.fr.t3 + 1 + parm->t1;
DO(lupx, lupx, rdwx)
DO(lupy, lupy, rdwy)
DO(rdwx, lupx, rdwx)
DO(rdwy, lupy, rdwy)
#undef DO
MMI_SendMessage(kobj, MM_SETHYPER, 1, &hyp);
}
void RM_adjustWinUser(int idWin, FRAME *parm)
{
HYPER hyp;
FRAME frUser, frResize;
MMI_SendMessage(idWin, MM_GETHYPER, 1, &hyp);
MMI_SendMessage(idWin, MM_GETUSER, 2, &frUser, &frResize);
#define DO(t1, t2, t3) \
if (parm->t1 >= 0) \
frUser.t1 = hyp.fr.t2 + parm->t1; \
else \
frUser.t1 = hyp.fr.t3 + 1 + parm->t1;
DO(lupx, lupx, rdwx)
DO(lupy, lupy, rdwy)
DO(rdwx, lupx, rdwx)
DO(rdwy, lupy, rdwy)
#undef DO
frUser.rdwx = frUser.rdwx - frUser.lupx + 1;
frUser.rdwy = frUser.rdwy - frUser.lupy + 1;
frUser.lupx = frUser.lupx - hyp.fr.lupx;
frUser.lupy = frUser.lupy - hyp.fr.lupy;
MMI_SendMessage(idWin, MM_SETUSER, 1, &frUser, &frResize);
}
/*--------------------------------------------------------*/
/* ファイルダイアログの呼び出し */
/*--------------------------------------------------------*/
int RM_callSimpleFDG(int baseId, int noselId, char *title,
char *ok, char *cancel, char *wildext, int flag,
char *init_pathname,
char *res_pathbuf)
/*
flag: FDG_NONE, FDG_MSLCT, FDG_TEXT, FDG_FILEONLY など
FDG_MSLCT を指定している場合、*(int*)pathbuf にファイルの個数
(返値が0でないときは無効)
*/
{
int atr,ret,i;
// ワイルドカード指定情報の作成
static char *extstr[] = {"*.*",NULL};
if (wildext != NULL)
extstr[0] = wildext;
else
extstr[0] = "*.*";
// ファイルダイアログ以外の部品を選択不可にする
MTL_setFlagObj(noselId, MS_UNSELECT) ;
// タイトル、表示位置を設定
FDG_SetTitle(title, ok, cancel) ;
HYPER h;
FRAME fr;
MMI_SendMessage(FDG_GetMainID(), MM_GETHYPER, 1, &h);
int scrwid,scrht; RM_getScreenSize(&scrwid,&scrht);
fr.lupx = (scrwid - (h.fr.rdwx - h.fr.lupx + 1)) / 2;
fr.lupy = (scrht - (h.fr.rdwy - h.fr.lupy + 1)) / 2;
FDG_SetFrame(fr);
// 最初のファイル名文字列を設定
char init_dir[_MAX_DRIVE+_MAX_DIR];
char init_fname[_MAX_FNAME+_MAX_EXT];
if (init_pathname == NULL)
init_dir[0] = 0, init_fname[0] = 0;
else
{
char drive[_MAX_DRIVE], dir[_MAX_DIR];
char basename[_MAX_FNAME], ext[_MAX_EXT];
_splitpath(init_pathname, drive,dir,basename,ext);
strcpy(init_dir, drive);
strcat(init_dir, dir);
strcpy(init_fname, basename);
strcat(init_fname, ext);
}
if (init_dir[0] != 0)
{
char ch = init_dir[strlen(init_dir)-1];
if (ch == ':')
strcat(init_dir, ".");
else if (ch == '\\')
init_dir[strlen(init_dir)-1] = 0;
}
// 初期テキストフィールドを設定
FDG_SetFileText(" ");
if (init_fname[0] != 0)
FDG_SetFileText(init_fname);
else
FDG_SetFileText("");
// ダイアログ呼び出し
unsigned int select_cnt;
ret = FDG_DspFileDlg(baseId, flag, (init_dir[0]!=0 ? init_dir:NULL),
extstr,&select_cnt);
// 「実行」が押されたならファイル名を取得
if (ret > 0)
{
if (flag & FDG_MSLCT)
*(int*)res_pathbuf = select_cnt;
else
{
char pathname[_MAX_PATH];
FDG_GetPathName(pathname, &atr, 0);
strcpy(res_pathbuf, pathname);
}
}
// ファイルダイアログ以外の部品を選択可能にもどす
MTL_resetFlagObj(noselId, ~MS_UNSELECT) ;
// リターン
if (ret > 0)
return 0;
else
return -1;
}
/*--------------------------------------------------------*/
/* 12ドット文字表示 */
/*--------------------------------------------------------*/
void RM_putstring12(char *egbwork,int x,int y,char *str, int col,int bold)
/* グローバル変数 font12seg の設定が必要 */
{
#define PUTBITBLOCK(x1,y1,x2,y2,dat) { \
char para[16]; \
DWORD(para)=(unsigned int)dat; WORD(para+4)=getds(); \
WORD(para+6)=x1; WORD(para+8)=y1; \
WORD(para+10)=x2; WORD(para+12)=y2; \
WGB_putBlockColor(egbwork, 1, para); }
int ds = getds();
char fontbuf[24];
EGB_color(egbwork, 0, col);
EGB_writeMode(egbwork, 0);
while (*str != 0)
{
if (_iskanji(*str))
/* 全角文字の場合 */
{
int ofs, sjis = (*str)*256 + *(str+1), jis;
jis = FNT_sjisToJis(sjis);
if (_iskanji1(sjis))
{
ofs = ( ((jis>>8)-0x21)*94 + (jis&0xff) - 0x21)*24 + 0xc00;
_movedata(font12seg, ofs, ds, (unsigned int)fontbuf, 24);
}
else // 第1水準じゃない場合
{
char font16buf[32];
FNT_kanjiRead(16,16,jis,ds,font16buf);
memset(fontbuf,0,24);
int di=0;
for (int i=0; i<16; i++)
{
unsigned short p;
p = ((unsigned short)font16buf[i*2]<<8) |
font16buf[i*2+1];
p = (p&0xc000) | ((p&0x3c00)<<1) | ((p&0x3c0)<<2) |
((p&0x3c)<<3) | ((p&0x3)<<4);
fontbuf[di*2] |= (p>>8) & 0xff;
fontbuf[di*2+1] |= p & 0xff;
if (i!=1 && i!=4 && i!=7 && i!=10)
di++;
}
}
PUTBITBLOCK(x,y,x+11,y+11,fontbuf);
str++,str++;
x += 12;
}
else
/* ANK文字の場合 */
{
if (*str != ' ')
{
int ofs = (int)*str * 12;
_movedata(font12seg, ofs, ds, (unsigned int)fontbuf, 12);
PUTBITBLOCK(x,y,x+5,y+11,fontbuf);
}
str++;
x += 6;
}
}
}
/*--------------------------------------------------------*/
/* スクロールバー値の設定/取得 */
/*--------------------------------------------------------*/
void RM_setScrollRange(int idSBar, int nDisp, int nAll, int bRedraw)
{
int ptr,min,max,len,page;
MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
min = nDisp-1;
max = nAll < nDisp ? nDisp-1 : nAll-1;
ptr = _max(min, _min(max, ptr));
MMI_SendMessage(idSBar, MM_SETSCROLL, 5, ptr,min,max, nDisp, page);
if (bRedraw)
MMI_SendMessage(idSBar, MM_SHOW, 0);
}
void RM_setScrollPos(int idSBar, int nPos, int bRedraw)
{
int ptr,min,max,len,page;
MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
ptr = _max(min, _min(max, min + nPos));
MMI_SendMessage(idSBar, MM_SETSCROLL, 5, ptr,min,max, len, page);
if (bRedraw)
MMI_SendMessage(idSBar, MM_SHOW, 0);
}
int RM_getScrollPos(int idSBar)
{
int ptr,min,max,len,page;
MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
return ptr - min;
}
/*--------------------------------------------------------*/
/* 数値入力ボックスの値の設定・取得 */
/*--------------------------------------------------------*/
void RM_setNumBoxValue(int id, int n, int bRedraw)
{
int var,min,max,delta,ptclm;
MMI_SendMessage(id, MM_GETNUMBOX, 5, &var,&min,&max,&delta,&ptclm);
MMI_SendMessage(id, MM_SETNUMBOX, 5, n,min,max,delta,ptclm);
if (bRedraw)
{
WINCLIP* clip;
WIN_beginUpDateObj(id,&clip);
MMI_SendMessage(id,MM_SHOW,0);
WIN_endUpDateObj(clip);
}
}
int RM_getNumBoxValue(int id)
{
int var,min,max,delta,ptclm;
MMI_SendMessage(id, MM_GETNUMBOX, 5, &var,&min,&max,&delta,&ptclm);
return var;
}
/*--------------------------------------------------------*/
/* ウィンドウのユーザー領域にクリップを設定 */
/*--------------------------------------------------------*/
void RM_setClipWinUser(int idWin, WINCLIP **clipstack)
{
HYPER hyp;
FRAME frUser,frBackup;
RM_getHyper(idWin, &hyp);
frBackup = hyp.fr;
RM_getWinUserFrame(idWin, &frUser);
hyp.fr = frUser;
RM_setHyper(idWin, &hyp);
WIN_beginUpDateObj(idWin, clipstack);
hyp.fr = frBackup;
RM_setHyper(idWin, &hyp);
}
void RM_resetClipWinUser(WINCLIP *clipstack)
{
WIN_endUpDateObj(clipstack);
}
/*--------------------------------------------------------*/
/* ウィンドウの座標を n の倍数に補正 */
/*--------------------------------------------------------*/
void RM_roundFramePosition(int idWin, int nx, int ny)
{
HYPER hyp;
MG_mosDisp(2);
RM_getHyper(idWin, &hyp);
int dx,dy;
dx = -(hyp.fr.lupx % nx);
dy = -(hyp.fr.lupy % ny);
if (dx != 0 || dy != 0)
WIN_moveWindow(idWin, dx,dy);
MG_mosDisp(3);
}
/*--------------------------------------------------------*/
/* ラジオボタン処理 */
/*--------------------------------------------------------*/
void RM_initRadioButton(int *idBtnAry, int btnNum, int *sel)
{
int i;
for (i=0; i<btnNum; i++)
MTL_resetFlagObj(idBtnAry[i], ~(MS_UNSELECT|MS_TOGGLE)) ;
// MTL_setFlagObj(idBtnAry[*sel], (MS_UNSELECT|MS_TOGGLE)) ;
MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
}
void RM_pushRadioButton(int idBtn,int idBase,
int *idBtnAry, int btnNum, int *sel)
{
WINCLIP *clip;
int i;
for (i=0 ; i<btnNum; i++)
if (idBtnAry[i] == idBtn)
break;
if (*sel != i)
{
WIN_beginUpDateObj(idBase, &clip);
// MTL_resetFlagObj(idBtnAry[*sel], ~(MS_UNSELECT|MS_TOGGLE)) ;
MTL_resetFlagObj(idBtnAry[*sel], ~MS_TOGGLE) ;
MMI_SendMessage(idBtnAry[*sel], MM_SHOW, 0) ;
*sel = i;
// MTL_setFlagObj(idBtnAry[*sel], (MS_UNSELECT|MS_TOGGLE)) ;
MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
WIN_endUpDateObj(clip);
}
else
{
WIN_beginUpDateObj(idBase, &clip);
MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
MMI_SendMessage(idBtnAry[*sel], MM_SHOW, 0) ;
WIN_endUpDateObj(clip);
}
}
/*--------------------------------------------------------*/
/* マウスカーソル形状の設定 */
/*--------------------------------------------------------*/
void RM_setMosCsr(int colorMode, int csrType)
{
unsigned int *coltbl;
coltbl = MG_getColorTable(colorMode);
if (colorMode == 0)
SetMouse16(csrType, WHITE, BLACK);
else if (colorMode == 1)
SetMouse16(csrType, coltbl[WHITE] & 0xff, coltbl[BLACK] & 0xff);
else if (colorMode == 2)
SetMouse16(csrType, coltbl[WHITE]&0x7fff, coltbl[BLACK]&0x7fff);
}
/*--------------------------------------------------------*/
/* メタID からクラス名を得る */
/*--------------------------------------------------------*/
char *RM_getMetaIdName(int metaId)
{
char *typename;
if (metaId == MJ_DIALOGL40)
typename = "ダイアログ型";
else if (metaId == MJ_HYPER)
typename = "ハイパー型";
else if (metaId == MJ_ALERTL40)
typename = "アラート型";
else if (metaId == MJ_WINDOWL40)
typename = "ウィンドウ型";
else if (metaId == MJ_MSGL40)
typename = "メッセージ型";
else if (metaId == MJ_MENUL40)
typename = "メニュー型";
else if (metaId == MJ_BUTTONL40)
typename = "ボタン型";
else if (metaId == MJ_DBUTTONL40)
typename = "ドローボタン型";
else if (metaId == MJ_ICONL40)
typename = "アイコンボタン型";
else if (metaId == MJ_TICONL40)
typename = "トグルアイコン型";
else if (metaId == MJ_MITEML40)
typename = "メニューアイテム型";
else if (metaId == MJ_SCRLL40)
typename = "スクロールバー型";
else if (metaId == MJ_TEXTL40)
typename = "テキスト型";
else if (metaId == MJ_LMENUL40)
typename = "リストメニュー型";
else if (metaId == MJ_NUMBOXL40)
typename = "数値入力パネル型";
else
typename = "<不明>";
return typename;
}
/*--------------------------------------------------------*/
/* ファイルダイアログの見た目を変更する */
/*--------------------------------------------------------*/
#if 0
static void FDGdump(void)
{
int idWin;
idWin = FDG_GetMainID();
int depth = 0;
void dumpObj(int id)
{
void indent(void)
{
int i;
for (i=0; i<depth; i++)
printf("| ");
}
OBJECT *pObj, *pBase;
if (id <= 0 || (pObj = TL_getObjectPtr(id)) == NULL)
{ printf("*** no there %d ***\n",id); return; }
pBase = (pObj->base > 0 ? TL_getObjectPtr(pObj->base) : NULL);
indent();
printf("┌Obj %4d %-20s\n", id,RM_getMetaIdName(pObj->meta));
HYPER hyp;
hyp = *(HYPER*)pObj->data;
indent();
printf("│ fr(%3d,%3d)-(%3d,%3d) ", hyp.fr.lupx, hyp.fr.lupy,
hyp.fr.rdwx, hyp.fr.rdwy);
printf("col(%d,%d,%d)\n", hyp.clr.fr, hyp.clr.back, hyp.clr.ch);
indent();
printf("└ base,slave,left,right=(%d,%d,%d,%d)\n",
pObj->base,pObj->slave,pObj->llevel,pObj->rlevel);
if (pObj->slave > 0)
{ depth++; dumpObj(pObj->slave); depth--; }
if (pBase != NULL)
if (pObj->llevel > 0 && pObj->llevel != pBase->slave)
dumpObj(pObj->llevel);
}
dumpObj(idWin);
}
#endif
#if 1
void FDGdump(void)
{
int idWin;
idWin = MJ_BASEOBJ;
int depth = 0;
void dumpObj(int id)
{
if (depth >= 2)
return;
void indent(void)
{
int i;
for (i=0; i<depth; i++)
printf("| ");
}
OBJECT *pObj, *pBase;
if (id <= 0 || (pObj = TL_getObjectPtr(id)) == NULL)
{ printf("*** no there %d ***\n",id); return; }
pBase = (pObj->base > 0 ? TL_getObjectPtr(pObj->base) : NULL);
indent();
printf("┌Obj %4d %-20s\n", id,RM_getMetaIdName(pObj->meta));
HYPER hyp;
hyp = *(HYPER*)pObj->data;
indent();
printf("│ fr(%3d,%3d)-(%3d,%3d) ", hyp.fr.lupx, hyp.fr.lupy,
hyp.fr.rdwx, hyp.fr.rdwy);
printf("col(%d,%d,%d)\n", hyp.clr.fr, hyp.clr.back, hyp.clr.ch);
indent();
printf("└ base,slave,left,right=(%d,%d,%d,%d)\n",
pObj->base,pObj->slave,pObj->llevel,pObj->rlevel);
if (pObj->slave > 0)
{ depth++; dumpObj(pObj->slave); depth--; }
if (pBase != NULL)
if (pObj->llevel > 0 && pObj->llevel != pBase->slave)
dumpObj(pObj->llevel);
}
dumpObj(idWin);
}
#endif
void RM_setFileDlgStyle(int style)
{
typedef struct
{
int objId;
COLOR clr; /* 設定したい表示色 */
int atrm; /* 設定したい表示属性 */
FRAME fr; /* フレーム変更(相対値) */
} PARTCHANGE;
static PARTCHANGE change[] =
{
#define FR0 {0,0,0,0}
#define STYLE {BLACK,WINBACK,BLACK}, MS_FRAMEL40|MS_UFRAMEL40
#define STYLE2 {BLACK,BLACK,WHITE}, MS_FRAMEL40|MS_DFRAMEL40
#define STYLE3 {BLACK,WINBACK,WINBACK}, MS_FRAMEL40|MS_UFRAMEL40
#define STYLE4 {BLACK,WINBACK,WINBACK}, MS_FRAMEL40|MS_BFRAMEL40|MS_PANELL40
#define BK BLACK
#define MSGSTYLE2 {BK,WINBACK,BK},MS_OPAQUEL40
{ FDG_MAINDLG, STYLE, FR0 },
{ FDG_TITLE1, STYLE, {1,1,1,0} },
{ FDG_TITLE2, STYLE, {1,1,1,0} },
{ FDG_TITLEMSG, MSGSTYLE2,{1,1,1,1} },
{ FDG_CLSBTN, STYLE3, {0,0,2,2} },
{ FDG_DRVSLCTL, STYLE, FR0 }, // ドライブ選択←
{ FDG_DRVSLCTR, STYLE, FR0 }, // ドライブ選択→
{ FDG_DRVICON, STYLE, FR0 },
{ FDG_ALLDRVBTN,STYLE, FR0 }, // SHOW ALL 背景
{ FDG_ALLDRVDLG,STYLE, FR0 }, // SHOW ALL 背景
{ FDG_VOLLABEL, MSGSTYLE2,FR0 },
{ FDG_FREESIZE, MSGSTYLE2,FR0 },
{ FDG_CURDIR, STYLE2, FR0 },
{ FDG_MOVEDIR, STYLE, FR0 },
{ FDG_UPDIR, STYLE, FR0 },
{ FDG_LMENU, STYLE2, FR0 },
{ FDG_SCRLBAR, STYLE4, FR0 },
{ FDG_FNAMETXT, {RED,BK,WHITE},MS_FRAMEL40|MS_DFRAMEL40, FR0 },
{ FDG_EXECBTN, STYLE, FR0 },
{ FDG_CNCLBTN, STYLE, FR0 },
{ -1 }
};
PARTCHANGE *pc;
for (pc = change; pc->objId >= 0; pc++)
{
HYPER hyp;
FDG_GetObjData(pc->objId, &hyp);
hyp.atrm = pc->atrm;
hyp.clr = pc->clr;
hyp.fr.lupx += pc->fr.lupx;
hyp.fr.lupy += pc->fr.lupy;
hyp.fr.rdwx += pc->fr.rdwx;
hyp.fr.rdwy += pc->fr.rdwy;
FDG_SetObjData(pc->objId, &hyp);
}
}
/*--------------------------------------------------------*/
/* ダイアログ実行 */
/*--------------------------------------------------------*/
void RM_execDialog(int idDlg, int idAlertAttachHyp, int idSelectiveHyp)
{
WINCLIP* clipStack;
RM_setClipVisibleAllScr();
RM_setOriginZero();
RM_moveCenter(idDlg);
MTL_setFlagObj(idSelectiveHyp, MS_UNSELECT) ;
MMI_SendMessage(idDlg, MM_ATTACH, 1, idAlertAttachHyp);
MMI_SendMessage(idDlg, MM_SHOW, 0);
MMI_ExecSystem();
MMI_SendMessage(idDlg, MM_ERASE, 0);
MMI_SendMessage(idDlg, MM_DETACH, 0);
MTL_resetFlagObj(idSelectiveHyp, ~MS_UNSELECT) ;
RM_recoverOrigin();
RM_recoverClipVisible();
}
/*--------------------------------------------------------*/
/* オリジナル・ビジュアルエフェクト関数 */
/*--------------------------------------------------------*/
void MS_ve(int num, int flag, FRAME *fr, char *ptr)
{
if (flag == TRUE)
{
int ve = (num / 100) % 100;
if (num == 9)
/* 斜め線転送! 今は16色モードのみ。*/
{
}
}
else
{
int ve = num % 100;
}
}
int RM_getObjFromPoint(POINT* pt)
{
EVENT ev;
ev.what = EVMOSMOVE;
ev.shift = 0;
ev.info = *(int*)pt;
ev.data = 0;
ev.time = 0;
int id = MMI_SendMessage(MJ_BASEOBJ, MM_ONPARTS,1, &ev);
return id;
}
int RM_getObjWhereIs(int x,int y)
{
POINT pt = {x,y};
return RM_getObjFromPoint(&pt);
}
void RM_getScreenSize(int *wid, int *ht)
{
WINCTRL* ctrl;
MMI_GetControl(&ctrl);
if (wid != NULL)
*wid = ctrl->bound.rdwx+1;
if (ht != NULL)
*ht = ctrl->bound.rdwy+1;
}
/*--------------------------------------------------------*/
/* TIFFファイル関連 */
/*--------------------------------------------------------*/
#include <tifflib.h>
#define DATABUF (32*1024)
#define IMAGEBUF (16*1024)
#define WORKBUF _max(DECOMP_WORK_SIZE,COMP_WORK_SIZE)
static char *tiff_databuf = NULL;
static char *tiff_imagebuf = NULL;
static char *tiff_workbuf = NULL;
static int tiff_wid,tiff_ht;
static FILE *tiff_fp;
static int RM_initTIFFwork(void)
// 返値 0=正常終了 -1=メモリ不足
{
if (tiff_databuf == NULL) { // 作業用メモリ領域の確保
if ((tiff_databuf = TL_calloc(1,DATABUF+IMAGEBUF+WORKBUF)) == NULL)
return -1;
tiff_imagebuf = tiff_databuf + DATABUF;
tiff_workbuf = tiff_imagebuf + IMAGEBUF;
}
return 0;
}
static void RM_freeTIFFwork(void)
{
if (tiff_databuf != NULL)
TL_free(tiff_databuf);
tiff_databuf = NULL;
}
static int _RM_readTiffFile(char *buf, int size)
{
fread(buf,1,size,tiff_fp);
return 0;
}
int RM_loadTIFF(char *fname,
int funcPutImage(char *buf, int ofsy, int ht),
int funcSetPalette(char *buf, int pltnum))
// 返値 NOERR=成功 TIFFERR..=失敗
{
if (RM_initTIFFwork() != 0)
return TIFFERR_NOMEMORY;
tiff_fp = NULL;
int ret = NOERR;
if ((tiff_fp = fopen(fname, "rb")) == NULL)
{ ret = TIFFERR_CANNOTOPEN; goto CLOSE; }
// ヘッダを読み込み、画像に関するパラメータを得る
fread(tiff_databuf, 1, DATABUF, tiff_fp);
if (TIFF_getHead(tiff_databuf, DATABUF) < 0)
{ ret = TIFFERR_INVALIDFORMAT; goto CLOSE; }
int pixelsize; // 画像のピクセルサイズ
int comp; // 圧縮のある・なし
int fill;
long strip;
long clut; // CLUT(パレット情報)のある・なし
pixelsize = TIFF_checkMode(&tiff_wid,&tiff_ht,&comp,&fill,&strip,&clut);
if (pixelsize < 0)
{ ret = TIFFERR_INVALIDFORMAT; goto CLOSE; }
// 入出力関数の設定
TIFF_setLoadFunc(funcPutImage, _RM_readTiffFile);
// CLUTデータがある場合、パレットを設定する
if (clut != 0)
{
char plt[256*8+4];
int pltnum = TIFF_getPal(plt);
if (funcSetPalette != (int(*)())0)
funcSetPalette(plt, pltnum);
}
// 読み込みバッファに格納可能な縦横のドット数を得る
int buf_wid = (pixelsize==4 ? ((tiff_wid+7) & 0xfffffff8) : tiff_wid);
int buf_ht = IMAGEBUF / ((buf_wid * pixelsize + 7) / 8);
// 画像をロードする
TIFF_loadImage(pixelsize, tiff_wid, tiff_ht, strip, fill, comp,
tiff_imagebuf, buf_wid, buf_ht, tiff_workbuf);
CLOSE:
if (tiff_fp != NULL)
fclose(tiff_fp);
RM_freeTIFFwork();
return ret;
}
static int _RM_writeTiffFile(char *buf, long size)
{
if (fwrite(buf,1,size,tiff_fp) < size)
return -1;
return 0;
}
int RM_saveTIFF(char *fname,int pixelsize,int wid,int ht,
BOOL fComp,
int funcGetImage(char *buf,int ofsy,int ht),
int funcGetPalette(char *buf))
// 返値 0=成功 -1=画面モード/ファイル名の間違い
// -2=メモリ不足 -3=ディスク領域不足 -4=get関数エラー
{
if (RM_initTIFFwork() != 0)
return TIFFERR_NOMEMORY;
tiff_fp = NULL;
int ret = NOERR;
// ファイルをオープン
if ((tiff_fp = fopen(fname,"wb")) == NULL)
{ ret = TIFFERR_CANNOTOPEN; goto CLOSE; }
// パレット情報を得る
char paletbuf[256*8+4];
int paletnum = 0;
if (funcGetPalette != (int(*)())0)
paletnum = funcGetPalette(paletbuf);
int headsize = (paletnum == 256 ? 2048 : 512);
// ヘッダのサイズ分だけシーク
if (fwrite(tiff_databuf,1,headsize,tiff_fp) < headsize)
{ ret = TIFFERR_NODISKSPACE; goto CLOSE; }
// データ入出力処理の登録
TIFF_setSaveFunc(_RM_writeTiffFile, funcGetImage);
// 画像をセーブし、圧縮後のデータサイズを得る
int imagebuf_wid = (pixelsize==4? ((wid+7)&0xfffffff8) : wid);
int imagebuf_ht = IMAGEBUF / ((imagebuf_wid*pixelsize+7)/8);
int cmp_size;
cmp_size = TIFF_saveImage(pixelsize, wid, ht, (fComp? 5:1),
tiff_databuf, DATABUF,
tiff_imagebuf,imagebuf_wid,imagebuf_ht,tiff_workbuf);
if (cmp_size == -1)
{ ret = TIFFERR_OTHERS; goto CLOSE; }
else if (cmp_size == -2)
{ ret = TIFFERR_NODISKSPACE; goto CLOSE; }
// ヘッダ情報をつくる
TIFF_setHead(tiff_databuf, pixelsize, wid,ht, (fComp? cmp_size:0),
(paletnum > 0 ? paletbuf : NULL));
// ヘッダを書き出し、クローズ
fflush(tiff_fp);
long nowfp = ftell(tiff_fp);
rewind(tiff_fp);
if (fwrite(tiff_databuf,1,headsize,tiff_fp) < headsize)
{ ret = TIFFERR_NODISKSPACE; goto CLOSE; }
fflush(tiff_fp);
fseek(tiff_fp,nowfp,SEEK_SET);
CLOSE:
if (tiff_fp != NULL)
fclose(tiff_fp);
RM_freeTIFFwork();
return ret;
}
int RM_getTIFFinfo(char *fname, TIFFINFO *info)
// 返値 0=正常終了
// -1=ファイルが存在しない
// -2=TIFF形式ではない
// -3=メモリが足りない
{
if (RM_initTIFFwork() != 0)
return TIFFERR_NOMEMORY;
int ret = NOERR;
if ((tiff_fp = fopen(fname,"rb")) == NULL)
{ ret = TIFFERR_CANNOTOPEN; goto END; }
fread(tiff_databuf,1,DATABUF,tiff_fp);
fclose(tiff_fp);
if (TIFF_getHead(tiff_databuf,DATABUF) < 0)
{ ret = TIFFERR_INVALIDFORMAT; goto END; }
int xlen,ylen,pixelsize,comp,fill; long strip,clut;
if ((pixelsize = TIFF_checkMode(&xlen,&ylen,&comp,&fill,&strip,&clut)) < 0)
{ ret = TIFFERR_INVALIDFORMAT; goto END; }
info->wid = xlen;
info->ht = ylen;
info->compress = (comp == 1 ? FALSE : TRUE);
info->pixelsize = pixelsize;
END:
RM_freeTIFFwork();
return ret;
}