193 lines
6.0 KiB
C
193 lines
6.0 KiB
C
|
|
#ifdef HAVE_XORG_CONFIG_H
|
|
#include <xorg-config.h>
|
|
#endif
|
|
|
|
#include "xaa.h"
|
|
#include "xaalocal.h"
|
|
#include "xaacexp.h"
|
|
#include "xf86.h"
|
|
|
|
/* Not used anymore because the algorithm isn't correct. It doesn't
|
|
handle overlapping characters properly */
|
|
|
|
#ifdef TRIPLE_BITS
|
|
#define NonTEGlyphFunc EXPNAME(XAANonTEGlyphScanlineFunc3)
|
|
#else
|
|
#define NonTEGlyphFunc EXPNAME(XAANonTEGlyphScanlineFunc)
|
|
#endif
|
|
|
|
/********************************************************************
|
|
|
|
Here we have NonTEGlyphRenders for a bunch of different color
|
|
expansion types. The driver may provide its own renderer, but
|
|
this is the default one which renders using lower-level primitives
|
|
exported by the chipset driver.
|
|
|
|
********************************************************************/
|
|
|
|
/* Since the dimensions of the text string and the backing rectangle
|
|
do not always coincide, it is possible that wBack or wText
|
|
may be 0! The NonTEGlyphRender must always check for this. */
|
|
|
|
/* This gets built for MSBFIRST or LSBFIRST with FIXEDBASE or not,
|
|
with TRIPLE_BITS or not. A total of 8 versions */
|
|
|
|
/* if the backing rectangle and text are of the same dimensions
|
|
then we can draw in one pass */
|
|
|
|
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
|
|
/* Scanline version of above gets built for LSBFIRST and MSBFIRST */
|
|
|
|
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
|
|
|
|
/********************************************************************
|
|
|
|
Generic NonTE scanline rendering code.
|
|
|
|
********************************************************************/
|
|
|
|
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;
|
|
}
|