[OTLayout] Implement hb_ot_layout_collect_lookups()
Untested.
This commit is contained in:
parent
1ea375da44
commit
a88e716021
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue