Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package harfbuzz for openSUSE:Factory 
checked in at 2025-10-03 15:42:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/harfbuzz (Old)
 and      /work/SRC/openSUSE:Factory/.harfbuzz.new.11973 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "harfbuzz"

Fri Oct  3 15:42:29 2025 rev:130 rq:1308560 version:12.1.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/harfbuzz/harfbuzz.changes        2025-09-24 
15:23:56.587494546 +0200
+++ /work/SRC/openSUSE:Factory/.harfbuzz.new.11973/harfbuzz.changes     
2025-10-03 15:42:47.386942977 +0200
@@ -1,0 +2,42 @@
+Wed Oct  1 05:36:01 UTC 2025 - Bjørn Lie <[email protected]>
+
+- Update to version 12.1.0:
+  + Build fixes with GCC 15 on some 32 bit platforms.
+  + Fix misaligned pointer use.
+  + New API, hb_ot_layout_lookup_collect_glyph_alternates(), to
+    collect glyph substitutions from single and alternate
+    substitution lookups in one call, instead of getting
+    substitutions one by one using
+    hb_ot_layout_lookup_get_glyph_alternates().
+  + New API: +hb_ot_layout_lookup_collect_glyph_alternates()
+
+-------------------------------------------------------------------
+Sun Sep 28 06:53:01 UTC 2025 - Bjørn Lie <[email protected]>
+
+- Update to version 12.0.0:
+  + The major feature of this release is that the Variable
+    Composites / Components (VARC table) addition to the ISO
+    OpenFontFormat has graduated from experimental, and is now
+    enabled by default. It can be disabled at compile time by
+    defining the HB_NO_VAR_COMPOSITESz macro.
+  + VARC table is a new way to store glyph outlines, that allows
+    for better shape reuse, and can reduce font file size for
+    Chinese, Japanese, Korean, and some other scripts drastically.
+    Some font design tools provide a similar feature to designers,
+    known as "smart components". This technology brings the same
+    idea to the compiled font file.
+  + The Fontra font editor already supports this technology. Note
+    that this new format involves just the HarfBuzz draw API and
+    does not affect shaping.
+  + Correctly handle markFilteringSet lookup field during
+    subsetting.
+  + Deduplicate features during subsetting.
+  + Disable “more” buffer messages that give more verbose output
+    when using buffer messages callbacks, as it has a performance
+    overhead. Users/tools that need the more verbose messages
+    should define HB_BUFFER_MESSAGE_MORE to 1 when building
+    HarfBuzz.
+  + Shaping and instancing optimizations.
+  + Fix subsetting issues when building with GCC 12.
+
+-------------------------------------------------------------------

Old:
----
  harfbuzz-11.5.1.obscpio

New:
----
  harfbuzz-12.1.0.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ harfbuzz.spec ++++++
--- /var/tmp/diff_new_pack.hHZb0X/_old  2025-10-03 15:42:49.091014375 +0200
+++ /var/tmp/diff_new_pack.hHZb0X/_new  2025-10-03 15:42:49.091014375 +0200
@@ -18,7 +18,7 @@
 
 
 Name:           harfbuzz
-Version:        11.5.1
+Version:        12.1.0
 Release:        0
 Summary:        An OpenType text shaping engine
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.hHZb0X/_old  2025-10-03 15:42:49.127015884 +0200
+++ /var/tmp/diff_new_pack.hHZb0X/_new  2025-10-03 15:42:49.127015884 +0200
@@ -3,7 +3,7 @@
   <service name="obs_scm" mode="manual">
     <param name="scm">git</param>
     <param name="url">https://github.com/harfbuzz/harfbuzz.git</param>
-    <param name="revision">11.5.1</param>
+    <param name="revision">12.1.0</param>
     <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
     <param name="versionrewrite-pattern">v?(.*)\+0</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ harfbuzz-11.5.1.obscpio -> harfbuzz-12.1.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/.github/workflows/scorecard.yml 
new/harfbuzz-12.1.0/.github/workflows/scorecard.yml
--- old/harfbuzz-11.5.1/.github/workflows/scorecard.yml 2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/.github/workflows/scorecard.yml 2025-10-01 
07:26:58.000000000 +0200
@@ -59,6 +59,6 @@
 
       # Upload the results to GitHub's code scanning dashboard.
       - name: "Upload to code-scanning"
-        uses: 
github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # 
v3.29.5
+        uses: 
github/codeql-action/upload-sarif@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # 
v3.29.5
         with:
           sarif_file: results.sarif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/NEWS new/harfbuzz-12.1.0/NEWS
--- old/harfbuzz-11.5.1/NEWS    2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/NEWS    2025-10-01 07:26:58.000000000 +0200
@@ -1,3 +1,50 @@
+Overview of changes leading to 12.1.0
+Wednesday, October 1, 2025
+=====================================
+- Build fixes with GCC 15 on some 32 bit platforms.
+- Fix misaligned pointer use.
+- New API, `hb_ot_layout_lookup_collect_glyph_alternates()`, to collect glyph
+  substitutions from single and alternate substitution lookups in one call,
+  instead of getting substitutions one by one using
+  `hb_ot_layout_lookup_get_glyph_alternates()`.
+
+- New API
++hb_ot_layout_lookup_collect_glyph_alternates()
+
+
+Overview of changes leading to 12.0.0
+Sunday, September 28, 2025
+=====================================
+- The major feature of this release is that the Variable Composites /
+  Components (`VARC` table) addition to the ISO OpenFontFormat has graduated
+  from experimental, and is now enabled by default. It can be disabled at
+  compile time by defining the `HB_NO_VAR_COMPOSITES`z macro.
+
+  `VARC` table is a new way to store glyph outlines, that allows for better
+  shape reuse, and can reduce font file size for Chinese, Japanese, Korean, and
+  some other scripts drastically. Some font design tools provide a similar
+  feature to designers, known as "smart components". This technology brings the
+  same idea to the compiled font file. For the format specification, see:
+  https://github.com/harfbuzz/boring-expansion-spec/blob/main/VARC.md
+
+  Test fonts can be found at:
+  https://github.com/notofonts/noto-cjk-varco/releases/tag/v0.003
+
+  The Fontra font editor already supports this technology.
+
+  Note that this new format involves just the HarfBuzz draw API and does not
+  affect shaping.
+
+- Correctly handle `markFilteringSet` lookup field during subsetting.
+- Deduplicate features during subsetting.
+- Disable “more” buffer messages that give more verbose output when using
+  buffer messages callbacks, as it has a performance overhead. Users/tools that
+  need the more verbose messages should define `HB_BUFFER_MESSAGE_MORE` to 1
+  when building HarfBuzz.
+- Shaping and instancing optimizations.
+- Fix subsetting issues when building with GCC 12.
+
+
 Overview of changes leading to 11.5.1
 Monday, September 22, 2025
 =====================================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/docs/harfbuzz-docs.xml 
new/harfbuzz-12.1.0/docs/harfbuzz-docs.xml
--- old/harfbuzz-11.5.1/docs/harfbuzz-docs.xml  2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/docs/harfbuzz-docs.xml  2025-10-01 07:26:58.000000000 
+0200
@@ -118,6 +118,7 @@
       <index id="api-index-full"><title>API Index</title><xi:include 
href="xml/api-index-full.xml"><xi:fallback /></xi:include></index>
       <index id="deprecated-api-index"><title>Index of deprecated 
API</title><xi:include href="xml/api-index-deprecated.xml"><xi:fallback 
/></xi:include></index>
 
+      <index id="api-index-12-1-0"><title>Index of new symbols in 
12.1.0</title><xi:include href="xml/api-index-12.1.0.xml"><xi:fallback 
/></xi:include></index>
       <index id="api-index-11-3-0"><title>Index of new symbols in 
11.3.0</title><xi:include href="xml/api-index-11.3.0.xml"><xi:fallback 
/></xi:include></index>
       <index id="api-index-11-2-0"><title>Index of new symbols in 
11.2.0</title><xi:include href="xml/api-index-11.2.0.xml"><xi:fallback 
/></xi:include></index>
       <index id="api-index-11-0-0"><title>Index of new symbols in 
