texlive[76191] Build/source/libs: harfbuzz 11.4.5

commits+kakuto at tug.org commits+kakuto at tug.org
Sun Aug 31 00:43:21 CEST 2025


Revision: 76191
          https://tug.org/svn/texlive?view=revision&revision=76191
Author:   kakuto
Date:     2025-08-31 00:43:20 +0200 (Sun, 31 Aug 2025)
Log Message:
-----------
harfbuzz 11.4.5

Modified Paths:
--------------
    trunk/Build/source/libs/README
    trunk/Build/source/libs/harfbuzz/ChangeLog
    trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
    trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
    trunk/Build/source/libs/harfbuzz/configure
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-kern.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/rust/Cargo.toml
    trunk/Build/source/libs/harfbuzz/version.ac

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/README	2025-08-30 22:43:20 UTC (rev 76191)
@@ -28,7 +28,7 @@
   https://sourceforge.net/projects/silgraphite/files/graphite2/
   (requires C++11)
 
-harfbuzz 11.4.4 - checked 26aug25
+harfbuzz 11.4.5 - checked 31aug25
   https://github.com/harfbuzz/harfbuzz/releases/latest
 
 icu 76.1 - checked 27oct24 (requires C++17, e.g., g++13)

Modified: trunk/Build/source/libs/harfbuzz/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/ChangeLog	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/ChangeLog	2025-08-30 22:43:20 UTC (rev 76191)
@@ -1,3 +1,8 @@
+2025-08-31  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
+
+	Import harfbuzz-11.4.5.
+	* version.ac: Adjusted.
+
 2025-08-26  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
 
 	Import harfbuzz-11.4.4.

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2025-08-30 22:43:20 UTC (rev 76191)
@@ -1,3 +1,8 @@
+2025-08-31  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
+
+	Imported harfbuzz-11.4.5 source tree from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/11.4.5/
+
 2025-08-26  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
 
 	Imported harfbuzz-11.4.4 source tree from:

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2025-08-30 22:43:20 UTC (rev 76191)
@@ -1,5 +1,5 @@
-Changes applied to the harfbuzz-11.4.4/ tree as obtained from:
-	https://github.com/harfbuzz/harfbuzz/releases/download/11.4.4/
+Changes applied to the harfbuzz-11.4.5/ tree as obtained from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/11.4.5/
 
 Removed:
 	.clang-format

Modified: trunk/Build/source/libs/harfbuzz/configure
===================================================================
--- trunk/Build/source/libs/harfbuzz/configure	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/configure	2025-08-30 22:43:20 UTC (rev 76191)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for harfbuzz (TeX Live) 11.4.4.
+# Generated by GNU Autoconf 2.72 for harfbuzz (TeX Live) 11.4.5.
 #
 # Report bugs to <tex-k at tug.org>.
 #
@@ -604,8 +604,8 @@
 # Identity of this package.
 PACKAGE_NAME='harfbuzz (TeX Live)'
 PACKAGE_TARNAME='harfbuzz--tex-live-'
-PACKAGE_VERSION='11.4.4'
-PACKAGE_STRING='harfbuzz (TeX Live) 11.4.4'
+PACKAGE_VERSION='11.4.5'
+PACKAGE_STRING='harfbuzz (TeX Live) 11.4.5'
 PACKAGE_BUGREPORT='tex-k at tug.org'
 PACKAGE_URL=''
 
@@ -1341,7 +1341,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-'configure' configures harfbuzz (TeX Live) 11.4.4 to adapt to many kinds of systems.
+'configure' configures harfbuzz (TeX Live) 11.4.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1413,7 +1413,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 11.4.4:";;
+     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 11.4.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1518,7 +1518,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-harfbuzz (TeX Live) configure 11.4.4
+harfbuzz (TeX Live) configure 11.4.5
 generated by GNU Autoconf 2.72
 
 Copyright (C) 2023 Free Software Foundation, Inc.
@@ -2075,7 +2075,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by harfbuzz (TeX Live) $as_me 11.4.4, which was
+It was created by harfbuzz (TeX Live) $as_me 11.4.5, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -5259,7 +5259,7 @@
 
 # Define the identity of the package.
  PACKAGE='harfbuzz--tex-live-'
- VERSION='11.4.4'
+ VERSION='11.4.5'
 
 
 # Some tools Automake needs.
@@ -5573,8 +5573,8 @@
 
 HB_VERSION_MAJOR=11
 HB_VERSION_MINOR=4
