www.pudn.com > Tierazon-v29.zip > Movie.cpp


// Movie.cpp : implementation file 
// 
  
#include "stdafx.h" 
#include "tierazon.h" 
#include "Tierazondoc.h" 
#include "Movie.h" 
#include "tierazonview.h" 
#include "external.h" 
#include "math.h" 
#include  
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMovie dialog 
 
CMovie::CMovie(CWnd* pParent /*=NULL*/) 
	: CDialog(CMovie::IDD, pParent) 
{ 
	//Create(CMovie::IDD, pParent); 
	//{{AFX_DATA_INIT(CMovie) 
	m_Frames = 0; 
	m_Magnification_Finish = 0.0; 
	m_Magnification = 0.0; 
	m_Output_File = _T(""); 
	m_Width = 0; 
	m_X_Finish = 0.0; 
	m_X_Start = 0.0; 
	m_Y_Finish = 0.0; 
	m_Y_Start = 0.0; 
	m_Height = 0; 
	m_LockFinish = FALSE; 
	m_LockStart = FALSE; 
	m_MovieRate = 0; 
	//}}AFX_DATA_INIT 
	m_pMovieView = NULL; 
} 
 
CMovie::CMovie(CView* pMovieView)  // Modeless constructor 
	: CDialog() 
{ 
	m_pMovieView = pMovieView; 
}	  
 
void CMovie::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CMovie) 
	DDX_Control(pDX, ID_CANCELMOVIE, m_CancelMovie); 
	DDX_Control(pDX, IDOK, m_OKButton); 
	DDX_Text(pDX, IDC_FRAMES, m_Frames); 
	DDX_Text(pDX, IDC_Magnif_Finish, m_Magnification_Finish); 
	DDX_Text(pDX, IDC_Magnif_Start, m_Magnification); 
	DDX_Text(pDX, IDC_Output_File, m_Output_File); 
	DDX_Text(pDX, IDC_WIDTH, m_Width); 
	DDV_MinMaxInt(pDX, m_Width, 1, 16000); 
	DDX_Text(pDX, IDC_X_Finish, m_X_Finish); 
	DDX_Text(pDX, IDC_X_Start, m_X_Start); 
	DDX_Text(pDX, IDC_Y_Finish, m_Y_Finish); 
	DDX_Text(pDX, IDC_Y_Start, m_Y_Start); 
	DDX_Text(pDX, IDC_Height, m_Height); 
	DDV_MinMaxInt(pDX, m_Height, 1, 16000); 
	DDX_Check(pDX, IDC_LOCKFINISH, m_LockFinish); 
	DDX_Check(pDX, IDC_LOCKSTART, m_LockStart); 
	DDX_Text(pDX, IDC_MOVIERATE, m_MovieRate); 
	DDV_MinMaxLong(pDX, m_MovieRate, 1, 100); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CMovie, CDialog) 
	//{{AFX_MSG_MAP(CMovie) 
	ON_BN_CLICKED(IDC_LOCKFINISH, OnLockfinish) 
	ON_BN_CLICKED(IDC_LOCKSTART, OnLockstart) 
	ON_BN_CLICKED(ID_CANCELMOVIE, OnCancelmovie) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMovie message handlers 
 
BOOL CMovie::Create() 
{ 
	return CDialog::Create(CMovie::IDD); 
	bStartButton = FALSE; 
} 
 
void CMovie::OnOK()  
{ 
	// TODO: Add extra validation here 
	 
	//CDialog::OnOK(); 
	//DestroyWindow(); 
	//SetWindowText("Start"); 
 
	//if (m_OKButton.GetState()) 
	//	AfxMessageBox("TRUE"); 
	//else 
	//	AfxMessageBox("FALSE"); 
 
	if (bStartButton) 
	{ 
		m_OKButton.SetState(TRUE); 
		return; 
	} 
 
	UpdateData(); 
	if (m_LockStart && m_LockFinish) 
	{ 
		bStartButton = TRUE; 
		AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FRACTAL_STARTGENERATINGAMOVIE); 
	} 
	else 
	{ 
		AfxMessageBox("Start and Finish Positions have not been Locked"); 
		return; 
	}	 
} 
 
