mmsharing/livecommsui/lcui/tsrc/ipvtengine/src/mccscreen.cpp
branchRCL_3
changeset 22 73a1feb507fb
--- /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 <bitstd.h>
+#include <ecam.h>
+#include <ecam/mcameradirectviewfinder.h>
+#include <coecntrl.h>
+#include <eikenv.h>
+#include <eikappui.h>
+#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<MCameraDirectViewFinder*>(
+                iCamera->CustomInterface( TUid::Uid( KECamMCameraDirectViewFinderUidValue ) ) );
+            
+            if ( !iDirectViewFinder )
+                {
+                err = KErrNotSupported;
+                }
+            }
+        }
+    else if ( iDirectViewFinder )
+        {
+        iDirectViewFinder->Release();
+        iDirectViewFinder = NULL;
+        }
+    else
+        {
+        // NOP
+        }
+    return err; 
+    }
+
+
+// End of file
+