home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / tetujin / src.lzh / TETUSUB.C < prev   
C/C++ Source or Header  |  1995-02-23  |  71KB  |  2,858 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <msdos.cf>
  5. #include <winb.h>
  6. #include <te.h>
  7. #include <fntb.h>
  8. #include <gui.h>
  9. #include <file_dlg.h>
  10. #include <wgb.h>
  11. #include <egb.h>
  12. #include <mos.h>
  13. #include <snd.h>
  14. #include <tifflib.h>
  15. #include <guidbg.h>
  16. #include "tetujin.h"
  17. #include "poly.h"
  18. #include "g_eff.h"
  19. #include "fftspt.h"
  20.  
  21. #undef    SHADE_SIZE    /* gui.hでは2だがこのprogramに限って強制的に0 */
  22. #define SHADE_SIZE 0
  23. #define EFFECTCOUNT 11
  24.  
  25. /* abou */
  26. int    alertId = -1 ;
  27. int    messageId[4] = -1 ;
  28. int    dspIconId = -1 ;
  29. int    aboutOKBtnId = -1 ;
  30. int    aboutNumId = -1 ;
  31. /* desk */
  32. int    baseDialogId = -1 ;
  33. int    menubarId = -1 ;
  34. int    menuId = -1 ;
  35. int    mItemId[3] = -1 ;
  36. int    SDKmenuId = -1 ;
  37. int    SDKmItemId[3] = -1 ;
  38. int    fileMenuId = -1 ;
  39. int    fileMItemId[3] = -1 ;
  40. int    effectMenuId = -1 ;
  41. int    effectMItemId[EFFECTCOUNT] = -1 ;
  42. int    effectSpaceMItemId = -1 ;
  43. int    effectUndoMItemId = -1 ;
  44. int    quitIconId = -1 ;
  45. int    outIconId = -1 ;
  46. /* error */
  47. int    errorId = -1 ;
  48. int    errorOKBtnId = -1 ;
  49. int    errorIconId = -1 ;
  50. int    errormessage[2] = -1 ;
  51. /* set */
  52. int    baseSetupDialogId = -1 ;
  53. int    baseSetupDialogId2 = -1 ;
  54. int    baseSetupMesId[10] = -1 ;
  55. int    baseSetupModeTitleMesId = -1 ;
  56. int    baseSetupNumId[4] = -1 ;
  57. int    setupTIconId[6] = -1 ;
  58. int    setupAreaTIconId[3] = -1 ;
  59. int    baseSetupModeMesId[6] = -1 ;
  60. int    baseScrId[4] = -1 ;
  61. int    baseSDBtnId[2] = -1 ;
  62. int    baseSetupTitleMesId = -1 ;
  63. /* filesオプション用 */
  64. int    fileSubDialogId = -1 ;
  65. int    fileBtnId[3] = -1 ;
  66. int    fileMesId[3] = -1 ;
  67. /* window用影の存在 */
  68. int    windowId = -1 ;
  69. int    vscrollId = -1 ;
  70. int    hscrollId = -1 ;
  71.  
  72. /* 実態(メインソースにて影から作りだす実態) */
  73. GRAPHWIN window[WINCOUNT] = -1 ;    /* window実態kobj */
  74.  
  75. int boundWidth ;    /* 横の解像度(512/640) */
  76.  
  77. static int effectNum = -1 ;
  78. BASICSET effectSet[EFFECTCOUNT] = {
  79.                             { "平滑化フィルタ(RGB)",
  80.     
  81.                               3,
  82.                               "混合比(0~100)", 100, 0, 100,
  83.                               "強さ(0~100)", 80, 0, 100,
  84.                               "輪郭線保存度(0~100)", 50, 0, 100,
  85.                               "", 0, 0, 100,
  86.  
  87.                               0,
  88.                               "",
  89.                               "",
  90.                               "",
  91.                               "",
  92.                               "",
  93.                               "",
  94.                               "",
  95.                               0,0,0,0,0,0,    /* mode flg */
  96.  
  97.                               0,
  98.  
  99.                               0
  100.                             },
  101.  
  102.                             { "平滑化フィルタ(Y)",
  103.     
  104.                               3,
  105.                               "混合比(0~100)", 100, 0, 100,
  106.                               "強さ(0~100)", 80, 0, 100,
  107.                               "輪郭線保存度(0~100)", 50, 0, 100,
  108.                               "", 0, 0, 100,
  109.  
  110.                               0,
  111.                               "",
  112.                               "",
  113.                               "",
  114.                               "",
  115.                               "",
  116.                               "",
  117.                               "",
  118.                               0,0,0,0,0,0,    /* mode flg */
  119.  
  120.                               0,
  121.  
  122.                               0
  123.                             },
  124.  
  125.                             { "シャープネス(RGB)",
  126.     
  127.                               3,
  128.                               "混合比(0~100)", 100, 0, 100,
  129.                               "強さ(0~100)", 80, 0, 100,
  130.                               "ノイズ阻止率(0~100)", 50, 0, 100,
  131.                               "", 0, 0, 100,
  132.  
  133.                               0,
  134.                               "",
  135.                               "",
  136.                               "",
  137.                               "",
  138.                               "",
  139.                               "",
  140.                               "",
  141.                               0,0,0,0,0,0,    /* mode flg */
  142.  
  143.                               0,
  144.  
  145.                               0
  146.                             },
  147.  
  148.                             { "シャープネス(Y)",
  149.     
  150.                               3,
  151.                               "混合比(0~100)", 100, 0, 100,
  152.                               "強さ(0~100)", 80, 0, 100,
  153.                               "ノイズ阻止率(0~100)", 50, 0, 100,
  154.                               "", 0, 0, 100,
  155.  
  156.                               0,
  157.                               "",
  158.                               "",
  159.                               "",
  160.                               "",
  161.                               "",
  162.                               "",
  163.                               "",
  164.                               0,0,0,0,0,0,    /* mode flg */
  165.  
  166.                               0,
  167.  
  168.                               0
  169.                             },
  170.  
  171.                             { "メディアン・フィルタ(RGB)",
  172.     
  173.                               2,
  174.                               "混合比(0~100)", 100, 0, 100,
  175.                               "輪郭線保存度(0~100)", 30, 0, 100,
  176.                               "", 0, 0, 100,
  177.                               "", 0, 0, 100,
  178.  
  179.                               2,
  180.                               "モード",
  181.                               "3×3ドット",
  182.                               "変則5ドット",
  183.                               "",
  184.                               "",
  185.                               "",
  186.                               "",
  187.                               0,0,0,0,0,0,    /* mode flg */
  188.  
  189.                               0,
  190.  
  191.                               0
  192.                             },
  193.  
  194.                             { "メディアン・フィルタ(Y)",
  195.     
  196.                               2,
  197.                               "混合比(0~100)", 100, 0, 100,
  198.                               "輪郭線保存度(0~100)", 30, 0, 100,
  199.                               "", 0, 0, 100,
  200.                               "", 0, 0, 100,
  201.  
  202.                               2,
  203.                               "モード",
  204.                               "3×3ドット",
  205.                               "変則5ドット",
  206.                               "",
  207.                               "",
  208.                               "",
  209.                               "",
  210.                               0,0,0,0,0,0,    /* mode flg */
  211.  
  212.                               0,
  213.  
  214.                               0
  215.                             },
  216.  
  217.                             { "デジタイズ・スムーサ",
  218.     
  219.                               2,
  220.                               "混合比(0~100)", 100, 0, 100,
  221.                               "ディテール保存度(0~100)", 50, 0, 100,
  222.                               "", 0, 0, 100,
  223.                               "", 0, 0, 100,
  224.  
  225.                               4,
  226.                               "モード",
  227.                               "奇数ライン(弱)",
  228.                               "奇数ライン(強)",
  229.                               "偶数ライン(弱)",
  230.                               "偶数ライン(強)",
  231.                               "",
  232.                               "",
  233.                               0,0,0,0,0,0,    /* mode flg */
  234.  
  235.                               0,
  236.  
  237.                               0
  238.                             },
  239.  
  240.                             { "ファジィ・レガート",
  241.     
  242.                               2,
  243.                               "混合比(0~100)", 100, 0, 100,
  244.                               "センサー(0~100)", 88, 0, 100,
  245.                               "", 0, 0, 100,
  246.                               "", 0, 0, 100,
  247.  
  248.                               0,
  249.                               "",
  250.                               "",
  251.                               "",
  252.                               "",
  253.                               "",
  254.                               "",
  255.                               "",
  256.                               0,0,0,0,0,0,    /* mode flg */
  257.  
  258.                               0,
  259.  
  260.                               0
  261.                             },
  262.  
  263.                             { "輝度データの平坦化(要時間)",
  264.     
  265.                               3,
  266.                               "混合比(0~100)", 100, 0, 100,
  267.                               "輝度最小値(0~255)", 0, 0, 255,
  268.                               "輝度最大値(0~255)", 255, 0, 255,
  269.                               "", 0, 0, 100,
  270.  
  271.                               2,
  272.                               "輝度範囲の設定方法",
  273.                               "手  動",
  274.                               "自  動",
  275.                               "",
  276.                               "",
  277.                               "",
  278.                               "",
  279.                               0,0,0,0,0,0,    /* mode flg */
  280.  
  281.                               0,
  282.  
  283.                               0
  284.                             },
  285.  
  286.                             { "色の再配置(要長時間)",
  287.     
  288.                               1,
  289.                               "混合比(0~100)", 100, 0, 100,
  290.                               "", 0, 0, 100,
  291.                               "", 0, 0, 100,
  292.                               "", 0, 0, 100,
  293.  
  294.                               3,
  295.                               "モード",
  296.                               "色の採集",
  297.                               "色の平坦再配置",
  298.                               "色の単純再配置",
  299.                               "",
  300.                               "",
  301.                               "",
  302.                               0,0,0,0,0,0,    /* mode flg */
  303.  
  304.                               0,
  305.  
  306.                               0
  307.                             },
  308.  
  309.                             { "FFTフィルタ",
  310.     
  311.                               2,
  312.                               "1辺の長さ(2のn乗)", 7, 1, 8,
  313.                               "増幅率(%)", 200, 0, 999,
  314.                               "", 0, 0, 100,
  315.                               "", 0, 0, 100,
  316.  
  317.                               6,
  318.                               "モード",
  319.                               "FFT",
  320.                               "スペクトル消しゴム",
  321.                               "スペクトル増幅",
  322.                               "スペクトルキャンセル",
  323.                               "スペクトル定着",
  324.                               "逆FFT",
  325.                               (__MODE_AREA | 3),0,0,
  326.                               (__MODE_GO),(__MODE_GO),(__MODE_GO),
  327.                                                   /* mode flg */
  328.                               0,
  329.  
  330.                               0
  331.                             }
  332.                         } ;
  333.  
  334. char tifPath[100] ;            /*  読み込みパス名 */
  335.  
  336. // 領域指定用変数
  337. int  areaMode = 0 ; /* エリア設定  0以上:各モード  -1:しない */
  338. int  fixRectangleLx, fixRectangleLy ; /* 固定長方形指定用 */
  339. char polygonBuffer[ 640*512/8 ] ;    /* ポリゴン指定作業領域 */
  340.  
  341. // 各種設定用パネルの表示状態を表すフラグ
  342. int setDspFlg = 0 ;        /*  set dialog display flg */
  343.  
  344. // バッファ関係の変数
  345. char *undoBuf = NULL ;        /*  アンドウバッファ  */
  346. char *alphaBuf = NULL ;
  347. int  undoLot = 0 ;
  348.  
  349. // 拡大表示用変数
  350. int outMode = 0 ;        /*  0:normal display 1:拡大 display */
  351. static int outLupx, outLupy ;    /*  拡大時の表示左上座標 */
  352.  
  353. // ウィンドウ関係の変数
  354. static int actId ;            /*    どのウィンドウがアクティブかをしめす変数    */
  355. static int windowflg = 0 ;    /*    ウィンドウが何枚開いているかをしめす変数    */
  356.  
  357. // セーブ関係の変数
  358. static int saveMode = 0 ;        /*  save mode 0:1600万色 1:32768色 */
  359. static int saveCompMode = 0 ;    /*  save mode 0:normal, 1:comp. */
  360.  
  361. extern char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  362.  
  363.  
  364.  
  365. /***** エフェクトコマンド実行ルーチン *****/
  366.  
  367. static execx, execy, execAreaMode ;        /* リード&ライト関数用の変数 */
  368. static char *execOutBuf ;
  369.  
  370. /* アンドゥバッファからのリード関数 */
  371. static int execRead1( int x, int y, unsigned char *a )
  372. {
  373.     if( x < 0 )x = 0 ;
  374.     if( y < 0 )y = 0 ;
  375.     if( x >= execx )x = execx - 1 ;
  376.     if( y >= execy )y = execy - 1 ;
  377.  
  378.     DWORD( a ) = DWORD( undoBuf + (y*execx + x)*3 ) ;
  379.  
  380.     if( execAreaMode < 2 )
  381.         a[3] = getArea( x, y ) ;
  382.     else
  383.         a[3] = 1 ;
  384.  
  385.     return NOERR ;
  386. }
  387.  
  388. /* アウトプットバッファからのリード関数 */
  389. static int execRead2( int x, int y, unsigned char *a )
  390. {
  391.     if( x < 0 )x = 0 ;
  392.     if( y < 0 )y = 0 ;
  393.     if( x >= execx )x = execx - 1 ;
  394.     if( y >= execy )y = execy - 1 ;
  395.  
  396.     DWORD( a ) = DWORD( execOutBuf + (y*execx + x)*3 ) ;
  397.  
  398.     if( execAreaMode < 2 )
  399.         a[3] = getArea( x, y ) ;
  400.     else
  401.         a[3] = 1 ;
  402.  
  403.     return NOERR ;
  404. }
  405.  
  406. /* アウトプットバッファへのライト関数 */
  407. static int execWrite( int x, int y, unsigned char *a )
  408. {
  409.     int d ;
  410.  
  411.     if( x < 0 )x = 0 ;
  412.     if( y < 0 )y = 0 ;
  413.     if( x >= execx )x = execx - 1 ;
  414.     if( y >= execy )y = execy - 1 ;
  415.  
  416.     d = (y*execx + x)*3 ;
  417.     WORD( execOutBuf + d ) = WORD( a ) ;
  418.     BYTE( execOutBuf + d + 2 ) = BYTE( a + 2 ) ;
  419.  
  420.     return NOERR ;
  421. }
  422.  
  423. /* マスクバッファからのリード関数 */
  424. static int execMask( int x, int y )
  425. {
  426.     return 0 ;
  427. }
  428.  
  429. /* エフェクト実行 */
  430. static int execEffect( FRAME areaFrame )
  431. {
  432.     int i, d[5] ;
  433.     int ret ;
  434.  
  435.     execOutBuf = window[actId].buf16m ;        /* アウトプットバッファ */
  436.  
  437.     if( effectNum < 0 )return NOERR ;        /* effectの選択がなされてない */
  438.     if( windowflg <= 0 )return NOERR ;        /* windowが開かれてない */
  439.     if( execOutBuf == NULL )return NOERR ;    /* dataがない */
  440.     if( undoBuf == NULL )return NOERR ;        /* アンドゥバッファがない */
  441.  
  442.     execx = window[actId].dx ;                /* 絵の横幅 */
  443.     execy = window[actId].dy ;                /* 絵の縦幅 */
  444.     if( areaFrame.lupx < 0 )areaFrame.lupx = 0 ;    /* はみだしを修正 */
  445.     if( areaFrame.lupy < 0 )areaFrame.lupy = 0 ;
  446.     if( areaFrame.rdwx > execx-1 )areaFrame.rdwx = execx-1 ;
  447.     if( areaFrame.rdwy > execy-1 )areaFrame.rdwy = execy-1 ;
  448.  
  449.     execAreaMode = areaMode ;
  450.                         /* エリア設定モード(ポリゴン,四角形,全体の区別)の抽出 */
  451.  
  452.     trans( window[actId].buf16m, undoBuf, execx*execy*3 ) ;    /* data→undoBuf */
  453.     trans( window[actId].bufAlpha, alphaBuf, execx*execy ) ;
  454.  
  455.     for( i=0 ; i<4 ; i++ )                    /* 設定値の抽出 */
  456.         d[i] = effectSet[effectNum].set[i].prt ;
  457.     d[4] = effectSet[effectNum].mode ;
  458.  
  459.     ret = NOERR ;
  460.  
  461.     switch( effectNum )                        /* エフェクト関数の選択 */
  462.     {
  463.     case 0:
  464.         ret = softnessFilter( areaFrame, d ) ;
  465.         break ;
  466.     case 1:
  467.         ret = ySoftnessFilter( areaFrame, d ) ;
  468.         break ;
  469.     case 2:
  470.         ret = sharpnessFilter( areaFrame, d ) ;
  471.         break ;
  472.     case 3:
  473.         ret = ySharpnessFilter( areaFrame, d ) ;
  474.         break ;
  475.     case 4:
  476.         ret = medianFilter( areaFrame, d ) ;
  477.         break ;
  478.     case 5:
  479.         ret = yMedianFilter( areaFrame, d ) ;
  480.         break ;
  481.     case 6:
  482.         ret = digitizeSmooth( areaFrame, d ) ;
  483.         break ;
  484.     case 7:
  485.         ret = fuzzy( areaFrame, d ) ;
  486.         break ;
  487.     case 8:
  488.         ret = histgram( areaFrame, d ) ;
  489.         break ;
  490.     case 9:
  491.         ret = replace( areaFrame, d ) ;
  492.         break ;
  493.     case 10:
  494.         ret = fftCnv( areaFrame, d ) ;
  495.         break ;
  496.     }
  497.  
  498.     cov16mTo32k( window[actId].buf16m, window[actId].buf32k, execx*execy ) ;
  499.                                             /* 16M色から32K色への変換 */
  500.     return ret ;
  501. }
  502.  
  503. /*** デジタイズ・スムーサ ***/
  504. static int digitizeSmooth( FRAME areaFrame, int *d )
  505. {
  506.     BASICPARA para ;    /* 引数 */
  507.     int mode, line ;
  508.  
  509.         /* 引数の設定 */
  510.  
  511.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  512.     para.alphaSen = 1 ;            /* アルファセンサON */
  513.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  514.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  515.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  516.  
  517.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  518.     para.lupy = areaFrame.lupy ;
  519.     para.rdwx = areaFrame.rdwx ;
  520.     para.rdwy = areaFrame.rdwy ;
  521.  
  522.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  523.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  524.     para.write = execWrite ;        /* write領域書き込み関数 */
  525.     para.mask = execMask ;            /* mask領域読み取り関数 */
  526.  
  527.     mode = d[4] & 1 ;            /* モード */
  528.     line = d[4] >> 1 ;            /* ライン */
  529.  
  530.     g_videoDigitizeSmoother( ¶, mode, line ) ;
  531.  
  532.     g_c_m_Filter( ¶, d[1]/5 ) ;
  533.  
  534.     return NOERR ;
  535. }
  536.  
  537. /*** メディアン・フィルター ***/
  538. static int medianFilter( FRAME areaFrame, int *d )
  539. {
  540.     BASICPARA para ;    /* 引数 */
  541.     int k ;
  542.  
  543.         /* 引数の設定 */
  544.  
  545.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  546.     para.alphaSen = 1 ;            /* アルファセンサON */
  547.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  548.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  549.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  550.  
  551.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  552.     para.lupy = areaFrame.lupy ;
  553.     para.rdwx = areaFrame.rdwx ;
  554.     para.rdwy = areaFrame.rdwy ;
  555.  
  556.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  557.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  558.     para.write = execWrite ;        /* write領域書き込み関数 */
  559.     para.mask = execMask ;            /* mask領域読み取り関数 */
  560.  
  561.     g_medianFilter( ¶, d[4] ) ;
  562.  
  563.     k = (100 - d[1]) / 5 ;
  564.     if( d[1] == 0 )
  565.         k = 256 ;
  566.  
  567.     g_s_c_Filter( ¶, k ) ;
  568.  
  569.     return NOERR ;
  570. }
  571.  
  572. static int yMedianFilter( FRAME areaFrame, int *d )
  573. {
  574.     BASICPARA para ;    /* 引数 */
  575.     int k ;
  576.  
  577.         /* 引数の設定 */
  578.  
  579.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  580.     para.alphaSen = 1 ;            /* アルファセンサON */
  581.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  582.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  583.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  584.  
  585.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  586.     para.lupy = areaFrame.lupy ;
  587.     para.rdwx = areaFrame.rdwx ;
  588.     para.rdwy = areaFrame.rdwy ;
  589.  
  590.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  591.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  592.     para.write = execWrite ;        /* write領域書き込み関数 */
  593.     para.mask = execMask ;            /* mask領域読み取り関数 */
  594.  
  595.     g_yMedianFilter( ¶, d[4] ) ;
  596.  
  597.     k = (100 - d[1]) / 5 ;
  598.     if( d[1] == 0 )
  599.         k = 256 ;
  600.  
  601.     g_s_c_yFilter( ¶, k ) ;
  602.  
  603.     return NOERR ;
  604. }
  605.  
  606. /*** ファジィレガート ***/
  607. static int fuzzy( FRAME areaFrame, int *d )
  608. {
  609.     BASICPARA para ;    /* 引数 */
  610.     int mode, fuzzySen ;
  611.  
  612.         /* 引数の設定 */
  613.  
  614.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  615.     para.alphaSen = 1 ;            /* アルファセンサON */
  616.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  617.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  618.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  619.  
  620.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  621.     para.lupy = areaFrame.lupy ;
  622.     para.rdwx = areaFrame.rdwx ;
  623.     para.rdwy = areaFrame.rdwy ;
  624.  
  625.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  626.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  627.     para.write = execWrite ;        /* write領域書き込み関数 */
  628.     para.mask = execMask ;            /* mask領域読み取り関数 */
  629.  
  630.     mode = 1 ;                    /* モード 1 (RGBのみの処理) */
  631.     fuzzySen = d[1]*256/100 ;    /* ファジィセンサの感度設定 */
  632.  
  633.     g_fuzzyLegato( ¶, mode, fuzzySen ) ; /* ファジィレガート呼び出し */
  634.  
  635.     return NOERR ;
  636. }
  637.  
  638. /*** 輝度ヒストグラム平坦化 ***/
  639. static int histgram( FRAME areaFrame, int *d )
  640. {
  641.     BASICPARA para ;    /* 引数 */
  642.  
  643.         /* 引数の設定 */
  644.  
  645.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  646.     para.alphaSen = 1 ;            /* アルファセンサON */
  647.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  648.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  649.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  650.  
  651.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  652.     para.lupy = areaFrame.lupy ;
  653.     para.rdwx = areaFrame.rdwx ;
  654.     para.rdwy = areaFrame.rdwy ;
  655.  
  656.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  657.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  658.     para.write = execWrite ;        /* write領域書き込み関数 */
  659.     para.mask = execMask ;            /* mask領域読み取り関数 */
  660.  
  661.     g_histgramAverager( window[actId].buf32k, ¶, d[4], d[1], d[2] ) ;
  662.  
  663.     return NOERR ;
  664. }
  665.  
  666. /*** 色の再配置 ***/
  667. static int replace( FRAME areaFrame, int *d )
  668. {
  669.     BASICPARA para ;    /* 引数 */
  670.     int wkMax ;
  671.  
  672.         /* 引数の設定 */
  673.  
  674.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  675.     para.alphaSen = 1 ;            /* アルファセンサON */
  676.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  677.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  678.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  679.  
  680.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  681.     para.lupy = areaFrame.lupy ;
  682.     para.rdwx = areaFrame.rdwx ;
  683.     para.rdwy = areaFrame.rdwy ;
  684.  
  685.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  686.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  687.     para.write = execWrite ;        /* write領域書き込み関数 */
  688.     para.mask = execMask ;            /* mask領域読み取り関数 */
  689.  
  690.     wkMax = window[actId].dx * window[actId].dy ;    /* ワークエリアの大きさ */
  691.  
  692.     g_replaceColors( wkMax, window[actId].buf32k, ¶, d[4] ) ;
  693.  
  694.     return NOERR ;
  695. }
  696.  
  697. /*** fft変換 ***/
  698. static int fftCnv( FRAME areaFrame, int *d )
  699. {
  700.     BASICPARA para ;    /* 引数 */
  701.     int ret ;
  702.  
  703.         /* 引数の設定 */
  704.  
  705. //    para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  706.     para.mix = 256 ;            /* ミクシングレートの指定 */
  707.     para.alphaSen = 1 ;            /* アルファセンサON */
  708.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  709.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  710.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  711.  
  712.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  713.     para.lupy = areaFrame.lupy ;
  714.     para.rdwx = areaFrame.rdwx ;
  715.     para.rdwy = areaFrame.rdwy ;
  716.  
  717.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  718.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  719.     para.write = execWrite ;        /* write領域書き込み関数 */
  720.     para.mask = execMask ;            /* mask領域読み取り関数 */
  721.  
  722.     switch( d[4] )                        /* エフェクト関数の選択 */
  723.     {
  724.     case 0:                          // FFT
  725.         ret = g_fft2( ¶, d[0] ) ;
  726.         break ;
  727.     case 1:                          // スペクトル消しゴム
  728.         ret = g_fft2_mul( ¶, 0 ) ;
  729.         break ;
  730.     case 2:                          // スペクトル増幅
  731.         ret = g_fft2_mul( ¶, d[1]*256/100 ) ;
  732.         break ;
  733.     case 3:                          // スペクトルキャンセル
  734.         ret = g_fft2_can( ¶ ) ;
  735.         break ;
  736.     case 4:                          // スペクトル定着
  737.         ret = g_fft2_fix( ¶ ) ;
  738.         break ;
  739.     case 5:                          // 逆FFT
  740.         ret = g_fft2_inv( ¶ ) ;
  741.         break ;
  742.     case 6:                          // おまけ スペクトル再表示
  743.         ret = g_fft2_dsp( ¶ ) ;
  744.         break ;
  745.     }
  746.  
  747.     if( ret )
  748.         return OUT_OF_MEMORY ;
  749.     else
  750.         return NOERR ;
  751. }
  752.  
  753. /*** 平滑化フィルタ ***/
  754. static int softnessFilter( FRAME areaFrame, int *d )
  755. {
  756.     BASICPARA para ;    /* 引数 */
  757.     int k ;
  758.  
  759.         /* 引数の設定 */
  760.  
  761.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  762.     para.alphaSen = 1 ;            /* アルファセンサON */
  763.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  764.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  765.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  766.  
  767.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  768.     para.lupy = areaFrame.lupy ;
  769.     para.rdwx = areaFrame.rdwx ;
  770.     para.rdwy = areaFrame.rdwy ;
  771.  
  772.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  773.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  774.     para.write = execWrite ;        /* write領域書き込み関数 */
  775.     para.mask = execMask ;            /* mask領域読み取り関数 */
  776.  
  777.     g_softnessFilter( ¶, d[1]*228/100 ) ;
  778.  
  779.     k = (100 - d[2]) / 5 ;
  780.     if( d[2] == 0 )
  781.         k = 256 ;
  782.  
  783.     g_s_c_Filter( ¶, k ) ;
  784.  
  785.     return NOERR ;
  786. }
  787.  
  788. static int ySoftnessFilter( FRAME areaFrame, int *d )
  789. {
  790.     BASICPARA para ;    /* 引数 */
  791.     int k ;
  792.  
  793.         /* 引数の設定 */
  794.  
  795.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  796.     para.alphaSen = 1 ;            /* アルファセンサON */
  797.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  798.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  799.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  800.  
  801.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  802.     para.lupy = areaFrame.lupy ;
  803.     para.rdwx = areaFrame.rdwx ;
  804.     para.rdwy = areaFrame.rdwy ;
  805.  
  806.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  807.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  808.     para.write = execWrite ;        /* write領域書き込み関数 */
  809.     para.mask = execMask ;            /* mask領域読み取り関数 */
  810.  
  811.     g_ySoftnessFilter( ¶, d[1]*228/100 ) ;
  812.  
  813.     k = (100 - d[2]) / 5 ;
  814.     if( d[2] == 0 )
  815.         k = 256 ;
  816.  
  817.     g_s_c_yFilter( ¶, k ) ;
  818.  
  819.     return NOERR ;
  820. }
  821.  
  822. /*** シャープネス ***/
  823. static int sharpnessFilter( FRAME areaFrame, int *d )
  824. {
  825.     BASICPARA para ;    /* 引数 */
  826.  
  827.         /* 引数の設定 */
  828.  
  829.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  830.     para.alphaSen = 1 ;            /* アルファセンサON */
  831.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  832.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  833.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  834.  
  835.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  836.     para.lupy = areaFrame.lupy ;
  837.     para.rdwx = areaFrame.rdwx ;
  838.     para.rdwy = areaFrame.rdwy ;
  839.  
  840.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  841.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  842.     para.write = execWrite ;        /* write領域書き込み関数 */
  843.     para.mask = execMask ;            /* mask領域読み取り関数 */
  844.  
  845.     g_softnessFilter( ¶, -d[1]*256*2/100 ) ;
  846.  
  847.     g_c_m_Filter( ¶, d[2]/5 ) ;
  848.  
  849.     return NOERR ;
  850. }
  851.  
  852. static int ySharpnessFilter( FRAME areaFrame, int *d )
  853. {
  854.     BASICPARA para ;    /* 引数 */
  855.  
  856.         /* 引数の設定 */
  857.  
  858.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  859.     para.alphaSen = 1 ;            /* アルファセンサON */
  860.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  861.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  862.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  863.  
  864.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  865.     para.lupy = areaFrame.lupy ;
  866.     para.rdwx = areaFrame.rdwx ;
  867.     para.rdwy = areaFrame.rdwy ;
  868.  
  869.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  870.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  871.     para.write = execWrite ;        /* write領域書き込み関数 */
  872.     para.mask = execMask ;            /* mask領域読み取り関数 */
  873.  
  874.     g_ySoftnessFilter( ¶, -d[1]*256*2/100 ) ;
  875.  
  876.     g_c_m_yFilter( ¶, d[2]/5 ) ;
  877.  
  878.     return NOERR ;
  879. }
  880.  
  881. /***** ファイル操作ルーチン *****/
  882.  
  883. /* LOAD */
  884. /*    initDataIGRDSK:fileMItemId[1]:MJ_MITEML40の呼び出し関数    */
  885. int    fileFunc1(kobj, messId, argc, pev, trigger)
  886. int        kobj ;
  887. int        messId ;
  888. int        argc ;
  889. EVENT    *pev ;
  890. int        trigger ;
  891. {
  892.     int        i, ret ;
  893.     char     *namePoint ;
  894.     char    path[100] ;
  895.     char    *ExtStr[] = { "*.TIF", NULL } ;
  896.  
  897.     /* メニューを使えないようにする */
  898.     MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
  899.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  900.  
  901.     /*    ウィンドウをこれ以上表示できない */
  902.     if( windowflg == WINCOUNT )
  903.     {
  904.         ret = OUT_OF_WINDOW ;
  905.         goto e00 ;
  906.     }
  907.  
  908.     _rstrncpy( path, tifPath, 80 ) ;    /* pathにパス名をcopy */
  909.     ret = fileSelecter( path, ExtStr, "TIFF読込", "読  込", "取  消");
  910.     if( ret )
  911.     {
  912.         /* メニューを使えるように戻す */
  913.         MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  914.         MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  915.         return NOERR ;
  916.     }
  917.     else
  918.     {
  919.         /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  920.         file_kakuchousi_set( tifPath, path, ".TIF" ) ;
  921.     }
  922.  
  923.     namePoint = path ;
  924.     for( i=0 ; i<80 ; i++ )
  925.     {
  926.         char s ;
  927.  
  928.         s = path[i] ;
  929.         if( (s == '\\') || (s == ':') )namePoint = path + i + 1 ;
  930.         if( s == '\0' )break ;
  931.     }
  932.  
  933.     char *work ;
  934.     int comp, fill ;
  935.     long strip, clut ;
  936.     int lot ;
  937.     char *buf ;
  938.     int col, dx, dy ;
  939.  
  940.     if( tiffCheckHead( tifPath, &col, &dx, &dy, &comp, &fill, &strip, &clut) )
  941.     {
  942.         ret = ILLEGAL_DATA ;
  943.         goto e00 ;
  944.     }
  945.  
  946.     lot = TL_getLot() ;
  947.     if( (buf = (char *)TL_mallocMemory( lot, dx * dy * 6 )) == NULL )
  948.     {
  949.         if( lot )
  950.             TL_freeLot( lot ) ;
  951.         ret = OUT_OF_MEMORY ;
  952.         goto e00 ;
  953.     }
  954.  
  955.     if
  956.     (
  957.       ( work = (char *)TL_malloc( 
  958.             DECOMP_WORK_SIZE + LOADBUFSIZE + EXPBUFSIZE + MinMem ) )
  959.                  == NULL
  960.     )
  961.     {
  962.         ret = OUT_OF_MEMORY ;
  963.         TL_freeLot( lot ) ;
  964.         goto e00 ;
  965.     }
  966.  
  967.     SetMouse32k( 81, 0x7fff, 0x0 ) ;    /* マウスカーソルをウエイト表示に */
  968.     ret = tifLoad16m( work, tifPath, buf, &dx, &dy ) ;
  969.     if( ret )
  970.     {
  971.         TL_free( work ) ;
  972.         TL_freeLot( lot ) ;
  973.         goto e00 ;
  974.     }
  975.  
  976.     /* alpha領域clear */
  977.     for( i=dx*dy*3 ; i<dx*dy*4 ; i += 4 )
  978.         DWORD( buf + i ) = 0 ;
  979.  
  980.     cov16mTo32k( buf, buf + dx*dy*4, dx*dy ) ;
  981.  
  982.     TL_free( work ) ;
  983.     ret = geneWindow( namePoint, tifPath, lot,
  984.                         buf, buf + dx*dy*3, buf + dx*dy*4, dx, dy ) ;
  985.  
  986. e00:
  987.     SetMouse32k( 80, 0x7fff, 0x0 ) ;
  988.  
  989.     /* メニューを使えるように戻す */
  990.     MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  991.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  992.  
  993.     if( ret )
  994.             errorCheck( ret ) ;
  995.     return NOERR ;
  996. }
  997.  
  998. /* SAVE */
  999. /*    initDataIGRDSK:fileMItemId[2]:MJ_MITEML40の呼び出し関数    */
  1000. int    fileFunc2(kobj, messId, argc, pev, trigger)
  1001. int        kobj ;
  1002. int        messId ;
  1003. int        argc ;
  1004. EVENT    *pev ;
  1005. int        trigger ;
  1006. {
  1007.     int        ret ;
  1008.     char    path[100] ;
  1009.     char    *ExtStr[] = { "*.TIF", NULL } ;
  1010.  
  1011.     /* メニューを使えないようにする */
  1012.     MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
  1013.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  1014.  
  1015.     /*    ウィンドウが開かれてない */
  1016.     if( (windowflg == 0) || (window[actId].buf16m == NULL) )
  1017.     {
  1018.         ret = NO_WINDOW ;
  1019.         goto e00 ;
  1020.     }
  1021.  
  1022.     _rstrncpy( path, window[actId].savePath, 80 ) ;    /* pathにパス名をcopy */
  1023.     ret = fileSelecter2( path, ExtStr, "TIFF保存", "保  存", "取  消");
  1024.     if( ret )
  1025.     {
  1026.         /* メニューを使えるように戻す */
  1027.         MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  1028.         MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  1029.         return NOERR ;
  1030.     }
  1031.     else
  1032.     {
  1033.         /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  1034.         file_kakuchousi_set( window[actId].savePath, path, ".TIF" ) ;
  1035.     }
  1036.  
  1037.     char *work ;
  1038.  
  1039.     if( (work=(char *)TL_malloc(COMP_WORK_SIZE+SAVEBUFSIZE+GETBUFSIZE))
  1040.              == NULL )
  1041.     {
  1042.         ret = OUT_OF_MEMORY ;
  1043.         goto e00 ;
  1044.     }
  1045.  
  1046.     SetMouse32k( 81, 0x7fff, 0x0 ) ;    /* マウスカーソルをウエイト表示に */
  1047.     if( saveMode == 0 )
  1048.         ret = tifSave32kAnd16m(
  1049.             work, window[actId].savePath, window[actId].buf16m,
  1050.             24, saveCompMode, window[actId].dx, window[actId].dy ) ;
  1051.     else
  1052.         ret = tifSave32kAnd16m(
  1053.             work, window[actId].savePath, window[actId].buf32k,
  1054.             16, saveCompMode, window[actId].dx, window[actId].dy ) ;
  1055.     SetMouse32k( 80, 0x7fff, 0x0 ) ;
  1056.     if( ret )
  1057.     {
  1058.         TL_free( work ) ;
  1059.         goto e00 ;
  1060.     }
  1061.     TL_free( work ) ;
  1062.  
  1063. e00:
  1064.     /* メニューを使えるように戻す */
  1065.     MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  1066.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  1067.  
  1068.     if( ret )
  1069.             errorCheck( ret ) ;
  1070.     return NOERR ;
  1071. }
  1072.  
  1073.  
  1074. /***** エフェクトコマンド設定ルーチン *****/
  1075.  
  1076. /*    initDataIGRDSK:effectMItemId[0~10]:MJ_MITEML40の呼び出し関数    */
  1077. int    effectFunc(kobj)
  1078. int        kobj ;
  1079.                 //int        messId ;
  1080.                 //int        argc ;
  1081.                 //EVENT    *pev ;
  1082.                 //int        trigger ;
  1083. {
  1084.     int i ;
  1085.     int    alertobj ;      /*   現在のALERTOBJを退避する変数    */
  1086.     int n ;
  1087.  
  1088.     for( i=0 ; i<EFFECTCOUNT ; i++ )
  1089.     {
  1090.         if( kobj == effectMItemId[i] )
  1091.             break ;
  1092.     }
  1093.     if( i >= EFFECTCOUNT )return NOERR ;
  1094.  
  1095.     /* メニューを使えないようにする */
  1096.     MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
  1097.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  1098.  
  1099.     effectNum = i ;
  1100.     n = i ;
  1101.     setEffect( &(effectSet[i]) ) ;    /* 操作パネルの初期設定 */
  1102.  
  1103.     alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避     */
  1104.     MMI_SetAlertObj( baseSetupDialogId ) ;
  1105.     MMI_SendMessage( baseSetupDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  1106.     MMI_SendMessage( baseSetupDialogId, MM_SHOW, 0 ) ; /* 見せる */
  1107.  
  1108.     setDspFlg = 1 ;
  1109.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  1110.     setDspFlg = 0 ;
  1111.  
  1112.     MMI_SendMessage( baseSetupDialogId, MM_ERASE, 0 ) ;
  1113.     MMI_SendMessage( baseSetupDialogId, MM_DETACH, 0 ) ;
  1114.     MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す        */
  1115.  
  1116.     if( windowflg && (effectNum >= 0) )
  1117.     {
  1118.         if( undoBuf == NULL )
  1119.             makeUndoBuf() ;
  1120.  
  1121.         if( undoBuf == NULL )
  1122.             errorCheck( OUT_OF_MEMORY ) ;                /* undoBufがない */
  1123.         else
  1124.         {
  1125.             areaMode = effectSet[effectNum].areaMode ;
  1126.  
  1127.             if( effectSet[effectNum].modeFlg[effectSet[effectNum].mode]
  1128.              & __MODE_GO )
  1129.             {
  1130.                 FRAME fr = {0,0,0,0} ;
  1131.  
  1132.                 SetMouse32k( 81, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1133.                 execEffect( fr ) ;                /* effect実行ルーチンに */
  1134.                 SetMouse32k( 80, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1135.                 showActWindow() ;
  1136.                 MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1137.                 areaMode = -1 ;
  1138.             }
  1139.  
  1140.             if( effectSet[effectNum].modeFlg[effectSet[effectNum].mode]
  1141.              & __MODE_AREA )
  1142.             {
  1143.                 areaMode
  1144.                 = effectSet[effectNum].modeFlg[effectSet[effectNum].mode]
  1145.                 & 0xff ;
  1146.             }
  1147.         }
  1148.     }
  1149.  
  1150.     if( n == 10 )    /* FFTのための特別処置 */
  1151.     {
  1152.         if( effectNum >= 0 )
  1153.         {
  1154.             fixRectangleLx = 1 << effectSet[effectNum].set[0].prt ;
  1155.             fixRectangleLy = 1 << effectSet[effectNum].set[0].prt ;
  1156.  
  1157.             if( effectSet[effectNum].mode == 1
  1158.              || effectSet[effectNum].mode == 2
  1159.             )
  1160.             {
  1161.                 FRAME fr = {0,0,0,0} ;
  1162.                 int md ;
  1163.  
  1164.                 if( g_fft2_readFlg() == 2 )
  1165.                 {
  1166.                     md = effectSet[effectNum].mode ;
  1167.                     effectSet[effectNum].mode = 6 ;
  1168.                     SetMouse32k( 81, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1169.                     execEffect( fr ) ;                /* effect実行ルーチンに */
  1170.                     SetMouse32k( 80, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1171.                     showActWindow() ;
  1172.                     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1173.                     effectSet[effectNum].mode = md ;
  1174.                 }
  1175.             }
  1176.         }
  1177.         else
  1178.         {
  1179.             g_fft2_clr() ;
  1180.         }
  1181.     }
  1182.  
  1183.     /* メニューを使えるように戻す */
  1184.     MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  1185.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  1186.  
  1187.     return NOERR ;
  1188. }
  1189.  
  1190. /* 設定パネルの初期設定 */
  1191. static setEffect( BASICSET *set )
  1192. {
  1193.     HYPER hyp ;
  1194.     FRAME frm ;
  1195.     int dx, dy, i ;
  1196.  
  1197. /* まっ先にセンタリングするから,後でアタッチ,デタッチをしても位置がずれない */
  1198.     MMI_SendMessage( baseSetupDialogId, MM_GETHYPER, 1, &hyp ) ; /* センタリング */
  1199.     dx = hyp.fr.rdwx - hyp.fr.lupx ;
  1200.     dy = hyp.fr.rdwy - hyp.fr.lupy ;
  1201.     frm.lupx = 256 - dx / 2 ;
  1202.     frm.lupy = 240 - dy / 2 ;
  1203.     frm.rdwx = hyp.fr.lupx + dx ;
  1204.     frm.rdwy = hyp.fr.lupy + dy ;
  1205.     MMI_SendMessage( baseSetupDialogId, MM_MOVE, 1, &frm ) ;
  1206.  
  1207.     /*    タイトルを設定する  */
  1208.     MMI_SendMessage( baseSetupTitleMesId, MM_SETMSG, 1, set->title ) ;
  1209.  
  1210.     /*  各種設定項目  */
  1211.     for( i=0 ; i<4 ; i++ )
  1212.     {
  1213.         MMI_SendMessage( baseSetupMesId[i], MM_SETMSG,
  1214.                                             1, (set->set[i]).title ) ;
  1215.         MMI_SendMessage( baseSetupNumId[i], MM_SETNUMBOX, 5,
  1216.              (set->set[i]).prt, (set->set[i]).min, (set->set[i]).max, 1, 0 ) ;
  1217.         MMI_SendMessage( baseScrId[i], MM_SETSCROLL, 5,
  1218.              (set->set[i]).prt, (set->set[i]).min, (set->set[i]).max, 1, 1 ) ;
  1219.     }
  1220.  
  1221.     /*    モードのタイトルを設定する  */
  1222.     MMI_SendMessage( baseSetupModeTitleMesId, MM_SETMSG, 1, set->modeTitle ) ;
  1223.     for( i=0 ; i<6 ; i++ )
  1224.         MMI_SendMessage( baseSetupModeMesId[i], MM_SETMSG,
  1225.                                                         1, set->modeName[i] ) ;
  1226.     /* 選択されたモードのボタン設定 */
  1227.     for( i=0 ; i<6 ; i++ )
  1228.         MTL_resetFlagObj( setupTIconId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1229.     MTL_setFlagObj( setupTIconId[ set->mode ], (MS_UNSELECT | MS_TOGGLE) ) ;
  1230.  
  1231.     /* 選択されたエリアモードのボタン設定 */
  1232.     for( i=0 ; i<3 ; i++ )
  1233.         MTL_resetFlagObj( setupAreaTIconId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1234.     MTL_setFlagObj( setupAreaTIconId[ set->areaMode ],
  1235.                             (MS_UNSELECT | MS_TOGGLE) );
  1236.  
  1237.     /* エリアモードの選択の必要ないモードの場合、それを消す */
  1238.     if( set->modeFlg[ set->mode ] )
  1239.     {
  1240.         for( i=0 ; i<3 ; i++ )
  1241.         {
  1242.             MTL_setAtrObj( setupAreaTIconId[i], MS_INACTIVEL40 ) ;
  1243.         }
  1244.         for( i=4 ; i<8 ; i++ )
  1245.         {
  1246.             MTL_resetAtrObj( baseSetupMesId[i], (~MS_DSPONLYL40) ) ;
  1247.             MTL_setAtrObj( baseSetupMesId[i], MS_INACTIVEL40 ) ;
  1248.         }
  1249.     }
  1250.     else
  1251.     {
  1252.         /* エリアモードのボタン設定 */
  1253.         for( i=0 ; i<3 ; i++ )
  1254.         {
  1255.             MTL_resetAtrObj( setupAreaTIconId[i], (~MS_DSPONLYL40) ) ;
  1256.         }
  1257.         for( i=4 ; i<8 ; i++ )
  1258.         {
  1259. //            MTL_resetAtrObj( baseSetupMesId[i], (~MS_DSPONLYL40) ) ;
  1260.             MTL_setAtrObj( baseSetupMesId[i], MS_DSPONLYL40 ) ;
  1261.         }
  1262.     }
  1263.  
  1264.     /*  各種設定項目のアタッチorデタッチの設定  */
  1265.     for( i=0 ; i<4 ; i++ )
  1266.     {
  1267.         if( i<(set->setNum) )
  1268.         {
  1269.             MMI_SendMessage( baseSetupNumId[i], MM_ATTACH,
  1270.                                             1, baseSetupDialogId2 ) ;
  1271.             MMI_SendMessage( baseScrId[i], MM_ATTACH,
  1272.                                             1, baseSetupDialogId2 ) ;
  1273.         }
  1274.         else
  1275.         {
  1276.             MMI_SendMessage( baseSetupNumId[i], MM_DETACH, 0 ) ;
  1277.             MMI_SendMessage( baseScrId[i], MM_DETACH, 0 ) ;
  1278.         }
  1279.     }
  1280.  
  1281.     /*  モードのアタッチorデタッチの設定  */
  1282.     for( i=0 ; i<6 ; i++ )
  1283.     {
  1284.         /* 文字をボタンの上に持ってくるために,一端デタッチする */
  1285.         MMI_SendMessage( baseSetupModeMesId[i], MM_DETACH, 0 ) ;
  1286.  
  1287.         if( i<(set->modeNum) )
  1288.         {
  1289.             MMI_SendMessage( setupTIconId[i], MM_ATTACH,
  1290.                                             1, baseSetupDialogId2 ) ;
  1291.             MMI_SendMessage( baseSetupModeMesId[i], MM_ATTACH,
  1292.                                             1, baseSetupDialogId2 ) ;
  1293.                                     /* 文字はボタンの後に,アタッチする */
  1294.         }
  1295.         else
  1296.         {
  1297.             MMI_SendMessage( setupTIconId[i], MM_DETACH, 0 ) ;
  1298.         }
  1299.     }
  1300.  
  1301.     MMI_SendMessage( baseSetupDialogId, MM_MOVE, 1, &(hyp.fr) ) ;
  1302.  
  1303.     return NOERR ;
  1304. }
  1305.  
  1306. /* 数値設定 */
  1307. /*    initDataIGRSET:baseSetupNumId[0]:MJ_NUMBOXL40の呼び出し関数    */
  1308. /*    initDataIGRSET:baseSetupNumId[1]:MJ_NUMBOXL40の呼び出し関数    */
  1309. /*    initDataIGRSET:baseSetupNumId[2]:MJ_NUMBOXL40の呼び出し関数    */
  1310. /*    initDataIGRSET:baseSetupNumId[3]:MJ_NUMBOXL40の呼び出し関数    */
  1311. int    baseSetupNumFunc(kobj, messId, argc, pev, trigger)
  1312. int        kobj ;
  1313. int        messId ;
  1314. int        argc ;
  1315. EVENT    *pev ;
  1316. int        trigger ;
  1317. {
  1318.     int        i, prt , max , min , d1 , d2 ;
  1319.  
  1320.     for( i=0 ; i<4 ; i++ )
  1321.     {
  1322.         if( kobj == baseSetupNumId[i] )
  1323.             break ;
  1324.     }
  1325.     MMI_SendMessage( kobj, MM_GETNUMBOX, 5, &prt, &min, &max, &d1, &d2 ) ;
  1326.     MMI_SendMessage( baseScrId[i], MM_SETSCROLL,
  1327.                                          5,    prt, min, max, 1, 1 ) ;
  1328.     MMI_SendMessage( baseScrId[i], MM_SHOW, 0 ) ;
  1329.     effectSet[effectNum].set[i].prt = prt ;
  1330.  
  1331.     return NOERR ;
  1332. }
  1333.  
  1334. /* スクロール設定 */
  1335. /*    initDataIGRSET:baseScrId[0]:MJ_SCRLL40の呼び出し関数    */
  1336. /*    initDataIGRSET:baseScrId[1]:MJ_SCRLL40の呼び出し関数    */
  1337. /*    initDataIGRSET:baseScrId[2]:MJ_SCRLL40の呼び出し関数    */
  1338. /*    initDataIGRSET:baseScrId[3]:MJ_SCRLL40の呼び出し関数    */
  1339. int    baseSetupScrFunc(kobj, messId, argc, pev, trigger)
  1340. int        kobj ;
  1341. int        messId ;
  1342. int        argc ;
  1343. EVENT    *pev ;
  1344. int        trigger ;
  1345. {
  1346.     int        i, prt , max , min , d1 , d2 ;
  1347.  
  1348.     for( i=0 ; i<4 ; i++ )
  1349.     {
  1350.         if( kobj == baseScrId[i] )
  1351.             break ;
  1352.     }
  1353.     MMI_SendMessage( kobj, MM_GETSCROLL, 5, &prt, &min, &max, &d1, &d2 ) ;
  1354.     MMI_SendMessage( baseSetupNumId[i], MM_SETNUMBOX,
  1355.                                          5,    prt, min, max, 1, 0 ) ;
  1356.     MMI_SendMessage( baseSetupNumId[i], MM_SHOW, 0 ) ;
  1357.     effectSet[effectNum].set[i].prt = prt ;
  1358.  
  1359.     return NOERR ;
  1360. }
  1361.  
  1362. /* モード設定 */
  1363. /*    initDataIGRSET:setupTIconId[0~5]:MJ_TICONL40の呼び出し関数    */
  1364. int    baseSetupTIconFunc(kobj, messId, argc, pev, trigger)
  1365. int        kobj ;
  1366. int        messId ;
  1367. int        argc ;
  1368. EVENT    *pev ;
  1369. int        trigger ;
  1370. {
  1371.     int i, j ;
  1372.  
  1373.     for( i=0 ; i<6 ; i++ )
  1374.     {
  1375.         if( kobj == setupTIconId[i] )
  1376.             break ;
  1377.     }
  1378.     if( i < 6 )
  1379.     {
  1380.         MTL_setFlagObj( setupTIconId[i], MS_UNSELECT ) ;
  1381.         MTL_resetFlagObj( setupTIconId[ effectSet[effectNum].mode ],
  1382.                             (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1383.         MMI_SendMessage( setupTIconId[ effectSet[effectNum].mode ],
  1384.                             MM_SHOW, 0 ) ;
  1385.         effectSet[effectNum].mode = i ;
  1386.  
  1387.         if( effectSet[effectNum].modeFlg[effectSet[effectNum].mode] )
  1388.         {
  1389.             /* エリアモードのボタン設定 */
  1390.             for( j=0 ; j<3 ; j++ )
  1391.             {
  1392.                 MTL_setAtrObj( setupAreaTIconId[j], MS_INACTIVEL40 ) ;
  1393.                 MMI_SendMessage( setupAreaTIconId[j], MM_SHOW, 0 ) ;
  1394.             }
  1395.             for( j=4 ; j<8 ; j++ )
  1396.             {
  1397.                 MTL_resetAtrObj( baseSetupMesId[j], (~MS_DSPONLYL40) ) ;
  1398.                 MTL_setAtrObj( baseSetupMesId[j], MS_INACTIVEL40 ) ;
  1399.                 MMI_SendMessage( baseSetupMesId[j], MM_SHOW, 0 ) ;
  1400.             }
  1401.         }
  1402.         else
  1403.         {
  1404.             /* エリアモードのボタン設定 */
  1405.             for( j=0 ; j<3 ; j++ )
  1406.             {
  1407.                 MTL_resetAtrObj( setupAreaTIconId[j], (~MS_DSPONLYL40) ) ;
  1408.                 MMI_SendMessage( setupAreaTIconId[j], MM_SHOW, 0 ) ;
  1409.             }
  1410.             for( j=4 ; j<8 ; j++ )
  1411.             {
  1412. //                MTL_resetAtrObj( baseSetupMesId[j], (~MS_DSPONLYL40) ) ;
  1413.                 MTL_setAtrObj( baseSetupMesId[j], MS_DSPONLYL40 ) ;
  1414.                 MMI_SendMessage( baseSetupMesId[j], MM_SHOW, 0 ) ;
  1415.             }
  1416.         }
  1417.     }
  1418.     return NOERR ;
  1419. }
  1420.  
  1421. /* エリア設定モード設定 */
  1422. /*    initDataIGRSET:setupAreaTIconId[0]:MJ_TICONL40の呼び出し関数    */
  1423. /*    initDataIGRSET:setupAreaTIconId[1]:MJ_TICONL40の呼び出し関数    */
  1424. /*    initDataIGRSET:setupAreaTIconId[2]:MJ_TICONL40の呼び出し関数    */
  1425. int    baseSetupAreaTIconFunc(kobj, messId, argc, pev, trigger)
  1426. int        kobj ;
  1427. int        messId ;
  1428. int        argc ;
  1429. EVENT    *pev ;
  1430. int        trigger ;
  1431. {
  1432.     int i ;
  1433.  
  1434.     for( i=0 ; i<3 ; i++ )
  1435.     {
  1436.         if( kobj == setupAreaTIconId[i] )
  1437.             break ;
  1438.     }
  1439.     if( i < 3 )
  1440.     {
  1441.         MTL_setFlagObj( setupAreaTIconId[i], MS_UNSELECT ) ;
  1442.         MTL_resetFlagObj( setupAreaTIconId[ effectSet[effectNum].areaMode ],
  1443.                             (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1444.         MMI_SendMessage( setupAreaTIconId[ effectSet[effectNum].areaMode ],
  1445.                             MM_SHOW, 0 ) ;
  1446.         effectSet[effectNum].areaMode = i ;
  1447.     }
  1448.     return NOERR ;
  1449. }
  1450.  
  1451. /* 実行or取消 */
  1452. /*    initDataIGRSET:baseSDBtnId[1]:MJ_DBUTTONL40の呼び出し関数    */
  1453. /*    initDataIGRSET:baseSDBtnId[0]:MJ_DBUTTONL40の呼び出し関数    */
  1454. int    baseSetupOkFunc(kobj, messId, argc, pev, trigger)
  1455. int        kobj ;
  1456. int        messId ;
  1457. int        argc ;
  1458. EVENT    *pev ;
  1459. int        trigger ;
  1460. {
  1461.     if( kobj != baseSDBtnId[0] )
  1462.         effectNum = -1 ;
  1463.  
  1464.     MMI_SetHaltFlag( TRUE ) ;
  1465.     return NOERR ;
  1466. }
  1467.  
  1468. /***** 画面拡大設定ルーチン *****/
  1469.  
  1470. /* 拡大時において,マウス関係のイベント実行時に,ここを経由 */
  1471. static int outFuncSub( EVENT *pev )
  1472. {
  1473.     int x, y ;
  1474.  
  1475.     if( pev->what == EVMOSDN && pev->shift == SRIGHTBTN )
  1476.     {
  1477.         if( 
  1478.             MTL_checkFlagObj( alertId, MS_DSP ) == 0
  1479.         &&    MTL_checkFlagObj( SDKmenuId, MS_DSP ) == 0
  1480.         &&    MTL_checkFlagObj( fileMenuId, MS_DSP ) == 0
  1481.         &&    MTL_checkFlagObj( effectMenuId, MS_DSP ) == 0
  1482.         &&    effectNum >= 0
  1483.         &&    setDspFlg == 0
  1484.         )
  1485.         {
  1486.                 effectFunc( effectMItemId[effectNum] ) ;
  1487.         }
  1488.     }
  1489.  
  1490.     if( outMode )        /* 拡大設定 */
  1491.     {
  1492.         x = ((POINT *)&(pev->info))->x ;
  1493.         y = ((POINT *)&(pev->info))->y ;
  1494.         setDisplayArea( x, y ) ;    /* カーソルを画面の中に入れる関数 */
  1495.     }
  1496.  
  1497.     switch( pev->what )
  1498.     {
  1499.     case EVMOSDN:
  1500.         MMI_MosOnMethods() ;
  1501.         break ;
  1502.     case EVMOSUP:
  1503.         MMI_MosOffMethods() ;
  1504.         break ;
  1505.     case EVMOSMOVE:
  1506.         MMI_MosMoveMethods( pev ) ;
  1507.         break ;
  1508.     case EVMOSDRAG:
  1509.         MMI_MosDragMethods( pev ) ;
  1510.         break ;
  1511.     }
  1512.     return NOERR ;
  1513. }
  1514.  
  1515. /* 拡大ON,OFF SWITCH */
  1516. /*    initDataIGRDSK:outIconId:MJ_ICONL40の呼び出し関数    */
  1517. int    displayOutFunc(kobj)
  1518. int        kobj ;
  1519.                 // int        messId ;
  1520.                 // int        argc ;
  1521.                 // EVENT    *pev ;
  1522.                 // int        trigger ;
  1523. {
  1524.     if( outMode == 0 )        /* 拡大設定 */
  1525.     {
  1526.         MMI_displayOut( 2, 2 ) ;
  1527.         MMI_displayOutStart() ;
  1528.         outMode = 1 ;
  1529.         outLupx = 256 ; outLupy = 0 ;
  1530.         setDisplayArea( 256, 0 ) ;
  1531.  
  1532.         MMI_SendMessage( kobj , MM_SETSHAPE , 1 , 298 ) ;
  1533.         MMI_SendMessage( kobj , MM_SHOW , 0 ) ;
  1534.     }
  1535.     else                    /* 拡大解除 */
  1536.     {
  1537.         MMI_displayOut( 1, 1 ) ;
  1538.         MMI_displayOutEnd() ;
  1539.  
  1540.         EGB_displayStart( guiEgbPtr, 3, 0, 0 ) ;
  1541.         EGB_displayStart( guiEgbPtr, 2, 1, 1 ) ;
  1542.         EGB_displayStart( guiEgbPtr, 0, 0, 0 ) ;
  1543.         EGB_displayStart( guiEgbPtr, 1, 0, 0 ) ;
  1544.         EGB_displayStart( guiEgbPtr, 3, boundWidth, 480 ) ;
  1545.  
  1546.         MMI_SendMessage( kobj , MM_SETSHAPE , 1 , 297 ) ;
  1547.         MMI_SendMessage( kobj , MM_SHOW , 0 ) ;
  1548.         outMode = 0 ;
  1549.     }
  1550.  
  1551.     return NOERR ;
  1552. }
  1553.  
  1554. /* 注意!!! これらは絶対にstaticでなければいけない */
  1555. static int ( *eventFunc0 )( EVENT * ) ;
  1556. static int ( *eventFunc1 )( EVENT * ) ;
  1557. static int ( *eventFunc3 )( EVENT * ) ;
  1558. static int ( *eventFunc4 )( EVENT * ) ;
  1559. static int hookFlg = 0 ;
  1560.  
  1561. /* hook start */
  1562. static int    hookStart()
  1563. {
  1564.     if( hookFlg )return NOERR ;
  1565.  
  1566.     MMI_GetExecEvent( 0, &eventFunc0 ) ;
  1567.     MMI_GetExecEvent( 1, &eventFunc1 ) ;
  1568.     MMI_GetExecEvent( 3, &eventFunc3 ) ;
  1569.     MMI_GetExecEvent( 4, &eventFunc4 ) ;
  1570.     MMI_SetExecEvent( 0, outFuncSub ) ;
  1571.     MMI_SetExecEvent( 1, outFuncSub ) ;
  1572.     MMI_SetExecEvent( 3, outFuncSub ) ;
  1573.     MMI_SetExecEvent( 4, outFuncSub ) ;
  1574.     hookFlg = 1 ;
  1575.  
  1576.     return NOERR ;
  1577. }
  1578.  
  1579. /* hook end */
  1580. static int    hookEnd()
  1581. {
  1582.     MMI_SetExecEvent( 0, eventFunc0 ) ;
  1583.     MMI_SetExecEvent( 1, eventFunc1 ) ;
  1584.     MMI_SetExecEvent( 3, eventFunc3 ) ;
  1585.     MMI_SetExecEvent( 4, eventFunc4 ) ;
  1586.     hookFlg = 0 ;
  1587.  
  1588.     return NOERR ;
  1589. }
  1590.  
  1591.  
  1592. /***** ウィンドウ操作関数 *****/
  1593.  
  1594. /* ウィンドウのユーザー関数 */
  1595. /*    initDataIGRWIN:windowId:MJ_WINDOWL40の呼び出し関数    */
  1596. int    windowFunc(kobj, messId, argc, pev, trigger)
  1597. int        kobj ;
  1598. int        messId ;
  1599. int        argc ;
  1600. EVENT    *pev ;
  1601. int        trigger ;
  1602. {
  1603.     FRAME        org ;
  1604.     FRAME        size ;
  1605.     HYPER        winhyp , vschyp, hschyp  ;
  1606.  
  1607.     char        para[64] ;
  1608.     int            act ;
  1609.     int         dx, dy ;
  1610.     int         sw, x, y ;
  1611.     int            ret ;
  1612.     int            error ;
  1613.  
  1614.     WINCLIP        *pwclp ;            /* 枠用の関数の為の変数 */
  1615.     WINCLIP        *pstackVisible ;
  1616.     WINCLIP        *pstackClip ;
  1617.     WINCTRL        *pctrl ;
  1618.     POINT        origin ;
  1619.     POINT        dspOrigin ;
  1620.  
  1621.     /* クリップ枠とビジブル枠を退避する入れ子の関数 */
  1622.     void pushWaku()
  1623.     {
  1624.         origin.y = origin.x = 0 ;
  1625.         MG_PushOrigin( &origin, &dspOrigin ) ;
  1626.         MMI_GetControl( &pctrl ) ;
  1627.         pwclp = WIN_getClipMemory( &pctrl->bound, NULL ) ;
  1628.         WIN_pushVisible( WIN_copyClip( pwclp ), &pstackVisible ) ;
  1629.         WIN_pushClip( pwclp, &pstackClip ) ;
  1630.     }
  1631.  
  1632.     /* クリップ枠とビジブル枠を元に戻す入れ子の関数 */
  1633.     void popWaku()
  1634.     {
  1635.         WIN_popClip( pstackClip ) ;
  1636.         WIN_popVisible( pstackVisible ) ;
  1637.         MG_PopOrigin( &dspOrigin ) ;
  1638.     }
  1639.  
  1640.     /* クリップ枠の絵を表示する入れ子の関数 */
  1641.     void showWaku()
  1642.     {
  1643.         char *buf ;
  1644.  
  1645.         MG_mosDisp( 2 );
  1646.         buf = window[act].buf32k ;
  1647.         if( buf != NULL )
  1648.         {
  1649.             EGB_writeMode(guiEgbPtr,0);    /* XORモードでここに入る場合もあり */
  1650.             EGB_paintMode(guiEgbPtr,0x222);
  1651.  
  1652.             DWORD( para + 0 ) = (unsigned int)buf ;
  1653.             WORD( para + 4 ) = getds() ;
  1654.             WORD( para + 6 ) = - window[act].ox ;
  1655.             WORD( para + 8 ) = - window[act].oy ;
  1656.             WORD( para + 10 ) = - window[act].ox + window[act].dx - 1 ;
  1657.             WORD( para + 12 ) = - window[act].oy + window[act].dy - 1 ;
  1658.             WGB_putBlock( guiEgbPtr, 1, para ) ;
  1659.         }
  1660.         MG_mosDisp( 3 );
  1661.     }
  1662.  
  1663.     error = ILLEGAL_FUNCTION ;
  1664.  
  1665.     /*    どのウィンドウから呼ばれたか調べる        */
  1666.     for( act = 0 ; act < WINCOUNT ; act ++ )
  1667.         if( window[act].windowId == kobj )
  1668.              break ;
  1669.  
  1670.     /* SHOW */
  1671.     if( messId == MM_SHOW )
  1672.     {
  1673.         showWaku() ;
  1674.  
  1675.         error = NOERR ;
  1676.     }
  1677.  
  1678.     /*    リサイズの時の処理        */
  1679.     else if( messId == MM_UPDATE )
  1680.     {
  1681.         MMI_SendMessage( kobj , MM_GETUSER , 2 , &org , &size ) ;
  1682.         MMI_SendMessage( kobj , MM_GETHYPER , 1 , &winhyp ) ;
  1683.  
  1684.     /*        ユーザー領域のリサイズ処理                                */
  1685.         /*     影とスクロールバーの分 内側によせる(SHADE_SIZE + BAR_SIZE)    */
  1686.         /*    SHADE_SIZE : GUI.H参照        BAR_SIZE : gratst.H参照            */
  1687.         org.rdwx = winhyp.fr.rdwx - 
  1688.                  ( SHADE_SIZE + BAR_SIZE ) - winhyp.fr.lupx - org.lupx + 1 ;
  1689.         org.rdwy = winhyp.fr.rdwy -
  1690.                  ( SHADE_SIZE + BAR_SIZE ) - winhyp.fr.lupy - org.lupy + 1 ;
  1691.         MMI_SendMessage( kobj , MM_SETUSER, 2, &org, &size );
  1692.  
  1693.     /*        スクロールバーのリサイズ処理                            */
  1694.         MMI_SendMessage( window[act].hscrollId , MM_GETHYPER , 1, &hschyp ) ;
  1695.         hschyp.fr.lupy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  1696.         hschyp.fr.rdwx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  1697.         hschyp.fr.rdwy = hschyp.fr.lupy + BAR_SIZE ;
  1698.         MMI_SendMessage( window[act].hscrollId , MM_SETHYPER , 1, &hschyp ) ;
  1699.  
  1700.         MMI_SendMessage( window[act].vscrollId , MM_GETHYPER , 1, &vschyp ) ;
  1701.         vschyp.fr.lupx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  1702.         vschyp.fr.rdwy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  1703.         vschyp.fr.rdwx = vschyp.fr.lupx + BAR_SIZE ;
  1704.         MMI_SendMessage( window[act].vscrollId , MM_SETHYPER , 1, &vschyp ) ;
  1705.  
  1706.     /*    スクロールバーの設定        */
  1707.         dx = window[act].dx ;
  1708.         dy = window[act].dy ;
  1709.         if( (dx - window[act].ox) < org.rdwx )
  1710.             window[act].ox = dx - org.rdwx ;
  1711.         if( (dy - window[act].oy) < org.rdwy )
  1712.             window[act].oy = dy - org.rdwy ;
  1713.         MMI_SendMessage( window[act].hscrollId, MM_SETSCROLL, 5, 
  1714.                     org.rdwx - 1 + window[act].ox, org.rdwx - 1, dx - 1,
  1715.                             org.rdwx, 1 ) ;
  1716.         MMI_SendMessage( window[act].vscrollId, MM_SETSCROLL, 5, 
  1717.                     org.rdwy - 1 + window[act].oy, org.rdwy - 1, dy - 1,
  1718.                             org.rdwy, 1 ) ;
  1719.  
  1720.         error = NOERR ;
  1721.     }
  1722.  
  1723.     /*    移動時の処理            */
  1724.     else if( messId == MM_MOVE )
  1725.     {
  1726.         error = NOERR ;
  1727.     }
  1728.  
  1729.     /*    mouseが押された時の処理            */
  1730.     else if( messId == MM_MOUSEON )
  1731.     {
  1732.         FRAME areaFrame ;    /* 領域指定の対角座表 */
  1733.  
  1734.         if( effectNum >= 0 && areaMode >= 0 )
  1735.         {
  1736.             switch( areaMode )
  1737.             {
  1738.             case 0:        /* ポリゴン指定 */
  1739.                 if( (ret = polygon1( actId, &areaFrame )) == NOERR )
  1740.                     polygon2() ;
  1741.                 break ;
  1742.             case 1:        /* 四角形指定 */
  1743.                 if( (ret = rectangle1( actId, &areaFrame )) == NOERR )
  1744.                     rectangle2() ;
  1745.                 break ;
  1746.             case 3:        /* 大きさ固定四角形指定 */
  1747.                 ret = fixRectangle( actId, &areaFrame ) ;
  1748.                 break ;
  1749.             case 2: /* 全画面指定はここで処理する(メリットはWGB関数が使えること) */
  1750.                 ret = 0 ;
  1751.                 MOS_rdpos(&sw,&x,&y) ;
  1752.                 if( sw == 0 )    /* ここで押してないのはやる気なし */
  1753.                 {
  1754.                     ret = -1 ;
  1755.                     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1756.                     break ;
  1757.                 } /* こうしないとwindow切り替え時にeffectが実行されてしまう */
  1758.                 MG_mosDisp( 2 );
  1759.                 EGB_color(guiEgbPtr,0,0x7fff);
  1760.                 EGB_paintMode(guiEgbPtr,0x222);
  1761.                 EGB_writeMode(guiEgbPtr,4);
  1762.                 WORD( para + 0 ) = - window[act].ox ;
  1763.                 WORD( para + 2 ) = - window[act].oy ;
  1764.                 WORD( para + 4 ) = - window[act].ox + window[act].dx - 1 ;
  1765.                 WORD( para + 6 ) = - window[act].oy + window[act].dy - 1 ;
  1766.                 WGB_rectangle(guiEgbPtr,para);
  1767.                 do
  1768.                 {
  1769.                     MOS_rdpos(&sw,&x,&y) ;
  1770.                     if( sw > 1 )ret = -1 ;
  1771.                 }while( sw ) ;
  1772.                 WGB_rectangle(guiEgbPtr,para);
  1773.                 EGB_writeMode(guiEgbPtr,0);
  1774.                 MG_mosDisp( 3 );
  1775.  
  1776.                 areaFrame.lupx = 0 ;    /* エリア指定は全画面に */
  1777.                 areaFrame.lupy = 0 ;
  1778.                 areaFrame.rdwx = window[act].dx - 1 ;
  1779.                 areaFrame.rdwy = window[act].dy - 1 ;
  1780.                 MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1781.                 break ;
  1782.             }
  1783.             if( ret == 0 )
  1784.             {
  1785.                 if( undoBuf == NULL )    /* アンドゥバッファがない */
  1786.                     makeUndoBuf() ;
  1787.  
  1788.                 if( undoBuf == NULL )
  1789.                 {
  1790.                     pushWaku() ;
  1791.                     errorCheck( OUT_OF_MEMORY ) ;    /* undoBufがない */
  1792.                     popWaku() ;
  1793.                 }
  1794.                 else
  1795.                 {
  1796.                     SetMouse32k( 81, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1797.                     ret = execEffect( areaFrame ) ;    /* effect実行ルーチンに */
  1798.                     SetMouse32k( 80, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1799.                     showWaku() ;
  1800.                     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1801.                     if( ret )
  1802.                     {
  1803.                         pushWaku() ;
  1804.                         errorCheck( ret ) ;
  1805.                         popWaku() ;
  1806.                     }
  1807.                 }
  1808.             }
  1809.         }
  1810.  
  1811.         error = NOERR ;
  1812.     }
  1813.  
  1814.     /*    消去の時の処理            */
  1815.     else if( messId == MM_ERASE )
  1816.     {
  1817.         /*    ウィンドウの表示枚数を1枚減らす        */
  1818.         windowflg-- ;
  1819.         if( windowflg == 0 )
  1820.         {
  1821.             if( undoLot )                    /* 1994 9 29 バグの個所と見る */
  1822.                 TL_freeLot( undoLot ) ;    /* 今までのアンドゥバッファはチャラ */
  1823.             undoLot =  0 ;    /* lot=0はsystemが利用しているので0はlot未取得に */
  1824.         }
  1825.         /*    表示してないことをしめすためwindowIdを負にする    */
  1826.         window[act].windowId = -(window[act].windowId) ;
  1827.         TL_freeLot( window[act].lot ) ;
  1828.         window[act].buf16m = NULL ;        /* 各バッファアドレスをNULLに */
  1829.         window[act].bufAlpha = NULL ;
  1830.         window[act].buf32k = NULL ;
  1831.         window[act].loadPath[0] = 0 ;    /* file名を消す */
  1832.         window[act].savePath[0] = 0 ;
  1833.  
  1834.         error = NOERR ;
  1835.     }
  1836.  
  1837.     /*    アクティブになった時の処理        */
  1838.     else if( messId == MM_WAKE )
  1839.     {
  1840.         actId = act ;
  1841.  
  1842.         makeUndoBuf() ;            /* アンドゥバッファ作成 */
  1843.  
  1844.         int x0, y0, x1, y1 ;    /* windowユーザエリア検出用変数 */
  1845.  
  1846.         MMI_SendMessage( kobj , MM_GETUSER , 2 , &org , &size ) ;
  1847.         MMI_SendMessage( kobj , MM_GETHYPER , 1 , &winhyp ) ;
  1848.         x0 = winhyp.fr.lupx + org.lupx ;
  1849.         y0 = winhyp.fr.lupy + org.lupy ;
  1850.         x1 = x0 + org.rdwx - 1 ;
  1851.         y1 = y0 + org.rdwy - 1 ;
  1852.  
  1853.         MOS_rdpos(&sw,&x,&y);
  1854.         if    /* ユーザエリア内でマウスが押されてる場合リリースまで待つ */
  1855.         (
  1856.             (x >= x0) && (x <= x1) &&
  1857.             (y >= y0) && (y <= y1)
  1858.         )
  1859.         {
  1860.             while( sw )
  1861.             {
  1862.                  MOS_rdpos(&sw,&x,&y) ;
  1863.             }
  1864.             MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1865.         }    /* こうしないとwindow切り替え時にeffectが実行されてしまう */
  1866.  
  1867.         error = NOERR ;
  1868.     }
  1869.  
  1870.     return error ;
  1871. }
  1872.  
  1873. /* ウインドウのスクロール操作時に呼ばれる関数 */
  1874. /*    initDataIGRWIN:vscrollId:MJ_SCRLL40の呼び出し関数    */
  1875. /*    initDataIGRWIN:hscrollId:MJ_SCRLL40の呼び出し関数    */
  1876. int    scrollFunc(kobj, messId, argc, pev, trigger)
  1877. int        kobj ;
  1878. int        messId ;
  1879. int        argc ;
  1880. EVENT    *pev ;
  1881. int        trigger ;
  1882. {
  1883.     int        prt , max , min , len , page ;
  1884.  
  1885.     if( kobj == window[actId].hscrollId )
  1886.     {
  1887.         MMI_SendMessage( window[actId].hscrollId, MM_GETSCROLL,
  1888.                                  5, &prt, &min, &max, &len, &page) ;
  1889.         window[actId].ox = prt - min ;
  1890.     }
  1891.     else if( kobj == window[actId].vscrollId )
  1892.     {
  1893.         MMI_SendMessage( window[actId].vscrollId, MM_GETSCROLL,
  1894.                                  5, &prt, &min, &max, &len, &page) ;
  1895.         window[actId].oy = prt - min ;
  1896.     }
  1897.  
  1898.     showActWindow() ;
  1899.  
  1900.     return NOERR ;
  1901. }
  1902.  
  1903. /* ウインドウユーザエリア再表示 */
  1904. static int showActWindow()
  1905. {
  1906.     char para[64] ;
  1907.     char *buf ;
  1908.  
  1909.     WINCLIP    *pwclp ;
  1910.     WINCLIP *pstackVisible ;
  1911.     WINCLIP    *pstackClip ;
  1912.     HYPER    hyp ;
  1913.     FRAME    oFr, sFr, cFr ;
  1914.     POINT    origin, dspOrigin ;
  1915.  
  1916.     if( window[actId].windowId < 0 )return NOERR ;
  1917.  
  1918.     /* クリップ枠,ビジブル枠をウインドウユーザエリア枠に設定 */
  1919.     MMI_SendMessage( window[actId].windowId, MM_GETHYPER, 1, &hyp ) ;
  1920.     MMI_SendMessage( window[actId].windowId, MM_GETUSER, 2, &oFr, &sFr ) ;
  1921.     cFr.lupx = dspOrigin.x = hyp.fr.lupx + oFr.lupx ;
  1922.     cFr.lupy = dspOrigin.y = hyp.fr.lupy + oFr.lupy ;
  1923.     cFr.rdwx = cFr.lupx + oFr.rdwx - 1 ;
  1924.     cFr.rdwy = cFr.lupy + oFr.rdwy - 1 ;
  1925.     MG_PushOrigin( &dspOrigin, &origin ) ;
  1926.     pwclp = WIN_getClipMemory( &cFr, NULL ) ;
  1927.     WIN_pushVisible( WIN_copyClip( pwclp ), &pstackVisible ) ;
  1928.     WIN_pushClip( pwclp, &pstackClip ) ;
  1929.  
  1930.     /* 再表示実行 */
  1931.     MG_mosDisp( 2 );
  1932.     buf = window[actId].buf32k ;
  1933.     if( buf != NULL )
  1934.     {
  1935.         EGB_writeMode(guiEgbPtr,0);    /* XORモードでここに入る場合もあるため */
  1936.         EGB_paintMode(guiEgbPtr,0x222);
  1937.  
  1938.         DWORD( para + 0 ) = (unsigned int)buf ;
  1939.         WORD( para + 4 ) = getds() ;
  1940.         WORD( para + 6 ) = - window[actId].ox ;
  1941.         WORD( para + 8 ) = - window[actId].oy ;
  1942.         WORD( para + 10 ) = - window[actId].ox + window[actId].dx - 1 ;
  1943.         WORD( para + 12 ) = - window[actId].oy + window[actId].dy - 1 ;
  1944.         WGB_putBlock( guiEgbPtr, 1, para ) ;
  1945.     }
  1946.     MG_mosDisp( 3 );
  1947.  
  1948.     /* クリップ枠,ビジブル枠を元に戻す */
  1949.     WIN_popClip( pstackClip ) ;
  1950.     WIN_popVisible( pstackVisible ) ;
  1951.     MG_PopOrigin( &origin ) ;
  1952.  
  1953.     return NOERR ;
  1954. }
  1955.  
  1956.  
  1957. /***** アンドゥ *****/
  1958.  
  1959. /* アンドゥバッファ作成 */
  1960. int makeUndoBuf()
  1961. {
  1962.     int dx, dy, ret ;
  1963.  
  1964.     dx = window[actId].dx ;
  1965.     dy = window[actId].dy ;
  1966.  
  1967.     /* undoBuf */
  1968.     if( undoLot )
  1969.     {
  1970.         TL_freeLot( undoLot ) ;    /* 今までのバッファはチャラに */
  1971.         undoLot =  0 ;    /* lot=0はsystemが利用しているので0はlot未取得に */
  1972.     }
  1973.     undoLot =  TL_getLot() ;
  1974.     undoBuf = (char *)TL_mallocMemory( undoLot, dx * dy * 4 ) ;
  1975.                         /* NULLだとeffectルーチンは作業を始めない */
  1976.  
  1977.     if( undoBuf )    /* 残りMEMORYが少ないときはやめ */
  1978.     {
  1979.         if( checkMemory() < MinMem )
  1980.         {
  1981.             TL_freeLot( undoLot ) ;
  1982.             undoLot =  0 ;
  1983.             undoBuf = NULL ;
  1984.         }
  1985.     }
  1986.     else    /* 元々だめなら全部なかったことに */
  1987.     {
  1988.         if( undoLot )
  1989.         {
  1990.             TL_freeLot( undoLot ) ;
  1991.             undoLot =  0 ;
  1992.             undoBuf = NULL ;
  1993.         }
  1994.     }
  1995.  
  1996.     if( undoBuf != NULL )
  1997.     {
  1998.         alphaBuf = undoBuf + dx * dy * 3 ;
  1999.         if( window[actId].buf16m )
  2000.         {
  2001.             trans( window[actId].buf16m, undoBuf, dx*dy*3 ) ;
  2002.             trans( window[actId].bufAlpha, alphaBuf, dx*dy ) ;
  2003.         }
  2004.         ret = NOERR ;
  2005.     }
  2006.     else
  2007.     {
  2008.         alphaBuf = NULL ;
  2009.         ret = OUT_OF_MEMORY ;
  2010.     }
  2011.  
  2012.     return ret ;
  2013. }
  2014.  
  2015. /* アンドゥ関数 */
  2016. /*    initDataIGRDSK:effectUndoMItemId:MJ_MITEML40の呼び出し関数    */
  2017. int    undoFunc(kobj, messId, argc, pev, trigger)
  2018. int        kobj ;
  2019. int        messId ;
  2020. int        argc ;
  2021. EVENT    *pev ;
  2022. int        trigger ;
  2023. {
  2024.     if( windowflg && window[actId].buf16m && undoBuf )
  2025.     {
  2026.         int dx, dy ;
  2027.  
  2028.         SetMouse32k( 81, 0x7fff, 0x0 ) ;    /* マウスカーソルwait表示 */
  2029.  
  2030.         dx = window[actId].dx ;
  2031.         dy = window[actId].dy ;
  2032.  
  2033.         transExg( undoBuf, window[actId].buf16m, dx*dy*3 ) ;
  2034.         transExg( alphaBuf, window[actId].bufAlpha, dx*dy ) ;
  2035.         cov16mTo32k( window[actId].buf16m, window[actId].buf32k, dx*dy ) ;
  2036.  
  2037.         showActWindow() ;
  2038.  
  2039.         SetMouse32k( 80, 0x7fff, 0x0 ) ;    /* マウスカーソル表示変更 */
  2040.     }
  2041.  
  2042.     return NOERR ;
  2043. }
  2044.  
  2045.  
  2046.  
  2047. /*
  2048.  ************************
  2049.  *        汎用ルーチン    *
  2050.  ************************
  2051. */
  2052.  
  2053. /* Window新規作成 */
  2054. /* 引数 タイトル,パス名,ロット,1600万色バッファ,32k色バッファ,絵の横幅,縦幅 */
  2055. static int geneWindow( char *title, char *path, int lot,
  2056. char *buf16m, char *bufAlpha, char *buf32k, int dx, int dy )
  2057. {
  2058.     int        no ;
  2059.     int        wid;    /*    ウィンドウ            */
  2060.     int        vsid;    /*    スクロールバー        */
  2061.     int        hsid;    /*    スクロールバー        */
  2062.     HYPER    winhyp ;
  2063.     HYPER    vschyp ;
  2064.     HYPER    hschyp ;
  2065.     FRAME        org ;
  2066.     FRAME        size ;
  2067.  
  2068.     /*    ウィンドウをこれ以上表示できない */
  2069.     if( windowflg == WINCOUNT )
  2070.         return OUT_OF_WINDOW ;
  2071.  
  2072.     /*    何番目のウィンドウが表示できるか調べる        */
  2073.     for( no = 0 ; no < WINCOUNT ; no++ )
  2074.         if( window[no].windowId < 0 )
  2075.             break ;
  2076.  
  2077.     actId = no;
  2078.     window[no].windowId = -(window[no].windowId) ;
  2079.     wid = window[no].windowId ;
  2080.     vsid = window[no].vscrollId ;
  2081.     hsid = window[no].hscrollId ;
  2082.  
  2083.     _rstrncpy( window[no].loadPath, path, 80 ) ;    /* パス名をcopy */
  2084.     window[no].lot = lot ;
  2085.     window[no].buf16m = buf16m ;
  2086.     window[no].bufAlpha = bufAlpha ;
  2087.     window[no].buf32k = buf32k ;
  2088.     window[no].dx = dx ;
  2089.     window[no].dy = dy ;
  2090.     window[no].ox = 0 ;
  2091.     window[no].oy = 0 ;
  2092.  
  2093.     /*    もとの大きさを取得    */
  2094.     MMI_SendMessage( windowId , MM_GETHYPER , 1 , &winhyp );
  2095.     MMI_SendMessage( vscrollId , MM_GETHYPER , 1 , &vschyp );
  2096.     MMI_SendMessage( hscrollId , MM_GETHYPER , 1 , &hschyp );
  2097.     MMI_SendMessage( windowId , MM_GETUSER , 2 , &org , &size );
  2098.  
  2099.     /* 小さい絵のときはウインドウのサイズを縮める */
  2100.     if( dx < org.rdwx )
  2101.     {
  2102.         org.rdwx = dx ;
  2103.         winhyp.fr.rdwx = org.rdwx
  2104.                + ( SHADE_SIZE + BAR_SIZE ) + winhyp.fr.lupx + org.lupx - 1 ;
  2105.     }
  2106.     if( dy < org.rdwy )
  2107.     {
  2108.         org.rdwy = dy ;
  2109.         winhyp.fr.rdwy = org.rdwy
  2110.                + ( SHADE_SIZE + BAR_SIZE ) + winhyp.fr.lupy + org.lupy - 1 ;
  2111.     }
  2112.     size.rdwx = dx + ( SHADE_SIZE + BAR_SIZE ) + org.lupx ;
  2113.     size.rdwy = dy + ( SHADE_SIZE + BAR_SIZE ) + org.lupy ;
  2114.  
  2115.     /*        スクロールバーのリサイズ処理                            */
  2116.     vschyp.fr.lupx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  2117.     vschyp.fr.rdwy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  2118.     vschyp.fr.rdwx = vschyp.fr.lupx + BAR_SIZE ;
  2119.  
  2120.     hschyp.fr.lupy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  2121.     hschyp.fr.rdwx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  2122.     hschyp.fr.rdwy = hschyp.fr.lupy + BAR_SIZE ;
  2123.  
  2124.     /* ウインドウの大きさの設定 */
  2125.     MMI_SendMessage( window[no].windowId , MM_SETHYPER , 1 , &winhyp ) ;
  2126.     MMI_SendMessage( window[no].vscrollId , MM_SETHYPER , 1 , &vschyp ) ;
  2127.     MMI_SendMessage( window[no].hscrollId , MM_SETHYPER , 1 , &hschyp ) ;
  2128.     MMI_SendMessage( window[no].windowId , MM_SETUSER , 2 , &org , &size ) ;
  2129.  
  2130.     /*    それぞれの部品をくっつける        */
  2131.     MMI_SendMessage( vsid , MM_ATTACH , 1 , wid );
  2132.     MMI_SendMessage( hsid , MM_ATTACH , 1 , wid );
  2133.     MMI_SendMessage( wid , MM_ATTACH , 1 , baseDialogId ) ;
  2134.  
  2135.     /*    ウィンドウのタイトルを設定する            */
  2136.     _rstrncpy( window[no].name , title , 20 ) ;
  2137.     window[no].name[19] = 0 ;
  2138.     MMI_SendMessage( wid , MM_SETMSG , 1 , window[no].name ) ;
  2139.  
  2140.     /*    スクロールバーの値を設定する            */
  2141.     MMI_SendMessage( hsid , MM_SETSCROLL , 5 , 
  2142.                         org.rdwx - 1, org.rdwx - 1, dx - 1,
  2143.                             org.rdwx, 1 ) ;
  2144.     MMI_SendMessage( vsid , MM_SETSCROLL , 5 , 
  2145.                         org.rdwy - 1, org.rdwy - 1, dy - 1,
  2146.                             org.rdwy, 1 ) ;
  2147.  
  2148.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  2149.  
  2150.     /*    ウィンドウをアクティブにして表示する        */
  2151.     MMI_SendMessage( window[no].windowId , MM_WAKE , 0 ) ;
  2152.     MMI_SendMessage( window[no].windowId , MM_SHOW , 0 ) ;
  2153.  
  2154.     /*    ウィンドウの表示枚数を1枚増やす        */
  2155.     windowflg++ ;
  2156.  
  2157.     return NOERR ;
  2158. }
  2159.  
  2160. /* カーソルが表示領域に来るようにスクロールさせる */
  2161. setDisplayArea( int x, int y )
  2162. {
  2163.     if( outMode == 0 )return NOERR ;
  2164.  
  2165.     if( (x - outLupx) > (boundWidth/2-1) )
  2166.     {
  2167.         outLupx = x - (boundWidth/2-1) ;
  2168.     }
  2169.     if( outLupx > x )
  2170.     {
  2171.         outLupx = x ;
  2172.     }
  2173.     if( (y - outLupy) > 239 )
  2174.     {
  2175.         outLupy = y - 239 ;
  2176.     }
  2177.     if( outLupy > y )
  2178.     {
  2179.         outLupy = y ;
  2180.     }
  2181.  
  2182.     if( outLupx < 0 )outLupx = 0 ;
  2183.     if( outLupy < 0 )outLupy = 0 ;
  2184.     if( outLupx > (boundWidth/2) )outLupx = (boundWidth/2) ;
  2185.     if( outLupy > 240 )outLupy = 240 ;
  2186.     EGB_displayStart( guiEgbPtr, 1, outLupx, outLupy ) ;
  2187.  
  2188.     return NOERR ;
  2189. }
  2190.  
  2191. /* ウィンドウ番号noを基準としたポリゴンor四角形指定 */
  2192.  
  2193. static polygonLupx, polygonLupy ;
  2194.  
  2195. /* ポリゴン指定を実行しポリゴンの形をXORで描いて残しておく */
  2196. polygon1( int no, FRAME *fr )
  2197. {
  2198.     FRAME org, size ;
  2199.     HYPER winhyp ;
  2200.     char para[64] ;
  2201.     int ret ;
  2202.     int lux, luy, rdx, rdy ;
  2203.  
  2204.     if( window[no].windowId < 0 )return -1 ;
  2205.     MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
  2206.     MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;
  2207.  
  2208.     polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
  2209.     polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;
  2210.  
  2211.     WORD( para + 0 ) = 0 ;
  2212.     WORD( para + 2 ) = 0 ;
  2213. //    WORD( para + 4 ) = 511 ;
  2214.     WORD( para + 4 ) = 639 ;
  2215.     WORD( para + 6 ) = 479 ;
  2216.     EGB_viewport( guiEgbPtr, para ) ;
  2217.  
  2218.  
  2219. //    polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2220. //                                512, 480, 0x7fff, setDisplayArea ) ;
  2221.     polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2222.                                 640, 480, 0x7fff, setDisplayArea ) ;
  2223.     /* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */
  2224.  
  2225.     MG_mosDisp( 0 );
  2226.     ret = polygon_1st( &lux, &luy, &rdx, &rdy ) ;
  2227.     MG_mosDisp( 1 );
  2228.  
  2229.     fr->lupx = lux - polygonLupx ;
  2230.     fr->lupy = luy - polygonLupy ;
  2231.     fr->rdwx = rdx - polygonLupx ;
  2232.     fr->rdwy = rdy - polygonLupy ;
  2233.  
  2234.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  2235.  
  2236.     return ret ;
  2237. }
  2238.  
  2239. /* ポリゴンの形をXORで描く */
  2240. polygon2()
  2241. {
  2242.     MG_mosDisp( 0 );
  2243.     polygon_2nd() ;
  2244.     MG_mosDisp( 1 );
  2245.  
  2246.     return NOERR ;
  2247. }
  2248.  
  2249. /* 四角形指定を実行し四角形の形をXORで描いて残しておく */
  2250. rectangle1( int no, FRAME *fr )
  2251. {
  2252.     FRAME org, size ;
  2253.     HYPER winhyp ;
  2254.     char para[64] ;
  2255.     int ret ;
  2256.     int lux, luy, rdx, rdy ;
  2257.  
  2258.     if( window[no].windowId < 0 )return -1 ;
  2259.     MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
  2260.     MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;
  2261.  
  2262.     polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
  2263.     polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;
  2264.  
  2265.     WORD( para + 0 ) = 0 ;
  2266.     WORD( para + 2 ) = 0 ;
  2267. //    WORD( para + 4 ) = 511 ;
  2268.     WORD( para + 4 ) = 639 ;
  2269.     WORD( para + 6 ) = 479 ;
  2270.     EGB_viewport( guiEgbPtr, para ) ;
  2271.  
  2272. //    polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2273. //                                512, 480, 0x7fff, setDisplayArea ) ;
  2274.     polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2275.                                 640, 480, 0x7fff, setDisplayArea ) ;
  2276.     /* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */
  2277.  
  2278.     MG_mosDisp( 0 );
  2279.     ret = rectangle_1st( &lux, &luy, &rdx, &rdy ) ;
  2280.     MG_mosDisp( 1 );
  2281.  
  2282.     fr->lupx = lux - polygonLupx ;
  2283.     fr->lupy = luy - polygonLupy ;
  2284.     fr->rdwx = rdx - polygonLupx ;
  2285.     fr->rdwy = rdy - polygonLupy ;
  2286.  
  2287.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  2288.  
  2289.     return ret ;
  2290. }
  2291.  
  2292. /* ポリゴンの形をXORで描く */
  2293. rectangle2()
  2294. {
  2295.     MG_mosDisp( 0 );
  2296.     rectangle_2nd() ;
  2297.     MG_mosDisp( 1 );
  2298.  
  2299.     return NOERR ;
  2300. }
  2301.  
  2302. /* ポリゴンor四角形の領域判定値を取得(領域内なら1 外なら0) */
  2303. static getArea( x, y )
  2304. {
  2305.     return polygon_rectangle_read( x + polygonLupx, y + polygonLupy ) ;
  2306. }
  2307.  
  2308. /* 大きさ固定の長方形指定を実行し左上の座標を得る */
  2309. fixRectangle( int no, FRAME *fr )
  2310. {
  2311.     FRAME org, size ;
  2312.     HYPER winhyp ;
  2313.     char para[64] ;
  2314.     int ret ;
  2315.     int lux, luy ;
  2316.  
  2317.     if( window[no].windowId < 0 )return -1 ;
  2318.     MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
  2319.     MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;
  2320.  
  2321.     polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
  2322.     polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;
  2323.  
  2324.     WORD( para + 0 ) = 0 ;
  2325.     WORD( para + 2 ) = 0 ;
  2326. //    WORD( para + 4 ) = 511 ;
  2327.     WORD( para + 4 ) = 639 ;
  2328.     WORD( para + 6 ) = 479 ;
  2329.     EGB_viewport( guiEgbPtr, para ) ;
  2330.  
  2331. //    polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2332. //                                512, 480, 0x7fff, setDisplayArea ) ;
  2333.     polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2334.                                 640, 480, 0x7fff, setDisplayArea ) ;
  2335.     /* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */
  2336.  
  2337.     MG_mosDisp( 0 );
  2338.     ret = fixRectangle_1st( fixRectangleLx, fixRectangleLy, &lux, &luy ) ;
  2339.     MG_mosDisp( 1 );
  2340.  
  2341.     lux = lux - polygonLupx ;
  2342.     luy = luy - polygonLupy ;
  2343.  
  2344.     if( lux+fixRectangleLx-1 < 0 )ret = -1 ;    /* 完全にはみだし */
  2345.     if( luy+fixRectangleLy-1 < 0 )ret = -1 ;
  2346.     if( lux > window[no].dx-1 )ret = -1 ;
  2347.     if( luy > window[no].dy-1 )ret = -1 ;
  2348.  
  2349.     fr->lupx = lux ;
  2350.     fr->lupy = luy ;
  2351.     fr->rdwx = lux ;
  2352.     fr->rdwy = luy ;
  2353.  
  2354.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  2355.  
  2356.     return ret ;
  2357. }
  2358.  
  2359. /* 残りメモリをチェック */
  2360. static int checkMemory()
  2361. {
  2362. /*
  2363.     int ph, lg ;
  2364.  
  2365.     ph = TL_checkMemory( 0 ) ;
  2366.     lg = TL_checkMemory( 2 ) ;
  2367.  
  2368.     return (( ph < lg ) ? ph : lg )*4096 ;
  2369. */
  2370.     return TL_checkMemory( 1 )*4096 ;
  2371. }
  2372.  
  2373. /* 転送 buf1 → buf2 n Byte */
  2374. static int trans( char *buf1, char *buf2, int n )
  2375. {
  2376.     int i, j, n1, n2 ;
  2377.  
  2378.     n1 = ( n / 4 ) << 2 ;
  2379.     n2 = n % 4 ;
  2380.     for( i=0 ; i<n1 ; i += 4 )
  2381.         DWORD( buf2 + i ) = DWORD( buf1 + i ) ;
  2382.     if( n2 )
  2383.         for( j=0 ; j<n2 ; j++ )
  2384.             BYTE( buf2 + i + j ) = BYTE( buf1 + i + j ) ;
  2385.     return NOERR ;
  2386. }
  2387.  
  2388. /* 交換 buf1 ←→ buf2 n Byte */
  2389. static int transExg( char *buf1, char *buf2, int n )
  2390. {
  2391.     int i, j, n1, n2, temp ;
  2392.  
  2393.     n1 = ( n / 4 ) << 2 ;
  2394.     n2 = n % 4 ;
  2395.     for( i=0 ; i<n1 ; i += 4 )
  2396.     {
  2397.         temp = DWORD( buf1 + i ) ;
  2398.         DWORD( buf1 + i ) = DWORD( buf2 + i ) ;
  2399.         DWORD( buf2 + i ) = temp ;
  2400.     }
  2401.     if( n2 )
  2402.         for( j=0 ; j<n2 ; j++ )
  2403.         {
  2404.             temp = BYTE( buf1 + i + j ) ;
  2405.             BYTE( buf1 + i + j ) = BYTE( buf2 + i + j ) ;
  2406.             BYTE( buf2 + i + j ) = temp ;
  2407.         }
  2408.     return NOERR ;
  2409. }
  2410.  
  2411. /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  2412. file_kakuchousi_set( fullname, name, kakuchou )
  2413. char fullname[], name[], kakuchou[];
  2414. {
  2415.     int i;
  2416.  
  2417.     for( i=0 ; i<76 ; i++ ){
  2418.         fullname[i] = name[i];
  2419.         if( name[i] == '.' || name[i] == (char)0 )goto mov01;
  2420.     }
  2421.     return ILLEGAL_FILENAME;        /* bad file name */
  2422. mov01:    if( i == 0 )return ILLEGAL_FILENAME;
  2423.     if( name[i-1] == '\\' )return ILLEGAL_FILENAME;
  2424.     DWORD( fullname + i ) = DWORD( kakuchou );
  2425.     fullname[i+4] = (char)0;
  2426.     return NOERR;
  2427. }
  2428.  
  2429. /*    ファイル選択    */
  2430. int    fileSelecter( path, ExtStr, title, exec, cncl )
  2431. char    *path ;
  2432. char    **ExtStr ;
  2433. char    *title ;
  2434. char    *exec ;
  2435. char    *cncl ;
  2436. {
  2437.     char pathName[100], name[20] ;
  2438.     int                 i, j, n ;
  2439.     unsigned int    MSlctCnt ;
  2440.     int          Atr, ret, ret2 ;
  2441.     FRAME                 Frm ;
  2442.     int             alertobj ;
  2443.  
  2444.     ret2 = NOERR ;
  2445.  
  2446.     FDG_GetFrame( &Frm ) ;    /* センタリング */
  2447.     Frm.lupx = 256 - ( Frm.rdwx - Frm.lupx ) / 2 ;
  2448.     Frm.lupy = 240 - ( Frm.rdwy - Frm.lupy ) / 2 ;
  2449.     FDG_SetFrame( Frm ) ;
  2450.     /* センタリングの後fileSubDialogIdをデタッチすると,位置がずれない */
  2451.     MMI_SendMessage( fileSubDialogId, MM_DETACH, 0 ) ;
  2452.  
  2453.     n = 0 ;
  2454.     for( i=0 ; i<79 ; i++ )
  2455.     {
  2456.         pathName[i] = path[i] ;
  2457.         if( path[i] == '\\' )
  2458.             n++ ;
  2459.         if( path[i] == '\0' )
  2460.             break ;
  2461.     }
  2462.     if( n <= 1 )
  2463.     {
  2464.         for( i=i ; i>=0 ; i-- )
  2465.         {
  2466.             if( path[i] == '\\' )
  2467.             {
  2468.                 i++ ;
  2469.                 pathName[i] = '\0' ;
  2470.                 break ;
  2471.             }
  2472.         }
  2473.         for( j=0 ; j<13 ; j++ )
  2474.         {
  2475.             name[j] = path[i+j] ;
  2476.         }
  2477.     }
  2478.     else
  2479.     {
  2480.         for( i=i ; i>=0 ; i-- )
  2481.         {
  2482.             if( path[i] == '\\' )
  2483.             {
  2484.                 pathName[i] = '\0' ;
  2485.                 break ;
  2486.             }
  2487.         }
  2488.         for( j=0 ; j<13 ; j++ )
  2489.         {
  2490.             name[j] = path[i+1+j] ;
  2491.         }
  2492.     }
  2493.  
  2494.     ret = FDG_SetFileText( name ) ;
  2495.     ret = FDG_SetTitle( title, exec, cncl ) ;
  2496.  
  2497.     alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避     */
  2498.     MMI_SetAlertObj( FDG_GetMainID() ) ;
  2499.     ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY,
  2500.          pathName, ExtStr,    &MSlctCnt) ;    /* LOAD時にはテキストをださない */
  2501.     if( ret < 0 )    /* PATHが間違ってる場合はカレントディレクトリで */
  2502.     {
  2503.         name[0] = '\0' ;
  2504.         ret = FDG_SetFileText( name ) ;
  2505.         ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY,
  2506.              NULL, ExtStr,    &MSlctCnt) ;
  2507.     }
  2508.     MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す        */
  2509.  
  2510.     if( (ret == 1) && (MSlctCnt > 0) )    /*    正しくファイル名を収得したか?    */
  2511.     {
  2512.         FDG_GetPathName( path, &Atr, 0 ) ;
  2513.     }
  2514.     else
  2515.     {
  2516.         ret2 = 1 ;
  2517.     }
  2518.     return ret2 ;
  2519. }
  2520.  
  2521. /*    ファイル選択オプション付き    */
  2522. int    fileSelecter2( path, ExtStr, title, exec, cncl )
  2523. char    *path ;
  2524. char    **ExtStr ;
  2525. char    *title ;
  2526. char    *exec ;
  2527. char    *cncl ;
  2528. {
  2529.     char pathName[100], name[20] ;
  2530.     int                 i, j, n ;
  2531.     unsigned int    MSlctCnt ;
  2532.     int          Atr, ret, ret2 ;
  2533.     FRAME                  Frm ;
  2534.     int               baseId ;
  2535.     int             alertobj ;
  2536.  
  2537.     ret2 = NOERR ;
  2538.  
  2539.     FDG_GetFrame( &Frm ) ;    /* センタリング */
  2540.     Frm.lupx = 256 - ( Frm.rdwx - Frm.lupx ) / 2 ;
  2541.     Frm.lupy = 240 - ( Frm.rdwy - Frm.lupy ) / 2 ;
  2542.     FDG_SetFrame( Frm ) ;
  2543.     /* センタリングの後fileSubDialogIdをアタッチすると,位置がずれない */
  2544.     baseId = FDG_GetMainID() ;
  2545.     MMI_SendMessage( fileSubDialogId, MM_ATTACH, 1, baseId ) ;
  2546.     MTL_setFlagObj( fileBtnId[saveMode], (MS_UNSELECT | MS_TOGGLE) ) ;
  2547.     if( saveCompMode )
  2548.         MTL_setFlagObj( fileBtnId[2], MS_TOGGLE ) ;
  2549.     else
  2550.         MTL_resetFlagObj( fileBtnId[2], (~MS_TOGGLE) ) ;
  2551.  
  2552.     n = 0 ;
  2553.     for( i=0 ; i<79 ; i++ )
  2554.     {
  2555.         pathName[i] = path[i] ;
  2556.         if( path[i] == '\\' )
  2557.             n++ ;
  2558.         if( path[i] == '\0' )
  2559.             break ;
  2560.     }
  2561.     if( n <= 1 )
  2562.     {
  2563.         for( i=i ; i>=0 ; i-- )
  2564.         {
  2565.             if( path[i] == '\\' )
  2566.             {
  2567.                 i++ ;
  2568.                 pathName[i] = '\0' ;
  2569.                 break ;
  2570.             }
  2571.         }
  2572.         for( j=0 ; j<13 ; j++ )
  2573.         {
  2574.             name[j] = path[i+j] ;
  2575.         }
  2576.     }
  2577.     else
  2578.     {
  2579.         for( i=i ; i>=0 ; i-- )
  2580.         {
  2581.             if( path[i] == '\\' )
  2582.             {
  2583.                 pathName[i] = '\0' ;
  2584.                 break ;
  2585.             }
  2586.         }
  2587.         for( j=0 ; j<13 ; j++ )
  2588.         {
  2589.             name[j] = path[i+1+j] ;
  2590.         }
  2591.     }
  2592.  
  2593.     ret = FDG_SetFileText( name ) ;
  2594.     ret = FDG_SetTitle( title, exec, cncl ) ;
  2595.  
  2596.     alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避     */
  2597.     MMI_SetAlertObj( FDG_GetMainID() ) ;
  2598.     ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
  2599.          pathName, ExtStr,    &MSlctCnt) ;
  2600.     if( ret < 0 )    /* PATHが間違ってる場合はカレントディレクトリで */
  2601.     {
  2602.         name[0] = '\0' ;
  2603.         ret = FDG_SetFileText( name ) ;
  2604.         ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
  2605.              NULL, ExtStr,    &MSlctCnt) ;
  2606.     }
  2607.     MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す        */
  2608.  
  2609.     if( (ret == 1) && (MSlctCnt > 0) )    /*    正しくファイル名を収得したか?    */
  2610.     {
  2611.         FDG_GetPathName( path, &Atr, 0 ) ;
  2612.     }
  2613.     else
  2614.     {
  2615.         ret2 = 1 ;
  2616.     }
  2617.     return ret2 ;
  2618. }
  2619.  
  2620. /* 色数モードの設定 */
  2621. /*    initDataIGRFILE:fileBtnId[0]:MJ_TICONL40の呼び出し関数    */
  2622. /*    initDataIGRFILE:fileBtnId[1]:MJ_TICONL40の呼び出し関数    */
  2623. int    fileModeSet(kobj, messId, argc, pev, trigger)
  2624. int        kobj ;
  2625. int        messId ;
  2626. int        argc ;
  2627. EVENT    *pev ;
  2628. int        trigger ;
  2629. {
  2630.     int i ;
  2631.  
  2632.     for( i=0 ; i<2 ; i++ )
  2633.     {
  2634.         if( kobj == fileBtnId[i] )
  2635.             break ;
  2636.     }
  2637.     if( i < 2 )
  2638.     {
  2639.         MTL_setFlagObj( fileBtnId[i], MS_UNSELECT ) ;
  2640.         MTL_resetFlagObj( fileBtnId[saveMode],
  2641.                             (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  2642.         MMI_SendMessage( fileBtnId[saveMode], MM_SHOW, 0 ) ;
  2643.         saveMode = i ;
  2644.     }
  2645.     return NOERR ;
  2646. }
  2647.  
  2648. /* 圧縮モードの設定 */
  2649. /*    initDataIGRFILE:fileBtnId[2]:MJ_TICONL40の呼び出し関数    */
  2650. int    fileCompModeSet(kobj, messId, argc, pev, trigger)
  2651. int        kobj ;
  2652. int        messId ;
  2653. int        argc ;
  2654. EVENT    *pev ;
  2655. int        trigger ;
  2656. {
  2657.     if( MTL_checkFlagObj( kobj, MS_TOGGLE ) )
  2658.         saveCompMode = 1 ;
  2659.     else
  2660.         saveCompMode = 0 ;
  2661.     return NOERR ;
  2662. }
  2663.  
  2664. /*    パレット設定 (これは16色モード専用のもので32k色では使わない)    */
  2665. int    setTmenuPalette()
  2666. {
  2667.     char    para[16*8+4] ;
  2668.     int        ptr ;
  2669.  
  2670.     ptr = 4 ;
  2671.  
  2672.     void     set1Pal( int col, int b, int r, int g )
  2673.     {
  2674.         DWORD(para + ptr) = col ;
  2675.         BYTE(para + ptr + 4) = b * 16 ;
  2676.         BYTE(para + ptr + 5) = r * 16 ;
  2677.         BYTE(para + ptr + 6) = g * 16 ;
  2678.         BYTE(para + ptr + 7) = 0 ;
  2679.         ptr += 8 ;
  2680.     }
  2681.  
  2682.     DWORD(para + 0) = 16 ;
  2683.     set1Pal( 0, 0, 0, 0 ) ;
  2684.     set1Pal( 1, 4, 4, 8 ) ;
  2685.     set1Pal( 2, 4, 12, 6 ) ;
  2686.     set1Pal( 3, 5, 5, 5 ) ;        //         set1Pal( 3, 10, 15, 12 ) ;
  2687.     set1Pal( 4, 9, 9, 9 ) ;
  2688.     set1Pal( 5, 7, 0, 12 ) ;
  2689.     set1Pal( 6, 12, 12, 12 ) ;
  2690.     set1Pal( 7, 7, 7, 7 ) ;
  2691.     set1Pal( 8, 2, 2, 2 ) ;
  2692.     set1Pal( 9, 8, 10, 12 ) ;    /* file selector */
  2693.     set1Pal( 10, 0, 13, 0 ) ;
  2694.     set1Pal( 11, 10, 0, 0 ) ;
  2695.     set1Pal( 12, 0, 0, 15 ) ;
  2696.     set1Pal( 13, 15, 0, 15 ) ;
  2697.     set1Pal( 14, 0, 15, 13 ) ;
  2698.     set1Pal( 15, 15, 15, 15 ) ;
  2699.  
  2700.     EGB_setTmenuPalette( para ) ;
  2701.  
  2702.     return NOERR ;
  2703. }
  2704.  
  2705. /* スリープ時の設定 */
  2706. int sleepSet()
  2707. {
  2708.     /*    拡大表示中は元にもどす    */
  2709.     if( outMode )
  2710.         displayOutFunc( outIconId ) ;
  2711.  
  2712.     hookEnd() ;
  2713.     return NOERR ;
  2714. }
  2715.  
  2716. /* 起こされた時の設定 */
  2717. int wakeSet()
  2718. {
  2719.     hookStart() ;
  2720.     return NOERR ;
  2721. }
  2722.  
  2723. /*    終了処理    */
  2724. int    quitFunc()
  2725. {
  2726.     hookEnd() ;
  2727.     g_fft2_clr() ;    /* fft ルーチン終了 */
  2728.     MMI_SetHaltFlag( TRUE ) ;
  2729.     return NOERR ;
  2730. }
  2731.  
  2732. /*    終了可能なら終了する処理    */
  2733. int    quitFunc2()
  2734. {
  2735.     if( MTL_checkAtrObj( baseDialogId, MS_DSPONLYL40 ) == 0 )
  2736.     {
  2737.         hookEnd() ;
  2738.         g_fft2_clr() ;    /* fft ルーチン終了 */
  2739.         MMI_SetHaltFlag( TRUE ) ;
  2740.         return NOERR ;
  2741.     }
  2742.     return ILLEGAL_FUNCTION ;
  2743. }
  2744.  
  2745. /*    あばうと表示    */
  2746. int    aboutFunc()
  2747. {
  2748.     MMI_SendMessage( aboutNumId, MM_SETNUMBOX, 5,
  2749.              checkMemory(), 0, 0x7fffffff, 1, 0 ) ;
  2750.  
  2751.     MMI_SendMessage( alertId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  2752.     MMI_SendMessage( alertId, MM_SHOW, 0 ) ;
  2753.     return NOERR ;
  2754. }
  2755.  
  2756. /*    あばうと表示確認    */
  2757. int    aboutOKFunc(kobj, messId, argc, pev, trigger)
  2758. int        kobj ;
  2759. int        messId ;
  2760. int        argc ;
  2761. EVENT    *pev ;
  2762. int        trigger ;
  2763. {
  2764.     MMI_SendMessage( alertId, MM_ERASE, 0 ) ;
  2765.     MMI_SendMessage( alertId, MM_DETACH, 0 ) ;
  2766.     return NOERR ;
  2767. }
  2768.  
  2769. /* error 表示ルーチン */
  2770. int errorCheck(number)
  2771. int number;
  2772. {
  2773. /*
  2774. #define    OUT_OF_MEMORY        7
  2775. #define    ILLEGAL_FILENAME    55
  2776. #define    ILLEGAL_DATA        58
  2777. #define    CANT_LOAD            1
  2778. #define    READ_FAIL            1
  2779. #define    CANT_SAVE            2
  2780. #define    WRITE_FAIL            2
  2781. #define    OUT_OF_WINDOW        1001
  2782. #define    NO_WINDOW            1002
  2783. */
  2784.  
  2785.     MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2786.          "エラーが発生しました。" ) ;
  2787.     if( number == OUT_OF_MEMORY )
  2788.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2789.          "メモリが足りません。" ) ;
  2790.     if( number == ILLEGAL_FILENAME )
  2791.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2792.          "ファイル名が正しくありません。" ) ;
  2793.     if( number == ILLEGAL_DATA )
  2794.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2795.          "未知のデータ形式です。" ) ;
  2796.     if( number == READ_FAIL )
  2797.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2798.          "ロードできませんでした。" ) ;
  2799.     if( number == WRITE_FAIL )
  2800.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2801.          "セーブできませんでした。" ) ;
  2802.     if( number == OUT_OF_WINDOW )
  2803.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2804.          "これ以上ウィンドウは開けません。" ) ;
  2805.     if( number == NO_WINDOW )
  2806.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2807.          "ウィンドウが開かれてません。" ) ;
  2808.  
  2809.     int wakeObj ;
  2810.  
  2811.     wakeObj = MMI_GetWakeObj() ;
  2812.     MMI_SetWakeObj( UNUSED ) ;
  2813.  
  2814.     MMI_SendMessage( errorId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  2815.     MMI_SendMessage( errorId, MM_SHOW, 0 ) ;
  2816.  
  2817.     MMI_ExecSystem() ;
  2818.  
  2819.     MMI_SendMessage( errorId, MM_ERASE, 0 ) ;
  2820.     MMI_SendMessage( errorId, MM_DETACH, 0 ) ;
  2821.  
  2822.     MMI_SetWakeObj( wakeObj ) ;
  2823.  
  2824.     return NOERR;
  2825. }
  2826.  
  2827. /*    エラー表示確認    */
  2828. int    errorOKFunc(kobj, messId, argc, pev, trigger)
  2829. int        kobj ;
  2830. int        messId ;
  2831. int        argc ;
  2832. EVENT    *pev ;
  2833. int        trigger ;
  2834. {
  2835.     MMI_SetHaltFlag( TRUE ) ;
  2836.     return NOERR ;
  2837. }
  2838.  
  2839. /* 準備 */
  2840. int startSet()
  2841. {
  2842.     int i ;
  2843.  
  2844.     hookStart() ;
  2845.  
  2846.     for( i=0 ; i<EFFECTCOUNT ; i++ )
  2847.     {
  2848.         if( effectSet[i].title[0] )
  2849.             MMI_SendMessage( effectMItemId[i], MM_SETMSG,
  2850.                                         1, effectSet[i].title ) ;
  2851.         else
  2852.             MMI_SendMessage( effectMItemId[i], MM_DETACH, 0 ) ;
  2853.  
  2854.     }
  2855.     return NOERR ;
  2856. }
  2857.  
  2858.