--- /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 <AknsUtils.h>
+#include <AknIconUtils.h>
+#include <fbs.h>
+
+// 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