uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp
branchRCL_3
changeset 20 31fccae4f8a7
parent 19 e5af45d51884
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Tue Aug 31 16:07:35 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Wed Sep 01 12:16:53 2010 +0100
@@ -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);
@@ -350,8 +350,7 @@
     if (Effect())
         {
         TBool hasStoredContent = (IsDelayedEffectSource() || Freezed()) && (StoredRenderBuffer() ||  iCanvasVisualData->iStoredRenderBuffer);
-    
-        TBool semiTranparentEffectActive = Effect()->IsSemitransparent();
+        TBool semiTranparentEffectActive = iEffectOpacity < 1.f;
         if ((iOpacity.Now() <= EPSILON && !semiTranparentEffectActive))
             {
             return ETrue;
@@ -396,7 +395,7 @@
     	}
     
     // Optimization
-    if (CanSkipDrawing())
+    if (!EffectActive() && CanSkipDrawing())
         {
         return;
         }
@@ -450,14 +449,10 @@
 
     // Flag to know what we did
     TBool didDrawEffect = EFalse;
+    TBool drawChildren = ETrue; // only if didDrawEffect holds
     
     if (EffectActive())
         {
-        // 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
-                
         TBool refreshCache = EFalse;        
         TBool layer =  EFalse;
         if (EffectIsAppliedToChildren())
@@ -479,8 +474,40 @@
             {
             refreshCache |= Display()->RosterImpl().NativeAppsContentChanged();
             }
-        didDrawEffect = Effect()->CachedDraw(aGc, area, refreshCache, !transparent, iCanvasVisualData->iPaintedRegion,layer );
+        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())
+                {
+                // 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 );
+                }
+            else
+                {
+                didDrawEffect = ETrue;
+                drawChildren = EFalse;
+                }
+            }
         }
     
     if ( !didDrawEffect )
@@ -498,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);        
@@ -1338,7 +1365,11 @@
     CHuiCanvasGc& gc = CanvasGc();
     CHuiCanvasVisual* visual = NULL; 
     TBool transparent = EffectiveOpacity() < 1.0f;
-    gc.SetDrawMode((THuiCanvasDrawMode)aCanvasDrawMode);
+	if(EffectActive())
+		{
+	    transparent |= iEffectOpacity < 1.0f;
+    	}
+	gc.SetDrawMode((THuiCanvasDrawMode)aCanvasDrawMode);
     if (transparent)
         {
         gc.EnableEffectiveOpacity(ETrue);  
@@ -1384,6 +1415,10 @@
     THuiRealPoint dest_point = DisplayRect().iTl;
     CHuiCanvasRenderBuffer *stored = StoredRenderBuffer();
     TBool transparent = EffectiveOpacity() < 1.0f;
+	if(EffectActive())
+		{
+	    transparent |= iEffectOpacity < 1.0f;
+    	}
     CHuiCanvasVisual* visual = NULL; 
 	gc.SetDrawMode((THuiCanvasDrawMode)aCanvasDrawMode);
     if (transparent)
@@ -1599,3 +1634,34 @@
     
     return rosterFrozen || inactive;
     }
+
+TBool CHuiCanvasVisual::EffectReadyToDrawNextFrame() const 
+    {
+    // if the visual is drawn ans a external content it is probably already inactive
+    if (Flags() & EHuiVisualFlagDrawOnlyAsExternalContent)
+        {
+        if (Display() && Display()->RosterImpl().IsDrawingExternalContent())
+            {
+            return ETrue;
+            }
+        }
+
+    // other checks to
+    TBool rdyToDraw = EFalse;
+    if(Display()->RosterImpl().AlfEventWindow() == this)
+        {
+        rdyToDraw |= ETrue;
+        }
+    
+    rdyToDraw |= (IsDelayedEffectSource() || Freezed()) &&
+                    (StoredRenderBuffer() ||  iCanvasVisualData->iStoredRenderBuffer);
+    rdyToDraw |= (Effect()->EffectFlags() & KHuiFxEnableBackgroundInAllLayers);
+    rdyToDraw |= EffectIsAppliedToChildren();
+    rdyToDraw |= IsExternalContentDrawingEnabled() || IsExternalContentDrawingEnabled(ETrue);
+    rdyToDraw |= IsBackgroundDrawingEnabled();
+
+    rdyToDraw |= HasCommandBuffers(ETrue);
+
+    // visual must be active (seen) and have content
+    return (!(Flags() & EHuiVisualFlagInactive) && rdyToDraw);
+    }