#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 <guidbg.h>

#include <block.h>

int	windowID = -1 ;
int	quitIconID = -1 ;
int	upIconID = -1 ;
int	downIconID = -1 ;

extern void userIdleTask(void);
extern EGB_BLOCK block ;
extern EGB_BLOCK2 block2 ;

//#define DEBUG

#define MINZOOM (2)
#define MAXZOOM (150)

int quitFuncRet = ILLEGAL_FUNCTION ;

unsigned int zoom ;	//倍率
unsigned int xs,ys;	//読み込むｻｲｽﾞ-1(倍率変更･ｳｨﾝﾄﾞｳをﾘｻｲｽﾞしたとき､に変わる)
unsigned int dx,dy;	// d* = x*>>1 ;
unsigned int color_mode=999;
unsigned int pixel[] = {4,8,16,24} ;
HYPER whyp ;		//ウィンドゥのハイパー
FRAME pf ;			//表示位置(ｳｨﾝﾄﾞｳを移動したりﾘｻｲｽﾞしたときに変わる)
char *buffer=NULL ;	//バッファ

void setSize(void)
{
	xs = ((pf.rdwx-pf.lupx+1)/zoom)-1;
	ys = ((pf.rdwy-pf.lupy+1)/zoom)-1;
	#ifdef DEBUG
	printf("size=(%d,%d)\n",xs,ys);
	#endif
	dx = (xs>>1);
	dy = (ys>>1);
	block2.dx = (xs+1) ;
	block2.dy = (ys+1) ;
	//画面モードをチェック
	SCREEN scrn;
	MMI_GetScreen( &scrn );
	if(scrn.mode!=color_mode)
	{	//色数が変更されている
		color_mode = scrn.mode ;
		if(buffer!=NULL) TL_free( buffer );
		int length ;
		if ( color_mode == 0 )
			length = (xs+8)/8*4*(ys+1);		//16色モード専用処理
		else
			length = (xs+8)*pixel[color_mode]/8*(ys+1);
		#ifdef DEBUG
		printf("pixel= %d\n",pixel[color_mode]);
		printf("buffer= %d bytes(%d,%d)\n",length,xs,ys);
		#endif
		buffer = TL_malloc( length );
		if(buffer == NULL)
		{	//メモリ確保失敗
			#ifdef DEBUG
			printf("TL_malloc failed\n");
			#endif
			MMI_SendMessage(quitIconID,MM_EXEC,2,0,0);
		} else
		{
			block.pixel = (char *)buffer ;
			block2.pixel = (char *)buffer ;
		}
	}

	return ;
}

void setIcon(void)
{
	FRAME fr;

	//quitIconの設定
	fr.lupx = whyp.fr.lupx+3;
	fr.lupy = whyp.fr.rdwy-17;
	fr.rdwx = fr.lupx+14;
	fr.rdwy = fr.lupy+14;
	MMI_SendMessage(quitIconID,MM_MOVE,1,&fr);
	//upIconの設定
	fr.lupx = whyp.fr.rdwx-47;
	fr.rdwx = fr.lupx+14;
	MMI_SendMessage(upIconID,MM_MOVE,1,&fr);
	//downIconの設定
	fr.lupx = whyp.fr.rdwx-32;
	fr.rdwx = fr.lupx+14;
	MMI_SendMessage(downIconID,MM_MOVE,1,&fr);

	return ;
}

void setUser(void)
{
	FRAME size;
	//ユーザー領域の設定
	pf.lupx = 3;
	pf.lupy = 3;
	pf.rdwx = (whyp.fr.rdwx-whyp.fr.lupx-5)/zoom;
	pf.rdwy = (whyp.fr.rdwy-whyp.fr.lupy-20)/zoom;
	pf.rdwx = 2+pf.rdwx*zoom;
	pf.rdwy = 2+pf.rdwy*zoom;
	#ifdef DEBUG
	printf("user=(%d,%d)-(%d,%d)\n",pf.lupx,pf.lupy,pf.rdwx,pf.rdwy);
	#endif
	size.lupx = 66;
	size.lupy = 35;
	size.rdwx = 1023;
	size.rdwy = 511;
	MMI_SendMessage(windowID,MM_SETUSER,2,&pf,&size);
	//表示位置の設定
	pf.lupx += whyp.fr.lupx;
	pf.lupy += whyp.fr.lupy;
	pf.rdwx += whyp.fr.lupx;
	pf.rdwy += whyp.fr.lupy;
	#ifdef DEBUG
	printf("put=(%d,%d)-(%d,%d)\n",pf.lupx,pf.lupy,pf.rdwx,pf.rdwy);
	#endif
	block2.x1 = pf.lupx;
	block2.y1 = pf.lupy;
	block2.x2 = pf.rdwx;
	block2.y2 = pf.rdwy;

	return ;
}

/*	initDataGUI:windowID:MJ_WINDOWL40の呼び出し関数	*/
int	windowFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if(messId==MM_SHOW)
	{
		#ifdef DEBUG
		printf("window:MM_SHOW\n");
		#endif
		setSize();

	}
	else
	if(messId==MM_MOVE || messId==MM_UPDATE)
	{
		#ifdef DEBUG
		printf("window:MM_MOVE||MM_UPDATE\n");
		#endif
		MMI_SendMessage(kobj,MM_GETHYPER,1,&whyp);
		color_mode=999;
		setUser();
		setIcon();
		setSize();
	} else return (-1) ;

	return NOERR ;
}

/*	initDataGUI:quitIconID:MJ_ICONL40の呼び出し関数	*/
int	quitFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	//メモリ開放
	if(buffer!=NULL) TL_free( buffer );
	//終了
	MMI_SetHaltFlag( TRUE );
	quitFuncRet = NOERR;
	return NOERR ;
}

/*	initDataGUI:upIconID:MJ_ICONL40の呼び出し関数	*/
/*	initDataGUI:downIconID:MJ_ICONL40の呼び出し関数	*/
int	upDownFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i;

	i=zoom;
	if(kobj==upIconID)
	{	if(zoom<MAXZOOM) zoom++; }
	else
		if(zoom>MINZOOM) zoom--;

	if(i==zoom) return NOERR ;

	color_mode = 999;
	setUser();
	setSize();
	userIdleTask();

	#ifdef DEBUG
	printf("zoom=%d\n",zoom);
	#endif

	return NOERR ;
}
