diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/CamBmpRotatorAo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/CamBmpRotatorAo.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,167 @@ +/* +* Copyright (c) 2007 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: Utility class to rotate bitmaps* +*/ + + + +// INCLUDE FILES +#include +#include +#include "CamBmpRotatorAo.h" +#include "camlogging.h" + +// CONSTANTS + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::CCamBmpRotatorAo +// C++ constructor +// ----------------------------------------------------------------------------- +// +CCamBmpRotatorAo::CCamBmpRotatorAo() : CActive( EPriorityHigh ) + { + } + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::ConstructL +// Second phase constructor. +// ----------------------------------------------------------------------------- +// +void CCamBmpRotatorAo::ConstructL() + { + iRotator = CBitmapRotator::NewL(); + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCamBmpRotatorAo* CCamBmpRotatorAo::NewL() + { + CCamBmpRotatorAo* self = new( ELeave ) CCamBmpRotatorAo(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::~CCamBmpRotatorAo() +// Destructor +// ----------------------------------------------------------------------------- +// +CCamBmpRotatorAo::~CCamBmpRotatorAo() + { + PRINT( _L("Camera => ~CCamBmpRotatorAo") ); + if ( IsActive() ) + { + Cancel(); + } + + delete iRotator; + iQueue.ResetAndDestroy(); + PRINT( _L("Camera <= ~CCamBmpRotatorAo") ); + } + + + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::AddToQueueL +// Adds the specified bitmap/rotator to the queue of items to be rotated +// ----------------------------------------------------------------------------- +// +void CCamBmpRotatorAo::AddToQueueL( CFbsBitmap* aBitmap, CBitmapRotator::TRotationAngle aAngle ) + { + CRotateTask* task = new ( ELeave ) CRotateTask; + CleanupStack::PushL( task ); + task->iBitmap = aBitmap; + task->iAngle = aAngle; + User::LeaveIfError( iQueue.Append( task ) ); + CleanupStack::Pop( task ); + } + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::RunL +// Called when a rotation operation is completed (or cancelled) +// ----------------------------------------------------------------------------- +// +void CCamBmpRotatorAo::RunL() + { + // Pop the completed image from the queue. + CRotateTask* task = iQueue[0]; + iQueue.Remove( 0 ); + delete task; // NOTE: no need to delete bitmap (as not owned) + + // If rotate completed successfully... + // ... and there are more left on the queue... + // ... then start the next rotate + if ( iStatus.Int() == KErrNone ) + { + if ( iQueue.Count() > 0 ) + { + StartNextRotate(); + } + } + else + { + // Rotation failed; cancel further rotation attempts in + // the queue + iQueue.ResetAndDestroy(); + } + } + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::DoCancel +// Called to cancel an outstanding rotation operation +// ----------------------------------------------------------------------------- +// +void CCamBmpRotatorAo::DoCancel() + { + iRotator->Cancel(); + } + +// ----------------------------------------------------------------------------- +// CCamBmpRotatorAo::StartNextRotate +// Called to start the next queued rotation task. If no tasks are queued, does nothing +// ----------------------------------------------------------------------------- +// +void CCamBmpRotatorAo::StartNextRotate() + { + if ( iQueue.Count() == 0 ) + return; + + CRotateTask* task = iQueue[0]; + + iRotator->Rotate( &iStatus, *task->iBitmap, task->iAngle ); + SetActive(); + } + +// End of File