BLF: Save fixed_width value in cache

Cache the font size's ideal fixed width column size in the glyph cache
rather than the font itself to improve performance.

See D13226 for more details.

Differential Revision: https://developer.blender.org/D13226

Reviewed by Campbell Barton
This commit is contained in:
Harley Acheson 2022-02-04 17:49:21 -08:00
parent 2a967d444f
commit bb3bcf744c
3 changed files with 24 additions and 21 deletions

View File

@ -34,7 +34,6 @@
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_ADVANCES_H /* For FT_Get_Advance */
#include "MEM_guardedalloc.h"
@ -826,7 +825,10 @@ float blf_font_height(FontBLF *font,
float blf_font_fixed_width(FontBLF *font)
{
return (float)font->fixed_width;
GlyphCacheBLF *gc = blf_glyph_cache_acquire(font);
float width = (gc) ? (float)gc->fixed_width : font->size / 2.0f;
blf_glyph_cache_release(font);
return width;
}
static void blf_font_boundbox_foreach_glyph_ex(FontBLF *font,
@ -1369,22 +1371,6 @@ void blf_font_size(FontBLF *font, float size, unsigned int dpi)
}
blf_glyph_cache_release(font);
/* Set fixed-width size for monospaced output. */
FT_UInt gindex = FT_Get_Char_Index(font->face, U'0');
if (gindex) {
FT_Fixed advance = 0;
FT_Get_Advance(font->face, gindex, FT_LOAD_NO_HINTING, &advance);
/* Use CSS 'ch unit' width, advance of zero character. */
font->fixed_width = (int)(advance >> 16);
}
else {
/* Font does not contain "0" so use CSS fallback of 1/2 of em. */
font->fixed_width = (int)((font->face->size->metrics.height / 2) >> 6);
}
if (font->fixed_width < 1) {
font->fixed_width = 1;
}
}
/** \} */

View File

@ -34,6 +34,7 @@
#include FT_GLYPH_H
#include FT_OUTLINE_H
#include FT_BITMAP_H
#include FT_ADVANCES_H /* For FT_Get_Advance. */
#include "MEM_guardedalloc.h"
@ -100,6 +101,22 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
memset(gc->glyph_ascii_table, 0, sizeof(gc->glyph_ascii_table));
memset(gc->bucket, 0, sizeof(gc->bucket));
/* Determine ideal fixed-width size for monospaced output. */
FT_UInt gindex = FT_Get_Char_Index(font->face, U'0');
if (gindex) {
FT_Fixed advance = 0;
FT_Get_Advance(font->face, gindex, FT_LOAD_NO_HINTING, &advance);
/* Use CSS 'ch unit' width, advance of zero character. */
gc->fixed_width = (int)(advance >> 16);
}
else {
/* Font does not contain "0" so use CSS fallback of 1/2 of em. */
gc->fixed_width = (int)((font->face->size->metrics.height / 2) >> 6);
}
if (gc->fixed_width < 1) {
gc->fixed_width = 1;
}
BLI_addhead(&font->cache, gc);
return gc;
}

View File

@ -73,6 +73,9 @@ typedef struct GlyphCacheBLF {
bool bold;
bool italic;
/* Column width when printing monospaced. */
int fixed_width;
/* and the glyphs. */
ListBase bucket[257];
@ -207,9 +210,6 @@ typedef struct FontBLF {
/* font size. */
float size;
/* Column width when printing monospaced. */
int fixed_width;
/* max texture size. */
int tex_size_max;