|
|
|
@ -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, |
|
|
|
|