Fix for aliased fonts in the game engine.
- Mipmaps are generated in BLF when drawing text in-game. In that case, padding around each glyph is increased to prevent bleeding. - Texture filtering is turned on for in-game text. - All glyphs are now "twisted": the leading edge is brought a small distance forward, to prevent z-fighting in overlapping (kerned) glyphs. This happens both in the game engine and the rest of the UI, but should have no effect in the UI due to Z-compression in the clipping matrix. Reviewed and approved by bdiego; see patch [#29882] in the tracker. Tested by dfelinto.
This commit is contained in:
@@ -197,6 +197,7 @@ void BLF_dir_free(char **dirs, int count);
|
||||
#define BLF_KERNING_DEFAULT (1<<3)
|
||||
#define BLF_MATRIX (1<<4)
|
||||
#define BLF_ASPECT (1<<5)
|
||||
#define BLF_TEXFILTER (1<<6)
|
||||
|
||||
#define BLF_DRAW_STR_DUMMY_MAX 1024
|
||||
|
||||
|
||||
@@ -54,6 +54,8 @@
|
||||
#include "blf_internal_types.h"
|
||||
#include "blf_internal.h"
|
||||
|
||||
#define _BLF_PADDING 3
|
||||
#define _BLF_MIPMAP_LEVELS 3
|
||||
|
||||
GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi)
|
||||
{
|
||||
@@ -87,7 +89,11 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
|
||||
gc->cur_tex= -1;
|
||||
gc->x_offs= 0;
|
||||
gc->y_offs= 0;
|
||||
gc->pad= 3;
|
||||
/* Increase padding for each mipmap level: 0->3, 1->4, 2->6, 3->10, ... */
|
||||
if (font->flags & BLF_TEXFILTER)
|
||||
gc->pad= pow(2, _BLF_MIPMAP_LEVELS) + 2;
|
||||
else
|
||||
gc->pad= _BLF_PADDING;
|
||||
|
||||
gc->num_glyphs= font->face->num_glyphs;
|
||||
gc->rem_glyphs= font->face->num_glyphs;
|
||||
@@ -296,13 +302,17 @@ void blf_glyph_free(GlyphBLF *g)
|
||||
|
||||
static void blf_texture_draw(float uv[2][2], float dx, float y1, float dx1, float y2)
|
||||
{
|
||||
|
||||
/* When a string is being rendered as individual glyphs (as in the game
|
||||
* engine), the leading edge needs to be raised a fraction to prevent
|
||||
* z-fighting for kerned characters. - z0r */
|
||||
float twist = (dx1 - dx) * 0.0002;
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(uv[0][0], uv[0][1]);
|
||||
glVertex2f(dx, y1);
|
||||
glVertex3f(dx, y1, twist);
|
||||
|
||||
glTexCoord2f(uv[0][0], uv[1][1]);
|
||||
glVertex2f(dx, y2);
|
||||
glVertex3f(dx, y2, twist);
|
||||
|
||||
glTexCoord2f(uv[1][0], uv[1][1]);
|
||||
glVertex2f(dx1, y2);
|
||||
@@ -405,6 +415,15 @@ int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, g->tex);
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, g->xoff, g->yoff, g->width, g->height, GL_ALPHA, GL_UNSIGNED_BYTE, g->bitmap);
|
||||
if (font->flags & BLF_TEXFILTER) {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,
|
||||
_BLF_MIPMAP_LEVELS);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||
GL_LINEAR_MIPMAP_LINEAR);
|
||||
}
|
||||
glPopClientAttrib();
|
||||
|
||||
g->uv[0][0]= ((float)g->xoff) / ((float)gc->p2_width);
|
||||
|
||||
@@ -136,8 +136,8 @@ void BL_print_game_line(int fontid, const char* text, int size, int dpi, float*
|
||||
/* the actual drawing */
|
||||
glColor4fv(color);
|
||||
|
||||
BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT|BLF_TEXFILTER);
|
||||
/* multiply the text matrix by the object matrix */
|
||||
BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT);
|
||||
BLF_matrix(fontid, mat);
|
||||
|
||||
/* aspect is the inverse scale that allows you to increase */
|
||||
@@ -149,7 +149,7 @@ void BL_print_game_line(int fontid, const char* text, int size, int dpi, float*
|
||||
BLF_position(fontid, 0, 0, 0);
|
||||
BLF_draw(fontid, (char *)text, 65535);
|
||||
|
||||
BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT);
|
||||
BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT|BLF_TEXFILTER);
|
||||
}
|
||||
|
||||
void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int height)
|
||||
|
||||
@@ -294,8 +294,8 @@ void GPC_RenderTools::RenderText3D( int fontid,
|
||||
/* the actual drawing */
|
||||
glColor3fv(color);
|
||||
|
||||
BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT|BLF_TEXFILTER);
|
||||
/* multiply the text matrix by the object matrix */
|
||||
BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT);
|
||||
BLF_matrix(fontid, mat);
|
||||
|
||||
/* aspect is the inverse scale that allows you to increase */
|
||||
@@ -307,7 +307,7 @@ void GPC_RenderTools::RenderText3D( int fontid,
|
||||
BLF_position(fontid, 0, 0, 0);
|
||||
BLF_draw(fontid, text, 65535);
|
||||
|
||||
BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT);
|
||||
BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT|BLF_TEXFILTER);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user