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 */ |