| Index: third_party/harfbuzz-ng/src/hb-ot-map.cc
|
| diff --git a/third_party/harfbuzz-ng/src/hb-ot-map.cc b/third_party/harfbuzz-ng/src/hb-ot-map.cc
|
| index 17e3f4065e3c6347207e7d0a565dad50c2bede61..9b331d5210f4264fda5caa3b8034a6f16b7be46a 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-map.cc
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-map.cc
|
| @@ -31,44 +31,13 @@
|
| #include "hb-ot-layout-private.hh"
|
|
|
|
|
| -void
|
| -hb_ot_map_t::add_lookups (hb_face_t *face,
|
| - unsigned int table_index,
|
| - unsigned int feature_index,
|
| - hb_mask_t mask,
|
| - bool auto_zwj)
|
| +void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_out) const
|
| {
|
| - unsigned int lookup_indices[32];
|
| - unsigned int offset, len;
|
| - unsigned int table_lookup_count;
|
| -
|
| - table_lookup_count = hb_ot_layout_table_get_lookup_count (face, table_tags[table_index]);
|
| -
|
| - offset = 0;
|
| - do {
|
| - len = ARRAY_LENGTH (lookup_indices);
|
| - hb_ot_layout_feature_get_lookups (face,
|
| - table_tags[table_index],
|
| - feature_index,
|
| - offset, &len,
|
| - lookup_indices);
|
| -
|
| - for (unsigned int i = 0; i < len; i++)
|
| - {
|
| - if (lookup_indices[i] >= table_lookup_count)
|
| - continue;
|
| - hb_ot_map_t::lookup_map_t *lookup = lookups[table_index].push ();
|
| - if (unlikely (!lookup))
|
| - return;
|
| - lookup->mask = mask;
|
| - lookup->index = lookup_indices[i];
|
| - lookup->auto_zwj = auto_zwj;
|
| - }
|
| -
|
| - offset += len;
|
| - } while (len == ARRAY_LENGTH (lookup_indices));
|
| + for (unsigned int i = 0; i < lookups[table_index].len; i++)
|
| + hb_set_add (lookups_out, lookups[table_index][i].index);
|
| }
|
|
|
| +
|
| hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
|
| const hb_segment_properties_t *props_)
|
| {
|
| @@ -109,13 +78,48 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value,
|
| info->stage[1] = current_stage[1];
|
| }
|
|
|
| -
|
| -void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_out) const
|
| +void
|
| +hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
|
| + hb_face_t *face,
|
| + unsigned int table_index,
|
| + unsigned int feature_index,
|
| + unsigned int variations_index,
|
| + hb_mask_t mask,
|
| + bool auto_zwj)
|
| {
|
| - for (unsigned int i = 0; i < lookups[table_index].len; i++)
|
| - hb_set_add (lookups_out, lookups[table_index][i].index);
|
| + unsigned int lookup_indices[32];
|
| + unsigned int offset, len;
|
| + unsigned int table_lookup_count;
|
| +
|
| + table_lookup_count = hb_ot_layout_table_get_lookup_count (face, table_tags[table_index]);
|
| +
|
| + offset = 0;
|
| + do {
|
| + len = ARRAY_LENGTH (lookup_indices);
|
| + hb_ot_layout_feature_with_variations_get_lookups (face,
|
| + table_tags[table_index],
|
| + feature_index,
|
| + variations_index,
|
| + offset, &len,
|
| + lookup_indices);
|
| +
|
| + for (unsigned int i = 0; i < len; i++)
|
| + {
|
| + if (lookup_indices[i] >= table_lookup_count)
|
| + continue;
|
| + hb_ot_map_t::lookup_map_t *lookup = m.lookups[table_index].push ();
|
| + if (unlikely (!lookup))
|
| + return;
|
| + lookup->mask = mask;
|
| + lookup->index = lookup_indices[i];
|
| + lookup->auto_zwj = auto_zwj;
|
| + }
|
| +
|
| + offset += len;
|
| + } while (len == ARRAY_LENGTH (lookup_indices));
|
| }
|
|
|
| +
|
| void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func)
|
| {
|
| stage_info_t *s = stages[table_index].push ();
|
| @@ -128,7 +132,9 @@ void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::paus
|
| }
|
|
|
| void
|
| -hb_ot_map_builder_t::compile (hb_ot_map_t &m)
|
| +hb_ot_map_builder_t::compile (hb_ot_map_t &m,
|
| + const int *coords,
|
| + unsigned int num_coords)
|
| {
|
| m.global_mask = 1;
|
|
|
| @@ -262,23 +268,32 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m)
|
| {
|
| /* Collect lookup indices for features */
|
|
|
| + unsigned int variations_index;
|
| + hb_ot_layout_table_find_feature_variations (face,
|
| + table_tags[table_index],
|
| + coords,
|
| + num_coords,
|
| + &variations_index);
|
| +
|
| unsigned int stage_index = 0;
|
| unsigned int last_num_lookups = 0;
|
| for (unsigned stage = 0; stage < current_stage[table_index]; stage++)
|
| {
|
| if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
|
| required_feature_stage[table_index] == stage)
|
| - m.add_lookups (face, table_index,
|
| - required_feature_index[table_index],
|
| - 1 /* mask */,
|
| - true /* auto_zwj */);
|
| + add_lookups (m, face, table_index,
|
| + required_feature_index[table_index],
|
| + variations_index,
|
| + 1 /* mask */,
|
| + true /* auto_zwj */);
|
|
|
| for (unsigned i = 0; i < m.features.len; i++)
|
| if (m.features[i].stage[table_index] == stage)
|
| - m.add_lookups (face, table_index,
|
| - m.features[i].index[table_index],
|
| - m.features[i].mask,
|
| - m.features[i].auto_zwj);
|
| + add_lookups (m, face, table_index,
|
| + m.features[i].index[table_index],
|
| + variations_index,
|
| + m.features[i].mask,
|
| + m.features[i].auto_zwj);
|
|
|
| /* Sort lookups and merge duplicates */
|
| if (last_num_lookups < m.lookups[table_index].len)
|
|
|