#include "X.h"
#include "windowstr.h"
#include "regionstr.h"
#include "pixmapstr.h"
#include "scrnintstr.h"
#include "afb.h"
#include "maskbits.h"
#include "mergerop.h"
void
MROP_NAME(afbTileAreaPPW)(pDraw, nbox, pbox, alu, ptile, planemask)
DrawablePtr pDraw;
int nbox;
BoxPtr pbox;
int alu;
PixmapPtr ptile;
unsigned long planemask;
{
register PixelType *psrc;
int tileHeight;
register PixelType srcpix;
int nlwidth;
int w;
MROP_DECLARE_REG ()
register int h;
register int nlw;
register PixelType *p;
int sizeDst;
int depthDst;
register int d;
PixelType startmask;
PixelType endmask;
int nlwMiddle;
int nlwExtra;
register int iy;
PixelType *pbits;
PixelType *saveP;
PixelType *pSaveSrc;
int saveH;
int saveIY;
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
pbits);
MROP_INITIALIZE(alu,~0)
tileHeight = ptile->drawable.height;
pSaveSrc = (PixelType *)(ptile->devPrivate.ptr);
while (nbox--) {
w = pbox->x2 - pbox->x1;
saveH = pbox->y2 - pbox->y1;
saveIY = pbox->y1 % tileHeight;
saveP = afbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
psrc = pSaveSrc;
if (((pbox->x1 & PIM) + w) < PPW) {
maskpartialbits(pbox->x1, w, startmask);
nlwExtra = nlwidth;
for (d = 0; d < depthDst; d++, saveP += sizeDst, psrc += tileHeight) {
if (!(planemask & (1 << d)))
continue;
p = saveP;
h = saveH;
iy = saveIY;
while (h--) {
srcpix = psrc[iy];
iy++;
if (iy == tileHeight)
iy = 0;
*p = MROP_MASK(srcpix,*p,startmask);
afbScanlineInc(p, nlwExtra);
}
}
} else {
maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
for (d = 0; d < depthDst; d++, saveP += sizeDst, psrc += tileHeight) {
if (!(planemask & (1 << d)))
continue;
p = saveP;
h = saveH;
iy = saveIY;
nlwExtra = nlwidth - nlwMiddle;
if (startmask && endmask) {
nlwExtra -= 1;
while (h--) {
srcpix = psrc[iy];
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
*p = MROP_MASK (srcpix,*p,startmask);
p++;
while (nlw--) {
*p = MROP_SOLID(srcpix,*p);
p++;
}
*p = MROP_MASK(srcpix,*p,endmask);
afbScanlineInc(p, nlwExtra);
}
} else if (startmask && !endmask) {
nlwExtra -= 1;
while (h--) {
srcpix = psrc[iy];
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
*p = MROP_MASK(srcpix,*p,startmask);
p++;
while (nlw--) {
*p = MROP_SOLID(srcpix,*p);
p++;
}
afbScanlineInc(p, nlwExtra);
}
} else if (!startmask && endmask) {
while (h--) {
srcpix = psrc[iy];
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
while (nlw--) {
*p = MROP_SOLID(srcpix,*p);
p++;
}
*p = MROP_MASK(srcpix,*p,endmask);
afbScanlineInc(p, nlwExtra);
}
} else {
while (h--) {
srcpix = psrc[iy];
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
while (nlw--) {
*p = MROP_SOLID (srcpix,*p);
p++;
}
afbScanlineInc(p, nlwExtra);
}
}
}
}
pbox++;
}
}
void
MROP_NAME(afbTileArea)(pDraw, nbox, pbox, alu, pTile, xOff, yOff, planemask)
DrawablePtr pDraw;
int nbox;
BoxPtr pbox;
int alu;
PixmapPtr pTile;
int xOff;
int yOff;
unsigned long planemask;
{
register PixelType *psrc;
int nlwidth;
MROP_DECLARE_REG ()
register int h;
register PixelType *pdst;
register PixelType tmpsrc;
#if (MROP) != Mcopy
register PixelType tmpdst;
#endif
int sizeDst;
int depthDst;
int sizeTile;
int tileLine;
int iline;
int w, width, x, xSrc, ySrc, srcStartOver, nend;
int tlwidth, rem, tileWidth, tileHeight, endinc;
int saveW;
PixelType *psrcT;
int d;
int nstart;
PixelType startmask;
PixelType endmask;
int nlMiddle;
int iy;
PixelType *pBase;
PixelType *saveP;
PixelType *pStartDst;
PixelType *pStartTile;
int saveH;
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
pBase);
MROP_INITIALIZE(alu,~0)
tileHeight = pTile->drawable.height;
tileWidth = pTile->drawable.width;
tlwidth = pTile->devKind / sizeof (PixelType);
sizeTile = tlwidth * tileHeight;
xSrc = pDraw->x + ((xOff % tileWidth) - tileWidth);
ySrc = pDraw->y + ((yOff % tileHeight) - tileHeight);
while (nbox--) {
saveW = pbox->x2 - pbox->x1;
iline = (pbox->y1 - ySrc) % tileHeight;
psrcT = (PixelType *) pTile->devPrivate.ptr;
tileLine = iline * tlwidth;
saveH = pbox->y2 - pbox->y1;
saveP = afbScanline(pBase, pbox->x1, pbox->y1, nlwidth);
for (d = 0; d < depthDst; d++, psrcT += sizeTile, saveP += sizeDst) {
if (!(planemask & (1 << d)))
continue;
h = saveH;
pStartDst = saveP;
pStartTile = psrcT + tileLine;
iy = iline;
while (h--) {
x = pbox->x1;
width = saveW;
pdst = pStartDst;
while(width > 0) {
psrc = pStartTile;
w = min(tileWidth, width);
if((rem = (x - xSrc) % tileWidth) != 0) {
w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_PAD);
endinc = rem / BITMAP_SCANLINE_PAD;
getbits ((psrc+endinc), (rem&PIM), w, tmpsrc);
#if (MROP) != Mcopy
getbits (pdst, (x & PIM), w, tmpdst);
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, (x & PIM), w, pdst);
if((x & PIM) + w >= PPW)
pdst++;
} else if(((x & PIM) + w) < PPW) {
tmpsrc = *psrc;
#if (MROP) != Mcopy
getbits (pdst, (x & PIM), w, tmpdst);
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, (x & PIM), w, pdst);
} else {
maskbits(x, w, startmask, endmask, nlMiddle);
if (startmask)
nstart = PPW - (x & PIM);
else
nstart = 0;
if (endmask)
nend = (x + w) & PIM;
else
nend = 0;
srcStartOver = nstart > PLST;
if(startmask) {
tmpsrc = *psrc;
#if (MROP) != Mcopy
getbits (pdst, (x & PIM), nstart, tmpdst);
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, (x & PIM), nstart, pdst);
pdst++;
if(srcStartOver)
psrc++;
}
while(nlMiddle--) {
getbits (psrc, nstart, PPW, tmpsrc);
#if (MROP) != Mcopy
tmpdst = *pdst;
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
*pdst++ = tmpsrc;
psrc++;
}
if(endmask) {
getbits (psrc, nstart, nend, tmpsrc);
#if (MROP) != Mcopy
tmpdst = *pdst;
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, 0, nend, pdst);
}
}
x += w;
width -= w;
}
pStartDst += nlwidth;
if (++iy >= tileHeight) {
iy = 0;
pStartTile = psrcT;
} else
pStartTile += tlwidth;
}
}
pbox++;
}
}
void
MROP_NAME(afbOpaqueStippleAreaPPW)(pDraw, nbox, pbox, alu, ptile,
rropsOS, planemask)
DrawablePtr pDraw;
int nbox;
BoxPtr pbox;
int alu;
PixmapPtr ptile;
register unsigned char *rropsOS;
unsigned long planemask;
{
register PixelType *psrc;
int tileHeight;
register PixelType srcpix = 0;
int nlwidth;
int w;
MROP_DECLARE_REG ()
register int h;
register int nlw;
register PixelType *p;
int sizeDst;
int depthDst;
register int d;
PixelType startmask;
PixelType endmask;
int nlwMiddle;
int nlwExtra;
register int iy;
PixelType *pbits;
PixelType *saveP;
int saveH;
int saveIY;
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
pbits);
MROP_INITIALIZE(alu,~0)
tileHeight = ptile->drawable.height;
psrc = (PixelType *)(ptile->devPrivate.ptr);
while (nbox--) {
w = pbox->x2 - pbox->x1;
saveH = pbox->y2 - pbox->y1;
saveIY = pbox->y1 % tileHeight;
saveP = afbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
if ( ((pbox->x1 & PIM) + w) < PPW) {
maskpartialbits(pbox->x1, w, startmask);
nlwExtra = nlwidth;
for (d = 0; d < depthDst; d++, saveP += sizeDst) {
if (!(planemask & (1 << d)))
continue;
p = saveP;
h = saveH;
iy = saveIY;
while (h--) {
switch (rropsOS[d]) {
case RROP_BLACK:
srcpix = 0;
break;
case RROP_WHITE:
srcpix = ~0;
break;
case RROP_COPY:
srcpix = psrc[iy];
break;
case RROP_INVERT:
srcpix = ~psrc[iy];
break;
}
iy++;
if (iy == tileHeight)
iy = 0;
*p = MROP_MASK(srcpix,*p,startmask);
afbScanlineInc(p, nlwExtra);
}
}
} else {
maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
for (d = 0; d < depthDst; d++, saveP += sizeDst) {
if (!(planemask & (1 << d)))
continue;
p = saveP;
h = saveH;
iy = saveIY;
nlwExtra = nlwidth - nlwMiddle;
if (startmask && endmask) {
nlwExtra -= 1;
while (h--) {
switch (rropsOS[d]) {
case RROP_BLACK:
srcpix = 0;
break;
case RROP_WHITE:
srcpix = ~0;
break;
case RROP_COPY:
srcpix = psrc[iy];
break;
case RROP_INVERT:
srcpix = ~psrc[iy];
break;
}
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
*p = MROP_MASK (srcpix,*p,startmask);
p++;
while (nlw--) {
*p = MROP_SOLID(srcpix,*p);
p++;
}
*p = MROP_MASK(srcpix,*p,endmask);
afbScanlineInc(p, nlwExtra);
}
} else if (startmask && !endmask) {
nlwExtra -= 1;
while (h--) {
switch (rropsOS[d]) {
case RROP_BLACK:
srcpix = 0;
break;
case RROP_WHITE:
srcpix = ~0;
break;
case RROP_COPY:
srcpix = psrc[iy];
break;
case RROP_INVERT:
srcpix = ~psrc[iy];
break;
}
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
*p = MROP_MASK(srcpix,*p,startmask);
p++;
while (nlw--) {
*p = MROP_SOLID(srcpix,*p);
p++;
}
afbScanlineInc(p, nlwExtra);
}
} else if (!startmask && endmask) {
while (h--) {
switch (rropsOS[d]) {
case RROP_BLACK:
srcpix = 0;
break;
case RROP_WHITE:
srcpix = ~0;
break;
case RROP_COPY:
srcpix = psrc[iy];
break;
case RROP_INVERT:
srcpix = ~psrc[iy];
break;
}
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
while (nlw--) {
*p = MROP_SOLID(srcpix,*p);
p++;
}
*p = MROP_MASK(srcpix,*p,endmask);
afbScanlineInc(p, nlwExtra);
}
} else {
while (h--) {
switch (rropsOS[d]) {
case RROP_BLACK:
srcpix = 0;
break;
case RROP_WHITE:
srcpix = ~0;
break;
case RROP_COPY:
srcpix = psrc[iy];
break;
case RROP_INVERT:
srcpix = ~psrc[iy];
break;
}
iy++;
if (iy == tileHeight)
iy = 0;
nlw = nlwMiddle;
while (nlw--) {
*p = MROP_SOLID (srcpix,*p);
p++;
}
afbScanlineInc(p, nlwExtra);
}
}
}
}
pbox++;
}
}
void
MROP_NAME(afbOpaqueStippleArea)(pDraw, nbox, pbox, alu, pTile, xOff, yOff,
rropsOS, planemask)
DrawablePtr pDraw;
int nbox;
BoxPtr pbox;
int alu;
PixmapPtr pTile;
int xOff;
int yOff;
register unsigned char *rropsOS;
unsigned long planemask;
{
register PixelType *psrc;
int nlwidth;
MROP_DECLARE_REG ()
register int h;
register PixelType *pdst;
register PixelType tmpsrc = 0;
#if (MROP) != Mcopy
register PixelType tmpdst;
#endif
int sizeDst;
int depthDst;
int tileLine;
int iline;
int w, width, x, xSrc, ySrc, srcStartOver, nend;
int tlwidth, rem, tileWidth, tileHeight, endinc;
int saveW;
PixelType *psrcT;
int d;
int nstart;
PixelType startmask;
PixelType endmask;
int nlMiddle;
int iy;
PixelType *pBase;
PixelType *saveP;
PixelType *pStartDst;
PixelType *pStartTile;
int saveH;
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
pBase);
MROP_INITIALIZE(alu,~0)
tileHeight = pTile->drawable.height;
tileWidth = pTile->drawable.width;
tlwidth = pTile->devKind / sizeof (PixelType);
xSrc = pDraw->x + ((xOff % tileWidth) - tileWidth);
ySrc = pDraw->y + ((yOff % tileHeight) - tileHeight);
while (nbox--) {
saveW = pbox->x2 - pbox->x1;
iline = (pbox->y1 - ySrc) % tileHeight;
psrcT = (PixelType *) pTile->devPrivate.ptr;
tileLine = iline * tlwidth;
saveH = pbox->y2 - pbox->y1;
saveP = afbScanline(pBase, pbox->x1, pbox->y1, nlwidth);
for (d = 0; d < depthDst; d++, saveP += sizeDst) {
if (!(planemask & (1 << d)))
continue;
h = saveH;
pStartDst = saveP;
pStartTile = psrcT + tileLine;
iy = iline;
while (h--) {
x = pbox->x1;
width = saveW;
pdst = pStartDst;
while(width > 0) {
psrc = pStartTile;
w = min(tileWidth, width);
if((rem = (x - xSrc) % tileWidth) != 0) {
w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_PAD);
endinc = rem / BITMAP_SCANLINE_PAD;
switch (rropsOS[d]) {
case RROP_BLACK:
tmpsrc = 0;
break;
case RROP_WHITE:
tmpsrc = ~0;
break;
case RROP_COPY:
getbits ((psrc+endinc), (rem&PIM), w, tmpsrc);
break;
case RROP_INVERT:
getbits ((psrc+endinc), (rem&PIM), w, tmpsrc);
tmpsrc = ~tmpsrc;
break;
}
#if (MROP) != Mcopy
getbits (pdst, (x & PIM), w, tmpdst);
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, (x & PIM), w, pdst);
if((x & PIM) + w >= PPW)
pdst++;
} else if(((x & PIM) + w) < PPW) {
switch (rropsOS[d]) {
case RROP_BLACK:
tmpsrc = 0;
break;
case RROP_WHITE:
tmpsrc = ~0;
break;
case RROP_COPY:
tmpsrc = *psrc;
break;
case RROP_INVERT:
tmpsrc = ~*psrc;
break;
}
#if (MROP) != Mcopy
getbits (pdst, (x & PIM), w, tmpdst);
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, (x & PIM), w, pdst);
} else {
maskbits(x, w, startmask, endmask, nlMiddle);
if (startmask)
nstart = PPW - (x & PIM);
else
nstart = 0;
if (endmask)
nend = (x + w) & PIM;
else
nend = 0;
srcStartOver = nstart > PLST;
if(startmask) {
switch (rropsOS[d]) {
case RROP_BLACK:
tmpsrc = 0;
break;
case RROP_WHITE:
tmpsrc = ~0;
break;
case RROP_COPY:
tmpsrc = *psrc;
break;
case RROP_INVERT:
tmpsrc = ~*psrc;
break;
}
#if (MROP) != Mcopy
getbits (pdst, (x & PIM), nstart, tmpdst);
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, (x & PIM), nstart, pdst);
pdst++;
if(srcStartOver)
psrc++;
}
while(nlMiddle--) {
switch (rropsOS[d]) {
case RROP_BLACK:
tmpsrc = 0;
break;
case RROP_WHITE:
tmpsrc = ~0;
break;
case RROP_COPY:
getbits (psrc, nstart, PPW, tmpsrc);
break;
case RROP_INVERT:
getbits (psrc, nstart, PPW, tmpsrc);
tmpsrc = ~tmpsrc;
break;
}
#if (MROP) != Mcopy
tmpdst = *pdst;
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
*pdst++ = tmpsrc;
psrc++;
}
if(endmask) {
switch (rropsOS[d]) {
case RROP_BLACK:
tmpsrc = 0;
break;
case RROP_WHITE:
tmpsrc = ~0;
break;
case RROP_COPY:
getbits (psrc, nstart, nend, tmpsrc);
break;
case RROP_INVERT:
getbits (psrc, nstart, nend, tmpsrc);
tmpsrc = ~tmpsrc;
break;
}
#if (MROP) != Mcopy
tmpdst = *pdst;
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
#endif
putbits (tmpsrc, 0, nend, pdst);
}
}
x += w;
width -= w;
}
pStartDst += nlwidth;
if (++iy >= tileHeight) {
iy = 0;
pStartTile = psrcT;
} else
pStartTile += tlwidth;
}
}
pbox++;
}
}