uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp
changeset 14 83d2d132aa58
parent 13 8f67d927ea57
child 19 f5bac0badc7e
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Fri Mar 19 09:43:21 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Fri Apr 16 15:56:24 2010 +0300
@@ -77,6 +77,9 @@
     // For handling possible background surface that window may have
     TBool iLayerUsesAlphaFlag;
     TRect iLayerExtent;
+
+    RRegionBuf<5> iShapeRegion;
+    TPoint iShapeOrigin;
     };
 
 EXPORT_C CHuiCanvasVisual* CHuiCanvasVisual::AddNewL(CHuiControl& aOwnerControl,
@@ -120,6 +123,8 @@
     iCanvasVisualData->iLayerUsesAlphaFlag = EFalse;
     iCanvasVisualData->iLayerExtent = TRect();
     
+    iCanvasVisualData->iShapeOrigin = TPoint();
+    
     // subwindow effects
     //EnableBrushesL(ETrue);
     }
@@ -166,6 +171,7 @@
         iCanvasVisualData->iPaintedRegion.Close();
         iCanvasVisualData->iClipRegion.Close();
         iCanvasVisualData->iChildCanvasList.Close();
+        iCanvasVisualData->iShapeRegion.Close();
         }
     
     delete iCanvasVisualData;
@@ -314,27 +320,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
@@ -548,7 +564,14 @@
     
     // Draws background if it has been defined
     if (drawVisualContent && IsBackgroundDrawingEnabled())
-        { 
+        {
+        if (iCanvasVisualData->iCanvasPainter && 
+            !iCanvasVisualData->iLayerExtent.IsEmpty())
+            {
+            // In SW rendering case, we support only clearing with transparent.
+            iCanvasVisualData->iCanvasPainter->ClearCapturingBufferArea(aDisplayRect);
+            }
+            
         iCanvasVisualData->iBackground->DrawSelf(aGc, aDisplayRect); 
         }
 
@@ -1209,6 +1232,32 @@
     }
 
 
+EXPORT_C void CHuiCanvasVisual::SetShape(const TPoint& aOrigin, const TRegion& aRegion)
+    {
+    iCanvasVisualData->iShapeOrigin = aOrigin;
+    iCanvasVisualData->iShapeRegion.Copy(aRegion);
+    if ( iCanvasVisualData->iShapeRegion.CheckError() )
+        {
+        // fallback to full
+        iCanvasVisualData->iShapeRegion.Clear();
+        }
+    }
+    
+EXPORT_C TBool CHuiCanvasVisual::HasCustomShape() const
+    {
+    return iCanvasVisualData->iShapeRegion.Count();
+    }
+    
+EXPORT_C TPoint CHuiCanvasVisual::ShapeOrigin() const
+    {
+    return iCanvasVisualData->iShapeOrigin;
+    }
+    
+EXPORT_C const TRegion& CHuiCanvasVisual::ShapeRegion() const
+    {
+    return iCanvasVisualData->iShapeRegion;
+    }
+
 TBool CHuiCanvasVisual::IsCanvasClippingEnabled() const
     {
     return iCanvasVisualData->iCanvasFlags & EHuiCanvasFlagEnableCanvasClipping; 
@@ -1484,3 +1533,13 @@
         }    
     aRecursivePaintRegion.Tidy();
     }
+
+EXPORT_C TRect CHuiCanvasVisual::CommandBufferCoverage(TInt aOrientation)
+    {
+    return iCanvasVisualData->iCanvasPainter->CommandBufferCoverage(aOrientation); 
+    }
+
+EXPORT_C TBool CHuiCanvasVisual::HasTransParentClear() const
+    {
+    return iCanvasVisualData->iCanvasPainter->HasCommandBuffers(EHuiCanvasBufferContainsTransparentClear);
+    }