[font] Fix parallel funcs passing to eachover in infinite-loop

Fixes test just added.
This commit is contained in:
Behdad Esfahbod 2018-10-19 19:12:33 -07:00
parent 77d5c3df07
commit 08b7172969
2 changed files with 21 additions and 7 deletions

View File

@ -103,7 +103,7 @@ hb_font_get_nominal_glyph_default (hb_font_t *font,
hb_codepoint_t *glyph, hb_codepoint_t *glyph,
void *user_data HB_UNUSED) void *user_data HB_UNUSED)
{ {
if (font->has_nominal_glyphs_func ()) if (font->has_nominal_glyphs_func_set ())
{ {
return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0); return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0);
} }
@ -121,7 +121,7 @@ hb_font_get_nominal_glyphs_default (hb_font_t *font,
unsigned int glyph_stride, unsigned int glyph_stride,
void *user_data HB_UNUSED) void *user_data HB_UNUSED)
{ {
if (font->has_nominal_glyph_func ()) if (font->has_nominal_glyph_func_set ())
{ {
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
{ {
@ -176,7 +176,7 @@ hb_font_get_glyph_h_advance_default (hb_font_t *font,
hb_codepoint_t glyph, hb_codepoint_t glyph,
void *user_data HB_UNUSED) void *user_data HB_UNUSED)
{ {
if (font->has_glyph_h_advances_func ()) if (font->has_glyph_h_advances_func_set ())
{ {
hb_position_t ret; hb_position_t ret;
font->get_glyph_h_advances (1, &glyph, 0, &ret, 0); font->get_glyph_h_advances (1, &glyph, 0, &ret, 0);
@ -200,7 +200,7 @@ hb_font_get_glyph_v_advance_default (hb_font_t *font,
hb_codepoint_t glyph, hb_codepoint_t glyph,
void *user_data HB_UNUSED) void *user_data HB_UNUSED)
{ {
if (font->has_glyph_v_advances_func ()) if (font->has_glyph_v_advances_func_set ())
{ {
hb_position_t ret; hb_position_t ret;
font->get_glyph_v_advances (1, &glyph, 0, &ret, 0); font->get_glyph_v_advances (1, &glyph, 0, &ret, 0);
@ -220,7 +220,7 @@ hb_font_get_glyph_h_advances_default (hb_font_t* font,
unsigned int advance_stride, unsigned int advance_stride,
void *user_data HB_UNUSED) void *user_data HB_UNUSED)
{ {
if (font->has_glyph_h_advance_func ()) if (font->has_glyph_h_advance_func_set ())
{ {
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
{ {
@ -252,7 +252,7 @@ hb_font_get_glyph_v_advances_default (hb_font_t* font,
unsigned int advance_stride, unsigned int advance_stride,
void *user_data HB_UNUSED) void *user_data HB_UNUSED)
{ {
if (font->has_glyph_v_advance_func ()) if (font->has_glyph_v_advance_func_set ())
{ {
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
{ {
@ -687,10 +687,16 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT #undef HB_FONT_FUNC_IMPLEMENT
bool
hb_font_t::has_func_set (unsigned int i)
{
return this->klass->get.array[i] != _hb_font_funcs_default.get.array[i];
}
bool bool
hb_font_t::has_func (unsigned int i) hb_font_t::has_func (unsigned int i)
{ {
return (this->klass->get.array[i] != _hb_font_funcs_default.get.array[i]) || return has_func_set (i) ||
(parent && parent != &_hb_Null_hb_font_t && parent->has_func (i)); (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i));
} }

View File

@ -171,6 +171,7 @@ struct hb_font_t
/* Public getters */ /* Public getters */
HB_INTERNAL bool has_func (unsigned int i); HB_INTERNAL bool has_func (unsigned int i);
HB_INTERNAL bool has_func_set (unsigned int i);
/* has_* ... */ /* has_* ... */
#define HB_FONT_FUNC_IMPLEMENT(name) \ #define HB_FONT_FUNC_IMPLEMENT(name) \
@ -180,6 +181,13 @@ struct hb_font_t
hb_font_funcs_t *funcs = this->klass; \ hb_font_funcs_t *funcs = this->klass; \
unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \ unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
return has_func (i); \ return has_func (i); \
} \
bool \
has_##name##_func_set (void) \
{ \
hb_font_funcs_t *funcs = this->klass; \
unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
return has_func_set (i); \
} }
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT #undef HB_FONT_FUNC_IMPLEMENT