|
|
|
@ -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 = { |
|
|
|
@ -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 */ |
|
|
|
|