void CMovie::OnCancel()  
{ 
	// TODO: Add extra cleanup here 
	 
	CDialog::OnCancel(); 
	//DestroyWindow(); 
	AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FRACTALS_MOVIE); 
} 
 
void CMovie::PostNcDestroy()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	CDialog::PostNcDestroy(); 
	//delete this; 
	//AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FRACTALS_MOVIE); 
} 
 
void CMovie::OnLockfinish()  
{ 
	UpdateData(); 
} 
 
void CMovie::OnLockstart()  
{ 
	UpdateData(); 
} 
 
void CMovie::OnCancelmovie()  
{ 
	m_pMovieView->PostMessage(WM_USER_CANCELMOVIE, NULL); 
	m_OKButton.SetState(FALSE); 
	bStartButton = FALSE; 
} 
 
////////////////////////////////////////////////////////////////// 
// CTierazon message handlers 
 
void CTierazonView::OnFractalsMovie()  
{ 
	//if (!bMovieView) 
	if (m_pMovieView->GetSafeHwnd() == 0) 
	{ 
		bNewViewSave = bNewView; 
		bNewView = FALSE;		// Don't want new views in movie preparation 
		bMovieView = TRUE; 
		bGlobalDraw = TRUE; 
		m_pMovieView->Create(); 
 
		m_pMovieView->m_Frames = frames; 
		m_pMovieView->bStartButton = FALSE; 
 
		if (AVIFileName == "") 
		{ 
			szTemp = GetDocument()->GetTitle(); 
			//szTemp.GetBufferSetLength(szTemp.GetLength()-3); 
			AVIFileName	= szTemp + ".avi"; 
		} 
 
		m_pMovieView->m_Output_File		= AVIFileName; 
		m_pMovieView->m_Width 				= dim.cx; 
		m_pMovieView->m_Height 				= dim.cy; 
		m_pMovieView->m_MovieRate     = dwMovieRate; 
		 
		// Fill disk free information 
		CString strFreeDiskSpace; 
		CString strFmt; 
		struct _diskfree_t diskfree; 
		int nDrive = _getdrive(); // use current default drive 
		if (_getdiskfree(nDrive, &diskfree) == 0) 
		{ 
			strFmt.LoadString(CG_IDS_DISK_SPACE); 
			strFreeDiskSpace.Format(strFmt, 
				(DWORD)diskfree.avail_clusters * 
				(DWORD)diskfree.sectors_per_cluster * 
				(DWORD)diskfree.bytes_per_sector / (DWORD)1024L, 
				nDrive-1 + _T('A')); 
		} 
 		else 
 			strFreeDiskSpace.LoadString(CG_IDS_DISK_SPACE_UNAVAIL); 
		m_pMovieView->SetWindowText(strFreeDiskSpace); 
 
		UpdateMovieData(); 
		m_pMovieView->ShowWindow(SW_SHOW); 
 
		bAVIFileOpen = FALSE; 
	} 
	else 
	{ 
		bStartMovie = FALSE; 
		bNewView = bNewViewSave; 
		bMovieView = FALSE; 
		// Destroy the movie dlg 
		m_pMovieView->DestroyWindow(); 
		//bLockStart = FALSE; 
		//bLockFinish = FALSE; 
 
		if (bAVIFileOpen) 
			CloseAVIFile(); 
		 
	} 
} 
 
void CTierazonView::OnUpdateFractalsMovie(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bMovieView); 
} 
 
