| Index: third_party/harfbuzz-ng/src/hb-font-private.hh
|
| diff --git a/third_party/harfbuzz-ng/src/hb-font-private.hh b/third_party/harfbuzz-ng/src/hb-font-private.hh
|
| index c05499d4c2f2720ac9eb121c8c2718f8d9beddb6..c45258b2e723075b8b931a8d4b2a34961458d3ae 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-font-private.hh
|
| +++ b/third_party/harfbuzz-ng/src/hb-font-private.hh
|
| @@ -61,14 +61,6 @@ struct hb_font_funcs_t {
|
|
|
| hb_bool_t immutable;
|
|
|
| - /* Don't access these directly. Call hb_font_get_*() instead. */
|
| -
|
| - struct {
|
| -#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
|
| - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| -#undef HB_FONT_FUNC_IMPLEMENT
|
| - } get;
|
| -
|
| struct {
|
| #define HB_FONT_FUNC_IMPLEMENT(name) void *name;
|
| HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| @@ -80,6 +72,16 @@ struct hb_font_funcs_t {
|
| HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| #undef HB_FONT_FUNC_IMPLEMENT
|
| } destroy;
|
| +
|
| + /* Don't access these directly. Call font->get_*() instead. */
|
| + union get_t {
|
| + struct get_funcs_t {
|
| +#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
|
| + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_FONT_FUNC_IMPLEMENT
|
| + } f;
|
| + void (*array[]) (void);
|
| + } get;
|
| };
|
|
|
|
|
| @@ -144,6 +146,20 @@ struct hb_font_t {
|
|
|
| /* Public getters */
|
|
|
| + HB_INTERNAL bool has_func (unsigned int i);
|
| +
|
| + /* has_* ... */
|
| +#define HB_FONT_FUNC_IMPLEMENT(name) \
|
| + bool \
|
| + has_##name##_func (void) \
|
| + { \
|
| + hb_font_funcs_t *funcs = this->klass; \
|
| + unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
|
| + return has_func (i); \
|
| + }
|
| + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_FONT_FUNC_IMPLEMENT
|
| +
|
| inline hb_bool_t has_glyph (hb_codepoint_t unicode)
|
| {
|
| hb_codepoint_t glyph;
|
| @@ -154,85 +170,85 @@ struct hb_font_t {
|
| hb_codepoint_t *glyph)
|
| {
|
| *glyph = 0;
|
| - return klass->get.glyph (this, user_data,
|
| - unicode, variation_selector, glyph,
|
| - klass->user_data.glyph);
|
| + return klass->get.f.glyph (this, user_data,
|
| + unicode, variation_selector, glyph,
|
| + klass->user_data.glyph);
|
| }
|
|
|
| inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
|
| {
|
| - return klass->get.glyph_h_advance (this, user_data,
|
| - glyph,
|
| - klass->user_data.glyph_h_advance);
|
| + return klass->get.f.glyph_h_advance (this, user_data,
|
| + glyph,
|
| + klass->user_data.glyph_h_advance);
|
| }
|
|
|
| inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
|
| {
|
| - return klass->get.glyph_v_advance (this, user_data,
|
| - glyph,
|
| - klass->user_data.glyph_v_advance);
|
| + return klass->get.f.glyph_v_advance (this, user_data,
|
| + glyph,
|
| + klass->user_data.glyph_v_advance);
|
| }
|
|
|
| inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
|
| hb_position_t *x, hb_position_t *y)
|
| {
|
| *x = *y = 0;
|
| - return klass->get.glyph_h_origin (this, user_data,
|
| - glyph, x, y,
|
| - klass->user_data.glyph_h_origin);
|
| + return klass->get.f.glyph_h_origin (this, user_data,
|
| + glyph, x, y,
|
| + klass->user_data.glyph_h_origin);
|
| }
|
|
|
| inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
|
| hb_position_t *x, hb_position_t *y)
|
| {
|
| *x = *y = 0;
|
| - return klass->get.glyph_v_origin (this, user_data,
|
| - glyph, x, y,
|
| - klass->user_data.glyph_v_origin);
|
| + return klass->get.f.glyph_v_origin (this, user_data,
|
| + glyph, x, y,
|
| + klass->user_data.glyph_v_origin);
|
| }
|
|
|
| inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
|
| {
|
| - return klass->get.glyph_h_kerning (this, user_data,
|
| - left_glyph, right_glyph,
|
| - klass->user_data.glyph_h_kerning);
|
| + return klass->get.f.glyph_h_kerning (this, user_data,
|
| + left_glyph, right_glyph,
|
| + klass->user_data.glyph_h_kerning);
|
| }
|
|
|
| inline hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph)
|
| {
|
| - return klass->get.glyph_v_kerning (this, user_data,
|
| - top_glyph, bottom_glyph,
|
| - klass->user_data.glyph_v_kerning);
|
| + return klass->get.f.glyph_v_kerning (this, user_data,
|
| + top_glyph, bottom_glyph,
|
| + klass->user_data.glyph_v_kerning);
|
| }
|
|
|
| inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
|
| hb_glyph_extents_t *extents)
|
| {
|
| memset (extents, 0, sizeof (*extents));
|
| - return klass->get.glyph_extents (this, user_data,
|
| - glyph,
|
| - extents,
|
| - klass->user_data.glyph_extents);
|
| + return klass->get.f.glyph_extents (this, user_data,
|
| + glyph,
|
| + extents,
|
| + klass->user_data.glyph_extents);
|
| }
|
|
|
| inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
|
| hb_position_t *x, hb_position_t *y)
|
| {
|
| *x = *y = 0;
|
| - return klass->get.glyph_contour_point (this, user_data,
|
| - glyph, point_index,
|
| - x, y,
|
| - klass->user_data.glyph_contour_point);
|
| + return klass->get.f.glyph_contour_point (this, user_data,
|
| + glyph, point_index,
|
| + x, y,
|
| + klass->user_data.glyph_contour_point);
|
| }
|
|
|
| inline hb_bool_t get_glyph_name (hb_codepoint_t glyph,
|
| char *name, unsigned int size)
|
| {
|
| if (size) *name = '\0';
|
| - return klass->get.glyph_name (this, user_data,
|
| - glyph,
|
| - name, size,
|
| - klass->user_data.glyph_name);
|
| + return klass->get.f.glyph_name (this, user_data,
|
| + glyph,
|
| + name, size,
|
| + klass->user_data.glyph_name);
|
| }
|
|
|
| inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
|
| @@ -240,10 +256,10 @@ struct hb_font_t {
|
| {
|
| *glyph = 0;
|
| if (len == -1) len = strlen (name);
|
| - return klass->get.glyph_from_name (this, user_data,
|
| - name, len,
|
| - glyph,
|
| - klass->user_data.glyph_from_name);
|
| + return klass->get.f.glyph_from_name (this, user_data,
|
| + name, len,
|
| + glyph,
|
| + klass->user_data.glyph_from_name);
|
| }
|
|
|
|
|
| @@ -298,6 +314,26 @@ struct hb_font_t {
|
| }
|
| }
|
|
|
| + inline void add_glyph_h_origin (hb_codepoint_t glyph,
|
| + hb_position_t *x, hb_position_t *y)
|
| + {
|
| + hb_position_t origin_x, origin_y;
|
| +
|
| + get_glyph_h_origin (glyph, &origin_x, &origin_y);
|
| +
|
| + *x += origin_x;
|
| + *y += origin_y;
|
| + }
|
| + inline void add_glyph_v_origin (hb_codepoint_t glyph,
|
| + hb_position_t *x, hb_position_t *y)
|
| + {
|
| + hb_position_t origin_x, origin_y;
|
| +
|
| + get_glyph_v_origin (glyph, &origin_x, &origin_y);
|
| +
|
| + *x += origin_x;
|
| + *y += origin_y;
|
| + }
|
| inline void add_glyph_origin_for_direction (hb_codepoint_t glyph,
|
| hb_direction_t direction,
|
| hb_position_t *x, hb_position_t *y)
|
| @@ -310,6 +346,26 @@ struct hb_font_t {
|
| *y += origin_y;
|
| }
|
|
|
| + inline void subtract_glyph_h_origin (hb_codepoint_t glyph,
|
| + hb_position_t *x, hb_position_t *y)
|
| + {
|
| + hb_position_t origin_x, origin_y;
|
| +
|
| + get_glyph_h_origin (glyph, &origin_x, &origin_y);
|
| +
|
| + *x -= origin_x;
|
| + *y -= origin_y;
|
| + }
|
| + inline void subtract_glyph_v_origin (hb_codepoint_t glyph,
|
| + hb_position_t *x, hb_position_t *y)
|
| + {
|
| + hb_position_t origin_x, origin_y;
|
| +
|
| + get_glyph_v_origin (glyph, &origin_x, &origin_y);
|
| +
|
| + *x -= origin_x;
|
| + *y -= origin_y;
|
| + }
|
| inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
|
| hb_direction_t direction,
|
| hb_position_t *x, hb_position_t *y)
|
|
|