201 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			5.1 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;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |