| 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 748372d01fe80f811ffc7e0a83dd9c32633f8e07..c9cf737f48653f24c2e395a75ac3aaf80c2c81bb 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-shape-fallback.cc
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-shape-fallback.cc
|
| @@ -224,7 +224,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
|
| pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
|
| break;
|
| }
|
| - /* Fall through */
|
| + HB_FALLTHROUGH;
|
|
|
| default:
|
| case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
|
| @@ -259,6 +259,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
|
| case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT:
|
| /* Add gap, fall-through. */
|
| base_extents.height -= y_gap;
|
| + HB_FALLTHROUGH;
|
|
|
| case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT:
|
| case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
|
| @@ -279,6 +280,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
|
| /* Add gap, fall-through. */
|
| base_extents.y_bearing += y_gap;
|
| base_extents.height -= y_gap;
|
| + HB_FALLTHROUGH;
|
|
|
| case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE:
|
| case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT:
|
| @@ -482,3 +484,70 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
|
| idx = skippy_iter.idx;
|
| }
|
| }
|
| +
|
| +
|
| +/* Adjusts width of various spaces. */
|
| +void
|
| +_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
|
| + hb_font_t *font,
|
| + hb_buffer_t *buffer)
|
| +{
|
| + if (!HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
|
| + return;
|
| +
|
| + hb_glyph_info_t *info = buffer->info;
|
| + hb_glyph_position_t *pos = buffer->pos;
|
| + unsigned int count = buffer->len;
|
| + for (unsigned int i = 0; i < count; i++)
|
| + if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i]))
|
| + {
|
| + hb_unicode_funcs_t::space_t space_type = _hb_glyph_info_get_unicode_space_fallback_type (&info[i]);
|
| + hb_codepoint_t glyph;
|
| + typedef hb_unicode_funcs_t t;
|
| + switch (space_type)
|
| + {
|
| + case t::NOT_SPACE: /* Shouldn't happen. */
|
| + case t::SPACE:
|
| + break;
|
| +
|
| + case t::SPACE_EM:
|
| + case t::SPACE_EM_2:
|
| + case t::SPACE_EM_3:
|
| + case t::SPACE_EM_4:
|
| + case t::SPACE_EM_5:
|
| + case t::SPACE_EM_6:
|
| + case t::SPACE_EM_16:
|
| + pos[i].x_advance = (font->x_scale + ((int) space_type)/2) / (int) space_type;
|
| + break;
|
| +
|
| + case t::SPACE_4_EM_18:
|
| + pos[i].x_advance = font->x_scale * 4 / 18;
|
| + break;
|
| +
|
| + case t::SPACE_FIGURE:
|
| + for (char u = '0'; u <= '9'; u++)
|
| + if (font->get_glyph (u, 0, &glyph))
|
| + {
|
| + pos[i].x_advance = font->get_glyph_h_advance (glyph);
|
| + break;
|
| + }
|
| + break;
|
| +
|
| + case t::SPACE_PUNCTUATION:
|
| + if (font->get_glyph ('.', 0, &glyph))
|
| + pos[i].x_advance = font->get_glyph_h_advance (glyph);
|
| + else if (font->get_glyph (',', 0, &glyph))
|
| + pos[i].x_advance = font->get_glyph_h_advance (glyph);
|
| + break;
|
| +
|
| + case t::SPACE_NARROW:
|
| + /* Half-space?
|
| + * Unicode doc http://www.unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM.
|
| + * However, in my testing, many fonts have their regular space being about that
|
| + * size. To me, a percentage of the space width makes more sense. Half is as
|
| + * good as any. */
|
| + pos[i].x_advance /= 2;
|
| + break;
|
| + }
|
| + }
|
| +}
|
|
|