| 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 bebf3ed74ed61b08d8cecbd68ef8ed56a4b74e8e..f290c98a8798a30c30d952e5c40087886ca01c54 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-map.cc
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-map.cc
|
| @@ -28,9 +28,6 @@
|
|
|
| #include "hb-ot-map-private.hh"
|
|
|
| -#include "hb-ot-shape-private.hh"
|
| -
|
| -
|
|
|
| void
|
| hb_ot_map_t::add_lookups (hb_face_t *face,
|
| @@ -63,7 +60,7 @@ hb_ot_map_t::add_lookups (hb_face_t *face,
|
| }
|
|
|
|
|
| -void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, bool global)
|
| +void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, bool global, bool has_fallback)
|
| {
|
| feature_info_t *info = feature_infos.push();
|
| if (unlikely (!info)) return;
|
| @@ -71,55 +68,65 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, bool gl
|
| info->seq = feature_infos.len;
|
| info->max_value = value;
|
| info->global = global;
|
| + info->has_fallback = has_fallback;
|
| info->default_value = global ? value : 0;
|
| info->stage[0] = current_stage[0];
|
| info->stage[1] = current_stage[1];
|
| }
|
|
|
| -void hb_ot_map_t::apply (unsigned int table_index,
|
| - hb_ot_map_t::apply_lookup_func_t apply_lookup_func,
|
| - void *face_or_font,
|
| - hb_buffer_t *buffer) const
|
| +/* Keep the next two functions in sync. */
|
| +
|
| +void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
|
| {
|
| + const unsigned int table_index = 0;
|
| unsigned int i = 0;
|
|
|
| for (unsigned int pause_index = 0; pause_index < pauses[table_index].len; pause_index++) {
|
| const pause_map_t *pause = &pauses[table_index][pause_index];
|
| for (; i < pause->num_lookups; i++)
|
| - apply_lookup_func (face_or_font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
|
| + hb_ot_layout_substitute_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
|
| +
|
| + buffer->clear_output ();
|
|
|
| - pause->callback.func (this, face_or_font, buffer, pause->callback.user_data);
|
| + if (pause->callback)
|
| + pause->callback (plan, font, buffer);
|
| }
|
|
|
| for (; i < lookups[table_index].len; i++)
|
| - apply_lookup_func (face_or_font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
|
| + hb_ot_layout_substitute_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
|
| }
|
|
|
| -void hb_ot_map_t::substitute_closure (hb_face_t *face,
|
| - hb_set_t *glyphs) const
|
| +void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
|
| {
|
| - unsigned int table_index = 0;
|
| + const unsigned int table_index = 1;
|
| unsigned int i = 0;
|
|
|
| for (unsigned int pause_index = 0; pause_index < pauses[table_index].len; pause_index++) {
|
| const pause_map_t *pause = &pauses[table_index][pause_index];
|
| for (; i < pause->num_lookups; i++)
|
| - hb_ot_layout_substitute_closure_lookup (face, glyphs, lookups[table_index][i].index);
|
| + hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
|
| +
|
| + if (pause->callback)
|
| + pause->callback (plan, font, buffer);
|
| }
|
|
|
| for (; i < lookups[table_index].len; i++)
|
| - hb_ot_layout_substitute_closure_lookup (face, glyphs, lookups[table_index][i].index);
|
| + hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
|
| }
|
|
|
| -void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func, void *user_data)
|
| +void hb_ot_map_t::substitute_closure (const hb_ot_shape_plan_t *plan, hb_face_t *face, hb_set_t *glyphs) const
|
| {
|
| - if (pause_func) {
|
| - pause_info_t *p = pauses[table_index].push ();
|
| - if (likely (p)) {
|
| - p->stage = current_stage[table_index];
|
| - p->callback.func = pause_func;
|
| - p->callback.user_data = user_data;
|
| - }
|
| + unsigned int table_index = 0;
|
| + for (unsigned int i = 0; i < lookups[table_index].len; i++)
|
| + hb_ot_layout_substitute_closure_lookup (face, lookups[table_index][i].index, glyphs);
|
| +}
|
| +
|
| +void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func)
|
| +{
|
| + pause_info_t *p = pauses[table_index].push ();
|
| + if (likely (p)) {
|
| + p->stage = current_stage[table_index];
|
| + p->callback = pause_func;
|
| }
|
|
|
| current_stage[table_index]++;
|
| @@ -169,6 +176,7 @@ hb_ot_map_builder_t::compile (hb_face_t *face,
|
| feature_infos[j].global = false;
|
| feature_infos[j].max_value = MAX (feature_infos[j].max_value, feature_infos[i].max_value);
|
| }
|
| + feature_infos[j].has_fallback = feature_infos[j].has_fallback || feature_infos[i].has_fallback;
|
| feature_infos[j].stage[0] = MIN (feature_infos[j].stage[0], feature_infos[i].stage[0]);
|
| feature_infos[j].stage[1] = MIN (feature_infos[j].stage[1], feature_infos[i].stage[1]);
|
| /* Inherit default_value from j */
|
| @@ -203,7 +211,7 @@ hb_ot_map_builder_t::compile (hb_face_t *face,
|
| language_index[table_index],
|
| info->tag,
|
| &feature_index[table_index]);
|
| - if (!found)
|
| + if (!found && !info->has_fallback)
|
| continue;
|
|
|
|
|
| @@ -228,13 +236,14 @@ hb_ot_map_builder_t::compile (hb_face_t *face,
|
| m.global_mask |= (info->default_value << map->shift) & map->mask;
|
| }
|
| map->_1_mask = (1 << map->shift) & map->mask;
|
| + map->needs_fallback = !found;
|
|
|
| }
|
| feature_infos.shrink (0); /* Done with these */
|
|
|
|
|
| - add_gsub_pause (NULL, NULL);
|
| - add_gpos_pause (NULL, NULL);
|
| + add_gsub_pause (NULL);
|
| + add_gpos_pause (NULL);
|
|
|
| for (unsigned int table_index = 0; table_index < 2; table_index++) {
|
| hb_tag_t table_tag = table_tags[table_index];
|
| @@ -285,5 +294,3 @@ hb_ot_map_builder_t::compile (hb_face_t *face,
|
| }
|
| }
|
| }
|
| -
|
| -
|
|
|