Clip lines totally outside the clip region
Modified: trunk/reactos/subsys/win32k/eng/lineto.c

Modified: trunk/reactos/subsys/win32k/eng/lineto.c
--- trunk/reactos/subsys/win32k/eng/lineto.c	2005-06-12 16:20:10 UTC (rev 15877)
+++ trunk/reactos/subsys/win32k/eng/lineto.c	2005-06-12 19:06:38 UTC (rev 15878)
@@ -486,7 +486,7 @@
 
 BOOL STDCALL
 IntEngLineTo(BITMAPOBJ *DestObj,
-	     CLIPOBJ *Clip,
+	     CLIPOBJ *ClipObj,
 	     BRUSHOBJ *Brush,
 	     LONG x1,
 	     LONG y1,
@@ -517,6 +517,26 @@
   /* No success yet */
   ret = FALSE;
 
+  /* Clip lines totally outside the clip region. This is not done as an
+   * optimization (there are very few lines drawn outside the region) but
+   * as a workaround for what seems to be a problem in the CL54XX driver */
+  if (NULL == ClipObj || DC_TRIVIAL == ClipObj->iDComplexity)
+    {
+      b.left = 0;
+      b.right = DestSurf->sizlBitmap.cx;
+      b.top = 0;
+      b.bottom = DestSurf->sizlBitmap.cy;
+    }
+  else
+    {
+      b = ClipObj->rclBounds;
+    }
+  if ((x1 < b.left && x2 < b.left) || (b.right <= x1 && b.right <= x2) ||
+      (y1 < b.top && y2 < b.top) || (b.bottom <= y1 && b.bottom <= y2))
+    {
+      return TRUE;
+    }
+
   b.left = min(x1, x2);
   b.right = max(x1, x2);
   b.top = min(y1, y2);
@@ -529,7 +549,7 @@
     {
     /* Call the driver's DrvLineTo */
     ret = GDIDEVFUNCS(DestSurf).LineTo(
-      DestSurf, Clip, Brush, x1, y1, x2, y2, /*RectBounds*/&b, Mix);
+      DestSurf, ClipObj, Brush, x1, y1, x2, y2, &b, Mix);
     }
 
 #if 0
@@ -541,7 +561,7 @@
 
   if (! ret)
     {
-      ret = EngLineTo(DestSurf, Clip, Brush, x1, y1, x2, y2, RectBounds, Mix);
+      ret = EngLineTo(DestSurf, ClipObj, Brush, x1, y1, x2, y2, RectBounds, Mix);
     }
 
   MouseSafetyOnDrawEnd(DestSurf);