Thanks Konstantin! Should this become a hb-uniscribe (or hb-gdi?) API?
On Fri, May 24, 2019 at 12:17 PM Konstantin Ritt <[email protected]> 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 <[email protected]>: > >> > From: Ebrahim Byagowi <[email protected]> >> > Date: Fri, 24 May 2019 20:13:43 +0430 >> > Cc: Harfbuzz <[email protected]> >> > >> > 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 >> [email protected] >> https://lists.freedesktop.org/mailman/listinfo/harfbuzz > > _______________________________________________ > HarfBuzz mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/harfbuzz -- behdad http://behdad.org/
_______________________________________________ HarfBuzz mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/harfbuzz
