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