--- a/uiacceltk/hitchcock/coretoolkit/src/huicanvaswspainter.cpp Mon Feb 22 17:57:49 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/huicanvaswspainter.cpp Fri Mar 12 15:47:04 2010 +0200
@@ -62,10 +62,6 @@
const TInt KHuiCanvasDisableRenderBufferHandleInterval = 100; // Milliseconds
const TInt KHuiCanvasEnableRenderBufferHandleInterval = 500; // Milliseconds
-/** Internal constant to identify complex command buffers */
-const TInt KPossiblePerformanceProblemInWindow = 64;
-
-
/** ETrue - use SelectGcL to select gc implementation,
EFalse - use KHuiDefaultCanvasWsGc. */
const TBool KHuiUseSelectGc = ETrue;
@@ -302,23 +298,13 @@
/* If window shape region has been changed, we should clear the window to get rid of old content.
* We also set all command buffers to "not drawn" state so that everything will be redrawn.
+ * Actual clearing is done after BeginActionL, because drawing phase will start only after calling it.
*/
- TBool isFullUpdateRegionCleared = EFalse;
if(iShapeRegionClearingPending)
{
- #ifdef HUI_DEBUG_PRINT_PERFORMANCE_INTERVAL
- RDebug::Print(_L(">> CHuiCanvasWsPainter::HandleBufferL - Clearing fullupdateregion"));
- #endif
- // Clear the window update region area
- TBool doClear = ETrue;
- iCanvasWsGc->EnableUpdateRegion(iFullUpdateRegion, doClear);
- iCanvasWsGc->DisableUpdateRegion();
- isFullUpdateRegionCleared = ETrue;
-
// Cause a full redraw for the canvas visual
SetAllBuffersChanged(ETrue);
ClearAllBufferStatusFlags(EHuiCanvasBufferStatusDrawn);
- iShapeRegionClearingPending = EFalse;
}
@@ -328,6 +314,20 @@
/* Begin draw. If render buffer is used this sets up the render buffer if needed */
iCanvasWsGc->BeginActionL(aAction,aDisplayRect,aUser,cachePrepared,iFullUpdateRegion);
+ TBool isFullUpdateRegionCleared = EFalse;
+ if(iShapeRegionClearingPending)
+ {
+ #ifdef HUI_DEBUG_PRINT_PERFORMANCE_INTERVAL
+ RDebug::Print(_L(">> CHuiCanvasWsPainter::HandleBufferL - Clearing fullupdateregion"));
+ #endif
+ // Clear the window update region area
+ TBool doClear = ETrue;
+ iCanvasWsGc->EnableUpdateRegion(iFullUpdateRegion, doClear);
+ iCanvasWsGc->DisableUpdateRegion();
+ isFullUpdateRegionCleared = ETrue;
+ iShapeRegionClearingPending = EFalse;
+ }
+
#ifdef HUI_DEBUG_PRINT_PERFORMANCE_INTERVAL
if (iCanvasWsGc->IsRenderBufferEnabled())
{
@@ -2245,7 +2245,13 @@
TInt originalBufferCount = iCommandBuffers.Count();
RemoveBuffersWithoutRealDrawing();
- RemoveBuffersWithOldDisplayRect();
+
+ // Remove buffers only with moved display rect and modify the clip region
+ // of buffers with changed size instead of completely removing all.
+ RemoveBuffersWithMovedDisplayRect();
+ ModifyBuffersWithChangedDisplayRect();
+ //RemoveBuffersWithOldDisplayRect();
+
RemoveBuffersWithEmptyUpdateRegion();
RemoveBuffersWithOverlappingUpdateRegion();
@@ -2253,6 +2259,44 @@
return didRemoveBuffers;
}
+void CHuiCanvasWsPainter::RemoveBuffersWithMovedDisplayRect()
+ {
+ TInt bufferCount = iCommandBuffers.Count();
+
+ TRect canvas = iCanvasVisual->DisplayRect().Round();
+ for (TInt cb = bufferCount - 1; cb >= 0; cb--)
+ {
+ CHuiCanvasCommandBuffer* buffer = iCommandBuffers[cb];
+ TRect bufRect = buffer->iOriginalDisplayRect.Round();
+
+ // If the visual has moved, delete the old buffer
+ if (bufRect.iTl != canvas.iTl)
+ {
+ DestroyBuffer(cb);
+ }
+ }
+ }
+
+void CHuiCanvasWsPainter::ModifyBuffersWithChangedDisplayRect()
+ {
+ TInt bufferCount = iCommandBuffers.Count();
+ TRect canvasRect = iCanvasVisual->DisplayRect().Round();
+ TRegionFix<1> region(canvasRect);
+
+ // If the buffers have different update region than CanvasVisual, clip
+ // the drawing to canvas visual's & cmdbuffer's updateregions' intersection.
+ for (TInt cb = 0; cb < bufferCount; cb++)
+ {
+ CHuiCanvasCommandBuffer* cmdbuffer = iCommandBuffers[cb];
+ if (cmdbuffer->iOriginalDisplayRect.Round() != canvasRect)
+ {
+ cmdbuffer->iUpdateRegion.Copy(cmdbuffer->iOriginalUpdateRegion);
+ cmdbuffer->iUpdateRegion.Intersect(region);
+ cmdbuffer->iUpdateRegion.Tidy();
+ }
+ }
+ }
+
void CHuiCanvasWsPainter::RemoveBuffersWithoutRealDrawing()
{
TInt bufferCount = iCommandBuffers.Count();