-HB_VERSION_MICRO=4
-HB_VERSION=11.4.4
+HB_VERSION_MICRO=5
+HB_VERSION=11.4.5
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -9426,7 +9426,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by harfbuzz (TeX Live) $as_me 11.4.4, which was
+This file was extended by harfbuzz (TeX Live) $as_me 11.4.5, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -9494,7 +9494,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-harfbuzz (TeX Live) config.status 11.4.4
+harfbuzz (TeX Live) config.status 11.4.5
 configured by $0, generated by GNU Autoconf 2.72,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2025-08-30 22:43:20 UTC (rev 76191)
@@ -1,3 +1,9 @@
+Overview of changes leading to 11.4.5
+Saturday, August 30, 2025
+=====================================
+* Bug fixes for “AAT” shaping, and other shaping micro optimizations.
+
+
 Overview of changes leading to 11.4.4
 Tuesday, August 26, 2025
 =====================================

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build	2025-08-30 22:43:20 UTC (rev 76191)
@@ -1,6 +1,6 @@
 project('harfbuzz', ['c', 'cpp'],
   meson_version: '>= 0.60.0',
-  version: '11.4.4',
+  version: '11.4.5',
   default_options: [
     'cpp_eh=none',          # Just to support msvc, we are passing -fno-exceptions also anyway
     # 'cpp_rtti=false',     # Do NOT enable, wraps inherit it and ICU needs RTTI

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -80,9 +80,8 @@
 {
   /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate
    * offset of glyph they are attached to. */
-  int chain = pos[i].attach_chain(), type = pos[i].attach_type();
-  if (likely (!chain))
-    return;
+  int chain = pos[i].attach_chain();
+  int type = pos[i].attach_type();
 
   pos[i].attach_chain() = 0;
 
@@ -94,7 +93,8 @@
   if (unlikely (!nesting_level))
     return;
 
-  propagate_attachment_offsets (pos, len, j, direction, nesting_level - 1);
+  if (pos[j].attach_chain())
+    propagate_attachment_offsets (pos, len, j, direction, nesting_level - 1);
 
   assert (!!(type & GPOS_impl::ATTACH_TYPE_MARK) ^ !!(type & GPOS_impl::ATTACH_TYPE_CURSIVE));
 
@@ -149,8 +149,20 @@
 
   /* Handle attachments */
   if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
-    for (unsigned i = 0; i < len; i++)
-      propagate_attachment_offsets (pos, len, i, direction);
+  {
+    auto *pos = buffer->pos;
+    // https://github.com/harfbuzz/harfbuzz/issues/5514
+    if (HB_DIRECTION_IS_FORWARD (direction))
+    {
+      for (unsigned i = 0; i < len; i++)
+	if (pos[i].attach_chain())
+	  propagate_attachment_offsets (pos, len, i, direction);
+    } else {
+      for (unsigned i = len; i-- > 0; )
+	if (pos[i].attach_chain())
+	  propagate_attachment_offsets (pos, len, i, direction);
+    }
+  }
 
   if (unlikely (font->slant_xy) &&
       HB_DIRECTION_IS_HORIZONTAL (direction))

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -78,7 +78,10 @@
   {
     hb_bit_set_t *s = buffer_glyph_set.get_acquire ();
     if (s && buffer_glyph_set.cmpexch (s, nullptr))
+    {
+      s->clear ();
       return s;
+    }
 
     s = (hb_bit_set_t *) hb_calloc (1, sizeof (hb_bit_set_t));
     if (unlikely (!s))
@@ -125,9 +128,8 @@
   const hb_sorted_vector_t<hb_aat_map_t::range_flags_t> *range_flags = nullptr;
   bool using_buffer_glyph_set = false;
   hb_bit_set_t *buffer_glyph_set = nullptr;
-  const hb_bit_set_t *left_set = nullptr;
-  const hb_bit_set_t *right_set = nullptr;
-  const hb_bit_set_t *machine_glyph_set = nullptr;
+  const hb_bit_set_t *first_set = nullptr;
+  const hb_bit_set_t *second_set = nullptr;
   hb_aat_class_cache_t *machine_class_cache = nullptr;
   hb_mask_t subtable_flags = 0;
 
@@ -155,11 +157,11 @@
   bool buffer_intersects_machine () const
   {
     if (likely (using_buffer_glyph_set))
-      return buffer_glyph_set->intersects (*machine_glyph_set);
+      return buffer_glyph_set->intersects (*first_set);
 
     // Faster for shorter buffers.
     for (unsigned i = 0; i < buffer->len; i++)
-      if (machine_glyph_set->has (buffer->info[i].codepoint))
+      if (first_set->has (buffer->info[i].codepoint))
 	return true;
     return false;
   }
@@ -638,6 +640,23 @@
     glyphs.add_range (firstGlyph, firstGlyph + glyphCount - 1);
   }
 
+  template <typename set_t, typename filter_t>
+  void collect_glyphs_filtered (set_t &glyphs, const filter_t &filter) const
+  {
+    if (unlikely (!glyphCount)) return;
+    if (firstGlyph == DELETED_GLYPH) return;
+    const HBUINT8 *p = valueArrayZ.arrayZ;
+    for (unsigned i = 0; i < glyphCount; i++)
+    {
+      unsigned int v = 0;
+      unsigned int count = valueSize;
+      for (unsigned int j = 0; j < count; j++)
+	v = (v << 8) | *p++;
+      if (filter (v))
+	glyphs.add (firstGlyph + i);
+    }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -708,6 +727,7 @@
     case 4: hb_barrier (); u.format4.collect_glyphs_filtered (glyphs, filter); return;
     case 6: hb_barrier (); u.format6.collect_glyphs_filtered (glyphs, filter); return;
     case 8: hb_barrier (); u.format8.collect_glyphs_filtered (glyphs, filter); return;
+    case 10: hb_barrier (); u.format10.collect_glyphs_filtered (glyphs, filter); return;
     default:return;
     }
   }
@@ -837,11 +857,6 @@
     STATE_START_OF_LINE = 1,
   };
 
-  template <typename set_t>
-  void collect_glyphs (set_t &glyphs, unsigned num_glyphs) const
-  {
-    (this+classTable).collect_glyphs (glyphs, num_glyphs);
-  }
   template <typename set_t, typename table_t>
   void collect_initial_glyphs (set_t &glyphs, unsigned num_glyphs, const table_t &table) const
   {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -120,12 +120,12 @@
   }
 
   template <typename set_t>
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
     for (const KernPair& pair : pairs)
     {
-      left_set.add (pair.left);
-      right_set.add (pair.right);
+      first_set.add (pair.left);
+      second_set.add (pair.right);
     }
   }
 
