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

Behdad Esfahbod behdad at behdad.org
Fri May 24 18:01:16 UTC 2019


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

> пт, 24 мая 2019 г. в 20:49, Behdad Esfahbod <behdad at behdad.org>:
>
>> Thanks Konstantin,
>>
>> What about DirectWrite-driven font funcs though?  Does Qt have those?
>>
>
> Yep we do, both GDI and DW.
> I think we should start moving our backends (or their respective parts) to
> HB at some point. We could start a dedicated topic to discuss that.
>

Yes please.  I look forward to that!  Same with CoreText font funcs.


>
> Regards,
> Konstantin
>
>
>
>
>>
>> On Fri, May 24, 2019 at 1: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.
>>>
>>> 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/
>>>>
>>>
>>
>> --
>> behdad
>> http://behdad.org/
>>
>

-- 
behdad
http://behdad.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/harfbuzz/attachments/20190524/2fd31c7a/attachment.html>


More information about the HarfBuzz mailing list