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
229
src/hb-font.cc
229
src/hb-font.cc
|
@ -45,130 +45,176 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static hb_bool_t
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t unicode,
|
hb_codepoint_t unicode,
|
||||||
hb_codepoint_t variation_selector,
|
hb_codepoint_t variation_selector,
|
||||||
hb_codepoint_t *glyph,
|
hb_codepoint_t *glyph,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
if (font->parent)
|
|
||||||
return font->parent->get_glyph (unicode, variation_selector, glyph);
|
|
||||||
|
|
||||||
*glyph = 0;
|
*glyph = 0;
|
||||||
return false;
|
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t glyph,
|
hb_codepoint_t glyph,
|
||||||
void *user_data HB_UNUSED)
|
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->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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t glyph,
|
hb_codepoint_t glyph,
|
||||||
void *user_data HB_UNUSED)
|
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;
|
return font->y_scale;
|
||||||
}
|
}
|
||||||
|
static hb_position_t
|
||||||
static hb_bool_t
|
hb_font_get_glyph_v_advance_parent (hb_font_t *font,
|
||||||
hb_font_get_glyph_h_origin_nil (hb_font_t *font,
|
void *font_data HB_UNUSED,
|
||||||
void *font_data HB_UNUSED,
|
hb_codepoint_t glyph,
|
||||||
hb_codepoint_t glyph,
|
void *user_data HB_UNUSED)
|
||||||
hb_position_t *x,
|
|
||||||
hb_position_t *y,
|
|
||||||
void *user_data HB_UNUSED)
|
|
||||||
{
|
{
|
||||||
if (font->parent) {
|
return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
|
||||||
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t glyph,
|
hb_codepoint_t glyph,
|
||||||
hb_position_t *x,
|
hb_position_t *x,
|
||||||
hb_position_t *y,
|
hb_position_t *y,
|
||||||
void *user_data HB_UNUSED)
|
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;
|
*x = *y = 0;
|
||||||
return false;
|
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t left_glyph,
|
hb_codepoint_t left_glyph,
|
||||||
hb_codepoint_t right_glyph,
|
hb_codepoint_t right_glyph,
|
||||||
void *user_data HB_UNUSED)
|
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;
|
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t top_glyph,
|
hb_codepoint_t top_glyph,
|
||||||
hb_codepoint_t bottom_glyph,
|
hb_codepoint_t bottom_glyph,
|
||||||
void *user_data HB_UNUSED)
|
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;
|
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t glyph,
|
hb_codepoint_t glyph,
|
||||||
hb_glyph_extents_t *extents,
|
hb_glyph_extents_t *extents,
|
||||||
void *user_data HB_UNUSED)
|
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));
|
memset (extents, 0, sizeof (*extents));
|
||||||
return false;
|
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t glyph,
|
hb_codepoint_t glyph,
|
||||||
unsigned int point_index,
|
unsigned int point_index,
|
||||||
|
@ -176,44 +222,63 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font,
|
||||||
hb_position_t *y,
|
hb_position_t *y,
|
||||||
void *user_data HB_UNUSED)
|
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;
|
*x = *y = 0;
|
||||||
return false;
|
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
hb_codepoint_t glyph,
|
hb_codepoint_t glyph,
|
||||||
char *name, unsigned int size,
|
char *name, unsigned int size,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
if (font->parent)
|
|
||||||
return font->parent->get_glyph_name (glyph, name, size);
|
|
||||||
|
|
||||||
if (size) *name = '\0';
|
if (size) *name = '\0';
|
||||||
return false;
|
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
|
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,
|
void *font_data HB_UNUSED,
|
||||||
const char *name, int len, /* -1 means nul-terminated */
|
const char *name, int len, /* -1 means nul-terminated */
|
||||||
hb_codepoint_t *glyph,
|
hb_codepoint_t *glyph,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
if (font->parent)
|
|
||||||
return font->parent->get_glyph_from_name (name, len, glyph);
|
|
||||||
|
|
||||||
*glyph = 0;
|
*glyph = 0;
|
||||||
return false;
|
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 = {
|
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
|
#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> ()))
|
if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
|
||||||
return hb_font_funcs_get_empty ();
|
return hb_font_funcs_get_empty ();
|
||||||
|
|
||||||
ffuncs->get = _hb_font_funcs_nil.get;
|
ffuncs->get = _hb_font_funcs_parent.get;
|
||||||
|
|
||||||
return ffuncs;
|
return ffuncs;
|
||||||
}
|
}
|
||||||
|
@ -263,7 +339,7 @@ hb_font_funcs_create (void)
|
||||||
hb_font_funcs_t *
|
hb_font_funcs_t *
|
||||||
hb_font_funcs_get_empty (void)
|
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->user_data.name = user_data; \
|
||||||
ffuncs->destroy.name = destroy; \
|
ffuncs->destroy.name = destroy; \
|
||||||
} else { \
|
} else { \
|
||||||
ffuncs->get.name = hb_font_get_##name##_nil; \
|
ffuncs->get.name = hb_font_get_##name##_parent; \
|
||||||
ffuncs->user_data.name = NULL; \
|
ffuncs->user_data.name = NULL; \
|
||||||
ffuncs->destroy.name = NULL; \
|
ffuncs->destroy.name = NULL; \
|
||||||
} \
|
} \
|
||||||
|
@ -858,6 +934,7 @@ hb_font_create (hb_face_t *face)
|
||||||
return hb_font_get_empty ();
|
return hb_font_get_empty ();
|
||||||
|
|
||||||
hb_face_make_immutable (face);
|
hb_face_make_immutable (face);
|
||||||
|
font->parent = hb_font_get_empty ();
|
||||||
font->face = hb_face_reference (face);
|
font->face = hb_face_reference (face);
|
||||||
font->klass = hb_font_funcs_get_empty ();
|
font->klass = hb_font_funcs_get_empty ();
|
||||||
|
|
||||||
|
@ -917,8 +994,8 @@ hb_font_get_empty (void)
|
||||||
NULL, /* parent */
|
NULL, /* parent */
|
||||||
const_cast<hb_face_t *> (&_hb_face_nil),
|
const_cast<hb_face_t *> (&_hb_face_nil),
|
||||||
|
|
||||||
0, /* x_scale */
|
1000, /* x_scale */
|
||||||
0, /* y_scale */
|
1000, /* y_scale */
|
||||||
|
|
||||||
0, /* x_ppem */
|
0, /* x_ppem */
|
||||||
0, /* y_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_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);
|
subfont = hb_font_create_sub_font (font);
|
||||||
g_assert (hb_font_get_parent (subfont) == font);
|
g_assert (hb_font_get_parent (subfont) == font);
|
||||||
hb_font_set_parent(subfont, NULL);
|
hb_font_set_parent(subfont, NULL);
|
||||||
|
|
Loading…
Reference in New Issue