#if 0
		●スクロールバー付属の数値表示の更新
	static	void	setParaSoftMsg(int bRedraw)
	static	void	setParaRoughMsg(int bRedraw)
	static	void	setParaWaitMsg(int bRedraw)

		●モジュールの初期化・終了
			int		init_movfile(void)
			void	end_movfile(void)

		●ＭＯＶファイル作成中に呼ばれる通信関数
	static	int		movfile_loadframe(char *buf, int nFrame,
									  int *nWidth, int *nHeight)
	static	int		movfile_recsucceed(int nFrame)

		●ＭＯＶファイル作成（デスクトップメニューから呼び出される）
			int movfile_checkRec(void)
			void	movfile_rec(void)

		●ＭＯＶファイル再生（デスクトップメニューから呼び出される）
			void	movfile_play(void)


#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <wgb.h>
#include <msdos.cf>
#include <file_dlg.h>
#include <snd.h>
#include <egb.h>

#include "morph.h"
#include "desktop.h"
#include "points.h"
#include "wgbmac.h"
#include "guisub.h"
#include "image.h"
#include "fifo.h"
#include "domorph.h"
#include "imstore.h"
#include "morphgo.h"
#include "alert.h"
#include "sub.h"
#include "movfile.h"
#include "ugoku.h"

#include "makemov.h"

	int	idMovRecWin = -1 ;
	int	idMovRecParaSoftSBar = -1 ;
	int	idMovRecParaRoughSBar = -1 ;
	int	idMovRecPremoveTIcon[2] = {-1,-1} ;
	int	idMovRecParaWaitSBar = -1 ;
	int	idMovRecParaSoftMsg = -1 ;
	int	idMovRecParaRoughMsg = -1 ;
	int	idMovRecParaWaitMsg = -1 ;
	int	idMovRecOkDBtn = -1 ;
	int	idMovRecCancelDBtn = -1 ;
	int	idMovRecOkMsg = -1 ;
	int	MovRecCancelMsg = -1 ;
	int	idMovRecInfoMsg = -1 ;
	int	idMovRecSucceedWin = -1 ;
	int	idMovRecSucceedMsg = -1 ;
	int	idMovRecAddWin = -1 ;
	int	idMovRecAddDBtn[3] = -1 ;

	static int nParaPremove = 0;	// 0:あり  1:なし
	static int nParaSoft = 0;
	static int nParaRough = 3;
	static int nParaWait = 0;

/*--------------------------------------------------------*/
/*           スクロールバー付属の数値表示の更新           */
/*--------------------------------------------------------*/

	static void setParaSoftMsg(int bRedraw)
	{
		static char msg[3];
		sprintf(msg,"%2d",nParaSoft);
		MMI_SendMessage(idMovRecParaSoftMsg, MM_SETMSG, 1, msg);
		if (bRedraw)
			MMI_SendMessage(idMovRecParaSoftMsg, MM_SHOW, 0);
	}

	static void setParaRoughMsg(int bRedraw)
	{
		static char msg[3];
		sprintf(msg,"%2d",nParaRough);
		MMI_SendMessage(idMovRecParaRoughMsg, MM_SETMSG, 1, msg);
		if (bRedraw)
			MMI_SendMessage(idMovRecParaRoughMsg, MM_SHOW, 0);
	}

	static void setParaWaitMsg(int bRedraw)
	{
		static char msg[3];
		sprintf(msg,"%2d",nParaWait);
		MMI_SendMessage(idMovRecParaWaitMsg, MM_SETMSG, 1, msg);
		if (bRedraw)
			MMI_SendMessage(idMovRecParaWaitMsg, MM_SHOW, 0);
	}

