--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/src/appiconcache.cpp Mon Jun 21 16:41:52 2010 +0300
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2010 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 "appiconcache.h"
+
+CAppIconCache::~CAppIconCache()
+ {
+ Clear();
+ }
+
+CAppIconCache::CAppIconCache(TInt aCacheLimit) : iCache(32), iCacheLimit(aCacheLimit)
+ {
+ }
+
+CAppIconCache* CAppIconCache::NewL(TInt aCacheLimit)
+ {
+ CAppIconCache* self = new (ELeave) CAppIconCache(aCacheLimit);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+
+void CAppIconCache::ConstructL()
+ {
+ }
+
+EXPORT_C CFbsBitmap* CAppIconCache::Find(TInt64 aSerialNumber, TSize aSize)
+ {
+ TRasterizedBitmap rb;
+ for (TInt index = 0; index < iCache.Count(); index++)
+ {
+ if (iCache[index].iBitmapSerial == aSerialNumber && iCache[index].iBitmap->SizeInPixels() == aSize)
+ {
+ // if we found a match, move the entry to the beginning of
+ // the cache
+ rb = iCache[index];
+ iCache.Remove(index);
+ iCache.Insert(rb, 0);
+ return rb.iBitmap;
+ }
+ }
+ return NULL;
+ }
+
+EXPORT_C TInt CAppIconCache::Insert(TRasterizedBitmap& aBitmap)
+ {
+ TSize bitmapsize = aBitmap.iBitmap->SizeInPixels();
+ // assume 32bpp for the icon
+ TInt bitmapBytes = bitmapsize.iWidth*bitmapsize.iHeight*4;
+ if (bitmapBytes > 128*128*4)
+ {
+ return KErrTooBig;
+ }
+
+ if (iCache.Count() > iCacheLimit)
+ {
+ // cache limit exceeded, remove
+ // the least recently used entry
+ delete iCache[iCache.Count()-1].iBitmap;
+ iCache.Remove(iCache.Count()-1);
+ }
+ return iCache.Insert(aBitmap, 0);
+ }
+
+EXPORT_C void CAppIconCache::Clear()
+ {
+ for (TInt index = 0; index < iCache.Count(); index++)
+ {
+ delete iCache[index].iBitmap;
+ }
+ iCache.Reset();
+ }