10 #define TOFLOAT(x) (((x) >> 6) + ((x) & 63)/64.0)
12 void GlftRenderGlyph(FT_Face face, struct GlftGlyph *g)
14 unsigned char *padbuf;
16 FT_GlyphSlot slot = face->glyph;
18 err = FT_Render_Glyph(slot, ft_render_mode_normal);
21 g->texw = slot->bitmap.width;
22 g->texh = slot->bitmap.rows;
24 g->left = slot->bitmap_left;
26 g->yoff = slot->bitmap.rows - slot->bitmap_top;
28 while (g->padx < slot->bitmap.width)
32 while (g->pady < slot->bitmap.rows)
35 padbuf = g_new0(unsigned char, g->padx * g->pady);
36 for (i = 0; i < slot->bitmap.rows; i++)
37 memcpy(padbuf + i*g->padx,
38 slot->bitmap.buffer + i*slot->bitmap.width,
40 glBindTexture(GL_TEXTURE_2D, g->tnum);
41 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
42 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
43 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
44 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
45 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
46 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
47 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, g->padx, g->pady,
48 0, GL_ALPHA, GL_UNSIGNED_BYTE, padbuf);
53 void GlftRenderString(struct GlftFont *font, const char *str, int bytes,
54 struct GlftColor *color, int x, int y)
57 struct GlftGlyph *g, *p = NULL;
59 if (!g_utf8_validate(str, bytes, NULL)) {
60 GlftDebug("Invalid UTF-8 in string\n");
64 glColor4f(color->r, color->g, color->b, color->a);
66 glTranslatef(x, y, 0.0);
68 while (c - str < bytes) {
69 g = GlftFontGlyph(font, c);
71 glTranslatef(GlftFontAdvance(font, p, g), 0.0, 0.0);
72 glBindTexture(GL_TEXTURE_2D, g->tnum);
76 glTexCoord2f(0, g->texh/(float)g->pady);
77 glVertex2i(g->left, 0 - g->yoff);
79 glTexCoord2f(g->texw/(float)g->padx, g->texh/(float)g->pady);
80 glVertex2i(g->left + g->texw, 0 - g->yoff);
82 glTexCoord2f(g->texw/(float)g->padx, 0);
83 glVertex2i(g->left + g->texw, g->texh - g->yoff);
86 glVertex2i(g->left, g->texh - g->yoff);
89 glTranslatef(font->max_advance_width, 0.0, 0.0);
91 c = g_utf8_next_char(c);
97 void GlftMeasureString(struct GlftFont *font,
104 struct GlftGlyph *g, *p = NULL;
106 if (!g_utf8_validate(str, bytes, NULL)) {
107 GlftDebug("Invalid UTF-8 in string\n");
115 while (c - str < bytes) {
116 g = GlftFontGlyph(font, c);
118 *w += GlftFontAdvance(font, p, g);
119 *h = MAX(g->height, *h);
121 *w += font->max_advance_width;
123 c = g_utf8_next_char(c);