[HarfBuzz] How to get hb_face_t and hb_font_t without Freetype?
Eli Zaretskii
eliz at gnu.org
Fri May 24 13:39:30 UTC 2019
> From: Ebrahim Byagowi <ebraminio at gmail.com>
> Date: Fri, 24 May 2019 20:13:43 +0430
> Cc: Harfbuzz <harfbuzz at lists.freedesktop.org>
>
> Pardon me for the may inaccurate following answer I have to write quickly,
Thanks for your help.
> > Also, does HarfBuzz support TrueType Collection (TTC) files, and if so, does it want the data only for the
> currently selected font or all
> of the data?
>
> It does, if you want harfbuzz handles it for you, you should give it the full blob and set the index you like in
> second argument of hb_face_create, otherwise you should handle it yourself.
OK, this brings me to another question: what should I in general pass
as the 2nd argument of hb_face_create? Suppose I'm using a TTF or OTF
font file, should I always pass zero as the 2nd argument? What is the
semantics of that argument?
> > I'm now working on the HarfBuzz font driver for Emacs on Windows using GetFontData with the dwTable
> argument zero, to get the entire data of the font.
>
> Is it DirectWrite? Have you seen the helper we have the in hb-directwrite.h and hb-uniscribe.h? They can be
> very useful.
I'm not using DirectWrite, nor am I using Uniscribe. My HarfBuzz is
built without these two, as I understand building with these back-ends
is only needed for comparison. I want to use the HarfBuzz shaper, and
only it (Emacs already has support for Uniscribe).
But yes, I do consult these files to figure out answers to my
questions.
> > does their memory need to be freed in some manner after I have the hb_font_t object, or do I have to keep
> them as long as hb_font_t is in use?
>
> Don't free it yourself specially if in use, you can use harfbuzz destroy callback so harfbuzz can handle it for
> you.
Sorry, I don't think I understand: what do you mean by "harfbuzz
destroy callback"? If you mean the 'destroy" argument of
hb_blob_create, then AFAIU this is called only to destroy user_data,
and I don't have user_data, I pass NULL as the 4th argument of
hb_blob_create. And hb_face_create doesn't have any callback argument
at all.
I see in the few programs in util/ that both the blob and the face are
destroyed as soon as hb_font_t object is created, which is why I
thought I could do the same. But now you seem to say I shouldn't?
For that matter, what should I use as the 'mode' argument of
hb_blob_create?
This page:
https://harfbuzz.github.io/object-model-blobs.html
shows an example of calling hb_blob_create with 'free' (in my case,
'xfree') as the 'destroy' callback, so I guess my interpretation of
that argument as being pertinent to user_data was incorrect? Still,
the questions about memory management for hb_face_t and about the
semantics of the hb_memory_mode_t enum values are left unanswered.
> > I see that hb_blob_create, hb_face_create etc. return empty objects when they fail. But I see no "is-empty"
> function or macro in the docs, did I miss something?
>
> Some of the objects may work with empty comparison but it is not broken face
> https://github.com/harfbuzz/harfbuzz/issues/1572 but something does it very accurately is
> hb_face_get_glyph_count
AFAIU, you are saying that if hb_face_get_glyph_count returns zero,
the face is empty and shouldn't be used, is that right?
> > Where do those 64.0 factors come from?
>
> Subpixel accuracy, harfbuzz works with integers but as subpixel accuracy needed you have to we need to do
> some scaling. Scaling is not the pixels but _set_ppem and _set_ptem is (this is very inaccurate, but I hope
> would be useful)
Does this mean I should use the factor of 64 in my code as well? Or
does that value depend on some properties of the font?
>
> > Or point me to the documentation where that is described, if I missed it?
>
> https://harfbuzz.github.io/ may address some of your issues
Thanks again for your help.
More information about the HarfBuzz
mailing list