diff -r 10534483575f -r 88b23e2e82e1 uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp --- 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; + }