[layout] Add hb_collect_features_context_t

Towards https://github.com/harfbuzz/harfbuzz/pull/1317
This commit is contained in:
Behdad Esfahbod 2018-10-25 21:26:08 -07:00
parent c237cdfcc7
commit 941600a9e0
1 changed files with 36 additions and 30 deletions

View File

@ -655,20 +655,32 @@ hb_ot_layout_table_get_lookup_count (hb_face_t *face,
return get_gsubgpos_table (face, table_tag).get_lookup_count (); return get_gsubgpos_table (face, table_tag).get_lookup_count ();
} }
struct hb_collect_features_context_t
{
hb_collect_features_context_t (hb_face_t *face,
hb_tag_t table_tag,
hb_set_t *feature_indexes_)
: g (get_gsubgpos_table (face, table_tag)),
feature_indexes (feature_indexes_) {}
const OT::GSUBGPOS &g;
hb_set_t *feature_indexes;
};
static void static void
langsys_collect_features (const OT::GSUBGPOS &g, langsys_collect_features (hb_collect_features_context_t *c,
const OT::LangSys &l, const OT::LangSys &l,
const hb_tag_t *features, const hb_tag_t *features)
hb_set_t *feature_indexes /* OUT */)
{ {
if (!features) if (!features)
{ {
/* All features. */ /* All features. */
unsigned int index = l.get_required_feature_index (); unsigned int index = l.get_required_feature_index ();
if (index != HB_OT_LAYOUT_NO_FEATURE_INDEX) if (index != HB_OT_LAYOUT_NO_FEATURE_INDEX)
feature_indexes->add (index); c->feature_indexes->add (index);
l.add_feature_indexes_to (feature_indexes); l.add_feature_indexes_to (c->feature_indexes);
} }
else else
{ {
@ -682,9 +694,9 @@ langsys_collect_features (const OT::GSUBGPOS &g,
{ {
unsigned int feature_index = l.get_feature_index (i); unsigned int feature_index = l.get_feature_index (i);
if (feature_tag == g.get_feature_tag (feature_index)) if (feature_tag == c->g.get_feature_tag (feature_index))
{ {
feature_indexes->add (feature_index); c->feature_indexes->add (feature_index);
break; break;
} }
} }
@ -693,26 +705,23 @@ langsys_collect_features (const OT::GSUBGPOS &g,
} }
static void static void
script_collect_features (const OT::GSUBGPOS &g, script_collect_features (hb_collect_features_context_t *c,
const OT::Script &s, const OT::Script &s,
const hb_tag_t *languages, const hb_tag_t *languages,
const hb_tag_t *features, const hb_tag_t *features)
hb_set_t *feature_indexes /* OUT */)
{ {
if (!languages) if (!languages)
{ {
/* All languages. */ /* All languages. */
langsys_collect_features (g, langsys_collect_features (c,
s.get_default_lang_sys (), s.get_default_lang_sys (),
features, features);
feature_indexes);
unsigned int count = s.get_lang_sys_count (); unsigned int count = s.get_lang_sys_count ();
for (unsigned int language_index = 0; language_index < count; language_index++) for (unsigned int language_index = 0; language_index < count; language_index++)
langsys_collect_features (g, langsys_collect_features (c,
s.get_lang_sys (language_index), s.get_lang_sys (language_index),
features, features);
feature_indexes);
} }
else else
{ {
@ -720,10 +729,9 @@ script_collect_features (const OT::GSUBGPOS &g,
{ {
unsigned int language_index; unsigned int language_index;
if (s.find_lang_sys_index (*languages, &language_index)) if (s.find_lang_sys_index (*languages, &language_index))
langsys_collect_features (g, langsys_collect_features (c,
s.get_lang_sys (language_index), s.get_lang_sys (language_index),
features, features);
feature_indexes);
} }
} }
} }
@ -741,29 +749,27 @@ hb_ot_layout_collect_features (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 */)
{ {
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); hb_collect_features_context_t c (face, table_tag, feature_indexes);
if (!scripts) if (!scripts)
{ {
/* All scripts. */ /* All scripts. */
unsigned int count = g.get_script_count (); unsigned int count = c.g.get_script_count ();
for (unsigned int script_index = 0; script_index < count; script_index++) for (unsigned int script_index = 0; script_index < count; script_index++)
script_collect_features (g, script_collect_features (&c,
g.get_script (script_index), c.g.get_script (script_index),
languages, languages,
features, features);
feature_indexes);
} }
else else
{ {
for (; *scripts; scripts++) for (; *scripts; scripts++)
{ {
unsigned int script_index; unsigned int script_index;
if (g.find_script_index (*scripts, &script_index)) if (c.g.find_script_index (*scripts, &script_index))
script_collect_features (g, script_collect_features (&c,
g.get_script (script_index), c.g.get_script (script_index),
languages, languages,
features, features);
feature_indexes);
} }
} }
} }