xenocara/xserver/hw/xfree86/xaa/xaaRect.c

122 lines
4.4 KiB
C
Raw Normal View History

2006-11-26 11:13:41 -07:00
#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "misc.h"
#include "xf86.h"
#include "xf86_OSproc.h"
#include <X11/X.h>
#include "scrnintstr.h"
#include "pixmapstr.h"
#include "xf86str.h"
#include "xaa.h"
#include "xaalocal.h"
/*
Much of this file based on code by
Harm Hanemaayer (H.Hanemaayer@inter.nl.net).
*/
void
XAAPolyRectangleThinSolid(DrawablePtr pDrawable,
GCPtr pGC, int nRectsInit, xRectangle *pRectsInit)
2006-11-26 11:13:41 -07:00
{
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
int nClipRects; /* number of clip rectangles */
BoxPtr pClipRects; /* points to the list of clip rects */
int xOrigin; /* Drawables x origin */
int yOrigin; /* Drawables x origin */
2006-11-26 11:13:41 -07:00
xRectangle *pRect; /* list of rects */
int nRects; /* running count of number of rects */
int origX1, origY1; /* original rectangle's U/L corner */
int origX2, origY2; /* original rectangle's L/R corner */
int clippedX1; /* clipped rectangle's left x */
int clippedY1; /* clipped rectangle's top y */
int clippedX2; /* clipped rectangle's right x */
int clippedY2; /* clipped rectangle's bottom y */
int clipXMin; /* upper left corner of clip rect */
int clipYMin; /* upper left corner of clip rect */
int clipXMax; /* lower right corner of clip rect */
int clipYMax; /* lower right corner of clip rect */
int width, height; /* width and height of rect */
2006-11-26 11:13:41 -07:00
nClipRects = RegionNumRects(pGC->pCompositeClip);
pClipRects = RegionRects(pGC->pCompositeClip);
2006-11-26 11:13:41 -07:00
if (!nClipRects)
return;
2006-11-26 11:13:41 -07:00
xOrigin = pDrawable->x;
yOrigin = pDrawable->y;
(*infoRec->SetupForSolidLine) (infoRec->pScrn,
pGC->fgPixel, pGC->alu, pGC->planemask);
2006-11-26 11:13:41 -07:00
for (; nClipRects > 0; nClipRects--, pClipRects++) {
2006-11-26 11:13:41 -07:00
clipYMin = pClipRects->y1;
clipYMax = pClipRects->y2 - 1;
clipXMin = pClipRects->x1;
clipXMax = pClipRects->x2 - 1;
for (pRect = pRectsInit, nRects = nRectsInit;
nRects > 0; nRects--, pRect++) {
/* translate rectangle data over to the drawable */
origX1 = pRect->x + xOrigin;
origY1 = pRect->y + yOrigin;
origX2 = origX1 + pRect->width;
origY2 = origY1 + pRect->height;
2006-11-26 11:13:41 -07:00
/* reject entire rectangle if completely outside clip rect */
if ((origX1 > clipXMax) || (origX2 < clipXMin) ||
(origY1 > clipYMax) || (origY2 < clipYMin))
continue;
2006-11-26 11:13:41 -07:00
/* clip the rectangle */
clippedX1 = max(origX1, clipXMin);
clippedX2 = min(origX2, clipXMax);
clippedY1 = max(origY1, clipYMin);
clippedY2 = min(origY2, clipYMax);
2006-11-26 11:13:41 -07:00
width = clippedX2 - clippedX1 + 1;
2006-11-26 11:13:41 -07:00
if (origY1 >= clipYMin) {
(*infoRec->SubsequentSolidHorVertLine) (infoRec->pScrn,
clippedX1, clippedY1,
width, DEGREES_0);
2006-11-26 11:13:41 -07:00
/* don't overwrite corner */
clippedY1++;
}
2006-11-26 11:13:41 -07:00
if ((origY2 <= clipYMax) && (origY1 != origY2)) {
(*infoRec->SubsequentSolidHorVertLine) (infoRec->pScrn,
clippedX1, clippedY2,
width, DEGREES_0);
2006-11-26 11:13:41 -07:00
/* don't overwrite corner */
clippedY2--;
}
2006-11-26 11:13:41 -07:00
if (clippedY2 < clippedY1)
continue;
2006-11-26 11:13:41 -07:00
height = clippedY2 - clippedY1 + 1;
2006-11-26 11:13:41 -07:00
/* draw vertical edges using lines if not clipped out */
if (origX1 >= clipXMin)
(*infoRec->SubsequentSolidHorVertLine) (infoRec->pScrn,
clippedX1, clippedY1,
height, DEGREES_270);
2006-11-26 11:13:41 -07:00
if ((origX2 <= clipXMax) && (origX2 != origX1))
(*infoRec->SubsequentSolidHorVertLine) (infoRec->pScrn,
clippedX2, clippedY1,
height, DEGREES_270);
}
2006-11-26 11:13:41 -07:00
}
SET_SYNC_FLAG(infoRec);
}