90 lines
2.3 KiB
C
Executable File
90 lines
2.3 KiB
C
Executable File
#include "utils.h"
|
|
/*
|
|
* Generate OpenGL-compatible bitmap.
|
|
* From Mesa-9.0.1
|
|
*/
|
|
|
|
void
|
|
fill_bitmap(Display * dpy, Window win, GC gc,
|
|
unsigned int width, unsigned int height,
|
|
int x0, int y0, unsigned int c, GLubyte * bitmap)
|
|
{
|
|
XImage *image;
|
|
unsigned int x, y;
|
|
Pixmap pixmap;
|
|
XChar2b char2b;
|
|
|
|
pixmap = XCreatePixmap(dpy, win, 8 * width, height, 1);
|
|
XSetForeground(dpy, gc, 0);
|
|
XFillRectangle(dpy, pixmap, gc, 0, 0, 8 * width, height);
|
|
XSetForeground(dpy, gc, 1);
|
|
|
|
char2b.byte1 = (c >> 8) & 0xff;
|
|
char2b.byte2 = (c & 0xff);
|
|
|
|
XDrawString16(dpy, pixmap, gc, x0, y0, &char2b, 1);
|
|
|
|
image = XGetImage(dpy, pixmap, 0, 0, 8 * width, height, 1, XYPixmap);
|
|
if (image) {
|
|
/* Fill the bitmap (X11 and OpenGL are upside down wrt each other). */
|
|
for (y = 0; y < height; y++)
|
|
for (x = 0; x < 8 * width; x++)
|
|
if (XGetPixel(image, x, y))
|
|
bitmap[width * (height - y - 1) + x / 8] |=
|
|
(1 << (7 - (x % 8)));
|
|
XDestroyImage(image);
|
|
}
|
|
|
|
XFreePixmap(dpy, pixmap);
|
|
}
|
|
/*
|
|
* determine if a given glyph is valid and return the
|
|
* corresponding XCharStruct.
|
|
* From MesaGL-9.0.1
|
|
*/
|
|
XCharStruct *
|
|
isvalid(XFontStruct * fs, int which)
|
|
{
|
|
unsigned int rows, pages;
|
|
int byte1 = 0, byte2 = 0;
|
|
int i, valid = 1;
|
|
|
|
rows = fs->max_byte1 - fs->min_byte1 + 1;
|
|
pages = fs->max_char_or_byte2 - fs->min_char_or_byte2 + 1;
|
|
|
|
if (rows == 1) {
|
|
/* "linear" fonts */
|
|
if ((fs->min_char_or_byte2 > which) || (fs->max_char_or_byte2 < which))
|
|
valid = 0;
|
|
}
|
|
else {
|
|
/* "matrix" fonts */
|
|
byte2 = which & 0xff;
|
|
byte1 = which >> 8;
|
|
if ((fs->min_char_or_byte2 > byte2) ||
|
|
(fs->max_char_or_byte2 < byte2) ||
|
|
(fs->min_byte1 > byte1) || (fs->max_byte1 < byte1))
|
|
valid = 0;
|
|
}
|
|
|
|
if (valid) {
|
|
if (fs->per_char) {
|
|
if (rows == 1) {
|
|
/* "linear" fonts */
|
|
return (fs->per_char + (which - fs->min_char_or_byte2));
|
|
}
|
|
else {
|
|
/* "matrix" fonts */
|
|
i = ((byte1 - fs->min_byte1) * pages) +
|
|
(byte2 - fs->min_char_or_byte2);
|
|
return (fs->per_char + i);
|
|
}
|
|
}
|
|
else {
|
|
return (&fs->min_bounds);
|
|
}
|
|
}
|
|
return (NULL);
|
|
}
|
|
|