Browse Source

Merge pull request #101366 from akien-mga/harfbuzz-10.1.0

harfbuzz: Update to 10.1.0
Rémi Verschelde 7 months ago
parent
commit
85358f1738
32 changed files with 1464 additions and 1159 deletions
  1. 2 1
      modules/text_server_adv/SCsub
  2. 2 1
      modules/text_server_adv/gdextension_build/SConstruct
  3. 2 2
      thirdparty/README.md
  4. 26 21
      thirdparty/harfbuzz/src/OT/Color/COLR/COLR.hh
  5. 0 401
      thirdparty/harfbuzz/src/OT/glyf/VarCompositeGlyph.hh
  6. 0 36
      thirdparty/harfbuzz/src/OT/glyf/coord-setter.hh
  7. 2 3
      thirdparty/harfbuzz/src/hb-blob.cc
  8. 1 1
      thirdparty/harfbuzz/src/hb-cairo.cc
  9. 0 1
      thirdparty/harfbuzz/src/hb-config.hh
  10. 461 0
      thirdparty/harfbuzz/src/hb-coretext-font.cc
  11. 69 2
      thirdparty/harfbuzz/src/hb-coretext-shape.cc
  12. 12 5
      thirdparty/harfbuzz/src/hb-coretext.h
  13. 1 1
      thirdparty/harfbuzz/src/hb-draw.h
  14. 55 0
      thirdparty/harfbuzz/src/hb-face.cc
  15. 8 0
      thirdparty/harfbuzz/src/hb-face.h
  16. 1 1
      thirdparty/harfbuzz/src/hb-font.cc
  17. 112 13
      thirdparty/harfbuzz/src/hb-ft.cc
  18. 3 0
      thirdparty/harfbuzz/src/hb-ft.h
  19. 5 3
      thirdparty/harfbuzz/src/hb-icu.cc
  20. 1 1
      thirdparty/harfbuzz/src/hb-limits.hh
  21. 1 1
      thirdparty/harfbuzz/src/hb-map.hh
  22. 1 1
      thirdparty/harfbuzz/src/hb-ms-feature-ranges.hh
  23. 3 1
      thirdparty/harfbuzz/src/hb-ot-font.cc
  24. 2 2
      thirdparty/harfbuzz/src/hb-ot-layout-common.hh
  25. 31 4
      thirdparty/harfbuzz/src/hb-ot-layout.hh
  26. 1 2
      thirdparty/harfbuzz/src/hb-ot-shape-normalize.cc
  27. 2 3
      thirdparty/harfbuzz/src/hb-ot-shape.cc
  28. 507 499
      thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh
  29. 148 145
      thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh
  30. 2 2
      thirdparty/harfbuzz/src/hb-ot-tag-table.hh
  31. 0 3
      thirdparty/harfbuzz/src/hb-unicode.hh
  32. 3 3
      thirdparty/harfbuzz/src/hb-version.h

+ 2 - 1
modules/text_server_adv/SCsub

@@ -64,7 +64,8 @@ if env["builtin_harfbuzz"]:
         # "src/hb-cairo-utils.cc",
         # "src/hb-cairo.cc",
         "src/hb-common.cc",
-        # "src/hb-coretext.cc",
+        # "src/hb-coretext-font.cc",
+        # "src/hb-coretext-shape.cc",
         # "src/hb-directwrite.cc",
         "src/hb-draw.cc",
         "src/hb-face-builder.cc",

+ 2 - 1
modules/text_server_adv/gdextension_build/SConstruct

