texlive[74964] Build/source/libs: harfbuzz 11.1.0

commits+kakuto at tug.org commits+kakuto at tug.org
Wed Apr 16 23:56:14 CEST 2025


Revision: 74964
          https://tug.org/svn/texlive?view=revision&revision=74964
Author:   kakuto
Date:     2025-04-16 23:56:14 +0200 (Wed, 16 Apr 2025)
Log Message:
-----------
harfbuzz 11.1.0

Modified Paths:
--------------
    trunk/Build/source/libs/README
    trunk/Build/source/libs/harfbuzz/ChangeLog
    trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
    trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
    trunk/Build/source/libs/harfbuzz/configure
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/README.md
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build
    trunk/Build/source/libs/harfbuzz/include/Makefile.am
    trunk/Build/source/libs/harfbuzz/include/Makefile.in
    trunk/Build/source/libs/harfbuzz/version.ac

Added Paths:
-----------
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-script-list.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-var.cc

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/README	2025-04-16 21:56:14 UTC (rev 74964)
@@ -28,7 +28,7 @@
   https://sourceforge.net/projects/silgraphite/files/graphite2/
   (requires C++11)
 
-harfbuzz 11.0.1 - checked 05apr25
+harfbuzz 11.1.0 - checked 17apr25
   https://github.com/harfbuzz/harfbuzz/releases/latest
 
 icu 76.1 - checked 27oct24 (requires C++17, e.g., g++13)

Modified: trunk/Build/source/libs/harfbuzz/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/ChangeLog	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/ChangeLog	2025-04-16 21:56:14 UTC (rev 74964)
@@ -1,3 +1,8 @@
+2025-04-17  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
+
+	Import harfbuzz-11.1.0.
+	* version.ac, include/Makefile.am: Adjusted.
+
 2025-04-05  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
 
 	Import harfbuzz-11.0.1.

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2025-04-16 21:56:14 UTC (rev 74964)
@@ -1,3 +1,8 @@
+2025-04-17  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
+
+	Imported harfbuzz-11.1.0 source tree from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/11.1.0/
+
 2025-04-05  Akira Kakuto  <kakuto at jcom.zaq.ne.jp>
 
 	Imported harfbuzz-11.0.1 source tree from:

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2025-04-16 21:56:14 UTC (rev 74964)
@@ -1,5 +1,5 @@
-Changes applied to the harfbuzz-11.0.1/ tree as obtained from:
-	https://github.com/harfbuzz/harfbuzz/releases/download/11.0.1/
+Changes applied to the harfbuzz-11.1.0/ tree as obtained from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/11.1.0/
 
 Removed:
 	.clang-format

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

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2025-04-16 21:56:14 UTC (rev 74964)
@@ -204,6 +204,7 @@
      ${PROJECT_SOURCE_DIR}/src/hb-ot.h
      ${PROJECT_SOURCE_DIR}/src/hb-paint.h
      ${PROJECT_SOURCE_DIR}/src/hb-set.h