11.0.0</title><xi:include href="xml/api-index-11.0.0.xml"><xi:fallback 
/></xi:include></index>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/docs/harfbuzz-sections.txt 
new/harfbuzz-12.1.0/docs/harfbuzz-sections.txt
--- old/harfbuzz-11.5.1/docs/harfbuzz-sections.txt      2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/docs/harfbuzz-sections.txt      2025-10-01 
07:26:58.000000000 +0200
@@ -704,6 +704,7 @@
 hb_ot_layout_language_get_required_feature
 hb_ot_layout_lookup_collect_glyphs
 hb_ot_layout_lookup_get_glyph_alternates
+hb_ot_layout_lookup_collect_glyph_alternates
 hb_ot_layout_lookup_get_optical_bound
 hb_ot_layout_lookup_substitute_closure
 hb_ot_layout_lookups_substitute_closure
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/meson.build 
new/harfbuzz-12.1.0/meson.build
--- old/harfbuzz-11.5.1/meson.build     2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/meson.build     2025-10-01 07:26:58.000000000 +0200
@@ -1,6 +1,6 @@
 project('harfbuzz', ['c', 'cpp'],
   meson_version: '>= 0.60.0',
-  version: '11.5.1',
+  version: '12.1.0',
   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
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/OT/Layout/Common/Coverage.hh 
new/harfbuzz-12.1.0/src/OT/Layout/Common/Coverage.hh
--- old/harfbuzz-11.5.1/src/OT/Layout/Common/Coverage.hh        2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/OT/Layout/Common/Coverage.hh        2025-10-01 
07:26:58.000000000 +0200
@@ -337,7 +337,7 @@
     }
     iter_t __end__ () const
     {
-      iter_t it = {};
+      iter_t it;
       it.format = format;
       switch (format)
       {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/OT/Layout/GPOS/ValueFormat.hh 
new/harfbuzz-12.1.0/src/OT/Layout/GPOS/ValueFormat.hh
--- old/harfbuzz-11.5.1/src/OT/Layout/GPOS/ValueFormat.hh       2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/OT/Layout/GPOS/ValueFormat.hh       2025-10-01 
07:26:58.000000000 +0200
@@ -58,7 +58,12 @@
 
   NumType& operator = (uint16_t i) { v = i; return *this; }
 
-  unsigned int get_len () const  { return hb_popcount ((unsigned int) *this); }
+  // Note: spec says skip 2 bytes per bit in the valueformat. But reports
+  // from Microsoft developers indicate that only the fields that are
+  // currently defined are counted. We don't expect any new fields to
+  // be added to ValueFormat. As such, we use the faster hb_popcount8
+  // that only processes the lowest 8 bits.
+  unsigned int get_len () const  { return hb_popcount8 ((uint8_t) *this); }
   unsigned int get_size () const { return get_len () * Value::static_size; }
 
   hb_vector_t<unsigned> get_device_table_indices () const {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/OT/Layout/GSUB/AlternateSet.hh 
new/harfbuzz-12.1.0/src/OT/Layout/GSUB/AlternateSet.hh
--- old/harfbuzz-11.5.1/src/OT/Layout/GSUB/AlternateSet.hh      2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/OT/Layout/GSUB/AlternateSet.hh      2025-10-01 
07:26:58.000000000 +0200
@@ -91,6 +91,19 @@
     return alternates.len;
   }
 
+  void
+  collect_alternates (hb_codepoint_t gid,
+                     hb_map_t  *alternate_count /* IN/OUT */,
+                     hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    + hb_enumerate (alternates)
+    | hb_map ([gid] (hb_pair_t<unsigned, hb_codepoint_t> _) { return hb_pair 
(gid + (_.first << 24), _.second); })
+    | hb_apply ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> &p) -> 
void
+               { _hb_collect_glyph_alternates_add (p.first, p.second,
+                                                   alternate_count, 
alternate_glyphs); })
+    ;
+  }
+
   template <typename Iterator,
             hb_requires (hb_is_source_of (Iterator, hb_codepoint_t))>
   bool serialize (hb_serialize_context_t *c,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/harfbuzz-11.5.1/src/OT/Layout/GSUB/AlternateSubstFormat1.hh 
new/harfbuzz-12.1.0/src/OT/Layout/GSUB/AlternateSubstFormat1.hh
--- old/harfbuzz-11.5.1/src/OT/Layout/GSUB/AlternateSubstFormat1.hh     
2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/OT/Layout/GSUB/AlternateSubstFormat1.hh     
2025-10-01 07:26:58.000000000 +0200
@@ -69,6 +69,19 @@
   { return (this+alternateSet[(this+coverage).get_coverage (gid)])
            .get_alternates (start_offset, alternate_count, alternate_glyphs); }
 
+  void
+  collect_glyph_alternates (hb_map_t  *alternate_count /* IN/OUT */,
+                           hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    + hb_iter (alternateSet)
+    | hb_map (hb_add (this))
+    | hb_zip (this+coverage)
+    | hb_apply ([&] (const hb_pair_t<const AlternateSet<Types> &, 
hb_codepoint_t> _) {
+                 _.first.collect_alternates (_.second, alternate_count, 
alternate_glyphs);
+               })
+    ;
+  }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/harfbuzz-11.5.1/src/OT/Layout/GSUB/SingleSubstFormat1.hh 
new/harfbuzz-12.1.0/src/OT/Layout/GSUB/SingleSubstFormat1.hh
--- old/harfbuzz-11.5.1/src/OT/Layout/GSUB/SingleSubstFormat1.hh        
2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/OT/Layout/GSUB/SingleSubstFormat1.hh        
2025-10-01 07:26:58.000000000 +0200
@@ -123,6 +123,21 @@
     return 1;
   }
 
+  void
+  collect_glyph_alternates (hb_map_t  *alternate_count /* IN/OUT */,
+                           hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    hb_codepoint_t d = deltaGlyphID;
+    hb_codepoint_t mask = get_mask ();
+
+    + hb_iter (this+coverage)
+    | hb_map ([d, mask] (hb_codepoint_t g) { return hb_pair (g, (g + d) & 
mask); })
+    | hb_apply ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> &p) -> 
void
+               { _hb_collect_glyph_alternates_add (p.first, p.second,
+                                                   alternate_count, 
alternate_glyphs); })
+    ;
+  }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/harfbuzz-11.5.1/src/OT/Layout/GSUB/SingleSubstFormat2.hh 
new/harfbuzz-12.1.0/src/OT/Layout/GSUB/SingleSubstFormat2.hh
--- old/harfbuzz-11.5.1/src/OT/Layout/GSUB/SingleSubstFormat2.hh        
2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/OT/Layout/GSUB/SingleSubstFormat2.hh        
2025-10-01 07:26:58.000000000 +0200
@@ -100,6 +100,17 @@
     return 1;
   }
 
+  void
+  collect_glyph_alternates (hb_map_t  *alternate_count /* IN/OUT */,
+                           hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    + hb_zip (this+coverage, substitute)
+    | hb_apply ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> &p) -> 
void
+               { _hb_collect_glyph_alternates_add (p.first, p.second,
+                                                   alternate_count, 
alternate_glyphs); })
+    ;
+  }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/graph/gsubgpos-graph.hh 
new/harfbuzz-12.1.0/src/graph/gsubgpos-graph.hh
--- old/harfbuzz-11.5.1/src/graph/gsubgpos-graph.hh     2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/graph/gsubgpos-graph.hh     2025-10-01 
07:26:58.000000000 +0200
@@ -87,6 +87,12 @@
     return lookupType == extension_type (table_tag);
   }
 
+  bool use_mark_filtering_set () const
+  {
+    unsigned flag = lookupFlag;
+    return flag & 0x0010u;
+  }
+
   bool make_extension (gsubgpos_graph_context_t& c,
                        unsigned this_index)
   {
@@ -220,6 +226,9 @@
     }
     hb_memcpy (buffer, v->obj.head, v->table_size());
 
+    if (use_mark_filtering_set ())
+      hb_memcpy (buffer + new_size - 2, v->obj.tail - 2, 2);
+
     v->obj.head = buffer;
     v->obj.tail = buffer + new_size;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-algs.hh 
