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

  1. #define MODULE_PENSELS
  2. /*
  3.     pensels.c
  4.     
  5.     int    pensel_init(void)
  6.     void pensel_end(void)
  7.  
  8.     Pen pensel_curpen(void)
  9.  
  10.     static void DrawPenSample(int idObj, int ofsx, int ofsy, Pen pen)
  11.  
  12.     int _do_loadPenData(char* fname)
  13.     int _do_savePenData(char* fname)
  14.  
  15. int    BrushPenDispWinProc(int kobj,int messId,int argc,EVENT* pev,int trig)
  16. int    BrushPenBtnProc(int kobj,int messId,int argc,EVENT* pev,int trig)
  17. int    brushTICONpensampleFunc(kobj, messId, argc, pev, trigger)
  18. int pensel_getmix(void);
  19.  
  20. static void pened_drawSample(void)
  21. int    PenEdEditWinProc(int kobj,int messId,int argc,EVENT* pev,int trigger)
  22. int    PenEdSampleWinProc(int kobj,int messId,int argc,EVENT* pev,int trigger)
  23. int    penedTICONtoolFunc(int kobj,int messId,int argc,EVENT*pev,int trigger)
  24. int EditPen(int penidx)
  25.  
  26. static int save_penlist(void)
  27. static int load_penlist(void)
  28. int    PenSelSampleListWinProc(kobj, messId, argc, pev, trigger)
  29. int    PenSelSelectWinProc(int kobj,int messId,int argc,EVENT* pev,int trig)
  30. int    penselDBTNeditFunc(kobj, messId, argc, pev, trigger)
  31. int    penselSBARFunc(kobj, messId, argc, pev, trigger)
  32.  
  33. */
  34.  
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include <string.h>
  38. #include <winb.h>
  39. #include <te.h>
  40. #include <fntb.h>
  41. #include <gui.h>
  42. #include <egb.h>
  43. #include <wgb.h>
  44. #include <file_dlg.h>
  45. #include "art.h"
  46. #include "guisub.h"
  47. #include "wgbmac.h"
  48. #include "pensel.h"
  49. #include "desktop.h"
  50. #include "pen.h"
  51. #include "fifo.h"
  52. #include "subgrp.h"
  53. #include "screen.h"
  54.  
  55. /*--------------------------------------------------------*/
  56. /*                       各部品ID                       */
  57. /*--------------------------------------------------------*/
  58.  
  59.  
  60. int    idPenEdDlg = -1 ;
  61. int    idPenEdTitleMsg = -1 ;
  62. int    idPenEdToolTIcon[7] = -1 ;
  63. int    idPenEdOkDBtn = -1 ;
  64. int    idPenEdOkMsg = -1 ;
  65. int    idPenEdCancelDBtn = -1 ;
  66. int    idPenEdCancelMsg = -1 ;
  67. int    idPenEdGrayMsg = -1 ;
  68. int    idPenEdGrayNumMsg = -1 ;
  69. int    idPenEdGraySBar = -1 ;
  70. int    idPenEdEditHSBar = -1 ;
  71. int    idPenEdEditVSBar = -1 ;
  72. int    idPenEdSizeDBtn = -1 ;
  73. int    idPenEdSizeMsg = -1 ;
  74. int    idPenEdEditWin = -1 ;
  75. int    idPenEdSampleWin = -1 ;
  76. int    idPenSelDlg = -1 ;
  77. int    idPenSelTitleMsg = -1 ;
  78. int    idPenSelSBar = -1 ;
  79. int    idPenSelConcMsg = -1 ;
  80. int    idPenSelConcTIcon = -1 ;
  81. int    idPenSelEraseIcon = -1 ;
  82. int    idPenSelEndDBtn = -1 ;
  83. int    idPenSelEndMsg = -1 ;
  84. int    idPenSelEditDBtn = -1 ;
  85. int    idPenSelEditMsg = -1 ;
  86. int    idPenSelSaveDBtn = -1 ;
  87. int    idPenSelSaveMsg = -1 ;
  88. int    idPenSelLoadDBtn = -1 ;
  89. int    idPenSelLoadMsg = -1 ;
  90. int    idPenSelSampleListWin = -1 ;
  91. int    idPenSelSelectWin[4] = -1 ;
  92. int    idBrushSmallDlg = -1 ;
  93. int    idBrushT1Hyper = -1 ;
  94. int    idBrushTitleMsg[2] = -1 ;
  95. int    idBrushWinSizeIcon[2] = -1 ;
  96. int    idBrushT3Hyper = -1 ;
  97. int    idBrushPenSampleTIcon[4] = -1 ;
  98. int    idBrushEraseIcon[2] = -1 ;
  99. int    idBrushTinyDlg = -1 ;
  100. int    idBrushT5Hyper = -1 ;
  101. int    idBrushT4Hyper = -1 ;
  102. int    idBrushPenDispWin = -1 ;
  103. int    idBrushPenBtn = -1 ;
  104. int    idBrushT2Hyper = -1 ;
  105. int    idBrushMsg[2] = -1 ;
  106. int    idBrushModeMenu = -1 ;
  107. int    idBrushModeMItem = -1 ;
  108. int    idBrushModeSelMenu = -1 ;
  109. int    idBrushModeSelMItem[7] = -1 ;
  110. int    idBrushGrayNumMsg = -1 ;
  111. int    idBrushGraySBar = -1 ;
  112.  
  113. // int    brushIMGBOXpendisp_tiny = -1;
  114. // int    brushIMGBOXpendisp_tinyFunc();
  115. // int    penselIMGBOXpenlist = -1;
  116. // int    penselIMGBOXpenlistFunc();
  117. // int    penedIMGBTN = -1;
  118. // int    penedIMGBTNFunc();
  119.  
  120. /*--------------------------------------------------------*/
  121. /*                    モジュール内変数                    */
  122. /*--------------------------------------------------------*/
  123.  
  124. #define    PENDATAFILE    "artemis2.pen"
  125. static char pendata_fname[_MAX_PATH];
  126.  
  127. #define    PENSEL_XNUM        5    /* 選択リスト表示の個数 */
  128. #define    PENSEL_YNUM        3    /* 同上 */
  129.  
  130. static int nSelectPen=0;    // 0~3:ペン候補のうちどれを選んでいるか
  131. static int nSamplePen[10];    // 各ペン先候補(0~3)が、何番のペンを選択しているか
  132. // static LIST *penSampleList;    // 各ペン先候補(0~3)の補正後のペン先
  133. static LIST *penList;        // ペンリスト
  134. static Pen penEdit;            // 編集中のペン(1時オブジェクト)
  135. static int nPenEditTool=0;    // ペン編集ウィンドウで選んでいるツ-ル
  136.  
  137. int list_x=0;    /* ペンリスト上のカーソルの位置 */
  138. int list_y=0;
  139.  
  140.  
  141. /*--------------------------------------------------------*/
  142. /*                        補助関数                        */
  143. /*--------------------------------------------------------*/
  144.  
  145. int    grayToColor(int gray)
  146. {
  147.     if (scrPixelSize == 16)
  148.     {
  149.         int g;
  150.         g = (255 - _min(255,_max(0,gray))) >> 3;
  151.         return g*(1024+32+1);
  152.     }
  153.     else
  154.     {
  155.         uint g;
  156.         g = (255 - _min(255,_max(0,gray)));
  157.         return (g<<16)|(g<<8)|g;
  158.     }
  159. }
  160.  
  161. static int getPenListPosition(int n, FRAME *fr_)
  162. /* 引数  n = リスト内番号 */
  163. /* 返値  0=成功  -1=画面外 */
  164. /*       fr←(x,y,wid,ht) */
  165. {
  166.     int ofsy = RM_getScrollPos(idPenSelSBar);
  167.     FRAME frUser;
  168.     RM_getWinUserFrame(idPenSelSampleListWin, &frUser);
  169.     int x,y;
  170.     x = n % PENSEL_XNUM;
  171.     y = n / PENSEL_XNUM - ofsy;
  172.     if (y < 0 || PENSEL_YNUM <= y)
  173.         return -1;
  174.     FRAME fr;
  175.     fr.X = frUser.X + 36 * x;
  176.     fr.Y = frUser.Y + 36 * y;
  177.     fr.WID = 36;
  178.     fr.HT = 36;
  179.     if (fr_ != NULL)
  180.         *fr_ = fr;
  181.     return 0;
  182. }
  183.  
  184. /*--------------------------------------------------------*/
  185. /*    ペン選択ダイアログのリスト縦スクロールバーの更新    */
  186. /*--------------------------------------------------------*/
  187.  
  188. static void pensel_updateSBar(BOOL fRedraw)
  189. {
  190.     int all = (list_getDataNum(penList) + PENSEL_XNUM) / PENSEL_XNUM;
  191.     all = _max(PENSEL_YNUM, all);
  192.     RM_setScrollRange(idPenSelSBar, PENSEL_YNUM, all, fRedraw);
  193. }
  194.  
  195. /*--------------------------------------------------------*/
  196. /*                   モジュールの初期化                   */
  197. /*--------------------------------------------------------*/
  198.  
  199. int    pensel_init(void)
  200. {
  201.     int i;
  202.     HYPER hyp;
  203.   // ラジオボタン初期化
  204.     RM_initRadioButton(idBrushPenSampleTIcon,
  205.                        INTNUM(idBrushPenSampleTIcon), &nSelectPen);
  206.     RM_initRadioButton(idPenEdToolTIcon,
  207.                        INTNUM(idPenEdToolTIcon), &nPenEditTool);
  208.   // 選択候補ペンのリストの作成
  209.     #if 0
  210.         if ((penSampleList = list_new(sizeof(Pen))) == NULL)
  211.             return -1;
  212.         for (i = 0; i < INTNUM(idPenSelSelectWin); i++)
  213.         {
  214.             Pen pen;
  215.             if ((pen = pen_new(32,32)) == NULL)
  216.                 return -1;
  217.             list_insertData(penSampleList, &pen);
  218.         }
  219.     #endif
  220.   // 各候補がどのペン先を選択しているかの設定
  221.     for (i = 0; i < INTNUM(idPenSelSelectWin); i++)
  222.         nSamplePen[i] = i;
  223.   // ペンのリストの作成(最初は空)
  224.     if ((penList = list_new(sizeof(Pen))) == NULL)
  225.         return -1;
  226.   // 起動時のペンデータ読み込み
  227.     sprintf(pendata_fname, "%s%s", dirExec, PENDATAFILE);
  228.     FILE *fp = fopen(pendata_fname,"rb");
  229.     if (fp != NULL)
  230.         fclose(fp);
  231.     else
  232.     {
  233.         _searchenv(PENDATAFILE,"PATH",pendata_fname);
  234.         if (pendata_fname[0] == 0)
  235.             _searchenv(PENDATAFILE,"PATH386",pendata_fname);
  236.     }
  237.     if (pendata_fname[0] != 0)
  238.         _do_loadPenData(pendata_fname);
  239.     pensel_updateSBar(FALSE);
  240.     return 0;
  241. }
  242.  
  243. void pensel_end(void)
  244. {
  245.   // 終了時のペンデータ保存
  246.     if (pendata_fname[0] == 0)
  247.         strcpy(pendata_fname, PENDATAFILE);
  248.     _do_savePenData(pendata_fname);
  249. }
  250.  
  251. /*--------------------------------------------------------*/
  252. /*              ペンリストのダミー要素の作成              */
  253. /*--------------------------------------------------------*/
  254.  
  255. static int penlist_makeDummy(int n)
  256. // ペンリストの要素数が[n+1]になるまで追加する
  257. // 成功=NOERR 失敗=-1
  258. {
  259.     while (list_getDataNum(penList) <= n)
  260.     {
  261.         Pen pen;
  262.         if ((pen = pen_new(32,32)) == NULL)
  263.             return -1;
  264.         list_moveTo(penList, list_getDataNum(penList));
  265.         if (list_insertData(penList, &pen) != 0)
  266.             return -1;
  267.     }
  268.     return NOERR;
  269. }
  270.  
  271. /*--------------------------------------------------------*/
  272. /*              ペン先データの読み込み・保存              */
  273. /*--------------------------------------------------------*/
  274.  
  275. #define    HEADER    15
  276. static char pendata_header[] = "ARTemisPEN00000";
  277.  
  278. int _do_loadPenData(char* fname)
  279. {
  280.     FILE *fp;
  281.     if ((fp = fopen(fname, "rb")) == NULL)
  282.         return 0;
  283.     char headbuf[HEADER];
  284.     fread(headbuf,1,HEADER,fp);
  285.     if (memcmp(headbuf, pendata_header, HEADER) == 0)
  286.     {
  287.         list_moveTo(penList, list_getDataNum(penList));
  288.         while (!feof(fp))
  289.         {
  290.             int wh[2];
  291.             char *buf;  int wid,ht;
  292.             Pen pen;
  293.             fread(wh, sizeof(wh), 1, fp);
  294.             wid = wh[0];  ht = wh[1];
  295.             if ((pen = pen_new(wid,ht)) == NULL)
  296.                 break;
  297.             pen_getPattern(pen, &buf,&wid,&ht);
  298.             fread(buf, wid*ht,1, fp);
  299.             pen_setPattern(pen, buf,wid,ht);    /* あんましキレイじゃない */
  300.             if (pen_IsNull(pen))
  301.                 pen_destroy(pen);
  302.             else
  303.                 list_insertData(penList, &pen);
  304.         }
  305.     }
  306.     fclose(fp);
  307.     return 1;
  308. }
  309.  
  310. int _do_savePenData(char* fname)
  311. {
  312.     FILE *fp;
  313.     if ((fp = fopen(fname, "wb")) == NULL)
  314.         return 0;
  315.     fwrite(pendata_header,1,HEADER,fp);
  316.     for (list_top(penList); !list_isOut(penList); list_next(penList))
  317.     {
  318.         Pen pen;
  319.         char *buf;  int wid,ht;
  320.         int wh[2];
  321.         list_getData(penList, &pen);
  322.         if (!pen_IsNull(pen))
  323.         {
  324.             pen_getPattern(pen, &buf,&wid,&ht);
  325.             if (buf!=NULL)
  326.             {
  327.                 wh[0] = wid;
  328.                 wh[1] = ht;
  329.                 fwrite(wh, sizeof(wh),1, fp);
  330.                 fwrite(buf, wid*ht, 1, fp);
  331.             }
  332.         }
  333.     }
  334.     fclose(fp);
  335.     return 1;
  336. }
  337.  
  338. /*--------------------------------------------------------*/
  339. /*                     ペン先パレット                     */
  340. /*--------------------------------------------------------*/
  341.  
  342. static void DrawPenSample(int idObj, int ofsx, int ofsy, Pen pen)
  343. // idObj のユーザー領域内で、
  344. // 34×34 領域内でのサンプル表示を行う
  345. {
  346.     #define SIZE 34
  347.     WINCLIP *clip;
  348.   // 描画の準備
  349.     MG_mosDisp(2);
  350.     RM_setOriginZero();
  351.     RM_setClipWinUser(idObj, &clip);
  352.   // ペンの描画
  353.     FRAME fr;
  354.     RM_getWinUserFrame(idObj, &fr);
  355.     WGB_RBOXFILL(guiEgbPtr, fr.X+ofsx,fr.Y+ofsy,SIZE,SIZE,RMcol(WHITE),0);
  356.     if (pen != NULL)
  357.     {
  358.         int x0,y0;
  359.         x0 = fr.X + ofsx + (SIZE-pen->wid)/2;
  360.         y0 = fr.Y + ofsy + (SIZE-pen->ht)/2;
  361.         int i,j;
  362.         for (i=0; i<pen->ht; i++)
  363.         {
  364.             for (j=0; j<pen->wid; j++)
  365.             {
  366.                 int g = pen_getPixel(pen,j,i);
  367.                 if (g > 0)
  368.                     WGB_PSET(guiEgbPtr,x0+j,y0+i,grayToColor(g),0);
  369.             }
  370.         }
  371.     }
  372.   // 描画終了
  373.     RM_resetClipWinUser(clip);
  374.     RM_recoverOrigin();
  375.     MG_mosDisp(3);
  376.     #undef SIZE
  377. }
  378.  
  379. int pensel_getmix(void)
  380. {
  381.     uint m = RM_getScrollPos(idBrushGraySBar);
  382.     return (m * 255 + 50) / 100;
  383. }
  384.  
  385. /*--------------------------------------------------------*/
  386. /*              ペン先パレット・部品実行関数              */
  387. /*--------------------------------------------------------*/
  388.  
  389.     int    BrushPenDispWinProc(int kobj,int messId,int argc,EVENT* pev,int trig)
  390.     // initDataZPENSEL:idBrushPenDispWin:MJ_WINDOWL40の呼び出し関数
  391.     {
  392.         if (messId == MM_SHOW)
  393.         {
  394.             DrawPenSample(kobj, 0,0, pensel_curpen());
  395.         }
  396.         return NOERR ;
  397.     }
  398.  
  399.     // initDataZPENSEL:idBrushPenBtn:MJ_BUTTONL40の呼び出し関数
  400.     int    BrushPenBtnProc(int kobj,int messId,int argc,EVENT* pev,int trig)
  401.     {
  402.         EXECDIALOG(idPenSelDlg);
  403.       // ペン先標本の再表示
  404.         MMI_SendMessage(idBrushPenDispWin, MM_SHOW, 0);
  405.         return NOERR ;
  406.     }
  407.  
  408.   /* サイズボタン */
  409.         /*    initDataPENSEL:brushICONwinsize[0]:MJ_ICONL40の呼び出し関数    */
  410.         /*    initDataPENSEL:brushICONwinsize[1]:MJ_ICONL40の呼び出し関数    */
  411.     int    brushICONwinsizeFunc(kobj, messId, argc, pev, trigger)
  412.     int        kobj ;
  413.     int        messId ;
  414.     int        argc ;
  415.     EVENT    *pev ;
  416.     int        trigger ;
  417.     {
  418.         return NOERR ;
  419.     }
  420.  
  421.   /* イレーズボタン */
  422.         /*    initDataPENSEL:brushICONerase[0]:MJ_ICONL40の呼び出し関数    */
  423.         /*    initDataPENSEL:brushICONerase[1]:MJ_ICONL40の呼び出し関数    */
  424.     int    brushICONeraseFunc(kobj, messId, argc, pev, trigger)
  425.     int        kobj ;
  426.     int        messId ;
  427.     int        argc ;
  428.     EVENT    *pev ;
  429.     int        trigger ;
  430.     {
  431.         return NOERR ;
  432.     }
  433.  
  434.   /* 描画モード選択 */
  435.     // initDataPENSEL:brushMITEMmodesel[0..6]:MJ_MITEML40の呼び出し関数
  436.     int    brushMITEMmodeselFunc(kobj, messId, argc, pev, trigger)
  437.     int        kobj ;
  438.     int        messId ;
  439.     int        argc ;
  440.     EVENT    *pev ;
  441.     int        trigger ;
  442.     {
  443.         static char msgbuf[20];
  444.         WINCLIP *clip;
  445.         sprintf(msgbuf,"%-9s",OBJDATA(MITEML40,kobj).string);
  446.         MMI_SendMessage(idBrushModeMItem, MM_SETMSG, 1, msgbuf);
  447.         WIN_beginUpDateObj(idBrushModeMItem, &clip);
  448.         MMI_SendMessage(idBrushModeMItem, MM_SHOW, 1, msgbuf);
  449.         WIN_endUpDateObj(clip);
  450.         return NOERR ;
  451.     }
  452.  
  453.   /* 描画濃度設定 */
  454.         /*    initDataPENSEL:brushSBARgray:MJ_SCRLL40の呼び出し関数    */
  455.     int    brushSBARgrayFunc(kobj)
  456.     int        kobj ;
  457.     {
  458.         int ptr,a;
  459.         WINCLIP *clip;
  460.         static char msgbuf[5];
  461.       /* idBrushGrayNumMsg の表示文字列の更新 */
  462.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,&ptr,&a,&a,&a,&a ) ;
  463.         sprintf( msgbuf,"%3d%%", ptr );
  464.         MMI_SendMessage( idBrushGrayNumMsg, MM_SETMSG, 1, msgbuf );
  465.       /* 表示の更新 */
  466.         WIN_beginUpDateObj( idBrushGrayNumMsg, &clip );
  467.         MMI_SendMessage( idBrushGrayNumMsg, MM_SHOW, 0 );
  468.         WIN_endUpDateObj( clip );
  469.         return NOERR ;
  470.     }
  471.  
  472.   /*  */
  473.     // initDataPENSEL:idBrushPenSampleTIcon[0..3]:MJ_TICONL40の呼び出し関数
  474.     int    brushTICONpensampleFunc(kobj, messId, argc, pev, trigger)
  475.     int        kobj ;
  476.     int        messId ;
  477.     int        argc ;
  478.     EVENT    *pev ;
  479.     int        trigger ;
  480.     {
  481.         int i;
  482.         for (i=0 ; i<sizeof(idBrushPenSampleTIcon)/sizeof(int) ; i++)
  483.             if (idBrushPenSampleTIcon[i] == kobj)
  484.                 goto PENSEL;
  485.         goto END;
  486.       PENSEL:
  487.         if (nSelectPen != i)
  488.         {
  489.             WINCLIP *clip;
  490.             WIN_beginUpDateObj(idBrushSmallDlg, &clip);
  491.             MTL_resetFlagObj(idBrushPenSampleTIcon[nSelectPen], 
  492.                              ~(MS_UNSELECT|MS_TOGGLE)) ;
  493.             MMI_SendMessage(idBrushPenSampleTIcon[nSelectPen], MM_SHOW, 0) ;
  494.             nSelectPen = i;
  495.             MTL_setFlagObj(idBrushPenSampleTIcon[nSelectPen],
  496.                            (MS_UNSELECT|MS_TOGGLE)) ;
  497.             WIN_endUpDateObj(clip);
  498.         }
  499.       END:
  500.         return NOERR ;
  501.     }
  502.  
  503. /*--------------------------------------------------------*/
  504. /*                  ペン先パターンの編集                  */
  505. /*--------------------------------------------------------*/
  506.  
  507. static SCRBITMAP bmPenEdSample=NULL; // ペン先編集時のサンプル表示ビットマップ
  508. static int pened_ret = NOERR;
  509.  
  510. static void pened_drawSample(void)
  511. {
  512.     BEGINPAINT(idPenEdSampleWin)
  513.     FRAME fr;  RM_getWinUserFrame(idPenEdSampleWin,&fr);
  514.     scrbitmap_draw(bmPenEdSample, fr.X,fr.Y);
  515.     ENDPAINT
  516. }
  517.  
  518. /*--------------------------------------------------------*/
  519. /*           ペン先パターンの編集・部品実行関数           */
  520. /*--------------------------------------------------------*/
  521.  
  522.  
  523.     int    PenEdEditWinProc(int kobj,int messId,int argc,EVENT* pev,int trigger)
  524.     // initDataZPENSEL:idPenEdEditWin:MJ_WINDOWL40の呼び出し関数
  525.     {
  526.         int gray = RM_getScrollPos(idPenEdGraySBar);
  527.         FRAME fr;
  528.         RM_getWinUserFrame(kobj, &fr);
  529.         if (messId == MM_SHOW)
  530.         {
  531.             BEGINPAINT(kobj)
  532.             WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,RMcol(WHITE),0);
  533.             int i,j;
  534.             for (i=0; i<=penEdit->wid; i++)
  535.                 WGB_LINE(guiEgbPtr, fr.X+6*i, fr.Y, fr.X+6*i, fr.Y2,
  536.                          RMcol(BLACK), 0);
  537.             for (i=0; i<=penEdit->ht; i++)
  538.                 WGB_LINE(guiEgbPtr, fr.X, fr.Y+6*i, fr.X2, fr.Y+6*i,
  539.                          RMcol(BLACK), 0);
  540.             for (i=0; i<penEdit->ht; i++)
  541.                 for (j=0; j<penEdit->wid; j++)
  542.                 {
  543.                     int g = pen_getPixel(penEdit,j,i);
  544.                     if (g > 0)
  545.                     {
  546.                         WGB_RBOXFILL(guiEgbPtr,fr.X+6*j+1,fr.Y+6*i+1,5,5,
  547.                                      grayToColor(g),0);
  548.                     }
  549.                 }
  550.             ENDPAINT
  551.         }
  552.         else if (messId == MM_MOUSEON)
  553.         {
  554.           // (x,y) がペン内座標であるかどうか判別
  555.             BOOL InPen(int x,int y)
  556.             {
  557.                 if (0 <= x && x < penEdit->wid &&
  558.                     0 <= y && y < penEdit->ht)
  559.                     return TRUE;
  560.                 else
  561.                     return FALSE;
  562.             }
  563.           // 点をセットする関数
  564.             void setPixel(int x,int y)
  565.             {
  566.                 if (InPen(x,y))
  567.                 {
  568.                     pen_setPixel(penEdit,x,y,gray);
  569.                     WGB_RBOXFILL(guiEgbPtr,fr.X+6*x+1, fr.Y+6*y+1, 5,5,
  570.                                  grayToColor(gray),0);
  571.                     int igray = 255 - gray;
  572.                     scrbitmap_setpixel(bmPenEdSample,x,y,igray,igray,igray);
  573.                 }
  574.             }
  575.           // ラバー描画のために点を反転する関数
  576.             void invertPixel(int x,int y)
  577.             {
  578.                 WGB_RBOXFILL(guiEgbPtr,fr.X+6*x+1, fr.Y+6*y+1, 5,5,
  579.                              grayToColor(WHITE),4);
  580.             }
  581.           // マウス座標からペン先パターン内座標へ変換する関数
  582.             POINT convPt(POINT pt)
  583.               { POINT p = { (pt.x - fr.X) / 6, (pt.y - fr.Y) / 6 };
  584.                 return p; }
  585.           // 左ボタンが押されていたら、イベントループに入る
  586.             if (!(pev->what == EVMOSDN && (pev->shift & SLEFTBTN) != 0))
  587.                 goto DONOTHING;
  588.           // 選択しているツールによって、ループを選択
  589.             if (nPenEditTool == 0 || nPenEditTool == 1)
  590.             {
  591.                 int ret;  EVENT *ev;  POINT lastp;
  592.               // 最初の点に描画
  593.                 lastp = convPt(*(POINT*)&pev->info);
  594.                 BEGINPAINT(kobj)
  595.                 setPixel(lastp.x, lastp.y);
  596.                 ENDPAINT
  597.                 for (;;)
  598.                 {
  599.                     int what,shift;  POINT *pt;
  600.                     MMI_iosense();
  601.                     if ((ret = MMI_GetEvnt(EVMOSDRAG|EVMOSUP,&ev)) == NOERR)
  602.                     {
  603.                       // イベント種別、シフト状態、マウス座標を得る
  604.                         what = ev->what, shift = ev->shift;
  605.                         pt = (POINT *) &ev->info;
  606.                       // マウスボタンが放されたら、自由曲線描画を終了
  607.                         if (what!=EVMOSDRAG && (shift&SLEFTBTN)!=0)
  608.                             break;
  609.                       // 部品の中でマウスがドラッグされれば描画
  610.                         POINT p = convPt(*pt);
  611.                         BEGINPAINT(kobj)
  612.                         if (nPenEditTool == 0)
  613.                             setPixel(p.x,p.y);
  614.                         else if (nPenEditTool == 1)
  615.                             do_line_cont(lastp.x,lastp.y,p.x,p.y,setPixel);
  616.                         ENDPAINT
  617.                         pened_drawSample();
  618.                         lastp = p;
  619.                     }
  620.                 }
  621.               // 次のイベントをキューに積む
  622.                 EVENT evbuf;
  623.                 evbuf = *ev;
  624.                 evbuf.what = EVMOSUP;
  625.                 evbuf.shift = (evbuf.shift & (~SRIGHTBTN)) | SLEFTBTN;
  626.                 MMI_SetEvnt(&evbuf);
  627.             }
  628.             else if (nPenEditTool == 2 || nPenEditTool == 3 ||
  629.                      nPenEditTool == 4 || nPenEditTool == 5 ||
  630.                      nPenEditTool == 6)
  631.             {
  632.                 void rub(int x1,int y1,int x2,int y2)
  633.                 {
  634.                     switch(nPenEditTool)
  635.                     {
  636.                     case 2: do_line(x1,y1,x2,y2,invertPixel); break;
  637.                     case 3..4: do_boxline(x1,y1,x2,y2,invertPixel); break;
  638.                     case 5: case 6:
  639.                         do_ellipse(x1,y1,abs(x1-x2),abs(y1-y2),invertPixel);
  640.                         break;
  641.                     }
  642.                 }
  643.                 void draw(int x1,int y1,int x2,int y2)
  644.                 {
  645.                     void h_do(int x1,int x2,int y)
  646.                       { for (int x=x1; x<=x2; x++)  setPixel(x,y); }
  647.                     switch(nPenEditTool)
  648.                     {
  649.                     case 2: do_line(x1,y1,x2,y2,setPixel); break;
  650.                     case 3: do_boxline(x1,y1,x2,y2,setPixel); break;
  651.                     case 4:    do_boxfill(x1,y1,x2,y2,h_do); break;
  652.                     case 5:
  653.                         do_ellipse(x1,y1,abs(x1-x2),abs(y1-y2),setPixel);
  654.                         break;
  655.                     case 6:
  656.                         do_ellipsefill(x1,y1,abs(x1-x2),abs(y1-y2),h_do);
  657.                         break;
  658.                     }
  659.                     pened_drawSample();
  660.                 }
  661.                 EVENT *ev;
  662.                 POINT lastp = convPt(*(POINT*)&pev->info);
  663.                 POINT cp = lastp;
  664.                 for (;;)
  665.                 {
  666.                     int what,shift;  POINT *pt;
  667.                   // ラバー描画
  668.                     BEGINPAINT(kobj)
  669.                     rub(lastp.x,lastp.y,cp.x,cp.y);
  670.                     ENDPAINT
  671.                   // イベントセンス
  672.                     do { MMI_iosense(); }
  673.                        while (MMI_GetEvnt(EVALL, &ev) != NOERR);
  674.                   // ラバー消去
  675.                     BEGINPAINT(kobj)
  676.                     rub(lastp.x,lastp.y,cp.x,cp.y);
  677.                     ENDPAINT
  678.                   // イベント種別、シフト状態、マウス座標を得る
  679.                     what=ev->what; shift=ev->shift; pt = (POINT *)&ev->info;
  680.                   // ペン内座標を得る
  681.                     cp = convPt(*pt);
  682.                   // 左ボタンがクリックされたら描画
  683.                     if (what==EVMOSDN&&(shift&SLEFTBTN)!=0&&InPen(cp.x,cp.y))
  684.                     {
  685.                         BEGINPAINT(kobj)
  686.                         draw(lastp.x,lastp.y,cp.x,cp.y);
  687.                         ENDPAINT
  688.                         lastp = cp;
  689.                         if (nPenEditTool != 2)
  690.                             break;
  691.                     }
  692.                   // 右ボタンがクリックされたらイベントループ終了
  693.                     else if (what == EVMOSDN && (shift & SRIGHTBTN) != 0)
  694.                         break;
  695.                 }
  696.               // 次のイベントをキューに積む
  697.                 EVENT evbuf;
  698.                 evbuf = *ev;
  699.                 evbuf.what = EVMOSUP;
  700.                 evbuf.shift = (evbuf.shift & (~SRIGHTBTN)) | SLEFTBTN;
  701.                 MMI_SetEvnt(&evbuf);
  702.             }
  703.             DONOTHING: ;
  704.         }
  705.         return NOERR ;
  706.     }
  707.  
  708.     int    PenEdSampleWinProc(int kobj,int messId,int argc,EVENT* pev,int trigger)
  709.     // initDataZPENSEL:idPenEdSampleWin:MJ_WINDOWL40の呼び出し関数
  710.     {
  711.         if (messId == MM_SHOW)
  712.             pened_drawSample();
  713.         return NOERR ;
  714.     }
  715.  
  716.     int    penedTICONtoolFunc(int kobj,int messId,int argc,EVENT*pev,int trigger)
  717.         // initDataPENSEL:idPenEdToolTIcon[0..4]:MJ_TICONL40の呼び出し関数
  718.     {
  719.         RM_pushRadioButton(kobj, idPenEdDlg, idPenEdToolTIcon,
  720.                            INTNUM(idPenEdToolTIcon), &nPenEditTool);
  721.         return NOERR ;
  722.     }
  723.  
  724.         /*    initDataPENSEL:penedDBTNok:MJ_DBUTTONL40の呼び出し関数    */
  725.     int    penedDBTNokFunc(int kobj)
  726.     {
  727.         pened_ret = NOERR;
  728.         MMI_SetHaltFlag(TRUE);
  729.         return NOERR ;
  730.     }
  731.  
  732.         /*    initDataPENSEL:penedDBTNcancel:MJ_DBUTTONL40の呼び出し関数    */
  733.     int    penedDBTNcancelFunc(int kobj)
  734.     {
  735.         pened_ret = -1;
  736.         MMI_SetHaltFlag(TRUE);
  737.         return NOERR ;
  738.     }
  739.  
  740.         /*    initDataPENSEL:penedSBARedit_hori:MJ_SCRLL40の呼び出し関数    */
  741.         /*    initDataPENSEL:penedSBARedit_vert:MJ_SCRLL40の呼び出し関数    */
  742.     int    penedSBAReditFunc(kobj)
  743.     int        kobj ;
  744.     {
  745.         return NOERR ;
  746.     }
  747.  
  748.     int penedSBARgrayFunc(void)
  749.     {
  750.         int ptr,a;
  751.         static char numbuf[10];
  752.         MMI_SendMessage( idPenEdGraySBar, MM_GETSCROLL, 5, &ptr,&a,&a,&a,&a);
  753.         sprintf(numbuf, "%3d", ptr);
  754.         MMI_SendMessage( idPenEdGrayNumMsg, MM_SETMSG, 1, numbuf );
  755.         MMI_SendMessage( idPenEdGrayNumMsg, MM_SHOW, 0 );
  756.         return NOERR ;
  757.     }
  758.  
  759.         /*    initDataPENSEL:penedDBTNsize:MJ_DBUTTONL40の呼び出し関数    */
  760.     int    penedDBTNsizeFunc(kobj, messId, argc, pev, trigger)
  761.     int        kobj ;
  762.     int        messId ;
  763.     int        argc ;
  764.     EVENT    *pev ;
  765.     int        trigger ;
  766.     {
  767.         return NOERR ;
  768.     }
  769.  
  770. int EditPen(int penidx)
  771. // penidx 番目のペンを編集する
  772. {
  773.     Pen pen;
  774.     if (penlist_makeDummy(penidx) != NOERR)
  775.         return -1;
  776.     list_moveTo(penList, penidx);
  777.     list_getData(penList, &pen);
  778.     penEdit = pen_createCopy(pen);
  779.     if ((bmPenEdSample = scrbitmap_new(penEdit->wid,penEdit->ht)) == NULL)
  780.         goto END;
  781.     scrbitmap_clear(bmPenEdSample);
  782.     int i,j;
  783.     char *p = penEdit->buf;
  784.     for (i=0; i<penEdit->ht; i++)
  785.         for (j=0; j<penEdit->wid; j++,p++)
  786.             scrbitmap_setpixel(bmPenEdSample,j,i,255-*p,255-*p,255-*p);
  787.     RM_setScrollPos(idPenEdGraySBar, 255, FALSE);
  788.     MMI_SendMessage(idPenEdGrayNumMsg, MM_SETMSG, 1, "255");
  789.  
  790.     RM_moveCenter(idPenEdDlg);
  791.     MMI_SendMessage(idPenEdDlg, MM_ATTACH, 1, idDesktopAlertHyper);
  792.     MMI_SendMessage(idPenEdDlg, MM_SHOW, 0);
  793.     MMI_ExecSystem();
  794.     MMI_SendMessage(idPenEdDlg, MM_ERASE, 0);
  795.     MMI_SendMessage(idPenEdDlg, MM_DETACH, 0);
  796. END:
  797.     if (bmPenEdSample != NULL)
  798.         scrbitmap_delete(bmPenEdSample);
  799.     if (pened_ret == NOERR)
  800.     {
  801.         pen_destroy(pen);
  802.         list_moveTo(penList, penidx);
  803.         list_setData(penList, &penEdit);
  804.     }
  805.     else
  806.     {
  807.         pen_destroy(penEdit);
  808.     }
  809.     return NOERR;
  810. }
  811.  
  812. /*--------------------------------------------------------*/
  813. /*                  ペン先選択ダイアログ                  */
  814. /*--------------------------------------------------------*/
  815.  
  816. static int save_penlist(void)
  817. {
  818.     static char *extstr[] = {"*.*",NULL};
  819.     int atr,ret,i;
  820.     unsigned int select_cnt;
  821.     char pathname[80];
  822.   /* ファイルダイアログのタイトル、表示位置を設定 */
  823.     FDG_SetTitle("ペンデータ保存", "保存", "取消");
  824.     RM_moveCenter(FDG_GetMainID());
  825.   /* ファイルダイアログの表示 */
  826.     ret = FDG_DspFileDlg(idDesktopFileDlgHyper,
  827.                          FDG_TEXT,NULL,extstr,&select_cnt);
  828.   /* 「実行」が押されたならファイル名を取得 */
  829.     if (ret)
  830.         FDG_GetPathName(pathname, &atr, 0);
  831.   /* ペン先データの保存 */
  832.     if (ret)
  833.         _do_savePenData(pathname);
  834.   /* 終了 */
  835.     if (ret)
  836.         return 0;
  837.     else
  838.         return -1;
  839. }
  840.  
  841. static int load_penlist(void)
  842. {
  843.     static char *extstr[] = {"*.*",NULL};
  844.     int atr,ret,i;
  845.     unsigned int select_cnt;
  846.     char pathname[80];
  847.   /* ファイルダイアログのタイトル、表示位置を設定 */
  848.     FDG_SetTitle("ペンデータ読込", "保存", "取消");
  849.     RM_moveCenter(FDG_GetMainID());
  850.   /* ファイルダイアログの表示 */
  851.     ret = FDG_DspFileDlg(idDesktopFileDlgHyper,
  852.                          FDG_TEXT,NULL,extstr,&select_cnt);
  853.   /* 「実行」が押されたならファイル名を取得 */
  854.     if (ret)
  855.         FDG_GetPathName(pathname, &atr, 0);
  856.   /* ペン先データの読み込み */
  857.     if (ret)
  858.         _do_loadPenData(pathname);
  859.   /* 終了 */
  860.     if (ret)
  861.         return 0;
  862.     else
  863.         return -1;
  864. }
  865.  
  866. /*--------------------------------------------------------*/
  867. /*         ペン先選択ダイアログ・リスト表示の更新         */
  868. /*--------------------------------------------------------*/
  869.  
  870. static void pensel_updateListDisp(void)
  871. {
  872.     int idWin = idPenSelSampleListWin;
  873.     BEGINPAINT(idWin)
  874.     FRAME fr;  RM_getWinUserFrame(idWin,&fr);
  875.     WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,RMcol(WHITE),0);
  876.     int ptr = RM_getScrollPos(idPenSelSBar);
  877.     list_moveTo(penList, PENSEL_XNUM * ptr);
  878.     int i,j,cnt;
  879.     cnt = 0;
  880.     for (i=0; i<PENSEL_YNUM; i++)
  881.     {
  882.         for (j=0; j<PENSEL_XNUM; j++, list_next(penList),cnt++)
  883.         {
  884.             Pen pen;
  885.             if (list_isOut(penList))
  886.                 goto END;
  887.             list_getData(penList, &pen);
  888.             DrawPenSample(idWin, 36*j+1, 36*i+1, pen);
  889.         }
  890.     }
  891.   END:
  892.   /* ペンリスト選択カーソル描画 */
  893.     FRAME sel;
  894.     if (getPenListPosition(PENSEL_XNUM * list_y + list_x, &sel) == 0)
  895.     {
  896.      WGB_RBOXLINE(guiEgbPtr,sel.X,sel.Y,sel.WID,sel.HT,RMcol(BLACK), 0);
  897.      WGB_RBOXLINE(guiEgbPtr,sel.X+1,sel.Y+1,sel.WID-2,sel.HT-2,
  898.                   RMcol(BLACK),0);
  899.     }
  900.   // 描画終了
  901.     ENDPAINT
  902. }
  903.  
  904. /*--------------------------------------------------------*/
  905. /*           ペン先選択ダイアログ・部品実行関数           */
  906. /*--------------------------------------------------------*/
  907.  
  908.     int    PenSelSampleListWinProc(kobj, messId, argc, pev, trigger)
  909.     /*    initDataZPENSEL:idPenSelSampleListWin:MJ_WINDOWL40の呼び出し関数    */
  910.     int        kobj ;
  911.     int        messId ;
  912.     int        argc ;
  913.     EVENT    *pev ;
  914.     int        trigger ;
  915.     {
  916.         if (messId == MM_SHOW)
  917.             pensel_updateListDisp();
  918.         else if (messId == MM_MOUSEON)
  919.         {
  920.             POINT pt = *(POINT*)&pev->info;
  921.             FRAME frUser;
  922.             RM_getWinUserFrame(kobj, &frUser);
  923.             int ix,iy;
  924.             ix = (pt.x - frUser.X) / 36;
  925.             iy = (pt.y - frUser.Y) / 36;
  926.             if (ix < 0)  ix = 0;
  927.             else if (ix >= PENSEL_XNUM)  ix = PENSEL_XNUM-1;
  928.             if (iy < 0)  iy = 0;
  929.             else if (iy >= PENSEL_YNUM)  iy = PENSEL_YNUM-1;
  930.             list_x = ix;
  931.             list_y = RM_getScrollPos(idPenSelSBar) + iy;
  932.             nSamplePen[nSelectPen] = list_y * PENSEL_XNUM + list_x;
  933.             RM_setClipVisibleAllScr();
  934.             RM_setOriginZero();
  935.             MMI_SendMessage( idPenSelSelectWin[nSelectPen], MM_SHOW, 0);
  936.             MMI_SendMessage( idPenSelSampleListWin, MM_SHOW, 0);
  937.             RM_recoverOrigin();
  938.             RM_recoverClipVisible();
  939.         }
  940.         return NOERR ;
  941.     }
  942.  
  943.     int    PenSelSelectWinProc(int kobj,int messId,int argc,EVENT* pev,int trig)
  944.     // initDataZPENSEL:idPenSelSelectWin[0..3]:MJ_WINDOWL40の呼び出し関数
  945.     {
  946.         int i;
  947.         for (i = 0; i < INTNUM(idPenSelSelectWin); i++)
  948.             if (kobj == idPenSelSelectWin[i])
  949.                 goto FOUND;
  950.         return NOERR;
  951.       FOUND:
  952.         if (messId == MM_SHOW)
  953.         {
  954.             Pen pen;
  955.             list_moveTo(penList, nSamplePen[i]);
  956.             FRAME fr;
  957.             RM_getWinUserFrame(kobj, &fr);
  958.             WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,RMcol(WHITE),0);
  959.             if (list_getData(penList, &pen) == 0)
  960.                 DrawPenSample(kobj, 0,0, pen);
  961.             if (i == nSelectPen)
  962.             {
  963.                 BEGINPAINT(kobj)
  964.                 WGB_BOXLINE(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,RMcol(BLACK),0);
  965.                 WGB_BOXLINE(guiEgbPtr,fr.X+1,fr.Y+1,fr.X2-1,fr.Y2-1,
  966.                             RMcol(BLACK),0);
  967.                 ENDPAINT
  968.             }
  969.         }
  970.         else if (messId == MM_MOUSEON)
  971.         {
  972.             int oldx = nSelectPen;
  973.             nSelectPen = i;
  974.             list_x = nSamplePen[nSelectPen] % PENSEL_XNUM;
  975.             list_y = nSamplePen[nSelectPen] / PENSEL_XNUM;
  976.             RM_setOriginZero();
  977.             RM_setClipVisibleAllScr();
  978.             MMI_SendMessage( idPenSelSelectWin[oldx], MM_SHOW, 0);
  979.             MMI_SendMessage( idPenSelSelectWin[nSelectPen], MM_SHOW, 0);
  980.             MMI_SendMessage( idPenSelSampleListWin, MM_SHOW, 0);
  981.             RM_recoverClipVisible();
  982.             RM_recoverOrigin();
  983.         }
  984.         return NOERR ;
  985.     }
  986.  
  987.         /*    initDataPENSEL:idPenSelSBar:MJ_SCRLL40の呼び出し関数    */
  988.     int    penselSBARFunc(kobj, messId, argc, pev, trigger)
  989.     int        kobj ;
  990.     int        messId ;
  991.     int        argc ;
  992.     EVENT    *pev ;
  993.     int        trigger ;
  994.     {
  995.         pensel_updateListDisp();
  996.         return NOERR ;
  997.     }
  998.  
  999.         /* initDataPENSEL:penselTICONconc:MJ_TICONL40の呼び出し関数 */
  1000.     int    penselTICONconcFunc(kobj, messId, argc, pev, trigger)
  1001.     int        kobj ;
  1002.     int        messId ;
  1003.     int        argc ;
  1004.     EVENT    *pev ;
  1005.     int        trigger ;
  1006.     {
  1007.         return NOERR ;
  1008.     }
  1009.  
  1010.         /*    initDataPENSEL:penselICONerase:MJ_ICONL40の呼び出し関数    */
  1011.     int    penselICONeraseFunc(kobj, messId, argc, pev, trigger)
  1012.     int        kobj ;
  1013.     int        messId ;
  1014.     int        argc ;
  1015.     EVENT    *pev ;
  1016.     int        trigger ;
  1017.     {
  1018.         MMI_SetHaltFlag(TRUE);
  1019.         return NOERR ;
  1020.     }
  1021.     
  1022.         /*    initDataPENSEL:penselDBTNedit:MJ_DBUTTONL40の呼び出し関数    */
  1023.     int    penselDBTNeditFunc(kobj, messId, argc, pev, trigger)
  1024.     int        kobj ;
  1025.     int        messId ;
  1026.     int        argc ;
  1027.     EVENT    *pev ;
  1028.     int        trigger ;
  1029.     {
  1030.         int n;
  1031.         n = PENSEL_XNUM * list_y + list_x;
  1032.         MMI_SendMessage(idPenSelDlg, MM_ERASE, 0);
  1033.         MMI_SendMessage(idPenSelDlg, MM_DETACH, 0);
  1034.         EditPen(n);
  1035.         pensel_updateSBar(FALSE);
  1036.         MMI_SendMessage(idPenSelDlg, MM_ATTACH, 1, idDesktopAlertHyper);
  1037.         WINCLIP *clip;
  1038.         WIN_beginUpDateObj(idPenSelDlg, &clip);
  1039.         MMI_SendMessage(idPenSelDlg, MM_SHOW, 0);
  1040.         WIN_endUpDateObj(clip);
  1041.         return NOERR ;
  1042.     }
  1043.  
  1044.         /*    initDataPENSEL:penselDBTNend:MJ_DBUTTONL40の呼び出し関数    */
  1045.     int    penselDBTNendFunc(kobj, messId, argc, pev, trigger)
  1046.     int        kobj ;
  1047.     int        messId ;
  1048.     int        argc ;
  1049.     EVENT    *pev ;
  1050.     int        trigger ;
  1051.     {
  1052.         MMI_SetHaltFlag(TRUE);
  1053.         return NOERR ;
  1054.     }
  1055.  
  1056.         /*    initDataPENSEL:penselDBTNsave:MJ_DBUTTONL40の呼び出し関数    */
  1057.     int    penselDBTNsaveFunc(kobj, messId, argc, pev, trigger)
  1058.     int        kobj ;
  1059.     int        messId ;
  1060.     int        argc ;
  1061.     EVENT    *pev ;
  1062.     int        trigger ;
  1063.     {
  1064.       /* ペン選択ダイアログの消去 */
  1065.         MMI_SendMessage(idPenSelDlg, MM_ERASE, 0);
  1066.         MMI_SendMessage(idPenSelDlg, MM_DETACH, 0);
  1067.       /* ペンデータファイルの保存 */
  1068.         save_penlist();
  1069.       /* ペン選択ダイアログの表示 */
  1070.         MMI_SendMessage(idPenSelDlg, MM_ATTACH, 1, idDesktopAlertHyper);
  1071.         MMI_SendMessage(idPenSelDlg, MM_SHOW, 0);
  1072.         return NOERR ;
  1073.     }
  1074.  
  1075.         /*    initDataPENSEL:penselDBTNload:MJ_DBUTTONL40の呼び出し関数    */
  1076.     int    penselDBTNloadFunc(kobj, messId, argc, pev, trigger)
  1077.     int        kobj ;
  1078.     int        messId ;
  1079.     int        argc ;
  1080.     EVENT    *pev ;
  1081.     int        trigger ;
  1082.     {
  1083.       /* ペン選択ダイアログの消去 */
  1084.         MMI_SendMessage(idPenSelDlg, MM_ERASE, 0);
  1085.         MMI_SendMessage(idPenSelDlg, MM_DETACH, 0);
  1086.       /* ペンデータファイルの読み込み */
  1087.         load_penlist();
  1088.       /* ペン選択ダイアログの表示 */
  1089.         MMI_SendMessage(idPenSelDlg, MM_ATTACH, 1, idDesktopAlertHyper);
  1090.         MMI_SendMessage(idPenSelDlg, MM_SHOW, 0);
  1091.         return NOERR ;
  1092.     }
  1093.  
  1094. /*--------------------------------------------------------*/
  1095. /*         現在選択しているペン先のパターンを返す         */
  1096. /*--------------------------------------------------------*/
  1097.  
  1098. static char _pat[] =
  1099. {
  1100.       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  1101.       0,  0,  0,  0,  0, 40, 40, 40, 40, 40,  0,  0,  0,  0,  0,
  1102.       0,  0,  0, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,  0,  0,
  1103.       0,  0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,  0,
  1104.       0,  0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,  0,
  1105.       0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,
  1106.       0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,
  1107.       0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,
  1108.       0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,
  1109.       0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,
  1110.       0,  0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,  0,
  1111.       0,  0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,  0,
  1112.       0,  0,  0, 40, 40, 40, 40, 40, 40, 40, 40, 40,  0,  0,  0,
  1113.       0,  0,  0,  0,  0, 40, 40, 40, 40, 40,  0,  0,  0,  0,  0,
  1114.       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1115. };
  1116.  
  1117. Pen pensel_curpen(void)
  1118. {
  1119.     Pen pen;
  1120.     if (penlist_makeDummy(nSamplePen[nSelectPen]) != NOERR)
  1121.         return pen_new(32,32);
  1122.     list_moveTo(penList, nSamplePen[nSelectPen]);
  1123.     list_getData(penList, &pen);
  1124.     return pen;
  1125. }
  1126.  
  1127. void    pensel_getPattern(char **buf,int *wid,int *ht,int *ofsx,int *ofsy)
  1128. /* 濃度分布領域の先頭ポインタを返す(濃度は一要素1バイト、0~255) */
  1129. /* 同時に、ペン先の大きさと、基準点へのオフセットを返す */
  1130. /* 濃度分布や大きさやオフセットは、呼ばれるたびに変わるかもしれない */
  1131. {
  1132.     Pen pen;
  1133.     list_moveTo(penList, nSamplePen[nSelectPen]);
  1134.     if (list_getData(penList, &pen) == 0)
  1135.     {
  1136.         pen_getPattern(pen, buf, wid, ht);
  1137.         if (wid!=NULL) *ofsx = *wid / 2;
  1138.         if (ht!=NULL)  *ofsy = *ht / 2;
  1139.     }
  1140.     else
  1141.     {
  1142.         if (buf!=NULL)
  1143.             *buf = _pat;
  1144.         if (wid!=NULL)
  1145.             *wid = 15;
  1146.         if (ht!=NULL)
  1147.             *ht = 15;
  1148.         if (ofsx!=NULL)
  1149.             *ofsx = 7;
  1150.         if (ofsy!=NULL)
  1151.             *ofsy = 7;
  1152.     }
  1153. }
  1154.  
  1155. void    pen_getImage(char *buf,int wid,int ht, int pennum, int atr)
  1156. /*
  1157.     ペン先
  1158.  
  1159. */
  1160. {
  1161. }
  1162.