Index: third_party/harfbuzz-ng/src/hb-ot-shape-fallback.cc |
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-fallback.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-fallback.cc |
index 3341825449bd38274e6536f02a119901594c5eb9..449b64e5ca792edcae1799d586ade74d25bce4a8 100644 |
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-fallback.cc |
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-fallback.cc |
@@ -260,7 +260,13 @@ position_mark (const hb_ot_shape_plan_t *plan, |
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: |
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: |
- pos.y_offset += base_extents.y_bearing + base_extents.height - mark_extents.y_bearing; |
+ pos.y_offset = base_extents.y_bearing + base_extents.height - mark_extents.y_bearing; |
+ /* Never shift up "below" marks. */ |
+ if ((y_gap > 0) == (pos.y_offset > 0)) |
+ { |
+ base_extents.height -= pos.y_offset; |
+ pos.y_offset = 0; |
+ } |
base_extents.height += mark_extents.height; |
break; |
@@ -274,7 +280,15 @@ position_mark (const hb_ot_shape_plan_t *plan, |
case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: |
case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: |
- pos.y_offset += base_extents.y_bearing - (mark_extents.y_bearing + mark_extents.height); |
+ pos.y_offset = base_extents.y_bearing - (mark_extents.y_bearing + mark_extents.height); |
+ /* Don't shift down "above" marks too much. */ |
+ if ((y_gap > 0) != (pos.y_offset > 0)) |
+ { |
+ unsigned int correction = -pos.y_offset / 2; |
+ base_extents.y_bearing += correction; |
+ base_extents.height -= correction; |
+ pos.y_offset += correction; |
+ } |
base_extents.y_bearing -= mark_extents.height; |
base_extents.height += mark_extents.height; |
break; |
@@ -300,8 +314,8 @@ position_around_base (const hb_ot_shape_plan_t *plan, |
base_extents.x_bearing += buffer->pos[base].x_offset; |
base_extents.y_bearing += buffer->pos[base].y_offset; |
- unsigned int lig_id = get_lig_id (buffer->info[base]); |
- unsigned int num_lig_components = get_lig_num_comps (buffer->info[base]); |
+ unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[base]); |
+ unsigned int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]); |
hb_position_t x_offset = 0, y_offset = 0; |
if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) { |
@@ -317,8 +331,8 @@ position_around_base (const hb_ot_shape_plan_t *plan, |
if (_hb_glyph_info_get_modified_combining_class (&buffer->info[i])) |
{ |
if (num_lig_components > 1) { |
- unsigned int this_lig_id = get_lig_id (buffer->info[i]); |
- unsigned int this_lig_component = get_lig_comp (buffer->info[i]) - 1; |
+ unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[i]); |
+ unsigned int this_lig_component = _hb_glyph_info_get_lig_comp (&buffer->info[i]) - 1; |
/* Conditions for attaching to the last component. */ |
if (!lig_id || lig_id != this_lig_id || this_lig_component >= num_lig_components) |
this_lig_component = num_lig_components - 1; |
@@ -416,40 +430,52 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, |
hb_font_t *font, |
hb_buffer_t *buffer) |
{ |
- unsigned int count = buffer->len; |
hb_mask_t kern_mask = plan->map.get_1_mask (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction) ? |
HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n')); |
+ if (!kern_mask) return; |
+ |
+ unsigned int count = buffer->len; |
- OT::hb_apply_context_t c (1, font, buffer, kern_mask, true/*auto_zwj*/); |
+ OT::hb_apply_context_t c (1, font, buffer); |
+ c.set_lookup_mask (kern_mask); |
c.set_lookup_props (OT::LookupFlag::IgnoreMarks); |
- for (buffer->idx = 0; buffer->idx < count;) |
+ hb_glyph_info_t *info = buffer->info; |
+ hb_glyph_position_t *pos = buffer->pos; |
+ |
+ for (unsigned int idx = 0; idx < count;) |
{ |
- OT::hb_apply_context_t::skipping_forward_iterator_t skippy_iter (&c, buffer->idx, 1); |
+ OT::hb_apply_context_t::skipping_forward_iterator_t skippy_iter (&c, idx, 1); |
if (!skippy_iter.next ()) |
{ |
- buffer->idx++; |
+ idx++; |
continue; |
} |
- hb_position_t x_kern, y_kern, kern1, kern2; |
- font->get_glyph_kerning_for_direction (buffer->info[buffer->idx].codepoint, |
- buffer->info[skippy_iter.idx].codepoint, |
+ hb_position_t x_kern, y_kern; |
+ font->get_glyph_kerning_for_direction (info[idx].codepoint, |
+ info[skippy_iter.idx].codepoint, |
buffer->props.direction, |
&x_kern, &y_kern); |
- kern1 = x_kern >> 1; |
- kern2 = x_kern - kern1; |
- buffer->pos[buffer->idx].x_advance += kern1; |
- buffer->pos[skippy_iter.idx].x_advance += kern2; |
- buffer->pos[skippy_iter.idx].x_offset += kern2; |
+ if (x_kern) |
+ { |
+ hb_position_t kern1 = x_kern >> 1; |
+ hb_position_t kern2 = x_kern - kern1; |
+ pos[idx].x_advance += kern1; |
+ pos[skippy_iter.idx].x_advance += kern2; |
+ pos[skippy_iter.idx].x_offset += kern2; |
+ } |
- kern1 = y_kern >> 1; |
- kern2 = y_kern - kern1; |
- buffer->pos[buffer->idx].y_advance += kern1; |
- buffer->pos[skippy_iter.idx].y_advance += kern2; |
- buffer->pos[skippy_iter.idx].y_offset += kern2; |
+ if (y_kern) |
+ { |
+ hb_position_t kern1 = y_kern >> 1; |
+ hb_position_t kern2 = y_kern - kern1; |
+ pos[idx].y_advance += kern1; |
+ pos[skippy_iter.idx].y_advance += kern2; |
+ pos[skippy_iter.idx].y_offset += kern2; |
+ } |
- buffer->idx = skippy_iter.idx; |
+ idx = skippy_iter.idx; |
} |
} |