@@ -140,7 +140,7 @@
 
     int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
     {
-      if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0;
+      if (!(*c->first_set)[left] || !(*c->second_set)[right]) return 0;
       return table.get_kerning (left, right, c);
     }
   };
@@ -396,10 +396,10 @@
   }
 
   template <typename set_t>
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
-    machine.collect_initial_glyphs (left_set, num_glyphs, *this);
-    //machine.collect_glyphs (right_set, num_glyphs); // right_set is unused for machine kerning
+    machine.collect_initial_glyphs (first_set, num_glyphs, *this);
+    //machine.collect_glyphs (second_set, num_glyphs); // second_set is unused for machine kerning
   }
 
   protected:
@@ -451,10 +451,10 @@
   }
 
   template <typename set_t>
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
-    (this+leftClassTable).collect_glyphs (left_set, num_glyphs);
-    (this+rightClassTable).collect_glyphs (right_set, num_glyphs);
+    (this+leftClassTable).collect_glyphs (first_set, num_glyphs);
+    (this+rightClassTable).collect_glyphs (second_set, num_glyphs);
   }
 
   struct accelerator_t
@@ -468,7 +468,7 @@
 
     int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
     {
-      if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0;
+      if (!(*c->first_set)[left] || !(*c->second_set)[right]) return 0;
       return table.get_kerning (left, right, c);
     }
   };
@@ -671,10 +671,10 @@
   }
 
   template <typename set_t>
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
-    machine.collect_initial_glyphs (left_set, num_glyphs, *this);
-    //machine.collect_glyphs (right_set, num_glyphs); // right_set is unused for machine kerning
+    machine.collect_initial_glyphs (first_set, num_glyphs, *this);
+    //machine.collect_glyphs (second_set, num_glyphs); // second_set is unused for machine kerning
   }
 
   protected:
@@ -762,19 +762,19 @@
   }
 
   template <typename set_t>
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
     if (is_long ())
     {
       const auto &t = u.l;
-      (this+t.rowIndexTable).collect_glyphs (left_set, num_glyphs);
-      (this+t.columnIndexTable).collect_glyphs (right_set, num_glyphs);
+      (this+t.rowIndexTable).collect_glyphs (first_set, num_glyphs);
+      (this+t.columnIndexTable).collect_glyphs (second_set, num_glyphs);
     }
     else
     {
       const auto &t = u.s;
-      (this+t.rowIndexTable).collect_glyphs (left_set, num_glyphs);
-      (this+t.columnIndexTable).collect_glyphs (right_set, num_glyphs);
+      (this+t.rowIndexTable).collect_glyphs (first_set, num_glyphs);
+      (this+t.columnIndexTable).collect_glyphs (second_set, num_glyphs);
     }
   }
 
