1706f2543Smrg
2706f2543Smrg
3706f2543Smrg#ifdef HAVE_XORG_CONFIG_H
4706f2543Smrg#include <xorg-config.h>
5706f2543Smrg#endif
6706f2543Smrg
7706f2543Smrg#include "xaa.h"
8706f2543Smrg#include "xaalocal.h"
9706f2543Smrg#include "xaacexp.h"
10706f2543Smrg#include "xf86.h"
11706f2543Smrg
12706f2543Smrg/* Not used anymore because the algorithm isn't correct. It doesn't
13706f2543Smrg   handle overlapping characters properly */
14706f2543Smrg
15706f2543Smrg#ifdef TRIPLE_BITS
16706f2543Smrg#define NonTEGlyphFunc EXPNAME(XAANonTEGlyphScanlineFunc3)
17706f2543Smrg#else
18706f2543Smrg#define NonTEGlyphFunc EXPNAME(XAANonTEGlyphScanlineFunc)
19706f2543Smrg#endif
20706f2543Smrg
21706f2543Smrg/********************************************************************
22706f2543Smrg
23706f2543Smrg   Here we have NonTEGlyphRenders for a bunch of different color
24706f2543Smrg   expansion types.  The driver may provide its own renderer, but
25706f2543Smrg   this is the default one which renders using lower-level primitives
26706f2543Smrg   exported by the chipset driver.
27706f2543Smrg
28706f2543Smrg********************************************************************/
29706f2543Smrg
30706f2543Smrg/* Since the dimensions of the text string and the backing rectangle
31706f2543Smrg	do not always coincide, it is possible that wBack or wText
32706f2543Smrg	may be 0!  The NonTEGlyphRender must always check for this. */
33706f2543Smrg
34706f2543Smrg/* This gets built for MSBFIRST or LSBFIRST with FIXEDBASE or not,
35706f2543Smrg	with TRIPLE_BITS or not. A total of 8 versions */
36706f2543Smrg
37706f2543Smrg/* if the backing rectangle and text are of the same dimensions
38706f2543Smrg	then we can draw in one pass */
39706f2543Smrg
40706f2543Smrgvoid
41706f2543Smrg#ifdef TRIPLE_BITS
42706f2543SmrgEXPNAME(XAANonTEGlyphRenderer3)(
43706f2543Smrg#else
44706f2543SmrgEXPNAME(XAANonTEGlyphRenderer)(
45706f2543Smrg#endif
46706f2543Smrg    ScrnInfoPtr pScrn,
47706f2543Smrg    int xText, int wText,
48706f2543Smrg    int y, int h, int skipleft, int startline,
49706f2543Smrg    NonTEGlyphInfo *glyphp,
50706f2543Smrg    int fg, int rop,
51706f2543Smrg    unsigned int planemask )
52706f2543Smrg{
53706f2543Smrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
54706f2543Smrg    CARD32* base = (CARD32*)infoRec->ColorExpandBase;
55706f2543Smrg#ifdef TRIPLE_BITS
56706f2543Smrg    int dwords = ((3 * wText + 31) >> 5) * h;
57706f2543Smrg#else
58706f2543Smrg    int dwords = ((wText + 31) >> 5) * h;
59706f2543Smrg#endif
60706f2543Smrg
61706f2543Smrg    (*infoRec->SetupForCPUToScreenColorExpandFill)(
62706f2543Smrg					pScrn, fg, -1, rop, planemask);
63706f2543Smrg    (*infoRec->SubsequentCPUToScreenColorExpandFill)(
64706f2543Smrg					pScrn, xText, y, wText, h, 0);
65706f2543Smrg
66706f2543Smrg#ifndef FIXEDBASE
67706f2543Smrg#ifdef TRIPLE_BITS
68706f2543Smrg    if((((3 * wText + 31) >> 5) * h) <= infoRec->ColorExpandRange)
69706f2543Smrg#else
70706f2543Smrg    if((((wText + 31) >> 5) * h) <= infoRec->ColorExpandRange)
71706f2543Smrg#endif
72706f2543Smrg	while(h--)
73706f2543Smrg	    base = NonTEGlyphFunc(base, glyphp, startline++, wText, skipleft);
74706f2543Smrg    else
75706f2543Smrg#endif
76706f2543Smrg	while(h--)
77706f2543Smrg	    NonTEGlyphFunc(base, glyphp, startline++, wText, skipleft);
78706f2543Smrg
79706f2543Smrg    if((infoRec->CPUToScreenColorExpandFillFlags & CPU_TRANSFER_PAD_QWORD) &&
80706f2543Smrg			(dwords & 1)) {
81706f2543Smrg	base = (CARD32*)infoRec->ColorExpandBase;
82706f2543Smrg	base[0] = 0x00000000;
83706f2543Smrg    }
84706f2543Smrg
85706f2543Smrg    if(infoRec->CPUToScreenColorExpandFillFlags & SYNC_AFTER_COLOR_EXPAND)
86706f2543Smrg	(*infoRec->Sync)(pScrn);
87706f2543Smrg    else SET_SYNC_FLAG(infoRec);
88706f2543Smrg}
89706f2543Smrg
90706f2543Smrg#ifndef FIXEDBASE
91706f2543Smrg/*  Scanline version of above gets built for LSBFIRST and MSBFIRST */
92706f2543Smrg
93706f2543Smrgvoid
94706f2543Smrg#ifdef TRIPLE_BITS
95706f2543SmrgEXPNAME(XAANonTEGlyphRendererScanline3)(
96706f2543Smrg#else
97706f2543SmrgEXPNAME(XAANonTEGlyphRendererScanline)(
98706f2543Smrg#endif
99706f2543Smrg    ScrnInfoPtr pScrn,
100706f2543Smrg    int xText, int wText,
101706f2543Smrg    int y, int h, int skipleft, int startline,
102706f2543Smrg    NonTEGlyphInfo *glyphp,
103706f2543Smrg    int fg, int rop,
104706f2543Smrg    unsigned int planemask )
105706f2543Smrg{
106706f2543Smrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
107706f2543Smrg    int bufferNo = 0;
108706f2543Smrg    CARD32* base;
109706f2543Smrg
110706f2543Smrg    (*infoRec->SetupForScanlineCPUToScreenColorExpandFill)(
111706f2543Smrg				pScrn, fg, -1, rop, planemask);
112706f2543Smrg    (*infoRec->SubsequentScanlineCPUToScreenColorExpandFill)(
113706f2543Smrg				pScrn, xText, y, wText, h, 0);
114706f2543Smrg
115706f2543Smrg    while(h--) {
116706f2543Smrg	base = (CARD32*)infoRec->ScanlineColorExpandBuffers[bufferNo];
117706f2543Smrg	NonTEGlyphFunc(base, glyphp, startline++, wText, skipleft);
118706f2543Smrg	(*infoRec->SubsequentColorExpandScanline)(pScrn, bufferNo++);
119706f2543Smrg	if(bufferNo >= infoRec->NumScanlineColorExpandBuffers)
120706f2543Smrg	    bufferNo = 0;
121706f2543Smrg    }
122706f2543Smrg
123706f2543Smrg    SET_SYNC_FLAG(infoRec);
124706f2543Smrg}
125706f2543Smrg
126706f2543Smrg#endif
127706f2543Smrg
128706f2543Smrg/********************************************************************
129706f2543Smrg
130706f2543Smrg   Generic NonTE scanline rendering code.
131706f2543Smrg
132706f2543Smrg********************************************************************/
133706f2543Smrg
134706f2543Smrg
135706f2543SmrgCARD32*
136706f2543SmrgNonTEGlyphFunc(
137706f2543Smrg    CARD32 *base,
138706f2543Smrg    NonTEGlyphInfo *glyphp,
139706f2543Smrg    int line, int TotalWidth, int skipleft )
140706f2543Smrg{
141706f2543Smrg    CARD32 bits = 0;
142706f2543Smrg    int shift = glyphp->width;
143706f2543Smrg
144706f2543Smrg    if(skipleft) {
145706f2543Smrg	if((line >= glyphp->firstline) && (line <= glyphp->lastline))
146706f2543Smrg            bits = SHIFT_R(glyphp->bitsp[line], skipleft);
147706f2543Smrg	shift -= skipleft;
148706f2543Smrg    } else if((line >= glyphp->firstline) && (line <= glyphp->lastline))
149706f2543Smrg            bits =  glyphp->bitsp[line];
150706f2543Smrg
151706f2543Smrg
152706f2543Smrg    while(TotalWidth > 32) {
153706f2543Smrg	while(shift < 32) {
154706f2543Smrg	    glyphp++;
155706f2543Smrg	    if((line >= glyphp->firstline) && (line <= glyphp->lastline))
156706f2543Smrg		bits |= SHIFT_L(glyphp->bitsp[line],shift);
157706f2543Smrg	    shift += glyphp->width;
158706f2543Smrg	}
159706f2543Smrg#ifdef TRIPLE_BITS
160706f2543Smrg	WRITE_BITS3(bits);
161706f2543Smrg#else
162706f2543Smrg	WRITE_BITS(bits);
163706f2543Smrg#endif
164706f2543Smrg	shift &= 31;
165706f2543Smrg	if(shift &&
166706f2543Smrg	 (line >= glyphp->firstline) && (line <= glyphp->lastline))
167706f2543Smrg           bits = SHIFT_R(glyphp->bitsp[line], glyphp->width - shift);
168706f2543Smrg	else bits = 0;
169706f2543Smrg	TotalWidth -= 32;
170706f2543Smrg    }
171706f2543Smrg
172706f2543Smrg    if(TotalWidth) {
173706f2543Smrg	TotalWidth -= shift;
174706f2543Smrg	while(TotalWidth > 0) {
175706f2543Smrg	     glyphp++;
176706f2543Smrg	     if((line >= glyphp->firstline) && (line <= glyphp->lastline))
177706f2543Smrg		bits |= SHIFT_L(glyphp->bitsp[line], shift);
178706f2543Smrg	     shift += glyphp->width;
179706f2543Smrg	     TotalWidth -= glyphp->width;
180706f2543Smrg	}
181706f2543Smrg#ifdef TRIPLE_BITS
182706f2543Smrg	if (shift >= 22) {
183706f2543Smrg	    WRITE_BITS3(bits);
184706f2543Smrg	} else if (shift >= 11) {
185706f2543Smrg	    WRITE_BITS2(bits);
186706f2543Smrg	} else {
187706f2543Smrg	    WRITE_BITS1(bits);
188706f2543Smrg	}
189706f2543Smrg#else
190706f2543Smrg	WRITE_BITS(bits);
191706f2543Smrg#endif
192706f2543Smrg    }
193706f2543Smrg
194706f2543Smrg
195706f2543Smrg    return base;
196706f2543Smrg}
197706f2543Smrg
198706f2543Smrg
199706f2543Smrg
200706f2543Smrg
201