| Index: third_party/harfbuzz-ng/src/hb-font.cc
|
| diff --git a/third_party/harfbuzz-ng/src/hb-font.cc b/third_party/harfbuzz-ng/src/hb-font.cc
|
| index 6a69cae31320723be4c48c7e28c71f31b2ca4a1f..00f9fb6d7e4ae8a77d5827fe9840099e0482a085 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-font.cc
|
| +++ b/third_party/harfbuzz-ng/src/hb-font.cc
|
| @@ -45,130 +45,176 @@
|
| */
|
|
|
| static hb_bool_t
|
| -hb_font_get_glyph_nil (hb_font_t *font,
|
| +hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t unicode,
|
| hb_codepoint_t variation_selector,
|
| hb_codepoint_t *glyph,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent)
|
| - return font->parent->get_glyph (unicode, variation_selector, glyph);
|
| -
|
| *glyph = 0;
|
| return false;
|
| }
|
| +static hb_bool_t
|
| +hb_font_get_glyph_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t unicode,
|
| + hb_codepoint_t variation_selector,
|
| + hb_codepoint_t *glyph,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + return font->parent->get_glyph (unicode, variation_selector, glyph);
|
| +}
|
|
|
| static hb_position_t
|
| -hb_font_get_glyph_h_advance_nil (hb_font_t *font,
|
| +hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t glyph,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent)
|
| - return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
|
| -
|
| return font->x_scale;
|
| }
|
| +static hb_position_t
|
| +hb_font_get_glyph_h_advance_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t glyph,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
|
| +}
|
|
|
| static hb_position_t
|
| -hb_font_get_glyph_v_advance_nil (hb_font_t *font,
|
| +hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t glyph,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent)
|
| - return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
|
| -
|
| return font->y_scale;
|
| }
|
| +static hb_position_t
|
| +hb_font_get_glyph_v_advance_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t glyph,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
|
| +}
|
|
|
| static hb_bool_t
|
| -hb_font_get_glyph_h_origin_nil (hb_font_t *font,
|
| +hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t glyph,
|
| hb_position_t *x,
|
| hb_position_t *y,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent) {
|
| - hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
|
| - if (ret)
|
| - font->parent_scale_position (x, y);
|
| - return ret;
|
| - }
|
| -
|
| *x = *y = 0;
|
| return false;
|
| }
|
| +static hb_bool_t
|
| +hb_font_get_glyph_h_origin_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t glyph,
|
| + hb_position_t *x,
|
| + hb_position_t *y,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
|
| + if (ret)
|
| + font->parent_scale_position (x, y);
|
| + return ret;
|
| +}
|
|
|
| static hb_bool_t
|
| -hb_font_get_glyph_v_origin_nil (hb_font_t *font,
|
| +hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t glyph,
|
| hb_position_t *x,
|
| hb_position_t *y,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent) {
|
| - hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
|
| - if (ret)
|
| - font->parent_scale_position (x, y);
|
| - return ret;
|
| - }
|
| -
|
| *x = *y = 0;
|
| return false;
|
| }
|
| +static hb_bool_t
|
| +hb_font_get_glyph_v_origin_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t glyph,
|
| + hb_position_t *x,
|
| + hb_position_t *y,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
|
| + if (ret)
|
| + font->parent_scale_position (x, y);
|
| + return ret;
|
| +}
|
|
|
| static hb_position_t
|
| -hb_font_get_glyph_h_kerning_nil (hb_font_t *font,
|
| +hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t left_glyph,
|
| hb_codepoint_t right_glyph,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent)
|
| - return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
|
| -
|
| return 0;
|
| }
|
| +static hb_position_t
|
| +hb_font_get_glyph_h_kerning_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t left_glyph,
|
| + hb_codepoint_t right_glyph,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
|
| +}
|
|
|
| static hb_position_t
|
| -hb_font_get_glyph_v_kerning_nil (hb_font_t *font,
|
| +hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t top_glyph,
|
| hb_codepoint_t bottom_glyph,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent)
|
| - return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
|
| -
|
| return 0;
|
| }
|
| +static hb_position_t
|
| +hb_font_get_glyph_v_kerning_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t top_glyph,
|
| + hb_codepoint_t bottom_glyph,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
|
| +}
|
|
|
| static hb_bool_t
|
| -hb_font_get_glyph_extents_nil (hb_font_t *font,
|
| +hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t glyph,
|
| hb_glyph_extents_t *extents,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent) {
|
| - hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
|
| - if (ret) {
|
| - font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
|
| - font->parent_scale_distance (&extents->width, &extents->height);
|
| - }
|
| - return ret;
|
| - }
|
| -
|
| memset (extents, 0, sizeof (*extents));
|
| return false;
|
| }
|
| +static hb_bool_t
|
| +hb_font_get_glyph_extents_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t glyph,
|
| + hb_glyph_extents_t *extents,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
|
| + if (ret) {
|
| + font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
|
| + font->parent_scale_distance (&extents->width, &extents->height);
|
| + }
|
| + return ret;
|
| +}
|
|
|
| static hb_bool_t
|
| -hb_font_get_glyph_contour_point_nil (hb_font_t *font,
|
| +hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t glyph,
|
| unsigned int point_index,
|
| @@ -176,44 +222,63 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font,
|
| hb_position_t *y,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent) {
|
| - hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
|
| - if (ret)
|
| - font->parent_scale_position (x, y);
|
| - return ret;
|
| - }
|
| -
|
| *x = *y = 0;
|
| return false;
|
| }
|
| +static hb_bool_t
|
| +hb_font_get_glyph_contour_point_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t glyph,
|
| + unsigned int point_index,
|
| + hb_position_t *x,
|
| + hb_position_t *y,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
|
| + if (ret)
|
| + font->parent_scale_position (x, y);
|
| + return ret;
|
| +}
|
|
|
| static hb_bool_t
|
| -hb_font_get_glyph_name_nil (hb_font_t *font,
|
| +hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| hb_codepoint_t glyph,
|
| char *name, unsigned int size,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent)
|
| - return font->parent->get_glyph_name (glyph, name, size);
|
| -
|
| if (size) *name = '\0';
|
| return false;
|
| }
|
| +static hb_bool_t
|
| +hb_font_get_glyph_name_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + hb_codepoint_t glyph,
|
| + char *name, unsigned int size,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + return font->parent->get_glyph_name (glyph, name, size);
|
| +}
|
|
|
| static hb_bool_t
|
| -hb_font_get_glyph_from_name_nil (hb_font_t *font,
|
| +hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
|
| void *font_data HB_UNUSED,
|
| const char *name, int len, /* -1 means nul-terminated */
|
| hb_codepoint_t *glyph,
|
| void *user_data HB_UNUSED)
|
| {
|
| - if (font->parent)
|
| - return font->parent->get_glyph_from_name (name, len, glyph);
|
| -
|
| *glyph = 0;
|
| return false;
|
| }
|
| +static hb_bool_t
|
| +hb_font_get_glyph_from_name_parent (hb_font_t *font,
|
| + void *font_data HB_UNUSED,
|
| + const char *name, int len, /* -1 means nul-terminated */
|
| + hb_codepoint_t *glyph,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| + return font->parent->get_glyph_from_name (name, len, glyph);
|
| +}
|
|
|
|
|
| static const hb_font_funcs_t _hb_font_funcs_nil = {
|
| @@ -222,9 +287,44 @@ static const hb_font_funcs_t _hb_font_funcs_nil = {
|
| true, /* immutable */
|
|
|
| {
|
| +#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
|
| + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_FONT_FUNC_IMPLEMENT
|
| + },
|
| + {
|
| +#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
|
| + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_FONT_FUNC_IMPLEMENT
|
| + },
|
| + {
|
| + {
|
| #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
|
| + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_FONT_FUNC_IMPLEMENT
|
| + }
|
| + }
|
| +};
|
| +static const hb_font_funcs_t _hb_font_funcs_parent = {
|
| + HB_OBJECT_HEADER_STATIC,
|
| +
|
| + true, /* immutable */
|
| +
|
| + {
|
| +#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
|
| HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| #undef HB_FONT_FUNC_IMPLEMENT
|
| + },
|
| + {
|
| +#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
|
| + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_FONT_FUNC_IMPLEMENT
|
| + },
|
| + {
|
| + {
|
| +#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent,
|
| + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_FONT_FUNC_IMPLEMENT
|
| + }
|
| }
|
| };
|
|
|
| @@ -246,7 +346,7 @@ hb_font_funcs_create (void)
|
| if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
|
| return hb_font_funcs_get_empty ();
|
|
|
| - ffuncs->get = _hb_font_funcs_nil.get;
|
| + ffuncs->get = _hb_font_funcs_parent.get;
|
|
|
| return ffuncs;
|
| }
|
| @@ -263,7 +363,7 @@ hb_font_funcs_create (void)
|
| hb_font_funcs_t *
|
| hb_font_funcs_get_empty (void)
|
| {
|
| - return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil);
|
| + return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_parent);
|
| }
|
|
|
| /**
|
| @@ -398,11 +498,11 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
|
| ffuncs->destroy.name (ffuncs->user_data.name); \
|
| \
|
| if (func) { \
|
| - ffuncs->get.name = func; \
|
| + ffuncs->get.f.name = func; \
|
| ffuncs->user_data.name = user_data; \
|
| ffuncs->destroy.name = destroy; \
|
| } else { \
|
| - ffuncs->get.name = hb_font_get_##name##_nil; \
|
| + ffuncs->get.f.name = hb_font_get_##name##_parent; \
|
| ffuncs->user_data.name = NULL; \
|
| ffuncs->destroy.name = NULL; \
|
| } \
|
| @@ -411,6 +511,13 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
|
| HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| #undef HB_FONT_FUNC_IMPLEMENT
|
|
|
| +bool
|
| +hb_font_t::has_func (unsigned int i)
|
| +{
|
| + if (parent && parent != hb_font_get_empty () && parent->has_func (i))
|
| + return true;
|
| + return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i];
|
| +}
|
|
|
| /* Public getters */
|
|
|
| @@ -858,6 +965,7 @@ hb_font_create (hb_face_t *face)
|
| return hb_font_get_empty ();
|
|
|
| hb_face_make_immutable (face);
|
| + font->parent = hb_font_get_empty ();
|
| font->face = hb_face_reference (face);
|
| font->klass = hb_font_funcs_get_empty ();
|
|
|
| @@ -917,8 +1025,8 @@ hb_font_get_empty (void)
|
| NULL, /* parent */
|
| const_cast<hb_face_t *> (&_hb_face_nil),
|
|
|
| - 0, /* x_scale */
|
| - 0, /* y_scale */
|
| + 1000, /* x_scale */
|
| + 1000, /* y_scale */
|
|
|
| 0, /* x_ppem */
|
| 0, /* y_ppem */
|
|
|