unsigned int script_index,
unsigned int language_index,
const hb_tag_t *features,
+ hb_set_t *visited_features,
hb_set_t *lookup_indexes /* OUT */)
{
if (!features)
script_index,
language_index,
&required_feature_index,
- nullptr))
- _hb_ot_layout_collect_lookups_lookups (face,
- table_tag,
- required_feature_index,
- lookup_indexes);
+ nullptr)
+ && !visited_features->has (required_feature_index))
+ {
+ _hb_ot_layout_collect_lookups_lookups (face,
+ table_tag,
+ required_feature_index,
+ lookup_indexes);
+ visited_features->add (required_feature_index);
+ }
/* All features */
unsigned int feature_indices[32];
feature_indices);
for (unsigned int i = 0; i < len; i++)
+ {
+ if (visited_features->has (feature_indices[i])) continue;
_hb_ot_layout_collect_lookups_lookups (face,
table_tag,
feature_indices[i],
lookup_indexes);
+ visited_features->add (feature_indices[i]);
+ }
offset += len;
} while (len == ARRAY_LENGTH (feature_indices));
unsigned int script_index,
const hb_tag_t *languages,
const hb_tag_t *features,
+ hb_set_t *visited_features,
hb_set_t *lookup_indexes /* OUT */)
{
_hb_ot_layout_collect_lookups_features (face,
script_index,
HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX,
features,
+ visited_features,
lookup_indexes);
if (!languages)
script_index,
language_index,
features,
+ visited_features,
lookup_indexes);
}
else
script_index,
language_index,
features,
+ visited_features,
lookup_indexes);
}
}
const hb_tag_t *features,
hb_set_t *lookup_indexes /* OUT */)
{
+ hb_auto_t<hb_set_t> visited_features;
if (!scripts)
{
/* All scripts */
script_index,
languages,
features,
+ &visited_features,
lookup_indexes);
}
else
script_index,
languages,
features,
+ &visited_features,
lookup_indexes);
}
}