9 #define TOFLOAT(x) (((x) >> 6) + ((x) & 63)/64.0)
11 void GlftRenderGlyph(FT_Face face, struct GlftGlyph *g)
13 unsigned char *padbuf;
15 FT_GlyphSlot slot = face->glyph;
17 err = FT_Render_Glyph(slot, ft_render_mode_normal);
20 g->texw = slot->bitmap.width;
21 g->texh = slot->bitmap.rows;
23 g->left = slot->bitmap_left;
25 g->yoff = slot->bitmap.rows - slot->bitmap_top;
27 while (g->padx < slot->bitmap.width)
31 while (g->pady < slot->bitmap.rows)
34 padbuf = g_new0(unsigned char, g->padx * g->pady);
35 for (i = 0; i < slot->bitmap.rows; i++)
36 memcpy(padbuf + i*g->padx,
37 slot->bitmap.buffer + i*slot->bitmap.width,
39 glBindTexture(GL_TEXTURE_2D, g->tnum);
40 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
41 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
42 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
43 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
44 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
45 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
46 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, g->padx, g->pady,
47 0, GL_GREEN, GL_UNSIGNED_BYTE, padbuf);
52 void GlftRenderString(struct GlftFont *font, const char *str, int bytes,
56 struct GlftGlyph *g, *p = NULL;
58 if (!g_utf8_validate(str, bytes, NULL)) {
59 GlftDebug("Invalid UTF-8 in string\n");
66 while (c - str < bytes) {
67 g = GlftFontGlyph(font, c);
69 glTranslatef(GlftFontAdvance(font, p, g), 0.0, 0.0);
70 glBindTexture(GL_TEXTURE_2D, g->tnum);
72 glColor3f(1.0, 1.0, 1.0);
74 glTexCoord2f(0, g->texh/(float)g->pady);
75 glVertex2i(g->left, 0 - g->yoff);
77 glTexCoord2f(g->texw/(float)g->padx, g->texh/(float)g->pady);
78 glVertex2i(g->left + g->texw, 0 - g->yoff);
80 glTexCoord2f(g->texw/(float)g->padx, 0);
81 glVertex2i(g->left + g->texw, g->texh - g->yoff);
84 glVertex2i(g->left, g->texh - g->yoff);
87 glTranslatef(font->max_advance_width, 0.0, 0.0);
89 c = g_utf8_next_char(c);
95 void GlftMeasureString(struct GlftFont *font,
102 struct GlftGlyph *g, *p = NULL;
104 if (!g_utf8_validate(str, bytes, NULL)) {
105 GlftDebug("Invalid UTF-8 in string\n");
113 while (c - str < bytes) {
114 g = GlftFontGlyph(font, c);
116 *w += GlftFontAdvance(font, p, g);
117 *h = MAX(g->height, *h);
119 *w += font->max_advance_width;
121 c = g_utf8_next_char(c);