new/harfbuzz-12.1.0/src/hb-algs.hh
--- old/harfbuzz-11.5.1/src/hb-algs.hh  2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-algs.hh  2025-10-01 07:26:58.000000000 +0200
@@ -92,6 +92,7 @@
 struct __attribute__((packed)) hb_packed_t { Type v; };
 
 #ifndef HB_FAST_NUM_ACCESS
+
 #if defined(__OPTIMIZE__) && \
     defined(__BYTE_ORDER) && \
     (__BYTE_ORDER == __BIG_ENDIAN || \
@@ -102,6 +103,13 @@
 #else
 #define HB_FAST_NUM_ACCESS 0
 #endif
+
+// https://github.com/harfbuzz/harfbuzz/issues/5456
+#if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ <= 12)
+#undef HB_FAST_NUM_ACCESS
+#define HB_FAST_NUM_ACCESS 0
+#endif
+
 #endif
 
 template <bool BE, typename Type, int Bytes = sizeof (Type)>
@@ -846,6 +854,17 @@
  * Bithacks.
  */
 
+/* Return the number of 1 bits in a uint8_t; faster than hb_popcount() */
+static inline unsigned
+hb_popcount8 (uint8_t v)
+{
+  static const uint8_t popcount4[16] = {
+    0, 1, 1, 2, 1, 2, 2, 3,
+    1, 2, 2, 3, 2, 3, 3, 4
+  };
+  return popcount4[v & 0xF] + popcount4[v >> 4];
+}
+
 /* Return the number of 1 bits in v. */
 template <typename T>
 static inline unsigned int
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-alloc-pool.hh 
new/harfbuzz-12.1.0/src/hb-alloc-pool.hh
--- old/harfbuzz-11.5.1/src/hb-alloc-pool.hh    2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-alloc-pool.hh    2025-10-01 07:26:58.000000000 
+0200
@@ -67,8 +67,7 @@
       return ret;
     }
 
-    unsigned pad = current_chunk.length & (alignment - 1);
-    if (pad) pad = alignment - pad;
+    unsigned pad = (unsigned)(-(uintptr_t) current_chunk.arrayZ) & (alignment 
- 1);
 
     // Small chunk, allocate from the last chunk.
     if (current_chunk.length < pad + size)
@@ -78,9 +77,10 @@
       hb_vector_t<char> &chunk = chunks.arrayZ[chunks.length - 1];
       if (unlikely (!chunk.resize (ChunkSize))) return nullptr;
       current_chunk = chunk;
+      pad = (unsigned)(-(uintptr_t) current_chunk.arrayZ) & (alignment - 1);
     }
-    else
-      current_chunk += pad;
+
+    current_chunk += pad;
 
     assert (current_chunk.length >= size);
     void *ret = current_chunk.arrayZ;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-bit-page.hh 
new/harfbuzz-12.1.0/src/hb-bit-page.hh
--- old/harfbuzz-11.5.1/src/hb-bit-page.hh      2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-bit-page.hh      2025-10-01 07:26:58.000000000 
+0200
@@ -363,10 +363,9 @@
     hb_codepoint_t __item__ () const { return v; }
     bool __more__ () const { return v != INVALID; }
     void __next__ () {
-       s->next (&v); if (l) l--;
+       s->next (&v);
     }
     void __prev__ () { s->previous (&v); }
-    unsigned __len__ () const { return l; }
     iter_t end () const { return iter_t (*s, false); }
     bool operator != (const iter_t& o) const
     { return v != o.v; }
@@ -374,7 +373,6 @@
     protected:
     const hb_bit_page_t *s;
     hb_codepoint_t v;
-    unsigned l;
   };
   iter_t iter () const { return iter_t (*this); }
   operator iter_t () const { return iter (); }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-buffer.hh 
new/harfbuzz-12.1.0/src/hb-buffer.hh
--- old/harfbuzz-11.5.1/src/hb-buffer.hh        2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-buffer.hh        2025-10-01 07:26:58.000000000 
+0200
@@ -32,6 +32,7 @@
 
 #include "hb.hh"
 #include "hb-unicode.hh"
+#include "hb-set-digest.hh"
 
 
 static_assert ((sizeof (hb_glyph_info_t) == 20), "");
@@ -44,14 +45,14 @@
 
 enum hb_buffer_scratch_flags_t {
   HB_BUFFER_SCRATCH_FLAG_DEFAULT                       = 0x00000000u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII                 = 0x00000001u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_FRACTION_SLASH            = 0x00000001u,
   HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES                = 0x00000002u,
   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK            = 0x00000004u,
   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT           = 0x00000008u,
   HB_BUFFER_SCRATCH_FLAG_HAS_CGJ                       = 0x00000010u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS               = 0x00000020u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE           = 0x00000040u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_VARIATION_SELECTOR_FALLBACK= 0x00000080u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE           = 0x00000020u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_VARIATION_SELECTOR_FALLBACK= 0x00000040u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS             = 0x00000080u,
 
   /* Reserved for shapers' internal use. */
   HB_BUFFER_SCRATCH_FLAG_SHAPER0                       = 0x01000000u,
@@ -109,6 +110,7 @@
   hb_codepoint_t context[2][CONTEXT_LENGTH];
   unsigned int context_len[2];
 
+  hb_set_digest_t digest; /* Manually updated sometimes */
 
   /*
    * Managed by enter / leave
@@ -199,6 +201,12 @@
   void collect_codepoints (set_t &d) const
   { d.clear (); d.add_array (&info[0].codepoint, len, sizeof (info[0])); }
 
+  void update_digest ()
+  {
+    digest = hb_set_digest_t ();
+    collect_codepoints (digest);
+  }
+
   HB_INTERNAL void similar (const hb_buffer_t &src);
   HB_INTERNAL void reset ();
   HB_INTERNAL void clear ();
@@ -362,7 +370,7 @@
     {
       if (out_info != info || out_len != idx)
       {
-       if (unlikely (!make_room_for (n, n))) return false;
+       if (unlikely (!ensure (out_len + n))) return false;
        memmove (out_info + out_len, info + idx, n * sizeof (out_info[0]));
       }
       out_len += n;
@@ -409,8 +417,6 @@
                              bool interior,
                              bool from_out_buffer)
   {
-    scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
-
     if (!from_out_buffer || !have_output)
     {
       if (!interior)
@@ -628,10 +634,7 @@
     {
       for (unsigned int i = start; i < end; i++)
        if (cluster != infos[i].cluster)
-       {
-         scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
          infos[i].mask |= mask;
-       }
       return;
     }
 
@@ -640,18 +643,12 @@
     if (cluster == cluster_first)
     {
       for (unsigned int i = end; start < i && infos[i - 1].cluster != 
cluster_first; i--)
-      {
-       scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
        infos[i - 1].mask |= mask;
-      }
     }
     else /* cluster == cluster_last */
     {
       for (unsigned int i = start; i < end && infos[i].cluster != 
cluster_last; i++)
-      {
-       scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
        infos[i].mask |= mask;
-      }
     }
   }
   unsigned
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-config.hh 
new/harfbuzz-12.1.0/src/hb-config.hh
--- old/harfbuzz-11.5.1/src/hb-config.hh        2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-config.hh        2025-10-01 07:26:58.000000000 
+0200
@@ -38,7 +38,6 @@
 #ifndef HB_EXPERIMENTAL_API
 #define HB_NO_BEYOND_64K
 #define HB_NO_CUBIC_GLYF
-#define HB_NO_VAR_COMPOSITES
 #endif
 
 #ifdef HB_TINY
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-debug.hh 
new/harfbuzz-12.1.0/src/hb-debug.hh
--- old/harfbuzz-11.5.1/src/hb-debug.hh 2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-debug.hh 2025-10-01 07:26:58.000000000 +0200
@@ -488,7 +488,7 @@
 
 
 #ifndef HB_BUFFER_MESSAGE_MORE
-#define HB_BUFFER_MESSAGE_MORE (HB_DEBUG+1)
+#define HB_BUFFER_MESSAGE_MORE (HB_DEBUG+0)
 #endif
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-map.hh 
new/harfbuzz-12.1.0/src/hb-map.hh
--- old/harfbuzz-11.5.1/src/hb-map.hh   2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-map.hh   2025-10-01 07:26:58.000000000 +0200
@@ -491,10 +491,17 @@
   /* Sink interface. */
   hb_hashmap_t& operator << (const hb_pair_t<K, V>& v)
   { set (v.first, v.second); return *this; }
