diff -r e5af45d51884 -r 31fccae4f8a7 uiacceltk/hitchcock/coretoolkit/src/HuiVisual.cpp --- 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)