diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 022460a26..11d306026 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -401,6 +401,103 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face, return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes); } +static void +_hb_ot_layout_collect_lookups_lookups (hb_face_t *face, + hb_tag_t table_tag, + unsigned int feature_index, + hb_set_t *lookup_indexes /* OUT */) +{ + unsigned int lookup_indices[32]; + unsigned int offset, len; + + offset = 0; + do { + len = ARRAY_LENGTH (lookup_indices); + hb_ot_layout_feature_get_lookups (face, + table_tag, + feature_index, + offset, &len, + lookup_indices); + + for (unsigned int i = 0; i < len; i++) + lookup_indexes->add (lookup_indices[i]); + + offset += len; + } while (len == ARRAY_LENGTH (lookup_indices)); +} + +static void +_hb_ot_layout_collect_lookups_features (hb_face_t *face, + hb_tag_t table_tag, + unsigned int script_index, + unsigned int language_index, + const hb_tag_t *features, + hb_set_t *lookup_indexes /* OUT */) +{ + if (!features) + { + /* All features */ + unsigned int count = hb_ot_layout_language_get_feature_tags (face, table_tag, script_index, language_index, 0, NULL, NULL); + for (unsigned int feature_index = 0; feature_index < count; feature_index++) + _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, lookup_indexes); + } else { + for (; *features; features++) + { + unsigned int feature_index; + if (hb_ot_layout_language_find_feature (face, table_tag, script_index, language_index, *features, &feature_index)) + _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, lookup_indexes); + } + } +} + +static void +_hb_ot_layout_collect_lookups_languages (hb_face_t *face, + hb_tag_t table_tag, + unsigned int script_index, + const hb_tag_t *languages, + const hb_tag_t *features, + hb_set_t *lookup_indexes /* OUT */) +{ + if (!languages) + { + /* All languages */ + unsigned int count = hb_ot_layout_script_get_language_tags (face, table_tag, script_index, 0, NULL, NULL); + for (unsigned int language_index = 0; language_index < count; language_index++) + _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, language_index, features, lookup_indexes); + } else { + for (; *languages; languages++) + { + unsigned int language_index; + if (hb_ot_layout_script_find_language (face, table_tag, script_index, *languages, &language_index)) + _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, language_index, features, lookup_indexes); + } + } +} + +void +hb_ot_layout_collect_lookups (hb_face_t *face, + hb_tag_t table_tag, + const hb_tag_t *scripts, + const hb_tag_t *languages, + const hb_tag_t *features, + hb_set_t *lookup_indexes /* OUT */) +{ + if (!scripts) + { + /* All scripts */ + unsigned int count = hb_ot_layout_table_get_script_tags (face, table_tag, 0, NULL, NULL); + for (unsigned int script_index = 0; script_index < count; script_index++) + _hb_ot_layout_collect_lookups_languages (face, table_tag, script_index, languages, features, lookup_indexes); + } else { + for (; *scripts; scripts++) + { + unsigned int script_index; + if (hb_ot_layout_table_find_script (face, table_tag, *scripts, &script_index)) + _hb_ot_layout_collect_lookups_languages (face, table_tag, script_index, languages, features, lookup_indexes); + } + } +} + void hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, hb_tag_t table_tag, diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h index f97c893eb..ed7298c86 100644 --- a/src/hb-ot-layout.h +++ b/src/hb-ot-layout.h @@ -179,15 +179,13 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face, unsigned int *lookup_count /* IN/OUT */, unsigned int *lookup_indexes /* OUT */); -#ifdef HB_NOT_IMPLEMENTED void -Xhb_ot_layout_collect_lookups (hb_face_t *face, +hb_ot_layout_collect_lookups (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */); -#endif void hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,