[lookup] More prep work for memoizing collect_features

https://github.com/harfbuzz/harfbuzz/pull/1317
This commit is contained in:
Behdad Esfahbod 2018-10-25 20:48:20 -07:00
parent 96828b97a8
commit e8e67503ff
2 changed files with 39 additions and 44 deletions

View File

@ -277,6 +277,8 @@ struct Script
{ return langSys.find_index (tag, index); } { return langSys.find_index (tag, index); }
inline bool has_default_lang_sys (void) const { return defaultLangSys != 0; } 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 const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
inline bool subset (hb_subset_context_t *c) const inline bool subset (hb_subset_context_t *c) const

View File

@ -681,40 +681,38 @@ _hb_ot_layout_collect_lookups_lookups (hb_face_t *face,
} }
static void static void
_hb_ot_layout_collect_features_features (hb_face_t *face, langsys_collect_features (const OT::GSUBGPOS &g,
hb_tag_t table_tag, const OT::LangSys &l,
unsigned int script_index,
unsigned int language_index,
const hb_tag_t *features, const hb_tag_t *features,
hb_set_t *feature_indexes /* OUT */) hb_set_t *feature_indexes /* OUT */)
{ {
if (!features) if (!features)
{ {
unsigned int required_feature_index; /* All features. */
if (hb_ot_layout_language_get_required_feature (face, unsigned int index = l.get_required_feature_index ();
table_tag, if (index != HB_OT_LAYOUT_NO_FEATURE_INDEX)
script_index, feature_indexes->add (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);
l.add_feature_indexes_to (feature_indexes); l.add_feature_indexes_to (feature_indexes);
} }
else else
{ {
/* Ugh. Any faster way? */
for (; *features; features++) for (; *features; features++)
{ {
hb_tag_t feature_tag = *features;
unsigned int feature_index; unsigned int feature_index;
if (hb_ot_layout_language_find_feature (face, unsigned int num_features = l.get_feature_count ();
table_tag, for (unsigned int i = 0; i < num_features; i++)
script_index, {
language_index, unsigned int feature_index = l.get_feature_index (i);
*features,
&feature_index)) if (feature_tag == g.get_feature_tag (feature_index))
{
feature_indexes->add (feature_index); feature_indexes->add (feature_index);
break;
}
}
} }
} }
} }
@ -727,25 +725,22 @@ _hb_ot_layout_collect_features_languages (hb_face_t *face,
const hb_tag_t *features, const hb_tag_t *features,
hb_set_t *feature_indexes /* OUT */) hb_set_t *feature_indexes /* OUT */)
{ {
_hb_ot_layout_collect_features_features (face, const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
table_tag, if (!languages)
script_index, {
HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX, /* All languages. */
langsys_collect_features (g,
g.get_script (script_index).get_default_lang_sys (),
features, features,
feature_indexes); feature_indexes);
if (!languages)
{
/* All languages */
unsigned int count = hb_ot_layout_script_get_language_tags (face, unsigned int count = hb_ot_layout_script_get_language_tags (face,
table_tag, table_tag,
script_index, script_index,
0, nullptr, nullptr); 0, nullptr, nullptr);
for (unsigned int language_index = 0; language_index < count; language_index++) for (unsigned int language_index = 0; language_index < count; language_index++)
_hb_ot_layout_collect_features_features (face, langsys_collect_features (g,
table_tag, g.get_script (script_index).get_lang_sys (language_index),
script_index,
language_index,
features, features,
feature_indexes); feature_indexes);
} }
@ -760,10 +755,8 @@ _hb_ot_layout_collect_features_languages (hb_face_t *face,
1, 1,
languages, languages,
&language_index)) &language_index))
_hb_ot_layout_collect_features_features (face, langsys_collect_features (g,
table_tag, g.get_script (script_index).get_lang_sys (language_index),
script_index,
language_index,
features, features,
feature_indexes); feature_indexes);
} }
@ -785,7 +778,7 @@ hb_ot_layout_collect_features (hb_face_t *face,
{ {
if (!scripts) if (!scripts)
{ {
/* All scripts */ /* All scripts. */
unsigned int count = hb_ot_layout_table_get_script_tags (face, unsigned int count = hb_ot_layout_table_get_script_tags (face,
table_tag, table_tag,
0, nullptr, nullptr); 0, nullptr, nullptr);