[HarfBuzz] get/set_user_data()

Behdad Esfahbod behdad at behdad.org
Mon May 19 18:10:30 PDT 2014


On 14-05-19 04:39 PM, Konstantin Ritt wrote:
> I only use get/set_user_data() in a single place, where it is impossible to
> pass some modifiers anyhow else:

It's NOT impossible.  There are at least two different ways to do that:


> {code}
> static hb_user_data_key_t _useDesignMetricsKey;
> void hb_qt_font_set_use_design_metrics(hb_font_t *font, uint value) {
> hb_font_set_user_data(font, &_useDesignMetricsKey, (void *)quintptr(value),
> NULL, true); }
> uint hb_qt_font_get_use_design_metrics(hb_font_t *font) { return
> quintptr(hb_font_get_user_data(font, &_useDesignMetricsKey)); }
> static hb_position_t _hb_qt_font_get_glyph_h_advance(hb_font_t *font, void
> *font_data, hb_codepoint_t glyph, void * /*user_data*/)
> {
>     QFontEngine *fe = (QFontEngine *)font_data;

font_data is a closure for *all* data you would need in your callbacks.  The
fact that you are passing QFontEngine as font_data, and that it doesn't
include the piece of data you need, is your fault.  You can allocate a small
piece of memory to contain both the QFontEngine AND the use_design_metrics bit.

The alternative is to use different font_funcs implementations for the
use_design_metrics and the !use_design_metrics cases.

Does that make sense?

behdad


>     ...
>     fe->recalcAdvances(&g,
> QFontEngine::ShaperFlags(hb_qt_font_get_use_design_metrics(font)));
> {/code}
> 
> However, I find the get/set_user_data() API somewhat inconvenient (mostly due
> to key restrictions) and would love a proper solution for the issue solved
> here with a useDesignMetrics flag (the issue was described in another thread).
> Except of that, I don't think this API is really that useful.
>
> Regards,
> Konstantin
> 
> 
> 2014-05-20 1:10 GMT+03:00 Behdad Esfahbod <behdad at behdad.org
> <mailto:behdad at behdad.org>>:
> 
>     So, are people actually using the get/set_user_data() methods on HB objects?
>     I'm thinking about removing them at least for hb_blob_t, as part of
>     streamlining blobs and making them more lightweight.  But if no one uses the
>     get/set_user_data(), I may as well just remove them all.
> 
>     Initially I added these because (based on cairo experience) I was under the
>     impression that they are extremely useful for language bindings.  However,
>     they are only if one is willing to write manual bindings, which is something I
>     prefer to avoid.
> 
>     So, if no existing user of HarfBuzz uses them, I think it's a good indication
>     that they were overkill design artifacts and I'll remove before 1.0.
> 
>     Thanks,
>     --
>     behdad
>     http://behdad.org/
>     _______________________________________________
>     HarfBuzz mailing list
>     HarfBuzz at lists.freedesktop.org <mailto:HarfBuzz at lists.freedesktop.org>
>     http://lists.freedesktop.org/mailman/listinfo/harfbuzz
> 
> 

-- 
behdad
http://behdad.org/


More information about the HarfBuzz mailing list