--- 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);