@@ -789,7 +789,7 @@
 
     int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
     {
-      if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0;
+      if (!(*c->first_set)[left] || !(*c->second_set)[right]) return 0;
       return table.get_kerning (left, right, c);
     }
   };
@@ -878,15 +878,15 @@
   }
 
   template <typename set_t>
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
     unsigned int subtable_type = get_type ();
     switch (subtable_type) {
-    case 0:	u.format0.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 1:	u.format1.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 2:	u.format2.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 4:	u.format4.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 6:	u.format6.collect_glyphs (left_set, right_set, num_glyphs); return;
+    case 0:	u.format0.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 1:	u.format1.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 2:	u.format2.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 4:	u.format4.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 6:	u.format6.collect_glyphs (first_set, second_set, num_glyphs); return;
     default:	return;
     }
   }
@@ -923,8 +923,8 @@
 
 struct kern_subtable_accelerator_data_t
 {
-  hb_bit_set_t left_set;
-  hb_bit_set_t right_set;
+  hb_bit_set_t first_set;
+  hb_bit_set_t second_set;
   mutable hb_aat_class_cache_t class_cache;
 };
 
@@ -1000,6 +1000,7 @@
 
     typedef typename T::SubTable SubTable;
 
+    bool buffer_is_reversed = false;
     bool ret = false;
     bool seenCrossStream = false;
     c->set_lookup_index (0);
@@ -1017,9 +1018,8 @@
       if (HB_DIRECTION_IS_HORIZONTAL (c->buffer->props.direction) != st->u.header.is_horizontal ())
 	goto skip;
 
-      c->left_set = &subtable_accel.left_set;
-      c->right_set = &subtable_accel.right_set;
-      c->machine_glyph_set = &subtable_accel.left_set;
+      c->first_set = &subtable_accel.first_set;
+      c->second_set = &subtable_accel.second_set;
       c->machine_class_cache = &subtable_accel.class_cache;
 
       if (!c->buffer_intersects_machine ())
@@ -1051,8 +1051,11 @@
 	}
       }
 
-      if (reverse)
+      if (reverse != buffer_is_reversed)
+      {
 	c->buffer->reverse ();
+	buffer_is_reversed = reverse;
+      }
 
       {
 	/* See comment in sanitize() for conditional here. */
@@ -1060,9 +1063,6 @@
 	ret |= st->dispatch (c);
       }
 
-      if (reverse)
-	c->buffer->reverse ();
-
       (void) c->buffer->message (c->font, "end subtable %u", c->lookup_index);
 
     skip:
@@ -1069,6 +1069,8 @@
       st = &StructAfter<SubTable> (*st);
       c->set_lookup_index (c->lookup_index + 1);
     }
+    if (buffer_is_reversed)
+      c->buffer->reverse ();
 
     return ret;
   }
@@ -1133,7 +1135,7 @@
       if (unlikely (accel_data.subtable_accels.in_error ()))
 	  return accel_data;
 
-      st->collect_glyphs (subtable_accel.left_set, subtable_accel.right_set, num_glyphs);
+      st->collect_glyphs (subtable_accel.first_set, subtable_accel.second_set, num_glyphs);
       subtable_accel.class_cache.clear ();
 
       st = &StructAfter<SubTable> (*st);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -1156,6 +1156,7 @@
   void apply (hb_aat_apply_context_t *c,
 	      const hb_aat_layout_chain_accelerator_t *accel) const
   {
+    bool buffer_is_reversed = false;
     const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types>> (featureZ.as_array (featureCount));
     unsigned int count = subtableCount;
     for (unsigned int i = 0; i < count; i++)
@@ -1169,15 +1170,15 @@
 		   hb_map ([subtable_flags] (const hb_aat_map_t::range_flags_t _) -> bool { return subtable_flags & (_.flags); })))
 	goto skip;
 
