diff -r 000000000000 -r 05e9090e2422 uigraphics/AknIcon/srvsrc/AknIconDataPreserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uigraphics/AknIcon/srvsrc/AknIconDataPreserver.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2002 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 FILES + +#include +#include +#include "AknIconDataPreserver.h" +#include "AknIconFormatHandlerFactory.h" +#include "AknIconFormatHandler.h" +#include "AknIconDataItem.h" +#include "AknIconSrvDef.h" +#include "AknIconSrv.h" +#include "AknIconSrvIconItem.h" +#include "AknIconLoader.h" +#include "AknIconSrvPanic.h" +#include "AknIconSrvUtils.h" +#include "AknIconPanic.h" + + +// CONSTANTS +const TInt KIconDataItemGranularity = 1; + +// ================= MEMBER FUNCTIONS ========================================== + +CAknIconDataPreserver::CAknIconDataPreserver( CAknIconServer& aServer ) : + iServer( aServer ), + iItems( KIconDataItemGranularity ) + { + } + +CAknIconDataPreserver::~CAknIconDataPreserver() + { + iItems.ResetAndDestroy(); + } + +CAknIconDataPreserver* CAknIconDataPreserver::NewL( CAknIconServer& aServer ) + { + return new( ELeave ) CAknIconDataPreserver( aServer ); + } + +// ----------------------------------------------------------------------------- +// CAknIconDataPreserver::CreateIconL +// ----------------------------------------------------------------------------- +// +CAknIconSrvIconItem* CAknIconDataPreserver::CreateIconL( + const TAknIconParams& aParams ) + { + CAknIconSrvIconItem* iconItem = NULL; + + // Can be instantiated in stack with this constructor. + CAknIconDataItem compareItem( aParams ); + + TInt index = iItems.FindInOrder( + &compareItem, CAknIconDataItem::LinearOrder ); + + if ( index >= 0 ) + { + CFbsBitmap* bitmap = new (ELeave) CFbsBitmap; + CleanupStack::PushL( bitmap ); + + CFbsBitmap* mask = NULL; + + if ( aParams.iMaskId >= 0 ) + { + mask = new (ELeave) CFbsBitmap; + CleanupStack::PushL( mask ); + } + + iHandler->UsePreparedIconL( iItems[index]->iHandle ); + + TAknContentDimensions dimensions = AknIconSrvUtils::RenderPreparedIconL( + *iHandler, + bitmap, + mask, + iItems[index]->iBitmapDepth, + iServer.IconDepth(), + aParams.iSize, + (TScaleMode)aParams.iMode, + aParams.iRotationAngle, aParams.iColor, aParams.iAppIcon ); + + iconItem = CAknIconSrvIconItem::NewL( aParams, + bitmap, + mask, + dimensions, + iServer.IconFileNameCache() ); + CleanupStack::Pop(); // bitmap + if ( mask ) + { + CleanupStack::Pop(); // mask + } + } + + return iconItem; + } + +// ----------------------------------------------------------------------------- +// CAknIconDataPreserver::PreserveIconDataL +// ----------------------------------------------------------------------------- +// +const CAknIconDataItem* CAknIconDataPreserver::PreserveIconDataL( + const TAknIconParams& aParams ) + { + CAknIconDataItem* item = NULL; + + CAknIconDataItem compareItem( aParams ); + + TInt index = iItems.FindInOrder( + &compareItem, CAknIconDataItem::LinearOrder ); + + if ( index >= 0 ) + { + item = iItems[index]; + item->iUserCount++; + } + else + { + CAknIconLoader* loader; + TPtrC8 iconData = iServer.InitIconDataAndHandlerLC( + aParams, loader, iHandler ); + + // Do not perform preserving for NVG as + // NVG does not need preserving data + if (loader->IconTypeL( aParams.iBitmapId ) == EIconFormatNVG ) + { + CleanupStack::PopAndDestroy(); // InitIconDataAndHandlerLC + User::Leave( KErrGeneral ); + } + + item = CAknIconDataItem::NewL( aParams, iServer.IconFileNameCache() ); + CleanupStack::PushL( item ); + + // Makes sure that the icon loader is released when required. + CleanupStack::PushL( + TCleanupItem( CAknIconServer::CleanupIconLoader, &iServer ) ); + + + + item->iBitmapDepth = (TDisplayMode)loader->IconDepthL( aParams.iBitmapId ); + item->iMaskDepth = (TDisplayMode)loader->MaskDepthL( aParams.iBitmapId ); + + iHandler->PrepareIconL( iconData, item->iHandle ); + + // CleanupIconLoader, InitIconDataAndHandlerLC + CleanupStack::PopAndDestroy(); // CleanupIconLoader, + + User::LeaveIfError( iItems.InsertInOrder( + item, CAknIconDataItem::LinearOrder ) ); + + CleanupStack::Pop(); // item + CleanupStack::PopAndDestroy(); // InitIconDataAndHandlerLC + } + + return item; + } + +// ----------------------------------------------------------------------------- +// CAknIconDataPreserver::UnpreserveIconData +// ----------------------------------------------------------------------------- +// +const CAknIconDataItem* CAknIconDataPreserver::UnpreserveIconData( + const TAknIconParams& aParams, TInt aCount, const RMessage2& /*aMessage*/) + { + CAknIconDataItem compareItem( aParams ); + + TInt index = iItems.FindInOrder( + &compareItem, CAknIconDataItem::LinearOrder ); + + CAknIconDataItem* item = 0; + if (index >= 0) + { + item = iItems[index]; + item->iUserCount -= aCount; + + if ( item->iUserCount == 0 ) + { + iHandler->UnprepareIcon( item->iHandle ); + delete item; + iItems.Remove( index ); + } + } + // OK to return also a pointer to a deleted item. + return item; + } + +// ----------------------------------------------------------------------------- +// CAknIconDataPreserver::GetContentDimensionsL +// ----------------------------------------------------------------------------- +// +void CAknIconDataPreserver::GetContentDimensionsL( + const TAknIconParams& aParams, + TAknContentDimensions& aContentDimensions ) + { + CAknIconDataItem compareItem( aParams ); + + TInt index = iItems.FindInOrder( + &compareItem, CAknIconDataItem::LinearOrder ); + + if ( index >= 0 ) + { + iHandler->UsePreparedIconL( iItems[index]->iHandle ); + iHandler->GetContentDimensionsL( aContentDimensions ); + } + else + { + CAknIconLoader* loader; + TPtrC8 iconData = iServer.InitIconDataAndHandlerLC( + aParams, loader, iHandler ); + + TInt handle; + iHandler->PrepareIconL( iconData, handle ); + TRAPD( err, + { + iHandler->UsePreparedIconL( handle ); + iHandler->GetContentDimensionsL( aContentDimensions ); + } ); + iHandler->UnprepareIcon( handle ); + User::LeaveIfError( err ); + CleanupStack::PopAndDestroy(); // InitIconDataAndHandlerLC + } + } + +// End of File