[OTLayout] Implement hb_ot_layout_collect_lookups()

Untested.
This commit is contained in:
Behdad Esfahbod 2012-11-24 02:31:02 -05:00
parent 1ea375da44
commit a88e716021
2 changed files with 98 additions and 3 deletions

View File

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

View File

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