138 lines
3.8 KiB
C
138 lines
3.8 KiB
C
/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaRect.c,v 1.2 1998/07/25 16:58:51 dawes Exp $ */
|
|
|
|
#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 )
|
|
{
|
|
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 */
|
|
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 */
|
|
|
|
nClipRects = REGION_NUM_RECTS(pGC->pCompositeClip);
|
|
pClipRects = REGION_RECTS(pGC->pCompositeClip);
|
|
|
|
if(!nClipRects) return;
|
|
|
|
xOrigin = pDrawable->x;
|
|
yOrigin = pDrawable->y;
|
|
|
|
|
|
(*infoRec->SetupForSolidLine)(infoRec->pScrn,
|
|
pGC->fgPixel, pGC->alu, pGC->planemask);
|
|
|
|
|
|
for ( ; nClipRects > 0;
|
|
nClipRects--, pClipRects++ )
|
|
{
|
|
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;
|
|
|
|
/* reject entire rectangle if completely outside clip rect */
|
|
if ((origX1 > clipXMax) || (origX2 < clipXMin) ||
|
|
(origY1 > clipYMax) || (origY2 < clipYMin))
|
|
continue;
|
|
|
|
/* clip the rectangle */
|
|
clippedX1 = max (origX1, clipXMin);
|
|
clippedX2 = min (origX2, clipXMax);
|
|
clippedY1 = max (origY1, clipYMin);
|
|
clippedY2 = min (origY2, clipYMax);
|
|
|
|
width = clippedX2 - clippedX1 + 1;
|
|
|
|
if (origY1 >= clipYMin) {
|
|
(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
|
|
clippedX1, clippedY1, width, DEGREES_0);
|
|
|
|
/* don't overwrite corner */
|
|
clippedY1++;
|
|
}
|
|
|
|
if ((origY2 <= clipYMax) && (origY1 != origY2)) {
|
|
(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
|
|
clippedX1, clippedY2, width, DEGREES_0);
|
|
|
|
/* don't overwrite corner */
|
|
clippedY2--;
|
|
}
|
|
|
|
if (clippedY2 < clippedY1) continue;
|
|
|
|
height = clippedY2 - clippedY1 + 1;
|
|
|
|
/* draw vertical edges using lines if not clipped out */
|
|
if (origX1 >= clipXMin)
|
|
(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
|
|
clippedX1, clippedY1, height, DEGREES_270);
|
|
|
|
if ((origX2 <= clipXMax) && (origX2 != origX1))
|
|
(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
|
|
clippedX2, clippedY1, height, DEGREES_270);
|
|
}
|
|
}
|
|
|
|
SET_SYNC_FLAG(infoRec);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|