+  template <typename V2 = V,
+           hb_enable_if (!std::is_trivially_copyable<V2>::value)>
   hb_hashmap_t& operator << (const hb_pair_t<K, V&&>& v)
   { set (v.first, std::move (v.second)); return *this; }
+  template <typename K2 = K,
+           hb_enable_if (!std::is_trivially_copyable<K2>::value)>
   hb_hashmap_t& operator << (const hb_pair_t<K&&, V>& v)
   { set (std::move (v.first), v.second); return *this; }
+  template <typename K2 = K, typename V2 = V,
+           hb_enable_if (!std::is_trivially_copyable<K2>::value &&
+                         !std::is_trivially_copyable<V2>::value)>
   hb_hashmap_t& operator << (const hb_pair_t<K&&, V&&>& v)
   { set (std::move (v.first), std::move (v.second)); return *this; }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-ot-layout-common.hh 
new/harfbuzz-12.1.0/src/hb-ot-layout-common.hh
--- old/harfbuzz-11.5.1/src/hb-ot-layout-common.hh      2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-ot-layout-common.hh      2025-10-01 
07:26:58.000000000 +0200
@@ -141,6 +141,7 @@
   const hb_map_t *lookup_index_map;
   const hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map;
   const hb_map_t *feature_index_map;
+  const hb_map_t *feature_map_w_duplicates;
   const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map;
   hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> 
*feature_record_cond_idx_map;
   const hb_set_t *catch_all_record_feature_idxes;
@@ -165,6 +166,7 @@
       lookup_index_map = &c_->plan->gsub_lookups;
       script_langsys_map = &c_->plan->gsub_langsys;
       feature_index_map = &c_->plan->gsub_features;
+      feature_map_w_duplicates = &c_->plan->gsub_features_w_duplicates;
       feature_substitutes_map = &c_->plan->gsub_feature_substitutes_map;
       feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? 
nullptr : &c_->plan->gsub_feature_record_cond_idx_map;
       catch_all_record_feature_idxes = &c_->plan->gsub_old_features;
@@ -175,6 +177,7 @@
       lookup_index_map = &c_->plan->gpos_lookups;
       script_langsys_map = &c_->plan->gpos_langsys;
       feature_index_map = &c_->plan->gpos_features;
+      feature_map_w_duplicates = &c_->plan->gpos_features_w_duplicates;
       feature_substitutes_map = &c_->plan->gpos_feature_substitutes_map;
       feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? 
nullptr : &c_->plan->gpos_feature_record_cond_idx_map;
       catch_all_record_feature_idxes = &c_->plan->gpos_old_features;
@@ -1082,15 +1085,15 @@
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     const uint32_t *v;
-    out->reqFeatureIndex = l->feature_index_map->has (reqFeatureIndex, &v) ? 
*v : 0xFFFFu;
+    out->reqFeatureIndex = l->feature_map_w_duplicates->has (reqFeatureIndex, 
&v) ? *v : 0xFFFFu;
 
     if (!l->visitFeatureIndex (featureIndex.len))
       return_trace (false);
 
     auto it =
     + hb_iter (featureIndex)
-    | hb_filter (l->feature_index_map)
-    | hb_map (l->feature_index_map)
+    | hb_filter (l->feature_map_w_duplicates)
+    | hb_map (l->feature_map_w_duplicates)
     ;
 
     bool ret = bool (it);
@@ -4459,7 +4462,7 @@
     if (unlikely (!s->extend_min (this))) return_trace (false);
 
     uint32_t *new_feature_idx;