/*--------------------------------------------------------*/
/*                モジュールの初期化・終了                */
/*--------------------------------------------------------*/

	int		init_movfile(void)
	{
		RM_initRadioButton(idMovRecPremoveTIcon,INTNUM(idMovRecPremoveTIcon),
						   &nParaPremove);
		RM_setScrollRange(idMovRecParaSoftSBar, 1, 17, FALSE);
		RM_setScrollPos(idMovRecParaSoftSBar, nParaSoft, FALSE);
		setParaSoftMsg(FALSE);
		RM_setScrollRange(idMovRecParaRoughSBar, 1, 17, FALSE);
		RM_setScrollPos(idMovRecParaRoughSBar, nParaRough, FALSE);
		setParaRoughMsg(FALSE);
		RM_setScrollRange(idMovRecParaWaitSBar, 1, 100, FALSE);
		RM_setScrollPos(idMovRecParaWaitSBar, nParaWait,FALSE);
		setParaWaitMsg(FALSE);
		return 0;
	}
	
	void	end_movfile(void)
	{
	}

/*--------------------------------------------------------*/
/*         フレームデータをMOV保存ルーチンに渡す          */
/*--------------------------------------------------------*/

	static int movfile_loadframe(char *buf, int nFrame,
								 int *nWidth, int *nHeight)
		// buf : ３２０×２４０×２バイトのバッファ
	{
		IMAGE *pi;
		if (nFrame >= imstore_getFrameNum())
			return -1;
		pi = imstore_getFrame(nFrame);
		int i;
		memset(buf,0,320*240*2);
		for (i=0; i<_min(240,pi->virht); i++)
		{
			memcpy(buf+320*2*i, pi->image+pi->width*2*i,
				   _min(pi->virwid,320)*2);
		}
		if (nWidth != NULL)
			*nWidth = pi->virwid;
		if (nHeight != NULL)
			*nHeight = pi->virht;
		return 0;
	}

	static int movfile_recsucceed(int nFrame)
	{
		static char msg[100];
		sprintf(msg,"   フレーム %d / %d   ", nFrame+1, imstore_getFrameNum());
		MMI_SendMessage(idMovRecSucceedMsg, MM_SETMSG, 1, msg);
		MMI_SendMessage(idMovRecSucceedMsg, MM_SHOW, 0);
		return 0;
	}

/*--------------------------------------------------------*/
/* ＭＯＶファイル作成（デスクトップメニューから呼び出し） */
/*--------------------------------------------------------*/

	static int bExec;
	static int nAddSelect;

	int movfile_checkRec(void)
	{
		if (imstore_getFrameNum() <= 0)
			return -1;
		else
			return 0;
	}

	void movfile_rec(void)
	{
		if (imstore_getFrameNum() <= 0)
		{
			dispAlertMessage("動画ファイル(MOV)作成",
				"動画倉庫に画像が登録されていないので、動画ファイルを"
				"作成することができません");
			return;
		}
	  // MOVファイルパラメータの設定
		{
		  // ドット数、フレーム数の表示
			static char msg[70];
			if (imstore_getFrameNum() > 0)
			{
				IMAGE *pi = imstore_getFrame(0);
				sprintf(msg, "   %d×%d pixels, %d frame(s)   ",
						pi->virwid, pi->virht, imstore_getFrameNum());
			}
			else
				strcpy(msg, "                                ");
			MMI_SendMessage(idMovRecInfoMsg, MM_SETMSG, 1, msg);
		}
		bExec = 0;
		MORPH_dispWinAlert(idMovRecWin);
		MMI_ExecSystem();
		MORPH_eraseWinAlert(idMovRecWin);
		if (!bExec)
			return;
	  // ファイル名の入力
		int ret;
		char pathbuf[100];
		ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
							   "動画(MOV)作成", "作成", "取消",
							   "*.MOV", FDG_FILEONLY|FDG_TEXT, pathbuf);
		if (ret != 0)
			return;	// 「取消」
		char	drive[_MAX_DRIVE+2],dir[_MAX_DIR+2],basename[_MAX_FNAME+2],
				ext[_MAX_EXT+2];
		_splitpath(pathbuf, drive, dir, basename, ext);
		_makepath(pathbuf, drive, dir, basename, "MOV");
	  // 既存ファイル存在のチェック
		nAddSelect = 1;
		if (fexist(pathbuf))
		{
			MORPH_dispWinAlert(idMovRecAddWin);
			MMI_ExecSystem();
			MORPH_eraseWinAlert(idMovRecAddWin);
			if (nAddSelect == 2)
				return;	// 「取消」ボタン
		}
	  // MOVファイルの作成（進行状況も表示）
		int moscsr;
		MG_PushPtr(MOSICON_WAIT, &moscsr);
		MORPH_dispWinAlert(idMovRecSucceedWin);
		MOVPARA para;
		para.soft = nParaSoft;
		para.rough = nParaRough;
		para.premove = (nParaPremove == 0 ? 1 : 0);
		para.wait = nParaWait;
		para.add = (nAddSelect == 0 ? 1 : 0);
		int err;
		err = mov_save(pathbuf, imstore_getFrameNum(),
					   movfile_loadframe, movfile_recsucceed, &para);
		MORPH_eraseWinAlert(idMovRecSucceedWin);
		MG_PopPtr(moscsr);
		if (err == -2)
			alert_noMemory("動画(MOV)ファイル作成");
	}