@@ -298,7 +298,8 @@ thirdparty_harfbuzz_sources = [
     # "src/hb-cairo-utils.cc",
     # "src/hb-cairo.cc",
     "src/hb-common.cc",
-    # "src/hb-coretext.cc",
+    # "src/hb-coretext-font.cc",
+    # "src/hb-coretext-shape.cc",
     # "src/hb-directwrite.cc",
     "src/hb-draw.cc",
     "src/hb-face-builder.cc",

+ 2 - 2
thirdparty/README.md

@@ -394,7 +394,7 @@ Files extracted from upstream source:
 ## harfbuzz
 
 - Upstream: https://github.com/harfbuzz/harfbuzz
-- Version: 10.0.1 (a1d9bfe62818ef0fa9cf63b6e6d51436b1c93cbc, 2024)
+- Version: 10.1.0 (9ef44a2d67ac870c1f7f671f6dc98d08a2579865, 2024)
 - License: MIT
 
 Files extracted from upstream source:
@@ -402,7 +402,7 @@ Files extracted from upstream source:
 - `AUTHORS`, `COPYING`, `THANKS`
 - From the `src` folder, recursively:
   - All the `.cc`, `.h`, `.hh` files
-  - Except `main.cc`, `harfbuzz*.cc`, `failing-alloc.c`, `test*.cc`, `hb-wasm*.*`
+  - Except `main.cc`, `harfbuzz*.cc`, `failing-alloc.c`, `test*.cc`, `hb-wasm*.*`, `wasm/*`
 
 
 ## icu4c

+ 26 - 21
thirdparty/harfbuzz/src/OT/Color/COLR/COLR.hh

@@ -2058,7 +2058,7 @@ struct delta_set_index_map_subset_plan_t
       unsigned outer = (*var_idx) >> 16;
       unsigned bit_count = (outer == 0) ? 1 : hb_bit_storage (outer);
       outer_bit_count = hb_max (bit_count, outer_bit_count);
-      
+
       unsigned inner = (*var_idx) & 0xFFFF;
       bit_count = (inner == 0) ? 1 : hb_bit_storage (inner);
       inner_bit_count = hb_max (bit_count, inner_bit_count);
@@ -2080,7 +2080,7 @@ struct COLR
   bool has_v0_data () const { return numBaseGlyphs; }
   bool has_v1_data () const
   {
-    if (version != 1)
+    if (version < 1)
       return false;
     hb_barrier ();
 
@@ -2180,7 +2180,7 @@ struct COLR
                       hb_set_t *variation_indices,
                       hb_set_t *delta_set_indices) const
   {
-    if (version != 1) return;
+    if (version < 1) return;
     hb_barrier ();
 
     hb_set_t visited_glyphs;
@@ -2222,16 +2222,22 @@ struct COLR
   { return (this+baseGlyphList); }
 
   bool has_var_store () const
-  { return version >= 1 && varStore != 0; }
+  { return version >= 1 && hb_barrier () && varStore != 0; }
 
   bool has_delta_set_index_map () const
-  { return version >= 1 && varIdxMap != 0; }
+  { return version >= 1 && hb_barrier () && varIdxMap != 0; }
+
+  bool has_clip_list () const
+  { return version >= 1 && hb_barrier () && clipList != 0; }
 
   const DeltaSetIndexMap &get_delta_set_index_map () const
-  { return (version == 0 || varIdxMap == 0) ? Null (DeltaSetIndexMap) : this+varIdxMap; }
+  { return has_delta_set_index_map () && hb_barrier () ? this+varIdxMap : Null (DeltaSetIndexMap); }
 
   const ItemVariationStore &get_var_store () const
-  { return (version == 0 || varStore == 0) ? Null (ItemVariationStore) : this+varStore; }
+  { return has_var_store () && hb_barrier () ? this+varStore : Null (ItemVariationStore); }
+
+  const ClipList &get_clip_list () const
+  { return has_clip_list () && hb_barrier () ? this+clipList : Null (ClipList); }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -2242,7 +2248,6 @@ struct COLR
                   (this+layersZ).sanitize (c, numLayers) &&
                   (version == 0 ||
 		   (hb_barrier () &&
-		    version == 1 &&
 		    baseGlyphList.sanitize (c, this) &&
 		    layerList.sanitize (c, this) &&
 		    clipList.sanitize (c, this) &&
@@ -2465,7 +2470,9 @@ struct COLR
     if (unlikely (!c->serializer->extend_min (colr_prime)))  return_trace (false);
 
     if (version == 0 || downgrade_to_V0 (glyphset))
-    return_trace (colr_prime->serialize_V0 (c->serializer, 0, base_it, layer_it));
+      return_trace (colr_prime->serialize_V0 (c->serializer, 0, base_it, layer_it));
+
+    hb_barrier ();
 
     //start version 1
     if (!c->serializer->allocate_size<void> (5 * HBUINT32::static_size)) return_trace (false);
@@ -2475,8 +2482,8 @@ struct COLR
      * after instancing */
     if (!subset_varstore (c, colr_prime)) return_trace (false);
 
-    ItemVarStoreInstancer instancer (varStore ? &(this+varStore) : nullptr,
-	                         varIdxMap ? &(this+varIdxMap) : nullptr,
+    ItemVarStoreInstancer instancer (&(get_var_store ()),
+	                         &(get_delta_set_index_map ()),
 	                         c->plan->normalized_coords.as_array ());
 
     if (!colr_prime->baseGlyphList.serialize_subset (c, baseGlyphList, this, instancer))
@@ -2505,12 +2512,10 @@ struct COLR
   bool
   get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
   {
-    if (version != 1)
-      return false;
 
-    ItemVarStoreInstancer instancer (&(this+varStore),
-				 &(this+varIdxMap),
-				 hb_array (font->coords, font->num_coords));
+    ItemVarStoreInstancer instancer (&(get_var_store ()),
+                                     &(get_delta_set_index_map ()),
+                                     hb_array (font->coords, font->num_coords));
 
     if (get_clip (glyph, extents, instancer))
     {
@@ -2545,7 +2550,7 @@ struct COLR
   bool
   has_paint_for_glyph (hb_codepoint_t glyph) const
   {
-    if (version == 1)
+    if (version >= 1)
     {
       hb_barrier ();
 
@@ -2561,7 +2566,7 @@ struct COLR
 		 hb_glyph_extents_t *extents,
 		 const ItemVarStoreInstancer instancer) const
   {
-    return (this+clipList).get_extents (glyph,
+    return get_clip_list ().get_extents (glyph,
 					extents,
 					instancer);
   }
@@ -2570,13 +2575,13 @@ struct COLR
   bool
   paint_glyph (hb_font_t *font, hb_codepoint_t glyph, hb_paint_funcs_t *funcs, void *data, unsigned int palette_index, hb_color_t foreground, bool clip = true) const
   {
-    ItemVarStoreInstancer instancer (&(this+varStore),
-	                         &(this+varIdxMap),
+    ItemVarStoreInstancer instancer (&(get_var_store ()),
+	                         &(get_delta_set_index_map ()),
 	                         hb_array (font->coords, font->num_coords));
     hb_paint_context_t c (this, funcs, data, font, palette_index, foreground, instancer);
     c.current_glyphs.add (glyph);
 
-    if (version == 1)
+    if (version >= 1)
     {
       hb_barrier ();
 

+ 0 - 401
thirdparty/harfbuzz/src/OT/glyf/VarCompositeGlyph.hh

@@ -1,401 +0,0 @@
-#ifndef OT_GLYF_VARCOMPOSITEGLYPH_HH
-#define OT_GLYF_VARCOMPOSITEGLYPH_HH
-
-
-#include "../../hb-open-type.hh"
-#include "coord-setter.hh"
-
-
-namespace OT {
-namespace glyf_impl {
-
-
-struct VarCompositeGlyphRecord
-{
-  protected:
-  enum var_composite_glyph_flag_t
-  {
-    USE_MY_METRICS		= 0x0001,
-    AXIS_INDICES_ARE_SHORT	= 0x0002,
-    UNIFORM_SCALE		= 0x0004,
-    HAVE_TRANSLATE_X		= 0x0008,
-    HAVE_TRANSLATE_Y		= 0x0010,
-    HAVE_ROTATION		= 0x0020,
-    HAVE_SCALE_X		= 0x0040,
-    HAVE_SCALE_Y		= 0x0080,
-    HAVE_SKEW_X			= 0x0100,
-    HAVE_SKEW_Y			= 0x0200,
-    HAVE_TCENTER_X		= 0x0400,
-    HAVE_TCENTER_Y		= 0x0800,
-    GID_IS_24BIT		= 0x1000,
-    AXES_HAVE_VARIATION		= 0x2000,
-    RESET_UNSPECIFIED_AXES	= 0x4000,
-  };
-
-  public:
-
-  unsigned int get_size () const
-  {
-    unsigned fl = flags;
-    unsigned int size = min_size;
-
-    unsigned axis_width = (fl & AXIS_INDICES_ARE_SHORT) ? 4 : 3;
-    size += numAxes * axis_width;
-
-    if (fl & GID_IS_24BIT)	size += 1;
-
-    // 2 bytes each for the following flags
-    fl = fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y |
-	       HAVE_ROTATION |
-	       HAVE_SCALE_X | HAVE_SCALE_Y |
-	       HAVE_SKEW_X | HAVE_SKEW_Y |
-	       HAVE_TCENTER_X | HAVE_TCENTER_Y);
-    size += hb_popcount (fl) * 2;
-
-    return size;
-  }
-
-  bool has_more () const { return true; }
-
-  bool is_use_my_metrics () const { return flags & USE_MY_METRICS; }
-  bool is_reset_unspecified_axes () const { return flags & RESET_UNSPECIFIED_AXES; }
-
-  hb_codepoint_t get_gid () const
-  {
-    if (flags & GID_IS_24BIT)
-      return * (const HBGlyphID24 *) &pad;
-    else
-      return * (const HBGlyphID16 *) &pad;
-  }
-
-  void set_gid (hb_codepoint_t gid)
-  {
-    if (flags & GID_IS_24BIT)
-      * (HBGlyphID24 *) &pad = gid;
-    else
-      * (HBGlyphID16 *) &pad = gid;
-  }
-
-  unsigned get_numAxes () const
-  {
-    return numAxes;
-  }
-
-  unsigned get_num_points () const
-  {
-    unsigned fl = flags;
-    unsigned num = 0;
-    if (fl & AXES_HAVE_VARIATION)			num += numAxes;
-
-    /* Hopefully faster code, relying on the value of the flags. */
-    fl = (((fl & (HAVE_TRANSLATE_Y | HAVE_SCALE_Y | HAVE_SKEW_Y | HAVE_TCENTER_Y)) >> 1) | fl) &
-         (HAVE_TRANSLATE_X | HAVE_ROTATION | HAVE_SCALE_X | HAVE_SKEW_X | HAVE_TCENTER_X);
-    num += hb_popcount (fl);
-    return num;
-
-    /* Slower but more readable code. */
-    if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))	num++;
-    if (fl & HAVE_ROTATION)				num++;
-    if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y))		num++;
-    if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y))		num++;
-    if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y))		num++;
-    return num;
-  }
-
-  void transform_points (hb_array_t<const contour_point_t> record_points,
-			 hb_array_t<contour_point_t> points) const
-  {
-    float matrix[4];
-    contour_point_t trans;
-
-    get_transformation_from_points (record_points.arrayZ, matrix, trans);
-
-    auto arrayZ = points.arrayZ;
-    unsigned count = points.length;
-
-    if (matrix[0] != 1.f || matrix[1] != 0.f ||
-	matrix[2] != 0.f || matrix[3] != 1.f)
-      for (unsigned i = 0; i < count; i++)
-        arrayZ[i].transform (matrix);
-
-    if (trans.x != 0.f || trans.y != 0.f)
-      for (unsigned i = 0; i < count; i++)
-        arrayZ[i].translate (trans);
-  }
-
-  static inline void transform (float (&matrix)[4], contour_point_t &trans,
-				float (other)[6])
-  {
-    // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L268
-    float xx1 = other[0];
-    float xy1 = other[1];
-    float yx1 = other[2];
-    float yy1 = other[3];
-    float dx1 = other[4];
-    float dy1 = other[5];
-    float xx2 = matrix[0];
-    float xy2 = matrix[1];
-    float yx2 = matrix[2];
-    float yy2 = matrix[3];
-    float dx2 = trans.x;
-    float dy2 = trans.y;
-
-    matrix[0] = xx1*xx2 + xy1*yx2;
-    matrix[1] = xx1*xy2 + xy1*yy2;
-    matrix[2] = yx1*xx2 + yy1*yx2;
-    matrix[3] = yx1*xy2 + yy1*yy2;
-    trans.x = xx2*dx1 + yx2*dy1 + dx2;
-    trans.y = xy2*dx1 + yy2*dy1 + dy2;
-  }
-
-  static void translate (float (&matrix)[4], contour_point_t &trans,
-			 float translateX, float translateY)
-  {
-    if (!translateX && !translateY)
-      return;
-
-    trans.x += matrix[0] * translateX + matrix[2] * translateY;
-    trans.y += matrix[1] * translateX + matrix[3] * translateY;
-  }
-
-  static void scale (float (&matrix)[4], contour_point_t &trans,
-		     float scaleX, float scaleY)
-  {
-    if (scaleX == 1.f && scaleY == 1.f)
-      return;
-
-    matrix[0] *= scaleX;
-    matrix[1] *= scaleX;
-    matrix[2] *= scaleY;
-    matrix[3] *= scaleY;
-  }
-
-  static void rotate (float (&matrix)[4], contour_point_t &trans,
-		      float rotation)
-  {
-    if (!rotation)
-      return;
-
-    // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L240
-    rotation = rotation * HB_PI;
-    float c;
-    float s;
-#ifdef HAVE_SINCOSF
-    sincosf (rotation, &s, &c);
-#else
-    c = cosf (rotation);
-    s = sinf (rotation);
-#endif
-    float other[6] = {c, s, -s, c, 0.f, 0.f};
-    transform (matrix, trans, other);
-  }
-
-  static void skew (float (&matrix)[4], contour_point_t &trans,
-		    float skewX, float skewY)
-  {
-    if (!skewX && !skewY)
-      return;
-
-    // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L255
-    skewX = skewX * HB_PI;
-    skewY = skewY * HB_PI;
-    float other[6] = {1.f,
-		      skewY ? tanf (skewY) : 0.f,
-		      skewX ? tanf (skewX) : 0.f,
-		      1.f,
-		      0.f, 0.f};
-    transform (matrix, trans, other);
-  }
-
-  bool get_points (contour_point_vector_t &points) const
-  {
-    unsigned num_points = get_num_points ();
-
-    points.alloc (points.length + num_points + 4); // For phantom points
-    if (unlikely (!points.resize (points.length + num_points, false))) return false;
-    contour_point_t *rec_points = points.arrayZ + (points.length - num_points);
-    hb_memset (rec_points, 0, num_points * sizeof (rec_points[0]));
-
-    unsigned fl = flags;
-
-    unsigned num_axes = numAxes;
-    unsigned axis_width = (fl & AXIS_INDICES_ARE_SHORT) ? 2 : 1;
-    unsigned axes_size = num_axes * axis_width;
-
-    const F2DOT14 *q = (const F2DOT14 *) (axes_size +
-					  (fl & GID_IS_24BIT ? 3 : 2) +
-					  (const HBUINT8 *) &pad);
-
-    unsigned count = num_axes;
-    if (fl & AXES_HAVE_VARIATION)
-    {
-      for (unsigned i = 0; i < count; i++)
-	rec_points++->x = q++->to_int ();
-    }
-    else
-      q += count;
-
-    const HBUINT16 *p = (const HBUINT16 *) q;
-
-    if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
-    {
-      int translateX = (fl & HAVE_TRANSLATE_X) ? * (const FWORD *) p++ : 0;
-      int translateY = (fl & HAVE_TRANSLATE_Y) ? * (const FWORD *) p++ : 0;
-      rec_points->x = translateX;
-      rec_points->y = translateY;
-      rec_points++;
-    }
-    if (fl & HAVE_ROTATION)
-    {
-      int rotation = (fl & HAVE_ROTATION) ? ((const F4DOT12 *) p++)->to_int () : 0;
-      rec_points->x = rotation;
-      rec_points++;
-    }
-    if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y))
-    {
-      int scaleX = (fl & HAVE_SCALE_X) ? ((const F6DOT10 *) p++)->to_int () : 1 << 10;
-      int scaleY = (fl & HAVE_SCALE_Y) ? ((const F6DOT10 *) p++)->to_int () : 1 << 10;
-      if ((fl & UNIFORM_SCALE) && !(fl & HAVE_SCALE_Y))
-	scaleY = scaleX;
-      rec_points->x = scaleX;
-      rec_points->y = scaleY;
-      rec_points++;
-    }
-    if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y))
-    {
-      int skewX = (fl & HAVE_SKEW_X) ? ((const F4DOT12 *) p++)->to_int () : 0;
-      int skewY = (fl & HAVE_SKEW_Y) ? ((const F4DOT12 *) p++)->to_int () : 0;
-      rec_points->x = skewX;
-      rec_points->y = skewY;
-      rec_points++;
-    }
-    if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
-    {
-      int tCenterX = (fl & HAVE_TCENTER_X) ? * (const FWORD *) p++ : 0;
-      int tCenterY = (fl & HAVE_TCENTER_Y) ? * (const FWORD *) p++ : 0;
-      rec_points->x = tCenterX;
-      rec_points->y = tCenterY;
-      rec_points++;
-    }
-
-    return true;
-  }
-
-  void get_transformation_from_points (const contour_point_t *rec_points,
-				       float (&matrix)[4], contour_point_t &trans) const
-  {
-    unsigned fl = flags;
-
-    if (fl & AXES_HAVE_VARIATION)
-      rec_points += numAxes;
-
-    matrix[0] = matrix[3] = 1.f;
-    matrix[1] = matrix[2] = 0.f;
-    trans.init (0.f, 0.f);
-
-    float translateX = 0.f;
-    float translateY = 0.f;
-    float rotation = 0.f;
-    float scaleX = 1.f;
-    float scaleY = 1.f;
-    float skewX = 0.f;
-    float skewY = 0.f;
-    float tCenterX = 0.f;
-    float tCenterY = 0.f;
-
-    if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
-    {
-      translateX = rec_points->x;
-      translateY = rec_points->y;
-      rec_points++;
-    }
-    if (fl & HAVE_ROTATION)
-    {
-      rotation = rec_points->x / (1 << 12);
-      rec_points++;
-    }
-    if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y))
-    {
-      scaleX = rec_points->x / (1 << 10);
-      scaleY = rec_points->y / (1 << 10);
-      rec_points++;
-    }
-    if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y))
-    {
-      skewX = rec_points->x / (1 << 12);
-      skewY = rec_points->y / (1 << 12);
-      rec_points++;
-    }
-    if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
-    {
-      tCenterX = rec_points->x;
-      tCenterY = rec_points->y;
-      rec_points++;
-    }
-
-    translate (matrix, trans, translateX + tCenterX, translateY + tCenterY);
-    rotate (matrix, trans, rotation);
-    scale (matrix, trans, scaleX, scaleY);
-    skew (matrix, trans, -skewX, skewY);
-    translate (matrix, trans, -tCenterX, -tCenterY);
-  }
-
-  void set_variations (coord_setter_t &setter,
-		       hb_array_t<contour_point_t> rec_points) const
-  {
-    bool have_variations = flags & AXES_HAVE_VARIATION;
-    unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1;
-    unsigned num_axes = numAxes;
-
-    const HBUINT8  *p = (const HBUINT8 *)  (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24BIT ? 3 : 2));
-    const HBUINT16 *q = (const HBUINT16 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24BIT ? 3 : 2));
-
-    const F2DOT14 *a = (const F2DOT14 *) ((HBUINT8 *) (axis_width == 1 ? (p + num_axes) : (HBUINT8 *) (q + num_axes)));
-
-    unsigned count = num_axes;
-    for (unsigned i = 0; i < count; i++)
-    {
-      unsigned axis_index = axis_width == 1 ? (unsigned) *p++ : (unsigned) *q++;
-
-      signed v = have_variations ? rec_points.arrayZ[i].x : a++->to_int ();
-
-      v = hb_clamp (v, -(1<<14), (1<<14));
-      setter[axis_index] = v;
-    }
-  }
-
-  protected:
-  HBUINT16	flags;
-  HBUINT8	numAxes;
-  HBUINT16	pad;
-  public:
-  DEFINE_SIZE_MIN (5);
-};
-
-using var_composite_iter_t = composite_iter_tmpl<VarCompositeGlyphRecord>;
-
-struct VarCompositeGlyph
-{
-  const GlyphHeader &header;
-  hb_bytes_t bytes;
-  VarCompositeGlyph (const GlyphHeader &header_, hb_bytes_t bytes_) :
-    header (header_), bytes (bytes_) {}
-
-  var_composite_iter_t iter () const
-  { return var_composite_iter_t (bytes, &StructAfter<VarCompositeGlyphRecord, GlyphHeader> (header)); }
-
-  const hb_bytes_t trim_padding () const
-  {
-    unsigned length = GlyphHeader::static_size;
-    for (auto &comp : iter ())
-      length += comp.get_size ();
-    return bytes.sub_array (0, length);
-  }
-};
-
-
-} /* namespace glyf_impl */
-} /* namespace OT */
-
-
-#endif /* OT_GLYF_VARCOMPOSITEGLYPH_HH */

+ 0 - 36
thirdparty/harfbuzz/src/OT/glyf/coord-setter.hh

@@ -1,36 +0,0 @@
-#ifndef OT_GLYF_COORD_SETTER_HH
-#define OT_GLYF_COORD_SETTER_HH
-
-
-#include "../../hb.hh"
-
-
-namespace OT {
-namespace glyf_impl {
-
-
-struct coord_setter_t
-{
-  coord_setter_t (hb_array_t<int> coords) :
-    coords (coords) {}
-
-  int& operator [] (unsigned idx)
-  {
-    if (unlikely (idx >= HB_GLYF_VAR_COMPOSITE_MAX_AXES))
-      return Crap(int);
-    if (coords.length < idx + 1)
-      coords.resize (idx + 1);
-    return coords[idx];
-  }
-
-  hb_array_t<int> get_coords ()
-  { return coords.as_array (); }
-
-  hb_vector_t<int> coords;
-};
-
-
-} /* namespace glyf_impl */
-} /* namespace OT */
-
-#endif /* OT_GLYF_COORD_SETTER_HH */

+ 2 - 3
thirdparty/harfbuzz/src/hb-blob.cc