-      c->subtable_flags = subtable_flags;
-      c->machine_glyph_set = accel ? &accel->subtables[i].glyph_set : &Null(hb_bit_set_t);
-      c->machine_class_cache = accel ? &accel->subtables[i].class_cache : nullptr;
-
       if (!(coverage & ChainSubtable<Types>::AllDirections) &&
 	  HB_DIRECTION_IS_VERTICAL (c->buffer->props.direction) !=
 	  bool (coverage & ChainSubtable<Types>::Vertical))
 	goto skip;
 
+      c->subtable_flags = subtable_flags;
+      c->first_set = accel ? &accel->subtables[i].glyph_set : &Null(hb_bit_set_t);
+      c->machine_class_cache = accel ? &accel->subtables[i].class_cache : nullptr;
+
       if (!c->buffer_intersects_machine ())
       {
 	(void) c->buffer->message (c->font, "skipped chainsubtable %u because no glyph matches", c->lookup_index);
@@ -1219,22 +1220,24 @@
       if (!c->buffer->message (c->font, "start chainsubtable %u", c->lookup_index))
 	goto skip;
 
-      if (reverse)
+      if (reverse != buffer_is_reversed)
+      {
 	c->buffer->reverse ();
+	buffer_is_reversed = reverse;
+      }
 
       subtable->apply (c);
 
-      if (reverse)
-	c->buffer->reverse ();
-
       (void) c->buffer->message (c->font, "end chainsubtable %u", c->lookup_index);
 
-      if (unlikely (!c->buffer->successful)) return;
+      if (unlikely (!c->buffer->successful)) break;
 
     skip:
       subtable = &StructAfter<ChainSubtable<Types>> (*subtable);
       c->set_lookup_index (c->lookup_index + 1);
     }
+    if (buffer_is_reversed)
+      c->buffer->reverse ();
   }
 
   unsigned int get_size () const { return length; }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -403,20 +403,12 @@
   /* Adds glyph flags in mask to infos with clusters between start and end.
    * The start index will be from out-buffer if from_out_buffer is true.
    * If interior is true, then the cluster having the minimum value is skipped. */
-  void _set_glyph_flags (hb_mask_t mask,
-			 unsigned start = 0,
-			 unsigned end = (unsigned) -1,
-			 bool interior = false,
-			 bool from_out_buffer = false)
+  void _set_glyph_flags_impl (hb_mask_t mask,
+			      unsigned start,
+			      unsigned end,
+			      bool interior,
+			      bool from_out_buffer)
   {
-    if (unlikely (end != (unsigned) -1 && end - start > 255))
-      return;
-
-    end = hb_min (end, len);
-
-    if (interior && !from_out_buffer && end - start < 2)
-      return;
-
     scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
 
     if (!from_out_buffer || !have_output)
@@ -455,6 +447,25 @@
     }
   }
 
+  HB_ALWAYS_INLINE
+  void _set_glyph_flags (hb_mask_t mask,
+			 unsigned start = 0,
+			 unsigned end = (unsigned) -1,
+			 bool interior = false,
+			 bool from_out_buffer = false)
+  {
+    if (unlikely (end != (unsigned) -1 && end - start > 255))
+      return;
+
+    end = hb_min (end, len);
+
+    if (interior && !from_out_buffer && end - start < 2)
+      return;
+
+    _set_glyph_flags_impl (mask, start, end, interior, from_out_buffer);
+  }
+
+
   void unsafe_to_break (unsigned int start = 0, unsigned int end = -1)
   {
     _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-kern.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-kern.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-kern.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -70,7 +70,7 @@
 	continue;
       }
 
-      skippy_iter.reset (idx);
+      skippy_iter.reset_fast (idx);
       unsigned unsafe_to;
       if (!skippy_iter.next (&unsafe_to))
       {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -92,9 +92,10 @@
   {
     set_t set;
     if (likely (glyphCount))
-      set.add_range (0, glyphCount - 1);
-    left_set.union_ (set);
-    right_set.union_ (set);
+    {
+      left_set.add_range (0, num_glyphs - 1);
+      right_set.add_range (0, num_glyphs - 1);
+    }
   }
 
   protected:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -410,18 +410,6 @@
   return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
 }
 static inline bool
-_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
-{
-  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
-}
-static inline void
-_hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
-{
-  if (!_hb_glyph_info_is_unicode_format (info))
-    return;
-  info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
-}
-static inline bool
 _hb_glyph_info_is_aat_deleted (const hb_glyph_info_t *info)
 {
   return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_AAT_DELETED);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc	2025-08-30 22:43:20 UTC (rev 76191)
@@ -409,16 +409,13 @@
 }
 
 static inline void
