diff -r 33a5d2bbf6fc -r 73a1feb507fb mmsharing/livecommsui/lcui/tsrc/mustester/Stubs/mceclientstub/src/mccscreen.cpp --- /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 +#include +#include + +#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 +