#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <tifflib.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include "ugoku.h"
#include "mrcdef.h"

extern	int		mouseSwCheck() ;
extern	int		errorCheck( int ) ;

extern	char	*guiEgbPtr ;	/*	EGB のワークアドレス	*/
extern	char	*rbuf ;			/*	自家製のワークアドレス	*/
extern	char	*bbuf ;			/*	自家製のワークアドレス	*/

extern int	baseDialogId ;

int	setDialogId = -1 ;
int	setMesId[17] = -1 ;
int	setOKBtnId = -1 ;
int	setCanBtnId = -1 ;
int	setSubDialogId = -1 ;
int	waitNumId = -1 ;
int	setBtnId[9] = -1 ;

static	int playMode = 0 ;	/* memory or disk */
static	int movZoom = 1 ;
static	int loop = 1 ;
static	int wait = 0 ;
static	int setFlag ;
static	int movx0 ;
static	int movy0 ;
static	int movx1 ;
static	int movy1 ;

/* 再生 */
movPlay( namemov )
char *namemov ;
{
	extern r_waku_clear1( int, int, int ) ;
	extern r_waku_clear2( int, int, int ) ;
	extern r_waku_del() ;
	extern r_panel_make( int, int, int, int ) ;
	extern r_panel_del() ;

	int error ;
	int i, ret, zoomkioku ;
	int movframe, movwait ;

	ret = mov_head_read_and_dsp( namemov, &movframe, &movx0, &movy0,
	&movx1, &movy1, &movwait, 1, TL_malloc, TL_free );

	if( ret == NOERR )
	{
		r_mov_graph_init( movZoom+1, movx0,movy0,movx1,movy1 ) ;
									/* 倍率にあわせて画面設定 */
//		MG_mosDisp( 0 ) ;

		r_waku_clear1( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;
		EGB_displayPage(guiEgbPtr,0,3);

//		MG_mosDisp( 1 ) ;
	}
	else
		return ret ;

v01:
	/* マウスが押されていれば次のイベントを無視 */
	if( mouseSwCheck() )TL_setInvalidMosFlag() ;

	MMI_SendMessage( setDialogId, MM_ATTACH, 1, baseDialogId ) ;

	for( i=2 ; i<8 ; i++ )	/* ボタンクリアー(2〜8) (0,1は存在しない) */
		MTL_resetFlagObj( setBtnId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
	MTL_setFlagObj( setBtnId[playMode+2], (MS_UNSELECT | MS_TOGGLE) ) ;
	MTL_setFlagObj( setBtnId[movZoom+4], (MS_UNSELECT | MS_TOGGLE) ) ;
	if( loop == 1 )	MTL_setFlagObj( setBtnId[8], MS_TOGGLE ) ;
	else			MTL_resetFlagObj( setBtnId[8], (~MS_TOGGLE) ) ;

	MMI_SendMessage( setDialogId, MM_SHOW, 0 ) ;		/* 見せる */
	zoomkioku = movZoom ;

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( setDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( setDialogId, MM_DETACH, 0 ) ;
	loop = (MTL_checkFlagObj( setBtnId[8], MS_TOGGLE )==MS_TOGGLE) ? 1:0 ;

	error = 0 ;
	if( setFlag == TRUE )
	{
		MG_mosDisp( 0 ) ;

		if( movZoom != zoomkioku )	/* 倍率の変更があるとき */
		{
			r_waku_del() ;
			r_mov_graph_init( movZoom+1, movx0,movy0,movx1,movy1 ) ;
										/* 倍率にあわせて画面設定 */
		}
		r_panel_make( 0, 0, 639, 19 ) ;
		r_waku_clear2( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;

		MG_mosDisp( 0 ) ;

		if( playMode == 0 )
		{
			error = r_mov_memory_play( namemov, wait, loop, 0 ) ;
		}
		else
		{
			error = r_mov_disk_play( namemov, wait, loop, 0 ) ;
		}

		MMI_FlushEvnt() ;
		MG_mosDisp( 1 ) ;

		r_waku_clear1( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;
		r_panel_del() ;

	}
	else
	{
		r_waku_del() ;
		r_panel_del() ;
		EGB_displayPage(guiEgbPtr,0,1);
		return NOERR ;
	}

	if( error )
	{
		errorCheck( error ) ;
	}
	else
	{
		goto v01 ;
	}

	r_waku_del() ;
	EGB_displayPage(guiEgbPtr,0,1);

	return NOERR ;
}

/*	initDataIRCSET:setOKBtnId:MJ_DBUTTONL40の呼び出し関数	*/
/*	initDataIRCSET:setCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	setOKchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == setOKBtnId )
		setFlag = TRUE ;
	else
		setFlag = FALSE ;
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	ウェイト値を設定	*/
/*	initDataIMVSET:waitNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	waitSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;
	MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
										&var, &min, &max, &delta, &ptColumn ) ;
	wait = var ;
	return NOERR ;
}

/*	再生領域を設定（ラジオボタン）	*/
/*	initDataIMVSET:setBtnId[2]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[3]:MJ_TICONL40の呼び出し関数	*/
int	playSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == setBtnId[2] )
	{
		MTL_setFlagObj( setBtnId[2], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[3], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[3], MM_SHOW, 0 ) ;
		playMode = 0 ;			/*	メモリ再生	*/
	}
	else
	{
		MTL_resetFlagObj( setBtnId[2], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MTL_setFlagObj( setBtnId[3], MS_UNSELECT ) ;
		MMI_SendMessage( setBtnId[2], MM_SHOW, 0 ) ;
		playMode = 1 ;			/*	ディスク再生	*/
	}
	return NOERR ;
}

/*	拡大率を設定（ラジオボタン）	*/
/*	initDataIMVSET:setBtnId[4]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[5]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[6]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[7]:MJ_TICONL40の呼び出し関数	*/
int	zoomSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == setBtnId[4] )
	{
		MTL_setFlagObj( setBtnId[4], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[movZoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[movZoom+4], MM_SHOW, 0 ) ;
		movZoom = 0 ;			/*	0.5倍	*/
	}
	else
	if( kobj == setBtnId[5] )
	{
		MTL_setFlagObj( setBtnId[5], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[movZoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[movZoom+4], MM_SHOW, 0 ) ;
		movZoom = 1 ;			/*	１倍	*/
	}
	else
	if( kobj == setBtnId[6] )
	{
		MTL_setFlagObj( setBtnId[6], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[movZoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[movZoom+4], MM_SHOW, 0 ) ;
		movZoom = 2 ;			/*	1.5倍	*/
	}
	else
	{
		MTL_setFlagObj( setBtnId[7], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[movZoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[movZoom+4], MM_SHOW, 0 ) ;
		movZoom = 3 ;			/*	２倍	*/
	}
	return NOERR ;
}

/* on memory type */

r_mov_memory_play( name, wait, rep, page )
char *name;
int wait, rep, page;
{
	extern int playCheck() ;

	char *work ;
	int frame,x0,y0,x1,y1,wsize;
	int error;

	r_mov_dual_frame_set( name ) ;

	error
	 = mov_memory_play_init( name, playCheck,&frame,&x0,&y0,&x1,&y1,
	 &wsize );
	if( error )goto vd10;

	if( (work = (char *)TL_malloc( wsize )) == NULL ){
		error = 7;
		goto vd10;			/* out of memory */
	}

		/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s | 0x03 ) ;

	error = mov_memory_play_repeat( rbuf, work, name, 2, wait, -rep);

	SND_elevol_mute( s ) ;

	TL_free( work );
vd10:
	r_mov_dual_frame_end() ;
	return error;
}

/* disk read type */

r_mov_disk_play( name, wait, rep, page )
char *name;
int wait, rep, page;
{
	extern int playCheck() ;

	char *work ;
	int frame,x0,y0,x1,y1,wsize;
	int error;

	r_mov_dual_frame_set( name ) ;

	error
	 = mov_disk_play_init( name, playCheck,&frame,&x0,&y0,&x1,&y1,
	  &wsize );
	if( error )goto vd10;

	if( (work = (char *)TL_malloc( wsize )) == NULL ){
		error = 7;
		goto vd10;			/* out of memory */
	}

		/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s | 0x03 ) ;

	error = mov_disk_play_repeat( rbuf, work, name, 2, wait, -rep);

	SND_elevol_mute( s ) ;

	TL_free( work );
vd10:
	r_mov_dual_frame_end() ;
	return error;
}

r_mov_dual_frame_set( char *name )
{
	int x[4], y[4] ;

	r_mov_graph_init_sub( movZoom+1, movx0,movy0,movx1,movy1, x, y ) ;

	if( (x[0] > 0) || (y[0] > 0) )
		r_mov_dual_frame_set_sub() ;

	EGB_displayPage(guiEgbPtr,0,0);

	EGB_resolution(guiEgbPtr,0,10);
	EGB_resolution(guiEgbPtr,1,10);

	EGB_writePage(guiEgbPtr,0);

	EGB_displayStart(guiEgbPtr,3,0,0);
	EGB_displayStart(guiEgbPtr,2,1,1);
	EGB_displayStart(guiEgbPtr,2,x[2],y[2]);
	EGB_displayStart(guiEgbPtr,0,x[0],y[0]);
	EGB_displayStart(guiEgbPtr,1,x[1],y[1]);
	EGB_displayStart(guiEgbPtr,3,x[3],y[3]);

	int frame, x0, y0, x1, y1, wait ;

	mov_head_read_and_dsp( name, &frame, &x0, &y0,
	   &x1, &y1, &wait, 0, TL_malloc, TL_free );

	EGB_displayPage(guiEgbPtr,0,1);

	EGB_writePage(guiEgbPtr,1);

	EGB_color(guiEgbPtr,1,0x8000);
	EGB_clearScreen(guiEgbPtr);

	EGB_displayStart(guiEgbPtr,3,0,0);
	EGB_displayStart(guiEgbPtr,2,1,1);
	EGB_displayStart(guiEgbPtr,2,x[2],y[2]);
	EGB_displayStart(guiEgbPtr,0,x[0],y[0]);
	EGB_displayStart(guiEgbPtr,1,x[1],y[1]);
	EGB_displayStart(guiEgbPtr,3,x[3],y[3]);

	EGB_displayPage(guiEgbPtr,0,3);
	EGB_writePage(guiEgbPtr,0);

	return NOERR ;
}

static r_mov_dual_frame_set_sub()
{
	int i ;
	char para[64] ;

	DWORD( para + 0 ) = 1 ;
	DWORD( para + 4 ) = 6 ;

	for( i=12 ; i>=0 ; i-- )
	{
		BYTE( para + 8 ) = i*16 ;
		BYTE( para + 9 ) = i*16 ;
		BYTE( para + 10 ) = i*16 ;
		BYTE( para + 11 ) = 0 ;
		EGB_palette( guiEgbPtr, 1, para );
	}

	return NOERR ;
}

r_mov_dual_frame_end()
{
	int x[4], y[4] ;
	WINCTRL *pctrl ;
	WINCLIP *pwclp ;

	r_mov_graph_init_sub( movZoom+1, movx0,movy0,movx1,movy1, x, y ) ;

	EGB_displayPage(guiEgbPtr,0,0);

	EGB_resolution(guiEgbPtr,0,3);
	EGB_resolution(guiEgbPtr,1,10);

	EGB_writePage(guiEgbPtr,1);

	EGB_displayStart(guiEgbPtr,3,0,0);
	EGB_displayStart(guiEgbPtr,2,1,1);
	EGB_displayStart(guiEgbPtr,2,x[2],y[2]);
	EGB_displayStart(guiEgbPtr,0,x[0],y[0]);
	EGB_displayStart(guiEgbPtr,1,x[1],y[1]);
	EGB_displayStart(guiEgbPtr,3,x[3],y[3]);

	EGB_displayPage(guiEgbPtr,1,2);

	EGB_writePage(guiEgbPtr,0);			/* 画面0設定 */

	MMI_GetControl( &pctrl ) ;
	pwclp = WIN_getClipMemory( &pctrl->bound, NULL ) ;
	MMI_SendMessage( MMI_GetBaseObj(), MM_UPDATE, 1, pwclp ) ;
	WIN_freeClipMemory( pwclp ) ;
	setPalette( guiEgbPtr ) ;

	r_mov_dual_frame_end_sub() ;
//	EGB_displayPage(guiEgbPtr,0,3);

	return NOERR ;
}

static r_mov_dual_frame_end_sub()
{
	int i ;
	char para[64] ;

	DWORD( para + 0 ) = 1 ;
	DWORD( para + 4 ) = 6 ;

	for( i=0 ; i<=12 ; i++ )
	{
		BYTE( para + 8 ) = i*16 ;
		BYTE( para + 9 ) = i*16 ;
		BYTE( para + 10 ) = i*16 ;
		BYTE( para + 11 ) = 0 ;
		EGB_palette( guiEgbPtr, 1, para );

		if( i == 0 )
			EGB_displayPage(guiEgbPtr,0,3);
	}

	return NOERR ;
}

	/* 倍率にあわせて画面設定 */
/* 注意 : GUIライブラリの都合でpage1の画面を設定し,最後にpage0に切り換えてる */

r_mov_graph_init( zoom, x0,y0,x1,y1 )
int zoom, x0,y0,x1,y1;
{
	int x[4], y[4] ;

	r_mov_graph_init_sub( zoom, x0, y0, x1, y1, x, y ) ;

	EGB_displayPage(guiEgbPtr,0,1);
	EGB_writePage(guiEgbPtr,1);		/* 画面1設定 */

	EGB_displayStart(guiEgbPtr,3,0,0);
	EGB_displayStart(guiEgbPtr,2,1,1);
	EGB_displayStart(guiEgbPtr,2,x[2],y[2]);
	EGB_displayStart(guiEgbPtr,0,x[0],y[0]);
	EGB_displayStart(guiEgbPtr,1,x[1],y[1]);
	EGB_displayStart(guiEgbPtr,3,x[3],y[3]);

	EGB_writePage(guiEgbPtr,0); 	/* 画面0設定 */
	EGB_displayPage(guiEgbPtr,0,3);

	return NOERR ;
}

static r_mov_graph_init_sub
(
	int zoom, int x0, int y0, int x1, int y1, int *x, int *y
)
{
	int xd, yd ;

	xd = x1-x0+1 ;
	yd = y1-y0+1 ;

	if( 640/zoom >= xd )
	{
		x[0] = ( 640/zoom - xd )/2 ;
		x[1] = x0 ;
		x[2] = zoom ;
		x[3] = xd ;
	}
	else
	{
		x[0] = 0 ;
		x[1] = x0 - ( 640/zoom - xd )/2 ;
		x[2] = zoom ;
		x[3] = 640/zoom ;
	}

	if( 480/zoom >= yd )
	{
		y[0] = ( 480/zoom - yd )/2 ;
		y[1] = y0 ;
		y[2] = zoom ;
		y[3] = yd ;
	}
	else
	{
		y[0] = 0 ;
		y[1] = y0 - ( 480/zoom - yd )/2 ;
		y[2] = zoom ;
		y[3] = 480/zoom ;
	}

	return NOERR ;
}

