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

  1. #define MODULE_COLSEL
  2. /*
  3.  
  4. int colsel_init(void)
  5.  
  6. static void colsel_updateCurSel(void)
  7.  
  8. int    ColSelRgbSBarProc(kobj, messId, argc, pev, trigger)
  9. int    ColSelColListWinProc(kobj, messId, argc, pev, trigger)
  10. int    ColSelSampleWinProc(kobj, messId, argc, pev, trigger)
  11. int    ColSelGradWinProc(kobj, messId, argc, pev, trigger)
  12.  
  13. void colsel_getPixel(PIXEL *pix)
  14.     // 現在選択している色をピクセル値(PIXEL)として得る
  15. */
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <winb.h>
  21. #include <te.h>
  22. #include <fntb.h>
  23. #include <gui.h>
  24. #include <egb.h>
  25. #include <wgb.h>
  26.  
  27. #include "art.h"
  28. #include "pic.h"
  29. #include "wgbmac.h"
  30. #include "guisub.h"
  31. #include "colsel.h"
  32.  
  33. int    idColSelDlg = -1 ;
  34. int    idColSelTitleMsg = -1 ;
  35. int    idColSelRgbSBar[3] = -1 ;
  36. int    idColSelRgbMsg[3] = -1 ;
  37. int    idColSelRgbNumMsg[3] = -1 ;
  38. int    idColSelColListWin = -1 ;
  39. int    idColSelSampleWin = -1 ;
  40. int    idColSelGradWin = -1 ;
  41.  
  42. /*--------------------------------------------------------*/
  43. /*                    モジュール内変数                    */
  44. /*--------------------------------------------------------*/
  45.  
  46. #define    LSIZE    13
  47. #define    LXNUM    6
  48. #define    LYNUM    5
  49. static int colsel_x = 0;
  50. static PIXEL colsel_pix[LXNUM*LYNUM] =
  51. {
  52.     {   0,  0,  0 },
  53.     {   0,  0,128 },
  54.     {30,30,188},
  55.     {   0,  0,255 },
  56.     {0,153,255},
  57.     {   0,255,255 },
  58.     { 128,  0,128 },
  59.     { 255,  0,255 },    // 紫
  60.     { 139,0,46},        // ワインレッド
  61.     { 128,  0,  0 },
  62.     { 255,  0,  0 },
  63.     { 255,122,0},
  64.     {255,200,0},
  65.     {255,201,139},
  66.     {255,212,198},
  67.     { 154,123,139 },  // 藤色
  68.     { 0,255,188},
  69.     {   0,128,128 }, 
  70.     {0,255,113},
  71.     {   0,128,  0 },    // 暗緑
  72.     {   0,255,  0 },     // 緑(プリミティブ)
  73.     { 120,170,0},        // うぐいす色
  74.     { 0,67,47},            // 暗ビリジャン
  75.     { 15,145,127 },        // 明ビリジャン
  76.     {  194,255,299},    // 灰白緑
  77.      { 128,128,  0 },    
  78.     { 255,255,  0 },
  79.     {  86, 86, 86 },
  80.     { 172,172,172 },
  81.     { 255,255,255 }
  82. };
  83. static PIXEL gradpix1,gradpix2;
  84. static PIXEL curpix;
  85.  
  86. /*--------------------------------------------------------*/
  87. /*                    モジュール初期化                    */
  88. /*--------------------------------------------------------*/
  89.  
  90. int        colsel_init(void)
  91. {
  92.     gradpix1 = colsel_pix[0];
  93.     gradpix2 = colsel_pix[LXNUM*LYNUM-1];
  94.     curpix = colsel_pix[colsel_x];
  95.   // 各部品のユーザー領域を設定
  96.     FRAME adj = {0,0,-1,-1};
  97.     FRAME adj2 = {1,1,-2,-2};
  98.     RM_adjustWinUser(idColSelColListWin,&adj);
  99.     RM_adjustWinUser(idColSelSampleWin,&adj2);
  100.     RM_adjustWinUser(idColSelGradWin,&adj);
  101.     return NOERR;
  102. }
  103.  
  104. /*--------------------------------------------------------*/
  105. /*                      サブルーチン                      */
  106. /*--------------------------------------------------------*/
  107.  
  108. static void colsel_updateCurSel(void)
  109. {
  110.     int bar[3],i;
  111.     static char numbuf[3][8];
  112.     pixel_getRgb(&curpix, &bar[0],&bar[1],&bar[2]);
  113.     RM_setClipVisibleAllScr();
  114.     RM_setOriginZero();
  115.     WINCLIP *clip;
  116.     WIN_beginUpDateObj(idColSelDlg, &clip);
  117.     for (i=0; i<3; i++)
  118.     {
  119.         RM_setScrollPos(idColSelRgbSBar[i], bar[i], TRUE);
  120.         sprintf(numbuf[i],"%3d",bar[i]);
  121.         MMI_SendMessage(idColSelRgbNumMsg[i],MM_SETMSG,1,numbuf[i]);
  122.         MMI_SendMessage(idColSelRgbNumMsg[i],MM_SHOW,0);
  123.     }
  124.     MMI_SendMessage(idColSelSampleWin, MM_SHOW, 0);
  125.     MMI_SendMessage(idColSelColListWin, MM_SHOW, 0);
  126.     WIN_endUpDateObj(clip);
  127.     RM_recoverOrigin();
  128.     RM_recoverClipVisible();
  129. }
  130.  
  131. /*--------------------------------------------------------*/
  132. /*                   部品の呼び出し関数                   */
  133. /*--------------------------------------------------------*/
  134.  
  135. // idColSelRgbSBar[0..2]:MJ_SCRLL40の呼び出し関数
  136. int    ColSelRgbSBarProc(int kobj, int messId, int argc, EVENT* pev, int trigger)
  137. {
  138.     int bar[3],i;
  139.     for (i=0; i<3; i++)
  140.         bar[i] = RM_getScrollPos(idColSelRgbSBar[i]);
  141.     pixel_setRgb(&colsel_pix[colsel_x], bar[0],bar[1],bar[2]);
  142.     curpix = colsel_pix[colsel_x];
  143.     colsel_updateCurSel();
  144.     return NOERR ;
  145. }
  146.  
  147. int    ColSelColListWinProc(int kobj,int messId,int argc,EVENT* pev,int trigger)
  148. // idColSelColListWin:MJ_WINDOWL40の呼び出し関数
  149. {
  150.     if (messId == MM_SHOW)
  151.     {
  152.         BEGINPAINT(kobj)
  153.         FRAME fr;
  154.         RM_getWinUserFrame(kobj,&fr);
  155.         int i,j;
  156.         for (i=0; i<LYNUM; i++)
  157.         {
  158.             for (j=0; j<LXNUM; j++)
  159.             {
  160.                 int code = COLCODE(colsel_pix[i*LXNUM+j]);
  161.                 WGB_RBOXFILL(guiEgbPtr, fr.X+j*LSIZE,fr.Y+i*LSIZE,
  162.                          LSIZE+1,LSIZE+1, code,0);
  163.                 WGB_RBOXLINE(guiEgbPtr, fr.X+j*LSIZE,fr.Y+i*LSIZE,
  164.                          LSIZE+1,LSIZE+1, RMcol(BLACK),0);
  165.             }
  166.         }
  167.         int tx,ty;
  168.         tx = fr.X + (colsel_x%LXNUM) * LSIZE;
  169.         ty = fr.Y + (colsel_x/LXNUM) * LSIZE;
  170.         WGB_RBOXLINE(guiEgbPtr, tx,ty,LSIZE+1,LSIZE+1,RMcol(WHITE),0);
  171.         ENDPAINT
  172.     }
  173.     else if (messId == MM_MOUSEON)
  174.     {
  175.         POINT pt = *(POINT*)&pev->info;
  176.         FRAME fr;
  177.         RM_getWinUserFrame(kobj, &fr);
  178.         int tx,ty;
  179.         tx = _min(LXNUM-1,(pt.x - fr.X) / LSIZE);
  180.         ty = _min(LYNUM-1,(pt.y - fr.Y) / LSIZE);
  181.         colsel_x = ty * LXNUM + tx;
  182.         curpix = colsel_pix[colsel_x];
  183.         colsel_updateCurSel();
  184.     }
  185.     return NOERR ;
  186. }
  187.  
  188. /*    initDataZCOLSEL:idColSelSampleWin:MJ_WINDOWL40の呼び出し関数    */
  189. int    ColSelSampleWinProc(kobj, messId, argc, pev, trigger)
  190. int        kobj ;
  191. int        messId ;
  192. int        argc ;
  193. EVENT    *pev ;
  194. int        trigger ;
  195. {
  196.     if (messId == MM_SHOW)
  197.     {
  198.         int col = COLCODE(curpix);
  199.         BEGINPAINT(kobj)
  200.         FRAME fr;
  201.         RM_getWinUserFrame(kobj,&fr);
  202.         WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,col,0);
  203.         ENDPAINT
  204.     }
  205.     return NOERR ;
  206. }
  207.  
  208. /*    initDataZCOLSEL:idColSelGradWin:MJ_WINDOWL40の呼び出し関数    */
  209. int    ColSelGradWinProc(kobj, messId, argc, pev, trigger)
  210. int        kobj ;
  211. int        messId ;
  212. int        argc ;
  213. EVENT    *pev ;
  214. int        trigger ;
  215. {
  216.     #define    PIXHT    12
  217.     if (messId == MM_SHOW)
  218.     {
  219.         BEGINPAINT(kobj)
  220.         FRAME fr;
  221.         RM_getWinUserFrame(kobj, &fr);
  222.         WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y+PIXHT-1,
  223.                     COLCODE(gradpix1),0);
  224.         WGB_BOXLINE(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y+PIXHT-1,
  225.                     RMcol(BLACK),0);
  226.         WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y2+1-PIXHT,fr.X2,fr.Y2,
  227.                     COLCODE(gradpix2),0);
  228.         WGB_BOXLINE(guiEgbPtr,fr.X,fr.Y2+1-PIXHT,fr.X2,fr.Y2,
  229.                     RMcol(BLACK),0);
  230.         WGB_BOXLINE(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,RMcol(BLACK),0);
  231.         int i,ht,y0;
  232.         y0 = fr.Y+PIXHT;
  233.         ht = (fr.Y2+1-PIXHT) - y0;
  234.         for (i=0; i<ht; i++)
  235.         {
  236.             PIXEL pix;
  237.             pix.r = ((uint)gradpix1.r*(ht-i-1) + (uint)gradpix2.r*i) / (ht-1);
  238.             pix.g = ((uint)gradpix1.g*(ht-i-1) + (uint)gradpix2.g*i) / (ht-1);
  239.             pix.b = ((uint)gradpix1.b*(ht-i-1) + (uint)gradpix2.b*i) / (ht-1);
  240.             WGB_BOXFILL(guiEgbPtr,fr.X+1,y0+i,fr.X2-1,y0+i,
  241.                         COLCODE(pix),0);
  242.         }
  243.         ENDPAINT
  244.     }
  245.     else if (messId == MM_MOUSEON)
  246.     {
  247.         POINT pt = *(POINT*)&pev->info;
  248.         FRAME fr;
  249.         RM_getWinUserFrame(kobj, &fr);
  250.         if (fr.Y+PIXHT <= pt.y && pt.y < fr.Y2+1-PIXHT)
  251.         {
  252.             int ht = fr.Y2+1-PIXHT - fr.Y+PIXHT;
  253.             int t = pt.y - fr.Y+PIXHT;
  254.             curpix.r = (gradpix1.r*(ht-1-t)+gradpix2.r*t+ht/2) / (ht-1);
  255.             curpix.g = (gradpix1.g*(ht-1-t)+gradpix2.g*t+ht/2) / (ht-1);
  256.             curpix.b = (gradpix1.b*(ht-1-t)+gradpix2.b*t+ht/2) / (ht-1);
  257.             colsel_updateCurSel();
  258.         }
  259.         else
  260.         {
  261.             if (pt.y < fr.Y+PIXHT)
  262.                 gradpix1 = colsel_pix[colsel_x];
  263.             else if (pt.y >= fr.Y2+1-PIXHT)
  264.                 gradpix2 = colsel_pix[colsel_x];
  265.             RM_setOriginZero();
  266.             RM_setClipVisibleAllScr();
  267.             MMI_SendMessage(idColSelGradWin, MM_SHOW, 0);
  268.             RM_recoverClipVisible();
  269.             RM_recoverOrigin();
  270.         }
  271.     }
  272.     #undef PIXHT
  273.     return NOERR ;
  274. }
  275.  
  276. /*--------------------------------------------------------*/
  277. /*                        補助関数                        */
  278. /*--------------------------------------------------------*/
  279.  
  280. void    colsel_getPixel(PIXEL *pix)
  281. /* 現在選択している色をピクセル値(PIXEL)として得る */
  282. {
  283.     *pix = curpix;
  284. }
  285.  
  286. void colsel_setCurPixel(PIXEL *pix)
  287. {
  288.     curpix = *pix;
  289.     colsel_pix[colsel_x] = *pix;
  290.     colsel_updateCurSel();
  291. }
  292.