uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp
changeset 25 f7f1ae431f74
parent 21 6ce30188c5bf
child 29 ac3859d43844
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp	Fri May 14 16:46:13 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp	Thu May 27 13:47:19 2010 +0300
@@ -218,6 +218,8 @@
     iVisibleAreaObservers.Reset();
     iRosterObservers.Reset();
 
+    iTempDirtyRegions.Close();
+    
     iDirtyRegions.Close();
     iDirtyRegions2.Close();
     if ( iCurrentDirtyRegions )
@@ -649,6 +651,9 @@
  	
     iWholeDisplayAreaIsDirty = EFalse;    
     
+    // Restore state to defaults. Alf client may have done some NVG drawing outside refresh loop and main drawing context may be wrong
+    iGc->RestoreState();
+    
     if(iUpdateRenderState)
         {
         // Set state when requested.
@@ -734,16 +739,18 @@
     // this frame and the previous frame (this is needed when buffer swapping
     // is used; with buffer copying a single list of dirty regions would
     // suffice).
-    RDirtyRegions dirty;
+
+
+    iTempDirtyRegions.Reset();
     for(i = 0; i < iCurrentDirtyRegions->Count(); ++i)
         {
-        dirty.Append((*iCurrentDirtyRegions)[i]);
+        iTempDirtyRegions.Append((*iCurrentDirtyRegions)[i]);
         }
     if (iPreviousDirtyRegions)
     	{
     	for(i = 0; i < iPreviousDirtyRegions->Count(); ++i)
         	{
-        	AddDirtyRegion((*iPreviousDirtyRegions)[i], dirty, EFalse);
+        	AddDirtyRegion((*iPreviousDirtyRegions)[i], iTempDirtyRegions, EFalse);
         	}
     	}
 
@@ -794,25 +801,25 @@
 	// Set dirty rect in render surface to minimize screen update
 	// Only implemented for BitGdi renderer for now
     TRect mergedDirtyRect;
-    if (dirty.Count() > 0)
+    if (iTempDirtyRegions.Count() > 0)
     	{
-    	mergedDirtyRect = dirty[0];
+    	mergedDirtyRect = iTempDirtyRegions[0];
     	}
     	
 	if (useDirtyRects)
 	    {
 		// When Bitgdi renderer used set dirty rect in render surface
 		// to minimize screen update in CHuiBitgdiRenderSurface::SwapBuffers
-	    if (dirty.Count() == 1)
+	    if (iTempDirtyRegions.Count() == 1)
 		    {
             ClipDirtyRect(mergedDirtyRect, VisibleAreaClippingRect());
             iRenderSurface->SetDirtyRect(mergedDirtyRect);
 		    }
-		else if (dirty.Count() > 1) 
+		else if (iTempDirtyRegions.Count() > 1) 
 		    {
-			for(i = 1; i < dirty.Count(); ++i)
+			for(i = 1; i < iTempDirtyRegions.Count(); ++i)
 				{
-				TRect r(dirty[i]);
+				TRect r(iTempDirtyRegions[i]);
 				// check top left corner to expand or not
 				if (r.iTl.iX < mergedDirtyRect.iTl.iX)
 				    {
@@ -852,8 +859,8 @@
 	// Merge into max one dirty area when HW accelrated drawing is used
 	if (useDirtyRects && IsRendererHWAccelerated())
 	    {
-	    dirty.Reset();
-	    dirty.Append(mergedDirtyRect);
+        iTempDirtyRegions.Reset();
+        iTempDirtyRegions.Append(mergedDirtyRect);
 	    }
 	
 #ifdef HUI_DEBUG_PRINT_PERFORMANCE_INTERVAL
@@ -865,10 +872,11 @@
 #endif	
 	
     // Usually there is only one dirty region (if any).
-    for(i = 0; i < dirty.Count(); ++i)
+    iCurrentDirtyIndx = 0;
+    for(; iCurrentDirtyIndx < iTempDirtyRegions.Count(); ++iCurrentDirtyIndx)
         {
         // Set up the clipping rectangle.
-        TRect dirtyRect = dirty[i];
+        TRect dirtyRect = iTempDirtyRegions[iCurrentDirtyIndx];
         ClipDirtyRect(dirtyRect, VisibleAreaClippingRect());
         
         iGc->PushClip();
@@ -886,34 +894,7 @@
             iBackgroundColor = oldBgColor;
             }
                 
-        // Clear background for the dirty area
-        if (iBackgroundItems.Count() != 0)
-            {
-            ClearWithBackgroundItems(dirtyRect);    
-            }
-        else
-            {
-            switch (iClearBackground)
-                {
-                case EClearWithColor:
-                    {
-                    ClearWithColor(dirtyRect);                            
-                    break;    
-                    }
-                case EClearWithSkinBackground:
-                    {
-                    ClearWithSkinBackground(dirtyRect);                                                    
-                    break;    
-                    }
-                case EClearNone:
-                default:
-                    {
-                    // Don't do anything
-                    break;    
-                    }                                                
-                }                                    
-            }                                        
-        
+         
         if ( iForegroundBitmapGc && iForegroundTextureTransparency )
             {
             // There is ALF content in the background, we have to
@@ -965,7 +946,7 @@
         iGc->PopClip();
         }
 
-    dirty.Reset();
+    iTempDirtyRegions.Reset();
 
     // There must be no disparity in the number of pushed clipping rectangles.
     // (equivalent to __ASSERT_ALWAYS)
@@ -1787,3 +1768,39 @@
         
     User::LeaveIfError( err );
     }
+
+void CHuiDisplay::DoBackgroundClear()
+    {
+    if(iForegroundTextureTransparency) // alf application is visible -> clear background as requested 
+        {
+        // Clear background for the dirty area
+        TRect dirtyRect = iTempDirtyRegions[iCurrentDirtyIndx];
+        if (iBackgroundItems.Count() != 0)
+            {
+            ClearWithBackgroundItems(dirtyRect);    
+            }
+        else
+            {
+            switch (iClearBackground)
+                {
+                case EClearWithColor:
+                    {
+                    ClearWithColor(dirtyRect);                            
+                    break;    
+                    }
+                case EClearWithSkinBackground:
+                    {
+                    ClearWithSkinBackground(dirtyRect);                                                    
+                    break;    
+                    }
+                case EClearNone:
+                default:
+                    {
+                    // Don't do anything
+                    break;    
+                    }                                                
+                }                                    
+            }
+        }
+    }
+