< prev index next >

src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc

Print this page

        

*** 24,123 **** * * Red Hat Author(s): Behdad Esfahbod * Google Author(s): Behdad Esfahbod */ ! #include "hb-private.hh" ! #include "hb-font-private.hh" /* * hb_font_funcs_t */ static hb_bool_t hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_font_extents_t *metrics, void *user_data HB_UNUSED) { ! memset (metrics, 0, sizeof (*metrics)); return false; } static hb_bool_t ! hb_font_get_font_h_extents_parent (hb_font_t *font, void *font_data HB_UNUSED, ! hb_font_extents_t *metrics, void *user_data HB_UNUSED) { ! hb_bool_t ret = font->parent->get_font_h_extents (metrics); if (ret) { ! metrics->ascender = font->parent_scale_y_distance (metrics->ascender); ! metrics->descender = font->parent_scale_y_distance (metrics->descender); ! metrics->line_gap = font->parent_scale_y_distance (metrics->line_gap); } return ret; } static hb_bool_t hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_font_extents_t *metrics, void *user_data HB_UNUSED) { ! memset (metrics, 0, sizeof (*metrics)); return false; } static hb_bool_t ! hb_font_get_font_v_extents_parent (hb_font_t *font, void *font_data HB_UNUSED, ! hb_font_extents_t *metrics, void *user_data HB_UNUSED) { ! hb_bool_t ret = font->parent->get_font_v_extents (metrics); if (ret) { ! metrics->ascender = font->parent_scale_x_distance (metrics->ascender); ! metrics->descender = font->parent_scale_x_distance (metrics->descender); ! metrics->line_gap = font->parent_scale_x_distance (metrics->line_gap); } return ret; } static hb_bool_t hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t unicode, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { *glyph = 0; return false; } static hb_bool_t ! hb_font_get_nominal_glyph_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t unicode, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { return font->parent->get_nominal_glyph (unicode, glyph); } static hb_bool_t hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t unicode, ! hb_codepoint_t variation_selector, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { *glyph = 0; return false; } static hb_bool_t ! hb_font_get_variation_glyph_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t unicode, hb_codepoint_t variation_selector, hb_codepoint_t *glyph, void *user_data HB_UNUSED) --- 24,172 ---- * * Red Hat Author(s): Behdad Esfahbod * Google Author(s): Behdad Esfahbod */ ! #include "hb.hh" ! #include "hb-font.hh" ! #include "hb-machinery.hh" ! ! #include "hb-ot.h" ! ! ! /** ! * SECTION:hb-font ! * @title: hb-font ! * @short_description: Font objects ! * @include: hb.h ! * ! * Font objects represent a font face at a certain size and other ! * parameters (pixels per EM, points per EM, variation settings.) ! * Fonts are created from font faces, and are used as input to ! * hb_shape() among other things. ! **/ /* * hb_font_funcs_t */ static hb_bool_t hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_font_extents_t *extents, void *user_data HB_UNUSED) { ! memset (extents, 0, sizeof (*extents)); return false; } static hb_bool_t ! hb_font_get_font_h_extents_default (hb_font_t *font, void *font_data HB_UNUSED, ! hb_font_extents_t *extents, void *user_data HB_UNUSED) { ! hb_bool_t ret = font->parent->get_font_h_extents (extents); if (ret) { ! extents->ascender = font->parent_scale_y_distance (extents->ascender); ! extents->descender = font->parent_scale_y_distance (extents->descender); ! extents->line_gap = font->parent_scale_y_distance (extents->line_gap); } return ret; } static hb_bool_t hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_font_extents_t *extents, void *user_data HB_UNUSED) { ! memset (extents, 0, sizeof (*extents)); return false; } static hb_bool_t ! hb_font_get_font_v_extents_default (hb_font_t *font, void *font_data HB_UNUSED, ! hb_font_extents_t *extents, void *user_data HB_UNUSED) { ! hb_bool_t ret = font->parent->get_font_v_extents (extents); if (ret) { ! extents->ascender = font->parent_scale_x_distance (extents->ascender); ! extents->descender = font->parent_scale_x_distance (extents->descender); ! extents->line_gap = font->parent_scale_x_distance (extents->line_gap); } return ret; } static hb_bool_t hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t unicode HB_UNUSED, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { *glyph = 0; return false; } static hb_bool_t ! hb_font_get_nominal_glyph_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t unicode, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { + if (font->has_nominal_glyphs_func_set ()) + { + return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0); + } return font->parent->get_nominal_glyph (unicode, glyph); } + #define hb_font_get_nominal_glyphs_nil hb_font_get_nominal_glyphs_default + static unsigned int + hb_font_get_nominal_glyphs_default (hb_font_t *font, + void *font_data HB_UNUSED, + unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + void *user_data HB_UNUSED) + { + if (font->has_nominal_glyph_func_set ()) + { + for (unsigned int i = 0; i < count; i++) + { + if (!font->get_nominal_glyph (*first_unicode, first_glyph)) + return i; + + first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride); + first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride); + } + return count; + } + + return font->parent->get_nominal_glyphs (count, + first_unicode, unicode_stride, + first_glyph, glyph_stride); + } + static hb_bool_t hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t unicode HB_UNUSED, ! hb_codepoint_t variation_selector HB_UNUSED, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { *glyph = 0; return false; } static hb_bool_t ! hb_font_get_variation_glyph_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t unicode, hb_codepoint_t variation_selector, hb_codepoint_t *glyph, void *user_data HB_UNUSED)
*** 127,181 **** static hb_position_t hb_font_get_glyph_h_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, ! hb_codepoint_t glyph, void *user_data HB_UNUSED) { return font->x_scale; } static hb_position_t ! hb_font_get_glyph_h_advance_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) { return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph)); } static hb_position_t hb_font_get_glyph_v_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, ! hb_codepoint_t glyph, void *user_data HB_UNUSED) { /* TODO use font_extents.ascender+descender */ return font->y_scale; } static hb_position_t ! hb_font_get_glyph_v_advance_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) { return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); } static hb_bool_t hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { *x = *y = 0; return true; } static hb_bool_t ! hb_font_get_glyph_h_origin_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) --- 176,306 ---- static hb_position_t hb_font_get_glyph_h_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, ! hb_codepoint_t glyph HB_UNUSED, void *user_data HB_UNUSED) { return font->x_scale; } static hb_position_t ! hb_font_get_glyph_h_advance_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) { + if (font->has_glyph_h_advances_func_set ()) + { + hb_position_t ret; + font->get_glyph_h_advances (1, &glyph, 0, &ret, 0); + return ret; + } return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph)); } static hb_position_t hb_font_get_glyph_v_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, ! hb_codepoint_t glyph HB_UNUSED, void *user_data HB_UNUSED) { /* TODO use font_extents.ascender+descender */ return font->y_scale; } static hb_position_t ! hb_font_get_glyph_v_advance_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) { + if (font->has_glyph_v_advances_func_set ()) + { + hb_position_t ret; + font->get_glyph_v_advances (1, &glyph, 0, &ret, 0); + return ret; + } return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); } + #define hb_font_get_glyph_h_advances_nil hb_font_get_glyph_h_advances_default + static void + hb_font_get_glyph_h_advances_default (hb_font_t* font, + void* font_data HB_UNUSED, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + hb_position_t *first_advance, + unsigned int advance_stride, + void *user_data HB_UNUSED) + { + if (font->has_glyph_h_advance_func_set ()) + { + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->get_glyph_h_advance (*first_glyph); + first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride); + first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride); + } + return; + } + + font->parent->get_glyph_h_advances (count, + first_glyph, glyph_stride, + first_advance, advance_stride); + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->parent_scale_x_distance (*first_advance); + first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride); + } + } + + #define hb_font_get_glyph_v_advances_nil hb_font_get_glyph_v_advances_default + static void + hb_font_get_glyph_v_advances_default (hb_font_t* font, + void* font_data HB_UNUSED, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + hb_position_t *first_advance, + unsigned int advance_stride, + void *user_data HB_UNUSED) + { + if (font->has_glyph_v_advance_func_set ()) + { + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->get_glyph_v_advance (*first_glyph); + first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride); + first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride); + } + return; + } + + font->parent->get_glyph_v_advances (count, + first_glyph, glyph_stride, + first_advance, advance_stride); + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->parent_scale_y_distance (*first_advance); + first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride); + } + } + static hb_bool_t hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph HB_UNUSED, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { *x = *y = 0; return true; } static hb_bool_t ! hb_font_get_glyph_h_origin_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED)
*** 187,206 **** } static hb_bool_t hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { *x = *y = 0; return false; } static hb_bool_t ! hb_font_get_glyph_v_origin_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) --- 312,331 ---- } static hb_bool_t hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph HB_UNUSED, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { *x = *y = 0; return false; } static hb_bool_t ! hb_font_get_glyph_v_origin_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED)
*** 212,229 **** } static hb_position_t hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t left_glyph, ! hb_codepoint_t right_glyph, void *user_data HB_UNUSED) { return 0; } static hb_position_t ! hb_font_get_glyph_h_kerning_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t left_glyph, hb_codepoint_t right_glyph, void *user_data HB_UNUSED) { --- 337,354 ---- } static hb_position_t hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t left_glyph HB_UNUSED, ! hb_codepoint_t right_glyph HB_UNUSED, void *user_data HB_UNUSED) { return 0; } static hb_position_t ! hb_font_get_glyph_h_kerning_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t left_glyph, hb_codepoint_t right_glyph, void *user_data HB_UNUSED) {
*** 231,248 **** } static hb_position_t hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t top_glyph, ! hb_codepoint_t bottom_glyph, void *user_data HB_UNUSED) { return 0; } static hb_position_t ! hb_font_get_glyph_v_kerning_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph, void *user_data HB_UNUSED) { --- 356,373 ---- } static hb_position_t hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t top_glyph HB_UNUSED, ! hb_codepoint_t bottom_glyph HB_UNUSED, void *user_data HB_UNUSED) { return 0; } static hb_position_t ! hb_font_get_glyph_v_kerning_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph, void *user_data HB_UNUSED) {
*** 250,268 **** } static hb_bool_t hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) { memset (extents, 0, sizeof (*extents)); return false; } static hb_bool_t ! hb_font_get_glyph_extents_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) { --- 375,393 ---- } static hb_bool_t hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph HB_UNUSED, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) { memset (extents, 0, sizeof (*extents)); return false; } static hb_bool_t ! hb_font_get_glyph_extents_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) {
*** 275,295 **** } static hb_bool_t hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph, ! unsigned int point_index, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { *x = *y = 0; return false; } static hb_bool_t ! hb_font_get_glyph_contour_point_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, unsigned int point_index, hb_position_t *x, hb_position_t *y, --- 400,420 ---- } static hb_bool_t hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph HB_UNUSED, ! unsigned int point_index HB_UNUSED, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { *x = *y = 0; return false; } static hb_bool_t ! hb_font_get_glyph_contour_point_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, unsigned int point_index, hb_position_t *x, hb_position_t *y,
*** 302,320 **** } static hb_bool_t hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph, char *name, unsigned int size, void *user_data HB_UNUSED) { if (size) *name = '\0'; return false; } static hb_bool_t ! hb_font_get_glyph_name_parent (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, char *name, unsigned int size, void *user_data HB_UNUSED) { --- 427,445 ---- } static hb_bool_t hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! hb_codepoint_t glyph HB_UNUSED, char *name, unsigned int size, void *user_data HB_UNUSED) { if (size) *name = '\0'; return false; } static hb_bool_t ! hb_font_get_glyph_name_default (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, char *name, unsigned int size, void *user_data HB_UNUSED) {
*** 322,353 **** } static hb_bool_t hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! const char *name, int len, /* -1 means nul-terminated */ hb_codepoint_t *glyph, void *user_data HB_UNUSED) { *glyph = 0; return false; } static hb_bool_t ! hb_font_get_glyph_from_name_parent (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) { return font->parent->get_glyph_from_name (name, len, glyph); } ! static const hb_font_funcs_t _hb_font_funcs_nil = { HB_OBJECT_HEADER_STATIC, - true, /* immutable */ - { #define HB_FONT_FUNC_IMPLEMENT(name) nullptr, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT }, --- 447,478 ---- } static hb_bool_t hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, ! const char *name HB_UNUSED, ! int len HB_UNUSED, /* -1 means nul-terminated */ hb_codepoint_t *glyph, void *user_data HB_UNUSED) { *glyph = 0; return false; } static hb_bool_t ! hb_font_get_glyph_from_name_default (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) { return font->parent->get_glyph_from_name (name, len, glyph); } ! DEFINE_NULL_INSTANCE (hb_font_funcs_t) = ! { HB_OBJECT_HEADER_STATIC, { #define HB_FONT_FUNC_IMPLEMENT(name) nullptr, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT },
*** 362,375 **** HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT } } }; - static const hb_font_funcs_t _hb_font_funcs_parent = { - HB_OBJECT_HEADER_STATIC, ! true, /* immutable */ { #define HB_FONT_FUNC_IMPLEMENT(name) nullptr, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT --- 487,499 ---- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT } } }; ! static const hb_font_funcs_t _hb_font_funcs_default = { ! HB_OBJECT_HEADER_STATIC, { #define HB_FONT_FUNC_IMPLEMENT(name) nullptr, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT
*** 379,389 **** HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT }, { { ! #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT } } }; --- 503,513 ---- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT }, { { ! #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_default, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT } } };
*** 397,414 **** * Return value: (transfer full): * * Since: 0.9.2 **/ hb_font_funcs_t * ! hb_font_funcs_create (void) { hb_font_funcs_t *ffuncs; if (!(ffuncs = hb_object_create<hb_font_funcs_t> ())) return hb_font_funcs_get_empty (); ! ffuncs->get = _hb_font_funcs_parent.get; return ffuncs; } /** --- 521,538 ---- * Return value: (transfer full): * * Since: 0.9.2 **/ hb_font_funcs_t * ! hb_font_funcs_create () { hb_font_funcs_t *ffuncs; if (!(ffuncs = hb_object_create<hb_font_funcs_t> ())) return hb_font_funcs_get_empty (); ! ffuncs->get = _hb_font_funcs_default.get; return ffuncs; } /**
*** 419,431 **** * Return value: (transfer full): * * Since: 0.9.2 **/ hb_font_funcs_t * ! hb_font_funcs_get_empty (void) { ! return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_parent); } /** * hb_font_funcs_reference: (skip) * @ffuncs: font functions. --- 543,555 ---- * Return value: (transfer full): * * Since: 0.9.2 **/ hb_font_funcs_t * ! hb_font_funcs_get_empty () { ! return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_default); } /** * hb_font_funcs_reference: (skip) * @ffuncs: font functions.
*** 515,528 **** * Since: 0.9.2 **/ void hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs) { ! if (unlikely (hb_object_is_inert (ffuncs))) return; ! ffuncs->immutable = true; } /** * hb_font_funcs_is_immutable: * @ffuncs: font functions. --- 639,652 ---- * Since: 0.9.2 **/ void hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs) { ! if (hb_object_is_immutable (ffuncs)) return; ! hb_object_make_immutable (ffuncs); } /** * hb_font_funcs_is_immutable: * @ffuncs: font functions.
*** 534,544 **** * Since: 0.9.2 **/ hb_bool_t hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs) { ! return ffuncs->immutable; } #define HB_FONT_FUNC_IMPLEMENT(name) \ \ --- 658,668 ---- * Since: 0.9.2 **/ hb_bool_t hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs) { ! return hb_object_is_immutable (ffuncs); } #define HB_FONT_FUNC_IMPLEMENT(name) \ \
*** 546,556 **** hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \ hb_font_get_##name##_func_t func, \ void *user_data, \ hb_destroy_func_t destroy) \ { \ ! if (ffuncs->immutable) { \ if (destroy) \ destroy (user_data); \ return; \ } \ \ --- 670,680 ---- hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \ hb_font_get_##name##_func_t func, \ void *user_data, \ hb_destroy_func_t destroy) \ { \ ! if (hb_object_is_immutable (ffuncs)) { \ if (destroy) \ destroy (user_data); \ return; \ } \ \
*** 560,584 **** if (func) { \ ffuncs->get.f.name = func; \ ffuncs->user_data.name = user_data; \ ffuncs->destroy.name = destroy; \ } else { \ ! ffuncs->get.f.name = hb_font_get_##name##_parent; \ ffuncs->user_data.name = nullptr; \ ffuncs->destroy.name = nullptr; \ } \ } HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT bool hb_font_t::has_func (unsigned int i) { ! if (parent && parent != hb_font_get_empty () && parent->has_func (i)) ! return true; ! return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i]; } /* Public getters */ /** --- 684,713 ---- if (func) { \ ffuncs->get.f.name = func; \ ffuncs->user_data.name = user_data; \ ffuncs->destroy.name = destroy; \ } else { \ ! ffuncs->get.f.name = hb_font_get_##name##_default; \ ffuncs->user_data.name = nullptr; \ ffuncs->destroy.name = nullptr; \ } \ } HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #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 hb_font_t::has_func (unsigned int i) { ! return has_func_set (i) || ! (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i)); } /* Public getters */ /**
*** 716,725 **** --- 845,891 ---- { return font->get_glyph_v_advance (glyph); } /** + * hb_font_get_glyph_h_advances: + * @font: a font. + * + * + * + * Since: 1.8.6 + **/ + void + hb_font_get_glyph_h_advances (hb_font_t* font, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride) + { + font->get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride); + } + /** + * hb_font_get_glyph_v_advances: + * @font: a font. + * + * + * + * Since: 1.8.6 + **/ + void + hb_font_get_glyph_v_advances (hb_font_t* font, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride) + { + font->get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride); + } + + /** * hb_font_get_glyph_h_origin: * @font: a font. * @glyph: * @x: (out): * @y: (out):
*** 768,777 **** --- 934,944 ---- * * * Return value: * * Since: 0.9.2 + * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_h_kerning (hb_font_t *font, hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) {
*** 787,796 **** --- 954,964 ---- * * * Return value: * * Since: 0.9.2 + * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_v_kerning (hb_font_t *font, hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph) {
*** 886,896 **** /** * hb_font_get_extents_for_direction: * @font: a font. * @direction: ! * @extents: * * * * Since: 1.1.3 **/ --- 1054,1064 ---- /** * hb_font_get_extents_for_direction: * @font: a font. * @direction: ! * @extents: (out): * * * * Since: 1.1.3 **/
*** 919,928 **** --- 1087,1116 ---- hb_direction_t direction, hb_position_t *x, hb_position_t *y) { return font->get_glyph_advance_for_direction (glyph, direction, x, y); } + /** + * hb_font_get_glyph_advances_for_direction: + * @font: a font. + * @direction: + * + * + * + * Since: 1.8.6 + **/ + HB_EXTERN void + hb_font_get_glyph_advances_for_direction (hb_font_t* font, + hb_direction_t direction, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride) + { + font->get_glyph_advances_for_direction (direction, count, first_glyph, glyph_stride, first_advance, advance_stride); + } /** * hb_font_get_glyph_origin_for_direction: * @font: a font. * @glyph:
*** 995,1004 **** --- 1183,1193 ---- * @y: (out): * * * * Since: 0.9.2 + * Deprecated: 2.0.0 **/ void hb_font_get_glyph_kerning_for_direction (hb_font_t *font, hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, hb_direction_t direction,
*** 1098,1107 **** --- 1287,1339 ---- /* * hb_font_t */ + DEFINE_NULL_INSTANCE (hb_font_t) = + { + HB_OBJECT_HEADER_STATIC, + + nullptr, /* parent */ + const_cast<hb_face_t *> (&_hb_Null_hb_face_t), + + 1000, /* x_scale */ + 1000, /* y_scale */ + + 0, /* x_ppem */ + 0, /* y_ppem */ + 0, /* ptem */ + + 0, /* num_coords */ + nullptr, /* coords */ + + const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t), + + /* Zero for the rest is fine. */ + }; + + + static hb_font_t * + _hb_font_create (hb_face_t *face) + { + hb_font_t *font; + + if (unlikely (!face)) + face = hb_face_get_empty (); + if (!(font = hb_object_create<hb_font_t> ())) + return hb_font_get_empty (); + + hb_face_make_immutable (face); + font->parent = hb_font_get_empty (); + font->face = hb_face_reference (face); + font->klass = hb_font_funcs_get_empty (); + font->data.init0 (font); + font->x_scale = font->y_scale = hb_face_get_upem (face); + + return font; + } + /** * hb_font_create: (Xconstructor) * @face: a face. * *
*** 1111,1133 **** * Since: 0.9.2 **/ hb_font_t * hb_font_create (hb_face_t *face) { ! hb_font_t *font; ! if (unlikely (!face)) ! face = hb_face_get_empty (); ! if (!(font = hb_object_create<hb_font_t> ())) ! return hb_font_get_empty (); ! ! hb_face_make_immutable (face); ! font->parent = hb_font_get_empty (); ! font->face = hb_face_reference (face); ! font->klass = hb_font_funcs_get_empty (); ! ! font->x_scale = font->y_scale = hb_face_get_upem (face); return font; } /** --- 1343,1356 ---- * Since: 0.9.2 **/ hb_font_t * hb_font_create (hb_face_t *face) { ! hb_font_t *font = _hb_font_create (face); ! /* Install our in-house, very lightweight, funcs. */ ! hb_ot_font_set_funcs (font); return font; } /**
*** 1144,1156 **** hb_font_create_sub_font (hb_font_t *parent) { if (unlikely (!parent)) parent = hb_font_get_empty (); ! hb_font_t *font = hb_font_create (parent->face); ! if (unlikely (hb_object_is_inert (font))) return font; font->parent = hb_font_reference (parent); font->x_scale = parent->x_scale; --- 1367,1379 ---- hb_font_create_sub_font (hb_font_t *parent) { if (unlikely (!parent)) parent = hb_font_get_empty (); ! hb_font_t *font = _hb_font_create (parent->face); ! if (unlikely (hb_object_is_immutable (font))) return font; font->parent = hb_font_reference (parent); font->x_scale = parent->x_scale;
*** 1183,1224 **** * Return value: (transfer full) * * Since: 0.9.2 **/ hb_font_t * ! hb_font_get_empty (void) { ! static const hb_font_t _hb_font_nil = { ! HB_OBJECT_HEADER_STATIC, ! ! true, /* immutable */ ! ! nullptr, /* parent */ ! const_cast<hb_face_t *> (&_hb_face_nil), ! ! 1000, /* x_scale */ ! 1000, /* y_scale */ ! ! 0, /* x_ppem */ ! 0, /* y_ppem */ ! 0, /* ptem */ ! ! 0, /* num_coords */ ! nullptr, /* coords */ ! ! const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */ ! nullptr, /* user_data */ ! nullptr, /* destroy */ ! ! { ! #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, ! #include "hb-shaper-list.hh" ! #undef HB_SHAPER_IMPLEMENT ! } ! }; ! ! return const_cast<hb_font_t *> (&_hb_font_nil); } /** * hb_font_reference: (skip) * @font: a font. --- 1406,1418 ---- * Return value: (transfer full) * * Since: 0.9.2 **/ hb_font_t * ! hb_font_get_empty () { ! return const_cast<hb_font_t *> (&Null(hb_font_t)); } /** * hb_font_reference: (skip) * @font: a font.
*** 1246,1258 **** void hb_font_destroy (hb_font_t *font) { if (!hb_object_destroy (font)) return; ! #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, font); ! #include "hb-shaper-list.hh" ! #undef HB_SHAPER_IMPLEMENT if (font->destroy) font->destroy (font->user_data); hb_font_destroy (font->parent); --- 1440,1450 ---- void hb_font_destroy (hb_font_t *font) { if (!hb_object_destroy (font)) return; ! font->data.fini (); if (font->destroy) font->destroy (font->user_data); hb_font_destroy (font->parent);
*** 1315,1331 **** * Since: 0.9.2 **/ void hb_font_make_immutable (hb_font_t *font) { ! if (unlikely (hb_object_is_inert (font))) return; if (font->parent) hb_font_make_immutable (font->parent); ! font->immutable = true; } /** * hb_font_is_immutable: * @font: a font. --- 1507,1523 ---- * Since: 0.9.2 **/ void hb_font_make_immutable (hb_font_t *font) { ! if (hb_object_is_immutable (font)) return; if (font->parent) hb_font_make_immutable (font->parent); ! hb_object_make_immutable (font); } /** * hb_font_is_immutable: * @font: a font.
*** 1337,1347 **** * Since: 0.9.2 **/ hb_bool_t hb_font_is_immutable (hb_font_t *font) { ! return font->immutable; } /** * hb_font_set_parent: * @font: a font. --- 1529,1539 ---- * Since: 0.9.2 **/ hb_bool_t hb_font_is_immutable (hb_font_t *font) { ! return hb_object_is_immutable (font); } /** * hb_font_set_parent: * @font: a font.
*** 1353,1363 **** **/ void hb_font_set_parent (hb_font_t *font, hb_font_t *parent) { ! if (font->immutable) return; if (!parent) parent = hb_font_get_empty (); --- 1545,1555 ---- **/ void hb_font_set_parent (hb_font_t *font, hb_font_t *parent) { ! if (hb_object_is_immutable (font)) return; if (!parent) parent = hb_font_get_empty ();
*** 1395,1405 **** **/ void hb_font_set_face (hb_font_t *font, hb_face_t *face) { ! if (font->immutable) return; if (unlikely (!face)) face = hb_face_get_empty (); --- 1587,1597 ---- **/ void hb_font_set_face (hb_font_t *font, hb_face_t *face) { ! if (hb_object_is_immutable (font)) return; if (unlikely (!face)) face = hb_face_get_empty ();
*** 1442,1452 **** hb_font_set_funcs (hb_font_t *font, hb_font_funcs_t *klass, void *font_data, hb_destroy_func_t destroy) { ! if (font->immutable) { if (destroy) destroy (font_data); return; } --- 1634,1645 ---- hb_font_set_funcs (hb_font_t *font, hb_font_funcs_t *klass, void *font_data, hb_destroy_func_t destroy) { ! if (hb_object_is_immutable (font)) ! { if (destroy) destroy (font_data); return; }
*** 1477,1487 **** hb_font_set_funcs_data (hb_font_t *font, void *font_data, hb_destroy_func_t destroy) { /* Destroy user_data? */ ! if (font->immutable) { if (destroy) destroy (font_data); return; } --- 1670,1681 ---- hb_font_set_funcs_data (hb_font_t *font, void *font_data, hb_destroy_func_t destroy) { /* Destroy user_data? */ ! if (hb_object_is_immutable (font)) ! { if (destroy) destroy (font_data); return; }
*** 1506,1516 **** void hb_font_set_scale (hb_font_t *font, int x_scale, int y_scale) { ! if (font->immutable) return; font->x_scale = x_scale; font->y_scale = y_scale; } --- 1700,1710 ---- void hb_font_set_scale (hb_font_t *font, int x_scale, int y_scale) { ! if (hb_object_is_immutable (font)) return; font->x_scale = x_scale; font->y_scale = y_scale; }
*** 1547,1557 **** void hb_font_set_ppem (hb_font_t *font, unsigned int x_ppem, unsigned int y_ppem) { ! if (font->immutable) return; font->x_ppem = x_ppem; font->y_ppem = y_ppem; } --- 1741,1751 ---- void hb_font_set_ppem (hb_font_t *font, unsigned int x_ppem, unsigned int y_ppem) { ! if (hb_object_is_immutable (font)) return; font->x_ppem = x_ppem; font->y_ppem = y_ppem; }
*** 1576,1595 **** } /** * hb_font_set_ptem: * @font: a font. ! * @ptem: * ! * Sets "point size" of the font. * * Since: 1.6.0 **/ void hb_font_set_ptem (hb_font_t *font, float ptem) { ! if (font->immutable) return; font->ptem = ptem; } --- 1770,1791 ---- } /** * hb_font_set_ptem: * @font: a font. ! * @ptem: font size in points. ! * ! * Sets "point size" of the font. Set to 0 to unset. * ! * There are 72 points in an inch. * * Since: 1.6.0 **/ void hb_font_set_ptem (hb_font_t *font, float ptem) { ! if (hb_object_is_immutable (font)) return; font->ptem = ptem; }
*** 1632,1642 **** void hb_font_set_variations (hb_font_t *font, const hb_variation_t *variations, unsigned int variations_length) { ! if (font->immutable) return; if (!variations_length) { hb_font_set_var_coords_normalized (font, nullptr, 0); --- 1828,1838 ---- void hb_font_set_variations (hb_font_t *font, const hb_variation_t *variations, unsigned int variations_length) { ! if (hb_object_is_immutable (font)) return; if (!variations_length) { hb_font_set_var_coords_normalized (font, nullptr, 0);
*** 1663,1673 **** void hb_font_set_var_coords_design (hb_font_t *font, const float *coords, unsigned int coords_length) { ! if (font->immutable) return; int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr; if (unlikely (coords_length && !normalized)) return; --- 1859,1869 ---- void hb_font_set_var_coords_design (hb_font_t *font, const float *coords, unsigned int coords_length) { ! if (hb_object_is_immutable (font)) return; int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr; if (unlikely (coords_length && !normalized)) return;
*** 1684,1694 **** void hb_font_set_var_coords_normalized (hb_font_t *font, const int *coords, /* 2.14 normalized */ unsigned int coords_length) { ! if (font->immutable) return; int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr; if (unlikely (coords_length && !copy)) return; --- 1880,1890 ---- void hb_font_set_var_coords_normalized (hb_font_t *font, const int *coords, /* 2.14 normalized */ unsigned int coords_length) { ! if (hb_object_is_immutable (font)) return; int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr; if (unlikely (coords_length && !copy)) return;
*** 1716,1727 **** return font->coords; } - #ifndef HB_DISABLE_DEPRECATED - /* * Deprecated get_glyph_func(): */ struct hb_trampoline_closure_t --- 1912,1921 ----
*** 1804,1816 **** } /** * hb_font_funcs_set_glyph_func: * @ffuncs: font functions. ! * @func: (closure user_data) (destroy destroy) (scope notified): ! * @user_data: ! * @destroy: * * Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and * hb_font_funcs_set_variation_glyph_func() instead. * * Since: 0.9.2 --- 1998,2010 ---- } /** * hb_font_funcs_set_glyph_func: * @ffuncs: font functions. ! * @func: (closure user_data) (destroy destroy) (scope notified): callback function. ! * @user_data: data to pass to @func. ! * @destroy: function to call when @user_data is not needed anymore. * * Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and * hb_font_funcs_set_variation_glyph_func() instead. * * Since: 0.9.2
*** 1840,1846 **** hb_font_funcs_set_variation_glyph_func (ffuncs, hb_font_get_variation_glyph_trampoline, trampoline, trampoline_destroy); } - - #endif /* HB_DISABLE_DEPRECATED */ --- 2034,2038 ----
< prev index next >