www.pudn.com > RotoZoom.rar > ROTOZOOMVIEW.CPP


// RotoZoomView.cpp : implementation of the CRotoZoomView class 
// 
 
#include "stdafx.h" 
#include "RotoZoom.h" 
 
#include "RotoZoomDoc.h" 
#include "RotoZoomView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define ANIMATIONTIMER 1 
#define M_PI 3.14159265358979323846 
 
///////////////////////////////////////////////////////////////////////////// 
// CRotoZoomView 
 
IMPLEMENT_DYNCREATE(CRotoZoomView, CView) 
 
BEGIN_MESSAGE_MAP(CRotoZoomView, CView) 
	//{{AFX_MSG_MAP(CRotoZoomView) 
	ON_COMMAND(ID_MOTIONBLUR, OnMotionBlur) 
	ON_UPDATE_COMMAND_UI(ID_MOTIONBLUR, OnUpdateMotionBlur) 
	ON_COMMAND(ID_DOUBLESIZE, OnDoubleSize) 
	ON_UPDATE_COMMAND_UI(ID_DOUBLESIZE, OnUpdateDoubleSize) 
	ON_WM_ERASEBKGND() 
	ON_COMMAND(ID_ALPHANONE, OnAlphaNone) 
	ON_UPDATE_COMMAND_UI(ID_ALPHANONE, OnUpdateAlphaNone) 
	ON_COMMAND(ID_ALPHAALPHA, OnAlphaAlpha) 
	ON_UPDATE_COMMAND_UI(ID_ALPHAALPHA, OnUpdateAlphaAlpha) 
	ON_COMMAND(ID_ALPHASTIPPLED, OnAlphaStippled) 
	ON_UPDATE_COMMAND_UI(ID_ALPHASTIPPLED, OnUpdateAlphaStippled) 
	//}}AFX_MSG_MAP 
	ON_MESSAGE ( MSG_ISDOUBLESIZE, IsDoubleSize ) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CRotoZoomView construction/destruction 
 
CRotoZoomView::CRotoZoomView () 
{ 
	// Create Dibs 
	m_Layer0.Create ( 100, 100 ); 
	m_Layer1.Create ( 100, 100 ); 
	m_Tile.Create ( 32, 32 ); 
	// Fill Tables 
	for ( int i=0; i<360; i++ ) 
	{ 
		Cosines[i]=float(cos ( i/180.0*M_PI )); 
		Sines[i]=float(sin ( i/180.0*M_PI )); 
	} 
	// Initialize RotoZoom Parameters 
	m_Angle=0; 
	m_Zoom=1.5f; 
	m_ZoomFactor=0.025f; 
	m_MotionBlur=FALSE; 
	m_DoubleSize=FALSE; 
	m_Alpha=0; 
} 
 
CRotoZoomView::~CRotoZoomView () 
{ 
	// Stop Timer 
	if ( m_MMTimer ) 
		timeKillEvent ( m_MMTimer ); 
	// Destroy Dibs 
	m_Layer0.Destroy (); 
	m_Tile.Destroy (); 
	// Close DrawDib 
	m_DrawDib.Close (); 
} 
 
BOOL CRotoZoomView::PreCreateWindow ( CREATESTRUCT& cs ) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CRotoZoomView drawing 
 
