summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2011-05-31 23:29:43 -0700
committerEric Anholt <eric@anholt.net>2011-06-05 21:13:49 -0700
commit91424d49373d8117e71441fa3221bd1801171692 (patch)
treed19b16e0725b9ad0f36d82d67a38a59cb78196a3
parente0066e77e026b0dd0daa0c3765473c7d63aa6753 (diff)
uxa: Simplify uxa_poly_fill_rect by only clipping once.
Reviewed-by: Keith Packard <keithp@keithp.com>
-rw-r--r--uxa/uxa-accel.c87
1 files changed, 27 insertions, 60 deletions
diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c
index 8f6da635..dd83542c 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);