-    if (!c->feature_index_map->has (feature_index, &new_feature_idx))
+    if (!c->feature_map_w_duplicates->has (feature_index, &new_feature_idx))
       return_trace (false);
 
     if (!s->check_assign (featureIndex, *new_feature_idx, 
HB_SERIALIZE_ERROR_INT_OVERFLOW))
@@ -4477,7 +4480,7 @@
   {
     TRACE_SUBSET (this);
     uint32_t *new_feature_index;
-    if (!c->feature_index_map->has (featureIndex, &new_feature_index))
+    if (!c->feature_map_w_duplicates->has (featureIndex, &new_feature_index))
       return_trace (false);
 
     auto *out = c->subset_context->serializer->embed (this);
@@ -4751,7 +4754,7 @@
 
     int keep_up_to = -1;
     for (int i = varRecords.len - 1; i >= 0; i--) {
-      if (varRecords[i].intersects_features (this, l->feature_index_map)) {
+      if (varRecords[i].intersects_features (this, 
l->feature_map_w_duplicates)) {
         keep_up_to = i;
         break;
       }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-ot-layout-gsubgpos.hh 
new/harfbuzz-12.1.0/src/hb-ot-layout-gsubgpos.hh
--- old/harfbuzz-11.5.1/src/hb-ot-layout-gsubgpos.hh    2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-ot-layout-gsubgpos.hh    2025-10-01 
07:26:58.000000000 +0200
@@ -715,7 +715,6 @@
   const hb_ot_layout_lookup_accelerator_t *lookup_accel = nullptr;
   const ItemVariationStore &var_store;
   hb_scalar_cache_t *var_store_cache;
-  hb_set_digest_t digest;
 
   hb_direction_t direction;
   hb_mask_t lookup_mask = 1;
@@ -764,7 +763,6 @@
                        has_glyph_classes (gdef.has_glyph_classes ())
   {
     init_iters ();
-    buffer->collect_codepoints (digest);
     match_positions.set_storage (stack_match_positions);
   }
 
@@ -837,7 +835,7 @@
                          bool ligature = false,
                          bool component = false)
   {
-    digest.add (glyph_index);
+    buffer->digest.add (glyph_index);
 
     if (new_syllables != (unsigned) -1)
       buffer->cur().syllable() = new_syllables;
@@ -3463,7 +3461,7 @@
       const auto &input = StructAfter<decltype (r.inputX)> (r.backtrack);
       const auto &lookahead = StructAfter<decltype (r.lookaheadX)> (input);
 
-      unsigned lenP1 = hb_max ((unsigned) input.lenP1, 1u);
+      unsigned lenP1 = input.lenP1;
       if (lenP1 > 1 ?
           (!match_input ||
            match_input (*first, input.arrayZ[0], input_data))
@@ -3471,6 +3469,7 @@
           (!lookahead.len || !match_lookahead ||
            match_lookahead (*first, lookahead.arrayZ[0], lookahead_data)))
       {
+       lenP1 = hb_max (lenP1, 1u);
         if (!second ||
            (lenP1 > 2 ?
             (!match_input ||
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-ot-layout.cc 
new/harfbuzz-12.1.0/src/hb-ot-layout.cc
--- old/harfbuzz-11.5.1/src/hb-ot-layout.cc     2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-ot-layout.cc     2025-10-01 07:26:58.000000000 
+0200
@@ -1921,13 +1921,21 @@
 
   bool ret = false;
   hb_buffer_t *buffer = c->buffer;
-  while (buffer->idx < buffer->len && buffer->successful)
+  while (buffer->successful)
   {
-    auto &cur = buffer->cur();
-    if (accel.digest.may_have (cur.codepoint) &&
-       (cur.mask & c->lookup_mask) &&
-       c->check_glyph_property (&cur, c->lookup_props) &&
-        accel.apply (c, use_hot_subtable_cache))
+    hb_glyph_info_t *info = buffer->info;
+    unsigned j = buffer->idx;
+    while (j < buffer->len &&
+          !(accel.digest.may_have (info[j].codepoint) &&
+            (info[j].mask & c->lookup_mask) &&
+            c->check_glyph_property (&info[j], c->lookup_props)))
+      j++;
+    if (unlikely (j > buffer->idx && !buffer->next_glyphs (j - buffer->idx)))
+      break;
+    if (buffer->idx >= buffer->len)
+      break;
+
+    if (accel.apply (c, use_hot_subtable_cache))
       ret = true;
     else
       (void) buffer->next_glyph ();
@@ -2028,11 +2036,8 @@
       if (buffer->messaging () &&
          !buffer->message (font, "start lookup %u feature '%c%c%c%c'", 
lookup_index, HB_UNTAG (lookup.feature_tag))) continue;
 
-      /* c.digest is a digest of all the current glyphs in the buffer
-       * (plus some past glyphs).
-       *
-       * Only try applying the lookup if there is any overlap. */
-      if (accel->digest.may_intersect (c.digest))
+      /* Only try applying the lookup if there is any overlap. */
+      if (accel->digest.may_intersect (buffer->digest))
       {
        c.set_lookup_index (lookup_index);
        c.set_lookup_mask (lookup.mask, false);
@@ -2058,7 +2063,7 @@
       if (stage->pause_func (plan, font, buffer))
       {
        /* Refresh working buffer digest since buffer changed. */
-       buffer->collect_codepoints (c.digest);
+       buffer->update_digest ();
       }
     }
   }
@@ -2592,6 +2597,7 @@
 #endif
 
 
+#ifndef HB_NO_LAYOUT_RARELY_USED
 struct hb_get_glyph_alternates_dispatch_t :
        hb_dispatch_context_t<hb_get_glyph_alternates_dispatch_t, unsigned>
 {
@@ -2611,7 +2617,6 @@
   ( _dispatch (obj, hb_prioritize, std::forward<Ts> (ds)...) )
 };
 
-#ifndef HB_NO_LAYOUT_RARELY_USED
 /**
  * hb_ot_layout_lookup_get_glyph_alternates:
  * @face: a face.
@@ -2645,6 +2650,64 @@
   return ret;
 }
 
+struct hb_collect_glyph_alternates_dispatch_t :
+       hb_dispatch_context_t<hb_collect_glyph_alternates_dispatch_t, bool>
+{
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return false; }
+
+  private:
+  template <typename T, typename ...Ts> auto
+  _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
+  ( (obj.collect_glyph_alternates (std::forward<Ts> (ds)...), true) )
+  template <typename T, typename ...Ts> auto
+  _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN
+  ( default_return_value () )
+  public:
+  template <typename T, typename ...Ts> auto
+  dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
+  ( _dispatch (obj, hb_prioritize, std::forward<Ts> (ds)...) )
+};
+
+/**
+ * hb_ot_layout_lookup_collect_glyph_alternates:
+ * @face: a face.
+ * @lookup_index: index of the feature lookup to query.
+ * @alternate_count: (inout): mapping from glyph index to number of alternates 
for that glyph.
+ * @alternate_glyphs: (inout): mapping from encoded glyph index and alternate 
index, to alternate glyph ids.
+ *
+ * Collects alternates of glyphs from a given GSUB lookup index.
+ *
+ * For one-to-one GSUB glyph substitutions, this function collects the
+ * substituted glyph.
+ *
+ * For lookups that assign multiple alternates to a glyph, all alternate 
glyphs are collected.
+ *
+ * For other lookup types, nothing is performed and `false` is returned.
+ *
+ * The `alternate_count` mapping will contain the number of alternates for 
each glyph id.
+ * Upon entry, this mapping should contain the glyph ids as keys, and the 
number of alternates
+ * currently known for each glyph id as values.
+ *
+ * The `alternate_glyphs` mapping will contain the alternate glyph ids for 
each glyph id.
+ * The mapping is encoded in the following way, upon entry and after 
processing:
+ * If G is the glyph id, and A0, A1, ..., A(n-1) are the alternate glyph ids,
+ * the mapping will contain the following entries: (G + (i << 24)) -> A(i)
+ * for i = 0, 1, ..., n-1 where n is the number of alternates for G as per 
`alternate_count`.
+ *
+ * Return value: `true` if alternates were collected, `false` otherwise.
+ * Since: 12.1.0
+ */
+HB_EXTERN hb_bool_t
+hb_ot_layout_lookup_collect_glyph_alternates (hb_face_t *face,
+                                             unsigned   lookup_index,
+                                             hb_map_t  *alternate_count /* 
IN/OUT */,
+                                             hb_map_t  *alternate_glyphs /* 
IN/OUT */)
+{
+  hb_collect_glyph_alternates_dispatch_t c;
+  const OT::SubstLookup &lookup = face->table.GSUB->table->get_lookup 
(lookup_index);
+  return lookup.dispatch (&c, alternate_count, alternate_glyphs);
+}
 
 struct hb_position_single_dispatch_t :
        hb_dispatch_context_t<hb_position_single_dispatch_t, bool>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-ot-layout.h 
new/harfbuzz-12.1.0/src/hb-ot-layout.h
--- old/harfbuzz-11.5.1/src/hb-ot-layout.h      2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-ot-layout.h      2025-10-01 07:26:58.000000000 
+0200
@@ -384,6 +384,12 @@
                                          hb_codepoint_t *alternate_glyphs /* 
OUT */);
 
 HB_EXTERN hb_bool_t
+hb_ot_layout_lookup_collect_glyph_alternates (hb_face_t *face,
+                                             unsigned   lookup_index,
+                                             hb_map_t  *alternate_count /* 
IN/OUT */,
+                                             hb_map_t  *alternate_glyphs /* 
IN/OUT */);
+
+HB_EXTERN hb_bool_t
 hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
                                      unsigned int          lookup_index,
                                      const hb_codepoint_t *glyphs,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-ot-layout.hh 
new/harfbuzz-12.1.0/src/hb-ot-layout.hh
--- old/harfbuzz-11.5.1/src/hb-ot-layout.hh     2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-ot-layout.hh     2025-10-01 07:26:58.000000000 
+0200
@@ -217,8 +217,6 @@
 
   if (u >= 0x80u)
   {
-    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
-
     if (unlikely (unicode->is_default_ignorable (u)))
     {
       buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
@@ -247,6 +245,7 @@
 
     if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
     {
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS;
       props |= UPROPS_MASK_CONTINUATION;
       props |= unicode->modified_combining_class (u)<<8;
     }
@@ -361,8 +360,9 @@
 }
 
 static inline void
-_hb_glyph_info_set_continuation (hb_glyph_info_t *info)
+_hb_glyph_info_set_continuation (hb_glyph_info_t *info, hb_buffer_t *buffer)
 {
+  buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS;
   info->unicode_props() |= UPROPS_MASK_CONTINUATION;
 }
 static inline void
@@ -645,4 +645,18 @@
 #undef lig_props
 #undef glyph_props
 
+static inline void
+_hb_collect_glyph_alternates_add (hb_codepoint_t from,
+                                 hb_codepoint_t to,
+                                 hb_map_t *alternate_count,
+                                 hb_map_t *alternate_glyphs)
+{
+  hb_codepoint_t zero = 0;
+  hb_codepoint_t *i = &zero;
+  alternate_count->has (from, &i);
+  alternate_glyphs->set (from | (*i << 24), to);
+  alternate_count->set (from, *i + 1);
+}
+
+
 #endif /* HB_OT_LAYOUT_HH */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-ot-shape.cc 
new/harfbuzz-12.1.0/src/hb-ot-shape.cc
--- old/harfbuzz-11.5.1/src/hb-ot-shape.cc      2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-ot-shape.cc      2025-10-01 07:26:58.000000000 
+0200
@@ -501,7 +501,7 @@
     if (unlikely (gen_cat == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
                  hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F3FBu, 
0x1F3FFu)))
     {
-      _hb_glyph_info_set_continuation (&info[i]);
+      _hb_glyph_info_set_continuation (&info[i], buffer);
     }
     /* Regional_Indicators are hairy as hell...
      * https://github.com/harfbuzz/harfbuzz/issues/2265 */
@@ -509,18 +509,18 @@
     {
       if (_hb_codepoint_is_regional_indicator (info[i - 1].codepoint) &&
          !_hb_glyph_info_is_continuation (&info[i - 1]))
-       _hb_glyph_info_set_continuation (&info[i]);
+       _hb_glyph_info_set_continuation (&info[i], buffer);
     }
 #ifndef HB_NO_EMOJI_SEQUENCES
     else if (unlikely (_hb_glyph_info_is_zwj (&info[i])))
     {
-      _hb_glyph_info_set_continuation (&info[i]);
+      _hb_glyph_info_set_continuation (&info[i], buffer);
       if (i + 1 < count &&
          _hb_unicode_is_emoji_Extended_Pictographic (info[i + 1].codepoint))
       {
        i++;
        _hb_glyph_info_set_unicode_props (&info[i], buffer);
-       _hb_glyph_info_set_continuation (&info[i]);
+       _hb_glyph_info_set_continuation (&info[i], buffer);
       }
     }
 #endif
@@ -539,7 +539,9 @@
      * https://github.com/harfbuzz/harfbuzz/issues/3844
      */
     else if (unlikely (hb_in_ranges<hb_codepoint_t> (info[i].codepoint, 
0xFF9Eu, 0xFF9Fu, 0xE0020u, 0xE007Fu)))
-      _hb_glyph_info_set_continuation (&info[i]);
+      _hb_glyph_info_set_continuation (&info[i], buffer);
+    else if (unlikely (info[i].codepoint == 0x2044u /* FRACTION SLASH */))
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_FRACTION_SLASH;
   }
 }
 
@@ -575,7 +577,7 @@
 static void
 hb_form_clusters (hb_buffer_t *buffer)
 {
-  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII))
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS))
     return;
 
   if (HB_BUFFER_CLUSTER_LEVEL_IS_GRAPHEMES (buffer->cluster_level))
@@ -690,7 +692,7 @@
   return;
 #endif
 
-  if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+  if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_FRACTION_SLASH) 
||
       !c->plan->has_frac)
     return;
 