@@ -617,10 +617,9 @@ hb_blob_create_from_file (const char *file_name)
 
 /**
  * hb_blob_create_from_file_or_fail:
- * @file_name: A font filename
+ * @file_name: A filename
  *
- * Creates a new blob containing the data from the
- * specified binary font file.
+ * Creates a new blob containing the data from the specified file.
  *
  * The filename is passed directly to the system on all platforms,
  * except on Windows, where the filename is interpreted as UTF-8.

+ 1 - 1
thirdparty/harfbuzz/src/hb-cairo.cc

@@ -482,7 +482,7 @@ hb_cairo_init_scaled_font (cairo_scaled_font_t  *scaled_font,
 								   &hb_cairo_face_user_data_key);
     font = hb_font_create (face);
 
-#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,16,0)
+#if !defined(HB_NO_VAR) && CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,16,0)
     cairo_font_options_t *font_options = cairo_font_options_create ();
 
     // Set variations

+ 0 - 1
thirdparty/harfbuzz/src/hb-config.hh

@@ -56,7 +56,6 @@
 
 #ifdef HB_LEAN
 #define HB_DISABLE_DEPRECATED
-#define HB_NDEBUG
 #define HB_NO_ATEXIT
 #define HB_NO_BUFFER_MESSAGE
 #define HB_NO_BUFFER_SERIALIZE

+ 461 - 0
thirdparty/harfbuzz/src/hb-coretext-font.cc

@@ -0,0 +1,461 @@
+/*
+ * Copyright © 2024  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.
+ *
+ * Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_CORETEXT
+
+#include "hb-coretext.h"
+
+#include "hb-draw.hh"
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 101100
+#  define kCTFontOrientationDefault kCTFontDefaultOrientation
+#endif
+
+#define MAX_GLYPHS 64u
+
+static void
+_hb_coretext_font_destroy (void *font_data)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  CFRelease (ct_font);
+}
+
+static hb_bool_t
+hb_coretext_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+			       void *font_data,
+			       hb_codepoint_t unicode,
+			       hb_codepoint_t *glyph,
+			       void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+  UniChar ch = unicode;
+  CGGlyph cg_glyph;
+  if (CTFontGetGlyphsForCharacters (ct_font, &ch, &cg_glyph, 1))
+  {
+    *glyph = cg_glyph;
+    return true;
+  }
+  return false;
+}
+
+static unsigned int
+hb_coretext_get_nominal_glyphs (hb_font_t *font HB_UNUSED,
+				void *font_data,
+				unsigned int count,
+				const hb_codepoint_t *first_unicode,
+				unsigned int unicode_stride,
+				hb_codepoint_t *first_glyph,
+				unsigned int glyph_stride,
+				void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  UniChar ch[MAX_GLYPHS];
+  CGGlyph cg_glyph[MAX_GLYPHS];
+  for (unsigned i = 0; i < count; i += MAX_GLYPHS)
+  {
+    unsigned c = (unsigned) hb_min ((int) MAX_GLYPHS, (int) count - (int) i);
+    for (unsigned j = 0; j < c; j++)
+    {
+      ch[j] = *first_unicode;
+      first_unicode = &StructAtOffset<const hb_codepoint_t> (first_unicode, unicode_stride);
+    }
+    CTFontGetGlyphsForCharacters (ct_font, ch, cg_glyph, c);
+    for (unsigned j = 0; j < c; j++)
+    {
+      *first_glyph = cg_glyph[j];
+      first_glyph = &StructAtOffset<hb_codepoint_t> (first_glyph, glyph_stride);
+    }
+  }
+
+  return count;
+}
+
+static hb_bool_t
+hb_coretext_get_variation_glyph (hb_font_t *font HB_UNUSED,
+				 void *font_data,
+				 hb_codepoint_t unicode,
+				 hb_codepoint_t variation_selector,
+				 hb_codepoint_t *glyph,
+				 void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  UniChar ch[2] = { unicode, variation_selector };
+  CGGlyph cg_glyph[2];
+
+  CTFontGetGlyphsForCharacters (ct_font, ch, cg_glyph, 2);
+
+  if (cg_glyph[1])
+    return false;
+
+  *glyph = cg_glyph[0];
+  return true;
+}
+
+static void
+hb_coretext_get_glyph_h_advances (hb_font_t* font, void* font_data,
+				  unsigned count,
+				  const hb_codepoint_t *first_glyph,
+				  unsigned glyph_stride,
+				  hb_position_t *first_advance,
+				  unsigned advance_stride,
+				  void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
+  CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
+
+  CGGlyph cg_glyph[MAX_GLYPHS];
+  CGSize advances[MAX_GLYPHS];
+  for (unsigned i = 0; i < count; i += MAX_GLYPHS)
+  {
+    unsigned c = (unsigned) hb_min ((int) MAX_GLYPHS, (int) count - (int) i);
+    for (unsigned j = 0; j < c; j++)
+    {
+      cg_glyph[j] = *first_glyph;
+      first_glyph = &StructAtOffset<const hb_codepoint_t> (first_glyph, glyph_stride);
+    }
+    CTFontGetAdvancesForGlyphs (ct_font, kCTFontOrientationHorizontal, cg_glyph, advances, c);
+    for (unsigned j = 0; j < c; j++)
+    {
+      *first_advance = round (advances[j].width * x_mult);
+      first_advance = &StructAtOffset<hb_position_t> (first_advance, advance_stride);
+    }
+  }
+}
+
+#ifndef HB_NO_VERTICAL
+static void
+hb_coretext_get_glyph_v_advances (hb_font_t* font, void* font_data,
+				  unsigned count,
+				  const hb_codepoint_t *first_glyph,
+				  unsigned glyph_stride,
+				  hb_position_t *first_advance,
+				  unsigned advance_stride,
+				  void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
+  CGFloat y_mult = (CGFloat) -font->y_scale / ct_font_size;
+
+  CGGlyph cg_glyph[MAX_GLYPHS];
+  CGSize advances[MAX_GLYPHS];
+  for (unsigned i = 0; i < count; i += MAX_GLYPHS)
+  {
+    unsigned c = (unsigned) hb_min ((int) MAX_GLYPHS, (int) count - (int) i);
+    for (unsigned j = 0; j < c; j++)
+    {
+      cg_glyph[j] = *first_glyph;
+      first_glyph = &StructAtOffset<const hb_codepoint_t> (first_glyph, glyph_stride);
+    }
+    CTFontGetAdvancesForGlyphs (ct_font, kCTFontOrientationVertical, cg_glyph, advances, c);
+    for (unsigned j = 0; j < c; j++)
+    {
+      *first_advance = round (advances[j].width * y_mult);
+      first_advance = &StructAtOffset<hb_position_t> (first_advance, advance_stride);
+    }
+  }
+}
+#endif
+
+#ifndef HB_NO_VERTICAL
+static hb_bool_t
+hb_coretext_get_glyph_v_origin (hb_font_t *font,
+				void *font_data,
+				hb_codepoint_t glyph,
+				hb_position_t *x,
+				hb_position_t *y,
+				void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
+  CGFloat x_mult = (CGFloat) -font->x_scale / ct_font_size;
+  CGFloat y_mult = (CGFloat) -font->y_scale / ct_font_size;
+
+  const CGGlyph glyphs = glyph;
+  CGSize origin;
+  CTFontGetVerticalTranslationsForGlyphs (ct_font, &glyphs, &origin, 1);
+
+  *x = round (x_mult * origin.width);
+  *y = round (y_mult * origin.height);
+
+  return true;
+}
+#endif
+
+static hb_bool_t
+hb_coretext_get_glyph_extents (hb_font_t *font,
+			       void *font_data,
+			       hb_codepoint_t glyph,
+			       hb_glyph_extents_t *extents,
+			       void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
+  CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
+  CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
+
+  CGGlyph glyphs[1] = { glyph };
+  CGRect bounds = ::CTFontGetBoundingRectsForGlyphs(ct_font,
+						    kCTFontOrientationDefault, glyphs, NULL, 1);
+
+  extents->x_bearing = round (bounds.origin.x * x_mult);
+  extents->y_bearing = round (bounds.origin.y * y_mult);
+  extents->width = round (bounds.size.width * x_mult);
+  extents->height = round (bounds.size.height * y_mult);
+
+  return true;
+}
+
+static hb_bool_t
+hb_coretext_get_font_h_extents (hb_font_t *font,
+				void *font_data,
+				hb_font_extents_t *metrics,
+				void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
+  CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
+
+  metrics->ascender = round (CTFontGetAscent (ct_font) * y_mult);
+  metrics->descender = -round (CTFontGetDescent (ct_font) * y_mult);
+  metrics->line_gap = round (CTFontGetLeading (ct_font) * y_mult);
+
+  return true;
+}
+
+#ifndef HB_NO_DRAW
+
+static void
+ct_apply_func (void *info, const CGPathElement *element)
+{
+  hb_draw_session_t *draws = (hb_draw_session_t *) info;
+
+  switch (element->type)
+  {
+  case kCGPathElementMoveToPoint:
+    draws->move_to (element->points[0].x, element->points[0].y);
+    break;
+  case kCGPathElementAddLineToPoint:
+    draws->line_to (element->points[0].x, element->points[0].y);
+    break;
+  case kCGPathElementAddQuadCurveToPoint:
+    draws->quadratic_to (element->points[0].x, element->points[0].y,
+			 element->points[1].x, element->points[1].y);
+    break;
+  case kCGPathElementAddCurveToPoint:
+    draws->cubic_to (element->points[0].x, element->points[0].y,
+		     element->points[1].x, element->points[1].y,
+		     element->points[2].x, element->points[2].y);
+    break;
+  case kCGPathElementCloseSubpath:
+    draws->close_path ();
+    break;
+  }
+}
+
+static void
+hb_coretext_draw_glyph (hb_font_t *font,
+			void *font_data HB_UNUSED,
+			hb_codepoint_t glyph,
+			hb_draw_funcs_t *draw_funcs, void *draw_data,
+			void *user_data)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
+  CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
+  CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
+
+  CGAffineTransform transform = CGAffineTransformIdentity;
+  transform = CGAffineTransformScale (transform, x_mult, y_mult);
+
+  CGPathRef path = CTFontCreatePathForGlyph (ct_font, glyph, &transform);
+  if (!path)
+    return;
+
+  hb_draw_session_t drawing = {draw_funcs, draw_data, font->slant};
+
+  CGPathApply (path, &drawing, ct_apply_func);
+
+  CFRelease (path);
+}
+#endif
+
+static hb_bool_t
+hb_coretext_get_glyph_name (hb_font_t *font,
+			    void *font_data HB_UNUSED,
+			    hb_codepoint_t glyph,
+			    char *name, unsigned int size,
+			    void *user_data HB_UNUSED)
+{
+  CGFontRef cg_font = (CGFontRef) (const void *) font->face->data.coretext;
+
+  CGGlyph cg_glyph = glyph;
+  CFStringRef cf_name = CGFontCopyGlyphNameForGlyph (cg_font, cg_glyph);
+  if (!cf_name)
+    return false;
+
+  CFIndex len = CFStringGetLength (cf_name);
+  if (len > size - 1)
+    len = size - 1;
+
+  CFStringGetBytes (cf_name, CFRangeMake (0, len),
+		    kCFStringEncodingUTF8, 0, false,
+		    (UInt8 *) name, size, &len);
+
+  name[len] = '\0';
+  return true;
+}
+
+static hb_bool_t
+hb_coretext_get_glyph_from_name (hb_font_t *font HB_UNUSED,
+				 void *font_data,
+				 const char *name, int len,
+				 hb_codepoint_t *glyph,
+				 void *user_data HB_UNUSED)
+{
+  CTFontRef ct_font = (CTFontRef) font_data;
+
+  if (len == -1)
+    len = strlen (name);
+
+  CFStringRef cf_name = CFStringCreateWithBytes (kCFAllocatorDefault,
+						 (const UInt8 *) name, len,
+						 kCFStringEncodingUTF8, false);
+  CGGlyph cg_glyph = CTFontGetGlyphWithName (ct_font, cf_name);
+  *glyph = cg_glyph;
+
+  CFRelease (cf_name);
+
+  // TODO Return true for .notdef; hb-ft does that.
+
+  return cg_glyph != 0;
+}
+
+
+static inline void free_static_coretext_funcs ();
+
+static struct hb_coretext_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_coretext_font_funcs_lazy_loader_t>
+{
+  static hb_font_funcs_t *create ()
+  {
+    hb_font_funcs_t *funcs = hb_font_funcs_create ();
+
+    hb_font_funcs_set_nominal_glyph_func (funcs, hb_coretext_get_nominal_glyph, nullptr, nullptr);
+    hb_font_funcs_set_nominal_glyphs_func (funcs, hb_coretext_get_nominal_glyphs, nullptr, nullptr);
+    hb_font_funcs_set_variation_glyph_func (funcs, hb_coretext_get_variation_glyph, nullptr, nullptr);
+
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_coretext_get_font_h_extents, nullptr, nullptr);
+    hb_font_funcs_set_glyph_h_advances_func (funcs, hb_coretext_get_glyph_h_advances, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_coretext_get_glyph_h_origin, nullptr, nullptr);
+
+#ifndef HB_NO_VERTICAL
+    //hb_font_funcs_set_font_v_extents_func (funcs, hb_coretext_get_font_v_extents, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_advances_func (funcs, hb_coretext_get_glyph_v_advances, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_coretext_get_glyph_v_origin, nullptr, nullptr);
+#endif
+
+#ifndef HB_NO_DRAW
+    hb_font_funcs_set_draw_glyph_func (funcs, hb_coretext_draw_glyph, nullptr, nullptr);
+#endif
+
+    hb_font_funcs_set_glyph_extents_func (funcs, hb_coretext_get_glyph_extents, nullptr, nullptr);
+
+#ifndef HB_NO_OT_FONT_GLYPH_NAMES
+    hb_font_funcs_set_glyph_name_func (funcs, hb_coretext_get_glyph_name, nullptr, nullptr);
+    hb_font_funcs_set_glyph_from_name_func (funcs, hb_coretext_get_glyph_from_name, nullptr, nullptr);
+#endif
+
+    hb_font_funcs_make_immutable (funcs);
+
+    hb_atexit (free_static_coretext_funcs);
+
+    return funcs;
+  }
+} static_coretext_funcs;
+
+static inline
+void free_static_coretext_funcs ()
+{
+  static_coretext_funcs.free_instance ();
+}
+
+static hb_font_funcs_t *
+_hb_coretext_get_font_funcs ()
+{
+  return static_coretext_funcs.get_unconst ();
+}
+
+
+/**
+ * hb_coretext_font_set_funcs:
+ * @font: #hb_font_t to work upon
+ *
+ * Configures the font-functions structure of the specified
+ * #hb_font_t font object to use CoreText font functions.
+ *
+ * In particular, you can use this function to configure an
+ * existing #hb_face_t face object for use with CoreText font
+ * functions even if that #hb_face_t face object was initially
+ * created with hb_face_create(), and therefore was not
+ * initially configured to use CoreText font functions.
+ *
+ * An #hb_font_t object created with hb_coretext_font_create()
+ * is preconfigured for CoreText font functions and does not
+ * require this function to be used.
+ *
+ * <note>Note: Internally, this function creates a CTFont.
+* </note>
+ *
+ * Since: 10.1.0
+ **/
+void
+hb_coretext_font_set_funcs (hb_font_t *font)
+{
+  CTFontRef ct_font = hb_coretext_font_get_ct_font (font);
+  if (unlikely (!ct_font))
+    return;
+
+  hb_font_set_funcs (font,
+		     _hb_coretext_get_font_funcs (),
+		     (void *) CFRetain (ct_font),
+		     _hb_coretext_font_destroy);
+}
+
+#undef MAX_GLYPHS
+
+#endif

