[HarfBuzz] How to override Harfbuzz's freetype functions?

Behdad Esfahbod behdad at behdad.org
Tue Feb 1 11:03:01 PST 2011


On 02/01/11 09:56, Tom Hacohen wrote:
> Dear all,
> 
> I ran a test application in callgrind and noticed that the calls to
> FT_Load_Glyph are what slows everything down. We already have glyph
> cache in EFL and I would really like to be able to use it with harfbuzz.
> At first glance, it seems like I can't override harfbuzz's
> hb_ft_get_glyph_advance from the outside, but I have to implement my own
> class and put it in harfbuzz, which is less than convinient.

The way this is supposed to work is that you create your own font callbacks
that *wrap* the original ones.  You

  hb_font_funcs_t *new_funcs, *orig_funcs;
  hb_destroy_func_t orig_destroy;
  void *orig_user_data;

  new_funcs = hb_font_funcs_create ();

  /* set funcs in new_funcs */

  hb_font_unset_funcs (font, &orig_funcs, &orig_destroy, &orig_user_data);

  /* save orig_funcs, orig_destroy, and orig_user_data in new_user_data */

  hb_font_set_funcs (font, new_funcs, new_user_data, new_destroy);


Then in your callbacks, you can use orig_funcs and orig_user_data to call into
harfbuzz to get the value, and cache it.


I'm not quite satisfied with this scheme.  The problem with it is that if/when
new callbacks are added to hb_font_funcs_t, your code needs to be updated to
relay those.  Would have been much nicer if they falled through automatically
(so you could in essence really subclass a font_funcs_t).  I'll think more
about it to see if I can make that happen.

behdad


> I'd very much like to be able to do that, because using my cache will
> make everything a lot faster.
> 
> Are my observations correct?
> 
> How do you guys (that use harfbuzz in other projects) solve it?
> 
> Thanks,
> Tom.
> 
> _______________________________________________
> HarfBuzz mailing list
> HarfBuzz at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/harfbuzz
> 



More information about the HarfBuzz mailing list