@@ -921,11 +923,17 @@
 
 #ifndef HB_NO_AAT_SHAPE
   if (unlikely (c->plan->apply_morx))
+  {
     hb_aat_layout_substitute (c->plan, c->font, c->buffer,
                              c->user_features, c->num_user_features);
+    c->buffer->update_digest ();
+  }
   else
 #endif
+  {
+    c->buffer->update_digest ();
     c->plan->substitute (c->font, buffer);
+  }
 }
 
 static inline void
@@ -1107,8 +1115,33 @@
   /* Propagate cluster-level glyph flags to be the same on all cluster glyphs.
    * Simplifies using them. */
 
-  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS))
+  hb_mask_t and_mask = HB_GLYPH_FLAG_DEFINED;
+  if ((buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0)
+    and_mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
+
+  hb_glyph_info_t *info = buffer->info;
+
+  if ((buffer->flags & HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL) == 0)
+  {
+    foreach_cluster (buffer, start, end)
+    {
+      if (end - start == 1)
+      {
+        info[start].mask &= and_mask;
+       continue;
+      }
+
+      unsigned int mask = 0;
+      for (unsigned int i = start; i < end; i++)
+       mask |= info[i].mask;
+
+      mask &= and_mask;
+
+      for (unsigned int i = start; i < end; i++)
+       info[i].mask = mask;
+    }
     return;
+  }
 
   /* If we are producing SAFE_TO_INSERT_TATWEEL, then do two things:
    *
@@ -1116,30 +1149,20 @@
    *   are UNSAFE_TO_BREAK, then clear the SAFE_TO_INSERT_TATWEEL,
    * - Any place that is SAFE_TO_INSERT_TATWEEL, is also now UNSAFE_TO_BREAK.
    *
-   * We couldn't make this interaction earlier. It has to be done here.
+   * We couldn't make this interaction earlier. It has to be done this way.
    */
-  bool flip_tatweel = buffer->flags & 
HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL;
-
-  bool clear_concat = (buffer->flags & 
HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0;
-
-  hb_glyph_info_t *info = buffer->info;
-
   foreach_cluster (buffer, start, end)
   {
     unsigned int mask = 0;
     for (unsigned int i = start; i < end; i++)
-      mask |= info[i].mask & HB_GLYPH_FLAG_DEFINED;
+      mask |= info[i].mask;
 
-    if (flip_tatweel)
-    {
-      if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
-       mask &= ~HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL;
-      if (mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL)
-       mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
-    }
+    if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
+      mask &= ~HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL;
+    if (mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL)
+      mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
 
-    if (clear_concat)
-       mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
+    mask &= and_mask;
 
     for (unsigned int i = start; i < end; i++)
       info[i].mask = mask;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-ot-shaper-thai.cc 
new/harfbuzz-12.1.0/src/hb-ot-shaper-thai.cc
--- old/harfbuzz-11.5.1/src/hb-ot-shaper-thai.cc        2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-ot-shaper-thai.cc        2025-10-01 
07:26:58.000000000 +0200
@@ -334,7 +334,7 @@
 
     /* Is SARA AM. Decompose and reorder. */
     (void) buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
-    _hb_glyph_info_set_continuation (&buffer->prev());
+    _hb_glyph_info_set_continuation (&buffer->prev(), buffer);
     if (unlikely (!buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u)))) break;
 
     /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-script-list.h 
new/harfbuzz-12.1.0/src/hb-script-list.h
--- old/harfbuzz-11.5.1/src/hb-script-list.h    2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-script-list.h    2025-10-01 07:26:58.000000000 
+0200
@@ -466,7 +466,7 @@
   HB_SCRIPT_TULU_TIGALARI              = HB_TAG ('T','u','t','g'), /*16.0*/
 
   /*
-   * Since REPLACEME
+   * Since 11.5.0
    */
   HB_SCRIPT_BERIA_ERFE                 = HB_TAG ('B','e','r','f'), /*17.0*/
   HB_SCRIPT_SIDETIC                    = HB_TAG ('S','i','d','t'), /*17.0*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-set-digest.hh 
new/harfbuzz-12.1.0/src/hb-set-digest.hh
--- old/harfbuzz-11.5.1/src/hb-set-digest.hh    2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-set-digest.hh    2025-10-01 07:26:58.000000000 
+0200
@@ -55,11 +55,11 @@
  *   - For each glyph, if it doesn't match the subtable digest,
  *     skip it.
  *
- * The main filter we use is a combination of four bits-pattern
+ * The filter we use is a combination of three bits-pattern
  * filters. A bits-pattern filter checks a number of bits (5 or 6)
- * of the input number (glyph-id in this case) and checks whether
+ * of the input number (glyph-id in most cases) and checks whether
  * its pattern is amongst the patterns of any of the accepted values.
- * The accepted patterns are represented as a "long" integer. The
+ * The accepted patterns are represented as a "long" integer. Each
  * check is done using four bitwise operations only.
  */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-subset-instancer-iup.cc 
new/harfbuzz-12.1.0/src/hb-subset-instancer-iup.cc
--- old/harfbuzz-11.5.1/src/hb-subset-instancer-iup.cc  2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-subset-instancer-iup.cc  2025-10-01 
07:26:58.000000000 +0200
@@ -184,6 +184,7 @@
                           const contour_point_t& p1, const contour_point_t& p2,
                           int p1_dx, int p2_dx,
                           int p1_dy, int p2_dy,
+                         double tolerance_sq,
                           hb_vector_t<double>& interp_x_deltas, /* OUT */
                           hb_vector_t<double>& interp_y_deltas /* OUT */)
 {
@@ -194,22 +195,28 @@
 
   for (unsigned j = 0; j < 2; j++)
   {
+    float contour_point_t::* xp;
     double x1, x2, d1, d2;
+    const int *in;
     double *out;
     if (j == 0)
     {
+      xp = &contour_point_t::x;
       x1 = static_cast<double> (p1.x);
       x2 = static_cast<double> (p2.x);
       d1 = p1_dx;
       d2 = p2_dx;
+      in = x_deltas.arrayZ;
       out = interp_x_deltas.arrayZ;
     }
     else
     {
+      xp = &contour_point_t::y;
       x1 = static_cast<double> (p1.y);
       x2 = static_cast<double> (p2.y);
       d1 = p1_dy;
       d2 = p2_dy;
+      in = y_deltas.arrayZ;
       out = interp_y_deltas.arrayZ;
     }
 
@@ -237,7 +244,7 @@
     double scale = (d2 - d1) / (x2 - x1);
     for (unsigned i = 0; i < n; i++)
     {
-      double x = (j == 0 ? static_cast<double> (contour_points.arrayZ[i].x) : 
static_cast<double> (contour_points.arrayZ[i].y));
+      double x = (double) (contour_points.arrayZ[i].*xp);
       double d;
       if (x <= x1)
         d = d1;
@@ -247,6 +254,9 @@
         d = d1 + (x - x1) * scale;
 
       out[i] = d;
+      double err = d - in[i];
+      if (err * err > tolerance_sq)
+       return false;
     }
   }
   return true;
@@ -258,18 +268,18 @@
                                  const contour_point_t& p1, const 
contour_point_t& p2,
                                  int p1_dx, int p2_dx,
                                  int p1_dy, int p2_dy,
-                                 double tolerance,
+                                 double tolerance_sq,
                                 hb_vector_t<double> &interp_x_deltas, /* 
scratch */
                                 hb_vector_t<double> &interp_y_deltas /* 
scratch */)
 {
   if (!_iup_segment (contour_points, x_deltas, y_deltas,
                      p1, p2, p1_dx, p2_dx, p1_dy, p2_dy,
+                    tolerance_sq,
                      interp_x_deltas, interp_y_deltas))
     return false;
 
   unsigned num = contour_points.length;
 
-  double tolerance_sq = tolerance * tolerance;
   for (unsigned i = 0; i < num; i++)
   {
     double dx = static_cast<double> (x_deltas.arrayZ[i]) - 
interp_x_deltas.arrayZ[i];
@@ -285,7 +295,7 @@
                                       const hb_vector_t<int>& x_deltas,
                                       const hb_vector_t<int>& y_deltas,
                                       const hb_iup_set_t& forced_set,
-                                      double tolerance,
+                                      double tolerance_sq,
                                       unsigned lookback,
                                       hb_vector_t<unsigned>& costs, /* OUT */
                                       hb_vector_t<int>& chain, /* OUT */
@@ -323,7 +333,7 @@
                                contour_points.arrayZ[p1], 
contour_points.arrayZ[i],
                                x_deltas.arrayZ[p1], x_deltas.arrayZ[i],
                                y_deltas.arrayZ[p1], y_deltas.arrayZ[i],
-                               tolerance,
+                               tolerance_sq,
                               interp_x_deltas_scratch, 
interp_y_deltas_scratch))
       {
         best_cost = cost;
@@ -420,7 +430,7 @@
       return false;
 
     if (!_iup_contour_optimize_dp (rot_points, rot_x_deltas, rot_y_deltas,
-                                   rot_forced_set, tolerance, n,
+                                   rot_forced_set, tolerance_sq, n,
                                    costs, chain,
                                   scratch.interp_x_deltas, 
scratch.interp_y_deltas))
       return false;
@@ -471,7 +481,7 @@
     }
 
     if (!_iup_contour_optimize_dp (repeat_points, repeat_x_deltas, 
repeat_y_deltas,
-                                   forced_set, tolerance, n,
+                                   forced_set, tolerance_sq, n,
                                    costs, chain,
                                   scratch.interp_x_deltas, 
scratch.interp_y_deltas))
       return false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-subset-plan-layout.cc 
