9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync/* Copyright (c) 2001, Stanford University
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync * All rights reserved
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync * See the file LICENSE.txt for information on redistributing this software.
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync/** code borrowed from Mesa */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync/** Fill a BITMAP with a character C from thew current font
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync in the graphics context GC. WIDTH is the width in bytes
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync and HEIGHT is the height in bits.
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync Note that the generated bitmaps must be used with
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync glPixelStorei (GL_UNPACK_SWAP_BYTES, GL_FALSE);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync glPixelStorei (GL_UNPACK_LSB_FIRST, GL_FALSE);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync Possible optimizations:
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync * use only one reusable pixmap with the maximum dimensions.
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync * draw the entire font into a single pixmap (careful with
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync proportional fonts!).
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync * Generate OpenGL-compatible bitmap.
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync unsigned int x, y;
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync pixmap = XCreatePixmap(dpy, win, 8*width, height, 1);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync XFillRectangle(dpy, pixmap, gc, 0, 0, 8*width, height);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync XDrawString16(dpy, pixmap, gc, x0, y0, &char2b, 1);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync image = XGetImage(dpy, pixmap, 0, 0, 8*width, height, 1, XYPixmap);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* Fill the bitmap (X11 and OpenGL are upside down wrt each other). */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync for (y = 0; y < height; y++)
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync bitmap[width*(height - y - 1) + x/8] |= (1 << (7 - (x % 8)));
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync * determine if a given glyph is valid and return the
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync * corresponding XCharStruct.
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsyncstatic XCharStruct *isvalid(XFontStruct *fs, unsigned int which)
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync pages = fs->max_char_or_byte2 - fs->min_char_or_byte2 + 1;
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* "linear" fonts */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* "matrix" fonts */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* "linear" fonts */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync return fs->per_char + (which-fs->min_char_or_byte2);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* "matrix" fonts */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsyncvoid stubUseXFont( Display *dpy, Font font, int first, int count, int listbase )
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync unsigned int max_width, max_height, max_bm_width, max_bm_height;
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync crWarning("Couldn't get font structure information");
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* Allocate a bitmap that can fit all characters. */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync max_width = fs->max_bounds.rbearing - fs->min_bounds.lbearing;
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync max_height = fs->max_bounds.ascent + fs->max_bounds.descent;
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync bm = (GLubyte *) crAlloc((max_bm_width * max_bm_height) * sizeof(GLubyte));
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync crWarning("Couldn't allocate bitmap in glXUseXFont()");
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* Save the current packing mode for bitmaps. */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* Enforce a standard packing mode which is compatible with
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync fill_bitmap() from above. This is actually the default mode,
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync except for the (non)alignment. */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync values.foreground = BlackPixel(dpy, DefaultScreen (dpy));
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync values.background = WhitePixel(dpy, DefaultScreen (dpy));
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync for (i = 0; i < count; i++) {
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync unsigned int c = first + i;
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* check on index validity and get the bounds */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* glBitmap()' parameters:
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync straight from the glXUseXFont(3) manpage. */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync y0 = ch->descent - 0; /* XXX used to subtract 1 here */
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* but that caused a conformance failure */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* X11's starting point. */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* Round the width to a multiple of eight. We will use this also
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync for the pixmap for capturing the X11 font. This is slightly
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync inefficient, but it makes the OpenGL part real easy. */
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync fill_bitmap(dpy, win, gc, bm_width, bm_height, x, y, c, bm);
9a4748c9b04aa33bb54066d49bd27d4c9f0cf33evboxsync /* Restore saved packing modes. */