- Screen *screen = DefaultScreenOfDisplay (dpy);
- Window root = RootWindowOfScreen (screen);
- XGCValues gcv;
- GC gc;
- Pixmap p;
- int cw = f->max_bounds.rbearing - f->min_bounds.lbearing;
- int ch = f->max_bounds.ascent + f->max_bounds.descent;
- int w = cw * 16;
- int h = ch * 16;
- int i;
-
- data->cell_width = cw;
- data->cell_height = ch;
-
- p = XCreatePixmap (dpy, root, w, h, 1);
- gcv.font = f->fid;
- gcv.foreground = 0;
- gcv.background = 0;
- gc = XCreateGC (dpy, p, (GCFont|GCForeground|GCBackground), &gcv);
- XFillRectangle (dpy, p, gc, 0, 0, w, h);
- XSetForeground (dpy, gc, 1);
- for (i = 0; i < 256; i++)
- {
- char c = (char) i;
- int x = (i % 16) * cw;
- int y = (i / 16) * ch;
-
- /* See comment in print_texture_string for bit layout explanation. */
-
- int lbearing = (f->per_char
- ? f->per_char[i - f->min_char_or_byte2].lbearing
- : f->min_bounds.lbearing);
- int ascent = (f->per_char
- ? f->per_char[i - f->min_char_or_byte2].ascent
- : f->max_bounds.ascent);
- int width = (f->per_char
- ? f->per_char[i - f->min_char_or_byte2].width
- : f->max_bounds.width);
-
- if (width == 0) continue;
- XDrawString (dpy, p, gc, x - lbearing, y + ascent, &c, 1);
- }
- XFreeGC (dpy, gc);
+ int w = to_pow2 (16 * (f->max_bounds.rbearing - f->min_bounds.lbearing));
+ int h = to_pow2 (16 * (f->max_bounds.ascent + f->max_bounds.descent));
+ int i = (w > h ? w : h);
+
+ if (i <= 512) data->grid_mag = 1; /* 1 tex of 16x16 chars */
+ else if (i <= 1024) data->grid_mag = 2; /* 4 tex of 8x8 chars */
+ else if (i <= 2048) data->grid_mag = 4; /* 16 tex of 4x4 chars */
+ else data->grid_mag = 8; /* 32 tex of 2x2 chars */
+
+ data->ntextures = data->grid_mag * data->grid_mag;
+
+# if 0
+ fprintf (stderr,
+ "%s: %dx%d grid of %d textures of %dx%d chars (%dx%d bits)\n",
+ progname,
+ data->grid_mag, data->grid_mag,
+ data->ntextures,
+ 16 / data->grid_mag, 16 / data->grid_mag,
+ i, i);
+# endif
+ }
+
+ for (which = 0; which < data->ntextures; which++)
+ {
+ /* Create a pixmap big enough to fit every character in the font.
+ (modulo the "ntextures" scaling.)
+ Make it square-ish, since GL likes dimensions to be powers of 2.
+ */
+ Screen *screen = DefaultScreenOfDisplay (dpy);
+ Window root = RootWindowOfScreen (screen);
+ XGCValues gcv;
+ GC gc;
+ Pixmap p;
+ int cw = f->max_bounds.rbearing - f->min_bounds.lbearing;
+ int ch = f->max_bounds.ascent + f->max_bounds.descent;
+ int grid_size = (16 / data->grid_mag);
+ int w = cw * grid_size;
+ int h = ch * grid_size;
+ int i;
+
+ data->cell_width = cw;
+ data->cell_height = ch;
+
+ p = XCreatePixmap (dpy, root, w, h, 1);
+ gcv.font = f->fid;
+ gcv.foreground = 0;
+ gcv.background = 0;
+ gc = XCreateGC (dpy, p, (GCFont|GCForeground|GCBackground), &gcv);
+ XFillRectangle (dpy, p, gc, 0, 0, w, h);
+ XSetForeground (dpy, gc, 1);
+ for (i = 0; i < 256 / data->ntextures; i++)
+ {
+ int ii = (i + (which * 256 / data->ntextures));
+ char c = (char) ii;
+ int x = (i % grid_size) * cw;
+ int y = (i / grid_size) * ch;