uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp
changeset 29 ac3859d43844
parent 19 f5bac0badc7e
child 31 1b6909418757
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Fri May 14 02:53:35 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Tue May 25 17:55:19 2010 +0300
@@ -342,8 +342,15 @@
     
 TBool CHuiCanvasVisual::CanSkipDrawing() const
     {
+    if(Display()->RosterImpl().AlfEventWindow() == this)
+         {
+         return EFalse;
+         }
+    
     if (Effect())
         {
+        TBool hasStoredContent = (IsDelayedEffectSource() || Freezed()) && (StoredRenderBuffer() ||  iCanvasVisualData->iStoredRenderBuffer);
+    
         TBool semiTranparentEffectActive = Effect()->IsSemitransparent();
         if ((iOpacity.Now() <= EPSILON && !semiTranparentEffectActive))
             {
@@ -356,7 +363,8 @@
             !HasCommandBuffers(ETrue /*include children*/) && 
             !IsBackgroundDrawingEnabled() &&
             !IsExternalContentDrawingEnabled()&&
-            !IsExternalContentDrawingEnabled(ETrue /*include children*/))
+            !IsExternalContentDrawingEnabled(ETrue /*include children*/) &&
+            !hasStoredContent )
             {
             return ETrue;
             }
@@ -451,22 +459,27 @@
         transparent |= iOpacity.Now() < 1.0f; // Opacity less than 1.0f -> always transparent
                 
         TBool refreshCache = EFalse;        
+        TBool layer =  EFalse;
         if (EffectIsAppliedToChildren())
             {
             refreshCache |= ChildTreeChanged(EHuiCanvasFlagExcludeFromParentEffect);
 
             iCanvasVisualData->iPaintedRegion.Clear();
-            CollectRecursivePaintedRegion(iCanvasVisualData->iPaintedRegion, EHuiCanvasFlagExcludeFromParentEffect);
+            layer = CollectRecursivePaintedRegion(iCanvasVisualData->iPaintedRegion, EHuiCanvasFlagExcludeFromParentEffect);
             }
         else
             {
             refreshCache |= Changed();            
 
             iCanvasVisualData->iPaintedRegion.Clear();
-            CollectPaintedRegion(iCanvasVisualData->iPaintedRegion, 0);
+            layer = CollectPaintedRegion(iCanvasVisualData->iPaintedRegion, 0);
             }
-        
-        didDrawEffect = Effect()->CachedDraw(aGc, area, refreshCache, !transparent, iCanvasVisualData->iPaintedRegion);
+
+        if(Display()->RosterImpl().AlfEventWindow() == this)
+            {
+            refreshCache |= Display()->RosterImpl().NativeAppsContentChanged();
+            }
+        didDrawEffect = Effect()->CachedDraw(aGc, area, refreshCache, !transparent, iCanvasVisualData->iPaintedRegion,layer );
         
         }
     
@@ -536,10 +549,10 @@
         RDebug::Print(_L("CHuiCanvasVisual::DrawSelf - tracked visual"));
         }
 #endif		
-      
+    TBool alfEventWindow = (Display()->RosterImpl().AlfEventWindow() == this);
     TReal32 effectiveOpacity = EffectiveOpacity();
-        
-    if (effectiveOpacity <= 0 || !HasCommandBuffers(ETrue))
+    TBool hasStoredContent = (IsContentDrawingEnabled() && (IsDelayedEffectSource() || Freezed())) && (StoredRenderBuffer() || iCanvasVisualData->iStoredRenderBuffer);        
+    if ((effectiveOpacity <= 0 || !HasCommandBuffers(ETrue)) && !alfEventWindow && !hasStoredContent)
         {
         // In case background drawing is enabled, and even if we don't have command buffers we still
         // want to issue clear. If the background drawing is enabled here, it means that the
@@ -555,7 +568,7 @@
             }
         }
 
-    if (IsContentDrawingEnabled() && (IsDelayedEffectSource() || Freezed()))
+    if (hasStoredContent)
         {
         // Select right draw mode
         THuiCanvasDrawMode drawMode = (Flags() & EHuiVisualFlagOpaqueHint) ? EHuiCanvasDrawModeNormal : EHuiCanvasDrawModeBlend;
@@ -572,6 +585,12 @@
             }
         }    
 
+    if(alfEventWindow)
+         {
+         Display()->RosterImpl().DrawNativeAppsContent(aGc, Display());
+         return;
+         }
+    
     // Use 'under opaque' hint to optimize drawing.
     // See comment from CHuiCanvasVisual::Draw for further details. 
     const TBool drawVisualContent = !( Flags() & EHuiVisualFlagUnderOpaqueHint );
@@ -997,6 +1016,7 @@
                     }                    
 
                 background.iPaintedRect = backgroundItems[aIndex].Rect();
+                backgroundItems.Close();
                 return background;
                 }
             else
@@ -1509,7 +1529,7 @@
 		}
     }
 
-void CHuiCanvasVisual::CollectPaintedRegion(TRegion& aPaintRegion, TInt aExcludeCanvasFlags) const
+TBool CHuiCanvasVisual::CollectPaintedRegion(TRegion& aPaintRegion, TInt aExcludeCanvasFlags) const
     {
     // Only our own painted areas.
     TInt paintedAreaCount = PaintedAreaCount();  
@@ -1518,12 +1538,13 @@
         aPaintRegion.AddRect( CanvasPaintedArea(i).iPaintedRect.Round() );
         }
     aPaintRegion.Tidy();
+    return !iCanvasVisualData->iLayerExtent.IsEmpty();
     }
 
-void CHuiCanvasVisual::CollectRecursivePaintedRegion(TRegion& aRecursivePaintRegion, TInt aExcludeCanvasFlags) const
+TBool CHuiCanvasVisual::CollectRecursivePaintedRegion(TRegion& aRecursivePaintRegion, TInt aExcludeCanvasFlags) const
     {
     // First our own painted areas...
-    CollectPaintedRegion(aRecursivePaintRegion, aExcludeCanvasFlags);
+    TBool layer = CollectPaintedRegion(aRecursivePaintRegion, aExcludeCanvasFlags);
             
     // ...then children (and their children).
     const TInt count = Count();
@@ -1543,13 +1564,14 @@
                     if (visual->Flags() & EHuiVisualFlagWserv)
                         {
                         CHuiCanvasVisual* canvasVisual = (CHuiCanvasVisual*)visual;
-                        canvasVisual->CollectRecursivePaintedRegion(aRecursivePaintRegion, aExcludeCanvasFlags);
+                        layer |= canvasVisual->CollectRecursivePaintedRegion(aRecursivePaintRegion, aExcludeCanvasFlags);
                         }
                     }
                 }        
             }
         }    
     aRecursivePaintRegion.Tidy();
+    return layer;
     }
 
 EXPORT_C TRect CHuiCanvasVisual::CommandBufferCoverage(TInt aOrientation)