+ 69 - 2
thirdparty/harfbuzz/src/hb-coretext.cc → thirdparty/harfbuzz/src/hb-coretext-shape.cc

@@ -335,7 +335,7 @@ _hb_coretext_shaper_face_data_destroy (hb_coretext_face_data_t *data)
  * Creates an #hb_face_t face object from the specified
  * CGFontRef.
  *
- * Return value: the new #hb_face_t face object
+ * Return value: (transfer full): The new face object
  *
  * Since: 0.9.10
  */
@@ -347,6 +347,65 @@ hb_coretext_face_create (CGFontRef cg_font)
   return face;
 }
 
+/**
+ * hb_coretext_face_create_from_file_or_fail:
+ * @file_name: A font filename
+ * @index: The index of the face within the file
+ *
+ * Creates an #hb_face_t face object from the specified
+ * font file and face index.
+ *
+ * This is similar in functionality to hb_face_create_from_file_or_fail(),
+ * but uses the CoreText library for loading the font file.
+ *
+ * Return value: (transfer full): The new face object, or `NULL` if
+ * no face is found at the specified index or the file cannot be read.
+ *
+ * Since: 10.1.0
+ */
+hb_face_t *
+hb_coretext_face_create_from_file_or_fail (const char   *file_name,
+					   unsigned int  index)
+{
+  auto url = CFURLCreateFromFileSystemRepresentation (nullptr,
+						      (const UInt8 *) file_name,
+						      strlen (file_name),
+						      false);
+  if (unlikely (!url))
+    return nullptr;
+
+  auto ct_font_desc_array = CTFontManagerCreateFontDescriptorsFromURL (url);
+  if (unlikely (!ct_font_desc_array))
+  {
+    CFRelease (url);
+    return nullptr;
+  }
+  auto ct_font_desc = (CFArrayGetCount (ct_font_desc_array) > index) ?
+		      (CTFontDescriptorRef) CFArrayGetValueAtIndex (ct_font_desc_array, index) : nullptr;
+  if (unlikely (!ct_font_desc))
+  {
+	  CFRelease (ct_font_desc_array);
+	  CFRelease (url);
+	  return nullptr;
+  }
+  CFRelease (url);
+  auto ct_font = ct_font_desc ? CTFontCreateWithFontDescriptor (ct_font_desc, 0, nullptr) : nullptr;
+  CFRelease (ct_font_desc_array);
+  if (unlikely (!ct_font))
+    return nullptr;
+
+  auto cg_font = ct_font ? CTFontCopyGraphicsFont (ct_font, nullptr) : nullptr;
+  CFRelease (ct_font);
+  if (unlikely (!cg_font))
+    return nullptr;
+
+  hb_face_t *face = hb_coretext_face_create (cg_font);
+  if (unlikely (hb_face_is_immutable (face)))
+    return nullptr;
+
+  return face;
+}
+
 /**
  * hb_coretext_face_get_cg_font:
  * @face: The #hb_face_t to work upon
@@ -439,7 +498,12 @@ _hb_coretext_shaper_font_data_destroy (hb_coretext_font_data_t *data)
  * Creates an #hb_font_t font object from the specified
  * CTFontRef.
  *
- * Return value: the new #hb_font_t font object
+ * The created font uses the default font functions implemented
+ * navitely by HarfBuzz. If you want to use the CoreText font functions
+ * instead (rarely needed), you can do so by calling
+ * by hb_coretext_font_set_funcs().
+ *
+ * Return value: (transfer full): The new font object
  *
  * Since: 1.7.2
  **/
@@ -460,6 +524,9 @@ hb_coretext_font_create (CTFontRef ct_font)
   /* Let there be dragons here... */
   font->data.coretext.cmpexch (nullptr, (hb_coretext_font_data_t *) CFRetain (ct_font));
 
+  // https://github.com/harfbuzz/harfbuzz/pull/4895#issuecomment-2408471254
+  //hb_coretext_font_set_funcs (font);
+
   return font;
 }
 

+ 12 - 5
thirdparty/harfbuzz/src/hb-coretext.h

@@ -44,9 +44,9 @@ HB_BEGIN_DECLS
  * HB_CORETEXT_TAG_MORT:
  *
  * The #hb_tag_t tag for the `mort` (glyph metamorphosis) table,
- * which holds AAT features. 
+ * which holds AAT features.
  *
- * For more information, see 
+ * For more information, see
  * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html
  *
  **/
@@ -56,7 +56,7 @@ HB_BEGIN_DECLS
  * HB_CORETEXT_TAG_MORX:
  *
  * The #hb_tag_t tag for the `morx` (extended glyph metamorphosis)
- * table, which holds AAT features. 
+ * table, which holds AAT features.
  *
  * For more information, see
  * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html
@@ -68,9 +68,9 @@ HB_BEGIN_DECLS
  * HB_CORETEXT_TAG_KERX:
  *
  * The #hb_tag_t tag for the `kerx` (extended kerning) table, which
- * holds AAT kerning information. 
+ * holds AAT kerning information.
  *
- * For more information, see 
+ * For more information, see
  * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kerx.html
  *
  **/
@@ -80,6 +80,10 @@ HB_BEGIN_DECLS
 HB_EXTERN hb_face_t *
 hb_coretext_face_create (CGFontRef cg_font);
 
+HB_EXTERN hb_face_t *
+hb_coretext_face_create_from_file_or_fail (const char   *file_name,
+					   unsigned int  index);
+
 HB_EXTERN hb_font_t *
 hb_coretext_font_create (CTFontRef ct_font);
 
@@ -90,6 +94,9 @@ hb_coretext_face_get_cg_font (hb_face_t *face);
 HB_EXTERN CTFontRef
 hb_coretext_font_get_ct_font (hb_font_t *font);
 
+HB_EXTERN void
+hb_coretext_font_set_funcs (hb_font_t *font);
+
 
 HB_END_DECLS
 

+ 1 - 1
thirdparty/harfbuzz/src/hb-draw.h

@@ -70,7 +70,7 @@ typedef struct hb_draw_state_t {
  *
  * The default #hb_draw_state_t at the start of glyph drawing.
  */
-#define HB_DRAW_STATE_DEFAULT {0, 0.f, 0.f, 0.f, 0.f, {0.}, {0.}, {0.}}
+#define HB_DRAW_STATE_DEFAULT {0, 0.f, 0.f, 0.f, 0.f, {0.}, {0.}, {0.}, {0.}, {0.}, {0.}, {0.}}
 
 
 /**

+ 55 - 0
thirdparty/harfbuzz/src/hb-face.cc

@@ -263,6 +263,61 @@ hb_face_create (hb_blob_t    *blob,
   return face;
 }
 
+/**
+ * hb_face_create_or_fail:
+ * @blob: #hb_blob_t to work upon
+ * @index: The index of the face within @blob
+ *
+ * Like hb_face_create(), but returns `NULL` if the blob data
+ * contains no usable font face at the specified index.
+ *
+ * Return value: (transfer full): The new face object, or `NULL` if
+ * no face is found at the specified index.
+ *
+ * Since: 10.1.0
+ **/
+hb_face_t *
+hb_face_create_or_fail (hb_blob_t    *blob,
+			unsigned int  index)
+{
+  unsigned num_faces = hb_face_count (blob);
+  if (index >= num_faces)
+    return nullptr;
+
+  hb_face_t *face = hb_face_create (blob, index);
+  if (hb_object_is_immutable (face))
+    return nullptr;
+
+  return face;
+}
+
+/**
+ * hb_face_create_from_file_or_fail:
+ * @file_name: A font filename
+ * @index: The index of the face within the file
+ *
+ * A thin wrapper around hb_blob_create_from_file_or_fail()
+ * followed by hb_face_create_or_fail().
+ *
+ * Return value: (transfer full): The new face object, or `NULL` if
+ * no face is found at the specified index or the file cannot be read.
+ *
+ * Since: 10.1.0
+ **/
+HB_EXTERN hb_face_t *
+hb_face_create_from_file_or_fail (const char   *file_name,
+				  unsigned int  index)
+{
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (file_name);
+  if (unlikely (!blob))
+    return nullptr;
+
+  hb_face_t *face = hb_face_create_or_fail (blob, index);
+  hb_blob_destroy (blob);
+
+  return face;
+}
+
 /**
  * hb_face_get_empty:
  *

+ 8 - 0
thirdparty/harfbuzz/src/hb-face.h

@@ -59,6 +59,14 @@ HB_EXTERN hb_face_t *
 hb_face_create (hb_blob_t    *blob,
 		unsigned int  index);
 
+HB_EXTERN hb_face_t *
+hb_face_create_or_fail (hb_blob_t    *blob,
+			unsigned int  index);
+
+HB_EXTERN hb_face_t *
+hb_face_create_from_file_or_fail (const char   *file_name,
+				  unsigned int  index);
+
 /**
  * hb_reference_table_func_t:
  * @face: an #hb_face_t to reference table for

+ 1 - 1
thirdparty/harfbuzz/src/hb-font.cc

@@ -231,7 +231,7 @@ hb_font_get_glyph_v_advance_nil (hb_font_t      *font,
 				 void           *user_data HB_UNUSED)
 {
   /* TODO use font_extents.ascender+descender */
-  return font->y_scale;
+  return -font->y_scale;
 }
 
 static hb_position_t

+ 112 - 13
thirdparty/harfbuzz/src/hb-ft.cc

@@ -41,6 +41,7 @@
 #include "hb-ot-shaper-arabic-pua.hh"
 #include "hb-paint.hh"
 
+#include FT_MODULE_H
 #include FT_ADVANCES_H
 #include FT_MULTIPLE_MASTERS_H
 #include FT_OUTLINE_H
@@ -1432,6 +1433,24 @@ hb_ft_font_create_referenced (FT_Face ft_face)
   return hb_ft_font_create (ft_face, _hb_ft_face_destroy);
 }
 
+
+static void * _hb_ft_alloc (FT_Memory memory, long size)
+{ return hb_malloc (size); }
+
+static void _hb_ft_free (FT_Memory memory, void *block)
+{ hb_free (block); }
+
+static void * _hb_ft_realloc (FT_Memory memory, long cur_size, long new_size, void *block)
+{ return hb_realloc (block, new_size); }
+
+static FT_MemoryRec_ m =
+{
+  nullptr,
+  _hb_ft_alloc,
+  _hb_ft_free,
+  _hb_ft_realloc
+};
+
 static inline void free_static_ft_library ();
 
 static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>,
@@ -1440,16 +1459,19 @@ static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<F
   static FT_Library create ()
   {
     FT_Library l;
-    if (FT_Init_FreeType (&l))
+    if (FT_New_Library (&m, &l))
       return nullptr;
 
+    FT_Add_Default_Modules (l);
+    FT_Set_Default_Properties (l);
+
     hb_atexit (free_static_ft_library);
 
     return l;
   }
   static void destroy (FT_Library l)
   {
-    FT_Done_FreeType (l);
+    FT_Done_Library (l);
   }
   static FT_Library get_null ()
   {
@@ -1464,9 +1486,76 @@ void free_static_ft_library ()
 }
 
 static FT_Library