void CTierazonView::UpdateMovieData() 
{ 
	m_pMovieView->m_Output_File == AVIFileName;  // ?? 
	 
	bGlobalDraw = TRUE; 
	if (!bLockStart) 
	{ 
		m_pMovieView->m_Magnification	= dMagnification_Start; 
		m_pMovieView->m_X_Start				= CRMID_Start; 
		m_pMovieView->m_Y_Start				= CIMID_Start; 
	}		 
		 
	if (!bLockFinish)	 
	{ 
		m_pMovieView->m_Magnification_Finish = dMagnification_Finish; 
		m_pMovieView->m_X_Finish			= CRMID_Finish; 
		m_pMovieView->m_Y_Finish			= CIMID_Finish; 
	} 
 
	// FALSE indicates data is being initialized 
	m_pMovieView->UpdateData(FALSE); 
	// TRUE indicates that data is being retrieved 
	m_pMovieView->UpdateData(TRUE); 
 
	bLockStart										= m_pMovieView->m_LockStart; 
	bLockFinish										= m_pMovieView->m_LockFinish; 
	frames												= m_pMovieView->m_Frames; 
	dwMovieRate					          = m_pMovieView->m_MovieRate; 
} 
 
void CTierazonView::OnFractalStartgeneratingamovie()  
{ 
	// TRUE indicates that data is being retrieved 
	m_pMovieView->UpdateData(TRUE); 
	bGlobalDraw = TRUE; 
 
	if (bLockStart && bLockFinish) 
	{ 
		frames = m_pMovieView->m_Frames; 
		dim.cx = m_pMovieView->m_Width; 
		dim.cy = m_pMovieView->m_Height; 
		AVIFileName = m_pMovieView->m_Output_File; 
 
		CRMID_MovieStart	= m_pMovieView->m_X_Start; 
		CRMID_MovieFinish = m_pMovieView->m_X_Finish; 
 
		CIMID_MovieStart	= m_pMovieView->m_Y_Start; 
		CIMID_MovieFinish = m_pMovieView->m_Y_Finish; 
 
		if (bOrientationVideoMode) 
		{ 
			CRMID_MovieStart	= 0; 
			CRMID_MovieFinish = 1; 
 
			CIMID_MovieStart	= 1	; 
			CIMID_MovieFinish = 0; 
 
			bZeroInit = TRUE; 
		} 
 
		dMovieMagnifStart  = m_pMovieView->m_Magnification; 
		dMovieMagnifFinish = m_pMovieView->m_Magnification_Finish; 
 
		dMagnification_Finish = dMovieMagnifFinish; 
		dMagnification = dMovieMagnifStart;  
 
		if (dMovieMagnifStart == 0 || dMovieMagnifFinish == 0) 
		{ 
			AfxMessageBox("Start or Finish magnifications cannot be zero"); 
			return; 
		}	 
 
		//if (dMovieMagnifStart > dMovieMagnifFinish) 
		//	dMovieFrameRatio = 1 - (dMovieMagnifStart-dMovieMagnifFinish)/dMovieMagnifStart; 
		//else 
		//if (dMovieMagnifStart < dMovieMagnifFinish) 
		//	dMovieFrameRatio = 1 - (dMovieMagnifFinish-dMovieMagnifStart)/dMovieMagnifFinish; 
		//else 
		//	dMovieFrameRatio = 0; 
 
		dMovieFrameRatio = fabs(dMovieMagnifStart-dMovieMagnifFinish)/(double)(frames-1); 
 
		// Don't let start at zero 
		if (CRMID_MovieStart < 1E-10 && CRMID_MovieStart > -1E-10) 
			CRMID_MovieStart = 1E-10; 
 
		if (CIMID_MovieStart < 1E-10 && CIMID_MovieStart > -1E-10) 
			CIMID_MovieStart = 1E-10; 
		 
		// Don't let finish at zero 
		if (CRMID_MovieFinish < 1E-10 && CRMID_MovieFinish > -1E-10) 
			CRMID_MovieFinish = 1E-10; 
 
		if (CIMID_MovieFinish < 1E-10 && CIMID_MovieFinish > -1E-10) 
			CIMID_MovieFinish = 1E-10; 
		 
		// Calculate Movie Center Frame Ratios 
		CRMID_FrameRatio = fabs(CRMID_MovieStart-CRMID_MovieFinish)/(double)(frames-1); 
		CIMID_FrameRatio = fabs(CIMID_MovieStart-CIMID_MovieFinish)/(double)(frames-1); 
					 
		frame = 0; 
		bStartMovie = TRUE; 
		m_pMovieView->m_OKButton.SetState(TRUE); 
 
		// AVI File Creation starts here	 
		//if (!m_dib.CreateDIB(128, 128))	// Create a bitmap 
		//{ 
		//	AfxMessageBox("Error Creating DIB"); 
		//} 
 
		// Initiaize AVI File parameters	 
		pfile = NULL; 
		pf_new = NULL; 
		//frames = 0; 
		frame = 0; 
		timer = 0; 
		tmillisecs = 10; 
		bAVIPlaying = FALSE; 
		szTotalFrames = ""; 
		szFrameNumber = ""; 
 
		// Initialize the stream info for new AVI Files 
		newstr.fccType									= streamtypeVIDEO;								// "vids" 
		//newstr.fccHandler								= mmioFOURCC('I','V','3','2'); 	// "IV32" 
		newstr.fccHandler								= NULL; 													// "IV32" 
		newstr.dwFlags									= 0;															// 0 
		newstr.dwCaps										= 0;															// 0 
		newstr.wPriority								= 0;															// 0 
		newstr.wLanguage								= 0;															// 0 
		newstr.dwScale									= 1;															// 33365 , 66512 
		newstr.dwRate                		= dwMovieRate;										// 15 
		newstr.dwStart									= 0;															// 0 
		newstr.dwLength									= 1;															// 120 
		newstr.dwInitialFrames					= 0;															// 0 
		newstr.dwSuggestedBufferSize		= 0;															// 49152 
		newstr.dwQuality								= 0;															// 8500	, 7500 
		newstr.dwSampleSize							= strhdr.dwSampleSize;						// 0 
		SetRect(&newstr.rcFrame, 0, 0, dim.cx, dim.cy);										// 0,180,240 
		newstr.dwEditCount							= 0;															// 0 
		newstr.dwFormatChangeCount			= 0;															// 0 
		//strcpy (newstr.szName,"Junk Video #1");														// $(FILENAME) Video #1 
		strcpy (newstr.szName,AVIFileName);														// AVIFileName 
							 
		AVIFileInit(); 
 
		char newFileName[81]; 
		strcpy(newFileName,AVIFileName); 
 
		hr = AVIFileOpen(&pf_new, (LPCTSTR) newFileName, OF_WRITE | OF_CREATE, NULL); 
		if (hr != 0) 
		{ 
			AfxMessageBox("Failed to create new file"); 
			AVIFileExit(); 
			return; 
		} 
 
		bAVIFileOpen = TRUE; 
 
		hr = AVIFileCreateStream(pf_new, &ps_new, &newstr); 
		if (hr != 0) 
		{ 
			AfxMessageBox("Failed to create stream"); 
			AVIFileRelease(pf_new);	 
			AVIFileExit(); 
			bAVIFileOpen = FALSE; 
			return; 
		} 
	} 
	else 
	{ 
		AfxMessageBox("Start and Finish Positions have not been Locked"); 
		return; 
	}	 
		 
	m_pMovieView->SetWindowText("Start"); 
} 
 