/*--------------------------------------------------------*/
/*               ＭＯＶ再生中のチェック関数               */
/*--------------------------------------------------------*/

	int movfile_playcheck()
	{
		int sw;

	/*	注意:sw 押されているとbit off 押されてないとbit on 	*/

		SND_joy_in_1( 0xff, &sw );		/* end check */
		sw = (sw ^ 0xff) & 0x30;
		if( sw == 0 )return 0;
	c01:	SND_joy_in_1( 0xff, &sw );
		sw = (sw ^ 0xff) & 0x30;
		if( sw & 0x10 ){
			while( sw == 0x30 ){
				SND_joy_in_1( 0xff, &sw );
				sw = (sw ^ 0xff) & 0x30;
			}
			if( sw == 0x20 )goto c02;
			while( sw ){
				SND_joy_in_1( 0xff, &sw );
				sw = (sw ^ 0xff) & 0x30;
				if( sw == 0x30 )break;
			}
			return 1;
		}
	c02:	if( sw )goto c01;
		return -1;
	}

/*--------------------------------------------------------*/
/*        ＭＯＶファイル再生(called from desktop)         */
/*--------------------------------------------------------*/

	void movfile_play(void)
	{
		int err;
		err = 0;
	  // ファイル名の入力
		int ret;
		char pathbuf[100];
		ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
							   "動画(MOV)再生", "再生", "取消",
							   "*.MOV", FDG_FILEONLY, pathbuf);
		if (ret != 0)
			return;	// 「取消」
		MMI_SendMessage(MMI_GetBaseObj(), MM_ERASE, 0);
		MG_mosDisp(2);
	  // 画面の設定
		EGB_writePage(guiEgbPtr, 0);
		EGB_color(guiEgbPtr, 1, 0);	// backcolor
		EGB_clearScreen(guiEgbPtr);
		EGB_writePage(guiEgbPtr, 1);
	  // 再生
		int nFrame,x0,y0,x1,y1,wsize;
		if (mov_disk_play_init(pathbuf, movfile_playcheck, &nFrame,
							   &x0,&y0,&x1,&y1,&wsize) != 0)
			goto END;
		char *work;
		if ((work = TL_malloc(wsize+320*240*2)) == NULL)
			{err = -2; goto END;}
		int s ;
		SND_get_elevol_mute( &s ) ;
		SND_elevol_mute( s | 0x03 ) ;
		EGB_displayStart(guiEgbPtr,3,0,0);
		EGB_displayStart(guiEgbPtr,2,2,2);
		int wid,ht;
		wid = _min(320,x1-x0+1);
		ht  = _min(240,y1-y0+1);
		EGB_displayStart(guiEgbPtr,0,(320-wid)/2,(240-ht)/2);
		EGB_displayStart(guiEgbPtr,1,0,0);
		EGB_displayStart(guiEgbPtr,3,320-(320-wid)/2,240-(240-ht)/2);
		mov_disk_play_repeat(work,work+153600,pathbuf,1,0,-1);
		EGB_displayStart(guiEgbPtr,3,0,0);
		EGB_displayStart(guiEgbPtr,2,2,2);
		EGB_displayStart(guiEgbPtr,0,0,0);
		EGB_displayStart(guiEgbPtr,1,0,0);
		EGB_displayStart(guiEgbPtr,3,320,240);
		SND_elevol_mute( s ) ;
		TL_free(work);
	   END:
		EGB_writePage(guiEgbPtr, 0);
		MG_mosDisp(3);
		MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0);
		if (err == -2)
			alert_noMemory("動画(MOV)ファイル再生");
	}

