--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/livecommsui/lcui/tsrc/mustester/Stubs/mceclientstub/src/mccscreen.cpp Tue Aug 31 15:12:07 2010 +0300
@@ -0,0 +1,402 @@
+/*
+* 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 <w32std.h>
+#include <gdi.h>
+
+#include "MccScreen.h"
+#include "muslogger.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 ===============================
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+CMccScreen* CMccScreen::NewL(
+ TPoint aPos,
+ TSize aArea,
+ TInt aIndex,
+ TInt aWindowOrdinalPosition,
+ TInt aWindowOrdinalPriority,
+ TSize aViewFinderImageSize )
+ {
+ CMccScreen* self = new ( ELeave ) CMccScreen( aPos,
+ aArea,
+ aIndex,
+ aWindowOrdinalPosition,
+ aWindowOrdinalPriority );
+ CleanupStack::PushL( self );
+ self->ConstructL( aViewFinderImageSize );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+CMccScreen::CMccScreen(
+ TPoint aPos,
+ TSize aArea,
+ TInt aIndex,
+ TInt aWindowOrdinalPosition,
+ TInt aWindowOrdinalPriority ) :
+ iDeviceIndex( aIndex ),
+ iPosition( aPos ),
+ iArea( aArea ),
+ iWindowOrdinalPosition( aWindowOrdinalPosition ),
+ iWindowOrdinalPriority( aWindowOrdinalPriority ),
+ iAborted( ETrue )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+CMccScreen::~CMccScreen()
+ {
+ MUS_LOG( "CMccScreen::~CMccScreen" )
+
+ DetachFrame(); // Must do bitmap detach before releasing window resources
+ delete iDirectScreenAccess;
+ delete iDev;
+ delete iRw;
+ delete iRwGroup;
+ iRwSession.Close();
+
+ MUS_LOG( "CMccScreen::~CMccScreen, exit" )
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::ConstructL( TSize aViewFinderImageSize )
+ {
+ MUS_LOG( "CMccScreen::ConstructL" )
+ User::LeaveIfError( iRwSession.Connect() );
+
+ // Create window group
+ TInt groupId = iRwSession.GetFocusWindowGroup();
+ iRwGroup = new (ELeave) RWindowGroup( iRwSession ) ;
+ //TInt handle = iRwSession.GetWindowGroupHandle( groupId );
+
+ MUS_LOG1( "CMccScreen::ConstructL, window ordinal pos", iWindowOrdinalPosition )
+ MUS_LOG1( "CMccScreen::ConstructL, window ordinal priority", iWindowOrdinalPriority )
+
+ 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();
+ MUS_LOG1( "CMccScreen::ConstructL, screen device mode = %d", currMode )
+
+ TPixelsTwipsAndRotation sizeAndRotation;
+ iDev->GetScreenModeSizeAndRotation( currMode, sizeAndRotation );
+ MUS_LOG2( "CMccScreen::ConstructL, screen device size %d %d",
+ sizeAndRotation.iPixelSize.iWidth,
+ sizeAndRotation.iPixelSize.iHeight )
+
+ MUS_LOG1( "CMccScreen::ConstructL, screen device orientation %d",
+ sizeAndRotation.iRotation )
+
+ // Create window
+ iRw = new (ELeave) RWindow( iRwSession );
+
+ iRw->Construct( *iRwGroup, (TUint32) this + 2 );
+
+ MUS_LOG2( "CMccScreen::ConstructL, window pos %d %d", iPosition.iX, iPosition.iY )
+ MUS_LOG2( "CMccScreen::ConstructL, window size %d %d", iArea.iWidth, iArea.iHeight )
+
+ iRw->SetPosition( iPosition );
+ iRw->SetBackgroundColor( KRgbBlack );
+ iRw->SetSize( iArea );
+ iRw->SetOrdinalPosition( iWindowOrdinalPosition );
+ iRw->Activate();
+ iRwSession.Flush();
+
+ // Create direct screen access
+ iDirectScreenAccess = CDirectScreenAccess::NewL( iRwSession, *iDev, *iRw, *this );
+
+ UpdateViewFinderArea( aViewFinderImageSize );
+
+ MUS_LOG2( "CMccScreen::ConstructL, viewfinder pos %d %d",
+ iViewFinderImageRect.iTl.iX, iViewFinderImageRect.iTl.iY )
+ MUS_LOG2( "CMccScreen::ConstructL, viewfinder size %d %d",
+ iViewFinderImageRect.Width(), iViewFinderImageRect.Height() )
+
+ MUS_LOG( "CMccScreen::ConstructL, exit" )
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::StartL()
+ {
+ MUS_LOG( "CMccScreen::StartL" )
+
+ iAborted = EFalse;
+
+ 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 ];
+ MUS_LOG_INT2( "CMccScreen::StartL, rect tl", regionRect.iTl.iX, regionRect.iTl.iY )
+ MUS_LOG_INT2( "CMccScreen::StartL, 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.
+ //
+ iGc->SetBrushColor( KRgbBlack );
+ iGc->SetBrushStyle( CGraphicsContext::ESolidBrush );
+
+ if ( !iFirstImageDrawn )
+ {
+ // Whole area
+ TPoint pointTl( 0, 0 );
+ TRect rect( pointTl, iArea );
+ iGc->DrawRect( rect );
+ }
+ else
+ {
+ // 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 );
+ }
+
+ if ( iAttachedFrame )
+ {
+ MUS_LOG( "CMccScreen::StartL, draw attached frame" )
+
+ TSize viewFinderImageSize = iAttachedFrame->SizeInPixels();
+
+ TPoint corner = UpdateViewFinderArea( viewFinderImageSize );
+
+ iGc->BitBlt( corner, iAttachedFrame );
+ }
+
+ DoScreenDeviceUpdate();
+
+ iGc->SetBrushStyle( CGraphicsContext::ENullBrush );
+
+ MUS_LOG( "CMccScreen::StartL, exit" )
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::Stop()
+ {
+ MUS_LOG( "CMccScreen::Stop" )
+ iDirectScreenAccess->Cancel();
+ MUS_LOG( "CMccScreen::Stop, exit" )
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::Restart( RDirectScreenAccess::TTerminationReasons /*aReason*/ )
+ {
+ MUS_LOG( "CMccScreen::Restart" )
+
+ TRAP_IGNORE( StartL() );
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::AbortNow( RDirectScreenAccess::TTerminationReasons /*aReason*/ )
+ {
+ MUS_LOG( "CMccScreen::AbortNow" )
+ iDirectScreenAccess->Cancel();
+
+ iAborted = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::CMccScreen
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::Draw( CFbsBitmap& aFrame )
+ {
+ // When frame draw is requested, attached frame is not anymore drawn
+ DetachFrame();
+
+ DoDraw( aFrame );
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::AttachFrameL
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::AttachFrameL( CFbsBitmap* aFrame )
+ {
+ MUS_LOG( "CMccScreen::AttachFrameL" )
+
+ __ASSERT_ALWAYS( aFrame, User::Leave( KErrArgument ) );
+
+ DetachFrame();
+
+ iAttachedFrame = aFrame;
+
+ DoDraw( *iAttachedFrame );
+
+ MUS_LOG( "CMccScreen::AttachFrameL, exit" )
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::DetachFrame
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::DetachFrame()
+ {
+ if ( iAttachedFrame )
+ {
+ MUS_LOG( "CMccScreen::DetachFrame, detaching" )
+ iAttachedFrame->Reset();
+ delete iAttachedFrame;
+ }
+
+ iAttachedFrame = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::UpdateViewFinderArea
+// -----------------------------------------------------------------------------
+//
+TPoint CMccScreen::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;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::DoDraw
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::DoDraw( CFbsBitmap& aFrame )
+ {
+ if ( !iAborted && iGc )
+ {
+ iFirstImageDrawn = ETrue;
+
+ TSize viewFinderImageSize = aFrame.SizeInPixels();
+
+ TPoint corner = UpdateViewFinderArea( viewFinderImageSize );
+
+ iGc->BitBlt( corner, &aFrame );
+
+ DoScreenDeviceUpdate();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMccScreen::DoScreenDeviceUpdate
+// -----------------------------------------------------------------------------
+//
+void CMccScreen::DoScreenDeviceUpdate()
+ {
+ if ( iFbsDev )
+ {
+ iFbsDev->Update();
+ }
+ }
+
+// End of file
+