Add hb_font_get_glyph_name() and hb_font_get_glyph_from_name()
This commit is contained in:
parent
bc145658bd
commit
bce095524b
1
TODO
1
TODO
|
@ -57,6 +57,7 @@ API additions
|
||||||
=============
|
=============
|
||||||
|
|
||||||
- Buffer (de)serialize API ala hb-shape?
|
- Buffer (de)serialize API ala hb-shape?
|
||||||
|
|
||||||
- Move feature parsing from util into the library
|
- Move feature parsing from util into the library
|
||||||
|
|
||||||
- Add hb-cairo glue
|
- Add hb-cairo glue
|
||||||
|
|
|
@ -50,6 +50,8 @@
|
||||||
HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \
|
HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \
|
||||||
HB_FONT_FUNC_IMPLEMENT (glyph_extents) \
|
HB_FONT_FUNC_IMPLEMENT (glyph_extents) \
|
||||||
HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \
|
HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \
|
||||||
|
HB_FONT_FUNC_IMPLEMENT (glyph_name) \
|
||||||
|
HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \
|
||||||
/* ^--- Add new callbacks here */
|
/* ^--- Add new callbacks here */
|
||||||
|
|
||||||
struct _hb_font_funcs_t {
|
struct _hb_font_funcs_t {
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static hb_bool_t
|
static hb_bool_t
|
||||||
hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_nil (hb_font_t *font,
|
||||||
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,
|
||||||
|
@ -59,7 +59,7 @@ hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_position_t
|
static hb_position_t
|
||||||
hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_h_advance_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)
|
void *user_data HB_UNUSED)
|
||||||
|
@ -71,7 +71,7 @@ hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_position_t
|
static hb_position_t
|
||||||
hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_v_advance_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)
|
void *user_data HB_UNUSED)
|
||||||
|
@ -83,7 +83,7 @@ hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_bool_t
|
static hb_bool_t
|
||||||
hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
|
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,
|
||||||
hb_position_t *x,
|
hb_position_t *x,
|
||||||
|
@ -91,9 +91,7 @@ hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
if (font->parent) {
|
if (font->parent) {
|
||||||
hb_bool_t ret = hb_font_get_glyph_h_origin (font->parent,
|
hb_bool_t ret = hb_font_get_glyph_h_origin (font->parent, glyph, x, y);
|
||||||
glyph,
|
|
||||||
x, y);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
font->parent_scale_position (x, y);
|
font->parent_scale_position (x, y);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -104,7 +102,7 @@ hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_bool_t
|
static hb_bool_t
|
||||||
hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_v_origin_nil (hb_font_t *font,
|
||||||
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,
|
||||||
|
@ -112,9 +110,7 @@ hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
if (font->parent) {
|
if (font->parent) {
|
||||||
hb_bool_t ret = hb_font_get_glyph_v_origin (font->parent,
|
hb_bool_t ret = hb_font_get_glyph_v_origin (font->parent, glyph, x, y);
|
||||||
glyph,
|
|
||||||
x, y);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
font->parent_scale_position (x, y);
|
font->parent_scale_position (x, y);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -125,7 +121,7 @@ hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_position_t
|
static hb_position_t
|
||||||
hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_h_kerning_nil (hb_font_t *font,
|
||||||
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,
|
||||||
|
@ -138,7 +134,7 @@ hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_position_t
|
static hb_position_t
|
||||||
hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_v_kerning_nil (hb_font_t *font,
|
||||||
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,
|
||||||
|
@ -151,7 +147,7 @@ hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_bool_t
|
static hb_bool_t
|
||||||
hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_extents_nil (hb_font_t *font,
|
||||||
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,
|
||||||
|
@ -173,7 +169,7 @@ hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_bool_t
|
static hb_bool_t
|
||||||
hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
|
hb_font_get_glyph_contour_point_nil (hb_font_t *font,
|
||||||
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,
|
||||||
|
@ -182,9 +178,7 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
if (font->parent) {
|
if (font->parent) {
|
||||||
hb_bool_t ret = hb_font_get_glyph_contour_point (font->parent,
|
hb_bool_t ret = hb_font_get_glyph_contour_point (font->parent, glyph, point_index, x, y);
|
||||||
glyph, point_index,
|
|
||||||
x, y);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
font->parent_scale_position (x, y);
|
font->parent_scale_position (x, y);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -194,6 +188,34 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static hb_bool_t
|
||||||
|
hb_font_get_glyph_name_nil (hb_font_t *font,
|
||||||
|
void *font_data HB_UNUSED,
|
||||||
|
hb_codepoint_t glyph,
|
||||||
|
char *name, unsigned int size,
|
||||||
|
void *user_data HB_UNUSED)
|
||||||
|
{
|
||||||
|
if (font->parent)
|
||||||
|
return hb_font_get_glyph_name (font->parent, glyph, name, size);
|
||||||
|
|
||||||
|
snprintf (name, size, "gid%u", glyph);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static hb_bool_t
|
||||||
|
hb_font_get_glyph_from_name_nil (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)
|
||||||
|
{
|
||||||
|
if (font->parent)
|
||||||
|
return hb_font_get_glyph_from_name (font->parent, name, len, glyph);
|
||||||
|
|
||||||
|
*glyph = 0;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static hb_font_funcs_t _hb_font_funcs_nil = {
|
static hb_font_funcs_t _hb_font_funcs_nil = {
|
||||||
HB_OBJECT_HEADER_STATIC,
|
HB_OBJECT_HEADER_STATIC,
|
||||||
|
@ -405,6 +427,28 @@ hb_font_get_glyph_contour_point (hb_font_t *font,
|
||||||
font->klass->user_data.glyph_contour_point);
|
font->klass->user_data.glyph_contour_point);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hb_bool_t
|
||||||
|
hb_font_get_glyph_name (hb_font_t *font,
|
||||||
|
hb_codepoint_t glyph,
|
||||||
|
char *name, unsigned int size)
|
||||||
|
{
|
||||||
|
return font->klass->get.glyph_name (font, font->user_data,
|
||||||
|
glyph,
|
||||||
|
name, size,
|
||||||
|
font->klass->user_data.glyph_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
hb_bool_t
|
||||||
|
hb_font_get_glyph_from_name (hb_font_t *font,
|
||||||
|
const char *name, int len, /* -1 means nul-terminated */
|
||||||
|
hb_codepoint_t *glyph)
|
||||||
|
{
|
||||||
|
return font->klass->get.glyph_from_name (font, font->user_data,
|
||||||
|
name, len,
|
||||||
|
glyph,
|
||||||
|
font->klass->user_data.glyph_from_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* A bit higher-level, and with fallback */
|
/* A bit higher-level, and with fallback */
|
||||||
|
|
||||||
|
|
|
@ -192,6 +192,16 @@ typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, vo
|
||||||
void *user_data);
|
void *user_data);
|
||||||
|
|
||||||
|
|
||||||
|
typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data,
|
||||||
|
hb_codepoint_t glyph,
|
||||||
|
char *name, unsigned int size,
|
||||||
|
void *user_data);
|
||||||
|
typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data,
|
||||||
|
const char *name, int len, /* -1 means nul-terminated */
|
||||||
|
hb_codepoint_t *glyph,
|
||||||
|
void *user_data);
|
||||||
|
|
||||||
|
|
||||||
/* func setters */
|
/* func setters */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -235,6 +245,15 @@ hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
|
||||||
hb_font_get_glyph_contour_point_func_t func,
|
hb_font_get_glyph_contour_point_func_t func,
|
||||||
void *user_data, hb_destroy_func_t destroy);
|
void *user_data, hb_destroy_func_t destroy);
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
|
||||||
|
hb_font_get_glyph_name_func_t glyph_func,
|
||||||
|
void *user_data, hb_destroy_func_t destroy);
|
||||||
|
void
|
||||||
|
hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs,
|
||||||
|
hb_font_get_glyph_from_name_func_t glyph_func,
|
||||||
|
void *user_data, hb_destroy_func_t destroy);
|
||||||
|
|
||||||
|
|
||||||
/* func dispatch */
|
/* func dispatch */
|
||||||
|
|
||||||
|
@ -276,6 +295,15 @@ hb_font_get_glyph_contour_point (hb_font_t *font,
|
||||||
hb_codepoint_t glyph, unsigned int point_index,
|
hb_codepoint_t glyph, unsigned int point_index,
|
||||||
hb_position_t *x, hb_position_t *y);
|
hb_position_t *x, hb_position_t *y);
|
||||||
|
|
||||||
|
hb_bool_t
|
||||||
|
hb_font_get_glyph_name (hb_font_t *font,
|
||||||
|
hb_codepoint_t glyph,
|
||||||
|
char *name, unsigned int size);
|
||||||
|
hb_bool_t
|
||||||
|
hb_font_get_glyph_from_name (hb_font_t *font,
|
||||||
|
const char *name, int len, /* -1 means nul-terminated */
|
||||||
|
hb_codepoint_t *glyph);
|
||||||
|
|
||||||
|
|
||||||
/* high-level funcs, with fallback */
|
/* high-level funcs, with fallback */
|
||||||
|
|
||||||
|
|
52
src/hb-ft.cc
52
src/hb-ft.cc
|
@ -231,21 +231,55 @@ hb_ft_get_glyph_contour_point (hb_font_t *font HB_UNUSED,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static hb_bool_t
|
||||||
|
hb_ft_get_glyph_name (hb_font_t *font,
|
||||||
|
void *font_data,
|
||||||
|
hb_codepoint_t glyph,
|
||||||
|
char *name, unsigned int size,
|
||||||
|
void *user_data HB_UNUSED)
|
||||||
|
{
|
||||||
|
FT_Face ft_face = (FT_Face) font_data;
|
||||||
|
|
||||||
|
hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size);
|
||||||
|
if (!ret)
|
||||||
|
snprintf (name, size, "gid%u", glyph);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static hb_bool_t
|
||||||
|
hb_ft_get_glyph_from_name (hb_font_t *font,
|
||||||
|
void *font_data,
|
||||||
|
const char *name, int len, /* -1 means nul-terminated */
|
||||||
|
hb_codepoint_t *glyph,
|
||||||
|
void *user_data HB_UNUSED)
|
||||||
|
{
|
||||||
|
FT_Face ft_face = (FT_Face) font_data;
|
||||||
|
|
||||||
|
if (len < 0)
|
||||||
|
*glyph = FT_Get_Name_Index (ft_face, (FT_String *) name);
|
||||||
|
else {
|
||||||
|
/* Make a nul-terminated version. */
|
||||||
|
char buf[128];
|
||||||
|
len = MIN (len, (int) sizeof (buf) - 1);
|
||||||
|
strncpy (buf, name, len);
|
||||||
|
buf[len] = '\0';
|
||||||
|
*glyph = FT_Get_Name_Index (ft_face, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *glyph != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static hb_font_funcs_t ft_ffuncs = {
|
static hb_font_funcs_t ft_ffuncs = {
|
||||||
HB_OBJECT_HEADER_STATIC,
|
HB_OBJECT_HEADER_STATIC,
|
||||||
|
|
||||||
TRUE, /* immutable */
|
TRUE, /* immutable */
|
||||||
|
|
||||||
{
|
{
|
||||||
hb_ft_get_glyph,
|
#define HB_FONT_FUNC_IMPLEMENT(name) hb_ft_get_##name,
|
||||||
hb_ft_get_glyph_h_advance,
|
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
|
||||||
hb_ft_get_glyph_v_advance,
|
#undef HB_FONT_FUNC_IMPLEMENT
|
||||||
hb_ft_get_glyph_h_origin,
|
|
||||||
hb_ft_get_glyph_v_origin,
|
|
||||||
hb_ft_get_glyph_h_kerning,
|
|
||||||
hb_ft_get_glyph_v_kerning,
|
|
||||||
hb_ft_get_glyph_extents,
|
|
||||||
hb_ft_get_glyph_contour_point,
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -78,13 +78,10 @@ struct shape_closure_consumer_t : option_group_t
|
||||||
first = false;
|
first = false;
|
||||||
else
|
else
|
||||||
printf (" ");
|
printf (" ");
|
||||||
/* TODO refactor this */
|
char glyph_name[32];
|
||||||
char glyph_name[30];
|
|
||||||
if (show_glyph_names) {
|
if (show_glyph_names) {
|
||||||
if (!FT_Get_Glyph_Name (ft_face, i, glyph_name, sizeof (glyph_name)))
|
hb_font_get_glyph_name (font, i, glyph_name, sizeof (glyph_name));
|
||||||
printf ("%s", glyph_name);
|
printf ("%s", glyph_name);
|
||||||
else
|
|
||||||
printf ("gid%u", i);
|
|
||||||
} else
|
} else
|
||||||
printf ("%u", i);
|
printf ("%u", i);
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,8 +725,6 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
|
||||||
hb_bool_t utf8_clusters,
|
hb_bool_t utf8_clusters,
|
||||||
GString *gs)
|
GString *gs)
|
||||||
{
|
{
|
||||||
FT_Face ft_face = show_glyph_names ? hb_ft_font_get_face (font) : NULL;
|
|
||||||
|
|
||||||
unsigned int num_glyphs = hb_buffer_get_length (buffer);
|
unsigned int num_glyphs = hb_buffer_get_length (buffer);
|
||||||
hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
|
hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
|
||||||
hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL);
|
hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL);
|
||||||
|
@ -737,12 +735,10 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
|
||||||
if (i)
|
if (i)
|
||||||
g_string_append_c (gs, '|');
|
g_string_append_c (gs, '|');
|
||||||
|
|
||||||
char glyph_name[30];
|
char glyph_name[32];
|
||||||
if (show_glyph_names) {
|
if (show_glyph_names) {
|
||||||
if (!FT_Get_Glyph_Name (ft_face, info->codepoint, glyph_name, sizeof (glyph_name)))
|
hb_font_get_glyph_name (font, info->codepoint, glyph_name, sizeof (glyph_name));
|
||||||
g_string_append_printf (gs, "%s", glyph_name);
|
g_string_append_printf (gs, "%s", glyph_name);
|
||||||
else
|
|
||||||
g_string_append_printf (gs, "gid%u", info->codepoint);
|
|
||||||
} else
|
} else
|
||||||
g_string_append_printf (gs, "%u", info->codepoint);
|
g_string_append_printf (gs, "%u", info->codepoint);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue