diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 07b370691..30571fb80 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -805,11 +805,16 @@ struct FeatureParamsStylisticSet /* https://docs.microsoft.com/en-us/typography/opentype/spec/features_ae#cv01-cv99 */ struct FeatureParamsCharacterVariants { - bool sanitize (hb_sanitize_context_t *c) const + unsigned + get_characters (unsigned start_offset, unsigned *char_count, hb_codepoint_t *chars) const { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - characters.sanitize (c)); + if (char_count) + { + + characters.sub_array (start_offset, char_count) + | hb_sink (hb_array (chars, *char_count)) + ; + } + return characters.len; } unsigned get_size () const @@ -821,6 +826,13 @@ struct FeatureParamsCharacterVariants return_trace ((bool) c->serializer->embed (*this)); } + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + characters.sanitize (c)); + } + HBUINT16 format; /* Format number is set to 0. */ NameID featUILableNameID; /* The ‘name’ table name ID that * specifies a string (or strings, diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index b612c1e2f..703d426d4 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1710,12 +1710,6 @@ hb_ot_layout_feature_get_name_ids (hb_face_t *face, * Fetches a list of the characters defined as having a variant under the specified * "Character Variant" ("cvXX") feature tag. * - * Note: If the char_count output value is equal to its input value, then there - * is a chance there were more characters defined under the feature tag than were - * returned. This function can be called with incrementally larger start_offset - * until the char_count output value is lower than its input value, or the size - * of the characters array can be increased. - * * Return value: Number of total sample characters in the cvXX feature. * * Since: 2.0.0 @@ -1729,24 +1723,10 @@ hb_ot_layout_feature_get_characters (hb_face_t *face, hb_codepoint_t *characters /* OUT. May be NULL */) { const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); - - hb_tag_t feature_tag = g.get_feature_tag (feature_index); - const OT::Feature &f = g.get_feature (feature_index); - - const OT::FeatureParams &feature_params = f.get_feature_params (); - - const OT::FeatureParamsCharacterVariants& cv_params = - feature_params.get_character_variants_params(feature_tag); - - unsigned int len = 0; - if (char_count && characters && start_offset < cv_params.characters.len) - { - len = hb_min (cv_params.characters.len - start_offset, *char_count); - for (unsigned int i = 0; i < len; ++i) - characters[i] = cv_params.characters[start_offset + i]; - } - if (char_count) *char_count = len; - return cv_params.characters.len; + return g.get_feature (feature_index) + .get_feature_params () + .get_character_variants_params(g.get_feature_tag (feature_index)) + .get_characters (start_offset, char_count, characters); } #endif diff --git a/test/api/test-ot-name.c b/test/api/test-ot-name.c index c2ae4fd42..d688eb3fb 100644 --- a/test/api/test-ot-name.c +++ b/test/api/test-ot-name.c @@ -68,6 +68,15 @@ test_ot_layout_feature_get_name_ids_and_characters (void) g_assert_cmpint (char_count, ==, 2); g_assert_cmpint (characters[0], ==, 10); g_assert_cmpint (characters[1], ==, 24030); + + char_count = 100; + characters[1] = 1234; + all_chars = hb_ot_layout_feature_get_characters (face, HB_OT_TAG_GSUB, feature_index, + 1, &char_count, characters); + g_assert_cmpint (all_chars, ==, 2); + g_assert_cmpint (char_count, ==, 1); + g_assert_cmpint (characters[0], ==, 24030); + g_assert_cmpint (characters[1], ==, 1234); } static void