From 5b2d2b6bb0ef6d122a7cc54de4a33c49fb4945f2 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Thu, 29 May 2003 22:45:35 +0000 Subject: [PATCH] aa fonts. yay. --- glft/font.c | 2 +- glft/font.h | 4 +++- glft/render.c | 51 ++++++++++++++++++++++++++------------------------- glft/render.h | 4 +++- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/glft/font.c b/glft/font.c index b9779d8a..61ff0800 100644 --- a/glft/font.c +++ b/glft/font.c @@ -289,7 +289,7 @@ struct GlftGlyph *GlftFontGlyph(struct GlftFont *font, const char *c) g->w = w; glGenTextures(1, &g->tnum); - GlftRenderGlyph(font->face, g->tnum); + GlftRenderGlyph(font->face, g); if (!(font->spacing == FC_PROPORTIONAL)) { g->width = font->max_advance_width; diff --git a/glft/font.h b/glft/font.h index 0059913f..2494358e 100644 --- a/glft/font.h +++ b/glft/font.h @@ -47,7 +47,7 @@ struct GlftFont { struct GlftGlyph { /* The character in UCS-4 encoding */ FcChar32 w; - /* OpenGL display list for the character */ + /* OpenGL texture for the character */ unsigned int tnum; /* The FT_Face glyph */ FT_UInt glyph; @@ -56,6 +56,8 @@ struct GlftGlyph { int y; int width; int height; + + int padx, pady; }; /*! Takes a character in UTF-8 encoding and returns an OpenGL display list diff --git a/glft/render.c b/glft/render.c index d4252442..e0157761 100644 --- a/glft/render.c +++ b/glft/render.c @@ -8,35 +8,36 @@ #define TOFLOAT(x) (((x) >> 6) + ((x) & 63)/64.0) -void GlftRenderGlyph(FT_Face face, unsigned int tnum) +void GlftRenderGlyph(FT_Face face, struct GlftGlyph *g) { unsigned char *padbuf; - int padx = 1, pady = 1, i; - int err; + int err, i; FT_GlyphSlot slot = face->glyph; - err = FT_Render_Glyph( slot, ft_render_mode_normal ); + err = FT_Render_Glyph(slot, ft_render_mode_normal); g_assert(!err); - printf("bitmap with dims %d, %d\n", slot->bitmap.rows, - slot->bitmap.width); - while (padx < slot->bitmap.width) - padx <<= 1; - while (pady < slot->bitmap.rows) - pady <<= 1; - printf("padding to %d, %d\n", padx, pady); - padbuf = g_new(unsigned char, padx * pady); + + g->padx = 1; + while (g->padx < slot->bitmap.width) + g->padx <<= 1; + + g->pady = 1; + while (g->pady < slot->bitmap.rows) + g->pady <<= 1; + + padbuf = g_new0(unsigned char, g->padx * g->pady); for (i = 0; i < slot->bitmap.rows; i++) - memcpy(padbuf + i*padx, + memcpy(padbuf + i*g->padx, slot->bitmap.buffer + i*slot->bitmap.width, slot->bitmap.width); - glBindTexture(GL_TEXTURE_2D, tnum); + glBindTexture(GL_TEXTURE_2D, g->tnum); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, padx, pady, + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, g->padx, g->pady, 0, GL_GREEN, GL_UNSIGNED_BYTE, padbuf); g_free(padbuf); @@ -62,19 +63,19 @@ void GlftRenderString(struct GlftFont *font, const char *str, int bytes, glTranslatef(GlftFontAdvance(font, p, g), 0.0, 0.0); glBindTexture(GL_TEXTURE_2D, g->tnum); glBegin(GL_QUADS); - glColor3f(1.0, 1.0, 1.0); + glColor3f(0.0, 0.0, 0.0); - glTexCoord2i(0, 1); - glVertex2i(g->x, g->y); + glTexCoord2f(0, g->height/(float)g->pady); + glVertex2i(0, 0); - glTexCoord2i(1, 1); - glVertex2i(g->x + g->width, g->y); + glTexCoord2f(g->width/(float)g->padx, g->height/(float)g->pady); + glVertex2i(0 + g->width, 0); - glTexCoord2i(1, 0); - glVertex2i(g->x + g->width ,g->y + g->height); + glTexCoord2f(g->width/(float)g->padx, 0); + glVertex2i(0 + g->width, 0 + g->height); - glTexCoord2i(0, 0); - glVertex2i(g->x, g->y + g->height); + glTexCoord2f(0, 0); + glVertex2i(0, 0 + g->height); glEnd(); } else glTranslatef(font->max_advance_width, 0.0, 0.0); diff --git a/glft/render.h b/glft/render.h index 191a53b9..facdb41b 100644 --- a/glft/render.h +++ b/glft/render.h @@ -4,6 +4,8 @@ #include #include FT_FREETYPE_H -void GlftRenderGlyph(FT_Face face, unsigned int tnum); +#include "font.h" + +void GlftRenderGlyph(FT_Face face, struct GlftGlyph *g); #endif -- 2.34.1