📄 directdraw.cpp
字号:
/*
* DirectDraw.cpp
*
* The MPEG4 Codec for Symbian Project
*
* Copyright (c) 2005-2008 for Cyansoft Studio (www.cyansoft.com.cn).
* All Rights Reserved.
*
* Contributor(s): ______________________________________.
*
* $Cyansoft$
*
*/
#include "DirectDraw.h"
CDirectDraw::~CDirectDraw()
{
if( iDrawer )
{
iDrawer->Cancel();
delete iDrawer;
}
if( iVirtualScreen )
delete iVirtualScreen;
}
CDirectDraw* CDirectDraw::NewL( RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TPoint& aPt, TRect& aRect )
{
CDirectDraw* self = CDirectDraw::NewLC( aWs, aScreenDevice, aWindow, aPt, aRect );
CleanupStack::Pop( self );
return self;
}
CDirectDraw* CDirectDraw::NewLC( RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TPoint& aPt, TRect& aRect )
{
CDirectDraw* self = new ( ELeave ) CDirectDraw();
CleanupStack::PushL( self );
self->ConstructL( aWs, aScreenDevice, aWindow, aPt, aRect );
return self;
}
void CDirectDraw::ConstructL( RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TPoint& aPt, TRect& aRect )
{
iPoint = aPt;
iRect = aRect;
iPause = EFalse;
// Create back buffer
iVirtualScreen = new (ELeave) CFbsBitmap;
User::LeaveIfError( iVirtualScreen->Create( TSize(iRect.Width(), iRect.Height()), aScreenDevice.DisplayMode() ) );
// Create Direct Screen Access
iDrawer = CDirectScreenAccess::NewL(
aWs,
aScreenDevice,
aWindow,
*this);
aWs.Flush();
iDrawer->StartL();
iGc = iDrawer->Gc();
RRegion* region = iDrawer->DrawingRegion();
iGc->SetClippingRegion(region);
}
void CDirectDraw::Restart( RDirectScreenAccess::TTerminationReasons /*aReason*/ )
{
TRAPD( err, iDrawer->StartL() ); // You may panic here, if you want
if( KErrNone == err )
{
iGc = iDrawer->Gc();
RRegion* region = iDrawer->DrawingRegion();
iGc->SetClippingRegion( region );
iPause = EFalse;
}
}
void CDirectDraw::AbortNow( RDirectScreenAccess::TTerminationReasons /*aReason*/ )
{
iPause = ETrue;
}
TUint8* CDirectDraw::BeginDraw()
{
// Obtain the screen address every time before drawing the frame,
// since the address always changes
if( iPause )
return NULL;
TUint8* iScreenAddress;
iVirtualScreen->LockHeap( ETrue );
iScreenAddress = ( TUint8* )iVirtualScreen->DataAddress();
return iScreenAddress;
}
void CDirectDraw::EndDraw()
{
if( iPause )
return;
iVirtualScreen->UnlockHeap( ETrue );
iGc->BitBlt( iPoint, iVirtualScreen );
iDrawer->ScreenDevice()->Update();
}
/* End of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -