[HarfBuzz] How to get hb_face_t and hb_font_t without Freetype?
Konstantin Ritt
ritt.ks at gmail.com
Fri May 24 16:16:24 UTC 2019
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/harfbuzz/attachments/20190524/6ac9cd17/attachment.html>
More information about the HarfBuzz
mailing list