void CRotoZoomView::OnDraw ( CDC* pDC ) 
{ 
	// Use DrawDib to Draw the Dib to Video Memory, use HalfTone for non TC Systems 
	if ( m_DoubleSize ) 
		m_DrawDib.DrawDib ( &m_Layer0, pDC->m_hDC, 0,0, 200, 200, DDF_HALFTONE ); 
	else 
		m_DrawDib.DrawDib ( &m_Layer0, pDC->m_hDC, 0,0, 100, 100, DDF_HALFTONE ); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CRotoZoomView diagnostics 
 
#ifdef _DEBUG 
void CRotoZoomView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CRotoZoomView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CRotoZoomDoc* CRotoZoomView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRotoZoomDoc))); 
	return (CRotoZoomDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CRotoZoomView message handlers 
 
void CALLBACK TimeProc ( UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 ) 
{ 
	CRotoZoomView *View; 
 
	View=(CRotoZoomView *)dwUser; 
	 
	for ( int j=-50; j<50; j++ ) 
	{ 
		for ( int i=-50; i<50; i++ ) 
		{ 
			int x, y; 
 
			// A Combination of a 2d Translation/Rotation/Scale Matrix 
			x=int((i*View->Cosines[View->m_Angle]+j*View->Sines[View->m_Angle])*View->m_Zoom)+16; 
			y=int((i*View->Sines[View->m_Angle]-j*View->Cosines[View->m_Angle])*View->m_Zoom)+16; 
			View->m_Layer0.m_Bits[(j+50)*100+(i+50)]=View->m_Tile.m_Bits[abs(x%View->m_Tile.m_Size.cx)*View->m_Tile.m_Size.cx+abs(y%View->m_Tile.m_Size.cy)]; 
		} 
	} 
	View->m_Angle+=5; 
	if ( View->m_Angle>=360 ) 
		View->m_Angle=0; 
	View->m_Zoom+=View->m_ZoomFactor; 
	if ( View->m_Zoom>=1.5 ) 
		View->m_ZoomFactor=-0.025f; 
	else if ( View->m_Zoom<=0.0 ) 
		View->m_ZoomFactor=0.025f; 
 
	// Motion Blur 
	// Blends the Front Layer with 150/255 % of the Back Layer 
	// Then Copies the Front Layer into the Back Layer 
	// This way we get an accumulated picture in the Back Layer 
	if ( View->m_MotionBlur )  
	{ 
		View->m_Layer0.Blend ( &View->m_Layer1, 150 ); 
		View->m_Layer0.Copy ( &View->m_Layer1 ); 
	} 
 
	// Alpha Layer 
	if ( View->m_Alpha & 0x1 ) 
		View->m_Layer0.FillGlass ( 0, 255, 255, 128 ); 
	else if ( View->m_Alpha & 0x2 ) 
		View->m_Layer0.FillStippledGlass ( 0, 255, 255 ); 
	 
	View->Invalidate ( FALSE ); 
} 
 
void CRotoZoomView::OnInitialUpdate ()  
{ 
	CView::OnInitialUpdate (); 
 
	// Set Window Title 
	CRotoZoomDoc *pDoc=GetDocument(); 
	ASSERT_VALID ( pDoc ); 
	pDoc->SetTitle ( "RotoZoom" ); 
 
	// Load a nice Image into the Tile 
	CBitmap TileBitmap; 
	TileBitmap.LoadBitmap ( IDB_TILE ); 
	m_Tile.SetBitmap ( GetDC (), &TileBitmap ); 
 
	// Open DrawDib 
	m_DrawDib.Open (); 
 
	// Start Timer 
	m_MMTimer=timeSetEvent ( 40, 40, TimeProc, (unsigned long)this, TIME_PERIODIC );  
} 
 
BOOL CRotoZoomView::OnEraseBkgnd ( CDC* pDC )  
{ 
	// Keep Windows from Painting the Background 
	return TRUE; 
} 
 
HRESULT CRotoZoomView::IsDoubleSize ( WPARAM, LPARAM ) 
{ 
	return ( m_DoubleSize ); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CRotoZoomView CommandUI handlers 
 
void CRotoZoomView::OnMotionBlur ()  
{ 
	m_MotionBlur=!m_MotionBlur; 
} 
 
void CRotoZoomView::OnUpdateMotionBlur ( CCmdUI* pCmdUI )  
{ 
	if ( m_MotionBlur ) 
		pCmdUI->SetCheck ( 1 ); 
	else 
		pCmdUI->SetCheck ( 0 ); 
} 
 
void CRotoZoomView::OnDoubleSize ()  
{ 
	m_DoubleSize=!m_DoubleSize; 
 
	// Resize Window 
	if ( m_DoubleSize ) 
	{ 
		CRect WindowRect ( 0, 0, 200, 200 ); 
		AdjustWindowRect ( &WindowRect, GetParent ()->GetStyle (), TRUE ); 
		GetParent ()->SetWindowPos ( NULL, 0, 0, WindowRect.Width (), WindowRect.Height (), 
			SWP_NOMOVE | SWP_NOZORDER ); 
	} 
	else 
	{ 
		CRect WindowRect ( 0, 0, 100, 100 ); 
		AdjustWindowRect ( &WindowRect, GetParent ()->GetStyle (), TRUE ); 
		GetParent ()->SetWindowPos ( NULL, 0, 0, WindowRect.Width (), WindowRect.Height (), 
			SWP_NOMOVE | SWP_NOZORDER ); 
	} 
} 
 
void CRotoZoomView::OnUpdateDoubleSize ( CCmdUI* pCmdUI )  
{ 
	if ( m_DoubleSize ) 
		pCmdUI->SetCheck ( 1 ); 
	else 
		pCmdUI->SetCheck ( 0 ); 
} 
 
void CRotoZoomView::OnAlphaNone()  
{ 
	m_Alpha=0; 
} 
 
void CRotoZoomView::OnUpdateAlphaNone ( CCmdUI* pCmdUI )  
{ 
	if ( !m_Alpha ) 
		pCmdUI->SetCheck ( 1 ); 
	else 
		pCmdUI->SetCheck ( 0 ); 
} 
 
void CRotoZoomView::OnAlphaAlpha()  
{ 
	m_Alpha=1; 
} 
 
void CRotoZoomView::OnUpdateAlphaAlpha ( CCmdUI* pCmdUI )  
{ 
	if ( m_Alpha & 0x1 ) 
		pCmdUI->SetCheck ( 1 ); 
	else 
		pCmdUI->SetCheck ( 0 ); 
} 
 
void CRotoZoomView::OnAlphaStippled ()  
{ 
	m_Alpha=2; 
} 
 
void CRotoZoomView::OnUpdateAlphaStippled ( CCmdUI* pCmdUI )  
{ 
	if ( m_Alpha & 0x2 ) 
		pCmdUI->SetCheck ( 1 ); 
	else 
		pCmdUI->SetCheck ( 0 ); 
}