multimediacommscontroller/mmcccontroller/src/mccscreen.cpp
changeset 0 1bce908db942
child 3 513a8b745b2f
--- /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 <bitstd.h>
+#include <ecam.h>
+#include <ecam/mcameradirectviewfinder.h>
+
+#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<MCameraDirectViewFinder*>(
+                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
+