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
