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