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 static void drawstring(struct GlftFont *font, const char *str, int bytes,
54 struct GlftColor *color, int x, int y)
57 struct GlftGlyph *g, *p = NULL;
59 y += font->descent/2; /* XXX fixme */
61 glColor4f(color->r, color->g, color->b, color->a);
63 glTranslatef(x, y, 0.0);
65 while (c - str < bytes) {
66 g = GlftFontGlyph(font, c);
68 glTranslatef(GlftFontAdvance(font, p, g), 0.0, 0.0);
69 glBindTexture(GL_TEXTURE_2D, g->tnum);
73 glTexCoord2f(0, g->texh/(float)g->pady);
74 glVertex2i(g->left, 0 - g->yoff);
76 glTexCoord2f(g->texw/(float)g->padx, g->texh/(float)g->pady);
77 glVertex2i(g->left + g->texw, 0 - g->yoff);
79 glTexCoord2f(g->texw/(float)g->padx, 0);
80 glVertex2i(g->left + g->texw, g->texh - g->yoff);
83 glVertex2i(g->left, g->texh - g->yoff);
86 glTranslatef(font->max_advance_width, 0.0, 0.0);
88 c = g_utf8_next_char(c);
94 void GlftRenderString(struct GlftFont *font, const char *str, int bytes,
95 struct GlftColor *color, int x, int y)
97 if (!g_utf8_validate(str, bytes, NULL)) {
98 GlftDebug("Invalid UTF-8 in string\n");
102 if (font->shadow && font->shadow_alpha != 0) {
104 if (font->shadow_alpha > 0) {
105 c.r = c.g = c.b = 0.0;
106 c.a = font->shadow_alpha;
108 c.r = c.g = c.b = 1.0;
109 c.a = -font->shadow_alpha;
111 drawstring(font, str, bytes, &c,
112 x + font->shadow_offset, y);
113 y += font->shadow_offset;
115 drawstring(font, str, bytes, color, x, y);
118 void GlftMeasureString(struct GlftFont *font,
125 struct GlftGlyph *g, *p = NULL;
127 if (!g_utf8_validate(str, bytes, NULL)) {
128 GlftDebug("Invalid UTF-8 in string\n");
136 while (c - str < bytes) {
137 g = GlftFontGlyph(font, c);
139 *w += GlftFontAdvance(font, p, g);
140 *h = MAX(g->height, *h);
142 *w += font->max_advance_width;
144 c = g_utf8_next_char(c);
147 *w += font->shadow_offset;
148 *h += font->shadow_offset;