--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp Wed Mar 31 23:03:58 2010 +0300
@@ -80,6 +80,9 @@
RRegionBuf<5> iShapeRegion;
TPoint iShapeOrigin;
+
+ // Flag to indicate if this has received commands while inactive
+ TBool iCommandsReceivedWhileNoCache;
};
EXPORT_C CHuiCanvasVisual* CHuiCanvasVisual::AddNewL(CHuiControl& aOwnerControl,
@@ -125,6 +128,8 @@
iCanvasVisualData->iShapeOrigin = TPoint();
+ iCanvasVisualData->iCommandsReceivedWhileNoCache = EFalse;
+
// subwindow effects
//EnableBrushesL(ETrue);
}
@@ -274,6 +279,15 @@
void CHuiCanvasVisual::HandleBuffer(TRect& aDisplayRect, TInt aAction, CHuiGc* aGc) const
{
+ TBool touchCountWasEnabled = EFalse;
+ if (iCanvasVisualData->iCommandsReceivedWhileNoCache)
+ {
+ // Commands were received while this visual didn't keep cache.
+ // So it's possible that some images are still in texture cache but haven't been updated.
+ touchCountWasEnabled = Env().CanvasTextureCache().IsTouchCountCheckEnabled();
+ Env().CanvasTextureCache().EnableTouchCountCheck();
+ }
+
if (iCanvasVisualData->iCommandSetType == ECommandBufferWs || iCanvasVisualData->iCommandSetType == ECommandBufferAlf)
{
TRAPD(err, iCanvasVisualData->iCanvasPainter->HandleBufferL(aDisplayRect, aAction, *this, aGc, DisplayRect().iTl.Round()));
@@ -287,6 +301,14 @@
// do nothing
}
+ if (iCanvasVisualData->iCommandsReceivedWhileNoCache)
+ {
+ Env().CanvasTextureCache().EnableTouchCountCheck( touchCountWasEnabled );
+ if ( !KeepNoCache() && aAction == EDrawBuffer )
+ {
+ iCanvasVisualData->iCommandsReceivedWhileNoCache = EFalse;
+ }
+ }
}
@@ -320,27 +342,37 @@
TBool CHuiCanvasVisual::CanSkipDrawing() const
{
- TBool semiTranparentEffectActive = (Effect() && Effect()->IsSemitransparent());
- TBool childWindowEffectActive = (Effect() && EffectIsAppliedToChildren());
- TBool invisible = (iOpacity.Now() <= EPSILON && !semiTranparentEffectActive);
- TBool effectAppliedToSurfacePixels = (Effect() && (Effect()->EffectFlags() & KHuiFxEnableBackgroundInAllLayers));
-
- if( invisible ||
- (!HasCommandBuffers(ETrue /*include children*/) &&
- !childWindowEffectActive &&
- !IsBackgroundDrawingEnabled() &&
- !IsExternalContentDrawingEnabled()&&
- !IsExternalContentDrawingEnabled(ETrue /*include children*/) &&
- !effectAppliedToSurfacePixels
-
- ))
+ if (Effect())
{
- return ETrue;
+ TBool semiTranparentEffectActive = Effect()->IsSemitransparent();
+ if ((iOpacity.Now() <= EPSILON && !semiTranparentEffectActive))
+ {
+ return ETrue;
+ }
+ TBool childWindowEffectActive = EffectIsAppliedToChildren();
+ TBool effectAppliedToSurfacePixels = (Effect()->EffectFlags() & KHuiFxEnableBackgroundInAllLayers);
+ if( !childWindowEffectActive &&
+ !effectAppliedToSurfacePixels &&
+ !HasCommandBuffers(ETrue /*include children*/) &&
+ !IsBackgroundDrawingEnabled() &&
+ !IsExternalContentDrawingEnabled()&&
+ !IsExternalContentDrawingEnabled(ETrue /*include children*/))
+ {
+ return ETrue;
+ }
}
else
{
- return EFalse;
+ if (iOpacity.Now() <= EPSILON ||
+ (!HasCommandBuffers(ETrue /*include children*/) &&
+ !IsBackgroundDrawingEnabled() &&
+ !IsExternalContentDrawingEnabled() &&
+ !IsExternalContentDrawingEnabled(ETrue /*include children*/)) )
+ {
+ return ETrue;
+ }
}
+ return EFalse;
}
void CHuiCanvasVisual::Draw(CHuiGc& aGc) const
@@ -762,13 +794,9 @@
TRAP_IGNORE(iCanvasVisualData->iCanvasPainter->SetCommandSetL(aCommands));
// Memory optimization. Do not prepare cache if visual is inactive.
- TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
- TBool inactive = EFalse;
- inactive |= Flags() & EHuiVisualFlagInactive;
- inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
-
- if (rosterFrozen || inactive)
+ if (KeepNoCache())
{
+ iCanvasVisualData->iCommandsReceivedWhileNoCache = ETrue;
ClearCache();
}
else
@@ -836,13 +864,9 @@
TRAP_IGNORE(iCanvasVisualData->iCanvasPainter->AddCommandSetL(aMoreCommands));
// Memory optimization. Do not prepare cache if visual is inactive.
- TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
- TBool inactive = EFalse;
- inactive |= Flags() & EHuiVisualFlagInactive;
- inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
-
- if (rosterFrozen || inactive)
+ if (KeepNoCache())
{
+ iCanvasVisualData->iCommandsReceivedWhileNoCache = ETrue;
ClearCache();
}
else
@@ -988,7 +1012,11 @@
background.iPaintedRect = DisplayRect();
background.iPaintType = /*(iCanvasVisualData->iBackground->BackgroundColor().Alpha() == 255) ?*/ EHuiCanvasPaintTypeOpaque;// : EHuiCanvasPaintTypeTransparent;
return background;
- }
+ }
+ else
+ {
+ aIndex--;
+ }
}
}
@@ -1529,4 +1557,17 @@
return iCanvasVisualData->iCanvasPainter->CommandBufferCoverage(aOrientation);
}
+EXPORT_C TBool CHuiCanvasVisual::HasTransParentClear() const
+ {
+ return iCanvasVisualData->iCanvasPainter->HasCommandBuffers(EHuiCanvasBufferContainsTransparentClear);
+ }
+TBool CHuiCanvasVisual::KeepNoCache() const
+ {
+ TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
+ TBool inactive = EFalse;
+ inactive |= Flags() & EHuiVisualFlagInactive;
+ inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
+
+ return rosterFrozen || inactive;
+ }