+     ${PROJECT_SOURCE_DIR}/src/hb-script-list.h
      ${PROJECT_SOURCE_DIR}/src/hb-shape-plan.h
      ${PROJECT_SOURCE_DIR}/src/hb-shape.h
      ${PROJECT_SOURCE_DIR}/src/hb-style.h

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2025-04-16 21:56:14 UTC (rev 74964)
@@ -1,4 +1,18 @@
-Overview of changes leading to 11.0.0
+Overview of changes leading to 11.1.0
+Wednesdat, April 16, 2025
+====================================
+- Include bidi mirroring variants of the requested codepoints when subsetting.
+  The new HB_SUBSET_FLAGS_NO_BIDI_CLOSURE can be used to disable this
+  behaviour.
+- Various bug fixes.
+- Various build fixes and improvements.
+- Various test suite improvements.
+
+New API:
++HB_SUBSET_FLAGS_NO_BIDI_CLOSURE
+
+
+Overview of changes leading to 11.0.1
 Friday, April 4, 2025
 ====================================
 - The change in version 10.3.0 to apply “trak” table tracking values to glyph

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/README.md
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/README.md	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/README.md	2025-04-16 21:56:14 UTC (rev 74964)
@@ -2,7 +2,7 @@
 [![macoOS CI Status](https://github.com/harfbuzz/harfbuzz/actions/workflows/macos-ci.yml/badge.svg)](https://github.com/harfbuzz/harfbuzz/actions/workflows/macos-ci.yml)
 [![Windows CI Status](https://github.com/harfbuzz/harfbuzz/actions/workflows/msvc-ci.yml/badge.svg)](https://github.com/harfbuzz/harfbuzz/actions/workflows/msvc-ci.yml)
 [![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/main.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/main)
-[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/harfbuzz.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html)
+[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/harfbuzz.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html#harfbuzz)
 [![Coverity Scan Build Status](https://scan.coverity.com/projects/15166/badge.svg)](https://scan.coverity.com/projects/harfbuzz)
 [![Packaging status](https://repology.org/badge/tiny-repos/harfbuzz.svg)](https://repology.org/project/harfbuzz/versions)
 [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/harfbuzz/harfbuzz/badge)](https://securityscorecards.dev/viewer/?uri=github.com/harfbuzz/harfbuzz)
@@ -71,20 +71,24 @@
 Here are a few presentation slides about HarfBuzz at the
 Internationalization and Unicode Conference over the years:
 
--   November 2014, [Unicode, OpenType, and HarfBuzz: Closing the Circle][7],
--   October 2012, [HarfBuzz, The Free and Open Text Shaping Engine][8],
--   October 2009, [HarfBuzz: the Free and Open Shaping Engine][9].
+- 2014 – [Unicode, OpenType, and HarfBuzz: Closing the Circle][7]
+- 2012 – [HarfBuzz, The Free and Open Text Shaping Engine][8]
+- 2016 – [Ten Years of HarfBuzz][20]
+- 2009 – [HarfBuzz: the Free and Open Shaping Engine][9]
 
 More presentations and papers are available on [behdad][11]'s website.
-In particular, the following documents are relevant to HarfBuzz development:
+In particular, the following _studies_ are relevant to HarfBuzz development:
 
-- 2025 — HarfBuzz Study: Caching — [Paper][12]
-- 2025 — HarfBuzz Study: `hb-decycler` — [Paper][13]
-- 2022 — HarfBuzz Study: `hb-iter` — [Paper][14]
-- 2022 — HarfBuzz Study: A C library written in C++ — [Paper][15]
-- 2022 — HarfBuzz Study: PackTab: A static integer table packer — [Paper][16]
-- 2014 — Reflections on Building the HarfBuzz Indic Shaper — [Paper][17]
-- 2012 — HarfBuzz Memory Consumption — [Paper][10]
+- 2025 – [Subsetting][21]
+- 2025 – [Caching][12]
+- 2025 – [`hb-decycler`][13]
+- 2022 – [`hb-iter`][14]
+- 2022 – [A C library written in C++][15]
+- 2022 – [The case of the slow `hb-ft` `>h_advance` function][18]
+- 2022 – [PackTab: A static integer table packer][16]
+- 2020 – [HarfBuzz OT+AAT "Unishaper"][19]
+- 2014 – [Building the Indic Shaper][17]
+- 2012 – [Memory Consumption][10]
 
 
 ## Name
@@ -102,6 +106,8 @@
 > TrueType that adds support for complex script rendering, and HarfBuzz is an
 > implementation of OpenType complex text shaping.
 
+## Distribution
+
 <details>
   <summary>Packaging status of HarfBuzz</summary>
 
@@ -125,3 +131,7 @@
 [15]: https://docs.google.com/document/d/18hI56KJpvXtwWbc9QSaz9zzhJwIMnrJ-zkAaKS-W-8k/preview
 [16]: https://docs.google.com/document/d/1Xq3owVt61HVkJqbLFHl73il6pcTy6PdPJJ7bSouQiQw/preview
 [17]: https://docs.google.com/document/d/1wMPwVNBvsIriamcyBO5aNs7Cdr8lmbwLJ8GmZBAswF4/preview
+[18]: https://docs.google.com/document/d/1wskYbA-czBt57oH9gEuGf3sWbTx7bfOiEIcDs36-heo/preview
+[19]: https://prezi.com/view/THNPJGFVDUCWoM20syev/
+[20]: https://behdad.org/doc/harfbuzz10years-slides.pdf
+[21]: https://docs.google.com/document/d/1_vZrt97OorJ0jA1YzJ29LRcGr3YGrNJANdOABjVZGEs/preview

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build	2025-04-16 21:56:14 UTC (rev 74964)
@@ -1,6 +1,6 @@
 project('harfbuzz', ['c', 'cpp'],
-  meson_version: '>= 0.55.0',
-  version: '11.0.1',
+  meson_version: '>= 0.60.0',
+  version: '11.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
@@ -32,11 +32,16 @@
 cpp = meson.get_compiler('cpp')
 null_dep = dependency('', required: false)
 
+
+# Includes Microsoft Clang compiler with GNU arguments, see
+# https://github.com/harfbuzz/harfbuzz/pull/4394
+cpp_is_microsoft_compiler = host_machine.system() == 'windows' and cpp.get_define('_MSC_FULL_VER') != ''
+
 # Only perform these checks if cpp_std is c++11 as setting -std directly
 # produces a warning from meson.
 if get_option('cpp_std') == 'c++11'
   # Enforce C++14 requirement for MSVC STL
-  if cpp.get_id() == 'clang' and cpp.get_define('_MSC_FULL_VER') != ''
+  if cpp.get_id() == 'clang' and cpp_is_microsoft_compiler
     add_project_arguments('-std=c++14', language: 'cpp')
   elif cpp.get_id() == 'clang-cl'
     # Clang-cl produces a warning when using -std=c++14, but not when using /std:c++14
@@ -145,38 +150,12 @@
 # How to check whether iwasm was built, and hence requires, LLVM?
 #llvm_dep = cpp.find_library('LLVM-15', required: get_option('wasm'))
 
-if meson.version().version_compare('>=0.60.0')
-  # pkg-config: icu-uc, cmake: ICU but with components
-  icu_dep = dependency('icu-uc', 'ICU',
-                            version: icu_min_version,
-                            components: 'uc',
-                            required: get_option('icu'),
-                            allow_fallback: true)
-else
-  # painful hack to handle multiple dependencies but also respect options
-  icu_opt = get_option('icu')
-  # we want to handle enabled manually after fallbacks, but also handle disabled normally
-  if icu_opt.enabled()
-    icu_opt = false
-  endif
-  # try pkg-config name
-  icu_dep = dependency('icu-uc', version: icu_min_version, method: 'pkg-config', required: icu_opt)
-  # when disabled, leave it not-found
-  if not icu_dep.found() and not get_option('icu').disabled()
-    # Try cmake name
-    icu_dep = dependency('ICU', version: icu_min_version, method: 'cmake', components: 'uc', required: false)
-    # Try again with subproject fallback. `allow_fallback: true` means the
-    # fallback will be tried even if the icu option is set to `auto`, but
-    # we cannot pass this option until Meson 0.59.0, because no wrap file
-    # is checked into git.
-    if not icu_dep.found()
-      icu_dep = dependency('icu-uc',
-                           version: icu_min_version,
-                           method: 'pkg-config',
-                           required: get_option('icu'))
-    endif
-  endif
-endif
+# pkg-config: icu-uc, cmake: ICU but with components
+icu_dep = dependency('icu-uc', 'ICU',
+                          version: icu_min_version,
+                          components: 'uc',
+                          required: get_option('icu'),
+                          allow_fallback: true)
 
 if icu_dep.found() and icu_dep.version().version_compare('>=75.1') and (get_option('cpp_std') == 'c++11' or get_option('cpp_std') == 'c++14')
   cpp17_arg = cpp.get_argument_syntax() == 'msvc' ? '/std:c++17' : '-std=c++17'
@@ -466,12 +445,10 @@
 alias_target('lib', libharfbuzz)
 alias_target('libs', libharfbuzz, libharfbuzz_subset)
 
-if meson.version().version_compare('>=0.57.0')
-  # Re glib, see https://github.com/harfbuzz/harfbuzz/issues/4153#issuecomment-2646347531
-  add_test_setup('default',
-                 exclude_suites: ['google-benchmark'],
-                 is_default: glib_dep.type_name() != 'internal' and not meson.is_subproject())
-endif
+# Re glib, see https://github.com/harfbuzz/harfbuzz/issues/4153#issuecomment-2646347531
+add_test_setup('default',
+                exclude_suites: ['google-benchmark'],
+                is_default: glib_dep.type_name() != 'internal' and not meson.is_subproject())
 
 build_summary = {
   'Directories':

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.py	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.py	2025-04-16 21:56:14 UTC (rev 74964)
@@ -22,30 +22,30 @@
 stat = 0
 tested = 0
 
-for obj in OBJS:
-	result = subprocess.run(objdump.split () + ['-t', obj], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+result = subprocess.run(objdump.split () + ['-t'] + OBJS, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 
-	if result.returncode:
-		if result.stderr.find (b'not recognized') != -1:
-			# https://github.com/harfbuzz/harfbuzz/issues/3019
-			print ('objdump %s returned "not recognized", skipping' % obj)
-			continue
-		print ('objdump %s returned error:\n%s' % (obj, result.stderr.decode ('utf-8')))
-		stat = 2
+if result.returncode:
+    if result.stderr.find (b'not recognized') != -1:
+        # https://github.com/harfbuzz/harfbuzz/issues/3019
+        print ('objdump %s returned "not recognized", skipping')
+    else:
+        print ('objdump returned error:\n%s' % (result.stderr.decode ('utf-8')))
+        stat = 2
+else:
+    tested = 1
 
-	result = result.stdout.decode ('utf-8')
+result = result.stdout.decode ('utf-8')
 
-	# Checking that no object file has static initializers
-	for l in re.findall (r'^.*\.[cd]tors.*$', result, re.MULTILINE):
-		if not re.match (r'.*\b0+\b', l):
-			print ('Ouch, %s has static initializers/finalizers' % obj)
-			stat = 1
+# Checking that no object file has static initializers
+for l in re.findall (r'^.*\.[cd]tors.*$', result, re.MULTILINE):
+    if not re.match (r'.*\b0+\b', l):
+        print ('Ouch, library has static initializers/finalizers')
+        stat = 1
 
-	# Checking that no object file has lazy static C++ constructors/destructors or other such stuff
-	if ('__cxa_' in result) and ('__ubsan_handle' not in result):
-		print ('Ouch, %s has lazy static C++ constructors/destructors or other such stuff' % obj)
-		stat = 1
+# Checking that no object file has lazy static C++ constructors/destructors or other such stuff
+if ('__cxa_' in result) and ('__ubsan_handle' not in result):
+    print ('Ouch, library has lazy static C++ constructors/destructors or other such stuff')
+    stat = 1
 
-	tested += 1
 
 sys.exit (stat if tested else 77)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.py	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.py	2025-04-16 21:56:14 UTC (rev 74964)
@@ -17,6 +17,7 @@
     'rust_eh_personality',
     '_ZN3std9panicking11EMPTY_PANIC.*', # 'std::panicking::EMPTY_PANIC::.*'
     '_ZN3std3sys3pal4unix4args3imp15ARGV_INIT_ARRAY.*', # 'std::sys::pal::unix::args::imp::ARGV_INIT_ARRAY::.*'
+    '_ZN3std3sys4args4unix3imp15ARGV_INIT_ARRAY.*', # std::sys::args::unix::imp::ARGV_INIT_ARRAY::.*
     '_ZN17compiler_builtins4math4libm7generic4sqrt9RSQRT_TAB.*', # 'compiler_builtins::math::libm::generic::sqrt::RSQRT_TAB::.*'
 ]
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -57,6 +57,8 @@
 #include "hb-subset-input.cc"
 #include "hb-subset-instancer-iup.cc"
 #include "hb-subset-instancer-solver.cc"
+#include "hb-subset-plan-layout.cc"
+#include "hb-subset-plan-var.cc"
 #include "hb-subset-plan.cc"
 #include "hb-subset-serialize.cc"
 #include "hb-subset.cc"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -80,7 +80,6 @@
 
 #include <atomic>
 
-#define _hb_memory_barrier()			std::atomic_thread_fence(std::memory_order_ack_rel)
 #define _hb_memory_r_barrier()			std::atomic_thread_fence(std::memory_order_acquire)
 #define _hb_memory_w_barrier()			std::atomic_thread_fence(std::memory_order_release)
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -32,38 +32,39 @@
 #include "hb.hh"
 
 
-#line 36 "hb-buffer-deserialize-json.hh"
+#line 33 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
-	0u, 0u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
+	0u, 0u, 9u, 34u, 97u, 121u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
 	9u, 125u, 9u, 125u, 9u, 93u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
 	9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 
 	120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 
 	9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 
 	9u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 34u, 92u, 9u, 125u, 
-	34u, 92u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 123u, 
-	9u, 123u, 9u, 123u, 0
+	34u, 92u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 
+	34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 98u, 98u, 9u, 123u, 9u, 123u, 9u, 123u, 
+	0
 };
 
 static const char _deserialize_json_key_spans[] = {
-	0, 26, 21, 2, 1, 50, 49, 10, 
+	0, 26, 25, 2, 1, 50, 49, 10, 
 	117, 117, 85, 117, 1, 50, 49, 10, 
 	117, 117, 1, 1, 50, 49, 117, 117, 
 	2, 1, 50, 49, 10, 117, 117, 1, 
 	50, 49, 10, 117, 117, 1, 1, 50, 
 	49, 117, 117, 1, 50, 49, 59, 117, 
-	59, 117, 117, 1, 50, 49, 117, 115, 
-	115, 115
+	59, 117, 117, 1, 50, 49, 10, 117, 
+	1, 50, 49, 117, 1, 115, 115, 115
 };
 
 static const short _deserialize_json_index_offsets[] = {
-	0, 0, 27, 49, 52, 54, 105, 155, 
-	166, 284, 402, 488, 606, 608, 659, 709, 
-	720, 838, 956, 958, 960, 1011, 1061, 1179, 
-	1297, 1300, 1302, 1353, 1403, 1414, 1532, 1650, 
-	1652, 1703, 1753, 1764, 1882, 2000, 2002, 2004, 
-	2055, 2105, 2223, 2341, 2343, 2394, 2444, 2504, 
-	2622, 2682, 2800, 2918, 2920, 2971, 3021, 3139, 
-	3255, 3371
+	0, 0, 27, 53, 56, 58, 109, 159, 
+	170, 288, 406, 492, 610, 612, 663, 713, 
+	724, 842, 960, 962, 964, 1015, 1065, 1183, 
+	1301, 1304, 1306, 1357, 1407, 1418, 1536, 1654, 
+	1656, 1707, 1757, 1768, 1886, 2004, 2006, 2008, 
+	2059, 2109, 2227, 2345, 2347, 2398, 2448, 2508, 
+	2626, 2686, 2804, 2922, 2924, 2975, 3025, 3036, 
+	3154, 3156, 3207, 3257, 3375, 3377, 3493, 3609
 };
 
 static const char _deserialize_json_indicies[] = {
@@ -71,28 +72,28 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	0, 1, 2, 1, 3, 1, 4, 5, 
-	1, 6, 7, 1, 1, 1, 1, 1, 
+	1, 6, 7, 8, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	8, 1, 9, 10, 1, 11, 1, 11, 
-	11, 11, 11, 11, 1, 1, 1, 1, 
+	9, 1, 8, 10, 10, 1, 11, 12, 
+	1, 13, 1, 13, 13, 13, 13, 13, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 11, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 13, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	12, 1, 12, 12, 12, 12, 12, 1, 
+	1, 1, 1, 1, 14, 1, 14, 14, 
+	14, 14, 14, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 14, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 12, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 13, 1, 
-	1, 14, 15, 15, 15, 15, 15, 15, 
-	15, 15, 15, 1, 16, 17, 17, 17, 
-	17, 17, 17, 17, 17, 17, 1, 18, 
-	18, 18, 18, 18, 1, 1, 1, 1, 
+	1, 1, 15, 1, 1, 16, 17, 17, 
+	17, 17, 17, 17, 17, 17, 17, 1, 
+	18, 19, 19, 19, 19, 19, 19, 19, 
+	19, 19, 1, 20, 20, 20, 20, 20, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 18, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 19, 1, 1, 1, 1, 1, 
+	1, 1, 20, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 21, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -102,12 +103,12 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 20, 1, 21, 21, 21, 
-	21, 21, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 22, 
+	1, 23, 23, 23, 23, 23, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 21, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	0, 1, 1, 1, 1, 1, 1, 1, 
+	23, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 0, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -117,24 +118,24 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 22, 1, 22, 22, 22, 22, 22, 
+	1, 1, 1, 1, 1, 24, 1, 24, 
+	24, 24, 24, 24, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 24, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 22, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 23, 1, 
+	1, 1, 25, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 23, 
-	1, 18, 18, 18, 18, 18, 1, 1, 
+	1, 1, 1, 25, 1, 20, 20, 20, 
+	20, 20, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 20, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	18, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 19, 1, 1, 1, 
-	17, 17, 17, 17, 17, 17, 17, 17, 
-	17, 17, 1, 1, 1, 1, 1, 1, 
+	21, 1, 1, 1, 19, 19, 19, 19, 
+	19, 19, 19, 19, 19, 19, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -142,26 +143,27 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 20, 1, 24, 
-	1, 24, 24, 24, 24, 24, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 22, 1, 26, 1, 26, 26, 26, 
+	26, 26, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	24, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 26, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 25, 1, 25, 25, 25, 25, 
-	25, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 27, 1, 
+	27, 27, 27, 27, 27, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 25, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 27, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	26, 1, 1, 27, 28, 28, 28, 28, 
-	28, 28, 28, 28, 28, 1, 29, 30, 
+	1, 1, 1, 1, 28, 1, 1, 29, 
 	30, 30, 30, 30, 30, 30, 30, 30, 
-	1, 31, 31, 31, 31, 31, 1, 1, 
+	30, 1, 31, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 1, 33, 33, 33, 
+	33, 33, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 33, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	31, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 32, 1, 1, 1, 
+	34, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -171,13 +173,13 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 33, 1, 31, 
-	31, 31, 31, 31, 1, 1, 1, 1, 
+	1, 35, 1, 33, 33, 33, 33, 33, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 31, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 32, 1, 1, 1, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
+	1, 1, 33, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 34, 1, 
+	1, 1, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -185,26 +187,27 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 35, 
+	1, 36, 1, 37, 1, 37, 37, 37, 
+	37, 37, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 33, 1, 34, 1, 35, 
-	1, 35, 35, 35, 35, 35, 1, 1, 
+	1, 1, 1, 1, 37, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	35, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 38, 1, 
+	38, 38, 38, 38, 38, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 38, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 36, 1, 36, 36, 36, 36, 
-	36, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 39, 
+	40, 40, 40, 40, 40, 40, 40, 40, 
+	40, 1, 41, 41, 41, 41, 41, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 36, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 37, 38, 38, 38, 38, 
-	38, 38, 38, 38, 38, 1, 39, 39, 
-	39, 39, 39, 1, 1, 1, 1, 1, 
+	1, 41, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 42, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 39, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 40, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -212,15 +215,15 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 43, 1, 
+	41, 41, 41, 41, 41, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 41, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 41, 1, 39, 39, 39, 39, 
-	39, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 42, 1, 1, 1, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 39, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 40, 
-	1, 1, 1, 42, 42, 42, 42, 42, 
-	42, 42, 42, 42, 42, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -227,28 +230,28 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 43, 1, 45, 46, 
+	1, 47, 1, 47, 47, 47, 47, 47, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	41, 1, 43, 44, 1, 45, 1, 45, 
-	45, 45, 45, 45, 1, 1, 1, 1, 
+	1, 1, 47, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 45, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 48, 1, 48, 48, 
+	48, 48, 48, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 48, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	46, 1, 46, 46, 46, 46, 46, 1, 
+	1, 1, 49, 1, 1, 50, 51, 51, 
+	51, 51, 51, 51, 51, 51, 51, 1, 
+	52, 53, 53, 53, 53, 53, 53, 53, 
+	53, 53, 1, 54, 54, 54, 54, 54, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 46, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 47, 1, 
-	1, 48, 49, 49, 49, 49, 49, 49, 
-	49, 49, 49, 1, 50, 51, 51, 51, 
-	51, 51, 51, 51, 51, 51, 1, 52, 
-	52, 52, 52, 52, 1, 1, 1, 1, 
+	1, 1, 54, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 55, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 52, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 53, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -256,43 +259,43 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 56, 
+	1, 54, 54, 54, 54, 54, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 54, 1, 52, 52, 52, 
-	52, 52, 1, 1, 1, 1, 1, 1, 
+	54, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 55, 1, 1, 1, 
+	53, 53, 53, 53, 53, 53, 53, 53, 
+	53, 53, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 52, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	53, 1, 1, 1, 51, 51, 51, 51, 
-	51, 51, 51, 51, 51, 51, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 56, 1, 57, 
+	1, 57, 57, 57, 57, 57, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	57, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 54, 1, 55, 1, 55, 55, 55, 
-	55, 55, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 55, 1, 1, 1, 
+	1, 1, 58, 1, 58, 58, 58, 58, 
+	58, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 58, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 56, 1, 
-	56, 56, 56, 56, 56, 1, 1, 1, 
+	59, 1, 1, 60, 61, 61, 61, 61, 
+	61, 61, 61, 61, 61, 1, 62, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	1, 64, 64, 64, 64, 64, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 56, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 57, 1, 1, 58, 
-	59, 59, 59, 59, 59, 59, 59, 59, 
-	59, 1, 60, 61, 61, 61, 61, 61, 
-	61, 61, 61, 61, 1, 62, 62, 62, 
-	62, 62, 1, 1, 1, 1, 1, 1, 
+	64, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 65, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 62, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	63, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -300,15 +303,15 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 66, 1, 64, 
+	64, 64, 64, 64, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 64, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 64, 1, 62, 62, 62, 62, 62, 
+	1, 1, 65, 1, 1, 1, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 62, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 63, 1, 
-	1, 1, 61, 61, 61, 61, 61, 61, 
-	61, 61, 61, 61, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -315,26 +318,25 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 66, 1, 67, 1, 68, 
+	1, 68, 68, 68, 68, 68, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 64, 
-	1, 65, 1, 66, 1, 66, 66, 66, 
-	66, 66, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 66, 1, 1, 1, 
+	68, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 67, 1, 
-	67, 67, 67, 67, 67, 1, 1, 1, 
+	1, 1, 69, 1, 69, 69, 69, 69, 
+	69, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 67, 
+	1, 1, 1, 69, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 68, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 1, 70, 70, 70, 70, 70, 1, 
+	1, 1, 1, 70, 71, 71, 71, 71, 
+	71, 71, 71, 71, 71, 1, 72, 72, 
+	72, 72, 72, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 72, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 70, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 71, 1, 1, 
+	1, 73, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -344,14 +346,14 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 72, 1, 
-	70, 70, 70, 70, 70, 1, 1, 1, 
+	1, 1, 74, 1, 72, 72, 72, 72, 
+	72, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 70, 
+	1, 1, 1, 72, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 73, 
+	1, 1, 1, 75, 75, 75, 75, 75, 
+	75, 75, 75, 75, 75, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 71, 1, 1, 1, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -359,32 +361,35 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 72, 1, 74, 1, 
-	74, 74, 74, 74, 74, 1, 1, 1, 
+	74, 1, 76, 1, 76, 76, 76, 76, 
+	76, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 74, 
+	1, 1, 1, 76, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 77, 1, 77, 
+	77, 77, 77, 77, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 75, 1, 75, 75, 75, 75, 75, 
+	1, 1, 1, 1, 1, 1, 77, 1, 
+	78, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 79, 80, 
+	80, 80, 80, 80, 80, 80, 80, 80, 
+	1, 82, 81, 81, 81, 81, 81, 81, 
+	81, 81, 81, 81, 81, 81, 81, 81, 
+	81, 81, 81, 81, 81, 81, 81, 81, 
+	81, 81, 81, 81, 81, 81, 81, 81, 
+	81, 81, 81, 81, 81, 81, 81, 81, 
+	81, 81, 81, 81, 81, 81, 81, 81, 
+	81, 81, 81, 81, 81, 81, 81, 81, 
+	81, 81, 81, 83, 81, 84, 84, 84, 
+	84, 84, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 84, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 75, 1, 76, 1, 1, 1, 
+	85, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 77, 78, 78, 78, 78, 78, 
-	78, 78, 78, 78, 1, 80, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 81, 
-	79, 82, 82, 82, 82, 82, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	82, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 83, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -391,93 +396,104 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 86, 1, 81, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 84, 1, 79, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 81, 1, 87, 
+	87, 87, 87, 87, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 87, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 88, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 79, 1, 85, 85, 85, 85, 85, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 85, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 86, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 89, 1, 87, 87, 87, 
+	87, 87, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 87, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	88, 1, 1, 1, 90, 90, 90, 90, 
+	90, 90, 90, 90, 90, 90, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 87, 
-	1, 85, 85, 85, 85, 85, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	85, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 86, 1, 1, 1, 
-	88, 88, 88, 88, 88, 88, 88, 88, 
-	88, 88, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 89, 1, 91, 1, 91, 91, 91, 
+	91, 91, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 91, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 87, 1, 89, 
-	1, 89, 89, 89, 89, 89, 1, 1, 
+	1, 1, 1, 1, 1, 1, 92, 1, 
+	92, 92, 92, 92, 92, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 92, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	89, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 93, 1, 1, 94, 
+	95, 95, 95, 95, 95, 95, 95, 95, 
+	95, 1, 23, 96, 96, 96, 96, 96, 
+	96, 96, 96, 96, 1, 23, 23, 23, 
+	23, 23, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 23, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 90, 1, 90, 90, 90, 90, 
-	90, 1, 1, 1, 1, 1, 1, 1, 
+	0, 1, 1, 1, 96, 96, 96, 96, 
+	96, 96, 96, 96, 96, 96, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 90, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 91, 92, 92, 92, 92, 
-	92, 92, 92, 92, 92, 1, 85, 85, 
-	85, 85, 85, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 85, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 86, 1, 1, 1, 93, 93, 93, 
-	93, 93, 93, 93, 93, 93, 93, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 24, 1, 97, 1, 97, 97, 97, 
+	97, 97, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 97, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 98, 1, 
+	98, 98, 98, 98, 98, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 87, 1, 94, 94, 94, 94, 
-	94, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 98, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 94, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 99, 
+	100, 100, 100, 100, 100, 100, 100, 100, 
+	100, 1, 87, 87, 87, 87, 87, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 87, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 88, 1, 1, 
+	1, 101, 101, 101, 101, 101, 101, 101, 
+	101, 101, 101, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 95, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 96, 1, 
-	95, 95, 95, 95, 95, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 89, 1, 
+	8, 1, 102, 102, 102, 102, 102, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 95, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 102, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -484,14 +500,15 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 103, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 104, 1, 103, 103, 
+	103, 103, 103, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 96, 1, 23, 23, 23, 23, 
-	23, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 103, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 23, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -502,50 +519,65 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 96, 1, 
-	0
+	104, 1, 25, 25, 25, 25, 25, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 25, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 104, 1, 0
 };
 
 static const char _deserialize_json_trans_targs[] = {
 	1, 0, 2, 3, 18, 24, 37, 43, 
-	51, 4, 12, 5, 6, 7, 8, 11, 
-	8, 11, 9, 1, 10, 9, 10, 57, 
-	13, 14, 15, 16, 17, 16, 17, 9, 
-	1, 10, 19, 20, 21, 22, 23, 9, 
-	1, 10, 23, 25, 31, 26, 27, 28, 
-	29, 30, 29, 30, 9, 1, 10, 32, 
-	33, 34, 35, 36, 35, 36, 9, 1, 
-	10, 38, 39, 40, 41, 42, 9, 1, 
-	10, 42, 44, 45, 46, 49, 50, 46, 
-	47, 48, 9, 1, 10, 9, 1, 10, 
-	50, 52, 53, 49, 54, 54, 55, 56, 
+	51, 56, 60, 4, 12, 5, 6, 7, 
+	8, 11, 8, 11, 9, 1, 10, 9, 
+	10, 63, 13, 14, 15, 16, 17, 16, 
+	17, 9, 1, 10, 19, 20, 21, 22, 
+	23, 9, 1, 10, 23, 25, 31, 26, 
+	27, 28, 29, 30, 29, 30, 9, 1, 
+	10, 32, 33, 34, 35, 36, 35, 36, 
+	9, 1, 10, 38, 39, 40, 41, 42, 
+	9, 1, 10, 42, 44, 45, 46, 49, 
+	50, 46, 47, 48, 9, 1, 10, 9, 
+	1, 10, 50, 52, 53, 54, 9, 55, 
+	55, 57, 58, 49, 59, 59, 61, 62, 
 	1
 };
 
 static const char _deserialize_json_trans_actions[] = {
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 1, 1, 1, 
-	0, 0, 2, 2, 2, 0, 0, 3, 
-	0, 0, 1, 1, 1, 0, 0, 4, 
-	4, 4, 0, 0, 0, 1, 1, 5, 
-	5, 5, 0, 0, 0, 0, 0, 1, 
-	1, 1, 0, 0, 6, 6, 6, 0, 
-	0, 1, 1, 1, 0, 0, 7, 7, 
-	7, 0, 0, 0, 1, 1, 8, 8, 
-	8, 0, 0, 0, 1, 9, 9, 0, 
-	10, 0, 11, 11, 11, 12, 12, 12, 
-	10, 0, 0, 13, 13, 14, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 1, 
+	1, 1, 0, 0, 2, 2, 2, 0, 
+	0, 3, 0, 0, 1, 1, 1, 0, 
+	0, 4, 4, 4, 0, 0, 0, 1, 
+	1, 5, 5, 5, 0, 0, 0, 0, 
+	0, 1, 1, 1, 0, 0, 6, 6, 
+	6, 0, 0, 1, 1, 1, 0, 0, 
+	7, 7, 7, 0, 0, 0, 1, 1, 
+	8, 8, 8, 0, 0, 0, 1, 9, 
+	9, 0, 10, 0, 11, 11, 11, 12, 
+	12, 12, 10, 0, 0, 1, 1, 1, 
+	0, 0, 0, 13, 13, 14, 0, 0, 
 	15
 };
 
-static const int deserialize_json_start = 55;
-static const int deserialize_json_first_final = 55;
+static const int deserialize_json_start = 61;
+static const int deserialize_json_first_final = 61;
 static const int deserialize_json_error = 0;
 
-static const int deserialize_json_en_main = 55;
+static const int deserialize_json_en_main = 61;
 
 
-#line 111 "hb-buffer-deserialize-json.rl"
+#line 115 "hb-buffer-deserialize-json.rl"
 
 
 static hb_bool_t
@@ -565,12 +597,12 @@
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 569 "hb-buffer-deserialize-json.hh"
+#line 594 "hb-buffer-deserialize-json.hh"
 	{
 	cs = deserialize_json_start;
 	}
 
-#line 574 "hb-buffer-deserialize-json.hh"
+#line 597 "hb-buffer-deserialize-json.hh"
 	{
 	int _slen;
 	int _trans;
@@ -680,7 +712,7 @@
 #line 56 "hb-buffer-deserialize-json.rl"
 	{ if (unlikely (!buffer->ensure_unicode ())) return false; }
 	break;
-#line 684 "hb-buffer-deserialize-json.hh"
+#line 689 "hb-buffer-deserialize-json.hh"
 	}
 
 _again:
@@ -692,7 +724,7 @@
 	_out: {}
 	}
 
-#line 132 "hb-buffer-deserialize-json.rl"
+#line 136 "hb-buffer-deserialize-json.rl"
 
 
   *end_ptr = p;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl	2025-04-16 21:56:14 UTC (rev 74964)
@@ -91,6 +91,8 @@
 xadvance=  "\"ax\"" colon (num  >tok %parse_x_advance);
 yadvance=  "\"ay\"" colon (num  >tok %parse_y_advance);
 glyphflags="\"fl\"" colon (unum >tok %parse_glyph_flags);
+# Not parsed. Ignored.
+glyphextents="\""("xb"|"yb"|"w"|"h")"\"" colon (num >tok);
 
 element = glyph @ensure_glyphs
 	| unicode @ensure_unicode
@@ -99,7 +101,9 @@
 	| yoffset
 	| xadvance
 	| yadvance
-	| glyphflags;
+	| glyphflags
+	| glyphextents
+	;
 item	=
 	( '{' space* element (comma element)* space* '}' space* (','|']') space* )
 	>clear_item

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -32,26 +32,35 @@
 #include "hb.hh"
 
 
-#line 36 "hb-buffer-deserialize-text-glyphs.hh"
+#line 33 "hb-buffer-deserialize-text-glyphs.hh"
 static const unsigned char _deserialize_text_glyphs_trans_keys[] = {
-	0u, 0u, 35u, 124u, 48u, 57u, 93u, 124u, 45u, 57u, 48u, 57u, 35u, 124u, 45u, 57u, 
-	48u, 57u, 35u, 124u, 35u, 124u, 35u, 124u, 48u, 57u, 35u, 124u, 45u, 57u, 48u, 57u, 
+	0u, 0u, 35u, 124u, 48u, 57u, 60u, 124u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 
+	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 62u, 62u, 
+	93u, 124u, 45u, 57u, 48u, 57u, 35u, 124u, 45u, 57u, 48u, 57u, 35u, 124u, 35u, 124u, 
+	35u, 124u, 35u, 124u, 35u, 124u, 35u, 124u, 48u, 57u, 35u, 124u, 45u, 57u, 48u, 57u, 
 	44u, 44u, 45u, 57u, 48u, 57u, 35u, 124u, 35u, 124u, 44u, 57u, 35u, 124u, 43u, 124u, 
-	48u, 124u, 35u, 124u, 35u, 124u, 35u, 124u, 0
+	35u, 124u, 48u, 62u, 44u, 57u, 44u, 57u, 44u, 57u, 48u, 124u, 35u, 124u, 35u, 124u, 
+	35u, 124u, 0
 };
 
 static const char _deserialize_text_glyphs_key_spans[] = {
-	0, 90, 10, 32, 13, 10, 90, 13, 
-	10, 90, 90, 90, 10, 90, 13, 10, 
+	0, 90, 10, 65, 13, 10, 1, 13, 
+	10, 1, 13, 10, 1, 13, 10, 1, 
+	32, 13, 10, 90, 13, 10, 90, 90, 
+	90, 90, 90, 90, 10, 90, 13, 10, 
 	1, 13, 10, 90, 90, 14, 90, 82, 
-	77, 90, 90, 90
+	90, 15, 14, 14, 14, 77, 90, 90, 
+	90
 };
 
 static const short _deserialize_text_glyphs_index_offsets[] = {
-	0, 0, 91, 102, 135, 149, 160, 251, 
-	265, 276, 367, 458, 549, 560, 651, 665, 
-	676, 678, 692, 703, 794, 885, 900, 991, 
-	1074, 1152, 1243, 1334
+	0, 0, 91, 102, 168, 182, 193, 195, 
+	209, 220, 222, 236, 247, 249, 263, 274, 
+	276, 309, 323, 334, 425, 439, 450, 541, 
+	632, 723, 814, 905, 996, 1007, 1098, 1112, 
+	1123, 1125, 1139, 1150, 1241, 1332, 1347, 1438, 
+	1521, 1612, 1628, 1643, 1658, 1673, 1751, 1842, 
+	1933
 };
 
 static const char _deserialize_text_glyphs_indicies[] = {
@@ -58,206 +67,289 @@
 	1, 0, 0, 0, 0, 0, 0, 
 	0, 2, 3, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 4, 0, 0, 5, 0, 
+	0, 0, 4, 5, 0, 0, 6, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 6, 7, 0, 0, 0, 0, 
+	0, 0, 7, 8, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 7, 0, 8, 9, 9, 9, 
-	9, 9, 9, 9, 9, 9, 3, 10, 
+	0, 0, 8, 0, 9, 10, 10, 10, 
+	10, 10, 10, 10, 10, 10, 3, 11, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 3, 10, 3, 
-	11, 3, 3, 12, 13, 13, 13, 13, 
-	13, 13, 13, 13, 13, 3, 14, 15, 
+	3, 3, 3, 3, 3, 3, 3, 3, 
+	12, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 3, 12, 
+	3, 13, 3, 3, 14, 15, 15, 15, 
+	15, 15, 15, 15, 15, 15, 3, 14, 
 	15, 15, 15, 15, 15, 15, 15, 15, 
-	3, 16, 3, 3, 3, 3, 3, 3, 
-	3, 3, 17, 3, 3, 3, 3, 3, 
+	15, 3, 16, 3, 17, 3, 3, 18, 
+	19, 19, 19, 19, 19, 19, 19, 19, 
+	19, 3, 18, 19, 19, 19, 19, 19, 
+	19, 19, 19, 19, 3, 20, 3, 21, 
+	3, 3, 22, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 3, 22, 23, 23, 
+	23, 23, 23, 23, 23, 23, 23, 3, 
+	24, 3, 25, 3, 3, 26, 27, 27, 
+	27, 27, 27, 27, 27, 27, 27, 3, 
+	26, 27, 27, 27, 27, 27, 27, 27, 
+	27, 27, 3, 28, 3, 29, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 29, 3, 30, 3, 
+	3, 31, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 3, 33, 34, 34, 34, 
+	34, 34, 34, 34, 34, 34, 3, 35, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	36, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 18, 3, 3, 3, 3, 
+	37, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 18, 3, 19, 3, 3, 20, 
-	21, 21, 21, 21, 21, 21, 21, 21, 
-	21, 3, 22, 23, 23, 23, 23, 23, 
-	23, 23, 23, 23, 3, 24, 3, 3, 
+	3, 38, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	38, 3, 39, 3, 3, 40, 41, 41, 
+	41, 41, 41, 41, 41, 41, 41, 3, 
+	42, 43, 43, 43, 43, 43, 43, 43, 
+	43, 43, 3, 44, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 45, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 3, 3, 25, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 46, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 3, 25, 3, 
-	24, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 23, 23, 23, 
-	23, 23, 23, 23, 23, 23, 23, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 46, 3, 44, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 43, 43, 43, 43, 43, 
+	43, 43, 43, 43, 43, 3, 3, 45, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 25, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 25, 3, 16, 3, 3, 3, 3, 
-	3, 3, 3, 3, 17, 3, 3, 3, 
-	15, 15, 15, 15, 15, 15, 15, 15, 
-	15, 15, 3, 3, 3, 3, 3, 3, 
+	46, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 3, 46, 
+	3, 35, 3, 3, 3, 3, 3, 3, 
+	3, 3, 36, 3, 3, 3, 34, 34, 
+	34, 34, 34, 34, 34, 34, 34, 34, 
+	3, 3, 37, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 18, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 38, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 18, 3, 26, 27, 
-	27, 27, 27, 27, 27, 27, 27, 27, 
-	3, 28, 3, 3, 3, 3, 3, 3, 
-	3, 29, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 3, 30, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 38, 3, 1, 0, 0, 0, 
+	0, 0, 0, 0, 2, 3, 47, 0, 
+	0, 48, 49, 49, 49, 49, 49, 49, 
+	49, 49, 49, 0, 0, 4, 5, 0, 
+	0, 6, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 7, 8, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 8, 0, 1, 
+	0, 0, 0, 0, 0, 0, 0, 2, 
+	3, 0, 0, 0, 48, 49, 49, 49, 
+	49, 49, 49, 49, 49, 49, 0, 0, 
+	4, 5, 0, 0, 6, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	7, 8, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	8, 0, 1, 0, 0, 0, 0, 0, 
+	0, 0, 2, 16, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 4, 5, 0, 0, 6, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 7, 8, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 8, 0, 50, 51, 51, 
+	51, 51, 51, 51, 51, 51, 51, 3, 
+	52, 3, 3, 3, 3, 3, 3, 3, 
+	53, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 54, 3, 3, 3, 55, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 31, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 56, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 31, 3, 32, 3, 3, 33, 
-	34, 34, 34, 34, 34, 34, 34, 34, 
-	34, 3, 35, 36, 36, 36, 36, 36, 
-	36, 36, 36, 36, 3, 37, 3, 38, 
-	3, 3, 39, 40, 40, 40, 40, 40, 
-	40, 40, 40, 40, 3, 41, 42, 42, 
-	42, 42, 42, 42, 42, 42, 42, 3, 
-	43, 3, 3, 3, 3, 3, 3, 3, 
-	44, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 56, 3, 57, 3, 3, 58, 59, 
+	59, 59, 59, 59, 59, 59, 59, 59, 
+	3, 60, 61, 61, 61, 61, 61, 61, 
+	61, 61, 61, 3, 62, 3, 63, 3, 
+	3, 64, 65, 65, 65, 65, 65, 65, 
+	65, 65, 65, 3, 66, 67, 67, 67, 
+	67, 67, 67, 67, 67, 67, 3, 68, 
+	3, 3, 3, 3, 3, 3, 3, 69, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	70, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 45, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 71, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 45, 3, 43, 3, 3, 3, 3, 
-	3, 3, 3, 44, 3, 3, 3, 3, 
-	42, 42, 42, 42, 42, 42, 42, 42, 
-	42, 42, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	71, 3, 68, 3, 3, 3, 3, 3, 
+	3, 3, 69, 3, 3, 3, 3, 67, 
+	67, 67, 67, 67, 67, 67, 67, 67, 
+	67, 3, 3, 70, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 45, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 71, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 45, 3, 37, 3, 
-	3, 3, 36, 36, 36, 36, 36, 36, 
-	36, 36, 36, 36, 3, 28, 3, 3, 
-	3, 3, 3, 3, 3, 29, 3, 3, 
-	3, 3, 46, 46, 46, 46, 46, 46, 
-	46, 46, 46, 46, 3, 3, 3, 3, 
-	3, 3, 30, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 3, 3, 31, 
+	3, 3, 3, 71, 3, 62, 3, 3, 
+	3, 61, 61, 61, 61, 61, 61, 61, 
+	61, 61, 61, 3, 52, 3, 3, 3, 
+	3, 3, 3, 3, 53, 3, 3, 3, 
+	3, 72, 72, 72, 72, 72, 72, 72, 
+	72, 72, 72, 3, 3, 54, 3, 3, 
+	3, 55, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 56, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 3, 31, 3, 
-	0, 0, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 0, 3, 3, 0, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 56, 3, 0, 
+	0, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 0, 3, 3, 0, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 0, 0, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	0, 0, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 0, 3, 47, 47, 47, 47, 47, 
-	47, 47, 47, 47, 47, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	0, 3, 1, 0, 0, 0, 0, 0, 
+	0, 0, 2, 16, 0, 0, 0, 49, 
+	49, 49, 49, 49, 49, 49, 49, 49, 
+	49, 0, 0, 4, 5, 0, 0, 6, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 7, 8, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 8, 0, 27, 27, 27, 
+	27, 27, 27, 27, 27, 27, 27, 3, 
+	3, 3, 3, 28, 3, 24, 3, 3, 
+	3, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 3, 20, 3, 3, 3, 
+	19, 19, 19, 19, 19, 19, 19, 19, 
+	19, 19, 3, 16, 3, 3, 3, 15, 
+	15, 15, 15, 15, 15, 15, 15, 15, 
+	15, 3, 73, 73, 73, 73, 73, 73, 
+	73, 73, 73, 73, 3, 3, 11, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	10, 3, 3, 3, 3, 3, 3, 3, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 3, 12, 
 	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 3, 3, 3, 3, 3, 10, 
-	3, 49, 48, 48, 48, 48, 48, 48, 
-	48, 50, 3, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 51, 48, 48, 52, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 53, 54, 55, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 55, 48, 57, 56, 56, 56, 
-	56, 56, 56, 56, 58, 3, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 59, 56, 
-	56, 60, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 61, 62, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 62, 56, 63, 
-	48, 48, 48, 48, 48, 48, 48, 64, 
-	3, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 65, 48, 48, 66, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	54, 67, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 48, 48, 48, 48, 48, 
-	67, 48, 0
+	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 3, 3, 3, 3, 12, 3, 
+	75, 74, 74, 74, 74, 74, 74, 74, 
+	76, 3, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 77, 78, 74, 74, 79, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	80, 81, 82, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 82, 74, 84, 83, 83, 83, 83, 
+	83, 83, 83, 85, 3, 83, 83, 83, 
+	83, 83, 83, 83, 83, 83, 83, 83, 
+	83, 83, 83, 83, 86, 87, 83, 83, 
+	88, 83, 83, 83, 83, 83, 83, 83, 
+	83, 83, 83, 83, 83, 83, 83, 83, 
+	83, 83, 83, 83, 83, 83, 83, 83, 
+	83, 83, 83, 83, 89, 90, 83, 83, 
+	83, 83, 83, 83, 83, 83, 83, 83, 
+	83, 83, 83, 83, 83, 83, 83, 83, 
+	83, 83, 83, 83, 83, 83, 83, 83, 
+	83, 83, 83, 83, 90, 83, 91, 74, 
+	74, 74, 74, 74, 74, 74, 92, 3, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 93, 
+	94, 74, 74, 95, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 81, 
+	96, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 96, 
+	74, 0
 };
 
 static const char _deserialize_text_glyphs_trans_targs[] = {
-	1, 2, 4, 0, 12, 14, 23, 26, 
-	3, 24, 26, 5, 6, 11, 6, 11, 
-	2, 7, 26, 8, 9, 10, 9, 10, 
-	2, 26, 13, 22, 2, 4, 14, 26, 
-	15, 16, 21, 16, 21, 17, 18, 19, 
-	20, 19, 20, 2, 4, 26, 22, 24, 
-	1, 2, 4, 12, 14, 27, 23, 26, 
-	1, 2, 4, 12, 14, 23, 26, 2, 
-	4, 12, 14, 26
+	1, 2, 17, 0, 25, 28, 30, 39, 
+	47, 3, 45, 4, 47, 5, 6, 44, 
+	7, 8, 9, 43, 10, 11, 12, 42, 
+	13, 14, 15, 41, 16, 47, 18, 19, 
+	24, 19, 24, 2, 20, 4, 47, 21, 
+	22, 23, 22, 23, 2, 4, 47, 26, 
+	27, 40, 29, 38, 2, 17, 4, 30, 
+	47, 31, 32, 37, 32, 37, 33, 34, 
+	35, 36, 35, 36, 2, 17, 4, 47, 
+	38, 45, 1, 2, 17, 25, 28, 30, 
+	48, 39, 47, 1, 2, 17, 25, 28, 
+	30, 39, 47, 2, 17, 25, 28, 30, 
+	47
 };
 
 static const char _deserialize_text_glyphs_trans_actions[] = {
-	0, 1, 1, 0, 1, 1, 0, 1, 
-	2, 2, 3, 2, 2, 2, 0, 0, 
-	4, 4, 4, 2, 2, 2, 0, 0, 
-	5, 5, 2, 2, 6, 6, 6, 6, 
-	2, 2, 2, 0, 0, 7, 2, 2, 
-	2, 0, 0, 8, 8, 8, 0, 0, 
-	9, 10, 10, 10, 10, 9, 9, 10, 
-	12, 13, 13, 13, 13, 12, 13, 14, 
-	14, 14, 14, 14
+	0, 1, 1, 0, 1, 1, 1, 0, 
+	1, 2, 2, 3, 3, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 2, 2, 
+	2, 0, 0, 4, 4, 4, 4, 2, 
+	2, 2, 0, 0, 5, 5, 5, 0, 
+	0, 0, 2, 2, 6, 6, 6, 6, 
+	6, 2, 2, 2, 0, 0, 7, 2, 
+	2, 2, 0, 0, 8, 8, 8, 8, 
+	0, 0, 9, 10, 10, 10, 10, 10, 
+	9, 9, 10, 12, 13, 13, 13, 13, 
+	13, 12, 13, 14, 14, 14, 14, 14, 
+	14
 };
 
 static const char _deserialize_text_glyphs_eof_actions[] = {
@@ -264,17 +356,20 @@
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 11, 0
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 11, 
+	0
 };
 
-static const int deserialize_text_glyphs_start = 25;
-static const int deserialize_text_glyphs_first_final = 25;
+static const int deserialize_text_glyphs_start = 46;
+static const int deserialize_text_glyphs_first_final = 46;
 static const int deserialize_text_glyphs_error = 0;
 
-static const int deserialize_text_glyphs_en_main = 25;
+static const int deserialize_text_glyphs_en_main = 46;
 
 
-#line 98 "hb-buffer-deserialize-text-glyphs.rl"
+#line 101 "hb-buffer-deserialize-text-glyphs.rl"
 
 
 static hb_bool_t
@@ -294,12 +389,12 @@
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 298 "hb-buffer-deserialize-text-glyphs.hh"
+#line 386 "hb-buffer-deserialize-text-glyphs.hh"
 	{
 	cs = deserialize_text_glyphs_start;
 	}
 
-#line 303 "hb-buffer-deserialize-text-glyphs.hh"
+#line 389 "hb-buffer-deserialize-text-glyphs.hh"
 	{
 	int _slen;
 	int _trans;
@@ -457,7 +552,7 @@
 	  return false;
 }
 	break;
-#line 461 "hb-buffer-deserialize-text-glyphs.hh"
+#line 523 "hb-buffer-deserialize-text-glyphs.hh"
 	}
 
 _again:
@@ -478,7 +573,7 @@
 	*end_ptr = p;
 }
 	break;
-#line 482 "hb-buffer-deserialize-text-glyphs.hh"
+#line 542 "hb-buffer-deserialize-text-glyphs.hh"
 	}
 	}
 
@@ -485,7 +580,7 @@
 	_out: {}
 	}
 
-#line 119 "hb-buffer-deserialize-text-glyphs.rl"
+#line 122 "hb-buffer-deserialize-text-glyphs.rl"
 
 
   *end_ptr = p;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.rl	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.rl	2025-04-16 21:56:14 UTC (rev 74964)
@@ -76,7 +76,9 @@
 cluster	= '=' (unum >tok %parse_cluster);
 offsets	= '@' (num >tok %parse_x_offset)   ',' (num >tok %parse_y_offset );
 advances= '+' (num >tok %parse_x_advance) (',' (num >tok %parse_y_advance))?;
-glyphflags= '#' (unum >tok %parse_glyph_flags);
+glyphflags = '#' (unum >tok %parse_glyph_flags);
+# Not parsed. Ignored.
+glyphextents = '<' (num ',' num ',' num ',' num) '>';
 
 glyph_item	=
 	(
@@ -85,6 +87,7 @@
 		offsets?
 		advances?
 		glyphflags?
+		glyphextents?
 		( '|' | ']')
 	)
 	>clear_item

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h	2025-04-16 21:56:14 UTC (rev 74964)
@@ -338,438 +338,8 @@
 hb_language_matches (hb_language_t language,
 		     hb_language_t specific);
 
-/**
- * hb_script_t:
- * @HB_SCRIPT_COMMON: `Zyyy`
- * @HB_SCRIPT_INHERITED: `Zinh`
- * @HB_SCRIPT_UNKNOWN: `Zzzz`
- * @HB_SCRIPT_ARABIC: `Arab`
- * @HB_SCRIPT_ARMENIAN: `Armn`
- * @HB_SCRIPT_BENGALI: `Beng`
- * @HB_SCRIPT_CYRILLIC: `Cyrl`
- * @HB_SCRIPT_DEVANAGARI: `Deva`
- * @HB_SCRIPT_GEORGIAN: `Geor`
- * @HB_SCRIPT_GREEK: `Grek`
- * @HB_SCRIPT_GUJARATI: `Gujr`
- * @HB_SCRIPT_GURMUKHI: `Guru`
- * @HB_SCRIPT_HANGUL: `Hang`
- * @HB_SCRIPT_HAN: `Hani`
- * @HB_SCRIPT_HEBREW: `Hebr`
- * @HB_SCRIPT_HIRAGANA: `Hira`
- * @HB_SCRIPT_KANNADA: `Knda`
- * @HB_SCRIPT_KATAKANA: `Kana`
- * @HB_SCRIPT_LAO: `Laoo`
- * @HB_SCRIPT_LATIN: `Latn`
- * @HB_SCRIPT_MALAYALAM: `Mlym`
- * @HB_SCRIPT_ORIYA: `Orya`
- * @HB_SCRIPT_TAMIL: `Taml`
- * @HB_SCRIPT_TELUGU: `Telu`
- * @HB_SCRIPT_THAI: `Thai`
- * @HB_SCRIPT_TIBETAN: `Tibt`
- * @HB_SCRIPT_BOPOMOFO: `Bopo`
- * @HB_SCRIPT_BRAILLE: `Brai`
- * @HB_SCRIPT_CANADIAN_SYLLABICS: `Cans`
- * @HB_SCRIPT_CHEROKEE: `Cher`
- * @HB_SCRIPT_ETHIOPIC: `Ethi`
- * @HB_SCRIPT_KHMER: `Khmr`
- * @HB_SCRIPT_MONGOLIAN: `Mong`
- * @HB_SCRIPT_MYANMAR: `Mymr`
- * @HB_SCRIPT_OGHAM: `Ogam`
- * @HB_SCRIPT_RUNIC: `Runr`
- * @HB_SCRIPT_SINHALA: `Sinh`
- * @HB_SCRIPT_SYRIAC: `Syrc`
- * @HB_SCRIPT_THAANA: `Thaa`
- * @HB_SCRIPT_YI: `Yiii`
- * @HB_SCRIPT_DESERET: `Dsrt`
- * @HB_SCRIPT_GOTHIC: `Goth`
- * @HB_SCRIPT_OLD_ITALIC: `Ital`
- * @HB_SCRIPT_BUHID: `Buhd`
- * @HB_SCRIPT_HANUNOO: `Hano`
- * @HB_SCRIPT_TAGALOG: `Tglg`
- * @HB_SCRIPT_TAGBANWA: `Tagb`
- * @HB_SCRIPT_CYPRIOT: `Cprt`
- * @HB_SCRIPT_LIMBU: `Limb`
- * @HB_SCRIPT_LINEAR_B: `Linb`
- * @HB_SCRIPT_OSMANYA: `Osma`
- * @HB_SCRIPT_SHAVIAN: `Shaw`
- * @HB_SCRIPT_TAI_LE: `Tale`
- * @HB_SCRIPT_UGARITIC: `Ugar`
- * @HB_SCRIPT_BUGINESE: `Bugi`
- * @HB_SCRIPT_COPTIC: `Copt`
- * @HB_SCRIPT_GLAGOLITIC: `Glag`
- * @HB_SCRIPT_KHAROSHTHI: `Khar`
- * @HB_SCRIPT_NEW_TAI_LUE: `Talu`
- * @HB_SCRIPT_OLD_PERSIAN: `Xpeo`
- * @HB_SCRIPT_SYLOTI_NAGRI: `Sylo`
- * @HB_SCRIPT_TIFINAGH: `Tfng`
- * @HB_SCRIPT_BALINESE: `Bali`
- * @HB_SCRIPT_CUNEIFORM: `Xsux`
- * @HB_SCRIPT_NKO: `Nkoo`
- * @HB_SCRIPT_PHAGS_PA: `Phag`
- * @HB_SCRIPT_PHOENICIAN: `Phnx`
- * @HB_SCRIPT_CARIAN: `Cari`
- * @HB_SCRIPT_CHAM: `Cham`
- * @HB_SCRIPT_KAYAH_LI: `Kali`
- * @HB_SCRIPT_LEPCHA: `Lepc`
- * @HB_SCRIPT_LYCIAN: `Lyci`
- * @HB_SCRIPT_LYDIAN: `Lydi`
- * @HB_SCRIPT_OL_CHIKI: `Olck`
- * @HB_SCRIPT_REJANG: `Rjng`
- * @HB_SCRIPT_SAURASHTRA: `Saur`
- * @HB_SCRIPT_SUNDANESE: `Sund`
- * @HB_SCRIPT_VAI: `Vaii`
- * @HB_SCRIPT_AVESTAN: `Avst`
- * @HB_SCRIPT_BAMUM: `Bamu`
- * @HB_SCRIPT_EGYPTIAN_HIEROGLYPHS: `Egyp`
- * @HB_SCRIPT_IMPERIAL_ARAMAIC: `Armi`
- * @HB_SCRIPT_INSCRIPTIONAL_PAHLAVI: `Phli`
- * @HB_SCRIPT_INSCRIPTIONAL_PARTHIAN: `Prti`
- * @HB_SCRIPT_JAVANESE: `Java`
- * @HB_SCRIPT_KAITHI: `Kthi`
- * @HB_SCRIPT_LISU: `Lisu`
- * @HB_SCRIPT_MEETEI_MAYEK: `Mtei`
- * @HB_SCRIPT_OLD_SOUTH_ARABIAN: `Sarb`
- * @HB_SCRIPT_OLD_TURKIC: `Orkh`
- * @HB_SCRIPT_SAMARITAN: `Samr`
- * @HB_SCRIPT_TAI_THAM: `Lana`
- * @HB_SCRIPT_TAI_VIET: `Tavt`
- * @HB_SCRIPT_BATAK: `Batk`
- * @HB_SCRIPT_BRAHMI: `Brah`
- * @HB_SCRIPT_MANDAIC: `Mand`
- * @HB_SCRIPT_CHAKMA: `Cakm`
- * @HB_SCRIPT_MEROITIC_CURSIVE: `Merc`
- * @HB_SCRIPT_MEROITIC_HIEROGLYPHS: `Mero`
- * @HB_SCRIPT_MIAO: `Plrd`
- * @HB_SCRIPT_SHARADA: `Shrd`
- * @HB_SCRIPT_SORA_SOMPENG: `Sora`
- * @HB_SCRIPT_TAKRI: `Takr`
- * @HB_SCRIPT_BASSA_VAH: `Bass`, Since: 0.9.30
- * @HB_SCRIPT_CAUCASIAN_ALBANIAN: `Aghb`, Since: 0.9.30
- * @HB_SCRIPT_DUPLOYAN: `Dupl`, Since: 0.9.30
- * @HB_SCRIPT_ELBASAN: `Elba`, Since: 0.9.30
- * @HB_SCRIPT_GRANTHA: `Gran`, Since: 0.9.30
- * @HB_SCRIPT_KHOJKI: `Khoj`, Since: 0.9.30
- * @HB_SCRIPT_KHUDAWADI: `Sind`, Since: 0.9.30
- * @HB_SCRIPT_LINEAR_A: `Lina`, Since: 0.9.30
- * @HB_SCRIPT_MAHAJANI: `Mahj`, Since: 0.9.30
- * @HB_SCRIPT_MANICHAEAN: `Mani`, Since: 0.9.30
- * @HB_SCRIPT_MENDE_KIKAKUI: `Mend`, Since: 0.9.30
- * @HB_SCRIPT_MODI: `Modi`, Since: 0.9.30
- * @HB_SCRIPT_MRO: `Mroo`, Since: 0.9.30
- * @HB_SCRIPT_NABATAEAN: `Nbat`, Since: 0.9.30
- * @HB_SCRIPT_OLD_NORTH_ARABIAN: `Narb`, Since: 0.9.30
- * @HB_SCRIPT_OLD_PERMIC: `Perm`, Since: 0.9.30
- * @HB_SCRIPT_PAHAWH_HMONG: `Hmng`, Since: 0.9.30
- * @HB_SCRIPT_PALMYRENE: `Palm`, Since: 0.9.30
- * @HB_SCRIPT_PAU_CIN_HAU: `Pauc`, Since: 0.9.30
- * @HB_SCRIPT_PSALTER_PAHLAVI: `Phlp`, Since: 0.9.30
- * @HB_SCRIPT_SIDDHAM: `Sidd`, Since: 0.9.30
- * @HB_SCRIPT_TIRHUTA: `Tirh`, Since: 0.9.30
- * @HB_SCRIPT_WARANG_CITI: `Wara`, Since: 0.9.30
- * @HB_SCRIPT_AHOM: `Ahom`, Since: 0.9.30
- * @HB_SCRIPT_ANATOLIAN_HIEROGLYPHS: `Hluw`, Since: 0.9.30
- * @HB_SCRIPT_HATRAN: `Hatr`, Since: 0.9.30
- * @HB_SCRIPT_MULTANI: `Mult`, Since: 0.9.30
- * @HB_SCRIPT_OLD_HUNGARIAN: `Hung`, Since: 0.9.30
- * @HB_SCRIPT_SIGNWRITING: `Sgnw`, Since: 0.9.30
- * @HB_SCRIPT_ADLAM: `Adlm`, Since: 1.3.0
- * @HB_SCRIPT_BHAIKSUKI: `Bhks`, Since: 1.3.0
- * @HB_SCRIPT_MARCHEN: `Marc`, Since: 1.3.0
- * @HB_SCRIPT_OSAGE: `Osge`, Since: 1.3.0
- * @HB_SCRIPT_TANGUT: `Tang`, Since: 1.3.0
- * @HB_SCRIPT_NEWA: `Newa`, Since: 1.3.0
- * @HB_SCRIPT_MASARAM_GONDI: `Gonm`, Since: 1.6.0
- * @HB_SCRIPT_NUSHU: `Nshu`, Since: 1.6.0
- * @HB_SCRIPT_SOYOMBO: `Soyo`, Since: 1.6.0
- * @HB_SCRIPT_ZANABAZAR_SQUARE: `Zanb`, Since: 1.6.0
- * @HB_SCRIPT_DOGRA: `Dogr`, Since: 1.8.0
- * @HB_SCRIPT_GUNJALA_GONDI: `Gong`, Since: 1.8.0
- * @HB_SCRIPT_HANIFI_ROHINGYA: `Rohg`, Since: 1.8.0
- * @HB_SCRIPT_MAKASAR: `Maka`, Since: 1.8.0
- * @HB_SCRIPT_MEDEFAIDRIN: `Medf`, Since: 1.8.0
- * @HB_SCRIPT_OLD_SOGDIAN: `Sogo`, Since: 1.8.0
- * @HB_SCRIPT_SOGDIAN: `Sogd`, Since: 1.8.0
- * @HB_SCRIPT_ELYMAIC: `Elym`, Since: 2.4.0
- * @HB_SCRIPT_NANDINAGARI: `Nand`, Since: 2.4.0
- * @HB_SCRIPT_NYIAKENG_PUACHUE_HMONG: `Hmnp`, Since: 2.4.0
- * @HB_SCRIPT_WANCHO: `Wcho`, Since: 2.4.0
- * @HB_SCRIPT_CHORASMIAN: `Chrs`, Since: 2.6.7
- * @HB_SCRIPT_DIVES_AKURU: `Diak`, Since: 2.6.7
- * @HB_SCRIPT_KHITAN_SMALL_SCRIPT: `Kits`, Since: 2.6.7
- * @HB_SCRIPT_YEZIDI: `Yezi`, Since: 2.6.7
- * @HB_SCRIPT_CYPRO_MINOAN: `Cpmn`, Since: 3.0.0
- * @HB_SCRIPT_OLD_UYGHUR: `Ougr`, Since: 3.0.0
- * @HB_SCRIPT_TANGSA: `Tnsa`, Since: 3.0.0
- * @HB_SCRIPT_TOTO: `Toto`, Since: 3.0.0
- * @HB_SCRIPT_VITHKUQI: `Vith`, Since: 3.0.0
- * @HB_SCRIPT_MATH: `Zmth`, Since: 3.4.0
- * @HB_SCRIPT_KAWI: `Kawi`, Since: 5.2.0
- * @HB_SCRIPT_NAG_MUNDARI: `Nagm`, Since: 5.2.0
- * @HB_SCRIPT_GARAY: `Gara`, Since: 10.0.0
- * @HB_SCRIPT_GURUNG_KHEMA: `Gukh`, Since: 10.0.0
- * @HB_SCRIPT_KIRAT_RAI: `Krai`, Since: 10.0.0
- * @HB_SCRIPT_OL_ONAL: `Onao`, Since: 10.0.0
- * @HB_SCRIPT_SUNUWAR: `Sunu`, Since: 10.0.0
- * @HB_SCRIPT_TODHRI: `Todr`, Since: 10.0.0
- * @HB_SCRIPT_TULU_TIGALARI: `Tutg`, Since: 10.0.0
- * @HB_SCRIPT_INVALID: No script set
- *
- * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding
- * to the four-letter values defined by [ISO 15924](https://unicode.org/iso15924/).
- *
- * See also the Script (sc) property of the Unicode Character Database.
- *
- **/
+#include "hb-script-list.h"
 
-/* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
-typedef enum
-{
-  HB_SCRIPT_COMMON			= HB_TAG ('Z','y','y','y'), /*1.1*/
-  HB_SCRIPT_INHERITED			= HB_TAG ('Z','i','n','h'), /*1.1*/
-  HB_SCRIPT_UNKNOWN			= HB_TAG ('Z','z','z','z'), /*5.0*/
-
-  HB_SCRIPT_ARABIC			= HB_TAG ('A','r','a','b'), /*1.1*/
-  HB_SCRIPT_ARMENIAN			= HB_TAG ('A','r','m','n'), /*1.1*/
-  HB_SCRIPT_BENGALI			= HB_TAG ('B','e','n','g'), /*1.1*/
-  HB_SCRIPT_CYRILLIC			= HB_TAG ('C','y','r','l'), /*1.1*/
-  HB_SCRIPT_DEVANAGARI			= HB_TAG ('D','e','v','a'), /*1.1*/
-  HB_SCRIPT_GEORGIAN			= HB_TAG ('G','e','o','r'), /*1.1*/
-  HB_SCRIPT_GREEK			= HB_TAG ('G','r','e','k'), /*1.1*/
-  HB_SCRIPT_GUJARATI			= HB_TAG ('G','u','j','r'), /*1.1*/
-  HB_SCRIPT_GURMUKHI			= HB_TAG ('G','u','r','u'), /*1.1*/
-  HB_SCRIPT_HANGUL			= HB_TAG ('H','a','n','g'), /*1.1*/
-  HB_SCRIPT_HAN				= HB_TAG ('H','a','n','i'), /*1.1*/
-  HB_SCRIPT_HEBREW			= HB_TAG ('H','e','b','r'), /*1.1*/
-  HB_SCRIPT_HIRAGANA			= HB_TAG ('H','i','r','a'), /*1.1*/
-  HB_SCRIPT_KANNADA			= HB_TAG ('K','n','d','a'), /*1.1*/
-  HB_SCRIPT_KATAKANA			= HB_TAG ('K','a','n','a'), /*1.1*/
-  HB_SCRIPT_LAO				= HB_TAG ('L','a','o','o'), /*1.1*/
-  HB_SCRIPT_LATIN			= HB_TAG ('L','a','t','n'), /*1.1*/
-  HB_SCRIPT_MALAYALAM			= HB_TAG ('M','l','y','m'), /*1.1*/
-  HB_SCRIPT_ORIYA			= HB_TAG ('O','r','y','a'), /*1.1*/
-  HB_SCRIPT_TAMIL			= HB_TAG ('T','a','m','l'), /*1.1*/
-  HB_SCRIPT_TELUGU			= HB_TAG ('T','e','l','u'), /*1.1*/
-  HB_SCRIPT_THAI			= HB_TAG ('T','h','a','i'), /*1.1*/
-
-  HB_SCRIPT_TIBETAN			= HB_TAG ('T','i','b','t'), /*2.0*/
-
-  HB_SCRIPT_BOPOMOFO			= HB_TAG ('B','o','p','o'), /*3.0*/
-  HB_SCRIPT_BRAILLE			= HB_TAG ('B','r','a','i'), /*3.0*/
-  HB_SCRIPT_CANADIAN_SYLLABICS		= HB_TAG ('C','a','n','s'), /*3.0*/
-  HB_SCRIPT_CHEROKEE			= HB_TAG ('C','h','e','r'), /*3.0*/
-  HB_SCRIPT_ETHIOPIC			= HB_TAG ('E','t','h','i'), /*3.0*/
-  HB_SCRIPT_KHMER			= HB_TAG ('K','h','m','r'), /*3.0*/
-  HB_SCRIPT_MONGOLIAN			= HB_TAG ('M','o','n','g'), /*3.0*/
-  HB_SCRIPT_MYANMAR			= HB_TAG ('M','y','m','r'), /*3.0*/
-  HB_SCRIPT_OGHAM			= HB_TAG ('O','g','a','m'), /*3.0*/
-  HB_SCRIPT_RUNIC			= HB_TAG ('R','u','n','r'), /*3.0*/
-  HB_SCRIPT_SINHALA			= HB_TAG ('S','i','n','h'), /*3.0*/
-  HB_SCRIPT_SYRIAC			= HB_TAG ('S','y','r','c'), /*3.0*/
-  HB_SCRIPT_THAANA			= HB_TAG ('T','h','a','a'), /*3.0*/
-  HB_SCRIPT_YI				= HB_TAG ('Y','i','i','i'), /*3.0*/
-
-  HB_SCRIPT_DESERET			= HB_TAG ('D','s','r','t'), /*3.1*/
-  HB_SCRIPT_GOTHIC			= HB_TAG ('G','o','t','h'), /*3.1*/
-  HB_SCRIPT_OLD_ITALIC			= HB_TAG ('I','t','a','l'), /*3.1*/
-
-  HB_SCRIPT_BUHID			= HB_TAG ('B','u','h','d'), /*3.2*/
-  HB_SCRIPT_HANUNOO			= HB_TAG ('H','a','n','o'), /*3.2*/
-  HB_SCRIPT_TAGALOG			= HB_TAG ('T','g','l','g'), /*3.2*/
-  HB_SCRIPT_TAGBANWA			= HB_TAG ('T','a','g','b'), /*3.2*/
-
-  HB_SCRIPT_CYPRIOT			= HB_TAG ('C','p','r','t'), /*4.0*/
-  HB_SCRIPT_LIMBU			= HB_TAG ('L','i','m','b'), /*4.0*/
-  HB_SCRIPT_LINEAR_B			= HB_TAG ('L','i','n','b'), /*4.0*/
-  HB_SCRIPT_OSMANYA			= HB_TAG ('O','s','m','a'), /*4.0*/
-  HB_SCRIPT_SHAVIAN			= HB_TAG ('S','h','a','w'), /*4.0*/
-  HB_SCRIPT_TAI_LE			= HB_TAG ('T','a','l','e'), /*4.0*/
-  HB_SCRIPT_UGARITIC			= HB_TAG ('U','g','a','r'), /*4.0*/
-
-  HB_SCRIPT_BUGINESE			= HB_TAG ('B','u','g','i'), /*4.1*/
-  HB_SCRIPT_COPTIC			= HB_TAG ('C','o','p','t'), /*4.1*/
-  HB_SCRIPT_GLAGOLITIC			= HB_TAG ('G','l','a','g'), /*4.1*/
-  HB_SCRIPT_KHAROSHTHI			= HB_TAG ('K','h','a','r'), /*4.1*/
-  HB_SCRIPT_NEW_TAI_LUE			= HB_TAG ('T','a','l','u'), /*4.1*/
-  HB_SCRIPT_OLD_PERSIAN			= HB_TAG ('X','p','e','o'), /*4.1*/
-  HB_SCRIPT_SYLOTI_NAGRI		= HB_TAG ('S','y','l','o'), /*4.1*/
-  HB_SCRIPT_TIFINAGH			= HB_TAG ('T','f','n','g'), /*4.1*/
-
-  HB_SCRIPT_BALINESE			= HB_TAG ('B','a','l','i'), /*5.0*/
-  HB_SCRIPT_CUNEIFORM			= HB_TAG ('X','s','u','x'), /*5.0*/
-  HB_SCRIPT_NKO				= HB_TAG ('N','k','o','o'), /*5.0*/
-  HB_SCRIPT_PHAGS_PA			= HB_TAG ('P','h','a','g'), /*5.0*/
-  HB_SCRIPT_PHOENICIAN			= HB_TAG ('P','h','n','x'), /*5.0*/
-
-  HB_SCRIPT_CARIAN			= HB_TAG ('C','a','r','i'), /*5.1*/
-  HB_SCRIPT_CHAM			= HB_TAG ('C','h','a','m'), /*5.1*/
-  HB_SCRIPT_KAYAH_LI			= HB_TAG ('K','a','l','i'), /*5.1*/
-  HB_SCRIPT_LEPCHA			= HB_TAG ('L','e','p','c'), /*5.1*/
-  HB_SCRIPT_LYCIAN			= HB_TAG ('L','y','c','i'), /*5.1*/
-  HB_SCRIPT_LYDIAN			= HB_TAG ('L','y','d','i'), /*5.1*/
-  HB_SCRIPT_OL_CHIKI			= HB_TAG ('O','l','c','k'), /*5.1*/
-  HB_SCRIPT_REJANG			= HB_TAG ('R','j','n','g'), /*5.1*/
-  HB_SCRIPT_SAURASHTRA			= HB_TAG ('S','a','u','r'), /*5.1*/
-  HB_SCRIPT_SUNDANESE			= HB_TAG ('S','u','n','d'), /*5.1*/
-  HB_SCRIPT_VAI				= HB_TAG ('V','a','i','i'), /*5.1*/
-
-  HB_SCRIPT_AVESTAN			= HB_TAG ('A','v','s','t'), /*5.2*/
-  HB_SCRIPT_BAMUM			= HB_TAG ('B','a','m','u'), /*5.2*/
-  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS	= HB_TAG ('E','g','y','p'), /*5.2*/
-  HB_SCRIPT_IMPERIAL_ARAMAIC		= HB_TAG ('A','r','m','i'), /*5.2*/
-  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI	= HB_TAG ('P','h','l','i'), /*5.2*/
-  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN	= HB_TAG ('P','r','t','i'), /*5.2*/
-  HB_SCRIPT_JAVANESE			= HB_TAG ('J','a','v','a'), /*5.2*/
-  HB_SCRIPT_KAITHI			= HB_TAG ('K','t','h','i'), /*5.2*/
-  HB_SCRIPT_LISU			= HB_TAG ('L','i','s','u'), /*5.2*/
-  HB_SCRIPT_MEETEI_MAYEK		= HB_TAG ('M','t','e','i'), /*5.2*/
-  HB_SCRIPT_OLD_SOUTH_ARABIAN		= HB_TAG ('S','a','r','b'), /*5.2*/
-  HB_SCRIPT_OLD_TURKIC			= HB_TAG ('O','r','k','h'), /*5.2*/
-  HB_SCRIPT_SAMARITAN			= HB_TAG ('S','a','m','r'), /*5.2*/
-  HB_SCRIPT_TAI_THAM			= HB_TAG ('L','a','n','a'), /*5.2*/
-  HB_SCRIPT_TAI_VIET			= HB_TAG ('T','a','v','t'), /*5.2*/
-
-  HB_SCRIPT_BATAK			= HB_TAG ('B','a','t','k'), /*6.0*/
-  HB_SCRIPT_BRAHMI			= HB_TAG ('B','r','a','h'), /*6.0*/
-  HB_SCRIPT_MANDAIC			= HB_TAG ('M','a','n','d'), /*6.0*/
-
-  HB_SCRIPT_CHAKMA			= HB_TAG ('C','a','k','m'), /*6.1*/
-  HB_SCRIPT_MEROITIC_CURSIVE		= HB_TAG ('M','e','r','c'), /*6.1*/
-  HB_SCRIPT_MEROITIC_HIEROGLYPHS	= HB_TAG ('M','e','r','o'), /*6.1*/
-  HB_SCRIPT_MIAO			= HB_TAG ('P','l','r','d'), /*6.1*/
-  HB_SCRIPT_SHARADA			= HB_TAG ('S','h','r','d'), /*6.1*/
-  HB_SCRIPT_SORA_SOMPENG		= HB_TAG ('S','o','r','a'), /*6.1*/
-  HB_SCRIPT_TAKRI			= HB_TAG ('T','a','k','r'), /*6.1*/
-
-  /*
-   * Since: 0.9.30
-   */
-  HB_SCRIPT_BASSA_VAH			= HB_TAG ('B','a','s','s'), /*7.0*/
-  HB_SCRIPT_CAUCASIAN_ALBANIAN		= HB_TAG ('A','g','h','b'), /*7.0*/
-  HB_SCRIPT_DUPLOYAN			= HB_TAG ('D','u','p','l'), /*7.0*/
-  HB_SCRIPT_ELBASAN			= HB_TAG ('E','l','b','a'), /*7.0*/
-  HB_SCRIPT_GRANTHA			= HB_TAG ('G','r','a','n'), /*7.0*/
-  HB_SCRIPT_KHOJKI			= HB_TAG ('K','h','o','j'), /*7.0*/
-  HB_SCRIPT_KHUDAWADI			= HB_TAG ('S','i','n','d'), /*7.0*/
-  HB_SCRIPT_LINEAR_A			= HB_TAG ('L','i','n','a'), /*7.0*/
-  HB_SCRIPT_MAHAJANI			= HB_TAG ('M','a','h','j'), /*7.0*/
-  HB_SCRIPT_MANICHAEAN			= HB_TAG ('M','a','n','i'), /*7.0*/
-  HB_SCRIPT_MENDE_KIKAKUI		= HB_TAG ('M','e','n','d'), /*7.0*/
-  HB_SCRIPT_MODI			= HB_TAG ('M','o','d','i'), /*7.0*/
-  HB_SCRIPT_MRO				= HB_TAG ('M','r','o','o'), /*7.0*/
-  HB_SCRIPT_NABATAEAN			= HB_TAG ('N','b','a','t'), /*7.0*/
-  HB_SCRIPT_OLD_NORTH_ARABIAN		= HB_TAG ('N','a','r','b'), /*7.0*/
-  HB_SCRIPT_OLD_PERMIC			= HB_TAG ('P','e','r','m'), /*7.0*/
-  HB_SCRIPT_PAHAWH_HMONG		= HB_TAG ('H','m','n','g'), /*7.0*/
-  HB_SCRIPT_PALMYRENE			= HB_TAG ('P','a','l','m'), /*7.0*/
-  HB_SCRIPT_PAU_CIN_HAU			= HB_TAG ('P','a','u','c'), /*7.0*/
-  HB_SCRIPT_PSALTER_PAHLAVI		= HB_TAG ('P','h','l','p'), /*7.0*/
-  HB_SCRIPT_SIDDHAM			= HB_TAG ('S','i','d','d'), /*7.0*/
-  HB_SCRIPT_TIRHUTA			= HB_TAG ('T','i','r','h'), /*7.0*/
-  HB_SCRIPT_WARANG_CITI			= HB_TAG ('W','a','r','a'), /*7.0*/
-
-  HB_SCRIPT_AHOM			= HB_TAG ('A','h','o','m'), /*8.0*/
-  HB_SCRIPT_ANATOLIAN_HIEROGLYPHS	= HB_TAG ('H','l','u','w'), /*8.0*/
-  HB_SCRIPT_HATRAN			= HB_TAG ('H','a','t','r'), /*8.0*/
-  HB_SCRIPT_MULTANI			= HB_TAG ('M','u','l','t'), /*8.0*/
-  HB_SCRIPT_OLD_HUNGARIAN		= HB_TAG ('H','u','n','g'), /*8.0*/
-  HB_SCRIPT_SIGNWRITING			= HB_TAG ('S','g','n','w'), /*8.0*/
-
-  /*
-   * Since 1.3.0
-   */
-  HB_SCRIPT_ADLAM			= HB_TAG ('A','d','l','m'), /*9.0*/
-  HB_SCRIPT_BHAIKSUKI			= HB_TAG ('B','h','k','s'), /*9.0*/
-  HB_SCRIPT_MARCHEN			= HB_TAG ('M','a','r','c'), /*9.0*/
-  HB_SCRIPT_OSAGE			= HB_TAG ('O','s','g','e'), /*9.0*/
-  HB_SCRIPT_TANGUT			= HB_TAG ('T','a','n','g'), /*9.0*/
-  HB_SCRIPT_NEWA			= HB_TAG ('N','e','w','a'), /*9.0*/
-
-  /*
-   * Since 1.6.0
-   */
-  HB_SCRIPT_MASARAM_GONDI		= HB_TAG ('G','o','n','m'), /*10.0*/
-  HB_SCRIPT_NUSHU			= HB_TAG ('N','s','h','u'), /*10.0*/
-  HB_SCRIPT_SOYOMBO			= HB_TAG ('S','o','y','o'), /*10.0*/
-  HB_SCRIPT_ZANABAZAR_SQUARE		= HB_TAG ('Z','a','n','b'), /*10.0*/
-
-  /*
-   * Since 1.8.0
-   */
-  HB_SCRIPT_DOGRA			= HB_TAG ('D','o','g','r'), /*11.0*/
-  HB_SCRIPT_GUNJALA_GONDI		= HB_TAG ('G','o','n','g'), /*11.0*/
-  HB_SCRIPT_HANIFI_ROHINGYA		= HB_TAG ('R','o','h','g'), /*11.0*/
-  HB_SCRIPT_MAKASAR			= HB_TAG ('M','a','k','a'), /*11.0*/
-  HB_SCRIPT_MEDEFAIDRIN			= HB_TAG ('M','e','d','f'), /*11.0*/
-  HB_SCRIPT_OLD_SOGDIAN			= HB_TAG ('S','o','g','o'), /*11.0*/
-  HB_SCRIPT_SOGDIAN			= HB_TAG ('S','o','g','d'), /*11.0*/
-
-  /*
-   * Since 2.4.0
-   */
-  HB_SCRIPT_ELYMAIC			= HB_TAG ('E','l','y','m'), /*12.0*/
-  HB_SCRIPT_NANDINAGARI			= HB_TAG ('N','a','n','d'), /*12.0*/
-  HB_SCRIPT_NYIAKENG_PUACHUE_HMONG	= HB_TAG ('H','m','n','p'), /*12.0*/
-  HB_SCRIPT_WANCHO			= HB_TAG ('W','c','h','o'), /*12.0*/
-
-  /*
-   * Since 2.6.7
-   */
-  HB_SCRIPT_CHORASMIAN			= HB_TAG ('C','h','r','s'), /*13.0*/
-  HB_SCRIPT_DIVES_AKURU			= HB_TAG ('D','i','a','k'), /*13.0*/
-  HB_SCRIPT_KHITAN_SMALL_SCRIPT		= HB_TAG ('K','i','t','s'), /*13.0*/
-  HB_SCRIPT_YEZIDI			= HB_TAG ('Y','e','z','i'), /*13.0*/
-
-  /*
-   * Since 3.0.0
-   */
-  HB_SCRIPT_CYPRO_MINOAN		= HB_TAG ('C','p','m','n'), /*14.0*/
-  HB_SCRIPT_OLD_UYGHUR			= HB_TAG ('O','u','g','r'), /*14.0*/
-  HB_SCRIPT_TANGSA			= HB_TAG ('T','n','s','a'), /*14.0*/
-  HB_SCRIPT_TOTO			= HB_TAG ('T','o','t','o'), /*14.0*/
-  HB_SCRIPT_VITHKUQI			= HB_TAG ('V','i','t','h'), /*14.0*/
-
-  /*
-   * Since 3.4.0
-   */
-  HB_SCRIPT_MATH			= HB_TAG ('Z','m','t','h'),
-
-  /*
-   * Since 5.2.0
-   */
-  HB_SCRIPT_KAWI			= HB_TAG ('K','a','w','i'), /*15.0*/
-  HB_SCRIPT_NAG_MUNDARI			= HB_TAG ('N','a','g','m'), /*15.0*/
-
-  /*
-   * Since 10.0.0
-   */
-  HB_SCRIPT_GARAY			= HB_TAG ('G','a','r','a'), /*16.0*/
-  HB_SCRIPT_GURUNG_KHEMA		= HB_TAG ('G','u','k','h'), /*16.0*/
-  HB_SCRIPT_KIRAT_RAI			= HB_TAG ('K','r','a','i'), /*16.0*/
-  HB_SCRIPT_OL_ONAL			= HB_TAG ('O','n','a','o'), /*16.0*/
-  HB_SCRIPT_SUNUWAR			= HB_TAG ('S','u','n','u'), /*16.0*/
-  HB_SCRIPT_TODHRI			= HB_TAG ('T','o','d','r'), /*16.0*/
-  HB_SCRIPT_TULU_TIGALARI		= HB_TAG ('T','u','t','g'), /*16.0*/
-
-  /* No script set. */
-  HB_SCRIPT_INVALID			= HB_TAG_NONE,
-
-  /*< private >*/
-
-  /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t
-   * without risking undefined behavior.  We have two, for historical reasons.
-   * HB_TAG_MAX used to be unsigned, but that was invalid Ansi C, so was changed
-   * to _HB_SCRIPT_MAX_VALUE to be equal to HB_TAG_MAX_SIGNED as well.
-   *
-   * See this thread for technicalities:
-   *
-   *   https://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html
-   */
-  _HB_SCRIPT_MAX_VALUE				= HB_TAG_MAX_SIGNED, /*< skip >*/
-  _HB_SCRIPT_MAX_VALUE_SIGNED			= HB_TAG_MAX_SIGNED /*< skip >*/
-
-} hb_script_t;
-
-
 /* Script functions */
 
 HB_EXTERN hb_script_t

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -63,13 +63,13 @@
   uint64_t RegisterFontFileStream (IDWriteFontFileStream *fontFileStream)
   {
     fontFileStream->AddRef ();
-    auto lock = hb_lock_t (mutex);
+    hb_lock_t lock {mutex};
     mFontStreams.set (mNextFontFileKey, fontFileStream);
     return mNextFontFileKey++;
   }
   void UnregisterFontFileStream (uint64_t fontFileKey)
   {
-    auto lock = hb_lock_t (mutex);
+    hb_lock_t lock {mutex};
     IDWriteFontFileStream *stream = mFontStreams.get (fontFileKey);
     if (stream)
     {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -672,7 +672,7 @@
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_face_is_immutable (const hb_face_t *face)
+hb_face_is_immutable (hb_face_t *face)
 {
   return hb_object_is_immutable (face);
 }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h	2025-04-16 21:56:14 UTC (rev 74964)
@@ -131,7 +131,7 @@
 hb_face_make_immutable (hb_face_t *face);
 
 HB_EXTERN hb_bool_t
-hb_face_is_immutable (const hb_face_t *face);
+hb_face_is_immutable (hb_face_t *face);
 
 
 HB_EXTERN hb_blob_t *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -781,8 +781,8 @@
     bool y_neg = y_scale < 0;
     y_mult = (y_neg ? -((int64_t) -y_scale << 16) : ((int64_t) y_scale << 16)) / upem;
 
-    x_strength = fabsf (roundf (x_scale * x_embolden));
-    y_strength = fabsf (roundf (y_scale * y_embolden));
+    x_strength = roundf (abs (x_scale) * x_embolden);
+    y_strength = roundf (abs (y_scale) * y_embolden);
 
     slant_xy = y_scale ? slant * x_scale / y_scale : 0.f;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -667,10 +667,10 @@
   float x2 = x1 + x_mult *  ft_face->glyph->metrics.width;
   float y2 = y1 + y_mult * -ft_face->glyph->metrics.height;
 
-  extents->x_bearing = round (x1);
-  extents->y_bearing = round (y1);
-  extents->width = round (x2) - extents->x_bearing;
-  extents->height = round (y2) - extents->y_bearing;
+  extents->x_bearing = roundf (x1);
+  extents->y_bearing = roundf (y1);
+  extents->width = roundf (x2) - extents->x_bearing;
+  extents->height = roundf (y2) - extents->y_bearing;
 
   return true;
 }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -99,6 +99,8 @@
 
   hb_mutex_t () { init (); }
   ~hb_mutex_t () { fini (); }
+  hb_mutex_t (const hb_mutex_t &) = delete;
+  hb_mutex_t &operator= (const hb_mutex_t &) = delete;
 
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wcast-align"
@@ -114,6 +116,10 @@
   hb_lock_t (hb_mutex_t &mutex_) : mutex (&mutex_) { mutex->lock (); }
   hb_lock_t (hb_mutex_t *mutex_) : mutex (mutex_) { if (mutex) mutex->lock (); }
   ~hb_lock_t () { if (mutex) mutex->unlock (); }
+
+  hb_lock_t (const hb_lock_t &) = delete;
+  hb_lock_t &operator= (const hb_lock_t &) = delete;
+
   private:
   hb_mutex_t *mutex;
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -2863,8 +2863,13 @@
                   const hb_vector_t<const hb_vector_t<int>*>& rows)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (this))) return_trace (false);
     unsigned row_count = rows.length;
+    if (!row_count) {
+      // Nothing to serialize, will be empty.
+      return false;
+    }
+
+    if (unlikely (!c->extend_min (this))) return_trace (false);    
     itemCount = row_count;
 
     int min_threshold = has_long ? -65536 : -128;
@@ -4779,12 +4784,12 @@
   hb_position_t get_x_delta (hb_font_t *font,
 			     const ItemVariationStore &store,
 			     ItemVariationStore::cache_t *store_cache = nullptr) const
-  { return font->em_scalef_x (get_delta (font, store, store_cache)); }
+  { return !font->num_coords ? 0 : font->em_scalef_x (get_delta (font, store, store_cache)); }
 
   hb_position_t get_y_delta (hb_font_t *font,
 			     const ItemVariationStore &store,
 			     ItemVariationStore::cache_t *store_cache = nullptr) const
-  { return font->em_scalef_y (get_delta (font, store, store_cache)); }
+  { return !font->num_coords ? 0 : font->em_scalef_y (get_delta (font, store, store_cache)); }
 
   VariationDevice* copy (hb_serialize_context_t *c,
                          const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -2632,7 +2632,8 @@
  * @alternate_glyphs: (out caller-allocates) (array length=alternate_count): A glyphs buffer.
  *                    Alternate glyphs associated with the glyph id.
  *
- * Fetches alternates of a glyph from a given GSUB lookup index.
+ * Fetches alternates of a glyph from a given GSUB lookup index. Note that for one-to-one GSUB
+ * glyph substitutions, this function fetches the substituted glyph.
  *
  * Return value: Total number of alternates found in the specific lookup index for the given glyph id.
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -1104,6 +1104,24 @@
 		  mathVariants.sanitize (c, this));
   }
 
+  // https://github.com/harfbuzz/harfbuzz/issues/4653
+  HB_INTERNAL bool is_bad_cambria (hb_font_t *font) const
+  {
+#ifndef HB_NO_MATH
+    switch HB_CODEPOINT_ENCODE3 (font->face->table.MATH.get_blob ()->length,
+                                 get_constant (HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT, font),
+                                 get_constant (HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT, font))
+    {
+      /* sha1sum:ab4a4fe054d23061f3c039493d6f665cfda2ecf5  cambria.ttc
+       * sha1sum:086855301bff644f9d8827b88491fcf73a6d4cb9  cambria.ttc
+       * sha1sum:b1e5a3feaca2ea3dfcf79ccb377de749ecf60343  cambria.ttc */
+      case HB_CODEPOINT_ENCODE3 (25722, 2500, 3000):
+        return true;
+    }
+#endif
+    return false;
+  }
+
   hb_position_t get_constant (hb_ot_math_constant_t  constant,
 			      hb_font_t		   *font) const
   { return (this+mathConstants).get_value (constant, font); }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -87,6 +87,20 @@
 hb_ot_math_get_constant (hb_font_t *font,
 			 hb_ot_math_constant_t constant)
 {
+  /* https://github.com/harfbuzz/harfbuzz/issues/4653
+   * Cambria Math has incorrect value for displayOperatorMinHeight, and
+   * apparently Microsoft implementation swaps displayOperatorMinHeight and
+   * delimitedSubFormulaMinHeight, so we do the same if we detect Cambria Math
+   * with the swapped values. */
+  if ((constant == HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT ||
+       constant == HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT) &&
+      font->face->table.MATH->is_bad_cambria (font))
+  {
+    if (constant == HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT)
+      constant = HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT;
+    else
+      constant = HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT;
+  }
   return font->face->table.MATH->get_constant(constant, font);
 }
 

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-script-list.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-script-list.h	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-script-list.h	2025-04-16 21:56:14 UTC (rev 74964)
@@ -0,0 +1,484 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2011,2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_SCRIPT_LIST_H
+#define HB_SCRIPT_LIST_H
+
+/* This file belongs to the middle of hb-common.h.
+ * The reason it has been surgically extracted is because
+ * FreeType imports types and enums from hb-common.h,
+ * and since this enum is large and growing, we want to
+ * make it easy to just copy the file over to FreeType.
+ * https://github.com/harfbuzz/harfbuzz/issues/5271
+ */
+
+/* Dummy lines to make our checks happy.  */
+#if 0
+#include "hb-common.h"
+HB_BEGIN_DECLS
+HB_END_DECLS
+#endif
+
+
+/**
+ * hb_script_t:
+ * @HB_SCRIPT_COMMON: `Zyyy`
+ * @HB_SCRIPT_INHERITED: `Zinh`
+ * @HB_SCRIPT_UNKNOWN: `Zzzz`
+ * @HB_SCRIPT_ARABIC: `Arab`
+ * @HB_SCRIPT_ARMENIAN: `Armn`
+ * @HB_SCRIPT_BENGALI: `Beng`
+ * @HB_SCRIPT_CYRILLIC: `Cyrl`
+ * @HB_SCRIPT_DEVANAGARI: `Deva`
+ * @HB_SCRIPT_GEORGIAN: `Geor`
+ * @HB_SCRIPT_GREEK: `Grek`
+ * @HB_SCRIPT_GUJARATI: `Gujr`
+ * @HB_SCRIPT_GURMUKHI: `Guru`
+ * @HB_SCRIPT_HANGUL: `Hang`
+ * @HB_SCRIPT_HAN: `Hani`
+ * @HB_SCRIPT_HEBREW: `Hebr`
+ * @HB_SCRIPT_HIRAGANA: `Hira`
+ * @HB_SCRIPT_KANNADA: `Knda`
+ * @HB_SCRIPT_KATAKANA: `Kana`
+ * @HB_SCRIPT_LAO: `Laoo`
+ * @HB_SCRIPT_LATIN: `Latn`
+ * @HB_SCRIPT_MALAYALAM: `Mlym`
+ * @HB_SCRIPT_ORIYA: `Orya`
+ * @HB_SCRIPT_TAMIL: `Taml`
+ * @HB_SCRIPT_TELUGU: `Telu`
+ * @HB_SCRIPT_THAI: `Thai`
+ * @HB_SCRIPT_TIBETAN: `Tibt`
+ * @HB_SCRIPT_BOPOMOFO: `Bopo`
+ * @HB_SCRIPT_BRAILLE: `Brai`
+ * @HB_SCRIPT_CANADIAN_SYLLABICS: `Cans`
+ * @HB_SCRIPT_CHEROKEE: `Cher`
+ * @HB_SCRIPT_ETHIOPIC: `Ethi`
+ * @HB_SCRIPT_KHMER: `Khmr`
+ * @HB_SCRIPT_MONGOLIAN: `Mong`
+ * @HB_SCRIPT_MYANMAR: `Mymr`
+ * @HB_SCRIPT_OGHAM: `Ogam`
+ * @HB_SCRIPT_RUNIC: `Runr`
+ * @HB_SCRIPT_SINHALA: `Sinh`
+ * @HB_SCRIPT_SYRIAC: `Syrc`
+ * @HB_SCRIPT_THAANA: `Thaa`
+ * @HB_SCRIPT_YI: `Yiii`
+ * @HB_SCRIPT_DESERET: `Dsrt`
+ * @HB_SCRIPT_GOTHIC: `Goth`
+ * @HB_SCRIPT_OLD_ITALIC: `Ital`
+ * @HB_SCRIPT_BUHID: `Buhd`
+ * @HB_SCRIPT_HANUNOO: `Hano`
+ * @HB_SCRIPT_TAGALOG: `Tglg`
+ * @HB_SCRIPT_TAGBANWA: `Tagb`
+ * @HB_SCRIPT_CYPRIOT: `Cprt`
+ * @HB_SCRIPT_LIMBU: `Limb`
+ * @HB_SCRIPT_LINEAR_B: `Linb`
+ * @HB_SCRIPT_OSMANYA: `Osma`
+ * @HB_SCRIPT_SHAVIAN: `Shaw`
+ * @HB_SCRIPT_TAI_LE: `Tale`
+ * @HB_SCRIPT_UGARITIC: `Ugar`
+ * @HB_SCRIPT_BUGINESE: `Bugi`
+ * @HB_SCRIPT_COPTIC: `Copt`
+ * @HB_SCRIPT_GLAGOLITIC: `Glag`
+ * @HB_SCRIPT_KHAROSHTHI: `Khar`
+ * @HB_SCRIPT_NEW_TAI_LUE: `Talu`
+ * @HB_SCRIPT_OLD_PERSIAN: `Xpeo`
+ * @HB_SCRIPT_SYLOTI_NAGRI: `Sylo`
+ * @HB_SCRIPT_TIFINAGH: `Tfng`
+ * @HB_SCRIPT_BALINESE: `Bali`
+ * @HB_SCRIPT_CUNEIFORM: `Xsux`
+ * @HB_SCRIPT_NKO: `Nkoo`
+ * @HB_SCRIPT_PHAGS_PA: `Phag`
+ * @HB_SCRIPT_PHOENICIAN: `Phnx`
+ * @HB_SCRIPT_CARIAN: `Cari`
+ * @HB_SCRIPT_CHAM: `Cham`
+ * @HB_SCRIPT_KAYAH_LI: `Kali`
+ * @HB_SCRIPT_LEPCHA: `Lepc`
+ * @HB_SCRIPT_LYCIAN: `Lyci`
+ * @HB_SCRIPT_LYDIAN: `Lydi`
+ * @HB_SCRIPT_OL_CHIKI: `Olck`
+ * @HB_SCRIPT_REJANG: `Rjng`
+ * @HB_SCRIPT_SAURASHTRA: `Saur`
+ * @HB_SCRIPT_SUNDANESE: `Sund`
+ * @HB_SCRIPT_VAI: `Vaii`
+ * @HB_SCRIPT_AVESTAN: `Avst`
+ * @HB_SCRIPT_BAMUM: `Bamu`
+ * @HB_SCRIPT_EGYPTIAN_HIEROGLYPHS: `Egyp`
+ * @HB_SCRIPT_IMPERIAL_ARAMAIC: `Armi`
+ * @HB_SCRIPT_INSCRIPTIONAL_PAHLAVI: `Phli`
+ * @HB_SCRIPT_INSCRIPTIONAL_PARTHIAN: `Prti`
+ * @HB_SCRIPT_JAVANESE: `Java`
+ * @HB_SCRIPT_KAITHI: `Kthi`
+ * @HB_SCRIPT_LISU: `Lisu`
+ * @HB_SCRIPT_MEETEI_MAYEK: `Mtei`
+ * @HB_SCRIPT_OLD_SOUTH_ARABIAN: `Sarb`
+ * @HB_SCRIPT_OLD_TURKIC: `Orkh`
+ * @HB_SCRIPT_SAMARITAN: `Samr`
+ * @HB_SCRIPT_TAI_THAM: `Lana`
+ * @HB_SCRIPT_TAI_VIET: `Tavt`
+ * @HB_SCRIPT_BATAK: `Batk`
+ * @HB_SCRIPT_BRAHMI: `Brah`
+ * @HB_SCRIPT_MANDAIC: `Mand`
+ * @HB_SCRIPT_CHAKMA: `Cakm`
+ * @HB_SCRIPT_MEROITIC_CURSIVE: `Merc`
+ * @HB_SCRIPT_MEROITIC_HIEROGLYPHS: `Mero`
+ * @HB_SCRIPT_MIAO: `Plrd`
+ * @HB_SCRIPT_SHARADA: `Shrd`
+ * @HB_SCRIPT_SORA_SOMPENG: `Sora`
+ * @HB_SCRIPT_TAKRI: `Takr`
+ * @HB_SCRIPT_BASSA_VAH: `Bass`, Since: 0.9.30
+ * @HB_SCRIPT_CAUCASIAN_ALBANIAN: `Aghb`, Since: 0.9.30
+ * @HB_SCRIPT_DUPLOYAN: `Dupl`, Since: 0.9.30
+ * @HB_SCRIPT_ELBASAN: `Elba`, Since: 0.9.30
+ * @HB_SCRIPT_GRANTHA: `Gran`, Since: 0.9.30
+ * @HB_SCRIPT_KHOJKI: `Khoj`, Since: 0.9.30
+ * @HB_SCRIPT_KHUDAWADI: `Sind`, Since: 0.9.30
+ * @HB_SCRIPT_LINEAR_A: `Lina`, Since: 0.9.30
+ * @HB_SCRIPT_MAHAJANI: `Mahj`, Since: 0.9.30
+ * @HB_SCRIPT_MANICHAEAN: `Mani`, Since: 0.9.30
+ * @HB_SCRIPT_MENDE_KIKAKUI: `Mend`, Since: 0.9.30
+ * @HB_SCRIPT_MODI: `Modi`, Since: 0.9.30
+ * @HB_SCRIPT_MRO: `Mroo`, Since: 0.9.30
+ * @HB_SCRIPT_NABATAEAN: `Nbat`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_NORTH_ARABIAN: `Narb`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_PERMIC: `Perm`, Since: 0.9.30
+ * @HB_SCRIPT_PAHAWH_HMONG: `Hmng`, Since: 0.9.30
+ * @HB_SCRIPT_PALMYRENE: `Palm`, Since: 0.9.30
+ * @HB_SCRIPT_PAU_CIN_HAU: `Pauc`, Since: 0.9.30
+ * @HB_SCRIPT_PSALTER_PAHLAVI: `Phlp`, Since: 0.9.30
+ * @HB_SCRIPT_SIDDHAM: `Sidd`, Since: 0.9.30
+ * @HB_SCRIPT_TIRHUTA: `Tirh`, Since: 0.9.30
+ * @HB_SCRIPT_WARANG_CITI: `Wara`, Since: 0.9.30
+ * @HB_SCRIPT_AHOM: `Ahom`, Since: 0.9.30
+ * @HB_SCRIPT_ANATOLIAN_HIEROGLYPHS: `Hluw`, Since: 0.9.30
+ * @HB_SCRIPT_HATRAN: `Hatr`, Since: 0.9.30
+ * @HB_SCRIPT_MULTANI: `Mult`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_HUNGARIAN: `Hung`, Since: 0.9.30
+ * @HB_SCRIPT_SIGNWRITING: `Sgnw`, Since: 0.9.30
+ * @HB_SCRIPT_ADLAM: `Adlm`, Since: 1.3.0
+ * @HB_SCRIPT_BHAIKSUKI: `Bhks`, Since: 1.3.0
+ * @HB_SCRIPT_MARCHEN: `Marc`, Since: 1.3.0
+ * @HB_SCRIPT_OSAGE: `Osge`, Since: 1.3.0
+ * @HB_SCRIPT_TANGUT: `Tang`, Since: 1.3.0
+ * @HB_SCRIPT_NEWA: `Newa`, Since: 1.3.0
+ * @HB_SCRIPT_MASARAM_GONDI: `Gonm`, Since: 1.6.0
+ * @HB_SCRIPT_NUSHU: `Nshu`, Since: 1.6.0
+ * @HB_SCRIPT_SOYOMBO: `Soyo`, Since: 1.6.0
+ * @HB_SCRIPT_ZANABAZAR_SQUARE: `Zanb`, Since: 1.6.0
+ * @HB_SCRIPT_DOGRA: `Dogr`, Since: 1.8.0
+ * @HB_SCRIPT_GUNJALA_GONDI: `Gong`, Since: 1.8.0
+ * @HB_SCRIPT_HANIFI_ROHINGYA: `Rohg`, Since: 1.8.0
+ * @HB_SCRIPT_MAKASAR: `Maka`, Since: 1.8.0
+ * @HB_SCRIPT_MEDEFAIDRIN: `Medf`, Since: 1.8.0
+ * @HB_SCRIPT_OLD_SOGDIAN: `Sogo`, Since: 1.8.0
+ * @HB_SCRIPT_SOGDIAN: `Sogd`, Since: 1.8.0
+ * @HB_SCRIPT_ELYMAIC: `Elym`, Since: 2.4.0
+ * @HB_SCRIPT_NANDINAGARI: `Nand`, Since: 2.4.0
+ * @HB_SCRIPT_NYIAKENG_PUACHUE_HMONG: `Hmnp`, Since: 2.4.0
+ * @HB_SCRIPT_WANCHO: `Wcho`, Since: 2.4.0
+ * @HB_SCRIPT_CHORASMIAN: `Chrs`, Since: 2.6.7
+ * @HB_SCRIPT_DIVES_AKURU: `Diak`, Since: 2.6.7
+ * @HB_SCRIPT_KHITAN_SMALL_SCRIPT: `Kits`, Since: 2.6.7
+ * @HB_SCRIPT_YEZIDI: `Yezi`, Since: 2.6.7
+ * @HB_SCRIPT_CYPRO_MINOAN: `Cpmn`, Since: 3.0.0
+ * @HB_SCRIPT_OLD_UYGHUR: `Ougr`, Since: 3.0.0
+ * @HB_SCRIPT_TANGSA: `Tnsa`, Since: 3.0.0
+ * @HB_SCRIPT_TOTO: `Toto`, Since: 3.0.0
+ * @HB_SCRIPT_VITHKUQI: `Vith`, Since: 3.0.0
+ * @HB_SCRIPT_MATH: `Zmth`, Since: 3.4.0
+ * @HB_SCRIPT_KAWI: `Kawi`, Since: 5.2.0
+ * @HB_SCRIPT_NAG_MUNDARI: `Nagm`, Since: 5.2.0
+ * @HB_SCRIPT_GARAY: `Gara`, Since: 10.0.0
+ * @HB_SCRIPT_GURUNG_KHEMA: `Gukh`, Since: 10.0.0
+ * @HB_SCRIPT_KIRAT_RAI: `Krai`, Since: 10.0.0
+ * @HB_SCRIPT_OL_ONAL: `Onao`, Since: 10.0.0
+ * @HB_SCRIPT_SUNUWAR: `Sunu`, Since: 10.0.0
+ * @HB_SCRIPT_TODHRI: `Todr`, Since: 10.0.0
+ * @HB_SCRIPT_TULU_TIGALARI: `Tutg`, Since: 10.0.0
+ * @HB_SCRIPT_INVALID: No script set
+ *
+ * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding
+ * to the four-letter values defined by [ISO 15924](https://unicode.org/iso15924/).
+ *
+ * See also the Script (sc) property of the Unicode Character Database.
+ *
+ **/
+
+/* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
+typedef enum
+{
+  HB_SCRIPT_COMMON			= HB_TAG ('Z','y','y','y'), /*1.1*/
+  HB_SCRIPT_INHERITED			= HB_TAG ('Z','i','n','h'), /*1.1*/
+  HB_SCRIPT_UNKNOWN			= HB_TAG ('Z','z','z','z'), /*5.0*/
+
+  HB_SCRIPT_ARABIC			= HB_TAG ('A','r','a','b'), /*1.1*/
+  HB_SCRIPT_ARMENIAN			= HB_TAG ('A','r','m','n'), /*1.1*/
+  HB_SCRIPT_BENGALI			= HB_TAG ('B','e','n','g'), /*1.1*/
+  HB_SCRIPT_CYRILLIC			= HB_TAG ('C','y','r','l'), /*1.1*/
+  HB_SCRIPT_DEVANAGARI			= HB_TAG ('D','e','v','a'), /*1.1*/
+  HB_SCRIPT_GEORGIAN			= HB_TAG ('G','e','o','r'), /*1.1*/
+  HB_SCRIPT_GREEK			= HB_TAG ('G','r','e','k'), /*1.1*/
+  HB_SCRIPT_GUJARATI			= HB_TAG ('G','u','j','r'), /*1.1*/
+  HB_SCRIPT_GURMUKHI			= HB_TAG ('G','u','r','u'), /*1.1*/
+  HB_SCRIPT_HANGUL			= HB_TAG ('H','a','n','g'), /*1.1*/
+  HB_SCRIPT_HAN				= HB_TAG ('H','a','n','i'), /*1.1*/
+  HB_SCRIPT_HEBREW			= HB_TAG ('H','e','b','r'), /*1.1*/
+  HB_SCRIPT_HIRAGANA			= HB_TAG ('H','i','r','a'), /*1.1*/
+  HB_SCRIPT_KANNADA			= HB_TAG ('K','n','d','a'), /*1.1*/
+  HB_SCRIPT_KATAKANA			= HB_TAG ('K','a','n','a'), /*1.1*/
+  HB_SCRIPT_LAO				= HB_TAG ('L','a','o','o'), /*1.1*/
+  HB_SCRIPT_LATIN			= HB_TAG ('L','a','t','n'), /*1.1*/
+  HB_SCRIPT_MALAYALAM			= HB_TAG ('M','l','y','m'), /*1.1*/
+  HB_SCRIPT_ORIYA			= HB_TAG ('O','r','y','a'), /*1.1*/
+  HB_SCRIPT_TAMIL			= HB_TAG ('T','a','m','l'), /*1.1*/
+  HB_SCRIPT_TELUGU			= HB_TAG ('T','e','l','u'), /*1.1*/
+  HB_SCRIPT_THAI			= HB_TAG ('T','h','a','i'), /*1.1*/
+
+  HB_SCRIPT_TIBETAN			= HB_TAG ('T','i','b','t'), /*2.0*/
+
+  HB_SCRIPT_BOPOMOFO			= HB_TAG ('B','o','p','o'), /*3.0*/
+  HB_SCRIPT_BRAILLE			= HB_TAG ('B','r','a','i'), /*3.0*/
+  HB_SCRIPT_CANADIAN_SYLLABICS		= HB_TAG ('C','a','n','s'), /*3.0*/
+  HB_SCRIPT_CHEROKEE			= HB_TAG ('C','h','e','r'), /*3.0*/
+  HB_SCRIPT_ETHIOPIC			= HB_TAG ('E','t','h','i'), /*3.0*/
+  HB_SCRIPT_KHMER			= HB_TAG ('K','h','m','r'), /*3.0*/
+  HB_SCRIPT_MONGOLIAN			= HB_TAG ('M','o','n','g'), /*3.0*/
+  HB_SCRIPT_MYANMAR			= HB_TAG ('M','y','m','r'), /*3.0*/
+  HB_SCRIPT_OGHAM			= HB_TAG ('O','g','a','m'), /*3.0*/
+  HB_SCRIPT_RUNIC			= HB_TAG ('R','u','n','r'), /*3.0*/
+  HB_SCRIPT_SINHALA			= HB_TAG ('S','i','n','h'), /*3.0*/
+  HB_SCRIPT_SYRIAC			= HB_TAG ('S','y','r','c'), /*3.0*/
+  HB_SCRIPT_THAANA			= HB_TAG ('T','h','a','a'), /*3.0*/
+  HB_SCRIPT_YI				= HB_TAG ('Y','i','i','i'), /*3.0*/
+
+  HB_SCRIPT_DESERET			= HB_TAG ('D','s','r','t'), /*3.1*/
+  HB_SCRIPT_GOTHIC			= HB_TAG ('G','o','t','h'), /*3.1*/
+  HB_SCRIPT_OLD_ITALIC			= HB_TAG ('I','t','a','l'), /*3.1*/
+
+  HB_SCRIPT_BUHID			= HB_TAG ('B','u','h','d'), /*3.2*/
+  HB_SCRIPT_HANUNOO			= HB_TAG ('H','a','n','o'), /*3.2*/
+  HB_SCRIPT_TAGALOG			= HB_TAG ('T','g','l','g'), /*3.2*/
+  HB_SCRIPT_TAGBANWA			= HB_TAG ('T','a','g','b'), /*3.2*/
+
+  HB_SCRIPT_CYPRIOT			= HB_TAG ('C','p','r','t'), /*4.0*/
+  HB_SCRIPT_LIMBU			= HB_TAG ('L','i','m','b'), /*4.0*/
+  HB_SCRIPT_LINEAR_B			= HB_TAG ('L','i','n','b'), /*4.0*/
+  HB_SCRIPT_OSMANYA			= HB_TAG ('O','s','m','a'), /*4.0*/
+  HB_SCRIPT_SHAVIAN			= HB_TAG ('S','h','a','w'), /*4.0*/
+  HB_SCRIPT_TAI_LE			= HB_TAG ('T','a','l','e'), /*4.0*/
+  HB_SCRIPT_UGARITIC			= HB_TAG ('U','g','a','r'), /*4.0*/
+
+  HB_SCRIPT_BUGINESE			= HB_TAG ('B','u','g','i'), /*4.1*/
+  HB_SCRIPT_COPTIC			= HB_TAG ('C','o','p','t'), /*4.1*/
+  HB_SCRIPT_GLAGOLITIC			= HB_TAG ('G','l','a','g'), /*4.1*/
+  HB_SCRIPT_KHAROSHTHI			= HB_TAG ('K','h','a','r'), /*4.1*/
+  HB_SCRIPT_NEW_TAI_LUE			= HB_TAG ('T','a','l','u'), /*4.1*/
+  HB_SCRIPT_OLD_PERSIAN			= HB_TAG ('X','p','e','o'), /*4.1*/
+  HB_SCRIPT_SYLOTI_NAGRI		= HB_TAG ('S','y','l','o'), /*4.1*/
+  HB_SCRIPT_TIFINAGH			= HB_TAG ('T','f','n','g'), /*4.1*/
+
+  HB_SCRIPT_BALINESE			= HB_TAG ('B','a','l','i'), /*5.0*/
+  HB_SCRIPT_CUNEIFORM			= HB_TAG ('X','s','u','x'), /*5.0*/
+  HB_SCRIPT_NKO				= HB_TAG ('N','k','o','o'), /*5.0*/
+  HB_SCRIPT_PHAGS_PA			= HB_TAG ('P','h','a','g'), /*5.0*/
+  HB_SCRIPT_PHOENICIAN			= HB_TAG ('P','h','n','x'), /*5.0*/
+
+  HB_SCRIPT_CARIAN			= HB_TAG ('C','a','r','i'), /*5.1*/
+  HB_SCRIPT_CHAM			= HB_TAG ('C','h','a','m'), /*5.1*/
+  HB_SCRIPT_KAYAH_LI			= HB_TAG ('K','a','l','i'), /*5.1*/
+  HB_SCRIPT_LEPCHA			= HB_TAG ('L','e','p','c'), /*5.1*/
+  HB_SCRIPT_LYCIAN			= HB_TAG ('L','y','c','i'), /*5.1*/
+  HB_SCRIPT_LYDIAN			= HB_TAG ('L','y','d','i'), /*5.1*/
+  HB_SCRIPT_OL_CHIKI			= HB_TAG ('O','l','c','k'), /*5.1*/
+  HB_SCRIPT_REJANG			= HB_TAG ('R','j','n','g'), /*5.1*/
+  HB_SCRIPT_SAURASHTRA			= HB_TAG ('S','a','u','r'), /*5.1*/
+  HB_SCRIPT_SUNDANESE			= HB_TAG ('S','u','n','d'), /*5.1*/
+  HB_SCRIPT_VAI				= HB_TAG ('V','a','i','i'), /*5.1*/
+
+  HB_SCRIPT_AVESTAN			= HB_TAG ('A','v','s','t'), /*5.2*/
+  HB_SCRIPT_BAMUM			= HB_TAG ('B','a','m','u'), /*5.2*/
+  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS	= HB_TAG ('E','g','y','p'), /*5.2*/
+  HB_SCRIPT_IMPERIAL_ARAMAIC		= HB_TAG ('A','r','m','i'), /*5.2*/
+  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI	= HB_TAG ('P','h','l','i'), /*5.2*/
+  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN	= HB_TAG ('P','r','t','i'), /*5.2*/
+  HB_SCRIPT_JAVANESE			= HB_TAG ('J','a','v','a'), /*5.2*/
+  HB_SCRIPT_KAITHI			= HB_TAG ('K','t','h','i'), /*5.2*/
+  HB_SCRIPT_LISU			= HB_TAG ('L','i','s','u'), /*5.2*/
+  HB_SCRIPT_MEETEI_MAYEK		= HB_TAG ('M','t','e','i'), /*5.2*/
+  HB_SCRIPT_OLD_SOUTH_ARABIAN		= HB_TAG ('S','a','r','b'), /*5.2*/
+  HB_SCRIPT_OLD_TURKIC			= HB_TAG ('O','r','k','h'), /*5.2*/
+  HB_SCRIPT_SAMARITAN			= HB_TAG ('S','a','m','r'), /*5.2*/
+  HB_SCRIPT_TAI_THAM			= HB_TAG ('L','a','n','a'), /*5.2*/
+  HB_SCRIPT_TAI_VIET			= HB_TAG ('T','a','v','t'), /*5.2*/
+
+  HB_SCRIPT_BATAK			= HB_TAG ('B','a','t','k'), /*6.0*/
+  HB_SCRIPT_BRAHMI			= HB_TAG ('B','r','a','h'), /*6.0*/
+  HB_SCRIPT_MANDAIC			= HB_TAG ('M','a','n','d'), /*6.0*/
+
+  HB_SCRIPT_CHAKMA			= HB_TAG ('C','a','k','m'), /*6.1*/
+  HB_SCRIPT_MEROITIC_CURSIVE		= HB_TAG ('M','e','r','c'), /*6.1*/
+  HB_SCRIPT_MEROITIC_HIEROGLYPHS	= HB_TAG ('M','e','r','o'), /*6.1*/
+  HB_SCRIPT_MIAO			= HB_TAG ('P','l','r','d'), /*6.1*/
+  HB_SCRIPT_SHARADA			= HB_TAG ('S','h','r','d'), /*6.1*/
+  HB_SCRIPT_SORA_SOMPENG		= HB_TAG ('S','o','r','a'), /*6.1*/
+  HB_SCRIPT_TAKRI			= HB_TAG ('T','a','k','r'), /*6.1*/
+
+  /*
+   * Since: 0.9.30
+   */
+  HB_SCRIPT_BASSA_VAH			= HB_TAG ('B','a','s','s'), /*7.0*/
+  HB_SCRIPT_CAUCASIAN_ALBANIAN		= HB_TAG ('A','g','h','b'), /*7.0*/
+  HB_SCRIPT_DUPLOYAN			= HB_TAG ('D','u','p','l'), /*7.0*/
+  HB_SCRIPT_ELBASAN			= HB_TAG ('E','l','b','a'), /*7.0*/
+  HB_SCRIPT_GRANTHA			= HB_TAG ('G','r','a','n'), /*7.0*/
+  HB_SCRIPT_KHOJKI			= HB_TAG ('K','h','o','j'), /*7.0*/
+  HB_SCRIPT_KHUDAWADI			= HB_TAG ('S','i','n','d'), /*7.0*/
+  HB_SCRIPT_LINEAR_A			= HB_TAG ('L','i','n','a'), /*7.0*/
+  HB_SCRIPT_MAHAJANI			= HB_TAG ('M','a','h','j'), /*7.0*/
+  HB_SCRIPT_MANICHAEAN			= HB_TAG ('M','a','n','i'), /*7.0*/
+  HB_SCRIPT_MENDE_KIKAKUI		= HB_TAG ('M','e','n','d'), /*7.0*/
+  HB_SCRIPT_MODI			= HB_TAG ('M','o','d','i'), /*7.0*/
+  HB_SCRIPT_MRO				= HB_TAG ('M','r','o','o'), /*7.0*/
+  HB_SCRIPT_NABATAEAN			= HB_TAG ('N','b','a','t'), /*7.0*/
+  HB_SCRIPT_OLD_NORTH_ARABIAN		= HB_TAG ('N','a','r','b'), /*7.0*/
+  HB_SCRIPT_OLD_PERMIC			= HB_TAG ('P','e','r','m'), /*7.0*/
+  HB_SCRIPT_PAHAWH_HMONG		= HB_TAG ('H','m','n','g'), /*7.0*/
+  HB_SCRIPT_PALMYRENE			= HB_TAG ('P','a','l','m'), /*7.0*/
+  HB_SCRIPT_PAU_CIN_HAU			= HB_TAG ('P','a','u','c'), /*7.0*/
+  HB_SCRIPT_PSALTER_PAHLAVI		= HB_TAG ('P','h','l','p'), /*7.0*/
+  HB_SCRIPT_SIDDHAM			= HB_TAG ('S','i','d','d'), /*7.0*/
+  HB_SCRIPT_TIRHUTA			= HB_TAG ('T','i','r','h'), /*7.0*/
+  HB_SCRIPT_WARANG_CITI			= HB_TAG ('W','a','r','a'), /*7.0*/
+
+  HB_SCRIPT_AHOM			= HB_TAG ('A','h','o','m'), /*8.0*/
+  HB_SCRIPT_ANATOLIAN_HIEROGLYPHS	= HB_TAG ('H','l','u','w'), /*8.0*/
+  HB_SCRIPT_HATRAN			= HB_TAG ('H','a','t','r'), /*8.0*/
+  HB_SCRIPT_MULTANI			= HB_TAG ('M','u','l','t'), /*8.0*/
+  HB_SCRIPT_OLD_HUNGARIAN		= HB_TAG ('H','u','n','g'), /*8.0*/
+  HB_SCRIPT_SIGNWRITING			= HB_TAG ('S','g','n','w'), /*8.0*/
+
+  /*
+   * Since 1.3.0
+   */
+  HB_SCRIPT_ADLAM			= HB_TAG ('A','d','l','m'), /*9.0*/
+  HB_SCRIPT_BHAIKSUKI			= HB_TAG ('B','h','k','s'), /*9.0*/
+  HB_SCRIPT_MARCHEN			= HB_TAG ('M','a','r','c'), /*9.0*/
+  HB_SCRIPT_OSAGE			= HB_TAG ('O','s','g','e'), /*9.0*/
+  HB_SCRIPT_TANGUT			= HB_TAG ('T','a','n','g'), /*9.0*/
+  HB_SCRIPT_NEWA			= HB_TAG ('N','e','w','a'), /*9.0*/
+
+  /*
+   * Since 1.6.0
+   */
+  HB_SCRIPT_MASARAM_GONDI		= HB_TAG ('G','o','n','m'), /*10.0*/
+  HB_SCRIPT_NUSHU			= HB_TAG ('N','s','h','u'), /*10.0*/
+  HB_SCRIPT_SOYOMBO			= HB_TAG ('S','o','y','o'), /*10.0*/
+  HB_SCRIPT_ZANABAZAR_SQUARE		= HB_TAG ('Z','a','n','b'), /*10.0*/
+
+  /*
+   * Since 1.8.0
+   */
+  HB_SCRIPT_DOGRA			= HB_TAG ('D','o','g','r'), /*11.0*/
+  HB_SCRIPT_GUNJALA_GONDI		= HB_TAG ('G','o','n','g'), /*11.0*/
+  HB_SCRIPT_HANIFI_ROHINGYA		= HB_TAG ('R','o','h','g'), /*11.0*/
+  HB_SCRIPT_MAKASAR			= HB_TAG ('M','a','k','a'), /*11.0*/
+  HB_SCRIPT_MEDEFAIDRIN			= HB_TAG ('M','e','d','f'), /*11.0*/
+  HB_SCRIPT_OLD_SOGDIAN			= HB_TAG ('S','o','g','o'), /*11.0*/
+  HB_SCRIPT_SOGDIAN			= HB_TAG ('S','o','g','d'), /*11.0*/
+
+  /*
+   * Since 2.4.0
+   */
+  HB_SCRIPT_ELYMAIC			= HB_TAG ('E','l','y','m'), /*12.0*/
+  HB_SCRIPT_NANDINAGARI			= HB_TAG ('N','a','n','d'), /*12.0*/
+  HB_SCRIPT_NYIAKENG_PUACHUE_HMONG	= HB_TAG ('H','m','n','p'), /*12.0*/
+  HB_SCRIPT_WANCHO			= HB_TAG ('W','c','h','o'), /*12.0*/
+
+  /*
+   * Since 2.6.7
+   */
+  HB_SCRIPT_CHORASMIAN			= HB_TAG ('C','h','r','s'), /*13.0*/
+  HB_SCRIPT_DIVES_AKURU			= HB_TAG ('D','i','a','k'), /*13.0*/
+  HB_SCRIPT_KHITAN_SMALL_SCRIPT		= HB_TAG ('K','i','t','s'), /*13.0*/
+  HB_SCRIPT_YEZIDI			= HB_TAG ('Y','e','z','i'), /*13.0*/
+
+  /*
+   * Since 3.0.0
+   */
+  HB_SCRIPT_CYPRO_MINOAN		= HB_TAG ('C','p','m','n'), /*14.0*/
+  HB_SCRIPT_OLD_UYGHUR			= HB_TAG ('O','u','g','r'), /*14.0*/
+  HB_SCRIPT_TANGSA			= HB_TAG ('T','n','s','a'), /*14.0*/
+  HB_SCRIPT_TOTO			= HB_TAG ('T','o','t','o'), /*14.0*/
+  HB_SCRIPT_VITHKUQI			= HB_TAG ('V','i','t','h'), /*14.0*/
+
+  /*
+   * Since 3.4.0
+   */
+  HB_SCRIPT_MATH			= HB_TAG ('Z','m','t','h'),
+
+  /*
+   * Since 5.2.0
+   */
+  HB_SCRIPT_KAWI			= HB_TAG ('K','a','w','i'), /*15.0*/
+  HB_SCRIPT_NAG_MUNDARI			= HB_TAG ('N','a','g','m'), /*15.0*/
+
+  /*
+   * Since 10.0.0
+   */
+  HB_SCRIPT_GARAY			= HB_TAG ('G','a','r','a'), /*16.0*/
+  HB_SCRIPT_GURUNG_KHEMA		= HB_TAG ('G','u','k','h'), /*16.0*/
+  HB_SCRIPT_KIRAT_RAI			= HB_TAG ('K','r','a','i'), /*16.0*/
+  HB_SCRIPT_OL_ONAL			= HB_TAG ('O','n','a','o'), /*16.0*/
+  HB_SCRIPT_SUNUWAR			= HB_TAG ('S','u','n','u'), /*16.0*/
+  HB_SCRIPT_TODHRI			= HB_TAG ('T','o','d','r'), /*16.0*/
+  HB_SCRIPT_TULU_TIGALARI		= HB_TAG ('T','u','t','g'), /*16.0*/
+
+  /* No script set. */
+  HB_SCRIPT_INVALID			= HB_TAG_NONE,
+
+  /*< private >*/
+
+  /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t
+   * without risking undefined behavior.  We have two, for historical reasons.
+   * HB_TAG_MAX used to be unsigned, but that was invalid Ansi C, so was changed
+   * to _HB_SCRIPT_MAX_VALUE to be equal to HB_TAG_MAX_SIGNED as well.
+   *
+   * See this thread for technicalities:
+   *
+   *   https://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html
+   */
+  _HB_SCRIPT_MAX_VALUE				= HB_TAG_MAX_SIGNED, /*< skip >*/
+  _HB_SCRIPT_MAX_VALUE_SIGNED			= HB_TAG_MAX_SIGNED /*< skip >*/
+
+} hb_script_t;
+
+
+#endif /* HB_SCRIPT_LIST_H */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -868,7 +868,7 @@
         src = hb_utf8_t::next (src, src_end, &unicode, replacement);
         if (unicode >= 0x0080u)
         {
-          printf ("Non-ascii character detected, ignored...This API supports ascii characters only for mac platform\n");
+          // Non-ascii character detected, ignored...
           return false;
         }
       }

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-layout.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-layout.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-layout.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -0,0 +1,382 @@
+/*
+ * Copyright © 2023  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Qunxin Liu, Roderick Sheeter
+ */
+
+#include "hb-subset-plan.hh"
+
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gpos-table.hh"
+#include "hb-ot-layout-gsub-table.hh"
+
+using OT::Layout::GSUB;
+using OT::Layout::GPOS;
+
+#ifndef HB_NO_SUBSET_LAYOUT
+
+void
+remap_used_mark_sets (hb_subset_plan_t *plan,
+                      hb_map_t& used_mark_sets_map)
+{
+  hb_blob_ptr_t<OT::GDEF> gdef = plan->source_table<OT::GDEF> ();
+
+  if (!gdef->has_data () || !gdef->has_mark_glyph_sets ())
+  {
+    gdef.destroy ();
+    return;
+  }
+
+  hb_set_t used_mark_sets;
+  gdef->get_mark_glyph_sets ().collect_used_mark_sets (plan->_glyphset_gsub, used_mark_sets);
+  gdef.destroy ();
+
+  remap_indexes (&used_mark_sets, &used_mark_sets_map);
+}
+
+/*
+ * Removes all tags from 'tags' that are not in filter. Additionally eliminates any duplicates.
+ * Returns true if anything was removed (not including duplicates).
+ */
+static bool _filter_tag_list(hb_vector_t<hb_tag_t>* tags, /* IN/OUT */
+                             const hb_set_t* filter)
+{
+  hb_vector_t<hb_tag_t> out;
+  out.alloc (tags->get_size() + 1); // +1 is to allocate room for the null terminator.
+
+  bool removed = false;
+  hb_set_t visited;
+
+  for (hb_tag_t tag : *tags)
+  {
+    if (!tag) continue;
+    if (visited.has (tag)) continue;
+
+    if (!filter->has (tag))
+    {
+      removed = true;
+      continue;
+    }
+
+    visited.add (tag);
+    out.push (tag);
+  }
+
+  // The collect function needs a null element to signal end of the array.
+  out.push (HB_TAG_NONE);
+
+  hb_swap (out, *tags);
+  return removed;
+}
+
+template <typename T>
+static void _collect_layout_indices (hb_subset_plan_t     *plan,
+                                     const T&              table,
+                                     hb_set_t		  *lookup_indices, /* OUT */
+                                     hb_set_t		  *feature_indices, /* OUT */
+                                     hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map, /* OUT */
+                                     hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map, /* OUT */
+                                     hb_set_t& catch_all_record_feature_idxes, /* OUT */
+                                     hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>>& catch_all_record_idx_feature_map /* OUT */)
+{
+  unsigned num_features = table.get_feature_count ();
+  hb_vector_t<hb_tag_t> features;
+  if (!plan->check_success (features.resize (num_features))) return;
+  table.get_feature_tags (0, &num_features, features.arrayZ);
+  bool retain_all_features = !_filter_tag_list (&features, &plan->layout_features);
+
+  unsigned num_scripts = table.get_script_count ();
+  hb_vector_t<hb_tag_t> scripts;
+  if (!plan->check_success (scripts.resize (num_scripts))) return;
+  table.get_script_tags (0, &num_scripts, scripts.arrayZ);
+  bool retain_all_scripts = !_filter_tag_list (&scripts, &plan->layout_scripts);
+
+  if (!plan->check_success (!features.in_error ()) || !features
+      || !plan->check_success (!scripts.in_error ()) || !scripts)
+    return;
+
+  hb_ot_layout_collect_features (plan->source,
+                                 T::tableTag,
+                                 retain_all_scripts ? nullptr : scripts.arrayZ,
+                                 nullptr,
+                                 retain_all_features ? nullptr : features.arrayZ,
+                                 feature_indices);
+
+#ifndef HB_NO_VAR
+  // collect feature substitutes with variations
+  if (!plan->user_axes_location.is_empty ())
+  {
+    hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned> conditionset_map;
+    OT::hb_collect_feature_substitutes_with_var_context_t c =
+    {
+      &plan->axes_old_index_tag_map,
+      &plan->axes_location,
+      feature_record_cond_idx_map,
+      feature_substitutes_map,
+      catch_all_record_feature_idxes,
+      feature_indices,
+      false,
+      false,
+      false,
+      0,
+      &conditionset_map
+    };
+    table.collect_feature_substitutes_with_variations (&c);
+  }
+#endif
+
+  for (unsigned feature_index : *feature_indices)
+  {
+    const OT::Feature* f = &(table.get_feature (feature_index));
+    const OT::Feature **p = nullptr;
+    if (feature_substitutes_map->has (feature_index, &p))
+      f = *p;
+
+    f->add_lookup_indexes_to (lookup_indices);
+  }
+
+#ifndef HB_NO_VAR
+  if (catch_all_record_feature_idxes)
+  {
+    for (unsigned feature_index : catch_all_record_feature_idxes)
+    {
+      const OT::Feature& f = table.get_feature (feature_index);
+      f.add_lookup_indexes_to (lookup_indices);
+      const void *tag = reinterpret_cast<const void*> (&(table.get_feature_list ().get_tag (feature_index)));
+      catch_all_record_idx_feature_map.set (feature_index, hb_pair (&f, tag));
+    }
+  }
+
+  // If all axes are pinned then all feature variations will be dropped so there's no need
+  // to collect lookups from them.
+  if (!plan->all_axes_pinned)
+    table.feature_variation_collect_lookups (feature_indices,
+                                             plan->user_axes_location.is_empty () ? nullptr: feature_record_cond_idx_map,
+                                             lookup_indices);
+#endif
+}
+
+
+static inline void
+_GSUBGPOS_find_duplicate_features (const OT::GSUBGPOS &g,
+				   const hb_map_t *lookup_indices,
+				   const hb_set_t *feature_indices,
+				   const hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map,
+				   hb_map_t *duplicate_feature_map /* OUT */)
+{
+  if (feature_indices->is_empty ()) return;
+  hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_set_t>> unique_features;
+  //find out duplicate features after subset
+  for (unsigned i : feature_indices->iter ())
+  {
+    hb_tag_t t = g.get_feature_tag (i);
+    if (t == HB_MAP_VALUE_INVALID) continue;
+    if (!unique_features.has (t))
+    {
+      if (unlikely (!unique_features.set (t, hb::unique_ptr<hb_set_t> {hb_set_create ()})))
+	return;
+      if (unique_features.has (t))
+	unique_features.get (t)->add (i);
+      duplicate_feature_map->set (i, i);
+      continue;
+    }
+
+    bool found = false;
+
+    hb_set_t* same_tag_features = unique_features.get (t);
+    for (unsigned other_f_index : same_tag_features->iter ())
+    {
+      const OT::Feature* f = &(g.get_feature (i));
+      const OT::Feature **p = nullptr;
+      if (feature_substitutes_map->has (i, &p))
+        f = *p;
+
+      const OT::Feature* other_f = &(g.get_feature (other_f_index));
+      if (feature_substitutes_map->has (other_f_index, &p))
+        other_f = *p;
+
+      auto f_iter =
+      + hb_iter (f->lookupIndex)
+      | hb_filter (lookup_indices)
+      ;
+
+      auto other_f_iter =
+      + hb_iter (other_f->lookupIndex)
+      | hb_filter (lookup_indices)
+      ;
+
+      bool is_equal = true;
+      for (; f_iter && other_f_iter; f_iter++, other_f_iter++)
+      {
+	unsigned a = *f_iter;
+	unsigned b = *other_f_iter;
+	if (a != b) { is_equal = false; break; }
+      }
+
+      if (is_equal == false || f_iter || other_f_iter) continue;
+
+      found = true;
+      duplicate_feature_map->set (i, other_f_index);
+      break;
+    }
+
+    if (found == false)
+    {
+      same_tag_features->add (i);
+      duplicate_feature_map->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,
+				 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,
+                                 hb_set_t &catch_all_record_feature_idxes,
+                                 hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>>& catch_all_record_idx_feature_map)
+{
+  hb_blob_ptr_t<T> table = plan->source_table<T> ();
+  hb_tag_t table_tag = table->tableTag;
+  hb_set_t lookup_indices, feature_indices;
+  _collect_layout_indices<T> (plan,
+                              *table,
+                              &lookup_indices,
+                              &feature_indices,
+                              feature_record_cond_idx_map,
+                              feature_substitutes_map,
+                              catch_all_record_feature_idxes,
+                              catch_all_record_idx_feature_map);
+
+  if (table_tag == HB_OT_TAG_GSUB && !(plan->flags & HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE))
+    hb_ot_layout_lookups_substitute_closure (plan->source,
+                                             &lookup_indices,
+					     gids_to_retain);
+  table->closure_lookups (plan->source,
+			  gids_to_retain,
+                          &lookup_indices);
+  remap_indexes (&lookup_indices, lookups);
+
+  // prune features
+  table->prune_features (lookups,
+                         plan->user_axes_location.is_empty () ? nullptr : feature_record_cond_idx_map,
+                         feature_substitutes_map,
+                         &feature_indices);
+  hb_map_t duplicate_feature_map;
+  _GSUBGPOS_find_duplicate_features (*table, lookups, &feature_indices, feature_substitutes_map, &duplicate_feature_map);
+
+  feature_indices.clear ();
+  table->prune_langsys (&duplicate_feature_map, &plan->layout_scripts, langsys_map, &feature_indices);
+  remap_indexes (&feature_indices, features);
+
+  table.destroy ();
+}
+
+void layout_nameid_closure (hb_subset_plan_t* plan,
+                             hb_set_t* drop_tables)
+{
+  if (!drop_tables->has (HB_OT_TAG_GPOS))
+  {
+    hb_blob_ptr_t<GPOS> gpos = plan->source_table<GPOS> ();
+    gpos->collect_name_ids (&plan->gpos_features, &plan->name_ids);
+    gpos.destroy ();
+  }
+  if (!drop_tables->has (HB_OT_TAG_GSUB))
+  {
+    hb_blob_ptr_t<GSUB> gsub = plan->source_table<GSUB> ();
+    gsub->collect_name_ids (&plan->gsub_features, &plan->name_ids);
+    gsub.destroy ();
+  }
+}
+
+void
+layout_populate_gids_to_retain (hb_subset_plan_t* plan,
+		                hb_set_t* drop_tables) {
+  if (!drop_tables->has (HB_OT_TAG_GSUB))
+    // closure all glyphs/lookups/features needed for GSUB substitutions.
+    _closure_glyphs_lookups_features<GSUB> (
+        plan,
+        &plan->_glyphset_gsub,
+        &plan->gsub_lookups,
+        &plan->gsub_features,
+        &plan->gsub_langsys,
+        &plan->gsub_feature_record_cond_idx_map,
+        &plan->gsub_feature_substitutes_map,
+        plan->gsub_old_features,
+        plan->gsub_old_feature_idx_tag_map);
+
+  if (!drop_tables->has (HB_OT_TAG_GPOS))
+    _closure_glyphs_lookups_features<GPOS> (
+        plan,
+        &plan->_glyphset_gsub,
+        &plan->gpos_lookups,
+        &plan->gpos_features,
+        &plan->gpos_langsys,
+        &plan->gpos_feature_record_cond_idx_map,
+        &plan->gpos_feature_substitutes_map,
+        plan->gpos_old_features,
+        plan->gpos_old_feature_idx_tag_map);
+}
+
+#ifndef HB_NO_VAR
+void
+collect_layout_variation_indices (hb_subset_plan_t* plan)
+{
+  hb_blob_ptr_t<OT::GDEF> gdef = plan->source_table<OT::GDEF> ();
+  hb_blob_ptr_t<GPOS> gpos = plan->source_table<GPOS> ();
+
+  if (!gdef->has_data () || !gdef->has_var_store ())
+  {
+    gdef.destroy ();
+    gpos.destroy ();
+    return;
+  }
+
+  hb_set_t varidx_set;
+  OT::hb_collect_variation_indices_context_t c (&varidx_set,
+                                                &plan->_glyphset_gsub,
+                                                &plan->gpos_lookups);
+  gdef->collect_variation_indices (&c);
+
+  if (hb_ot_layout_has_positioning (plan->source))
+    gpos->collect_variation_indices (&c);
+
+  remap_variation_indices (gdef->get_var_store (),
+                           varidx_set, plan->normalized_coords,
+                           !plan->pinned_at_default,
+                           plan->all_axes_pinned,
+                           plan->layout_variation_idx_delta_map);
+
+  unsigned subtable_count = gdef->get_var_store ().get_sub_table_count ();
+  generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps);
+
+  gdef.destroy ();
+  gpos.destroy ();
+}
+#endif
+
+#endif
\ No newline at end of file

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-var.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-var.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan-var.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -0,0 +1,388 @@
+/*
+ * Copyright © 2023  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Qunxin Liu, Roderick Sheeter
+ */
+
+ #include "hb-ot-layout-common.hh"
+#include "hb-subset-plan.hh"
+
+ #include "hb-ot-var-common.hh"
+ #include "hb-ot-layout-base-table.hh"
+ #include "hb-ot-glyf-table.hh"
+ #include "hb-ot-var-fvar-table.hh"
+ #include "hb-ot-var-avar-table.hh"
+ #include "hb-ot-cff2-table.hh"
+
+ #ifndef HB_NO_VAR
+
+ void
+ generate_varstore_inner_maps (const hb_set_t& varidx_set,
+                               unsigned subtable_count,
+                               hb_vector_t<hb_inc_bimap_t> &inner_maps /* OUT */)
+ {
+   if (varidx_set.is_empty () || subtable_count == 0) return;
+ 
+   if (unlikely (!inner_maps.resize (subtable_count))) return;
+   for (unsigned idx : varidx_set)
+   {
+     uint16_t major = idx >> 16;
+     uint16_t minor = idx & 0xFFFF;
+ 
+     if (major >= subtable_count)
+       continue;
+     inner_maps[major].add (minor);
+   }
+ }
+ 
+ static inline hb_font_t*
+ _get_hb_font_with_variations (const hb_subset_plan_t *plan)
+ {
+   hb_font_t *font = hb_font_create (plan->source);
+ 
+   hb_vector_t<hb_variation_t> vars;
+   if (!vars.alloc (plan->user_axes_location.get_population ())) {
+     hb_font_destroy (font);
+     return nullptr;
+   }
+ 
+   for (auto _ : plan->user_axes_location)
+   {
+     hb_variation_t var;
+     var.tag = _.first;
+     var.value = _.second.middle;
+     vars.push (var);
+   }
+ 
+   hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location.get_population ());
+   return font;
+ }
+ 
+ template<typename ItemVarStore>
+ void
+ remap_variation_indices (const ItemVarStore &var_store,
+                          const hb_set_t &variation_indices,
+                          const hb_vector_t<int>& normalized_coords,
+                          bool calculate_delta, /* not pinned at default */
+                          bool no_variations, /* all axes pinned */
+                          hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map /* OUT */)
+ {
+   if (&var_store == &Null (OT::ItemVariationStore)) return;
+   unsigned subtable_count = var_store.get_sub_table_count ();
+   auto *store_cache = var_store.create_cache ();
+ 
+   unsigned new_major = 0, new_minor = 0;
+   unsigned last_major = (variation_indices.get_min ()) >> 16;
+   for (unsigned idx : variation_indices)
+   {
+     int delta = 0;
+     if (calculate_delta)
+       delta = roundf (var_store.get_delta (idx, normalized_coords.arrayZ,
+                                            normalized_coords.length, store_cache));
+ 
+     if (no_variations)
+     {
+       variation_idx_delta_map.set (idx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta));
+       continue;
+     }
+ 
+     uint16_t major = idx >> 16;
+     if (major >= subtable_count) break;
+     if (major != last_major)
+     {
+       new_minor = 0;
+       ++new_major;
+     }
+ 
+     unsigned new_idx = (new_major << 16) + new_minor;
+     variation_idx_delta_map.set (idx, hb_pair_t<unsigned, int> (new_idx, delta));
+     ++new_minor;
+     last_major = major;
+   }
+   var_store.destroy_cache (store_cache);
+ }
+ 
+ template
+ void
+ remap_variation_indices<OT::ItemVariationStore> (const OT::ItemVariationStore &var_store,
+                          const hb_set_t &variation_indices,
+                          const hb_vector_t<int>& normalized_coords,
+                          bool calculate_delta, /* not pinned at default */
+                          bool no_variations, /* all axes pinned */
+                          hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map /* OUT */);
+ 
+ #ifndef HB_NO_BASE
+ void
+ collect_base_variation_indices (hb_subset_plan_t* plan)
+ {
+   hb_blob_ptr_t<OT::BASE> base = plan->source_table<OT::BASE> ();
+   if (!base->has_var_store ())
+   {
+     base.destroy ();
+     return;
+   }
+ 
+   hb_set_t varidx_set;
+   base->collect_variation_indices (plan, varidx_set);
+   const OT::ItemVariationStore &var_store = base->get_var_store ();
+   unsigned subtable_count = var_store.get_sub_table_count ();
+ 
+ 
+   remap_variation_indices (var_store, varidx_set,
+                             plan->normalized_coords,
+                             !plan->pinned_at_default,
+                             plan->all_axes_pinned,
+                             plan->base_variation_idx_map);
+   generate_varstore_inner_maps (varidx_set, subtable_count, plan->base_varstore_inner_maps);
+ 
+   base.destroy ();
+ }
+ 
+ #endif
+
+void
+normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan)
+{
+  if (plan->user_axes_location.is_empty ())
+    return;
+
+  hb_array_t<const OT::AxisRecord> axes = face->table.fvar->get_axes ();
+  plan->normalized_coords.resize (axes.length);
+
+  bool has_avar = face->table.avar->has_data ();
+  const OT::SegmentMaps *seg_maps = nullptr;
+  unsigned avar_axis_count = 0;
+  if (has_avar)
+  {
+    seg_maps = face->table.avar->get_segment_maps ();
+    avar_axis_count = face->table.avar->get_axis_count();
+  }
+
+  bool axis_not_pinned = false;
+  unsigned old_axis_idx = 0, new_axis_idx = 0;
+  for (const auto& axis : axes)
+  {
+    hb_tag_t axis_tag = axis.get_axis_tag ();
+    plan->axes_old_index_tag_map.set (old_axis_idx, axis_tag);
+
+    if (!plan->user_axes_location.has (axis_tag) ||
+        !plan->user_axes_location.get (axis_tag).is_point ())
+    {
+      axis_not_pinned = true;
+      plan->axes_index_map.set (old_axis_idx, new_axis_idx);
+      plan->axis_tags.push (axis_tag);
+      new_axis_idx++;
+    }
+
+    Triple *axis_range;
+    if (plan->user_axes_location.has (axis_tag, &axis_range))
+    {
+      plan->axes_triple_distances.set (axis_tag, axis.get_triple_distances ());
+
+      int normalized_min = axis.normalize_axis_value (axis_range->minimum);
+      int normalized_default = axis.normalize_axis_value (axis_range->middle);
+      int normalized_max = axis.normalize_axis_value (axis_range->maximum);
+
+      if (has_avar && old_axis_idx < avar_axis_count)
+      {
+        normalized_min = seg_maps->map (normalized_min);
+        normalized_default = seg_maps->map (normalized_default);
+        normalized_max = seg_maps->map (normalized_max);
+      }
+      plan->axes_location.set (axis_tag, Triple (static_cast<double> (normalized_min / 16384.0),
+                                                 static_cast<double> (normalized_default / 16384.0),
+                                                 static_cast<double> (normalized_max / 16384.0)));
+
+      if (normalized_default != 0)
+        plan->pinned_at_default = false;
+
+      plan->normalized_coords[old_axis_idx] = normalized_default;
+    }
+
+    old_axis_idx++;
+
+    if (has_avar && old_axis_idx < avar_axis_count)
+      seg_maps = &StructAfter<OT::SegmentMaps> (*seg_maps);
+  }
+  plan->all_axes_pinned = !axis_not_pinned;
+}
+
+void
+update_instance_metrics_map_from_cff2 (hb_subset_plan_t *plan)
+{
+  if (!plan->normalized_coords) return;
+  OT::cff2::accelerator_t cff2 (plan->source);
+  if (!cff2.is_valid ()) return;
+
+  hb_font_t *font = _get_hb_font_with_variations (plan);
+  if (unlikely (!plan->check_success (font != nullptr)))
+  {
+    hb_font_destroy (font);
+    return;
+  }
+
+  hb_glyph_extents_t extents = {0x7FFF, -0x7FFF};
+  OT::hmtx_accelerator_t _hmtx (plan->source);
+  OT::ItemVariationStore::cache_t *hvar_store_cache = nullptr;
+  if (_hmtx.has_data () && _hmtx.var_table.get_length ())
+    hvar_store_cache = _hmtx.var_table->get_var_store ().create_cache ();
+
+  OT::vmtx_accelerator_t _vmtx (plan->source);
+  OT::ItemVariationStore::cache_t *vvar_store_cache = nullptr;
+  if (_vmtx.has_data () && _vmtx.var_table.get_length ())
+    vvar_store_cache = _vmtx.var_table->get_var_store ().create_cache ();
+
+  for (auto p : *plan->glyph_map)
+  {
+    hb_codepoint_t old_gid = p.first;
+    hb_codepoint_t new_gid = p.second;
+    if (!cff2.get_extents (font, old_gid, &extents)) continue;
+    bool has_bounds_info = true;
+    if (extents.x_bearing == 0 && extents.width == 0 &&
+        extents.height == 0 && extents.y_bearing == 0)
+      has_bounds_info = false;
+
+    if (has_bounds_info)
+    {
+      plan->head_maxp_info.xMin = hb_min (plan->head_maxp_info.xMin, extents.x_bearing);
+      plan->head_maxp_info.xMax = hb_max (plan->head_maxp_info.xMax, extents.x_bearing + extents.width);
+      plan->head_maxp_info.yMax = hb_max (plan->head_maxp_info.yMax, extents.y_bearing);
+      plan->head_maxp_info.yMin = hb_min (plan->head_maxp_info.yMin, extents.y_bearing + extents.height);
+    }
+
+    if (_hmtx.has_data ())
+    {
+      int hori_aw = _hmtx.get_advance_without_var_unscaled (old_gid);
+      if (_hmtx.var_table.get_length ())
+        hori_aw += (int) roundf (_hmtx.var_table->get_advance_delta_unscaled (old_gid, font->coords, font->num_coords,
+                                                                              hvar_store_cache));
+      int lsb = extents.x_bearing;
+      if (!has_bounds_info)
+      {
+        if (!_hmtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb))
+          continue;
+      }
+      plan->hmtx_map.set (new_gid, hb_pair ((unsigned) hori_aw, lsb));
+      plan->bounds_width_vec[new_gid] = extents.width;
+    }
+
+    if (_vmtx.has_data ())
+    {
+      int vert_aw = _vmtx.get_advance_without_var_unscaled (old_gid);
+      if (_vmtx.var_table.get_length ())
+        vert_aw += (int) roundf (_vmtx.var_table->get_advance_delta_unscaled (old_gid, font->coords, font->num_coords,
+                                                                              vvar_store_cache));
+
+      int tsb = extents.y_bearing;
+      if (!has_bounds_info)
+      {
+        if (!_vmtx.get_leading_bearing_without_var_unscaled (old_gid, &tsb))
+          continue;
+      }
+      plan->vmtx_map.set (new_gid, hb_pair ((unsigned) vert_aw, tsb));
+      plan->bounds_height_vec[new_gid] = extents.height;
+    }
+  }
+  hb_font_destroy (font);
+  if (hvar_store_cache)
+    _hmtx.var_table->get_var_store ().destroy_cache (hvar_store_cache);
+  if (vvar_store_cache)
+    _vmtx.var_table->get_var_store ().destroy_cache (vvar_store_cache);
+}
+
+bool
+get_instance_glyphs_contour_points (hb_subset_plan_t *plan)
+{
+  /* contour_points vector only needed for updating gvar table (infer delta and
+   * iup delta optimization) during partial instancing */
+  if (plan->user_axes_location.is_empty () || plan->all_axes_pinned)
+    return true;
+
+  OT::glyf_accelerator_t glyf (plan->source);
+
+  for (auto &_ : plan->new_to_old_gid_list)
+  {
+    hb_codepoint_t new_gid = _.first;
+    contour_point_vector_t all_points;
+    if (new_gid == 0 && !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
+    {
+      if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points)))
+        return false;
+      continue;
+    }
+
+    hb_codepoint_t old_gid = _.second;
+    auto glyph = glyf.glyph_for_gid (old_gid);
+    if (unlikely (!glyph.get_all_points_without_var (plan->source, all_points)))
+      return false;
+    if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points)))
+      return false;
+
+    /* composite new gids are only needed by iup delta optimization */
+    if ((plan->flags & HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS) && glyph.is_composite ())
+      plan->composite_new_gids.add (new_gid);
+  }
+  return true;
+}
+
+template<typename DeltaSetIndexMap>
+void
+remap_colrv1_delta_set_index_indices (const DeltaSetIndexMap &index_map,
+                                      const hb_set_t &delta_set_idxes,
+                                      hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map, /* IN/OUT */
+                                      hb_map_t &new_deltaset_idx_varidx_map /* OUT */)
+{
+  if (!index_map.get_map_count ())
+    return;
+
+  hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> delta_set_idx_delta_map;
+  unsigned new_delta_set_idx = 0;
+  for (unsigned delta_set_idx : delta_set_idxes)
+  {
+    unsigned var_idx = index_map.map (delta_set_idx);
+    unsigned new_varidx = HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
+    int delta = 0;
+
+    if (var_idx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
+    {
+      hb_pair_t<unsigned, int> *new_varidx_delta;
+      if (!variation_idx_delta_map.has (var_idx, &new_varidx_delta)) continue;
+
+      new_varidx = hb_first (*new_varidx_delta);
+      delta = hb_second (*new_varidx_delta);
+    }
+
+    new_deltaset_idx_varidx_map.set (new_delta_set_idx, new_varidx);
+    delta_set_idx_delta_map.set (delta_set_idx, hb_pair_t<unsigned, int> (new_delta_set_idx, delta));
+    new_delta_set_idx++;
+  }
+  variation_idx_delta_map = std::move (delta_set_idx_delta_map);
+}
+
+template void
+remap_colrv1_delta_set_index_indices<OT::DeltaSetIndexMap> (const OT::DeltaSetIndexMap &index_map,
+                                      const hb_set_t &delta_set_idxes,
+                                      hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map, /* IN/OUT */
+                                      hb_map_t &new_deltaset_idx_varidx_map /* OUT */);
+
+ #endif
\ No newline at end of file

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -29,13 +29,12 @@
 #include "hb-map.hh"
 #include "hb-multimap.hh"
 #include "hb-set.hh"
+#include "hb-subset.h"
+#include "hb-unicode.h"
 
 #include "hb-ot-cmap-table.hh"
 #include "hb-ot-glyf-table.hh"
 #include "hb-ot-layout-base-table.hh"
-#include "hb-ot-layout-gdef-table.hh"
-#include "hb-ot-layout-gpos-table.hh"
-#include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-ot-cff2-table.hh"
 #include "OT/Color/COLR/COLR.hh"
@@ -42,14 +41,9 @@
 #include "OT/Color/COLR/colrv1-closure.hh"
 #include "OT/Color/CPAL/CPAL.hh"
 #include "hb-ot-var-fvar-table.hh"
-#include "hb-ot-var-avar-table.hh"
 #include "hb-ot-stat-table.hh"
 #include "hb-ot-math-table.hh"
 
-using OT::Layout::GSUB;
-using OT::Layout::GPOS;
-
-
 hb_subset_accelerator_t::~hb_subset_accelerator_t ()
 {
   if (cmap_cache && destroy_cmap_cache)
@@ -63,7 +57,6 @@
 }
 
 
-typedef hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> script_langsys_map;
 #ifndef HB_NO_SUBSET_CFF
 static inline bool
 _add_cff_seac_components (const OT::cff1::accelerator_subset_t &cff,
@@ -98,415 +91,15 @@
   }
 }
 
