[HarfBuzz] How to get hb_face_t and hb_font_t without Freetype?

Nikolay Sivov bunglehead at gmail.com
Fri May 24 17:58:24 UTC 2019


On Fri, May 24, 2019 at 8:45 PM Konstantin Ritt <ritt.ks at gmail.com> wrote:

> Hi Behdad,
>
> That was just a glance example of the font table referencing GDI-HB bridge.
> Feel free to use it in hb-<backend> if you like it ;P
>
> As for font-funcs, I doubt GDI is a subject of interest these days. I
> might be wrong here, though.
>

I think GDI32 does offer some legacy shaping functionality for
Arabic/Hebrew/maybe Hangul, that predates Uniscribe, but I don't think it's
very interesting to look at such results.

Regarding font data access functions, those would be essentially the same
as with Uniscribe, because it's directly tied to HDC and GDI font
functionality.


> Regards,
> Konstantin
>
>
> пт, 24 мая 2019 г. в 19:18, Behdad Esfahbod <behdad at behdad.org>:
>
>> 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/
>>
> _______________________________________________
> HarfBuzz mailing list
> HarfBuzz at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/harfbuzz
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/harfbuzz/attachments/20190524/63ad641a/attachment.html>


More information about the HarfBuzz mailing list