#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <X11/X.h>
#include "misc.h"
#include "mfb.h"
#include "maskbits.h"
#include "miline.h"
void
mfbBresS(rop, addrlbase, nlwidth, signdx, signdy, axis, x1, y1, e, e1, e2, len)
int rop;
PixelType *addrlbase;
int nlwidth;
int signdx, signdy;
int axis;
int x1, y1;
register int e;
register int e1;
int e2;
int len;
{
register int yinc;
register PixelType *addrl;
register PixelType bit;
PixelType leftbit = mask[0];
PixelType rightbit = mask[PPW-1];
register int e3 = e2-e1;
PixelType tmp;
addrl = mfbScanline(addrlbase, x1, y1, nlwidth);
yinc = signdy * nlwidth;
e = e-e1;
bit = mask[x1 & PIM];
if (!len)
return;
if (rop == 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;
mfbScanlineInc(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;
mfbScanlineInc(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;
}
mfbScanlineInc(addrl, yinc);
}
}
else
{
while(len--)
{
*addrl &= ~bit;
e += e1;
if (e >= 0)
{
bit = SCRLEFT(bit,1);
if (!bit) { bit = rightbit;addrl --; }
e += e3;
}
mfbScanlineInc(addrl, yinc);
}
}
}
}
else if (rop == 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;
mfbScanlineInc(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;
mfbScanlineInc(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;
}
mfbScanlineInc(addrl, yinc);
}
}
else
{
while(len--)
{
*addrl |= bit;
e += e1;
if (e >= 0)
{
bit = SCRLEFT(bit,1);
if (!bit) { bit = rightbit;addrl --; }
e += e3;
}
mfbScanlineInc(addrl, yinc);
}
}
}
}
else if (rop == RROP_INVERT)
{
if (axis == X_AXIS)
{
if (signdx > 0)
{
while(len--)
{
*addrl ^= bit;
e += e1;
if (e >= 0)
{
mfbScanlineInc(addrl, yinc);
e += e3;
}
bit = SCRRIGHT(bit,1);
if (!bit) { bit = leftbit;addrl ++; }
}
}
else
{
while(len--)
{
*addrl ^= bit;
e += e1;
if (e >= 0)
{
mfbScanlineInc(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;
}
mfbScanlineInc(addrl, yinc);
}
}
else
{
while(len--)
{
*addrl ^= bit;
e += e1;
if (e >= 0)
{
bit = SCRLEFT(bit,1);
if (!bit) { bit = rightbit; addrl --; }
e += e3;
}
mfbScanlineInc(addrl, yinc);
}
}
}
}
}