uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp
branchRCL_3
changeset 20 31fccae4f8a7
parent 19 e5af45d51884
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp	Tue Aug 31 16:07:35 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp	Wed Sep 01 12:16:53 2010 +0100
@@ -3043,8 +3043,9 @@
 //
 void CHuiCanvasTextureCache::HandleOutOfTextureMemory()
     {
-    RDebug::Print(_L("CHuiCanvasTextureCache::HandleOutOfTextureMemory: Out of memory happened !"));
-
+#ifdef HUI_DEBUG_PRINT_CANVAS_TEXTURE_CACHE
+    RDebug::Print(_L("CHuiCanvasTextureCache::HandleOutOfTextureMemory"));
+#endif
     DeleteAllReleasedEntries(EFalse);    
     
     // TODO: Who you gonna call when texture memory is full and we cannot ourself
@@ -3138,40 +3139,41 @@
     {
     // TODO: This should handle NVG textures
     
+    // No need to fetch only the unused texture entries to a separate binary
+    // ordered tree (with FindUnusedEntries()), just going the cached
+    // texts & images through once is enough.
     TInt totalUnusedTextureBytes = 0;
+    TSize textureSize(0,0);
     
     // Texts
-    RPointerArray<CHuiCanvasTextImage> textEntries;
-    
-    FindUnusedTextEntries(textEntries);
-
-    for(TInt i=textEntries.Count() - 1; i >= 0; i--)
+    for(TInt i = iCachedTexts.Count() - 1; i >= 0; i--)
         {
-        TSize textureSize = textEntries[i]->iTexture->Size();    
-        totalUnusedTextureBytes += textureSize.iWidth * textureSize.iHeight * KHuiCanvasTextEstimatedBpp/8.f;
-        }            
-    
-    textEntries.Close();        
-
-    // Images
-    RPointerArray<CHuiCanvasGraphicImage> imageEntries;
+        CHuiCanvasTextImage* entry = iCachedTexts[i];
+        // Check if the texture is being used..
+        if (!entry->iActiveUsers.Count())
+            {
+            // ..and if not, add it to the sum.
+            textureSize = entry->iTexture->Size();
+            totalUnusedTextureBytes += textureSize.iWidth * textureSize.iHeight * KHuiCanvasTextEstimatedBpp/8.f;
+            }
+        }
     
-    FindUnusedImageEntries(imageEntries);
-
-    for(TInt i=imageEntries.Count() - 1; i >= 0; i--)
+    // Images, just like texts.
+    for(TInt i = iCachedImages.Count() - 1; i >= 0; i--)
         {
-        TBool is16bit = EFalse;
-        if (imageEntries[i]->iBitmap && !imageEntries[i]->iMask && imageEntries[i]->iBitmap->ExtendedBitmapType() == KNullUid &&imageEntries[i]->iBitmap->DisplayMode() == EColor64K)
+        CHuiCanvasGraphicImage* entry = iCachedImages[i];    
+        if (!entry->iActiveUsers.Count())
             {
-            is16bit = ETrue;
+            TBool is16bit = EFalse;
+            if (entry->iBitmap && !entry->iMask && entry->iBitmap->ExtendedBitmapType() == KNullUid && entry->iBitmap->DisplayMode() == EColor64K)
+                {
+                is16bit = ETrue;
+                }
+            textureSize = entry->iTexture->Size();    
+            totalUnusedTextureBytes += textureSize.iWidth * textureSize.iHeight * (is16bit ? KHuiCanvasImageEstimatedBpp/16.f : KHuiCanvasImageEstimatedBpp/8.f);
             }
-
-        TSize textureSize = imageEntries[i]->iTexture->Size();    
-        totalUnusedTextureBytes += textureSize.iWidth * textureSize.iHeight * (is16bit ? KHuiCanvasImageEstimatedBpp/16.f : KHuiCanvasImageEstimatedBpp/8.f);
-        }            
-    
-    imageEntries.Close();        
-    
+        }
+
     return totalUnusedTextureBytes/1024;
     }