diff options
Diffstat (limited to 'source/blender/blenfont/intern/blf_font.c')
-rw-r--r-- | source/blender/blenfont/intern/blf_font.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 0f93f2ca07b..ed92e9aaff2 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -1201,6 +1201,84 @@ float blf_font_fixed_width(FontBLF *font) return g->advance; } +/* -------------------------------------------------------------------- */ +/** \name Glyph Bound Box with Callback + * \{ */ + +static void blf_font_boundbox_foreach_glyph_ex(FontBLF *font, + GlyphCacheBLF *gc, + const char *str, + size_t len, + BLF_GlyphBoundsFn user_fn, + void *user_data, + struct ResultBLF *r_info, + int pen_y) +{ + unsigned int c, c_prev = BLI_UTF8_ERR; + GlyphBLF *g, *g_prev = NULL; + int pen_x = 0; + size_t i = 0, i_curr; + rcti gbox; + + if (len == 0) { + /* early output. */ + return; + } + + GlyphBLF **glyph_ascii_table = blf_font_ensure_ascii_table(font, gc); + + BLF_KERNING_VARS(font, has_kerning, kern_mode); + + blf_font_ensure_ascii_kerning(font, gc, kern_mode); + + while ((i < len) && str[i]) { + i_curr = i; + BLF_UTF8_NEXT_FAST(font, gc, g, str, i, c, glyph_ascii_table); + + if (UNLIKELY(c == BLI_UTF8_ERR)) { + break; + } + if (UNLIKELY(g == NULL)) { + continue; + } + if (has_kerning) { + BLF_KERNING_STEP_FAST(font, kern_mode, g_prev, g, c_prev, c, pen_x); + } + + gbox.xmin = pen_x; + gbox.xmax = gbox.xmin + MIN2(g->advance_i, g->width); + gbox.ymin = pen_y; + gbox.ymax = gbox.ymin - g->height; + + pen_x += g->advance_i; + + if (user_fn(str, i_curr, &gbox, g->advance_i, user_data) == false) { + break; + } + + g_prev = g; + c_prev = c; + } + + if (r_info) { + r_info->lines = 1; + r_info->width = pen_x; + } +} +void blf_font_boundbox_foreach_glyph(FontBLF *font, + const char *str, + size_t len, + BLF_GlyphBoundsFn user_fn, + void *user_data, + struct ResultBLF *r_info) +{ + GlyphCacheBLF *gc = blf_glyph_cache_acquire(font); + blf_font_boundbox_foreach_glyph_ex(font, gc, str, len, user_fn, user_data, r_info, 0); + blf_glyph_cache_release(font); +} + +/** \} */ + int blf_font_count_missing_chars(FontBLF *font, const char *str, const size_t len, |