home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
COLSEL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-19
|
8KB
|
292 lines
#define MODULE_COLSEL
/*
int colsel_init(void)
static void colsel_updateCurSel(void)
int ColSelRgbSBarProc(kobj, messId, argc, pev, trigger)
int ColSelColListWinProc(kobj, messId, argc, pev, trigger)
int ColSelSampleWinProc(kobj, messId, argc, pev, trigger)
int ColSelGradWinProc(kobj, messId, argc, pev, trigger)
void colsel_getPixel(PIXEL *pix)
// 現在選択している色をピクセル値(PIXEL)として得る
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <egb.h>
#include <wgb.h>
#include "art.h"
#include "pic.h"
#include "wgbmac.h"
#include "guisub.h"
#include "colsel.h"
int idColSelDlg = -1 ;
int idColSelTitleMsg = -1 ;
int idColSelRgbSBar[3] = -1 ;
int idColSelRgbMsg[3] = -1 ;
int idColSelRgbNumMsg[3] = -1 ;
int idColSelColListWin = -1 ;
int idColSelSampleWin = -1 ;
int idColSelGradWin = -1 ;
/*--------------------------------------------------------*/
/* モジュール内変数 */
/*--------------------------------------------------------*/
#define LSIZE 13
#define LXNUM 6
#define LYNUM 5
static int colsel_x = 0;
static PIXEL colsel_pix[LXNUM*LYNUM] =
{
{ 0, 0, 0 },
{ 0, 0,128 },
{30,30,188},
{ 0, 0,255 },
{0,153,255},
{ 0,255,255 },
{ 128, 0,128 },
{ 255, 0,255 }, // 紫
{ 139,0,46}, // ワインレッド
{ 128, 0, 0 },
{ 255, 0, 0 },
{ 255,122,0},
{255,200,0},
{255,201,139},
{255,212,198},
{ 154,123,139 }, // 藤色
{ 0,255,188},
{ 0,128,128 },
{0,255,113},
{ 0,128, 0 }, // 暗緑
{ 0,255, 0 }, // 緑(プリミティブ)
{ 120,170,0}, // うぐいす色
{ 0,67,47}, // 暗ビリジャン
{ 15,145,127 }, // 明ビリジャン
{ 194,255,299}, // 灰白緑
{ 128,128, 0 },
{ 255,255, 0 },
{ 86, 86, 86 },
{ 172,172,172 },
{ 255,255,255 }
};
static PIXEL gradpix1,gradpix2;
static PIXEL curpix;
/*--------------------------------------------------------*/
/* モジュール初期化 */
/*--------------------------------------------------------*/
int colsel_init(void)
{
gradpix1 = colsel_pix[0];
gradpix2 = colsel_pix[LXNUM*LYNUM-1];
curpix = colsel_pix[colsel_x];
// 各部品のユーザー領域を設定
FRAME adj = {0,0,-1,-1};
FRAME adj2 = {1,1,-2,-2};
RM_adjustWinUser(idColSelColListWin,&adj);
RM_adjustWinUser(idColSelSampleWin,&adj2);
RM_adjustWinUser(idColSelGradWin,&adj);
return NOERR;
}
/*--------------------------------------------------------*/
/* サブルーチン */
/*--------------------------------------------------------*/
static void colsel_updateCurSel(void)
{
int bar[3],i;
static char numbuf[3][8];
pixel_getRgb(&curpix, &bar[0],&bar[1],&bar[2]);
RM_setClipVisibleAllScr();
RM_setOriginZero();
WINCLIP *clip;
WIN_beginUpDateObj(idColSelDlg, &clip);
for (i=0; i<3; i++)
{
RM_setScrollPos(idColSelRgbSBar[i], bar[i], TRUE);
sprintf(numbuf[i],"%3d",bar[i]);
MMI_SendMessage(idColSelRgbNumMsg[i],MM_SETMSG,1,numbuf[i]);
MMI_SendMessage(idColSelRgbNumMsg[i],MM_SHOW,0);
}
MMI_SendMessage(idColSelSampleWin, MM_SHOW, 0);
MMI_SendMessage(idColSelColListWin, MM_SHOW, 0);
WIN_endUpDateObj(clip);
RM_recoverOrigin();
RM_recoverClipVisible();
}
/*--------------------------------------------------------*/
/* 部品の呼び出し関数 */
/*--------------------------------------------------------*/
// idColSelRgbSBar[0..2]:MJ_SCRLL40の呼び出し関数
int ColSelRgbSBarProc(int kobj, int messId, int argc, EVENT* pev, int trigger)
{
int bar[3],i;
for (i=0; i<3; i++)
bar[i] = RM_getScrollPos(idColSelRgbSBar[i]);
pixel_setRgb(&colsel_pix[colsel_x], bar[0],bar[1],bar[2]);
curpix = colsel_pix[colsel_x];
colsel_updateCurSel();
return NOERR ;
}
int ColSelColListWinProc(int kobj,int messId,int argc,EVENT* pev,int trigger)
// idColSelColListWin:MJ_WINDOWL40の呼び出し関数
{
if (messId == MM_SHOW)
{
BEGINPAINT(kobj)
FRAME fr;
RM_getWinUserFrame(kobj,&fr);
int i,j;
for (i=0; i<LYNUM; i++)
{
for (j=0; j<LXNUM; j++)
{
int code = COLCODE(colsel_pix[i*LXNUM+j]);
WGB_RBOXFILL(guiEgbPtr, fr.X+j*LSIZE,fr.Y+i*LSIZE,
LSIZE+1,LSIZE+1, code,0);
WGB_RBOXLINE(guiEgbPtr, fr.X+j*LSIZE,fr.Y+i*LSIZE,
LSIZE+1,LSIZE+1, RMcol(BLACK),0);
}
}
int tx,ty;
tx = fr.X + (colsel_x%LXNUM) * LSIZE;
ty = fr.Y + (colsel_x/LXNUM) * LSIZE;
WGB_RBOXLINE(guiEgbPtr, tx,ty,LSIZE+1,LSIZE+1,RMcol(WHITE),0);
ENDPAINT
}
else if (messId == MM_MOUSEON)
{
POINT pt = *(POINT*)&pev->info;
FRAME fr;
RM_getWinUserFrame(kobj, &fr);
int tx,ty;
tx = _min(LXNUM-1,(pt.x - fr.X) / LSIZE);
ty = _min(LYNUM-1,(pt.y - fr.Y) / LSIZE);
colsel_x = ty * LXNUM + tx;
curpix = colsel_pix[colsel_x];
colsel_updateCurSel();
}
return NOERR ;
}
/* initDataZCOLSEL:idColSelSampleWin:MJ_WINDOWL40の呼び出し関数 */
int ColSelSampleWinProc(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
if (messId == MM_SHOW)
{
int col = COLCODE(curpix);
BEGINPAINT(kobj)
FRAME fr;
RM_getWinUserFrame(kobj,&fr);
WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,col,0);
ENDPAINT
}
return NOERR ;
}
/* initDataZCOLSEL:idColSelGradWin:MJ_WINDOWL40の呼び出し関数 */
int ColSelGradWinProc(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
#define PIXHT 12
if (messId == MM_SHOW)
{
BEGINPAINT(kobj)
FRAME fr;
RM_getWinUserFrame(kobj, &fr);
WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y+PIXHT-1,
COLCODE(gradpix1),0);
WGB_BOXLINE(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y+PIXHT-1,
RMcol(BLACK),0);
WGB_BOXFILL(guiEgbPtr,fr.X,fr.Y2+1-PIXHT,fr.X2,fr.Y2,
COLCODE(gradpix2),0);
WGB_BOXLINE(guiEgbPtr,fr.X,fr.Y2+1-PIXHT,fr.X2,fr.Y2,
RMcol(BLACK),0);
WGB_BOXLINE(guiEgbPtr,fr.X,fr.Y,fr.X2,fr.Y2,RMcol(BLACK),0);
int i,ht,y0;
y0 = fr.Y+PIXHT;
ht = (fr.Y2+1-PIXHT) - y0;
for (i=0; i<ht; i++)
{
PIXEL pix;
pix.r = ((uint)gradpix1.r*(ht-i-1) + (uint)gradpix2.r*i) / (ht-1);
pix.g = ((uint)gradpix1.g*(ht-i-1) + (uint)gradpix2.g*i) / (ht-1);
pix.b = ((uint)gradpix1.b*(ht-i-1) + (uint)gradpix2.b*i) / (ht-1);
WGB_BOXFILL(guiEgbPtr,fr.X+1,y0+i,fr.X2-1,y0+i,
COLCODE(pix),0);
}
ENDPAINT
}
else if (messId == MM_MOUSEON)
{
POINT pt = *(POINT*)&pev->info;
FRAME fr;
RM_getWinUserFrame(kobj, &fr);
if (fr.Y+PIXHT <= pt.y && pt.y < fr.Y2+1-PIXHT)
{
int ht = fr.Y2+1-PIXHT - fr.Y+PIXHT;
int t = pt.y - fr.Y+PIXHT;
curpix.r = (gradpix1.r*(ht-1-t)+gradpix2.r*t+ht/2) / (ht-1);
curpix.g = (gradpix1.g*(ht-1-t)+gradpix2.g*t+ht/2) / (ht-1);
curpix.b = (gradpix1.b*(ht-1-t)+gradpix2.b*t+ht/2) / (ht-1);
colsel_updateCurSel();
}
else
{
if (pt.y < fr.Y+PIXHT)
gradpix1 = colsel_pix[colsel_x];
else if (pt.y >= fr.Y2+1-PIXHT)
gradpix2 = colsel_pix[colsel_x];
RM_setOriginZero();
RM_setClipVisibleAllScr();
MMI_SendMessage(idColSelGradWin, MM_SHOW, 0);
RM_recoverClipVisible();
RM_recoverOrigin();
}
}
#undef PIXHT
return NOERR ;
}
/*--------------------------------------------------------*/
/* 補助関数 */
/*--------------------------------------------------------*/
void colsel_getPixel(PIXEL *pix)
/* 現在選択している色をピクセル値(PIXEL)として得る */
{
*pix = curpix;
}
void colsel_setCurPixel(PIXEL *pix)
{
curpix = *pix;
colsel_pix[colsel_x] = *pix;
colsel_updateCurSel();
}