diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmcccontroller/src/mccscreen.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmcccontroller/src/mccscreen.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,923 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include +#include + +#include "mccscreen.h" +#include "mcccontrollerlogs.h" + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +_LIT(KMccWindowGroupName,"32MccVideoWindow"); + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMccScreen::NewL +// ----------------------------------------------------------------------------- +// +CMccScreen* CMccScreen::NewL( CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority ) + { + // Resolve screen type based on ecam capabilities, asssume direct vf + // to be available if camera not present yet. + CMccScreen* screen = NULL; + TBool useDirectVf = ETrue; + + if ( aCamera ) + { + TCameraInfo info; + aCamera->CameraInfo( info ); + useDirectVf = ( info.iOptionsSupported & TCameraInfo::EViewFinderDirectSupported ); + } + + if ( useDirectVf ) + { + TRAPD( err, screen = CMccScreenDirect::NewL( + aCamera, aPos, aArea, aIndex, + aWindowOrdinalPosition, aWindowOrdinalPriority ) ); + // If creation failes for some reason, bitmap vf is tried to be + // created as a fallback + if ( err == KErrNoMemory ) + { + User::Leave( err ); + } + if ( err ) + { + __CONTROLLER_INT1( "CMccScreen::NewL, direct screen creation failed:", err ) + } + } + + if ( !screen ) + { + screen = CMccScreenBitmap::NewL( + aCamera, aPos, aArea, aIndex, + aWindowOrdinalPosition, aWindowOrdinalPriority ); + } + return screen; + } + +// ----------------------------------------------------------------------------- +// CMccScreen::~CMccScreen +// ----------------------------------------------------------------------------- +// +CMccScreen::~CMccScreen() + { + __CONTROLLER( "CMccScreen::~CMccScreen" ) + + StopCamera(); + + delete iGraphicsContext; + delete iDev; + delete iRw; + delete iRwGroup; + iRwSession.Close(); + + __CONTROLLER( "CMccScreen::~CMccScreen, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreen::StartL +// ----------------------------------------------------------------------------- +// +void CMccScreen::StartL() + { + + } + +// ----------------------------------------------------------------------------- +// CMccScreen::Stop +// ----------------------------------------------------------------------------- +// +void CMccScreen::Stop() + { + + } + +// ----------------------------------------------------------------------------- +// CMccScreen::Draw +// ----------------------------------------------------------------------------- +// +void CMccScreen::Draw( CFbsBitmap& /*aFrame*/ ) + { + + } + +// ----------------------------------------------------------------------------- +// CMccScreen::SetCamera +// ----------------------------------------------------------------------------- +// +TInt CMccScreen::SetCamera( CCamera* aCamera ) + { + if ( !aCamera ) + { + StopCamera(); + } + + iCamera = aCamera; + + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CMccScreen::StopCamera +// ----------------------------------------------------------------------------- +// +void CMccScreen::StopCamera() + { + __CONTROLLER( "CMccScreen::StopCamera" ) + + if ( iCamera ) + { + iCamera->StopViewFinder(); + } + + __CONTROLLER( "CMccScreen::StopCamera, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreen::VfStartPossible +// ----------------------------------------------------------------------------- +// +TBool CMccScreen::VfStartPossible() + { + return ( iCamera && !iCamera->ViewFinderActive() && + iArea.iWidth > 0 && + iArea.iHeight > 0 ); + } + +// ----------------------------------------------------------------------------- +// CMccScreen::ConstructL +// ----------------------------------------------------------------------------- +// +void CMccScreen::ConstructL() + { + __CONTROLLER( "CMccScreen::ConstructL" ) + User::LeaveIfError( iRwSession.Connect() ); + + // Create window group + TInt groupId = iRwSession.GetFocusWindowGroup(); + iRwGroup = new (ELeave) RWindowGroup( iRwSession ) ; + + __CONTROLLER_INT1( "CMccScreen::ConstructL, window ordinal pos", + iWindowOrdinalPosition ) + __CONTROLLER_INT1( "CMccScreen::ConstructL, window ordinal priority", + iWindowOrdinalPriority ) + + User::LeaveIfError( iRwGroup->Construct( groupId, EFalse ) ); + iRwGroup->SetName( KMccWindowGroupName ); + + iRwGroup->SetOrdinalPosition( iWindowOrdinalPosition, iWindowOrdinalPriority ); + + // Create screen device + iDev = new (ELeave) CWsScreenDevice( iRwSession ); + iDev->Construct( iDeviceIndex ); + + TInt currMode = iDev->CurrentScreenMode(); + __CONTROLLER_INT1( "CMccScreen::ConstructL, screen device mode", currMode ) + + TPixelsTwipsAndRotation sizeAndRotation; + iDev->GetScreenModeSizeAndRotation( currMode, sizeAndRotation ); + __CONTROLLER_INT2( "CMccScreen::ConstructL, screen device size", + sizeAndRotation.iPixelSize.iWidth, + sizeAndRotation.iPixelSize.iHeight ) + + __CONTROLLER_INT1( "CMccScreen::ConstructL, screen device orientation", + sizeAndRotation.iRotation ) + + // Create window + iRw = new (ELeave) RWindow( iRwSession ); + + User::LeaveIfError( iRw->Construct( *iRwGroup, (TUint32)iRw ) ); + + __CONTROLLER_INT2( "CMccScreen::ConstructL, window pos", iPosition.iX, iPosition.iY ) + __CONTROLLER_INT2( "CMccScreen::ConstructL, window size", iArea.iWidth, iArea.iHeight ) + + iRw->SetPosition( iPosition ); + //iRw->SetBackgroundColor( KRgbBlack ); + iRw->SetSize( iArea ); + iRw->SetOrdinalPosition( iWindowOrdinalPosition ); + + __CONTROLLER( "CMccScreen: creating graphics context ..." ) + User::LeaveIfError( iDev->CreateContext( iGraphicsContext ) ); + __CONTROLLER( "CMccScreen: graphics context created!" ) + + iRw->Activate(); + iRwSession.Flush(); + + __CONTROLLER( "CMccScreen::ConstructL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreen::CMccScreen +// ----------------------------------------------------------------------------- +// +CMccScreen::CMccScreen( + TMccScreenType aScreenType, + CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority ) : + iCamera( aCamera ), + iDeviceIndex( aIndex ), + iPosition( aPos ), + iArea( aArea ), + iWindowOrdinalPosition( aWindowOrdinalPosition ), + iWindowOrdinalPriority( aWindowOrdinalPriority ), + iScreenType( aScreenType ) + { + + } + + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::CMccScreenBitmap +// ----------------------------------------------------------------------------- +// +CMccScreenBitmap* CMccScreenBitmap::NewL( + CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority ) + { + CMccScreenBitmap* self = new ( ELeave ) CMccScreenBitmap( aCamera, + aPos, + aArea, + aIndex, + aWindowOrdinalPosition, + aWindowOrdinalPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::CMccScreenBitmap +// ----------------------------------------------------------------------------- +// +CMccScreenBitmap::CMccScreenBitmap( + CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority ) : + CMccScreen( EBitmapScreen, aCamera, aPos, aArea, aIndex, + aWindowOrdinalPosition, aWindowOrdinalPriority ), + iAborted( ETrue ) + { + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::CMccScreenBitmap +// ----------------------------------------------------------------------------- +// +CMccScreenBitmap::~CMccScreenBitmap() + { + __CONTROLLER( "CMccScreenBitmap::~CMccScreenBitmap" ) + + DetachFrame(); // Must do bitmap detach before releasing window resources + delete iDirectScreenAccess; + + delete iPausedFrameData; + + __CONTROLLER( "CMccScreenBitmap::~CMccScreenBitmap, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::ConstructL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::ConstructL() + { + __CONTROLLER( "CMccScreenBitmap::ConstructL" ) + + CMccScreen::ConstructL(); + + // Create direct screen access + iDirectScreenAccess = CDirectScreenAccess::NewL( iRwSession, *iDev, *iRw, *this ); + + UpdateViewFinderArea( iArea ); + + __CONTROLLER_INT2( "CMccScreenBitmap::ConstructL, viewfinder pos", + iViewFinderImageRect.iTl.iX, iViewFinderImageRect.iTl.iY ) + __CONTROLLER_INT2( "CMccScreenBitmap::ConstructL, viewfinder size", + iViewFinderImageRect.Width(), iViewFinderImageRect.Height() ) + + __CONTROLLER( "CMccScreenBitmap::ConstructL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::StartL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::StartL() + { + iStopped = EFalse; + + if ( iCamera ) + { + StartCameraL(); + } + else if ( iPausedFrameData ) + { + __CONTROLLER( "CMccScreenBitmap::StartL, using paused frame" ) + + CFbsBitmap* frame = RestoreFrameLC(); + AttachFrameL( frame ); + CleanupStack::Pop( frame ); + } + else + { + // NOP + } + + StartDsaL(); + + __CONTROLLER( "CMccScreenBitmap::StartL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::StartCameraL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::StartCameraL() + { + __CONTROLLER( "CMccScreenBitmap::StartCameraL" ) + + __ASSERT_ALWAYS( iCamera, User::Leave( KErrNotReady ) ); + + // Camera may modify the size + TSize vfBitmapSize = iArea; + __CONTROLLER_INT2( "CMccScreenBitmap::StartL, size before", + vfBitmapSize.iWidth, + vfBitmapSize.iHeight ) + if ( VfStartPossible() ) + { + iCamera->StartViewFinderBitmapsL( vfBitmapSize ); + } + + __CONTROLLER_INT2( "CMccScreenBitmap::StartL, size after", + vfBitmapSize.iWidth, + vfBitmapSize.iHeight ) + + UpdateViewFinderArea( vfBitmapSize ); + + __CONTROLLER( "CMccScreenBitmap::StartCameraL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::StartDsaL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::StartDsaL() + { + __CONTROLLER( "CMccScreenBitmap::StartDsaL" ) + + iAborted = EFalse; + iDirectScreenAccess->Cancel(); + iDirectScreenAccess->StartL(); + iGc = iDirectScreenAccess->Gc(); + iFbsDev = iDirectScreenAccess->ScreenDevice(); + iRegion = iDirectScreenAccess->DrawingRegion(); + +#ifdef __MCC_CONTROLLER + if ( iRegion && !iRegion->IsEmpty() ) + { + for ( TInt i = 0; i < iRegion->Count(); i++ ) + { + const TRect& regionRect = (*iRegion)[ i ]; + __CONTROLLER_INT2( "CMccScreenBitmap::StartDsaL, rect tl", + regionRect.iTl.iX, regionRect.iTl.iY ) + __CONTROLLER_INT2( "CMccScreenBitmap::StartDsaL, rect br", + regionRect.iBr.iX, regionRect.iBr.iY ) + } + } +#endif + + iGc->SetClippingRegion( iRegion ); + + // Fill with black areas which are not covered by viewfinder image. + // If viewfinder image has not been yet received and drawn, fill whole area. + // + + if ( !iFirstImageDrawn ) + { + // Whole area + iGc->SetBrushColor( KRgbBlack ); + iGc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + TPoint pointTl( 0, 0 ); + TRect rect( pointTl, iArea ); + iGc->DrawRect( rect ); + } + else + { + DrawBlackBorders(); + } + + if ( iAttachedFrame ) + { + __CONTROLLER( "CMccScreenBitmap::StartDsaL, draw attached frame" ) + + TSize viewFinderImageSize = iAttachedFrame->SizeInPixels(); + + TPoint corner = UpdateViewFinderArea( viewFinderImageSize ); + + iGc->BitBlt( corner, iAttachedFrame ); + } + + DoScreenDeviceUpdate(); + + //iGc->SetBrushStyle( CGraphicsContext::ENullBrush ); + + __CONTROLLER( "CMccScreen::StartL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::Stop +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::Stop() + { + __CONTROLLER( "CMccScreenBitmap::Stop" ) + + // Don't do anything yet, wait for next frame and then stop camera + iStopped = ETrue; + + __CONTROLLER( "CMccScreenBitmap::Stop, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::Restart +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::Restart( RDirectScreenAccess::TTerminationReasons /*aReason*/ ) + { + __CONTROLLER( "CMccScreenBitmap::Restart" ) + + TRAP_IGNORE( StartDsaL() ); + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::AbortNow +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::AbortNow( RDirectScreenAccess::TTerminationReasons /*aReason*/ ) + { + __CONTROLLER( "CMccScreenBitmap::AbortNow" ) + iDirectScreenAccess->Cancel(); + + iAborted = ETrue; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::Draw +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::Draw( CFbsBitmap& aFrame ) + { + if ( iStopped ) + { + __CONTROLLER( "CMccScreenBitmap::Draw, store last frame and stop camera" ) + + // Screen was waiting for freeze frame from camera, inform observer + // that camera is not needed anymore + StoreFrameDataL( aFrame ); + CFbsBitmap* frame = RestoreFrameLC(); + AttachFrameL( frame ); + CleanupStack::Pop( frame ); + + StopCamera(); + __CONTROLLER( "CMccScreenBitmap::Draw, exit" ) + } + else + { + // When normal frame draw is requested, attached frame is not anymore drawn + DetachFrame(); + + DoDraw( aFrame ); + } + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::AttachFrameL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::AttachFrameL( CFbsBitmap* aFrame ) + { + __CONTROLLER( "CMccScreenBitmap::AttachFrameL" ) + + __ASSERT_ALWAYS( aFrame, User::Leave( KErrArgument ) ); + + DetachFrame(); + + iAttachedFrame = aFrame; + + DoDraw( *iAttachedFrame ); + + __CONTROLLER( "CMccScreenBitmap::AttachFrameL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::DetachFrame +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::DetachFrame() + { + if ( iAttachedFrame ) + { + __CONTROLLER( "CMccScreenBitmap::DetachFrame, detaching" ) + iAttachedFrame->Reset(); + delete iAttachedFrame; + } + + iAttachedFrame = NULL; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::UpdateViewFinderArea +// ----------------------------------------------------------------------------- +// +TPoint CMccScreenBitmap::UpdateViewFinderArea( TSize aViewFinderImageSize ) + { + TPoint corner( 0, 0 ); + if ( aViewFinderImageSize.iWidth < iArea.iWidth ) + { + // Divide the subtraction by two (i.e. do centering) + corner.iX = ( iArea.iWidth - aViewFinderImageSize.iWidth ) >> 1; + } + + if ( aViewFinderImageSize.iHeight < iArea.iHeight ) + { + // Divide the subtraction by two (i.e. do centering) + corner.iY = ( iArea.iHeight - aViewFinderImageSize.iHeight ) >> 1; + } + + iViewFinderImageRect = TRect( corner, aViewFinderImageSize ); + + return corner; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::DoDraw +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::DoDraw( CFbsBitmap& aFrame ) + { + if ( !iAborted && iGc ) + { + iFirstImageDrawn = ETrue; + + TSize viewFinderImageSize = aFrame.SizeInPixels(); + + TBool imageSizeChanged = ( viewFinderImageSize != iViewFinderImageRect.Size() ); + + TPoint corner = UpdateViewFinderArea( viewFinderImageSize ); + + if ( imageSizeChanged ) + { + // Size of bitmap changed suddenly, borders need to be redrawn + DrawBlackBorders(); + } + + iGc->BitBlt( corner, &aFrame ); + + DoScreenDeviceUpdate(); + } + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::DoScreenDeviceUpdate +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::DoScreenDeviceUpdate() + { + if ( iFbsDev ) + { + iFbsDev->Update(); + } + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::StoreFrameDataL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::StoreFrameDataL( CFbsBitmap& aFrame ) + { + __CONTROLLER( "CMccScreenBitmap::StoreFrameDataL" ) + + iPausedFrameSize = aFrame.SizeInPixels(); + iPausedFrameDisplayMode = aFrame.DisplayMode(); + TInt bitmapSizeInBytes = + CFbsBitmap::ScanLineLength( iPausedFrameSize.iWidth, iPausedFrameDisplayMode ) * + iPausedFrameSize.iHeight; + HBufC8* pausedFrameData = HBufC8::NewLC( bitmapSizeInBytes ); + aFrame.LockHeap(); + pausedFrameData->Des().Copy( (TUint8*)aFrame.DataAddress(), bitmapSizeInBytes ); + aFrame.UnlockHeap(); + delete iPausedFrameData; + iPausedFrameData = pausedFrameData; + CleanupStack::Pop( pausedFrameData ); + + __CONTROLLER( "CMccScreenBitmap::StoreFrameDataL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::RestoreFrameLC +// ----------------------------------------------------------------------------- +// +CFbsBitmap* CMccScreenBitmap::RestoreFrameLC() + { + __CONTROLLER( "CMccScreenBitmap::RestoreFrameLC" ) + + __ASSERT_ALWAYS( iPausedFrameData, User::Leave( KErrNotReady ) ); + + CFbsBitmap* tempFrame = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( tempFrame ); + + User::LeaveIfError( tempFrame->Create( iPausedFrameSize, iPausedFrameDisplayMode ) ); + TInt bitmapSizeInBytes = + CFbsBitmap::ScanLineLength( iPausedFrameSize.iWidth, iPausedFrameDisplayMode ) * + iPausedFrameSize.iHeight; + + tempFrame->LockHeap(); + Mem::Copy( tempFrame->DataAddress(), + iPausedFrameData->Des().Ptr(), + bitmapSizeInBytes ); + tempFrame->UnlockHeap(); + + __CONTROLLER( "CMccScreenBitmap::RestoreFrameLC, exit" ) + + return tempFrame; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::DrawBlackBorders +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::DrawBlackBorders() + { + iGc->SetBrushColor( KRgbBlack ); + iGc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + + // Upper area + TPoint pointTl( 0, 0 ); + TPoint pointBr( iArea.iWidth, iViewFinderImageRect.iTl.iY ); + TRect rect( pointTl, pointBr ); + iGc->DrawRect( rect ); + + // Lower area + pointTl.SetXY( 0, iViewFinderImageRect.iBr.iY ); + pointBr.SetXY( iArea.iWidth, iArea.iHeight ); + rect.SetRect( pointTl, pointBr ); + iGc->DrawRect( rect ); + + // Left area + pointTl.SetXY( 0, iViewFinderImageRect.iTl.iY ); + pointBr.SetXY( iViewFinderImageRect.iTl.iX, iViewFinderImageRect.iBr.iY ); + rect.SetRect( pointTl, pointBr ); + iGc->DrawRect( rect ); + + // Right area + pointTl.SetXY( iViewFinderImageRect.iBr.iX, iViewFinderImageRect.iTl.iY ); + pointBr.SetXY( iArea.iWidth, iViewFinderImageRect.iBr.iY ); + rect.SetRect( pointTl, pointBr ); + iGc->DrawRect( rect ); + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::NewL +// ----------------------------------------------------------------------------- +// +CMccScreenDirect* CMccScreenDirect::NewL( CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority ) + { + __CONTROLLER( "CMccScreenDirect::NewL, v2" ) + + CMccScreenDirect* self = new ( ELeave ) CMccScreenDirect( aCamera, + aPos, + aArea, + aIndex, + aWindowOrdinalPosition, + aWindowOrdinalPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + __CONTROLLER( "CMccScreenDirect::NewL, exit" ) + + return self; + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::~CMccScreenDirect +// ----------------------------------------------------------------------------- +// +CMccScreenDirect::~CMccScreenDirect() + { + __CONTROLLER( "CMccScreenDirect::~CMccScreenDirect" ) + + if ( iDirectViewFinder ) + { + iDirectViewFinder->Release(); + iDirectViewFinder = NULL; + } + + __CONTROLLER( "CMccScreenDirect::~CMccScreenDirect, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::StartL +// ----------------------------------------------------------------------------- +// +void CMccScreenDirect::StartL() + { + __CONTROLLER( "CMccScreenDirect::StartL" ) + + if ( iDirectViewFinder && iDirectViewFinder->ViewFinderState() == + CCamera::CCameraDirectViewFinder::EViewFinderPause ) + { + __CONTROLLER( "CMccScreenDirect::StartL, resuming" ) + + iDirectViewFinder->ResumeViewFinderDirectL(); + } + else if ( VfStartPossible() ) + { + __CONTROLLER( "CMccScreenDirect::StartL, starting" ) + + StartDirectViewFinderL(); + } + else + { + // NOP + } + __CONTROLLER( "CMccScreenDirect::StartL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::Stop +// ----------------------------------------------------------------------------- +// +void CMccScreenDirect::Stop() + { + __CONTROLLER( "CMccScreenDirect::Stop" ) + + if ( iDirectViewFinder ) + { + __CONTROLLER( "CMccScreenDirect::Stop, pausing disabled" ) + // TBD: pausing disabled temporarily due problems in it + TRAP_IGNORE( iDirectViewFinder->PauseViewFinderDirectL() ) + } + + __CONTROLLER( "CMccScreenDirect::Stop, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::SetCamera +// ----------------------------------------------------------------------------- +// +TInt CMccScreenDirect::SetCamera( CCamera* aCamera ) + { + CMccScreen::SetCamera( aCamera ); + + return HandleDirectViewFinder(); + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::ConstructL +// ----------------------------------------------------------------------------- +// +void CMccScreenDirect::ConstructL() + { + __CONTROLLER( "CMccScreenDirect::ConstructL" ) + + CMccScreen::ConstructL(); + + User::LeaveIfError( HandleDirectViewFinder() ); + + __CONTROLLER( "CMccScreenDirect::ConstructL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::CMccScreenDirect +// ----------------------------------------------------------------------------- +// +CMccScreenDirect::CMccScreenDirect( + CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority ) : + CMccScreen( EDirectScreen, aCamera, aPos, aArea, aIndex, + aWindowOrdinalPosition, aWindowOrdinalPriority ) + { + + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::StartDirectViewFinderL +// ----------------------------------------------------------------------------- +// +void CMccScreenDirect::StartDirectViewFinderL() + { + if ( VfStartPossible() ) + { + // Camera may modify the size + TSize vfBitmapSize = iArea; + __CONTROLLER_INT2( "CMccScreenDirect::StartDirectViewFinderL, size before", + vfBitmapSize.iWidth, + vfBitmapSize.iHeight ) + + TPoint point( 0, 0 ); + TRect vfRect( point, vfBitmapSize ); + iCamera->StartViewFinderDirectL( iRwSession, *iDev, *iRw, vfRect ); + + __CONTROLLER_INT2( "CMccScreenDirect::StartDirectViewFinderL, size after", + vfRect.Width(), + vfRect.Height() ) + } + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::HandleDirectViewFinder +// ----------------------------------------------------------------------------- +// +TInt CMccScreenDirect::HandleDirectViewFinder() + { + TInt err( KErrNone ); + if ( iCamera ) + { + if ( !iDirectViewFinder ) + { + __CONTROLLER( "CMccScreenDirect::HandleDirectViewFinder, create dvf" ) + + iDirectViewFinder = static_cast( + iCamera->CustomInterface( TUid::Uid( KECamMCameraDirectViewFinderUidValue ) ) ); + + if ( !iDirectViewFinder ) + { + err = KErrNotSupported; + } + __CONTROLLER_INT1( "CMccScreenDirect::HandleDirectViewFinder, err:", err ) + } + } + else if ( iDirectViewFinder ) + { + __CONTROLLER( "CMccScreenDirect::HandleDirectViewFinder, release dvf" ) + iDirectViewFinder->Release(); + iDirectViewFinder = NULL; + } + else + { + // NOP + } + return err; + } + +// End of file +