-static void
-_remap_indexes (const hb_set_t *indexes,
-		hb_map_t       *mapping /* OUT */)
+void
+remap_indexes (const hb_set_t *indexes,
+               hb_map_t       *mapping /* OUT */)
 {
   for (auto _ : + hb_enumerate (indexes->iter ()))
     mapping->set (_.second, _.first);
-
 }
 
-#ifndef HB_NO_SUBSET_LAYOUT
-
-/*
- * Removes all tags from 'tags' that are not in filter. Additionally eliminates any duplicates.
- * Returns true if anything was removed (not including duplicates).
- */
-static bool _filter_tag_list(hb_vector_t<hb_tag_t>* tags, /* IN/OUT */
-                             const hb_set_t* filter)
-{
-  hb_vector_t<hb_tag_t> out;
-  out.alloc (tags->get_size() + 1); // +1 is to allocate room for the null terminator.
-
-  bool removed = false;
-  hb_set_t visited;
-
-  for (hb_tag_t tag : *tags)
-  {
-    if (!tag) continue;
-    if (visited.has (tag)) continue;
-
-    if (!filter->has (tag))
-    {
-      removed = true;
-      continue;
-    }
-
-    visited.add (tag);
-    out.push (tag);
-  }
-
-  // The collect function needs a null element to signal end of the array.
-  out.push (HB_TAG_NONE);
-
-  hb_swap (out, *tags);
-  return removed;
-}
-
-template <typename T>
-static void _collect_layout_indices (hb_subset_plan_t     *plan,
-                                     const T&              table,
-                                     hb_set_t		  *lookup_indices, /* OUT */
-                                     hb_set_t		  *feature_indices, /* OUT */
-                                     hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map, /* OUT */
-                                     hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map, /* OUT */
-                                     hb_set_t& catch_all_record_feature_idxes, /* OUT */
-                                     hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>>& catch_all_record_idx_feature_map /* OUT */)
-{
-  unsigned num_features = table.get_feature_count ();
-  hb_vector_t<hb_tag_t> features;
-  if (!plan->check_success (features.resize (num_features))) return;
-  table.get_feature_tags (0, &num_features, features.arrayZ);
-  bool retain_all_features = !_filter_tag_list (&features, &plan->layout_features);
-
-  unsigned num_scripts = table.get_script_count ();
-  hb_vector_t<hb_tag_t> scripts;
-  if (!plan->check_success (scripts.resize (num_scripts))) return;
-  table.get_script_tags (0, &num_scripts, scripts.arrayZ);
-  bool retain_all_scripts = !_filter_tag_list (&scripts, &plan->layout_scripts);
-
-  if (!plan->check_success (!features.in_error ()) || !features
-      || !plan->check_success (!scripts.in_error ()) || !scripts)
-    return;
-
-  hb_ot_layout_collect_features (plan->source,
-                                 T::tableTag,
-                                 retain_all_scripts ? nullptr : scripts.arrayZ,
-                                 nullptr,
-                                 retain_all_features ? nullptr : features.arrayZ,
-                                 feature_indices);
-
-#ifndef HB_NO_VAR
-  // collect feature substitutes with variations
-  if (!plan->user_axes_location.is_empty ())
-  {
-    hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned> conditionset_map;
-    OT::hb_collect_feature_substitutes_with_var_context_t c =
-    {
-      &plan->axes_old_index_tag_map,
-      &plan->axes_location,
-      feature_record_cond_idx_map,
-      feature_substitutes_map,
-      catch_all_record_feature_idxes,
-      feature_indices,
-      false,
-      false,
-      false,
-      0,
-      &conditionset_map
-    };
-    table.collect_feature_substitutes_with_variations (&c);
-  }
-#endif
-
-  for (unsigned feature_index : *feature_indices)
-  {
-    const OT::Feature* f = &(table.get_feature (feature_index));
-    const OT::Feature **p = nullptr;
-    if (feature_substitutes_map->has (feature_index, &p))
-      f = *p;
-
-    f->add_lookup_indexes_to (lookup_indices);
-  }
-
-#ifndef HB_NO_VAR
-  if (catch_all_record_feature_idxes)
-  {
-    for (unsigned feature_index : catch_all_record_feature_idxes)
-    {
-      const OT::Feature& f = table.get_feature (feature_index);
-      f.add_lookup_indexes_to (lookup_indices);
-      const void *tag = reinterpret_cast<const void*> (&(table.get_feature_list ().get_tag (feature_index)));
-      catch_all_record_idx_feature_map.set (feature_index, hb_pair (&f, tag));
-    }
-  }
-
-  // If all axes are pinned then all feature variations will be dropped so there's no need
-  // to collect lookups from them.
-  if (!plan->all_axes_pinned)
-    table.feature_variation_collect_lookups (feature_indices,
-                                             plan->user_axes_location.is_empty () ? nullptr: feature_record_cond_idx_map,
-                                             lookup_indices);
-#endif
-}
-
-
 static inline void
