home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / art2 / src.lzh / GUISUB.C < prev    next >
C/C++ Source or Header  |  1995-06-19  |  32KB  |  1,124 lines

  1. /*====================================================
  2.                       ARTemis
  3.                    (version 1.3)
  4.              FM-TOWNS 用ペイントツール
  5.  
  6.                  by 松内 良介 1994
  7. ====================================================*/
  8. /*
  9.     guisub.c
  10.         拡張ライブラリII をもっとラクに使うための補助関数群
  11.  
  12.     兄弟ウィンドウ関係の取得/設定
  13.     ウィンドウのユーザー枠の座標を得る
  14.     描画原点を(0,0)に設定/復帰
  15.     クリップ/ビジブル領域を画面全体に設定/復帰
  16.     12ドット文字表示
  17.  
  18.     int        RM_init(void)
  19.     void    RM_end(void)
  20.  
  21.     void    RM_getHyper(int objId, HYPER *hyp)
  22.     void    RM_getFrame(int idObj, FRAME *fr)
  23.     void    RM_setHyper(int objId, HYPER *hyp)
  24.     void    RM_setFrame(int objId, FRAME *fr);
  25.     void    RM_offsetFrame(int id, int dx,int dy);
  26.     void    RM_setChColor(int objId, int col)
  27.     void    RM_moveCenter(int objId)
  28.     void    RM_getMoveFrame(FRAME *fr)
  29.  
  30.     void    RM_getWinUserFrame(int id, FRAME *user)
  31.  
  32.     void    RM_raise(int kobj)
  33.     int        RM_isTopInBros(int kobj)
  34.  
  35.     void    RM_setOriginZero(void)
  36.     void    RM_recoverOrigin(void)
  37.     void    RM_setClipVisibleAllScr(void)
  38.     void    RM_setClipAnyFrame(int id, FRAME *fr)
  39.     void    RM_recoverClipVisible(void)
  40.  
  41.     void    RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
  42.     void    RM_adjustWinUser(int idWin, FRAME *parm)
  43.  
  44.     int        RM_callSimpleFDG(int baseId, int noselId,
  45.                              char *title,char *ok,char *cancel,
  46.                              char *wildext, int flag, char *pathbuf)
  47.     void RM_execDialog(int idDlg, int idAlertAttachHyp, int idSelectiveHyp)
  48.  
  49.     void    RM_putstring12(char *egbwork, int x,int y, char *str,
  50.                            int col, int bold)
  51.     void    RM_setScrollRange(int idSBar, int nDisp, int nAll, int bRedraw)
  52.     void    RM_setScrollPos(int idSBar, int nPos, int bRedraw)
  53.     int        RM_getScrollPos(int idSBar)
  54.     void    RM_setClipWinUser(int idWin, WINCLIP **clipstack)
  55.     void    RM_resetClipWinUser(WINCLIP *clipstack)
  56.     void    RM_roundFramePosition(int idWin, int nx, int ny)
  57.     void    RM_initRadioButton(int *idBtnAry, int btnNum, int *sel)
  58.     void    RM_pushRadioButton(int idBtn,int idBase,
  59.                                int *idBtnAry, int btnNum, int *sel)
  60.     void    RM_setMosCsr(int colorMode, int csrType)
  61.  
  62.     void    RM_setFileDlgStyle(int style)
  63.  
  64. void RM_setNumBoxValue(int id, int n, int bRedraw);
  65. int RM_getNumBoxValue(int id);
  66.  
  67. void RM_getScreenSize(int *wid, int *ht);
  68.  
  69.  
  70. */
  71.  
  72. #include <stdio.h>
  73. #include <stdlib.h>
  74. #include <string.h>
  75. #include <winb.h>
  76. #include <te.h>
  77. #include <fntb.h>
  78. #include <gui.h>
  79. #include <file_dlg.h>
  80. #include <ctype.h>
  81. #include <fnt.h>
  82.  
  83. #include <egb.h>
  84. #include <wgb.h>
  85. #include <msdos.cf>
  86.  
  87. #include "guisub.h"
  88. #include "egbmac.h"
  89. #include "wgbmac.h"
  90.  
  91. #define    _iskanji(c)    (((c)&0xff) >= 0x81 && ((c)&0xff)<=0x9f || \
  92.                      ((c)&0xff) >= 0xe0 && ((c)&0xff)<=0xfc)
  93. #define    _iskanji1(kcode)    ((((kcode)>>8)&0xff) <= 0x97)
  94.  
  95. #define    WHITE    15
  96. #define    BLACK    8
  97. #define    WINBACK    6
  98. #define    RED        10
  99. #define    GRAY    7
  100.  
  101. /*--------------------------------------------------------*/
  102. /*                 このモジュールの初期化                 */
  103. /*--------------------------------------------------------*/
  104.  
  105.     static    int        font12seg;                // 12dot font が存在するセグメント
  106.  
  107.     int RM_init(void)
  108.     {
  109.         extern int mma_allocSeg(char* segname);
  110.         font12seg = mma_allocSeg("FONT");
  111.         return 0;
  112.     }
  113.     
  114.     void RM_end(void)
  115.     {
  116.     }
  117.  
  118. /*--------------------------------------------------------*/
  119. /*                ハイパー/枠の設定・取得                */
  120. /*--------------------------------------------------------*/
  121.  
  122.     void RM_getHyper(int objId, HYPER *hyp)
  123.     {
  124.         MMI_SendMessage(objId, MM_GETHYPER, 1, hyp);
  125.     }
  126.  
  127.     void RM_getFrame(int idObj, FRAME *fr)
  128.     {
  129.         HYPER hyp;
  130.         MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
  131.         *fr = hyp.fr;
  132.     }
  133.  
  134.     void RM_setHyper(int objId, HYPER *hyp)
  135.     {
  136.         MMI_SendMessage(objId, MM_SETHYPER, 1, hyp);
  137.     }
  138.  
  139.     void RM_setFrame(int id, FRAME *fr)
  140.     {
  141.         HYPER hyp;
  142.         MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
  143.         hyp.fr = *fr;
  144.         MMI_SendMessage(id, MM_SETHYPER, 1, &hyp);
  145.     }
  146.  
  147.     void RM_offsetFrame(int id,int dx,int dy)
  148.     {
  149.         HYPER hyp;
  150.         MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
  151.         hyp.fr.lupx += dx;
  152.         hyp.fr.lupy += dy;
  153.         hyp.fr.rdwx += dx;
  154.         hyp.fr.rdwy += dy;
  155.         MMI_SendMessage(id, MM_SETHYPER, 1, &hyp);
  156.     }
  157.  
  158.     void RM_setChColor(int idObj, int col)
  159.     {
  160.         HYPER hyp;
  161.         MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
  162.         hyp.clr.ch = col;
  163.         MMI_SendMessage(idObj, MM_SETHYPER, 1, &hyp);
  164.     }
  165.  
  166.     void RM_moveCenter(int objId)
  167.     {
  168.         HYPER h;
  169.         FRAME fr,frScr;
  170.         WINCTRL *pCtrl;
  171.         int wid,ht;
  172.         MMI_GetControl(&pCtrl);
  173.         frScr = pCtrl->bound;
  174.         MMI_SendMessage(objId, MM_GETHYPER, 1, &h);
  175.         wid = h.fr.rdwx - h.fr.lupx + 1;
  176.         ht  = h.fr.rdwy - h.fr.lupy + 1;
  177.         fr.lupx = ((frScr.rdwx - frScr.lupx+1) - wid) / 2;
  178.         fr.lupy = ((frScr.rdwy - frScr.lupy+1) - ht ) / 2;
  179.         fr.rdwx = fr.lupx + wid - 1;
  180.         fr.rdwy = fr.lupy + ht  - 1;
  181.         MMI_SendMessage(objId, MM_MOVE, 1, &fr);
  182.     }
  183.  
  184.     void RM_getMoveFrame(FRAME *fr)
  185.     {
  186.         WINCTRL *ctrl;
  187.         MMI_GetControl(&ctrl);
  188.         if (fr != NULL)
  189.             *fr = ctrl->move;
  190.     }
  191.  
  192. /*--------------------------------------------------------*/
  193. /*             兄弟ウィンドウ関係の取得/設定             */
  194. /*--------------------------------------------------------*/
  195.  
  196.     void RM_raise(int kobj)
  197.     /* 兄弟ウィンドウ内で一番上にもってくる */
  198.     {
  199.         int base;
  200.         base = TL_getObjectPtr(kobj)->base;
  201.         if (base < 0)
  202.             return;
  203.         MMI_SendMessage(kobj, MM_DETACH, 0);
  204.         MMI_SendMessage(kobj, MM_ATTACH, 2, base, -1) ;
  205.     }
  206.  
  207.     int    RM_isTopInBros(int kobj)
  208.     /* 兄弟ウィンドウ内で一番上かどうかを調べる */
  209.     {
  210.         OBJECT *pobj,*pbase;
  211.         pobj = TL_getObjectPtr(kobj);
  212.         pbase = TL_getObjectPtr(pobj->base);
  213.         if (pbase->slave == pobj->llevel)
  214.             return 1;
  215.         else
  216.             return 0;
  217.     }
  218.  
  219. /*--------------------------------------------------------*/
  220. /*           ウィンドウのユーザー枠の座標を得る           */
  221. /*--------------------------------------------------------*/
  222.  
  223.     void RM_getWinUserFrame(int id, FRAME *user)
  224.     {
  225.         HYPER hyp;
  226.         FRAME frUser,frResize;
  227.         MMI_SendMessage(id, MM_GETUSER, 2, &frUser, &frResize);
  228.         MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
  229.         frUser.lupx += hyp.fr.lupx;
  230.         frUser.lupy += hyp.fr.lupy;
  231.         frUser.rdwx = frUser.lupx + frUser.rdwx - 1;
  232.         frUser.rdwy = frUser.lupy + frUser.rdwy - 1;
  233.         if (user != NULL)
  234.             *user = frUser;
  235.     }
  236.  
  237. /*--------------------------------------------------------*/
  238. /*              描画原点を(0,0)に設定/復帰               */
  239. /*--------------------------------------------------------*/
  240.  
  241.     typedef struct stag_orig {
  242.         struct stag_orig    *next;
  243.         POINT                ptOrigStack;
  244.     } ORIGSTACK;
  245.  
  246.     static ORIGSTACK *ostack = NULL;
  247.  
  248.     void RM_setOriginZero(void)
  249.     {
  250.         static POINT ptNewOrig = {0,0};
  251.         ORIGSTACK *pos;
  252.         pos = TL_calloc(1, sizeof(ORIGSTACK));
  253.         pos->next = ostack;
  254.         ostack = pos;
  255.         MG_PushOrigin(&ptNewOrig, &pos->ptOrigStack);
  256.     }
  257.  
  258.     void RM_recoverOrigin(void)
  259.     {
  260.         ORIGSTACK *pos;
  261.         pos = ostack;
  262.         ostack = ostack->next;
  263.         MG_PopOrigin(&pos->ptOrigStack);
  264.         TL_free(pos);
  265.     }
  266.  
  267. /*--------------------------------------------------------*/
  268. /*      クリップ/ビジブル領域を画面全体に設定/復帰      */
  269. /*--------------------------------------------------------*/
  270.  
  271.     typedef struct _tag_cvstack {
  272.         struct _tag_cvstack    *next;
  273.         WINCLIP             *pwcClipStack;
  274.         WINCLIP             *pwcVisibleStack;
  275.         int                    type;
  276.     } CVSTACK;
  277.  
  278.     #define    STACK_PUSHCLIP        0
  279.     #define    STACK_BEGINUPDATE    1
  280.  
  281.     static CVSTACK *cvstack = NULL;
  282.  
  283.     void RM_setClipVisibleAllScr(void)
  284.     {
  285.         CVSTACK *pcv;
  286.         FRAME frAllScr;
  287.         WINCLIP *pWinClip;
  288.         WINCTRL *pWinCtrl;
  289.       /* 画面全体を表す WINCLIP リストを作成 */
  290.         MMI_GetControl(&pWinCtrl);
  291.         frAllScr = pWinCtrl->bound;
  292.         pWinClip = WIN_getClipMemory(&frAllScr, NULL);
  293.       /* CVSTACKを作成、リストに追加 */
  294.         pcv = TL_calloc(1, sizeof(CVSTACK));
  295.         pcv->next = cvstack;
  296.         cvstack = pcv;
  297.       /* pWinClip をクリップ領域・ビジブル領域として設定 */
  298.         WIN_pushVisible(WIN_copyClip(pWinClip), &(pcv->pwcVisibleStack));
  299.         WIN_pushClip(pWinClip, &(pcv->pwcClipStack));
  300.         pcv->type = STACK_PUSHCLIP;
  301.     }
  302.  
  303.     void RM_setClipAnyFrame(int id, FRAME *fr)
  304.     {
  305.         CVSTACK *pcv;
  306.       /* CVSTACKを作成、リストに追加 */
  307.         pcv = TL_calloc(1, sizeof(CVSTACK));
  308.         pcv->next = cvstack;
  309.         cvstack = pcv;
  310.       /* クリップ領域を設定 */
  311.         pcv->pwcVisibleStack = NULL;
  312.         HYPER hyp;
  313.         FRAME frBackup;
  314.         RM_getHyper(id, &hyp);
  315.         frBackup = hyp.fr;
  316.         hyp.fr = *fr;
  317.         RM_setHyper(id, &hyp);
  318.         WIN_beginUpDateObj(id, &(pcv->pwcClipStack));
  319.         hyp.fr = frBackup;
  320.         RM_setHyper(id, &hyp);
  321.         pcv->type = STACK_BEGINUPDATE;
  322.     }
  323.  
  324.     void RM_recoverClipVisible(void)
  325.     {
  326.         CVSTACK *pcv;
  327.         pcv = cvstack;
  328.         cvstack = cvstack->next;
  329.         if (pcv->type == STACK_PUSHCLIP)
  330.         {
  331.             if (pcv->pwcClipStack != NULL)
  332.                 WIN_popClip(pcv->pwcClipStack);
  333.             if (pcv->pwcVisibleStack != NULL)
  334.                 WIN_popVisible(pcv->pwcVisibleStack);
  335.         }
  336.         else if (pcv->type == STACK_BEGINUPDATE)
  337.         {
  338.             if (pcv->pwcClipStack != NULL)
  339.                 WIN_endUpDateObj(pcv->pwcClipStack);
  340.             if (pcv->pwcVisibleStack != NULL)
  341.                 WIN_popVisible(pcv->pwcVisibleStack);
  342.         }
  343.         TL_free(pcv);
  344.     }
  345.  
  346. /*--------------------------------------------------------*/
  347. /*       他の部品をベースに部品の位置・大きさを設定       */
  348. /*--------------------------------------------------------*/
  349.  
  350.     void RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
  351.     {
  352.         HYPER hyp, hypBase;
  353.         MMI_SendMessage(kobj, MM_GETHYPER, 1, &hyp);
  354.         MMI_SendMessage(baseobj, MM_GETHYPER, 1, &hypBase);
  355.         #define    DO(t1, t2, t3)                                \
  356.             if (parm->t1 >= 0)                                \
  357.                 hyp.fr.t1 = hypBase.fr.t2 + parm->t1;        \
  358.             else                                            \
  359.                 hyp.fr.t1 = hypBase.fr.t3 + 1 + parm->t1;
  360.         DO(lupx, lupx, rdwx)
  361.         DO(lupy, lupy, rdwy)
  362.         DO(rdwx, lupx, rdwx)
  363.         DO(rdwy, lupy, rdwy)
  364.         #undef DO
  365.         MMI_SendMessage(kobj, MM_SETHYPER, 1, &hyp);
  366.     }
  367.  
  368.     void RM_adjustWinUser(int idWin, FRAME *parm)
  369.     {
  370.         HYPER hyp;
  371.         FRAME frUser, frResize;
  372.         MMI_SendMessage(idWin, MM_GETHYPER, 1, &hyp);
  373.         MMI_SendMessage(idWin, MM_GETUSER, 2, &frUser, &frResize);
  374.         #define    DO(t1, t2, t3)                            \
  375.             if (parm->t1 >= 0)                            \
  376.                 frUser.t1 = hyp.fr.t2 + parm->t1;        \
  377.             else                                        \
  378.                 frUser.t1 = hyp.fr.t3 + 1 + parm->t1;
  379.         DO(lupx, lupx, rdwx)
  380.         DO(lupy, lupy, rdwy)
  381.         DO(rdwx, lupx, rdwx)
  382.         DO(rdwy, lupy, rdwy)
  383.         #undef DO
  384.         frUser.rdwx = frUser.rdwx - frUser.lupx + 1;
  385.         frUser.rdwy = frUser.rdwy - frUser.lupy + 1;
  386.         frUser.lupx = frUser.lupx - hyp.fr.lupx;
  387.         frUser.lupy = frUser.lupy - hyp.fr.lupy;
  388.         MMI_SendMessage(idWin, MM_SETUSER, 1, &frUser, &frResize);
  389.     }
  390.  
  391. /*--------------------------------------------------------*/
  392. /*              ファイルダイアログの呼び出し              */
  393. /*--------------------------------------------------------*/
  394.  
  395. int RM_callSimpleFDG(int baseId, int noselId, char *title,
  396.                char *ok, char *cancel, char *wildext, int flag,
  397.                char *init_pathname,
  398.                char *res_pathbuf)
  399.     /*
  400.         flag: FDG_NONE, FDG_MSLCT, FDG_TEXT, FDG_FILEONLY など
  401.         FDG_MSLCT を指定している場合、*(int*)pathbuf にファイルの個数
  402.         (返値が0でないときは無効)
  403.     */
  404. {
  405.     int atr,ret,i;
  406.   // ワイルドカード指定情報の作成
  407.     static char *extstr[] = {"*.*",NULL};
  408.     if (wildext != NULL)
  409.         extstr[0] = wildext;
  410.     else
  411.         extstr[0] = "*.*";
  412.   // ファイルダイアログ以外の部品を選択不可にする
  413.     MTL_setFlagObj(noselId, MS_UNSELECT) ;
  414.   // タイトル、表示位置を設定
  415.     FDG_SetTitle(title, ok, cancel) ;
  416.     HYPER h;
  417.     FRAME fr;
  418.     MMI_SendMessage(FDG_GetMainID(), MM_GETHYPER, 1, &h);
  419.     int scrwid,scrht;  RM_getScreenSize(&scrwid,&scrht);
  420.     fr.lupx = (scrwid - (h.fr.rdwx - h.fr.lupx + 1)) / 2;
  421.     fr.lupy = (scrht - (h.fr.rdwy - h.fr.lupy + 1)) / 2;
  422.     FDG_SetFrame(fr);
  423.   // 最初のファイル名文字列を設定
  424.     char init_dir[_MAX_DRIVE+_MAX_DIR];
  425.     char init_fname[_MAX_FNAME+_MAX_EXT];
  426.     if (init_pathname == NULL)
  427.         init_dir[0] = 0, init_fname[0] = 0;
  428.     else
  429.     {
  430.         char drive[_MAX_DRIVE], dir[_MAX_DIR];
  431.         char basename[_MAX_FNAME], ext[_MAX_EXT];
  432.         _splitpath(init_pathname, drive,dir,basename,ext);
  433.         strcpy(init_dir, drive);
  434.         strcat(init_dir, dir);
  435.         strcpy(init_fname, basename);
  436.         strcat(init_fname, ext);
  437.     }
  438.     if (init_dir[0] != 0)
  439.     {
  440.         char ch = init_dir[strlen(init_dir)-1];
  441.         if (ch == ':')
  442.             strcat(init_dir, ".");
  443.         else if (ch == '\\')
  444.             init_dir[strlen(init_dir)-1] = 0;
  445.     }
  446.   // 初期テキストフィールドを設定
  447.     FDG_SetFileText("   ");
  448.     if (init_fname[0] != 0)
  449.         FDG_SetFileText(init_fname);
  450.     else
  451.         FDG_SetFileText("");
  452.   // ダイアログ呼び出し
  453.     unsigned int select_cnt;
  454.     ret = FDG_DspFileDlg(baseId, flag, (init_dir[0]!=0 ? init_dir:NULL),
  455.                          extstr,&select_cnt);
  456.   // 「実行」が押されたならファイル名を取得
  457.     if (ret > 0)
  458.     {
  459.         if (flag & FDG_MSLCT)
  460.             *(int*)res_pathbuf = select_cnt;
  461.         else
  462.         {
  463.             char pathname[_MAX_PATH];
  464.             FDG_GetPathName(pathname, &atr, 0);
  465.             strcpy(res_pathbuf, pathname);
  466.         }
  467.     }
  468.   // ファイルダイアログ以外の部品を選択可能にもどす
  469.     MTL_resetFlagObj(noselId, ~MS_UNSELECT) ;
  470.   // リターン
  471.     if (ret > 0)
  472.         return 0;
  473.     else
  474.         return -1;
  475. }
  476.  
  477. /*--------------------------------------------------------*/
  478. /*                   12ドット文字表示                   */
  479. /*--------------------------------------------------------*/
  480.  
  481.     void RM_putstring12(char *egbwork,int x,int y,char *str, int col,int bold)
  482.         /* グローバル変数 font12seg の設定が必要 */
  483.     {
  484.         #define    PUTBITBLOCK(x1,y1,x2,y2,dat) {                        \
  485.             char para[16];                                            \
  486.             DWORD(para)=(unsigned int)dat; WORD(para+4)=getds();    \
  487.             WORD(para+6)=x1; WORD(para+8)=y1;                        \
  488.             WORD(para+10)=x2; WORD(para+12)=y2;                        \
  489.             WGB_putBlockColor(egbwork, 1, para); }
  490.         int ds = getds();
  491.         char fontbuf[24];
  492.         EGB_color(egbwork, 0, col);
  493.         EGB_writeMode(egbwork, 0);
  494.         while (*str != 0)
  495.         {
  496.             if (_iskanji(*str))
  497.               /* 全角文字の場合 */
  498.             {
  499.                 int ofs, sjis = (*str)*256 + *(str+1), jis;
  500.                 jis = FNT_sjisToJis(sjis);
  501.                 if (_iskanji1(sjis))
  502.                 {
  503.                     ofs = ( ((jis>>8)-0x21)*94 + (jis&0xff) - 0x21)*24 + 0xc00;
  504.                     _movedata(font12seg, ofs, ds, (unsigned int)fontbuf, 24);
  505.                 }
  506.                 else    // 第1水準じゃない場合
  507.                 {
  508.                     char font16buf[32];
  509.                     FNT_kanjiRead(16,16,jis,ds,font16buf);
  510.                     memset(fontbuf,0,24);
  511.                     int di=0;
  512.                     for (int i=0; i<16; i++)
  513.                     {
  514.                         unsigned short p;
  515.                         p = ((unsigned short)font16buf[i*2]<<8) |
  516.                             font16buf[i*2+1];
  517.                         p =  (p&0xc000) | ((p&0x3c00)<<1) | ((p&0x3c0)<<2) |
  518.                             ((p&0x3c)<<3) | ((p&0x3)<<4);
  519.                         fontbuf[di*2]   |= (p>>8) & 0xff;
  520.                         fontbuf[di*2+1] |= p & 0xff;
  521.                         if (i!=1 && i!=4 && i!=7 && i!=10)
  522.                             di++;
  523.                     }
  524.                 }
  525.                 PUTBITBLOCK(x,y,x+11,y+11,fontbuf);
  526.                 str++,str++;
  527.                 x += 12;
  528.             }
  529.             else
  530.               /* ANK文字の場合 */
  531.             {
  532.                 if (*str != ' ')
  533.                 {
  534.                     int ofs = (int)*str * 12;
  535.                     _movedata(font12seg, ofs, ds, (unsigned int)fontbuf, 12);
  536.                     PUTBITBLOCK(x,y,x+5,y+11,fontbuf);
  537.                 }
  538.                 str++;
  539.                 x += 6;
  540.             }
  541.         }
  542.     }
  543.  
  544. /*--------------------------------------------------------*/
  545. /*              スクロールバー値の設定/取得              */
  546. /*--------------------------------------------------------*/
  547.  
  548.     void    RM_setScrollRange(int idSBar, int nDisp, int nAll, int bRedraw)
  549.     {
  550.         int ptr,min,max,len,page;
  551.         MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
  552.         min = nDisp-1;
  553.         max = nAll < nDisp ? nDisp-1 : nAll-1;
  554.         ptr = _max(min, _min(max, ptr));
  555.         MMI_SendMessage(idSBar, MM_SETSCROLL, 5, ptr,min,max, nDisp, page);
  556.         if (bRedraw)
  557.             MMI_SendMessage(idSBar, MM_SHOW, 0);
  558.     }
  559.  
  560.     void    RM_setScrollPos(int idSBar, int nPos, int bRedraw)
  561.     {
  562.         int ptr,min,max,len,page;
  563.         MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
  564.         ptr = _max(min, _min(max, min + nPos));
  565.         MMI_SendMessage(idSBar, MM_SETSCROLL, 5, ptr,min,max, len, page);
  566.         if (bRedraw)
  567.             MMI_SendMessage(idSBar, MM_SHOW, 0);
  568.     }
  569.  
  570.     int        RM_getScrollPos(int idSBar)
  571.     {
  572.         int ptr,min,max,len,page;
  573.         MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
  574.         return ptr - min;
  575.     }
  576.  
  577. /*--------------------------------------------------------*/
  578. /*            数値入力ボックスの値の設定・取得            */
  579. /*--------------------------------------------------------*/
  580.  
  581. void RM_setNumBoxValue(int id, int n, int bRedraw)
  582. {
  583.     int var,min,max,delta,ptclm;
  584.     MMI_SendMessage(id, MM_GETNUMBOX, 5, &var,&min,&max,&delta,&ptclm);
  585.     MMI_SendMessage(id, MM_SETNUMBOX, 5, n,min,max,delta,ptclm);
  586.     if (bRedraw)
  587.     {
  588.         WINCLIP* clip;
  589.         WIN_beginUpDateObj(id,&clip);
  590.         MMI_SendMessage(id,MM_SHOW,0);
  591.         WIN_endUpDateObj(clip);
  592.     }
  593. }
  594.  
  595. int RM_getNumBoxValue(int id)
  596. {
  597.     int var,min,max,delta,ptclm;
  598.     MMI_SendMessage(id, MM_GETNUMBOX, 5, &var,&min,&max,&delta,&ptclm);
  599.     return var;
  600. }
  601.  
  602. /*--------------------------------------------------------*/
  603. /*        ウィンドウのユーザー領域にクリップを設定        */
  604. /*--------------------------------------------------------*/
  605.  
  606.     void RM_setClipWinUser(int idWin, WINCLIP **clipstack)
  607.     {
  608.         HYPER hyp;
  609.         FRAME frUser,frBackup;
  610.         RM_getHyper(idWin, &hyp);
  611.         frBackup = hyp.fr;
  612.         RM_getWinUserFrame(idWin, &frUser);
  613.         hyp.fr = frUser;
  614.         RM_setHyper(idWin, &hyp);
  615.         WIN_beginUpDateObj(idWin, clipstack);
  616.         hyp.fr = frBackup;
  617.         RM_setHyper(idWin, &hyp);
  618.     }
  619.  
  620.     void RM_resetClipWinUser(WINCLIP *clipstack)
  621.     {
  622.         WIN_endUpDateObj(clipstack);
  623.     }
  624.  
  625. /*--------------------------------------------------------*/
  626. /*           ウィンドウの座標を n の倍数に補正            */
  627. /*--------------------------------------------------------*/
  628.  
  629.     void RM_roundFramePosition(int idWin, int nx, int ny)
  630.     {
  631.         HYPER hyp;
  632.         MG_mosDisp(2);
  633.         RM_getHyper(idWin, &hyp);
  634.         int dx,dy;
  635.         dx = -(hyp.fr.lupx % nx);
  636.         dy = -(hyp.fr.lupy % ny);
  637.         if (dx != 0 || dy != 0)
  638.             WIN_moveWindow(idWin, dx,dy);
  639.         MG_mosDisp(3);
  640.     }
  641.  
  642. /*--------------------------------------------------------*/
  643. /*                    ラジオボタン処理                    */
  644. /*--------------------------------------------------------*/
  645.  
  646.     void RM_initRadioButton(int *idBtnAry, int btnNum, int *sel)
  647.     {
  648.         int i;
  649.         for (i=0; i<btnNum; i++)
  650.             MTL_resetFlagObj(idBtnAry[i], ~(MS_UNSELECT|MS_TOGGLE)) ;
  651.         // MTL_setFlagObj(idBtnAry[*sel], (MS_UNSELECT|MS_TOGGLE)) ;
  652.         MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
  653.     }
  654.  
  655.     void RM_pushRadioButton(int idBtn,int idBase,
  656.                             int *idBtnAry, int btnNum, int *sel)
  657.     {
  658.         WINCLIP *clip;
  659.         int i;
  660.         for (i=0 ; i<btnNum; i++)
  661.             if (idBtnAry[i] == idBtn)
  662.                 break;
  663.         if (*sel != i)
  664.         {
  665.             WIN_beginUpDateObj(idBase, &clip);
  666.             // MTL_resetFlagObj(idBtnAry[*sel], ~(MS_UNSELECT|MS_TOGGLE)) ;
  667.             MTL_resetFlagObj(idBtnAry[*sel], ~MS_TOGGLE) ;
  668.             MMI_SendMessage(idBtnAry[*sel], MM_SHOW, 0) ;
  669.             *sel = i;
  670.             // MTL_setFlagObj(idBtnAry[*sel], (MS_UNSELECT|MS_TOGGLE)) ;
  671.             MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
  672.             WIN_endUpDateObj(clip);
  673.         }
  674.         else
  675.         {
  676.             WIN_beginUpDateObj(idBase, &clip);
  677.             MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
  678.             MMI_SendMessage(idBtnAry[*sel], MM_SHOW, 0) ;
  679.             WIN_endUpDateObj(clip);
  680.         }
  681.     }
  682.  
  683. /*--------------------------------------------------------*/
  684. /*                マウスカーソル形状の設定                */
  685. /*--------------------------------------------------------*/
  686.  
  687.     void RM_setMosCsr(int colorMode, int csrType)
  688.     {
  689.         unsigned int *coltbl;
  690.         coltbl = MG_getColorTable(colorMode);
  691.         if (colorMode == 0)
  692.             SetMouse16(csrType, WHITE, BLACK);
  693.         else if (colorMode == 1)
  694.             SetMouse16(csrType, coltbl[WHITE] & 0xff, coltbl[BLACK] & 0xff);
  695.         else if (colorMode == 2)
  696.             SetMouse16(csrType, coltbl[WHITE]&0x7fff, coltbl[BLACK]&0x7fff);
  697.     }
  698.  
  699. /*--------------------------------------------------------*/
  700. /*               メタID からクラス名を得る                */
  701. /*--------------------------------------------------------*/
  702.  
  703.     char *RM_getMetaIdName(int metaId)
  704.     {
  705.         char *typename;
  706.         if (metaId == MJ_DIALOGL40)
  707.             typename = "ダイアログ型";
  708.         else if (metaId == MJ_HYPER)
  709.             typename = "ハイパー型";
  710.         else if (metaId == MJ_ALERTL40)
  711.             typename = "アラート型";
  712.         else if (metaId == MJ_WINDOWL40)
  713.             typename = "ウィンドウ型";
  714.         else if (metaId == MJ_MSGL40)
  715.             typename = "メッセージ型";
  716.         else if (metaId == MJ_MENUL40)
  717.             typename = "メニュー型";
  718.         else if (metaId == MJ_BUTTONL40)
  719.             typename = "ボタン型";
  720.         else if (metaId == MJ_DBUTTONL40)
  721.             typename = "ドローボタン型";
  722.         else if (metaId == MJ_ICONL40)
  723.             typename = "アイコンボタン型";
  724.         else if (metaId == MJ_TICONL40)
  725.             typename = "トグルアイコン型";
  726.         else if (metaId == MJ_MITEML40)
  727.             typename = "メニューアイテム型";
  728.         else if (metaId == MJ_SCRLL40)
  729.             typename = "スクロールバー型";
  730.         else if (metaId == MJ_TEXTL40)
  731.             typename = "テキスト型";
  732.         else if (metaId == MJ_LMENUL40)
  733.             typename = "リストメニュー型";
  734.         else if (metaId == MJ_NUMBOXL40)
  735.             typename = "数値入力パネル型";
  736.         else
  737.             typename = "<不明>";
  738.         return typename;
  739.     }
  740.  
  741. /*--------------------------------------------------------*/
  742. /*          ファイルダイアログの見た目を変更する          */
  743. /*--------------------------------------------------------*/
  744.  
  745. #if 0
  746.     static void FDGdump(void)
  747.     {
  748.         int idWin;
  749.         idWin = FDG_GetMainID();
  750.         int depth = 0;
  751.         void dumpObj(int id)
  752.         {
  753.             void indent(void)
  754.             {
  755.                 int i;
  756.                 for (i=0; i<depth; i++)
  757.                     printf("|  ");
  758.             }
  759.             OBJECT *pObj, *pBase;
  760.             if (id <= 0 || (pObj = TL_getObjectPtr(id)) == NULL)
  761.                 { printf("*** no there %d ***\n",id); return; }
  762.             pBase = (pObj->base > 0 ? TL_getObjectPtr(pObj->base) : NULL);
  763.             indent();
  764.             printf("┌Obj %4d %-20s\n", id,RM_getMetaIdName(pObj->meta));
  765.             HYPER hyp;
  766.             hyp = *(HYPER*)pObj->data;
  767.             indent();
  768.             printf("│  fr(%3d,%3d)-(%3d,%3d) ", hyp.fr.lupx, hyp.fr.lupy,
  769.                     hyp.fr.rdwx, hyp.fr.rdwy);
  770.             printf("col(%d,%d,%d)\n", hyp.clr.fr, hyp.clr.back, hyp.clr.ch);
  771.             indent();
  772.             printf("└  base,slave,left,right=(%d,%d,%d,%d)\n",
  773.                     pObj->base,pObj->slave,pObj->llevel,pObj->rlevel);
  774.             if (pObj->slave > 0)
  775.                 { depth++; dumpObj(pObj->slave); depth--; }
  776.             if (pBase != NULL)
  777.                 if (pObj->llevel > 0 && pObj->llevel != pBase->slave)
  778.                     dumpObj(pObj->llevel);
  779.         }
  780.         dumpObj(idWin);
  781.     }
  782. #endif
  783.  
  784. #if 1
  785.     void FDGdump(void)
  786.     {
  787.         int idWin;
  788.         idWin = MJ_BASEOBJ;
  789.         int depth = 0;
  790.         void dumpObj(int id)
  791.         {
  792.             if (depth >= 2)
  793.                 return;
  794.             void indent(void)
  795.             {
  796.                 int i;
  797.                 for (i=0; i<depth; i++)
  798.                     printf("|  ");
  799.             }
  800.             OBJECT *pObj, *pBase;
  801.             if (id <= 0 || (pObj = TL_getObjectPtr(id)) == NULL)
  802.                 { printf("*** no there %d ***\n",id); return; }
  803.             pBase = (pObj->base > 0 ? TL_getObjectPtr(pObj->base) : NULL);
  804.             indent();
  805.             printf("┌Obj %4d %-20s\n", id,RM_getMetaIdName(pObj->meta));
  806.             HYPER hyp;
  807.             hyp = *(HYPER*)pObj->data;
  808.             indent();
  809.             printf("│  fr(%3d,%3d)-(%3d,%3d) ", hyp.fr.lupx, hyp.fr.lupy,
  810.                     hyp.fr.rdwx, hyp.fr.rdwy);
  811.             printf("col(%d,%d,%d)\n", hyp.clr.fr, hyp.clr.back, hyp.clr.ch);
  812.             indent();
  813.             printf("└  base,slave,left,right=(%d,%d,%d,%d)\n",
  814.                     pObj->base,pObj->slave,pObj->llevel,pObj->rlevel);
  815.             if (pObj->slave > 0)
  816.                 { depth++; dumpObj(pObj->slave); depth--; }
  817.             if (pBase != NULL)
  818.                 if (pObj->llevel > 0 && pObj->llevel != pBase->slave)
  819.                     dumpObj(pObj->llevel);
  820.         }
  821.         dumpObj(idWin);
  822.     }
  823. #endif
  824.  
  825. void RM_setFileDlgStyle(int style)
  826. {
  827.     typedef struct
  828.     {
  829.         int        objId;
  830.         COLOR    clr;        /* 設定したい表示色 */
  831.         int        atrm;        /* 設定したい表示属性 */
  832.         FRAME    fr;            /* フレーム変更(相対値) */
  833.     } PARTCHANGE;
  834.     static PARTCHANGE change[] =
  835.     {
  836.         #define    FR0        {0,0,0,0}
  837.         #define STYLE   {BLACK,WINBACK,BLACK}, MS_FRAMEL40|MS_UFRAMEL40
  838.         #define    STYLE2    {BLACK,BLACK,WHITE}, MS_FRAMEL40|MS_DFRAMEL40
  839.         #define STYLE3  {BLACK,WINBACK,WINBACK}, MS_FRAMEL40|MS_UFRAMEL40
  840.         #define    STYLE4    {BLACK,WINBACK,WINBACK}, MS_FRAMEL40|MS_BFRAMEL40|MS_PANELL40
  841.         #define    BK        BLACK
  842.         #define    MSGSTYLE2    {BK,WINBACK,BK},MS_OPAQUEL40
  843.         { FDG_MAINDLG,  STYLE, FR0 },
  844.         { FDG_TITLE1,   STYLE, {1,1,1,0} },
  845.         { FDG_TITLE2,   STYLE, {1,1,1,0} },
  846.         { FDG_TITLEMSG, MSGSTYLE2,{1,1,1,1} },
  847.         { FDG_CLSBTN,   STYLE3, {0,0,2,2} },
  848.         { FDG_DRVSLCTL, STYLE, FR0 },    // ドライブ選択←
  849.         { FDG_DRVSLCTR, STYLE, FR0 },    // ドライブ選択→
  850.         { FDG_DRVICON,  STYLE, FR0 },
  851.         { FDG_ALLDRVBTN,STYLE, FR0 },    // SHOW ALL 背景
  852.         { FDG_ALLDRVDLG,STYLE, FR0 },    // SHOW ALL 背景
  853.         { FDG_VOLLABEL, MSGSTYLE2,FR0 },
  854.         { FDG_FREESIZE, MSGSTYLE2,FR0 },
  855.         { FDG_CURDIR,   STYLE2, FR0 },
  856.         { FDG_MOVEDIR,  STYLE, FR0 },
  857.         { FDG_UPDIR,    STYLE, FR0 },
  858.         { FDG_LMENU,    STYLE2, FR0 },
  859.         { FDG_SCRLBAR,  STYLE4, FR0 },
  860.         { FDG_FNAMETXT, {RED,BK,WHITE},MS_FRAMEL40|MS_DFRAMEL40, FR0 },
  861.         { FDG_EXECBTN,  STYLE, FR0 },
  862.         { FDG_CNCLBTN,  STYLE, FR0 },
  863.         { -1 }
  864.     };
  865.     PARTCHANGE *pc;
  866.     for (pc = change;  pc->objId >= 0;  pc++)
  867.     {
  868.         HYPER hyp;
  869.         FDG_GetObjData(pc->objId, &hyp);
  870.         hyp.atrm = pc->atrm;
  871.         hyp.clr = pc->clr;
  872.         hyp.fr.lupx += pc->fr.lupx;
  873.         hyp.fr.lupy += pc->fr.lupy;
  874.         hyp.fr.rdwx += pc->fr.rdwx;
  875.         hyp.fr.rdwy += pc->fr.rdwy;
  876.         FDG_SetObjData(pc->objId, &hyp);
  877.     }
  878. }
  879.  
  880. /*--------------------------------------------------------*/
  881. /*                   ダイアログ実行                     */
  882. /*--------------------------------------------------------*/
  883.  
  884. void RM_execDialog(int idDlg, int idAlertAttachHyp, int idSelectiveHyp)
  885. {
  886.     WINCLIP* clipStack;
  887.     RM_setClipVisibleAllScr();
  888.     RM_setOriginZero();
  889.     RM_moveCenter(idDlg);
  890.     MTL_setFlagObj(idSelectiveHyp, MS_UNSELECT) ; 
  891.     MMI_SendMessage(idDlg, MM_ATTACH, 1, idAlertAttachHyp);
  892.     MMI_SendMessage(idDlg, MM_SHOW, 0);
  893.     MMI_ExecSystem();
  894.     MMI_SendMessage(idDlg, MM_ERASE, 0);
  895.     MMI_SendMessage(idDlg, MM_DETACH, 0);
  896.     MTL_resetFlagObj(idSelectiveHyp, ~MS_UNSELECT) ;
  897.     RM_recoverOrigin();
  898.     RM_recoverClipVisible();
  899. }
  900.  
  901. /*--------------------------------------------------------*/
  902. /*          オリジナル・ビジュアルエフェクト関数          */
  903. /*--------------------------------------------------------*/
  904.  
  905. void MS_ve(int num, int flag, FRAME *fr, char *ptr)
  906. {
  907.     if (flag == TRUE)
  908.     {
  909.         int ve = (num / 100) % 100;
  910.         if (num == 9)
  911.         /*  斜め線転送! 今は16色モードのみ。*/
  912.         {
  913.             
  914.         }
  915.     }
  916.     else
  917.     {
  918.         int ve = num % 100;
  919.     }
  920. }
  921.  
  922. int RM_getObjFromPoint(POINT* pt)
  923. {
  924.     EVENT ev;
  925.     ev.what = EVMOSMOVE;
  926.     ev.shift = 0;
  927.     ev.info = *(int*)pt;
  928.     ev.data = 0;
  929.     ev.time = 0;
  930.     int id = MMI_SendMessage(MJ_BASEOBJ, MM_ONPARTS,1, &ev);
  931.     return id;
  932. }
  933.  
  934. int RM_getObjWhereIs(int x,int y)
  935. {
  936.     POINT pt = {x,y};
  937.     return RM_getObjFromPoint(&pt);
  938. }
  939.  
  940. void RM_getScreenSize(int *wid, int *ht)
  941. {
  942.     WINCTRL* ctrl;
  943.     MMI_GetControl(&ctrl);
  944.     if (wid != NULL)
  945.         *wid = ctrl->bound.rdwx+1;
  946.     if (ht != NULL)
  947.         *ht = ctrl->bound.rdwy+1;
  948. }
  949.  
  950. /*--------------------------------------------------------*/
  951. /*                  TIFFファイル関連                  */
  952. /*--------------------------------------------------------*/
  953.  
  954. #include <tifflib.h>
  955.  
  956. #define    DATABUF        (32*1024)
  957. #define    IMAGEBUF    (16*1024)
  958. #define    WORKBUF        _max(DECOMP_WORK_SIZE,COMP_WORK_SIZE)
  959.  
  960. static char *tiff_databuf = NULL;
  961. static char *tiff_imagebuf = NULL;
  962. static char *tiff_workbuf = NULL;
  963. static int tiff_wid,tiff_ht;
  964. static FILE *tiff_fp;
  965.  
  966. static int RM_initTIFFwork(void)
  967. // 返値 0=正常終了  -1=メモリ不足
  968. {
  969.     if (tiff_databuf == NULL) {        // 作業用メモリ領域の確保
  970.         if ((tiff_databuf = TL_calloc(1,DATABUF+IMAGEBUF+WORKBUF)) == NULL)
  971.             return -1;
  972.         tiff_imagebuf = tiff_databuf + DATABUF;
  973.         tiff_workbuf = tiff_imagebuf + IMAGEBUF;
  974.     }
  975.     return 0;
  976. }
  977.  
  978. static void RM_freeTIFFwork(void)
  979. {
  980.     if (tiff_databuf != NULL)
  981.         TL_free(tiff_databuf);
  982.     tiff_databuf = NULL;
  983. }
  984.  
  985. static int _RM_readTiffFile(char *buf, int size)
  986. {
  987.     fread(buf,1,size,tiff_fp);
  988.     return 0;
  989. }
  990.  
  991. int RM_loadTIFF(char *fname,
  992.     int funcPutImage(char *buf, int ofsy, int ht),
  993.     int funcSetPalette(char *buf, int pltnum))
  994. // 返値  NOERR=成功  TIFFERR..=失敗
  995. {
  996.     if (RM_initTIFFwork() != 0)
  997.         return TIFFERR_NOMEMORY;
  998.     tiff_fp = NULL;
  999.     int ret = NOERR;
  1000.     if ((tiff_fp = fopen(fname, "rb")) == NULL)
  1001.         { ret = TIFFERR_CANNOTOPEN;  goto CLOSE; }
  1002.   // ヘッダを読み込み、画像に関するパラメータを得る
  1003.     fread(tiff_databuf, 1, DATABUF, tiff_fp);
  1004.     if (TIFF_getHead(tiff_databuf, DATABUF) < 0)
  1005.         { ret = TIFFERR_INVALIDFORMAT;  goto CLOSE; }
  1006.     int pixelsize;    // 画像のピクセルサイズ
  1007.     int comp;        // 圧縮のある・なし
  1008.     int fill;
  1009.     long strip;
  1010.     long clut;        // CLUT(パレット情報)のある・なし
  1011.     pixelsize = TIFF_checkMode(&tiff_wid,&tiff_ht,&comp,&fill,&strip,&clut);
  1012.     if (pixelsize < 0)
  1013.         { ret = TIFFERR_INVALIDFORMAT;  goto CLOSE; }
  1014.   // 入出力関数の設定
  1015.     TIFF_setLoadFunc(funcPutImage, _RM_readTiffFile);
  1016.   // CLUTデータがある場合、パレットを設定する
  1017.     if (clut != 0)
  1018.     {
  1019.         char plt[256*8+4];
  1020.         int pltnum = TIFF_getPal(plt);
  1021.         if (funcSetPalette != (int(*)())0)
  1022.             funcSetPalette(plt, pltnum);
  1023.     }
  1024.   // 読み込みバッファに格納可能な縦横のドット数を得る
  1025.     int buf_wid = (pixelsize==4 ? ((tiff_wid+7) & 0xfffffff8) : tiff_wid);
  1026.     int buf_ht = IMAGEBUF / ((buf_wid * pixelsize + 7) / 8);
  1027.   // 画像をロードする
  1028.     TIFF_loadImage(pixelsize, tiff_wid, tiff_ht, strip, fill, comp,
  1029.                    tiff_imagebuf, buf_wid, buf_ht, tiff_workbuf);
  1030. CLOSE:
  1031.     if (tiff_fp != NULL)
  1032.         fclose(tiff_fp);
  1033.     RM_freeTIFFwork();
  1034.     return ret;
  1035. }
  1036.  
  1037. static int _RM_writeTiffFile(char *buf, long size)
  1038. {
  1039.     if (fwrite(buf,1,size,tiff_fp) < size)
  1040.         return -1;
  1041.     return 0;
  1042. }
  1043.  
  1044. int RM_saveTIFF(char *fname,int pixelsize,int wid,int ht,
  1045.                 BOOL fComp,
  1046.                 int funcGetImage(char *buf,int ofsy,int ht),
  1047.                 int funcGetPalette(char *buf))
  1048. // 返値  0=成功  -1=画面モード/ファイル名の間違い
  1049. //                 -2=メモリ不足  -3=ディスク領域不足  -4=get関数エラー
  1050. {
  1051.     if (RM_initTIFFwork() != 0)
  1052.         return TIFFERR_NOMEMORY;
  1053.     tiff_fp = NULL;
  1054.     int ret = NOERR;
  1055.   // ファイルをオープン
  1056.     if ((tiff_fp = fopen(fname,"wb")) == NULL)
  1057.         { ret = TIFFERR_CANNOTOPEN;  goto CLOSE; }
  1058.   // パレット情報を得る
  1059.     char paletbuf[256*8+4];
  1060.     int paletnum = 0;
  1061.     if (funcGetPalette != (int(*)())0)
  1062.         paletnum = funcGetPalette(paletbuf);
  1063.     int headsize = (paletnum == 256 ? 2048 : 512);
  1064.   // ヘッダのサイズ分だけシーク
  1065.     if (fwrite(tiff_databuf,1,headsize,tiff_fp) < headsize)
  1066.         { ret = TIFFERR_NODISKSPACE;  goto CLOSE; }
  1067.   // データ入出力処理の登録
  1068.     TIFF_setSaveFunc(_RM_writeTiffFile, funcGetImage);
  1069.   // 画像をセーブし、圧縮後のデータサイズを得る
  1070.     int imagebuf_wid = (pixelsize==4? ((wid+7)&0xfffffff8) : wid);
  1071.     int imagebuf_ht = IMAGEBUF / ((imagebuf_wid*pixelsize+7)/8);
  1072.     int cmp_size;
  1073.     cmp_size = TIFF_saveImage(pixelsize, wid, ht, (fComp? 5:1),
  1074.                 tiff_databuf, DATABUF,
  1075.                 tiff_imagebuf,imagebuf_wid,imagebuf_ht,tiff_workbuf);
  1076.     if (cmp_size == -1)
  1077.         { ret = TIFFERR_OTHERS;  goto CLOSE; }
  1078.     else if (cmp_size == -2)
  1079.         { ret = TIFFERR_NODISKSPACE;  goto CLOSE; }
  1080.   // ヘッダ情報をつくる
  1081.     TIFF_setHead(tiff_databuf, pixelsize, wid,ht, (fComp? cmp_size:0),
  1082.                   (paletnum > 0 ? paletbuf : NULL));
  1083.   // ヘッダを書き出し、クローズ
  1084.     fflush(tiff_fp);
  1085.     long nowfp = ftell(tiff_fp);
  1086.     rewind(tiff_fp);
  1087.     if (fwrite(tiff_databuf,1,headsize,tiff_fp) < headsize)
  1088.         { ret = TIFFERR_NODISKSPACE;  goto CLOSE; }
  1089.     fflush(tiff_fp);
  1090.     fseek(tiff_fp,nowfp,SEEK_SET);
  1091. CLOSE:
  1092.     if (tiff_fp != NULL)
  1093.         fclose(tiff_fp);
  1094.     RM_freeTIFFwork();
  1095.     return ret;
  1096. }
  1097.  
  1098. int RM_getTIFFinfo(char *fname, TIFFINFO *info)
  1099. // 返値  0=正常終了
  1100. //      -1=ファイルが存在しない
  1101. //      -2=TIFF形式ではない
  1102. //      -3=メモリが足りない
  1103. {
  1104.     if (RM_initTIFFwork() != 0)
  1105.         return TIFFERR_NOMEMORY;
  1106.     int ret = NOERR;
  1107.     if ((tiff_fp = fopen(fname,"rb")) == NULL)
  1108.         { ret = TIFFERR_CANNOTOPEN;  goto END; }
  1109.     fread(tiff_databuf,1,DATABUF,tiff_fp);
  1110.     fclose(tiff_fp);
  1111.     if (TIFF_getHead(tiff_databuf,DATABUF) < 0)
  1112.         { ret = TIFFERR_INVALIDFORMAT;  goto END; }
  1113.     int xlen,ylen,pixelsize,comp,fill;  long strip,clut;
  1114.     if ((pixelsize = TIFF_checkMode(&xlen,&ylen,&comp,&fill,&strip,&clut)) < 0)
  1115.         { ret = TIFFERR_INVALIDFORMAT;  goto END; }
  1116.     info->wid = xlen;
  1117.     info->ht = ylen;
  1118.     info->compress = (comp == 1 ? FALSE : TRUE);
  1119.     info->pixelsize = pixelsize;
  1120.   END:
  1121.     RM_freeTIFFwork();
  1122.     return ret;
  1123. }
  1124.