diff --git a/.circleci/config.yml b/.circleci/config.yml index 320813ad3..e6a5a1d14 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,28 +22,28 @@ jobs: - run: make -j4 - run: make check || .ci/fail.sh - # macos-llvm-gcc-4.2: - # macos: - # xcode: "8.3.3" - # steps: - # - checkout - # - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel freetype glib cairo - # - run: wget https://packages.macports.org/llvm-gcc42/llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 - # - run: CC=$PWD/opt/local/bin/llvm-gcc-4.2 CXX=$PWD/opt/local/bin/llvm-g++-4.2 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo - # # Ignoring assembler complains, https://stackoverflow.com/a/39867021 - # - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*' - # - run: make check || .ci/fail.sh - - # macos-notest-apple-gcc-i686-4.2: - # macos: - # xcode: "8.3.3" - # steps: - # - checkout - # - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel - # - run: wget https://packages.macports.org/apple-gcc42/apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2 - # - run: CPP=$PWD/opt/local/bin/i686-apple-darwin15-cpp-apple-4.2.1 CC=$PWD/opt/local/bin/i686-apple-darwin15-gcc-apple-4.2.1 CXX=$PWD/opt/local/bin/i686-apple-darwin15-g++-apple-4.2.1 ./autogen.sh - # # Ignoring assembler complains, https://stackoverflow.com/a/39867021 - # - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*' + macos-llvm-gcc-4.2: + macos: + xcode: "8.3.3" + steps: + - checkout + - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel freetype glib cairo + - run: wget https://packages.macports.org/llvm-gcc42/llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 + - run: CC=$PWD/opt/local/bin/llvm-gcc-4.2 CXX=$PWD/opt/local/bin/llvm-g++-4.2 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo + # Ignoring assembler complains, https://stackoverflow.com/a/39867021 + - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*' + - run: make check || .ci/fail.sh + + macos-notest-apple-gcc-i686-4.2: + macos: + xcode: "8.3.3" + steps: + - checkout + - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel + - run: wget https://packages.macports.org/apple-gcc42/apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2 + - run: CPP=$PWD/opt/local/bin/i686-apple-darwin15-cpp-apple-4.2.1 CC=$PWD/opt/local/bin/i686-apple-darwin15-gcc-apple-4.2.1 CXX=$PWD/opt/local/bin/i686-apple-darwin15-g++-apple-4.2.1 ./autogen.sh + # Ignoring assembler complains, https://stackoverflow.com/a/39867021 + - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*' macos-notest-ios: macos: @@ -321,8 +321,8 @@ workflows: # macOS - macos-10.12.6-aat-fonts - macos-10.13.6-aat-fonts - #- macos-llvm-gcc-4.2 - #- macos-notest-apple-gcc-i686-4.2 + - macos-llvm-gcc-4.2 + - macos-notest-apple-gcc-i686-4.2 - macos-notest-ios # both autotools and cmake diff --git a/NEWS b/NEWS index 9bfe99a2d..ff4f6e29d 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,38 @@ +Overview of changes leading to 2.2.0 +Thursday, November 29, 2018 +==================================== +- Misc shaping bug fixes. +- Add font variations named-instance API. +- Deprecate font variations axis enumeration API and add replacement. +- AAT shaping improvements: + o Fixed 'kern' table Format 2 implementation. + o Implement 'feat' table API for feature detection. + o Blacklist 'GSUB' table of fonts from 'MUTF' foundry that also have 'morx'. + +New API: ++hb_aat_layout_feature_type_t ++hb_aat_layout_feature_selector_t ++hb_aat_layout_get_feature_types() ++hb_aat_layout_feature_type_get_name_id ++hb_aat_layout_feature_selector_info_t ++HB_AAT_LAYOUT_NO_SELECTOR_INDEX ++hb_aat_layout_feature_type_get_selector_infos() ++hb_ot_var_axis_flags_t ++hb_ot_var_axis_info_t ++hb_ot_var_get_axis_infos() ++hb_ot_var_find_axis_info() ++hb_ot_var_get_named_instance_count() ++hb_ot_var_named_instance_get_subfamily_name_id() ++hb_ot_var_named_instance_get_postscript_name_id() ++hb_ot_var_named_instance_get_design_coords() + +Deprecated API: ++HB_OT_VAR_NO_AXIS_INDEX ++hb_ot_var_axis_t ++hb_ot_var_get_axes() ++hb_ot_var_find_axis() + + Overview of changes leading to 2.1.3 Friday, November 16, 2018 ==================================== diff --git a/configure.ac b/configure.ac index e9db42a78..064946438 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.1.3], + [2.2.0], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/Makefile.sources b/src/Makefile.sources index b1a3d0a29..40f1d7afd 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -196,6 +196,7 @@ HB_OT_headers = \ hb-aat-layout.h \ hb-ot.h \ hb-ot-color.h \ + hb-ot-deprecated.h \ hb-ot-font.h \ hb-ot-layout.h \ hb-ot-math.h \ diff --git a/src/hb-aat-layout-ankr-table.hh b/src/hb-aat-layout-ankr-table.hh index b793245a0..763bbedde 100644 --- a/src/hb-aat-layout-ankr-table.hh +++ b/src/hb-aat-layout-ankr-table.hh @@ -58,7 +58,7 @@ typedef LArrayOf GlyphAnchors; struct ankr { - static const hb_tag_t tableTag = HB_AAT_TAG_ankr; + enum { tableTag = HB_AAT_TAG_ankr }; inline const Anchor &get_anchor (hb_codepoint_t glyph_id, unsigned int i, diff --git a/src/hb-aat-layout-bsln-table.hh b/src/hb-aat-layout-bsln-table.hh index b86408626..d2ea71d1a 100644 --- a/src/hb-aat-layout-bsln-table.hh +++ b/src/hb-aat-layout-bsln-table.hh @@ -116,7 +116,7 @@ struct BaselineTableFormat3Part struct bsln { - static const hb_tag_t tableTag = HB_AAT_TAG_bsln; + enum { tableTag = HB_AAT_TAG_bsln }; inline bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index c0b0e3751..588dbdf2a 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -675,7 +675,7 @@ struct ClassTable struct ObsoleteTypes { - static const bool extended = false; + enum { extended = false }; typedef HBUINT16 HBUINT; typedef HBUINT8 HBUSHORT; typedef ClassTable ClassTypeNarrow; @@ -705,7 +705,7 @@ struct ObsoleteTypes }; struct ExtendedTypes { - static const bool extended = true; + enum { extended = true }; typedef HBUINT32 HBUINT; typedef HBUINT16 HBUSHORT; typedef Lookup ClassTypeNarrow; diff --git a/src/hb-aat-layout-feat-table.hh b/src/hb-aat-layout-feat-table.hh index 4e63ec8e8..1565d4325 100644 --- a/src/hb-aat-layout-feat-table.hh +++ b/src/hb-aat-layout-feat-table.hh @@ -155,7 +155,7 @@ struct FeatureName struct feat { - static const hb_tag_t tableTag = HB_AAT_TAG_feat; + enum { tableTag = HB_AAT_TAG_feat }; inline bool has_data (void) const { return version.to_int (); } diff --git a/src/hb-aat-layout-just-table.hh b/src/hb-aat-layout-just-table.hh index 92ca6603e..295205fde 100644 --- a/src/hb-aat-layout-just-table.hh +++ b/src/hb-aat-layout-just-table.hh @@ -382,7 +382,7 @@ struct JustificationHeader struct just { - static const hb_tag_t tableTag = HB_AAT_TAG_just; + enum { tableTag = HB_AAT_TAG_just }; inline bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index 7caf45d5d..b25feea2d 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -211,7 +211,7 @@ struct KerxSubTableFormat1 struct driver_context_t { - static const bool in_place = true; + enum { in_place = true }; enum { DontAdvance = Format1EntryT::DontAdvance, @@ -472,7 +472,7 @@ struct KerxSubTableFormat4 struct driver_context_t { - static const bool in_place = true; + enum { in_place = true }; enum Flags { Mark = 0x8000, /* If set, remember this glyph as the marked glyph. */ @@ -947,7 +947,7 @@ struct KerxTable { TRACE_SANITIZE (this); if (unlikely (!thiz()->version.sanitize (c) || - thiz()->version < T::minVersion || + (unsigned) thiz()->version < (unsigned) T::minVersion || !thiz()->tableCount.sanitize (c))) return_trace (false); @@ -982,8 +982,8 @@ struct kerx : KerxTable { friend struct KerxTable; - static const hb_tag_t tableTag = HB_AAT_TAG_kerx; - static const uint16_t minVersion = 2; + enum { tableTag = HB_AAT_TAG_kerx }; + enum { minVersion = 2u }; typedef KerxSubTableHeader SubTableHeader; typedef SubTableHeader::Types Types; diff --git a/src/hb-aat-layout-lcar-table.hh b/src/hb-aat-layout-lcar-table.hh index 40d34f59b..9bfb68492 100644 --- a/src/hb-aat-layout-lcar-table.hh +++ b/src/hb-aat-layout-lcar-table.hh @@ -40,7 +40,7 @@ typedef ArrayOf LigCaretClassEntry; struct lcar { - static const hb_tag_t tableTag = HB_AAT_TAG_lcar; + enum { tableTag = HB_AAT_TAG_lcar }; inline unsigned int get_lig_carets (hb_font_t *font, hb_direction_t direction, diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 171ee4a10..78a7b7d7d 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -54,7 +54,7 @@ struct RearrangementSubtable struct driver_context_t { - static const bool in_place = true; + enum { in_place = true }; enum Flags { MarkFirst = 0x8000, /* If set, make the current glyph the first @@ -204,7 +204,7 @@ struct ContextualSubtable struct driver_context_t { - static const bool in_place = true; + enum { in_place = true }; enum Flags { SetMark = 0x8000, /* If set, make the current glyph the marked glyph. */ @@ -249,7 +249,7 @@ struct ContextualSubtable { if (entry->data.markIndex != 0xFFFF) { - const Lookup &lookup = subs[entry->data.markIndex]; + const Lookup &lookup = subs[(unsigned) entry->data.markIndex]; replacement = lookup.get_value (buffer->info[mark].codepoint, driver->num_glyphs); } } @@ -274,7 +274,7 @@ struct ContextualSubtable { if (entry->data.currentIndex != 0xFFFF) { - const Lookup &lookup = subs[entry->data.currentIndex]; + const Lookup &lookup = subs[(unsigned) entry->data.currentIndex]; replacement = lookup.get_value (buffer->info[idx].codepoint, driver->num_glyphs); } } @@ -424,7 +424,7 @@ struct LigatureSubtable struct driver_context_t { - static const bool in_place = false; + enum { in_place = false }; enum { DontAdvance = LigatureEntryT::DontAdvance, @@ -660,7 +660,7 @@ struct InsertionSubtable struct driver_context_t { - static const bool in_place = false; + enum { in_place = false }; enum Flags { SetMark = 0x8000, /* If set, mark the current glyph. */ @@ -1096,7 +1096,7 @@ struct Chain template struct mortmorx { - static const hb_tag_t tableTag = HB_AAT_TAG_morx; + enum { tableTag = HB_AAT_TAG_morx }; inline bool has_data (void) const { return version != 0; } @@ -1158,11 +1158,11 @@ struct mortmorx struct morx : mortmorx { - static const hb_tag_t tableTag = HB_AAT_TAG_morx; + enum { tableTag = HB_AAT_TAG_morx }; }; struct mort : mortmorx { - static const hb_tag_t tableTag = HB_AAT_TAG_mort; + enum { tableTag = HB_AAT_TAG_mort }; }; diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index 5474d1d11..1658e0feb 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -166,7 +166,7 @@ struct TrackData struct trak { - static const hb_tag_t tableTag = HB_AAT_TAG_trak; + enum { tableTag = HB_AAT_TAG_trak }; inline bool has_data (void) const { return version.to_int (); } diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 727da42a8..fae67800c 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -318,7 +318,7 @@ _hb_aat_language_get (hb_face_t *face, * * Return value: Number of all available feature types. * - * Since: REPLACEME + * Since: 2.2.0 */ unsigned int hb_aat_layout_get_feature_types (hb_face_t *face, @@ -336,7 +336,7 @@ hb_aat_layout_get_feature_types (hb_face_t *face, * * Return value: Name ID index * - * Since: REPLACEME + * Since: 2.2.0 */ hb_ot_name_id_t hb_aat_layout_feature_type_get_name_id (hb_face_t *face, @@ -358,7 +358,7 @@ hb_aat_layout_feature_type_get_name_id (hb_face_t *face, * * Return value: Number of all available feature selectors. * - * Since: REPLACEME + * Since: 2.2.0 */ unsigned int hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face, diff --git a/src/hb-aat-layout.h b/src/hb-aat-layout.h index 5912e012b..696e90334 100644 --- a/src/hb-aat-layout.h +++ b/src/hb-aat-layout.h @@ -39,7 +39,7 @@ HB_BEGIN_DECLS * hb_aat_layout_feature_type_t: * * - * Since: REPLACEME + * Since: 2.2.0 */ typedef enum { @@ -92,7 +92,7 @@ typedef enum * hb_aat_layout_feature_selector_t: * * - * Since: REPLACEME + * Since: 2.2.0 */ typedef enum { diff --git a/src/hb-aat-ltag-table.hh b/src/hb-aat-ltag-table.hh index 8a42b3510..c7c4b4614 100644 --- a/src/hb-aat-ltag-table.hh +++ b/src/hb-aat-ltag-table.hh @@ -60,7 +60,7 @@ struct FTStringRange struct ltag { - static const hb_tag_t tableTag = HB_AAT_TAG_ltag; + enum { tableTag = HB_AAT_TAG_ltag }; inline hb_language_t get_language (unsigned int i) const { diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 918f649da..15b8c62d7 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -598,7 +598,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } else { active_feature_t *feature = active_features.find (&event->feature); if (feature) - active_features.remove (feature - active_features); + active_features.remove (feature - active_features.arrayZ ()); } } } diff --git a/src/hb-deprecated.h b/src/hb-deprecated.h index a74431f05..4a5e702ff 100644 --- a/src/hb-deprecated.h +++ b/src/hb-deprecated.h @@ -52,6 +52,7 @@ HB_BEGIN_DECLS #ifndef HB_DISABLE_DEPRECATED + #define HB_SCRIPT_CANADIAN_ABORIGINAL HB_SCRIPT_CANADIAN_SYLLABICS #define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT @@ -217,66 +218,6 @@ hb_font_get_glyph_kerning_for_direction (hb_font_t *font, hb_direction_t direction, hb_position_t *x, hb_position_t *y); -/* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */ -HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t -hb_ot_layout_table_choose_script (hb_face_t *face, - hb_tag_t table_tag, - const hb_tag_t *script_tags, - unsigned int *script_index, - hb_tag_t *chosen_script); - -HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_script_select_language) hb_bool_t -hb_ot_layout_script_find_language (hb_face_t *face, - hb_tag_t table_tag, - unsigned int script_index, - hb_tag_t language_tag, - unsigned int *language_index); - -HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) void -hb_ot_tags_from_script (hb_script_t script, - hb_tag_t *script_tag_1, - hb_tag_t *script_tag_2); - -HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) hb_tag_t -hb_ot_tag_from_language (hb_language_t language); - - -typedef unsigned int hb_ot_name_id_t; /* Since is in hb-ot.h */ - -/** - * HB_OT_VAR_NO_AXIS_INDEX: - * - * Since: 1.4.2 - * Deprecated: REPLACEME - */ -#define HB_OT_VAR_NO_AXIS_INDEX 0xFFFFFFFFu - -/** - * hb_ot_var_axis_t: - * - * Since: 1.4.2 - * Deprecated: REPLACEME - */ -typedef struct hb_ot_var_axis_t -{ - hb_tag_t tag; - hb_ot_name_id_t name_id; - float min_value; - float default_value; - float max_value; -} hb_ot_var_axis_t; - -HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int -hb_ot_var_get_axes (hb_face_t *face, - unsigned int start_offset, - unsigned int *axes_count /* IN/OUT */, - hb_ot_var_axis_t *axes_array /* OUT */); - -HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t -hb_ot_var_find_axis (hb_face_t *face, - hb_tag_t axis_tag, - unsigned int *axis_index, - hb_ot_var_axis_t *axis_info); #endif diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index 577359601..4a8144ba7 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -735,26 +735,26 @@ inline hb_sorted_array_t hb_sorted_array (T *array, unsigned int len) struct HbOpOr { - static const bool passthru_left = true; - static const bool passthru_right = true; + enum { passthru_left = true }; + enum { passthru_right = true }; template static void process (T &o, const T &a, const T &b) { o = a | b; } }; struct HbOpAnd { - static const bool passthru_left = false; - static const bool passthru_right = false; + enum { passthru_left = false }; + enum { passthru_right = false }; template static void process (T &o, const T &a, const T &b) { o = a & b; } }; struct HbOpMinus { - static const bool passthru_left = true; - static const bool passthru_right = false; + enum { passthru_left = true }; + enum { passthru_right = false }; template static void process (T &o, const T &a, const T &b) { o = a & ~b; } }; struct HbOpXor { - static const bool passthru_left = true; - static const bool passthru_right = true; + enum { passthru_left = true }; + enum { passthru_right = true }; template static void process (T &o, const T &a, const T &b) { o = a ^ b; } }; diff --git a/src/hb-face.cc b/src/hb-face.cc index 5b33784f4..a1ae1d771 100644 --- a/src/hb-face.cc +++ b/src/hb-face.cc @@ -647,8 +647,8 @@ _hb_face_builder_data_reference_blob (hb_face_builder_data_t *data) bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2')); hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag; - Supplier tags_supplier (&data->tables[0].tag, table_count, sizeof (data->tables[0])); - Supplier blobs_supplier (&data->tables[0].blob, table_count, sizeof (data->tables[0])); + Supplier tags_supplier (&data->tables[0u].tag, table_count, data->tables.item_size); + Supplier blobs_supplier (&data->tables[0u].blob, table_count, data->tables.item_size); bool ret = f->serialize_single (&c, sfnt_tag, tags_supplier, diff --git a/src/hb-icu.cc b/src/hb-icu.cc index 4e51eb019..287f86340 100644 --- a/src/hb-icu.cc +++ b/src/hb-icu.cc @@ -65,7 +65,8 @@ hb_icu_script_from_script (hb_script_t script) if (unlikely (script == HB_SCRIPT_INVALID)) return USCRIPT_INVALID_CODE; - for (unsigned int i = 0; i < USCRIPT_CODE_LIMIT; i++) + unsigned int numScriptCode = 1 + u_getIntPropertyMaxValue (UCHAR_SCRIPT); + for (unsigned int i = 0; i < numScriptCode; i++) if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script)) return (UScriptCode) i; diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh index 39e962936..19d2e17a4 100644 --- a/src/hb-machinery.hh +++ b/src/hb-machinery.hh @@ -117,8 +117,8 @@ static inline Type& StructAfter(TObject &X) enum { min_size = (size) } #define DEFINE_SIZE_ARRAY(size, array) \ - DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \ - DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0])) \ + DEFINE_COMPILES_ASSERTION ((void) (array)[0u].static_size) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0u])) \ enum { null_size = (size) }; \ enum { min_size = (size) } @@ -658,7 +658,7 @@ struct Supplier } inline Supplier (const hb_vector_t *v) { - head = *v; + head = (const Type *) *v; len = v->len; stride = sizeof (Type); } @@ -721,7 +721,7 @@ struct BEInt } inline operator Type (void) const { -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__) /* Spoon-feed the compiler a big-endian integer with alignment 1. * https://github.com/harfbuzz/harfbuzz/pull/1398 */ struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; diff --git a/src/hb-map.hh b/src/hb-map.hh index c54c9d7b6..16b2255d9 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -168,7 +168,7 @@ struct hb_map_t inline hb_codepoint_t operator [] (unsigned int key) const { return get (key); } - static const hb_codepoint_t INVALID = HB_MAP_VALUE_INVALID; + enum { INVALID = HB_MAP_VALUE_INVALID }; inline void clear (void) { diff --git a/src/hb-null.hh b/src/hb-null.hh index 080e0b542..6a868685e 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -77,6 +77,7 @@ struct hb_static_size /* * Null() */ + extern HB_INTERNAL hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; @@ -86,7 +87,13 @@ static inline Type const & Null (void) { static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); return *reinterpret_cast (_hb_NullPool); } -#define Null(Type) Null () +template +struct NullHelper +{ + typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type; + static inline const Type & get_null (void) { return Null (); } +}; +#define Null(Type) NullHelper::get_null () /* Specializations for arbitrary-content Null objects expressed in bytes. */ #define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \ @@ -129,17 +136,23 @@ static inline Type& Crap (void) { memcpy (obj, &Null(Type), sizeof (*obj)); return *obj; } -#define Crap(Type) Crap () +template +struct CrapHelper +{ + typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type; + static inline Type & get_crap (void) { return Crap (); } +}; +#define Crap(Type) CrapHelper::get_crap () template -struct CrapOrNull { +struct CrapOrNullHelper { static inline Type & get (void) { return Crap(Type); } }; template -struct CrapOrNull { - static inline Type const & get (void) { return Null(Type); } +struct CrapOrNullHelper { + static inline const Type & get (void) { return Null(Type); } }; -#define CrapOrNull(Type) CrapOrNull::get () +#define CrapOrNull(Type) CrapOrNullHelper::get () /* diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index cdc610be3..7f32fb3b6 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -495,7 +495,8 @@ struct CmapSubtableLongSegmented { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - Supplier supplier (group_data, group_data.len); + Supplier supplier ((const OT::CmapSubtableLongGroup*) group_data, + group_data.len); if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false); return true; } @@ -842,7 +843,7 @@ struct EncodingRecord struct cmap { - static const hb_tag_t tableTag = HB_OT_TAG_cmap; + enum { tableTag = HB_OT_TAG_cmap }; struct subset_plan { diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh index 47774fd8f..2b49f2c66 100644 --- a/src/hb-ot-color-cbdt-table.hh +++ b/src/hb-ot-color-cbdt-table.hh @@ -332,7 +332,7 @@ struct CBLC { friend struct CBDT; - static const hb_tag_t tableTag = HB_OT_TAG_CBLC; + enum { tableTag = HB_OT_TAG_CBLC }; inline bool sanitize (hb_sanitize_context_t *c) const { @@ -378,7 +378,7 @@ struct CBLC struct CBDT { - static const hb_tag_t tableTag = HB_OT_TAG_CBDT; + enum { tableTag = HB_OT_TAG_CBDT }; struct accelerator_t { diff --git a/src/hb-ot-color-colr-table.hh b/src/hb-ot-color-colr-table.hh index 84c343325..fd73255a2 100644 --- a/src/hb-ot-color-colr-table.hh +++ b/src/hb-ot-color-colr-table.hh @@ -87,7 +87,7 @@ struct BaseGlyphRecord struct COLR { - static const hb_tag_t tableTag = HB_OT_TAG_COLR; + enum { tableTag = HB_OT_TAG_COLR }; inline bool has_data (void) const { return numBaseGlyphs; } diff --git a/src/hb-ot-color-cpal-table.hh b/src/hb-ot-color-cpal-table.hh index 332f0dd74..85bdc7eff 100644 --- a/src/hb-ot-color-cpal-table.hh +++ b/src/hb-ot-color-cpal-table.hh @@ -110,12 +110,12 @@ typedef HBUINT32 BGRAColor; struct CPAL { - static const hb_tag_t tableTag = HB_OT_TAG_CPAL; + enum { tableTag = HB_OT_TAG_CPAL }; inline bool has_data (void) const { return numPalettes; } inline unsigned int get_size (void) const - { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0]); } + { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0u]); } inline unsigned int get_palette_count () const { return numPalettes; } inline unsigned int get_color_count () const { return numColors; } diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index 08dee2a0c..2d24fba28 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -130,7 +130,7 @@ struct SBIXStrike struct sbix { - static const hb_tag_t tableTag = HB_OT_TAG_sbix; + enum { tableTag = HB_OT_TAG_sbix }; inline bool has_data (void) const { return version; } diff --git a/src/hb-ot-color-svg-table.hh b/src/hb-ot-color-svg-table.hh index ad3551035..0b8ec1a97 100644 --- a/src/hb-ot-color-svg-table.hh +++ b/src/hb-ot-color-svg-table.hh @@ -73,7 +73,7 @@ struct SVGDocumentIndexEntry struct SVG { - static const hb_tag_t tableTag = HB_OT_TAG_SVG; + enum { tableTag = HB_OT_TAG_SVG }; inline bool has_data (void) const { return svgDocEntries; } diff --git a/src/hb-ot-deprecated.h b/src/hb-ot-deprecated.h new file mode 100644 index 000000000..bce51b71e --- /dev/null +++ b/src/hb-ot-deprecated.h @@ -0,0 +1,107 @@ +/* + * Copyright © 2018 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_OT_H_IN +#error "Include instead." +#endif + +#ifndef HB_OT_DEPRECATED_H +#define HB_OT_DEPRECATED_H + +#include "hb.h" +#include "hb-ot-name.h" + + +HB_BEGIN_DECLS + +#ifndef HB_DISABLE_DEPRECATED + + +/* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */ +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t +hb_ot_layout_table_choose_script (hb_face_t *face, + hb_tag_t table_tag, + const hb_tag_t *script_tags, + unsigned int *script_index, + hb_tag_t *chosen_script); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_script_select_language) hb_bool_t +hb_ot_layout_script_find_language (hb_face_t *face, + hb_tag_t table_tag, + unsigned int script_index, + hb_tag_t language_tag, + unsigned int *language_index); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) void +hb_ot_tags_from_script (hb_script_t script, + hb_tag_t *script_tag_1, + hb_tag_t *script_tag_2); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) hb_tag_t +hb_ot_tag_from_language (hb_language_t language); + + +/** + * HB_OT_VAR_NO_AXIS_INDEX: + * + * Since: 1.4.2 + * Deprecated: 2.2.0 + */ +#define HB_OT_VAR_NO_AXIS_INDEX 0xFFFFFFFFu + +/** + * hb_ot_var_axis_t: + * + * Since: 1.4.2 + * Deprecated: 2.2.0 + */ +typedef struct hb_ot_var_axis_t +{ + hb_tag_t tag; + hb_ot_name_id_t name_id; + float min_value; + float default_value; + float max_value; +} hb_ot_var_axis_t; + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int +hb_ot_var_get_axes (hb_face_t *face, + unsigned int start_offset, + unsigned int *axes_count /* IN/OUT */, + hb_ot_var_axis_t *axes_array /* OUT */); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t +hb_ot_var_find_axis (hb_face_t *face, + hb_tag_t axis_tag, + unsigned int *axis_index, + hb_ot_var_axis_t *axis_info); + + +#endif + +HB_END_DECLS + +#endif /* HB_OT_DEPRECATED_H */ diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index c88f43385..23d16a790 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -45,7 +45,7 @@ struct loca { friend struct glyf; - static const hb_tag_t tableTag = HB_OT_TAG_loca; + enum { tableTag = HB_OT_TAG_loca }; inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const { @@ -71,7 +71,7 @@ struct loca struct glyf { - static const hb_tag_t tableTag = HB_OT_TAG_glyf; + enum { tableTag = HB_OT_TAG_glyf }; inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const { diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh index 0fea24bca..6545f2615 100644 --- a/src/hb-ot-hdmx-table.hh +++ b/src/hb-ot-hdmx-table.hh @@ -123,7 +123,7 @@ struct DeviceRecord struct hdmx { - static const hb_tag_t tableTag = HB_OT_TAG_hdmx; + enum { tableTag = HB_OT_TAG_hdmx }; inline unsigned int get_size (void) const { diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh index 602e365ce..931ccd40c 100644 --- a/src/hb-ot-head-table.hh +++ b/src/hb-ot-head-table.hh @@ -45,7 +45,7 @@ struct head { friend struct OffsetTable; - static const hb_tag_t tableTag = HB_OT_TAG_head; + enum { tableTag = HB_OT_TAG_head }; inline unsigned int get_upem (void) const { diff --git a/src/hb-ot-hhea-table.hh b/src/hb-ot-hhea-table.hh index 3336cadd4..0f47c63d0 100644 --- a/src/hb-ot-hhea-table.hh +++ b/src/hb-ot-hhea-table.hh @@ -86,10 +86,10 @@ struct _hea }; struct hhea : _hea { - static const hb_tag_t tableTag = HB_OT_TAG_hhea; + enum { tableTag = HB_OT_TAG_hhea }; }; struct vhea : _hea { - static const hb_tag_t tableTag = HB_OT_TAG_vhea; + enum { tableTag = HB_OT_TAG_vhea }; }; diff --git a/src/hb-ot-hmtx-table.hh b/src/hb-ot-hmtx-table.hh index 091b60117..f22ed1d71 100644 --- a/src/hb-ot-hmtx-table.hh +++ b/src/hb-ot-hmtx-table.hh @@ -192,7 +192,7 @@ struct hmtxvmtx default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face); bool got_font_extents = false; - if (T::os2Tag) + if (T::os2Tag != HB_TAG_NONE) { #define USE_TYPO_METRICS (1u<<7) if (0 != (face->table.OS2->fsSelection & USE_TYPO_METRICS)) @@ -327,14 +327,14 @@ struct hmtxvmtx }; struct hmtx : hmtxvmtx { - static const hb_tag_t tableTag = HB_OT_TAG_hmtx; - static const hb_tag_t variationsTag = HB_OT_TAG_HVAR; - static const hb_tag_t os2Tag = HB_OT_TAG_OS2; + enum { tableTag = HB_OT_TAG_hmtx }; + enum { variationsTag = HB_OT_TAG_HVAR }; + enum { os2Tag = HB_OT_TAG_OS2 }; }; struct vmtx : hmtxvmtx { - static const hb_tag_t tableTag = HB_OT_TAG_vmtx; - static const hb_tag_t variationsTag = HB_OT_TAG_VVAR; - static const hb_tag_t os2Tag = HB_TAG_NONE; + enum { tableTag = HB_OT_TAG_vmtx }; + enum { variationsTag = HB_OT_TAG_VVAR }; + enum { os2Tag = HB_TAG_NONE }; }; struct hmtx_accelerator_t : hmtx::accelerator_t {}; diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index b57ebaea8..a184f2e18 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -56,7 +56,7 @@ struct KernSubTableFormat3 if (unlikely (leftC >= leftClassCount || rightC >= rightClassCount)) return 0; unsigned int i = leftC * rightClassCount + rightC; - return kernValue[kernIndex[i]]; + return kernValue[(unsigned) kernIndex[i]]; } inline bool apply (AAT::hb_aat_apply_context_t *c) const @@ -160,7 +160,7 @@ struct KernSubTable struct KernOTSubTableHeader { - static const bool apple = false; + enum { apple = false }; typedef AAT::ObsoleteTypes Types; inline unsigned int tuple_count (void) const { return 0; } @@ -197,8 +197,8 @@ struct KernOT : AAT::KerxTable { friend struct AAT::KerxTable; - static const hb_tag_t tableTag = HB_OT_TAG_kern; - static const uint16_t minVersion = 0; + enum { tableTag = HB_OT_TAG_kern }; + enum { minVersion = 0u }; typedef KernOTSubTableHeader SubTableHeader; typedef SubTableHeader::Types Types; @@ -215,7 +215,7 @@ struct KernOT : AAT::KerxTable struct KernAATSubTableHeader { - static const bool apple = true; + enum { apple = true }; typedef AAT::ObsoleteTypes Types; inline unsigned int tuple_count (void) const { return 0; } @@ -252,8 +252,8 @@ struct KernAAT : AAT::KerxTable { friend struct AAT::KerxTable; - static const hb_tag_t tableTag = HB_OT_TAG_kern; - static const uint32_t minVersion = 0x00010000u; + enum { tableTag = HB_OT_TAG_kern }; + enum { minVersion = 0x00010000u }; typedef KernAATSubTableHeader SubTableHeader; typedef SubTableHeader::Types Types; @@ -269,7 +269,7 @@ struct KernAAT : AAT::KerxTable struct kern { - static const hb_tag_t tableTag = HB_OT_TAG_kern; + enum { tableTag = HB_OT_TAG_kern }; inline bool has_data (void) const { return u.version32; } inline unsigned int get_type (void) const { return u.major; } diff --git a/src/hb-ot-layout-base-table.hh b/src/hb-ot-layout-base-table.hh index fb57e7624..320f00347 100644 --- a/src/hb-ot-layout-base-table.hh +++ b/src/hb-ot-layout-base-table.hh @@ -465,7 +465,7 @@ struct Axis struct BASE { - static const hb_tag_t tableTag = HB_OT_TAG_BASE; + enum { tableTag = HB_OT_TAG_BASE }; inline const Axis &get_axis (hb_direction_t direction) const { return HB_DIRECTION_IS_VERTICAL (direction) ? this+vAxis : this+hAxis; } diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index a0ae27e75..f1052d8f3 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -340,7 +340,7 @@ struct MarkGlyphSets struct GDEF { - static const hb_tag_t tableTag = HB_OT_TAG_GDEF; + enum { tableTag = HB_OT_TAG_GDEF }; enum GlyphClasses { UnclassifiedGlyph = 0, diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 2589218de..8559744f5 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -625,8 +625,8 @@ struct PairSet inline bool intersects (const hb_set_t *glyphs, const ValueFormat *valueFormats) const { - unsigned int len1 = valueFormats[0].get_len (); - unsigned int len2 = valueFormats[1].get_len (); + unsigned int len1 = valueFormats[0u].get_len (); + unsigned int len2 = valueFormats[1u].get_len (); unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); const PairValueRecord *record = &firstPairValueRecord; @@ -644,8 +644,8 @@ struct PairSet const ValueFormat *valueFormats) const { TRACE_COLLECT_GLYPHS (this); - unsigned int len1 = valueFormats[0].get_len (); - unsigned int len2 = valueFormats[1].get_len (); + unsigned int len1 = valueFormats[0u].get_len (); + unsigned int len2 = valueFormats[1u].get_len (); unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); const PairValueRecord *record = &firstPairValueRecord; @@ -658,8 +658,8 @@ struct PairSet { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; - unsigned int len1 = valueFormats[0].get_len (); - unsigned int len2 = valueFormats[1].get_len (); + unsigned int len1 = valueFormats[0u].get_len (); + unsigned int len2 = valueFormats[1u].get_len (); unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); unsigned int count = len; @@ -681,8 +681,8 @@ struct PairSet else { /* Note the intentional use of "|" instead of short-circuit "||". */ - if (valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()) | - valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos])) + if (valueFormats[0u].apply_value (c, this, &record->values[0u], buffer->cur_pos()) | + valueFormats[1u].apply_value (c, this, &record->values[len1], buffer->pos[pos])) buffer->unsafe_to_break (buffer->idx, pos + 1); if (len2) pos++; @@ -698,7 +698,7 @@ struct PairSet { const void *base; const ValueFormat *valueFormats; - unsigned int len1; /* valueFormats[0].get_len() */ + unsigned int len1; /* valueFormats[0u].get_len() */ unsigned int stride; /* 1 + len1 + len2 */ }; @@ -713,8 +713,8 @@ struct PairSet unsigned int count = len; const PairValueRecord *record = &firstPairValueRecord; - return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride) && - closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride)); + return_trace (closure->valueFormats[0u].sanitize_values_stride_unsafe (c, closure->base, &record->values[0u], count, closure->stride) && + closure->valueFormats[1u].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride)); } protected: @@ -781,8 +781,8 @@ struct PairPosFormat1 if (!c->check_struct (this)) return_trace (false); - unsigned int len1 = valueFormat[0].get_len (); - unsigned int len2 = valueFormat[1].get_len (); + unsigned int len1 = valueFormat[0u].get_len (); + unsigned int len2 = valueFormat[1u].get_len (); PairSet::sanitize_closure_t closure = { this, @@ -799,10 +799,10 @@ struct PairPosFormat1 OffsetTo coverage; /* Offset to Coverage table--from * beginning of subtable */ - ValueFormat valueFormat[2]; /* [0] Defines the types of data in + ValueFormat valueFormat[2u]; /* [0u] Defines the types of data in * ValueRecord1--for the first glyph * in the pair--may be zero (0) */ - /* [1] Defines the types of data in + /* [1u] Defines the types of data in * ValueRecord2--for the second glyph * in the pair--may be zero (0) */ OffsetArrayOf @@ -885,7 +885,7 @@ struct PairPosFormat2 return_trace (c->check_range ((const void *) values, count, record_size) && - valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) && + valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0u], count, stride) && valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride)); } @@ -1628,7 +1628,7 @@ struct PosLookup : Lookup struct GPOS : GSUBGPOS { - static const hb_tag_t tableTag = HB_OT_TAG_GPOS; + enum { tableTag = HB_OT_TAG_GPOS }; inline const PosLookup& get_lookup (unsigned int i) const { return CastR (GSUBGPOS::get_lookup (i)); } diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 27bd440da..6acdcf2f0 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1475,7 +1475,7 @@ struct SubstLookup : Lookup struct GSUB : GSUBGPOS { - static const hb_tag_t tableTag = HB_OT_TAG_GSUB; + enum { tableTag = HB_OT_TAG_GSUB }; inline const SubstLookup& get_lookup (unsigned int i) const { return CastR (GSUBGPOS::get_lookup (i)); } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index a9bfee155..3429997bf 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1350,7 +1350,7 @@ struct Rule return_trace (inputCount.sanitize (c) && lookupCount.sanitize (c) && c->check_range (inputZ.arrayZ, - inputZ[0].static_size * (inputCount ? inputCount - 1 : 0) + + inputZ.item_size * (inputCount ? inputCount - 1 : 0) + LookupRecord::static_size * lookupCount)); } @@ -1672,7 +1672,7 @@ struct ContextFormat3 { inline bool intersects (const hb_set_t *glyphs) const { - if (!(this+coverageZ[0]).intersects (glyphs)) + if (!(this+coverageZ[0u]).intersects (glyphs)) return false; struct ContextClosureLookupContext lookup_context = { @@ -1687,7 +1687,7 @@ struct ContextFormat3 inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (this); - if (!(this+coverageZ[0]).intersects (c->glyphs)) + if (!(this+coverageZ[0u]).intersects (c->glyphs)) return; const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); @@ -1704,7 +1704,7 @@ struct ContextFormat3 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverageZ[0]).add_coverage (c->input); + (this+coverageZ[0u]).add_coverage (c->input); const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); struct ContextCollectGlyphsLookupContext lookup_context = { @@ -1731,12 +1731,12 @@ struct ContextFormat3 } inline const Coverage &get_coverage (void) const - { return this+coverageZ[0]; } + { return this+coverageZ[0u]; } inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); - unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint); + unsigned int index = (this+coverageZ[0u]).get_coverage (c->buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); @@ -1759,7 +1759,7 @@ struct ContextFormat3 TRACE_SANITIZE (this); if (!c->check_struct (this)) return_trace (false); unsigned int count = glyphCount; - if (!count) return_trace (false); /* We want to access coverageZ[0] freely. */ + if (!count) return_trace (false); /* We want to access coverageZ[0u] freely. */ if (!c->check_array (coverageZ.arrayZ, count)) return_trace (false); for (unsigned int i = 0; i < count; i++) if (!coverageZ[i].sanitize (c, this)) return_trace (false); @@ -1838,7 +1838,7 @@ static inline bool chain_context_intersects (const hb_set_t *glyphs, { return intersects_array (glyphs, backtrackCount, backtrack, - lookup_context.funcs.intersects, lookup_context.intersects_data[0]) + lookup_context.funcs.intersects, lookup_context.intersects_data[0u]) && intersects_array (glyphs, inputCount ? inputCount - 1 : 0, input, lookup_context.funcs.intersects, lookup_context.intersects_data[1]) diff --git a/src/hb-ot-layout-jstf-table.hh b/src/hb-ot-layout-jstf-table.hh index 2fb23cbc3..d05f813fb 100644 --- a/src/hb-ot-layout-jstf-table.hh +++ b/src/hb-ot-layout-jstf-table.hh @@ -195,7 +195,7 @@ struct JstfScript struct JSTF { - static const hb_tag_t tableTag = HB_OT_TAG_JSTF; + enum { tableTag = HB_OT_TAG_JSTF }; inline unsigned int get_script_count (void) const { return scriptList.len; } diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index d0b22efe3..b08ee7f60 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1299,7 +1299,7 @@ hb_ot_layout_feature_get_characters (hb_face_t *face, struct GSUBProxy { enum { table_index = 0 }; - static const bool inplace = false; + enum { inplace = false }; typedef OT::SubstLookup Lookup; GSUBProxy (hb_face_t *face) : @@ -1313,7 +1313,7 @@ struct GSUBProxy struct GPOSProxy { enum { table_index = 1 }; - static const bool inplace = true; + enum { inplace = true }; typedef OT::PosLookup Lookup; GPOSProxy (hb_face_t *face) : diff --git a/src/hb-ot-math-table.hh b/src/hb-ot-math-table.hh index 153a41795..e100991cd 100644 --- a/src/hb-ot-math-table.hh +++ b/src/hb-ot-math-table.hh @@ -680,7 +680,7 @@ struct MathVariants struct MATH { - static const hb_tag_t tableTag = HB_OT_TAG_MATH; + enum { tableTag = HB_OT_TAG_MATH }; inline bool has_data (void) const { return version.to_int (); } diff --git a/src/hb-ot-maxp-table.hh b/src/hb-ot-maxp-table.hh index 198dd2518..885685d64 100644 --- a/src/hb-ot-maxp-table.hh +++ b/src/hb-ot-maxp-table.hh @@ -71,7 +71,7 @@ struct maxpV1Tail struct maxp { - static const hb_tag_t tableTag = HB_OT_TAG_maxp; + enum { tableTag = HB_OT_TAG_maxp }; inline unsigned int get_num_glyphs (void) const { diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index ab07b7196..a903e1cdd 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -151,10 +151,10 @@ _hb_ot_name_entry_cmp (const void *pa, const void *pb) struct name { - static const hb_tag_t tableTag = HB_OT_TAG_name; + enum { tableTag = HB_OT_TAG_name }; inline unsigned int get_size (void) const - { return min_size + count * nameRecordZ[0].min_size; } + { return min_size + count * nameRecordZ.item_size; } inline bool sanitize_records (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -189,7 +189,7 @@ struct name this->names.init (); this->names.alloc (all_names.len); - for (uint16_t i = 0; i < all_names.len; i++) + for (unsigned int i = 0; i < all_names.len; i++) { hb_ot_name_entry_t *entry = this->names.push (); diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index a5a9c07ea..e53eda731 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -40,7 +40,7 @@ namespace OT { struct OS2 { - static const hb_tag_t tableTag = HB_OT_TAG_OS2; + enum { tableTag = HB_OT_TAG_OS2 }; inline bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 98df3e780..64f0936fa 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -71,7 +71,7 @@ struct postV2Tail struct post { - static const hb_tag_t tableTag = HB_OT_TAG_post; + enum { tableTag = HB_OT_TAG_post }; inline bool subset (hb_subset_plan_t *plan) const { @@ -107,7 +107,7 @@ struct post version = table->version.to_int (); if (version != 0x00020000) return; - const postV2Tail &v2 = table->v2; + const postV2Tail &v2 = table->v2X; glyphNameIndex = &v2.glyphNameIndex; pool = &StructAfter (v2.glyphNameIndex); @@ -250,7 +250,7 @@ struct post TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && (version.to_int () == 0x00010000 || - (version.to_int () == 0x00020000 && v2.sanitize (c)) || + (version.to_int () == 0x00020000 && v2X.sanitize (c)) || version.to_int () == 0x00030000))); } @@ -286,7 +286,7 @@ struct post * is downloaded as a Type 1 font. */ HBUINT32 maxMemType1; /* Maximum memory usage when an OpenType font * is downloaded as a Type 1 font. */ - postV2Tail v2; + postV2Tail v2X; DEFINE_SIZE_MIN (32); }; diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc index 497891ea0..8b6ec51d1 100644 --- a/src/hb-ot-shape-complex-khmer.cc +++ b/src/hb-ot-shape-complex-khmer.cc @@ -127,22 +127,25 @@ collect_features_khmer (hb_ot_shape_planner_t *plan) for (; i < KHMER_NUM_FEATURES; i++) map->add_feature (khmer_features[i]); - - map->enable_feature (HB_TAG('c','a','l','t')); - map->enable_feature (HB_TAG('c','l','i','g')); - } static void override_features_khmer (hb_ot_shape_planner_t *plan) { + hb_ot_map_builder_t *map = &plan->map; + + /* Khmer spec has 'clig' as part of required shaping features: + * "Apply feature 'clig' to form ligatures that are desired for + * typographical correctness.", hence in overrides... */ + map->enable_feature (HB_TAG('c','l','i','g')); + /* Uniscribe does not apply 'kern' in Khmer. */ if (hb_options ().uniscribe_bug_compatible) { - plan->map.disable_feature (HB_TAG('k','e','r','n')); + map->disable_feature (HB_TAG('k','e','r','n')); } - plan->map.disable_feature (HB_TAG('l','i','g','a')); + map->disable_feature (HB_TAG('l','i','g','a')); } diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index ef9743578..e0074d539 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -309,9 +309,6 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, map->enable_feature (HB_TAG ('v','e','r','t'), F_GLOBAL_SEARCH); } - if (planner->shaper->override_features) - planner->shaper->override_features (planner); - for (unsigned int i = 0; i < num_user_features; i++) { const hb_feature_t *feature = &user_features[i]; @@ -330,6 +327,9 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, aat_map->add_feature (feature->tag, feature->value); } } + + if (planner->shaper->override_features) + planner->shaper->override_features (planner); } diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 02c376e5d..7ad45db20 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -225,7 +225,7 @@ struct AxisValue struct STAT { - static const hb_tag_t tableTag = HB_OT_TAG_STAT; + enum { tableTag = HB_OT_TAG_STAT }; inline bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-ot-var-avar-table.hh b/src/hb-ot-var-avar-table.hh index c2b110a21..70feb1243 100644 --- a/src/hb-ot-var-avar-table.hh +++ b/src/hb-ot-var-avar-table.hh @@ -99,7 +99,7 @@ struct SegmentMaps : ArrayOf struct avar { - static const hb_tag_t tableTag = HB_OT_TAG_avar; + enum { tableTag = HB_OT_TAG_avar }; inline bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index fed334e8a..975dae923 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -96,7 +96,7 @@ struct AxisRecord struct fvar { - static const hb_tag_t tableTag = HB_OT_TAG_fvar; + enum { tableTag = HB_OT_TAG_fvar }; inline bool has_data (void) const { return version.to_int (); } diff --git a/src/hb-ot-var-hvar-table.hh b/src/hb-ot-var-hvar-table.hh index 62a6547b5..a60e35b9c 100644 --- a/src/hb-ot-var-hvar-table.hh +++ b/src/hb-ot-var-hvar-table.hh @@ -102,8 +102,8 @@ struct DeltaSetIndexMap struct HVARVVAR { - static const hb_tag_t HVARTag = HB_OT_TAG_HVAR; - static const hb_tag_t VVARTag = HB_OT_TAG_VVAR; + enum { HVARTag = HB_OT_TAG_HVAR }; + enum { VVARTag = HB_OT_TAG_VVAR }; inline bool sanitize (hb_sanitize_context_t *c) const { @@ -143,10 +143,10 @@ struct HVARVVAR }; struct HVAR : HVARVVAR { - static const hb_tag_t tableTag = HB_OT_TAG_HVAR; + enum { tableTag = HB_OT_TAG_HVAR }; }; struct VVAR : HVARVVAR { - static const hb_tag_t tableTag = HB_OT_TAG_VVAR; + enum { tableTag = HB_OT_TAG_VVAR }; inline bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-ot-var-mvar-table.hh b/src/hb-ot-var-mvar-table.hh index b16a09b3d..23d2649b0 100644 --- a/src/hb-ot-var-mvar-table.hh +++ b/src/hb-ot-var-mvar-table.hh @@ -58,7 +58,7 @@ struct VariationValueRecord struct MVAR { - static const hb_tag_t tableTag = HB_OT_TAG_MVAR; + enum { tableTag = HB_OT_TAG_MVAR }; inline bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-ot-var.cc b/src/hb-ot-var.cc index 56d248178..e327fb762 100644 --- a/src/hb-ot-var.cc +++ b/src/hb-ot-var.cc @@ -79,7 +79,7 @@ hb_ot_var_get_axis_count (hb_face_t *face) * hb_ot_var_get_axes: * * Since: 1.4.2 - * Deprecated: REPLACEME + * Deprecated: 2.2.0 **/ unsigned int hb_ot_var_get_axes (hb_face_t *face, @@ -94,7 +94,7 @@ hb_ot_var_get_axes (hb_face_t *face, * hb_ot_var_find_axis: * * Since: 1.4.2 - * Deprecated: REPLACEME + * Deprecated: 2.2.0 **/ hb_bool_t hb_ot_var_find_axis (hb_face_t *face, @@ -108,7 +108,7 @@ hb_ot_var_find_axis (hb_face_t *face, /** * hb_ot_var_get_axis_infos: * - * Since: REPLACEME + * Since: 2.2.0 **/ HB_EXTERN unsigned int hb_ot_var_get_axis_infos (hb_face_t *face, @@ -122,7 +122,7 @@ hb_ot_var_get_axis_infos (hb_face_t *face, /** * hb_ot_var_find_axis_info: * - * Since: REPLACEME + * Since: 2.2.0 **/ HB_EXTERN hb_bool_t hb_ot_var_find_axis_info (hb_face_t *face, diff --git a/src/hb-ot-var.h b/src/hb-ot-var.h index 779be1043..b9d5e408d 100644 --- a/src/hb-ot-var.h +++ b/src/hb-ot-var.h @@ -63,7 +63,7 @@ hb_ot_var_get_axis_count (hb_face_t *face); * hb_ot_var_axis_flags_t: * @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces. * - * Since: REPLACEME + * Since: 2.2.0 */ typedef enum { /*< flags >*/ HB_OT_VAR_AXIS_FLAG_HIDDEN = 0x00000001u, @@ -74,7 +74,7 @@ typedef enum { /*< flags >*/ /** * hb_ot_var_axis_info_t: * - * Since: REPLACEME + * Since: 2.2.0 */ typedef struct hb_ot_var_axis_info_t { diff --git a/src/hb-ot-vorg-table.hh b/src/hb-ot-vorg-table.hh index 5a00bfc35..effb17d20 100644 --- a/src/hb-ot-vorg-table.hh +++ b/src/hb-ot-vorg-table.hh @@ -57,7 +57,7 @@ struct VertOriginMetric struct VORG { - static const hb_tag_t tableTag = HB_OT_TAG_VORG; + enum { tableTag = HB_OT_TAG_VORG }; inline bool has_data (void) const { return version.to_int (); } @@ -93,7 +93,7 @@ struct VORG unsigned int size = VertOriginMetric::static_size * subset_metrics.len; VertOriginMetric *metrics = c.allocate_size (size); if (likely (metrics != nullptr)) - memcpy (metrics, &subset_metrics[0], size); + memcpy (metrics, &subset_metrics[0u], size); else success = false; } diff --git a/src/hb-ot.h b/src/hb-ot.h index c168175ac..db784694c 100644 --- a/src/hb-ot.h +++ b/src/hb-ot.h @@ -31,6 +31,7 @@ #include "hb.h" #include "hb-ot-color.h" +#include "hb-ot-deprecated.h" #include "hb-ot-font.h" #include "hb-ot-layout.h" #include "hb-ot-math.h" diff --git a/src/hb-set-digest.hh b/src/hb-set-digest.hh index 4e99df0eb..1daefad19 100644 --- a/src/hb-set-digest.hh +++ b/src/hb-set-digest.hh @@ -50,13 +50,13 @@ struct hb_set_digest_lowest_bits_t { enum { mask_bytes = sizeof (mask_t) }; enum { mask_bits = sizeof (mask_t) * 8 }; - static const unsigned int num_bits = 0 - + (mask_bytes >= 1 ? 3 : 0) - + (mask_bytes >= 2 ? 1 : 0) - + (mask_bytes >= 4 ? 1 : 0) - + (mask_bytes >= 8 ? 1 : 0) - + (mask_bytes >= 16? 1 : 0) - + 0; + enum { num_bits = 0 + + (mask_bytes >= 1 ? 3 : 0) + + (mask_bytes >= 2 ? 1 : 0) + + (mask_bytes >= 4 ? 1 : 0) + + (mask_bytes >= 8 ? 1 : 0) + + (mask_bytes >= 16? 1 : 0) + + 0 }; static_assert ((shift < sizeof (hb_codepoint_t) * 8), ""); static_assert ((shift + num_bits <= sizeof (hb_codepoint_t) * 8), ""); diff --git a/src/hb-set.hh b/src/hb-set.hh index 8b7a0f3d0..f1fccd8f0 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -375,8 +375,8 @@ struct hb_set_t if (!resize (count)) return; population = other->population; - memcpy (pages, other->pages, count * pages.item_size); - memcpy (page_map, other->page_map, count * page_map.item_size); + memcpy ((void *) pages, (const void *) other->pages, count * pages.item_size); + memcpy ((void *) page_map, (const void *) other->page_map, count * page_map.item_size); } inline bool is_equal (const hb_set_t *other) const @@ -660,7 +660,7 @@ struct hb_set_t unsigned int count = pages.len; for (int i = count - 1; i >= 0; i++) if (!page_at (i).is_empty ()) - return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_max (); + return page_map[(unsigned) i].major * page_t::PAGE_BITS + page_at (i).get_max (); return INVALID; } @@ -678,7 +678,7 @@ struct hb_set_t pages[map.index].init0 (); memmove (page_map + i + 1, page_map + i, - (page_map.len - 1 - i) * sizeof (page_map[0])); + (page_map.len - 1 - i) * page_map.item_size); page_map[i] = map; } return &pages[page_map[i].index]; diff --git a/src/hb-subset.cc b/src/hb-subset.cc index cc6c9e1e0..22e9192e2 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -80,7 +80,7 @@ _subset2 (hb_subset_plan_t *plan) return false; } retry: - hb_serialize_context_t serializer (buf, buf_size); + hb_serialize_context_t serializer ((void *) buf, buf_size); hb_subset_context_t c (plan, &serializer); result = table->subset (&c); if (serializer.ran_out_of_room) diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 1fae6435b..e98e41f9b 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -695,7 +695,7 @@ _hb_uniscribe_shape (hb_shape_plan_t *shape_plan, { active_feature_t *feature = active_features.find (&event->feature); if (feature) - active_features.remove (feature - active_features); + active_features.remove (feature - active_features.arrayZ ()); } } @@ -886,8 +886,8 @@ retry: &items[i].a, script_tags[i], language_tag, - range_char_counts, - range_properties, + range_char_counts.arrayZ (), + range_properties.arrayZ (), range_properties.len, pchars + chars_offset, item_chars_len, @@ -927,8 +927,8 @@ retry: &items[i].a, script_tags[i], language_tag, - range_char_counts, - range_properties, + range_char_counts.arrayZ (), + range_properties.arrayZ (), range_properties.len, pchars + chars_offset, log_clusters + chars_offset, diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 787512f92..313c24c41 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -101,8 +101,8 @@ struct hb_vector_t inline hb_sorted_array_t as_sorted_array (void) const { return hb_sorted_array (arrayZ(), len); } - template inline operator T * (void) { return arrayZ(); } - template inline operator const T * (void) const { return arrayZ(); } + template explicit_operator inline operator T * (void) { return arrayZ(); } + template explicit_operator inline operator const T * (void) const { return arrayZ(); } inline Type * operator + (unsigned int i) { return arrayZ() + i; } inline const Type * operator + (unsigned int i) const { return arrayZ() + i; } diff --git a/src/hb-version.h b/src/hb-version.h index fb9f8f306..7c4a8ad4a 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -37,10 +37,10 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 2 -#define HB_VERSION_MINOR 1 -#define HB_VERSION_MICRO 3 +#define HB_VERSION_MINOR 2 +#define HB_VERSION_MICRO 0 -#define HB_VERSION_STRING "2.1.3" +#define HB_VERSION_STRING "2.2.0" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ diff --git a/test/shaping/data/in-house/tests/macos.tests b/test/shaping/data/in-house/tests/macos.tests index 8bce25302..859992cd7 100644 --- a/test/shaping/data/in-house/tests/macos.tests +++ b/test/shaping/data/in-house/tests/macos.tests @@ -1,31 +1,35 @@ -# 10.12.6 -/System/Library/Fonts/Helvetica.dfont@c7bec2785a4c402b7809b5e35337c3d24c18e281:--shaper ot --font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0] -/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--shaper ot --font-funcs ot:U+006D,U+0300:[mgrave=0+1912] -/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--shaper ot --font-funcs ot:U+0066,U+0069:[fi=0+1139] -/Library/Fonts/Khmer MN.ttc@5f5b1072df99b7355d3066ea85fe82969d13c94a:--shaper ot --font-funcs ot:U+17A2,U+1780,U+17D2,U+179F,U+179A,U+1781,U+17D2,U+1798,U+17C2,U+179A:[km_qa=0+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593] -/Library/Fonts/Tamil MN.ttc@37a2020c3f86ebcc45e02c1de5fdf81e2676989d:--shaper ot --font-funcs ot:U+0BA4,U+0BCA,U+0B95,U+0BC1,U+0B95,U+0BCD,U+0B95,U+0BAA,U+0BCD,U+0BAA,U+0B9F,U+0BCD,U+0B9F,U+0BC1:[tgm_e=0+1702|tgc_ta=0+1598|tgm_aa=0+1149|tgc_ku=2+1962|tgc_k=4+1592|tgc_ka=6+1592|tgc_p=7+1370|tgc_pa=9+1370|tgc_tt=10+1596|tgc_ttu=12+1833] -/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--shaper ot --font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251] -/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--shaper ot --font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361] -/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--shaper ot --font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098] -/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647] -/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --font-funcs ot:U+0628,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656] -/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700] -/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165] -/System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--shaper ot --font-funcs ot:U+0056,U+0041,U+0056,U+0041:[gid265=0+1227|gid4=1@-65,0+1162|gid265=2@-65,0+1162|gid4=3@-65,0+1227] -/System/Library/Fonts/Apple Color Emoji.ttc@d2fe8a134483aa48a43a9d1e4b7204d37a4abdf5:--remove-default-ignorables --shaper ot --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800] +# 10.12.6 https://gist.github.com/ebraminio/1704341fa16b06979e605aafd88198cf +/System/Library/Fonts/Helvetica.dfont@c7bec2785a4c402b7809b5e35337c3d24c18e281:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0] +/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912] +/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0066,U+0069:[fi=0+1139] +/Library/Fonts/Khmer MN.ttc@5f5b1072df99b7355d3066ea85fe82969d13c94a:--font-funcs ot:U+17A2,U+1780,U+17D2,U+179F,U+179A,U+1781,U+17D2,U+1798,U+17C2,U+179A:[km_qa=0+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593] +/Library/Fonts/Tamil MN.ttc@37a2020c3f86ebcc45e02c1de5fdf81e2676989d:--font-funcs ot:U+0BA4,U+0BCA,U+0B95,U+0BC1,U+0B95,U+0BCD,U+0B95,U+0BAA,U+0BCD,U+0BAA,U+0B9F,U+0BCD,U+0B9F,U+0BC1:[tgm_e=0+1702|tgc_ta=0+1598|tgm_aa=0+1149|tgc_ku=2+1962|tgc_k=4+1592|tgc_ka=6+1592|tgc_p=7+1370|tgc_pa=9+1370|tgc_tt=10+1596|tgc_ttu=12+1833] +/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251] +/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361] +/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098] +/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[T=0+1497|e=1@-62,0+699|space=2+569|A=3+1431|V=4@-37,0+1377|space=5+569|T=6+1510|r=7@-50,0+803|space=8+569|V=9+1376|a=10@-37,0+1014|space=11+569|r=12+853|T=13+1560|space=14+569|e=15+761|T=16+1560|space=17+569|T=18+1515|d=19@-45,0+1006] +/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647] +/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0628,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656] +/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700] +/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165] +/System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid225=0+1105|gid584=1@-105,0+979|gid3=2+490|gid4=3+1227|gid265=4@-65,0+1227|gid3=5+490|gid225=6+1130|gid728=7@-80,0+569|gid3=8+490|gid265=9+1227|gid505=10@-65,0+997|gid3=11+490|gid728=12+609|gid225=13@-40,0+1170|gid3=14+490|gid584=15+1004|gid225=16@-80,0+1130|gid3=17+490|gid225=18+1105|gid576=19@-105,0+1068] +/System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--font-ptem 9 --font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid225=0@46,0+1197|gid584=1@-59,0+1071|gid3=2@46,0+582|gid4=3@46,0+1319|gid265=4@-19,0+1319|gid3=5@46,0+582|gid225=6@46,0+1222|gid728=7@-34,0+661|gid3=8@46,0+582|gid265=9@46,0+1319|gid505=10@-19,0+1089|gid3=11@46,0+582|gid728=12@46,0+701|gid225=13@6,0+1262|gid3=14@46,0+582|gid584=15@46,0+1096|gid225=16@-34,0+1222|gid3=17@46,0+582|gid225=18@46,0+1197|gid576=19@-59,0+1160] +/System/Library/Fonts/Apple Color Emoji.ttc@d2fe8a134483aa48a43a9d1e4b7204d37a4abdf5:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800] -# 10.13.6 -/System/Library/Fonts/Helvetica.ttc@8a928f9866299d2455f41360202b7a3b48503a5e:--shaper ot --font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0] -/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--shaper ot --font-funcs ot:U+006D,U+0300:[mgrave=0+1912] -/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--shaper ot --font-funcs ot:U+0066,U+0069:[fi=0+1139] -/Library/Fonts/Khmer MN.ttc@782ba6cf3fca0512ab348dfe08345a2d5dc5bf2c:--shaper ot --font-funcs ot:U+17A2,U+1780,U+17D2,U+179F,U+179A,U+1781,U+17D2,U+1798,U+17C2,U+179A:[km_qa=0+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593] -/Library/Fonts/Tamil MN.ttc@3de37f3f8f3cb6015b093fbd6e9d323daaf6fb1d:--shaper ot --font-funcs ot:U+0BA4,U+0BCA,U+0B95,U+0BC1,U+0B95,U+0BCD,U+0B95,U+0BAA,U+0BCD,U+0BAA,U+0B9F,U+0BCD,U+0B9F,U+0BC1:[tgm_e=0+1702|tgc_ta=0+1598|tgm_aa=0+1149|tgc_ku=2+1962|tgc_k=4+1592|tgc_ka=6+1592|tgc_p=7+1370|tgc_pa=9+1370|tgc_tt=10+1596|tgc_ttu=12+1833] -/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--shaper ot --font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251] -/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--shaper ot --font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361] -/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--shaper ot --font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098] -/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--shaper ot --font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647] -/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--shaper ot --font-funcs ot:U+0628,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656] -/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--shaper ot --font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700] -/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--shaper ot --font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165] -/System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--shaper ot --font-funcs ot:U+0056,U+0041,U+0056,U+0041:[gid332=0+1227|gid4=1@-65,0+1162|gid332=2@-65,0+1162|gid4=3@-65,0+1227] -/System/Library/Fonts/Apple Color Emoji.ttc@2e09b1f3d42c3821cc6c4ac5b6ce16237ab0d496:--remove-default-ignorables --shaper ot --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800] +# 10.13.6 https://gist.github.com/ebraminio/d432e831b3f7ebe30245dde5775e1c7e +/System/Library/Fonts/Helvetica.ttc@8a928f9866299d2455f41360202b7a3b48503a5e:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0] +/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912] +/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0066,U+0069:[fi=0+1139] +/Library/Fonts/Khmer MN.ttc@782ba6cf3fca0512ab348dfe08345a2d5dc5bf2c:--font-funcs ot:U+17A2,U+1780,U+17D2,U+179F,U+179A,U+1781,U+17D2,U+1798,U+17C2,U+179A:[km_qa=0+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593] +/Library/Fonts/Tamil MN.ttc@3de37f3f8f3cb6015b093fbd6e9d323daaf6fb1d:--font-funcs ot:U+0BA4,U+0BCA,U+0B95,U+0BC1,U+0B95,U+0BCD,U+0B95,U+0BAA,U+0BCD,U+0BAA,U+0B9F,U+0BCD,U+0B9F,U+0BC1:[tgm_e=0+1702|tgc_ta=0+1598|tgm_aa=0+1149|tgc_ku=2+1962|tgc_k=4+1592|tgc_ka=6+1592|tgc_p=7+1370|tgc_pa=9+1370|tgc_tt=10+1596|tgc_ttu=12+1833] +/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251] +/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361] +/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098] +/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[T=0+1497|e=1@-62,0+699|space=2+569|A=3+1431|V=4@-37,0+1377|space=5+569|T=6+1510|r=7@-50,0+803|space=8+569|V=9+1376|a=10@-37,0+1014|space=11+569|r=12+853|T=13+1560|space=14+569|e=15+761|T=16+1560|space=17+569|T=18+1515|d=19@-45,0+1006] +/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647] +/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0628,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656] +/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700] +/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165] +/System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid282=0+1055|gid658=1@-135,0+914|gid3=2+420|gid4=3+1227|gid332=4@-65,0+1227|gid3=5+420|gid282=6+1075|gid813=7@-115,0+516|gid3=8+420|gid332=9+1217|gid572=10@-75,0+953|gid3=11+420|gid813=12+546|gid282=13@-85,0+1105|gid3=14+420|gid658=15+914|gid282=16@-135,0+1055|gid3=17+420|gid282=18+1055|gid649=19@-135,0+999] +/System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--font-ptem 9 --font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid282=0@46,0+1147|gid658=1@-89,0+1006|gid3=2@46,0+512|gid4=3@46,0+1319|gid332=4@-19,0+1319|gid3=5@46,0+512|gid282=6@46,0+1167|gid813=7@-69,0+608|gid3=8@46,0+512|gid332=9@46,0+1309|gid572=10@-29,0+1045|gid3=11@46,0+512|gid813=12@46,0+638|gid282=13@-39,0+1197|gid3=14@46,0+512|gid658=15@46,0+1006|gid282=16@-89,0+1147|gid3=17@46,0+512|gid282=18@46,0+1147|gid649=19@-89,0+1091] +/System/Library/Fonts/Apple Color Emoji.ttc@2e09b1f3d42c3821cc6c4ac5b6ce16237ab0d496:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800] diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf new file mode 100644 index 000000000..07e68821e Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf differ diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf new file mode 100644 index 000000000..58dd961ca Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf differ