Separate nil font-funcs from parent-peeking font-funcs
API change: all fonts created with hb_font_create() now inherit from (ie have parent) hb_font_get_empty().
This commit is contained in:
parent
bee901b38e
commit
da29b43794
197
src/hb-font.cc
197
src/hb-font.cc
|
@ -45,130 +45,188 @@
|
|||
*/
|
||||
|
||||
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_position_t
|
||||
hb_font_get_glyph_h_advance_nil (hb_font_t *font,
|
||||
static hb_bool_t
|
||||
hb_font_get_glyph_parent (hb_font_t *font,
|
||||
void *font_data HB_UNUSED,
|
||||
hb_codepoint_t glyph,
|
||||
hb_codepoint_t unicode,
|
||||
hb_codepoint_t variation_selector,
|
||||
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;
|
||||
return font->parent->get_glyph (unicode, variation_selector, glyph);
|
||||
}
|
||||
|
||||
static hb_position_t
|
||||
hb_font_get_glyph_v_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_y_distance (font->parent->get_glyph_v_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_UNUSED,
|
||||
void *font_data HB_UNUSED,
|
||||
hb_codepoint_t glyph,
|
||||
void *user_data HB_UNUSED)
|
||||
{
|
||||
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)
|
||||
{
|
||||
*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)
|
||||
{
|
||||
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_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)
|
||||
{
|
||||
*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)
|
||||
{
|
||||
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_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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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_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,
|
||||
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_contour_point_parent (hb_font_t *font,
|
||||
void *font_data HB_UNUSED,
|
||||
hb_codepoint_t glyph,
|
||||
unsigned int point_index,
|
||||
|
@ -176,44 +234,51 @@ 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_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<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 +339,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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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_t *> (&_hb_face_nil),
|
||||
|
||||
0, /* x_scale */
|
||||
0, /* y_scale */
|
||||
1000, /* x_scale */
|
||||
1000, /* y_scale */
|
||||
|
||||
0, /* x_ppem */
|
||||
0, /* y_ppem */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue