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
parent
847fe03d91
commit
268b3ec2d1
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue