#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <X11/X.h>
#include "misc.h"
#include "afb.h"
#include "maskbits.h"
#include "miline.h"
void
afbBresS(addrlbase, nlwidth, sizeDst, depthDst, signdx, signdy, axis, x1, y1,
e, e1, e2, len, rrops)
PixelType *addrlbase;
int nlwidth;
int sizeDst;
int depthDst;
int signdx, signdy;
int axis;
int x1, y1;
register int e;
register int e1;
int e2;
int len;
unsigned char *rrops;
{
register int yinc;
register PixelType *addrl;
register PixelType bit;
PixelType leftbit = mfbGetmask(0);
PixelType rightbit = mfbGetmask(PPW-1);
register int e3 = e2-e1;
PixelType tmp;
int saveE;
int saveLen;
int d;
yinc = signdy * nlwidth;
e = e-e1;
if (!len)
return;
saveLen = len;
saveE = e;
for (d = 0; d < depthDst; d++) {
addrl = afbScanline(addrlbase, x1, y1, nlwidth);
addrlbase += sizeDst;
len = saveLen;
e = saveE;
bit = mfbGetmask(x1 & PIM);
switch (rrops[d]) {
case RROP_BLACK:
if (axis == X_AXIS) {
if (signdx > 0) {
tmp = *addrl;
for (;;) {
tmp &= ~bit;
if (!--len)
break;
bit = SCRRIGHT(bit,1);
e += e1;
if (e >= 0) {
*addrl = tmp;
afbScanlineInc(addrl, yinc);
e += e3;
if (!bit) {
bit = leftbit;
addrl ++;
}
tmp = *addrl;
} else if (!bit) {
*addrl = tmp;
bit = leftbit;
addrl ++;
tmp = *addrl;
}
}
*addrl = tmp;
} else {
tmp = *addrl;
for (;;) {
tmp &= ~bit;
if (!--len)
break;
e += e1;
bit = SCRLEFT(bit,1);
if (e >= 0) {
*addrl = tmp;
afbScanlineInc(addrl, yinc);
e += e3;
if (!bit) {
bit = rightbit;
addrl --;
}
tmp = *addrl;
} else if (!bit) {
*addrl = tmp;
bit = rightbit;
addrl --;
tmp = *addrl;
}
}
*addrl = tmp;
}
} else {
if (signdx > 0) {
while(len--) {
*addrl &= ~bit;
e += e1;
if (e >= 0) {
bit = SCRRIGHT(bit,1);
if (!bit) { bit = leftbit;addrl ++; }
e += e3;
}
afbScanlineInc(addrl, yinc);
}
} else {
while(len--) {
*addrl &= ~bit;
e += e1;
if (e >= 0) {
bit = SCRLEFT(bit,1);
if (!bit) { bit = rightbit;addrl --; }
e += e3;
}
afbScanlineInc(addrl, yinc);
}
}
}
break;
case RROP_WHITE:
if (axis == X_AXIS) {
if (signdx > 0) {
tmp = *addrl;
for (;;) {
tmp |= bit;
if (!--len)
break;
e += e1;
bit = SCRRIGHT(bit,1);
if (e >= 0) {
*addrl = tmp;
afbScanlineInc(addrl, yinc);
e += e3;
if (!bit) {
bit = leftbit;
addrl ++;
}
tmp = *addrl;
} else if (!bit) {
*addrl = tmp;
bit = leftbit;
addrl ++;
tmp = *addrl;
}
}
*addrl = tmp;
} else {
tmp = *addrl;
for (;;) {
tmp |= bit;
if (!--len)
break;
e += e1;
bit = SCRLEFT(bit,1);
if (e >= 0) {
*addrl = tmp;
afbScanlineInc(addrl, yinc);
e += e3;
if (!bit) {
bit = rightbit;
addrl --;
}
tmp = *addrl;
} else if (!bit) {
*addrl = tmp;
bit = rightbit;
addrl --;
tmp = *addrl;
}
}
*addrl = tmp;
}
} else {
if (signdx > 0) {
while(len--) {
*addrl |= bit;
e += e1;
if (e >= 0) {
bit = SCRRIGHT(bit,1);
if (!bit) { bit = leftbit;addrl ++; }
e += e3;
}
afbScanlineInc(addrl, yinc);
}
} else {
while(len--) {
*addrl |= bit;
e += e1;
if (e >= 0) {
bit = SCRLEFT(bit,1);
if (!bit) { bit = rightbit;addrl --; }
e += e3;
}
afbScanlineInc(addrl, yinc);
}
}
}
break;
case RROP_INVERT:
if (axis == X_AXIS) {
if (signdx > 0) {
while(len--) {
*addrl ^= bit;
e += e1;
if (e >= 0) {
afbScanlineInc(addrl, yinc);
e += e3;
}
bit = SCRRIGHT(bit,1);
if (!bit) { bit = leftbit;addrl ++; }
}
} else {
while(len--) {
*addrl ^= bit;
e += e1;
if (e >= 0) {
afbScanlineInc(addrl, yinc);
e += e3;
}
bit = SCRLEFT(bit,1);
if (!bit) { bit = rightbit;addrl --; }
}
}
} else {
if (signdx > 0) {
while(len--) {
*addrl ^= bit;
e += e1;
if (e >= 0) {
bit = SCRRIGHT(bit,1);
if (!bit) { bit = leftbit;addrl ++; }
e += e3;
}
afbScanlineInc(addrl, yinc);
}
} else {
while(len--) {
*addrl ^= bit;
e += e1;
if (e >= 0) {
bit = SCRLEFT(bit,1);
if (!bit) { bit = rightbit; addrl --; }
e += e3;
}
afbScanlineInc(addrl, yinc);
}
}
}
}
}
}