Re: Reference counting of cairo free type face

Julian Viereck <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
> Cairo maintains a holdover cache of the MRU scaled fonts (outside of any
> context) which accounts for the extra references. The
> cairo_font_face_finish() / cairo_scaled_font_finish() interface has been
> proposed to decouple those extra references in a user-controllable way.
> However, in order to hook into the destroy notification for when the
> font is released you want to use cairo_scaled_font_set_user_data().

Thanks a lot for this input Chris.

Is there an upper limit for the fonts being cached? If so, I wouldn't 
bother to have some constant memory overhead for font faces that are no 
longer needed.

Best,

Julian

On Wed Nov 14 10:01:47 2012, Chris Wilson wrote:
> On Tue, 13 Nov 2012 22:17:00 +0100, Julian Viereck <[email protected]> wrote:
>> Hi there,
>>
>> I try to add font support to the node-canvas [1] library, which uses
>> cairo for rendering. I use the freetype2 library to load a font face and
>> then use it in cairo. The font rendering is working, but I got stuck on
>> memory management of the cairo font face. In particular, the cairo font
>> face's reference counter is not reset to 1 at the point I expect it to be.
>>
>> Here's what I'm doing. I concentrate on the essential parts only. Let
>> "ref(cr_face)" be "cairo_font_face_get_reference_count(cr_face)" to get
>> the internal reference counter for the cairo font face.
>>
>>       // Create a free type font face from a font file.
>>       FT_New_Face(library, *filePath, faceIdx, &ft_face);
>>       // Create a cairo font face.
>>       cr_face = cairo_ft_font_face_create_for_ft_face(ft_face, 0);
>>
>>       // At this point ref(cr_face) == 1.
>>
>>       // Set the cairo font face on a cairo rendering context.
>>       cairo_set_font_face(ctx, cr_face);
>>
>>       // At this point ref(cr_face) == 2. I guess that's okay, as the
>> font is requird for rendering.
>>
>>       cairo_text_path(ctx, str);
>>
>>       // At this point ref(cr_face) == 4.
>>
>>       cairo_destroy(ctx);
>>
>>       // At this point ref(cr_face) == 3.
>>
>> Shouldn't the reference count after the "cairo_destory" be 1 again and
>> the cairo font face deleted? Do I need to perform some manually cleanup
>> first?
>
> Cairo maintains a holdover cache of the MRU scaled fonts (outside of any
> context) which accounts for the extra references. The
> cairo_font_face_finish() / cairo_scaled_font_finish() interface has been
> proposed to decouple those extra references in a user-controllable way.
> However, in order to hook into the destroy notification for when the
> font is released you want to use cairo_scaled_font_set_user_data().
> -Chris
>
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.