#include	<stdio.H>
#include	<egb.h>
#include	<ysuty2.h>
#include	<math.h>
#include	<string.h>


/* ちょっだけおしゃれなボタン描画ライブラリ */


#define _C(r,g,b)	((g)*1024+(r)*32+(b))		/* 色をｒｇｂで表記できる */
#define _G(a)	((a)/1024)
#define _B(a)	((a)%32)
#define _R(a)	((a)/32-_G((a))*32)
#define _MID(a,b)	(((a)+(b))/2)					/* たして二で割る */
#define	_ABS(a)	(((a)>0) ? (a) : -(a))
#define _I(a)	( ((_R(a))+(_G(a))+(_B(a)))/3 )	/* 輝度の平均を得る */


int		COLMID(int a,int b)
{
	/* aとbを分解 */
	int		aR=_R(a);	int		aG=_G(a);	int		aB=_B(a);
	int		bR=_R(b);	int		bG=_G(b);	int		bB=_B(b);

	int		n;				/* nがリターンバリュー */
	n=_C( _MID(aR,bR),_MID(aG,bG),_MID(aB,bB) );
	return	(n);
}


int		COLMIX(int	a,int	b,int	per_a,int	per_b)
{
	/* aとbを分解 */
	int		aR=_R(a);	int		aG=_G(a);	int		aB=_B(a);
	int		bR=_R(b);	int		bG=_G(b);	int		bB=_B(b);
	
	int		n,nR,nG,nB;

	nR= (aR*per_a + bR*per_b) / (per_a+per_b);
	nG= (aG*per_a + bG*per_b) / (per_a+per_b);
	nB= (aB*per_a + bB*per_b) / (per_a+per_b);

	n=_C(nR,nG,nB);
	return (n);
}


int		SHADE(int a,double b)
{
	if (b<0)
		return(1);
	/* aを分解 */
	int		aR=_R(a);	int		aG=_G(a);	int		aB=_B(a);
	
	int		n,nR,nG,nB;
	
	nR=aR*b;nG=aG*b;nB=aB*b;
	if	(nR>31)
		nR=31;
	if	(nG>31)
		nG=31;
	if	(nB>31)
		nB=31;

	n=_C(nR,nG,nB);
	return(n);
}


int		SHADE2(int a,int b,int c)
{
	if (b<0)
		return(1);
	/* aを分解 */
	int		aR=_R(a);	int		aG=_G(a);	int		aB=_B(a);
	
	int		n,nR,nG,nB;
	
	nR=aR*b/c;nG=aG*b/c;nB=aB*b/c;
	if	(nR>31)
		nR=31;
	if	(nG>31)
		nG=31;
	if	(nB>31)
		nB=31;

	n=_C(nR,nG,nB);
	return(n);
}


int		NEGATE(int a)			/* ネガポジ反転 */
{
	int		n;
	n=_C( (31-_R(a)), (31-_G(a)), (31-_B(a)) );
	return(n);
}


int		NEGINT(int a)			/* 明暗反転 */
{
	/* aを分解 */
	int		aR=_R(a);	int		aG=_G(a);	int		aB=_B(a);

	int		nR,nG,nB,n;
	int		k;

	k=aR+aG+aB;					/* k=平均の輝度*3 */
	n=31-k;						/* 明るさ反転 */
	if (k!=0)
	{
		nR=aR*n*3/k;			/* こっち(*3/k)の方が感度が良い */
		nG=aG*n*3/k;
		nB=aB*n*3/k;
	}
	else
	{
		nR=0;nG=0;nB=0;
	}
	
	if (nR>31)
		nR=31;
	if (nG>31)
		nG=31;
	if (nB>31)
		nB=31;

	n=_C(nR,nG,nB);

	return(n);
}