-position_cluster (const hb_ot_shape_plan_t *plan,
-		  hb_font_t *font,
-		  hb_buffer_t  *buffer,
-		  unsigned int start,
-		  unsigned int end,
-		  bool adjust_offsets_when_zeroing)
+position_cluster_impl (const hb_ot_shape_plan_t *plan,
+		       hb_font_t *font,
+		       hb_buffer_t  *buffer,
+		       unsigned int start,
+		       unsigned int end,
+		       bool adjust_offsets_when_zeroing)
 {
-  if (end - start < 2)
-    return;
-
   /* Find the base glyph */
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = start; i < end; i++)
@@ -441,6 +438,20 @@
     }
 }
 
+static HB_ALWAYS_INLINE void
+position_cluster (const hb_ot_shape_plan_t *plan,
+		  hb_font_t *font,
+		  hb_buffer_t  *buffer,
+		  unsigned int start,
+		  unsigned int end,
+		  bool adjust_offsets_when_zeroing)
+{
+  if (end - start < 2)
+    return;
+
+  position_cluster_impl (plan, font, buffer, start, end, adjust_offsets_when_zeroing);
+}
+
 void
 _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
 				     hb_font_t *font,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2025-08-30 22:43:20 UTC (rev 76191)
@@ -788,7 +788,13 @@
   unsigned int i = 0;
   for (i = 0; i < count; i++)
     if (unlikely (_hb_glyph_info_is_default_ignorable (&info[i])))
-      pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0;
+    {
+      pos[i].x_advance = pos[i].y_advance = 0;
+      if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+	pos[i].x_offset = 0;
+      else
+        pos[i].y_offset = 0;
+    }
 }
 
 static void

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh	2025-08-30 22:43:20 UTC (rev 76191)
@@ -37,7 +37,7 @@
   typedef uint8_t codepoint_t;
   static constexpr unsigned max_len = 4;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
 	const codepoint_t *end,
 	hb_codepoint_t *unicode,
@@ -106,7 +106,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
 	const codepoint_t *start,
 	hb_codepoint_t *unicode,
@@ -185,7 +185,7 @@
   typedef TCodepoint codepoint_t;
   static constexpr unsigned max_len = 2;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
 	const codepoint_t *end,
 	hb_codepoint_t *unicode,
@@ -217,7 +217,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
 	const codepoint_t *start,
 	hb_codepoint_t *unicode,
@@ -294,7 +294,7 @@
   typedef TCodepoint codepoint_t;
   static constexpr unsigned max_len = 1;
 
-  static const TCodepoint *
+  static inline const TCodepoint *
   next (const TCodepoint *text,
 	const TCodepoint *end HB_UNUSED,
 	hb_codepoint_t *unicode,
@@ -306,7 +306,7 @@
     return text;
   }
 
-  static const TCodepoint *
+  static inline const TCodepoint *
   prev (const TCodepoint *text,
 	const TCodepoint *start HB_UNUSED,
 	hb_codepoint_t *unicode,
@@ -353,7 +353,7 @@
   typedef uint8_t codepoint_t;
   static constexpr unsigned max_len = 1;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
 	const codepoint_t *end HB_UNUSED,
 	hb_codepoint_t *unicode,
@@ -363,7 +363,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
 	const codepoint_t *start HB_UNUSED,
 	hb_codepoint_t *unicode,
@@ -405,7 +405,7 @@
   typedef uint8_t codepoint_t;
   static constexpr unsigned max_len = 1;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
 	const codepoint_t *end HB_UNUSED,
 	hb_codepoint_t *unicode,
@@ -417,7 +417,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
 	const codepoint_t *start HB_UNUSED,
 	hb_codepoint_t *unicode,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/rust/Cargo.toml
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/rust/Cargo.toml	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/rust/Cargo.toml	2025-08-30 22:43:20 UTC (rev 76191)
@@ -5,7 +5,7 @@
 
 [dependencies]
 skrifa = { version = "0.*", optional = true }
-harfrust = { version = "0.1.2", optional = true }
+harfrust = { version = "0.2.0", optional = true }
 # harfrust = { git = "https://github.com/harfbuzz/harfrust", optional = true }
 
 [lib]

Modified: trunk/Build/source/libs/harfbuzz/version.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/version.ac	2025-08-30 21:18:29 UTC (rev 76190)
+++ trunk/Build/source/libs/harfbuzz/version.ac	2025-08-30 22:43:20 UTC (rev 76191)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [11.4.4])
+m4_define([harfbuzz_version], [11.4.5])



More information about the tex-live-commits mailing list.