void CTierazonView::OnUpdateFractalStartgeneratingamovie(CCmdUI* pCmdUI)  
{ 
	if (m_pMovieView->GetSafeHwnd() == 0) 
 		pCmdUI->Enable(FALSE); 
	else 
	{ 
		m_pMovieView->UpdateData(FALSE); 
		bGlobalDraw = TRUE; 
 
		bLockStart		= m_pMovieView->m_LockStart; 
		bLockFinish		= m_pMovieView->m_LockFinish; 
		 
		if (bLockStart && bLockFinish && !bStartMovie) 
 			pCmdUI->Enable(TRUE); 
		else 
		{ 
			pCmdUI->Enable(FALSE); 
 
		}		 
	} 
 
	pCmdUI->SetCheck(bStartMovie); 
} 
 
void CTierazonView::GenerateAMovie() 
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	LONG nSamples = 1; 
	bGlobalDraw = TRUE; 
 
	if (frame > 0) 
	{ 
		if (frame == 1) 
		{ 
			// Create the first stream 
			pDoc->m_pDIB_doc = pDoc->m_dib.Get_m_pDIB(); 
			biNew = (LPBITMAPINFOHEADER) pDoc->m_pDIB_doc; 
 
			//bitcount = biNew->biBitCount; 
			//char cstr[81]; 
			//wsprintf(cstr,"bitcount = %d",bitcount); 
			//AfxMessageBox(cstr); 
 
			//hr = AVIStreamSetFormat(ps_new, 0, biNew, sizeof(BITMAPINFOHEADER) + 1024); 
			hr = AVIStreamSetFormat(ps_new, 0, biNew, sizeof(BITMAPINFOHEADER)); // Rev 19 
			if (hr != 0) 
			{ 
				AfxMessageBox("AVI Stream error setting format"); 
				AVIStreamRelease(ps_new); 
				AVIFileRelease(pf_new);	 
				AVIFileExit(); 
				bStartMovie = FALSE; 
				m_pMovieView->m_OKButton.SetState(FALSE); 
				m_pMovieView->bStartButton = FALSE; 
				bAVIFileOpen = FALSE; 
				return; 
			} 
			// Save the data 
			hr = AVIStreamWrite(ps_new, frame-1, nSamples, (LPVOID) pDoc->m_dib.GetBits(),  
				biNew->biSizeImage, 
						AVIIF_KEYFRAME, NULL, NULL); 
			if (hr != 0) 
			{ 
				AfxMessageBox("AVI file error writing to stream"); 
				AVIStreamRelease(ps_new); 
				AVIFileRelease(pf_new);	 
				AVIFileExit(); 
				bStartMovie = FALSE; 
				m_pMovieView->m_OKButton.SetState(FALSE); 
				m_pMovieView->bStartButton = FALSE; 
				bAVIFileOpen = FALSE; 
				return; 
			} 
		} 
		else 
		{ 
			// Save the data 
			hr = AVIStreamWrite(ps_new, frame-1, nSamples, (LPVOID) pDoc->m_dib.GetBits(),  
				biNew->biSizeImage, 
						AVIIF_KEYFRAME, NULL, NULL); 
		} 
 
		if (hr != 0) 
		{ 
			AfxMessageBox("AVI file error writing to stream"); 
			AVIStreamRelease(ps_new); 
			AVIFileRelease(pf_new);	 
			AVIFileExit(); 
			bStartMovie = FALSE; 
			m_pMovieView->m_OKButton.SetState(FALSE); 
			m_pMovieView->bStartButton = FALSE; 
			bAVIFileOpen = FALSE; 
			return; 
		} 
	} 
	 
	/* 
	// Do calculation as a function of frame # 
	if (dMovieMagnifFinish >= dMovieMagnifStart) 
		dMagnification = dMovieMagnifStart + dMovieFrameRatio * frame; 
	else 
		dMagnification = dMovieMagnifStart - dMovieFrameRatio * frame; 
 
	*/ 
 
	//dMagnification = dMovieMagnifStart * (dMovieMagnifFinish / dMovieMagnifStart) ^ (frame/frames); 
 
 
	//x = dMovieMagnifFinish / dMovieMagnifStart; 
	//y = (double) frame / (double) frames; 
	//temp = pow(x, y); 
	//dMagnification = dMovieMagnifStart * temp; 
 
	dMagnification = dMovieMagnifStart *  
		pow((dMovieMagnifFinish / dMovieMagnifStart) , ((double)frame/(double)frames)); 
	 
	if (CRMID_MovieFinish >= CRMID_MovieStart) 
		CRMID = CRMID_MovieStart + CRMID_FrameRatio * frame; 
	else 
		CRMID = CRMID_MovieStart - CRMID_FrameRatio * frame; 
 
	if (CIMID_MovieFinish >= CIMID_MovieStart) 
		CIMID = CIMID_MovieStart + CIMID_FrameRatio * frame; 
	else 
		CIMID = CIMID_MovieStart - CIMID_FrameRatio * frame; 
 
	if (bJuliaVideoMode) 
	{ 
		///////// 
		// A julia option 
		// 
 
		jul = 1; 
		jul_save = 1; 
 
		cx = CRMID_JUL = CRMID; 
		cy = CIMID_JUL = CIMID; 
		CIMID = 0; 
		CRMID = 0; 
 
		//////////////////// 
	} 
 
	if (bOrientationVideoMode) 
	// An Orientation option 
	{ 
		cOrient.set_real(CRMID); 
		cOrient.set_imag(CIMID); 
		CIMID = 0; 
		CRMID = 0; 
	} 
 
	char cstr[81]; 
	//sprintf(cstr,"Frame: %ld, Magnif: %f, X_Center: %f, Y_Center: %f", 
	//	frame, dMagnification, CRMID, CIMID); 
	sprintf(cstr,"Frame: %ld of %ld", frame, frames); 
 
	m_pMovieView->SetWindowText(cstr); 
	m_pMovieView->UpdateData(); 
 
	// Increment the frame 
	frame++; 
 
	if (frame > frames) 
	{ 
		// Finished 
		bStartMovie = FALSE; 
		m_pMovieView->m_OKButton.SetState(FALSE); 
		m_pMovieView->bStartButton = FALSE; 
		CloseAVIFile(); 
		return; 
	} 
	 
	//AfxMessageBox("Step 8"); 
 
	//GoDoFractal(); 
	if (!bAbort) 
	{ 
		bDraw = TRUE; 
		bLaunch = FALSE; 
		bInitialized = FALSE; 
		bGlobalDraw = TRUE; 
	} 
	else 
		AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FRACTALS_MOVIE); 
		 
} 
 
