diff --git a/src/hb-font.cc b/src/hb-font.cc index 6a69cae31..a1f227ce9 100644 --- a/src/hb-font.cc +++ b/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_bool_t -hb_font_get_glyph_h_origin_nil (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) +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) { - 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; + return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); } static hb_bool_t -hb_font_get_glyph_v_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_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_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_UNUSED, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) +{ + *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 = { @@ -227,6 +292,17 @@ static const hb_font_funcs_t _hb_font_funcs_nil = { #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) hb_font_get_##name##_parent, + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + } +}; /** @@ -246,7 +322,7 @@ hb_font_funcs_create (void) if (!(ffuncs = hb_object_create ())) return hb_font_funcs_get_empty (); - ffuncs->get = _hb_font_funcs_nil.get; + ffuncs->get = _hb_font_funcs_parent.get; return ffuncs; } @@ -263,7 +339,7 @@ hb_font_funcs_create (void) hb_font_funcs_t * hb_font_funcs_get_empty (void) { - return const_cast (&_hb_font_funcs_nil); + return const_cast (&_hb_font_funcs_parent); } /** @@ -402,7 +478,7 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \ ffuncs->user_data.name = user_data; \ ffuncs->destroy.name = destroy; \ } else { \ - ffuncs->get.name = hb_font_get_##name##_nil; \ + ffuncs->get.name = hb_font_get_##name##_parent; \ ffuncs->user_data.name = NULL; \ ffuncs->destroy.name = NULL; \ } \ @@ -858,6 +934,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 +994,8 @@ hb_font_get_empty (void) NULL, /* parent */ const_cast (&_hb_face_nil), - 0, /* x_scale */ - 0, /* y_scale */ + 1000, /* x_scale */ + 1000, /* y_scale */ 0, /* x_ppem */ 0, /* y_ppem */ diff --git a/test/api/test-font.c b/test/api/test-font.c index ef5b08f14..34f6c746e 100644 --- a/test/api/test-font.c +++ b/test/api/test-font.c @@ -386,7 +386,7 @@ test_font_properties (void) g_assert (hb_font_get_face (font) == face); - g_assert (hb_font_get_parent (font) == NULL); + g_assert (hb_font_get_parent (font) == hb_font_get_empty ()); subfont = hb_font_create_sub_font (font); g_assert (hb_font_get_parent (subfont) == font); hb_font_set_parent(subfont, NULL);