1078 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1078 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| 
 | |
| #ifdef HAVE_XORG_CONFIG_H
 | |
| #include <xorg-config.h>
 | |
| #endif
 | |
| 
 | |
| #include "xaa.h"
 | |
| #include "xaalocal.h"
 | |
| #include "xaacexp.h"
 | |
| #include "xf86.h"
 | |
| 
 | |
| /* scanline function for TRIPLE_BITS_24BPP */
 | |
| static CARD32 *DrawTextScanline3(CARD32 *base, CARD32 *mem, int width);
 | |
| 
 | |
| /* Loop unrolled functions for common font widths */
 | |
| static CARD32 *DrawTETextScanlineGeneric(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth7(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth10(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth12(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth14(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth16(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth18(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth24(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| 
 | |
| 
 | |
| #ifdef USEASSEMBLER
 | |
| # ifdef FIXEDBASE
 | |
| #  ifdef MSBFIRST
 | |
| CARD32 *DrawTETextScanlineWidth6PMSBFirstFixedBase(CARD32 *base,
 | |
| 		unsigned int **glyphp, int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth8PMSBFirstFixedBase(CARD32 *base,
 | |
| 		unsigned int **glyphp, int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth9PMSBFirstFixedBase(CARD32 *base,
 | |
| 		unsigned int **glyphp, int line, int width, int glyphwidth);
 | |
| #  else
 | |
| CARD32 *DrawTETextScanlineWidth6PLSBFirstFixedBase(CARD32 *base,
 | |
| 		unsigned int **glyphp, int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth8PLSBFirstFixedBase(CARD32 *base,
 | |
| 		unsigned int **glyphp, int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth9PLSBFirstFixedBase(CARD32 *base,
 | |
| 		unsigned int **glyphp, int line, int width, int glyphwidth);
 | |
| #  endif
 | |
| # else
 | |
| #  ifdef MSBFIRST
 | |
| CARD32 *DrawTETextScanlineWidth6PMSBFirst(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth8PMSBFirst(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth9PMSBFirst(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| #  else
 | |
| CARD32 *DrawTETextScanlineWidth6PLSBFirst(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth8PLSBFirst(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| CARD32 *DrawTETextScanlineWidth9PLSBFirst(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| #  endif
 | |
| # endif
 | |
| #else
 | |
| static CARD32 *DrawTETextScanlineWidth6(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth8(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| static CARD32 *DrawTETextScanlineWidth9(CARD32 *base, unsigned int **glyphp,
 | |
| 					int line, int width, int glyphwidth);
 | |
| #endif
 | |
| 
 | |
| #define glyph_scanline_func EXPNAME(XAAGlyphScanlineFunc)
 | |
| #define glyph_get_scanline_func EXPNAME(XAAGetGlyphScanlineFunc)
 | |
| 
 | |
| 
 | |
| GlyphScanlineFuncPtr glyph_scanline_func[32] = {
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric,  
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric,
 | |
|    DrawTETextScanlineGeneric, 
 | |
| #ifdef USEASSEMBLER
 | |
| # ifdef FIXEDBASE
 | |
| #  ifdef MSBFIRST
 | |
|    DrawTETextScanlineWidth6PMSBFirstFixedBase, 
 | |
|    DrawTETextScanlineWidth7, 
 | |
|    DrawTETextScanlineWidth8PMSBFirstFixedBase, 
 | |
|    DrawTETextScanlineWidth9PMSBFirstFixedBase, 
 | |
| #  else
 | |
|    DrawTETextScanlineWidth6PLSBFirstFixedBase, 
 | |
|    DrawTETextScanlineWidth7, 
 | |
|    DrawTETextScanlineWidth8PLSBFirstFixedBase, 
 | |
|    DrawTETextScanlineWidth9PLSBFirstFixedBase, 
 | |
| #  endif
 | |
| # else
 | |
| #  ifdef MSBFIRST
 | |
|    DrawTETextScanlineWidth6PMSBFirst, 
 | |
|    DrawTETextScanlineWidth7, 
 | |
|    DrawTETextScanlineWidth8PMSBFirst, 
 | |
|    DrawTETextScanlineWidth9PMSBFirst, 
 | |
| #  else
 | |
|    DrawTETextScanlineWidth6PLSBFirst, 
 | |
|    DrawTETextScanlineWidth7, 
 | |
|    DrawTETextScanlineWidth8PLSBFirst, 
 | |
|    DrawTETextScanlineWidth9PLSBFirst, 
 | |
| #  endif
 | |
| # endif
 | |
| #else
 | |
|    DrawTETextScanlineWidth6, DrawTETextScanlineWidth7, 
 | |
|    DrawTETextScanlineWidth8, DrawTETextScanlineWidth9, 
 | |
| #endif
 | |
|    DrawTETextScanlineWidth10, 
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineWidth12,
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineWidth14, 
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineWidth16,
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineWidth18, 
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric,
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric, 
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineWidth24,
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric, 
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric,
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric, 
 | |
|    DrawTETextScanlineGeneric, DrawTETextScanlineGeneric
 | |
| };
 | |
| 
 | |
| GlyphScanlineFuncPtr *glyph_get_scanline_func(void) {
 | |
|    return glyph_scanline_func;
 | |
| }
 | |
| 
 | |
| 
 | |
| /********************************************************************
 | |
| 
 | |
|    Here we have TEGlyphRenders 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.
 | |
| 
 | |
| ********************************************************************/
 | |
| 
 | |
| /* This gets built for MSBFIRST or LSBFIRST with FIXEDBASE or not.
 | |
| 	A total of 4 versions */
 | |
| 
 | |
| void
 | |
| EXPNAME(XAATEGlyphRenderer)(
 | |
|     ScrnInfoPtr pScrn,
 | |
|     int x, int y, int w, int h, int skipleft, int startline, 
 | |
|     unsigned int **glyphs, int glyphWidth,
 | |
|     int fg, int bg, int rop, unsigned planemask
 | |
| )
 | |
| {
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
 | |
|     CARD32* base;
 | |
|     GlyphScanlineFuncPtr GlyphFunc = glyph_scanline_func[glyphWidth - 1];
 | |
|     int dwords = 0;
 | |
| 
 | |
|     if((bg != -1) && (infoRec->TEGlyphRendererFlags & TRANSPARENCY_ONLY)) {
 | |
|     	(*infoRec->SetupForSolidFill)(pScrn, bg, rop, planemask);
 | |
|         (*infoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h);
 | |
| 	bg = -1;
 | |
|     }
 | |
| 
 | |
|     (*infoRec->SetupForCPUToScreenColorExpandFill)(
 | |
| 				pScrn, fg, bg, rop, planemask);
 | |
| 
 | |
|     if(skipleft && 
 | |
| 	 (!(infoRec->TEGlyphRendererFlags & LEFT_EDGE_CLIPPING) || 
 | |
| 	 (!(infoRec->TEGlyphRendererFlags & LEFT_EDGE_CLIPPING_NEGATIVE_X) && 
 | |
| 		(skipleft > x)))) {
 | |
| 	    /* draw the first character only */
 | |
| 
 | |
| 	    int count = h, line = startline;
 | |
|             int width = glyphWidth - skipleft;
 | |
| 
 | |
| 	    if(width > w) width = w;
 | |
| 
 | |
|             (*infoRec->SubsequentCPUToScreenColorExpandFill)(
 | |
| 						pScrn, x, y, width, h, 0);
 | |
| 
 | |
| 	    base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 
 | |
| 	    while(count--) {
 | |
| 		register CARD32 tmp = SHIFT_R(glyphs[0][line++],skipleft);
 | |
| 		WRITE_BITS(tmp);
 | |
| 	    }
 | |
|     
 | |
| 	    w -= width;
 | |
| 	    if((infoRec->TEGlyphRendererFlags & CPU_TRANSFER_PAD_QWORD) &&
 | |
| 			((((width + 31) >> 5) * h) & 1)) {
 | |
| 		base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 		base[0] = 0x00000000;
 | |
| 	    }
 | |
| 	    if(!w) goto THE_END;
 | |
| 	    glyphs++;
 | |
|             x += width;
 | |
| 	    skipleft = 0;	/* nicely aligned again */
 | |
|     } 
 | |
| 
 | |
|     w += skipleft;
 | |
|     x -= skipleft;
 | |
|     dwords = ((w + 31) >> 5) * h;
 | |
| 
 | |
|     (*infoRec->SubsequentCPUToScreenColorExpandFill)(
 | |
| 				pScrn, x, y, w, h, skipleft);
 | |
| 
 | |
|     base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 
 | |
| #ifndef FIXEDBASE
 | |
|     if((((w + 31) >> 5) * h) <= infoRec->ColorExpandRange)
 | |
| 	while(h--) {
 | |
| 	    base = (*GlyphFunc)(base, glyphs, startline++, w, glyphWidth);
 | |
| 	}
 | |
|     else
 | |
| #endif
 | |
| 	while(h--) {
 | |
| 	    (*GlyphFunc)(base, glyphs, startline++, w, glyphWidth);
 | |
| 	}
 | |
| 
 | |
|     if((infoRec->TEGlyphRendererFlags & CPU_TRANSFER_PAD_QWORD) &&
 | |
| 			(dwords & 1)) {
 | |
| 	base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 	base[0] = 0x00000000;
 | |
|     }
 | |
| 
 | |
| THE_END:
 | |
| 
 | |
|     if(infoRec->TEGlyphRendererFlags & SYNC_AFTER_COLOR_EXPAND) 
 | |
| 	(*infoRec->Sync)(pScrn);
 | |
|     else SET_SYNC_FLAG(infoRec);
 | |
| }
 | |
| 
 | |
| /********************************************************************
 | |
|  
 | |
|    This is the GlyphRenderer for TRIPLE_BITS_24BPP. It renders to a buffer
 | |
|    with the non FIXEDBASE LSB_FIRST code before tripling, and possibly
 | |
|    reversing the bits and sending them to the screen
 | |
| 
 | |
| ********************************************************************/
 | |
| 
 | |
| void
 | |
| EXPNAME(XAATEGlyphRenderer3)(
 | |
|     ScrnInfoPtr pScrn,
 | |
|     int x, int y, int w, int h, int skipleft, int startline, 
 | |
|     unsigned int **glyphs, int glyphWidth,
 | |
|     int fg, int bg, int rop, unsigned planemask
 | |
| )
 | |
| {
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
 | |
|     CARD32 *base, *mem;
 | |
|     GlyphScanlineFuncPtr GlyphFunc = XAAGlyphScanlineFuncLSBFirst[glyphWidth - 1];
 | |
|     int dwords = 0;
 | |
| 
 | |
|     if((bg != -1) && 
 | |
| 	((infoRec->TEGlyphRendererFlags & TRANSPARENCY_ONLY) ||
 | |
| 	((infoRec->TEGlyphRendererFlags & RGB_EQUAL) && 
 | |
| 	(!CHECK_RGB_EQUAL(bg))))) {
 | |
|     	(*infoRec->SetupForSolidFill)(pScrn, bg, rop, planemask);
 | |
|         (*infoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h);
 | |
| 	bg = -1;
 | |
|     }
 | |
| 
 | |
|     (*infoRec->SetupForCPUToScreenColorExpandFill)(
 | |
| 					pScrn, fg, bg, rop, planemask);
 | |
| 
 | |
|     if(skipleft) {
 | |
| 	    /* draw the first character only */
 | |
| 
 | |
| 	    int count = h, line = startline;
 | |
|             int width = glyphWidth - skipleft;
 | |
| 	    CARD32 bits;
 | |
| 
 | |
| 	    if(width > w) width = w;
 | |
|             (*infoRec->SubsequentCPUToScreenColorExpandFill)(
 | |
| 					pScrn, x, y, width, h, 0);
 | |
| 
 | |
| 	    base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 
 | |
| 	    while(count--) {	
 | |
| 		bits = SHIFT_R(glyphs[0][line++],skipleft);
 | |
| 	        if (width >= 22) {
 | |
| 		    WRITE_BITS3(bits);
 | |
| 	        } else if (width >= 11) {
 | |
| 		    WRITE_BITS2(bits);
 | |
| 		} else {
 | |
| 		    WRITE_BITS1(bits);
 | |
| 		}
 | |
| 	    }
 | |
| 
 | |
| 	    w -= width;
 | |
| 	    if((infoRec->TEGlyphRendererFlags & CPU_TRANSFER_PAD_QWORD) &&
 | |
| 			((((3 * width + 31) >> 5) * h) & 1)) {
 | |
| 		base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 		base[0] = 0x00000000;
 | |
| 	    }
 | |
| 	    if(!w) goto THE_END;
 | |
| 	    glyphs++;
 | |
|             x += width;
 | |
| 	    skipleft = 0;	/* nicely aligned again */
 | |
|     } 
 | |
| 
 | |
|     dwords = ((3 * w + 31) >> 5) * h;
 | |
|     mem = (CARD32*)malloc(((w + 31) >> 3) * sizeof(char));
 | |
|     if (!mem) return;
 | |
| 
 | |
|     (*infoRec->SubsequentCPUToScreenColorExpandFill)(pScrn, x, y, w, h, 0);
 | |
| 
 | |
|     base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 
 | |
| # ifndef FIXEDBASE
 | |
|     if((((3 * w + 31) >> 5) * h) <= infoRec->ColorExpandRange)
 | |
| 	while(h--) {
 | |
| 	    (*GlyphFunc)(mem, glyphs, startline++, w, glyphWidth);
 | |
| 	    base = DrawTextScanline3(base, mem, w);
 | |
| 	}
 | |
|     else
 | |
| # endif
 | |
| 	while(h--) {
 | |
| 	    (*GlyphFunc)(mem, glyphs, startline++, w, glyphWidth);
 | |
| 	    DrawTextScanline3(base, mem, w);
 | |
| 	}
 | |
| 
 | |
|     free(mem);
 | |
| 
 | |
|     if((infoRec->TEGlyphRendererFlags & CPU_TRANSFER_PAD_QWORD) &&
 | |
| 			(dwords & 1)) {
 | |
| 	base = (CARD32*)infoRec->ColorExpandBase;
 | |
| 	base[0] = 0x00000000;
 | |
|     }
 | |
| 
 | |
| THE_END:
 | |
| 
 | |
|     if(infoRec->TEGlyphRendererFlags & 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
 | |
| EXPNAME(XAATEGlyphRendererScanline)(
 | |
|     ScrnInfoPtr pScrn,
 | |
|     int x, int y, int w, int h, int skipleft, int startline, 
 | |
|     unsigned int **glyphs, int glyphWidth,
 | |
|     int fg, int bg, int rop, unsigned planemask
 | |
| )
 | |
| {
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
 | |
|     int bufferNo;
 | |
|     CARD32* base;
 | |
|     GlyphScanlineFuncPtr GlyphFunc = glyph_scanline_func[glyphWidth - 1];
 | |
| 
 | |
|     if((bg != -1) && (infoRec->TEGlyphRendererFlags & TRANSPARENCY_ONLY)) {
 | |
|     	(*infoRec->SetupForSolidFill)(pScrn, bg, rop, planemask);
 | |
|         (*infoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h);
 | |
| 	bg = -1;
 | |
|     }
 | |
| 
 | |
|     (*infoRec->SetupForScanlineCPUToScreenColorExpandFill)(
 | |
| 				pScrn, fg, bg, rop, planemask);
 | |
| 
 | |
|     if(skipleft && 
 | |
| 	(!(infoRec->TEGlyphRendererFlags & LEFT_EDGE_CLIPPING) || 
 | |
| 	(!(infoRec->TEGlyphRendererFlags & LEFT_EDGE_CLIPPING_NEGATIVE_X) &&
 | |
| 	(skipleft > x)))) {
 | |
| 	/* draw the first character only */
 | |
| 
 | |
| 	int count = h, line = startline;
 | |
| 	int width = glyphWidth - skipleft;
 | |
| 
 | |
| 	if(width > w) width = w;
 | |
| 
 | |
|         (*infoRec->SubsequentScanlineCPUToScreenColorExpandFill)(
 | |
| 					pScrn, x, y, width, h, 0);
 | |
| 
 | |
| 	bufferNo = 0;
 | |
| 
 | |
| 	while(count--) {	
 | |
| 	    register CARD32 tmp = SHIFT_R(glyphs[0][line++],skipleft);
 | |
| 	    base = (CARD32*)infoRec->ScanlineColorExpandBuffers[bufferNo];
 | |
| 	    WRITE_BITS(tmp);
 | |
| 	    (*infoRec->SubsequentColorExpandScanline)(pScrn, bufferNo++);
 | |
| 	    if(bufferNo >= infoRec->NumScanlineColorExpandBuffers)
 | |
| 	    	bufferNo = 0;
 | |
| 	}
 | |
| 
 | |
| 	w -= width;
 | |
| 	if(!w) goto THE_END;
 | |
| 	glyphs++;
 | |
| 	x += width;
 | |
| 	skipleft = 0;	/* nicely aligned again */
 | |
|     } 
 | |
| 
 | |
|     w += skipleft;
 | |
|     x -= skipleft;
 | |
| 
 | |
|     (*infoRec->SubsequentScanlineCPUToScreenColorExpandFill)(	
 | |
| 				pScrn, x, y, w, h, skipleft);
 | |
| 
 | |
|     bufferNo = 0;
 | |
| 
 | |
|     while(h--) {
 | |
| 	base = (CARD32*)infoRec->ScanlineColorExpandBuffers[bufferNo];
 | |
| 	(*GlyphFunc)(base, glyphs, startline++, w, glyphWidth);
 | |
| 	(*infoRec->SubsequentColorExpandScanline)(pScrn, bufferNo++);
 | |
| 	if(bufferNo >= infoRec->NumScanlineColorExpandBuffers)
 | |
| 	    bufferNo = 0;
 | |
|     }
 | |
| 
 | |
| THE_END:
 | |
| 
 | |
|     SET_SYNC_FLAG(infoRec);
 | |
| }
 | |
| 
 | |
| void
 | |
| EXPNAME(XAATEGlyphRendererScanline3)(
 | |
|     ScrnInfoPtr pScrn,
 | |
|     int x, int y, int w, int h, int skipleft, int startline, 
 | |
|     unsigned int **glyphs, int glyphWidth,
 | |
|     int fg, int bg, int rop, unsigned planemask
 | |
| )
 | |
| {
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
 | |
|     int bufferNo;
 | |
|     CARD32 *base, *mem;
 | |
|     GlyphScanlineFuncPtr GlyphFunc = XAAGlyphScanlineFuncLSBFirst[glyphWidth - 1];
 | |
| 
 | |
|     if((bg != -1) && 
 | |
| 	((infoRec->TEGlyphRendererFlags & TRANSPARENCY_ONLY) ||
 | |
| 	((infoRec->TEGlyphRendererFlags & RGB_EQUAL) && 
 | |
| 	(!CHECK_RGB_EQUAL(bg))))) {
 | |
|     	(*infoRec->SetupForSolidFill)(pScrn, bg, rop, planemask);
 | |
|         (*infoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h);
 | |
| 	bg = -1;
 | |
|     }
 | |
| 
 | |
|     (*infoRec->SetupForScanlineCPUToScreenColorExpandFill)(
 | |
| 					pScrn, fg, bg, rop, planemask);
 | |
| 
 | |
|     if(skipleft) {
 | |
| 	/* draw the first character only */
 | |
| 
 | |
| 	int count = h, line = startline;
 | |
| 	int width = glyphWidth - skipleft;
 | |
| 	CARD32 bits;
 | |
| 	
 | |
| 	if(width > w) width = w;
 | |
| 
 | |
|         (*infoRec->SubsequentScanlineCPUToScreenColorExpandFill)(
 | |
| 					pScrn, x, y, width, h, 0);
 | |
| 
 | |
| 	bufferNo = 0;
 | |
| 
 | |
| 	while(count--) {	
 | |
| 	    base = (CARD32*)infoRec->ScanlineColorExpandBuffers[bufferNo];
 | |
| 	    bits = SHIFT_R(glyphs[0][line++],skipleft);
 | |
| 	    if (width >= 22) {
 | |
| 		WRITE_BITS3(bits);
 | |
| 	    } else if (width >= 11) {
 | |
| 		WRITE_BITS2(bits);
 | |
| 	    } else {
 | |
| 		WRITE_BITS1(bits);
 | |
| 	    }
 | |
| 	    (*infoRec->SubsequentColorExpandScanline)(pScrn, bufferNo++);
 | |
| 	    if(bufferNo >= infoRec->NumScanlineColorExpandBuffers)
 | |
| 	    	bufferNo = 0;
 | |
| 	}
 | |
| 
 | |
| 	w -= width;
 | |
| 	if(!w) goto THE_END;
 | |
| 	glyphs++;
 | |
| 	x += width;
 | |
| 	skipleft = 0;	/* nicely aligned again */
 | |
|     } 
 | |
| 
 | |
|     w += skipleft;
 | |
|     x -= skipleft;
 | |
|     mem = (CARD32*)malloc(((w + 31) >> 3) * sizeof(char));
 | |
|     if (!mem) return;
 | |
| 
 | |
|    (*infoRec->SubsequentScanlineCPUToScreenColorExpandFill)(	
 | |
| 				pScrn, x, y, w, h, skipleft);
 | |
| 
 | |
|     bufferNo = 0;
 | |
| 
 | |
|     while(h--) {
 | |
| 	base = (CARD32*)infoRec->ScanlineColorExpandBuffers[bufferNo];
 | |
| 	(*GlyphFunc)(mem, glyphs, startline++, w, glyphWidth);
 | |
| 	DrawTextScanline3(base, mem, w);
 | |
| 	(*infoRec->SubsequentColorExpandScanline)(pScrn, bufferNo++);
 | |
| 	if(bufferNo >= infoRec->NumScanlineColorExpandBuffers)
 | |
| 	    bufferNo = 0;
 | |
|     }
 | |
| 
 | |
|     free(mem);
 | |
|     
 | |
| THE_END:
 | |
| 
 | |
|     SET_SYNC_FLAG(infoRec);
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
| /********************************************************************
 | |
| 
 | |
|    TRIPLE_BITS_24BPP scanline rendering code.
 | |
| 
 | |
| ********************************************************************/
 | |
| 
 | |
| 
 | |
| 
 | |
| static CARD32*
 | |
| DrawTextScanline3(
 | |
|     CARD32 *base,
 | |
|     CARD32 *mem,
 | |
|     int width )
 | |
| {
 | |
| 
 | |
|     while(width > 32) {
 | |
| 	WRITE_BITS3(*mem);
 | |
| 	mem++;
 | |
| 	width -= 32;
 | |
|     }
 | |
|     if(width) {
 | |
| 	if (width >= 22) {
 | |
| 	    WRITE_BITS3(*mem);
 | |
| 	} else if (width >= 11) {
 | |
| 	    WRITE_BITS2(*mem);
 | |
| 	} else {
 | |
| 	    WRITE_BITS1(*mem);
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 | |
| /********************************************************************
 | |
| 
 | |
|    Generic TE scanline rendering code.
 | |
| 
 | |
| ********************************************************************/
 | |
| 
 | |
| 
 | |
| 
 | |
| static CARD32*
 | |
| DrawTETextScanlineGeneric(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     CARD32 bits = (*glyphp)[line];
 | |
|     int shift = glyphwidth; 
 | |
| 
 | |
|     while(width > 32) {
 | |
| 	while(shift < 32) {
 | |
| 	   glyphp++;
 | |
|            bits |= SHIFT_L((*glyphp)[line], shift);
 | |
| 	   shift += glyphwidth;
 | |
| 	}
 | |
| 	WRITE_BITS(bits);
 | |
| 	shift &= 31;
 | |
| 	if(shift) 
 | |
|             bits = SHIFT_R((*glyphp)[line],(glyphwidth - shift));
 | |
| 	else bits = 0;
 | |
| 	width -= 32;
 | |
|     }
 | |
| 
 | |
|     if(width) {
 | |
| 	width -= shift;
 | |
| 	while(width > 0) {
 | |
| 	   glyphp++;
 | |
|            bits |= SHIFT_L((*glyphp)[line],shift);
 | |
| 	   shift += glyphwidth;
 | |
| 	   width -= glyphwidth;
 | |
| 	}
 | |
| 	WRITE_BITS(bits);
 | |
|     }
 | |
| 
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 | |
| /********************************************************************
 | |
| 
 | |
|    Loop unrolled TE font scanline rendering code
 | |
| 
 | |
| ********************************************************************/
 | |
| 
 | |
| 
 | |
| #ifndef USEASSEMBLER
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth6(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
| 	unsigned int bits;
 | |
|         bits =  glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],6);
 | |
|         bits |= SHIFT_L(glyphp[2][line],12);
 | |
|         bits |= SHIFT_L(glyphp[3][line],18);
 | |
|         bits |= SHIFT_L(glyphp[4][line],24);
 | |
|         bits |= SHIFT_L(glyphp[5][line],30);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);
 | |
|         bits =  SHIFT_R(glyphp[5][line],2);
 | |
|         bits |= SHIFT_L(glyphp[6][line],4);
 | |
|         bits |= SHIFT_L(glyphp[7][line],10);
 | |
|         bits |= SHIFT_L(glyphp[8][line],16);
 | |
|         bits |= SHIFT_L(glyphp[9][line],22);
 | |
|         bits |= SHIFT_L(glyphp[10][line],28);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);
 | |
|         bits =  SHIFT_R(glyphp[10][line],4);
 | |
|         bits |= SHIFT_L(glyphp[11][line],2);
 | |
|         bits |= SHIFT_L(glyphp[12][line],8);
 | |
|         bits |= SHIFT_L(glyphp[13][line],14);
 | |
|         bits |= SHIFT_L(glyphp[14][line],20);
 | |
|         bits |= SHIFT_L(glyphp[15][line],26);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);
 | |
| #ifndef FIXEDBASE
 | |
|         base += 3;
 | |
| #endif
 | |
| 	width -= 96;
 | |
|         glyphp += 16;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static CARD32*
 | |
| DrawTETextScanlineWidth7(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],7);
 | |
|         bits |= SHIFT_L(glyphp[2][line],14);
 | |
|         bits |= SHIFT_L(glyphp[3][line],21);
 | |
|         bits |= SHIFT_L(glyphp[4][line],28);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = SHIFT_R(glyphp[4][line],4);
 | |
|         bits |= SHIFT_L(glyphp[5][line],3);
 | |
|         bits |= SHIFT_L(glyphp[6][line],10);
 | |
|         bits |= SHIFT_L(glyphp[7][line],17);
 | |
|         bits |= SHIFT_L(glyphp[8][line],24);
 | |
|         bits |= SHIFT_L(glyphp[9][line],31);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits =  SHIFT_R(glyphp[9][line],1);
 | |
|         bits |= SHIFT_L(glyphp[10][line],6);
 | |
|         bits |= SHIFT_L(glyphp[11][line],13);
 | |
|         bits |= SHIFT_L(glyphp[12][line],20);
 | |
|         bits |= SHIFT_L(glyphp[13][line],27);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
|         bits = SHIFT_R(glyphp[13][line],5);
 | |
|         bits |= SHIFT_L(glyphp[14][line],2);
 | |
|         bits |= SHIFT_L(glyphp[15][line],9);
 | |
|         bits |= SHIFT_L(glyphp[16][line],16);
 | |
|         bits |= SHIFT_L(glyphp[17][line],23);
 | |
|         bits |= SHIFT_L(glyphp[18][line],30);
 | |
|         WRITE_IN_BITORDER(base, 3, bits);
 | |
| 	CHECKRETURN(4);	
 | |
|         bits = SHIFT_R(glyphp[18][line],2);
 | |
|         bits |= SHIFT_L(glyphp[19][line],5);
 | |
|         bits |= SHIFT_L(glyphp[20][line],12);
 | |
|         bits |= SHIFT_L(glyphp[21][line],19);
 | |
|         bits |= SHIFT_L(glyphp[22][line],26);
 | |
|         WRITE_IN_BITORDER(base, 4, bits);
 | |
| 	CHECKRETURN(5);	
 | |
|         bits = SHIFT_R(glyphp[22][line],6);
 | |
|         bits |= SHIFT_L(glyphp[23][line],1);
 | |
|         bits |= SHIFT_L(glyphp[24][line],8);
 | |
|         bits |= SHIFT_L(glyphp[25][line],15);
 | |
|         bits |= SHIFT_L(glyphp[26][line],22);
 | |
|         bits |= SHIFT_L(glyphp[27][line],29);
 | |
|         WRITE_IN_BITORDER(base, 5, bits);
 | |
| 	CHECKRETURN(6);	
 | |
|         bits = SHIFT_R(glyphp[27][line],3);
 | |
|         bits |= SHIFT_L(glyphp[28][line],4);
 | |
|         bits |= SHIFT_L(glyphp[29][line],11);
 | |
|         bits |= SHIFT_L(glyphp[30][line],18);
 | |
|         bits |= SHIFT_L(glyphp[31][line],25);
 | |
|         WRITE_IN_BITORDER(base, 6, bits);
 | |
| 	CHECKRETURN(7);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 7;
 | |
| #endif
 | |
|         width -= 224;
 | |
|         glyphp += 32;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 | |
| #ifndef USEASSEMBLER
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth8(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],8);
 | |
|         bits |= SHIFT_L(glyphp[2][line],16);
 | |
|         bits |= SHIFT_L(glyphp[3][line],24);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);
 | |
|         bits = glyphp[4][line];
 | |
|         bits |= SHIFT_L(glyphp[5][line],8);
 | |
|         bits |= SHIFT_L(glyphp[6][line],16);
 | |
|         bits |= SHIFT_L(glyphp[7][line],24);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);
 | |
| #ifndef FIXEDBASE
 | |
|         base += 2;
 | |
| #endif
 | |
| 	width -= 64;
 | |
|         glyphp += 8;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifndef USEASSEMBLER
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth9(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],9);
 | |
|         bits |= SHIFT_L(glyphp[2][line],18);
 | |
|         bits |= SHIFT_L(glyphp[3][line],27);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = SHIFT_R(glyphp[3][line],5);
 | |
|         bits |= SHIFT_L(glyphp[4][line],4);
 | |
|         bits |= SHIFT_L(glyphp[5][line],13);
 | |
|         bits |= SHIFT_L(glyphp[6][line],22);
 | |
|         bits |= SHIFT_L(glyphp[7][line],31);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits = SHIFT_R(glyphp[7][line],1);
 | |
|         bits |= SHIFT_L(glyphp[8][line],8);
 | |
|         bits |= SHIFT_L(glyphp[9][line],17);
 | |
|         bits |= SHIFT_L(glyphp[10][line],26);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
|         bits = SHIFT_R(glyphp[10][line],6);
 | |
|         bits |= SHIFT_L(glyphp[11][line],3);
 | |
|         bits |= SHIFT_L(glyphp[12][line],12);
 | |
|         bits |= SHIFT_L(glyphp[13][line],21);
 | |
|         bits |= SHIFT_L(glyphp[14][line],30);
 | |
|         WRITE_IN_BITORDER(base, 3, bits);
 | |
| 	CHECKRETURN(4);	
 | |
|         bits = SHIFT_R(glyphp[14][line],2);
 | |
|         bits |= SHIFT_L(glyphp[15][line],7);
 | |
|         bits |= SHIFT_L(glyphp[16][line],16);
 | |
|         bits |= SHIFT_L(glyphp[17][line],25);
 | |
|         WRITE_IN_BITORDER(base, 4, bits);
 | |
| 	CHECKRETURN(5);	
 | |
|         bits = SHIFT_R(glyphp[17][line],7);
 | |
|         bits |= SHIFT_L(glyphp[18][line],2);
 | |
|         bits |= SHIFT_L(glyphp[19][line],11);
 | |
|         bits |= SHIFT_L(glyphp[20][line],20);
 | |
|         bits |= SHIFT_L(glyphp[21][line],29);
 | |
|         WRITE_IN_BITORDER(base, 5, bits);
 | |
| 	CHECKRETURN(6);	
 | |
|         bits = SHIFT_R(glyphp[21][line],3);
 | |
|         bits |= SHIFT_L(glyphp[22][line],6);
 | |
|         bits |= SHIFT_L(glyphp[23][line],15);
 | |
|         bits |= SHIFT_L(glyphp[24][line],24);
 | |
|         WRITE_IN_BITORDER(base, 6, bits);
 | |
| 	CHECKRETURN(7);	
 | |
|         bits = SHIFT_R(glyphp[24][line],8);
 | |
|         bits |= SHIFT_L(glyphp[25][line],1);
 | |
|         bits |= SHIFT_L(glyphp[26][line],10);
 | |
|         bits |= SHIFT_L(glyphp[27][line],19);
 | |
|         bits |= SHIFT_L(glyphp[28][line],28);
 | |
|         WRITE_IN_BITORDER(base, 7, bits);
 | |
| 	CHECKRETURN(8);	
 | |
|         bits = SHIFT_R(glyphp[28][line],4);
 | |
|         bits |= SHIFT_L(glyphp[29][line],5);
 | |
|         bits |= SHIFT_L(glyphp[30][line],14);
 | |
|         bits |= SHIFT_L(glyphp[31][line],23);
 | |
|         WRITE_IN_BITORDER(base, 8, bits);
 | |
| 	CHECKRETURN(9);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 9;
 | |
| #endif
 | |
|         width -= 288;
 | |
|         glyphp += 32;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth10(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],10);
 | |
|         bits |= SHIFT_L(glyphp[2][line],20);
 | |
|         bits |= SHIFT_L(glyphp[3][line],30);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = SHIFT_R(glyphp[3][line],2);
 | |
|         bits |= SHIFT_L(glyphp[4][line],8);
 | |
|         bits |= SHIFT_L(glyphp[5][line],18);
 | |
|         bits |= SHIFT_L(glyphp[6][line],28);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits = SHIFT_R(glyphp[6][line],4);
 | |
|         bits |= SHIFT_L(glyphp[7][line],6);
 | |
|         bits |= SHIFT_L(glyphp[8][line],16);
 | |
|         bits |= SHIFT_L(glyphp[9][line],26);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
|         bits =  SHIFT_R(glyphp[9][line],6);
 | |
|         bits |= SHIFT_L(glyphp[10][line],4);
 | |
|         bits |= SHIFT_L(glyphp[11][line],14);
 | |
|         bits |= SHIFT_L(glyphp[12][line],24);
 | |
|         WRITE_IN_BITORDER(base, 3, bits);
 | |
| 	CHECKRETURN(4);	
 | |
|         bits = SHIFT_R(glyphp[12][line],8);
 | |
|         bits |= SHIFT_L(glyphp[13][line],2);
 | |
|         bits |= SHIFT_L(glyphp[14][line],12);
 | |
|         bits |= SHIFT_L(glyphp[15][line],22);
 | |
|         WRITE_IN_BITORDER(base, 4, bits);
 | |
| 	CHECKRETURN(5);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 5;
 | |
| #endif
 | |
|         width -= 160;
 | |
|         glyphp += 16;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth12(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],12);
 | |
|         bits |= SHIFT_L(glyphp[2][line],24);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = SHIFT_R(glyphp[2][line],8);
 | |
|         bits |= SHIFT_L(glyphp[3][line],4);
 | |
|         bits |= SHIFT_L(glyphp[4][line],16);
 | |
|         bits |= SHIFT_L(glyphp[5][line],28);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits = SHIFT_R(glyphp[5][line],4);
 | |
|         bits |= SHIFT_L(glyphp[6][line],8);
 | |
|         bits |= SHIFT_L(glyphp[7][line],20);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 3;
 | |
| #endif
 | |
|         width -= 96;
 | |
|         glyphp += 8;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth14(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],14);
 | |
|         bits |= SHIFT_L(glyphp[2][line],28);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = SHIFT_R(glyphp[2][line],4);
 | |
|         bits |= SHIFT_L(glyphp[3][line],10);
 | |
|         bits |= SHIFT_L(glyphp[4][line],24);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits = SHIFT_R(glyphp[4][line],8);
 | |
|         bits |= SHIFT_L(glyphp[5][line],6);
 | |
|         bits |= SHIFT_L(glyphp[6][line],20);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
|         bits = SHIFT_R(glyphp[6][line],12);
 | |
|         bits |= SHIFT_L(glyphp[7][line],2);
 | |
|         bits |= SHIFT_L(glyphp[8][line],16);
 | |
|         bits |= SHIFT_L(glyphp[9][line],30);
 | |
|         WRITE_IN_BITORDER(base, 3, bits);
 | |
| 	CHECKRETURN(4);	
 | |
|         bits = SHIFT_R(glyphp[9][line],2);
 | |
|         bits |= SHIFT_L(glyphp[10][line],12);
 | |
|         bits |= SHIFT_L(glyphp[11][line],26);
 | |
|         WRITE_IN_BITORDER(base, 4, bits);
 | |
| 	CHECKRETURN(5);	
 | |
|         bits = SHIFT_R(glyphp[11][line],6);
 | |
|         bits |= SHIFT_L(glyphp[12][line],8);
 | |
|         bits |= SHIFT_L(glyphp[13][line],22);
 | |
|         WRITE_IN_BITORDER(base, 5, bits);
 | |
| 	CHECKRETURN(6);	
 | |
|         bits = SHIFT_R(glyphp[13][line],10);
 | |
|         bits |= SHIFT_L(glyphp[14][line],4);
 | |
|         bits |= SHIFT_L(glyphp[15][line],18);
 | |
|         WRITE_IN_BITORDER(base, 6, bits);
 | |
| 	CHECKRETURN(7);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 7;
 | |
| #endif
 | |
|         width -= 224;
 | |
|         glyphp += 16;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth16(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],16);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = glyphp[2][line];
 | |
|         bits |= SHIFT_L(glyphp[3][line],16);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits = glyphp[4][line];
 | |
|         bits |= SHIFT_L(glyphp[5][line],16);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
|         bits = glyphp[6][line];
 | |
|         bits |= SHIFT_L(glyphp[7][line],16);
 | |
|         WRITE_IN_BITORDER(base, 3, bits);
 | |
| 	CHECKRETURN(4);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 4;
 | |
| #endif
 | |
|         width -= 128;	    
 | |
|         glyphp += 8;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth18(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],18);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = SHIFT_R(glyphp[1][line],14);
 | |
|         bits |= SHIFT_L(glyphp[2][line],4);
 | |
|         bits |= SHIFT_L(glyphp[3][line],22);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits = SHIFT_R(glyphp[3][line],10);
 | |
|         bits |= SHIFT_L(glyphp[4][line],8);
 | |
|         bits |= SHIFT_L(glyphp[5][line],26);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
|         bits = SHIFT_R(glyphp[5][line],6);
 | |
|         bits |= SHIFT_L(glyphp[6][line],12);
 | |
|         bits |= SHIFT_L(glyphp[7][line],30);
 | |
|         WRITE_IN_BITORDER(base, 3, bits);
 | |
| 	CHECKRETURN(4);	
 | |
|         bits = SHIFT_R(glyphp[7][line],2);
 | |
|         bits |= SHIFT_L(glyphp[8][line],16);
 | |
|         WRITE_IN_BITORDER(base, 4, bits);
 | |
| 	CHECKRETURN(5);	
 | |
|         bits = SHIFT_R(glyphp[8][line],16);
 | |
|         bits |= SHIFT_L(glyphp[9][line],2);
 | |
|         bits |= SHIFT_L(glyphp[10][line],20);
 | |
|         WRITE_IN_BITORDER(base, 5, bits);
 | |
| 	CHECKRETURN(6);	
 | |
|         bits = SHIFT_R(glyphp[10][line],12);
 | |
|         bits |= SHIFT_L(glyphp[11][line],6);
 | |
|         bits |= SHIFT_L(glyphp[12][line],24);
 | |
|         WRITE_IN_BITORDER(base, 6, bits);
 | |
| 	CHECKRETURN(7);	
 | |
|         bits = SHIFT_R(glyphp[12][line],8);
 | |
|         bits |= SHIFT_L(glyphp[13][line],10);
 | |
|         bits |= SHIFT_L(glyphp[14][line],28);
 | |
|         WRITE_IN_BITORDER(base, 7, bits);
 | |
| 	CHECKRETURN(8);	
 | |
|         bits = SHIFT_R(glyphp[14][line],4);
 | |
|         bits |= SHIFT_L(glyphp[15][line],14);
 | |
|         WRITE_IN_BITORDER(base, 8, bits);
 | |
| 	CHECKRETURN(9);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 9;
 | |
| #endif
 | |
|         width -= 288;
 | |
|         glyphp += 16;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 | |
| static CARD32* 
 | |
| DrawTETextScanlineWidth24(
 | |
|     CARD32 *base,
 | |
|     unsigned int **glyphp,
 | |
|     int line, int width, int glyphwidth )
 | |
| {
 | |
|     while (1) {
 | |
|         unsigned int bits;
 | |
|         bits = glyphp[0][line];
 | |
|         bits |= SHIFT_L(glyphp[1][line],24);
 | |
|         WRITE_IN_BITORDER(base, 0, bits);
 | |
| 	CHECKRETURN(1);	
 | |
|         bits = SHIFT_R(glyphp[1][line],8);
 | |
|         bits |= SHIFT_L(glyphp[2][line],16);
 | |
|         WRITE_IN_BITORDER(base, 1, bits);
 | |
| 	CHECKRETURN(2);	
 | |
|         bits = SHIFT_R(glyphp[2][line],16);
 | |
|         bits |= SHIFT_L(glyphp[3][line],8);
 | |
|         WRITE_IN_BITORDER(base, 2, bits);
 | |
| 	CHECKRETURN(3);	
 | |
| #ifndef FIXEDBASE
 | |
|         base += 3;
 | |
| #endif
 | |
|         width -= 96;
 | |
|         glyphp += 4;
 | |
|     }
 | |
|     return base;
 | |
| }
 | |
| 
 | |
| 
 |