int		INTCHG(int a,int b)
{
	/* aを分解 */
	int		aR=_R(a);	int		aG=_G(a);	int		aB=_B(a);

	int		n,nR,nG,nB,k;

	if ( (b<0)||(b>31) )
		return(1);

	k=(aR+aG+aB);
	if (k!=0)
	{
		nR=aR*b*3/k;
		nG=aG*b*3/k;
		nB=aB*b*3/k;
	}
	else
	{
		nR=b;nG=b;nB=b;
	}

	if (nR>31)
		nR=31;
	if (nG>31)
		nG=31;
	if (nB>31)
		nB=31;

	n=_C(nR,nG,nB);
	return(n);
}


int		SLIDE(int a,int b)
{
	/* aを分解 */
	int		aR=_R(a);	int		aG=_G(a);	int		aB=_B(a);

	int		n,nR,nG,nB;
	
	nR=aR+b;nG=aG+b;nB=aB+b;

	if (nR>31)
		nR=31;
	else if (nR<0)
		nR=0;

	if (nG>31)
		nG=31;
	else if (nG<0)
		nG=0;
	
	if (nB>31)
		nB=31;
	else if (nB<0)
		nB=0;
	
	n=_C(nR,nG,nB);
	return(n);
}


int		SGB_buttonFrame(char *gwork,int x0,int y0,int x1,int y1,int up_col,
                        int low_col)
{
	YGB_color(gwork,up_col);
	YGB_line(gwork,x0,y0,x1,y0);
	YGB_line(gwork,x0,y0+1,x1-1,y0+1);
	YGB_line(gwork,x0,y0+2,x0,y1);
	YGB_line(gwork,x0+1,y0+2,x0+1,y1-1);
	
	YGB_color(gwork,low_col);
	YGB_line(gwork,x1,y1,x1,y0+1);
	YGB_line(gwork,x1-1,y1,x1-1,y0+2);
	YGB_line(gwork,x0+2,y1-1,x1-2,y1-1);
	YGB_line(gwork,x0+1,y1,x1-2,y1);
	
	int		mid_col=COLMID(up_col,low_col);
	YGB_color(gwork,mid_col);
	YGB_pset(gwork,x1,y0);
	YGB_pset(gwork,x1-1,y0+1);
	YGB_pset(gwork,x0,y1);
	YGB_pset(gwork,x0+1,y1-1);
	return(0);
}


int		SGB_holButton(char *gwork,int x0,int y0,int x1,int y1,int col)
{
	if ( ((_ABS(x0-x1))<5) || ((_ABS(y0-y1))<5) )
		return(1);
	int		up_col,low_col;				/* 上側の色、下側の色 */
	YGB_color(gwork,col);
	YGB_boxFul(gwork,x0+2,y0+2,x1-2,y1-2);
	
	up_col=INTCHG(col,8);
	low_col=INTCHG(col,24);
	SGB_buttonFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	
	return (0);
}


int		SGB_proButton(char *gwork,int x0,int y0,int x1,int y1,int col)
{
	if ( ((_ABS(x0-x1))<5 )|| ((_ABS(y0-y1))<5) )
		return(1);
	int		up_col,low_col;				/* 上側の色、下側の色 */
	YGB_color(gwork,col);
	YGB_boxFul(gwork,x0+2,y0+2,x1-2,y1-2);
	
	low_col=INTCHG(col,8);				/* 暗めの色 (輝度8) */
	up_col=INTCHG(col,24);				/* やや明るめの色 (輝度24) */
	SGB_buttonFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	
	return (0);
}


int		SGB_colButton(char *gwork,int x0,int y0,int x1,int y1,int col,int up_col,int low_col)
{
	if ( ((_ABS(x0-x1))<5 )|| ((_ABS(y0-y1))<5) )
		return(1);
	YGB_color(gwork,col);
	YGB_boxFul(gwork,x0+2,y0+2,x1-2,y1-2);
	SGB_buttonFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	
	return(0);
}


