[cairo] API completeness of reference/user_data pairs
vladimir at pobox.com
Tue Jan 30 12:42:16 PST 2007
William Lahti wrote:
> On Mon, 2007-01-29 at 16:13 -0500, Behdad Esfahbod wrote:
>> I wanted to propose new API for cairo_font_options_reference().
>> I reported this in bugzilla somewhere, but can't find it.
>> In short, I think the required malloc for an opaque value type is
>> unnecessary overhead.
>> But when I thought about it, I remembered that to make life
>> easier for language bindings, all referenced types need to have
>> destroy notification for the least, and user data preferably. In
>> cairo, both are available using the user_data idiom.
> Why does user data help bindings again?
For Mozilla's Cairo wrapper (Thebes), we store a pointer to the wrapper
in a surface's user_data. That way if we only have the cairo_surface_t*
somewhere, we can always recover the gfxASurface* wrapper. Before we
started doing this, we were constantly creating and destroying wrappers,
because we use push/pop group quite a bit and needed to get at the
actual created internal surface. As our wrappers were refcounted
themselves, we've now tied that reference count directly to the cairo
reference count for the wrapped object as well.
This makes it possible to do things like wrap image surfaces with the
wrapper owning the data and not the cairo_surface. It's certainly
possible to write bindings/wrappers without destroy notification/user
data, but it does make bindings that need to hold extra data other than
just simply passing function calls from one thing to another easier.
More information about the cairo