diff -r 33a5d2bbf6fc -r 73a1feb507fb mmsharing/livecommsui/lcui/tsrc/ipvtengine/src/mccscreen.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/livecommsui/lcui/tsrc/ipvtengine/src/mccscreen.cpp Tue Aug 31 15:12:07 2010 +0300 @@ -0,0 +1,921 @@ +/* +* 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 +#include +#include +#include "MccScreen.h" +#include "svptimer.h" +#include "musenglogger.h" + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +_LIT(KMccWindowGroupName,"MccVideoWindow"); + +// 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, + TBool aSecondary, + RDrawableWindow* aParentWindow ) + { + // Resolve screen type based on ecam capabilities, asssume direct vf + // to be available if camera not present yet. + CMccScreen* screen = NULL; + TBool useDirectVf = EFalse; + + 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 ) + { + } + } + + if ( !screen ) + { + screen = CMccScreenBitmap::NewL( + aCamera, aPos, aArea, aIndex, + aWindowOrdinalPosition, aWindowOrdinalPriority, aSecondary, aParentWindow ); + } + return screen; + } + +// ----------------------------------------------------------------------------- +// CMccScreen::~CMccScreen +// ----------------------------------------------------------------------------- +// +CMccScreen::~CMccScreen() + { + + StopCamera(); + + delete iGraphicsContext; + delete iDev; + delete iRw; + delete iRwGroup; + iRwSession.Close(); + + } + +// ----------------------------------------------------------------------------- +// 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() + { + + if ( iCamera ) + { + iCamera->StopViewFinder(); + } + + } + +// ----------------------------------------------------------------------------- +// CMccScreen::VfStartPossible +// ----------------------------------------------------------------------------- +// +TBool CMccScreen::VfStartPossible() + { + return ( iCamera && !iCamera->ViewFinderActive() && + iArea.iWidth > 0 && + iArea.iHeight > 0 ); + } + +void CMccScreen::SetPrimaryRectL(TRect aRect) + { + MUS_LOG2( "mus: [ENGINE] -> CMccScreen::SetPrimaryRectL() (%dx%d)", + aRect.Width(), aRect.Height() ); + MUS_LOG2( "mus: [ENGINE] -> CMccScreen::SetPrimaryRectL() (%d,%d)", + aRect.iTl.iX, aRect.iTl.iY ); + iPrimaryRect = aRect; + } +void CMccScreen::SetSecondaryRectL(TRect aRect) + { + MUS_LOG2( "mus: [ENGINE] -> CMccScreen::SetSecondaryRectL() (%dx%d)", + aRect.Width(), aRect.Height() ); + MUS_LOG2( "mus: [ENGINE] -> CMccScreen::SetSecondaryRectL() (%d,%d)", + aRect.iTl.iX, aRect.iTl.iY ); + iSecondaryRect = aRect; + } + +void CMccScreen::Update(TBool aIsForeground) + { + if ( aIsForeground ){ + + iRwGroup->SetOrdinalPosition( iWindowOrdinalPosition, iWindowOrdinalPriority ); + iRw->SetOrdinalPosition( iWindowOrdinalPosition, iWindowOrdinalPriority ); + iRw->HandleTransparencyUpdate(); + iRwSession.Flush(); + } else { + + } + + } + + +// ----------------------------------------------------------------------------- +// CMccScreen::ConstructL +// ----------------------------------------------------------------------------- +// +void CMccScreen::ConstructL() + { + User::LeaveIfError( iRwSession.Connect() ); + + // Create window group + + iRwGroup = new (ELeave) RWindowGroup( iRwSession ) ; + + RWindowGroup& rootWin = CCoeEnv::Static()->RootWin(); + rootWin.AllowProcessToCreateChildWindowGroups(TUid::Uid( 0x101F8681 )); + TUint32 groupId = rootWin.WindowGroupId(); //iRwSession.GetFocusWindowGroup(); + TUint32 focusGroupId = iRwSession.GetFocusWindowGroup(); + //User::LeaveIfError( iRwGroup->ConstructChildApp( groupId, (TUint32)iRwGroup, EFalse ) ); + User::LeaveIfError( iRwGroup->Construct( (TUint32)iRwGroup, EFalse ) ); + + TBuf<100> name; + name.Append(KMccWindowGroupName); + iRwGroup->SetName( name ); + + iRwGroup->SetOrdinalPosition( iWindowOrdinalPosition, iWindowOrdinalPriority ); + //iRwGroup->SetOrdinalPriorityAdjust(1); + iRwGroup->AutoForeground(EFalse); + + // Create screen device + iDev = new (ELeave) CWsScreenDevice( iRwSession ); + iDev->Construct( iDeviceIndex ); + + TInt currMode = iDev->CurrentScreenMode(); + MUS_LOG1( "mus: [ENGINE] -> CMccScreen::ConstructL() mode: %d", currMode ); + TPixelsTwipsAndRotation sizeAndRotation; + iDev->GetScreenModeSizeAndRotation( currMode, sizeAndRotation ); + + MUS_LOG3( "mus: [ENGINE] -> CMccScreen::ConstructL() (%dx%d) %d", + sizeAndRotation.iPixelSize.iWidth, sizeAndRotation.iPixelSize.iHeight, sizeAndRotation.iRotation ); + + // Create window + iRw = new (ELeave) RWindow( iRwSession ); + + User::LeaveIfError( iRw->Construct( *iRwGroup, (TUint32)iRw ) ); + + + iRw->SetPosition( iPosition ); + + iRw->SetSize( iArea ); + iRw->SetOrdinalPosition( iWindowOrdinalPosition, iWindowOrdinalPriority ); + iRw->EnableVisibilityChangeEvents(); + + User::LeaveIfError( iDev->CreateContext( iGraphicsContext ) ); + + iRw->Activate(); + iRwSession.Flush(); + } + +// ----------------------------------------------------------------------------- +// CMccScreen::CMccScreen +// ----------------------------------------------------------------------------- +// +CMccScreen::CMccScreen( + TMccScreenType aScreenType, + CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority, + TBool aSecondary, + RDrawableWindow* aParentWindow ) : + iCamera( aCamera ), + iDeviceIndex( aIndex ), + iPosition( aPos ), + iArea( aArea ), + iWindowOrdinalPosition( aWindowOrdinalPosition ), + iWindowOrdinalPriority( aWindowOrdinalPriority ), + iScreenType( aScreenType ), + iSecondary(aSecondary), + iParentWindow(aParentWindow)/*, + iRwSession(CCoeEnv::Static()->WsSession()), + iRwGroup(&CCoeEnv::Static()->RootWin()), + iDev(CCoeEnv::Static()->ScreenDevice())*/ + { + + } + + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::CMccScreenBitmap +// ----------------------------------------------------------------------------- +// +CMccScreenBitmap* CMccScreenBitmap::NewL( + CCamera* aCamera, + TPoint aPos, + TSize aArea, + TInt aIndex, + TInt aWindowOrdinalPosition, + TInt aWindowOrdinalPriority, + TBool aSecondary, + RDrawableWindow* aParentWindow) + { + CMccScreenBitmap* self = new ( ELeave ) CMccScreenBitmap( aCamera, + aPos, + aArea, + aIndex, + aWindowOrdinalPosition, + aWindowOrdinalPriority, + aSecondary, + aParentWindow); + 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, + TBool aSecondary, + RDrawableWindow* aParentWindow) : + CMccScreen( EBitmapScreen, aCamera, aPos, aArea, aIndex, + aWindowOrdinalPosition, aWindowOrdinalPriority, aSecondary, aParentWindow ), + iAborted( ETrue ) + { + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::CMccScreenBitmap +// ----------------------------------------------------------------------------- +// +CMccScreenBitmap::~CMccScreenBitmap() + { + + DetachFrame(); // Must do bitmap detach before releasing window resources + delete iDirectScreenAccess; + + delete iPausedFrameData; + delete iTimer; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::ConstructL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::ConstructL() + { + iTimer = CSVPTimer::NewL( *this, 1 ); + + CMccScreen::ConstructL(); + + // Create direct screen access + //iDirectScreenAccess = CDirectScreenAccess::NewL( iRwSession, *iDev, *iRw, *this ); + + UpdateViewFinderArea( iArea ); + + StartL(); // Simu HACK + iTimer->SetTime(500, 1); + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::StartL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::StartL() + { + iStopped = EFalse; + + if ( iCamera ) + { + StartCameraL(); + } + else if ( iPausedFrameData ) + { + + CFbsBitmap* frame = RestoreFrameLC(); + AttachFrameL( frame ); + CleanupStack::Pop( frame ); + } + else + { + // NOP + } + + StartDsaL(); + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::StartCameraL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::StartCameraL() + { + + __ASSERT_ALWAYS( iCamera, User::Leave( KErrNotReady ) ); + + // Camera may modify the size + TSize vfBitmapSize = iArea; + + if ( VfStartPossible() ) + { + iCamera->StartViewFinderBitmapsL( vfBitmapSize ); + } + + + UpdateViewFinderArea( vfBitmapSize ); + + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::StartDsaL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::StartDsaL() + { + /* + iAborted = EFalse; + iDirectScreenAccess->Cancel(); + iDirectScreenAccess->StartL(); + iGc = iDirectScreenAccess->Gc(); + iFbsDev = iDirectScreenAccess->ScreenDevice(); + iRegion = iDirectScreenAccess->DrawingRegion(); + + 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( KRgbBlue ); + iGc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + TPoint pointTl( 0, 0 ); + TRect rect( pointTl, iArea ); + iGc->DrawRect( rect ); + } + else + { + DrawBlackBorders(); + } + + if ( iAttachedFrame ) + { + + TSize viewFinderImageSize = iAttachedFrame->SizeInPixels(); + + TPoint corner = UpdateViewFinderArea( viewFinderImageSize ); + + iGc->BitBlt( corner, iAttachedFrame ); + } + + DoScreenDeviceUpdate(); + */ + //iGc->SetBrushStyle( CGraphicsContext::ENullBrush ); + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::Stop +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::Stop() + { + // Don't do anything yet, wait for next frame and then stop camera + iStopped = ETrue; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::Restart +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::Restart( RDirectScreenAccess::TTerminationReasons /*aReason*/ ) + { + + TRAP_IGNORE( StartDsaL() ); + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::AbortNow +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::AbortNow( RDirectScreenAccess::TTerminationReasons /*aReason*/ ) + { + iDirectScreenAccess->Cancel(); + + iAborted = ETrue; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::Draw +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::Draw( CFbsBitmap& aFrame ) + { + if ( iStopped ) + { + + // 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(); + } + else + { + // When normal frame draw is requested, attached frame is not anymore drawn + DetachFrame(); + + DoDraw( aFrame ); + } + } + +void CMccScreenBitmap::TimedOut( TInt aTimerId ) + { + iGraphicsContext->Activate(*iRw); + iRw->Invalidate(); + iRw->BeginRedraw(); + TRgb color1(0,0,255,255); + iGraphicsContext->Clear(); + iGraphicsContext->SetBrushColor( color1 ); + iGraphicsContext->SetBrushStyle( CGraphicsContext::ESolidBrush ); + iGraphicsContext->DrawRect( iPrimaryRect ); + TRgb color2(0,255,0,255); + iGraphicsContext->SetBrushColor( color2 ); + iGraphicsContext->DrawRect( iSecondaryRect ); + iRw->EndRedraw(); + iGraphicsContext->Deactivate(); + iRwSession.Flush(); + + /* + if ( !iAborted && iGc ){ + iGc->SetBrushColor( KRgbBlue ); + iGc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + iGc->DrawRect( iPrimaryRect ); + iGc->SetBrushColor( KRgbGreen ); + iGc->DrawRect( iSecondaryRect ); + DoScreenDeviceUpdate(); + } + */ + iTimer->SetTime(500, 1); + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::AttachFrameL +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::AttachFrameL( CFbsBitmap* aFrame ) + { + + __ASSERT_ALWAYS( aFrame, User::Leave( KErrArgument ) ); + + DetachFrame(); + + iAttachedFrame = aFrame; + + DoDraw( *iAttachedFrame ); + + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::DetachFrame +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::DetachFrame() + { + if ( iAttachedFrame ) + { + 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 ) + { + + 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 ); + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::RestoreFrameLC +// ----------------------------------------------------------------------------- +// +CFbsBitmap* 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(); + + + return tempFrame; + } + +// ----------------------------------------------------------------------------- +// CMccScreenBitmap::DrawBlackBorders +// ----------------------------------------------------------------------------- +// +void CMccScreenBitmap::DrawBlackBorders() + { + iGc->SetBrushColor( KRgbBlue ); + 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 ) + { + + CMccScreenDirect* self = new ( ELeave ) CMccScreenDirect( aCamera, + aPos, + aArea, + aIndex, + aWindowOrdinalPosition, + aWindowOrdinalPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::~CMccScreenDirect +// ----------------------------------------------------------------------------- +// +CMccScreenDirect::~CMccScreenDirect() + { + + if ( iDirectViewFinder ) + { + iDirectViewFinder->Release(); + iDirectViewFinder = NULL; + } + + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::StartL +// ----------------------------------------------------------------------------- +// +void CMccScreenDirect::StartL() + { + + + if ( iDirectViewFinder && iDirectViewFinder->ViewFinderState() == + CCamera::CCameraDirectViewFinder::EViewFinderPause ) + { + + iDirectViewFinder->ResumeViewFinderDirectL(); + } + else if ( VfStartPossible() ) + { + + StartDirectViewFinderL(); + } + else + { + // NOP + } + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::Stop +// ----------------------------------------------------------------------------- +// +void CMccScreenDirect::Stop() + { + + if ( iDirectViewFinder ) + { + // TBD: pausing disabled temporarily due problems in it + //TRAP_IGNORE( iDirectViewFinder->PauseViewFinderDirectL() ) + } + + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::SetCamera +// ----------------------------------------------------------------------------- +// +TInt CMccScreenDirect::SetCamera( CCamera* aCamera ) + { + CMccScreen::SetCamera( aCamera ); + + return HandleDirectViewFinder(); + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::ConstructL +// ----------------------------------------------------------------------------- +// +void CMccScreenDirect::ConstructL() + { + + CMccScreen::ConstructL(); + + User::LeaveIfError( HandleDirectViewFinder() ); + + } + +// ----------------------------------------------------------------------------- +// 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; + + TPoint point( 0, 0 ); + TRect vfRect( point, vfBitmapSize ); + iCamera->StartViewFinderDirectL( iRwSession, *iDev, *iRw, vfRect ); + } + } + +// ----------------------------------------------------------------------------- +// CMccScreenDirect::HandleDirectViewFinder +// ----------------------------------------------------------------------------- +// +TInt CMccScreenDirect::HandleDirectViewFinder() + { + TInt err( KErrNone ); + if ( iCamera ) + { + if ( !iDirectViewFinder ) + { + + iDirectViewFinder = static_cast( + iCamera->CustomInterface( TUid::Uid( KECamMCameraDirectViewFinderUidValue ) ) ); + + if ( !iDirectViewFinder ) + { + err = KErrNotSupported; + } + } + } + else if ( iDirectViewFinder ) + { + iDirectViewFinder->Release(); + iDirectViewFinder = NULL; + } + else + { + // NOP + } + return err; + } + + +// End of file +