[cairo] Why Doesn’t Cairo Use FT_Reference_Face?
behdad at behdad.org
Sat Mar 7 16:44:25 PST 2015
On 15-03-06 08:28 PM, Lawrence D'Oliveiro wrote:
> There is some really peculiar behaviour in the
> cairo_ft_font_face_create_for_ft_face call
> Cairo wants to keep a reference to the FT_Face, but it seems unable to
> use the FT_Reference_Face call which is provided specifically for that
> So the caller is forced to go through some weird contortions to avoid
> leaking FT_Face objects, or disposing of them prematurely.
Correct. That's because FT_Reference_Face didn't exist until years after the
cairo API was designed.
> Cairo should call FT_Reference_Face on FT_Face objects that are passed
> to it, and balance these with FT_Done_Face calls when it no longer
> needs these references.
> This would be backward-compatible: the user_data shenanigans documented
> on the Cairo API page would not become problematic, they would simply no
> longer be necessary.
That's in fact not true in all situations. For example, if an app caches the
cairo_font_face_t in the FT_Face's generic slot, changing the API as you
suggest with create a circular loop causing leaks. But I'd be happy to ignore
that. I just hate having to explain this version dependency in the docs...
In HarfBuzz I added a new API called _referenced(). I would prefer that to
changing the semantics of existing API. The one-line set_user_data doesn't
bother me that much.
More information about the cairo