<div dir="ltr">2014-05-20 4:10 GMT+03:00 Behdad Esfahbod <span dir="ltr"><<a href="mailto:behdad@behdad.org" target="_blank">behdad@behdad.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="">On 14-05-19 04:39 PM, Konstantin Ritt wrote:<br>
> I only use get/set_user_data() in a single place, where it is impossible to<br>
> pass some modifiers anyhow else:<br>
<br>
</div>It's NOT impossible.  There are at least two different ways to do that:<br>
<div class=""><br>
<br>
> {code}<br>
> static hb_user_data_key_t _useDesignMetricsKey;<br>
> void hb_qt_font_set_use_design_metrics(hb_font_t *font, uint value) {<br>
> hb_font_set_user_data(font, &_useDesignMetricsKey, (void *)quintptr(value),<br>
> NULL, true); }<br>
> uint hb_qt_font_get_use_design_metrics(hb_font_t *font) { return<br>
> quintptr(hb_font_get_user_data(font, &_useDesignMetricsKey)); }<br>
> static hb_position_t _hb_qt_font_get_glyph_h_advance(hb_font_t *font, void<br>
> *font_data, hb_codepoint_t glyph, void * /*user_data*/)<br>
> {<br>
>     QFontEngine *fe = (QFontEngine *)font_data;<br>
<br>
</div>font_data is a closure for *all* data you would need in your callbacks.  The<br>
fact that you are passing QFontEngine as font_data, and that it doesn't<br>
include the piece of data you need, is your fault.  You can allocate a small<br>
piece of memory to contain both the QFontEngine AND the use_design_metrics bit.<br>
<br>
The alternative is to use different font_funcs implementations for the<br>
use_design_metrics and the !use_design_metrics cases.<br>
<br>
Does that make sense?<br>
<br></blockquote><div><br></div><div>Not really. The use_design_metrics flag implies just the metrics behavior and the intention was to make it a modifier.</div><div>Passing it at hb_font construction/initialization time would require instantiating yet another hb_font for the same engine but different use_design_metrics bit, which also affects the shape plan cache.</div>

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