Update HB-to-Qt bridging code to deal with latest HB

- add support for hb_font_get_{nominal,variation}_glyph() callback
  introduced in 1.2.3
- add support for hb_get_font_h_extents callback
  introduced in 1.1.3
- do not register dummy callbacks for which HB has a bit faster
  implementation (since 1.1.2)
- mark funcs object immutable for the sake of safety

Change-Id: I05281b01d012aed32030ec7cff41a456b5540179
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
bb10
Konstantin Ritt 2016-02-25 18:05:17 +04:00 committed by Eskil Abrahamsen Blomfeldt
parent 847fe03d91
commit 268b3ec2d1
1 changed files with 55 additions and 62 deletions

View File

@ -422,18 +422,52 @@ hb_unicode_funcs_t *hb_qt_get_unicode_funcs()
// Font routines
#if HB_VERSION_ATLEAST(1, 1, 3)
static hb_bool_t
_hb_qt_font_get_glyph(hb_font_t * /*font*/, void *font_data,
hb_codepoint_t unicode, hb_codepoint_t /*variation_selector*/,
hb_codepoint_t *glyph,
void * /*user_data*/)
_hb_qt_get_font_h_extents(hb_font_t * /*font*/, void *font_data,
hb_font_extents_t *metrics,
void * /*user_data*/)
{
QFontEngine *fe = static_cast<QFontEngine *>(font_data);
Q_ASSERT(fe);
metrics->ascender = fe->ascent().value();
metrics->descender = fe->descent().value();
metrics->line_gap = fe->leading().value();
return true;
}
#endif
#if HB_VERSION_ATLEAST(1, 2, 3)
static hb_bool_t
_hb_qt_font_get_nominal_glyph(hb_font_t * /*font*/, void *font_data,
hb_codepoint_t unicode,
hb_codepoint_t *glyph,
void * /*user_data*/)
{
QFontEngine *fe = static_cast<QFontEngine *>(font_data);
Q_ASSERT(fe);
*glyph = fe->glyphIndex(unicode);
return true;
return *glyph != 0;
}
#endif
static hb_bool_t
_hb_qt_font_get_variation_glyph(hb_font_t * /*font*/, void *font_data,
hb_codepoint_t unicode, hb_codepoint_t /*variation_selector*/,
hb_codepoint_t *glyph,
void * /*user_data*/)
{
QFontEngine *fe = static_cast<QFontEngine *>(font_data);
Q_ASSERT(fe);
// ### TODO add support for variation selectors
*glyph = fe->glyphIndex(unicode);
return *glyph != 0;
}
static hb_position_t
@ -456,15 +490,7 @@ _hb_qt_font_get_glyph_h_advance(hb_font_t *font, void *font_data,
return advance.value();
}
static hb_position_t
_hb_qt_font_get_glyph_v_advance(hb_font_t * /*font*/, void * /*font_data*/,
hb_codepoint_t /*glyph*/,
void * /*user_data*/)
{
qCritical("hb_qt_font_get_glyph_v_advance: vertical writing isn't supported!");
return 0;
}
#if !HB_VERSION_ATLEAST(1, 1, 2)
static hb_bool_t
_hb_qt_font_get_glyph_h_origin(hb_font_t * /*font*/, void * /*font_data*/,
hb_codepoint_t /*glyph*/,
@ -473,16 +499,7 @@ _hb_qt_font_get_glyph_h_origin(hb_font_t * /*font*/, void * /*font_data*/,
{
return true; // we always work in the horizontal coordinates
}
static hb_bool_t
_hb_qt_font_get_glyph_v_origin(hb_font_t * /*font*/, void * /*font_data*/,
hb_codepoint_t /*glyph*/,
hb_position_t * /*x*/, hb_position_t * /*y*/,
void * /*user_data*/)
{
qCritical("hb_qt_get_glyph_v_origin: vertical writing isn't supported!");
return false;
}
#endif
static hb_position_t
_hb_qt_font_get_glyph_h_kerning(hb_font_t *font, void *font_data,
@ -505,15 +522,6 @@ _hb_qt_font_get_glyph_h_kerning(hb_font_t *font, void *font_data,
return advance.value();
}
static hb_position_t
_hb_qt_font_get_glyph_v_kerning(hb_font_t * /*font*/, void * /*font_data*/,
hb_codepoint_t /*first_glyph*/, hb_codepoint_t /*second_glyph*/,
void * /*user_data*/)
{
qCritical("hb_qt_get_glyph_v_kerning: vertical writing isn't supported!");
return 0;
}
static hb_bool_t
_hb_qt_font_get_glyph_extents(hb_font_t * /*font*/, void *font_data,
hb_codepoint_t glyph,
@ -554,29 +562,6 @@ _hb_qt_font_get_glyph_contour_point(hb_font_t * /*font*/, void *font_data,
return false;
}
static hb_bool_t
_hb_qt_font_get_glyph_name(hb_font_t * /*font*/, void * /*font_data*/,
hb_codepoint_t /*glyph*/,
char *name, unsigned int size,
void * /*user_data*/)
{
qCritical("hb_qt_font_get_glyph_name: not implemented!");
if (size)
*name = '\0';
return false;
}
static hb_bool_t
_hb_qt_font_get_glyph_from_name(hb_font_t * /*font*/, void * /*font_data*/,
const char * /*name*/, int /*len*/,
hb_codepoint_t *glyph,
void * /*user_data*/)
{
qCritical("hb_qt_font_get_glyph_from_name: not implemented!");
*glyph = 0;
return false;
}
static hb_user_data_key_t _useDesignMetricsKey;
@ -595,17 +580,25 @@ struct _hb_qt_font_funcs_t {
_hb_qt_font_funcs_t()
{
funcs = hb_font_funcs_create();
hb_font_funcs_set_glyph_func(funcs, _hb_qt_font_get_glyph, NULL, NULL);
#if HB_VERSION_ATLEAST(1, 1, 3)
hb_font_funcs_set_font_h_extents_func(funcs, _hb_qt_get_font_h_extents, NULL, NULL);
#endif
#if HB_VERSION_ATLEAST(1, 2, 3)
hb_font_funcs_set_nominal_glyph_func(funcs, _hb_qt_font_get_nominal_glyph, NULL, NULL);
hb_font_funcs_set_variation_glyph_func(funcs, _hb_qt_font_get_variation_glyph, NULL, NULL);
#else
hb_font_funcs_set_glyph_func(funcs, _hb_qt_font_get_variation_glyph, NULL, NULL);
#endif
hb_font_funcs_set_glyph_h_advance_func(funcs, _hb_qt_font_get_glyph_h_advance, NULL, NULL);
hb_font_funcs_set_glyph_v_advance_func(funcs, _hb_qt_font_get_glyph_v_advance, NULL, NULL);
#if !HB_VERSION_ATLEAST(1, 1, 2)
hb_font_funcs_set_glyph_h_origin_func(funcs, _hb_qt_font_get_glyph_h_origin, NULL, NULL);
hb_font_funcs_set_glyph_v_origin_func(funcs, _hb_qt_font_get_glyph_v_origin, NULL, NULL);
#endif
hb_font_funcs_set_glyph_h_kerning_func(funcs, _hb_qt_font_get_glyph_h_kerning, NULL, NULL);
hb_font_funcs_set_glyph_v_kerning_func(funcs, _hb_qt_font_get_glyph_v_kerning, NULL, NULL);
hb_font_funcs_set_glyph_extents_func(funcs, _hb_qt_font_get_glyph_extents, NULL, NULL);
hb_font_funcs_set_glyph_contour_point_func(funcs, _hb_qt_font_get_glyph_contour_point, NULL, NULL);
hb_font_funcs_set_glyph_name_func(funcs, _hb_qt_font_get_glyph_name, NULL, NULL);
hb_font_funcs_set_glyph_from_name_func(funcs, _hb_qt_font_get_glyph_from_name, NULL, NULL);
hb_font_funcs_make_immutable(funcs);
}
~_hb_qt_font_funcs_t()
{