#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();
}
