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 <beh...@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...@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 <e...@gnu.org>: >> >>> > From: Ebrahim Byagowi <ebrami...@gmail.com> >>> > Date: Fri, 24 May 2019 20:13:43 +0430 >>> > Cc: Harfbuzz <harfbuzz@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@lists.freedesktop.org >>> https://lists.freedesktop.org/mailman/listinfo/harfbuzz >> >> _______________________________________________ >> HarfBuzz mailing list >> HarfBuzz@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/harfbuzz > > > > -- > behdad > http://behdad.org/ >
_______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/harfbuzz