From: Behdad Esfahbod Date: Fri, 26 Oct 2018 03:48:20 +0000 (-0700) Subject: [lookup] More prep work for memoizing collect_features X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e8e67503ff0a50eb10ad410d6a76a282ea494cf4;p=platform%2Fupstream%2FlibHarfBuzzSharp.git [lookup] More prep work for memoizing collect_features https://github.com/harfbuzz/harfbuzz/pull/1317 --- diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 98f6a07..c9a87ce 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -277,6 +277,8 @@ struct Script { return langSys.find_index (tag, index); } inline bool has_default_lang_sys (void) const { return defaultLangSys != 0; } + inline const LangSys& get_default_lang_sys (unsigned int i) const + { return get_default_lang_sys (); } inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; } inline bool subset (hb_subset_context_t *c) const diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 338ca64..d4bb280 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -681,40 +681,38 @@ _hb_ot_layout_collect_lookups_lookups (hb_face_t *face, } static void -_hb_ot_layout_collect_features_features (hb_face_t *face, - hb_tag_t table_tag, - unsigned int script_index, - unsigned int language_index, - const hb_tag_t *features, - hb_set_t *feature_indexes /* OUT */) +langsys_collect_features (const OT::GSUBGPOS &g, + const OT::LangSys &l, + const hb_tag_t *features, + hb_set_t *feature_indexes /* OUT */) { if (!features) { - unsigned int required_feature_index; - if (hb_ot_layout_language_get_required_feature (face, - table_tag, - script_index, - language_index, - &required_feature_index, - nullptr)) - feature_indexes->add (required_feature_index); - - const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); - const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index); + /* All features. */ + unsigned int index = l.get_required_feature_index (); + if (index != HB_OT_LAYOUT_NO_FEATURE_INDEX) + feature_indexes->add (index); + l.add_feature_indexes_to (feature_indexes); } else { + /* Ugh. Any faster way? */ for (; *features; features++) { + hb_tag_t feature_tag = *features; unsigned int feature_index; - if (hb_ot_layout_language_find_feature (face, - table_tag, - script_index, - language_index, - *features, - &feature_index)) - feature_indexes->add (feature_index); + unsigned int num_features = l.get_feature_count (); + for (unsigned int i = 0; i < num_features; i++) + { + unsigned int feature_index = l.get_feature_index (i); + + if (feature_tag == g.get_feature_tag (feature_index)) + { + feature_indexes->add (feature_index); + break; + } + } } } } @@ -727,27 +725,24 @@ _hb_ot_layout_collect_features_languages (hb_face_t *face, const hb_tag_t *features, hb_set_t *feature_indexes /* OUT */) { - _hb_ot_layout_collect_features_features (face, - table_tag, - script_index, - HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX, - features, - feature_indexes); - + const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); if (!languages) { - /* All languages */ + /* All languages. */ + langsys_collect_features (g, + g.get_script (script_index).get_default_lang_sys (), + features, + feature_indexes); + unsigned int count = hb_ot_layout_script_get_language_tags (face, table_tag, script_index, 0, nullptr, nullptr); for (unsigned int language_index = 0; language_index < count; language_index++) - _hb_ot_layout_collect_features_features (face, - table_tag, - script_index, - language_index, - features, - feature_indexes); + langsys_collect_features (g, + g.get_script (script_index).get_lang_sys (language_index), + features, + feature_indexes); } else { @@ -760,12 +755,10 @@ _hb_ot_layout_collect_features_languages (hb_face_t *face, 1, languages, &language_index)) - _hb_ot_layout_collect_features_features (face, - table_tag, - script_index, - language_index, - features, - feature_indexes); + langsys_collect_features (g, + g.get_script (script_index).get_lang_sys (language_index), + features, + feature_indexes); } } } @@ -785,7 +778,7 @@ hb_ot_layout_collect_features (hb_face_t *face, { if (!scripts) { - /* All scripts */ + /* All scripts. */ unsigned int count = hb_ot_layout_table_get_script_tags (face, table_tag, 0, nullptr, nullptr);