HarfBuzz text shaping engine
Speedup applying glyph variation in VarComposites fonts (over 40% speedup). (Behdad Esfahbod)
Speedup instancing some fonts (over 20% speedup in instancing RobotoFlex). (Behdad Esfahbod)
Speedup shaping some fonts (over 30% speedup in shaping Roboto). (Behdad Esfahbod)
Support subsetting VarComposites and beyond-64k fonts. (Behdad Esfahbod)
New configuration macro HB_MINIMIZE_MEMORY_USAGE to favor optimizing memory usage over speed. (Behdad Esfahbod)
Supporting setting the mapping between old and new glyph indices during subsetting. (Garret Rieger)
Various fixes and improvements. (Behdad Esfahbod, Denis Rochette, Garret Rieger, Han Seung Min, Qunxin Liu)
New API: +hb_subset_input_old_to_new_glyph_mapping()
Full Changelog: https://github.com/harfbuzz/harfbuzz/compare/7.2.0...7.3.0
Add Tifinagh to the list of scripts that can natively be either right-to-left or left-to-right, to improve handling of its glyph positioning. (Simon Cozens)
Return also single substitution from hb_ot_layout_lookup_get_glyph_alternates()
. (Behdad Esfahbod)
Fix 4.2.0 regression in applying across syllables in syllabic scripts. (Behdad Esfahbod)
Add flag to avoid glyph substitution closure during subsetting, and the corresponding --no-layout-closure
option to hb-subset
command line tool. (Garret Rieger)
Support instancing COLRv1 table. (Qunxin Liu)
Don’t drop used user-defined name table entries during subsetting. (Qunxin Liu)
Optimize handling of “gvar” table. (Behdad Esfahbod)
Various subsetter bug fixes and improvements. (Garret Rieger, Qunxin Liu)
Various documentation improvements. (Behdad Esfahbod, Josef Friedrich)
New API: +HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE +HB_UNICODE_COMBINING_CLASS_CCC132
Deprecated API: +HB_UNICODE_COMBINING_CLASS_CCC133
Full Changelog: https://github.com/harfbuzz/harfbuzz/compare/7.1.0...7.2.0
New experimental hb_shape_justify() API that uses font variations to expand or shrink the text to a given advance. (Behdad Esfahbod)
Various build and bug fixes. (Behdad Esfahbod, Garret Rieger, Qunxin Liu)
New API: +hb_font_set_variation()
Full Changelog: https://github.com/harfbuzz/harfbuzz/compare/7.0.1...7.1.0
Full Changelog: https://github.com/harfbuzz/harfbuzz/compare/7.0.0...7.0.1
New hb-paint API that is designed mainly to paint COLRv1
glyphs, but can be also used as a unified API to paint any of the glyph representations supported by HarfBuzz (B/W outlines, color layers, or color bitmaps). (Behdad Esfahbod, Matthias Clasen)
New hb-cairo API for integrating with cairo graphics library. This is provided as a separate harfbuzz-cairo library. (Behdad Esfahbod, Matthias Clasen)
Support for instancing CFF2
table. (Behdad Esfahbod)
Support font emboldening. (Behdad Esfahbod)
Support feature ranges with AAT shaping. (Behdad Esfahbod)
Experimental support to cubic curves in glyf
table, see the spec. (Behdad Esfahbod)
Various subsetter improvements. (Garret Rieger, Qunxin Liu, Behdad Esfahbod)
Various documentation improvements. (Behdad Esfahbod, Matthias Clasen, Khaled Hosny)
Significantly reduced memory use during shaping. (Behdad Esfahbod)
Greatly reduced memory use during subsetting CFF
table. (Behdad Esfahbod)
New command line utility, hb-info, for querying various font information. (Behdad Esfahbod, Matthias Clasen)
New hb-shape/hb-view options: --glyphs
, --color-palette
, --font-bold
, --font-grade
, and --named-instance
. (Behdad Esfahbod)
Miscellaneous fixes and improvements. (Amir Masoud Abdol, Andres Salomon, Behdad Esfahbod, Chun-wei Fan, Garret Rieger, Jens Kutilek, Khaled Hosny, Konstantin Käfer, Matthias Clasen, Nirbheek Chauhan, Pedro J. Estébanez, Qunxin Liu, Sergei Trofimovich)
New API: +HB_FONT_NO_VAR_NAMED_INSTANCE +HB_PAINT_IMAGE_FORMAT_BGRA +HB_PAINT_IMAGE_FORMAT_PNG +HB_PAINT_IMAGE_FORMAT_SVG +hb_cairo_font_face_create_for_face +hb_cairo_font_face_create_for_font +hb_cairo_font_face_get_face +hb_cairo_font_face_get_font +hb_cairo_font_face_get_scale_factor +hb_cairo_font_face_set_font_init_func +hb_cairo_font_face_set_scale_factor +hb_cairo_font_init_func_t +hb_cairo_glyphs_from_buffer +hb_cairo_scaled_font_get_font +hb_color_line_get_color_stops +hb_color_line_get_color_stops_func_t +hb_color_line_get_extend +hb_color_line_get_extend_func_t +hb_color_line_t +hb_color_stop_t +hb_draw_funcs_get_empty +hb_draw_funcs_get_user_data +hb_draw_funcs_set_user_data +hb_face_collect_nominal_glyph_mapping +hb_font_draw_glyph +hb_font_draw_glyph_func_t +hb_font_funcs_set_draw_glyph_func +hb_font_funcs_set_paint_glyph_func +hb_font_get_synthetic_bold +hb_font_get_var_named_instance +hb_font_paint_glyph +hb_font_paint_glyph_func_t +hb_font_set_synthetic_bold +hb_map_keys +hb_map_next +hb_map_update +hb_map_values +hb_ot_color_glyph_has_paint +hb_ot_color_has_paint +hb_ot_layout_script_select_language2 +hb_ot_name_id_predefined_t +hb_paint_color +hb_paint_color_func_t +hb_paint_composite_mode_t +hb_paint_custom_palette_color +hb_paint_custom_palette_color_func_t +hb_paint_extend_t +hb_paint_funcs_create +hb_paint_funcs_destroy +hb_paint_funcs_get_empty +hb_paint_funcs_get_user_data +hb_paint_funcs_is_immutable +hb_paint_funcs_make_immutable +hb_paint_funcs_reference +hb_paint_funcs_set_color_func +hb_paint_funcs_set_custom_palette_color_func +hb_paint_funcs_set_image_func +hb_paint_funcs_set_linear_gradient_func +hb_paint_funcs_set_pop_clip_func +hb_paint_funcs_set_pop_group_func +hb_paint_funcs_set_pop_transform_func +hb_paint_funcs_set_push_clip_glyph_func +hb_paint_funcs_set_push_clip_rectangle_func +hb_paint_funcs_set_push_group_func +hb_paint_funcs_set_push_transform_func +hb_paint_funcs_set_radial_gradient_func +hb_paint_funcs_set_sweep_gradient_func +hb_paint_funcs_set_user_data +hb_paint_funcs_t +hb_paint_image +hb_paint_image_func_t +hb_paint_linear_gradient +hb_paint_linear_gradient_func_t +hb_paint_pop_clip +hb_paint_pop_clip_func_t +hb_paint_pop_group +hb_paint_pop_group_func_t +hb_paint_pop_transform +hb_paint_pop_transform_func_t +hb_paint_push_clip_glyph +hb_paint_push_clip_glyph_func_t +hb_paint_push_clip_rectangle +hb_paint_push_clip_rectangle_func_t +hb_paint_push_group +hb_paint_push_group_func_t +hb_paint_push_transform +hb_paint_push_transform_func_t +hb_paint_radial_gradient +hb_paint_radial_gradient_func_t +hb_paint_sweep_gradient +hb_paint_sweep_gradient_func_t +hb_set_is_inverted +hb_subset_input_keep_everything
Deprecated API: +hb_font_funcs_set_glyph_shape_func +hb_font_get_glyph_shape_func_t +hb_font_get_glyph_shape
Full Changelog: https://github.com/harfbuzz/harfbuzz/compare/6.0.0...7.0.0
A new API have been added to pre-process the face and speed up future subsetting operations on that face. Provides up to a 95% reduction in subsetting times when the same face is subset more than once.
For more details and benchmarks, see: https://github.com/harfbuzz/harfbuzz/blob/main/docs/subset-preprocessing.md
(Garret Rieger, Behdad Esfahbod)
Shaping have been speedup by skipping entire lookups when the buffer contents don't intersect with the lookup. Shows up to a 10% speedup in shaping some fonts. (Behdad Esfahbod)
A new experimental feature, Variable Composites (enabled by passing -Dexperimental_api=true
to meson), is also featured in this release. This technology enables drastic compression of fonts in the Chinese, Japanese, Korean, and other writing systems, by reusing the OpenType Font Variations technology for encoding “smart components” into the font.
The specification for these extensions to the font format can be found in: https://github.com/harfbuzz/boring-expansion-spec/blob/glyf1/glyf1.md
A test variable font with ~7160 Hangul syllables derived from the NotoSerifKR-VF font has been built, with existing OpenType technology, as well as with the new Variable Composites (VarComposites) technology. The VarComposites font is over 90% smaller than the OpenType version of the font!
Both fonts can be obtained from the “smarties” repository: https://github.com/behdad/smarties/tree/3.0/fonts/hangul/serif
When building HarfBuzz with experimental features enabled, you can test the “smarties” font with a sample character like this:
$ hb-view butchered-hangul-serif-smarties-variable.ttf -u AE01 --variations=wght=700
(Behdad Esfahbod)
The HarfBuzz subsetter can now drop axes by pinning them to specific values (also referred to as instancing). There are a couple of restrictions currently:
glyf
) based fonts. CFF2
fonts are not yet supported.(Garret Rieger, Qunxin Liu)
Miscellaneous fixes and improvements.
(Behdad Esfahbod, Christoph Reiter, David Corbett, Eli Schwartz, Garret Rieger, Joel Auterson, Jordan Petridis, Khaled Hosny, Lorenz Wildberg, Marco Rebhan, Martin Storsjö, Matthias Clasen, Qunxin Liu, Satadru Pramanik)
New API +hb_subset_input_pin_axis_location() +hb_subset_input_pin_axis_to_default() +hb_subset_preprocess()
hb-subset
option --preprocess-face
. (Garret Rieger)rlig
to appropriate AAT feature selectors. (Jonathan Kew)CBDT
extents first before outline tables, to help with fonts that also include an empty glyf
table. (Khaled Hosny)Fix regressions in hb-ft font functions for FT_Face
s with transformation matrix. (Behdad Esfahbod)
The experimental hb-repacker API now supports splitting several GPOS subtable types when needed. (Garret Rieger)
The HarfBuzz extensions to OpenType font format are now opt-in behind build-time flags. (Behdad Esfahbod)
The experimental hb-subset variable fonts instantiation API can now instantiate more font tables and arbitrary axis locations. (Qunxin Liu)
Unicode 15 support. (David Corbett)
Various documentation improvements. (Behdad Esfahbod, Matthias Clasen)
The hb-view
command line tool now detects WezTerm inline images support. (Wez Furlong)
Fix FreeType and ICU dependency lookup with meson. (Xavier Claessens)
New API: +HB_SCRIPT_KAWI +HB_SCRIPT_NAG_MUNDARI
More extensive buffer tracing messages. (Behdad Esfahbod)
Fix hb-ft regression in bitmap fonts rendering. (Behdad Esfahbod)
Support extension promotion of lookups in hb-subset-repacker. (Garret Rieger)
A new HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL
for scripts that use elongation (e.g. Arabic) to signify where it is safe to insert tatweel glyph without interrupting shaping. (Behdad Esfahbod)
Add --safe-to-insert-tatweel
to hb-shape
tool. (Behdad Esfahbod)
New API +HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL +HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL