diff -r c9d868f1e20c -r 1801340c26a2 uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp --- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp Thu Jul 15 19:40:07 2010 +0300 +++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp Thu Aug 19 10:48:02 2010 +0300 @@ -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); @@ -449,6 +449,7 @@ // Flag to know what we did TBool didDrawEffect = EFalse; + TBool drawChildren = ETrue; // only if didDrawEffect holds if (EffectActive()) { @@ -474,21 +475,38 @@ refreshCache |= Display()->RosterImpl().NativeAppsContentChanged(); } 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()) + if(!CanSkipDrawing()) { - return; + // 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 ); } - // 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 - 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; + } } } @@ -507,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);