#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "xaa.h"
#include "xaalocal.h"
#include "xaacexp.h"
#include "xf86.h"
#ifdef TRIPLE_BITS
#define NonTEGlyphFunc EXPNAME(XAANonTEGlyphScanlineFunc3)
#else
#define NonTEGlyphFunc EXPNAME(XAANonTEGlyphScanlineFunc)
#endif
void
#ifdef TRIPLE_BITS
EXPNAME(XAANonTEGlyphRenderer3)(
#else
EXPNAME(XAANonTEGlyphRenderer)(
#endif
ScrnInfoPtr pScrn,
int xText, int wText,
int y, int h, int skipleft, int startline,
NonTEGlyphInfo *glyphp,
int fg, int rop,
unsigned int planemask )
{
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
CARD32* base = (CARD32*)infoRec->ColorExpandBase;
#ifdef TRIPLE_BITS
int dwords = ((3 * wText + 31) >> 5) * h;
#else
int dwords = ((wText + 31) >> 5) * h;
#endif
(*infoRec->SetupForCPUToScreenColorExpandFill)(
pScrn, fg, -1, rop, planemask);
(*infoRec->SubsequentCPUToScreenColorExpandFill)(
pScrn, xText, y, wText, h, 0);
#ifndef FIXEDBASE
#ifdef TRIPLE_BITS
if((((3 * wText + 31) >> 5) * h) <= infoRec->ColorExpandRange)
#else
if((((wText + 31) >> 5) * h) <= infoRec->ColorExpandRange)
#endif
while(h--)
base = NonTEGlyphFunc(base, glyphp, startline++, wText, skipleft);
else
#endif
while(h--)
NonTEGlyphFunc(base, glyphp, startline++, wText, skipleft);
if((infoRec->CPUToScreenColorExpandFillFlags & CPU_TRANSFER_PAD_QWORD) &&
(dwords & 1)) {
base = (CARD32*)infoRec->ColorExpandBase;
base[0] = 0x00000000;
}
if(infoRec->CPUToScreenColorExpandFillFlags & SYNC_AFTER_COLOR_EXPAND)
(*infoRec->Sync)(pScrn);
else SET_SYNC_FLAG(infoRec);
}
#ifndef FIXEDBASE
void
#ifdef TRIPLE_BITS
EXPNAME(XAANonTEGlyphRendererScanline3)(
#else
EXPNAME(XAANonTEGlyphRendererScanline)(
#endif
ScrnInfoPtr pScrn,
int xText, int wText,
int y, int h, int skipleft, int startline,
NonTEGlyphInfo *glyphp,
int fg, int rop,
unsigned int planemask )
{
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
int bufferNo = 0;
CARD32* base;
(*infoRec->SetupForScanlineCPUToScreenColorExpandFill)(
pScrn, fg, -1, rop, planemask);
(*infoRec->SubsequentScanlineCPUToScreenColorExpandFill)(
pScrn, xText, y, wText, h, 0);
while(h--) {
base = (CARD32*)infoRec->ScanlineColorExpandBuffers[bufferNo];
NonTEGlyphFunc(base, glyphp, startline++, wText, skipleft);
(*infoRec->SubsequentColorExpandScanline)(pScrn, bufferNo++);
if(bufferNo >= infoRec->NumScanlineColorExpandBuffers)
bufferNo = 0;
}
SET_SYNC_FLAG(infoRec);
}
#endif
CARD32*
NonTEGlyphFunc(
CARD32 *base,
NonTEGlyphInfo *glyphp,
int line, int TotalWidth, int skipleft )
{
CARD32 bits = 0;
int shift = glyphp->width;
if(skipleft) {
if((line >= glyphp->firstline) && (line <= glyphp->lastline))
bits = SHIFT_R(glyphp->bitsp[line], skipleft);
shift -= skipleft;
} else if((line >= glyphp->firstline) && (line <= glyphp->lastline))
bits = glyphp->bitsp[line];
while(TotalWidth > 32) {
while(shift < 32) {
glyphp++;
if((line >= glyphp->firstline) && (line <= glyphp->lastline))
bits |= SHIFT_L(glyphp->bitsp[line],shift);
shift += glyphp->width;
}
#ifdef TRIPLE_BITS
WRITE_BITS3(bits);
#else
WRITE_BITS(bits);
#endif
shift &= 31;
if(shift &&
(line >= glyphp->firstline) && (line <= glyphp->lastline))
bits = SHIFT_R(glyphp->bitsp[line], glyphp->width - shift);
else bits = 0;
TotalWidth -= 32;
}
if(TotalWidth) {
TotalWidth -= shift;
while(TotalWidth > 0) {
glyphp++;
if((line >= glyphp->firstline) && (line <= glyphp->lastline))
bits |= SHIFT_L(glyphp->bitsp[line], shift);
shift += glyphp->width;
TotalWidth -= glyphp->width;
}
#ifdef TRIPLE_BITS
if (shift >= 22) {
WRITE_BITS3(bits);
} else if (shift >= 11) {
WRITE_BITS2(bits);
} else {
WRITE_BITS1(bits);
}
#else
WRITE_BITS(bits);
#endif
}
return base;
}