diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/text/qharfbuzzng.cpp | 117 |
1 files changed, 55 insertions, 62 deletions
diff --git a/src/gui/text/qharfbuzzng.cpp b/src/gui/text/qharfbuzzng.cpp index 55ef9f0d15..6aca660205 100644 --- a/src/gui/text/qharfbuzzng.cpp +++ b/src/gui/text/qharfbuzzng.cpp @@ -422,19 +422,53 @@ 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); - *glyph = fe->glyphIndex(unicode); + 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 *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 _hb_qt_font_get_glyph_h_advance(hb_font_t *font, void *font_data, @@ -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() { |