Browse Source

Merge pull request #44748 from bruvzg/hb_2_7_3_sync

HarfBuzz: Update to upstream version 2.7.4
Rémi Verschelde 4 years ago
parent
commit
886571e0fc
62 changed files with 5697 additions and 2701 deletions
  1. 1 1
      thirdparty/README.md
  2. 30 0
      thirdparty/harfbuzz/NEWS
  3. 66 25
      thirdparty/harfbuzz/src/hb-aat-layout.cc
  4. 303 2
      thirdparty/harfbuzz/src/hb-aat-layout.h
  5. 2 2
      thirdparty/harfbuzz/src/hb-algs.hh
  6. 30 24
      thirdparty/harfbuzz/src/hb-blob.cc
  7. 26 9
      thirdparty/harfbuzz/src/hb-blob.h
  8. 1 0
      thirdparty/harfbuzz/src/hb-blob.hh
  9. 555 591
      thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh
  10. 708 515
      thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh
  11. 454 65
      thirdparty/harfbuzz/src/hb-buffer-serialize.cc
  12. 146 120
      thirdparty/harfbuzz/src/hb-buffer.cc
  13. 50 2
      thirdparty/harfbuzz/src/hb-buffer.h
  14. 37 4
      thirdparty/harfbuzz/src/hb-buffer.hh
  15. 55 33
      thirdparty/harfbuzz/src/hb-common.cc
  16. 286 7
      thirdparty/harfbuzz/src/hb-common.h
  17. 9 0
      thirdparty/harfbuzz/src/hb-directwrite.cc
  18. 106 73
      thirdparty/harfbuzz/src/hb-face.cc
  19. 6 0
      thirdparty/harfbuzz/src/hb-face.h
  20. 333 263
      thirdparty/harfbuzz/src/hb-font.cc
  21. 302 89
      thirdparty/harfbuzz/src/hb-font.h
  22. 1 1
      thirdparty/harfbuzz/src/hb-ft.cc
  23. 10 0
      thirdparty/harfbuzz/src/hb-gdi.cc
  24. 54 33
      thirdparty/harfbuzz/src/hb-map.cc
  25. 6 0
      thirdparty/harfbuzz/src/hb-map.h
  26. 1 0
      thirdparty/harfbuzz/src/hb-null.hh
  27. 0 2
      thirdparty/harfbuzz/src/hb-open-type.hh
  28. 1 2
      thirdparty/harfbuzz/src/hb-ot-color.h
  29. 1 2
      thirdparty/harfbuzz/src/hb-ot-deprecated.h
  30. 3 0
      thirdparty/harfbuzz/src/hb-ot-font.cc
  31. 15 3
      thirdparty/harfbuzz/src/hb-ot-layout-base-table.hh
  32. 4 1
      thirdparty/harfbuzz/src/hb-ot-layout-common.hh
  33. 5 1
      thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh
  34. 20 20
      thirdparty/harfbuzz/src/hb-ot-layout.cc
  35. 2 2
      thirdparty/harfbuzz/src/hb-ot-map.hh
  36. 9 0
      thirdparty/harfbuzz/src/hb-ot-metrics.cc
  37. 1 2
      thirdparty/harfbuzz/src/hb-ot-name.h
  38. 8 2
      thirdparty/harfbuzz/src/hb-ot-shape-complex-indic.cc
  39. 6 4
      thirdparty/harfbuzz/src/hb-ot-shape-complex-khmer.cc
  40. 69 0
      thirdparty/harfbuzz/src/hb-ot-shape-complex-machine-index.hh
  41. 7 10
      thirdparty/harfbuzz/src/hb-ot-shape-complex-myanmar.cc
  42. 298 370
      thirdparty/harfbuzz/src/hb-ot-shape-complex-use-machine.hh
  43. 422 93
      thirdparty/harfbuzz/src/hb-ot-shape-complex-use-table.cc
  44. 10 5
      thirdparty/harfbuzz/src/hb-ot-shape-complex-use.cc
  45. 4 13
      thirdparty/harfbuzz/src/hb-ot-shape-complex-use.hh
  46. 1 1
      thirdparty/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc
  47. 7 0
      thirdparty/harfbuzz/src/hb-ot-shape-complex.hh
  48. 1 1
      thirdparty/harfbuzz/src/hb-ot-shape-fallback.cc
  49. 3 2
      thirdparty/harfbuzz/src/hb-ot-shape-normalize.cc
  50. 23 2
      thirdparty/harfbuzz/src/hb-ot-shape.cc
  51. 402 53
      thirdparty/harfbuzz/src/hb-ot-tag-table.hh
  52. 1 0
      thirdparty/harfbuzz/src/hb-ot-tag.cc
  53. 110 5
      thirdparty/harfbuzz/src/hb-ot-var.cc
  54. 41 3
      thirdparty/harfbuzz/src/hb-ot-var.h
  55. 115 92
      thirdparty/harfbuzz/src/hb-set.cc
  56. 9 0
      thirdparty/harfbuzz/src/hb-set.h
  57. 125 59
      thirdparty/harfbuzz/src/hb-shape-plan.cc
  58. 14 0
      thirdparty/harfbuzz/src/hb-shape-plan.h
  59. 0 4
      thirdparty/harfbuzz/src/hb-shape.cc
  60. 76 47
      thirdparty/harfbuzz/src/hb-unicode.cc
  61. 304 39
      thirdparty/harfbuzz/src/hb-unicode.h
  62. 2 2
      thirdparty/harfbuzz/src/hb-version.h

+ 1 - 1
thirdparty/README.md

@@ -176,7 +176,7 @@ Files extracted from upstream source:
 ## HarfBuzz
 ## HarfBuzz
 
 
 - Upstream: https://github.com/harfbuzz/harfbuzz
 - Upstream: https://github.com/harfbuzz/harfbuzz
-- Version: 2.7.2
+- Version: 2.7.4
 - License: HarfBuzz
 - License: HarfBuzz
 
 
 Files extracted from upstream source:
 Files extracted from upstream source:

+ 30 - 0
thirdparty/harfbuzz/NEWS

@@ -1,3 +1,33 @@
+Overview of changes leading to 2.7.4
+Sunday, December 27, 2020
+====================================
+- Fix missing --enable-introspection configure option from previous release
+  tarball.
+- Documentation updates.
+
+Overview of changes leading to 2.7.3
+Wednesday, December 23, 2020
+====================================
+- Update USE shaper to 2020-08-13 specification, and other improvements.
+- Don’t disable liga feature in myanmar shaper, to match Uniscribe.
+- Improvements to language and script tags handling.
+- Update language system tag registry to OpenType 1.8.4
+- Support for serializing and deserializing Unicode buffers. Serialized buffers
+  are now delimited with `<>` or `[]` based on whether it is a Unicode or
+  glyphs buffer.
+- Increase buffer work limits to handle fonts with many complex lookups.
+- Handle more shaping operations in trace output.
+- Memory access fixes.
+- More OOM fixes.
+- Improved documentation.
+- Build system improvements.
+- New API:
++hb_buffer_has_positions()
++hb_buffer_serialize()
++hb_buffer_serialize_unicode()
++hb_buffer_deserialize_unicode()
+
+
 Overview of changes leading to 2.7.2
 Overview of changes leading to 2.7.2
 Saturday, August 29, 2020
 Saturday, August 29, 2020
 ====================================
 ====================================

+ 66 - 25
thirdparty/harfbuzz/src/hb-aat-layout.cc

@@ -79,13 +79,18 @@ AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_)
  * @short_description: Apple Advanced Typography Layout
  * @short_description: Apple Advanced Typography Layout
  * @include: hb-aat.h
  * @include: hb-aat.h
  *
  *
- * Functions for querying OpenType Layout features in the font face.
+ * Functions for querying AAT Layout features in the font face. 
+ *
+ * HarfBuzz supports all of the AAT tables used to implement shaping. Other
+ * AAT tables and their associated features are not supported.
  **/
  **/
 
 
 
 
 #if !defined(HB_NO_AAT) || defined(HAVE_CORETEXT)
 #if !defined(HB_NO_AAT) || defined(HAVE_CORETEXT)
 
 
-/* Table data courtesy of Apple.  Converted from mnemonics to integers
+/* Mapping from OpenType feature tags to AAT feature names and selectors.
+ *
+ * Table data courtesy of Apple.  Converted from mnemonics to integers
  * when moving to this file. */
  * when moving to this file. */
 static const hb_aat_feature_mapping_t feature_mappings[] =
 static const hb_aat_feature_mapping_t feature_mappings[] =
 {
 {
@@ -167,6 +172,17 @@ static const hb_aat_feature_mapping_t feature_mappings[] =
   {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS,      HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON,                HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF},
   {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS,      HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON,                HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF},
 };
 };
 
 
+/** 
+ * hb_aat_layout_find_feature_mapping:
+ * @tag: The requested #hb_tag_t feature tag
+ *
+ * Fetches the AAT feature-and-selector combination that corresponds
+ * to a given OpenType feature tag.
+ *  
+ * Return value: the AAT features and selectors corresponding to the
+ * OpenType feature tag queried
+ *
+ **/
 const hb_aat_feature_mapping_t *
 const hb_aat_feature_mapping_t *
 hb_aat_layout_find_feature_mapping (hb_tag_t tag)
 hb_aat_layout_find_feature_mapping (hb_tag_t tag)
 {
 {
@@ -202,11 +218,17 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
 }
 }
 
 
 
 
-/*
+/**
  * hb_aat_layout_has_substitution:
  * hb_aat_layout_has_substitution:
- * @face:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether the specified face includes any substitutions in the
+ * `morx` or `mort` tables.
+ *
+ * <note>Note: does not examine the `GSUB` table.</note>
+ *
+ * Return value: true if data found, false otherwise
  *
  *
- * Returns:
  * Since: 2.3.0
  * Since: 2.3.0
  */
  */
 hb_bool_t
 hb_bool_t
@@ -263,11 +285,17 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer)
   hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph);
   hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph);
 }
 }
 
 
-/*
+/**
  * hb_aat_layout_has_positioning:
  * hb_aat_layout_has_positioning:
- * @face:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether the specified face includes any positioning information
+ * in the `kerx` table.
+ *
+ * <note>Note: does not examine the `GPOS` table.</note>
+ *
+ * Return value: true if data found, false otherwise
  *
  *
- * Returns:
  * Since: 2.3.0
  * Since: 2.3.0
  */
  */
 hb_bool_t
 hb_bool_t
@@ -290,11 +318,15 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan,
 }
 }
 
 
 
 
-/*
+/**
  * hb_aat_layout_has_tracking:
  * hb_aat_layout_has_tracking:
- * @face:
+ * @face:: #hb_face_t to work upon
+ *
+ * Tests whether the specified face includes any tracking information
+ * in the `trak` table.
+ *
+ * Return value: true if data found, false otherwise
  *
  *
- * Returns:
  * Since: 2.3.0
  * Since: 2.3.0
  */
  */
 hb_bool_t
 hb_bool_t
@@ -316,10 +348,13 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan,
 
 
 /**
 /**
  * hb_aat_layout_get_feature_types:
  * hb_aat_layout_get_feature_types:
- * @face: a face object
- * @start_offset: iteration's start offset
- * @feature_count:(inout) (allow-none): buffer size as input, filled size as output
- * @features: (out caller-allocates) (array length=feature_count): features buffer
+ * @face: #hb_face_t to work upon
+ * @start_offset: offset of the first feature type to retrieve
+ * @feature_count: (inout) (allow-none): Input = the maximum number of feature types to return;
+ *                 Output = the actual number of feature types returned (may be zero)
+ * @features: (out caller-allocates) (array length=feature_count): Array of feature types found
+ *
+ * Fetches a list of the AAT feature types included in the specified face.
  *
  *
  * Return value: Number of all available feature types.
  * Return value: Number of all available feature types.
  *
  *
@@ -336,10 +371,12 @@ hb_aat_layout_get_feature_types (hb_face_t                    *face,
 
 
 /**
 /**
  * hb_aat_layout_feature_type_get_name_id:
  * hb_aat_layout_feature_type_get_name_id:
- * @face: a face object
- * @feature_type: feature id
+ * @face: #hb_face_t to work upon
+ * @feature_type: The #hb_aat_layout_feature_type_t of the requested feature type
  *
  *
- * Return value: Name ID index
+ * Fetches the name ID of the specified feature type in the face's `name` table.
+ *
+ * Return value: Name ID of the requested feature type
  *
  *
  * Since: 2.2.0
  * Since: 2.2.0
  */
  */
@@ -352,18 +389,22 @@ hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
 
 
 /**
 /**
  * hb_aat_layout_feature_type_get_selectors:
  * hb_aat_layout_feature_type_get_selectors:
- * @face:    a face object
- * @feature_type: feature id
- * @start_offset:    iteration's start offset
- * @selector_count: (inout) (allow-none): buffer size as input, filled size as output
- * @selectors: (out caller-allocates) (array length=selector_count): settings buffer
- * @default_index: (out) (allow-none): index of default selector if any
+ * @face: #hb_face_t to work upon
+ * @feature_type: The #hb_aat_layout_feature_type_t of the requested feature type
+ * @start_offset: offset of the first feature type to retrieve
+ * @selector_count: (inout) (allow-none): Input = the maximum number of selectors to return;
+ *                  Output = the actual number of selectors returned (may be zero)
+ * @selectors: (out caller-allocates) (array length=selector_count): A buffer pointer.
+ *             The selectors available for the feature type queries.
+ * @default_index: (out) (allow-none): The index of the feature's default selector, if any
+ *
+ * Fetches a list of the selectors available for the specified feature in the given face.
  *
  *
  * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then
  * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then
  * the feature type is non-exclusive.  Otherwise, @default_index is the index of
  * the feature type is non-exclusive.  Otherwise, @default_index is the index of
  * the selector that is selected by default.
  * the selector that is selected by default.
  *
  *
- * Return value: Number of all available feature selectors.
+ * Return value: Number of all available feature selectors
  *
  *
  * Since: 2.2.0
  * Since: 2.2.0
  */
  */

+ 303 - 2
thirdparty/harfbuzz/src/hb-aat-layout.h

@@ -37,7 +37,48 @@ HB_BEGIN_DECLS
 
 
 /**
 /**
  * hb_aat_layout_feature_type_t:
  * hb_aat_layout_feature_type_t:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_INVALID: Initial, unset feature type
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE:
  *
  *
+ * The possible feature types defined for AAT shaping.
  *
  *
  * Since: 2.2.0
  * Since: 2.2.0
  */
  */
@@ -85,12 +126,265 @@ typedef enum
   HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE			= 39,
   HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE			= 39,
   HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE		= 103,
   HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE		= 103,
 
 
+  /*< private >*/
   _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
   _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_aat_layout_feature_type_t;
 } hb_aat_layout_feature_type_t;
 
 
 /**
 /**
  * hb_aat_layout_feature_selector_t:
  * hb_aat_layout_feature_selector_t:
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID: Initial, unset feature selector
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS: for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS: for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS: for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE: for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE: for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
  *
  *
+ * The selectors defined for specifying AAT feature settings.
  *
  *
  * Since: 2.2.0
  * Since: 2.2.0
  */
  */
@@ -424,6 +718,7 @@ typedef enum
   HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN		= 2,
   HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN		= 2,
   HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN		= 3,
   HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN		= 3,
 
 
+  /*< private >*/
   _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
   _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_aat_layout_feature_selector_t;
 } hb_aat_layout_feature_selector_t;
 
 
@@ -437,8 +732,7 @@ HB_EXTERN hb_ot_name_id_t
 hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
 hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
 					hb_aat_layout_feature_type_t  feature_type);
 					hb_aat_layout_feature_type_t  feature_type);
 
 
-typedef struct hb_aat_layout_feature_selector_info_t
-{
+typedef struct hb_aat_layout_feature_selector_info_t {
   hb_ot_name_id_t			name_id;
   hb_ot_name_id_t			name_id;
   hb_aat_layout_feature_selector_t	enable;
   hb_aat_layout_feature_selector_t	enable;
   hb_aat_layout_feature_selector_t	disable;
   hb_aat_layout_feature_selector_t	disable;
@@ -446,6 +740,13 @@ typedef struct hb_aat_layout_feature_selector_info_t
   unsigned int				reserved;
   unsigned int				reserved;
 } hb_aat_layout_feature_selector_info_t;
 } hb_aat_layout_feature_selector_info_t;
 
 
+/**
+ * HB_AAT_LAYOUT_NO_SELECTOR_INDEX
+ *
+ * Used when getting or setting AAT feature selectors. Indicates that
+ * there is no selector index corresponding to the selector of interest.
+ *
+ */
 #define HB_AAT_LAYOUT_NO_SELECTOR_INDEX		0xFFFFu
 #define HB_AAT_LAYOUT_NO_SELECTOR_INDEX		0xFFFFu
 
 
 HB_EXTERN unsigned int
 HB_EXTERN unsigned int

+ 2 - 2
thirdparty/harfbuzz/src/hb-algs.hh

@@ -350,14 +350,14 @@ struct
 {
 {
   template <typename T, typename T2> constexpr auto
   template <typename T, typename T2> constexpr auto
   operator () (T&& a, T2&& b) const HB_AUTO_RETURN
   operator () (T&& a, T2&& b) const HB_AUTO_RETURN
-  (hb_forward<T> (a) <= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b))
+  (a <= b ? hb_forward<T> (a) : hb_forward<T2> (b))
 }
 }
 HB_FUNCOBJ (hb_min);
 HB_FUNCOBJ (hb_min);
 struct
 struct
 {
 {
   template <typename T, typename T2> constexpr auto
   template <typename T, typename T2> constexpr auto
   operator () (T&& a, T2&& b) const HB_AUTO_RETURN
   operator () (T&& a, T2&& b) const HB_AUTO_RETURN
-  (hb_forward<T> (a) >= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b))
+  (a >= b ? hb_forward<T> (a) : hb_forward<T2> (b))
 }
 }
 HB_FUNCOBJ (hb_max);
 HB_FUNCOBJ (hb_max);
 struct
 struct

+ 30 - 24
thirdparty/harfbuzz/src/hb-blob.cc

@@ -58,7 +58,7 @@
  * @length: Length of @data in bytes.
  * @length: Length of @data in bytes.
  * @mode: Memory mode for @data.
  * @mode: Memory mode for @data.
  * @user_data: Data parameter to pass to @destroy.
  * @user_data: Data parameter to pass to @destroy.
- * @destroy: Callback to call when @data is not needed anymore.
+ * @destroy: (optional): Callback to call when @data is not needed anymore.
  *
  *
  * Creates a new "blob" object wrapping @data.  The @mode parameter is used
  * Creates a new "blob" object wrapping @data.  The @mode parameter is used
  * to negotiate ownership and lifecycle of @data.
  * to negotiate ownership and lifecycle of @data.
@@ -156,7 +156,7 @@ hb_blob_create_sub_blob (hb_blob_t    *parent,
  *
  *
  * Makes a writable copy of @blob.
  * Makes a writable copy of @blob.
  *
  *
- * Return value: New blob, or nullptr if allocation failed.
+ * Return value: The new blob, or nullptr if allocation failed
  *
  *
  * Since: 1.8.0
  * Since: 1.8.0
  **/
  **/
@@ -182,7 +182,7 @@ hb_blob_copy_writable_or_fail (hb_blob_t *blob)
  *
  *
  * See TODO:link object types for more information.
  * See TODO:link object types for more information.
  *
  *
- * Return value: (transfer full): the empty blob.
+ * Return value: (transfer full): The empty blob.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -234,13 +234,15 @@ hb_blob_destroy (hb_blob_t *blob)
 
 
 /**
 /**
  * hb_blob_set_user_data: (skip)
  * hb_blob_set_user_data: (skip)
- * @blob: a blob.
- * @key: key for data to set.
- * @data: data to set.
- * @destroy: callback to call when @data is not needed anymore.
- * @replace: whether to replace an existing data with the same key.
+ * @blob: An #hb_blob_t
+ * @key: The user-data key to set
+ * @data: A pointer to the user data to set
+ * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
+ *
+ * Attaches a user-data key/data pair to the specified blob.
  *
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -256,12 +258,13 @@ hb_blob_set_user_data (hb_blob_t          *blob,
 
 
 /**
 /**
  * hb_blob_get_user_data: (skip)
  * hb_blob_get_user_data: (skip)
- * @blob: a blob.
- * @key: key for data to get.
+ * @blob: a blob
+ * @key: The user-data key to query
  *
  *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified font-functions structure.
  *
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -275,9 +278,9 @@ hb_blob_get_user_data (hb_blob_t          *blob,
 
 
 /**
 /**
  * hb_blob_make_immutable:
  * hb_blob_make_immutable:
- * @blob: a blob.
- *
+ * @blob: a blob
  *
  *
+ * Makes a blob immutable.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -294,9 +297,9 @@ hb_blob_make_immutable (hb_blob_t *blob)
  * hb_blob_is_immutable:
  * hb_blob_is_immutable:
  * @blob: a blob.
  * @blob: a blob.
  *
  *
+ * Tests whether a blob is immutable.
  *
  *
- *
- * Return value: TODO
+ * Return value: %true if @blob is immutable, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -311,9 +314,9 @@ hb_blob_is_immutable (hb_blob_t *blob)
  * hb_blob_get_length:
  * hb_blob_get_length:
  * @blob: a blob.
  * @blob: a blob.
  *
  *
+ * Fetches the length of a blob's data.
  *
  *
- *
- * Return value: the length of blob data in bytes.
+ * Return value: the length of @blob data in bytes.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -326,11 +329,11 @@ hb_blob_get_length (hb_blob_t *blob)
 /**
 /**
  * hb_blob_get_data:
  * hb_blob_get_data:
  * @blob: a blob.
  * @blob: a blob.
- * @length: (out):
+ * @length: (out): The length in bytes of the data retrieved
  *
  *
+ * Fetches the data from a blob.
  *
  *
- *
- * Returns: (transfer none) (array length=length):
+ * Returns: (transfer none) (array length=length): the byte data of @blob.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -558,9 +561,12 @@ _open_resource_fork (const char *file_name, hb_mapped_file_t *file)
 
 
 /**
 /**
  * hb_blob_create_from_file:
  * hb_blob_create_from_file:
- * @file_name: font filename.
+ * @file_name: A font filename
+ *
+ * Creates a new blob containing the data from the
+ * specified binary font file.
  *
  *
- * Returns: A hb_blob_t pointer with the content of the file
+ * Returns: An #hb_blob_t pointer with the content of the file
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/

+ 26 - 9
thirdparty/harfbuzz/src/hb-blob.h

@@ -36,25 +36,34 @@
 HB_BEGIN_DECLS
 HB_BEGIN_DECLS
 
 
 
 
-/*
- * Note re various memory-modes:
+/**
+ * hb_memory_mode_t:
+ * @HB_MEMORY_MODE_DUPLICATE
+ * @HB_MEMORY_MODE_READONLY
+ * @HB_MEMORY_MODE_WRITABLE
+ * @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
+ *
+ * Data type holding the memory modes available to
+ * client programs.
+ *
+ * Regarding these various memory-modes:
  *
  *
  * - In no case shall the HarfBuzz client modify memory
  * - In no case shall the HarfBuzz client modify memory
  *   that is passed to HarfBuzz in a blob.  If there is
  *   that is passed to HarfBuzz in a blob.  If there is
- *   any such possibility, MODE_DUPLICATE should be used
+ *   any such possibility, @HB_MEMORY_MODE_DUPLICATE should be used
  *   such that HarfBuzz makes a copy immediately,
  *   such that HarfBuzz makes a copy immediately,
  *
  *
- * - Use MODE_READONLY otherwise, unless you really really
+ * - Use @HB_MEMORY_MODE_READONLY otherwise, unless you really really
  *   really know what you are doing,
  *   really know what you are doing,
  *
  *
- * - MODE_WRITABLE is appropriate if you really made a
+ * - @HB_MEMORY_MODE_WRITABLE is appropriate if you really made a
  *   copy of data solely for the purpose of passing to
  *   copy of data solely for the purpose of passing to
  *   HarfBuzz and doing that just once (no reuse!),
  *   HarfBuzz and doing that just once (no reuse!),
  *
  *
- * - If the font is mmap()ed, it's ok to use
- *   READONLY_MAY_MAKE_WRITABLE, however, using that mode
- *   correctly is very tricky.  Use MODE_READONLY instead.
- */
+ * - If the font is mmap()ed, it's okay to use
+ *   @HB_MEMORY_READONLY_MAY_MAKE_WRITABLE, however, using that mode
+ *   correctly is very tricky.  Use @HB_MEMORY_MODE_READONLY instead.
+ **/
 typedef enum {
 typedef enum {
   HB_MEMORY_MODE_DUPLICATE,
   HB_MEMORY_MODE_DUPLICATE,
   HB_MEMORY_MODE_READONLY,
   HB_MEMORY_MODE_READONLY,
@@ -62,6 +71,14 @@ typedef enum {
   HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
   HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
 } hb_memory_mode_t;
 } hb_memory_mode_t;
 
 
+/**
+ * hb_blob_t:
+ *
+ * Data type for blobs. A blob wraps a chunk of binary
+ * data and facilitates its lifecycle management between
+ * a client program and HarfBuzz.
+ *
+ **/
 typedef struct hb_blob_t hb_blob_t;
 typedef struct hb_blob_t hb_blob_t;
 
 
 HB_EXTERN hb_blob_t *
 HB_EXTERN hb_blob_t *

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

@@ -90,6 +90,7 @@ struct hb_blob_ptr_t
   unsigned int get_length () const { return b.get ()->length; }
   unsigned int get_length () const { return b.get ()->length; }
   void destroy () { hb_blob_destroy (b.get ()); b = nullptr; }
   void destroy () { hb_blob_destroy (b.get ()); b = nullptr; }
 
 
+  private:
   hb_nonnull_ptr_t<hb_blob_t> b;
   hb_nonnull_ptr_t<hb_blob_t> b;
 };
 };
 
 

+ 555 - 591
thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh

@@ -1,30 +1,29 @@
-
 #line 1 "hb-buffer-deserialize-json.rl"
 #line 1 "hb-buffer-deserialize-json.rl"
 /*
 /*
- * Copyright © 2013  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
+* Copyright © 2013  Google, Inc.
+*
+*  This is part of HarfBuzz, a text shaping library.
+*
+* Permission is hereby granted, without written agreement and without
+* license or royalty fees, to use, copy, modify, and distribute this
+* software and its documentation for any purpose, provided that the
+* above copyright notice and the following two paragraphs appear in
+* all copies of this software.
+*
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+* DAMAGE.
+*
+* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+*
+* Google Author(s): Behdad Esfahbod
+*/
 
 
 #ifndef HB_BUFFER_DESERIALIZE_JSON_HH
 #ifndef HB_BUFFER_DESERIALIZE_JSON_HH
 #define HB_BUFFER_DESERIALIZE_JSON_HH
 #define HB_BUFFER_DESERIALIZE_JSON_HH
@@ -32,612 +31,577 @@
 #include "hb.hh"
 #include "hb.hh"
 
 
 
 
-#line 36 "hb-buffer-deserialize-json.hh"
+#line 35 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
 static const unsigned char _deserialize_json_trans_keys[] = {
-	0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
-	48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
-	9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 
-	120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 
-	9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
-	65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0
+	1u, 0u, 0u, 18u, 0u, 2u, 10u, 15u,
+	16u, 17u, 2u, 2u, 0u, 7u, 0u, 6u,
+	5u, 6u, 0u, 19u, 0u, 19u, 0u, 19u,
+	2u, 2u, 0u, 7u, 0u, 6u, 5u, 6u,
+	0u, 19u, 0u, 19u, 14u, 14u, 2u, 2u,
+	0u, 7u, 0u, 6u, 0u, 19u, 0u, 19u,
+	16u, 17u, 2u, 2u, 0u, 7u, 0u, 6u,
+	5u, 6u, 0u, 19u, 0u, 19u, 2u, 2u,
+	0u, 7u, 0u, 6u, 5u, 6u, 0u, 19u,
+	0u, 19u, 2u, 2u, 0u, 7u, 0u, 6u,
+	2u, 8u, 0u, 19u, 2u, 8u, 0u, 19u,
+	0u, 19u, 2u, 2u, 0u, 7u, 0u, 6u,
+	0u, 19u, 0u, 9u, 0u, 18u, 1u, 0u,
+	0u
 };
 };
 
 
-static const char _deserialize_json_key_spans[] = {
-	0, 115, 26, 7, 2, 1, 50, 49, 
-	10, 117, 117, 117, 1, 50, 49, 10, 
-	117, 117, 1, 1, 50, 49, 117, 117, 
-	2, 1, 50, 49, 10, 117, 117, 1, 
-	50, 49, 10, 117, 117, 1, 50, 49, 
-	58, 89, 117, 117, 85, 115, 0
+static const signed char _deserialize_json_char_class[] = {
+	0, 0, 0, 0, 0, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 0,
+	1, 2, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 3, 4, 1, 1, 5,
+	6, 6, 6, 6, 6, 6, 6, 6,
+	6, 7, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 8, 9, 1, 1, 1,
+	10, 1, 11, 12, 1, 1, 13, 1,
+	1, 1, 1, 14, 1, 1, 1, 1,
+	1, 1, 1, 1, 15, 1, 1, 16,
+	17, 1, 18, 1, 19, 0
 };
 };
 
 
 static const short _deserialize_json_index_offsets[] = {
 static const short _deserialize_json_index_offsets[] = {
-	0, 0, 116, 143, 151, 154, 156, 207, 
-	257, 268, 386, 504, 622, 624, 675, 725, 
-	736, 854, 972, 974, 976, 1027, 1077, 1195, 
-	1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, 
-	1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, 
-	2119, 2178, 2268, 2386, 2504, 2590, 2706
+	0, 0, 19, 22, 28, 30, 31, 39,
+	46, 48, 68, 88, 108, 109, 117, 124,
+	126, 146, 166, 167, 168, 176, 183, 203,
+	223, 225, 226, 234, 241, 243, 263, 283,
+	284, 292, 299, 301, 321, 341, 342, 350,
+	357, 364, 384, 391, 411, 431, 432, 440,
+	447, 467, 477, 496, 0
+};
+
+static const signed char _deserialize_json_indicies[] = {
+	1, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 2, 3, 0, 4, 5, 6,
+	7, 8, 0, 9, 10, 11, 12, 12,
+	0, 0, 0, 0, 0, 0, 13, 13,
+	0, 0, 0, 14, 15, 16, 18, 19,
+	20, 0, 0, 21, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 22, 23, 0, 0, 3,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 24,
+	20, 0, 0, 21, 0, 19, 19, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 22, 25, 25, 0, 0,
+	0, 0, 0, 0, 26, 26, 0, 0,
+	0, 27, 28, 29, 31, 32, 33, 0,
+	0, 34, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 35, 33, 0, 0, 34, 0, 32,
+	32, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 35, 36, 37,
+	37, 0, 0, 0, 0, 0, 0, 38,
+	38, 0, 0, 0, 0, 39, 40, 42,
+	0, 0, 43, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 44, 42, 0, 0, 43, 0,
+	45, 45, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 44, 46,
+	47, 48, 48, 0, 0, 0, 0, 0,
+	0, 49, 49, 0, 0, 0, 50, 51,
+	52, 54, 55, 56, 0, 0, 57, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 58, 56,
+	0, 0, 57, 0, 55, 55, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 58, 59, 59, 0, 0, 0,
+	0, 0, 0, 60, 60, 0, 0, 0,
+	61, 62, 63, 65, 66, 67, 0, 0,
+	68, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	69, 67, 0, 0, 68, 0, 66, 66,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 69, 70, 70, 0,
+	0, 0, 0, 0, 0, 71, 71, 0,
+	72, 0, 0, 73, 74, 76, 75, 75,
+	75, 75, 75, 77, 79, 0, 0, 80,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 81,
+	75, 0, 0, 0, 0, 0, 75, 83,
+	0, 0, 84, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 85, 83, 0, 0, 84, 0,
+	87, 87, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 85, 88,
+	88, 0, 0, 0, 0, 0, 0, 89,
+	89, 0, 0, 0, 0, 90, 91, 83,
+	0, 0, 84, 0, 93, 93, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 85, 94, 0, 0, 95, 0,
+	0, 0, 0, 0, 96, 1, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 2,
+	0
 };
 };
 
 
-static const char _deserialize_json_indicies[] = {
-	0, 0, 0, 0, 0, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	0, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 2, 1, 3, 3, 3, 
-	3, 3, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 3, 1, 4, 1, 
-	5, 1, 6, 7, 1, 1, 8, 1, 
-	9, 10, 1, 11, 1, 11, 11, 11, 
-	11, 11, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 11, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 12, 1, 
-	12, 12, 12, 12, 12, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 12, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 13, 1, 1, 14, 
-	15, 15, 15, 15, 15, 15, 15, 15, 
-	15, 1, 16, 17, 17, 17, 17, 17, 
-	17, 17, 17, 17, 1, 18, 18, 18, 
-	18, 18, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 18, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	19, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 20, 1, 21, 21, 21, 21, 21, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 21, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 3, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 22, 
-	1, 18, 18, 18, 18, 18, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	18, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 19, 1, 1, 1, 
-	17, 17, 17, 17, 17, 17, 17, 17, 
-	17, 17, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 20, 1, 23, 
-	1, 23, 23, 23, 23, 23, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	23, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 24, 1, 24, 24, 24, 24, 
-	24, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 24, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	25, 1, 1, 26, 27, 27, 27, 27, 
-	27, 27, 27, 27, 27, 1, 28, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	1, 30, 30, 30, 30, 30, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	30, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 31, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 32, 1, 30, 
-	30, 30, 30, 30, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 30, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 31, 1, 1, 1, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 32, 1, 33, 1, 34, 
-	1, 34, 34, 34, 34, 34, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	34, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 35, 1, 35, 35, 35, 35, 
-	35, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 35, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 36, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 1, 38, 38, 
-	38, 38, 38, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 38, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 39, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 40, 1, 38, 38, 38, 38, 
-	38, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 38, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 39, 
-	1, 1, 1, 41, 41, 41, 41, 41, 
-	41, 41, 41, 41, 41, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	40, 1, 42, 43, 1, 44, 1, 44, 
-	44, 44, 44, 44, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 44, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	45, 1, 45, 45, 45, 45, 45, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 45, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 46, 1, 
-	1, 47, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 1, 49, 50, 50, 50, 
-	50, 50, 50, 50, 50, 50, 1, 51, 
-	51, 51, 51, 51, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 51, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 52, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 53, 1, 51, 51, 51, 
-	51, 51, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 51, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	52, 1, 1, 1, 50, 50, 50, 50, 
-	50, 50, 50, 50, 50, 50, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 53, 1, 54, 1, 54, 54, 54, 
-	54, 54, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 54, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 55, 1, 
-	55, 55, 55, 55, 55, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 55, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 56, 1, 1, 57, 
-	58, 58, 58, 58, 58, 58, 58, 58, 
-	58, 1, 59, 60, 60, 60, 60, 60, 
-	60, 60, 60, 60, 1, 61, 61, 61, 
-	61, 61, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 61, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	62, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 63, 1, 61, 61, 61, 61, 61, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 61, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 62, 1, 
-	1, 1, 60, 60, 60, 60, 60, 60, 
-	60, 60, 60, 60, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 63, 
-	1, 64, 1, 64, 64, 64, 64, 64, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 64, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 65, 1, 65, 65, 
-	65, 65, 65, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 65, 1, 66, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 67, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 1, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 1, 1, 1, 1, 1, 1, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 1, 70, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 71, 71, 
-	1, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 1, 1, 1, 1, 1, 
-	1, 1, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 1, 1, 1, 1, 
-	71, 1, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 1, 72, 72, 72, 
-	72, 72, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 72, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	73, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 74, 1, 72, 72, 72, 72, 72, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 72, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 73, 1, 
-	1, 1, 75, 75, 75, 75, 75, 75, 
-	75, 75, 75, 75, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 74, 
-	1, 76, 76, 76, 76, 76, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	76, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 77, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 78, 1, 0, 
-	0, 0, 0, 0, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 0, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 2, 1, 1, 0
+static const signed char _deserialize_json_index_defaults[] = {
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	75, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0
 };
 };
 
 
-static const char _deserialize_json_trans_targs[] = {
-	1, 0, 2, 2, 3, 4, 18, 24, 
-	37, 5, 12, 6, 7, 8, 9, 11, 
-	9, 11, 10, 2, 44, 10, 44, 13, 
-	14, 15, 16, 17, 16, 17, 10, 2, 
-	44, 19, 20, 21, 22, 23, 10, 2, 
-	44, 23, 25, 31, 26, 27, 28, 29, 
-	30, 29, 30, 10, 2, 44, 32, 33, 
-	34, 35, 36, 35, 36, 10, 2, 44, 
-	38, 39, 40, 42, 43, 41, 10, 41, 
-	10, 2, 44, 43, 44, 45, 46
+static const signed char _deserialize_json_cond_targs[] = {
+	0, 1, 2, 2, 3, 4, 18, 24,
+	37, 45, 5, 12, 6, 7, 8, 9,
+	11, 8, 9, 11, 10, 2, 49, 10,
+	49, 13, 14, 15, 16, 17, 15, 16,
+	17, 10, 2, 49, 19, 20, 21, 22,
+	23, 22, 10, 2, 49, 23, 25, 31,
+	26, 27, 28, 29, 30, 28, 29, 30,
+	10, 2, 49, 32, 33, 34, 35, 36,
+	34, 35, 36, 10, 2, 49, 38, 39,
+	40, 43, 44, 40, 41, 42, 41, 10,
+	2, 49, 43, 10, 2, 49, 44, 44,
+	46, 47, 43, 48, 48, 48, 49, 50,
+	51, 0
 };
 };
 
 
-static const char _deserialize_json_trans_actions[] = {
-	0, 0, 1, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 2, 2, 2, 
-	0, 0, 3, 3, 4, 0, 5, 0, 
-	0, 2, 2, 2, 0, 0, 6, 6, 
-	7, 0, 0, 0, 2, 2, 8, 8, 
-	9, 0, 0, 0, 0, 0, 2, 2, 
-	2, 0, 0, 10, 10, 11, 0, 0, 
-	2, 2, 2, 0, 0, 12, 12, 13, 
-	0, 0, 0, 2, 2, 2, 14, 0, 
-	15, 15, 16, 0, 0, 0, 0
+static const signed char _deserialize_json_cond_actions[] = {
+	0, 0, 1, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 2, 2,
+	2, 0, 0, 0, 3, 3, 4, 0,
+	5, 0, 0, 2, 2, 2, 0, 0,
+	0, 6, 6, 7, 0, 0, 0, 2,
+	2, 0, 8, 8, 9, 0, 0, 0,
+	0, 0, 2, 2, 2, 0, 0, 0,
+	10, 10, 11, 0, 0, 2, 2, 2,
+	0, 0, 0, 12, 12, 13, 0, 0,
+	2, 14, 14, 0, 15, 0, 0, 16,
+	16, 17, 0, 18, 18, 19, 0, 15,
+	0, 0, 20, 20, 0, 21, 0, 0,
+	0, 0
 };
 };
 
 
 static const int deserialize_json_start = 1;
 static const int deserialize_json_start = 1;
-static const int deserialize_json_first_final = 44;
+static const int deserialize_json_first_final = 49;
 static const int deserialize_json_error = 0;
 static const int deserialize_json_error = 0;
 
 
 static const int deserialize_json_en_main = 1;
 static const int deserialize_json_en_main = 1;
 
 
 
 
-#line 97 "hb-buffer-deserialize-json.rl"
+#line 108 "hb-buffer-deserialize-json.rl"
 
 
 
 
 static hb_bool_t
 static hb_bool_t
-_hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
-				    const char *buf,
-				    unsigned int buf_len,
-				    const char **end_ptr,
-				    hb_font_t *font)
+_hb_buffer_deserialize_json (hb_buffer_t *buffer,
+const char *buf,
+unsigned int buf_len,
+const char **end_ptr,
+hb_font_t *font)
 {
 {
-  const char *p = buf, *pe = buf + buf_len;
-
-  /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
-
-  while (p < pe && ISSPACE (*p))
-    p++;
-  if (p < pe && *p == (buffer->len ? ',' : '['))
-  {
-    *end_ptr = ++p;
-  }
-
-  const char *tok = nullptr;
-  int cs;
-  hb_glyph_info_t info = {0};
-  hb_glyph_position_t pos = {0};
-  
-#line 466 "hb-buffer-deserialize-json.hh"
+	const char *p = buf, *pe = buf + buf_len;
+	
+	/* Ensure we have positions. */
+	(void) hb_buffer_get_glyph_positions (buffer, nullptr);
+	
+	while (p < pe && ISSPACE (*p))
+	p++;
+	if (p < pe && *p == (buffer->len ? ',' : '['))
+		{
+		*end_ptr = ++p;
+	}
+	
+	const char *tok = nullptr;
+	int cs;
+	hb_glyph_info_t info = {0};
+	hb_glyph_position_t pos = {0};
+	
+#line 223 "hb-buffer-deserialize-json.hh"
 	{
 	{
-	cs = deserialize_json_start;
+		cs = (int)deserialize_json_start;
 	}
 	}
-
-#line 471 "hb-buffer-deserialize-json.hh"
+	
+#line 228 "hb-buffer-deserialize-json.hh"
 	{
 	{
-	int _slen;
-	int _trans;
-	const unsigned char *_keys;
-	const char *_inds;
-	if ( p == pe )
-		goto _test_eof;
-	if ( cs == 0 )
-		goto _out;
-_resume:
-	_keys = _deserialize_json_trans_keys + (cs<<1);
-	_inds = _deserialize_json_indicies + _deserialize_json_index_offsets[cs];
-
-	_slen = _deserialize_json_key_spans[cs];
-	_trans = _inds[ _slen > 0 && _keys[0] <=(*p) &&
-		(*p) <= _keys[1] ?
-		(*p) - _keys[0] : _slen ];
-
-	cs = _deserialize_json_trans_targs[_trans];
-
-	if ( _deserialize_json_trans_actions[_trans] == 0 )
-		goto _again;
-
-	switch ( _deserialize_json_trans_actions[_trans] ) {
-	case 1:
+		unsigned int _trans = 0;
+		const unsigned char * _keys;
+		const signed char * _inds;
+		int _ic;
+		_resume: {}
+		if ( p == pe )
+			goto _out;
+		_keys = ( _deserialize_json_trans_keys + ((cs<<1)));
+		_inds = ( _deserialize_json_indicies + (_deserialize_json_index_offsets[cs]));
+		
+		if ( ( (*( p))) <= 125 && ( (*( p))) >= 9 ) {
+			_ic = (int)_deserialize_json_char_class[(int)( (*( p))) - 9];
+			if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) )
+				_trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); 
+			else
+				_trans = (unsigned int)_deserialize_json_index_defaults[cs];
+		}
+		else {
+			_trans = (unsigned int)_deserialize_json_index_defaults[cs];
+		}
+		
+		cs = (int)_deserialize_json_cond_targs[_trans];
+		
+		if ( _deserialize_json_cond_actions[_trans] != 0 ) {
+			
+			switch ( _deserialize_json_cond_actions[_trans] ) {
+				case 1:  {
+					{
 #line 38 "hb-buffer-deserialize-json.rl"
 #line 38 "hb-buffer-deserialize-json.rl"
-	{
-	memset (&info, 0, sizeof (info));
-	memset (&pos , 0, sizeof (pos ));
-}
-	break;
-	case 5:
+						
+						memset (&info, 0, sizeof (info));
+						memset (&pos , 0, sizeof (pos ));
+					}
+					
+#line 264 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 5:  {
+					{
 #line 43 "hb-buffer-deserialize-json.rl"
 #line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 2:
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 280 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 2:  {
+					{
 #line 51 "hb-buffer-deserialize-json.rl"
 #line 51 "hb-buffer-deserialize-json.rl"
-	{
-	tok = p;
-}
-	break;
-	case 14:
+						
+						tok = p;
+					}
+					
+#line 292 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 15:  {
+					{
 #line 55 "hb-buffer-deserialize-json.rl"
 #line 55 "hb-buffer-deserialize-json.rl"
-	{
-	if (!hb_font_glyph_from_string (font,
-					tok, p - tok,
-					&info.codepoint))
-	  return false;
-}
-	break;
-	case 15:
-#line 62 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_uint (tok, p, &info.codepoint)) return false; }
-	break;
-	case 8:
-#line 63 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
-	break;
-	case 10:
-#line 64 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
-	break;
-	case 12:
-#line 65 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
-	break;
-	case 3:
+						if (unlikely (!buffer->ensure_glyphs ())) return false; }
+					
+#line 302 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 21:  {
+					{
+#line 56 "hb-buffer-deserialize-json.rl"
+						if (unlikely (!buffer->ensure_unicode ())) return false; }
+					
+#line 312 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 16:  {
+					{
+#line 58 "hb-buffer-deserialize-json.rl"
+						
+						/* TODO Unescape \" and \\ if found. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 328 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 18:  {
+					{
 #line 66 "hb-buffer-deserialize-json.rl"
 #line 66 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
-	break;
-	case 6:
+						if (!parse_uint (tok, p, &info.codepoint)) return false; }
+					
+#line 338 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 8:  {
+					{
 #line 67 "hb-buffer-deserialize-json.rl"
 #line 67 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
-	break;
-	case 16:
-#line 62 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_uint (tok, p, &info.codepoint)) return false; }
+						if (!parse_uint (tok, p, &info.cluster )) return false; }
+					
+#line 348 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 10:  {
+					{
+#line 68 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+					
+#line 358 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 12:  {
+					{
+#line 69 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+					
+#line 368 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 3:  {
+					{
+#line 70 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+					
+#line 378 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 6:  {
+					{
+#line 71 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+					
+#line 388 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 14:  {
+					{
+#line 51 "hb-buffer-deserialize-json.rl"
+						
+						tok = p;
+					}
+					
+#line 400 "hb-buffer-deserialize-json.hh"
+					
+					{
+#line 55 "hb-buffer-deserialize-json.rl"
+						if (unlikely (!buffer->ensure_glyphs ())) return false; }
+					
+#line 406 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 20:  {
+					{
+#line 51 "hb-buffer-deserialize-json.rl"
+						
+						tok = p;
+					}
+					
+#line 418 "hb-buffer-deserialize-json.hh"
+					
+					{
+#line 56 "hb-buffer-deserialize-json.rl"
+						if (unlikely (!buffer->ensure_unicode ())) return false; }
+					
+#line 424 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 17:  {
+					{
+#line 58 "hb-buffer-deserialize-json.rl"
+						
+						/* TODO Unescape \" and \\ if found. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 440 "hb-buffer-deserialize-json.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-json.rl"
 #line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 9:
-#line 63 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 452 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 19:  {
+					{
+#line 66 "hb-buffer-deserialize-json.rl"
+						if (!parse_uint (tok, p, &info.codepoint)) return false; }
+					
+#line 462 "hb-buffer-deserialize-json.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-json.rl"
 #line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 11:
-#line 64 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 474 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 9:  {
+					{
+#line 67 "hb-buffer-deserialize-json.rl"
+						if (!parse_uint (tok, p, &info.cluster )) return false; }
+					
+#line 484 "hb-buffer-deserialize-json.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-json.rl"
 #line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 13:
-#line 65 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 496 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 11:  {
+					{
+#line 68 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+					
+#line 506 "hb-buffer-deserialize-json.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-json.rl"
 #line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 4:
-#line 66 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 518 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 13:  {
+					{
+#line 69 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+					
+#line 528 "hb-buffer-deserialize-json.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-json.rl"
 #line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 7:
-#line 67 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 540 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 4:  {
+					{
+#line 70 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+					
+#line 550 "hb-buffer-deserialize-json.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-json.rl"
 #line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-#line 624 "hb-buffer-deserialize-json.hh"
-	}
-
-_again:
-	if ( cs == 0 )
-		goto _out;
-	if ( ++p != pe )
-		goto _resume;
-	_test_eof: {}
-	_out: {}
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 562 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+				case 7:  {
+					{
+#line 71 "hb-buffer-deserialize-json.rl"
+						if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+					
+#line 572 "hb-buffer-deserialize-json.hh"
+					
+					{
+#line 43 "hb-buffer-deserialize-json.rl"
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 584 "hb-buffer-deserialize-json.hh"
+					
+					
+					break; 
+				}
+			}
+			
+		}
+		
+		if ( cs != 0 ) {
+			p += 1;
+			goto _resume;
+		}
+		_out: {}
 	}
 	}
-
-#line 125 "hb-buffer-deserialize-json.rl"
-
-
-  *end_ptr = p;
-
-  return p == pe && *(p-1) != ']';
+	
+#line 136 "hb-buffer-deserialize-json.rl"
+	
+	
+	*end_ptr = p;
+	
+	return p == pe && *(p-1) != ']';
 }
 }
 
 
 #endif /* HB_BUFFER_DESERIALIZE_JSON_HH */
 #endif /* HB_BUFFER_DESERIALIZE_JSON_HH */

+ 708 - 515
thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh

@@ -1,30 +1,29 @@
-
 #line 1 "hb-buffer-deserialize-text.rl"
 #line 1 "hb-buffer-deserialize-text.rl"
 /*
 /*
- * Copyright © 2013  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
+* Copyright © 2013  Google, Inc.
+*
+*  This is part of HarfBuzz, a text shaping library.
+*
+* Permission is hereby granted, without written agreement and without
+* license or royalty fees, to use, copy, modify, and distribute this
+* software and its documentation for any purpose, provided that the
+* above copyright notice and the following two paragraphs appear in
+* all copies of this software.
+*
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+* DAMAGE.
+*
+* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+*
+* Google Author(s): Behdad Esfahbod
+*/
 
 
 #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH
 #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH
 #define HB_BUFFER_DESERIALIZE_TEXT_HH
 #define HB_BUFFER_DESERIALIZE_TEXT_HH
@@ -32,540 +31,734 @@
 #include "hb.hh"
 #include "hb.hh"
 
 
 
 
-#line 36 "hb-buffer-deserialize-text.hh"
+#line 35 "hb-buffer-deserialize-text.hh"
 static const unsigned char _deserialize_text_trans_keys[] = {
 static const unsigned char _deserialize_text_trans_keys[] = {
-	0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 
-	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 
-	9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 
-	9u, 124u, 9u, 124u, 9u, 124u, 0
+	1u, 0u, 0u, 13u, 12u, 12u, 2u, 2u,
+	5u, 11u, 0u, 12u, 5u, 6u, 4u, 6u,
+	5u, 6u, 5u, 6u, 4u, 6u, 5u, 6u,
+	3u, 3u, 4u, 6u, 5u, 6u, 3u, 6u,
+	2u, 16u, 4u, 6u, 5u, 6u, 0u, 16u,
+	0u, 16u, 1u, 0u, 0u, 12u, 0u, 16u,
+	0u, 16u, 0u, 16u, 0u, 16u, 0u, 16u,
+	0u, 16u, 0u, 16u, 0u, 16u, 0u, 16u,
+	0u, 16u, 0u, 16u, 0u, 16u, 0u, 16u,
+	0u, 16u, 0u
 };
 };
 
 
-static const char _deserialize_text_key_spans[] = {
-	0, 114, 13, 10, 13, 10, 10, 13, 
-	10, 1, 13, 10, 14, 116, 116, 0, 
-	114, 116, 116, 116, 116, 116, 116, 116, 
-	116, 116, 116
+static const signed char _deserialize_text_char_class[] = {
+	0, 0, 0, 0, 0, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 0,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 2, 3, 4, 1, 1, 5,
+	6, 6, 6, 6, 6, 6, 6, 6,
+	6, 1, 1, 7, 8, 9, 1, 10,
+	11, 11, 11, 11, 11, 11, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 12, 1, 1, 1,
+	1, 1, 13, 14, 15, 1, 1, 1,
+	11, 11, 11, 11, 11, 11, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 16, 0
 };
 };
 
 
 static const short _deserialize_text_index_offsets[] = {
 static const short _deserialize_text_index_offsets[] = {
-	0, 0, 115, 129, 140, 154, 165, 176, 
-	190, 201, 203, 217, 228, 243, 360, 477, 
-	478, 593, 710, 827, 944, 1061, 1178, 1295, 
-	1412, 1529, 1646
+	0, 0, 14, 15, 16, 23, 36, 38,
+	41, 43, 45, 48, 50, 51, 54, 56,
+	60, 75, 78, 80, 97, 114, 114, 127,
+	144, 161, 178, 195, 212, 229, 246, 263,
+	280, 297, 314, 331, 348, 0
+};
+
+static const signed char _deserialize_text_indicies[] = {
+	1, 0, 0, 0, 0, 0, 0, 2,
+	0, 0, 0, 0, 0, 3, 4, 6,
+	7, 7, 0, 0, 0, 0, 7, 8,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 4, 10, 11, 13, 14,
+	15, 17, 18, 20, 21, 23, 24, 25,
+	27, 28, 29, 31, 32, 33, 35, 36,
+	29, 0, 28, 28, 38, 38, 0, 0,
+	0, 0, 38, 0, 38, 0, 0, 0,
+	38, 38, 38, 40, 41, 42, 44, 45,
+	47, 0, 0, 0, 0, 48, 48, 0,
+	49, 50, 0, 48, 0, 0, 0, 0,
+	51, 52, 0, 0, 0, 0, 0, 0,
+	0, 0, 53, 0, 0, 0, 0, 0,
+	0, 54, 8, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 4, 56,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	57, 0, 0, 0, 0, 0, 0, 58,
+	56, 0, 0, 0, 0, 60, 60, 0,
+	0, 57, 0, 0, 0, 0, 0, 0,
+	58, 63, 62, 64, 0, 62, 62, 62,
+	62, 65, 62, 66, 62, 62, 62, 67,
+	68, 69, 71, 38, 72, 0, 38, 38,
+	38, 38, 73, 38, 74, 38, 38, 38,
+	37, 75, 76, 78, 0, 0, 79, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 80, 81, 82, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 53, 83, 84, 62, 64,
+	0, 62, 62, 62, 62, 65, 62, 66,
+	62, 62, 62, 67, 68, 69, 86, 0,
+	87, 0, 0, 0, 0, 0, 0, 0,
+	88, 0, 0, 0, 0, 57, 89, 91,
+	0, 92, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 93, 94,
+	91, 0, 92, 0, 0, 36, 36, 0,
+	0, 0, 0, 0, 0, 0, 0, 93,
+	94, 86, 0, 87, 0, 0, 97, 97,
+	0, 0, 0, 88, 0, 0, 0, 0,
+	57, 89, 99, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 100, 101, 99, 0, 0, 0, 0,
+	45, 45, 0, 0, 0, 0, 0, 0,
+	0, 0, 100, 101, 78, 0, 0, 79,
+	0, 18, 18, 0, 0, 0, 0, 0,
+	0, 0, 0, 80, 81, 0
 };
 };
 
 
-static const char _deserialize_text_indicies[] = {
-	0, 0, 0, 0, 0, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	0, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	2, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 1, 1, 1, 1, 1, 1, 
-	1, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 1, 1, 1, 1, 1, 
-	1, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 1, 5, 1, 1, 6, 
-	7, 7, 7, 7, 7, 7, 7, 7, 
-	7, 1, 8, 9, 9, 9, 9, 9, 
-	9, 9, 9, 9, 1, 10, 1, 1, 
-	11, 12, 12, 12, 12, 12, 12, 12, 
-	12, 12, 1, 13, 14, 14, 14, 14, 
-	14, 14, 14, 14, 14, 1, 15, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	1, 17, 1, 1, 18, 19, 19, 19, 
-	19, 19, 19, 19, 19, 19, 1, 20, 
-	21, 21, 21, 21, 21, 21, 21, 21, 
-	21, 1, 22, 1, 23, 1, 1, 24, 
-	25, 25, 25, 25, 25, 25, 25, 25, 
-	25, 1, 26, 27, 27, 27, 27, 27, 
-	27, 27, 27, 27, 1, 22, 1, 1, 
-	1, 21, 21, 21, 21, 21, 21, 21, 
-	21, 21, 21, 1, 28, 28, 28, 28, 
-	28, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 28, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 29, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	30, 1, 1, 31, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	32, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 33, 
-	1, 34, 34, 34, 34, 34, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	34, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 35, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 36, 1, 1, 0, 
-	0, 0, 0, 0, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 0, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 2, 3, 
-	3, 3, 3, 3, 3, 3, 3, 3, 
-	1, 1, 1, 1, 1, 1, 1, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 1, 1, 1, 1, 1, 1, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 1, 28, 28, 28, 28, 28, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 28, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 29, 1, 1, 1, 
-	1, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 1, 1, 1, 30, 1, 
-	1, 31, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 32, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 33, 1, 38, 
-	38, 38, 38, 38, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 38, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 39, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 40, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 41, 1, 42, 42, 42, 42, 
-	42, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 42, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	43, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 44, 
-	1, 42, 42, 42, 42, 42, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	42, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	14, 14, 14, 14, 14, 14, 14, 14, 
-	14, 14, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 43, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 44, 1, 38, 38, 
-	38, 38, 38, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 38, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 39, 1, 1, 1, 9, 9, 9, 
-	9, 9, 9, 9, 9, 9, 9, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 40, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 41, 1, 45, 45, 45, 45, 45, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 45, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 46, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 47, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 48, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 49, 1, 
-	50, 50, 50, 50, 50, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 50, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 51, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 52, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 53, 1, 50, 50, 50, 
-	50, 50, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 50, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 51, 
-	1, 1, 1, 1, 27, 27, 27, 27, 
-	27, 27, 27, 27, 27, 27, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 52, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	53, 1, 45, 45, 45, 45, 45, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 45, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 46, 1, 1, 1, 
-	1, 54, 54, 54, 54, 54, 54, 54, 
-	54, 54, 54, 1, 1, 1, 1, 1, 
-	1, 47, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 48, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 49, 1, 28, 
-	28, 28, 28, 28, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 28, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 29, 1, 55, 55, 1, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	1, 1, 1, 30, 1, 1, 31, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 1, 1, 32, 1, 55, 1, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 1, 33, 1, 0
+static const signed char _deserialize_text_index_defaults[] = {
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 62, 38, 0, 0, 62, 0, 0,
+	0, 0, 0, 0, 0, 0
 };
 };
 
 
-static const char _deserialize_text_trans_targs[] = {
-	1, 0, 13, 17, 26, 3, 18, 21, 
-	18, 21, 5, 19, 20, 19, 20, 22, 
-	25, 8, 9, 12, 9, 12, 10, 11, 
-	23, 24, 23, 24, 14, 2, 6, 7, 
-	15, 16, 14, 15, 16, 17, 14, 4, 
-	15, 16, 14, 15, 16, 14, 2, 7, 
-	15, 16, 14, 2, 15, 16, 25, 26
+static const signed char _deserialize_text_cond_targs[] = {
+	0, 1, 2, 25, 3, 3, 4, 19,
+	5, 6, 23, 24, 7, 8, 27, 36,
+	8, 27, 36, 9, 30, 33, 10, 11,
+	12, 15, 11, 12, 15, 13, 13, 14,
+	31, 32, 14, 31, 32, 16, 26, 17,
+	18, 34, 35, 18, 34, 35, 19, 20,
+	19, 6, 21, 22, 20, 21, 22, 23,
+	20, 21, 22, 24, 24, 25, 26, 26,
+	7, 9, 10, 16, 21, 29, 26, 26,
+	7, 9, 10, 21, 29, 27, 28, 17,
+	21, 29, 28, 29, 29, 30, 28, 7,
+	10, 29, 31, 28, 7, 21, 29, 32,
+	33, 33, 34, 28, 21, 29, 35, 36,
+	0
 };
 };
 
 
-static const char _deserialize_text_trans_actions[] = {
-	0, 0, 1, 1, 1, 2, 2, 2, 
-	0, 0, 2, 2, 2, 0, 0, 2, 
-	2, 2, 2, 2, 0, 0, 3, 2, 
-	2, 2, 0, 0, 4, 5, 5, 5, 
-	4, 4, 0, 0, 0, 0, 6, 7, 
-	6, 6, 8, 8, 8, 9, 10, 10, 
-	9, 9, 11, 12, 11, 11, 0, 0
+static const signed char _deserialize_text_cond_actions[] = {
+	0, 0, 0, 0, 1, 0, 0, 2,
+	0, 0, 2, 2, 0, 3, 4, 4,
+	0, 5, 5, 0, 4, 4, 0, 3,
+	3, 3, 0, 0, 0, 6, 0, 3,
+	4, 4, 0, 5, 5, 0, 5, 0,
+	3, 4, 4, 0, 5, 5, 7, 7,
+	8, 9, 7, 7, 0, 0, 0, 10,
+	10, 10, 10, 10, 8, 11, 12, 13,
+	14, 14, 14, 15, 11, 11, 16, 17,
+	18, 18, 18, 16, 16, 19, 19, 20,
+	19, 19, 0, 0, 13, 10, 10, 21,
+	21, 10, 22, 22, 23, 22, 22, 22,
+	10, 5, 24, 24, 24, 24, 24, 19,
+	0
 };
 };
 
 
-static const char _deserialize_text_eof_actions[] = {
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 4, 0, 0, 
-	0, 4, 6, 8, 8, 6, 9, 11, 
-	11, 9, 4
+static const signed char _deserialize_text_eof_trans[] = {
+	1, 2, 3, 6, 7, 9, 10, 13,
+	17, 20, 23, 27, 28, 31, 35, 29,
+	38, 40, 44, 47, 53, 54, 55, 56,
+	60, 62, 71, 78, 83, 70, 86, 91,
+	96, 97, 99, 103, 104, 0
 };
 };
 
 
 static const int deserialize_text_start = 1;
 static const int deserialize_text_start = 1;
-static const int deserialize_text_first_final = 13;
+static const int deserialize_text_first_final = 19;
 static const int deserialize_text_error = 0;
 static const int deserialize_text_error = 0;
 
 
 static const int deserialize_text_en_main = 1;
 static const int deserialize_text_en_main = 1;
 
 
 
 
-#line 91 "hb-buffer-deserialize-text.rl"
+#line 114 "hb-buffer-deserialize-text.rl"
 
 
 
 
 static hb_bool_t
 static hb_bool_t
-_hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
-				    const char *buf,
-				    unsigned int buf_len,
-				    const char **end_ptr,
-				    hb_font_t *font)
+_hb_buffer_deserialize_text (hb_buffer_t *buffer,
+const char *buf,
+unsigned int buf_len,
+const char **end_ptr,
+hb_font_t *font)
 {
 {
-  const char *p = buf, *pe = buf + buf_len;
-
-  /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
-
-  while (p < pe && ISSPACE (*p))
-    p++;
-  if (p < pe && *p == (buffer->len ? '|' : '['))
-  {
-    *end_ptr = ++p;
-  }
-
-  const char *eof = pe, *tok = nullptr;
-  int cs;
-  hb_glyph_info_t info = {0};
-  hb_glyph_position_t pos = {0};
-  
-#line 343 "hb-buffer-deserialize-text.hh"
+	const char *p = buf, *pe = buf + buf_len;
+	
+	/* Ensure we have positions. */
+	(void) hb_buffer_get_glyph_positions (buffer, nullptr);
+	
+	while (p < pe && ISSPACE (*p))
+	p++;
+	
+	const char *eof = pe, *tok = nullptr;
+	int cs;
+	hb_glyph_info_t info = {0};
+	hb_glyph_position_t pos = {0};
+	
+#line 204 "hb-buffer-deserialize-text.hh"
 	{
 	{
-	cs = deserialize_text_start;
+		cs = (int)deserialize_text_start;
 	}
 	}
-
-#line 348 "hb-buffer-deserialize-text.hh"
+	
+#line 209 "hb-buffer-deserialize-text.hh"
 	{
 	{
-	int _slen;
-	int _trans;
-	const unsigned char *_keys;
-	const char *_inds;
-	if ( p == pe )
-		goto _test_eof;
-	if ( cs == 0 )
-		goto _out;
-_resume:
-	_keys = _deserialize_text_trans_keys + (cs<<1);
-	_inds = _deserialize_text_indicies + _deserialize_text_index_offsets[cs];
-
-	_slen = _deserialize_text_key_spans[cs];
-	_trans = _inds[ _slen > 0 && _keys[0] <=(*p) &&
-		(*p) <= _keys[1] ?
-		(*p) - _keys[0] : _slen ];
-
-	cs = _deserialize_text_trans_targs[_trans];
-
-	if ( _deserialize_text_trans_actions[_trans] == 0 )
-		goto _again;
-
-	switch ( _deserialize_text_trans_actions[_trans] ) {
-	case 2:
+		unsigned int _trans = 0;
+		const unsigned char * _keys;
+		const signed char * _inds;
+		int _ic;
+		_resume: {}
+		if ( p == pe && p != eof )
+			goto _out;
+		if ( p == eof ) {
+			if ( _deserialize_text_eof_trans[cs] > 0 ) {
+				_trans = (unsigned int)_deserialize_text_eof_trans[cs] - 1;
+			}
+		}
+		else {
+			_keys = ( _deserialize_text_trans_keys + ((cs<<1)));
+			_inds = ( _deserialize_text_indicies + (_deserialize_text_index_offsets[cs]));
+			
+			if ( ( (*( p))) <= 124 && ( (*( p))) >= 9 ) {
+				_ic = (int)_deserialize_text_char_class[(int)( (*( p))) - 9];
+				if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) )
+					_trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); 
+				else
+					_trans = (unsigned int)_deserialize_text_index_defaults[cs];
+			}
+			else {
+				_trans = (unsigned int)_deserialize_text_index_defaults[cs];
+			}
+			
+		}
+		cs = (int)_deserialize_text_cond_targs[_trans];
+		
+		if ( _deserialize_text_cond_actions[_trans] != 0 ) {
+			
+			switch ( _deserialize_text_cond_actions[_trans] ) {
+				case 1:  {
+					{
+#line 38 "hb-buffer-deserialize-text.rl"
+						
+						memset (&info, 0, sizeof (info));
+						memset (&pos , 0, sizeof (pos ));
+					}
+					
+#line 252 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 3:  {
+					{
 #line 51 "hb-buffer-deserialize-text.rl"
 #line 51 "hb-buffer-deserialize-text.rl"
-	{
-	tok = p;
-}
-	break;
-	case 5:
+						
+						tok = p;
+					}
+					
+#line 264 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 5:  {
+					{
 #line 55 "hb-buffer-deserialize-text.rl"
 #line 55 "hb-buffer-deserialize-text.rl"
-	{
-	if (!hb_font_glyph_from_string (font,
-					tok, p - tok,
-					&info.codepoint))
-	  return false;
-}
-	break;
-	case 10:
-#line 62 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
-	break;
-	case 3:
-#line 63 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
-	break;
-	case 12:
-#line 64 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
-	break;
-	case 7:
-#line 65 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
-	break;
-	case 1:
+						if (unlikely (!buffer->ensure_glyphs ())) return false; }
+					
+#line 274 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 8:  {
+					{
+#line 56 "hb-buffer-deserialize-text.rl"
+						if (unlikely (!buffer->ensure_unicode ())) return false; }
+					
+#line 284 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 18:  {
+					{
+#line 58 "hb-buffer-deserialize-text.rl"
+						
+						/* TODO Unescape delimeters. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 300 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 9:  {
+					{
+#line 66 "hb-buffer-deserialize-text.rl"
+						if (!parse_hex (tok, p, &info.codepoint )) return false; }
+					
+#line 310 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 21:  {
+					{
+#line 68 "hb-buffer-deserialize-text.rl"
+						if (!parse_uint (tok, p, &info.cluster )) return false; }
+					
+#line 320 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 6:  {
+					{
+#line 69 "hb-buffer-deserialize-text.rl"
+						if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+					
+#line 330 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 23:  {
+					{
+#line 70 "hb-buffer-deserialize-text.rl"
+						if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+					
+#line 340 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 20:  {
+					{
+#line 71 "hb-buffer-deserialize-text.rl"
+						if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+					
+#line 350 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 15:  {
+					{
 #line 38 "hb-buffer-deserialize-text.rl"
 #line 38 "hb-buffer-deserialize-text.rl"
-	{
-	memset (&info, 0, sizeof (info));
-	memset (&pos , 0, sizeof (pos ));
-}
+						
+						memset (&info, 0, sizeof (info));
+						memset (&pos , 0, sizeof (pos ));
+					}
+					
+#line 363 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 51 "hb-buffer-deserialize-text.rl"
 #line 51 "hb-buffer-deserialize-text.rl"
-	{
-	tok = p;
-}
-	break;
-	case 4:
+						
+						tok = p;
+					}
+					
+#line 371 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 4:  {
+					{
+#line 51 "hb-buffer-deserialize-text.rl"
+						
+						tok = p;
+					}
+					
+#line 383 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 55 "hb-buffer-deserialize-text.rl"
 #line 55 "hb-buffer-deserialize-text.rl"
-	{
-	if (!hb_font_glyph_from_string (font,
-					tok, p - tok,
-					&info.codepoint))
-	  return false;
-}
-#line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 9:
-#line 62 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+						if (unlikely (!buffer->ensure_glyphs ())) return false; }
+					
+#line 389 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 2:  {
+					{
+#line 51 "hb-buffer-deserialize-text.rl"
+						
+						tok = p;
+					}
+					
+#line 401 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 56 "hb-buffer-deserialize-text.rl"
+						if (unlikely (!buffer->ensure_unicode ())) return false; }
+					
+#line 407 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 16:  {
+					{
+#line 58 "hb-buffer-deserialize-text.rl"
+						
+						/* TODO Unescape delimeters. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 423 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 11:
-#line 64 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 435 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 7:  {
+					{
+#line 66 "hb-buffer-deserialize-text.rl"
+						if (!parse_hex (tok, p, &info.codepoint )) return false; }
+					
+#line 445 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 6:
-#line 65 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 457 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 10:  {
+					{
+#line 68 "hb-buffer-deserialize-text.rl"
+						if (!parse_uint (tok, p, &info.cluster )) return false; }
+					
+#line 467 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 8:
-#line 66 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 479 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 22:  {
+					{
+#line 70 "hb-buffer-deserialize-text.rl"
+						if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+					
+#line 489 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-#line 480 "hb-buffer-deserialize-text.hh"
-	}
-
-_again:
-	if ( cs == 0 )
-		goto _out;
-	if ( ++p != pe )
-		goto _resume;
-	_test_eof: {}
-	if ( p == eof )
-	{
-	switch ( _deserialize_text_eof_actions[cs] ) {
-	case 4:
-#line 55 "hb-buffer-deserialize-text.rl"
-	{
-	if (!hb_font_glyph_from_string (font,
-					tok, p - tok,
-					&info.codepoint))
-	  return false;
-}
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 501 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 19:  {
+					{
+#line 71 "hb-buffer-deserialize-text.rl"
+						if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+					
+#line 511 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 9:
-#line 62 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 523 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 24:  {
+					{
+#line 72 "hb-buffer-deserialize-text.rl"
+						if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+					
+#line 533 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 11:
-#line 64 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 545 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 12:  {
+					{
+#line 38 "hb-buffer-deserialize-text.rl"
+						
+						memset (&info, 0, sizeof (info));
+						memset (&pos , 0, sizeof (pos ));
+					}
+					
+#line 558 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 51 "hb-buffer-deserialize-text.rl"
+						
+						tok = p;
+					}
+					
+#line 566 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 55 "hb-buffer-deserialize-text.rl"
+						if (unlikely (!buffer->ensure_glyphs ())) return false; }
+					
+#line 572 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 14:  {
+					{
+#line 38 "hb-buffer-deserialize-text.rl"
+						
+						memset (&info, 0, sizeof (info));
+						memset (&pos , 0, sizeof (pos ));
+					}
+					
+#line 585 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 51 "hb-buffer-deserialize-text.rl"
+						
+						tok = p;
+					}
+					
+#line 593 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 58 "hb-buffer-deserialize-text.rl"
+						
+						/* TODO Unescape delimeters. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 605 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 17:  {
+					{
+#line 58 "hb-buffer-deserialize-text.rl"
+						
+						/* TODO Unescape delimeters. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 621 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 55 "hb-buffer-deserialize-text.rl"
+						if (unlikely (!buffer->ensure_glyphs ())) return false; }
+					
+#line 627 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 6:
-#line 65 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 639 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 11:  {
+					{
+#line 38 "hb-buffer-deserialize-text.rl"
+						
+						memset (&info, 0, sizeof (info));
+						memset (&pos , 0, sizeof (pos ));
+					}
+					
+#line 652 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 51 "hb-buffer-deserialize-text.rl"
+						
+						tok = p;
+					}
+					
+#line 660 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 58 "hb-buffer-deserialize-text.rl"
+						
+						/* TODO Unescape delimeters. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 672 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 8:
-#line 66 "hb-buffer-deserialize-text.rl"
-	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 684 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+				case 13:  {
+					{
+#line 38 "hb-buffer-deserialize-text.rl"
+						
+						memset (&info, 0, sizeof (info));
+						memset (&pos , 0, sizeof (pos ));
+					}
+					
+#line 697 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 51 "hb-buffer-deserialize-text.rl"
+						
+						tok = p;
+					}
+					
+#line 705 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 58 "hb-buffer-deserialize-text.rl"
+						
+						/* TODO Unescape delimeters. */
+						if (!hb_font_glyph_from_string (font,
+						tok, p - tok,
+						&info.codepoint))
+						return false;
+					}
+					
+#line 717 "hb-buffer-deserialize-text.hh"
+					
+					{
+#line 55 "hb-buffer-deserialize-text.rl"
+						if (unlikely (!buffer->ensure_glyphs ())) return false; }
+					
+#line 723 "hb-buffer-deserialize-text.hh"
+					
+					{
 #line 43 "hb-buffer-deserialize-text.rl"
 #line 43 "hb-buffer-deserialize-text.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-#line 557 "hb-buffer-deserialize-text.hh"
-	}
-	}
-
-	_out: {}
+						
+						buffer->add_info (info);
+						if (unlikely (!buffer->successful))
+						return false;
+						buffer->pos[buffer->len - 1] = pos;
+						*end_ptr = p;
+					}
+					
+#line 735 "hb-buffer-deserialize-text.hh"
+					
+					
+					break; 
+				}
+			}
+			
+		}
+		
+		if ( p == eof ) {
+			if ( cs >= 19 )
+				goto _out;
+		}
+		else {
+			if ( cs != 0 ) {
+				p += 1;
+				goto _resume;
+			}
+		}
+		_out: {}
 	}
 	}
-
-#line 119 "hb-buffer-deserialize-text.rl"
-
-
-  *end_ptr = p;
-
-  return p == pe && *(p-1) != ']';
+	
+#line 138 "hb-buffer-deserialize-text.rl"
+	
+	
+	*end_ptr = p;
+	
+	return p == pe && *(p-1) != ']';
 }
 }
 
 
 #endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */
 #endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */

+ 454 - 65
thirdparty/harfbuzz/src/hb-buffer-serialize.cc

@@ -91,26 +91,26 @@ hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
 {
 {
   switch ((unsigned) format)
   switch ((unsigned) format)
   {
   {
-    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:	return serialize_formats[0];
-    case HB_BUFFER_SERIALIZE_FORMAT_JSON:	return serialize_formats[1];
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0];
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1];
     default:
     default:
-    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:	return nullptr;
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:  return nullptr;
   }
   }
 }
 }
 
 
 static unsigned int
 static unsigned int
 _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
 _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
-				  unsigned int start,
-				  unsigned int end,
-				  char *buf,
-				  unsigned int buf_size,
-				  unsigned int *buf_consumed,
-				  hb_font_t *font,
-				  hb_buffer_serialize_flags_t flags)
+                                  unsigned int start,
+                                  unsigned int end,
+                                  char *buf,
+                                  unsigned int buf_size,
+                                  unsigned int *buf_consumed,
+                                  hb_font_t *font,
+                                  hb_buffer_serialize_flags_t flags)
 {
 {
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
-			     nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
+                             nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
 
   *buf_consumed = 0;
   *buf_consumed = 0;
   hb_position_t x = 0, y = 0;
   hb_position_t x = 0, y = 0;
@@ -125,6 +125,8 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
 
 
     if (i)
     if (i)
       *p++ = ',';
       *p++ = ',';
+    else
+      *p++ = '[';
 
 
     *p++ = '{';
     *p++ = '{';
 
 
@@ -134,8 +136,9 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
       char g[128];
       char g[128];
       hb_font_glyph_to_string (font, info[i].codepoint, g, sizeof (g));
       hb_font_glyph_to_string (font, info[i].codepoint, g, sizeof (g));
       *p++ = '"';
       *p++ = '"';
-      for (char *q = g; *q; q++) {
-	if (*q == '"')
+      for (char *q = g; *q; q++)
+      {
+	if (unlikely (*q == '"' || *q == '\\'))
 	  *p++ = '\\';
 	  *p++ = '\\';
 	*p++ = *q;
 	*p++ = *q;
       }
       }
@@ -151,16 +154,16 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
     {
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
-			     x+pos[i].x_offset, y+pos[i].y_offset));
+		   x+pos[i].x_offset, y+pos[i].y_offset));
       if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
       if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
-	p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
-			       pos[i].x_advance, pos[i].y_advance));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
+		     pos[i].x_advance, pos[i].y_advance));
     }
     }
 
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
     {
     {
       if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
       if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
-	p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
     }
     }
 
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
@@ -168,12 +171,14 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
       hb_glyph_extents_t extents;
       hb_glyph_extents_t extents;
       hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
       hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
-		extents.x_bearing, extents.y_bearing));
+                                extents.x_bearing, extents.y_bearing));
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
-		extents.width, extents.height));
+                                extents.width, extents.height));
     }
     }
 
 
     *p++ = '}';
     *p++ = '}';
+    if (i == end-1)
+      *p++ = ']';
 
 
     unsigned int l = p - b;
     unsigned int l = p - b;
     if (buf_size > l)
     if (buf_size > l)
@@ -196,19 +201,72 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
   return end - start;
   return end - start;
 }
 }
 
 
+static unsigned int
+_hb_buffer_serialize_unicode_json (hb_buffer_t *buffer,
+          unsigned int start,
+          unsigned int end,
+          char *buf,
+          unsigned int buf_size,
+          unsigned int *buf_consumed,
+          hb_buffer_serialize_flags_t flags)
+{
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+
+  *buf_consumed = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    char b[1024];
+    char *p = b;
+
+    if (i)
+      *p++ = ',';
+    else
+      *p++ = '[';
+
+    *p++ = '{';
+
+    APPEND ("\"u\":");
+
+    p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster));
+    }
+
+    *p++ = '}';
+
+    if (i == end-1)
+      *p++ = ']';
+
+    unsigned int l = p - b;
+    if (buf_size > l)
+    {
+      memcpy (buf, b, l);
+      buf += l;
+      buf_size -= l;
+      *buf_consumed += l;
+      *buf = '\0';
+    } else
+      return i - start;
+
+  }
+
+  return end - start;
+}
+
 static unsigned int
 static unsigned int
 _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
 _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
-				  unsigned int start,
-				  unsigned int end,
-				  char *buf,
-				  unsigned int buf_size,
-				  unsigned int *buf_consumed,
-				  hb_font_t *font,
-				  hb_buffer_serialize_flags_t flags)
+                                  unsigned int start,
+                                  unsigned int end,
+                                  char *buf,
+                                  unsigned int buf_size,
+                                  unsigned int *buf_consumed,
+                                  hb_font_t *font,
+                                  hb_buffer_serialize_flags_t flags)
 {
 {
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
-			     nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
+           nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
 
   *buf_consumed = 0;
   *buf_consumed = 0;
   hb_position_t x = 0, y = 0;
   hb_position_t x = 0, y = 0;
@@ -221,9 +279,12 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
 
 
     if (i)
     if (i)
       *p++ = '|';
       *p++ = '|';
+    else
+      *p++ = '[';
 
 
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES))
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES))
     {
     {
+      /* TODO Escape delimiters we use. */
       hb_font_glyph_to_string (font, info[i].codepoint, p, 128);
       hb_font_glyph_to_string (font, info[i].codepoint, p, 128);
       p += strlen (p);
       p += strlen (p);
     }
     }
@@ -237,21 +298,21 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
     {
       if (x+pos[i].x_offset || y+pos[i].y_offset)
       if (x+pos[i].x_offset || y+pos[i].y_offset)
-	p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
 
 
       if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
       if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
       {
       {
-	*p++ = '+';
-	p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
-	if (pos[i].y_advance)
-	  p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
+        *p++ = '+';
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
+        if (pos[i].y_advance)
+          p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
       }
       }
     }
     }
 
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
     {
     {
       if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
       if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
-	p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
     }
     }
 
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
@@ -261,6 +322,10 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height));
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height));
     }
     }
 
 
+    if (i == end-1) {
+      *p++ = ']';
+    }
+
     unsigned int l = p - b;
     unsigned int l = p - b;
     if (buf_size > l)
     if (buf_size > l)
     {
     {
@@ -282,6 +347,51 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
   return end - start;
   return end - start;
 }
 }
 
 
+
+static unsigned int
+_hb_buffer_serialize_unicode_text (hb_buffer_t *buffer,
+                                   unsigned int start,
+                                   unsigned int end,
+                                   char *buf,
+                                   unsigned int buf_size,
+                                   unsigned int *buf_consumed,
+                                   hb_buffer_serialize_flags_t flags)
+{
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+  *buf_consumed = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    char b[1024];
+    char *p = b;
+
+    if (i)
+      *p++ = '|';
+    else
+      *p++ = '<';
+
+    p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "U+%04X", info[i].codepoint));
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster));
+    }
+
+    if (i == end-1)
+      *p++ = '>';
+
+    unsigned int l = p - b;
+    if (buf_size > l)
+    {
+      memcpy (buf, b, l);
+      buf += l;
+      buf_size -= l;
+      *buf_consumed += l;
+      *buf = '\0';
+    } else
+      return i - start;
+  }
+  return end - start;
+}
+
 /**
 /**
  * hb_buffer_serialize_glyphs:
  * hb_buffer_serialize_glyphs:
  * @buffer: an #hb_buffer_t buffer.
  * @buffer: an #hb_buffer_t buffer.
@@ -308,6 +418,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
  * ```
  * ```
  * [uni0651=0@518,0+0|uni0628=0+1897]
  * [uni0651=0@518,0+0|uni0628=0+1897]
  * ```
  * ```
+ *
  * - The serialized glyphs are delimited with `[` and `]`.
  * - The serialized glyphs are delimited with `[` and `]`.
  * - Glyphs are separated with `|`
  * - Glyphs are separated with `|`
  * - Each glyph starts with glyph name, or glyph index if
  * - Each glyph starts with glyph name, or glyph index if
@@ -316,12 +427,28 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
  *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
  *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
  *     - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
  *     - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
  *     - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
  *     - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
- *   - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the
- *     #hb_glyph_extents_t in the format
- *     `&lt;x_bearing,y_bearing,width,height&gt;`
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the #hb_glyph_extents_t in the format `<x_bearing,y_bearing,width,height>`
  *
  *
  * ## json
  * ## json
- * TODO.
+ * A machine-readable, structured format.
+ * The serialized glyphs will look something like:
+ *
+ * ```
+ * [{"g":"uni0651","cl":0,"dx":518,"dy":0,"ax":0,"ay":0},
+ * {"g":"uni0628","cl":0,"dx":0,"dy":0,"ax":1897,"ay":0}]
+ * ```
+ *
+ * Each glyph is a JSON object, with the following properties:
+ * - `g`: the glyph name or glyph index if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set.
+ * - `cl`: #hb_glyph_info_t.cluster if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set.
+ * - `dx`,`dy`,`ax`,`ay`: #hb_glyph_position_t.x_offset, #hb_glyph_position_t.y_offset,
+ *    #hb_glyph_position_t.x_advance and #hb_glyph_position_t.y_advance
+ *    respectively, if #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set.
+ * - `xb`,`yb`,`w`,`h`: #hb_glyph_extents_t.x_bearing, #hb_glyph_extents_t.y_bearing,
+ *    #hb_glyph_extents_t.width and #hb_glyph_extents_t.height respectively if
+ *    #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set.
  *
  *
  * Return value:
  * Return value:
  * The number of serialized items.
  * The number of serialized items.
@@ -330,16 +457,17 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
  **/
  **/
 unsigned int
 unsigned int
 hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
 hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
-			    unsigned int start,
-			    unsigned int end,
-			    char *buf,
-			    unsigned int buf_size,
-			    unsigned int *buf_consumed,
-			    hb_font_t *font,
-			    hb_buffer_serialize_format_t format,
-			    hb_buffer_serialize_flags_t flags)
+                            unsigned int start,
+                            unsigned int end,
+                            char *buf,
+                            unsigned int buf_size,
+                            unsigned int *buf_consumed,
+                            hb_font_t *font,
+                            hb_buffer_serialize_format_t format,
+                            hb_buffer_serialize_flags_t flags)
 {
 {
-  assert (start <= end && end <= buffer->len);
+  end = hb_clamp (end, start, buffer->len);
+  start = hb_min (start, end);
 
 
   unsigned int sconsumed;
   unsigned int sconsumed;
   if (!buf_consumed)
   if (!buf_consumed)
@@ -348,8 +476,7 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
   if (buf_size)
   if (buf_size)
     *buf = '\0';
     *buf = '\0';
 
 
-  assert ((!buffer->len && (buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID)) ||
-	  (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS));
+  buffer->assert_glyphs ();
 
 
   if (!buffer->have_positions)
   if (!buffer->have_positions)
     flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
     flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
@@ -364,13 +491,13 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
   {
   {
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
       return _hb_buffer_serialize_glyphs_text (buffer, start, end,
       return _hb_buffer_serialize_glyphs_text (buffer, start, end,
-					       buf, buf_size, buf_consumed,
-					       font, flags);
+                 buf, buf_size, buf_consumed,
+                 font, flags);
 
 
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:
       return _hb_buffer_serialize_glyphs_json (buffer, start, end,
       return _hb_buffer_serialize_glyphs_json (buffer, start, end,
-					       buf, buf_size, buf_consumed,
-					       font, flags);
+                 buf, buf_size, buf_consumed,
+                 font, flags);
 
 
     default:
     default:
     case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
     case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
@@ -379,6 +506,182 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
   }
   }
 }
 }
 
 
+/**
+ * hb_buffer_serialize_unicode:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ *       write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ *
+ * Serializes @buffer into a textual representation of its content,
+ * when the buffer contains Unicode codepoints (i.e., before shaping). This is
+ * useful for showing the contents of the buffer, for example during debugging.
+ * There are currently two supported serialization formats:
+ *
+ * ## text
+ * A human-readable, plain text format.
+ * The serialized codepoints will look something like:
+ *
+ * ```
+ *  <U+0651=0|U+0628=1>
+ * ```
+ *
+ * - Glyphs are separated with `|`
+ * - Unicode codepoints are expressed as zero-padded four (or more)
+ *   digit hexadecimal numbers preceded by `U+`
+ * - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, the cluster
+ *   will be indicated with a `=` then #hb_glyph_info_t.cluster.
+ *
+ * ## json
+ * A machine-readable, structured format.
+ * The serialized codepoints will be a list of objects with the following
+ * properties:
+ * - `u`: the Unicode codepoint as a decimal integer
+ * - `cl`: #hb_glyph_info_t.cluster if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set.
+ *
+ * For example:
+ *
+ * ```
+ * [{u:1617,cl:0},{u:1576,cl:1}]
+ * ```
+ *
+ * Return value:
+ * The number of serialized items.
+ *
+ * Since: 2.7.3
+ **/
+unsigned int
+hb_buffer_serialize_unicode (hb_buffer_t *buffer,
+                             unsigned int start,
+                             unsigned int end,
+                             char *buf,
+                             unsigned int buf_size,
+                             unsigned int *buf_consumed,
+                             hb_buffer_serialize_format_t format,
+                             hb_buffer_serialize_flags_t flags)
+{
+  end = hb_clamp (end, start, buffer->len);
+  start = hb_min (start, end);
+
+  unsigned int sconsumed;
+  if (!buf_consumed)
+    buf_consumed = &sconsumed;
+  *buf_consumed = 0;
+  if (buf_size)
+    *buf = '\0';
+
+  buffer->assert_unicode ();
+
+  if (unlikely (start == end))
+    return 0;
+
+  switch (format)
+  {
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
+      return _hb_buffer_serialize_unicode_text (buffer, start, end,
+                                                buf, buf_size, buf_consumed, flags);
+
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON:
+      return _hb_buffer_serialize_unicode_json (buffer, start, end,
+                                                buf, buf_size, buf_consumed, flags);
+
+    default:
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
+      return 0;
+
+  }
+}
+
+static unsigned int
+_hb_buffer_serialize_invalid (hb_buffer_t *buffer,
+                              unsigned int start,
+                              unsigned int end,
+                              char *buf,
+                              unsigned int buf_size,
+                              unsigned int *buf_consumed,
+                              hb_buffer_serialize_format_t format,
+                              hb_buffer_serialize_flags_t flags)
+{
+  assert (!buffer->len);
+
+  unsigned int sconsumed;
+  if (!buf_consumed)
+    buf_consumed = &sconsumed;
+  if (buf_size < 3)
+    return 0;
+  if (format == HB_BUFFER_SERIALIZE_FORMAT_JSON) {
+    *buf++ = '[';
+    *buf++ = ']';
+    *buf = '\0';
+  } else if (format == HB_BUFFER_SERIALIZE_FORMAT_TEXT) {
+    *buf++ = '!';
+    *buf++ = '!';
+    *buf = '\0';
+  }
+  *buf_consumed = 2;
+  return 0;
+}
+
+/**
+ * hb_buffer_serialize:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ *       write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ *        read glyph names and extents. If %NULL, and empty font will be used.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ *         to serialize.
+ *
+ * Serializes @buffer into a textual representation of its content, whether
+ * Unicode codepoints or glyph identifiers and positioning information. This is
+ * useful for showing the contents of the buffer, for example during debugging.
+ * See the documentation of hb_buffer_serialize_unicode() and
+ * hb_buffer_serialize_glyphs() for a description of the output format.
+ *
+ * Return value:
+ * The number of serialized items.
+ *
+ * Since: 2.7.3
+ **/
+unsigned int
+hb_buffer_serialize (hb_buffer_t *buffer,
+                     unsigned int start,
+                     unsigned int end,
+                     char *buf,
+                     unsigned int buf_size,
+                     unsigned int *buf_consumed,
+                     hb_font_t *font,
+                     hb_buffer_serialize_format_t format,
+                     hb_buffer_serialize_flags_t flags)
+{
+  switch (buffer->content_type)
+  {
+
+    case HB_BUFFER_CONTENT_TYPE_GLYPHS:
+      return hb_buffer_serialize_glyphs (buffer, start, end, buf, buf_size,
+					 buf_consumed, font, format, flags);
+
+    case HB_BUFFER_CONTENT_TYPE_UNICODE:
+      return hb_buffer_serialize_unicode (buffer, start, end, buf, buf_size,
+					  buf_consumed, format, flags);
+
+    case HB_BUFFER_CONTENT_TYPE_INVALID:
+    default:
+      return _hb_buffer_serialize_invalid (buffer, start, end, buf, buf_size,
+					   buf_consumed, format, flags);
+  }
+}
+
 static bool
 static bool
 parse_int (const char *pp, const char *end, int32_t *pv)
 parse_int (const char *pp, const char *end, int32_t *pv)
 {
 {
@@ -403,6 +706,18 @@ parse_uint (const char *pp, const char *end, uint32_t *pv)
   return true;
   return true;
 }
 }
 
 
+static bool
+parse_hex (const char *pp, const char *end, uint32_t *pv)
+{
+  unsigned int v;
+  const char *p = pp;
+  if (unlikely (!hb_parse_uint (&p, end, &v, true/* whole buffer */, 16)))
+    return false;
+
+  *pv = v;
+  return true;
+}
+
 #include "hb-buffer-deserialize-json.hh"
 #include "hb-buffer-deserialize-json.hh"
 #include "hb-buffer-deserialize-text.hh"
 #include "hb-buffer-deserialize-text.hh"
 
 
@@ -423,19 +738,25 @@ parse_uint (const char *pp, const char *end, uint32_t *pv)
  **/
  **/
 hb_bool_t
 hb_bool_t
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
-			      const char *buf,
-			      int buf_len, /* -1 means nul-terminated */
-			      const char **end_ptr, /* May be NULL */
-			      hb_font_t *font, /* May be NULL */
-			      hb_buffer_serialize_format_t format)
+                              const char *buf,
+                              int buf_len, /* -1 means nul-terminated */
+                              const char **end_ptr, /* May be NULL */
+                              hb_font_t *font, /* May be NULL */
+                              hb_buffer_serialize_format_t format)
 {
 {
   const char *end;
   const char *end;
   if (!end_ptr)
   if (!end_ptr)
     end_ptr = &end;
     end_ptr = &end;
   *end_ptr = buf;
   *end_ptr = buf;
 
 
-  assert ((!buffer->len && (buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID)) ||
-	  (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS));
+  buffer->assert_glyphs ();
+
+  if (unlikely (hb_object_is_immutable (buffer)))
+  {
+    if (end_ptr)
+      *end_ptr = buf;
+    return false;
+  }
 
 
   if (buf_len == -1)
   if (buf_len == -1)
     buf_len = strlen (buf);
     buf_len = strlen (buf);
@@ -454,14 +775,82 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
   switch (format)
   switch (format)
   {
   {
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
-      return _hb_buffer_deserialize_glyphs_text (buffer,
-						 buf, buf_len, end_ptr,
-						 font);
+      return _hb_buffer_deserialize_text (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
+
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON:
+      return _hb_buffer_deserialize_json (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
+
+    default:
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
+      return false;
+
+  }
+}
+
+
+/**
+ * hb_buffer_deserialize_unicode:
+ * @buffer: an #hb_buffer_t buffer.
+ * @buf: (array length=buf_len):
+ * @buf_len:
+ * @end_ptr: (out):
+ * @format:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 2.7.3
+ **/
+hb_bool_t
+hb_buffer_deserialize_unicode (hb_buffer_t *buffer,
+                               const char *buf,
+                               int buf_len, /* -1 means nul-terminated */
+                               const char **end_ptr, /* May be NULL */
+                               hb_buffer_serialize_format_t format)
+{
+  const char *end;
+  if (!end_ptr)
+    end_ptr = &end;
+  *end_ptr = buf;
+
+  buffer->assert_unicode ();
+
+  if (unlikely (hb_object_is_immutable (buffer)))
+  {
+    if (end_ptr)
+      *end_ptr = buf;
+    return false;
+  }
+
+  if (buf_len == -1)
+    buf_len = strlen (buf);
+
+  if (!buf_len)
+  {
+    *end_ptr = buf;
+    return false;
+  }
+
+  hb_buffer_set_content_type (buffer, HB_BUFFER_CONTENT_TYPE_UNICODE);
+
+  hb_font_t* font = hb_font_get_empty ();
+
+  switch (format)
+  {
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
+      return _hb_buffer_deserialize_text (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
 
 
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:
-      return _hb_buffer_deserialize_glyphs_json (buffer,
-						 buf, buf_len, end_ptr,
-						 font);
+      return _hb_buffer_deserialize_json (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
 
 
     default:
     default:
     case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
     case HB_BUFFER_SERIALIZE_FORMAT_INVALID:

+ 146 - 120
thirdparty/harfbuzz/src/hb-buffer.cc

@@ -37,8 +37,9 @@
  * @short_description: Input and output buffers
  * @short_description: Input and output buffers
  * @include: hb.h
  * @include: hb.h
  *
  *
- * Buffers serve dual role in HarfBuzz; they hold the input characters that are
- * passed to hb_shape(), and after shaping they hold the output glyphs.
+ * Buffers serve a dual role in HarfBuzz; before shaping, they hold
+ * the input characters that are passed to hb_shape(), and after
+ * shaping they hold the output glyphs.
  **/
  **/
 
 
 
 
@@ -50,7 +51,7 @@
  * Checks the equality of two #hb_segment_properties_t's.
  * Checks the equality of two #hb_segment_properties_t's.
  *
  *
  * Return value:
  * Return value:
- * %true if all properties of @a equal those of @b, false otherwise.
+ * %true if all properties of @a equal those of @b, %false otherwise.
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -617,8 +618,7 @@ hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int en
 void
 void
 hb_buffer_t::guess_segment_properties ()
 hb_buffer_t::guess_segment_properties ()
 {
 {
-  assert ((content_type == HB_BUFFER_CONTENT_TYPE_UNICODE) ||
-	  (!len && (content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
+  assert_unicode ();
 
 
   /* If script is set to INVALID, guess from buffer contents */
   /* If script is set to INVALID, guess from buffer contents */
   if (props.script == HB_SCRIPT_INVALID) {
   if (props.script == HB_SCRIPT_INVALID) {
@@ -706,9 +706,9 @@ hb_buffer_create ()
 /**
 /**
  * hb_buffer_get_empty:
  * hb_buffer_get_empty:
  *
  *
+ * Fetches an empty #hb_buffer_t.
  *
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The empty buffer
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -720,7 +720,7 @@ hb_buffer_get_empty ()
 
 
 /**
 /**
  * hb_buffer_reference: (skip)
  * hb_buffer_reference: (skip)
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Increases the reference count on @buffer by one. This prevents @buffer from
  * Increases the reference count on @buffer by one. This prevents @buffer from
  * being destroyed until a matching call to hb_buffer_destroy() is made.
  * being destroyed until a matching call to hb_buffer_destroy() is made.
@@ -738,7 +738,7 @@ hb_buffer_reference (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_destroy: (skip)
  * hb_buffer_destroy: (skip)
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Deallocate the @buffer.
  * Deallocate the @buffer.
  * Decreases the reference count on @buffer by one. If the result is zero, then
  * Decreases the reference count on @buffer by one. If the result is zero, then
@@ -765,15 +765,15 @@ hb_buffer_destroy (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_set_user_data: (skip)
  * hb_buffer_set_user_data: (skip)
- * @buffer: an #hb_buffer_t.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @buffer: An #hb_buffer_t
+ * @key: The user-data key
+ * @data: A pointer to the user data
+ * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
  *
+ * Attaches a user-data key/data pair to the specified buffer. 
  *
  *
- *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -789,12 +789,13 @@ hb_buffer_set_user_data (hb_buffer_t        *buffer,
 
 
 /**
 /**
  * hb_buffer_get_user_data: (skip)
  * hb_buffer_get_user_data: (skip)
- * @buffer: an #hb_buffer_t.
- * @key:
+ * @buffer: An #hb_buffer_t
+ * @key: The user-data key to query
  *
  *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified buffer.
  *
  *
- *
- * Return value:
+ * Return value: (transfer-none): A pointer to the user data
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -808,11 +809,11 @@ hb_buffer_get_user_data (hb_buffer_t        *buffer,
 
 
 /**
 /**
  * hb_buffer_set_content_type:
  * hb_buffer_set_content_type:
- * @buffer: an #hb_buffer_t.
- * @content_type: the type of buffer contents to set
+ * @buffer: An #hb_buffer_t
+ * @content_type: The type of buffer contents to set
  *
  *
- * Sets the type of @buffer contents, buffers are either empty, contain
- * characters (before shaping) or glyphs (the result of shaping).
+ * Sets the type of @buffer contents. Buffers are either empty, contain
+ * characters (before shaping), or contain glyphs (the result of shaping).
  *
  *
  * Since: 0.9.5
  * Since: 0.9.5
  **/
  **/
@@ -825,12 +826,13 @@ hb_buffer_set_content_type (hb_buffer_t              *buffer,
 
 
 /**
 /**
  * hb_buffer_get_content_type:
  * hb_buffer_get_content_type:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
- * see hb_buffer_set_content_type().
+ * Fetches the type of @buffer contents. Buffers are either empty, contain
+ * characters (before shaping), or contain glyphs (the result of shaping).
  *
  *
  * Return value:
  * Return value:
- * The type of @buffer contents.
+ * The type of @buffer contents
  *
  *
  * Since: 0.9.5
  * Since: 0.9.5
  **/
  **/
@@ -843,10 +845,11 @@ hb_buffer_get_content_type (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_set_unicode_funcs:
  * hb_buffer_set_unicode_funcs:
- * @buffer: an #hb_buffer_t.
- * @unicode_funcs:
- *
+ * @buffer: An #hb_buffer_t
+ * @unicode_funcs: The Unicode-functions structure
  *
  *
+ * Sets the Unicode-functions structure of a buffer to
+ * @unicode_funcs.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -867,11 +870,11 @@ hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
 
 
 /**
 /**
  * hb_buffer_get_unicode_funcs:
  * hb_buffer_get_unicode_funcs:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
+ * Fetches the Unicode-functions structure of a buffer.
  *
  *
- *
- * Return value:
+ * Return value: The Unicode-functions structure
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -883,7 +886,7 @@ hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer)
 
 
 /**
 /**
  * hb_buffer_set_direction:
  * hb_buffer_set_direction:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @direction: the #hb_direction_t of the @buffer
  * @direction: the #hb_direction_t of the @buffer
  *
  *
  * Set the text flow direction of the buffer. No shaping can happen without
  * Set the text flow direction of the buffer. No shaping can happen without
@@ -909,7 +912,7 @@ hb_buffer_set_direction (hb_buffer_t    *buffer,
 
 
 /**
 /**
  * hb_buffer_get_direction:
  * hb_buffer_get_direction:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * See hb_buffer_set_direction()
  * See hb_buffer_set_direction()
  *
  *
@@ -926,8 +929,8 @@ hb_buffer_get_direction (hb_buffer_t    *buffer)
 
 
 /**
 /**
  * hb_buffer_set_script:
  * hb_buffer_set_script:
- * @buffer: an #hb_buffer_t.
- * @script: an #hb_script_t to set.
+ * @buffer: An #hb_buffer_t
+ * @script: An #hb_script_t to set.
  *
  *
  * Sets the script of @buffer to @script.
  * Sets the script of @buffer to @script.
  *
  *
@@ -953,12 +956,12 @@ hb_buffer_set_script (hb_buffer_t *buffer,
 
 
 /**
 /**
  * hb_buffer_get_script:
  * hb_buffer_get_script:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
- * See hb_buffer_set_script().
+ * Fetches the script of @buffer.
  *
  *
  * Return value:
  * Return value:
- * The #hb_script_t of the @buffer.
+ * The #hb_script_t of the @buffer
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -970,8 +973,8 @@ hb_buffer_get_script (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_set_language:
  * hb_buffer_set_language:
- * @buffer: an #hb_buffer_t.
- * @language: an hb_language_t to set.
+ * @buffer: An #hb_buffer_t
+ * @language: An hb_language_t to set
  *
  *
  * Sets the language of @buffer to @language.
  * Sets the language of @buffer to @language.
  *
  *
@@ -997,7 +1000,7 @@ hb_buffer_set_language (hb_buffer_t   *buffer,
 
 
 /**
 /**
  * hb_buffer_get_language:
  * hb_buffer_get_language:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * See hb_buffer_set_language().
  * See hb_buffer_set_language().
  *
  *
@@ -1014,8 +1017,8 @@ hb_buffer_get_language (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_set_segment_properties:
  * hb_buffer_set_segment_properties:
- * @buffer: an #hb_buffer_t.
- * @props: an #hb_segment_properties_t to use.
+ * @buffer: An #hb_buffer_t
+ * @props: An #hb_segment_properties_t to use
  *
  *
  * Sets the segment properties of the buffer, a shortcut for calling
  * Sets the segment properties of the buffer, a shortcut for calling
  * hb_buffer_set_direction(), hb_buffer_set_script() and
  * hb_buffer_set_direction(), hb_buffer_set_script() and
@@ -1035,8 +1038,8 @@ hb_buffer_set_segment_properties (hb_buffer_t *buffer,
 
 
 /**
 /**
  * hb_buffer_get_segment_properties:
  * hb_buffer_get_segment_properties:
- * @buffer: an #hb_buffer_t.
- * @props: (out): the output #hb_segment_properties_t.
+ * @buffer: An #hb_buffer_t
+ * @props: (out): The output #hb_segment_properties_t
  *
  *
  * Sets @props to the #hb_segment_properties_t of @buffer.
  * Sets @props to the #hb_segment_properties_t of @buffer.
  *
  *
@@ -1052,8 +1055,8 @@ hb_buffer_get_segment_properties (hb_buffer_t *buffer,
 
 
 /**
 /**
  * hb_buffer_set_flags:
  * hb_buffer_set_flags:
- * @buffer: an #hb_buffer_t.
- * @flags: the buffer flags to set.
+ * @buffer: An #hb_buffer_t
+ * @flags: The buffer flags to set
  *
  *
  * Sets @buffer flags to @flags. See #hb_buffer_flags_t.
  * Sets @buffer flags to @flags. See #hb_buffer_flags_t.
  *
  *
@@ -1071,12 +1074,12 @@ hb_buffer_set_flags (hb_buffer_t       *buffer,
 
 
 /**
 /**
  * hb_buffer_get_flags:
  * hb_buffer_get_flags:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
- * See hb_buffer_set_flags().
+ * Fetches the #hb_buffer_flags_t of @buffer.
  *
  *
  * Return value:
  * Return value:
- * The @buffer flags.
+ * The @buffer flags
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -1088,10 +1091,12 @@ hb_buffer_get_flags (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_set_cluster_level:
  * hb_buffer_set_cluster_level:
- * @buffer: an #hb_buffer_t.
- * @cluster_level:
- *
+ * @buffer: An #hb_buffer_t
+ * @cluster_level: The cluster level to set on the buffer
  *
  *
+ * Sets the cluster level of a buffer. The #hb_buffer_cluster_level_t
+ * dictates one aspect of how HarfBuzz will treat non-base characters 
+ * during shaping.
  *
  *
  * Since: 0.9.42
  * Since: 0.9.42
  **/
  **/
@@ -1107,11 +1112,13 @@ hb_buffer_set_cluster_level (hb_buffer_t               *buffer,
 
 
 /**
 /**
  * hb_buffer_get_cluster_level:
  * hb_buffer_get_cluster_level:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
+ * Fetches the cluster level of a buffer. The #hb_buffer_cluster_level_t
+ * dictates one aspect of how HarfBuzz will treat non-base characters 
+ * during shaping.
  *
  *
- *
- * Return value:
+ * Return value: The cluster level of @buffer
  *
  *
  * Since: 0.9.42
  * Since: 0.9.42
  **/
  **/
@@ -1124,7 +1131,7 @@ hb_buffer_get_cluster_level (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_set_replacement_codepoint:
  * hb_buffer_set_replacement_codepoint:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @replacement: the replacement #hb_codepoint_t
  * @replacement: the replacement #hb_codepoint_t
  *
  *
  * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
  * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
@@ -1146,12 +1153,13 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
 
 
 /**
 /**
  * hb_buffer_get_replacement_codepoint:
  * hb_buffer_get_replacement_codepoint:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
- * See hb_buffer_set_replacement_codepoint().
+ * Fetches the #hb_codepoint_t that replaces invalid entries for a given encoding
+ * when adding text to @buffer.
  *
  *
  * Return value:
  * Return value:
- * The @buffer replacement #hb_codepoint_t.
+ * The @buffer replacement #hb_codepoint_t
  *
  *
  * Since: 0.9.31
  * Since: 0.9.31
  **/
  **/
@@ -1164,7 +1172,7 @@ hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer)
 
 
 /**
 /**
  * hb_buffer_set_invisible_glyph:
  * hb_buffer_set_invisible_glyph:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @invisible: the invisible #hb_codepoint_t
  * @invisible: the invisible #hb_codepoint_t
  *
  *
  * Sets the #hb_codepoint_t that replaces invisible characters in
  * Sets the #hb_codepoint_t that replaces invisible characters in
@@ -1186,12 +1194,12 @@ hb_buffer_set_invisible_glyph (hb_buffer_t    *buffer,
 
 
 /**
 /**
  * hb_buffer_get_invisible_glyph:
  * hb_buffer_get_invisible_glyph:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * See hb_buffer_set_invisible_glyph().
  * See hb_buffer_set_invisible_glyph().
  *
  *
  * Return value:
  * Return value:
- * The @buffer invisible #hb_codepoint_t.
+ * The @buffer invisible #hb_codepoint_t
  *
  *
  * Since: 2.0.0
  * Since: 2.0.0
  **/
  **/
@@ -1204,7 +1212,7 @@ hb_buffer_get_invisible_glyph (hb_buffer_t    *buffer)
 
 
 /**
 /**
  * hb_buffer_reset:
  * hb_buffer_reset:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Resets the buffer to its initial status, as if it was just newly created
  * Resets the buffer to its initial status, as if it was just newly created
  * with hb_buffer_create().
  * with hb_buffer_create().
@@ -1219,7 +1227,7 @@ hb_buffer_reset (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_clear_contents:
  * hb_buffer_clear_contents:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Similar to hb_buffer_reset(), but does not clear the Unicode functions and
  * Similar to hb_buffer_reset(), but does not clear the Unicode functions and
  * the replacement code point.
  * the replacement code point.
@@ -1234,13 +1242,13 @@ hb_buffer_clear_contents (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_pre_allocate:
  * hb_buffer_pre_allocate:
- * @buffer: an #hb_buffer_t.
- * @size: number of items to pre allocate.
+ * @buffer: An #hb_buffer_t
+ * @size: Number of items to pre allocate.
  *
  *
  * Pre allocates memory for @buffer to fit at least @size number of items.
  * Pre allocates memory for @buffer to fit at least @size number of items.
  *
  *
  * Return value:
  * Return value:
- * %true if @buffer memory allocation succeeded, %false otherwise.
+ * %true if @buffer memory allocation succeeded, %false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -1252,7 +1260,7 @@ hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size)
 
 
 /**
 /**
  * hb_buffer_allocation_successful:
  * hb_buffer_allocation_successful:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Check if allocating memory for the buffer succeeded.
  * Check if allocating memory for the buffer succeeded.
  *
  *
@@ -1269,9 +1277,9 @@ hb_buffer_allocation_successful (hb_buffer_t  *buffer)
 
 
 /**
 /**
  * hb_buffer_add:
  * hb_buffer_add:
- * @buffer: an #hb_buffer_t.
- * @codepoint: a Unicode code point.
- * @cluster: the cluster value of @codepoint.
+ * @buffer: An #hb_buffer_t
+ * @codepoint: A Unicode code point.
+ * @cluster: The cluster value of @codepoint.
  *
  *
  * Appends a character with the Unicode value of @codepoint to @buffer, and
  * Appends a character with the Unicode value of @codepoint to @buffer, and
  * gives it the initial cluster value of @cluster. Clusters can be any thing
  * gives it the initial cluster value of @cluster. Clusters can be any thing
@@ -1295,8 +1303,8 @@ hb_buffer_add (hb_buffer_t    *buffer,
 
 
 /**
 /**
  * hb_buffer_set_length:
  * hb_buffer_set_length:
- * @buffer: an #hb_buffer_t.
- * @length: the new length of @buffer.
+ * @buffer: An #hb_buffer_t
+ * @length: The new length of @buffer
  *
  *
  * Similar to hb_buffer_pre_allocate(), but clears any new items added at the
  * Similar to hb_buffer_pre_allocate(), but clears any new items added at the
  * end.
  * end.
@@ -1337,7 +1345,7 @@ hb_buffer_set_length (hb_buffer_t  *buffer,
 
 
 /**
 /**
  * hb_buffer_get_length:
  * hb_buffer_get_length:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Returns the number of items in the buffer.
  * Returns the number of items in the buffer.
  *
  *
@@ -1355,8 +1363,8 @@ hb_buffer_get_length (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_get_glyph_infos:
  * hb_buffer_get_glyph_infos:
- * @buffer: an #hb_buffer_t.
- * @length: (out): output array length.
+ * @buffer: An #hb_buffer_t
+ * @length: (out): The output-array length.
  *
  *
  * Returns @buffer glyph information array.  Returned pointer
  * Returns @buffer glyph information array.  Returned pointer
  * is valid as long as @buffer contents are not modified.
  * is valid as long as @buffer contents are not modified.
@@ -1379,8 +1387,8 @@ hb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
 
 
 /**
 /**
  * hb_buffer_get_glyph_positions:
  * hb_buffer_get_glyph_positions:
- * @buffer: an #hb_buffer_t.
- * @length: (out): output length.
+ * @buffer: An #hb_buffer_t
+ * @length: (out): The output length
  *
  *
  * Returns @buffer glyph position array.  Returned pointer
  * Returns @buffer glyph position array.  Returned pointer
  * is valid as long as @buffer contents are not modified.
  * is valid as long as @buffer contents are not modified.
@@ -1404,14 +1412,33 @@ hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
   return (hb_glyph_position_t *) buffer->pos;
   return (hb_glyph_position_t *) buffer->pos;
 }
 }
 
 
+/**
+ * hb_buffer_has_positions:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Returns whether @buffer has glyph position data.
+ * A buffer gains position data when hb_buffer_get_glyph_positions() is called on it,
+ * and cleared of position data when hb_buffer_clear_contents() is called.
+ *
+ * Return value:
+ * %true if the @buffer has position array, %false otherwise.
+ *
+ * Since: 2.7.3
+ **/
+HB_EXTERN hb_bool_t
+hb_buffer_has_positions (hb_buffer_t  *buffer)
+{
+  return buffer->have_positions;
+}
+
 /**
 /**
  * hb_glyph_info_get_glyph_flags:
  * hb_glyph_info_get_glyph_flags:
- * @info: a #hb_glyph_info_t.
+ * @info: a #hb_glyph_info_t
  *
  *
  * Returns glyph flags encoded within a #hb_glyph_info_t.
  * Returns glyph flags encoded within a #hb_glyph_info_t.
  *
  *
  * Return value:
  * Return value:
- * The #hb_glyph_flags_t encoded within @info.
+ * The #hb_glyph_flags_t encoded within @info
  *
  *
  * Since: 1.5.0
  * Since: 1.5.0
  **/
  **/
@@ -1423,7 +1450,7 @@ hb_glyph_flags_t
 
 
 /**
 /**
  * hb_buffer_reverse:
  * hb_buffer_reverse:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Reverses buffer contents.
  * Reverses buffer contents.
  *
  *
@@ -1437,11 +1464,11 @@ hb_buffer_reverse (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_reverse_range:
  * hb_buffer_reverse_range:
- * @buffer: an #hb_buffer_t.
- * @start: start index.
- * @end: end index.
+ * @buffer: An #hb_buffer_t
+ * @start: start index
+ * @end: end index
  *
  *
- * Reverses buffer contents between start to end.
+ * Reverses buffer contents between @start and @end.
  *
  *
  * Since: 0.9.41
  * Since: 0.9.41
  **/
  **/
@@ -1454,7 +1481,7 @@ hb_buffer_reverse_range (hb_buffer_t *buffer,
 
 
 /**
 /**
  * hb_buffer_reverse_clusters:
  * hb_buffer_reverse_clusters:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Reverses buffer clusters.  That is, the buffer contents are
  * Reverses buffer clusters.  That is, the buffer contents are
  * reversed, then each cluster (consecutive items having the
  * reversed, then each cluster (consecutive items having the
@@ -1470,7 +1497,7 @@ hb_buffer_reverse_clusters (hb_buffer_t *buffer)
 
 
 /**
 /**
  * hb_buffer_guess_segment_properties:
  * hb_buffer_guess_segment_properties:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Sets unset buffer segment properties based on buffer Unicode
  * Sets unset buffer segment properties based on buffer Unicode
  * contents.  If buffer is not empty, it must have content type
  * contents.  If buffer is not empty, it must have content type
@@ -1513,8 +1540,7 @@ hb_buffer_add_utf (hb_buffer_t  *buffer,
   typedef typename utf_t::codepoint_t T;
   typedef typename utf_t::codepoint_t T;
   const hb_codepoint_t replacement = buffer->replacement;
   const hb_codepoint_t replacement = buffer->replacement;
 
 
-  assert ((buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE) ||
-	  (!buffer->len && (buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
+  buffer->assert_unicode ();
 
 
   if (unlikely (hb_object_is_immutable (buffer)))
   if (unlikely (hb_object_is_immutable (buffer)))
     return;
     return;
@@ -1573,12 +1599,12 @@ hb_buffer_add_utf (hb_buffer_t  *buffer,
 
 
 /**
 /**
  * hb_buffer_add_utf8:
  * hb_buffer_add_utf8:
- * @buffer: an #hb_buffer_t.
- * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ * @buffer: An #hb_buffer_t
+ * @text: (array length=text_length) (element-type uint8_t): An array of UTF-8
  *               characters to append.
  *               characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
- * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * @text_length: The length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: The offset of the first character to add to the @buffer.
+ * @item_length: The number of characters to add to the @buffer, or -1 for the
  *               end of @text (assuming it is %NULL terminated).
  *               end of @text (assuming it is %NULL terminated).
  *
  *
  * See hb_buffer_add_codepoints().
  * See hb_buffer_add_codepoints().
@@ -1600,12 +1626,12 @@ hb_buffer_add_utf8 (hb_buffer_t  *buffer,
 
 
 /**
 /**
  * hb_buffer_add_utf16:
  * hb_buffer_add_utf16:
- * @buffer: an #hb_buffer_t.
- * @text: (array length=text_length): an array of UTF-16 characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
- * @item_length: the number of characters to add to the @buffer, or -1 for the
- *               end of @text (assuming it is %NULL terminated).
+ * @buffer: An #hb_buffer_t
+ * @text: (array length=text_length): An array of UTF-16 characters to append
+ * @text_length: The length of the @text, or -1 if it is %NULL terminated
+ * @item_offset: The offset of the first character to add to the @buffer
+ * @item_length: The number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated)
  *
  *
  * See hb_buffer_add_codepoints().
  * See hb_buffer_add_codepoints().
  *
  *
@@ -1626,12 +1652,12 @@ hb_buffer_add_utf16 (hb_buffer_t    *buffer,
 
 
 /**
 /**
  * hb_buffer_add_utf32:
  * hb_buffer_add_utf32:
- * @buffer: an #hb_buffer_t.
- * @text: (array length=text_length): an array of UTF-32 characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
- * @item_length: the number of characters to add to the @buffer, or -1 for the
- *               end of @text (assuming it is %NULL terminated).
+ * @buffer: An #hb_buffer_t
+ * @text: (array length=text_length): An array of UTF-32 characters to append
+ * @text_length: The length of the @text, or -1 if it is %NULL terminated
+ * @item_offset: The offset of the first character to add to the @buffer
+ * @item_length: The number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated)
  *
  *
  * See hb_buffer_add_codepoints().
  * See hb_buffer_add_codepoints().
  *
  *
@@ -1652,13 +1678,13 @@ hb_buffer_add_utf32 (hb_buffer_t    *buffer,
 
 
 /**
 /**
  * hb_buffer_add_latin1:
  * hb_buffer_add_latin1:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
  * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
- *               characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
+ *               characters to append
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated
+ * @item_offset: the offset of the first character to add to the @buffer
  * @item_length: the number of characters to add to the @buffer, or -1 for the
  * @item_length: the number of characters to add to the @buffer, or -1 for the
- *               end of @text (assuming it is %NULL terminated).
+ *               end of @text (assuming it is %NULL terminated)
  *
  *
  * Similar to hb_buffer_add_codepoints(), but allows only access to first 256
  * Similar to hb_buffer_add_codepoints(), but allows only access to first 256
  * Unicode code points that can fit in 8-bit strings.
  * Unicode code points that can fit in 8-bit strings.
@@ -1714,8 +1740,8 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
 
 
 /**
 /**
  * hb_buffer_append:
  * hb_buffer_append:
- * @buffer: an #hb_buffer_t.
- * @source: source #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
+ * @source: source #hb_buffer_t
  * @start: start index into source buffer to copy.  Use 0 to copy from start of buffer.
  * @start: start index into source buffer to copy.  Use 0 to copy from start of buffer.
  * @end: end index into source buffer to copy.  Use @HB_FEATURE_GLOBAL_END to copy to end of buffer.
  * @end: end index into source buffer to copy.  Use @HB_FEATURE_GLOBAL_END to copy to end of buffer.
  *
  *
@@ -1821,7 +1847,7 @@ normalize_glyphs_cluster (hb_buffer_t *buffer,
 
 
 /**
 /**
  * hb_buffer_normalize_glyphs:
  * hb_buffer_normalize_glyphs:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  *
  * Reorders a glyph buffer to have canonical in-cluster glyph order / position.
  * Reorders a glyph buffer to have canonical in-cluster glyph order / position.
  * The resulting clusters should behave identical to pre-reordering clusters.
  * The resulting clusters should behave identical to pre-reordering clusters.
@@ -1834,8 +1860,8 @@ void
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
 {
 {
   assert (buffer->have_positions);
   assert (buffer->have_positions);
-  assert ((buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS) ||
-	  (!buffer->len && (buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
+
+  buffer->assert_glyphs ();
 
 
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
 
@@ -1967,7 +1993,7 @@ hb_buffer_diff (hb_buffer_t *buffer,
 #ifndef HB_NO_BUFFER_MESSAGE
 #ifndef HB_NO_BUFFER_MESSAGE
 /**
 /**
  * hb_buffer_set_message_func:
  * hb_buffer_set_message_func:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @func: (closure user_data) (destroy destroy) (scope notified):
  * @func: (closure user_data) (destroy destroy) (scope notified):
  * @user_data:
  * @user_data:
  * @destroy:
  * @destroy:

+ 50 - 2
thirdparty/harfbuzz/src/hb-buffer.h

@@ -59,8 +59,7 @@ HB_BEGIN_DECLS
  * The #hb_glyph_info_t is the structure that holds information about the
  * The #hb_glyph_info_t is the structure that holds information about the
  * glyphs and their relation to input text.
  * glyphs and their relation to input text.
  */
  */
-typedef struct hb_glyph_info_t
-{
+typedef struct hb_glyph_info_t {
   hb_codepoint_t codepoint;
   hb_codepoint_t codepoint;
   /*< private >*/
   /*< private >*/
   hb_mask_t      mask;
   hb_mask_t      mask;
@@ -315,6 +314,23 @@ hb_buffer_get_flags (hb_buffer_t *buffer);
  * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
  * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
  * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
  * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
  *   equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
  *   equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
+ * 
+ * Data type for holding HarfBuzz's clustering behavior options. The cluster level
+ * dictates one aspect of how HarfBuzz will treat non-base characters 
+ * during shaping.
+ *
+ * In @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES, non-base
+ * characters are merged into the cluster of the base character that precedes them.
+ *
+ * In @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS, non-base characters are initially
+ * assigned their own cluster values, which are not merged into preceding base
+ * clusters. This allows HarfBuzz to perform additional operations like reorder
+ * sequences of adjacent marks.
+ *
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES is the default, because it maintains
+ * backward compatibility with older versions of HarfBuzz. New client programs that
+ * do not need to maintain such backward compatibility are recommended to use
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS instead of the default.
  *
  *
  * Since: 0.9.42
  * Since: 0.9.42
  */
  */
@@ -447,6 +463,9 @@ HB_EXTERN hb_glyph_position_t *
 hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
 hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
 			       unsigned int *length);
 			       unsigned int *length);
 
 
+HB_EXTERN hb_bool_t
+hb_buffer_has_positions (hb_buffer_t  *buffer);
+
 
 
 HB_EXTERN void
 HB_EXTERN void
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
@@ -518,6 +537,27 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
 			    hb_buffer_serialize_format_t format,
 			    hb_buffer_serialize_format_t format,
 			    hb_buffer_serialize_flags_t flags);
 			    hb_buffer_serialize_flags_t flags);
 
 
+HB_EXTERN unsigned int
+hb_buffer_serialize_unicode (hb_buffer_t *buffer,
+					unsigned int start,
+					unsigned int end,
+					char *buf,
+					unsigned int buf_size,
+					unsigned int *buf_consumed,
+					hb_buffer_serialize_format_t format,
+					hb_buffer_serialize_flags_t flags);
+
+HB_EXTERN unsigned int
+hb_buffer_serialize (hb_buffer_t *buffer,
+					unsigned int start,
+					unsigned int end,
+					char *buf,
+					unsigned int buf_size,
+					unsigned int *buf_consumed,
+					hb_font_t *font,
+					hb_buffer_serialize_format_t format,
+					hb_buffer_serialize_flags_t flags);
+
 HB_EXTERN hb_bool_t
 HB_EXTERN hb_bool_t
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
 			      const char *buf,
 			      const char *buf,
@@ -526,6 +566,14 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
 			      hb_font_t *font,
 			      hb_font_t *font,
 			      hb_buffer_serialize_format_t format);
 			      hb_buffer_serialize_format_t format);
 
 
+HB_EXTERN hb_bool_t
+hb_buffer_deserialize_unicode (hb_buffer_t *buffer,
+            const char *buf,
+            int buf_len,
+            const char **end_ptr,
+            hb_buffer_serialize_format_t format);
+
+
 
 
 /*
 /*
  * Compare buffers
  * Compare buffers

+ 37 - 4
thirdparty/harfbuzz/src/hb-buffer.hh

@@ -35,20 +35,20 @@
 
 
 
 
 #ifndef HB_BUFFER_MAX_LEN_FACTOR
 #ifndef HB_BUFFER_MAX_LEN_FACTOR
-#define HB_BUFFER_MAX_LEN_FACTOR 32
+#define HB_BUFFER_MAX_LEN_FACTOR 64
 #endif
 #endif
 #ifndef HB_BUFFER_MAX_LEN_MIN
 #ifndef HB_BUFFER_MAX_LEN_MIN
-#define HB_BUFFER_MAX_LEN_MIN 8192
+#define HB_BUFFER_MAX_LEN_MIN 16384
 #endif
 #endif
 #ifndef HB_BUFFER_MAX_LEN_DEFAULT
 #ifndef HB_BUFFER_MAX_LEN_DEFAULT
 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
 #endif
 #endif
 
 
 #ifndef HB_BUFFER_MAX_OPS_FACTOR
 #ifndef HB_BUFFER_MAX_OPS_FACTOR
-#define HB_BUFFER_MAX_OPS_FACTOR 64
+#define HB_BUFFER_MAX_OPS_FACTOR 1024
 #endif
 #endif
 #ifndef HB_BUFFER_MAX_OPS_MIN
 #ifndef HB_BUFFER_MAX_OPS_MIN
-#define HB_BUFFER_MAX_OPS_MIN 1024
+#define HB_BUFFER_MAX_OPS_MIN 16384
 #endif
 #endif
 #ifndef HB_BUFFER_MAX_OPS_DEFAULT
 #ifndef HB_BUFFER_MAX_OPS_DEFAULT
 #define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
 #define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
@@ -339,6 +339,39 @@ struct hb_buffer_t
   bool ensure_inplace (unsigned int size)
   bool ensure_inplace (unsigned int size)
   { return likely (!size || size < allocated); }
   { return likely (!size || size < allocated); }
 
 
+  void assert_glyphs ()
+  {
+    assert ((content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS) ||
+	    (!len && (content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
+  }
+  void assert_unicode ()
+  {
+    assert ((content_type == HB_BUFFER_CONTENT_TYPE_UNICODE) ||
+	    (!len && (content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
+  }
+  bool ensure_glyphs ()
+  {
+    if (unlikely (content_type != HB_BUFFER_CONTENT_TYPE_GLYPHS))
+    {
+      if (content_type != HB_BUFFER_CONTENT_TYPE_INVALID)
+	return false;
+      assert (len == 0);
+      content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+    }
+    return true;
+  }
+  bool ensure_unicode ()
+  {
+    if (unlikely (content_type != HB_BUFFER_CONTENT_TYPE_UNICODE))
+    {
+      if (content_type != HB_BUFFER_CONTENT_TYPE_INVALID)
+	return false;
+      assert (len == 0);
+      content_type = HB_BUFFER_CONTENT_TYPE_UNICODE;
+    }
+    return true;
+  }
+
   HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
   HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
   HB_INTERNAL bool shift_forward (unsigned int count);
   HB_INTERNAL bool shift_forward (unsigned int count);
 
 

+ 55 - 33
thirdparty/harfbuzz/src/hb-common.cc

@@ -86,12 +86,15 @@ _hb_options_init ()
 
 
 /**
 /**
  * hb_tag_from_string:
  * hb_tag_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t): String to convert
+ * @len: Length of @str, or -1 if it is %NULL-terminated
  *
  *
+ * Converts a string into an #hb_tag_t. Valid tags
+ * are four characters. Shorter input strings will be
+ * padded with spaces. Longer input strings will be
+ * truncated.
  *
  *
- *
- * Return value:
+ * Return value: The #hb_tag_t corresponding to @str
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -116,10 +119,11 @@ hb_tag_from_string (const char *str, int len)
 
 
 /**
 /**
  * hb_tag_to_string:
  * hb_tag_to_string:
- * @tag:
- * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
- *
+ * @tag: #hb_tag_t to convert
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t): Converted string
  *
  *
+ * Converts an #hb_tag_t to a string and returns it in @buf. 
+ * Strings will be four characters long.
  *
  *
  * Since: 0.9.5
  * Since: 0.9.5
  **/
  **/
@@ -144,12 +148,17 @@ const char direction_strings[][4] = {
 
 
 /**
 /**
  * hb_direction_from_string:
  * hb_direction_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t): String to convert
+ * @len: Length of @str, or -1 if it is %NULL-terminated
  *
  *
+ * Converts a string to an #hb_direction_t. 
  *
  *
+ * Matching is loose and applies only to the first letter. For
+ * examples, "LTR" and "left-to-right" will both return #HB_DIRECTION_LTR.
  *
  *
- * Return value:
+ * Unmatched strings will return #HB_DIRECTION_INVALID.
+ * 
+ * Return value: The #hb_direction_t matching @str
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -172,11 +181,11 @@ hb_direction_from_string (const char *str, int len)
 
 
 /**
 /**
  * hb_direction_to_string:
  * hb_direction_to_string:
- * @direction:
- *
+ * @direction: The #hb_direction_t to convert
  *
  *
+ * Converts an #hb_direction_t to a string.
  *
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): The string corresponding to @direction
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -367,9 +376,9 @@ hb_language_from_string (const char *str, int len)
 
 
 /**
 /**
  * hb_language_to_string:
  * hb_language_to_string:
- * @language: an #hb_language_t to convert.
+ * @language: The #hb_language_t to convert
  *
  *
- * See hb_language_from_string().
+ * Converts an #hb_language_t to a string.
  *
  *
  * Return value: (transfer none):
  * Return value: (transfer none):
  * A %NULL-terminated string representing the @language. Must not be freed by
  * A %NULL-terminated string representing the @language. Must not be freed by
@@ -388,16 +397,17 @@ hb_language_to_string (hb_language_t language)
 /**
 /**
  * hb_language_get_default:
  * hb_language_get_default:
  *
  *
- * Get default language from current locale.
+ * Fetch the default language from current locale.
  *
  *
- * Note that the first time this function is called, it calls
+ * <note>Note that the first time this function is called, it calls
  * "setlocale (LC_CTYPE, nullptr)" to fetch current locale.  The underlying
  * "setlocale (LC_CTYPE, nullptr)" to fetch current locale.  The underlying
  * setlocale function is, in many implementations, NOT threadsafe.  To avoid
  * setlocale function is, in many implementations, NOT threadsafe.  To avoid
  * problems, call this function once before multiple threads can call it.
  * problems, call this function once before multiple threads can call it.
  * This function is only used from hb_buffer_guess_segment_properties() by
  * This function is only used from hb_buffer_guess_segment_properties() by
- * HarfBuzz itself.
+ * HarfBuzz itself.</note>
  *
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): The default language of the locale as
+ * an #hb_language_t
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -448,7 +458,12 @@ hb_script_from_iso15924_tag (hb_tag_t tag)
     case HB_TAG('Q','a','a','c'): return HB_SCRIPT_COPTIC;
     case HB_TAG('Q','a','a','c'): return HB_SCRIPT_COPTIC;
 
 
     /* Script variants from https://unicode.org/iso15924/ */
     /* Script variants from https://unicode.org/iso15924/ */
+    case HB_TAG('A','r','a','n'): return HB_SCRIPT_ARABIC;
     case HB_TAG('C','y','r','s'): return HB_SCRIPT_CYRILLIC;
     case HB_TAG('C','y','r','s'): return HB_SCRIPT_CYRILLIC;
+    case HB_TAG('G','e','o','k'): return HB_SCRIPT_GEORGIAN;
+    case HB_TAG('H','a','n','s'): return HB_SCRIPT_HAN;
+    case HB_TAG('H','a','n','t'): return HB_SCRIPT_HAN;
+    case HB_TAG('J','a','m','o'): return HB_SCRIPT_HANGUL;
     case HB_TAG('L','a','t','f'): return HB_SCRIPT_LATIN;
     case HB_TAG('L','a','t','f'): return HB_SCRIPT_LATIN;
     case HB_TAG('L','a','t','g'): return HB_SCRIPT_LATIN;
     case HB_TAG('L','a','t','g'): return HB_SCRIPT_LATIN;
     case HB_TAG('S','y','r','e'): return HB_SCRIPT_SYRIAC;
     case HB_TAG('S','y','r','e'): return HB_SCRIPT_SYRIAC;
@@ -489,7 +504,7 @@ hb_script_from_string (const char *str, int len)
  * hb_script_to_iso15924_tag:
  * hb_script_to_iso15924_tag:
  * @script: an #hb_script_t to convert.
  * @script: an #hb_script_t to convert.
  *
  *
- * See hb_script_from_iso15924_tag().
+ * Converts an #hb_script_t to a corresponding ISO 15924 script tag.
  *
  *
  * Return value:
  * Return value:
  * An #hb_tag_t representing an ISO 15924 script tag.
  * An #hb_tag_t representing an ISO 15924 script tag.
@@ -504,11 +519,16 @@ hb_script_to_iso15924_tag (hb_script_t script)
 
 
 /**
 /**
  * hb_script_get_horizontal_direction:
  * hb_script_get_horizontal_direction:
- * @script:
- *
+ * @script: The #hb_script_t to query
  *
  *
+ * Fetches the #hb_direction_t of a script when it is
+ * set horizontally. All right-to-left scripts will return
+ * #HB_DIRECTION_RTL. All left-to-right scripts will return
+ * #HB_DIRECTION_LTR.  Scripts that can be written either
+ * horizontally or vertically will return #HB_DIRECTION_INVALID.
+ * Unknown scripts will return #HB_DIRECTION_LTR.
  *
  *
- * Return value:
+ * Return value: The horizontal #hb_direction_t of @script
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -613,9 +633,9 @@ hb_script_get_horizontal_direction (hb_script_t script)
 
 
 /**
 /**
  * hb_version:
  * hb_version:
- * @major: (out): Library major version component.
- * @minor: (out): Library minor version component.
- * @micro: (out): Library micro version component.
+ * @major: (out): Library major version component
+ * @minor: (out): Library minor version component
+ * @micro: (out): Library micro version component
  *
  *
  * Returns library version as three integer components.
  * Returns library version as three integer components.
  *
  *
@@ -636,7 +656,7 @@ hb_version (unsigned int *major,
  *
  *
  * Returns library version as a string with three components.
  * Returns library version as a string with three components.
  *
  *
- * Return value: library version string.
+ * Return value: Library version string
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -648,13 +668,15 @@ hb_version_string ()
 
 
 /**
 /**
  * hb_version_atleast:
  * hb_version_atleast:
- * @major:
- * @minor:
- * @micro:
+ * @major: Library major version component
+ * @minor: Library minor version component
+ * @micro: Library micro version component
  *
  *
+ * Tests the library version against a minimum value,
+ * as three integer components.
  *
  *
- *
- * Return value:
+ * Return value: True if the library is equal to or greater than
+ * the test value, false otherwise
  *
  *
  * Since: 0.9.30
  * Since: 0.9.30
  **/
  **/
@@ -883,7 +905,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
  * </informaltable>
  * </informaltable>
  *
  *
  * Return value:
  * Return value:
- * %true if @str is successfully parsed, %false otherwise.
+ * %true if @str is successfully parsed, %false otherwise
  *
  *
  * Since: 0.9.5
  * Since: 0.9.5
  **/
  **/

+ 286 - 7
thirdparty/harfbuzz/src/hb-common.h

@@ -88,11 +88,37 @@ typedef unsigned __int64 uint64_t;
 
 
 HB_BEGIN_DECLS
 HB_BEGIN_DECLS
 
 
-
+/**
+ * hb_bool_t:
+ * 
+ * Data type for booleans.
+ *
+ **/
 typedef int hb_bool_t;
 typedef int hb_bool_t;
 
 
+/**
+ * hb_codepoint_t:
+ * 
+ * Data type for holding Unicode codepoints. Also
+ * used to hold glyph IDs.
+ *
+ **/
 typedef uint32_t hb_codepoint_t;
 typedef uint32_t hb_codepoint_t;
+/**
+ * hb_position_t:
+ * 
+ * Data type for holding a single coordinate value.
+ * Contour points and other multi-dimensional data are
+ * stored as tuples of #hb_position_t's.
+ *
+ **/
 typedef int32_t hb_position_t;
 typedef int32_t hb_position_t;
+/**
+ * hb_mask_t:
+ * 
+ * Data type for bitmasks.
+ *
+ **/
 typedef uint32_t hb_mask_t;
 typedef uint32_t hb_mask_t;
 
 
 typedef union _hb_var_int_t {
 typedef union _hb_var_int_t {
@@ -107,9 +133,33 @@ typedef union _hb_var_int_t {
 
 
 /* hb_tag_t */
 /* hb_tag_t */
 
 
+/**
+ * hb_tag_t:
+ * 
+ * Data type for tag identifiers. Tags are four
+ * byte integers, each byte representing a character.
+ *
+ * Tags are used to identify tables, design-variation axes,
+ * scripts, languages, font features, and baselines with
+ * human-readable names.
+ *
+ **/
 typedef uint32_t hb_tag_t;
 typedef uint32_t hb_tag_t;
 
 
+/**
+ * HB_TAG:
+ *
+ * Constructs an #hb_tag_t from four characters.
+ *
+ **/
 #define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
 #define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
+
+/**
+ * HB_UNTAG:
+ *
+ * Extracts the characters from an #hb_tag_t.
+ *
+ **/
 #define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
 #define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
 
 
 #define HB_TAG_NONE HB_TAG(0,0,0,0)
 #define HB_TAG_NONE HB_TAG(0,0,0,0)
@@ -132,6 +182,13 @@ hb_tag_to_string (hb_tag_t tag, char *buf);
  * @HB_DIRECTION_RTL: Text is set horizontally from right to left.
  * @HB_DIRECTION_RTL: Text is set horizontally from right to left.
  * @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
  * @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
  * @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
  * @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
+ *
+ * The direction of a text segment or buffer.
+ * 
+ * A segment can also be tested for horizontal or vertical
+ * orientation (irrespective of specific direction) with 
+ * HB_DIRECTION_IS_HORIZONTAL() or HB_DIRECTION_IS_VERTICAL().
+ *
  */
  */
 typedef enum {
 typedef enum {
   HB_DIRECTION_INVALID = 0,
   HB_DIRECTION_INVALID = 0,
@@ -148,12 +205,59 @@ hb_direction_from_string (const char *str, int len);
 HB_EXTERN const char *
 HB_EXTERN const char *
 hb_direction_to_string (hb_direction_t direction);
 hb_direction_to_string (hb_direction_t direction);
 
 
+/**
+ * HB_DIRECTION_IS_VALID:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction is valid.
+ *
+ **/
 #define HB_DIRECTION_IS_VALID(dir)	((((unsigned int) (dir)) & ~3U) == 4)
 #define HB_DIRECTION_IS_VALID(dir)	((((unsigned int) (dir)) & ~3U) == 4)
 /* Direction must be valid for the following */
 /* Direction must be valid for the following */
+/**
+ * HB_DIRECTION_IS_HORIZONTAL:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction is horizontal. Requires
+ * that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
 #define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
+/**
+ * HB_DIRECTION_IS_VERTICAL:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction is vertical. Requires
+ * that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_VERTICAL(dir)	((((unsigned int) (dir)) & ~1U) == 6)
 #define HB_DIRECTION_IS_VERTICAL(dir)	((((unsigned int) (dir)) & ~1U) == 6)
+/**
+ * HB_DIRECTION_IS_FORWARD:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction moves forward (from left to right, or from
+ * top to bottom). Requires that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_FORWARD(dir)	((((unsigned int) (dir)) & ~2U) == 4)
 #define HB_DIRECTION_IS_FORWARD(dir)	((((unsigned int) (dir)) & ~2U) == 4)
+/**
+ * HB_DIRECTION_IS_BACKWARD:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction moves backward (from right to left, or from
+ * bottom to top). Requires that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_BACKWARD(dir)	((((unsigned int) (dir)) & ~2U) == 5)
 #define HB_DIRECTION_IS_BACKWARD(dir)	((((unsigned int) (dir)) & ~2U) == 5)
+/**
+ * HB_DIRECTION_REVERSE:
+ * @dir: #hb_direction_t to reverse
+ *
+ * Reverses a text direction. Requires that the direction
+ * be valid.
+ *
+ **/
 #define HB_DIRECTION_REVERSE(dir)	((hb_direction_t) (((unsigned int) (dir)) ^ 1))
 #define HB_DIRECTION_REVERSE(dir)	((hb_direction_t) (((unsigned int) (dir)) ^ 1))
 
 
 
 
@@ -173,7 +277,169 @@ HB_EXTERN hb_language_t
 hb_language_get_default (void);
 hb_language_get_default (void);
 
 
 
 
-/* hb_script_t */
+/**
+ * hb_script_t:
+ * @HB_SCRIPT_COMMON: HB_TAG ('Z','y','y','y')
+ * @HB_SCRIPT_INHERITED: HB_TAG ('Z','i','n','h')
+ * @HB_SCRIPT_UNKNOWN: HB_TAG ('Z','z','z','z')
+ * @HB_SCRIPT_ARABIC
+ * @HB_SCRIPT_ARMENIAN
+ * @HB_SCRIPT_BENGALI
+ * @HB_SCRIPT_CYRILLIC
+ * @HB_SCRIPT_DEVANAGARI
+ * @HB_SCRIPT_GEORGIAN
+ * @HB_SCRIPT_GREEK
+ * @HB_SCRIPT_GUJARATI
+ * @HB_SCRIPT_GURMUKHI
+ * @HB_SCRIPT_HANGUL
+ * @HB_SCRIPT_HAN
+ * @HB_SCRIPT_HEBREW
+ * @HB_SCRIPT_HIRAGANA
+ * @HB_SCRIPT_KANNADA
+ * @HB_SCRIPT_KATAKANA
+ * @HB_SCRIPT_LAO
+ * @HB_SCRIPT_LATIN
+ * @HB_SCRIPT_MALAYALAM
+ * @HB_SCRIPT_ORIYA
+ * @HB_SCRIPT_TAMIL
+ * @HB_SCRIPT_TELUGU
+ * @HB_SCRIPT_THAI
+ * @HB_SCRIPT_TIBETAN
+ * @HB_SCRIPT_BOPOMOFO
+ * @HB_SCRIPT_BRAILLE
+ * @HB_SCRIPT_CANADIAN_SYLLABICS
+ * @HB_SCRIPT_CHEROKEE
+ * @HB_SCRIPT_ETHIOPIC
+ * @HB_SCRIPT_KHMER
+ * @HB_SCRIPT_MONGOLIAN
+ * @HB_SCRIPT_MYANMAR
+ * @HB_SCRIPT_OGHAM
+ * @HB_SCRIPT_RUNIC
+ * @HB_SCRIPT_SINHALA
+ * @HB_SCRIPT_SYRIAC
+ * @HB_SCRIPT_THAANA
+ * @HB_SCRIPT_YI
+ * @HB_SCRIPT_DESERET
+ * @HB_SCRIPT_GOTHIC
+ * @HB_SCRIPT_OLD_ITALIC
+ * @HB_SCRIPT_BUHID
+ * @HB_SCRIPT_HANUNOO
+ * @HB_SCRIPT_TAGALOG
+ * @HB_SCRIPT_TAGBANWA
+ * @HB_SCRIPT_CYPRIOT
+ * @HB_SCRIPT_LIMBU
+ * @HB_SCRIPT_LINEAR_B
+ * @HB_SCRIPT_OSMANYA
+ * @HB_SCRIPT_SHAVIAN
+ * @HB_SCRIPT_TAI_LE
+ * @HB_SCRIPT_UGARITIC
+ * @HB_SCRIPT_BUGINESE
+ * @HB_SCRIPT_COPTIC
+ * @HB_SCRIPT_GLAGOLITIC
+ * @HB_SCRIPT_KHAROSHTHI
+ * @HB_SCRIPT_NEW_TAI_LUE
+ * @HB_SCRIPT_OLD_PERSIAN
+ * @HB_SCRIPT_SYLOTI_NAGRI
+ * @HB_SCRIPT_TIFINAGH
+ * @HB_SCRIPT_BALINESE
+ * @HB_SCRIPT_CUNEIFORM
+ * @HB_SCRIPT_NKO
+ * @HB_SCRIPT_PHAGS_PA
+ * @HB_SCRIPT_PHOENICIAN
+ * @HB_SCRIPT_CARIAN
+ * @HB_SCRIPT_CHAM
+ * @HB_SCRIPT_KAYAH_LI
+ * @HB_SCRIPT_LEPCHA
+ * @HB_SCRIPT_LYCIAN
+ * @HB_SCRIPT_LYDIAN
+ * @HB_SCRIPT_OL_CHIKI
+ * @HB_SCRIPT_REJANG
+ * @HB_SCRIPT_SAURASHTRA
+ * @HB_SCRIPT_SUNDANESE
+ * @HB_SCRIPT_VAI
+ * @HB_SCRIPT_AVESTAN
+ * @HB_SCRIPT_BAMUM
+ * @HB_SCRIPT_EGYPTIAN_HIEROGLYPHS
+ * @HB_SCRIPT_IMPERIAL_ARAMAIC
+ * @HB_SCRIPT_INSCRIPTIONAL_PAHLAVI
+ * @HB_SCRIPT_INSCRIPTIONAL_PARTHIAN
+ * @HB_SCRIPT_JAVANESE
+ * @HB_SCRIPT_KAITHI
+ * @HB_SCRIPT_LISU
+ * @HB_SCRIPT_MEETEI_MAYEK
+ * @HB_SCRIPT_OLD_SOUTH_ARABIAN
+ * @HB_SCRIPT_OLD_TURKIC
+ * @HB_SCRIPT_SAMARITAN
+ * @HB_SCRIPT_TAI_THAM
+ * @HB_SCRIPT_TAI_VIET
+ * @HB_SCRIPT_BATAK
+ * @HB_SCRIPT_BRAHMI
+ * @HB_SCRIPT_MANDAIC
+ * @HB_SCRIPT_CHAKMA
+ * @HB_SCRIPT_MEROITIC_CURSIVE
+ * @HB_SCRIPT_MEROITIC_HIEROGLYPHS
+ * @HB_SCRIPT_MIAO
+ * @HB_SCRIPT_SHARADA
+ * @HB_SCRIPT_SORA_SOMPENG
+ * @HB_SCRIPT_TAKRI
+ * @HB_SCRIPT_BASSA_VAH
+ * @HB_SCRIPT_CAUCASIAN_ALBANIAN
+ * @HB_SCRIPT_DUPLOYAN
+ * @HB_SCRIPT_ELBASAN
+ * @HB_SCRIPT_GRANTHA
+ * @HB_SCRIPT_KHOJKI
+ * @HB_SCRIPT_KHUDAWADI
+ * @HB_SCRIPT_LINEAR_A
+ * @HB_SCRIPT_MAHAJANI
+ * @HB_SCRIPT_MANICHAEAN
+ * @HB_SCRIPT_MENDE_KIKAKUI
+ * @HB_SCRIPT_MODI
+ * @HB_SCRIPT_MRO
+ * @HB_SCRIPT_NABATAEAN
+ * @HB_SCRIPT_OLD_NORTH_ARABIAN
+ * @HB_SCRIPT_OLD_PERMIC
+ * @HB_SCRIPT_PAHAWH_HMONG
+ * @HB_SCRIPT_PALMYRENE
+ * @HB_SCRIPT_PAU_CIN_HAU
+ * @HB_SCRIPT_PSALTER_PAHLAVI
+ * @HB_SCRIPT_SIDDHAM
+ * @HB_SCRIPT_TIRHUTA
+ * @HB_SCRIPT_WARANG_CITI
+ * @HB_SCRIPT_AHOM
+ * @HB_SCRIPT_ANATOLIAN_HIEROGLYPHS
+ * @HB_SCRIPT_HATRAN
+ * @HB_SCRIPT_MULTANI
+ * @HB_SCRIPT_OLD_HUNGARIAN
+ * @HB_SCRIPT_SIGNWRITING
+ * @HB_SCRIPT_ADLAM
+ * @HB_SCRIPT_BHAIKSUKI
+ * @HB_SCRIPT_MARCHEN
+ * @HB_SCRIPT_OSAGE
+ * @HB_SCRIPT_TANGUT
+ * @HB_SCRIPT_NEWA
+ * @HB_SCRIPT_MASARAM_GONDI
+ * @HB_SCRIPT_NUSHU
+ * @HB_SCRIPT_SOYOMBO
+ * @HB_SCRIPT_ZANABAZAR_SQUARE
+ * @HB_SCRIPT_DOGRA
+ * @HB_SCRIPT_GUNJALA_GONDI
+ * @HB_SCRIPT_HANIFI_ROHINGYA
+ * @HB_SCRIPT_MAKASAR
+ * @HB_SCRIPT_MEDEFAIDRIN
+ * @HB_SCRIPT_OLD_SOGDIAN
+ * @HB_SCRIPT_SOGDIAN
+ * @HB_SCRIPT_ELYMAIC
+ * @HB_SCRIPT_NANDINAGARI
+ * @HB_SCRIPT_NYIAKENG_PUACHUE_HMONG
+ * @HB_SCRIPT_WANCHO
+ * @HB_SCRIPT_INVALID: #HB_TAG_NONE
+ *
+ * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding
+ * to the four-letter values defined by [ISO 15924](https://unicode.org/iso15924/).
+ *
+ * See also the Script (sc) property of the Unicode Character Database.
+ *
+ **/
 
 
 /* https://unicode.org/iso15924/ */
 /* https://unicode.org/iso15924/ */
 /* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
 /* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
@@ -410,6 +676,12 @@ hb_script_get_horizontal_direction (hb_script_t script);
 
 
 /* User data */
 /* User data */
 
 
+/**
+ * hb_user_data_key_t:
+ *
+ * Data structure for holding user-data keys.
+ *
+ **/
 typedef struct hb_user_data_key_t {
 typedef struct hb_user_data_key_t {
   /*< private >*/
   /*< private >*/
   char unused;
   char unused;
@@ -435,10 +707,10 @@ typedef void (*hb_destroy_func_t) (void *user_data);
 
 
 /**
 /**
  * hb_feature_t:
  * hb_feature_t:
- * @tag: a feature tag
- * @value: 0 disables the feature, non-zero (usually 1) enables the feature.
- * For features implemented as lookup type 3 (like 'salt') the @value is a one
- * based index into the alternates.
+ * @tag: The #hb_tag_t tag of the feature
+ * @value: The value of the feature. 0 disables the feature, non-zero (usually
+ * 1) enables the feature.  For features implemented as lookup type 3 (like
+ * 'salt') the @value is a one based index into the alternates.
  * @start: the cluster to start applying this feature setting (inclusive).
  * @start: the cluster to start applying this feature setting (inclusive).
  * @end: the cluster to end applying this feature setting (exclusive).
  * @end: the cluster to end applying this feature setting (exclusive).
  *
  *
@@ -465,7 +737,13 @@ hb_feature_to_string (hb_feature_t *feature,
 
 
 /**
 /**
  * hb_variation_t:
  * hb_variation_t:
+ * @tag: The #hb_tag_t tag of the variation-axis name
+ * @value: The value of the variation axis
  *
  *
+ * Data type for holding variation data. Registered OpenType
+ * variation-axis tags are listed at
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg
+ * 
  * Since: 1.4.2
  * Since: 1.4.2
  */
  */
 typedef struct hb_variation_t {
 typedef struct hb_variation_t {
@@ -484,7 +762,8 @@ hb_variation_to_string (hb_variation_t *variation,
 /**
 /**
  * hb_color_t:
  * hb_color_t:
  *
  *
- * Data type for holding color values.
+ * Data type for holding color values. Colors are eight bits per
+ * channel RGB plus alpha transparency.
  *
  *
  * Since: 2.1.0
  * Since: 2.1.0
  */
  */

+ 9 - 0
thirdparty/harfbuzz/src/hb-directwrite.cc

@@ -33,6 +33,15 @@
 #include "hb-directwrite.h"
 #include "hb-directwrite.h"
 
 
 
 
+/**
+ * SECTION:hb-directwrite
+ * @title: hb-directwrite
+ * @short_description: DirectWrite integration
+ * @include: hb-directwrite.h
+ *
+ * Functions for using HarfBuzz with DirectWrite fonts.
+ **/
+
 /* Declare object creator for dynamic support of DWRITE */
 /* Declare object creator for dynamic support of DWRITE */
 typedef HRESULT (* WINAPI t_DWriteCreateFactory)(
 typedef HRESULT (* WINAPI t_DWriteCreateFactory)(
   DWRITE_FACTORY_TYPE factoryType,
   DWRITE_FACTORY_TYPE factoryType,

+ 106 - 73
thirdparty/harfbuzz/src/hb-face.cc

@@ -41,8 +41,10 @@
  * @short_description: Font face objects
  * @short_description: Font face objects
  * @include: hb.h
  * @include: hb.h
  *
  *
- * Font face is objects represent a single face in a font family.
- * More exactly, a font face represents a single face in a binary font file.
+ * A font face is an object that represents a single face from within a
+ * font family.
+ *
+ * More precisely, a font face represents a single face in a binary font file.
  * Font faces are typically built from a binary blob and a face index.
  * Font faces are typically built from a binary blob and a face index.
  * Font faces are used to create fonts.
  * Font faces are used to create fonts.
  **/
  **/
@@ -52,7 +54,7 @@
  * hb_face_count:
  * hb_face_count:
  * @blob: a blob.
  * @blob: a blob.
  *
  *
- * Get number of faces in a blob.
+ * Fetches the number of faces in a blob.
  *
  *
  * Return value: Number of faces in @blob
  * Return value: Number of faces in @blob
  *
  *
@@ -96,13 +98,19 @@ DEFINE_NULL_INSTANCE (hb_face_t) =
 
 
 /**
 /**
  * hb_face_create_for_tables:
  * hb_face_create_for_tables:
- * @reference_table_func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @reference_table_func: (closure user_data) (destroy destroy) (scope notified): Table-referencing function
+ * @user_data: A pointer to the user data
+ * @destroy: (optional): A callback to call when @data is not needed anymore
  *
  *
+ * Variant of hb_face_create(), built for those cases where it is more
+ * convenient to provide data for individual tables instead of the whole font
+ * data. With the caveat that hb_face_get_table_tags() does not currently work
+ * with faces created this way.
+ * 
+ * Creates a new face object from the specified @user_data and @reference_table_func,
+ * with the @destroy callback. 
  *
  *
- * Return value: (transfer full)
+ * Return value: (transfer full): The new face object
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -182,12 +190,15 @@ _hb_face_for_data_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void
 
 
 /**
 /**
  * hb_face_create: (Xconstructor)
  * hb_face_create: (Xconstructor)
- * @blob:
- * @index:
- *
+ * @blob: #hb_blob_t to work upon
+ * @index: The index of the face within @blob
  *
  *
+ * Constructs a new face object from the specified blob and
+ * a face index into that blob. This is used for blobs of
+ * file formats such as Dfont and TTC that can contain more
+ * than one face.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The new face object
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -222,9 +233,9 @@ hb_face_create (hb_blob_t    *blob,
 /**
 /**
  * hb_face_get_empty:
  * hb_face_get_empty:
  *
  *
+ * Fetches the singleton empty face object.
  *
  *
- *
- * Return value: (transfer full)
+ * Return value: (transfer full) The empty face object
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -237,11 +248,11 @@ hb_face_get_empty ()
 
 
 /**
 /**
  * hb_face_reference: (skip)
  * hb_face_reference: (skip)
- * @face: a face.
- *
+ * @face: A face object
  *
  *
+ * Increases the reference count on a face object.
  *
  *
- * Return value:
+ * Return value: The @face object
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -253,9 +264,11 @@ hb_face_reference (hb_face_t *face)
 
 
 /**
 /**
  * hb_face_destroy: (skip)
  * hb_face_destroy: (skip)
- * @face: a face.
- *
- *
+ * @face: A face object
+ * 
+ * Decreases the reference count on a face object. When the
+ * reference count reaches zero, the face is destroyed,
+ * freeing all memory.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -283,15 +296,15 @@ hb_face_destroy (hb_face_t *face)
 
 
 /**
 /**
  * hb_face_set_user_data: (skip)
  * hb_face_set_user_data: (skip)
- * @face: a face.
- * @key:
- * @data:
- * @destroy:
- * @replace:
- *
+ * @face: A face object
+ * @key: The user-data key to set
+ * @data: A pointer to the user data
+ * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
  *
+ * Attaches a user-data key/data pair to the given face object. 
  *
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -307,12 +320,13 @@ hb_face_set_user_data (hb_face_t          *face,
 
 
 /**
 /**
  * hb_face_get_user_data: (skip)
  * hb_face_get_user_data: (skip)
- * @face: a face.
- * @key:
+ * @face: A face object
+ * @key: The user-data key to query
  *
  *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified face object.
  *
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -325,9 +339,9 @@ hb_face_get_user_data (const hb_face_t    *face,
 
 
 /**
 /**
  * hb_face_make_immutable:
  * hb_face_make_immutable:
- * @face: a face.
- *
+ * @face: A face object
  *
  *
+ * Makes the given face object immutable.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -342,11 +356,11 @@ hb_face_make_immutable (hb_face_t *face)
 
 
 /**
 /**
  * hb_face_is_immutable:
  * hb_face_is_immutable:
- * @face: a face.
+ * @face: A face object
  *
  *
+ * Tests whether the given face object is immutable.
  *
  *
- *
- * Return value:
+ * Return value: True is @face is immutable, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -359,12 +373,13 @@ hb_face_is_immutable (const hb_face_t *face)
 
 
 /**
 /**
  * hb_face_reference_table:
  * hb_face_reference_table:
- * @face: a face.
- * @tag:
- *
+ * @face: A face object
+ * @tag: The #hb_tag_t of the table to query
  *
  *
+ * Fetches a reference to the specified table within
+ * the specified face.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): A pointer to the @tag table within @face
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -380,11 +395,13 @@ hb_face_reference_table (const hb_face_t *face,
 
 
 /**
 /**
  * hb_face_reference_blob:
  * hb_face_reference_blob:
- * @face: a face.
- *
+ * @face: A face object
  *
  *
+ * Fetches a pointer to the binary blob that contains the
+ * specified face. Returns an empty blob if referencing face data is not
+ * possible.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): A pointer to the blob for @face
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -396,10 +413,13 @@ hb_face_reference_blob (hb_face_t *face)
 
 
 /**
 /**
  * hb_face_set_index:
  * hb_face_set_index:
- * @face: a face.
- * @index:
+ * @face: A face object
+ * @index: The index to assign
  *
  *
+ * Assigns the specified face-index to @face. Fails if the
+ * face is immutable.
  *
  *
+ * <note>Note: face indices within a collection are zero-based.</note>
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -415,11 +435,13 @@ hb_face_set_index (hb_face_t    *face,
 
 
 /**
 /**
  * hb_face_get_index:
  * hb_face_get_index:
- * @face: a face.
+ * @face: A face object
  *
  *
+ * Fetches the face-index corresponding to the given face.
  *
  *
+ * <note>Note: face indices within a collection are zero-based.</note>
  *
  *
- * Return value:
+ * Return value: The index of @face. 
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -431,10 +453,10 @@ hb_face_get_index (const hb_face_t *face)
 
 
 /**
 /**
  * hb_face_set_upem:
  * hb_face_set_upem:
- * @face: a face.
- * @upem:
- *
+ * @face: A face object
+ * @upem: The units-per-em value to assign
  *
  *
+ * Sets the units-per-em (upem) for a face object to the specified value.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -450,11 +472,11 @@ hb_face_set_upem (hb_face_t    *face,
 
 
 /**
 /**
  * hb_face_get_upem:
  * hb_face_get_upem:
- * @face: a face.
- *
+ * @face: A face object
  *
  *
+ * Fetches the units-per-em (upem) value of the specified face object.
  *
  *
- * Return value:
+ * Return value: The upem value of @face
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -466,10 +488,10 @@ hb_face_get_upem (const hb_face_t *face)
 
 
 /**
 /**
  * hb_face_set_glyph_count:
  * hb_face_set_glyph_count:
- * @face: a face.
- * @glyph_count:
- *
+ * @face: A face object
+ * @glyph_count: The glyph-count value to assign
  *
  *
+ * Sets the glyph count for a face object to the specified value.
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -485,11 +507,11 @@ hb_face_set_glyph_count (hb_face_t    *face,
 
 
 /**
 /**
  * hb_face_get_glyph_count:
  * hb_face_get_glyph_count:
- * @face: a face.
- *
+ * @face: A face object
  *
  *
+ * Fetches the glyph-count value of the specified face object.
  *
  *
- * Return value:
+ * Return value: The glyph-count value of @face
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -501,14 +523,16 @@ hb_face_get_glyph_count (const hb_face_t *face)
 
 
 /**
 /**
  * hb_face_get_table_tags:
  * hb_face_get_table_tags:
- * @face: a face.
- * @start_offset: index of first tag to return.
- * @table_count: input length of @table_tags array, output number of items written.
- * @table_tags: array to write tags into.
+ * @face: A face object
+ * @start_offset: The index of first table tag to retrieve
+ * @table_count: (inout): Input = the maximum number of table tags to return;
+ *                Output = the actual number of table tags returned (may be zero)
+ * @table_tags: (out) (array length=table_count): The array of table tags found
  *
  *
- * Retrieves table tags for a face, if possible.
+ * Fetches a list of all table tags for a face, if possible. The list returned will
+ * begin at the offset provided
  *
  *
- * Return value: total number of tables, or 0 if not possible to list.
+ * Return value: Total number of tables, or zero if it is not possible to list
  *
  *
  * Since: 1.6.0
  * Since: 1.6.0
  **/
  **/
@@ -542,8 +566,11 @@ hb_face_get_table_tags (const hb_face_t *face,
 #ifndef HB_NO_FACE_COLLECT_UNICODES
 #ifndef HB_NO_FACE_COLLECT_UNICODES
 /**
 /**
  * hb_face_collect_unicodes:
  * hb_face_collect_unicodes:
- * @face: font face.
- * @out: set to add Unicode characters covered by @face to.
+ * @face: A face object
+ * @out: The set to add Unicode characters to
+ *
+ * Collects all of the Unicode characters covered by @face and adds
+ * them to the #hb_set_t set @out.
  *
  *
  * Since: 1.9.0
  * Since: 1.9.0
  */
  */
@@ -555,10 +582,11 @@ hb_face_collect_unicodes (hb_face_t *face,
 }
 }
 /**
 /**
  * hb_face_collect_variation_selectors:
  * hb_face_collect_variation_selectors:
- * @face: font face.
- * @out: set to add Variation Selector characters covered by @face to.
- *
+ * @face: A face object
+ * @out: The set to add Variation Selector characters to
  *
  *
+ * Collects all Unicode "Variation Selector" characters covered by @face and adds
+ * them to the #hb_set_t set @out.
  *
  *
  * Since: 1.9.0
  * Since: 1.9.0
  */
  */
@@ -570,10 +598,12 @@ hb_face_collect_variation_selectors (hb_face_t *face,
 }
 }
 /**
 /**
  * hb_face_collect_variation_unicodes:
  * hb_face_collect_variation_unicodes:
- * @face: font face.
- * @out: set to add Unicode characters for @variation_selector covered by @face to.
- *
+ * @face: A face object
+ * @variation_selector: The Variation Selector to query
+ * @out: The set to add Unicode characters to
  *
  *
+ * Collects all Unicode characters for @variation_selector covered by @face and adds
+ * them to the #hb_set_t set @out.
  *
  *
  * Since: 1.9.0
  * Since: 1.9.0
  */
  */
@@ -708,6 +738,9 @@ hb_face_builder_create ()
 
 
 /**
 /**
  * hb_face_builder_add_table:
  * hb_face_builder_add_table:
+ * @face: A face object created with hb_face_builder_create()
+ * @tag: The #hb_tag_t of the table to add
+ * @blob: The blob containing the table data to add
  *
  *
  * Add table for @tag with data provided by @blob to the face.  @face must
  * Add table for @tag with data provided by @blob to the face.  @face must
  * be created using hb_face_builder_create().
  * be created using hb_face_builder_create().

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

@@ -46,6 +46,12 @@ hb_face_count (hb_blob_t *blob);
  * hb_face_t
  * hb_face_t
  */
  */
 
 
+/**
+ * hb_face_t:
+ *
+ * Data type for holding font faces.
+ *
+ **/
 typedef struct hb_face_t hb_face_t;
 typedef struct hb_face_t hb_face_t;
 
 
 HB_EXTERN hb_face_t *
 HB_EXTERN hb_face_t *

File diff suppressed because it is too large
+ 333 - 263
thirdparty/harfbuzz/src/hb-font.cc


+ 302 - 89
thirdparty/harfbuzz/src/hb-font.h

@@ -45,6 +45,19 @@ typedef struct hb_font_t hb_font_t;
  * hb_font_funcs_t
  * hb_font_funcs_t
  */
  */
 
 
+/**
+ * hb_font_funcs_t:
+ *
+ * Data type containing a set of virtual methods used for
+ * working on #hb_font_t font objects.
+ *
+ * HarfBuzz provides a lightweight default function for each of 
+ * the methods in #hb_font_funcs_t. Client programs can implement
+ * their own replacements for the individual font functions, as
+ * needed, and replace the default by calling the setter for a
+ * method.
+ *
+ **/
 typedef struct hb_font_funcs_t hb_font_funcs_t;
 typedef struct hb_font_funcs_t hb_font_funcs_t;
 
 
 HB_EXTERN hb_font_funcs_t *
 HB_EXTERN hb_font_funcs_t *
@@ -81,12 +94,21 @@ hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs);
 
 
 /* font and glyph extents */
 /* font and glyph extents */
 
 
-/* Note that typically ascender is positive and descender negative in coordinate systems that grow up. */
-typedef struct hb_font_extents_t
-{
-  hb_position_t ascender; /* typographic ascender. */
-  hb_position_t descender; /* typographic descender. */
-  hb_position_t line_gap; /* suggested line spacing gap. */
+/**
+ * hb_font_extents_t:
+ * @ascender: The height of typographic ascenders.
+ * @descender: The depth of typographic descenders.
+ * @line_gap: The suggested line-spacing gap.
+ *
+ * Font-wide extent values, measured in font units.
+ *
+ * Note that typically @ascender is positive and @descender
+ * negative, in coordinate systems that grow up.
+ **/
+typedef struct hb_font_extents_t {
+  hb_position_t ascender;
+  hb_position_t descender;
+  hb_position_t line_gap;
   /*< private >*/
   /*< private >*/
   hb_position_t reserved9;
   hb_position_t reserved9;
   hb_position_t reserved8;
   hb_position_t reserved8;
@@ -99,13 +121,22 @@ typedef struct hb_font_extents_t
   hb_position_t reserved1;
   hb_position_t reserved1;
 } hb_font_extents_t;
 } hb_font_extents_t;
 
 
-/* Note that height is negative in coordinate systems that grow up. */
-typedef struct hb_glyph_extents_t
-{
-  hb_position_t x_bearing; /* left side of glyph from origin. */
-  hb_position_t y_bearing; /* top side of glyph from origin. */
-  hb_position_t width; /* distance from left to right side. */
-  hb_position_t height; /* distance from top to bottom side. */
+/**
+ * hb_glyph_extents_t:
+ * @x_bearing: Distance from the x-origin to the left extremum of the glyph.
+ * @y_bearing: Distance from the top extremum of the glyph to the y-origin.
+ * @width: Distance from the left extremum of the glyph to the right extremum.
+ * @height: Distance from the top extremum of the glyph to the bottom extremum.
+ *
+ * Glyph extent values, measured in font units.
+ *
+ * Note that @height is negative, in coordinate systems that grow up.
+ **/
+typedef struct hb_glyph_extents_t {
+  hb_position_t x_bearing;
+  hb_position_t y_bearing;
+  hb_position_t width;
+  hb_position_t height;
 } hb_glyph_extents_t;
 } hb_glyph_extents_t;
 
 
 /* func types */
 /* func types */
@@ -113,19 +144,72 @@ typedef struct hb_glyph_extents_t
 typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
 						       hb_font_extents_t *extents,
 						       hb_font_extents_t *extents,
 						       void *user_data);
 						       void *user_data);
+
+/**
+ * hb_font_get_font_h_extents_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the extents for a font, in horizontal-direction
+ * text segments. Extents must be returned in an #hb_glyph_extents output
+ * parameter.
+ * 
+ **/
 typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
 typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
+
+/**
+ * hb_font_get_font_v_extents_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the extents for a font, in vertical-direction
+ * text segments. Extents must be returned in an #hb_glyph_extents output
+ * parameter.
+ * 
+ **/
 typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
 typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
 
 
 
 
+/**
+ * hb_font_get_nominal_glyph_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the nominal glyph ID for a specified Unicode code
+ * point. Glyph IDs must be returned in a #hb_codepoint_t output parameter.
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
 						       hb_codepoint_t unicode,
 						       hb_codepoint_t unicode,
 						       hb_codepoint_t *glyph,
 						       hb_codepoint_t *glyph,
 						       void *user_data);
 						       void *user_data);
+
+/**
+ * hb_font_get_variation_glyph_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph ID for a specified Unicode code point
+ * followed by a specified Variation Selector code point. Glyph IDs must be
+ * returned in a #hb_codepoint_t output parameter.
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
 							 hb_codepoint_t unicode, hb_codepoint_t variation_selector,
 							 hb_codepoint_t unicode, hb_codepoint_t variation_selector,
 							 hb_codepoint_t *glyph,
 							 hb_codepoint_t *glyph,
 							 void *user_data);
 							 void *user_data);
 
 
+
+/**
+ * hb_font_get_nominal_glyphs_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the nominal glyph IDs for a sequence of
+ * Unicode code points. Glyph IDs must be returned in a #hb_codepoint_t
+ * output parameter.
+ * 
+ **/
 typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data,
 typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data,
 							   unsigned int count,
 							   unsigned int count,
 							   const hb_codepoint_t *first_unicode,
 							   const hb_codepoint_t *first_unicode,
@@ -134,13 +218,51 @@ typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void
 							   unsigned int glyph_stride,
 							   unsigned int glyph_stride,
 							   void *user_data);
 							   void *user_data);
 
 
-
+/**
+ * hb_font_get_glyph_advance_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advance for a specified glyph. The
+ * method must return an #hb_position_t.
+ * 
+ **/
 typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
 typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
 							   hb_codepoint_t glyph,
 							   hb_codepoint_t glyph,
 							   void *user_data);
 							   void *user_data);
+
+/**
+ * hb_font_get_glyph_h_advance_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advance for a specified glyph, in
+ * horizontal-direction text segments. Advances must be returned in
+ * an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
+
+/**
+ * hb_font_get_glyph_v_advance_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advance for a specified glyph, in
+ * vertical-direction text segments. Advances must be returned in
+ * an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
 
 
+/**
+ * hb_font_get_glyph_advances_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advances for a sequence of glyphs.
+ * 
+ **/
 typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_data,
 typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_data,
 						   unsigned int count,
 						   unsigned int count,
 						   const hb_codepoint_t *first_glyph,
 						   const hb_codepoint_t *first_glyph,
@@ -148,14 +270,66 @@ typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_d
 						   hb_position_t *first_advance,
 						   hb_position_t *first_advance,
 						   unsigned advance_stride,
 						   unsigned advance_stride,
 						   void *user_data);
 						   void *user_data);
+
+/**
+ * hb_font_get_glyph_h_advances_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advances for a sequence of glyphs, in
+ * horizontal-direction text segments.
+ * 
+ **/
 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
+
+/**
+ * hb_font_get_glyph_v_advances_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advances for a sequence of glyphs, in
+ * vertical-direction text segments.
+ * 
+ **/
 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
 
 
+/**
+ * hb_font_get_glyph_origin_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * origin for a glyph. Each coordinate must be returned in an #hb_position_t
+ * output parameter.
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data,
 						      hb_codepoint_t glyph,
 						      hb_codepoint_t glyph,
 						      hb_position_t *x, hb_position_t *y,
 						      hb_position_t *x, hb_position_t *y,
 						      void *user_data);
 						      void *user_data);
+
+/**
+ * hb_font_get_glyph_h_origin_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * origin for a glyph, in horizontal-direction text segments. Each
+ * coordinate must be returned in an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t;
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t;
+
+/**
+ * hb_font_get_glyph_v_origin_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * origin for a glyph, in vertical-direction text segments. Each coordinate
+ * must be returned in an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
 
 
 typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data,
 typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data,
@@ -164,20 +338,59 @@ typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void
 typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
 typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
 
 
 
 
+/**
+ * hb_font_get_glyph_extents_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the extents for a specified glyph. Extents must be 
+ * returned in an #hb_glyph_extents output parameter.
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data,
 						       hb_codepoint_t glyph,
 						       hb_codepoint_t glyph,
 						       hb_glyph_extents_t *extents,
 						       hb_glyph_extents_t *extents,
 						       void *user_data);
 						       void *user_data);
+
+/**
+ * hb_font_get_glyph_contour_point_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) for a
+ * specified contour point in a glyph. Each coordinate must be returned as
+ * an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, void *font_data,
 							     hb_codepoint_t glyph, unsigned int point_index,
 							     hb_codepoint_t glyph, unsigned int point_index,
 							     hb_position_t *x, hb_position_t *y,
 							     hb_position_t *x, hb_position_t *y,
 							     void *user_data);
 							     void *user_data);
 
 
 
 
+/**
+ * hb_font_get_glyph_name_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph name that corresponds to a
+ * glyph ID. The name should be returned in a string output parameter.
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data,
 						    hb_codepoint_t glyph,
 						    hb_codepoint_t glyph,
 						    char *name, unsigned int size,
 						    char *name, unsigned int size,
 						    void *user_data);
 						    void *user_data);
+
+/**
+ * hb_font_get_glyph_from_name_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph ID that corresponds to a glyph-name
+ * string. 
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data,
 typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data,
 							 const char *name, int len, /* -1 means nul-terminated */
 							 const char *name, int len, /* -1 means nul-terminated */
 							 hb_codepoint_t *glyph,
 							 hb_codepoint_t *glyph,
@@ -188,12 +401,12 @@ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *
 
 
 /**
 /**
  * hb_font_funcs_set_font_h_extents_func:
  * hb_font_funcs_set_font_h_extents_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_font_h_extents_func_t.
  *
  *
  * Since: 1.1.2
  * Since: 1.1.2
  **/
  **/
@@ -204,12 +417,12 @@ hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_font_v_extents_func:
  * hb_font_funcs_set_font_v_extents_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_font_v_extents_func_t.
  *
  *
  * Since: 1.1.2
  * Since: 1.1.2
  **/
  **/
@@ -220,12 +433,12 @@ hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_nominal_glyph_func:
  * hb_font_funcs_set_nominal_glyph_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_nominal_glyph_func_t.
  *
  *
  * Since: 1.2.3
  * Since: 1.2.3
  **/
  **/
@@ -236,12 +449,12 @@ hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_nominal_glyphs_func:
  * hb_font_funcs_set_nominal_glyphs_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_nominal_glyphs_func_t.
  *
  *
  * Since: 2.0.0
  * Since: 2.0.0
  **/
  **/
@@ -252,12 +465,12 @@ hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_variation_glyph_func:
  * hb_font_funcs_set_variation_glyph_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_variation_glyph_func_t.
  *
  *
  * Since: 1.2.3
  * Since: 1.2.3
  **/
  **/
@@ -268,12 +481,12 @@ hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_h_advance_func:
  * hb_font_funcs_set_glyph_h_advance_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_advance_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -284,12 +497,12 @@ hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_v_advance_func:
  * hb_font_funcs_set_glyph_v_advance_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_v_advance_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -300,12 +513,12 @@ hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_h_advances_func:
  * hb_font_funcs_set_glyph_h_advances_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_advances_func_t.
  *
  *
  * Since: 1.8.6
  * Since: 1.8.6
  **/
  **/
@@ -316,12 +529,12 @@ hb_font_funcs_set_glyph_h_advances_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_v_advances_func:
  * hb_font_funcs_set_glyph_v_advances_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_v_advances_func_t.
  *
  *
  * Since: 1.8.6
  * Since: 1.8.6
  **/
  **/
@@ -332,12 +545,12 @@ hb_font_funcs_set_glyph_v_advances_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_h_origin_func:
  * hb_font_funcs_set_glyph_h_origin_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_origin_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -348,12 +561,12 @@ hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_v_origin_func:
  * hb_font_funcs_set_glyph_v_origin_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_v_origin_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -380,12 +593,12 @@ hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_extents_func:
  * hb_font_funcs_set_glyph_extents_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_extents_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -396,12 +609,12 @@ hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_contour_point_func:
  * hb_font_funcs_set_glyph_contour_point_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_contour_point_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -412,12 +625,12 @@ hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_name_func:
  * hb_font_funcs_set_glyph_name_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_name_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -428,12 +641,12 @@ hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
 
 
 /**
 /**
  * hb_font_funcs_set_glyph_from_name_func:
  * hb_font_funcs_set_glyph_from_name_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_font_get_glyph_from_name_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/

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

@@ -661,7 +661,7 @@ _hb_ft_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data
 /**
 /**
  * hb_ft_face_create:
  * hb_ft_face_create:
  * @ft_face: (destroy destroy) (scope notified): FT_Face to work upon
  * @ft_face: (destroy destroy) (scope notified): FT_Face to work upon
- * @destroy: A callback to call when the face object is not needed anymore
+ * @destroy: (optional): A callback to call when the face object is not needed anymore
  *
  *
  * Creates an #hb_face_t face object from the specified FT_Face.
  * Creates an #hb_face_t face object from the specified FT_Face.
  *
  *

+ 10 - 0
thirdparty/harfbuzz/src/hb-gdi.cc

@@ -28,6 +28,16 @@
 
 
 #include "hb-gdi.h"
 #include "hb-gdi.h"
 
 
+
+/**
+ * SECTION:hb-gdi
+ * @title: hb-gdi
+ * @short_description: GDI integration
+ * @include: hb-gdi.h
+ *
+ * Functions for using HarfBuzz with GDI fonts.
+ **/
+
 static hb_blob_t *
 static hb_blob_t *
 _hb_gdi_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
 _hb_gdi_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
 {
 {

+ 54 - 33
thirdparty/harfbuzz/src/hb-map.cc

@@ -42,7 +42,9 @@
 /**
 /**
  * hb_map_create: (Xconstructor)
  * hb_map_create: (Xconstructor)
  *
  *
- * Return value: (transfer full):
+ * Creates a new, initially empty map.
+ *
+ * Return value: (transfer full): The new #hb_map_t
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -62,7 +64,9 @@ hb_map_create ()
 /**
 /**
  * hb_map_get_empty:
  * hb_map_get_empty:
  *
  *
- * Return value: (transfer full):
+ * Fetches the singleton empty #hb_map_t.
+ *
+ * Return value: (transfer full): The empty #hb_map_t
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -74,9 +78,11 @@ hb_map_get_empty ()
 
 
 /**
 /**
  * hb_map_reference: (skip)
  * hb_map_reference: (skip)
- * @map: a map.
+ * @map: A map
+ *
+ * Increases the reference count on a map.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The map
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -88,7 +94,11 @@ hb_map_reference (hb_map_t *map)
 
 
 /**
 /**
  * hb_map_destroy: (skip)
  * hb_map_destroy: (skip)
- * @map: a map.
+ * @map: A map
+ *
+ * Decreases the reference count on a map. When
+ * the reference count reaches zero, the map is
+ * destroyed, freeing all memory.
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -104,13 +114,15 @@ hb_map_destroy (hb_map_t *map)
 
 
 /**
 /**
  * hb_map_set_user_data: (skip)
  * hb_map_set_user_data: (skip)
- * @map: a map.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @map: A map
+ * @key: The user-data key to set
+ * @data: A pointer to the user data to set
+ * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
+ *
+ * Attaches a user-data key/data pair to the specified map.
  *
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -126,10 +138,13 @@ hb_map_set_user_data (hb_map_t           *map,
 
 
 /**
 /**
  * hb_map_get_user_data: (skip)
  * hb_map_get_user_data: (skip)
- * @map: a map.
- * @key:
+ * @map: A map
+ * @key: The user-data key to query
+ *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified map.
  *
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -143,11 +158,11 @@ hb_map_get_user_data (hb_map_t           *map,
 
 
 /**
 /**
  * hb_map_allocation_successful:
  * hb_map_allocation_successful:
- * @map: a map.
+ * @map: A map
  *
  *
+ * Tests whether memory allocation for a set was successful.
  *
  *
- *
- * Return value:
+ * Return value: %true if allocation succeeded, false otherwise
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -160,11 +175,11 @@ hb_map_allocation_successful (const hb_map_t  *map)
 
 
 /**
 /**
  * hb_map_set:
  * hb_map_set:
- * @map: a map.
- * @key:
- * @value:
- *
+ * @map: A map
+ * @key: The key to store in the map
+ * @value: The value to store for @key
  *
  *
+ * Stores @key:@value in the map.
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -178,10 +193,10 @@ hb_map_set (hb_map_t       *map,
 
 
 /**
 /**
  * hb_map_get:
  * hb_map_get:
- * @map: a map.
- * @key:
- *
+ * @map: A map
+ * @key: The key to query
  *
  *
+ * Fetches the value stored for @key in @map.
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -194,10 +209,10 @@ hb_map_get (const hb_map_t *map,
 
 
 /**
 /**
  * hb_map_del:
  * hb_map_del:
- * @map: a map.
- * @key:
- *
+ * @map: A map
+ * @key: The key to delete
  *
  *
+ * Removes @key and its stored value from @map.
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -210,10 +225,12 @@ hb_map_del (hb_map_t       *map,
 
 
 /**
 /**
  * hb_map_has:
  * hb_map_has:
- * @map: a map.
- * @key:
+ * @map: A map
+ * @key: The key to query
  *
  *
+ * Tests whether @key is an element of @map.
  *
  *
+ * Return value: %true if @key is found in @map, false otherwise
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -227,9 +244,9 @@ hb_map_has (const hb_map_t *map,
 
 
 /**
 /**
  * hb_map_clear:
  * hb_map_clear:
- * @map: a map.
- *
+ * @map: A map
  *
  *
+ * Clears out the contents of @map.
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -241,9 +258,11 @@ hb_map_clear (hb_map_t *map)
 
 
 /**
 /**
  * hb_map_is_empty:
  * hb_map_is_empty:
- * @map: a map.
+ * @map: A map
  *
  *
+ * Tests whether @map is empty (contains no elements).
  *
  *
+ * Return value: %true if @map is empty
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/
@@ -255,9 +274,11 @@ hb_map_is_empty (const hb_map_t *map)
 
 
 /**
 /**
  * hb_map_get_population:
  * hb_map_get_population:
- * @map: a map.
+ * @map: A map
  *
  *
+ * Returns the number of key-value pairs in the map.
  *
  *
+ * Return value: The population of @map
  *
  *
  * Since: 1.7.7
  * Since: 1.7.7
  **/
  **/

+ 6 - 0
thirdparty/harfbuzz/src/hb-map.h

@@ -41,6 +41,12 @@ HB_BEGIN_DECLS
  */
  */
 #define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
 #define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
 
 
+/**
+ * hb_map_t:
+ *
+ * Data type for holding integer-to-integer hash maps.
+ *
+ **/
 typedef struct hb_map_t hb_map_t;
 typedef struct hb_map_t hb_map_t;
 
 
 
 

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

@@ -177,6 +177,7 @@ struct hb_nonnull_ptr_t
   T * get () const { return v ? v : const_cast<T *> (&Null (T)); }
   T * get () const { return v ? v : const_cast<T *> (&Null (T)); }
   T * get_raw () const { return v; }
   T * get_raw () const { return v; }
 
 
+  private:
   T *v;
   T *v;
 };
 };
 
 

+ 0 - 2
thirdparty/harfbuzz/src/hb-open-type.hh

@@ -433,8 +433,6 @@ struct UnsizedArrayOf
   { return hb_array (arrayZ, len); }
   { return hb_array (arrayZ, len); }
   hb_array_t<const Type> as_array (unsigned int len) const
   hb_array_t<const Type> as_array (unsigned int len) const
   { return hb_array (arrayZ, len); }
   { return hb_array (arrayZ, len); }
-  operator hb_array_t<      Type> ()       { return as_array (); }
-  operator hb_array_t<const Type> () const { return as_array (); }
 
 
   template <typename T>
   template <typename T>
   Type &lsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
   Type &lsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))

+ 1 - 2
thirdparty/harfbuzz/src/hb-ot-color.h

@@ -100,8 +100,7 @@ hb_ot_color_has_layers (hb_face_t *face);
  *
  *
  * Since: 2.1.0
  * Since: 2.1.0
  **/
  **/
-typedef struct hb_ot_color_layer_t
-{
+typedef struct hb_ot_color_layer_t {
   hb_codepoint_t glyph;
   hb_codepoint_t glyph;
   unsigned int   color_index;
   unsigned int   color_index;
 } hb_ot_color_layer_t;
 } hb_ot_color_layer_t;

+ 1 - 2
thirdparty/harfbuzz/src/hb-ot-deprecated.h

@@ -82,8 +82,7 @@ hb_ot_tag_from_language (hb_language_t language);
  * Since: 1.4.2
  * Since: 1.4.2
  * Deprecated: 2.2.0
  * Deprecated: 2.2.0
  */
  */
-typedef struct hb_ot_var_axis_t
-{
+typedef struct hb_ot_var_axis_t {
   hb_tag_t tag;
   hb_tag_t tag;
   hb_ot_name_id_t name_id;
   hb_ot_name_id_t name_id;
   float min_value;
   float min_value;

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

@@ -306,6 +306,9 @@ _hb_ot_get_font_funcs ()
 
 
 /**
 /**
  * hb_ot_font_set_funcs:
  * hb_ot_font_set_funcs:
+ * @font: #hb_font_t to work upon
+ *
+ * Sets the font functions to use when working with @font. 
  *
  *
  * Since: 0.9.28
  * Since: 0.9.28
  **/
  **/

+ 15 - 3
thirdparty/harfbuzz/src/hb-ot-layout-base-table.hh

@@ -379,12 +379,20 @@ struct Axis
 		     const BaseCoord **coord) const
 		     const BaseCoord **coord) const
   {
   {
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
-    if (!base_script.has_data ()) return false;
+    if (!base_script.has_data ())
+    {
+      *coord = nullptr;
+      return false;
+    }
 
 
     if (likely (coord))
     if (likely (coord))
     {
     {
       unsigned int tag_index = 0;
       unsigned int tag_index = 0;
-      (this+baseTagList).bfind (baseline_tag, &tag_index);
+      if (!(this+baseTagList).bfind (baseline_tag, &tag_index))
+      {
+        *coord = nullptr;
+        return false;
+      }
       *coord = &base_script.get_base_coord (tag_index);
       *coord = &base_script.get_base_coord (tag_index);
     }
     }
 
 
@@ -398,7 +406,11 @@ struct Axis
 		    const BaseCoord **max_coord) const
 		    const BaseCoord **max_coord) const
   {
   {
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
-    if (!base_script.has_data ()) return false;
+    if (!base_script.has_data ())
+    {
+      *min_coord = *max_coord = nullptr;
+      return false;
+    }
 
 
     base_script.get_min_max (language_tag).get_min_max (feature_tag, min_coord, max_coord);
     base_script.get_min_max (language_tag).get_min_max (feature_tag, min_coord, max_coord);
 
 

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

@@ -2537,7 +2537,10 @@ struct VariationStore
 
 
     for (unsigned i = 0; i < inner_maps.length; i++)
     for (unsigned i = 0; i < inner_maps.length; i++)
       inner_maps[i].fini ();
       inner_maps[i].fini ();
-    return_trace (bool (varstore_prime->dataSets));
+
+    return_trace (
+        !c->serializer->in_error()
+        && varstore_prime->dataSets);
   }
   }
 
 
   unsigned int get_region_index_count (unsigned int ivs) const
   unsigned int get_region_index_count (unsigned int ivs) const

+ 5 - 1
thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh

@@ -1859,7 +1859,7 @@ struct ContextFormat2
 
 
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
     bool ret = true;
     bool ret = true;
-    unsigned non_zero_index = 0, index = 0;
+    int non_zero_index = 0, index = 0;
     for (const hb_pair_t<unsigned, const OffsetTo<RuleSet>&> _ : + hb_enumerate (ruleSet)
     for (const hb_pair_t<unsigned, const OffsetTo<RuleSet>&> _ : + hb_enumerate (ruleSet)
 								 | hb_filter (klass_map, hb_first))
 								 | hb_filter (klass_map, hb_first))
     {
     {
@@ -3378,7 +3378,11 @@ struct GSUBGPOS
 
 
       this->accels = (hb_ot_layout_lookup_accelerator_t *) calloc (this->lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
       this->accels = (hb_ot_layout_lookup_accelerator_t *) calloc (this->lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
       if (unlikely (!this->accels))
       if (unlikely (!this->accels))
+      {
 	this->lookup_count = 0;
 	this->lookup_count = 0;
+	this->table.destroy ();
+	this->table = hb_blob_get_empty ();
+      }
 
 
       for (unsigned int i = 0; i < this->lookup_count; i++)
       for (unsigned int i = 0; i < this->lookup_count; i++)
 	this->accels[i].init (table->get_lookup (i));
 	this->accels[i].init (table->get_lookup (i));

+ 20 - 20
thirdparty/harfbuzz/src/hb-ot-layout.cc

@@ -76,7 +76,7 @@
  * Tests whether a face includes any kerning data in the 'kern' table.
  * Tests whether a face includes any kerning data in the 'kern' table.
  * Does NOT test for kerning lookups in the GPOS table.
  * Does NOT test for kerning lookups in the GPOS table.
  *
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, false otherwise
  *
  *
  **/
  **/
 bool
 bool
@@ -92,7 +92,7 @@ hb_ot_layout_has_kerning (hb_face_t *face)
  * Tests whether a face includes any state-machine kerning in the 'kern' table.
  * Tests whether a face includes any state-machine kerning in the 'kern' table.
  * Does NOT examine the GPOS table.
  * Does NOT examine the GPOS table.
  *
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, false otherwise
  *
  *
  **/
  **/
 bool
 bool
@@ -112,7 +112,7 @@ hb_ot_layout_has_machine_kerning (hb_face_t *face)
  *
  *
  * Does NOT examine the GPOS table.
  * Does NOT examine the GPOS table.
  *
  *
- * Return value: true is data found, false otherwise
+ * Return value: %true is data found, false otherwise
  *
  *
  **/
  **/
 bool
 bool
@@ -268,7 +268,7 @@ _hb_ot_layout_set_glyph_props (hb_font_t *font,
  *
  *
  * Tests whether a face has any glyph classes defined in its GDEF table.
  * Tests whether a face has any glyph classes defined in its GDEF table.
  *
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, false otherwise
  *
  *
  **/
  **/
 hb_bool_t
 hb_bool_t
@@ -444,7 +444,7 @@ hb_ot_layout_table_get_script_tags (hb_face_t    *face,
  * Fetches the index if a given script tag in the specified face's GSUB table
  * Fetches the index if a given script tag in the specified face's GSUB table
  * or GPOS table.
  * or GPOS table.
  *
  *
- * Return value: true if the script is found, false otherwise
+ * Return value: %true if the script is found, false otherwise
  *
  *
  **/
  **/
 hb_bool_t
 hb_bool_t
@@ -598,7 +598,7 @@ hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
  * Fetches the index for a given feature tag in the specified face's GSUB table
  * Fetches the index for a given feature tag in the specified face's GSUB table
  * or GPOS table.
  * or GPOS table.
  *
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, false otherwise
  **/
  **/
 bool
 bool
 hb_ot_layout_table_find_feature (hb_face_t    *face,
 hb_ot_layout_table_find_feature (hb_face_t    *face,
@@ -663,7 +663,7 @@ hb_ot_layout_script_get_language_tags (hb_face_t    *face,
  * Fetches the index of a given language tag in the specified face's GSUB table
  * Fetches the index of a given language tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script tag.
  * or GPOS table, underneath the specified script tag.
  *
  *
- * Return value: true if the language tag is found, false otherwise
+ * Return value: %true if the language tag is found, false otherwise
  *
  *
  * Since: ??
  * Since: ??
  * Deprecated: ??
  * Deprecated: ??
@@ -697,7 +697,7 @@ hb_ot_layout_script_find_language (hb_face_t    *face,
  * Fetches the index of a given language tag in the specified face's GSUB table
  * Fetches the index of a given language tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script index.
  * or GPOS table, underneath the specified script index.
  *
  *
- * Return value: true if the language tag is found, false otherwise
+ * Return value: %true if the language tag is found, false otherwise
  *
  *
  * Since: 2.0.0
  * Since: 2.0.0
  **/
  **/
@@ -739,7 +739,7 @@ hb_ot_layout_script_select_language (hb_face_t      *face,
  * Fetches the index of a requested feature in the given face's GSUB or GPOS table,
  * Fetches the index of a requested feature in the given face's GSUB or GPOS table,
  * underneath the specified script and language.
  * underneath the specified script and language.
  *
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, false otherwise
  *
  *
  **/
  **/
 hb_bool_t
 hb_bool_t
@@ -770,7 +770,7 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
  * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table,
  * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table,
  * underneath the specified script and language.
  * underneath the specified script and language.
  *
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, false otherwise
  *
  *
  * Since: 0.9.30
  * Since: 0.9.30
  **/
  **/
@@ -877,7 +877,7 @@ hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
  * Fetches the index of a given feature tag in the specified face's GSUB table
  * Fetches the index of a given feature tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script and language.
  * or GPOS table, underneath the specified script and language.
  *
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, false otherwise
  *
  *
  **/
  **/
 hb_bool_t
 hb_bool_t
@@ -1196,7 +1196,7 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
  * @glyphs_before: (out): Array of glyphs preceding the substitution range
  * @glyphs_before: (out): Array of glyphs preceding the substitution range
  * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup
  * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup
  * @glyphs_after: (out): Array of glyphs following the substitution range
  * @glyphs_after: (out): Array of glyphs following the substitution range
- * @glyphs_output: (out): Array of glyphs that would be the substitued output of the lookup
+ * @glyphs_output: (out): Array of glyphs that would be the substituted output of the lookup
  *
  *
  * Fetches a list of all glyphs affected by the specified lookup in the
  * Fetches a list of all glyphs affected by the specified lookup in the
  * specified face's GSUB table or GPOS table.
  * specified face's GSUB table or GPOS table.
@@ -1245,7 +1245,7 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
  * @face: #hb_face_t to work upon
  * @face: #hb_face_t to work upon
  * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
  * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
  * @coords: The variation coordinates to query
  * @coords: The variation coordinates to query
- * @num_coords: The number of variation coorinates
+ * @num_coords: The number of variation coordinates
  * @variations_index: (out): The array of feature variations found for the query
  * @variations_index: (out): The array of feature variations found for the query
  *
  *
  * Fetches a list of feature variations in the specified face's GSUB table
  * Fetches a list of feature variations in the specified face's GSUB table
@@ -1310,7 +1310,7 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
  *
  *
  * Tests whether the specified face includes any GSUB substitutions.
  * Tests whether the specified face includes any GSUB substitutions.
  *
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, false otherwise
  *
  *
  **/
  **/
 hb_bool_t
 hb_bool_t
@@ -1331,7 +1331,7 @@ hb_ot_layout_has_substitution (hb_face_t *face)
  * Tests whether a specified lookup in the specified face would
  * Tests whether a specified lookup in the specified face would
  * trigger a substitution on the given glyph sequence.
  * trigger a substitution on the given glyph sequence.
  *
  *
- * Return value: true if a substitution would be triggered, false otherwise
+ * Return value: %true if a substitution would be triggered, false otherwise
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -1488,7 +1488,7 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
  * hb_ot_layout_has_positioning:
  * hb_ot_layout_has_positioning:
  * @face: #hb_face_t to work upon
  * @face: #hb_face_t to work upon
  *
  *
- * Return value: true if the face has GPOS data, false otherwise
+ * Return value: %true if the face has GPOS data, false otherwise
  *
  *
  **/
  **/
 hb_bool_t
 hb_bool_t
@@ -1561,7 +1561,7 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
  * For more information on this distinction, see the [`size` feature documentation](
  * For more information on this distinction, see the [`size` feature documentation](
  * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size).
  * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size).
  *
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, false otherwise
  *
  *
  * Since: 0.9.10
  * Since: 0.9.10
  **/
  **/
@@ -1625,7 +1625,7 @@ hb_ot_layout_get_size_params (hb_face_t       *face,
  * Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or
  * Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or
  * "Character Variant" ('cvXX') features.
  * "Character Variant" ('cvXX') features.
  *
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, false otherwise
  *
  *
  * Since: 2.0.0
  * Since: 2.0.0
  **/
  **/
@@ -1881,7 +1881,7 @@ void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, h
   GSUBProxy proxy (font->face);
   GSUBProxy proxy (font->face);
   if (!buffer->message (font, "start table GSUB")) return;
   if (!buffer->message (font, "start table GSUB")) return;
   apply (proxy, plan, font, buffer);
   apply (proxy, plan, font, buffer);
-  (void)buffer->message (font, "end table GSUB");
+  (void) buffer->message (font, "end table GSUB");
 }
 }
 
 
 void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
 void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
@@ -1889,7 +1889,7 @@ void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_
   GPOSProxy proxy (font->face);
   GPOSProxy proxy (font->face);
   if (!buffer->message (font, "start table GPOS")) return;
   if (!buffer->message (font, "start table GPOS")) return;
   apply (proxy, plan, font, buffer);
   apply (proxy, plan, font, buffer);
-  (void)buffer->message (font, "end table GPOS");
+  (void) buffer->message (font, "end table GPOS");
 }
 }
 
 
 void
 void

+ 2 - 2
thirdparty/harfbuzz/src/hb-ot-map.hh

@@ -140,12 +140,12 @@ struct hb_ot_map_t
   void get_stage_lookups (unsigned int table_index, unsigned int stage,
   void get_stage_lookups (unsigned int table_index, unsigned int stage,
 			  const struct lookup_map_t **plookups, unsigned int *lookup_count) const
 			  const struct lookup_map_t **plookups, unsigned int *lookup_count) const
   {
   {
-    if (unlikely (stage == UINT_MAX)) {
+    if (unlikely (stage > stages[table_index].length))
+    {
       *plookups = nullptr;
       *plookups = nullptr;
       *lookup_count = 0;
       *lookup_count = 0;
       return;
       return;
     }
     }
-    assert (stage <= stages[table_index].length);
     unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
     unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
     unsigned int end   = stage < stages[table_index].length ? stages[table_index][stage].last_lookup : lookups[table_index].length;
     unsigned int end   = stage < stages[table_index].length ? stages[table_index][stage].last_lookup : lookups[table_index].length;
     *plookups = end == start ? nullptr : &lookups[table_index][start];
     *plookups = end == start ? nullptr : &lookups[table_index][start];

+ 9 - 0
thirdparty/harfbuzz/src/hb-ot-metrics.cc

@@ -33,6 +33,15 @@
 #include "hb-ot-face.hh"
 #include "hb-ot-face.hh"
 
 
 
 
+/**
+ * SECTION:hb-ot-metrics
+ * @title: hb-ot-metrics
+ * @short_description: OpenType Metrics
+ * @include: hb-ot.h
+ *
+ * Functions for fetching metrics from fonts.
+ **/
+
 static float
 static float
 _fix_ascender_descender (float value, hb_ot_metrics_tag_t metrics_tag)
 _fix_ascender_descender (float value, hb_ot_metrics_tag_t metrics_tag)
 {
 {

+ 1 - 2
thirdparty/harfbuzz/src/hb-ot-name.h

@@ -88,8 +88,7 @@ typedef unsigned int hb_ot_name_id_t;
  *
  *
  * Since: 2.1.0
  * Since: 2.1.0
  **/
  **/
-typedef struct hb_ot_name_entry_t
-{
+typedef struct hb_ot_name_entry_t {
   hb_ot_name_id_t name_id;
   hb_ot_name_id_t name_id;
   /*< private >*/
   /*< private >*/
   hb_var_int_t    var;
   hb_var_int_t    var;

+ 8 - 2
thirdparty/harfbuzz/src/hb-ot-shape-complex-indic.cc

@@ -1006,11 +1006,14 @@ initial_reordering_indic (const hb_ot_shape_plan_t *plan,
 			  hb_font_t *font,
 			  hb_font_t *font,
 			  hb_buffer_t *buffer)
 			  hb_buffer_t *buffer)
 {
 {
+  if (!buffer->message (font, "start reordering indic initial"))
+    return;
   update_consonant_positions_indic (plan, font, buffer);
   update_consonant_positions_indic (plan, font, buffer);
   insert_dotted_circles_indic (plan, font, buffer);
   insert_dotted_circles_indic (plan, font, buffer);
 
 
   foreach_syllable (buffer, start, end)
   foreach_syllable (buffer, start, end)
     initial_reordering_syllable_indic (plan, font->face, buffer, start, end);
     initial_reordering_syllable_indic (plan, font->face, buffer, start, end);
+  (void) buffer->message (font, "end reordering indic initial");
 }
 }
 
 
 static void
 static void
@@ -1485,8 +1488,11 @@ final_reordering_indic (const hb_ot_shape_plan_t *plan,
   unsigned int count = buffer->len;
   unsigned int count = buffer->len;
   if (unlikely (!count)) return;
   if (unlikely (!count)) return;
 
 
-  foreach_syllable (buffer, start, end)
-    final_reordering_syllable_indic (plan, buffer, start, end);
+  if (buffer->message (font, "start reordering indic final")) {
+    foreach_syllable (buffer, start, end)
+      final_reordering_syllable_indic (plan, buffer, start, end);
+    (void) buffer->message (font, "end reordering indic final");
+  }
 
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position);
   HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position);

+ 6 - 4
thirdparty/harfbuzz/src/hb-ot-shape-complex-khmer.cc

@@ -389,11 +389,13 @@ reorder_khmer (const hb_ot_shape_plan_t *plan,
 	       hb_font_t *font,
 	       hb_font_t *font,
 	       hb_buffer_t *buffer)
 	       hb_buffer_t *buffer)
 {
 {
-  insert_dotted_circles_khmer (plan, font, buffer);
-
-  foreach_syllable (buffer, start, end)
-    reorder_syllable_khmer (plan, font->face, buffer, start, end);
+  if (buffer->message (font, "start reordering khmer")) {
+    insert_dotted_circles_khmer (plan, font, buffer);
 
 
+    foreach_syllable (buffer, start, end)
+      reorder_syllable_khmer (plan, font->face, buffer, start, end);
+    (void) buffer->message (font, "end reordering khmer");
+  }
   HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
 }
 }
 
 

+ 69 - 0
thirdparty/harfbuzz/src/hb-ot-shape-complex-machine-index.hh

@@ -0,0 +1,69 @@
+/*
+ * Copyright © 2019,2020  David Corbett
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH
+#define HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH
+
+#include "hb.hh"
+
+
+template <typename Iter>
+struct machine_index_t :
+  hb_iter_with_fallback_t<machine_index_t<Iter>,
+			  typename Iter::item_t>
+{
+  machine_index_t (const Iter& it) : it (it) {}
+  machine_index_t (const machine_index_t& o) : it (o.it) {}
+
+  static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
+  static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
+
+  typename Iter::item_t __item__ () const { return *it; }
+  typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
+  unsigned __len__ () const { return it.len (); }
+  void __next__ () { ++it; }
+  void __forward__ (unsigned n) { it += n; }
+  void __prev__ () { --it; }
+  void __rewind__ (unsigned n) { it -= n; }
+  void operator = (unsigned n)
+  { unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
+  void operator = (const machine_index_t& o) { *this = (*o.it).first; }
+  bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
+  bool operator != (const machine_index_t& o) const { return !(*this == o); }
+
+  private:
+  Iter it;
+};
+struct
+{
+  template <typename Iter,
+	    hb_requires (hb_is_iterable (Iter))>
+  machine_index_t<hb_iter_type<Iter>>
+  operator () (Iter&& it) const
+  { return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
+}
+HB_FUNCOBJ (machine_index);
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH */

+ 7 - 10
thirdparty/harfbuzz/src/hb-ot-shape-complex-myanmar.cc

@@ -97,12 +97,6 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan)
     map->enable_feature (myanmar_other_features[i], F_MANUAL_ZWJ);
     map->enable_feature (myanmar_other_features[i], F_MANUAL_ZWJ);
 }
 }
 
 
-static void
-override_features_myanmar (hb_ot_shape_planner_t *plan)
-{
-  plan->map.disable_feature (HB_TAG('l','i','g','a'));
-}
-
 
 
 enum myanmar_syllable_type_t {
 enum myanmar_syllable_type_t {
   myanmar_consonant_syllable,
   myanmar_consonant_syllable,
@@ -333,10 +327,13 @@ reorder_myanmar (const hb_ot_shape_plan_t *plan,
 		 hb_font_t *font,
 		 hb_font_t *font,
 		 hb_buffer_t *buffer)
 		 hb_buffer_t *buffer)
 {
 {
-  insert_dotted_circles_myanmar (plan, font, buffer);
+  if (buffer->message (font, "start reordering myanmar")) {
+    insert_dotted_circles_myanmar (plan, font, buffer);
 
 
-  foreach_syllable (buffer, start, end)
-    reorder_syllable_myanmar (plan, font->face, buffer, start, end);
+    foreach_syllable (buffer, start, end)
+      reorder_syllable_myanmar (plan, font->face, buffer, start, end);
+    (void) buffer->message (font, "end reordering myanmar");
+  }
 
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
   HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
@@ -346,7 +343,7 @@ reorder_myanmar (const hb_ot_shape_plan_t *plan,
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
 {
 {
   collect_features_myanmar,
   collect_features_myanmar,
-  override_features_myanmar,
+  nullptr, /* override_features */
   nullptr, /* data_create */
   nullptr, /* data_create */
   nullptr, /* data_destroy */
   nullptr, /* data_destroy */
   nullptr, /* preprocess_text */
   nullptr, /* preprocess_text */

+ 298 - 370
thirdparty/harfbuzz/src/hb-ot-shape-complex-use-machine.hh

@@ -32,367 +32,326 @@
 #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
 #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
 
 
 #include "hb.hh"
 #include "hb.hh"
+#include "hb-ot-shape-complex-machine-index.hh"
 
 
 
 
-#line 38 "hb-ot-shape-complex-use-machine.hh"
+#line 39 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-	12u, 48u, 1u, 15u, 1u, 1u, 12u, 48u, 1u, 1u, 0u, 48u, 21u, 21u, 11u, 48u, 
-	11u, 48u, 1u, 15u, 1u, 1u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 
-	26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, 
-	23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u, 
-	1u, 48u, 11u, 48u, 13u, 21u, 4u, 4u, 13u, 13u, 11u, 48u, 11u, 48u, 41u, 42u, 
-	42u, 42u, 11u, 48u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 
-	45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 24u, 48u, 23u, 48u, 23u, 48u, 
-	23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u, 1u, 48u, 1u, 15u, 
-	4u, 4u, 13u, 21u, 13u, 13u, 12u, 48u, 1u, 48u, 11u, 48u, 41u, 42u, 42u, 42u, 
-	21u, 42u, 1u, 5u, 0
+	1u, 1u, 1u, 1u, 0u, 51u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u, 23u, 48u, 
+	24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 
+	1u, 1u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 
+	11u, 48u, 1u, 48u, 13u, 13u, 4u, 4u, 11u, 48u, 41u, 42u, 42u, 42u, 11u, 48u, 
+	22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 
+	24u, 48u, 24u, 48u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 
+	22u, 48u, 11u, 48u, 1u, 48u, 1u, 1u, 4u, 4u, 13u, 13u, 1u, 48u, 11u, 48u, 
+	41u, 42u, 42u, 42u, 1u, 5u, 50u, 52u, 49u, 52u, 49u, 51u, 0
 };
 };
 
 
 static const char _use_syllable_machine_key_spans[] = {
 static const char _use_syllable_machine_key_spans[] = {
-	37, 15, 1, 37, 1, 49, 1, 38, 
-	38, 15, 1, 38, 27, 26, 24, 23, 
-	22, 2, 1, 25, 25, 25, 1, 25, 
-	26, 26, 26, 27, 27, 27, 27, 38, 
-	48, 38, 9, 1, 1, 38, 38, 2, 
-	1, 38, 38, 27, 26, 24, 23, 22, 
-	2, 1, 25, 25, 25, 25, 26, 26, 
-	26, 27, 27, 27, 27, 38, 48, 15, 
-	1, 9, 1, 37, 48, 38, 2, 1, 
-	22, 5
+	1, 1, 52, 38, 38, 1, 27, 26, 
+	24, 23, 22, 2, 1, 25, 25, 25, 
+	1, 25, 26, 26, 26, 27, 27, 27, 
+	38, 48, 1, 1, 38, 2, 1, 38, 
+	27, 26, 24, 23, 22, 2, 1, 25, 
+	25, 25, 25, 26, 26, 26, 27, 27, 
+	27, 38, 48, 1, 1, 1, 48, 38, 
+	2, 1, 5, 3, 4, 3
 };
 };
 
 
 static const short _use_syllable_machine_index_offsets[] = {
 static const short _use_syllable_machine_index_offsets[] = {
-	0, 38, 54, 56, 94, 96, 146, 148, 
-	187, 226, 242, 244, 283, 311, 338, 363, 
-	387, 410, 413, 415, 441, 467, 493, 495, 
-	521, 548, 575, 602, 630, 658, 686, 714, 
-	753, 802, 841, 851, 853, 855, 894, 933, 
-	936, 938, 977, 1016, 1044, 1071, 1096, 1120, 
-	1143, 1146, 1148, 1174, 1200, 1226, 1252, 1279, 
-	1306, 1333, 1361, 1389, 1417, 1445, 1484, 1533, 
-	1549, 1551, 1561, 1563, 1601, 1650, 1689, 1692, 
-	1694, 1717
+	0, 2, 4, 57, 96, 135, 137, 165, 
+	192, 217, 241, 264, 267, 269, 295, 321, 
+	347, 349, 375, 402, 429, 456, 484, 512, 
+	540, 579, 628, 630, 632, 671, 674, 676, 
+	715, 743, 770, 795, 819, 842, 845, 847, 
+	873, 899, 925, 951, 978, 1005, 1032, 1060, 
+	1088, 1116, 1155, 1204, 1206, 1208, 1210, 1259, 
+	1298, 1301, 1303, 1309, 1313, 1318
 };
 };
 
 
 static const char _use_syllable_machine_indicies[] = {
 static const char _use_syllable_machine_indicies[] = {
-	1, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	1, 0, 0, 0, 1, 0, 3, 2, 
-	2, 2, 2, 2, 2, 2, 2, 2, 
-	2, 2, 2, 2, 4, 2, 3, 2, 
-	6, 5, 5, 5, 5, 5, 5, 5, 
-	5, 5, 5, 5, 5, 5, 5, 5, 
-	5, 5, 5, 5, 5, 5, 5, 5, 
-	5, 5, 5, 5, 5, 5, 5, 5, 
-	6, 5, 5, 5, 6, 5, 7, 5, 
-	8, 9, 10, 8, 11, 12, 10, 10, 
-	10, 10, 10, 3, 13, 14, 10, 15, 
-	8, 8, 16, 17, 10, 10, 18, 19, 
-	20, 21, 22, 23, 24, 18, 25, 26, 
-	27, 28, 29, 30, 10, 31, 32, 33, 
-	10, 34, 35, 36, 37, 38, 39, 40, 
-	13, 10, 42, 41, 44, 1, 43, 43, 
-	45, 43, 43, 43, 43, 43, 46, 47, 
-	48, 49, 50, 51, 52, 53, 47, 54, 
-	46, 55, 56, 57, 58, 43, 59, 60, 
-	61, 43, 43, 43, 43, 62, 63, 64, 
-	65, 1, 43, 44, 1, 43, 43, 45, 
-	43, 43, 43, 43, 43, 66, 47, 48, 
-	49, 50, 51, 52, 53, 47, 54, 55, 
-	55, 56, 57, 58, 43, 59, 60, 61, 
-	43, 43, 43, 43, 62, 63, 64, 65, 
-	1, 43, 44, 67, 67, 67, 67, 67, 
-	67, 67, 67, 67, 67, 67, 67, 67, 
-	68, 67, 44, 67, 44, 1, 43, 43, 
-	45, 43, 43, 43, 43, 43, 43, 47, 
-	48, 49, 50, 51, 52, 53, 47, 54, 
-	55, 55, 56, 57, 58, 43, 59, 60, 
-	61, 43, 43, 43, 43, 62, 63, 64, 
-	65, 1, 43, 47, 48, 49, 50, 51, 
-	43, 43, 43, 43, 43, 43, 56, 57, 
-	58, 43, 59, 60, 61, 43, 43, 43, 
-	43, 48, 63, 64, 65, 69, 43, 48, 
-	49, 50, 51, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 59, 60, 61, 
-	43, 43, 43, 43, 43, 63, 64, 65, 
-	69, 43, 49, 50, 51, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 63, 
-	64, 65, 43, 50, 51, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 63, 
-	64, 65, 43, 51, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 63, 64, 
-	65, 43, 63, 64, 43, 64, 43, 49, 
-	50, 51, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 59, 60, 61, 43, 
-	43, 43, 43, 43, 63, 64, 65, 69, 
-	43, 49, 50, 51, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 60, 
-	61, 43, 43, 43, 43, 43, 63, 64, 
-	65, 69, 43, 49, 50, 51, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 61, 43, 43, 43, 43, 43, 
-	63, 64, 65, 69, 43, 71, 70, 49, 
-	50, 51, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 63, 64, 65, 69, 
-	43, 48, 49, 50, 51, 43, 43, 43, 
-	43, 43, 43, 56, 57, 58, 43, 59, 
-	60, 61, 43, 43, 43, 43, 48, 63, 
-	64, 65, 69, 43, 48, 49, 50, 51, 
-	43, 43, 43, 43, 43, 43, 43, 57, 
-	58, 43, 59, 60, 61, 43, 43, 43, 
-	43, 48, 63, 64, 65, 69, 43, 48, 
-	49, 50, 51, 43, 43, 43, 43, 43, 
-	43, 43, 43, 58, 43, 59, 60, 61, 
-	43, 43, 43, 43, 48, 63, 64, 65, 
-	69, 43, 47, 48, 49, 50, 51, 43, 
-	53, 47, 43, 43, 43, 56, 57, 58, 
-	43, 59, 60, 61, 43, 43, 43, 43, 
-	48, 63, 64, 65, 69, 43, 47, 48, 
-	49, 50, 51, 43, 72, 47, 43, 43, 
-	43, 56, 57, 58, 43, 59, 60, 61, 
-	43, 43, 43, 43, 48, 63, 64, 65, 
-	69, 43, 47, 48, 49, 50, 51, 43, 
-	43, 47, 43, 43, 43, 56, 57, 58, 
-	43, 59, 60, 61, 43, 43, 43, 43, 
-	48, 63, 64, 65, 69, 43, 47, 48, 
-	49, 50, 51, 52, 53, 47, 43, 43, 
-	43, 56, 57, 58, 43, 59, 60, 61, 
-	43, 43, 43, 43, 48, 63, 64, 65, 
-	69, 43, 44, 1, 43, 43, 45, 43, 
-	43, 43, 43, 43, 43, 47, 48, 49, 
-	50, 51, 52, 53, 47, 54, 43, 55, 
-	56, 57, 58, 43, 59, 60, 61, 43, 
-	43, 43, 43, 62, 63, 64, 65, 1, 
-	43, 44, 67, 67, 67, 67, 67, 67, 
-	67, 67, 67, 67, 67, 67, 67, 68, 
-	67, 67, 67, 67, 67, 67, 67, 48, 
-	49, 50, 51, 67, 67, 67, 67, 67, 
-	67, 67, 67, 67, 67, 59, 60, 61, 
-	67, 67, 67, 67, 67, 63, 64, 65, 
-	69, 67, 44, 1, 43, 43, 45, 43, 
-	43, 43, 43, 43, 43, 47, 48, 49, 
-	50, 51, 52, 53, 47, 54, 46, 55, 
-	56, 57, 58, 43, 59, 60, 61, 43, 
-	43, 43, 43, 62, 63, 64, 65, 1, 
-	43, 74, 73, 73, 73, 73, 73, 73, 
-	73, 75, 73, 11, 76, 74, 73, 44, 
-	1, 43, 43, 45, 43, 43, 43, 43, 
-	43, 77, 47, 48, 49, 50, 51, 52, 
-	53, 47, 54, 46, 55, 56, 57, 58, 
-	43, 59, 60, 61, 43, 78, 79, 43, 
-	62, 63, 64, 65, 1, 43, 44, 1, 
-	43, 43, 45, 43, 43, 43, 43, 43, 
-	43, 47, 48, 49, 50, 51, 52, 53, 
-	47, 54, 46, 55, 56, 57, 58, 43, 
-	59, 60, 61, 43, 78, 79, 43, 62, 
-	63, 64, 65, 1, 43, 78, 79, 80, 
-	79, 80, 3, 6, 81, 81, 82, 81, 
-	81, 81, 81, 81, 83, 18, 19, 20, 
-	21, 22, 23, 24, 18, 25, 27, 27, 
-	28, 29, 30, 81, 31, 32, 33, 81, 
-	81, 81, 81, 37, 38, 39, 40, 6, 
-	81, 3, 6, 81, 81, 82, 81, 81, 
-	81, 81, 81, 81, 18, 19, 20, 21, 
-	22, 23, 24, 18, 25, 27, 27, 28, 
-	29, 30, 81, 31, 32, 33, 81, 81, 
-	81, 81, 37, 38, 39, 40, 6, 81, 
-	18, 19, 20, 21, 22, 81, 81, 81, 
-	81, 81, 81, 28, 29, 30, 81, 31, 
-	32, 33, 81, 81, 81, 81, 19, 38, 
-	39, 40, 84, 81, 19, 20, 21, 22, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 31, 32, 33, 81, 81, 81, 
-	81, 81, 38, 39, 40, 84, 81, 20, 
-	21, 22, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 38, 39, 40, 81, 
-	21, 22, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 38, 39, 40, 81, 
-	22, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 38, 39, 40, 81, 38, 
-	39, 81, 39, 81, 20, 21, 22, 81, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	81, 31, 32, 33, 81, 81, 81, 81, 
-	81, 38, 39, 40, 84, 81, 20, 21, 
-	22, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 32, 33, 81, 81, 
-	81, 81, 81, 38, 39, 40, 84, 81, 
-	20, 21, 22, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 33, 
-	81, 81, 81, 81, 81, 38, 39, 40, 
-	84, 81, 20, 21, 22, 81, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 38, 
-	39, 40, 84, 81, 19, 20, 21, 22, 
-	81, 81, 81, 81, 81, 81, 28, 29, 
-	30, 81, 31, 32, 33, 81, 81, 81, 
-	81, 19, 38, 39, 40, 84, 81, 19, 
-	20, 21, 22, 81, 81, 81, 81, 81, 
-	81, 81, 29, 30, 81, 31, 32, 33, 
-	81, 81, 81, 81, 19, 38, 39, 40, 
-	84, 81, 19, 20, 21, 22, 81, 81, 
-	81, 81, 81, 81, 81, 81, 30, 81, 
-	31, 32, 33, 81, 81, 81, 81, 19, 
-	38, 39, 40, 84, 81, 18, 19, 20, 
-	21, 22, 81, 24, 18, 81, 81, 81, 
-	28, 29, 30, 81, 31, 32, 33, 81, 
-	81, 81, 81, 19, 38, 39, 40, 84, 
-	81, 18, 19, 20, 21, 22, 81, 85, 
-	18, 81, 81, 81, 28, 29, 30, 81, 
-	31, 32, 33, 81, 81, 81, 81, 19, 
-	38, 39, 40, 84, 81, 18, 19, 20, 
-	21, 22, 81, 81, 18, 81, 81, 81, 
-	28, 29, 30, 81, 31, 32, 33, 81, 
-	81, 81, 81, 19, 38, 39, 40, 84, 
-	81, 18, 19, 20, 21, 22, 23, 24, 
-	18, 81, 81, 81, 28, 29, 30, 81, 
-	31, 32, 33, 81, 81, 81, 81, 19, 
-	38, 39, 40, 84, 81, 3, 6, 81, 
-	81, 82, 81, 81, 81, 81, 81, 81, 
-	18, 19, 20, 21, 22, 23, 24, 18, 
-	25, 81, 27, 28, 29, 30, 81, 31, 
-	32, 33, 81, 81, 81, 81, 37, 38, 
-	39, 40, 6, 81, 3, 81, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	81, 81, 4, 81, 81, 81, 81, 81, 
-	81, 81, 19, 20, 21, 22, 81, 81, 
-	81, 81, 81, 81, 81, 81, 81, 81, 
-	31, 32, 33, 81, 81, 81, 81, 81, 
-	38, 39, 40, 84, 81, 3, 86, 86, 
-	86, 86, 86, 86, 86, 86, 86, 86, 
-	86, 86, 86, 4, 86, 87, 81, 14, 
-	81, 81, 81, 81, 81, 81, 81, 88, 
-	81, 14, 81, 6, 86, 86, 86, 86, 
-	86, 86, 86, 86, 86, 86, 86, 86, 
-	86, 86, 86, 86, 86, 86, 86, 86, 
-	86, 86, 86, 86, 86, 86, 86, 86, 
-	86, 86, 86, 6, 86, 86, 86, 6, 
-	86, 9, 81, 81, 81, 9, 81, 81, 
-	81, 81, 81, 3, 6, 14, 81, 82, 
-	81, 81, 81, 81, 81, 81, 18, 19, 
-	20, 21, 22, 23, 24, 18, 25, 26, 
-	27, 28, 29, 30, 81, 31, 32, 33, 
-	81, 34, 35, 81, 37, 38, 39, 40, 
-	6, 81, 3, 6, 81, 81, 82, 81, 
-	81, 81, 81, 81, 81, 18, 19, 20, 
-	21, 22, 23, 24, 18, 25, 26, 27, 
-	28, 29, 30, 81, 31, 32, 33, 81, 
-	81, 81, 81, 37, 38, 39, 40, 6, 
-	81, 34, 35, 81, 35, 81, 78, 80, 
-	80, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 78, 79, 80, 9, 86, 86, 
-	86, 9, 86, 0
+	1, 0, 2, 0, 3, 4, 5, 5, 
+	6, 7, 5, 5, 5, 5, 5, 1, 
+	8, 9, 5, 5, 5, 5, 10, 11, 
+	5, 5, 12, 13, 14, 15, 16, 17, 
+	18, 12, 19, 20, 21, 22, 23, 24, 
+	5, 25, 26, 27, 5, 28, 29, 30, 
+	31, 32, 33, 34, 8, 35, 5, 36, 
+	5, 38, 39, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 40, 41, 42, 43, 
+	44, 45, 46, 40, 47, 4, 48, 49, 
+	50, 51, 37, 52, 53, 54, 37, 37, 
+	37, 37, 55, 56, 57, 58, 39, 37, 
+	38, 39, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 40, 41, 42, 43, 44, 
+	45, 46, 40, 47, 48, 48, 49, 50, 
+	51, 37, 52, 53, 54, 37, 37, 37, 
+	37, 55, 56, 57, 58, 39, 37, 38, 
+	59, 40, 41, 42, 43, 44, 37, 37, 
+	37, 37, 37, 37, 49, 50, 51, 37, 
+	52, 53, 54, 37, 37, 37, 37, 41, 
+	56, 57, 58, 60, 37, 41, 42, 43, 
+	44, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 52, 53, 54, 37, 37, 
+	37, 37, 37, 56, 57, 58, 60, 37, 
+	42, 43, 44, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 56, 57, 58, 
+	37, 43, 44, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 56, 57, 58, 
+	37, 44, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 56, 57, 58, 37, 
+	56, 57, 37, 57, 37, 42, 43, 44, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 52, 53, 54, 37, 37, 37, 
+	37, 37, 56, 57, 58, 60, 37, 42, 
+	43, 44, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 53, 54, 37, 
+	37, 37, 37, 37, 56, 57, 58, 60, 
+	37, 42, 43, 44, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	54, 37, 37, 37, 37, 37, 56, 57, 
+	58, 60, 37, 62, 61, 42, 43, 44, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 56, 57, 58, 60, 37, 41, 
+	42, 43, 44, 37, 37, 37, 37, 37, 
+	37, 49, 50, 51, 37, 52, 53, 54, 
+	37, 37, 37, 37, 41, 56, 57, 58, 
+	60, 37, 41, 42, 43, 44, 37, 37, 
+	37, 37, 37, 37, 37, 50, 51, 37, 
+	52, 53, 54, 37, 37, 37, 37, 41, 
+	56, 57, 58, 60, 37, 41, 42, 43, 
+	44, 37, 37, 37, 37, 37, 37, 37, 
+	37, 51, 37, 52, 53, 54, 37, 37, 
+	37, 37, 41, 56, 57, 58, 60, 37, 
+	40, 41, 42, 43, 44, 37, 46, 40, 
+	37, 37, 37, 49, 50, 51, 37, 52, 
+	53, 54, 37, 37, 37, 37, 41, 56, 
+	57, 58, 60, 37, 40, 41, 42, 43, 
+	44, 37, 37, 40, 37, 37, 37, 49, 
+	50, 51, 37, 52, 53, 54, 37, 37, 
+	37, 37, 41, 56, 57, 58, 60, 37, 
+	40, 41, 42, 43, 44, 45, 46, 40, 
+	37, 37, 37, 49, 50, 51, 37, 52, 
+	53, 54, 37, 37, 37, 37, 41, 56, 
+	57, 58, 60, 37, 38, 39, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 40, 
+	41, 42, 43, 44, 45, 46, 40, 47, 
+	37, 48, 49, 50, 51, 37, 52, 53, 
+	54, 37, 37, 37, 37, 55, 56, 57, 
+	58, 39, 37, 38, 59, 59, 59, 59, 
+	59, 59, 59, 59, 59, 59, 59, 59, 
+	59, 59, 59, 59, 59, 59, 59, 59, 
+	59, 41, 42, 43, 44, 59, 59, 59, 
+	59, 59, 59, 59, 59, 59, 59, 52, 
+	53, 54, 59, 59, 59, 59, 59, 56, 
+	57, 58, 60, 59, 64, 63, 6, 65, 
+	38, 39, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 40, 41, 42, 43, 44, 
+	45, 46, 40, 47, 4, 48, 49, 50, 
+	51, 37, 52, 53, 54, 37, 11, 66, 
+	37, 55, 56, 57, 58, 39, 37, 11, 
+	66, 67, 66, 67, 1, 69, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 12, 
+	13, 14, 15, 16, 17, 18, 12, 19, 
+	21, 21, 22, 23, 24, 68, 25, 26, 
+	27, 68, 68, 68, 68, 31, 32, 33, 
+	34, 69, 68, 12, 13, 14, 15, 16, 
+	68, 68, 68, 68, 68, 68, 22, 23, 
+	24, 68, 25, 26, 27, 68, 68, 68, 
+	68, 13, 32, 33, 34, 70, 68, 13, 
+	14, 15, 16, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 25, 26, 27, 
+	68, 68, 68, 68, 68, 32, 33, 34, 
+	70, 68, 14, 15, 16, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 32, 
+	33, 34, 68, 15, 16, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 32, 
+	33, 34, 68, 16, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 32, 33, 
+	34, 68, 32, 33, 68, 33, 68, 14, 
+	15, 16, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 25, 26, 27, 68, 
+	68, 68, 68, 68, 32, 33, 34, 70, 
+	68, 14, 15, 16, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 26, 
+	27, 68, 68, 68, 68, 68, 32, 33, 
+	34, 70, 68, 14, 15, 16, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 27, 68, 68, 68, 68, 68, 
+	32, 33, 34, 70, 68, 14, 15, 16, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 32, 33, 34, 70, 68, 13, 
+	14, 15, 16, 68, 68, 68, 68, 68, 
+	68, 22, 23, 24, 68, 25, 26, 27, 
+	68, 68, 68, 68, 13, 32, 33, 34, 
+	70, 68, 13, 14, 15, 16, 68, 68, 
+	68, 68, 68, 68, 68, 23, 24, 68, 
+	25, 26, 27, 68, 68, 68, 68, 13, 
+	32, 33, 34, 70, 68, 13, 14, 15, 
+	16, 68, 68, 68, 68, 68, 68, 68, 
+	68, 24, 68, 25, 26, 27, 68, 68, 
+	68, 68, 13, 32, 33, 34, 70, 68, 
+	12, 13, 14, 15, 16, 68, 18, 12, 
+	68, 68, 68, 22, 23, 24, 68, 25, 
+	26, 27, 68, 68, 68, 68, 13, 32, 
+	33, 34, 70, 68, 12, 13, 14, 15, 
+	16, 68, 68, 12, 68, 68, 68, 22, 
+	23, 24, 68, 25, 26, 27, 68, 68, 
+	68, 68, 13, 32, 33, 34, 70, 68, 
+	12, 13, 14, 15, 16, 17, 18, 12, 
+	68, 68, 68, 22, 23, 24, 68, 25, 
+	26, 27, 68, 68, 68, 68, 13, 32, 
+	33, 34, 70, 68, 1, 69, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 12, 
+	13, 14, 15, 16, 17, 18, 12, 19, 
+	68, 21, 22, 23, 24, 68, 25, 26, 
+	27, 68, 68, 68, 68, 31, 32, 33, 
+	34, 69, 68, 1, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 13, 14, 15, 16, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 25, 
+	26, 27, 68, 68, 68, 68, 68, 32, 
+	33, 34, 70, 68, 1, 71, 72, 68, 
+	9, 68, 4, 68, 68, 68, 4, 68, 
+	68, 68, 68, 68, 1, 69, 9, 68, 
+	68, 68, 68, 68, 68, 68, 68, 12, 
+	13, 14, 15, 16, 17, 18, 12, 19, 
+	20, 21, 22, 23, 24, 68, 25, 26, 
+	27, 68, 28, 29, 68, 31, 32, 33, 
+	34, 69, 68, 1, 69, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 12, 13, 
+	14, 15, 16, 17, 18, 12, 19, 20, 
+	21, 22, 23, 24, 68, 25, 26, 27, 
+	68, 68, 68, 68, 31, 32, 33, 34, 
+	69, 68, 28, 29, 68, 29, 68, 4, 
+	71, 71, 71, 4, 71, 74, 73, 35, 
+	73, 35, 74, 73, 74, 73, 35, 73, 
+	36, 73, 0
 };
 };
 
 
 static const char _use_syllable_machine_trans_targs[] = {
 static const char _use_syllable_machine_trans_targs[] = {
-	5, 9, 5, 41, 2, 5, 1, 53, 
-	6, 7, 5, 34, 37, 63, 64, 67, 
-	68, 72, 43, 44, 45, 46, 47, 57, 
-	58, 60, 69, 61, 54, 55, 56, 50, 
-	51, 52, 70, 71, 73, 62, 48, 49, 
-	5, 5, 5, 5, 8, 0, 33, 12, 
-	13, 14, 15, 16, 27, 28, 30, 31, 
-	24, 25, 26, 19, 20, 21, 32, 17, 
-	18, 5, 11, 5, 10, 22, 5, 23, 
-	29, 5, 35, 36, 5, 38, 39, 40, 
-	5, 5, 3, 42, 4, 59, 5, 65, 
-	66
+	2, 31, 42, 2, 3, 2, 26, 28, 
+	51, 52, 54, 29, 32, 33, 34, 35, 
+	36, 46, 47, 48, 55, 49, 43, 44, 
+	45, 39, 40, 41, 56, 57, 58, 50, 
+	37, 38, 2, 59, 61, 2, 4, 5, 
+	6, 7, 8, 9, 10, 21, 22, 23, 
+	24, 18, 19, 20, 13, 14, 15, 25, 
+	11, 12, 2, 2, 16, 2, 17, 2, 
+	27, 2, 30, 2, 2, 0, 1, 2, 
+	53, 2, 60
 };
 };
 
 
 static const char _use_syllable_machine_trans_actions[] = {
 static const char _use_syllable_machine_trans_actions[] = {
-	1, 0, 2, 3, 0, 4, 0, 5, 
-	0, 5, 8, 0, 5, 9, 0, 9, 
-	3, 0, 5, 5, 0, 0, 0, 5, 
-	5, 5, 3, 3, 5, 5, 5, 5, 
-	5, 5, 0, 0, 0, 3, 0, 0, 
-	10, 11, 12, 13, 5, 0, 5, 0, 
-	0, 0, 0, 0, 0, 0, 0, 5, 
+	1, 2, 2, 5, 0, 6, 0, 0, 
+	0, 0, 2, 0, 2, 2, 0, 0, 
+	0, 2, 2, 2, 2, 2, 2, 2, 
+	2, 2, 2, 2, 0, 0, 0, 2, 
+	0, 0, 7, 0, 0, 8, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 14, 5, 15, 0, 0, 16, 0, 
-	0, 17, 0, 0, 18, 5, 0, 0, 
-	19, 20, 0, 3, 0, 5, 21, 0, 
-	0
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 9, 10, 0, 11, 0, 12, 
+	0, 13, 0, 14, 15, 0, 0, 16, 
+	0, 17, 0
 };
 };
 
 
 static const char _use_syllable_machine_to_state_actions[] = {
 static const char _use_syllable_machine_to_state_actions[] = {
-	0, 0, 0, 0, 0, 6, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 3, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0
+	0, 0, 0, 0, 0, 0
 };
 };
 
 
 static const char _use_syllable_machine_from_state_actions[] = {
 static const char _use_syllable_machine_from_state_actions[] = {
-	0, 0, 0, 0, 0, 7, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 4, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0
+	0, 0, 0, 0, 0, 0
 };
 };
 
 
 static const short _use_syllable_machine_eof_trans[] = {
 static const short _use_syllable_machine_eof_trans[] = {
-	1, 3, 3, 6, 6, 0, 42, 44, 
-	44, 68, 68, 44, 44, 44, 44, 44, 
-	44, 44, 44, 44, 44, 44, 71, 44, 
-	44, 44, 44, 44, 44, 44, 44, 44, 
-	68, 44, 74, 77, 74, 44, 44, 81, 
-	81, 82, 82, 82, 82, 82, 82, 82, 
-	82, 82, 82, 82, 82, 82, 82, 82, 
-	82, 82, 82, 82, 82, 82, 82, 87, 
-	82, 82, 82, 87, 82, 82, 82, 82, 
-	81, 87
+	1, 1, 0, 38, 38, 60, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	62, 38, 38, 38, 38, 38, 38, 38, 
+	38, 60, 64, 66, 38, 68, 68, 69, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 72, 69, 69, 69, 69, 
+	69, 69, 72, 74, 74, 74
 };
 };
 
 
-static const int use_syllable_machine_start = 5;
-static const int use_syllable_machine_first_final = 5;
+static const int use_syllable_machine_start = 2;
+static const int use_syllable_machine_first_final = 2;
 static const int use_syllable_machine_error = -1;
 static const int use_syllable_machine_error = -1;
 
 
-static const int use_syllable_machine_en_main = 5;
+static const int use_syllable_machine_en_main = 2;
 
 
 
 
-#line 38 "hb-ot-shape-complex-use-machine.rl"
+#line 39 "hb-ot-shape-complex-use-machine.rl"
 
 
 
 
 
 
-#line 162 "hb-ot-shape-complex-use-machine.rl"
+#line 154 "hb-ot-shape-complex-use-machine.rl"
 
 
 
 
 #define found_syllable(syllable_type) \
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
   HB_STMT_START { \
-    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
-    for (unsigned int i = ts; i < te; i++) \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
+    for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
       info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
       info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
     syllable_serial++; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
   } HB_STMT_END
 
 
+static bool
+not_standard_default_ignorable (const hb_glyph_info_t &i)
+{ return !(i.use_category() == USE_O && _hb_glyph_info_is_default_ignorable (&i)); }
+
 static void
 static void
 find_syllables_use (hb_buffer_t *buffer)
 find_syllables_use (hb_buffer_t *buffer)
 {
 {
-  unsigned int p, pe, eof, ts, te, act;
-  int cs;
   hb_glyph_info_t *info = buffer->info;
   hb_glyph_info_t *info = buffer->info;
+  auto p =
+    + hb_iter (info, buffer->len)
+    | hb_enumerate
+    | hb_filter ([] (const hb_glyph_info_t &i) { return not_standard_default_ignorable (i); },
+		 hb_second)
+    | hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
+		 {
+		   if (p.second.use_category() == USE_ZWNJ)
+		     for (unsigned i = p.first + 1; i < buffer->len; ++i)
+		       if (not_standard_default_ignorable (info[i]))
+			 return !_hb_glyph_info_is_unicode_mark (&info[i]);
+		   return true;
+		 })
+    | hb_enumerate
+    | machine_index
+    ;
+  auto pe = p + p.len ();
+  auto eof = +pe;
+  auto ts = +p;
+  auto te = +p;
+  unsigned int act HB_UNUSED;
+  int cs;
   
   
-#line 396 "hb-ot-shape-complex-use-machine.hh"
+#line 355 "hb-ot-shape-complex-use-machine.hh"
 	{
 	{
 	cs = use_syllable_machine_start;
 	cs = use_syllable_machine_start;
 	ts = 0;
 	ts = 0;
@@ -400,15 +359,12 @@ find_syllables_use (hb_buffer_t *buffer)
 	act = 0;
 	act = 0;
 	}
 	}
 
 
-#line 182 "hb-ot-shape-complex-use-machine.rl"
-
+#line 198 "hb-ot-shape-complex-use-machine.rl"
 
 
-  p = 0;
-  pe = eof = buffer->len;
 
 
   unsigned int syllable_serial = 1;
   unsigned int syllable_serial = 1;
   
   
-#line 412 "hb-ot-shape-complex-use-machine.hh"
+#line 368 "hb-ot-shape-complex-use-machine.hh"
 	{
 	{
 	int _slen;
 	int _slen;
 	int _trans;
 	int _trans;
@@ -418,20 +374,20 @@ find_syllables_use (hb_buffer_t *buffer)
 		goto _test_eof;
 		goto _test_eof;
 _resume:
 _resume:
 	switch ( _use_syllable_machine_from_state_actions[cs] ) {
 	switch ( _use_syllable_machine_from_state_actions[cs] ) {
-	case 7:
+	case 4:
 #line 1 "NONE"
 #line 1 "NONE"
 	{ts = p;}
 	{ts = p;}
 	break;
 	break;
-#line 426 "hb-ot-shape-complex-use-machine.hh"
+#line 382 "hb-ot-shape-complex-use-machine.hh"
 	}
 	}
 
 
 	_keys = _use_syllable_machine_trans_keys + (cs<<1);
 	_keys = _use_syllable_machine_trans_keys + (cs<<1);
 	_inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs];
 	_inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs];
 
 
 	_slen = _use_syllable_machine_key_spans[cs];
 	_slen = _use_syllable_machine_key_spans[cs];
-	_trans = _inds[ _slen > 0 && _keys[0] <=( info[p].use_category()) &&
-		( info[p].use_category()) <= _keys[1] ?
-		( info[p].use_category()) - _keys[0] : _slen ];
+	_trans = _inds[ _slen > 0 && _keys[0] <=( (*p).second.second.use_category()) &&
+		( (*p).second.second.use_category()) <= _keys[1] ?
+		( (*p).second.second.use_category()) - _keys[0] : _slen ];
 
 
 _eof_trans:
 _eof_trans:
 	cs = _use_syllable_machine_trans_targs[_trans];
 	cs = _use_syllable_machine_trans_targs[_trans];
@@ -440,104 +396,76 @@ _eof_trans:
 		goto _again;
 		goto _again;
 
 
 	switch ( _use_syllable_machine_trans_actions[_trans] ) {
 	switch ( _use_syllable_machine_trans_actions[_trans] ) {
-	case 5:
+	case 2:
 #line 1 "NONE"
 #line 1 "NONE"
 	{te = p+1;}
 	{te = p+1;}
 	break;
 	break;
-	case 12:
-#line 150 "hb-ot-shape-complex-use-machine.rl"
+	case 5:
+#line 141 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (independent_cluster); }}
 	{te = p+1;{ found_syllable (independent_cluster); }}
 	break;
 	break;
-	case 14:
-#line 153 "hb-ot-shape-complex-use-machine.rl"
+	case 9:
+#line 144 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (standard_cluster); }}
 	{te = p+1;{ found_syllable (standard_cluster); }}
 	break;
 	break;
-	case 10:
-#line 157 "hb-ot-shape-complex-use-machine.rl"
+	case 7:
+#line 149 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (broken_cluster); }}
 	{te = p+1;{ found_syllable (broken_cluster); }}
 	break;
 	break;
-	case 8:
-#line 158 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (non_cluster); }}
-	break;
-	case 11:
+	case 6:
 #line 150 "hb-ot-shape-complex-use-machine.rl"
 #line 150 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (independent_cluster); }}
+	{te = p+1;{ found_syllable (non_cluster); }}
 	break;
 	break;
-	case 15:
-#line 151 "hb-ot-shape-complex-use-machine.rl"
+	case 10:
+#line 142 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
 	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
 	break;
 	break;
-	case 16:
-#line 152 "hb-ot-shape-complex-use-machine.rl"
+	case 11:
+#line 143 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (sakot_terminated_cluster); }}
 	{te = p;p--;{ found_syllable (sakot_terminated_cluster); }}
 	break;
 	break;
-	case 13:
-#line 153 "hb-ot-shape-complex-use-machine.rl"
+	case 8:
+#line 144 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (standard_cluster); }}
 	{te = p;p--;{ found_syllable (standard_cluster); }}
 	break;
 	break;
-	case 18:
-#line 154 "hb-ot-shape-complex-use-machine.rl"
+	case 13:
+#line 145 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
 	{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
 	break;
 	break;
-	case 17:
-#line 155 "hb-ot-shape-complex-use-machine.rl"
+	case 12:
+#line 146 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (numeral_cluster); }}
 	{te = p;p--;{ found_syllable (numeral_cluster); }}
 	break;
 	break;
-	case 19:
-#line 156 "hb-ot-shape-complex-use-machine.rl"
+	case 14:
+#line 147 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (symbol_cluster); }}
 	{te = p;p--;{ found_syllable (symbol_cluster); }}
 	break;
 	break;
-	case 20:
-#line 157 "hb-ot-shape-complex-use-machine.rl"
+	case 17:
+#line 148 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (hieroglyph_cluster); }}
+	break;
+	case 15:
+#line 149 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
 	break;
-	case 21:
-#line 158 "hb-ot-shape-complex-use-machine.rl"
+	case 16:
+#line 150 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (non_cluster); }}
 	{te = p;p--;{ found_syllable (non_cluster); }}
 	break;
 	break;
 	case 1:
 	case 1:
-#line 153 "hb-ot-shape-complex-use-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (standard_cluster); }}
-	break;
-	case 4:
-#line 157 "hb-ot-shape-complex-use-machine.rl"
+#line 149 "hb-ot-shape-complex-use-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	break;
 	break;
-	case 2:
-#line 1 "NONE"
-	{	switch( act ) {
-	case 8:
-	{{p = ((te))-1;} found_syllable (broken_cluster); }
-	break;
-	case 9:
-	{{p = ((te))-1;} found_syllable (non_cluster); }
-	break;
-	}
-	}
-	break;
-	case 3:
-#line 1 "NONE"
-	{te = p+1;}
-#line 157 "hb-ot-shape-complex-use-machine.rl"
-	{act = 8;}
-	break;
-	case 9:
-#line 1 "NONE"
-	{te = p+1;}
-#line 158 "hb-ot-shape-complex-use-machine.rl"
-	{act = 9;}
-	break;
-#line 532 "hb-ot-shape-complex-use-machine.hh"
+#line 460 "hb-ot-shape-complex-use-machine.hh"
 	}
 	}
 
 
 _again:
 _again:
 	switch ( _use_syllable_machine_to_state_actions[cs] ) {
 	switch ( _use_syllable_machine_to_state_actions[cs] ) {
-	case 6:
+	case 3:
 #line 1 "NONE"
 #line 1 "NONE"
 	{ts = 0;}
 	{ts = 0;}
 	break;
 	break;
-#line 541 "hb-ot-shape-complex-use-machine.hh"
+#line 469 "hb-ot-shape-complex-use-machine.hh"
 	}
 	}
 
 
 	if ( ++p != pe )
 	if ( ++p != pe )
@@ -553,7 +481,7 @@ _again:
 
 
 	}
 	}
 
 
-#line 190 "hb-ot-shape-complex-use-machine.rl"
+#line 203 "hb-ot-shape-complex-use-machine.rl"
 
 
 }
 }
 
 

+ 422 - 93
thirdparty/harfbuzz/src/hb-ot-shape-complex-use-table.cc

@@ -2,7 +2,7 @@
 /*
 /*
  * The following table is generated by running:
  * The following table is generated by running:
  *
  *
- *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
+ *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt ArabicShaping.txt Blocks.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
  *
  *
  * on files with these headers:
  * on files with these headers:
  *
  *
@@ -10,8 +10,24 @@
  * # Date: 2019-07-22, 19:55:00 GMT [KW, RP]
  * # Date: 2019-07-22, 19:55:00 GMT [KW, RP]
  * # IndicPositionalCategory-13.0.0.txt
  * # IndicPositionalCategory-13.0.0.txt
  * # Date: 2019-07-23, 00:01:00 GMT [KW, RP]
  * # Date: 2019-07-23, 00:01:00 GMT [KW, RP]
+ * # ArabicShaping-13.0.0.txt
+ * # Date: 2020-01-31, 23:55:00 GMT [KW, RP]
  * # Blocks-13.0.0.txt
  * # Blocks-13.0.0.txt
  * # Date: 2019-07-10, 19:06:00 GMT [KW]
  * # Date: 2019-07-10, 19:06:00 GMT [KW]
+ * # Override values For Indic_Syllabic_Category
+ * # Not derivable
+ * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
+ * # Updated  for Unicode 10.0 by Andrew Glass 2017-07-25
+ * # Updated  for Unicode 12.1 by Andrew Glass 2019-05-24
+ * # Updated  for Unicode 13.0 by Andrew Glass 2020-07-28
+ * # Override values For Indic_Positional_Category
+ * # Not derivable
+ * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
+ * # Updated  for Unicode 10.0 by Andrew Glass 2017-07-25
+ * # Ammended for Unicode 10.0 by Andrew Glass 2018-09-21
+ * # Updated  for L2/19-083    by Andrew Glass 2019-05-06
+ * # Updated  for Unicode 12.1 by Andrew Glass 2019-05-30
+ * # Updated  for Unicode 13.0 by Andrew Glass 2020-07-28
  * UnicodeData.txt does not have a header.
  * UnicodeData.txt does not have a header.
  */
  */
 
 
@@ -24,23 +40,21 @@
 #pragma GCC diagnostic push
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wunused-macros"
 #pragma GCC diagnostic ignored "-Wunused-macros"
 #define B	USE_B	/* BASE */
 #define B	USE_B	/* BASE */
-#define CGJ	USE_CGJ	/* CGJ */
 #define CS	USE_CS	/* CONS_WITH_STACKER */
 #define CS	USE_CS	/* CONS_WITH_STACKER */
+#define G	USE_G	/* HIEROGLYPH */
 #define GB	USE_GB	/* BASE_OTHER */
 #define GB	USE_GB	/* BASE_OTHER */
 #define H	USE_H	/* HALANT */
 #define H	USE_H	/* HALANT */
 #define HN	USE_HN	/* HALANT_NUM */
 #define HN	USE_HN	/* HALANT_NUM */
 #define HVM	USE_HVM	/* HALANT_OR_VOWEL_MODIFIER */
 #define HVM	USE_HVM	/* HALANT_OR_VOWEL_MODIFIER */
-#define IND	USE_IND	/* BASE_IND */
+#define J	USE_J	/* HIEROGLYPH_JOINER */
 #define N	USE_N	/* BASE_NUM */
 #define N	USE_N	/* BASE_NUM */
 #define O	USE_O	/* OTHER */
 #define O	USE_O	/* OTHER */
 #define R	USE_R	/* REPHA */
 #define R	USE_R	/* REPHA */
-#define Rsv	USE_Rsv	/* Reserved */
 #define S	USE_S	/* SYM */
 #define S	USE_S	/* SYM */
+#define SB	USE_SB	/* HIEROGLYPH_SEGMENT_BEGIN */
+#define SE	USE_SE	/* HIEROGLYPH_SEGMENT_END */
 #define SUB	USE_SUB	/* CONS_SUB */
 #define SUB	USE_SUB	/* CONS_SUB */
 #define Sk	USE_Sk	/* SAKOT */
 #define Sk	USE_Sk	/* SAKOT */
-#define VS	USE_VS	/* VARIATION_SELECTOR */
-#define WJ	USE_WJ	/* Word_Joiner */
-#define ZWJ	USE_ZWJ	/* ZWJ */
 #define ZWNJ	USE_ZWNJ	/* ZWNJ */
 #define ZWNJ	USE_ZWNJ	/* ZWNJ */
 #define CMAbv	USE_CMAbv
 #define CMAbv	USE_CMAbv
 #define CMBlw	USE_CMBlw
 #define CMBlw	USE_CMBlw
@@ -86,13 +100,31 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
   /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
 
 
-#define use_offset_0x0348u 80
+#define use_offset_0x0640u 80
 
 
 
 
-  /* Combining Diacritical Marks */
-                                                                         O,     O,     O,     O,     O,     O,     O,   CGJ,
+  /* Arabic */
 
 
-#define use_offset_0x0900u 88
+  /* 0640 */     B,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x07c8u 88
+
+
+  /* NKo */
+                                                                         O,     O,     B,     B,     B,     B,     B,     B,
+  /* 07D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 07E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* 07F0 */ VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,     B,     O,     O, VMAbv,     O,     O,
+
+#define use_offset_0x0840u 144
+
+
+  /* Mandaic */
+
+  /* 0840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0850 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw, CMBlw, CMBlw,     O,     O,     O,     O,
+
+#define use_offset_0x0900u 176
 
 
 
 
   /* Devanagari */
   /* Devanagari */
@@ -112,7 +144,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
   /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
-  /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPst,  VPst,     H,   IND,     O,
+  /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
   /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
   /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
   /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O, FMAbv,     O,
   /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O, FMAbv,     O,
@@ -145,18 +177,18 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
   /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
-  /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPst,     O,     O,  VPst,  VPst,     H,     O,     O,
+  /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
   /* 0B50 */     O,     O,     O,     O,     O,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
   /* 0B50 */     O,     O,     O,     O,     O,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
   /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
 
   /* Tamil */
   /* Tamil */
 
 
-  /* 0B80 */     O,     O, VMAbv,   IND,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
+  /* 0B80 */     O,     O, VMAbv,     O,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
   /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
   /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
   /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
   /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
   /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
   /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
-  /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPst,  VPst,  VPst,     H,     O,     O,
+  /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     O,     O,
   /* 0BD0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 0BD0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 0BE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0BE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0BF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 0BF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -189,10 +221,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 0D10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,     B,  VPst,  VPst,
   /* 0D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,     B,  VPst,  VPst,
-  /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPst,  VPst,  VPst,     H,     R,     O,
-  /* 0D50 */     O,     O,     O,     O,   IND,   IND,   IND,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
+  /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     R,     O,
+  /* 0D50 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
   /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,   IND,   IND,   IND,   IND,   IND,   IND,
+  /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
 
   /* Sinhala */
   /* Sinhala */
 
 
@@ -201,28 +233,30 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
   /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
   /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
   /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
-  /* 0DD0 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,     O,  VBlw,     O,  VPst,  VPre,  VPst,  VPre,  VPst,  VPst,  VPst,  VPst,
+  /* 0DD0 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,     O,  VBlw,     O,  VPst,  VPre,  VPre,  VPre,  VPre,  VPre,  VPre,  VPst,
   /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
   /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
 
 
-#define use_offset_0x0f18u 1360
+#define use_offset_0x0f00u 1448
 
 
 
 
   /* Tibetan */
   /* Tibetan */
-                                                                      VBlw,  VBlw,     O,     O,     O,     O,     O,     O,
+
+  /* 0F00 */     B,     B,     O,     O,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 0F10 */     O,     O,     O,     O,     O,     O,     O,     O,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,
   /* 0F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0F30 */     B,     B,     B,     B,     O, FMBlw,     O, FMBlw,     O, CMAbv,     O,     O,     O,     O,  VPst,  VPre,
+  /* 0F30 */     B,     B,     B,     B,     O,  FBlw,     O,  FBlw,     O, CMAbv,     O,     O,     O,     O,  VPst,  VPre,
   /* 0F40 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
   /* 0F40 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
   /* 0F50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0F50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0F60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
   /* 0F60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
-  /* 0F70 */     O,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw, VMAbv, VMPst,
-  /* 0F80 */  VBlw,  VAbv, VMAbv, VMAbv,  VBlw,   IND, VMAbv, VMAbv,     B,     B,     B,     B,     B,   SUB,   SUB,   SUB,
+  /* 0F70 */     O, CMBlw,  VBlw,  VAbv,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw, VMAbv,     O,
+  /* 0F80 */  VBlw,  VAbv, VMAbv, VMAbv,  VBlw,     O, VMAbv, VMAbv,     B,     B,     B,     B,     B,   SUB,   SUB,   SUB,
   /* 0F90 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 0F90 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 0FA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 0FA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 0FB0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,     O,     O,
   /* 0FB0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,     O,     O,
-  /* 0FC0 */     O,     O,     O,     O,     O,     O, FMBlw,     O,
+  /* 0FC0 */     O,     O,     O,     O,     O,     O,  FBlw,     O,
 
 
-#define use_offset_0x1000u 1536
+#define use_offset_0x1000u 1648
 
 
 
 
   /* Myanmar */
   /* Myanmar */
@@ -238,7 +272,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
   /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
   /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
   /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
 
 
-#define use_offset_0x1700u 1696
+#define use_offset_0x1700u 1808
 
 
 
 
   /* Tagalog */
   /* Tagalog */
@@ -266,12 +300,27 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 17B0 */     B,     B,     B,     B,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPst,  VPst,
-  /* 17C0 */  VPst,  VPre,  VPre,  VPre,  VPst,  VPst, VMAbv, VMPst,  VPst, VMAbv, VMAbv, FMAbv,  FAbv, CMAbv, FMAbv, FMAbv,
+  /* 17B0 */     B,     B,     B,     B,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
+  /* 17C0 */  VPre,  VPre,  VPre,  VPre,  VPre,  VPre, VMAbv, VMPst,  VPst, VMAbv, VMAbv, FMAbv,  FAbv, CMAbv, FMAbv, VMAbv,
   /* 17D0 */ FMAbv,  VAbv,     H, FMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     B, FMAbv,     O,     O,
   /* 17D0 */ FMAbv,  VAbv,     H, FMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     B, FMAbv,     O,     O,
   /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 17F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x1900u 1936
+  /* Mongolian */
+
+  /* 1800 */     B,     O,     O,     O,     O,     O,     O,     B,     O,     O,     B,     O,     O,     O,     O,     O,
+  /* 1810 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1830 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1870 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+  /* 1880 */    GB,    GB,    GB,    GB,    GB, CMAbv, CMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw,     B,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1900u 2240
 
 
 
 
   /* Limbu */
   /* Limbu */
@@ -279,7 +328,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1900 */    GB,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1900 */    GB,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
   /* 1910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
   /* 1920 */  VAbv,  VAbv,  VBlw,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,   SUB,   SUB,   SUB,     O,     O,     O,     O,
   /* 1920 */  VAbv,  VAbv,  VBlw,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,   SUB,   SUB,   SUB,     O,     O,     O,     O,
-  /* 1930 */  FPst,  FPst, VMBlw,  FPst,  FPst,  FPst,  FPst,  FPst,  FPst,  FBlw,  VAbv, FMBlw,     O,     O,     O,     O,
+  /* 1930 */  FPst,  FPst, VMBlw,  FPst,  FPst,  FPst,  FPst,  FPst,  FPst,  FBlw, VMAbv, FMBlw,     O,     O,     O,     O,
   /* 1940 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1940 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
 
 
   /* Tai Le */
   /* Tai Le */
@@ -302,7 +351,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* Buginese */
   /* Buginese */
 
 
   /* 1A00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A10 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VBlw,  VPre,  VPst,  VAbv,     O,     O,     O,     O,
+  /* 1A10 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VPre,  VPst,  VAbv,     O,     O,     O,     O,
 
 
   /* Tai Tham */
   /* Tai Tham */
 
 
@@ -311,11 +360,11 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,   SUB,  FAbv,  FAbv,  MAbv,   SUB,   SUB,   SUB,   SUB,     O,
   /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,   SUB,  FAbv,  FAbv,  MAbv,   SUB,   SUB,   SUB,   SUB,     O,
   /* 1A60 */    Sk,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
   /* 1A60 */    Sk,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
-  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv, FMAbv, FMAbv,     O,     O, FMBlw,
+  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv, VMAbv, VMAbv,     O,     O, VMBlw,
   /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 1A90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 1A90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x1b00u 2352
+#define use_offset_0x1b00u 2656
 
 
 
 
   /* Balinese */
   /* Balinese */
@@ -324,7 +373,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
   /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
-  /* 1B40 */  VPst,  VPst,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
+  /* 1B40 */  VPre,  VPre,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
   /* 1B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,    GB,     O,     O,    GB,
   /* 1B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,    GB,     O,     O,    GB,
   /* 1B60 */     O,     S,    GB,     S,     S,     S,     S,     S,    GB,     S,     S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
   /* 1B60 */     O,     S,    GB,     S,     S,     S,     S,     S,    GB,     S,     S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
   /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -351,51 +400,61 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre, FMAbv, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre, FMAbv, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
   /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
 
 
-#define use_offset_0x1cd0u 2688
+#define use_offset_0x1cd0u 2992
 
 
 
 
   /* Vedic Extensions */
   /* Vedic Extensions */
 
 
   /* 1CD0 */ VMAbv, VMAbv, VMAbv,     O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw,
   /* 1CD0 */ VMAbv, VMAbv, VMAbv,     O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw,
   /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,     O,     O,     O,     O, VMBlw,     O,     O,
   /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,     O,     O,     O,     O, VMBlw,     O,     O,
-  /* 1CF0 */     O,     O,   IND,   IND, VMAbv,    CS,    CS, VMPst, VMAbv, VMAbv,    GB,     O,     O,     O,     O,     O,
+  /* 1CF0 */     O,     O,     O,     O, VMAbv,    CS,    CS, VMPst, VMAbv, VMAbv,    GB,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x1df8u 2736
+#define use_offset_0x1df8u 3040
 
 
 
 
   /* Combining Diacritical Marks Supplement */
   /* Combining Diacritical Marks Supplement */
                                                                          O,     O,     O, FMAbv,     O,     O,     O,     O,
                                                                          O,     O,     O, FMAbv,     O,     O,     O,     O,
 
 
-#define use_offset_0x2008u 2744
+#define use_offset_0x2008u 3048
 
 
 
 
   /* General Punctuation */
   /* General Punctuation */
-                                                                         O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
+                                                                         O,     O,     O,     O,  ZWNJ,     O,     O,     O,
   /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
   /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
 
 
-#define use_offset_0x2060u 2760
+#define use_offset_0x2070u 3064
 
 
-  /* 2060 */    WJ,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
 
   /* Superscripts and Subscripts */
   /* Superscripts and Subscripts */
 
 
   /* 2070 */     O,     O,     O,     O, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 2070 */     O,     O,     O,     O, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 2080 */     O,     O, FMPst, FMPst, FMPst,     O,     O,     O,
   /* 2080 */     O,     O, FMPst, FMPst, FMPst,     O,     O,     O,
 
 
-#define use_offset_0x20f0u 2800
+#define use_offset_0x20f0u 3088
 
 
 
 
   /* Combining Diacritical Marks for Symbols */
   /* Combining Diacritical Marks for Symbols */
 
 
   /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
   /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x25c8u 2808
+#define use_offset_0x25c8u 3096
 
 
 
 
   /* Geometric Shapes */
   /* Geometric Shapes */
-                                                                         O,     O,     O,     O,    GB,     O,     O,     O,
+                                                                         O,     O,     O,     O,     B,     O,     O,     O,
+
+#define use_offset_0x2d30u 3104
+
 
 
-#define use_offset_0xa800u 2816
+  /* Tifinagh */
+
+  /* 2D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D60 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     B,
+  /* 2D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     H,
+
+#define use_offset_0xa800u 3184
 
 
 
 
   /* Syloti Nagri */
   /* Syloti Nagri */
@@ -445,7 +504,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A9B0 */     B,     B,     B, CMAbv,  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VPre,  VAbv,  MBlw,  MBlw,  MBlw,
+  /* A9B0 */     B,     B,     B, CMAbv,  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VPre,  VAbv,  MBlw,  MPst,  MBlw,
   /* A9C0 */     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A9C0 */     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A9D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* A9D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 
@@ -459,7 +518,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
   /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
-  /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MBlw,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MAbv,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
   /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
   /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 
@@ -482,7 +541,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
   /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
   /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
   /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
 
 
-#define use_offset_0xabc0u 3576
+#define use_offset_0xabc0u 3944
 
 
 
 
   /* Meetei Mayek */
   /* Meetei Mayek */
@@ -492,26 +551,74 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
   /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
   /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0xfe00u 3640
-
-
-  /* Variation Selectors */
-
-  /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
-
-#define use_offset_0x10a00u 3656
+#define use_offset_0x10a00u 4008
 
 
 
 
   /* Kharoshthi */
   /* Kharoshthi */
 
 
-  /* 10A00 */     B,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,  VBlw,  VBlw, VMBlw, VMAbv,
+  /* 10A00 */     B,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,  VPst, VMBlw, VMBlw, VMAbv,
   /* 10A10 */     B,     B,     B,     B,     O,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
   /* 10A10 */     B,     B,     B,     B,     O,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
   /* 10A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 10A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 10A30 */     B,     B,     B,     B,     B,     B,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
   /* 10A30 */     B,     B,     B,     B,     B,     B,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
   /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
   /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x11000u 3736
+#define use_offset_0x10ac0u 4088
+
+
+  /* Manichaean */
+
+  /* 10AC0 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 10AD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10AE0 */     B,     B,     B,     B,     B, CMBlw, CMBlw,     O,
+
+#define use_offset_0x10b80u 4128
+
+
+  /* Psalter Pahlavi */
+
+  /* 10B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10B90 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10BA0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     O,
+
+#define use_offset_0x10d00u 4176
+
+
+  /* Hanifi Rohingya */
+
+  /* 10D00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10D20 */     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, CMAbv,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10e80u 4240
+
+
+  /* Yezidi */
+
+  /* 10E80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10E90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10EA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,  VAbv,  VAbv,     O,     O,     O,
+  /* 10EB0 */     B,     B,     O,     O,     O,     O,     O,     O,
 
 
+#define use_offset_0x10f30u 4296
+
+
+  /* Sogdian */
+
+  /* 10F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10F40 */     B,     B,     B,     B,     B,     B, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,
+  /* 10F50 */ VMBlw,     B,     B,     B,     B,     O,     O,     O,
+
+#define use_offset_0x10fb0u 4336
+
+
+  /* Chorasmian */
+
+  /* 10FB0 */     B,     O,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10FC0 */     O,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,     B,     O,     O,     O,     O,
+  /* 10FD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10FE0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10FF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
 
   /* Brahmi */
   /* Brahmi */
 
 
@@ -531,7 +638,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
   /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x11100u 3928
+#define use_offset_0x11100u 4608
 
 
 
 
   /* Chakma */
   /* Chakma */
@@ -539,7 +646,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VBlw,  VAbv,  VAbv,
   /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VBlw,  VAbv,  VAbv,
-  /* 11130 */  VBlw,  VAbv,  VAbv,     H, CMBlw,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11130 */  VBlw,  VAbv,  VAbv,     H, CMAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     B,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     B,     O,     O,     O,     O,     O,     O,     O,     O,
 
 
   /* Mahajani */
   /* Mahajani */
@@ -555,7 +662,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
   /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
   /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,    GB, FMBlw, CMBlw,  VAbv,  VBlw,     O,  VPre, VMAbv,
   /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,    GB, FMBlw, CMBlw,  VAbv,  VBlw,     O,  VPre, VMAbv,
-  /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
 
 
   /* Sinhala Archaic Numbers */
   /* Sinhala Archaic Numbers */
 
 
@@ -569,7 +676,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
   /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
   /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
   /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
 
 
-#define use_offset_0x11280u 4248
+#define use_offset_0x11280u 4928
 
 
 
 
   /* Multani */
   /* Multani */
@@ -592,12 +699,12 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11310 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11310 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11320 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 11320 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 11330 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O, CMBlw, CMBlw,     B,  VPst,  VPst,
   /* 11330 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O, CMBlw, CMBlw,     B,  VPst,  VPst,
-  /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPst,  VPst,   HVM,     O,     O,
+  /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,   HVM,     O,     O,
   /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     B,     B,
   /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     B,     B,
   /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
 
 
-#define use_offset_0x11400u 4496
+#define use_offset_0x11400u 5176
 
 
 
 
   /* Newa */
   /* Newa */
@@ -616,11 +723,11 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPst,  VPst,  VPst,  VPst, VMAbv,
+  /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPre,  VPre,  VPst,  VPre, VMAbv,
   /* 114C0 */ VMAbv, VMAbv,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 114C0 */ VMAbv, VMAbv,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x11580u 4720
+#define use_offset_0x11580u 5400
 
 
 
 
   /* Siddham */
   /* Siddham */
@@ -628,7 +735,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
   /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
-  /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPst,  VPst,  VPst, VMAbv, VMAbv, VMPst,     H,
+  /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,  VPre,  VPre, VMAbv, VMAbv, VMPst,     H,
   /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
   /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
   /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -660,10 +767,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
 
   /* 11700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11710 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,  MBlw,  MPre,  MAbv,
   /* 11710 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,  MBlw,  MPre,  MAbv,
-  /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
+  /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv, VMAbv,     O,     O,     O,     O,
   /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
   /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
 
 
-#define use_offset_0x11800u 5168
+#define use_offset_0x11800u 5848
 
 
 
 
   /* Dogra */
   /* Dogra */
@@ -673,7 +780,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,
   /* 11820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,
   /* 11830 */  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMPst,     H, CMBlw,     O,     O,     O,     O,     O,
   /* 11830 */  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x11900u 5232
+#define use_offset_0x11900u 5912
 
 
 
 
   /* Dives Akuru */
   /* Dives Akuru */
@@ -681,11 +788,11 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11900 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     O,     O,     B,     B,     B,     B,
   /* 11900 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     O,     O,     B,     B,     B,     B,
   /* 11910 */     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11910 */     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11930 */  VPst,  VPst,  VPst,  VPst,  VPst,  VPre,     O,  VPre,  VPst,     O,     O, VMAbv, VMAbv,  VPst,     H,     R,
-  /* 11940 */  MPst,     R,  MBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11930 */  VPst,  VPst,  VPst,  VPst,  VPst,  VPre,     O,  VPre,  VPre,     O,     O, VMAbv, VMAbv,  VPst,     H,     R,
+  /* 11940 */  MPst,     R,  MPst, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 11950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x119a0u 5328
+#define use_offset_0x119a0u 6008
 
 
 
 
   /* Nandinagari */
   /* Nandinagari */
@@ -713,7 +820,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11A80 */     B,     B,     B,     B,     R,     R,     R,     R,     R,     R,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,
   /* 11A80 */     B,     B,     B,     B,     R,     R,     R,     R,     R,     R,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,
   /* 11A90 */  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw, VMAbv, VMPst, CMAbv,     H,     O,     O,     O,     B,     O,     O,
   /* 11A90 */  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw, VMAbv, VMPst, CMAbv,     H,     O,     O,     O,     B,     O,     O,
 
 
-#define use_offset_0x11c00u 5584
+#define use_offset_0x11c00u 6264
 
 
 
 
   /* Bhaiksuki */
   /* Bhaiksuki */
@@ -734,7 +841,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
   /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
 
 
-#define use_offset_0x11d00u 5768
+#define use_offset_0x11d00u 6448
 
 
 
 
   /* Masaram Gondi */
   /* Masaram Gondi */
@@ -754,7 +861,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x11ee0u 5944
+#define use_offset_0x11ee0u 6624
 
 
 
 
   /* Makasar */
   /* Makasar */
@@ -762,7 +869,202 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11EE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11EE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11EF0 */     B,     B,    GB,  VAbv,  VBlw,  VPre,  VPst,     O,
   /* 11EF0 */     B,     B,    GB,  VAbv,  VBlw,  VPre,  VPst,     O,
 
 
-}; /* Table items: 5968; occupancy: 74% */
+#define use_offset_0x13000u 6648
+
+
+  /* Egyptian Hieroglyphs */
+
+  /* 13000 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13010 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13020 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13030 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13040 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13050 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13060 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13070 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13080 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13090 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13100 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13110 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13120 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13130 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13140 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13150 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13160 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13170 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13180 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13190 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13200 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13210 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13220 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13230 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13240 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13250 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13260 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13270 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13280 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13290 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13300 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13310 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13320 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13330 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13340 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13350 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13360 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13370 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13380 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13390 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13400 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13410 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13420 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     O,
+
+  /* Egyptian Hieroglyph Format Controls */
+
+  /* 13430 */     J,     J,     J,     J,     J,     J,     J,    SB,    SE,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x16b00u 7736
+
+
+  /* Pahawh Hmong */
+
+  /* 16B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B30 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,
+
+#define use_offset_0x16f00u 7792
+
+
+  /* Miao */
+
+  /* 16F00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O, CMBlw,
+  /* 16F50 */     O,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F60 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F70 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F80 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O, VMBlw,
+  /* 16F90 */ VMBlw, VMBlw, VMBlw,     O,     O,     O,     O,     O,
+
+#define use_offset_0x16fe0u 7944
+
+
+  /* Ideographic Symbols and Punctuation */
+
+  /* 16FE0 */     O,     O,     O,     O,     B,     O,     O,     O,
+
+#define use_offset_0x18b00u 7952
+
+
+  /* Khitan Small Script */
+
+  /* 18B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CD0 */     B,     B,     B,     B,     B,     B,     O,     O,
+
+#define use_offset_0x1bc00u 8424
+
+
+  /* Duployan */
+
+  /* 1BC00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
+  /* 1BC70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 1BC80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+  /* 1BC90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O, CMBlw, CMBlw,     O,
+
+#define use_offset_0x1e100u 8584
+
+
+  /* Nyiakeng Puachue Hmong */
+
+  /* 1E100 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E120 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 1E130 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     O,     O,
+  /* 1E140 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,
+
+#define use_offset_0x1e2c0u 8664
+
+
+  /* Wancho */
+
+  /* 1E2C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E2D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E2E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* 1E2F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1e900u 8728
+
+
+  /* Adlam */
+
+  /* 1E900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E940 */     B,     B,     B,     B, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv,     B,     O,     O,     O,     O,
+  /* 1E950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+}; /* Table items: 8824; occupancy: 79% */
 
 
 USE_TABLE_ELEMENT_TYPE
 USE_TABLE_ELEMENT_TYPE
 hb_use_get_category (hb_codepoint_t u)
 hb_use_get_category (hb_codepoint_t u)
@@ -772,14 +1074,16 @@ hb_use_get_category (hb_codepoint_t u)
     case 0x0u:
     case 0x0u:
       if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
       if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
       if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0640u, 0x0647u)) return use_table[u - 0x0640u + use_offset_0x0640u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x07C8u, 0x07FFu)) return use_table[u - 0x07C8u + use_offset_0x07c8u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0840u, 0x085Fu)) return use_table[u - 0x0840u + use_offset_0x0840u];
       if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
       if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0F18u, 0x0FC7u)) return use_table[u - 0x0F18u + use_offset_0x0f18u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0F00u, 0x0FC7u)) return use_table[u - 0x0F00u + use_offset_0x0f00u];
       break;
       break;
 
 
     case 0x1u:
     case 0x1u:
       if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
       if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x17EFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x18AFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
       if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
       if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
       if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
       if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
       if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
@@ -788,9 +1092,10 @@ hb_use_get_category (hb_codepoint_t u)
 
 
     case 0x2u:
     case 0x2u:
       if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
       if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return use_table[u - 0x2070u + use_offset_0x2070u];
       if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
       if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2D30u, 0x2D7Fu)) return use_table[u - 0x2D30u + use_offset_0x2d30u];
       break;
       break;
 
 
     case 0xAu:
     case 0xAu:
@@ -798,16 +1103,18 @@ hb_use_get_category (hb_codepoint_t u)
       if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
       if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
       break;
       break;
 
 
-    case 0xFu:
-      if (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)) return use_table[u - 0xFE00u + use_offset_0xfe00u];
-      break;
-
     case 0x10u:
     case 0x10u:
       if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
       if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AE7u)) return use_table[u - 0x10AC0u + use_offset_0x10ac0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return use_table[u - 0x10B80u + use_offset_0x10b80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10D00u, 0x10D3Fu)) return use_table[u - 0x10D00u + use_offset_0x10d00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10E80u, 0x10EB7u)) return use_table[u - 0x10E80u + use_offset_0x10e80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x10F57u)) return use_table[u - 0x10F30u + use_offset_0x10f30u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10FB0u, 0x110BFu)) return use_table[u - 0x10FB0u + use_offset_0x10fb0u];
       break;
       break;
 
 
     case 0x11u:
     case 0x11u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10FB0u, 0x110BFu)) return use_table[u - 0x10FB0u + use_offset_0x10fb0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
@@ -820,6 +1127,30 @@ hb_use_get_category (hb_codepoint_t u)
       if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u];
       break;
       break;
 
 
+    case 0x13u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x13000u, 0x1343Fu)) return use_table[u - 0x13000u + use_offset_0x13000u];
+      break;
+
+    case 0x16u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x16B00u, 0x16B37u)) return use_table[u - 0x16B00u + use_offset_0x16b00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x16F00u, 0x16F97u)) return use_table[u - 0x16F00u + use_offset_0x16f00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x16FE0u, 0x16FE7u)) return use_table[u - 0x16FE0u + use_offset_0x16fe0u];
+      break;
+
+    case 0x18u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x18B00u, 0x18CD7u)) return use_table[u - 0x18B00u + use_offset_0x18b00u];
+      break;
+
+    case 0x1Bu:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1BC00u, 0x1BC9Fu)) return use_table[u - 0x1BC00u + use_offset_0x1bc00u];
+      break;
+
+    case 0x1Eu:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E100u, 0x1E14Fu)) return use_table[u - 0x1E100u + use_offset_0x1e100u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E2C0u, 0x1E2FFu)) return use_table[u - 0x1E2C0u + use_offset_0x1e2c0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E95Fu)) return use_table[u - 0x1E900u + use_offset_0x1e900u];
+      break;
+
     default:
     default:
       break;
       break;
   }
   }
@@ -827,23 +1158,21 @@ hb_use_get_category (hb_codepoint_t u)
 }
 }
 
 
 #undef B
 #undef B
-#undef CGJ
 #undef CS
 #undef CS
+#undef G
 #undef GB
 #undef GB
 #undef H
 #undef H
 #undef HN
 #undef HN
 #undef HVM
 #undef HVM
-#undef IND
+#undef J
 #undef N
 #undef N
 #undef O
 #undef O
 #undef R
 #undef R
-#undef Rsv
 #undef S
 #undef S
+#undef SB
+#undef SE
 #undef SUB
 #undef SUB
 #undef Sk
 #undef Sk
-#undef VS
-#undef WJ
-#undef ZWJ
 #undef ZWNJ
 #undef ZWNJ
 #undef CMAbv
 #undef CMAbv
 #undef CMBlw
 #undef CMBlw

+ 10 - 5
thirdparty/harfbuzz/src/hb-ot-shape-complex-use.cc

@@ -194,6 +194,7 @@ enum use_syllable_type_t {
   use_number_joiner_terminated_cluster,
   use_number_joiner_terminated_cluster,
   use_numeral_cluster,
   use_numeral_cluster,
   use_symbol_cluster,
   use_symbol_cluster,
+  use_hieroglyph_cluster,
   use_broken_cluster,
   use_broken_cluster,
   use_non_cluster,
   use_non_cluster,
 };
 };
@@ -275,6 +276,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
     {
     {
       case use_independent_cluster:
       case use_independent_cluster:
       case use_symbol_cluster:
       case use_symbol_cluster:
+      case use_hieroglyph_cluster:
       case use_non_cluster:
       case use_non_cluster:
 	/* These don't join.  Nothing to do. */
 	/* These don't join.  Nothing to do. */
 	last_form = _USE_NONE;
 	last_form = _USE_NONE;
@@ -385,8 +387,7 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
 
 
   hb_glyph_info_t *info = buffer->info;
   hb_glyph_info_t *info = buffer->info;
 
 
-#define POST_BASE_FLAGS64 (FLAG64 (USE_FM) | \
-			   FLAG64 (USE_FAbv) | \
+#define POST_BASE_FLAGS64 (FLAG64 (USE_FAbv) | \
 			   FLAG64 (USE_FBlw) | \
 			   FLAG64 (USE_FBlw) | \
 			   FLAG64 (USE_FPst) | \
 			   FLAG64 (USE_FPst) | \
 			   FLAG64 (USE_MAbv) | \
 			   FLAG64 (USE_MAbv) | \
@@ -516,10 +517,14 @@ reorder_use (const hb_ot_shape_plan_t *plan,
 	     hb_font_t *font,
 	     hb_font_t *font,
 	     hb_buffer_t *buffer)
 	     hb_buffer_t *buffer)
 {
 {
-  insert_dotted_circles_use (plan, font, buffer);
+	if (buffer->message (font, "start reordering USE")) {
+	  insert_dotted_circles_use (plan, font, buffer);
 
 
-  foreach_syllable (buffer, start, end)
-    reorder_syllable_use (buffer, start, end);
+	  foreach_syllable (buffer, start, end)
+	    reorder_syllable_use (buffer, start, end);
+
+	  (void) buffer->message (font, "end reordering USE");
+  }
 
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
 }
 }

+ 4 - 13
thirdparty/harfbuzz/src/hb-ot-shape-complex-use.hh

@@ -46,34 +46,25 @@ enum use_category_t {
   USE_O		= 0,	/* OTHER */
   USE_O		= 0,	/* OTHER */
 
 
   USE_B		= 1,	/* BASE */
   USE_B		= 1,	/* BASE */
-  USE_IND	= 3,	/* BASE_IND */
   USE_N		= 4,	/* BASE_NUM */
   USE_N		= 4,	/* BASE_NUM */
   USE_GB	= 5,	/* BASE_OTHER */
   USE_GB	= 5,	/* BASE_OTHER */
-  USE_CGJ	= 6,	/* CGJ */
-//  USE_F		= 7,	/* CONS_FINAL */
-  USE_FM	= 8,	/* CONS_FINAL_MOD */
-//  USE_M		= 9,	/* CONS_MED */
-//  USE_CM	= 10,	/* CONS_MOD */
   USE_SUB	= 11,	/* CONS_SUB */
   USE_SUB	= 11,	/* CONS_SUB */
   USE_H		= 12,	/* HALANT */
   USE_H		= 12,	/* HALANT */
 
 
   USE_HN	= 13,	/* HALANT_NUM */
   USE_HN	= 13,	/* HALANT_NUM */
   USE_ZWNJ	= 14,	/* Zero width non-joiner */
   USE_ZWNJ	= 14,	/* Zero width non-joiner */
-  USE_ZWJ	= 15,	/* Zero width joiner */
-  USE_WJ	= 16,	/* Word joiner */
-  USE_Rsv	= 17,	/* Reserved characters */
   USE_R		= 18,	/* REPHA */
   USE_R		= 18,	/* REPHA */
   USE_S		= 19,	/* SYM */
   USE_S		= 19,	/* SYM */
-//  USE_SM	= 20,	/* SYM_MOD */
-  USE_VS	= 21,	/* VARIATION_SELECTOR */
-//  USE_V	= 36,	/* VOWEL */
-//  USE_VM	= 40,	/* VOWEL_MOD */
   USE_CS	= 43,	/* CONS_WITH_STACKER */
   USE_CS	= 43,	/* CONS_WITH_STACKER */
 
 
   /* https://github.com/harfbuzz/harfbuzz/issues/1102 */
   /* https://github.com/harfbuzz/harfbuzz/issues/1102 */
   USE_HVM	= 44,	/* HALANT_OR_VOWEL_MODIFIER */
   USE_HVM	= 44,	/* HALANT_OR_VOWEL_MODIFIER */
 
 
   USE_Sk	= 48,	/* SAKOT */
   USE_Sk	= 48,	/* SAKOT */
+  USE_G		= 49,	/* HIEROGLYPH */
+  USE_J		= 50,	/* HIEROGLYPH_JOINER */
+  USE_SB	= 51,	/* HIEROGLYPH_SEGMENT_BEGIN */
+  USE_SE	= 52,	/* HIEROGLYPH_SEGMENT_END */
 
 
   USE_FAbv	= 24,	/* CONS_FINAL_ABOVE */
   USE_FAbv	= 24,	/* CONS_FINAL_ABOVE */
   USE_FBlw	= 25,	/* CONS_FINAL_BELOW */
   USE_FBlw	= 25,	/* CONS_FINAL_BELOW */

+ 1 - 1
thirdparty/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc

@@ -320,7 +320,7 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
 	    switch (buffer->cur (1).codepoint)
 	    switch (buffer->cur (1).codepoint)
 	    {
 	    {
 	      case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
 	      case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
-	      case 0x0DDDu:
+	      case 0x0DDDu: case 0x0DDEu:
 		matched = true;
 		matched = true;
 		break;
 		break;
 	    }
 	    }

+ 7 - 0
thirdparty/harfbuzz/src/hb-ot-shape-complex.hh

@@ -341,6 +341,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
 
     /* Unicode-6.1 additions */
     /* Unicode-6.1 additions */
     case HB_SCRIPT_CHAKMA:
     case HB_SCRIPT_CHAKMA:
+    case HB_SCRIPT_MIAO:
     case HB_SCRIPT_SHARADA:
     case HB_SCRIPT_SHARADA:
     case HB_SCRIPT_TAKRI:
     case HB_SCRIPT_TAKRI:
 
 
@@ -359,6 +360,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
 
     /* Unicode-8.0 additions */
     /* Unicode-8.0 additions */
     case HB_SCRIPT_AHOM:
     case HB_SCRIPT_AHOM:
+    case HB_SCRIPT_MULTANI:
 
 
     /* Unicode-9.0 additions */
     /* Unicode-9.0 additions */
     //case HB_SCRIPT_ADLAM:
     //case HB_SCRIPT_ADLAM:
@@ -376,10 +378,15 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_GUNJALA_GONDI:
     case HB_SCRIPT_GUNJALA_GONDI:
     //case HB_SCRIPT_HANIFI_ROHINGYA:
     //case HB_SCRIPT_HANIFI_ROHINGYA:
     case HB_SCRIPT_MAKASAR:
     case HB_SCRIPT_MAKASAR:
+    case HB_SCRIPT_MEDEFAIDRIN:
+    case HB_SCRIPT_OLD_SOGDIAN:
     //case HB_SCRIPT_SOGDIAN:
     //case HB_SCRIPT_SOGDIAN:
 
 
     /* Unicode-12.0 additions */
     /* Unicode-12.0 additions */
+    case HB_SCRIPT_ELYMAIC:
     case HB_SCRIPT_NANDINAGARI:
     case HB_SCRIPT_NANDINAGARI:
+    case HB_SCRIPT_NYIAKENG_PUACHUE_HMONG:
+    case HB_SCRIPT_WANCHO:
 
 
     /* Unicode-13.0 additions */
     /* Unicode-13.0 additions */
     case HB_SCRIPT_CHORASMIAN:
     case HB_SCRIPT_CHORASMIAN:

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

@@ -301,7 +301,7 @@ position_mark (const hb_ot_shape_plan_t *plan HB_UNUSED,
       /* Don't shift down "above" marks too much. */
       /* Don't shift down "above" marks too much. */
       if ((y_gap > 0) != (pos.y_offset > 0))
       if ((y_gap > 0) != (pos.y_offset > 0))
       {
       {
-	unsigned int correction = -pos.y_offset / 2;
+	int correction = -pos.y_offset / 2;
 	base_extents.y_bearing += correction;
 	base_extents.y_bearing += correction;
 	base_extents.height -= correction;
 	base_extents.height -= correction;
 	pos.y_offset += correction;
 	pos.y_offset += correction;

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

@@ -373,7 +373,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
 
 
   /* Second round, reorder (inplace) */
   /* Second round, reorder (inplace) */
 
 
-  if (!all_simple)
+  if (!all_simple && buffer->message(font, "start reorder"))
   {
   {
     count = buffer->len;
     count = buffer->len;
     for (unsigned int i = 0; i < count; i++)
     for (unsigned int i = 0; i < count; i++)
@@ -399,6 +399,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
 
 
       i = end;
       i = end;
     }
     }
+    (void) buffer->message(font, "end reorder");
   }
   }
   if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
   if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
   {
   {
@@ -408,7 +409,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
      */
      */
     for (unsigned int i = 1; i + 1 < buffer->len; i++)
     for (unsigned int i = 1; i + 1 < buffer->len; i++)
       if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
       if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
-	  info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1]))
+	  (info_cc(buffer->info[i+1]) == 0 || info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1])))
       {
       {
 	_hb_glyph_info_unhide (&buffer->info[i]);
 	_hb_glyph_info_unhide (&buffer->info[i]);
       }
       }

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

@@ -896,8 +896,11 @@ hb_ot_substitute_post (const hb_ot_shape_context_t *c)
     hb_aat_layout_remove_deleted_glyphs (c->buffer);
     hb_aat_layout_remove_deleted_glyphs (c->buffer);
 #endif
 #endif
 
 
-  if (c->plan->shaper->postprocess_glyphs)
+  if (c->plan->shaper->postprocess_glyphs &&
+    c->buffer->message(c->font, "start postprocess-glyphs")) {
     c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
     c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+    (void) c->buffer->message(c->font, "end postprocess-glyphs");
+  }
 }
 }
 
 
 
 
@@ -1120,8 +1123,11 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
 
 
   hb_ensure_native_direction (c->buffer);
   hb_ensure_native_direction (c->buffer);
 
 
-  if (c->plan->shaper->preprocess_text)
+  if (c->plan->shaper->preprocess_text &&
+    c->buffer->message(c->font, "start preprocess-text")) {
     c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
     c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
+    (void) c->buffer->message(c->font, "end preprocess-text");
+  }
 
 
   hb_ot_substitute_pre (c);
   hb_ot_substitute_pre (c);
   hb_ot_position (c);
   hb_ot_position (c);
@@ -1155,6 +1161,12 @@ _hb_ot_shape (hb_shape_plan_t    *shape_plan,
 
 
 /**
 /**
  * hb_ot_shape_plan_collect_lookups:
  * hb_ot_shape_plan_collect_lookups:
+ * @shape_plan: #hb_shape_plan_t to query
+ * @table_tag: GSUB or GPOS
+ * @lookup_indexes: (out): The #hb_set_t set of lookups returned
+ *
+ * Computes the complete set of GSUB or GPOS lookups that are applicable
+ * under a given @shape_plan. 
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -1189,6 +1201,15 @@ add_char (hb_font_t          *font,
 
 
 /**
 /**
  * hb_ot_shape_glyphs_closure:
  * hb_ot_shape_glyphs_closure:
+ * @font: #hb_font_t to work upon
+ * @buffer: The input buffer to compute from
+ * @features: (array length=num_features): The features enabled on the buffer
+ * @num_features: The number of features enabled on the buffer
+ * @glyphs: (out): The #hb_set_t set of glyphs comprising the transitive closure of the query
+ *
+ * Computes the transitive closure of glyphs needed for a specified
+ * input buffer under the given font and feature list. The closure is
+ * computed as a set, not as a list.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/

File diff suppressed because it is too large
+ 402 - 53
thirdparty/harfbuzz/src/hb-ot-tag-table.hh


+ 1 - 0
thirdparty/harfbuzz/src/hb-ot-tag.cc

@@ -280,6 +280,7 @@ hb_ot_tags_from_language (const char   *lang_str,
       for (i = 0;
       for (i = 0;
 	   i < *count &&
 	   i < *count &&
 	   tag_idx + i < ARRAY_LENGTH (ot_languages) &&
 	   tag_idx + i < ARRAY_LENGTH (ot_languages) &&
+	   ot_languages[tag_idx + i].tag != HB_TAG_NONE &&
 	   0 == strcmp (ot_languages[tag_idx + i].language, ot_languages[tag_idx].language);
 	   0 == strcmp (ot_languages[tag_idx + i].language, ot_languages[tag_idx].language);
 	   i++)
 	   i++)
 	tags[i] = ot_languages[tag_idx + i].tag;
 	tags[i] = ot_languages[tag_idx + i].tag;

+ 110 - 5
thirdparty/harfbuzz/src/hb-ot-var.cc

@@ -52,11 +52,11 @@
 
 
 /**
 /**
  * hb_ot_var_has_data:
  * hb_ot_var_has_data:
- * @face: #hb_face_t to test
+ * @face: The #hb_face_t to work on
  *
  *
- * This function allows to verify the presence of OpenType variation data on the face.
+ * Tests whether a face includes any OpenType variation data in the `fvar` table.
  *
  *
- * Return value: true if face has a `fvar' table and false otherwise
+ * Return value: true if data found, false otherwise
  *
  *
  * Since: 1.4.2
  * Since: 1.4.2
  **/
  **/
@@ -68,6 +68,11 @@ hb_ot_var_has_data (hb_face_t *face)
 
 
 /**
 /**
  * hb_ot_var_get_axis_count:
  * hb_ot_var_get_axis_count:
+ * @face: The #hb_face_t to work on
+ *
+ * Fetches the number of OpenType variation axes included in the face. 
+ *
+ * Return value: the number of variation axes defined
  *
  *
  * Since: 1.4.2
  * Since: 1.4.2
  **/
  **/
@@ -80,9 +85,17 @@ hb_ot_var_get_axis_count (hb_face_t *face)
 #ifndef HB_DISABLE_DEPRECATED
 #ifndef HB_DISABLE_DEPRECATED
 /**
 /**
  * hb_ot_var_get_axes:
  * hb_ot_var_get_axes:
+ * @face: #hb_face_t to work upon
+ * @start_offset: offset of the first lookup to retrieve
+ * @axes_count: (inout) (allow-none): Input = the maximum number of variation axes to return;
+ *                Output = the actual number of variation axes returned (may be zero)
+ * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
+ *
+ * Fetches a list of all variation axes in the specified face. The list returned will begin
+ * at the offset provided.
  *
  *
  * Since: 1.4.2
  * Since: 1.4.2
- * Deprecated: 2.2.0
+ * Deprecated: 2.2.0: use hb_ot_var_get_axis_infos() instead
  **/
  **/
 unsigned int
 unsigned int
 hb_ot_var_get_axes (hb_face_t        *face,
 hb_ot_var_get_axes (hb_face_t        *face,
@@ -95,9 +108,16 @@ hb_ot_var_get_axes (hb_face_t        *face,
 
 
 /**
 /**
  * hb_ot_var_find_axis:
  * hb_ot_var_find_axis:
+ * @face: #hb_face_t to work upon
+ * @axis_tag: The #hb_tag_t of the variation axis to query
+ * @axis_index: The index of the variation axis
+ * @axis_info: (out): The #hb_ot_var_axis_info_t of the axis tag queried
+ *
+ * Fetches the variation-axis information corresponding to the specified axis tag
+ * in the specified face.
  *
  *
  * Since: 1.4.2
  * Since: 1.4.2
- * Deprecated: 2.2.0
+ * Deprecated: 2.2.0 - use hb_ot_var_find_axis_info() instead
  **/
  **/
 hb_bool_t
 hb_bool_t
 hb_ot_var_find_axis (hb_face_t        *face,
 hb_ot_var_find_axis (hb_face_t        *face,
@@ -111,6 +131,16 @@ hb_ot_var_find_axis (hb_face_t        *face,
 
 
 /**
 /**
  * hb_ot_var_get_axis_infos:
  * hb_ot_var_get_axis_infos:
+ * @face: #hb_face_t to work upon
+ * @start_offset: offset of the first lookup to retrieve
+ * @axes_count: (inout) (allow-none): Input = the maximum number of variation axes to return;
+ *                Output = the actual number of variation axes returned (may be zero)
+ * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
+ *
+ * Fetches a list of all variation axes in the specified face. The list returned will begin
+ * at the offset provided.
+ *
+ * Return value: the number of variation axes in the face
  *
  *
  * Since: 2.2.0
  * Since: 2.2.0
  **/
  **/
@@ -125,6 +155,14 @@ hb_ot_var_get_axis_infos (hb_face_t             *face,
 
 
 /**
 /**
  * hb_ot_var_find_axis_info:
  * hb_ot_var_find_axis_info:
+ * @face: #hb_face_t to work upon
+ * @axis_tag: The #hb_tag_t of the variation axis to query
+ * @axis_info: (out): The #hb_ot_var_axis_info_t of the axis tag queried
+ *
+ * Fetches the variation-axis information corresponding to the specified axis tag
+ * in the specified face.
+ *
+ * Return value: true if data found, false otherwise
  *
  *
  * Since: 2.2.0
  * Since: 2.2.0
  **/
  **/
@@ -141,12 +179,34 @@ hb_ot_var_find_axis_info (hb_face_t             *face,
  * Named instances.
  * Named instances.
  */
  */
 
 
+/**
+ * hb_ot_var_get_named_instance_count:
+ * @face: The #hb_face_t to work on
+ *
+ * Fetches the number of named instances included in the face. 
+ *
+ * Return value: the number of named instances defined
+ *
+ * Since: 2.2.0
+ **/
 unsigned int
 unsigned int
 hb_ot_var_get_named_instance_count (hb_face_t *face)
 hb_ot_var_get_named_instance_count (hb_face_t *face)
 {
 {
   return face->table.fvar->get_instance_count ();
   return face->table.fvar->get_instance_count ();
 }
 }
 
 
+/**
+ * hb_ot_var_named_instance_get_subfamily_name_id:
+ * @face: The #hb_face_t to work on
+ * @instance_index: The index of the named instance to query
+ *
+ * Fetches the `name` table Name ID that provides display names for
+ * the "Subfamily name" defined for the given named instance in the face.
+ *
+ * Return value: the Name ID found for the Subfamily name
+ *
+ * Since: 2.2.0
+ **/
 hb_ot_name_id_t
 hb_ot_name_id_t
 hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
 hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
 						unsigned int instance_index)
 						unsigned int instance_index)
@@ -154,6 +214,18 @@ hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
   return face->table.fvar->get_instance_subfamily_name_id (instance_index);
   return face->table.fvar->get_instance_subfamily_name_id (instance_index);
 }
 }
 
 
+/**
+ * hb_ot_var_named_instance_get_postscript_name_id:
+ * @face: The #hb_face_t to work on
+ * @instance_index: The index of the named instance to query
+ *
+ * Fetches the `name` table Name ID that provides display names for
+ * the "PostScript name" defined for the given named instance in the face.
+ *
+ * Return value: the Name ID found for the PostScript name
+ *
+ * Since: 2.2.0
+ **/
 hb_ot_name_id_t
 hb_ot_name_id_t
 hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
 hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
 						unsigned int instance_index)
 						unsigned int instance_index)
@@ -161,6 +233,21 @@ hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
   return face->table.fvar->get_instance_postscript_name_id (instance_index);
   return face->table.fvar->get_instance_postscript_name_id (instance_index);
 }
 }
 
 
+/**
+ * hb_ot_var_named_instance_get_design_coords:
+ * @face: The #hb_face_t to work on
+ * @instance_index: The index of the named instance to query
+ * @coords_length: (inout) (allow-none): Input = the maximum number of coordinates to return;
+ *                 Output = the actual number of coordinates returned (may be zero)
+ * @coords: (out) (array length=coords_length): The array of coordinates found for the query
+ *
+ * Fetches the design-space coordinates corresponding to the given
+ * named instance in the face.
+ *
+ * Return value: the number of variation axes in the face
+ *
+ * Since: 2.2.0
+ **/
 unsigned int
 unsigned int
 hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
 hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
 					    unsigned int  instance_index,
 					    unsigned int  instance_index,
@@ -173,6 +260,13 @@ hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
 
 
 /**
 /**
  * hb_ot_var_normalize_variations:
  * hb_ot_var_normalize_variations:
+ * @face: The #hb_face_t to work on
+ * @variations: The array of variations to normalize
+ * @variations_length: The number of variations to normalize
+ * @coords: (out) (array length=coords_length): The array of normalized coordinates 
+ * @coords_length: The length of the coordinate array
+ *
+ * Normalizes all of the coordinates in the given list of variation axes.
  *
  *
  * Since: 1.4.2
  * Since: 1.4.2
  **/
  **/
@@ -200,6 +294,17 @@ hb_ot_var_normalize_variations (hb_face_t            *face,
 
 
 /**
 /**
  * hb_ot_var_normalize_coords:
  * hb_ot_var_normalize_coords:
+ * @face: The #hb_face_t to work on
+ * @coords_length: The length of the coordinate array
+ * @design_coords: The design-space coordinates to normalize
+ * @normalized_coords: (out): The normalized coordinates
+ *
+ * Normalizes the given design-space coordinates. The minimum and maximum
+ * values for the axis are mapped to the interval [-1,1], with the default
+ * axis value mapped to 0.
+ *
+ * Any additional scaling defined in the face's `avar` table is also
+ * applied, as described at https://docs.microsoft.com/en-us/typography/opentype/spec/avar
  *
  *
  * Since: 1.4.2
  * Since: 1.4.2
  **/
  **/

+ 41 - 3
thirdparty/harfbuzz/src/hb-ot-var.h

@@ -35,11 +35,36 @@
 
 
 HB_BEGIN_DECLS
 HB_BEGIN_DECLS
 
 
-
+/**
+ * hb_tag_t:
+ * @HB_OT_TAG_VAR_AXIS_ITALIC: Registered tag for the roman/italic axis
+ */
 #define HB_OT_TAG_VAR_AXIS_ITALIC	HB_TAG('i','t','a','l')
 #define HB_OT_TAG_VAR_AXIS_ITALIC	HB_TAG('i','t','a','l')
+
+/**
+ * hb_tag_t:
+ * @HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE: Registered tag for the optical-size axis
+ *
+ * <note>Note: The optical-size axis supersedes the OpenType `size` feature.</note>
+ */
 #define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE	HB_TAG('o','p','s','z')
 #define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE	HB_TAG('o','p','s','z')
+
+/**
+ * hb_tag_t:
+ * @HB_OT_TAG_VAR_AXIS_SLANT: Registered tag for the slant axis
+ */
 #define HB_OT_TAG_VAR_AXIS_SLANT	HB_TAG('s','l','n','t')
 #define HB_OT_TAG_VAR_AXIS_SLANT	HB_TAG('s','l','n','t')
+
+/**
+ * hb_tag_t:
+ * @HB_OT_TAG_VAR_AXIS_WIDTH: Registered tag for the width axis
+ */
 #define HB_OT_TAG_VAR_AXIS_WIDTH	HB_TAG('w','d','t','h')
 #define HB_OT_TAG_VAR_AXIS_WIDTH	HB_TAG('w','d','t','h')
+
+/**
+ * hb_tag_t:
+ * @HB_OT_TAG_VAR_AXIS_WEIGHT: Registered tag for the weight axis
+ */
 #define HB_OT_TAG_VAR_AXIS_WEIGHT	HB_TAG('w','g','h','t')
 #define HB_OT_TAG_VAR_AXIS_WEIGHT	HB_TAG('w','g','h','t')
 
 
 
 
@@ -73,11 +98,24 @@ typedef enum { /*< flags >*/
 
 
 /**
 /**
  * hb_ot_var_axis_info_t:
  * hb_ot_var_axis_info_t:
+ * @axis_index: Index of the axis in the variation-axis array
+ * @tag: The #hb_tag_t tag identifying the design variation of the axis
+ * @name_id: The `name` table Name ID that provides display names for the axis
+ * @flags: The #hb_ot_var_axis_flags_t flags for the axis
+ * @min_value: The mininum value on the variation axis that the font covers
+ * @default_value: The position on the variation axis corresponding to the font's defaults
+ * @max_value: The maximum value on the variation axis that the font covers
+ * 
+ * Data type for holding variation-axis values.
+ *
+ * The minimum, default, and maximum values are in un-normalized, user scales.
+ *
+ * <note>Note: at present, the only flag defined for @flags is
+ * #HB_OT_VAR_AXIS_FLAG_HIDDEN.</note>
  *
  *
  * Since: 2.2.0
  * Since: 2.2.0
  */
  */
-typedef struct hb_ot_var_axis_info_t
-{
+typedef struct hb_ot_var_axis_info_t {
   unsigned int			axis_index;
   unsigned int			axis_index;
   hb_tag_t			tag;
   hb_tag_t			tag;
   hb_ot_name_id_t		name_id;
   hb_ot_name_id_t		name_id;

+ 115 - 92
thirdparty/harfbuzz/src/hb-set.cc

@@ -30,11 +30,11 @@
 /**
 /**
  * SECTION:hb-set
  * SECTION:hb-set
  * @title: hb-set
  * @title: hb-set
- * @short_description: Object representing a set of integers
+ * @short_description: Objects representing a set of integers
  * @include: hb.h
  * @include: hb.h
  *
  *
  * Set objects represent a mathematical set of integer values.  They are
  * Set objects represent a mathematical set of integer values.  They are
- * used in non-shaping API to query certain set of characters or glyphs,
+ * used in non-shaping APIs to query certain sets of characters or glyphs,
  * or other integer values.
  * or other integer values.
  **/
  **/
 
 
@@ -42,7 +42,9 @@
 /**
 /**
  * hb_set_create: (Xconstructor)
  * hb_set_create: (Xconstructor)
  *
  *
- * Return value: (transfer full):
+ * Creates a new, initially empty set.
+ *
+ * Return value: (transfer full): The new #hb_set_t
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -62,7 +64,9 @@ hb_set_create ()
 /**
 /**
  * hb_set_get_empty:
  * hb_set_get_empty:
  *
  *
- * Return value: (transfer full):
+ * Fetches the singleton empty #hb_set_t.
+ *
+ * Return value: (transfer full): The empty #hb_set_t
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -74,9 +78,11 @@ hb_set_get_empty ()
 
 
 /**
 /**
  * hb_set_reference: (skip)
  * hb_set_reference: (skip)
- * @set: a set.
+ * @set: A set
+ *
+ * Increases the reference count on a set.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The set
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -88,7 +94,11 @@ hb_set_reference (hb_set_t *set)
 
 
 /**
 /**
  * hb_set_destroy: (skip)
  * hb_set_destroy: (skip)
- * @set: a set.
+ * @set: A set
+ *
+ * Decreases the reference count on a set. When
+ * the reference count reaches zero, the set is
+ * destroyed, freeing all memory.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -104,13 +114,15 @@ hb_set_destroy (hb_set_t *set)
 
 
 /**
 /**
  * hb_set_set_user_data: (skip)
  * hb_set_set_user_data: (skip)
- * @set: a set.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @set: A set
+ * @key: The user-data key to set
+ * @data: A pointer to the user data to set
+ * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
  *
- * Return value:
+ * Attaches a user-data key/data pair to the specified set.
+ *
+ * Return value: %true if success, %false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -126,10 +138,13 @@ hb_set_set_user_data (hb_set_t           *set,
 
 
 /**
 /**
  * hb_set_get_user_data: (skip)
  * hb_set_get_user_data: (skip)
- * @set: a set.
- * @key:
+ * @set: A set
+ * @key: The user-data key to query
+ *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified set.
  *
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -143,11 +158,11 @@ hb_set_get_user_data (hb_set_t           *set,
 
 
 /**
 /**
  * hb_set_allocation_successful:
  * hb_set_allocation_successful:
- * @set: a set.
- *
+ * @set: A set
  *
  *
+ * Tests whether memory allocation for a set was successful.
  *
  *
- * Return value:
+ * Return value: %true if allocation succeeded, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -159,9 +174,9 @@ hb_set_allocation_successful (const hb_set_t  *set)
 
 
 /**
 /**
  * hb_set_clear:
  * hb_set_clear:
- * @set: a set.
- *
+ * @set: A set
  *
  *
+ * Clears out the contents of a set.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -175,9 +190,9 @@ hb_set_clear (hb_set_t *set)
  * hb_set_is_empty:
  * hb_set_is_empty:
  * @set: a set.
  * @set: a set.
  *
  *
+ * Tests whether a set is empty (contains no elements).
  *
  *
- *
- * Return value:
+ * Return value: %true if @set is empty
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -189,12 +204,12 @@ hb_set_is_empty (const hb_set_t *set)
 
 
 /**
 /**
  * hb_set_has:
  * hb_set_has:
- * @set: a set.
- * @codepoint:
+ * @set: A set
+ * @codepoint: The element to query
  *
  *
+ * Tests whether @codepoint belongs to @set.
  *
  *
- *
- * Return value:
+ * Return value: %true if @codepoint is in @set, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -207,10 +222,10 @@ hb_set_has (const hb_set_t *set,
 
 
 /**
 /**
  * hb_set_add:
  * hb_set_add:
- * @set: a set.
- * @codepoint:
- *
+ * @set: A set
+ * @codepoint: The element to add to @set
  *
  *
+ * Adds @codepoint to @set.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -223,11 +238,12 @@ hb_set_add (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_add_range:
  * hb_set_add_range:
- * @set: a set.
- * @first:
- * @last:
- *
+ * @set: A set
+ * @first: The first element to add to @set
+ * @last: The final element to add to @set
  *
  *
+ * Adds all of the elements from @first to @last
+ * (inclusive) to @set.
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -241,10 +257,10 @@ hb_set_add_range (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_del:
  * hb_set_del:
- * @set: a set.
- * @codepoint:
- *
+ * @set: A set
+ * @codepoint: Removes @codepoint from @set
  *
  *
+ * Removes @codepoint from @set.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -257,11 +273,12 @@ hb_set_del (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_del_range:
  * hb_set_del_range:
- * @set: a set.
- * @first:
- * @last:
- *
+ * @set: A set
+ * @first: The first element to remove from @set
+ * @last: The final element to remove from @set
  *
  *
+ * Removes all of the elements from @first to @last
+ * (inclusive) from @set.
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -275,10 +292,11 @@ hb_set_del_range (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_is_equal:
  * hb_set_is_equal:
- * @set: a set.
- * @other: other set.
- *
+ * @set: A set
+ * @other: Another set
  *
  *
+ * Tests whether @set and @other are equal (contain the same
+ * elements).
  *
  *
  * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
  * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
  *
  *
@@ -293,10 +311,10 @@ hb_set_is_equal (const hb_set_t *set,
 
 
 /**
 /**
  * hb_set_is_subset:
  * hb_set_is_subset:
- * @set: a set.
- * @larger_set: other set.
- *
+ * @set: A set
+ * @larger_set: Another set
  *
  *
+ * Tests whether @set is a subset of @larger_set.
  *
  *
  * Return value: %TRUE if the @set is a subset of (or equal to) @larger_set, %FALSE otherwise.
  * Return value: %TRUE if the @set is a subset of (or equal to) @larger_set, %FALSE otherwise.
  *
  *
@@ -311,10 +329,10 @@ hb_set_is_subset (const hb_set_t *set,
 
 
 /**
 /**
  * hb_set_set:
  * hb_set_set:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
  *
+ * Makes the contents of @set equal to the contents of @other.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -327,10 +345,10 @@ hb_set_set (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_union:
  * hb_set_union:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
  *
+ * Makes @set the union of @set and @other.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -343,10 +361,10 @@ hb_set_union (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_intersect:
  * hb_set_intersect:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
  *
+ * Makes @set the intersection of @set and @other.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -359,10 +377,10 @@ hb_set_intersect (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_subtract:
  * hb_set_subtract:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
  *
+ * Subtracts the contents of @other from @set.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -375,10 +393,11 @@ hb_set_subtract (hb_set_t       *set,
 
 
 /**
 /**
  * hb_set_symmetric_difference:
  * hb_set_symmetric_difference:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
  *
+ * Makes @set the symmetric difference of @set
+ * and @other.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -392,9 +411,9 @@ hb_set_symmetric_difference (hb_set_t       *set,
 #ifndef HB_DISABLE_DEPRECATED
 #ifndef HB_DISABLE_DEPRECATED
 /**
 /**
  * hb_set_invert:
  * hb_set_invert:
- * @set: a set.
- *
+ * @set: A set
  *
  *
+ * Inverts the contents of @set.
  *
  *
  * Since: 0.9.10
  * Since: 0.9.10
  *
  *
@@ -408,11 +427,11 @@ hb_set_invert (hb_set_t *set HB_UNUSED)
 
 
 /**
 /**
  * hb_set_get_population:
  * hb_set_get_population:
- * @set: a set.
+ * @set: A set
  *
  *
- * Returns the number of numbers in the set.
+ * Returns the number of elements in the set.
  *
  *
- * Return value: set population.
+ * Return value: The population of @set
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -424,11 +443,11 @@ hb_set_get_population (const hb_set_t *set)
 
 
 /**
 /**
  * hb_set_get_min:
  * hb_set_get_min:
- * @set: a set.
+ * @set: A set
  *
  *
- * Finds the minimum number in the set.
+ * Finds the smallest element in the set.
  *
  *
- * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
+ * Return value: minimum of @set, or %HB_SET_VALUE_INVALID if @set is empty.
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -440,11 +459,11 @@ hb_set_get_min (const hb_set_t *set)
 
 
 /**
 /**
  * hb_set_get_max:
  * hb_set_get_max:
- * @set: a set.
+ * @set: A set
  *
  *
- * Finds the maximum number in the set.
+ * Finds the largest element in the set.
  *
  *
- * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
+ * Return value: maximum of @set, or %HB_SET_VALUE_INVALID if @set is empty.
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -456,14 +475,15 @@ hb_set_get_max (const hb_set_t *set)
 
 
 /**
 /**
  * hb_set_next:
  * hb_set_next:
- * @set: a set.
- * @codepoint: (inout):
+ * @set: A set
+ * @codepoint: (inout): Input = Code point to query
+ *             Output = Code point retrieved
  *
  *
- * Gets the next number in @set that is greater than current value of @codepoint.
+ * Fetches the next element in @set that is greater than current value of @codepoint.
  *
  *
  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
  *
  *
- * Return value: whether there was a next value.
+ * Return value: %true if there was a next value, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -476,14 +496,15 @@ hb_set_next (const hb_set_t *set,
 
 
 /**
 /**
  * hb_set_previous:
  * hb_set_previous:
- * @set: a set.
- * @codepoint: (inout):
+ * @set: A set
+ * @codepoint: (inout): Input = Code point to query
+ *             Output = Code point retrieved
  *
  *
- * Gets the previous number in @set that is lower than current value of @codepoint.
+ * Fetches the previous element in @set that is lower than current value of @codepoint.
  *
  *
  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
  *
  *
- * Return value: whether there was a previous value.
+ * Return value: %true if there was a previous value, false otherwise
  *
  *
  * Since: 1.8.0
  * Since: 1.8.0
  **/
  **/
@@ -496,16 +517,17 @@ hb_set_previous (const hb_set_t *set,
 
 
 /**
 /**
  * hb_set_next_range:
  * hb_set_next_range:
- * @set: a set.
- * @first: (out): output first codepoint in the range.
- * @last: (inout): input current last and output last codepoint in the range.
+ * @set: A set
+ * @first: (out): The first code point in the range
+ * @last: (inout): Input = The current last code point in the range
+ *         Output = The last code point in the range
  *
  *
- * Gets the next consecutive range of numbers in @set that
+ * Fetches the next consecutive range of elements in @set that
  * are greater than current value of @last.
  * are greater than current value of @last.
  *
  *
  * Set @last to %HB_SET_VALUE_INVALID to get started.
  * Set @last to %HB_SET_VALUE_INVALID to get started.
  *
  *
- * Return value: whether there was a next range.
+ * Return value: %true if there was a next range, false otherwise
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -519,16 +541,17 @@ hb_set_next_range (const hb_set_t *set,
 
 
 /**
 /**
  * hb_set_previous_range:
  * hb_set_previous_range:
- * @set: a set.
- * @first: (inout): input current first and output first codepoint in the range.
- * @last: (out): output last codepoint in the range.
+ * @set: A set
+ * @first: (inout): Input = The current first code point in the range
+ *         Output = The first code point in the range
+ * @last: (out): The last code point in the range
  *
  *
- * Gets the previous consecutive range of numbers in @set that
- * are less than current value of @first.
+ * Fetches the previous consecutive range of elements in @set that
+ * are greater than current value of @last.
  *
  *
  * Set @first to %HB_SET_VALUE_INVALID to get started.
  * Set @first to %HB_SET_VALUE_INVALID to get started.
  *
  *
- * Return value: whether there was a previous range.
+ * Return value: %true if there was a previous range, false otherwise
  *
  *
  * Since: 1.8.0
  * Since: 1.8.0
  **/
  **/

+ 9 - 0
thirdparty/harfbuzz/src/hb-set.h

@@ -41,6 +41,15 @@ HB_BEGIN_DECLS
  */
  */
 #define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)
 #define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)
 
 
+/**
+ * hb_set_t:
+ *
+ * Data type for holding a set of integers. #hb_set_t's are
+ * used to gather and contain glyph IDs, Unicode code
+ * points, and various other collections of discrete 
+ * values.
+ *
+ **/
 typedef struct hb_set_t hb_set_t;
 typedef struct hb_set_t hb_set_t;
 
 
 
 

+ 125 - 59
thirdparty/harfbuzz/src/hb-shape-plan.cc

@@ -37,10 +37,17 @@
  * @short_description: Object representing a shaping plan
  * @short_description: Object representing a shaping plan
  * @include: hb.h
  * @include: hb.h
  *
  *
- * Shape plans are not used for shaping directly, but can be access to query
- * certain information about how shaping will perform given a set of input
- * parameters (script, language, direction, features, etc.)
- * Most client would not need to deal with shape plans directly.
+ * Shape plans are an internal mechanism. Each plan contains state
+ * describing how HarfBuzz will shape a particular text segment, based on
+ * the combination of segment properties and the capabilities in the
+ * font face in use.
+ *
+ * Shape plans are not used for shaping directly, but can be queried to
+ * access certain information about how shaping will perform, given a set
+ * of specific input parameters (script, language, direction, features,
+ * etc.).
+ *
+ * Most client programs will not need to deal with shape plans directly.
  **/
  **/
 
 
 
 
@@ -164,15 +171,16 @@ hb_shape_plan_key_t::equal (const hb_shape_plan_key_t *other)
 
 
 /**
 /**
  * hb_shape_plan_create: (Xconstructor)
  * hb_shape_plan_create: (Xconstructor)
- * @face:
- * @props:
- * @user_features: (array length=num_user_features):
- * @num_user_features:
- * @shaper_list: (array zero-terminated=1):
- *
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
  *
  *
+ * Constructs a shaping plan for a combination of @face, @user_features, @props,
+ * and @shaper_list.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The shaping plan
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -189,6 +197,24 @@ hb_shape_plan_create (hb_face_t                     *face,
 				shaper_list);
 				shaper_list);
 }
 }
 
 
+/**
+ * hb_shape_plan_create2: (Xconstructor)
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @coords: (array length=num_coords): The list of variation-space coordinates
+ * @num_coords: The number of variation-space coordinates
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
+ *
+ * The variable-font version of #hb_shape_plan_create. 
+ * Constructs a shaping plan for a combination of @face, @user_features, @props,
+ * and @shaper_list, plus the variation-space coordinates @coords.
+ *
+ * Return value: (transfer full): The shaping plan
+ *
+ * Since: 1.4.0
+ **/
 hb_shape_plan_t *
 hb_shape_plan_t *
 hb_shape_plan_create2 (hb_face_t                     *face,
 hb_shape_plan_create2 (hb_face_t                     *face,
 		       const hb_segment_properties_t *props,
 		       const hb_segment_properties_t *props,
@@ -248,9 +274,9 @@ bail:
 /**
 /**
  * hb_shape_plan_get_empty:
  * hb_shape_plan_get_empty:
  *
  *
+ * Fetches the singleton empty shaping plan.
  *
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The empty shaping plan
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -262,11 +288,11 @@ hb_shape_plan_get_empty ()
 
 
 /**
 /**
  * hb_shape_plan_reference: (skip)
  * hb_shape_plan_reference: (skip)
- * @shape_plan: a shape plan.
+ * @shape_plan: A shaping plan
  *
  *
+ * Increases the reference count on the given shaping plan.
  *
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): @shape_plan
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -278,9 +304,11 @@ hb_shape_plan_reference (hb_shape_plan_t *shape_plan)
 
 
 /**
 /**
  * hb_shape_plan_destroy: (skip)
  * hb_shape_plan_destroy: (skip)
- * @shape_plan: a shape plan.
- *
+ * @shape_plan: A shaping plan
  *
  *
+ * Decreases the reference count on the given shaping plan. When the
+ * reference count reaches zero, the shaping plan is destroyed,
+ * freeing all memory.
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -298,13 +326,13 @@ hb_shape_plan_destroy (hb_shape_plan_t *shape_plan)
 
 
 /**
 /**
  * hb_shape_plan_set_user_data: (skip)
  * hb_shape_plan_set_user_data: (skip)
- * @shape_plan: a shape plan.
- * @key:
- * @data:
- * @destroy:
- * @replace:
- *
+ * @shape_plan: A shaping plan
+ * @key: The user-data key to set
+ * @data: A pointer to the user data
+ * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
  *
+ * Attaches a user-data key/data pair to the given shaping plan. 
  *
  *
  * Return value:
  * Return value:
  *
  *
@@ -322,12 +350,13 @@ hb_shape_plan_set_user_data (hb_shape_plan_t    *shape_plan,
 
 
 /**
 /**
  * hb_shape_plan_get_user_data: (skip)
  * hb_shape_plan_get_user_data: (skip)
- * @shape_plan: a shape plan.
- * @key:
+ * @shape_plan: A shaping plan
+ * @key: The user-data key to query
  *
  *
+ * Fetches the user data associated with the specified key, 
+ * attached to the specified shaping plan.
  *
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -340,11 +369,11 @@ hb_shape_plan_get_user_data (hb_shape_plan_t    *shape_plan,
 
 
 /**
 /**
  * hb_shape_plan_get_shaper:
  * hb_shape_plan_get_shaper:
- * @shape_plan: a shape plan.
- *
+ * @shape_plan: A shaping plan
  *
  *
+ * Fetches the shaper from a given shaping plan.
  *
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): The shaper
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -355,26 +384,12 @@ hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
 }
 }
 
 
 
 
-/**
- * hb_shape_plan_execute:
- * @shape_plan: a shape plan.
- * @font: a font.
- * @buffer: a buffer.
- * @features: (array length=num_features):
- * @num_features:
- *
- *
- *
- * Return value:
- *
- * Since: 0.9.7
- **/
-hb_bool_t
-hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
-		       hb_font_t          *font,
-		       hb_buffer_t        *buffer,
-		       const hb_feature_t *features,
-		       unsigned int        num_features)
+static bool
+_hb_shape_plan_execute_internal (hb_shape_plan_t    *shape_plan,
+				 hb_font_t          *font,
+				 hb_buffer_t        *buffer,
+				 const hb_feature_t *features,
+				 unsigned int        num_features)
 {
 {
   DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
   DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
 		  "num_features=%d shaper_func=%p, shaper_name=%s",
 		  "num_features=%d shaper_func=%p, shaper_name=%s",
@@ -386,7 +401,8 @@ hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
     return true;
     return true;
 
 
   assert (!hb_object_is_immutable (buffer));
   assert (!hb_object_is_immutable (buffer));
-  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE);
+
+  buffer->assert_unicode ();
 
 
   if (unlikely (hb_object_is_inert (shape_plan)))
   if (unlikely (hb_object_is_inert (shape_plan)))
     return false;
     return false;
@@ -412,6 +428,36 @@ hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
 
 
   return false;
   return false;
 }
 }
+/**
+ * hb_shape_plan_execute:
+ * @shape_plan: A shaping plan
+ * @font: The #hb_font_t to use
+ * @buffer: The #hb_buffer_t to work upon
+ * @features: (array length=num_features): Features to enable
+ * @num_features: The number of features to enable
+ *
+ * Executes the given shaping plan on the specified buffer, using
+ * the given @font and @features.
+ *
+ * Return value: 
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
+		       hb_font_t          *font,
+		       hb_buffer_t        *buffer,
+		       const hb_feature_t *features,
+		       unsigned int        num_features)
+{
+  bool ret = _hb_shape_plan_execute_internal (shape_plan, font, buffer,
+					      features, num_features);
+
+  if (ret && buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE)
+    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+
+  return ret;
+}
 
 
 
 
 /*
 /*
@@ -420,15 +466,16 @@ hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
 
 
 /**
 /**
  * hb_shape_plan_create_cached:
  * hb_shape_plan_create_cached:
- * @face:
- * @props:
- * @user_features: (array length=num_user_features):
- * @num_user_features:
- * @shaper_list: (array zero-terminated=1):
- *
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
  *
  *
+ * Creates a cached shaping plan suitable for reuse, for a combination
+ * of @face, @user_features, @props, and @shaper_list.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The shaping plan
  *
  *
  * Since: 0.9.7
  * Since: 0.9.7
  **/
  **/
@@ -445,6 +492,25 @@ hb_shape_plan_create_cached (hb_face_t                     *face,
 				       shaper_list);
 				       shaper_list);
 }
 }
 
 
+/**
+ * hb_shape_plan_create_cached2:
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @coords: (array length=num_coords): The list of variation-space coordinates
+ * @num_coords: The number of variation-space coordinates
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
+ *
+ * The variable-font version of #hb_shape_plan_create_cached. 
+ * Creates a cached shaping plan suitable for reuse, for a combination
+ * of @face, @user_features, @props, and @shaper_list, plus the
+ * variation-space coordinates @coords.
+ *
+ * Return value: (transfer full): The shaping plan
+ *
+ * Since: 1.4.0
+ **/
 hb_shape_plan_t *
 hb_shape_plan_t *
 hb_shape_plan_create_cached2 (hb_face_t                     *face,
 hb_shape_plan_create_cached2 (hb_face_t                     *face,
 			      const hb_segment_properties_t *props,
 			      const hb_segment_properties_t *props,

+ 14 - 0
thirdparty/harfbuzz/src/hb-shape-plan.h

@@ -36,6 +36,20 @@
 
 
 HB_BEGIN_DECLS
 HB_BEGIN_DECLS
 
 
+/**
+ * hb_shape_plan_t:
+ *
+ * Data type for holding a shaping plan. 
+ *
+ * Shape plans contain information about how HarfBuzz will shape a
+ * particular text segment, based on the segment's properties and the
+ * capabilities in the font face in use.
+ *
+ * Shape plans can be queried about how shaping will perform, given a set
+ * of specific input parameters (script, language, direction, features,
+ * etc.).
+ *
+ **/
 typedef struct hb_shape_plan_t hb_shape_plan_t;
 typedef struct hb_shape_plan_t hb_shape_plan_t;
 
 
 HB_EXTERN hb_shape_plan_t *
 HB_EXTERN hb_shape_plan_t *

+ 0 - 4
thirdparty/harfbuzz/src/hb-shape.cc

@@ -132,8 +132,6 @@ hb_shape_full (hb_font_t          *font,
 	       unsigned int        num_features,
 	       unsigned int        num_features,
 	       const char * const *shaper_list)
 	       const char * const *shaper_list)
 {
 {
-  if (unlikely (hb_object_is_immutable (buffer))) return false;
-
   hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached2 (font->face, &buffer->props,
   hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached2 (font->face, &buffer->props,
 							      features, num_features,
 							      features, num_features,
 							      font->coords, font->num_coords,
 							      font->coords, font->num_coords,
@@ -141,8 +139,6 @@ hb_shape_full (hb_font_t          *font,
   hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
   hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
   hb_shape_plan_destroy (shape_plan);
   hb_shape_plan_destroy (shape_plan);
 
 
-  if (res)
-    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
   return res;
   return res;
 }
 }
 
 

+ 76 - 47
thirdparty/harfbuzz/src/hb-unicode.cc

@@ -40,11 +40,16 @@
  * @include: hb.h
  * @include: hb.h
  *
  *
  * Unicode functions are used to access Unicode character properties.
  * Unicode functions are used to access Unicode character properties.
- * Client can pass its own Unicode functions to HarfBuzz, or access
- * the built-in Unicode functions that come with HarfBuzz.
+ * With these functions, client programs can query various properties from
+ * the Unicode Character Database for any code point, such as General
+ * Category (gc), Script (sc), Canonical Combining Class (ccc), etc.
  *
  *
- * With the Unicode functions, one can query variour Unicode character
- * properties, such as General Category, Script, Combining Class, etc.
+ * Client programs can optionally pass in their own Unicode functions
+ * that implement the same queries. The set of functions available is
+ * defined by the virtual methods in #hb_unicode_funcs_t.
+ *
+ * HarfBuzz provides built-in default functions for each method in
+ * #hb_unicode_funcs_t.
  **/
  **/
 
 
 
 
@@ -133,6 +138,16 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs     HB_UNUSED
 #include "hb-icu.h"
 #include "hb-icu.h"
 #endif
 #endif
 
 
+/**
+ * hb_unicode_funcs_get_default:
+ *
+ * Fetches a pointer to the default Unicode-functions structure that is used
+ * when no functions are explicitly set on #hb_buffer_t.
+ *
+ * Return value: (transfer none): a pointer to the #hb_unicode_funcs_t Unicode-functions structure
+ *
+ * Since: 0.9.2
+ **/
 hb_unicode_funcs_t *
 hb_unicode_funcs_t *
 hb_unicode_funcs_get_default ()
 hb_unicode_funcs_get_default ()
 {
 {
@@ -155,11 +170,11 @@ hb_unicode_funcs_get_default ()
 
 
 /**
 /**
  * hb_unicode_funcs_create: (Xconstructor)
  * hb_unicode_funcs_create: (Xconstructor)
- * @parent: (nullable):
- *
+ * @parent: (nullable): Parent Unicode-functions structure
  *
  *
+ * Creates a new #hb_unicode_funcs_t structure of Unicode functions.
  *
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The Unicode-functions structure
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -203,9 +218,9 @@ DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
 /**
 /**
  * hb_unicode_funcs_get_empty:
  * hb_unicode_funcs_get_empty:
  *
  *
+ * Fetches the singleton empty Unicode-functions structure.
  *
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The empty Unicode-functions structure
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -217,11 +232,11 @@ hb_unicode_funcs_get_empty ()
 
 
 /**
 /**
  * hb_unicode_funcs_reference: (skip)
  * hb_unicode_funcs_reference: (skip)
- * @ufuncs: Unicode functions.
+ * @ufuncs: The Unicode-functions structure
  *
  *
+ * Increases the reference count on a Unicode-functions structure.
  *
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The Unicode-functions structure
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -233,9 +248,11 @@ hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
 
 
 /**
 /**
  * hb_unicode_funcs_destroy: (skip)
  * hb_unicode_funcs_destroy: (skip)
- * @ufuncs: Unicode functions.
- *
+ * @ufuncs: The Unicode-functions structure
  *
  *
+ * Decreases the reference count on a Unicode-functions structure. When
+ * the reference count reaches zero, the Unicode-functions structure is
+ * destroyed, freeing all memory.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -256,15 +273,15 @@ hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
 
 
 /**
 /**
  * hb_unicode_funcs_set_user_data: (skip)
  * hb_unicode_funcs_set_user_data: (skip)
- * @ufuncs: Unicode functions.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @ufuncs: The Unicode-functions structure
+ * @key: The user-data key
+ * @data: A pointer to the user data
+ * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
  *
+ * Attaches a user-data key/data pair to the specified Unicode-functions structure. 
  *
  *
- *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -280,12 +297,13 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_funcs_get_user_data: (skip)
  * hb_unicode_funcs_get_user_data: (skip)
- * @ufuncs: Unicode functions.
- * @key:
- *
+ * @ufuncs: The Unicode-functions structure
+ * @key: The user-data key to query
  *
  *
+ * Fetches the user-data associated with the specified key,
+ * attached to the specified Unicode-functions structure.
  *
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -299,9 +317,10 @@ hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_funcs_make_immutable:
  * hb_unicode_funcs_make_immutable:
- * @ufuncs: Unicode functions.
- *
+ * @ufuncs: The Unicode-functions structure
  *
  *
+ * Makes the specified Unicode-functions structure
+ * immutable.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -316,11 +335,12 @@ hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
 
 
 /**
 /**
  * hb_unicode_funcs_is_immutable:
  * hb_unicode_funcs_is_immutable:
- * @ufuncs: Unicode functions.
- *
+ * @ufuncs: The Unicode-functions structure
  *
  *
+ * Tests whether the specified Unicode-functions structure
+ * is immutable.
  *
  *
- * Return value:
+ * Return value: %true if @ufuncs is immutable, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -332,11 +352,12 @@ hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
 
 
 /**
 /**
  * hb_unicode_funcs_get_parent:
  * hb_unicode_funcs_get_parent:
- * @ufuncs: Unicode functions.
+ * @ufuncs: The Unicode-functions structure
  *
  *
+ * Fetches the parent of the Unicode-functions structure
+ * @ufuncs.
  *
  *
- *
- * Return value:
+ * Return value: The parent Unicode-functions structure
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -389,14 +410,18 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
 
 
 /**
 /**
  * hb_unicode_compose:
  * hb_unicode_compose:
- * @ufuncs: Unicode functions.
- * @a:
- * @b:
- * @ab: (out):
+ * @ufuncs: The Unicode-functions structure
+ * @a: The first Unicode code point to compose
+ * @b: The second Unicode code point to compose
+ * @ab: (out): The composition of @a, @b
  *
  *
+ * Fetches the composition of a sequence of two Unicode
+ * code points.
  *
  *
+ * Calls the composition function of the specified
+ * Unicode-functions structure @ufuncs.
  *
  *
- * Return value:
+ * Return value: %true if @a and @b composed, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -411,14 +436,17 @@ hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_decompose:
  * hb_unicode_decompose:
- * @ufuncs: Unicode functions.
- * @ab:
- * @a: (out):
- * @b: (out):
+ * @ufuncs: The Unicode-functions structure
+ * @ab: Unicode code point to decompose
+ * @a: (out): The first code point of the decomposition of @ab
+ * @b: (out): The second code point of the decomposition of @ab
  *
  *
+ * Fetches the decomposition of a Unicode code point. 
  *
  *
+ * Calls the decomposition function of the specified
+ * Unicode-functions structure @ufuncs.
  *
  *
- * Return value:
+ * Return value: %true if @ab was decomposed, false otherwise
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -434,11 +462,12 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
 #ifndef HB_DISABLE_DEPRECATED
 #ifndef HB_DISABLE_DEPRECATED
 /**
 /**
  * hb_unicode_decompose_compatibility:
  * hb_unicode_decompose_compatibility:
- * @ufuncs: Unicode functions.
- * @u:
- * @decomposed: (out):
- *
+ * @ufuncs: The Unicode-functions structure
+ * @u: Code point to decompose
+ * @decomposed: (out): Compatibility decomposition of @u
  *
  *
+ * Fetches the compatibility decomposition of a Unicode
+ * code point. Deprecated.
  *
  *
  * Return value:
  * Return value:
  *
  *

+ 304 - 39
thirdparty/harfbuzz/src/hb-unicode.h

@@ -48,7 +48,42 @@ HB_BEGIN_DECLS
 #define HB_UNICODE_MAX 0x10FFFFu
 #define HB_UNICODE_MAX 0x10FFFFu
 
 
 
 
-/* hb_unicode_general_category_t */
+/**
+ * hb_unicode_general_category_t:
+ * @HB_UNICODE_GENERAL_CATEGORY_CONTROL:              [Cc]
+ * @HB_UNICODE_GENERAL_CATEGORY_FORMAT:		      [Cf]
+ * @HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED:	      [Cn]
+ * @HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE:	      [Co]
+ * @HB_UNICODE_GENERAL_CATEGORY_SURROGATE:	      [Cs]
+ * @HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER:     [Ll]
+ * @HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER:      [Lm]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER:	      [Lo]
+ * @HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER:     [Lt]
+ * @HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER:     [Lu]
+ * @HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK:	      [Mc]
+ * @HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK:	      [Me]
+ * @HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK:     [Mn]
+ * @HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER:	      [Nd]
+ * @HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER:	      [Nl]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER:	      [No]
+ * @HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION:  [Pc]
+ * @HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION:     [Pd]
+ * @HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION:    [Pe]
+ * @HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION:    [Pf]
+ * @HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION:  [Pi]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION:    [Po]
+ * @HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION:     [Ps]
+ * @HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL:      [Sc]
+ * @HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL:      [Sk]
+ * @HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL:	      [Sm]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL:	      [So]
+ * @HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR:	      [Zl]
+ * @HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR:  [Zp]
+ * @HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR:      [Zs]
+ *
+ * Data type for the "General_Category" (gc) property from
+ * the Unicode Character Database.
+ **/
 
 
 /* Unicode Character Database property: General_Category (gc) */
 /* Unicode Character Database property: General_Category (gc) */
 typedef enum
 typedef enum
@@ -85,13 +120,74 @@ typedef enum
   HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR		/* Zs */
   HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR		/* Zs */
 } hb_unicode_general_category_t;
 } hb_unicode_general_category_t;
 
 
-/* hb_unicode_combining_class_t */
-
-/* Note: newer versions of Unicode may add new values.  Clients should be ready to handle
- * any value in the 0..254 range being returned from hb_unicode_combining_class().
- */
-
-/* Unicode Character Database property: Canonical_Combining_Class (ccc) */
+/**
+ * hb_unicode_combining_class_t:
+ * @HB_UNICODE_COMBINING_CLASS_NOT_REORDERED: Spacing and enclosing marks; also many vowel and consonant signs, even if nonspacing
+ * @HB_UNICODE_COMBINING_CLASS_OVERLAY: Marks which overlay a base letter or symbol
+ * @HB_UNICODE_COMBINING_CLASS_NUKTA: Diacritic nukta marks in Brahmi-derived scripts
+ * @HB_UNICODE_COMBINING_CLASS_KANA_VOICING: Hiragana/Katakana voicing marks
+ * @HB_UNICODE_COMBINING_CLASS_VIRAMA: Viramas
+ * @HB_UNICODE_COMBINING_CLASS_CCC10: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC11: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC12: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC13: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC14: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC15: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC16: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC17: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC18: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC19: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC20: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC21: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC22: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC23: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC24: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC25: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC26: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC27: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC28: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC29: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC30: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC31: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC32: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC33: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC34: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC35: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC36: [Syriac]
+ * @HB_UNICODE_COMBINING_CLASS_CCC84: [Telugu]
+ * @HB_UNICODE_COMBINING_CLASS_CCC91: [Telugu]
+ * @HB_UNICODE_COMBINING_CLASS_CCC103: [Thai]
+ * @HB_UNICODE_COMBINING_CLASS_CCC107: [Thai]
+ * @HB_UNICODE_COMBINING_CLASS_CCC118: [Lao]
+ * @HB_UNICODE_COMBINING_CLASS_CCC122: [Lao]
+ * @HB_UNICODE_COMBINING_CLASS_CCC129: [Tibetan]
+ * @HB_UNICODE_COMBINING_CLASS_CCC130: [Tibetan]
+ * @HB_UNICODE_COMBINING_CLASS_CCC133: [Tibetan]
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: Marks attached at the bottom left
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: Marks attached directly below
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: Marks attached directly above
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: Marks attached at the top right
+ * @HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: Distinct marks at the bottom left
+ * @HB_UNICODE_COMBINING_CLASS_BELOW: Distinct marks directly below
+ * @HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: Distinct marks at the bottom right
+ * @HB_UNICODE_COMBINING_CLASS_LEFT: Distinct marks to the left
+ * @HB_UNICODE_COMBINING_CLASS_RIGHT: Distinct marks to the right
+ * @HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: Distinct marks at the top left
+ * @HB_UNICODE_COMBINING_CLASS_ABOVE: Distinct marks directly above
+ * @HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: Distinct marks at the top right
+ * @HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: Distinct marks subtending two bases
+ * @HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: Distinct marks extending above two bases
+ * @HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT: Greek iota subscript only
+ * @HB_UNICODE_COMBINING_CLASS_INVALID: Invalid combining class
+ *
+ * Data type for the Canonical_Combining_Class (ccc) property
+ * from the Unicode Character Database.
+ *
+ * <note>Note: newer versions of Unicode may add new values.
+ * Client programs should be ready to handle any value in the 0..254 range
+ * being returned from hb_unicode_combining_class().</note>
+ *
+ **/
 typedef enum
 typedef enum
 {
 {
   HB_UNICODE_COMBINING_CLASS_NOT_REORDERED	= 0,
   HB_UNICODE_COMBINING_CLASS_NOT_REORDERED	= 0,
@@ -176,6 +272,18 @@ typedef enum
  * hb_unicode_funcs_t
  * hb_unicode_funcs_t
  */
  */
 
 
+/**
+ * hb_unicode_funcs_t:
+ *
+ * Data type containing a set of virtual methods used for
+ * accessing various Unicode character properties.
+ *
+ * HarfBuzz provides a default function for each of the
+ * methods in #hb_unicode_funcs_t. Client programs can implement
+ * their own replacements for the individual Unicode functions, as
+ * needed, and replace the default by calling the setter for a
+ * method.
+ **/
 typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
 typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
 
 
 
 
@@ -227,40 +335,141 @@ hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
 
 
 /* typedefs */
 /* typedefs */
 
 
+/**
+ * hb_unicode_combining_class_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the Canonical Combining Class (ccc)
+ * property for a specified Unicode code point. 
+ *
+ * Return value: The #hb_unicode_combining_class_t of @unicode
+ * 
+ **/
 typedef hb_unicode_combining_class_t	(*hb_unicode_combining_class_func_t)	(hb_unicode_funcs_t *ufuncs,
 typedef hb_unicode_combining_class_t	(*hb_unicode_combining_class_func_t)	(hb_unicode_funcs_t *ufuncs,
 										 hb_codepoint_t      unicode,
 										 hb_codepoint_t      unicode,
 										 void               *user_data);
 										 void               *user_data);
+
+/**
+ * hb_unicode_general_category_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the General Category property for
+ * a specified Unicode code point.
+ * 
+ * Return value: The #hb_unicode_general_category_t of @unicode
+ *
+ **/
 typedef hb_unicode_general_category_t	(*hb_unicode_general_category_func_t)	(hb_unicode_funcs_t *ufuncs,
 typedef hb_unicode_general_category_t	(*hb_unicode_general_category_func_t)	(hb_unicode_funcs_t *ufuncs,
 										 hb_codepoint_t      unicode,
 										 hb_codepoint_t      unicode,
 										 void               *user_data);
 										 void               *user_data);
+
+/**
+ * hb_unicode_mirroring_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the Bi-Directional Mirroring Glyph
+ * code point for a specified Unicode code point.
+ *
+ * <note>Note: If a code point does not have a specified
+ * Bi-Directional Mirroring Glyph defined, the method should
+ * return the original code point.</note>
+ * 
+ * Return value: The #hb_codepoint_t of the Mirroring Glyph for @unicode
+ *
+ **/
 typedef hb_codepoint_t			(*hb_unicode_mirroring_func_t)		(hb_unicode_funcs_t *ufuncs,
 typedef hb_codepoint_t			(*hb_unicode_mirroring_func_t)		(hb_unicode_funcs_t *ufuncs,
 										 hb_codepoint_t      unicode,
 										 hb_codepoint_t      unicode,
 										 void               *user_data);
 										 void               *user_data);
+
+/**
+ * hb_unicode_script_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the Script property for a 
+ * specified Unicode code point.
+ *
+ * Return value: The #hb_script_t of @unicode
+ * 
+ **/
 typedef hb_script_t			(*hb_unicode_script_func_t)		(hb_unicode_funcs_t *ufuncs,
 typedef hb_script_t			(*hb_unicode_script_func_t)		(hb_unicode_funcs_t *ufuncs,
 										 hb_codepoint_t      unicode,
 										 hb_codepoint_t      unicode,
 										 void               *user_data);
 										 void               *user_data);
 
 
+/**
+ * hb_unicode_compose_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @a: The first code point to compose
+ * @b: The second code point to compose
+ * @ab: (out): The composed code point
+ * @user_data: user data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should compose a sequence of two input Unicode code
+ * points by canonical equivalence, returning the composed code
+ * point in a #hb_codepoint_t output parameter (if successful).
+ * The method must return an #hb_bool_t indicating the success
+ * of the composition.
+ * 
+ * Return value: True is @a,@b composed, false otherwise
+ *
+ **/
 typedef hb_bool_t			(*hb_unicode_compose_func_t)		(hb_unicode_funcs_t *ufuncs,
 typedef hb_bool_t			(*hb_unicode_compose_func_t)		(hb_unicode_funcs_t *ufuncs,
 										 hb_codepoint_t      a,
 										 hb_codepoint_t      a,
 										 hb_codepoint_t      b,
 										 hb_codepoint_t      b,
 										 hb_codepoint_t     *ab,
 										 hb_codepoint_t     *ab,
 										 void               *user_data);
 										 void               *user_data);
+
+/**
+ * hb_unicode_decompose_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @ab: The code point to decompose
+ * @a: (out): The first decomposed code point
+ * @b: (out): The second decomposed code point
+ * @user_data: user data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should decompose an input Unicode code point,
+ * returning the two decomposed code points in #hb_codepoint_t
+ * output parameters (if successful). The method must return an
+ * #hb_bool_t indicating the success of the composition.
+ * 
+ * Return value: True if @ab decomposed, false otherwise
+ *
+ **/
 typedef hb_bool_t			(*hb_unicode_decompose_func_t)		(hb_unicode_funcs_t *ufuncs,
 typedef hb_bool_t			(*hb_unicode_decompose_func_t)		(hb_unicode_funcs_t *ufuncs,
 										 hb_codepoint_t      ab,
 										 hb_codepoint_t      ab,
 										 hb_codepoint_t     *a,
 										 hb_codepoint_t     *a,
 										 hb_codepoint_t     *b,
 										 hb_codepoint_t     *b,
 										 void               *user_data);
 										 void               *user_data);
 
 
-/* setters */
+/* func setters */
 
 
 /**
 /**
  * hb_unicode_funcs_set_combining_class_func:
  * hb_unicode_funcs_set_combining_class_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_unicode_combining_class_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -271,12 +480,12 @@ hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_funcs_set_general_category_func:
  * hb_unicode_funcs_set_general_category_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_unicode_general_category_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -287,12 +496,12 @@ hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_funcs_set_mirroring_func:
  * hb_unicode_funcs_set_mirroring_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_unicode_mirroring_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -303,12 +512,12 @@ hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_funcs_set_script_func:
  * hb_unicode_funcs_set_script_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_unicode_script_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -319,12 +528,12 @@ hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_funcs_set_compose_func:
  * hb_unicode_funcs_set_compose_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_unicode_compose_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -335,12 +544,12 @@ hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_funcs_set_decompose_func:
  * hb_unicode_funcs_set_decompose_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (optional): The function to call when @user_data is not needed anymore
  *
  *
+ * Sets the implementation function for #hb_unicode_decompose_func_t.
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -353,6 +562,13 @@ hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_combining_class:
  * hb_unicode_combining_class:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the Canonical Combining Class (ccc) property
+ * of code point @unicode.
+ *
+ * Return value: The #hb_unicode_combining_class_t of @unicode
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -362,6 +578,13 @@ hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_general_category:
  * hb_unicode_general_category:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the General Category (gc) property
+ * of code point @unicode.
+ *
+ * Return value: The #hb_unicode_general_category_t of @unicode
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -371,6 +594,13 @@ hb_unicode_general_category (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_mirroring:
  * hb_unicode_mirroring:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the Bi-directional Mirroring Glyph code
+ * point defined for code point @unicode.
+ *
+ * Return value: The #hb_codepoint_t of the Mirroring Glyph for @unicode
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -380,6 +610,13 @@ hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs,
 
 
 /**
 /**
  * hb_unicode_script:
  * hb_unicode_script:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the #hb_script_t script to which code
+ * point @unicode belongs.
+ *
+ * Return value: The #hb_script_t of @unicode
  *
  *
  * Since: 0.9.2
  * Since: 0.9.2
  **/
  **/
@@ -387,12 +624,40 @@ HB_EXTERN hb_script_t
 hb_unicode_script (hb_unicode_funcs_t *ufuncs,
 hb_unicode_script (hb_unicode_funcs_t *ufuncs,
 		   hb_codepoint_t unicode);
 		   hb_codepoint_t unicode);
 
 
+/**
+ * hb_unicode_compose:
+ * @ufuncs: The Unicode-functions structure
+ * @a: The first code point to compose
+ * @b: The second code point to compose
+ * @ab: (out): The composed code point
+ *
+ * Composes the code point sequence @a,@b by canonical equivalence into
+ * code point @ab.
+ *
+ * Return value: True is @a,@b composed, false otherwise
+ *
+ * Since: 0.9.2
+ **/
 HB_EXTERN hb_bool_t
 HB_EXTERN hb_bool_t
 hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
 hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
 		    hb_codepoint_t      a,
 		    hb_codepoint_t      a,
 		    hb_codepoint_t      b,
 		    hb_codepoint_t      b,
 		    hb_codepoint_t     *ab);
 		    hb_codepoint_t     *ab);
 
 
+/**
+ * hb_unicode_decompose:
+ * @ufuncs: The Unicode-functions structure
+ * @ab: The code point to decompose
+ * @a: (out): The first decomposed code point
+ * @b: (out): The second decomposed code point
+ *
+ * Decomposes code point @ab by canonical equivalence, into code points
+ * @a and @b.
+ *
+ * Return value: True if @ab decomposed, false otherwise
+ *
+ * Since: 0.9.2
+ **/
 HB_EXTERN hb_bool_t
 HB_EXTERN hb_bool_t
 hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
 hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
 		      hb_codepoint_t      ab,
 		      hb_codepoint_t      ab,

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

@@ -38,9 +38,9 @@ HB_BEGIN_DECLS
 
 
 #define HB_VERSION_MAJOR 2
 #define HB_VERSION_MAJOR 2
 #define HB_VERSION_MINOR 7
 #define HB_VERSION_MINOR 7
-#define HB_VERSION_MICRO 2
+#define HB_VERSION_MICRO 4
 
 
-#define HB_VERSION_STRING "2.7.2"
+#define HB_VERSION_STRING "2.7.4"
 
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
 #define HB_VERSION_ATLEAST(major,minor,micro) \
 	((major)*10000+(minor)*100+(micro) <= \
 	((major)*10000+(minor)*100+(micro) <= \

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