int		SGB_gradButton(char *gwork,int x0,int y0,int x1,int y1,int col,int grad,int dir)
{
	int		x,y;
	int		mx,my;
	int		dx,dy,lx,ly;
	int		newcol;

	mx=(x0+x1); my=(y0+y1);

	if (dir!=0)
	{
		lx=_ABS(x0-x1)-2;				/* lx=ボタンの大きさ */
		for (x=x0+2;x<=x1-2;x++)
		{
			dx=_ABS(x*2-mx);			/* dx=ボタンの中心からの距離の2倍 */
			newcol=COLMIX(col,grad,(lx*lx-dx*lx*2+dx*dx),(dx*dx));
			YGB_color(gwork,newcol);
			YGB_line(gwork,x,y0+2,x,y1-2);
		}
	}
	else
	{
		ly=_ABS(y0-y1)-2;
		for (y=y0+2;y<=y1-2;y++)
		{
			dy=_ABS(y*2-my);
			newcol=COLMIX(col,grad,(ly*ly-dy*ly*2+dy*dy),(dy*dy));
			YGB_color(gwork,newcol);
			YGB_line(gwork,x0+2,y,x1-2,y);
		}
	}
	return(0);
}


int		SGB_gradProButton(char *gwork,int x0,int y0,int x1,int y1,int col,int grad,int dir)
{
	if ( ((_ABS(x0-x1))<5 )||((_ABS(y0-y1))<5) )
		return(1);
	int		low_col,up_col;
	low_col=INTCHG(col,8);
	up_col=INTCHG(col,24);
	SGB_buttonFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	SGB_gradButton(gwork,x0,y0,x1,y1,col,grad,dir);
	return(0);
}


int		SGB_gradHolButton(char *gwork,int x0,int y0,int x1,int y1,int col,int grad,int dir)
{
	if ( ((_ABS(x0-x1))<5 )||((_ABS(y0-y1))<5) )
		return(1);
	int		low_col,up_col;
	up_col=INTCHG(col,8);
	low_col=INTCHG(col,24);
	SGB_buttonFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	SGB_gradButton(gwork,x0,y0,x1,y1,col,grad,dir);
	return(0);
}


int		SGB_strProButton(char *gwork,int x0,int y0,int col,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+3;
	y1=y0+fy+n*2+3;
	
	if (SGB_proButton(gwork,x0,y0,x1,y1,col)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+2,y1-2-n,str);
	
	return(0);
}


int		SGB_strHolButton(char *gwork,int x0,int y0,int col,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+3;
	y1=y0+fy+n*2+3;
	
	if (SGB_holButton(gwork,x0,y0,x1,y1,col)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+2,y1-2-n,str);
	
	return(0);
}


int		SGB_gradStrProButton(char *gwork,int x0,int y0,int col,int grad,int dir,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+3;
	y1=y0+fy+n*2+3;
	
	if (SGB_gradProButton(gwork,x0,y0,x1,y1,col,grad,dir)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+2,y1-2-n,str);
	
	return(0);
}


int		SGB_gradStrHolButton(char *gwork,int x0,int y0,int col,int grad,int dir,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+3;
	y1=y0+fy+n*2+3;
	
	if (SGB_gradHolButton(gwork,x0,y0,x1,y1,col,grad,dir)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+2,y1-2-n,str);
	
	return(0);
}


int		SGB_plateFrame(char *gwork,int x0,int y0,int x1,int y1,int up_col,int low_col)
{
	YGB_color(gwork,up_col);
	YGB_line(gwork,x0,y0,x1,y0);
	YGB_line(gwork,x0,y0,x0,y1);
	YGB_color(gwork,low_col);
	YGB_line(gwork,x0,y1,x1,y1);
	YGB_line(gwork,x1,y0,x1,y1);
	YGB_color(gwork,COLMID(up_col,low_col));
	YGB_pset(gwork,x0,y0);
	YGB_pset(gwork,x1,y1);
	return(0);
}