new/harfbuzz-12.1.0/src/hb-subset-plan-layout.cc
--- old/harfbuzz-11.5.1/src/hb-subset-plan-layout.cc    2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-subset-plan-layout.cc    2025-10-01 
07:26:58.000000000 +0200
@@ -248,12 +248,48 @@
   }
 }
 
+static void
+remap_feature_indices (const hb_set_t &feature_indices,
+                       const hb_map_t &duplicate_feature_map,
+                       const hb_hashmap_t<unsigned, hb_pair_t<const void*, 
const void*>>& catch_all_record_idx_feature_map,
+                       hb_map_t       *mapping, /* OUT */
+                       hb_map_t       *mapping_w_duplicates /* OUT */)
+{
+  unsigned i = 0;
+  for (const auto _ : feature_indices)
+  {
+    // retain those features in case we need to insert a catch-all record to 
reinstate the old features
+    if (catch_all_record_idx_feature_map.has (_))
+    {
+      mapping->set (_, i);
+      mapping_w_duplicates->set (_, i);
+      i++;
+    }
+    else
+    {
+      uint32_t f_idx = duplicate_feature_map.get (_);
+      uint32_t *new_idx;
+      if (mapping-> has (f_idx, &new_idx))
+      {
+        mapping_w_duplicates->set (_, *new_idx);
+      }
+      else
+      {
+        mapping->set (_, i);
+        mapping_w_duplicates->set (_, i);
+        i++;
+      }
+    }
+  }
+}
+
 template <typename T>
 static void
 _closure_glyphs_lookups_features (hb_subset_plan_t   *plan,
                                 hb_set_t            *gids_to_retain,
                                 hb_map_t            *lookups,
                                 hb_map_t            *features,
+                                hb_map_t            *features_w_duplicates,
                                 script_langsys_map *langsys_map,
                                 hb_hashmap_t<unsigned, 
hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
                                 hb_hashmap_t<unsigned, const OT::Feature*> 
*feature_substitutes_map,
@@ -291,7 +327,7 @@
 
   feature_indices.clear ();
   table->prune_langsys (&duplicate_feature_map, &plan->layout_scripts, 
langsys_map, &feature_indices);
-  remap_indexes (&feature_indices, features);
+  remap_feature_indices (feature_indices, duplicate_feature_map, 
catch_all_record_idx_feature_map, features, features_w_duplicates);
 
   table.destroy ();
 }
@@ -323,6 +359,7 @@
         &plan->_glyphset_gsub,
         &plan->gsub_lookups,
         &plan->gsub_features,
+        &plan->gsub_features_w_duplicates,
         &plan->gsub_langsys,
         &plan->gsub_feature_record_cond_idx_map,
         &plan->gsub_feature_substitutes_map,
@@ -335,6 +372,7 @@
         &plan->_glyphset_gsub,
         &plan->gpos_lookups,
         &plan->gpos_features,
+        &plan->gpos_features_w_duplicates,
         &plan->gpos_langsys,
         &plan->gpos_feature_record_cond_idx_map,
         &plan->gpos_feature_substitutes_map,
@@ -379,4 +417,4 @@
 }
 #endif
 
-#endif
\ No newline at end of file
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-subset-plan-member-list.hh 
new/harfbuzz-12.1.0/src/hb-subset-plan-member-list.hh
--- old/harfbuzz-11.5.1/src/hb-subset-plan-member-list.hh       2025-09-22 
18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb-subset-plan-member-list.hh       2025-10-01 
07:26:58.000000000 +0200
@@ -81,6 +81,10 @@
 HB_SUBSET_PLAN_MEMBER (hb_map_t, gsub_features)
 HB_SUBSET_PLAN_MEMBER (hb_map_t, gpos_features)
 
+//active features(with duplicates) old index -> new index mapping
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gsub_features_w_duplicates)
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gpos_features_w_duplicates)
+
 //active feature variation records/condition index with variations
 HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb::shared_ptr<hb_set_t>>), 
gsub_feature_record_cond_idx_map)
 HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb::shared_ptr<hb_set_t>>), 
gpos_feature_record_cond_idx_map)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb-version.h 
new/harfbuzz-12.1.0/src/hb-version.h
--- old/harfbuzz-11.5.1/src/hb-version.h        2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/hb-version.h        2025-10-01 07:26:58.000000000 
+0200
@@ -41,26 +41,26 @@
  *
  * The major component of the library version available at compile-time.
  */
-#define HB_VERSION_MAJOR 11
+#define HB_VERSION_MAJOR 12
 /**
  * HB_VERSION_MINOR:
  *
  * The minor component of the library version available at compile-time.
  */
-#define HB_VERSION_MINOR 5
+#define HB_VERSION_MINOR 1
 /**
  * HB_VERSION_MICRO:
  *
  * The micro component of the library version available at compile-time.
  */
-#define HB_VERSION_MICRO 1
+#define HB_VERSION_MICRO 0
 
 /**
  * HB_VERSION_STRING:
  *
  * A string literal containing the library version available at compile-time.
  */