-_GSUBGPOS_find_duplicate_features (const OT::GSUBGPOS &g,
-				   const hb_map_t *lookup_indices,
-				   const hb_set_t *feature_indices,
-				   const hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map,
-				   hb_map_t *duplicate_feature_map /* OUT */)
-{
-  if (feature_indices->is_empty ()) return;
-  hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_set_t>> unique_features;
-  //find out duplicate features after subset
-  for (unsigned i : feature_indices->iter ())
-  {
-    hb_tag_t t = g.get_feature_tag (i);
-    if (t == HB_MAP_VALUE_INVALID) continue;
-    if (!unique_features.has (t))
-    {
-      if (unlikely (!unique_features.set (t, hb::unique_ptr<hb_set_t> {hb_set_create ()})))
-	return;
-      if (unique_features.has (t))
-	unique_features.get (t)->add (i);
-      duplicate_feature_map->set (i, i);
-      continue;
-    }
-
-    bool found = false;
-
-    hb_set_t* same_tag_features = unique_features.get (t);
-    for (unsigned other_f_index : same_tag_features->iter ())
-    {
-      const OT::Feature* f = &(g.get_feature (i));
-      const OT::Feature **p = nullptr;
-      if (feature_substitutes_map->has (i, &p))
-        f = *p;
-
-      const OT::Feature* other_f = &(g.get_feature (other_f_index));
-      if (feature_substitutes_map->has (other_f_index, &p))
-        other_f = *p;
-
-      auto f_iter =
-      + hb_iter (f->lookupIndex)
-      | hb_filter (lookup_indices)
-      ;
-
-      auto other_f_iter =
-      + hb_iter (other_f->lookupIndex)
-      | hb_filter (lookup_indices)
-      ;
-
-      bool is_equal = true;
-      for (; f_iter && other_f_iter; f_iter++, other_f_iter++)
-      {
-	unsigned a = *f_iter;
-	unsigned b = *other_f_iter;
-	if (a != b) { is_equal = false; break; }
-      }
-
-      if (is_equal == false || f_iter || other_f_iter) continue;
-
-      found = true;
-      duplicate_feature_map->set (i, other_f_index);
-      break;
-    }
-
-    if (found == false)
-    {
-      same_tag_features->add (i);
-      duplicate_feature_map->set (i, i);
-    }
-  }
-}
-
-template <typename T>
-static inline void
-_closure_glyphs_lookups_features (hb_subset_plan_t   *plan,
-				  hb_set_t	     *gids_to_retain,
-				  hb_map_t	     *lookups,
-				  hb_map_t	     *features,
-				  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,
-                                  hb_set_t &catch_all_record_feature_idxes,
-                                  hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>>& catch_all_record_idx_feature_map)
-{
-  hb_blob_ptr_t<T> table = plan->source_table<T> ();
-  hb_tag_t table_tag = table->tableTag;
-  hb_set_t lookup_indices, feature_indices;
-  _collect_layout_indices<T> (plan,
-                              *table,
-                              &lookup_indices,
-                              &feature_indices,
-                              feature_record_cond_idx_map,
-                              feature_substitutes_map,
-                              catch_all_record_feature_idxes,
-                              catch_all_record_idx_feature_map);
-
-  if (table_tag == HB_OT_TAG_GSUB && !(plan->flags & HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE))
-    hb_ot_layout_lookups_substitute_closure (plan->source,
-                                             &lookup_indices,
-					     gids_to_retain);
-  table->closure_lookups (plan->source,
-			  gids_to_retain,
-                          &lookup_indices);
-  _remap_indexes (&lookup_indices, lookups);
-
-  // prune features
-  table->prune_features (lookups,
-                         plan->user_axes_location.is_empty () ? nullptr : feature_record_cond_idx_map,
-                         feature_substitutes_map,
-                         &feature_indices);
-  hb_map_t duplicate_feature_map;
-  _GSUBGPOS_find_duplicate_features (*table, lookups, &feature_indices, feature_substitutes_map, &duplicate_feature_map);
-
-  feature_indices.clear ();
-  table->prune_langsys (&duplicate_feature_map, &plan->layout_scripts, langsys_map, &feature_indices);
-  _remap_indexes (&feature_indices, features);
-
-  table.destroy ();
-}
-
-#endif
-
-#ifndef HB_NO_VAR
-static inline void
-_generate_varstore_inner_maps (const hb_set_t& varidx_set,
-                               unsigned subtable_count,
-                               hb_vector_t<hb_inc_bimap_t> &inner_maps /* OUT */)
-{
-  if (varidx_set.is_empty () || subtable_count == 0) return;
-
-  if (unlikely (!inner_maps.resize (subtable_count))) return;
-  for (unsigned idx : varidx_set)
-  {
-    uint16_t major = idx >> 16;
-    uint16_t minor = idx & 0xFFFF;
-
-    if (major >= subtable_count)
-      continue;
-    inner_maps[major].add (minor);
-  }
-}
-
-static inline hb_font_t*
-_get_hb_font_with_variations (const hb_subset_plan_t *plan)
-{
-  hb_font_t *font = hb_font_create (plan->source);
-
-  hb_vector_t<hb_variation_t> vars;
-  if (!vars.alloc (plan->user_axes_location.get_population ())) {
-    hb_font_destroy (font);
-    return nullptr;
-  }
-
-  for (auto _ : plan->user_axes_location)
-  {
-    hb_variation_t var;
-    var.tag = _.first;
-    var.value = _.second.middle;
-    vars.push (var);
-  }
-
-#ifndef HB_NO_VAR
-  hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location.get_population ());
-#endif
-  return font;
-}
-
-static inline void
-_remap_variation_indices (const OT::ItemVariationStore &var_store,
-                          const hb_set_t &variation_indices,
-                          const hb_vector_t<int>& normalized_coords,
-                          bool calculate_delta, /* not pinned at default */
-                          bool no_variations, /* all axes pinned */
-                          hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map /* OUT */)
-{
-  if (&var_store == &Null (OT::ItemVariationStore)) return;
-  unsigned subtable_count = var_store.get_sub_table_count ();
-  auto *store_cache = var_store.create_cache ();
-
-  unsigned new_major = 0, new_minor = 0;
-  unsigned last_major = (variation_indices.get_min ()) >> 16;
-  for (unsigned idx : variation_indices)
-  {
-    int delta = 0;
-    if (calculate_delta)
-      delta = roundf (var_store.get_delta (idx, normalized_coords.arrayZ,
-                                           normalized_coords.length, store_cache));
-
-    if (no_variations)
-    {
-      variation_idx_delta_map.set (idx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta));
-      continue;
-    }
-
-    uint16_t major = idx >> 16;
-    if (major >= subtable_count) break;
-    if (major != last_major)
-    {
-      new_minor = 0;
-      ++new_major;
-    }
-
-    unsigned new_idx = (new_major << 16) + new_minor;
-    variation_idx_delta_map.set (idx, hb_pair_t<unsigned, int> (new_idx, delta));
-    ++new_minor;
-    last_major = major;
-  }
-  var_store.destroy_cache (store_cache);
-}
-
-static inline void
-_collect_layout_variation_indices (hb_subset_plan_t* plan)
-{
-  hb_blob_ptr_t<OT::GDEF> gdef = plan->source_table<OT::GDEF> ();
-  hb_blob_ptr_t<GPOS> gpos = plan->source_table<GPOS> ();
-
-  if (!gdef->has_data () || !gdef->has_var_store ())
-  {
-    gdef.destroy ();
-    gpos.destroy ();
-    return;
-  }
-
-  hb_set_t varidx_set;
-  OT::hb_collect_variation_indices_context_t c (&varidx_set,
-                                                &plan->_glyphset_gsub,
-                                                &plan->gpos_lookups);
-  gdef->collect_variation_indices (&c);
-
-  if (hb_ot_layout_has_positioning (plan->source))
-    gpos->collect_variation_indices (&c);
-
-  _remap_variation_indices (gdef->get_var_store (),
-                            varidx_set, plan->normalized_coords,
-                            !plan->pinned_at_default,
-                            plan->all_axes_pinned,
-                            plan->layout_variation_idx_delta_map);
-
-  unsigned subtable_count = gdef->get_var_store ().get_sub_table_count ();
-  _generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps);
-
-  gdef.destroy ();
-  gpos.destroy ();
-}
-
-#ifndef HB_NO_BASE
-static inline void
-_collect_base_variation_indices (hb_subset_plan_t* plan)
-{
-  hb_blob_ptr_t<OT::BASE> base = plan->source_table<OT::BASE> ();
-  if (!base->has_var_store ())
-  {
-    base.destroy ();
-    return;
-  }
-
-  hb_set_t varidx_set;
-  base->collect_variation_indices (plan, varidx_set);
-  const OT::ItemVariationStore &var_store = base->get_var_store ();
-  unsigned subtable_count = var_store.get_sub_table_count ();
-
-
-  _remap_variation_indices (var_store, varidx_set,
-                            plan->normalized_coords,
-                            !plan->pinned_at_default,
-                            plan->all_axes_pinned,
-                            plan->base_variation_idx_map);
-  _generate_varstore_inner_maps (varidx_set, subtable_count, plan->base_varstore_inner_maps);
-
-  base.destroy ();
-}
-
-#endif
-#endif
-
-static inline void
 _cmap_closure (hb_face_t	   *face,
 	       const hb_set_t	   *unicodes,
 	       hb_set_t		   *glyphset)
