#include "ffb.h"
#include "ffb_regs.h"
#include "ffb_rcache.h"
#include "ffb_fifo.h"
#include "pixmapstr.h"
#include "scrnintstr.h"
#define PSZ 8
#include "cfb.h"
#undef PSZ
#include "cfb32.h"
void
CreatorGetSpans(DrawablePtr pDrawable, int wMax, DDXPointPtr ppt,
int *pwidth, int nspans, char *pchardstStart)
{
FFBPtr pFfb = GET_FFB_FROM_SCREEN (pDrawable->pScreen);
ffb_fbcPtr ffb = pFfb->regs;
char *addrp;
FFBLOG(("CreatorGetSpans: wmax(%d) nspans(%d)\n", wMax, nspans));
if(pDrawable->bitsPerPixel == 1) {
mfbGetSpans(pDrawable, wMax, ppt, pwidth,
nspans, pchardstStart);
return;
}
if(pDrawable->type != DRAWABLE_WINDOW) {
if (pDrawable->bitsPerPixel == 8)
cfbGetSpans(pDrawable, wMax, ppt, pwidth,
nspans, pchardstStart);
else
cfb32GetSpans(pDrawable, wMax, ppt, pwidth,
nspans, pchardstStart);
return;
}
if (!cfbDrawableEnabled(pDrawable))
return;
FFB_ATTR_SFB_VAR_WIN(pFfb, 0x00ffffff, GXcopy, (WindowPtr)pDrawable);
FFBWait(pFfb, ffb);
if (pDrawable->bitsPerPixel == 32) {
unsigned int *pdst = (unsigned int *)pchardstStart;
addrp = (char *) pFfb->sfb32;
if ((nspans == 1) && (*pwidth == 1)) {
*pdst = *(unsigned int *)(addrp + (ppt->y << 13) + (ppt->x << 2));
return;
}
while(nspans--) {
int w = min(ppt->x + *pwidth, 2048) - ppt->x;
unsigned int *psrc = (unsigned int *) (addrp +
(ppt->y << 13) +
(ppt->x << 2));
unsigned int *pdstNext = pdst + w;
while (w--)
*psrc++ = *pdst++;
pdst = pdstNext;
ppt++;
pwidth++;
}
} else {
unsigned char *pdst = (unsigned char *)pchardstStart;
addrp = (char *) pFfb->sfb8r;
if ((nspans == 1) && (*pwidth == 1)) {
*pdst = *(unsigned char *)(addrp + (ppt->y << 11) + (ppt->x << 0));
return;
}
while(nspans--) {
int w = min(ppt->x + *pwidth, 2048) - ppt->x;
unsigned char *psrc = (unsigned char *) (addrp +
(ppt->y << 11) +
(ppt->x << 0));
unsigned char *pdstNext = pdst + w;
while (w--)
*psrc++ = *pdst++;
pdst = pdstNext;
ppt++;
pwidth++;
}
}
}