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