uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp
changeset 13 8f67d927ea57
parent 0 15bf7259bb7c
child 19 f5bac0badc7e
--- a/uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp	Tue Feb 02 07:56:43 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp	Fri Mar 19 09:43:21 2010 +0200
@@ -1193,7 +1193,19 @@
                 // Could copy only needed rects to avoid excessive clipping
                 iDelayedClipRegion.Copy(iClippingRegion);
                 break;
-                }                                
+                }
+
+		    // both points lie outside - but the line may still intersect the region, 
+            // so represent the line as a rect and try an intersection test...
+            TRect lineBoundingRect(start, end);
+            lineBoundingRect.Normalize();
+            lineBoundingRect.iBr += TPoint(1, 1);
+            if (IsClipped(lineBoundingRect, iClippingRegion) != EFullyOutside)
+                {
+                iDelayedClipRegion.Copy(iClippingRegion);
+                vis1 = EPartialOverlap;
+                break;
+                }                    
             }                    
         }        
     if (vis1 == EFullyOutside && vis2 == EFullyOutside)
@@ -1211,6 +1223,13 @@
     
 EXPORT_C TBool CHuiCanvasGc::ClipNext()
     {
+    if (iDelayedClipVisibility == EFullyOutside)
+        {
+        // If drawing would fall completely outside the clipping region, we are done. 
+        return EFalse;
+        }
+
+    const TBool clipOneByOne = iDelayedClipRegion.Count() > MaxNumberOfClipRects();
     if (iDelayedClipVisibility != EFullyOutside && 
         iDelayedClipRegion.Count() && 
         iDelayedClipCount < iDelayedClipRegion.Count())        
@@ -1224,7 +1243,7 @@
       	iGc->PushClip();
         iDelayedClipRectPushed = ETrue;
         
-        if (MaxNumberOfClipRects() == 1)
+        if (clipOneByOne)
             {
             iGc->Clip(iDelayedClipRegion[iDelayedClipCount]);                            
             }
@@ -1234,18 +1253,21 @@
             }                            
         }    
 
-    iDelayedClipCount += MaxNumberOfClipRects();
-    
-    if (iDelayedClipVisibility == EFullyOutside)
+    TBool continueDrawing = EFalse;
+    if (clipOneByOne)
         {
-        // If drawing would fall completely outside the clipping region, we are done. 
-        return EFalse;
+        // Clip one by one.            
+        iDelayedClipCount++;
+        continueDrawing = iDelayedClipCount <= iDelayedClipRegion.Count();
         }
     else
         {
-        // Check how many times we must do the operation in case rederer does not support many clip rects at once 
-        return (iDelayedClipCount <= iDelayedClipRegion.Count() || iDelayedClipCount == MaxNumberOfClipRects());
+        // Drawing once is sufficient - all clipping can be done.
+        continueDrawing = !iDelayedClipCount;
+        iDelayedClipCount++;
         }
+
+    return continueDrawing;    
     }
 
 EXPORT_C void CHuiCanvasGc::DisableDelayedClippingIfNeeded()