From dec525017013b448f23eb645b11068862c1038d6 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 7 Jun 2019 22:02:25 +0300 Subject: [PATCH] Support text shaping with HarfBuzz The code to support HarfBuzz was written by these individuals: Khaled Hosny YAMAMOTO Mitsuharu Eli Zaretskii * src/xftfont.c (xftfont_list): Call ftfont_list2. (xftfont_match): Call ftfont_match2. (xftfont_open) [HAVE_HARFBUZZ]: Set the font driver to xfthbfont_driver as required. Reset xftfont_info->hb_font to NULL. (xftfont_close) [HAVE_HARFBUZZ]: Dispose of the hb_font object. (xftfont_shape): Accept an additional argument DIRECTION and pass it to ftfont_shape. (xfthbfont_list, xfthbfont_match, xfthbfont_begin_hb_font) (xfthbfont_end_hb_font) [HAVE_HARFBUZZ]: New functions. (syms_of_xftfont): New DEFSYM 'xfthb'. (syms_of_xftfont_for_pdumper) [HAVE_HARFBUZZ]: Initialize xfthbfont_driver. * src/xfns.c (Fx_create_frame, x_create_tip_frame) [HAVE_HARFBUZZ]: Register the HarfBuzz font driver. * src/w32uniscribe.c (bswap_32) [HAVE_HARFBUZZ]: Define to use the builtin for GCC 4.3.9 and newer; else use byteswap.h from Gnulib. (struct uniscribe_font_info): New member 'scale'. The member 'cache' is now used both by Uniscribe and HarfBuzz backends. (uniscribe_open): Set the font backend as required by the font entity's font_type field. (uniscribe_close) [HAVE_HARFBUZZ]: Dispose of the hb_font object. (uniscribe_shape): Accept an additional argument DIRECTION. (w32hb_list, w32hb_match, free_cb, w32hb_get_font_table) (w32hb_get_font, w32hb_encode_char, w32hb_begin_font) (w32hb_get_variation_glyphs, load_harfbuzz_funcs) [HAVE_HARFBUZZ]: New functions. (syms_of_w32uniscribe_for_pdumper): Initialize harfbuzz_font_driver if loading the requisite functions from the HarfBuzz DLL succeeded. * src/w32font.c (syms_of_w32font): New DEFSYM 'harfbuzz'. * src/w32fns.c (Fx_create_frame, w32_create_tip_frame): Determine whether we should register the HarfBuzz backend, or Uniscribe backend, or both for the new frame. * src/w32common.h (hbfont_init_w32_funcs) [HAVE_HARFBUZZ]: Add prototype. * src/macfont.m (lgstring_direction): New enumeration. (mac_font_shape_1, mac_screen_font_shape, macfont_shape): Accept an additional argument DIRECTION; all callers changed. * src/lisp.h (get_unicode_property): Add prototype. * src/hbfont.c: New file. * src/ftxfont.c (ftxfont_list): Call ftfont_list2. (ftxfont_match): Call ftfont_match2. * src/ftfont.h [HAVE_HARFBUZZ]: Include hb.h and hb-ft.h. (struct font_info): New member hb_font. * src/ftfont.c (ftfont_list2, ftfont_list_family): New functions. (ftfont_open) [HAVE_HARFBUZZ]: Reset ftfont_info->hb_font to NULL. Set the font backend to fthbfont_driver when required. (ftfont_close) [HAVE_HARFBUZZ]: Dispose of ftfont_info->hb_font. (ftfont_glyph_metrics): New function. (ftfont_text_extents): Call ftfont_glyph_metrics instead of FT_Load_Glyph. (ftfont_shape): Accept an additional argument DIRECTION. (ftfont_variation_glyphs) [!HAVE_OTF_GET_VARIATION_GLYPHS]: Support for variation glyphs without FLT. (fthbfont_begin_hb_font) [HAVE_HARFBUZZ]: New function. (syms_of_ftfont): New DEFSYM freetypehb. (syms_of_ftfont_for_pdumper): Initialize fthbfont_driver. * src/ftcrfont.c (ftcrfont_list): Call ftfont_list2. (ftcrfont_match): Call ftfont_match2. (ftcrfont_open) [HAVE_HARFBUZZ]: Set the font backend to ftcrhbfont_driver as required. Reset ftcrfont_info->hb_font to NULL. (ftcrfont_close) [HAVE_HARFBUZZ]: Discard of ftcrfont_info->hb_font. (ftcrfont_shape): Pass DIRECTION to ftfont_shape. (ftcrhbfont_list, ftcrhbfont_match) (ftcrhbfont_begin_hb_font, ftcrhbfont_end_hb_font) [HAVE_HARFBUZZ]: New functions. (syms_of_ftcrfont): New DEFSYM ftcrhb. (syms_of_ftcrfont_for_pdumper): Initialize ftcrhbfont_driver. * src/font.h [HAVE_HARFBUZZ]: Include hb.h. (struct font_driver): Update comments and function signatures to reflect the new argument DIRECTION accepted by the 'shape' method. New methods 'begin_hb_font' and 'end_hb_font'. (hbfont_shape, hbfont_combining_capability) (fthbfont_begin_hb_font) [HAVE_HARFBUZZ]: Add prototypes. * src/font.c (Ffont_shape_gstring): Accept an additional argument DIRECTION, and pass it to the font driver's 'shape' method. (Ffont_variation_glyphs): Doc fix. (syms_of_font): New DEFSYMS L2R and R2L. * src/composite.h (composition_reseat_it): Adjust prototype. * src/composite.c (autocmp_chars): Accept additional argument DIRECTION, and pass it to auto-composition-function. All callers changed. (composition_reseat_it): Accept additional argument BIDI_LEVEL, and use it to determine the DIRECTION argument to be passed to autocmp_chars. All callers changed. (syms_of_composite) : Improve the doc string; document the meaning of the new argument DIRECTION. * src/chartab.c (get_unicode_property): New function, refactored from the body of get-unicode-property-internal. (Fget_unicode_property_internal): Call get_unicode_property after validating the input arguments. * src/Makefile.in (HARFBUZZ_CFLAGS, HARFBUZZ_LIBS): New macros. (EMACS_CFLAGS): Use HARFBUZZ_CFLAGS. (SOME_MACHINE_OBJECTS): Add hbfont.o (LIBES): Add HARFBUZZ_LIBS. * lisp/language/tv-util.el (tai-viet-composition-function): * lisp/language/thai-util.el (thai-composition-function): * lisp/language/misc-lang.el (arabic-shape-gstring): * lisp/language/lao-util.el (lao-composition-function): * lisp/language/japanese.el (compose-gstring-for-variation-glyph): * lisp/language/hebrew.el (hebrew-shape-gstring): * lisp/language/ethio-util.el (ethio-composition-function): * lisp/composite.el (compose-chars-after) (compose-gstring-for-graphic) (compose-gstring-for-dotted-circle) (compose-gstring-for-terminal, auto-compose-chars): All composition functions that call shapers now accept an additional argument DIRECTION, either L2R or R2L. * etc/NEWS: Document the HarfBuzz support. * etc/HELLO: Add diacritics to Hebrew greetings. * doc/lispref/frames.texi (Font and Color Parameters): * doc/emacs/msdos.texi (Windows Fonts): Describe the 'harfbuzz' font backend on MS-Windows and how it is preferred to 'uniscribe'. * configure.ac (--wthout-harfbuzz): New option. (HAVE_HARFBUZZ): New tests. (FONT_OBJ) [HAVE_HARFBUZZ]: Add hbfont.o (emacs_config_features): Add HARFBUZZ. * admin/nt/dist-build/build-dep-zips.py: Add HarfBuzz dependency. --- etc/NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index 0c2f47e28de..cc2a5d78fbd 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -30,7 +30,8 @@ arranges for the included mini-gmp library to be built and used. The new 'configure' option '--without-libgmp' uses mini-gmp even if a suitable libgmp is available. -** The new configure option '--with-harfbuzz' adds support for the +** Emacs can now use HarfBuzz as its shaping engine. +The new configure option '--with-harfbuzz' adds support for the HarfBuzz text shaping engine. It is on by default; use './configure --without-harfbuzz' to build without it. The HarfBuzz text shaping is available via new font backend drivers 'xfthb' and 'ftcrhb' for Xft -- 2.39.2