[HarfBuzz] harfbuzz: Branch 'master'
Behdad Esfahbod
behdad at kemper.freedesktop.org
Tue Sep 11 12:36:52 UTC 2018
src/hb-cache.hh | 2 +-
src/hb-ft.cc | 37 +++++++++++++++++--------------------
2 files changed, 18 insertions(+), 21 deletions(-)
New commits:
commit 54998befc43ef38e47b74b3153380adbcf6279d4
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Sep 11 14:35:26 2018 +0200
[ft] Cache advances
I decided to always use the cache, instead of my previous sketch direction
that was to only allocate and use cache if fast advances are not available.
The cache is a mere 1kb, so just use it...
TODO: Invalidate cache on font size change.
Fixes https://github.com/harfbuzz/harfbuzz/issues/651
Fixes https://github.com/harfbuzz/harfbuzz/pull/1082
diff --git a/src/hb-cache.hh b/src/hb-cache.hh
index 0858e11b..f8581b4d 100644
--- a/src/hb-cache.hh
+++ b/src/hb-cache.hh
@@ -36,7 +36,7 @@ template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bit
struct hb_cache_t
{
static_assert ((key_bits >= cache_bits), "");
- static_assert ((key_bits + value_bits - cache_bits < 8 * sizeof (unsigned int)), "");
+ static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (unsigned int)), "");
inline void init (void) { clear (); }
inline void fini (void) {}
diff --git a/src/hb-ft.cc b/src/hb-ft.cc
index 856a9f79..121b7159 100644
--- a/src/hb-ft.cc
+++ b/src/hb-ft.cc
@@ -69,6 +69,7 @@ struct hb_ft_font_t
int load_flags;
bool symbol; /* Whether selected cmap is symbol cmap. */
bool unref; /* Whether to destroy ft_face when done. */
+ mutable hb_advance_cache_t advance_cache;
};
static hb_ft_font_t *
@@ -85,6 +86,8 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
+ ft_font->advance_cache.init ();
+
return ft_font;
}
@@ -99,6 +102,8 @@ _hb_ft_font_destroy (void *data)
{
hb_ft_font_t *ft_font = (hb_ft_font_t *) data;
+ ft_font->advance_cache.fini ();
+
if (ft_font->unref)
_hb_ft_face_destroy (ft_font->ft_face);
@@ -239,31 +244,23 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data,
{
const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
FT_Face ft_face = ft_font->ft_face;
- int load_flags;
-
+ int load_flags = ft_font->load_flags;
int mult = font->x_scale < 0 ? -1 : +1;
- unsigned int i = 0;
-
- load_flags = ft_font->load_flags | FT_ADVANCE_FLAG_FAST_ONLY;
- for (; i < count; i++)
+ for (unsigned int i = 0; i < count; i++)
{
FT_Fixed v = 0;
- if (unlikely (FT_Get_Advance (ft_face, *first_glyph, load_flags, &v)))
- goto slow;
- *first_advance = (v * mult + (1<<9)) >> 10;
- first_glyph = &StructAtOffset<hb_codepoint_t> (first_glyph, glyph_stride);
- first_advance = &StructAtOffset<hb_position_t> (first_advance, advance_stride);
- }
- return;
+ hb_codepoint_t glyph = *first_glyph;
+
+ unsigned int cv;
+ if (ft_font->advance_cache.get (glyph, &cv))
+ v = cv;
+ else
+ {
+ FT_Get_Advance (ft_face, glyph, load_flags, &v);
+ ft_font->advance_cache.set (glyph, v);
+ }
-slow:
- /* TODO Prepare and use cache. */
- load_flags = ft_font->load_flags;// & ~FT_ADVANCE_FLAG_FAST_ONLY;
- for (; i < count; i++)
- {
- FT_Fixed v = 0;
- FT_Get_Advance (ft_face, *first_glyph, load_flags, &v);
*first_advance = (v * mult + (1<<9)) >> 10;
first_glyph = &StructAtOffset<hb_codepoint_t> (first_glyph, glyph_stride);
first_advance = &StructAtOffset<hb_position_t> (first_advance, advance_stride);
More information about the HarfBuzz
mailing list