1084 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1084 lines
		
	
	
		
			36 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;
 | |
| }
 |