void CTierazonView::CloseAVIFile() 
{ 
	// Close the stream and file 
	AVIStreamRelease(ps_new); 
	AVIFileRelease(pf_new);	 
 
	AVIFileExit(); 
		 
	bAVIFileOpen = FALSE; 
} 
 
void CTierazonView::OnFractalVideoplayer()  
{ 
	if (WinExec ("aviedi32.exe", SW_SHOWNORMAL) <= 32) 
		AfxMessageBox("Error executing 'aviedi32.exe'"); 
} 
 
LONG CTierazonView::CancelMovie(WPARAM wParam, LPARAM lParam) 
{ 
	bStartMovie = FALSE; 
	bGlobalDraw = FALSE; 
	bNewView = bNewViewSave; 
	bMovieView = FALSE; 
 
	if (bAVIFileOpen) 
		CloseAVIFile(); 
			 
	return 0L; 
} 
	 
void CTierazonView::OnViewJuliavideo()  
{ 
	bJuliaVideoMode ^= 1;	 
} 
 
void CTierazonView::OnUpdateViewJuliavideo(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bJuliaVideoMode); 
} 
 
void CTierazonView::OnViewOrientationvideo()  
{ 
	bOrientationVideoMode ^= 1; 
} 
 
void CTierazonView::OnUpdateViewOrientationvideo(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bOrientationVideoMode); 
}