#include "X.h"
#include "gcstruct.h"
#include "windowstr.h"
#include "pixmapstr.h"
#include "regionstr.h"
#include "scrnintstr.h"
#include "ipl.h"
#include "iplmskbits.h"
#define isClipped(c,ul,lr) ((((c) - (ul)) | ((lr) - (c))) & ClipMask)
#define PointLoop(fill) { \
for (nbox = REGION_NUM_RECTS(cclip), pbox = REGION_RECTS(cclip); \
--nbox >= 0; \
pbox++) \
{ \
c1 = *((INT32 *) &pbox->x1) - off; \
c2 = *((INT32 *) &pbox->x2) - off - 0x00010001; \
for (ppt = (INT32 *) pptInit, i = npt; --i >= 0;) \
{ \
pt = *ppt++; \
if (!isClipped(pt,c1,c2)) { \
fill \
} \
} \
} \
}
void
iplPolyPoint(pDrawable, pGC, mode, npt, pptInit)
DrawablePtr pDrawable;
GCPtr pGC;
int mode;
int npt;
xPoint *pptInit;
{
register INT32 pt;
register INT32 c1, c2;
register unsigned long ClipMask = 0x80008000;
INTER_DECLAREG(*addrg);
register int ngwidth;
register int xoffset;
INTER_DECLAREG(*addrgt);
register INT32 *ppt;
RegionPtr cclip;
int nbox;
register int i;
register BoxPtr pbox;
INTER_DECLARERRAX(and);
INTER_DECLARERRAX(xor);
int rop = pGC->alu;
int off;
iplPrivGCPtr devPriv;
xPoint *pptPrev;
devPriv =iplGetGCPrivate(pGC);
rop = devPriv->rop;
if (rop == GXnoop)
return;
cclip = pGC->pCompositeClip;
xor = devPriv->xorg;
and = devPriv->andg;
if ((mode == CoordModePrevious) && (npt > 1))
{
for (pptPrev = pptInit + 1, i = npt - 1; --i >= 0; pptPrev++)
{
pptPrev->x += (pptPrev-1)->x;
pptPrev->y += (pptPrev-1)->y;
}
}
off = *((int *) &pDrawable->x);
off -= (off & 0x8000) << 1;
iplGetGroupWidthAndPointer(pDrawable, ngwidth, addrg);
addrg = addrg + pDrawable->y * ngwidth +
(pDrawable->x >> INTER_PGSH) * INTER_PLANES;
xoffset = pDrawable->x & INTER_PIM;
PointLoop( addrgt = addrg + intToY(pt) * ngwidth
+ ((intToX(pt) + xoffset) >> INTER_PGSH) * INTER_PLANES;
INTER_DoMaskRRop(addrgt, and, xor,
iplmask[(intToX(pt) + xoffset) & INTER_PIM], addrgt);
)
}