uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp
branchRCL_3
changeset 18 1801340c26a2
parent 17 c9d868f1e20c
child 19 e5af45d51884
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Thu Jul 15 19:40:07 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Thu Aug 19 10:48:02 2010 +0300
@@ -290,7 +290,7 @@
         
     if (iCanvasVisualData->iCommandSetType == ECommandBufferWs || iCanvasVisualData->iCommandSetType == ECommandBufferAlf)
         {
-        TRAPD(err, iCanvasVisualData->iCanvasPainter->HandleBufferL(aDisplayRect, aAction, *this, aGc, DisplayRect().iTl.Round()));  
+        TRAPD(err, iCanvasVisualData->iCanvasPainter->HandleBufferL(aDisplayRect, aAction, *this, aGc, DisplayRect().iTl.Round()));
         if (err)
         	{
         	HUI_DEBUG2(_L("CHuiCanvasVisual::HandleBufferL returned:%d command type was: %d"), err,iCanvasVisualData->iCommandSetType);
@@ -449,6 +449,7 @@
 
     // Flag to know what we did
     TBool didDrawEffect = EFalse;
+    TBool drawChildren = ETrue; // only if didDrawEffect holds
     
     if (EffectActive())
         {
@@ -474,21 +475,38 @@
             refreshCache |= Display()->RosterImpl().NativeAppsContentChanged();
             }
         Effectable()->EffectSetOpacityAdditive(0.0f, ETrue);
+        
         // PrepareDraw will update iEffectOpacity to correct opacity for this effect frame        
         if(Effect()->PrepareDrawL(aGc, area))
             {
 			// let's still check if effect is making visual fully transparent
-            if(CanSkipDrawing())
+            if(!CanSkipDrawing())
                 {
-                return;
+                // Note that EHuiVisualFlagOpaqueHint improves performance a lot in cached effect drawing 
+                TBool transparent = EFalse; 
+                
+                // This is special case, only child below group visual.
+                // Workaround - can be removed once opaque & transparent visual hierarchies are handled better.
+                if ( !Layout() && Count() == 1 ) 
+                    {
+                    const CHuiVisual* visual = &Visual(0);
+
+                    transparent |= (!(visual->Flags() & EHuiVisualFlagOpaqueHint)); // Does not have opaque hint -> always transparent
+                    transparent |= visual->iOpacity.Now() < 1.0f; // Opacity less than 1.0f -> always transparent
+                    transparent |= visual->Effect() && !visual->LoadingEffect() && (visual->iEffectOpacity < 1.0f); // effect opacity is less than 1.0f
+                    }
+
+                transparent |= (!(Flags() & EHuiVisualFlagOpaqueHint)); // Does not have opaque hint -> always transparent
+                transparent |= iOpacity.Now() < 1.0f; // Opacity less than 1.0f -> always transparent
+                transparent |= iEffectOpacity < 1.0f; // effect opacity is less than 1.0f
+                
+                didDrawEffect = Effect()->CachedDraw(aGc, area, refreshCache, !transparent, iCanvasVisualData->iPaintedRegion, layer );
                 }
-            // Note that EHuiVisualFlagOpaqueHint improves performance a lot in cached effect drawing 
-            TBool transparent = EFalse; 
-            transparent |= (!(Flags() & EHuiVisualFlagOpaqueHint)); // Does not have opaque hint -> always transparent
-            transparent |= iOpacity.Now() < 1.0f; // Opacity less than 1.0f -> always transparent
-            transparent |= iEffectOpacity < 1.0f; // effect opacity is less than 1.0f
-
-            didDrawEffect = Effect()->CachedDraw(aGc, area, refreshCache, !transparent, iCanvasVisualData->iPaintedRegion, layer );
+            else
+                {
+                didDrawEffect = ETrue;
+                drawChildren = EFalse;
+                }
             }
         }
     
@@ -507,12 +525,12 @@
         // Draw all children
         DrawCanvasChildren(aGc, 0, 0);
         }
-    else if (didDrawEffect && !EffectIsAppliedToChildren())
+    else if (didDrawEffect && drawChildren && !EffectIsAppliedToChildren())
         {
         // Draw all children
         DrawCanvasChildren(aGc, 0, 0);    
         }
-    else if (didDrawEffect && EffectIsAppliedToChildren())
+    else if (didDrawEffect && drawChildren && EffectIsAppliedToChildren())
         {
         // Draw only children which do not want to have parent effect applied to them
         DrawCanvasChildren(aGc, EHuiCanvasFlagExcludeFromParentEffect, 0);