diff -r f15ac8e65a02 -r 779871d1e4f4 vtuis/videotelui/src/CVtUiBitmapManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/videotelui/src/CVtUiBitmapManager.cpp Wed Sep 01 12:29:12 2010 +0100 @@ -0,0 +1,662 @@ +/* +* Copyright (c) 2004 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: Implementation of the CVtUiBitmapManager class. +* +*/ + + + +// INCLUDE FILES +#include "CVtUiBitmapManager.h" +#include "VtUiLayout.h" +#include "VtUiPanic.h" + +#include +#include +#include + +// CONSTANTS + +// Granularity of bitmap manager array. +const TInt KVtUiBitmapManagerGranularity = 16; + +// MODULE DATA STRUCTURES + +/** +* CBitmapInfo instances hold information of a bitmap and its mask. +* @since Series 60 2.8 +*/ +class CVtUiBitmapManager::CBitmapInfo + : public CBase + { + public: // Constructors and destructor + + /** + * Constructor. + */ + inline CBitmapInfo( + TVtUiBitmapPoolId aId ); + + /** + * Destructor. + */ + ~CBitmapInfo(); + + /** + * Sets bitmap identifiers. + * @param aBitmapId bitmap identifier. + * @param aBitmapMaskId bitmap mask identifier. + */ + inline void SetBitmaps( + TVtUiBitmapId aBitmapId, + TVtUiBitmapId aBitmapMaskId ); + + /** + * Sets bitmap identifier. + * @param aBitmapId bitmap identifier. + */ + inline void SetBitmap( + TVtUiBitmapId aBitmapId ); + + /** + * Sets size. + * @param aSize size of the bitmaps. + */ + inline void SetSize( const TSize& aSize ); + + /** + * Sets aspect ratio preservation. + * @param aPreserve ETrue if aspect ratio preserved. + */ + inline void SetAspectRatio( TBool aPreserve ); + + /** + * Sets default color required / not required for this bitmap. + * By default, default color is not required. + * @param aRequireDefaultColor ETrue if default color is required, + * EFalse otherwise. + */ + inline void SetDefaultColorRequired( + TBool aRequireDefaultColor ); + + /** + * Sets default color. + * @param aDefaultColor default color. + */ + inline void SetDefaultColor( const TRgb& aDefaultColor ); + + /** + * Returns bitmap pool identifier. + * @return bitmap pool identifier. + */ + inline TVtUiBitmapPoolId BitmapPoolId() const; + + /** + * Gets a bitmap and its mask. + * @param aBitmap bitmap. + * @param aBitmapMask bitmap mask. + */ + inline void GetBitmap( + CFbsBitmap*& aBitmap, + CFbsBitmap*& aBitmapMask ); + + /** + * Resets bitmap information. + */ + void Reset(); + + /** + * Constructs bitmap as far as possible. + * @param aTmpFileName temporary file name, + */ + void Require( TFileName& aTmpFileName ); + + private: + + /** + * Creates bitmaps using AVKON methods. + * @param aTmpFileName temporary file name, + */ + void DoCreateBitmapsL( TFileName& aTmpFileName ); + + /** + * Sets size to the bitmap using AVKON method. + */ + void DoSetSize(); + + private: + + // Bitmap pool identifier. + TVtUiBitmapPoolId iBitmapPoolId; + + // Size has been defined. + TBool iHasSize; + + // Size of the bitmap has been changed. + TBool iSizeChanged; + + // Size of the bitmaps. + TSize iSize; + + // ETrue if default color required. + TBool iRequireDefaultColor; + + // Default color has been defined. + TBool iHasDefaultColor; + + // Default color. + TRgb iDefaultColor; + + // Bitmap identifier. + TVtUiBitmapId iBitmapId; + + // Owned bitmap instance. + CFbsBitmap* iBitmap; + + // Bitmap mask identifier. + TVtUiBitmapId iBitmapMaskId; + + // Owned bitmap mask instance. + CFbsBitmap* iBitmapMask; + + // ETrue if bitmaps have been created. + TBool iDoCreateBitmaps; + + // ETrue if size has been set. + TBool iDoSetSize; + + // ETrue if aspect ratio preservation has been updated. + TBool iHasAspectRatioPreserve; + + // ETrue if aspect ratio should be preserved. + TBool iAspectRatioPreserve; + + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CVtUiBitmapManager +// ----------------------------------------------------------------------------- +// +CVtUiBitmapManager::CVtUiBitmapManager() + : iBitmapArray( KVtUiBitmapManagerGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::~CVtUiBitmapManager +// ----------------------------------------------------------------------------- +// +CVtUiBitmapManager::~CVtUiBitmapManager() + { + iBitmapArray.ResetAndDestroy(); + iBitmapArray.Close(); + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::AddBitmapsL +// ----------------------------------------------------------------------------- +// +TVtUiBitmapPoolId CVtUiBitmapManager::AddBitmapsL( + TVtUiBitmapId aBitmapId, + TVtUiBitmapId aBitmapMaskId, + TBool aExpectDefaultColor ) + { + iBitmapId++; + CBitmapInfo* bitmapInfo = new ( ELeave ) CBitmapInfo( iBitmapId ); + CleanupStack::PushL( bitmapInfo ); + bitmapInfo->SetBitmaps( aBitmapId, aBitmapMaskId ); + bitmapInfo->SetDefaultColorRequired( aExpectDefaultColor ); + bitmapInfo->Require( iTmpFileName ); + + User::LeaveIfError( iBitmapArray.Append( bitmapInfo ) ); + CleanupStack::Pop( bitmapInfo ); + return iBitmapId; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::AddBitmapL +// ----------------------------------------------------------------------------- +// +TVtUiBitmapPoolId CVtUiBitmapManager::AddBitmapL( + TVtUiBitmapId aBitmapId, + TBool aExpectDefaultColor ) + { + iBitmapId++; + CBitmapInfo* bitmapInfo = new ( ELeave ) CBitmapInfo( iBitmapId ); + CleanupStack::PushL( bitmapInfo ); + bitmapInfo->SetBitmap( aBitmapId ); + bitmapInfo->SetDefaultColorRequired( aExpectDefaultColor ); + bitmapInfo->Require( iTmpFileName ); + + User::LeaveIfError( iBitmapArray.Append( bitmapInfo ) ); + CleanupStack::Pop( bitmapInfo ); + return iBitmapId; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::RemoveBitmap +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::RemoveBitmap( + TVtUiBitmapPoolId aId ) + { + const TInt pos = Find( aId ); + if ( pos != KErrNotFound ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ pos ]; + iBitmapArray.Remove( pos ); + delete bitmapInfo; + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::SetSize +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::SetSize( + TVtUiBitmapPoolId aId, + const TSize& aSize ) + { + const TInt pos = Find( aId ); + if ( pos != KErrNotFound ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ pos ]; + bitmapInfo->SetSize( aSize ); + bitmapInfo->Require( iTmpFileName ); + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::SetAspectRatio +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::SetAspectRatio( + TVtUiBitmapPoolId aId, + TBool aPreserve ) + { + const TInt pos = Find( aId ); + if ( pos != KErrNotFound ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ pos ]; + bitmapInfo->SetAspectRatio( aPreserve ); + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::SetSizeAndColor +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::SetSizeAndColor( + TVtUiBitmapPoolId aId, + const TSize& aSize, + const TRgb& aDefaultColor ) + { + const TInt pos = Find( aId ); + if ( pos != KErrNotFound ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ pos ]; + bitmapInfo->SetSize( aSize ); + bitmapInfo->SetDefaultColor( aDefaultColor ); + bitmapInfo->Require( iTmpFileName ); + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::RequireBitmap +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::RequireBitmap( TVtUiBitmapPoolId aId ) + { + const TInt pos = Find( aId ); + if ( pos != KErrNotFound ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ pos ]; + bitmapInfo->Require( iTmpFileName ); + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::GetBitmaps +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::GetBitmaps( + TVtUiBitmapPoolId aId, + CFbsBitmap*& aBitmap, + CFbsBitmap*& aBitmapMask ) + { + aBitmap = NULL; + aBitmapMask = NULL; + + const TInt pos = Find( aId ); + if ( pos != KErrNotFound ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ pos ]; + bitmapInfo->GetBitmap( aBitmap, aBitmapMask ); + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::GetBitmap +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::GetBitmap( + TVtUiBitmapPoolId aId, + CFbsBitmap*& aBitmap ) + { + CFbsBitmap* dummy = NULL; + GetBitmaps( aId, aBitmap, dummy ); + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::InvalidateBitmaps +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::InvalidateBitmaps() + { + const TInt count = iBitmapArray.Count(); + for ( TInt index = 0; index < count; index++ ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ index ]; + bitmapInfo->Reset(); + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::Find +// ----------------------------------------------------------------------------- +// +TInt CVtUiBitmapManager::Find( TVtUiBitmapPoolId aId ) const + { + TInt result = KErrNotFound; + const TInt count = iBitmapArray.Count(); + for ( TInt index = 0; index < count; index++ ) + { + CBitmapInfo* bitmapInfo = iBitmapArray[ index ]; + if ( bitmapInfo->BitmapPoolId() == aId ) + { + result = index; + index = count; // out of the loop + } + } + + return result; + } + +// Implementation of CBitmapInfo: + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::CBitmapInfo +// ----------------------------------------------------------------------------- +// +inline CVtUiBitmapManager::CBitmapInfo::CBitmapInfo( + TVtUiBitmapPoolId aId ) + : iBitmapPoolId( aId ), + iBitmapId( EVtUiBitmapNone ), + iBitmapMaskId( EVtUiBitmapNone ) + { + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::~CBitmapInfo +// ----------------------------------------------------------------------------- +// +CVtUiBitmapManager::CBitmapInfo::~CBitmapInfo() + { + delete iBitmap; + delete iBitmapMask; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::SetBitmaps +// ----------------------------------------------------------------------------- +// +inline void CVtUiBitmapManager::CBitmapInfo::SetBitmaps( + TVtUiBitmapId aBitmapId, + TVtUiBitmapId aBitmapMaskId ) + { + iBitmapId = aBitmapId; + iBitmapMaskId = aBitmapMaskId; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::SetBitmap +// ----------------------------------------------------------------------------- +// +inline void CVtUiBitmapManager::CBitmapInfo::SetBitmap( + TVtUiBitmapId aBitmapId ) + { + iBitmapId = aBitmapId; + iBitmapMaskId = EVtUiBitmapNone; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::SetSize +// ----------------------------------------------------------------------------- +// +inline void CVtUiBitmapManager::CBitmapInfo::SetSize( + const TSize& aSize ) + { + if ( iHasSize ) + { + iSizeChanged = ( iSize != aSize ); + } + + iHasSize = ETrue; + iSize = aSize; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::SetAspectRatio +// ----------------------------------------------------------------------------- +// +inline void CVtUiBitmapManager::CBitmapInfo::SetAspectRatio( TBool aPreserve ) + { + iHasAspectRatioPreserve = ETrue; + iAspectRatioPreserve = aPreserve; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::SetDefaultColorRequired +// ----------------------------------------------------------------------------- +// +inline void CVtUiBitmapManager::CBitmapInfo::SetDefaultColorRequired( + TBool aRequireDefaultColor ) + { + iRequireDefaultColor = aRequireDefaultColor; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::SetDefaultColor +// ----------------------------------------------------------------------------- +// +inline void CVtUiBitmapManager::CBitmapInfo::SetDefaultColor( + const TRgb& aDefaultColor ) + { + __ASSERT_DEBUG( iRequireDefaultColor, + VtUiPanic::Panic( EVtUiPanicDefaultColorRequireMismatch ) ); + iHasDefaultColor = ETrue; + iDefaultColor = aDefaultColor; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::BitmapPoolId +// ----------------------------------------------------------------------------- +// +inline TVtUiBitmapPoolId CVtUiBitmapManager::CBitmapInfo::BitmapPoolId() const + { + return iBitmapPoolId; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::GetBitmap +// ----------------------------------------------------------------------------- +// +inline void CVtUiBitmapManager::CBitmapInfo::GetBitmap( + CFbsBitmap*& aBitmap, + CFbsBitmap*& aBitmapMask ) + { + if ( iDoCreateBitmaps && iDoSetSize ) + { + aBitmap = iBitmap; + aBitmapMask = iBitmapMask; + } + else + { + aBitmap = NULL; + aBitmapMask = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::Reset +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::CBitmapInfo::Reset() + { + delete iBitmap; + iBitmap = NULL; + + delete iBitmapMask; + iBitmapMask = NULL; + + iSize = TSize(); + iHasSize = EFalse; + iSizeChanged = EFalse; + iHasDefaultColor = EFalse; + iDefaultColor = TRgb(); + iDoCreateBitmaps = EFalse; + iDoSetSize = EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::Require +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::CBitmapInfo::Require( TFileName& aTmpFileName ) + { + // Bitmap can be created when the following has been satisfied + // a) It has not been created yet and default color is not required, + // b) It has not been created yet and default color is required and + // default color is available. + if ( !iDoCreateBitmaps && !( iRequireDefaultColor && !iHasDefaultColor ) ) + { + TRAP_IGNORE( DoCreateBitmapsL( aTmpFileName ) ); + } + + DoSetSize(); + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::DoCreateBitmapsL +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::CBitmapInfo::DoCreateBitmapsL( + TFileName& aTmpFileName ) + { + if ( !iDoCreateBitmaps ) + { + TInt bitmapIndex = KErrNotFound; + + VtUiLayout::Resolve( iBitmapId, aTmpFileName, bitmapIndex ); + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + TAknsItemID skinId = VtUiLayout::MapBitmapToSkinId( iBitmapId ); + + TAknsItemID colorId = KAknsIIDNone; + TInt colorIndex = KErrNotFound; + TBool colorAvailable = EFalse; + if ( iHasDefaultColor ) + { + colorAvailable = + VtUiLayout::MapBitmapToColorId( + iBitmapId, colorId, colorIndex ); + } + + if ( iBitmapMaskId != EVtUiBitmapNone ) + { + TInt bitmapMaskIndex = KErrNotFound; +#ifdef _DEBUG + TFileName fileName; + VtUiLayout::Resolve( iBitmapMaskId, fileName, bitmapMaskIndex ); + __ASSERT_ALWAYS( aTmpFileName == fileName, + VtUiPanic::Panic( EVtUiPanicMismatchInBitmapFileNames ) ); +#else + VtUiLayout::Resolve( iBitmapMaskId, aTmpFileName, bitmapMaskIndex ); +#endif + if ( colorAvailable ) + { + AknsUtils::CreateColorIconL( + skin, skinId, + colorId, colorIndex, + iBitmap, iBitmapMask, + aTmpFileName, + bitmapIndex, + bitmapMaskIndex, + iDefaultColor ); + } + else + { + AknsUtils::CreateIconL( + skin, skinId, + iBitmap, iBitmapMask, + aTmpFileName, + bitmapIndex, + bitmapMaskIndex ); + } + } + else + { + // Only normal skinning for these. + AknsUtils::CreateIconL( + skin, + skinId, + iBitmap, + aTmpFileName, + bitmapIndex ); + } + + iDoCreateBitmaps = ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CVtUiBitmapManager::CBitmapInfo::DoSetSize +// ----------------------------------------------------------------------------- +// +void CVtUiBitmapManager::CBitmapInfo::DoSetSize() + { + if ( iDoCreateBitmaps && iHasSize && ( !iDoSetSize || iSizeChanged ) ) + { + iSizeChanged = EFalse; + TInt retBitmap = KErrNone; + if ( !iHasAspectRatioPreserve ) + { + retBitmap = AknIconUtils::SetSize( iBitmap, iSize ); + } + else + { + TScaleMode scaleMode = + iAspectRatioPreserve ? + EAspectRatioPreserved : + EAspectRatioNotPreserved; + retBitmap = AknIconUtils::SetSize( iBitmap, iSize, scaleMode ); + } + + iDoSetSize = ( retBitmap == KErrNone ); + } + } + +// End of File