-#define HB_VERSION_STRING "11.5.1"
+#define HB_VERSION_STRING "12.1.0"
 
 /**
  * HB_VERSION_ATLEAST:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/hb.hh 
new/harfbuzz-12.1.0/src/hb.hh
--- old/harfbuzz-11.5.1/src/hb.hh       2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/src/hb.hh       2025-10-01 07:26:58.000000000 +0200
@@ -89,7 +89,6 @@
 #pragma GCC diagnostic error   "-Wstring-conversion"
 #pragma GCC diagnostic error   "-Wswitch-enum"
 #pragma GCC diagnostic error   "-Wtautological-overlap-compare"
-#pragma GCC diagnostic error   "-Wuninitialized"
 #pragma GCC diagnostic error   "-Wunneeded-internal-declaration"
 #pragma GCC diagnostic error   "-Wunused"
 #pragma GCC diagnostic error   "-Wunused-local-typedefs"
@@ -110,12 +109,21 @@
 #pragma GCC diagnostic warning "-Wformat-signedness"
 #pragma GCC diagnostic warning "-Wignored-pragma-optimize"
 #pragma GCC diagnostic warning "-Wlogical-op"
-#pragma GCC diagnostic warning "-Wmaybe-uninitialized"
 #pragma GCC diagnostic warning "-Wmissing-format-attribute"
 #pragma GCC diagnostic warning "-Wpessimizing-move"
 #pragma GCC diagnostic warning "-Wundef"
 #pragma GCC diagnostic warning "-Wunsafe-loop-optimizations"
 #pragma GCC diagnostic warning "-Wunused-but-set-variable"
+#ifdef __clang__
+// The following are too buggy on gcc
+// https://github.com/harfbuzz/harfbuzz/issues/5589
+// https://github.com/harfbuzz/harfbuzz/pull/5367
+#pragma GCC diagnostic warning "-Wmaybe-uninitialized"
+#pragma GCC diagnostic warning "-Wuninitialized"
+#else
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#pragma GCC diagnostic ignored "-Wuninitialized"
+#endif
 #endif
 
 /* Ignored currently, but should be fixed at some point. */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/rust/Cargo.toml 
new/harfbuzz-12.1.0/src/rust/Cargo.toml
--- old/harfbuzz-11.5.1/src/rust/Cargo.toml     2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/rust/Cargo.toml     2025-10-01 07:26:58.000000000 
+0200
@@ -19,15 +19,13 @@
 
 [profile.release]
 strip = true
-lto = "fat"
 panic = "abort"
 overflow-checks = false
+lto = "fat"
 codegen-units = 1
 
 [profile.debugoptimized]
-inherits = "release"
-debug = true
-strip = false
-
-[profile.dev]
+inherits = "dev"
+overflow-checks = false
 lto = "fat"
+codegen-units = 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-11.5.1/src/rust/meson.build 
new/harfbuzz-12.1.0/src/rust/meson.build
--- old/harfbuzz-11.5.1/src/rust/meson.build    2025-09-22 18:58:28.000000000 
+0200
+++ new/harfbuzz-12.1.0/src/rust/meson.build    2025-10-01 07:26:58.000000000 
+0200
@@ -36,7 +36,7 @@
 if buildtype == 'release' or buildtype == 'debugoptimized'
   cargo_args += [
     '-Z', 'build-std=std,panic_abort',
-    '-Z', 'build-std-features=panic_immediate_abort',
+    '-Z', 'build-std-features=optimize_for_size',
   ]
   cargo_args += ['--profile', buildtype]
 endif
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.1FC,21,41,20,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.1FC,21,41,20,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.61,63,65,6B.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.61,63,65,6B.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.default.41.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.default.41.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints-retain-gids.41.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints-retain-gids.41.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints.41.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints.41.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.retain-gids.41.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.retain-gids.41.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/glyph_names/Ubuntu-Regular.retain-gids-glyph-names.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/glyph_names/Ubuntu-Regular.retain-gids-glyph-names.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/iftb_requirements/SourceSansPro-Regular.default.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/iftb_requirements/SourceSansPro-Regular.default.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/iftb_requirements/SourceSansPro-Regular.iftb_requirements.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/iftb_requirements/SourceSansPro-Regular.iftb_requirements.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/instantiate_base/NotoSerifHK-subset.default.all.wght=400-600.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/instantiate_base/NotoSerifHK-subset.default.all.wght=400-600.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/instantiate_base/NotoSerifHK-subset.default.all.wght=500.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/instantiate_base/NotoSerifHK-subset.default.all.wght=500.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.633,645,627,621,20,644,627.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.633,645,627,621,20,644,627.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.63A,64A,631.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.63A,64A,631.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.633,645,627,621,20,644,627.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.633,645,627,621,20,644,627.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.63A,64A,631.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.63A,64A,631.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9,53F1.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9,53F1.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53F1.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53F1.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.all.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.all.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9,53F1.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9,53F1.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53F1.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53F1.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.all.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.all.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,623,62D,644,627,645,2E.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,623,62D,644,627,645,2E.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,623,62D,644,627,645,2E.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,623,62D,644,627,645,2E.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,623,62D,644,627,645,2E.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,623,62D,644,627,645,2E.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.tinos/Tinos-Italic.default.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.tinos/Tinos-Italic.default.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.392,3a7,3b2,3c7.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.392,3a7,3b2,3c7.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.392,3a7,3b2,3c7.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.392,3a7,3b2,3c7.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.392,3a7,3b2,3c7.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.392,3a7,3b2,3c7.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/math/STIXTwoMath-Regular.default.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/math/STIXTwoMath-Regular.default.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.all.ttf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.all.ttf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/subset_base/SourceSansPro-Regular.retain-base-table-filter-scripts.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/subset_base/SourceSansPro-Regular.retain-base-table-filter-scripts.61,62,63.otf
 differ
Binary files 
old/harfbuzz-11.5.1/test/subset/data/expected/subset_base/SourceSansPro-Regular.retain-base-table.61,62,63.otf
 and 
new/harfbuzz-12.1.0/test/subset/data/expected/subset_base/SourceSansPro-Regular.retain-base-table.61,62,63.otf
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/harfbuzz-11.5.1/test/subset/data/tests/cff-japanese.tests 
new/harfbuzz-12.1.0/test/subset/data/tests/cff-japanese.tests
--- old/harfbuzz-11.5.1/test/subset/data/tests/cff-japanese.tests       
2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/test/subset/data/tests/cff-japanese.tests       
2025-10-01 07:26:58.000000000 +0200
@@ -14,3 +14,8 @@
 SUBSETS:
 明
 acek
+
+# TODO temporary until diff with fonttools on FDSelect format is fixed.
+OPTIONS:
+# no_fonttools
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/harfbuzz-11.5.1/test/subset/data/tests/glyph_names.tests 
new/harfbuzz-12.1.0/test/subset/data/tests/glyph_names.tests
--- old/harfbuzz-11.5.1/test/subset/data/tests/glyph_names.tests        
2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/test/subset/data/tests/glyph_names.tests        
2025-10-01 07:26:58.000000000 +0200
@@ -8,3 +8,8 @@
 SUBSETS:
 U+0x0,U+0x8,U+0x9,U+0x1d,U+0x20,U+0xb7
 *
+
+# diff with fonttools
+# fonttools still keeps psNames for those retain-gid holes
+OPTIONS:
+no_fonttools
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/harfbuzz-11.5.1/test/subset/data/tests/subset_base.tests 
new/harfbuzz-12.1.0/test/subset/data/tests/subset_base.tests
--- old/harfbuzz-11.5.1/test/subset/data/tests/subset_base.tests        
2025-09-22 18:58:28.000000000 +0200
+++ new/harfbuzz-12.1.0/test/subset/data/tests/subset_base.tests        
2025-10-01 07:26:58.000000000 +0200
@@ -8,3 +8,8 @@
 SUBSETS:
 abc
 
+# diff with fonttools
+# BASE table(fonttools doesn't support BASE table)
+OPTIONS:
+no_fonttools
+

++++++ harfbuzz.obsinfo ++++++
--- /var/tmp/diff_new_pack.hHZb0X/_old  2025-10-03 15:42:54.135225723 +0200
+++ /var/tmp/diff_new_pack.hHZb0X/_new  2025-10-03 15:42:54.155226561 +0200
@@ -1,5 +1,5 @@
 name: harfbuzz
-version: 11.5.1
-mtime: 1758560308
-commit: 7497c4147469fd4102a7229222586ad5c743c5a1
+version: 12.1.0
+mtime: 1759296418
+commit: a790c38b782f9d8e6f0299d2837229e5726fc669
 

Reply via email to