[subset] use add_array to populate feature_indexes.

This is much faster then calling a bunch of individual add()'s.
This commit is contained in:
Garret Rieger 2018-07-30 18:10:43 -07:00
parent 7d92bef9c5
commit 89733755a4
2 changed files with 27 additions and 20 deletions

View File

@ -190,6 +190,11 @@ struct IndexArray : ArrayOf<Index>
} }
return this->len; return this->len;
} }
inline void add_indexes_to (hb_set_t* output /* OUT */) const
{
output->add_array (arrayZ, len);
}
}; };
@ -208,6 +213,8 @@ struct LangSys
unsigned int *feature_count /* IN/OUT */, unsigned int *feature_count /* IN/OUT */,
unsigned int *feature_indexes /* OUT */) const unsigned int *feature_indexes /* OUT */) const
{ return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); } { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
inline void add_feature_indexes_to (hb_set_t *feature_indexes) const
{ featureIndex.add_indexes_to (feature_indexes); }
inline bool has_required_feature (void) const { return reqFeatureIndex != 0xFFFFu; } inline bool has_required_feature (void) const { return reqFeatureIndex != 0xFFFFu; }
inline unsigned int get_required_feature_index (void) const inline unsigned int get_required_feature_index (void) const

View File

@ -520,6 +520,19 @@ hb_ot_layout_language_get_required_feature (hb_face_t *face,
return l.has_required_feature (); return l.has_required_feature ();
} }
static void
_hb_ot_layout_language_add_feature_indexes_to (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
unsigned int language_index,
hb_set_t *feature_indexes /* OUT */)
{
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);
}
unsigned int unsigned int
hb_ot_layout_language_get_feature_indexes (hb_face_t *face, hb_ot_layout_language_get_feature_indexes (hb_face_t *face,
hb_tag_t table_tag, hb_tag_t table_tag,
@ -677,24 +690,11 @@ _hb_ot_layout_collect_features_features (hb_face_t *face,
feature_indexes->add (required_feature_index); feature_indexes->add (required_feature_index);
/* All features */ /* All features */
unsigned int feature_indices[32]; _hb_ot_layout_language_add_feature_indexes_to (face,
unsigned int offset, len; table_tag,
script_index,
offset = 0; language_index,
do { feature_indexes);
len = ARRAY_LENGTH (feature_indices);
hb_ot_layout_language_get_feature_indexes (face,
table_tag,
script_index,
language_index,
offset, &len,
feature_indices);
for (unsigned int i = 0; i < len; i++)
feature_indexes->add (feature_indices[i]);
offset += len;
} while (len == ARRAY_LENGTH (feature_indices));
} }
else else
{ {
@ -763,9 +763,9 @@ _hb_ot_layout_collect_features_languages (hb_face_t *face,
} }
/** /**
* hb_ot_layout_collect_lookups: * hb_ot_layout_collect_features:
* *
* Since: 0.9.8 * Since: REPLACEME
**/ **/
void void
hb_ot_layout_collect_features (hb_face_t *face, hb_ot_layout_collect_features (hb_face_t *face,