uiacceltk/hitchcock/coretoolkit/src/HuiVisual.cpp
branchRCL_3
changeset 17 c9d868f1e20c
parent 13 3a60ebea00d0
child 18 1801340c26a2
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiVisual.cpp	Mon Jun 21 16:41:52 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiVisual.cpp	Thu Jul 15 19:40:07 2010 +0300
@@ -82,14 +82,16 @@
 public: // from MHuiEffectable
     CHuiEffectable(CHuiVisual *aVisual) : iVisual(aVisual) { }
     void EffectSetEffect(CHuiFxEffect* aEffect);
-    TReal32 EffectOpacityTarget() const;
-    void EffectSetOpacity(TReal32 aOpacity);
+    TReal32 EffectOpacity() const;
+    void EffectSetOpacityAdditive(TReal32 aOpacity, TBool aReplace);
     void EffectDrawSelf( CHuiGc &aGc, const TRect & aDisplayRect) const;
     THuiRealRect EffectDisplayRect() const __SOFTFP;
     void SetLoadingEffect(TBool aLoading);    
     void EffectSetSource( TBool aIsInput1 );
     TBool EffectGetSource() const;
+    TBool EffectReadyToDrawNextFrame() const;
 
+    
 private:
     CHuiVisual *iVisual;
     TBool iIsInput1;
@@ -107,14 +109,22 @@
     return iIsInput1;
     }
 
-TReal32 CHuiEffectable::EffectOpacityTarget() const
+TBool CHuiEffectable::EffectReadyToDrawNextFrame() const
     {
-    return iVisual->iOpacity.Target();
+    return iVisual->EffectReadyToDrawNextFrame();
     }
 
-void CHuiEffectable::EffectSetOpacity(TReal32 aOpacity)
+TReal32 CHuiEffectable::EffectOpacity() const
     {
-    iVisual->iOpacity.Set( aOpacity );
+    return iVisual->iEffectOpacity;
+    }
+
+void CHuiEffectable::EffectSetOpacityAdditive(TReal32 aOpacity, TBool aReplace)
+    {
+    if( aReplace || aOpacity > iVisual->iEffectOpacity)
+        {
+        iVisual->iEffectOpacity = aOpacity;
+        }
     }
 
 void CHuiEffectable::EffectDrawSelf( CHuiGc &aGc, const TRect & aDisplayRect) const
@@ -184,6 +194,11 @@
     return iVisualData->iFreezed;
 }
 
+EXPORT_C TBool CHuiVisual::EffectReadyToDrawNextFrame() const
+    {
+    return  ETrue;
+    }
+
 EXPORT_C CHuiVisual* CHuiVisual::AddNewL(CHuiControl& aOwnerControl,
                                          CHuiLayout* aParentLayout)
     {
@@ -195,6 +210,7 @@
 
 EXPORT_C CHuiVisual::CHuiVisual(MHuiVisualOwner& aOwner)
         : iOpacity(1.f),
+          iEffectOpacity(1.f),
           iOwner(&aOwner), 
           // Set the maximum size to unlimited.
           iMaxSize(TSize(KMaxTInt, KMaxTInt)),
@@ -917,10 +933,30 @@
         
         if (canUseEffectDrawing)
             {
-            // Note that EHuiVisualFlagOpaqueHint improves performance a lot in cached effect drawing 
-            TBool transparent = !(Flags() & EHuiVisualFlagOpaqueHint);
-            TBool refreshCache = Changed();                
-            didDrawEffect = iVisualData->iEffect->CachedDraw(aGc, displayRect, refreshCache, !transparent);
+            Effectable()->EffectSetOpacityAdditive(0.0f, ETrue);
+            // PrepareDrawL will update iEffectOpacity for current frame
+            if(iVisualData->iEffect->PrepareDrawL(aGc, displayRect))
+                {
+                if(iEffectOpacity <= 0.f)
+                    {
+                    if(Clipping())
+                        {
+                        aGc.PopClip();
+                        }
+                    
+                    // Draw foreground brushes (over the content).
+                    DrawBrushes(aGc, EHuiBrushLayerForeground);
+
+                    // Undo local transformation.
+                    Transform(aGc, EFalse);
+                    EnterLocalProjection(aGc, EFalse);
+                    return;
+                    }
+                // Note that EHuiVisualFlagOpaqueHint improves performance a lot in cached effect drawing 
+                TBool transparent = !(Flags() & EHuiVisualFlagOpaqueHint);
+                TBool refreshCache = Changed();                
+                didDrawEffect = iVisualData->iEffect->CachedDraw(aGc, displayRect, refreshCache, !transparent);
+                }
             }
 
         if (!didDrawEffect)