int		SGB_proPlate(char *gwork,int x0,int y0,int x1,int y1,int col)
{
	if ( ((_ABS(x0-x1))<3 )|| ((_ABS(y0-y1))<3) )
		return(1);
	int		up_col,low_col;				/* 上側の色、下側の色 */
	YGB_color(gwork,col);
	YGB_boxFul(gwork,x0+1,y0+1,x1-1,y1-1);
	
	low_col=INTCHG(col,8);				/* 暗めの色 (輝度8) */
	up_col=INTCHG(col,24);				/* やや明るめの色 (輝度24) */
	SGB_plateFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	
	return (0);
}


int		SGB_holPlate(char *gwork,int x0,int y0,int x1,int y1,int col)
{
	if ( ((_ABS(x0-x1))<3 )|| ((_ABS(y0-y1))<3) )
		return(1);
	int		up_col,low_col;				/* 上側の色、下側の色 */
	YGB_color(gwork,col);
	YGB_boxFul(gwork,x0+1,y0+1,x1-1,y1-1);
	
	low_col=INTCHG(col,24);
	up_col=INTCHG(col,8);
	SGB_plateFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	
	return (0);
}


int		SGB_colPlate(char *gwork,int x0,int y0,int x1,int y1,int col,int up_col,int low_col)
{
	if ( ((_ABS(x0-x1))<3 )|| ((_ABS(y0-y1))<3) )
		return(1);
	YGB_color(gwork,col);
	YGB_boxFul(gwork,x0+1,y0+1,x1-1,y1-1);
	SGB_plateFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	
	return(0);
}


int		SGB_gradProPlate(char *gwork,int x0,int y0,int x1,int y1,int col,int grad,int dir)
{
	if ( ((_ABS(x0-x1))<3 )||((_ABS(y0-y1))<3) )
		return(1);
	int		low_col,up_col;
	low_col=INTCHG(col,8);
	up_col=INTCHG(col,24);
	SGB_plateFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	SGB_gradButton(gwork,x0-1,y0-1,x1+1,y1+1,col,grad,dir);
	return(0);
}


int		SGB_gradHolPlate(char *gwork,int x0,int y0,int x1,int y1,int col,int grad,int dir)
{
	if ( ((_ABS(x0-x1))<3 )||((_ABS(y0-y1))<3) )
		return(1);
	int		low_col,up_col;
	low_col=INTCHG(col,24);
	up_col=INTCHG(col,8);
	SGB_plateFrame(gwork,x0,y0,x1,y1,up_col,low_col);
	SGB_gradButton(gwork,x0-1,y0-1,x1+1,y1+1,col,grad,dir);
	return(0);
}


int		SGB_strProPlate(char *gwork,int x0,int y0,int col,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+1;
	y1=y0+fy+n*2+1;
	
	if (SGB_proPlate(gwork,x0,y0,x1,y1,col)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+1,y1-1-n,str);
	
	return(0);
}


int		SGB_strHolPlate(char *gwork,int x0,int y0,int col,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+1;
	y1=y0+fy+n*2+1;
	
	if (SGB_holPlate(gwork,x0,y0,x1,y1,col)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+1,y1-1-n,str);
	
	return(0);
}


int		SGB_gradStrProPlate(char *gwork,int x0,int y0,int col,int grad,int dir,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+1;
	y1=y0+fy+n*2+1;
	
	if (SGB_gradProPlate(gwork,x0,y0,x1,y1,col,grad,dir)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+1,y1-1-n,str);
	
	return(0);
}


int		SGB_gradStrHolPlate(char *gwork,int x0,int y0,int col,int grad,int dir,char *str,int fx,int fy,int n,int strcol)
{
	int		x1,y1;
	unsigned int	len;

	len=strlen(str);
	
	x1=x0+len*fx+1;
	y1=y0+fy+n*2+1;
	
	if (SGB_gradHolPlate(gwork,x0,y0,x1,y1,col,grad,dir)==1)
		return(1);
	
	YGB_fontSize(gwork,fx,fy);
	YGB_color(gwork,strcol);
	YGB_print(gwork,x0+1,y1-1-n,str);
	
	return(0);
}