-get_ft_library ()
+reference_ft_library ()
+{
+  FT_Library l = static_ft_library.get_unconst ();
+  if (unlikely (FT_Reference_Library (l)))
+  {
+    DEBUG_MSG (FT, l, "FT_Reference_Library() failed");
+    return nullptr;
+  }
+  return l;
+}
+
+static hb_user_data_key_t ft_library_key = {0};
+
+static void
+finalize_ft_library (void *arg)
+{
+  FT_Face ft_face = (FT_Face) arg;
+  FT_Done_Library ((FT_Library) ft_face->generic.data);
+}
+
+static void
+destroy_ft_library (void *arg)
+{
+  FT_Done_Library ((FT_Library) arg);
+}
+
+/**
+ * hb_ft_face_create_from_file_or_fail:
+ * @file_name: A font filename
+ * @index: The index of the face within the file
+ *
+ * Creates an #hb_face_t face object from the specified
+ * font file and face index.
+ *
+ * This is similar in functionality to hb_face_create_from_file_or_fail(),
+ * but uses the FreeType library for loading the font file.
+ *
+ * Return value: (transfer full): The new face object, or `NULL` if
+ * no face is found at the specified index or the file cannot be read.
+ *
+ * Since: 10.1.0
+ */
+hb_face_t *
+hb_ft_face_create_from_file_or_fail (const char   *file_name,
+				     unsigned int  index)
 {
-  return static_ft_library.get_unconst ();
+  FT_Library ft_library = reference_ft_library ();
+  if (unlikely (!ft_library))
+  {
+    DEBUG_MSG (FT, ft_library, "reference_ft_library failed");
+    return nullptr;
+  }
+
+  FT_Face ft_face;
+  if (unlikely (FT_New_Face (ft_library,
+			     file_name,
+			     index,
+			     &ft_face)))
+    return nullptr;
+
+  hb_face_t *face = hb_ft_face_create_referenced (ft_face);
+  FT_Done_Face (ft_face);
+
+  ft_face->generic.data = ft_library;
+  ft_face->generic.finalizer = finalize_ft_library;
+
+  if (hb_face_is_immutable (face))
+    return nullptr;
+
+  return face;
 }
 
 static void
@@ -1511,26 +1600,36 @@ hb_ft_font_set_funcs (hb_font_t *font)
   if (unlikely (!blob_length))
     DEBUG_MSG (FT, font, "Font face has empty blob");
 
-  FT_Face ft_face = nullptr;
-  FT_Error err = FT_New_Memory_Face (get_ft_library (),
-				     (const FT_Byte *) blob_data,
-				     blob_length,
-				     hb_face_get_index (font->face),
-				     &ft_face);
+  FT_Library ft_library = reference_ft_library ();
+  if (unlikely (!ft_library))
+  {
+    hb_blob_destroy (blob);
+    DEBUG_MSG (FT, font, "reference_ft_library failed");
+    return;
+  }
 
-  if (unlikely (err)) {
+  FT_Face ft_face = nullptr;
+  if (unlikely (FT_New_Memory_Face (ft_library,
+				    (const FT_Byte *) blob_data,
+				    blob_length,
+				    hb_face_get_index (font->face),
+				    &ft_face)))
+  {
     hb_blob_destroy (blob);
-    DEBUG_MSG (FT, font, "Font face FT_New_Memory_Face() failed");
+    DEBUG_MSG (FT, font, "FT_New_Memory_Face() failed");
     return;
   }
 
   if (FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL))
     FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
 
-
+  // Hook the blob to the FT_Face
   ft_face->generic.data = blob;
   ft_face->generic.finalizer = _release_blob;
 
+  // And the FT_Library to the blob
+  hb_blob_set_user_data (blob, &ft_library_key, ft_library, destroy_ft_library, true);
+
   _hb_ft_font_set_funcs (font, ft_face, true);
   hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
 

+ 3 - 0
thirdparty/harfbuzz/src/hb-ft.h

@@ -84,6 +84,9 @@ hb_ft_face_create_cached (FT_Face ft_face);
 HB_EXTERN hb_face_t *
 hb_ft_face_create_referenced (FT_Face ft_face);
 
+HB_EXTERN hb_face_t *
+hb_ft_face_create_from_file_or_fail (const char   *file_name,
+				     unsigned int  index);
 
 /*
  * hb-font from ft-face.

+ 5 - 3
thirdparty/harfbuzz/src/hb-icu.cc

@@ -31,6 +31,11 @@
 
 #ifdef HAVE_ICU
 
+#pragma GCC diagnostic push
+
+// https://github.com/harfbuzz/harfbuzz/issues/4915
+#pragma GCC diagnostic ignored "-Wredundant-decls"
+
 #include "hb-icu.h"
 
 #include "hb-machinery.hh"
@@ -44,7 +49,6 @@
 /* ICU extra semicolon, fixed since 65, https://github.com/unicode-org/icu/commit/480bec3 */
 #if U_ICU_VERSION_MAJOR_NUM < 65 && (defined(__GNUC__) || defined(__clang__))
 #define HB_ICU_EXTRA_SEMI_IGNORED
-#pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wextra-semi-stmt"
 #endif
 
@@ -284,8 +288,6 @@ hb_icu_get_unicode_funcs ()
   return static_icu_funcs.get_unconst ();
 }
 
-#ifdef HB_ICU_EXTRA_SEMI_IGNORED
 #pragma GCC diagnostic pop
-#endif
 
 #endif

+ 1 - 1
thirdparty/harfbuzz/src/hb-limits.hh

@@ -101,7 +101,7 @@
 #endif
 
 #ifndef HB_CFF_MAX_OPS
-#define HB_CFF_MAX_OPS 10000
+#define HB_CFF_MAX_OPS 200000
 #endif
 
 #ifndef HB_MAX_COMPOSITE_OPERATIONS_PER_GLYPH

+ 1 - 1
thirdparty/harfbuzz/src/hb-map.hh

