#include "X.h"
#include "Xmd.h"
#include "servermd.h"
#include "gcstruct.h"
#include "window.h"
#include "pixmapstr.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "ipl.h"
#include "iplrrop.h"
#include "mi.h"
#include "mispans.h"
#include "iplmskbits.h"
# define Expand(left, right, leftAdjust) { \
while (h--) { \
pdst = pdstRect; \
left \
m = nmiddle; \
INTER_RROP_SPAN(pdst, m); \
right \
pdstRect += widthDst; \
} \
}
void
INTER_RROP_NAME(iplFillRectSolid) (pDrawable, pGC, nBox, pBox)
DrawablePtr pDrawable;
GCPtr pGC;
int nBox;
BoxPtr pBox;
{
register int m;
INTER_DECLAREG(*pdst);
INTER_RROP_DECLARE
INTER_DECLAREG(leftMask);
INTER_DECLAREG(rightMask);
INTER_DECLAREG(*pdstBase);
INTER_DECLAREG(*pdstRect);
int nmiddle;
int h;
int w;
int widthDst;
iplGetGroupWidthAndPointer (pDrawable, widthDst, pdstBase)
INTER_RROP_FETCH_GC(pGC)
for (; nBox; nBox--, pBox++)
{
pdstRect = pdstBase + pBox->y1 * widthDst;
h = pBox->y2 - pBox->y1;
w = pBox->x2 - pBox->x1;
pdstRect += (pBox->x1 >> INTER_PGSH) * INTER_PLANES;
if ((pBox->x1 & INTER_PIM) + w <= INTER_PPG)
{
INTER_maskpartialbits(pBox->x1, w, leftMask);
pdst = pdstRect;
while (h--) {
INTER_RROP_SOLID_MASK (pdst, leftMask);
pdst += widthDst;
}
}
else
{
INTER_maskbits (pBox->x1, w, leftMask, rightMask, nmiddle);
if (leftMask)
{
if (rightMask)
{
Expand(INTER_RROP_SOLID_MASK (pdst, leftMask);
INTER_NEXT_GROUP(pdst);,
INTER_RROP_SOLID_MASK (pdst, rightMask);, 1)
}
else
{
Expand(INTER_RROP_SOLID_MASK (pdst, leftMask);
INTER_NEXT_GROUP(pdst);,
;, 1)
}
}
else
{
if (rightMask)
{
Expand(;,
INTER_RROP_SOLID_MASK (pdst, rightMask);, 0)
}
else
{
Expand(;,
;, 0)
}
}
}
}
}
void
INTER_RROP_NAME(iplSolidSpans) (pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
DrawablePtr pDrawable;
GCPtr pGC;
int nInit;
DDXPointPtr pptInit;
int *pwidthInit;
int fSorted;
{
INTER_DECLAREG(*pdstBase);
int widthDst;
INTER_RROP_DECLARE
INTER_DECLAREG(*pdst);
register int ngmiddle;
INTER_DECLAREG(startmask);
INTER_DECLAREG(endmask);
register int w;
int x;
int n;
DDXPointPtr ppt;
int *pwidthFree;
DDXPointPtr pptFree;
int *pwidth;
iplPrivGCPtr devPriv;
devPriv = iplGetGCPrivate(pGC);
INTER_RROP_FETCH_GCPRIV(devPriv)
n = nInit * miFindMaxBand(pGC->pCompositeClip);
pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
if(!pptFree || !pwidthFree)
{
if (pptFree) DEALLOCATE_LOCAL(pptFree);
if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree);
return;
}
pwidth = pwidthFree;
ppt = pptFree;
n = miClipSpans(pGC->pCompositeClip, pptInit, pwidthInit, nInit,
ppt, pwidth, fSorted);
iplGetGroupWidthAndPointer (pDrawable, widthDst, pdstBase)
while (n--)
{
x = ppt->x;
pdst = pdstBase + (ppt->y * widthDst);
++ppt;
w = *pwidth++;
if (!w)
continue;
if ((x & INTER_PIM) + w <= INTER_PPG)
{
pdst += (x >> INTER_PGSH) * INTER_PLANES;
INTER_maskpartialbits (x, w, startmask);
INTER_RROP_SOLID_MASK (pdst, startmask);
}
else
{
pdst += (x >> INTER_PGSH) * INTER_PLANES;
INTER_maskbits (x, w, startmask, endmask, ngmiddle);
if (startmask)
{
INTER_RROP_SOLID_MASK (pdst, startmask);
INTER_NEXT_GROUP(pdst);
}
INTER_RROP_SPAN(pdst,ngmiddle);
if (endmask)
{
INTER_RROP_SOLID_MASK (pdst, endmask);
}
}
}
DEALLOCATE_LOCAL(pptFree);
DEALLOCATE_LOCAL(pwidthFree);
}