diff options
Diffstat (limited to 'xorg-server/glx/xfont.c')
-rw-r--r-- | xorg-server/glx/xfont.c | 151 |
1 files changed, 78 insertions, 73 deletions
diff --git a/xorg-server/glx/xfont.c b/xorg-server/glx/xfont.c index dde0d14b5..47ddf8f7c 100644 --- a/xorg-server/glx/xfont.c +++ b/xorg-server/glx/xfont.c @@ -52,16 +52,18 @@ /* ** Make a single GL bitmap from a single X glyph */ -static int __glXMakeBitmapFromGlyph(FontPtr font, CharInfoPtr pci) +static int +__glXMakeBitmapFromGlyph(FontPtr font, CharInfoPtr pci) { int i, j; - int widthPadded; /* width of glyph in bytes, as padded by X */ - int allocBytes; /* bytes to allocate to store bitmap */ - int w; /* width of glyph in bits */ - int h; /* height of glyph */ + int widthPadded; /* width of glyph in bytes, as padded by X */ + int allocBytes; /* bytes to allocate to store bitmap */ + int w; /* width of glyph in bits */ + int h; /* height of glyph */ register unsigned char *pglyph; register unsigned char *p; unsigned char *allocbuf; + #define __GL_CHAR_BUF_SIZE 2048 unsigned char buf[__GL_CHAR_BUF_SIZE]; @@ -70,35 +72,36 @@ static int __glXMakeBitmapFromGlyph(FontPtr font, CharInfoPtr pci) widthPadded = GLYPHWIDTHBYTESPADDED(pci); /* - ** Use the local buf if possible, otherwise malloc. - */ + ** Use the local buf if possible, otherwise malloc. + */ allocBytes = widthPadded * h; if (allocBytes <= __GL_CHAR_BUF_SIZE) { - p = buf; - allocbuf = 0; - } else { - p = (unsigned char *) malloc(allocBytes); - if (!p) - return BadAlloc; - allocbuf = p; + p = buf; + allocbuf = 0; + } + else { + p = (unsigned char *) malloc(allocBytes); + if (!p) + return BadAlloc; + allocbuf = p; } /* - ** We have to reverse the picture, top to bottom - */ - - pglyph = FONTGLYPHBITS(FONTGLYPHS(font), pci) + (h-1)*widthPadded; - for (j=0; j < h; j++) { - for (i=0; i < widthPadded; i++) { - p[i] = pglyph[i]; - } - pglyph -= widthPadded; - p += widthPadded; + ** We have to reverse the picture, top to bottom + */ + + pglyph = FONTGLYPHBITS(FONTGLYPHS(font), pci) + (h - 1) * widthPadded; + for (j = 0; j < h; j++) { + for (i = 0; i < widthPadded; i++) { + p[i] = pglyph[i]; + } + pglyph -= widthPadded; + p += widthPadded; } - CALL_Bitmap( GET_DISPATCH(), (w, h, -pci->metrics.leftSideBearing, - pci->metrics.descent, - pci->metrics.characterWidth, 0, - allocbuf ? allocbuf : buf) ); + CALL_Bitmap(GET_DISPATCH(), (w, h, -pci->metrics.leftSideBearing, + pci->metrics.descent, + pci->metrics.characterWidth, 0, + allocbuf ? allocbuf : buf)); free(allocbuf); return Success; @@ -110,46 +113,48 @@ static int __glXMakeBitmapFromGlyph(FontPtr font, CharInfoPtr pci) ** in a display list. */ -static int +static int MakeBitmapsFromFont(FontPtr pFont, int first, int count, int list_base) { - unsigned long i, nglyphs; - CARD8 chs[2]; /* the font index we are going after */ - CharInfoPtr pci; - int rv; /* return value */ + unsigned long i, nglyphs; + CARD8 chs[2]; /* the font index we are going after */ + CharInfoPtr pci; + int rv; /* return value */ int encoding = (FONTLASTROW(pFont) == 0) ? Linear16Bit : TwoD16Bit; - - CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, FALSE) ); - CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_LSB_FIRST, BITMAP_BIT_ORDER == LSBFirst) ); - CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH, 0) ); - CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) ); - CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) ); - CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ALIGNMENT, GLYPHPADBYTES) ); - for (i=0; i < count; i++) { - chs[0] = (first + i) >> 8; /* high byte is first byte */ - chs[1] = first + i; - - (*pFont->get_glyphs)(pFont, 1, chs, (FontEncoding)encoding, - &nglyphs, &pci); - - /* - ** Define a display list containing just a glBitmap() call. - */ - CALL_NewList( GET_DISPATCH(), (list_base + i, GL_COMPILE) ); - if (nglyphs ) { - rv = __glXMakeBitmapFromGlyph(pFont, pci); - if (rv) { - return rv; - } - } - CALL_EndList( GET_DISPATCH(), () ); + + CALL_PixelStorei(GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, FALSE)); + CALL_PixelStorei(GET_DISPATCH(), + (GL_UNPACK_LSB_FIRST, BITMAP_BIT_ORDER == LSBFirst)); + CALL_PixelStorei(GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH, 0)); + CALL_PixelStorei(GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0)); + CALL_PixelStorei(GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0)); + CALL_PixelStorei(GET_DISPATCH(), (GL_UNPACK_ALIGNMENT, GLYPHPADBYTES)); + for (i = 0; i < count; i++) { + chs[0] = (first + i) >> 8; /* high byte is first byte */ + chs[1] = first + i; + + (*pFont->get_glyphs) (pFont, 1, chs, (FontEncoding) encoding, + &nglyphs, &pci); + + /* + ** Define a display list containing just a glBitmap() call. + */ + CALL_NewList(GET_DISPATCH(), (list_base + i, GL_COMPILE)); + if (nglyphs) { + rv = __glXMakeBitmapFromGlyph(pFont, pci); + if (rv) { + return rv; + } + } + CALL_EndList(GET_DISPATCH(), ()); } return Success; } /************************************************************************/ -int __glXDisp_UseXFont(__GLXclientState *cl, GLbyte *pc) +int +__glXDisp_UseXFont(__GLXclientState * cl, GLbyte * pc) { ClientPtr client = cl->client; xGLXUseXFontReq *req; @@ -163,28 +168,28 @@ int __glXDisp_UseXFont(__GLXclientState *cl, GLbyte *pc) req = (xGLXUseXFontReq *) pc; cx = __glXForceCurrent(cl, req->contextTag, &error); if (!cx) { - return error; + return error; } - CALL_GetIntegerv( GET_DISPATCH(), (GL_LIST_INDEX, (GLint*) ¤tListIndex) ); + CALL_GetIntegerv(GET_DISPATCH(), + (GL_LIST_INDEX, (GLint *) & currentListIndex)); if (currentListIndex != 0) { - /* - ** A display list is currently being made. It is an error - ** to try to make a font during another lists construction. - */ - client->errorValue = cx->id; - return __glXError(GLXBadContextState); + /* + ** A display list is currently being made. It is an error + ** to try to make a font during another lists construction. + */ + client->errorValue = cx->id; + return __glXError(GLXBadContextState); } /* - ** Font can actually be either the ID of a font or the ID of a GC - ** containing a font. - */ + ** Font can actually be either the ID of a font or the ID of a GC + ** containing a font. + */ error = dixLookupFontable(&pFont, req->font, client, DixReadAccess); if (error != Success) - return error; + return error; - return MakeBitmapsFromFont(pFont, req->first, req->count, - req->listBase); + return MakeBitmapsFromFont(pFont, req->first, req->count, req->listBase); } |