@@ -307,7 +307,7 @@ struct hb_hashmap_t
   const V& get_with_hash (const K &key, uint32_t hash) const
   {
     if (!items) return item_t::default_value ();
-    auto *item = fetch_item (key, hb_hash (key));
+    auto *item = fetch_item (key, hash);
     if (item)
       return item->value;
     return item_t::default_value ();

+ 1 - 1
thirdparty/harfbuzz/src/hb-ms-feature-ranges.hh

@@ -30,7 +30,7 @@
 
 #include "hb.hh"
 
-/* Variations of this code exist in hb-coretext.cc as well
+/* Variations of this code exist in hb-coretext-shape.cc as well
  * as hb-aat-map.cc... */
 
 typedef struct hb_ms_feature_t {

+ 3 - 1
thirdparty/harfbuzz/src/hb-ot-font.cc

@@ -642,7 +642,9 @@ _hb_ot_get_font_funcs ()
  * hb_ot_font_set_funcs:
  * @font: #hb_font_t to work upon
  *
- * Sets the font functions to use when working with @font. 
+ * Sets the font functions to use when working with @font to
+ * the HarfBuzz's native implementation. This is the default
+ * for fonts newly created.
  *
  * Since: 0.9.28
  **/

+ 2 - 2
thirdparty/harfbuzz/src/hb-ot-layout-common.hh

@@ -3714,11 +3714,11 @@ struct DeltaSetIndexMap
 
 struct ItemVarStoreInstancer
 {
-  ItemVarStoreInstancer (const ItemVariationStore *varStore,
+  ItemVarStoreInstancer (const ItemVariationStore *varStore_,
 			 const DeltaSetIndexMap *varIdxMap,
 			 hb_array_t<const int> coords,
 			 VarRegionList::cache_t *cache = nullptr) :
-    varStore (varStore), varIdxMap (varIdxMap), coords (coords), cache (cache)
+    varStore (varStore_), varIdxMap (varIdxMap), coords (coords), cache (cache)
   {
     if (!varStore)
       varStore = &Null(ItemVariationStore);

+ 31 - 4
thirdparty/harfbuzz/src/hb-ot-layout.hh

@@ -173,7 +173,7 @@ _hb_next_syllable (hb_buffer_t *buffer, unsigned int start)
 
 /* Design:
  * unicode_props() is a two-byte number.  The low byte includes:
- * - Extended General_Category: 5 bits.
+ * - Modified General_Category: 5 bits.
  * - A bit each for:
  *   * Is it Default_Ignorable(); we have a modified Default_Ignorable().
  *   * Whether it's one of the four Mongolian Free Variation Selectors,
@@ -186,17 +186,23 @@ _hb_next_syllable (hb_buffer_t *buffer, unsigned int start)
  * - For Cf: whether it's ZWJ, ZWNJ, or something else.
  * - For Ws: index of which space character this is, if space fallback
  *   is needed, ie. we don't set this by default, only if asked to.
+ *
+ * Above I said "modified" General_Category. This is because we need to
+ * remember Variation Selectors, and we don't have bits left. So we
+ * change their Gen_Cat from Mn to Cf, and use a bit of the high byte to
+ * remember them.
  */
 
 enum hb_unicode_props_flags_t {
   UPROPS_MASK_GEN_CAT	= 0x001Fu,
   UPROPS_MASK_IGNORABLE	= 0x0020u,
-  UPROPS_MASK_HIDDEN	= 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..4, or TAG characters */
+  UPROPS_MASK_HIDDEN	= 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..4, or TAG characters, or CGJ sometimes */
   UPROPS_MASK_CONTINUATION=0x0080u,
 
   /* If GEN_CAT=FORMAT, top byte masks: */
   UPROPS_MASK_Cf_ZWJ	= 0x0100u,
-  UPROPS_MASK_Cf_ZWNJ	= 0x0200u
+  UPROPS_MASK_Cf_ZWNJ	= 0x0200u,
+  UPROPS_MASK_Cf_VS	= 0x0400u
 };
 HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
 
@@ -229,7 +235,7 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
       /* TAG characters need similar treatment. Fixes:
        * https://github.com/harfbuzz/harfbuzz/issues/463 */
       else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
-      /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
+      /* COMBINING GRAPHEME JOINER should not be skipped during GSUB either.
        * https://github.com/harfbuzz/harfbuzz/issues/554 */
       else if (unlikely (u == 0x034Fu))
       {
@@ -302,6 +308,27 @@ _hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
 	 (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
 	 hb_unicode_funcs_t::NOT_SPACE;
 }
+static inline bool
+_hb_glyph_info_is_variation_selector (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_get_general_category (info) ==
+	 HB_UNICODE_GENERAL_CATEGORY_FORMAT &&
+	 (info->unicode_props() & UPROPS_MASK_Cf_VS);
+}
+static inline void
+_hb_glyph_info_set_variation_selector (hb_glyph_info_t *info, bool customize)
+{
+  if (customize)
+  {
+    _hb_glyph_info_set_general_category (info, HB_UNICODE_GENERAL_CATEGORY_FORMAT);
+    info->unicode_props() |= UPROPS_MASK_Cf_VS;
+  }
+  else
+  {
+    // Reset to their original condition
+    _hb_glyph_info_set_general_category (info, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK);
+  }
+}
 
 static inline bool _hb_glyph_info_substituted (const hb_glyph_info_t *info);
 

+ 1 - 2
thirdparty/harfbuzz/src/hb-ot-shape-normalize.cc

@@ -222,8 +222,7 @@ handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c,
 	(void) buffer->next_glyph ();
 
         buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_VARIATION_SELECTOR_FALLBACK;
-	_hb_glyph_info_set_general_category (&buffer->cur(),
-					     _HB_UNICODE_GENERAL_CATEGORY_VARIATION_SELECTOR);
+	_hb_glyph_info_set_variation_selector (&buffer->cur(), true);
 	if (buffer->not_found_variation_selector != HB_CODEPOINT_INVALID)
 	  _hb_glyph_info_clear_default_ignorable (&buffer->cur());
 

+ 2 - 3
thirdparty/harfbuzz/src/hb-ot-shape.cc

@@ -850,12 +850,11 @@ hb_ot_deal_with_variation_selectors (hb_buffer_t *buffer)
 
   for (unsigned int i = 0; i < count; i++)
   {
-    if (_hb_glyph_info_get_general_category (&info[i]) ==
-	_HB_UNICODE_GENERAL_CATEGORY_VARIATION_SELECTOR)
+    if (_hb_glyph_info_is_variation_selector (&info[i]))
     {
       info[i].codepoint = buffer->not_found_variation_selector;
       pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0;
-      _hb_glyph_info_set_general_category (&info[i], HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK);
+      _hb_glyph_info_set_variation_selector (&info[i], false);
     }
   }
 }

File diff suppressed because it is too large
+ 507 - 499
thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh


+ 148 - 145
thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh

@@ -67,6 +67,7 @@
 #define N	USE(N)	/* BASE_NUM */
 #define O	USE(O)	/* OTHER */
 #define R	USE(R)	/* REPHA */
+#define RK	USE(RK)	/* REORDERING_KILLER */
 #define SB	USE(SB)	/* HIEROGLYPH_SEGMENT_BEGIN */
 #define SE	USE(SE)	/* HIEROGLYPH_SEGMENT_END */
 #define SUB	USE(SUB)	/* CONS_SUB */
@@ -101,7 +102,7 @@
 #ifndef HB_OPTIMIZE_SIZE
 
 static const uint8_t
-hb_use_u8[3343] =
+hb_use_u8[3345] =
 {
      16,   50,   51,   51,   51,   52,   51,   83,  118,  131,   57,   58,   59,  195,  211,   62,
      51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
@@ -201,89 +202,89 @@ hb_use_u8[3343] =
       2,    2,    2,  107,   22,   20,   20,   22,   48,   48,   22,  108,    2,    2,    2,    9,
       0,    0,    0,    0,    0,    0,  109,  110,  110,  110,  110,    0,    0,    0,    0,    0,
       0,  106,   74,    2,    2,    2,    2,    2,    2,   60,   61,   59,   25,   22,  111,   61,
-      2,    2,    2,    2,  107,   22,   23,   45,   45,  102,   14,    0,    0,    0,    0,    0,
-      0,    2,    2,   61,   18,   48,   23,  112,  102,  102,  102,  113,  114,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    0,   30,    2,   11,   46,  115,  115,  115,   11,  115,
-    115,   15,  115,  115,  115,   26,    0,   40,    0,    0,    0,  116,   51,   11,    5,    0,
-      0,    0,    0,    0,    0,    0,  117,    0,    0,    0,    0,    0,    0,    0,    6,  118,
-    119,   42,   42,    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  119,  119,
-    120,  119,  119,  119,  119,  119,  119,  119,  119,    0,    0,  121,    0,    0,    0,    0,
-      0,    0,    7,  121,    0,    0,    0,    0,    0,   46,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,  122,  122,    0,    0,
+      2,    2,    2,    2,  107,   22,   23,   45,   45,  102,  112,    0,    0,    0,    0,    0,
+      0,    2,    2,   61,   18,   48,   23,  113,  102,  102,  102,  114,  115,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    0,   30,    2,   11,   46,  116,  116,  116,   11,  116,
+    116,   15,  116,  116,  116,   26,    0,   40,    0,    0,    0,  117,   51,   11,    5,    0,
+      0,    0,    0,    0,    0,    0,  118,    0,    0,    0,    0,    0,    0,    0,    6,  119,
+    120,   42,   42,    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  120,  120,
+    121,  120,  120,  120,  120,  120,  120,  120,  120,    0,    0,  122,    0,    0,    0,    0,
+      0,    0,    7,  122,    0,    0,    0,    0,    0,   46,    0,    0,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,  123,  123,    0,    0,
       0,    2,    2,    2,    2,    0,    0,    0,   30,    0,    0,    0,    0,    0,    0,    0,
-    123,    0,  122,  122,    0,    0,    0,    0,    0,    2,   53,    2,  108,    2,   10,    2,
+    124,    0,  123,  123,    0,    0,    0,    0,    0,    2,   53,    2,  108,    2,   10,    2,
       2,    2,   65,   19,   16,    0,    0,   31,    0,    2,    2,    0,    0,    0,    0,    0,
-      0,   29,    2,    2,    2,    2,    2,    2,    2,    2,    2,  124,   23,   23,   23,   23,
-     23,   23,   23,  125,    0,    0,    0,    0,    0,   11,   11,   11,   11,   11,   11,   11,
-     11,   11,    2,    0,    0,    0,    0,    0,   52,    2,    2,    2,   22,   22,  126,  115,
-      0,    2,    2,    2,  127,   20,   59,   20,  112,  102,  128,    0,    0,    0,    0,    0,
-      0,   11,  129,    2,    2,    2,    2,    2,    2,    2,  130,   23,   22,   20,   48,  131,
-    132,  133,    0,    0,    0,    0,    0,    0,    0,    2,    2,   52,   30,    2,    2,    2,
-      2,    2,    2,    2,    2,   10,   22,   59,   99,   76,  134,  135,  136,    0,    0,    0,
-      0,    2,  137,    2,    2,    2,    2,  138,    0,   30,    2,   42,    5,    0,   79,   15,
-      2,   53,   22,  139,   52,   53,    2,    2,  105,   10,    9,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,  140,   21,   25,    0,    0,  141,  142,    0,    0,    0,
-      0,    2,   65,   45,   23,   80,   47,  143,    0,   81,   81,   81,   81,   81,   81,   81,
-     81,    0,    0,    0,    0,    0,    0,    0,    6,  119,  119,  119,  119,  120,    0,    0,
+      0,   29,    2,    2,    2,    2,    2,    2,    2,    2,    2,  125,   23,   23,   23,   23,
+     23,   23,   23,  126,    0,    0,    0,    0,    0,   11,   11,   11,   11,   11,   11,   11,
+     11,   11,    2,    0,    0,    0,    0,    0,   52,    2,    2,    2,   22,   22,  127,  116,
+      0,    2,    2,    2,  128,   20,   59,   20,  113,  102,  129,    0,    0,    0,    0,    0,
+      0,   11,  130,    2,    2,    2,    2,    2,    2,    2,  131,   23,   22,   20,   48,  132,
+    133,  134,    0,    0,    0,    0,    0,    0,    0,    2,    2,   52,   30,    2,    2,    2,
+      2,    2,    2,    2,    2,   10,   22,   59,   99,   76,  135,  136,  137,    0,    0,    0,
+      0,    2,  138,    2,    2,    2,    2,  139,    0,   30,    2,   42,    5,    0,   79,   15,
+      2,   53,   22,  140,   52,   53,    2,    2,  105,   10,    9,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,  141,   21,   25,    0,    0,  142,  143,    0,    0,    0,
+      0,    2,   65,   45,   23,   80,   47,  144,    0,   81,   81,   81,   81,   81,   81,   81,
+     81,    0,    0,    0,    0,    0,    0,    0,    6,  120,  120,  120,  120,  121,    0,    0,
       0,    2,    2,    2,    2,    2,    9,    2,    2,    2,    9,    2,   30,    2,    2,    2,
-      2,    2,   30,    2,    2,    2,   30,    9,    0,  127,   20,   27,   31,    0,    0,  144,
-    145,    2,    2,   30,    2,   30,    2,    2,    2,    2,    2,    2,    0,   14,   37,    0,
-    146,    2,    2,   13,   37,    0,   30,    2,    2,    2,    0,    0,    0,    0,    0,    0,
+      2,    2,   30,    2,    2,    2,   30,    9,    0,  128,   20,   27,   31,    0,    0,  145,
+    146,    2,    2,   30,    2,   30,    2,    2,    2,    2,    2,    2,    0,   14,   37,    0,
+    147,    2,    2,   13,   37,    0,   30,    2,    2,    2,    0,    0,    0,    0,    0,    0,
       0,    0,    0,    0,    0,   30,    2,    2,    9,    2,    2,   11,   41,    0,    0,    0,
       0,    2,    2,    2,    0,   27,   22,   22,   30,    2,    2,    2,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,   27,   38,    0,    2,    2,    2,  115,  115,  115,  115,
-    115,  147,    2,    9,    0,    0,    0,    0,    0,    2,   14,   14,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,   27,   38,    0,    2,    2,    2,  116,  116,  116,  116,
+    116,  148,    2,    9,    0,    0,    0,    0,    0,    2,   14,   14,    0,    0,    0,    0,
       0,    9,    2,    2,    9,    2,    2,    2,    2,   30,    2,    9,    0,   30,    2,    0,
-      0,  148,  149,  150,    2,    2,    2,    2,    2,    2,    2,    2,    2,   22,   22,   20,
-     20,   20,   22,   22,  133,    0,    0,    0,    0,    0,  151,  151,  151,  151,  151,  151,
-    151,  151,  151,  151,    2,    2,    2,    2,    2,   53,   52,   53,    0,    0,    0,    0,
-    152,   11,   74,    2,    2,    2,    2,    2,    2,   18,   19,   21,   16,   24,   37,    0,
+      0,  149,  150,  151,    2,    2,    2,    2,    2,    2,    2,    2,    2,   22,   22,   20,
+     20,   20,   22,   22,  134,    0,    0,    0,    0,    0,  152,  152,  152,  152,  152,  152,
+    152,  152,  152,  152,    2,    2,    2,    2,    2,   53,   52,   53,    0,    0,    0,    0,
+    153,   11,   74,    2,    2,    2,    2,    2,    2,   18,   19,   21,   16,   24,   37,    0,
       0,    0,   31,    0,    0,    0,    0,    0,    0,   11,   49,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,  127,   20,   22,  153,   22,   21,  154,  155,    2,    2,    2,    2,
-      2,    0,    0,   65,  156,    0,    0,    0,    0,    2,   13,    0,    0,    0,    0,    0,
-      0,    2,   65,   25,   20,   20,   20,   22,   22,  108,  157,    0,    0,   56,  158,   31,
-    159,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   23,
-     19,   22,   22,  160,   44,    0,    0,    0,   49,  127,    0,    0,    0,    0,    0,    0,
+      2,    2,    2,    2,  128,   20,   22,  154,   22,   21,  155,  156,    2,    2,    2,    2,
+      2,    0,    0,   65,  157,    0,    0,    0,    0,    2,   13,    0,    0,    0,    0,    0,
+      0,    2,   65,   25,   20,   20,   20,   22,   22,  108,  158,    0,    0,   56,  159,   31,
+    160,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   23,
+     19,   22,   22,  161,   44,    0,    0,    0,   49,  128,    0,    0,    0,    0,    0,    0,
       0,    2,    2,    2,    9,    9,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,
-     30,    2,    2,    2,    2,    2,    2,    2,   10,   18,   19,   21,   22,  161,   31,    0,
+     30,    2,    2,    2,    2,    2,    2,    2,   10,   18,   19,   21,   22,  162,   31,    0,
       0,   11,   11,   30,    2,    2,    2,    9,   30,    9,    2,   30,    2,    2,   58,   17,
      23,   16,   23,   47,   32,   33,   32,   34,    0,    0,    0,    0,   35,    0,    0,    0,
       2,    2,   23,    0,   11,   11,   11,   46,    0,   11,   11,   46,    0,    0,    0,    0,
       0,    2,    2,    2,    2,    2,   30,    0,    9,    2,    2,    2,   30,   45,   59,   20,
-     20,   31,   33,   32,   32,   25,  162,   29,  163,  164,   37,    0,    0,    0,    0,    0,
+     20,   31,   33,   32,   32,   25,  163,   29,  164,  165,   37,    0,    0,    0,    0,    0,
       0,   12,   26,    0,    0,    0,    0,    0,    0,    2,    2,   65,   25,   20,   20,   20,
-     22,   23,  125,   15,   17,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,    0,
-    165,  166,    0,    0,    0,    0,    0,    0,    0,   18,   19,   20,   20,   66,   99,   25,
-    159,   11,  167,    9,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-     65,   25,   20,   20,    0,   48,   48,   11,  168,   37,    0,    0,    0,    0,    0,    0,
+     22,   23,  126,   15,   17,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,    0,
+    166,  167,    0,    0,    0,    0,    0,    0,    0,   18,   19,   20,   20,   66,   99,   25,
+    160,   11,  168,    9,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,
+     65,   25,   20,   20,    0,   48,   48,   11,  169,   37,    0,    0,    0,    0,    0,    0,
       0,    0,    0,    0,    0,    2,    2,   20,    0,   23,   19,   20,   20,   21,   16,   82,
-    168,   38,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   10,  169,
-     25,   20,   22,   22,  167,    9,    0,    0,    0,    2,    2,    2,    2,    2,    9,   43,
-    135,   23,   22,   20,   76,   21,   22,    0,    0,    2,    2,    2,    9,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,   18,   19,   20,   21,   22,  105,  168,   37,    0,
+    169,   38,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   10,  170,
+     25,   20,   22,   22,  168,    9,    0,    0,    0,    2,    2,    2,    2,    2,    9,   43,
+    136,   23,   22,   20,   76,   21,   22,    0,    0,    2,    2,    2,    9,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    2,   18,   19,   20,   21,   22,  105,  169,   37,    0,
       0,    2,    2,    2,    9,   30,    0,    2,    2,    2,    2,   30,    9,    2,    2,    2,
-      2,   23,   23,   18,   32,   33,   12,  170,  164,  171,  172,    0,    0,    0,    0,    0,
+      2,   23,   23,   18,   32,   33,   12,  171,  165,  172,  173,    0,    0,    0,    0,    0,
       0,    2,    2,    2,    2,    0,    2,    2,    2,   65,   25,   20,   20,    0,   22,   23,
-     29,  108,    0,   33,    0,    0,    0,    0,    0,   52,   20,   22,   22,   22,  139,    2,
-      2,    2,  173,  174,   11,   15,  175,   61,  176,    0,    0,    1,  146,    0,    0,    0,
-      0,   52,   20,   22,   16,   19,   20,    2,    2,    2,    2,  157,  157,  157,  177,  177,
-    177,  177,  177,  177,   15,  178,    0,   30,    0,   22,   20,   20,   31,   22,   22,   11,
-    168,    0,   61,   61,   61,   61,   61,   61,   61,   66,   21,   82,   46,    0,    0,    0,
+     29,  108,    0,   33,    0,    0,    0,    0,    0,   52,   20,   22,   22,   22,  140,    2,
+      2,    2,  174,  175,   11,   15,  176,   61,  177,    0,    0,    1,  147,    0,    0,    0,
+      0,   52,   20,   22,   16,   19,   20,    2,    2,    2,    2,  158,  158,  158,  178,  178,
+    178,  178,  178,  178,   15,  179,    0,   30,    0,   22,   20,   20,   31,   22,   22,   11,
+    169,    0,   61,   61,   61,   61,   61,   61,   61,   66,   21,   82,   46,    0,    0,    0,
       0,    2,    2,    2,    9,    2,   30,    2,    2,   52,   22,   22,   31,    0,   38,   22,
-     27,   11,  158,  179,  180,    0,    0,    0,    0,    2,    2,    2,   30,    9,    2,    2,
+     27,   11,  159,  180,  181,    0,    0,    0,    0,    2,    2,    2,   30,    9,    2,    2,
       2,    2,    2,    2,    2,    2,   23,   23,   47,   22,   35,   82,   68,    0,    0,    0,
-      0,    2,  181,   66,   47,    0,    0,    0,    0,   11,  182,    2,    2,    2,    2,    2,
-      2,    2,    2,   23,   22,   20,   31,    0,   48,   16,  142,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,  155,    0,    0,  183,  183,  183,  183,  183,  183,  183,
-    183,  184,  184,  184,  185,  186,  184,  183,  183,  187,  183,  183,  188,  189,  189,  189,
-    189,  189,  189,  189,    0,    0,    0,    0,    0,  183,  183,  183,  183,  183,  190,    0,
-      0,    2,    2,    2,    2,    2,    2,    2,   22,   22,   22,   22,   22,   22,  191,  192,
-    193,   11,   11,   11,   46,    0,    0,    0,    0,   29,   74,    2,    2,    2,    2,    2,
+      0,    2,  182,   66,   47,    0,    0,    0,    0,   11,  183,    2,    2,    2,    2,    2,
+      2,    2,    2,   23,   22,   20,   31,    0,   48,   16,  143,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,  156,    0,    0,  184,  184,  184,  184,  184,  184,  184,
+    184,  185,  185,  185,  186,  187,  185,  184,  184,  188,  184,  184,  189,  190,  190,  190,
+    190,  190,  190,  190,    0,    0,    0,    0,    0,  184,  184,  184,  184,  184,  191,    0,
+      0,    2,    2,    2,    2,    2,    2,    2,   22,   22,   22,   22,   22,   22,  192,  193,
+    194,   11,   11,   11,   46,    0,    0,    0,    0,   29,   74,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,   65,   47,    0,    2,    2,    2,    2,    2,    9,    0,
-     58,  194,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
-     20,   20,   20,   20,   20,    0,    0,    0,   40,  115,   26,    0,    0,    0,    0,    0,
+     58,  195,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+     20,   20,   20,   20,   20,    0,    0,    0,   40,  116,   26,    0,    0,    0,    0,    0,
       0,    0,    0,    9,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-     30,    2,    2,    2,    2,    2,    0,   58,   37,    0,    6,  119,  119,  119,  120,    0,
+     30,    2,    2,    2,    2,    2,    0,   58,   37,    0,    6,  120,  120,  120,  121,    0,
       0,   11,   11,   11,   49,    2,    2,    2,    0,    2,    2,    2,    2,    2,    0,    0,
       2,    2,    2,    2,    2,    2,    2,    2,   46,    2,    2,    2,    2,    2,    2,   11,
      11,    2,    2,    2,    2,    2,    2,   22,   22,    2,    2,    2,    2,    2,    2,    2,
@@ -301,17 +302,18 @@ hb_use_u8[3343] =
   FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv,   IS,FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,
   CMAbv,CMAbv,    B,   GB,    B, VAbv,  SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv,
    VPre,    B, MPre, MBlw,  SUB, FAbv, FAbv, MAbv,  SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv,
-   VPst,    H,    B,    O,SMAbv,SMAbv,SMAbv, VPst,   IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,
-  VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,   SE,    O,
-      H, MPst, VPst,    H,VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv,
-   MBlw, MPst, MBlw,    H,    O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,
-      B,    B, VPre,    O,VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,   IS,VMBlw,
-      B,VMPst,VMAbv,VMPst,   CS,   CS,    B,    N,    N,    O,   HN, VPre, VBlw, VAbv,   IS,CMAbv,
-      O, VPst,    B,    R,    R,CMBlw, VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,VMPst,    O,VMAbv,
-  CMBlw,   IS,    R,FMAbv,    B,   CS,   CS,    H,CMBlw,VMPst,    H,VMPst, VAbv,VMAbv, VPst, MPst,
-      R, MPst,CMBlw,    B,FMBlw, VBlw,VMAbv,   CS,  SUB,  SUB,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,
-     IS,    R, MBlw,   GB, VAbv,    R,VMPst,    G,    G,    J,    J,    J,   SB,   SE,    J,   HR,
-      G,    G,   HM,   HM,   HM,    G,    O, MPre, MPre, MPst,VMAbv, MBlw, VBlw,    O, VBlw,
+   VPst,    H,    B,    O,SMAbv,SMAbv,SMAbv, VPst,   IS,   RK,   RK, VBlw, FAbv,VMPre,VMPre,FMAbv,
+  CMBlw,VMBlw,VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,
+     SE,    O,    H, MPst, VPst,    H,VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,
+  CMAbv, VAbv, MBlw, MPst, MBlw,    H,    O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv,
+   FPst, VBlw,    B,    B, VPre,    O,VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,
+     IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,    B,    N,    N,    O,   HN, VPre, VBlw, VAbv,
+     IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw, VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,VMPst,
+      O,VMAbv,CMBlw,   IS,    R,FMAbv,    B,   CS,   CS,    H,CMBlw,VMPst,    H,VMPst, VAbv,VMAbv,
+   VPst, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,VMAbv,   CS,  SUB,  SUB,   GB, FBlw, FBlw,CMAbv,
+     IS, VBlw,   IS,    R, MBlw,   GB, VAbv,    R,VMPst,    G,    G,    J,    J,    J,   SB,   SE,
+      J,   HR,    G,    G,   HM,   HM,   HM,    G,    O, MPre, MPre, MPst,VMAbv, MBlw, VBlw,    O,
+   VBlw,
 };
 static const uint16_t
 hb_use_u16[856] =
@@ -387,7 +389,7 @@ hb_use_get_category (unsigned u)
 #else
 
 static const uint8_t
-hb_use_u8[3655] =
+hb_use_u8[3657] =
 {
      16,   50,   51,   51,   51,   52,   51,   83,  118,  131,   57,   58,   59,  195,  211,   62,
      51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
@@ -507,89 +509,89 @@ hb_use_u8[3655] =
      48,   48,   22,  108,    2,    2,    2,    9,    0,    0,    0,    0,    0,    0,  109,  110,
     110,  110,  110,    0,    0,    0,    0,    0,    0,  106,   74,    2,    2,    2,    2,    2,
       2,   60,   61,   59,   25,   22,  111,   61,    2,    2,    2,    2,  107,   22,   23,   45,
-     45,  102,   14,    0,    0,    0,    0,    0,    0,    2,    2,   61,   18,   48,   23,  112,
-    102,  102,  102,  113,  114,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   30,
-      2,   11,   46,  115,  115,  115,   11,  115,  115,   15,  115,  115,  115,   26,    0,   40,
-      0,    0,    0,  116,   51,   11,    5,    0,    0,    0,    0,    0,    0,    0,  117,    0,
-      0,    0,    0,    0,    0,    0,    6,  118,  119,   42,   42,    5,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,  119,  119,  120,  119,  119,  119,  119,  119,  119,  119,
-    119,    0,    0,  121,    0,    0,    0,    0,    0,    0,    7,  121,    0,    0,    0,    0,
+     45,  102,  112,    0,    0,    0,    0,    0,    0,    2,    2,   61,   18,   48,   23,  113,
+    102,  102,  102,  114,  115,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   30,
+      2,   11,   46,  116,  116,  116,   11,  116,  116,   15,  116,  116,  116,   26,    0,   40,
+      0,    0,    0,  117,   51,   11,    5,    0,    0,    0,    0,    0,    0,    0,  118,    0,
+      0,    0,    0,    0,    0,    0,    6,  119,  120,   42,   42,    5,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,  120,  120,  121,  120,  120,  120,  120,  120,  120,  120,
+    120,    0,    0,  122,    0,    0,    0,    0,    0,    0,    7,  122,    0,    0,    0,    0,
       0,   46,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    9,
-      0,    0,    0,    0,  122,  122,    0,    0,    0,    2,    2,    2,    2,    0,    0,    0,
-     30,    0,    0,    0,    0,    0,    0,    0,  123,    0,  122,  122,    0,    0,    0,    0,
+      0,    0,    0,    0,  123,  123,    0,    0,    0,    2,    2,    2,    2,    0,    0,    0,
+     30,    0,    0,    0,    0,    0,    0,    0,  124,    0,  123,  123,    0,    0,    0,    0,
       0,    2,   53,    2,  108,    2,   10,    2,    2,    2,   65,   19,   16,    0,    0,   31,
       0,    2,    2,    0,    0,    0,    0,    0,    0,   29,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,  124,   23,   23,   23,   23,   23,   23,   23,  125,    0,    0,    0,    0,
+      2,    2,    2,  125,   23,   23,   23,   23,   23,   23,   23,  126,    0,    0,    0,    0,
       0,   11,   11,   11,   11,   11,   11,   11,   11,   11,    2,    0,    0,    0,    0,    0,
-     52,    2,    2,    2,   22,   22,  126,  115,    0,    2,    2,    2,  127,   20,   59,   20,
-    112,  102,  128,    0,    0,    0,    0,    0,    0,   11,  129,    2,    2,    2,    2,    2,
-      2,    2,  130,   23,   22,   20,   48,  131,  132,  133,    0,    0,    0,    0,    0,    0,
+     52,    2,    2,    2,   22,   22,  127,  116,    0,    2,    2,    2,  128,   20,   59,   20,
+    113,  102,  129,    0,    0,    0,    0,    0,    0,   11,  130,    2,    2,    2,    2,    2,
+      2,    2,  131,   23,   22,   20,   48,  132,  133,  134,    0,    0,    0,    0,    0,    0,
       0,    2,    2,   52,   30,    2,    2,    2,    2,    2,    2,    2,    2,   10,   22,   59,
-     99,   76,  134,  135,  136,    0,    0,    0,    0,    2,  137,    2,    2,    2,    2,  138,
-      0,   30,    2,   42,    5,    0,   79,   15,    2,   53,   22,  139,   52,   53,    2,    2,
-    105,   10,    9,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  140,   21,
-     25,    0,    0,  141,  142,    0,    0,    0,    0,    2,   65,   45,   23,   80,   47,  143,
+     99,   76,  135,  136,  137,    0,    0,    0,    0,    2,  138,    2,    2,    2,    2,  139,
+      0,   30,    2,   42,    5,    0,   79,   15,    2,   53,   22,  140,   52,   53,    2,    2,
+    105,   10,    9,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  141,   21,
+     25,    0,    0,  142,  143,    0,    0,    0,    0,    2,   65,   45,   23,   80,   47,  144,
       0,   81,   81,   81,   81,   81,   81,   81,   81,    0,    0,    0,    0,    0,    0,    0,
-      6,  119,  119,  119,  119,  120,    0,    0,    0,    2,    2,    2,    2,    2,    9,    2,
+      6,  120,  120,  120,  120,  121,    0,    0,    0,    2,    2,    2,    2,    2,    9,    2,
       2,    2,    9,    2,   30,    2,    2,    2,    2,    2,   30,    2,    2,    2,   30,    9,
-      0,  127,   20,   27,   31,    0,    0,  144,  145,    2,    2,   30,    2,   30,    2,    2,
-      2,    2,    2,    2,    0,   14,   37,    0,  146,    2,    2,   13,   37,    0,   30,    2,
+      0,  128,   20,   27,   31,    0,    0,  145,  146,    2,    2,   30,    2,   30,    2,    2,
+      2,    2,    2,    2,    0,   14,   37,    0,  147,    2,    2,   13,   37,    0,   30,    2,
       2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   30,    2,    2,
       9,    2,    2,   11,   41,    0,    0,    0,    0,    2,    2,    2,    0,   27,   22,   22,
      30,    2,    2,    2,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   27,   38,
-      0,    2,    2,    2,  115,  115,  115,  115,  115,  147,    2,    9,    0,    0,    0,    0,
+      0,    2,    2,    2,  116,  116,  116,  116,  116,  148,    2,    9,    0,    0,    0,    0,
       0,    2,   14,   14,    0,    0,    0,    0,    0,    9,    2,    2,    9,    2,    2,    2,
-      2,   30,    2,    9,    0,   30,    2,    0,    0,  148,  149,  150,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,   22,   22,   20,   20,   20,   22,   22,  133,    0,    0,    0,
-      0,    0,  151,  151,  151,  151,  151,  151,  151,  151,  151,  151,    2,    2,    2,    2,
-      2,   53,   52,   53,    0,    0,    0,    0,  152,   11,   74,    2,    2,    2,    2,    2,
+      2,   30,    2,    9,    0,   30,    2,    0,    0,  149,  150,  151,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,   22,   22,   20,   20,   20,   22,   22,  134,    0,    0,    0,
+      0,    0,  152,  152,  152,  152,  152,  152,  152,  152,  152,  152,    2,    2,    2,    2,
+      2,   53,   52,   53,    0,    0,    0,    0,  153,   11,   74,    2,    2,    2,    2,    2,
       2,   18,   19,   21,   16,   24,   37,    0,    0,    0,   31,    0,    0,    0,    0,    0,
-      0,   11,   49,    2,    2,    2,    2,    2,    2,    2,    2,    2,  127,   20,   22,  153,
-     22,   21,  154,  155,    2,    2,    2,    2,    2,    0,    0,   65,  156,    0,    0,    0,
+      0,   11,   49,    2,    2,    2,    2,    2,    2,    2,    2,    2,  128,   20,   22,  154,
+     22,   21,  155,  156,    2,    2,    2,    2,    2,    0,    0,   65,  157,    0,    0,    0,
       0,    2,   13,    0,    0,    0,    0,    0,    0,    2,   65,   25,   20,   20,   20,   22,
-     22,  108,  157,    0,    0,   56,  158,   31,  159,   30,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,   23,   19,   22,   22,  160,   44,    0,    0,    0,
-     49,  127,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    9,    9,    2,    2,
+     22,  108,  158,    0,    0,   56,  159,   31,  160,   30,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,   23,   19,   22,   22,  161,   44,    0,    0,    0,
+     49,  128,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    9,    9,    2,    2,
      30,    2,    2,    2,    2,    2,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,
-     10,   18,   19,   21,   22,  161,   31,    0,    0,   11,   11,   30,    2,    2,    2,    9,
+     10,   18,   19,   21,   22,  162,   31,    0,    0,   11,   11,   30,    2,    2,    2,    9,
      30,    9,    2,   30,    2,    2,   58,   17,   23,   16,   23,   47,   32,   33,   32,   34,
       0,    0,    0,    0,   35,    0,    0,    0,    2,    2,   23,    0,   11,   11,   11,   46,
       0,   11,   11,   46,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   30,    0,
-      9,    2,    2,    2,   30,   45,   59,   20,   20,   31,   33,   32,   32,   25,  162,   29,
-    163,  164,   37,    0,    0,    0,    0,    0,    0,   12,   26,    0,    0,    0,    0,    0,
-      0,    2,    2,   65,   25,   20,   20,   20,   22,   23,  125,   15,   17,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    0,    0,  165,  166,    0,    0,    0,    0,    0,    0,
-      0,   18,   19,   20,   20,   66,   99,   25,  159,   11,  167,    9,    0,    0,    0,    0,
+      9,    2,    2,    2,   30,   45,   59,   20,   20,   31,   33,   32,   32,   25,  163,   29,
+    164,  165,   37,    0,    0,    0,    0,    0,    0,   12,   26,    0,    0,    0,    0,    0,
+      0,    2,    2,   65,   25,   20,   20,   20,   22,   23,  126,   15,   17,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    0,    0,  166,  167,    0,    0,    0,    0,    0,    0,
+      0,   18,   19,   20,   20,   66,   99,   25,  160,   11,  168,    9,    0,    0,    0,    0,
       0,    2,    2,    2,    2,    2,    2,    2,   65,   25,   20,   20,    0,   48,   48,   11,
-    168,   37,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2,    2,   20,
-      0,   23,   19,   20,   20,   21,   16,   82,  168,   38,    0,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,   10,  169,   25,   20,   22,   22,  167,    9,    0,    0,
-      0,    2,    2,    2,    2,    2,    9,   43,  135,   23,   22,   20,   76,   21,   22,    0,
+    169,   37,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2,    2,   20,
+      0,   23,   19,   20,   20,   21,   16,   82,  169,   38,    0,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,   10,  170,   25,   20,   22,   22,  168,    9,    0,    0,
+      0,    2,    2,    2,    2,    2,    9,   43,  136,   23,   22,   20,   76,   21,   22,    0,
       0,    2,    2,    2,    9,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,   18,
-     19,   20,   21,   22,  105,  168,   37,    0,    0,    2,    2,    2,    9,   30,    0,    2,
-      2,    2,    2,   30,    9,    2,    2,    2,    2,   23,   23,   18,   32,   33,   12,  170,
-    164,  171,  172,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    0,    2,    2,
+     19,   20,   21,   22,  105,  169,   37,    0,    0,    2,    2,    2,    9,   30,    0,    2,
+      2,    2,    2,   30,    9,    2,    2,    2,    2,   23,   23,   18,   32,   33,   12,  171,
+    165,  172,  173,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    0,    2,    2,
       2,   65,   25,   20,   20,    0,   22,   23,   29,  108,    0,   33,    0,    0,    0,    0,
-      0,   52,   20,   22,   22,   22,  139,    2,    2,    2,  173,  174,   11,   15,  175,   61,
-    176,    0,    0,    1,  146,    0,    0,    0,    0,   52,   20,   22,   16,   19,   20,    2,
-      2,    2,    2,  157,  157,  157,  177,  177,  177,  177,  177,  177,   15,  178,    0,   30,
-      0,   22,   20,   20,   31,   22,   22,   11,  168,    0,   61,   61,   61,   61,   61,   61,
+      0,   52,   20,   22,   22,   22,  140,    2,    2,    2,  174,  175,   11,   15,  176,   61,
+    177,    0,    0,    1,  147,    0,    0,    0,    0,   52,   20,   22,   16,   19,   20,    2,
+      2,    2,    2,  158,  158,  158,  178,  178,  178,  178,  178,  178,   15,  179,    0,   30,
+      0,   22,   20,   20,   31,   22,   22,   11,  169,    0,   61,   61,   61,   61,   61,   61,
      61,   66,   21,   82,   46,    0,    0,    0,    0,    2,    2,    2,    9,    2,   30,    2,
-      2,   52,   22,   22,   31,    0,   38,   22,   27,   11,  158,  179,  180,    0,    0,    0,
+      2,   52,   22,   22,   31,    0,   38,   22,   27,   11,  159,  180,  181,    0,    0,    0,
       0,    2,    2,    2,   30,    9,    2,    2,    2,    2,    2,    2,    2,    2,   23,   23,
-     47,   22,   35,   82,   68,    0,    0,    0,    0,    2,  181,   66,   47,    0,    0,    0,
-      0,   11,  182,    2,    2,    2,    2,    2,    2,    2,    2,   23,   22,   20,   31,    0,
-     48,   16,  142,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  155,    0,
-      0,  183,  183,  183,  183,  183,  183,  183,  183,  184,  184,  184,  185,  186,  184,  183,
-    183,  187,  183,  183,  188,  189,  189,  189,  189,  189,  189,  189,    0,    0,    0,    0,
-      0,  183,  183,  183,  183,  183,  190,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-     22,   22,   22,   22,   22,   22,  191,  192,  193,   11,   11,   11,   46,    0,    0,    0,
+     47,   22,   35,   82,   68,    0,    0,    0,    0,    2,  182,   66,   47,    0,    0,    0,
+      0,   11,  183,    2,    2,    2,    2,    2,    2,    2,    2,   23,   22,   20,   31,    0,
+     48,   16,  143,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  156,    0,
+      0,  184,  184,  184,  184,  184,  184,  184,  184,  185,  185,  185,  186,  187,  185,  184,
+    184,  188,  184,  184,  189,  190,  190,  190,  190,  190,  190,  190,    0,    0,    0,    0,
+      0,  184,  184,  184,  184,  184,  191,    0,    0,    2,    2,    2,    2,    2,    2,    2,
+     22,   22,   22,   22,   22,   22,  192,  193,  194,   11,   11,   11,   46,    0,    0,    0,
       0,   29,   74,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   65,   47,
-      0,    2,    2,    2,    2,    2,    9,    0,   58,  194,   20,   20,   20,   20,   20,   20,
+      0,    2,    2,    2,    2,    2,    9,    0,   58,  195,   20,   20,   20,   20,   20,   20,
      20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,    0,    0,    0,
-     40,  115,   26,    0,    0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,
+     40,  116,   26,    0,    0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,
       0,    0,    0,    0,    0,    0,    0,    0,   30,    2,    2,    2,    2,    2,    0,   58,
-     37,    0,    6,  119,  119,  119,  120,    0,    0,   11,   11,   11,   49,    2,    2,    2,
+     37,    0,    6,  120,  120,  120,  121,    0,    0,   11,   11,   11,   49,    2,    2,    2,
       0,    2,    2,    2,    2,    2,    0,    0,    2,    2,    2,    2,    2,    2,    2,    2,
      46,    2,    2,    2,    2,    2,    2,   11,   11,    2,    2,    2,    2,    2,    2,   22,
      22,    2,    2,    2,    2,    2,    2,    2,   20,    2,    2,   44,   44,   44,   92,    0,
@@ -607,17 +609,17 @@ hb_use_u8[3655] =
   FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,CMAbv,CMAbv,    B,   GB,    B, VAbv,  SUB, FPst,
    FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre,    B, MPre, MBlw,  SUB, FAbv, FAbv, MAbv,
     SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst,    H,    B,    O,SMAbv,SMAbv,SMAbv, VPst,
-     IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,
-     WJ,   WJ,    O,FMPst,    O,   SB,   SE,    O,    H, MPst, VPst,    H,VMAbv, VAbv,VMBlw,    B,
-   VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv, MBlw, MPst, MBlw,    H,    O, VBlw, MPst, MPre,
-   MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,    B,    B, VPre,    O,VMPst,   IS,    O,VMPst,
-   VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,   IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,    B,    N,
-      N,    O,   HN, VPre, VBlw, VAbv,   IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw, VAbv, VPre,
-  VMAbv,VMAbv,    H, VAbv,CMBlw,VMPst,    O,VMAbv,CMBlw,   IS,    R,FMAbv,    B,   CS,   CS,    H,
-  CMBlw,VMPst,    H,VMPst, VAbv,VMAbv, VPst, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,VMAbv,   CS,
-    SUB,  SUB,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,   IS,    R, MBlw,   GB, VAbv,    R,VMPst,    G,
-      G,    J,    J,    J,   SB,   SE,    J,   HR,    G,    G,   HM,   HM,   HM,    G,    O, MPre,
-   MPre, MPst,VMAbv, MBlw, VBlw,    O, VBlw,
+     IS,   RK,   RK, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,
+    CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,   SE,    O,    H, MPst, VPst,    H,VMAbv, VAbv,
+  VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv, MBlw, MPst, MBlw,    H,    O, VBlw,
+   MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,    B,    B, VPre,    O,VMPst,   IS,
+      O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,   IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,
+      B,    N,    N,    O,   HN, VPre, VBlw, VAbv,   IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw,
+   VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,VMPst,    O,VMAbv,CMBlw,   IS,    R,FMAbv,    B,   CS,
+     CS,    H,CMBlw,VMPst,    H,VMPst, VAbv,VMAbv, VPst, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,
+  VMAbv,   CS,  SUB,  SUB,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,   IS,    R, MBlw,   GB, VAbv,    R,
+  VMPst,    G,    G,    J,    J,    J,   SB,   SE,    J,   HR,    G,    G,   HM,   HM,   HM,    G,
+      O, MPre, MPre, MPst,VMAbv, MBlw, VBlw,    O, VBlw,
 };
 static const uint16_t
 hb_use_u16[486] =
@@ -683,6 +685,7 @@ hb_use_get_category (unsigned u)
 #undef N
 #undef O
 #undef R
+#undef RK
 #undef SB
 #undef SE
 #undef SUB

+ 2 - 2
thirdparty/harfbuzz/src/hb-ot-tag-table.hh

@@ -6,8 +6,8 @@
  *
  * on files with these headers:
  *
- * <meta name="updated_at" content="2024-05-31 05:41 PM" />
- * File-Date: 2024-05-16
+ * <meta name="updated_at" content="2024-07-07 12:57 AM" />
+ * File-Date: 2024-06-14
  */
 
 #ifndef HB_OT_TAG_TABLE_HH

+ 0 - 3
thirdparty/harfbuzz/src/hb-unicode.hh

@@ -34,9 +34,6 @@
 #include "hb.hh"
 
 
-// Hack. See: https://github.com/harfbuzz/harfbuzz/pull/4529#discussion_r1769638033
-#define _HB_UNICODE_GENERAL_CATEGORY_VARIATION_SELECTOR ((hb_unicode_general_category_t) 30)
-
 extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256];
 
 /*

+ 3 - 3
thirdparty/harfbuzz/src/hb-version.h

@@ -47,20 +47,20 @@ HB_BEGIN_DECLS
  *
  * The minor component of the library version available at compile-time.
  */
-#define HB_VERSION_MINOR 0
+#define HB_VERSION_MINOR 1
 /**
  * HB_VERSION_MICRO:
  *
  * The micro component of the library version available at compile-time.
  */
-#define HB_VERSION_MICRO 1
+#define HB_VERSION_MICRO 0
 
 /**
  * HB_VERSION_STRING:
  *
  * A string literal containing the library version available at compile-time.
  */
-#define HB_VERSION_STRING "10.0.1"
+#define HB_VERSION_STRING "10.1.0"
 
 /**
  * HB_VERSION_ATLEAST:

Some files were not shown because too many files changed in this diff