[HarfBuzz] How to get hb_face_t and hb_font_t without Freetype?
Behdad Esfahbod
behdad at behdad.org
Fri May 24 16:17:57 UTC 2019
Thanks Konstantin!
Should this become a hb-uniscribe (or hb-gdi?) API?
On Fri, May 24, 2019 at 12:17 PM Konstantin Ritt <ritt.ks at gmail.com> wrote:
> hb_blob_t *my_reference_table(hb_face_t * /*face*/, hb_tag_t tag, void *user_data)
>
> {
>
> HDC hdc = (HDC)user_data;
>
> SelectObject(hdc, hfont);
>
>
> char *buffer = NULL;
>
> DWORD length = 0;
>
> length = GetFontData(hdc, byte_swap<DWORD>(tag), 0, buffer, length);
>
> if (length == GDI_ERROR)
>
> return hb_blob_get_empty();
>
>
> buffer = (char *)::malloc(length);
>
> length = GetFontData(hdc, byte_swap<DWORD>(tag), 0, buffer, length);
>
> if (length == GDI_ERROR)
>
> length = 0;
>
>
> return hb_blob_create((const char *)buffer, length, HB_MEMORY_MODE_READONLY, buffer, ::free);
>
> }
>
>
> hb_face_t *my_face_create_from_hdc(HDC hdc)
>
> {
>
> return hb_face_create_for_tables(my_reference_table, (void *)hdc, NULL);
>
> }
>
>
>
>
> Regards,
> Konstantin
>
>
> пт, 24 мая 2019 г. в 16:39, Eli Zaretskii <eliz at gnu.org>:
>
>> > 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.
>> _______________________________________________
>> HarfBuzz mailing list
>> HarfBuzz at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/harfbuzz
>
> _______________________________________________
> HarfBuzz mailing list
> HarfBuzz at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/harfbuzz
--
behdad
http://behdad.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/harfbuzz/attachments/20190524/99e77b39/attachment-0001.html>
More information about the HarfBuzz
mailing list