/*===========================================
          DolphMorph（ドルフモーフ）

      モーフィング＆変形アニメ作成ソフト

  モーフィングアルゴリズム: EAST 1994
  インターフェース作成:     松内 良介 1994
===========================================*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>

#include <time.h>

#include "morph.h"
#include "image.h"
#include "desktop.h"
#include "imstore.h"
#include "guisub.h"
#include "alert.h"


int	idMovieWin = -1 ;
int	idMovieTitleDBtn = -1 ;
int	idMovieTitleMsg = -1 ;
int	idMovieFrameMsg = -1 ;
int	idMovieEndDBtn = -1 ;

	#define	IMWIDTH		320
	#define	IMHEIGHT	240
	static FRAME frAdjWinUser = {16,24, 16+320-1, 24+240-1};

	static int bEnd;
	static int nDispFrame;
	static IMAGE *piDisp;

	int	movie_checkPlay(void)
	{
		int framenum;
		framenum = imstore_getFrameNum();
		if (framenum <= 0)
			return -1;
		else
			return 0;
	}

	void movie_play(void)
	{
		RM_adjustWinUser(idMovieWin, &frAdjWinUser);
		RM_moveCenter(idMovieWin);
		FRAME fr;
		int framenum;
		framenum = imstore_getFrameNum();
		if (framenum <= 0)
		{
			dispAlertMessage("動画再生", "動画倉庫に画像が１つもないので"
							 "再生できません");
			goto END;
		}
		if ((piDisp = image_new(IMWIDTH/2,IMHEIGHT/2)) == NULL)
			goto END;	// ★警告表示
		MTL_setFlagObj(idDesktopSelectiveHyper, MS_UNSELECT) ;
		MMI_SendMessage(idMovieWin, MM_ATTACH, 1, idDesktopAlertHyper);
		MMI_SendMessage(idMovieWin, MM_SHOW, 0);
		bEnd = FALSE;
		nDispFrame = 0;
		while (!bEnd)
		{
			unsigned int clk1,clk2;
			clk1 = clock();
			image_zoomdown(piDisp, imstore_getFrame(nDispFrame));
			RM_getWinUserFrame(idMovieWin, &fr);
			MG_mosDisp(2);
			WINCLIP *pwclp;
			RM_setClipWinUser(idMovieWin, &pwclp);
			image_disp(piDisp, fr.lupx, fr.lupy, IMWIDTH, IMHEIGHT);
			RM_resetClipWinUser(pwclp);
			static char msg[30];
			sprintf(msg, "    Frame %d/%d    ", nDispFrame+1, framenum);
			MMI_SendMessage(idMovieFrameMsg, MM_SETMSG, 1, msg);
			WIN_beginUpDateObj(idMovieFrameMsg, &pwclp);
			MMI_SendMessage(idMovieFrameMsg, MM_SHOW, 0);
			WIN_endUpDateObj(pwclp);
			MG_mosDisp(3);
			do {
				EVENT *pev;
				MMI_iosense();
				if (MMI_GetEvnt(EVALL, &pev) == NOERR)
					MMI_ExecEvnt(pev);
				clk2 = clock();
			} while (!bEnd && (clk2-clk1)*8 < CLOCKS_PER_SEC);
			nDispFrame = (nDispFrame+1) % framenum;
		} 
		MMI_SendMessage(idMovieWin, MM_ERASE, 0);
		MMI_SendMessage(idMovieWin, MM_DETACH, 0);
		MTL_resetFlagObj(idDesktopSelectiveHyper, ~MS_UNSELECT) ;
		image_delete(piDisp);
	   END:;
	}

/*	initDataZMOVIE:idMovieWin:MJ_WINDOWL40の呼び出し関数	*/
int	MovieWinFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if (messId == MM_SHOW)
	{
		FRAME fr;
		RM_getWinUserFrame(idMovieWin, &fr);
		image_disp(piDisp, fr.lupx, fr.lupy, IMWIDTH, IMHEIGHT);
	}
	else if (messId == MM_MOVE)
	{
		RM_roundFramePosition(idMovieWin, 2,2);
		FRAME fr;
		RM_getWinUserFrame(idMovieWin, &fr);
		image_disp(piDisp, fr.lupx, fr.lupy, IMWIDTH, IMHEIGHT);
	}
	return NOERR ;
}

/*	initDataZMOVIE:idMovieEndDBtn:MJ_DBUTTONL40の呼び出し関数	*/
int	MovieEndDBtnFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	bEnd = TRUE;
	return NOERR ;
}

