[lookup] More prep work for memoizing collect_features
https://github.com/harfbuzz/harfbuzz/pull/1317
This commit is contained in:
parent
96828b97a8
commit
e8e67503ff
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue