uiacceltk/hitchcock/coretoolkit/src/HuiVisual.cpp
branchRCL_3
changeset 20 31fccae4f8a7
parent 19 e5af45d51884
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiVisual.cpp	Tue Aug 31 16:07:35 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiVisual.cpp	Wed Sep 01 12:16:53 2010 +0100
@@ -45,10 +45,12 @@
     {
 public: // Functions
     // Constructor: initialize the data
-    THuiVisualPrivateData() : iTacticons(), iDropShadow(NULL)
+    THuiVisualPrivateData() 
+        : iTacticons(), iDropShadow(NULL), iEffect(NULL),
+          iEffectParser(NULL), iEffectable(NULL), iStoredRenderBuffer(NULL),
+          iStoredRenderBufferModificationsEnabled(ETrue),
+          iFreezed(EFalse)
         {
-        iEffect = NULL;
-        iEffectParser = NULL;
         }
         
     // Destructor: destruct the data
@@ -82,14 +84,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 +111,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 +196,11 @@
     return iVisualData->iFreezed;
 }
 
+EXPORT_C TBool CHuiVisual::EffectReadyToDrawNextFrame() const
+    {
+    return  ETrue;
+    }
+
 EXPORT_C CHuiVisual* CHuiVisual::AddNewL(CHuiControl& aOwnerControl,
                                          CHuiLayout* aParentLayout)
     {
@@ -195,6 +212,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)),
@@ -212,7 +230,6 @@
     {
     iVisualData = new (ELeave) THuiVisualPrivateData;
     iVisualData->iEffectable = new CHuiEffectable(this);
-    iVisualData->iStoredRenderBuffer = NULL;
     }
 
 
@@ -261,12 +278,15 @@
     delete iBrushes;
     delete iTag;
     delete iTransform;
-    delete iVisualData->iEffectable;
-    if (iVisualData->iStoredRenderBuffer)
+    if (iVisualData)
         {
-        iVisualData->iStoredRenderBuffer->UnInitialize();
+        delete iVisualData->iEffectable;
+        if (iVisualData->iStoredRenderBuffer)
+            {
+            iVisualData->iStoredRenderBuffer->UnInitialize();
+            }
+        delete iVisualData->iStoredRenderBuffer;
         }
-    delete iVisualData->iStoredRenderBuffer;
     delete iVisualData;
     
     iOwner = NULL;
@@ -917,10 +937,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)