• Eli Zaretskii's avatar
    Support text shaping with HarfBuzz · dec52501
    Eli Zaretskii authored
    The code to support HarfBuzz was written by these individuals:
      Khaled Hosny <dr.khaled.hosny@gmail.com>
      YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
      Eli Zaretskii <eliz@gnu.org>
    * 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
    (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
    * 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
    (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
    (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
    * 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
    (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_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'
    (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) <auto-composition-function>: Improve the
    doc string; document the meaning of the new argument
    * 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.
    (SOME_MACHINE_OBJECTS): Add hbfont.o
    * 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-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.
NEWS 81.4 KB