uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp
branchRCL_3
changeset 7 88b23e2e82e1
parent 3 d8a3531bc6b8
child 8 46927d61fef3
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -60,6 +60,11 @@
 
 CHuiRosterImpl::~CHuiRosterImpl()
     {
+    if (iDisplay)
+        {
+        iDisplay->Env().RemoveMemoryLevelObserver(this);
+        }
+
     FreezeVisibleContentL(EFalse);
     
     delete iLongTapDetector;
@@ -530,7 +535,7 @@
     
     ASSERT(display!=NULL);
 
-    if (iCanvasRenderBuffer && iCanvasGc)
+    if (IsVisibleContentFrozen())
         {
         DrawSelfFrozen(aGc, display);
         return;
@@ -1621,19 +1626,30 @@
 
 void CHuiRosterImpl::FreezeVisibleContentL(TBool aEnable)
     {
+    iRosterIsFrozen = aEnable;
+    
+    if (aEnable && !iMonitorMemoryLevel && iDisplay)
+        {
+        iDisplay->Env().AddMemoryLevelObserver(this);
+        iMonitorMemoryLevel = ETrue;
+        }
+    
     if (aEnable)
         {    
-        if (!iCanvasGc)
+        if (UseRenderBufferForFreeze())
             {
-            CHuiRenderPlugin& renderplugin = CHuiStatic::Renderer();
-            iCanvasGc = renderplugin.CreateCanvasGcL();
-            }    
-        if (!iCanvasRenderBuffer)
-            {
-            iCanvasRenderBuffer = iCanvasGc->CreateRenderBufferL(TSize(0,0));
-            iCanvasRenderBuffer->InitializeL(CHuiStatic::Env().Display(0).VisibleArea().Size());
-            iCanvasRenderBuffer->Copy(TPoint(0,0));    
-            iCanvasRenderBufferOrientation = CHuiStatic::Env().Display(0).Orientation();
+            if (!iCanvasGc)
+                {
+                CHuiRenderPlugin& renderplugin = CHuiStatic::Renderer();
+                iCanvasGc = renderplugin.CreateCanvasGcL();
+                }    
+            if (!iCanvasRenderBuffer)
+                {
+                iCanvasRenderBuffer = iCanvasGc->CreateRenderBufferL(TSize(0,0));
+                iCanvasRenderBuffer->InitializeL(CHuiStatic::Env().Display(0).VisibleArea().Size());
+                iCanvasRenderBuffer->Copy(TPoint(0,0));    
+                iCanvasRenderBufferOrientation = CHuiStatic::Env().Display(0).Orientation();
+                }
             }
         }
     else
@@ -1648,7 +1664,7 @@
 
 TBool CHuiRosterImpl::IsVisibleContentFrozen() const
     {
-    return ((iCanvasRenderBuffer != NULL) && (iCanvasGc != NULL));
+    return iRosterIsFrozen;
     }
     
 void CHuiRosterImpl::EffectSetEffect(CHuiFxEffect* aEffect)
@@ -1707,3 +1723,20 @@
     {
     return iIsInput1;
     }
+
+void CHuiRosterImpl::SetMemoryLevel(THuiMemoryLevel /*aLevel*/)
+    {
+    if ( IsVisibleContentFrozen() && !UseRenderBufferForFreeze() )
+        {
+        // Release render buffer if we are not supposed to use.
+        delete iCanvasGc;
+        iCanvasGc = NULL;        
+        delete iCanvasRenderBuffer;
+        iCanvasRenderBuffer = NULL;        
+        }
+    }
+
+TBool CHuiRosterImpl::UseRenderBufferForFreeze() const
+    {
+    return !iDisplay || !( iDisplay->Env().MemoryLevel() <= EHuiMemoryLevelLowest );
+    }