@@ -515,41 +108,6 @@
   cmap.table->closure_glyphs (unicodes, glyphset);
 }
 
-#ifndef HB_NO_VAR
-static void
-_remap_colrv1_delta_set_index_indices (const OT::DeltaSetIndexMap &index_map,
-                                       const hb_set_t &delta_set_idxes,
-                                       hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map, /* IN/OUT */
-                                       hb_map_t &new_deltaset_idx_varidx_map /* OUT */)
-{
-  if (!index_map.get_map_count ())
-    return;
-
-  hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> delta_set_idx_delta_map;
-  unsigned new_delta_set_idx = 0;
-  for (unsigned delta_set_idx : delta_set_idxes)
-  {
-    unsigned var_idx = index_map.map (delta_set_idx);
-    unsigned new_varidx = HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
-    int delta = 0;
-
-    if (var_idx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
-    {
-      hb_pair_t<unsigned, int> *new_varidx_delta;
-      if (!variation_idx_delta_map.has (var_idx, &new_varidx_delta)) continue;
-
-      new_varidx = hb_first (*new_varidx_delta);
-      delta = hb_second (*new_varidx_delta);
-    }
-
-    new_deltaset_idx_varidx_map.set (new_delta_set_idx, new_varidx);
-    delta_set_idx_delta_map.set (delta_set_idx, hb_pair_t<unsigned, int> (new_delta_set_idx, delta));
-    new_delta_set_idx++;
-  }
-  variation_idx_delta_map = std::move (delta_set_idx_delta_map);
-}
-#endif
-
 static void _colr_closure (hb_subset_plan_t* plan,
                            hb_set_t *glyphs_colred)
 {
@@ -569,7 +127,7 @@
   colr.closure_forV1 (glyphs_colred, &layer_indices, &palette_indices, &variation_indices, &delta_set_indices);
 
   colr.closure_V0palette_indices (glyphs_colred, &palette_indices);
-  _remap_indexes (&layer_indices, &plan->colrv1_layers);
+  remap_indexes (&layer_indices, &plan->colrv1_layers);
   _remap_palette_indexes (&palette_indices, &plan->colr_palettes);
 
 #ifndef HB_NO_VAR
@@ -578,7 +136,7 @@
   const OT::ItemVariationStore &var_store = colr.get_var_store ();
   // generated inner_maps is used by ItemVariationStore serialize(), which is subset only
   unsigned subtable_count = var_store.get_sub_table_count ();
-  _generate_varstore_inner_maps (variation_indices, subtable_count, plan->colrv1_varstore_inner_maps);
+  generate_varstore_inner_maps (variation_indices, subtable_count, plan->colrv1_varstore_inner_maps);
 
   /* colr variation indices mapping during planning phase:
    * generate colrv1_variation_idx_delta_map. When delta set index map is not
@@ -590,7 +148,7 @@
    * instancing. */
   if (!plan->all_axes_pinned)
   {
-    _remap_variation_indices (var_store,
+    remap_variation_indices (var_store,
                               variation_indices,
                               plan->normalized_coords,
                               false, /* no need to calculate delta for COLR during planning */
@@ -598,7 +156,7 @@
                               plan->colrv1_variation_idx_delta_map);
 
     if (colr.has_delta_set_index_map ())
-      _remap_colrv1_delta_set_index_indices (colr.get_delta_set_index_map (),
+      remap_colrv1_delta_set_index_indices (colr.get_delta_set_index_map (),
                                              delta_set_indices,
                                              plan->colrv1_variation_idx_delta_map,
                                              plan->colrv1_new_deltaset_idx_varidx_map);
@@ -617,25 +175,6 @@
 }
 
 static inline void
-_remap_used_mark_sets (hb_subset_plan_t *plan,
-                       hb_map_t& used_mark_sets_map)
-{
-  hb_blob_ptr_t<OT::GDEF> gdef = plan->source_table<OT::GDEF> ();
-
-  if (!gdef->has_data () || !gdef->has_mark_glyph_sets ())
-  {
-    gdef.destroy ();
-    return;
-  }
-
-  hb_set_t used_mark_sets;
-  gdef->get_mark_glyph_sets ().collect_used_mark_sets (plan->_glyphset_gsub, used_mark_sets);
-  gdef.destroy ();
-
-  _remap_indexes (&used_mark_sets, &used_mark_sets_map);
-}
-
-static inline void
 _remove_invalid_gids (hb_set_t *glyphs,
 		      unsigned int num_glyphs)
 {
@@ -672,15 +211,46 @@
   _fill_unicode_and_glyph_map(plan, unicode_iterator, unicode_to_gid_for_iterator, unicode_to_gid_for_iterator);
 }
 
+/*
+ * Finds additional unicode codepoints which are reachable from the input unicode set.
+ * Currently this adds in mirrored variants (needed for bidi) of any input unicodes.
+ */
+static hb_set_t
+_unicode_closure (const hb_set_t* unicodes, bool bidi_closure) {
+  // TODO: we may want to also consider pulling in reachable unicode composition and decompositions.
+  //       see: https://github.com/harfbuzz/harfbuzz/issues/2283
+  hb_set_t out = *unicodes;
+  if (!bidi_closure) return out;
+
+  if (out.is_inverted()) {
+    // don't closure inverted sets, they are asking to specifically exclude certain codepoints.
+    // otherwise everything is already included.
+    return out;
+  }
+
+  auto unicode_funcs = hb_unicode_funcs_get_default ();
+  for (hb_codepoint_t cp : *unicodes) {
+   hb_codepoint_t mirror = hb_unicode_mirroring(unicode_funcs, cp);
+   if (unlikely (mirror != cp)) {
+     out.add(mirror);
+   }
+  }
+
+  return out;
+}
+
 static void
-_populate_unicodes_to_retain (const hb_set_t *unicodes,
+_populate_unicodes_to_retain (const hb_set_t *unicodes_in,
                               const hb_set_t *glyphs,
                               hb_subset_plan_t *plan)
 {
+  hb_set_t unicodes = _unicode_closure(unicodes_in,
+    !(plan->flags & HB_SUBSET_FLAGS_NO_BIDI_CLOSURE));
+
   OT::cmap::accelerator_t cmap (plan->source);
   unsigned size_threshold = plan->source->get_num_glyphs ();  
 
-  if (glyphs->is_empty () && unicodes->get_population () < size_threshold)
+  if (glyphs->is_empty () && unicodes.get_population () < size_threshold)
   {
 
     const hb_map_t* unicode_to_gid = nullptr;
@@ -690,9 +260,9 @@
     // This is approach to collection is faster, but can only be used  if glyphs
     // are not being explicitly added to the subset and the input unicodes set is
     // not excessively large (eg. an inverted set).
-    plan->unicode_to_new_gid_list.alloc (unicodes->get_population ());
+    plan->unicode_to_new_gid_list.alloc (unicodes.get_population ());
     if (!unicode_to_gid) {
-      _fill_unicode_and_glyph_map(plan, unicodes->iter(), [&] (hb_codepoint_t cp) {
+      _fill_unicode_and_glyph_map(plan, unicodes.iter(), [&] (hb_codepoint_t cp) {
         hb_codepoint_t gid;
         if (!cmap.get_nominal_glyph (cp, &gid)) {
           return HB_MAP_VALUE_INVALID;
@@ -704,7 +274,7 @@
       // the map. This code is mostly duplicated from above to avoid doing
       // conditionals on the presence of the unicode_to_gid map each
       // iteration.
-      _fill_unicode_and_glyph_map(plan, unicodes->iter(), [&] (hb_codepoint_t cp) {
+      _fill_unicode_and_glyph_map(plan, unicodes.iter(), [&] (hb_codepoint_t cp) {
         return unicode_to_gid->get (cp);
       });
     }
@@ -721,7 +291,7 @@
 
     if (!plan->accelerator) {
       cmap.collect_mapping (&cmap_unicodes_storage, &unicode_glyphid_map_storage);
-      plan->unicode_to_new_gid_list.alloc (hb_min(unicodes->get_population ()
+      plan->unicode_to_new_gid_list.alloc (hb_min(unicodes.get_population ()
                                                   + glyphs->get_population (),
                                                   cmap_unicodes->get_population ()));
     } else {
@@ -730,10 +300,10 @@
     }
 
     if (plan->accelerator &&
-	unicodes->get_population () < cmap_unicodes->get_population () &&
+	unicodes.get_population () < cmap_unicodes->get_population () &&
 	glyphs->get_population () < cmap_unicodes->get_population ())
     {
-      plan->codepoint_to_glyph->alloc (unicodes->get_population () + glyphs->get_population ());
+      plan->codepoint_to_glyph->alloc (unicodes.get_population () + glyphs->get_population ());
 
       auto &gid_to_unicodes = plan->accelerator->gid_to_unicodes;
 
@@ -748,7 +318,7 @@
         });
       }
 
-      _fill_unicode_and_glyph_map(plan, unicodes->iter(), [&] (hb_codepoint_t cp) {
+      _fill_unicode_and_glyph_map(plan, unicodes.iter(), [&] (hb_codepoint_t cp) {
           /* Don't double-add entry. */
 	if (plan->codepoint_to_glyph->has (cp))
           return HB_MAP_VALUE_INVALID;
@@ -769,7 +339,7 @@
       {
         _fill_unicode_and_glyph_map(plan, hb_range(first, last + 1), [&] (hb_codepoint_t cp) {
           hb_codepoint_t gid = (*unicode_glyphid_map)[cp];
-	  if (!unicodes->has (cp) && !glyphs->has (gid))
+	  if (!unicodes.has (cp) && !glyphs->has (gid))
 	    return HB_MAP_VALUE_INVALID;
           return gid;
         },
@@ -860,18 +430,7 @@
 #endif
 
 #ifndef HB_NO_SUBSET_LAYOUT
-  if (!drop_tables->has (HB_OT_TAG_GPOS))
-  {
-    hb_blob_ptr_t<GPOS> gpos = plan->source_table<GPOS> ();
-    gpos->collect_name_ids (&plan->gpos_features, &plan->name_ids);
-    gpos.destroy ();
-  }
-  if (!drop_tables->has (HB_OT_TAG_GSUB))
-  {
-    hb_blob_ptr_t<GSUB> gsub = plan->source_table<GSUB> ();
-    gsub->collect_name_ids (&plan->gsub_features, &plan->name_ids);
-    gsub.destroy ();
-  }
+  layout_nameid_closure(plan, drop_tables);
 #endif
 }
 
@@ -893,31 +452,9 @@
   _cmap_closure (plan->source, &plan->unicodes, &plan->_glyphset_gsub);
 
 #ifndef HB_NO_SUBSET_LAYOUT
-  if (!drop_tables->has (HB_OT_TAG_GSUB))
-    // closure all glyphs/lookups/features needed for GSUB substitutions.
-    _closure_glyphs_lookups_features<GSUB> (
-        plan,
-        &plan->_glyphset_gsub,
-        &plan->gsub_lookups,
-        &plan->gsub_features,
-        &plan->gsub_langsys,
-        &plan->gsub_feature_record_cond_idx_map,
-        &plan->gsub_feature_substitutes_map,
-        plan->gsub_old_features,
-        plan->gsub_old_feature_idx_tag_map);
+  layout_populate_gids_to_retain(plan, drop_tables);
+#endif
 
-  if (!drop_tables->has (HB_OT_TAG_GPOS))
-    _closure_glyphs_lookups_features<GPOS> (
-        plan,
-        &plan->_glyphset_gsub,
-        &plan->gpos_lookups,
-        &plan->gpos_features,
-        &plan->gpos_langsys,
-        &plan->gpos_feature_record_cond_idx_map,
-        &plan->gpos_feature_substitutes_map,
-        plan->gpos_old_features,
-        plan->gpos_old_feature_idx_tag_map);
-#endif
   _remove_invalid_gids (&plan->_glyphset_gsub, plan->source->get_num_glyphs ());
 
   plan->_glyphset_mathed = plan->_glyphset_gsub;
@@ -962,9 +499,11 @@
   _remove_invalid_gids (&plan->_glyphset, plan->source->get_num_glyphs ());
 
 #ifndef HB_NO_VAR
+#ifndef HB_NO_SUBSET_LAYOUT
   if (!drop_tables->has (HB_OT_TAG_GDEF))
-    _collect_layout_variation_indices (plan);
+    collect_layout_variation_indices (plan);
 #endif
+#endif
 }
 
 static void
@@ -1077,193 +616,6 @@
   return true;
 }
 
-#ifndef HB_NO_VAR
-static void
-_normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan)
-{
-  if (plan->user_axes_location.is_empty ())
-    return;
-
-  hb_array_t<const OT::AxisRecord> axes = face->table.fvar->get_axes ();
-  plan->normalized_coords.resize (axes.length);
-
-  bool has_avar = face->table.avar->has_data ();
-  const OT::SegmentMaps *seg_maps = nullptr;
-  unsigned avar_axis_count = 0;
-  if (has_avar)
-  {
-    seg_maps = face->table.avar->get_segment_maps ();
-    avar_axis_count = face->table.avar->get_axis_count();
-  }
-
-  bool axis_not_pinned = false;
-  unsigned old_axis_idx = 0, new_axis_idx = 0;
-  for (const auto& axis : axes)
-  {
-    hb_tag_t axis_tag = axis.get_axis_tag ();
-    plan->axes_old_index_tag_map.set (old_axis_idx, axis_tag);
-
-    if (!plan->user_axes_location.has (axis_tag) ||
-        !plan->user_axes_location.get (axis_tag).is_point ())
-    {
-      axis_not_pinned = true;
-      plan->axes_index_map.set (old_axis_idx, new_axis_idx);
-      plan->axis_tags.push (axis_tag);
-      new_axis_idx++;
-    }
-
-    Triple *axis_range;
-    if (plan->user_axes_location.has (axis_tag, &axis_range))
-    {
-      plan->axes_triple_distances.set (axis_tag, axis.get_triple_distances ());
-
-      int normalized_min = axis.normalize_axis_value (axis_range->minimum);
-      int normalized_default = axis.normalize_axis_value (axis_range->middle);
-      int normalized_max = axis.normalize_axis_value (axis_range->maximum);
-
-      if (has_avar && old_axis_idx < avar_axis_count)
-      {
-        normalized_min = seg_maps->map (normalized_min);
-        normalized_default = seg_maps->map (normalized_default);
-        normalized_max = seg_maps->map (normalized_max);
-      }
-      plan->axes_location.set (axis_tag, Triple (static_cast<double> (normalized_min / 16384.0),
-                                                 static_cast<double> (normalized_default / 16384.0),
-                                                 static_cast<double> (normalized_max / 16384.0)));
-
-      if (normalized_default != 0)
-        plan->pinned_at_default = false;
-
-      plan->normalized_coords[old_axis_idx] = normalized_default;
-    }
-
-    old_axis_idx++;
-
-    if (has_avar && old_axis_idx < avar_axis_count)
-      seg_maps = &StructAfter<OT::SegmentMaps> (*seg_maps);
-  }
-  plan->all_axes_pinned = !axis_not_pinned;
-}
-
-static void
-_update_instance_metrics_map_from_cff2 (hb_subset_plan_t *plan)
-{
-  if (!plan->normalized_coords) return;
-  OT::cff2::accelerator_t cff2 (plan->source);
-  if (!cff2.is_valid ()) return;
-
-  hb_font_t *font = _get_hb_font_with_variations (plan);
-  if (unlikely (!plan->check_success (font != nullptr)))
-  {
-    hb_font_destroy (font);
-    return;
-  }
-
-  hb_glyph_extents_t extents = {0x7FFF, -0x7FFF};
-  OT::hmtx_accelerator_t _hmtx (plan->source);
-  OT::ItemVariationStore::cache_t *hvar_store_cache = nullptr;
-  if (_hmtx.has_data () && _hmtx.var_table.get_length ())
-    hvar_store_cache = _hmtx.var_table->get_var_store ().create_cache ();
-
-  OT::vmtx_accelerator_t _vmtx (plan->source);
-  OT::ItemVariationStore::cache_t *vvar_store_cache = nullptr;
-  if (_vmtx.has_data () && _vmtx.var_table.get_length ())
-    vvar_store_cache = _vmtx.var_table->get_var_store ().create_cache ();
-
-  for (auto p : *plan->glyph_map)
-  {
-    hb_codepoint_t old_gid = p.first;
-    hb_codepoint_t new_gid = p.second;
-    if (!cff2.get_extents (font, old_gid, &extents)) continue;
-    bool has_bounds_info = true;
-    if (extents.x_bearing == 0 && extents.width == 0 &&
-        extents.height == 0 && extents.y_bearing == 0)
-      has_bounds_info = false;
-
-    if (has_bounds_info)
-    {
-      plan->head_maxp_info.xMin = hb_min (plan->head_maxp_info.xMin, extents.x_bearing);
-      plan->head_maxp_info.xMax = hb_max (plan->head_maxp_info.xMax, extents.x_bearing + extents.width);
-      plan->head_maxp_info.yMax = hb_max (plan->head_maxp_info.yMax, extents.y_bearing);
-      plan->head_maxp_info.yMin = hb_min (plan->head_maxp_info.yMin, extents.y_bearing + extents.height);
-    }
-
-    if (_hmtx.has_data ())
-    {
-      int hori_aw = _hmtx.get_advance_without_var_unscaled (old_gid);
-      if (_hmtx.var_table.get_length ())
-        hori_aw += (int) roundf (_hmtx.var_table->get_advance_delta_unscaled (old_gid, font->coords, font->num_coords,
-                                                                              hvar_store_cache));
-      int lsb = extents.x_bearing;
-      if (!has_bounds_info)
-      {
-        if (!_hmtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb))
-          continue;
-      }
-      plan->hmtx_map.set (new_gid, hb_pair ((unsigned) hori_aw, lsb));
-      plan->bounds_width_vec[new_gid] = extents.width;
-    }
-
-    if (_vmtx.has_data ())
-    {
-      int vert_aw = _vmtx.get_advance_without_var_unscaled (old_gid);
-      if (_vmtx.var_table.get_length ())
-        vert_aw += (int) roundf (_vmtx.var_table->get_advance_delta_unscaled (old_gid, font->coords, font->num_coords,
-                                                                              vvar_store_cache));
-
-      int tsb = extents.y_bearing;
-      if (!has_bounds_info)
-      {
-        if (!_vmtx.get_leading_bearing_without_var_unscaled (old_gid, &tsb))
-          continue;
-      }
-      plan->vmtx_map.set (new_gid, hb_pair ((unsigned) vert_aw, tsb));
-      plan->bounds_height_vec[new_gid] = extents.height;
-    }
-  }
-  hb_font_destroy (font);
-  if (hvar_store_cache)
-    _hmtx.var_table->get_var_store ().destroy_cache (hvar_store_cache);
-  if (vvar_store_cache)
-    _vmtx.var_table->get_var_store ().destroy_cache (vvar_store_cache);
-}
-
-static bool
-_get_instance_glyphs_contour_points (hb_subset_plan_t *plan)
-{
-  /* contour_points vector only needed for updating gvar table (infer delta and
-   * iup delta optimization) during partial instancing */
-  if (plan->user_axes_location.is_empty () || plan->all_axes_pinned)
-    return true;
-
-  OT::glyf_accelerator_t glyf (plan->source);
-
-  for (auto &_ : plan->new_to_old_gid_list)
-  {
-    hb_codepoint_t new_gid = _.first;
-    contour_point_vector_t all_points;
-    if (new_gid == 0 && !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
-    {
-      if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points)))
-        return false;
-      continue;
-    }
-
-    hb_codepoint_t old_gid = _.second;
-    auto glyph = glyf.glyph_for_gid (old_gid);
-    if (unlikely (!glyph.get_all_points_without_var (plan->source, all_points)))
-      return false;
-    if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points)))
-      return false;
-
-    /* composite new gids are only needed by iup delta optimization */
-    if ((plan->flags & HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS) && glyph.is_composite ())
-      plan->composite_new_gids.add (new_gid);
-  }
-  return true;
-}
-#endif
-
 hb_subset_plan_t::hb_subset_plan_t (hb_face_t *face,
 				    const hb_subset_input_t *input)
 {
@@ -1324,7 +676,7 @@
     return;
 
 #ifndef HB_NO_VAR
-  _normalize_axes_location (face, this);
+  normalize_axes_location (face, this);
 #endif
 
   _populate_unicodes_to_retain (input->sets.unicodes, input->sets.glyphs, this);
@@ -1365,13 +717,15 @@
   for (auto &v : bounds_height_vec)
     v = 0xFFFFFFFF;
 
+#ifndef HB_NO_SUBSET_LAYOUT    
   if (!drop_tables.has (HB_OT_TAG_GDEF))
-    _remap_used_mark_sets (this, used_mark_sets_map);
+    remap_used_mark_sets (this, used_mark_sets_map);
+#endif
 
 #ifndef HB_NO_VAR
 #ifndef HB_NO_BASE
   if (!drop_tables.has (HB_OT_TAG_BASE))
-    _collect_base_variation_indices (this);
+    collect_base_variation_indices (this);
 #endif
 #endif
 
@@ -1379,8 +733,8 @@
     return;
 
 #ifndef HB_NO_VAR
-  _update_instance_metrics_map_from_cff2 (this);
-  if (!check_success (_get_instance_glyphs_contour_points (this)))
+  update_instance_metrics_map_from_cff2 (this);
+  if (!check_success (get_instance_glyphs_contour_points (this)))
       return;
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -296,5 +296,75 @@
   }
 };
 
+// hb-subset-plan implementation is split into multiple files to keep
+// compile times more reasonable:
+// - hb-subset-plan.cc
+// - hb-subset-plan-layout.cc
+//
+// The functions below are those needed to connect the split files
+// above together.
+HB_INTERNAL void
+remap_indexes (const hb_set_t *indexes,
+               hb_map_t       *mapping /* OUT */);
 
+
+#ifndef HB_NO_VAR
+template<typename ItemVarStore>
+HB_INTERNAL void
+remap_variation_indices (const ItemVarStore &var_store,
+                         const hb_set_t &variation_indices,
+                         const hb_vector_t<int>& normalized_coords,
+                         bool calculate_delta, /* not pinned at default */
+                         bool no_variations, /* all axes pinned */
+                         hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map /* OUT */);
+
+
+template<typename DeltaSetIndexMap>
+HB_INTERNAL void
+remap_colrv1_delta_set_index_indices (const DeltaSetIndexMap &index_map,
+                                      const hb_set_t &delta_set_idxes,
+                                      hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> &variation_idx_delta_map, /* IN/OUT */
+                                      hb_map_t &new_deltaset_idx_varidx_map /* OUT */);
+
+
+HB_INTERNAL void
+generate_varstore_inner_maps (const hb_set_t& varidx_set,
+                              unsigned subtable_count,
+                              hb_vector_t<hb_inc_bimap_t> &inner_maps /* OUT */);
+
+HB_INTERNAL void
+normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan);
+
+HB_INTERNAL void
+update_instance_metrics_map_from_cff2 (hb_subset_plan_t *plan);
+
+HB_INTERNAL bool
+get_instance_glyphs_contour_points (hb_subset_plan_t *plan);
+
+#ifndef HB_NO_BASE
+HB_INTERNAL void
+collect_base_variation_indices (hb_subset_plan_t* plan);
+#endif
+#endif
+
+#ifndef HB_NO_SUBSET_LAYOUT
+typedef hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> script_langsys_map;
+
+HB_INTERNAL void
+remap_used_mark_sets (hb_subset_plan_t *plan,
+                      hb_map_t& used_mark_sets_map);
+
+HB_INTERNAL void
+layout_nameid_closure (hb_subset_plan_t* plan,
+                       hb_set_t* drop_tables);
+
+HB_INTERNAL void
+layout_populate_gids_to_retain (hb_subset_plan_t* plan,
+                                hb_set_t* drop_tables);
+
+HB_INTERNAL void
+collect_layout_variation_indices (hb_subset_plan_t* plan);
+#endif
+
+
 #endif /* HB_SUBSET_PLAN_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc	2025-04-16 21:56:14 UTC (rev 74964)
@@ -730,7 +730,7 @@
   const char* cff_data = hb_blob_get_data(cff_blob, &length) ;
 
   long int offset = (const char*) bytes.arrayZ - cff_data;
-  if (offset < 0 || offset > UINT32_MAX) {
+  if (offset < 0 || offset > INT32_MAX) {
     return hb_blob_get_empty ();
   }
 
@@ -751,7 +751,7 @@
   const char* cff_data = hb_blob_get_data(cff_blob, &length) ;
 
   long int offset = charstrings_start - cff_data;
-  if (offset < 0 || offset > UINT32_MAX) {
+  if (offset < 0 || offset > INT32_MAX) {
     return hb_blob_get_empty ();
   }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h	2025-04-16 21:56:14 UTC (rev 74964)
@@ -71,10 +71,12 @@
  * in the final subset.
  * @HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES: If set then the unicode ranges in
  * OS/2 will not be recalculated.
- * @HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE: If set don't perform glyph closure on layout
+ * @HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE: If set do not perform glyph closure on layout
  * substitution rules (GSUB). Since: 7.2.0.
  * @HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS: If set perform IUP delta optimization on the
  * remaining gvar table's deltas. Since: 8.5.0
+ * @HB_SUBSET_FLAGS_NO_BIDI_CLOSURE: If set do not pull mirrored versions of input
+ * codepoints into the subset. Since: 11.1.0
  * @HB_SUBSET_FLAGS_IFTB_REQUIREMENTS: If set enforce requirements on the output subset
  * to allow it to be used with incremental font transfer IFTB patches. Primarily,
  * this forces all outline data to use long (32 bit) offsets. Since: EXPERIMENTAL
@@ -96,8 +98,9 @@
   HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES =  0x00000100u,
   HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE =        0x00000200u,
   HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS	  =  0x00000400u,
+  HB_SUBSET_FLAGS_NO_BIDI_CLOSURE         =  0x00000800u,
 #ifdef HB_EXPERIMENTAL_API
-  HB_SUBSET_FLAGS_IFTB_REQUIREMENTS       =  0x00000800u,
+  HB_SUBSET_FLAGS_IFTB_REQUIREMENTS       =  0x00001000u,
 #endif
 } hb_subset_flags_t;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2025-04-16 21:56:14 UTC (rev 74964)
@@ -465,7 +465,7 @@
 #    define hb_atexit atexit
 #  else
      template <void (*function) (void)> struct hb_atexit_t { ~hb_atexit_t () { function (); } };
-#    define hb_atexit(f) static hb_atexit_t<f> _hb_atexit_##__LINE__;
+#    define hb_atexit(f) static hb_atexit_t<f> _hb_atexit_##__LINE__
 #  endif
 #endif
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build	2025-04-16 21:56:14 UTC (rev 74964)
@@ -318,6 +318,7 @@
   'hb-ot-shape.h',
   'hb-ot-var.h',
   'hb-ot.h',
+  'hb-script-list.h',
   'hb-set.h',
   'hb-shape-plan.h',
   'hb-shape.h',
@@ -392,6 +393,8 @@
   'hb-subset-instancer-solver.hh',
   'hb-subset-instancer-solver.cc',
   'hb-subset-plan.cc',
+  'hb-subset-plan-layout.cc',
+  'hb-subset-plan-var.cc',
   'hb-subset-plan.hh',
   'hb-subset-plan-member-list.hh',
   'hb-subset-serialize.cc',
@@ -596,7 +599,7 @@
 version = '0. at 0@.0'.format(hb_version_int)
 
 extra_hb_cpp_args = []
-if cpp.get_define('_MSC_FULL_VER') != ''
+if cpp_is_microsoft_compiler
   if get_option('default_library') != 'static'
     extra_hb_cpp_args += '-DHB_DLL_EXPORT'
   endif
@@ -718,7 +721,7 @@
   # TODO: Microsoft LINK gives the following because extern, non dllexport
   # symbols can only be used when linking against a static library
   # error LNK2019: unresolved external symbol "unsigned __int64 const * const _hb_NullPool"
-  if cpp.get_define('_MSC_FULL_VER') == ''
+  if not cpp_is_microsoft_compiler
     noinst_programs = {
       'main': 'main.cc',
       'test-basics': 'test.cc',
@@ -765,7 +768,7 @@
     'test-unicode-ranges': ['test-unicode-ranges.cc'],
   }
   foreach name, source : compiled_tests
-    if cpp.get_define('_MSC_FULL_VER') != '' and source.contains('hb-static.cc')
+    if cpp_is_microsoft_compiler and source.contains('hb-static.cc')
       # TODO: Microsoft compilers cannot link tests using hb-static.cc, fix them
       continue
     endif
@@ -837,15 +840,10 @@
 cmake_config = configuration_data()
 cmake_config_dir = cmake_package_install_dir / 'harfbuzz'
 
-have_fs_relative_to = meson.version().version_compare('>=1.3.0')
-
-if not have_fs_relative_to
-  relative_to = find_program('relative_to.py')
-endif
-
-if have_fs_relative_to
+if meson.version().version_compare('>=1.3.0')
   cmake_package_prefix_dir = fs.relative_to(get_option('prefix'), get_option('prefix') / cmake_config_dir)
 else
+  relative_to = find_program('relative_to.py')
   cmake_package_prefix_dir = run_command(relative_to, get_option('prefix'), get_option('prefix') / cmake_config_dir, check: true).stdout().strip()
 endif
 
@@ -857,7 +855,7 @@
 cmake_install_includedir = get_option('includedir')
 
 if fs.is_absolute(cmake_install_includedir)
-  if have_fs_relative_to
+  if meson.version().version_compare('>=1.3.0')
     cmake_install_includedir = fs.relative_to(cmake_install_includedir, get_option('prefix'))
   else
     cmake_install_includedir = run_command(relative_to, cmake_install_includedir, get_option('prefix'), check: true).stdout().strip()
@@ -867,7 +865,7 @@
 cmake_install_libdir = get_option('libdir')
 
 if fs.is_absolute(cmake_install_libdir)
-  if have_fs_relative_to
+  if meson.version().version_compare('>=1.3.0')
     cmake_install_libdir = fs.relative_to(cmake_install_libdir, get_option('prefix'))
   else
     cmake_install_libdir = run_command(relative_to, cmake_install_libdir, get_option('prefix'), check: true).stdout().strip()
@@ -1039,16 +1037,22 @@
 
   env = environment()
   env.set('srcdir', meson.current_source_dir())
-  env.set('base_srcdir', meson.source_root())
+  env.set('base_srcdir', meson.project_source_root())
   env.set('builddir', meson.current_build_dir())
   env.set('libs', meson.current_build_dir()) # TODO: Merge this with builddir after autotools removal
   HBSOURCES = []
   foreach f : hb_sources
+    if meson.version().version_compare('>=1.4.0')
+      f = f.full_path()
+    endif
     HBSOURCES += '@0@'.format(f)
   endforeach
   env.set('HBSOURCES', ' '.join(HBSOURCES))
   HBHEADERS = []
   foreach f : hb_headers
+    if meson.version().version_compare('>=1.4.0')
+      f = f.full_path()
+    endif
     HBHEADERS += '@0@'.format(f)
   endforeach
   env.set('HBHEADERS', ' '.join(HBHEADERS))

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.am	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.am	2025-04-16 21:56:14 UTC (rev 74964)
@@ -27,6 +27,7 @@
 	$(HARFBUZZ_SRC)/hb-map.h \
 	$(HARFBUZZ_SRC)/hb-ot-deprecated.h \
 	$(HARFBUZZ_SRC)/hb-paint.h \
+	$(HARFBUZZ_SRC)/hb-script-list.h \
 	$(HARFBUZZ_SRC)/hb-set.h \
 	$(HARFBUZZ_SRC)/hb-shape.h \
 	$(HARFBUZZ_SRC)/hb-shape-plan.h \

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.in	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.in	2025-04-16 21:56:14 UTC (rev 74964)
@@ -257,8 +257,9 @@
 	$(HARFBUZZ_SRC)/hb-face.h $(HARFBUZZ_SRC)/hb-font.h \
 	$(HARFBUZZ_SRC)/hb-fontations.h $(HARFBUZZ_SRC)/hb-map.h \
 	$(HARFBUZZ_SRC)/hb-ot-deprecated.h $(HARFBUZZ_SRC)/hb-paint.h \
-	$(HARFBUZZ_SRC)/hb-set.h $(HARFBUZZ_SRC)/hb-shape.h \
-	$(HARFBUZZ_SRC)/hb-shape-plan.h $(HARFBUZZ_SRC)/hb-style.h \
+	$(HARFBUZZ_SRC)/hb-script-list.h $(HARFBUZZ_SRC)/hb-set.h \
+	$(HARFBUZZ_SRC)/hb-shape.h $(HARFBUZZ_SRC)/hb-shape-plan.h \
+	$(HARFBUZZ_SRC)/hb-style.h \
 	$(HARFBUZZ_SRC)/hb-subset-serialize.h \
 	$(HARFBUZZ_SRC)/hb-unicode.h $(HARFBUZZ_BLD)/hb-version.h \
 	$(HARFBUZZ_SRC)/hb-ot.h $(HARFBUZZ_SRC)/hb-ot-color.h \

Modified: trunk/Build/source/libs/harfbuzz/version.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/version.ac	2025-04-16 20:14:40 UTC (rev 74963)
+++ trunk/Build/source/libs/harfbuzz/version.ac	2025-04-16 21:56:14 UTC (rev 74964)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [11.0.1])
+m4_define([harfbuzz_version], [11.1.0])



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