uiacceltk/hitchcock/coretoolkit/src/appiconcache.cpp
branchRCL_3
changeset 41 cd0ae4656946
--- /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();
+    }