2004-04-23 21:54:30 +02:00
|
|
|
/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaTEText.c,v 1.6 1998/12/20 11:57:52 dawes Exp $ */
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
|
|
|
In this file we have GC level replacements for PolyText8/16,
|
|
|
|
ImageText8/16, ImageGlyphBlt and PolyGlyphBlt for TE (fixed) fonts.
|
|
|
|
The idea is that everything in this file is device independent.
|
|
|
|
The mentioned GCOps are merely wrappers for XAAGlyphBltTEColorExpansion
|
|
|
|
which calculates the boxes containing arbitrarily clipped text
|
|
|
|
and passes them to the TEGlyphRenderer which will usually be a lower
|
|
|
|
level XAA function which renders these clipped glyphs using
|
|
|
|
the basic color expansion functions exported by the chipset driver.
|
|
|
|
The TEGlyphRenderer itself may optionally be driver supplied to
|
|
|
|
facilitate work-arounds/optimizations at a higher level than usual.
|
|
|
|
|
|
|
|
v1.0 - Mark Vojkovich (mvojkovi@ucsd.edu)
|
|
|
|
|
|
|
|
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
#include "misc.h"
|
|
|
|
#include "xf86.h"
|
|
|
|
#include "xf86_ansic.h"
|
|
|
|
#include "xf86_OSproc.h"
|
|
|
|
|
|
|
|
#include "X.h"
|
|
|
|
#include "font.h"
|
|
|
|
#include "scrnintstr.h"
|
|
|
|
#include "dixfontstr.h"
|
|
|
|
#include "xf86str.h"
|
|
|
|
#include "xaa.h"
|
|
|
|
#include "xaalocal.h"
|
|
|
|
#include "gcstruct.h"
|
|
|
|
#include "pixmapstr.h"
|
|
|
|
|
|
|
|
|
|
|
|
static void XAAGlyphBltTEColorExpansion(ScrnInfoPtr pScrn, int xInit,
|
|
|
|
int yInit, FontPtr font, int fg, int bg, int rop,
|
|
|
|
unsigned int planemask, RegionPtr cclip, int nglyph,
|
|
|
|
unsigned char* gBase, CharInfoPtr *ppci);
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
|
|
|
GC level replacements for PolyText8/16 and ImageText8/16
|
|
|
|
for TE fonts when using color expansion.
|
|
|
|
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
XAAPolyText8TEColorExpansion(
|
|
|
|
DrawablePtr pDraw,
|
|
|
|
GCPtr pGC,
|
|
|
|
int x, int y,
|
|
|
|
int count,
|
|
|
|
char *chars )
|
|
|
|
{
|
|
|
|
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
|
|
|
|
unsigned long n;
|
|
|
|
|
|
|
|
(*pGC->font->get_glyphs)(pGC->font, (unsigned long)count,
|
|
|
|
(unsigned char *)chars, Linear8Bit, &n, infoRec->CharInfo);
|
|
|
|
|
|
|
|
/* we have divorced XAAGlyphBltTEColorExpansion from the drawable */
|
|
|
|
if(n) XAAGlyphBltTEColorExpansion(
|
|
|
|
infoRec->pScrn, x + pDraw->x, y + pDraw->y,
|
|
|
|
pGC->font, pGC->fgPixel, -1, pGC->alu, pGC->planemask,
|
|
|
|
pGC->pCompositeClip, n, FONTGLYPHS(pGC->font), infoRec->CharInfo);
|
|
|
|
|
|
|
|
return (x + (n * FONTMAXBOUNDS(pGC->font, characterWidth)));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
XAAPolyText16TEColorExpansion(
|
|
|
|
DrawablePtr pDraw,
|
|
|
|
GCPtr pGC,
|
|
|
|
int x, int y,
|
|
|
|
int count,
|
|
|
|
unsigned short *chars )
|
|
|
|
{
|
|
|
|
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
|
|
|
|
unsigned long n;
|
|
|
|
|
|
|
|
(*pGC->font->get_glyphs)(
|
|
|
|
pGC->font, (unsigned long)count, (unsigned char *)chars,
|
|
|
|
(FONTLASTROW(pGC->font) == 0) ? Linear16Bit : TwoD16Bit,
|
|
|
|
&n, infoRec->CharInfo);
|
|
|
|
|
|
|
|
if(n) XAAGlyphBltTEColorExpansion(
|
|
|
|
infoRec->pScrn, x + pDraw->x, y + pDraw->y,
|
|
|
|
pGC->font, pGC->fgPixel, -1, pGC->alu, pGC->planemask,
|
|
|
|
pGC->pCompositeClip, n, FONTGLYPHS(pGC->font), infoRec->CharInfo);
|
|
|
|
|
|
|
|
return (x + (n * FONTMAXBOUNDS(pGC->font, characterWidth)));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
XAAImageText8TEColorExpansion(
|
|
|
|
DrawablePtr pDraw,
|
|
|
|
GCPtr pGC,
|
|
|
|
int x, int y,
|
|
|
|
int count,
|
|
|
|
char *chars )
|
|
|
|
{
|
|
|
|
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
|
|
|
|
unsigned long n;
|
|
|
|
|
|
|
|
if(!REGION_NUM_RECTS(pGC->pCompositeClip))
|
|
|
|
return;
|
|
|
|
|
|
|
|
(*pGC->font->get_glyphs)(pGC->font, (unsigned long)count,
|
|
|
|
(unsigned char *)chars, Linear8Bit, &n, infoRec->CharInfo);
|
|
|
|
|
|
|
|
if(n) XAAGlyphBltTEColorExpansion(
|
|
|
|
infoRec->pScrn, x + pDraw->x, y + pDraw->y,
|
|
|
|
pGC->font, pGC->fgPixel, pGC->bgPixel, GXcopy, pGC->planemask,
|
|
|
|
pGC->pCompositeClip, n, FONTGLYPHS(pGC->font), infoRec->CharInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
XAAImageText16TEColorExpansion(
|
|
|
|
DrawablePtr pDraw,
|
|
|
|
GCPtr pGC,
|
|
|
|
int x, int y,
|
|
|
|
int count,
|
|
|
|
unsigned short *chars )
|
|
|
|
{
|
|
|
|
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
|
|
|
|
unsigned long n;
|
|
|
|
|
|
|
|
if(!REGION_NUM_RECTS(pGC->pCompositeClip))
|
|
|
|
return;
|
|
|
|
|
|
|
|
(*pGC->font->get_glyphs)(
|
|
|
|
pGC->font, (unsigned long)count, (unsigned char *)chars,
|
|
|
|
(FONTLASTROW(pGC->font) == 0) ? Linear16Bit : TwoD16Bit,
|
|
|
|
&n, infoRec->CharInfo);
|
|
|
|
|
|
|
|
if(n) XAAGlyphBltTEColorExpansion(
|
|
|
|
infoRec->pScrn, x + pDraw->x, y + pDraw->y,
|
|
|
|
pGC->font, pGC->fgPixel, pGC->bgPixel, GXcopy, pGC->planemask,
|
|
|
|
pGC->pCompositeClip, n, FONTGLYPHS(pGC->font), infoRec->CharInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
|
|
|
GC level replacements for ImageGlyphBlt and PolyGlyphBlt for
|
|
|
|
TE fonts when using color expansion.
|
|
|
|
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
XAAImageGlyphBltTEColorExpansion(
|
|
|
|
DrawablePtr pDrawable,
|
|
|
|
GCPtr pGC,
|
|
|
|
int xInit, int yInit,
|
|
|
|
unsigned int nglyph,
|
|
|
|
CharInfoPtr *ppci,
|
|
|
|
pointer pglyphBase )
|
|
|
|
{
|
|
|
|
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
|
|
|
|
|
|
|
|
if(!REGION_NUM_RECTS(pGC->pCompositeClip))
|
|
|
|
return;
|
|
|
|
|
|
|
|
XAAGlyphBltTEColorExpansion(
|
|
|
|
infoRec->pScrn, xInit + pDrawable->x, yInit + pDrawable->y,
|
|
|
|
pGC->font, pGC->fgPixel, pGC->bgPixel, GXcopy, pGC->planemask,
|
|
|
|
pGC->pCompositeClip, nglyph, (unsigned char*)pglyphBase, ppci);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
XAAPolyGlyphBltTEColorExpansion(
|
|
|
|
DrawablePtr pDrawable,
|
|
|
|
GCPtr pGC,
|
|
|
|
int xInit, int yInit,
|
|
|
|
unsigned int nglyph,
|
|
|
|
CharInfoPtr *ppci,
|
|
|
|
pointer pglyphBase )
|
|
|
|
{
|
|
|
|
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
|
|
|
|
|
|
|
|
if(!REGION_NUM_RECTS(pGC->pCompositeClip))
|
|
|
|
return;
|
|
|
|
|
|
|
|
XAAGlyphBltTEColorExpansion(
|
|
|
|
infoRec->pScrn, xInit + pDrawable->x, yInit + pDrawable->y,
|
|
|
|
pGC->font, pGC->fgPixel, -1, pGC->alu, pGC->planemask,
|
|
|
|
pGC->pCompositeClip, nglyph, (unsigned char*)pglyphBase, ppci);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
|
|
|
XAAGlyphBltTEColorExpansion -
|
|
|
|
|
|
|
|
This guy computes the clipped pieces of text and sends it to
|
|
|
|
the lower-level function which will handle acceleration of
|
|
|
|
arbitrarily clipped text.
|
|
|
|
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
XAAGlyphBltTEColorExpansion(
|
|
|
|
ScrnInfoPtr pScrn,
|
|
|
|
int xInit, int yInit,
|
|
|
|
FontPtr font,
|
|
|
|
int fg, int bg,
|
|
|
|
int rop,
|
|
|
|
unsigned int planemask,
|
|
|
|
RegionPtr cclip,
|
|
|
|
int nglyph,
|
|
|
|
unsigned char* gBase,
|
|
|
|
CharInfoPtr *ppci )
|
|
|
|
{
|
|
|
|
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
|
|
|
|
int skippix, skipglyphs;
|
|
|
|
int Left, Right, Top, Bottom;
|
|
|
|
int LeftEdge, RightEdge, ytop, ybot;
|
|
|
|
int nbox = REGION_NUM_RECTS(cclip);
|
|
|
|
BoxPtr pbox = REGION_RECTS(cclip);
|
|
|
|
unsigned int **glyphs = NULL;
|
|
|
|
int glyphWidth = FONTMAXBOUNDS(font, characterWidth);
|
|
|
|
|
|
|
|
/* find the size of the box */
|
|
|
|
Left = xInit;
|
|
|
|
Right = Left + (glyphWidth * nglyph);
|
|
|
|
Top = yInit - FONTASCENT(font);
|
|
|
|
Bottom = yInit + FONTDESCENT(font);
|
|
|
|
|
|
|
|
/* get into the first band that may contain part of our string */
|
|
|
|
while(nbox && (Top >= pbox->y2)) {
|
|
|
|
pbox++; nbox--;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* stop when the lower edge of the box is beyond our string */
|
|
|
|
while(nbox && (Bottom > pbox->y1)) {
|
|
|
|
LeftEdge = max(Left, pbox->x1);
|
|
|
|
RightEdge = min(Right, pbox->x2);
|
|
|
|
|
|
|
|
if(RightEdge > LeftEdge) { /* we have something to draw */
|
|
|
|
ytop = max(Top, pbox->y1);
|
|
|
|
ybot = min(Bottom, pbox->y2);
|
|
|
|
|
|
|
|
if((skippix = LeftEdge - Left)) {
|
|
|
|
skipglyphs = skippix/glyphWidth;
|
|
|
|
skippix %= glyphWidth;
|
|
|
|
} else skipglyphs = 0;
|
|
|
|
|
|
|
|
if(!glyphs) {
|
|
|
|
int count;
|
|
|
|
glyphs = (unsigned int**)(infoRec->PreAllocMem);
|
|
|
|
|
|
|
|
for(count = 0; count < nglyph; count++)
|
|
|
|
glyphs[count] = (unsigned int*)
|
|
|
|
FONTGLYPHBITS(gBase,*ppci++);
|
|
|
|
|
|
|
|
/* our new unrolled TE code only writes DWORDS at a time
|
|
|
|
so it can read up to 6 characters past the last one
|
|
|
|
we're displaying */
|
|
|
|
glyphs[count + 0] = glyphs[0];
|
|
|
|
glyphs[count + 1] = glyphs[0];
|
|
|
|
glyphs[count + 2] = glyphs[0];
|
|
|
|
glyphs[count + 3] = glyphs[0];
|
|
|
|
glyphs[count + 4] = glyphs[0];
|
|
|
|
glyphs[count + 5] = glyphs[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* x, y, w, h, skipleft, skiptop, glyphp, glyphWidth, fg, bg, rop, pm */
|
|
|
|
|
|
|
|
(*infoRec->TEGlyphRenderer)( pScrn,
|
|
|
|
LeftEdge, ytop, RightEdge - LeftEdge, ybot - ytop,
|
|
|
|
skippix, ytop - Top, glyphs + skipglyphs, glyphWidth,
|
|
|
|
fg, bg, rop, planemask);
|
|
|
|
}
|
|
|
|
|
|
|
|
nbox--; pbox++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|