[Intel-gfx] [PATCH 3/3] uxa: Simplify uxa_poly_fill_rect by only clipping once.

Eric Anholt eric at anholt.net
Wed Jun 1 09:02:56 CEST 2011


---
 uxa/uxa-accel.c |   87 +++++++++++++++++--------------------------------------
 1 files changed, 27 insertions(+), 60 deletions(-)

diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c
index 8f6da63..dd83542 100644
--- a/uxa/uxa-accel.c
+++ b/uxa/uxa-accel.c
@@ -785,10 +785,7 @@ uxa_poly_fill_rect(DrawablePtr pDrawable,
 	RegionPtr pClip = fbGetCompositeClip(pGC);
 	PixmapPtr pPixmap;
 	register BoxPtr pbox;
-	BoxPtr pextent;
-	int extentX1, extentX2, extentY1, extentY2;
 	int fullX1, fullX2, fullY1, fullY2;
-	int partX1, partX2, partY1, partY2;
 	int xoff, yoff;
 	int xorg, yorg;
 	int n;
@@ -850,11 +847,6 @@ fallback:
 	xorg = pDrawable->x;
 	yorg = pDrawable->y;
 
-	pextent = REGION_EXTENTS(pGC->pScreen, pClip);
-	extentX1 = pextent->x1;
-	extentY1 = pextent->y1;
-	extentX2 = pextent->x2;
-	extentY2 = pextent->y2;
 	while (nrect--) {
 		fullX1 = prect->x + xorg;
 		fullY1 = prect->y + yorg;
@@ -862,62 +854,37 @@ fallback:
 		fullY2 = fullY1 + (int)prect->height;
 		prect++;
 
-		if (fullX1 < extentX1)
-			fullX1 = extentX1;
-
-		if (fullY1 < extentY1)
-			fullY1 = extentY1;
+		n = REGION_NUM_RECTS(pClip);
+		pbox = REGION_RECTS(pClip);
+		/*
+		 * clip the rectangle to each box in the clip region
+		 * this is logically equivalent to calling Intersect(),
+		 * but rectangles may overlap each other here.
+		 */
+		while (n--) {
+			int x1 = fullX1;
+			int x2 = fullX2;
+			int y1 = fullY1;
+			int y2 = fullY2;
 
-		if (fullX2 > extentX2)
-			fullX2 = extentX2;
+			if (pbox->x1 > x1)
+				x1 = pbox->x1;
+			if (pbox->x2 < x2)
+				x2 = pbox->x2;
+			if (pbox->y1 > y1)
+				y1 = pbox->y1;
+			if (pbox->y2 < y2)
+				y2 = pbox->y2;
+			pbox++;
 
-		if (fullY2 > extentY2)
-			fullY2 = extentY2;
+			if (x1 >= x2 || y1 >= y2)
+				continue;
 
-		if ((fullX1 >= fullX2) || (fullY1 >= fullY2))
-			continue;
-		n = REGION_NUM_RECTS(pClip);
-		if (n == 1) {
 			(*uxa_screen->info->solid) (pPixmap,
-						    fullX1 + xoff,
-						    fullY1 + yoff,
-						    fullX2 + xoff,
-						    fullY2 + yoff);
-		} else {
-			pbox = REGION_RECTS(pClip);
-			/*
-			 * clip the rectangle to each box in the clip region
-			 * this is logically equivalent to calling Intersect(),
-			 * but rectangles may overlap each other here.
-			 */
-			while (n--) {
-				partX1 = pbox->x1;
-				if (partX1 < fullX1)
-					partX1 = fullX1;
-				partY1 = pbox->y1;
-				if (partY1 < fullY1)
-					partY1 = fullY1;
-				partX2 = pbox->x2;
-				if (partX2 > fullX2)
-					partX2 = fullX2;
-				partY2 = pbox->y2;
-				if (partY2 > fullY2)
-					partY2 = fullY2;
-
-				pbox++;
-
-				if (partX1 < partX2 && partY1 < partY2) {
-					(*uxa_screen->info->solid) (pPixmap,
-								    partX1 +
-								    xoff,
-								    partY1 +
-								    yoff,
-								    partX2 +
-								    xoff,
-								    partY2 +
-								    yoff);
-				}
-			}
+						    x1 + xoff,
+						    y1 + yoff,
+						    x2 + xoff,
+						    y2 + yoff);
 		}
 	}
 	(*uxa_screen->info->done_solid) (pPixmap);
-- 
1.7.5.1




More information about the Intel-gfx mailing list