/*--------------------------------------------------------*/
/*                   部品の呼び出し関数                   */
/*--------------------------------------------------------*/

	/*	initDataZMOVFILE:idMovRecWin:MJ_WINDOWL40の呼び出し関数	*/
	int	MovRecFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		return NOERR ;
	}

	/*	initDataZMOVFILE:idMovRecParaSoftSBar:MJ_SCRLL40の呼び出し関数	*/
	int	idMovRecParaSoftSBarFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		nParaSoft = RM_getScrollPos(kobj);
		setParaSoftMsg(TRUE);
		return NOERR ;
	}

	/*	initDataZMOVFILE:idMovRecParaRoughSBar:MJ_SCRLL40の呼び出し関数	*/
	int	idMovRecParaRoughSBarFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		nParaRough = RM_getScrollPos(kobj);
		setParaRoughMsg(TRUE);
		return NOERR ;
	}

	/*	initDataZMOVFILE:idMovRecPremoveTIcon[0]:MJ_TICONL40の呼び出し関数	*/
	/*	initDataZMOVFILE:idMovRecPremoveTIcon[1]:MJ_TICONL40の呼び出し関数	*/
	int	MovRecParaPremoveTIconFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		RM_pushRadioButton(kobj, idMovRecWin, idMovRecPremoveTIcon,
						   INTNUM(idMovRecPremoveTIcon), &nParaPremove);
		desktop_checkActivity();
		return NOERR ;
	}

	/*	initDataZMOVFILE:idMovRecParaWaitSBar:MJ_SCRLL40の呼び出し関数	*/
	int	idMovRecParaWaitSBarFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		nParaWait = RM_getScrollPos(kobj);
		setParaWaitMsg(TRUE);
		return NOERR ;
	}

	/*	initDataZMOVFILE:idMovRecOkDBtn:MJ_DBUTTONL40の呼び出し関数	*/
	int	MovRecOkFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		bExec = 1;
		MMI_SetHaltFlag(TRUE);
		return NOERR ;
	}

	/*	initDataZMOVFILE:idMovRecCancelDBtn:MJ_DBUTTONL40の呼び出し関数	*/
	int	MovRecCancelFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		bExec = 0;
		MMI_SetHaltFlag(TRUE);
		return NOERR ;
	}

	/*	initDataZMOVFILE:idMovRecAddDBtn[0]:MJ_DBUTTONL40の呼び出し関数	*/
	/*	initDataZMOVFILE:idMovRecAddDBtn[1]:MJ_DBUTTONL40の呼び出し関数	*/
	/*	initDataZMOVFILE:idMovRecAddDBtn[2]:MJ_DBUTTONL40の呼び出し関数	*/
	int	MovRecAddDBtnFunc(kobj, messId, argc, pev, trigger)
	int		kobj ;
	int		messId ;
	int		argc ;
	EVENT	*pev ;
	int		trigger ;
	{
		if (kobj == idMovRecAddDBtn[0])
			nAddSelect = 0;
		else if (kobj == idMovRecAddDBtn[1])
			nAddSelect = 1;
		else if (kobj == idMovRecAddDBtn[2])
			nAddSelect = 2;
		MMI_SetHaltFlag(TRUE);
		return NOERR ;
	}

