/* * Copyright © 1998-2004 David Turner and Werner Lemberg * Copyright © 2006 Behdad Esfahbod * Copyright © 2007,2008,2009 Red Hat, Inc. * Copyright © 2012,2013 Google, Inc. * * This is part of HarfBuzz, a text shaping library. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and its documentation for any purpose, provided that the * above copyright notice and the following two paragraphs appear in * all copies of this software. * * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Red Hat Author(s): Behdad Esfahbod * Google Author(s): Behdad Esfahbod */ #include "hb.hh" #ifndef HB_NO_OT_LAYOUT #ifdef HB_NO_OT_TAG #error "Cannot compile hb-ot-layout.cc with HB_NO_OT_TAG." #endif #include "hb-open-type.hh" #include "hb-ot-layout.hh" #include "hb-ot-face.hh" #include "hb-ot-map.hh" #include "hb-map.hh" #include "hb-ot-kern-table.hh" #include "hb-ot-layout-gdef-table.hh" #include "hb-ot-layout-gsub-table.hh" #include "hb-ot-layout-gpos-table.hh" #include "hb-ot-layout-base-table.hh" #include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise. #include "hb-ot-name-table.hh" #include "hb-ot-os2-table.hh" #include "hb-aat-layout-morx-table.hh" #include "hb-aat-layout-opbd-table.hh" // Just so we compile it; unused otherwise. GSUB; GPOS; /** * SECTION:hb-ot-layout * @title: hb-ot-layout * @short_description: OpenType Layout * @include: hb-ot.h * * Functions for querying OpenType Layout features in the font face. * See the [OpenType specification](http://www.microsoft.com/typography/otspec/) * for details. **/ /* * kern */ #ifndef HB_NO_OT_KERN /** * hb_ot_layout_has_kerning: * @face: The #hb_face_t to work on * * Tests whether a face includes any kerning data in the 'kern' table. * Does NOT test for kerning lookups in the GPOS table. * * Return value: `true` if data found, `false` otherwise * **/ bool hb_ot_layout_has_kerning (hb_face_t *face) { … } /** * hb_ot_layout_has_machine_kerning: * @face: The #hb_face_t to work on * * Tests whether a face includes any state-machine kerning in the 'kern' table. * Does NOT examine the GPOS table. * * Return value: `true` if data found, `false` otherwise * **/ bool hb_ot_layout_has_machine_kerning (hb_face_t *face) { … } /** * hb_ot_layout_has_cross_kerning: * @face: The #hb_face_t to work on * * Tests whether a face has any cross-stream kerning (i.e., kerns * that make adjustments perpendicular to the direction of the text * flow: Y adjustments in horizontal text or X adjustments in * vertical text) in the 'kern' table. * * Does NOT examine the GPOS table. * * Return value: `true` is data found, `false` otherwise * **/ bool hb_ot_layout_has_cross_kerning (hb_face_t *face) { … } void hb_ot_layout_kern (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { … } #endif /* * GDEF */ bool OT::GDEF::is_blocklisted (hb_blob_t *blob, hb_face_t *face) const { … } static void _hb_ot_layout_set_glyph_props (hb_font_t *font, hb_buffer_t *buffer) { … } /* Public API */ /** * hb_ot_layout_has_glyph_classes: * @face: #hb_face_t to work upon * * Tests whether a face has any glyph classes defined in its GDEF table. * * Return value: `true` if data found, `false` otherwise * **/ hb_bool_t hb_ot_layout_has_glyph_classes (hb_face_t *face) { … } /** * hb_ot_layout_get_glyph_class: * @face: The #hb_face_t to work on * @glyph: The #hb_codepoint_t code point to query * * Fetches the GDEF class of the requested glyph in the specified face. * * Return value: The #hb_ot_layout_glyph_class_t glyph class of the given code * point in the GDEF table of the face. * * Since: 0.9.7 **/ hb_ot_layout_glyph_class_t hb_ot_layout_get_glyph_class (hb_face_t *face, hb_codepoint_t glyph) { … } /** * hb_ot_layout_get_glyphs_in_class: * @face: The #hb_face_t to work on * @klass: The #hb_ot_layout_glyph_class_t GDEF class to retrieve * @glyphs: (out): The #hb_set_t set of all glyphs belonging to the requested * class. * * Retrieves the set of all glyphs from the face that belong to the requested * glyph class in the face's GDEF table. * * Since: 0.9.7 **/ void hb_ot_layout_get_glyphs_in_class (hb_face_t *face, hb_ot_layout_glyph_class_t klass, hb_set_t *glyphs /* OUT */) { … } #ifndef HB_NO_LAYOUT_UNUSED /** * hb_ot_layout_get_attach_points: * @face: The #hb_face_t to work on * @glyph: The #hb_codepoint_t code point to query * @start_offset: offset of the first attachment point to retrieve * @point_count: (inout) (optional): Input = the maximum number of attachment points to return; * Output = the actual number of attachment points returned (may be zero) * @point_array: (out) (array length=point_count): The array of attachment points found for the query * * Fetches a list of all attachment points for the specified glyph in the GDEF * table of the face. The list returned will begin at the offset provided. * * Useful if the client program wishes to cache the list. * * Return value: Total number of attachment points for @glyph. * **/ unsigned int hb_ot_layout_get_attach_points (hb_face_t *face, hb_codepoint_t glyph, unsigned int start_offset, unsigned int *point_count /* IN/OUT */, unsigned int *point_array /* OUT */) { … } /** * hb_ot_layout_get_ligature_carets: * @font: The #hb_font_t to work on * @direction: The #hb_direction_t text direction to use * @glyph: The #hb_codepoint_t code point to query * @start_offset: offset of the first caret position to retrieve * @caret_count: (inout) (optional): Input = the maximum number of caret positions to return; * Output = the actual number of caret positions returned (may be zero) * @caret_array: (out) (array length=caret_count): The array of caret positions found for the query * * Fetches a list of the caret positions defined for a ligature glyph in the GDEF * table of the font. The list returned will begin at the offset provided. * * Note that a ligature that is formed from n characters will have n-1 * caret positions. The first character is not represented in the array, * since its caret position is the glyph position. * * The positions returned by this function are 'unshaped', and will have to * be fixed up for kerning that may be applied to the ligature glyph. * * Return value: Total number of ligature caret positions for @glyph. * **/ unsigned int hb_ot_layout_get_ligature_carets (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph, unsigned int start_offset, unsigned int *caret_count /* IN/OUT */, hb_position_t *caret_array /* OUT */) { … } #endif /* * GSUB/GPOS */ bool GSUB::is_blocklisted (hb_blob_t *blob HB_UNUSED, hb_face_t *face) const { … } bool GPOS::is_blocklisted (hb_blob_t *blob HB_UNUSED, hb_face_t *face HB_UNUSED) const { … } static const OT::GSUBGPOS& get_gsubgpos_table (hb_face_t *face, hb_tag_t table_tag) { … } /** * hb_ot_layout_table_get_script_tags: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @start_offset: offset of the first script tag to retrieve * @script_count: (inout) (optional): Input = the maximum number of script tags to return; * Output = the actual number of script tags returned (may be zero) * @script_tags: (out) (array length=script_count): The array of #hb_tag_t script tags found for the query * * Fetches a list of all scripts enumerated in the specified face's GSUB table * or GPOS table. The list returned will begin at the offset provided. * * Return value: Total number of script tags. * **/ unsigned int hb_ot_layout_table_get_script_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int start_offset, unsigned int *script_count /* IN/OUT */, hb_tag_t *script_tags /* OUT */) { … } #define HB_OT_TAG_LATIN_SCRIPT … /** * hb_ot_layout_table_find_script: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_tag: #hb_tag_t of the script tag requested * @script_index: (out): The index of the requested script tag * * Fetches the index if a given script tag in the specified face's GSUB table * or GPOS table. * * Return value: `true` if the script is found, `false` otherwise * **/ hb_bool_t hb_ot_layout_table_find_script (hb_face_t *face, hb_tag_t table_tag, hb_tag_t script_tag, unsigned int *script_index /* OUT */) { … } #ifndef HB_DISABLE_DEPRECATED /** * hb_ot_layout_table_choose_script: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_tags: Array of #hb_tag_t script tags * @script_index: (out): The index of the chosen script * @chosen_script: (out): #hb_tag_t of the chosen script * * Deprecated since 2.0.0 **/ hb_bool_t hb_ot_layout_table_choose_script (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *script_tags, unsigned int *script_index /* OUT */, hb_tag_t *chosen_script /* OUT */) { … } #endif /** * hb_ot_layout_table_select_script: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_count: Number of script tags in the array * @script_tags: Array of #hb_tag_t script tags * @script_index: (out) (optional): The index of the requested script * @chosen_script: (out) (optional): #hb_tag_t of the requested script * * Selects an OpenType script for @table_tag from the @script_tags array. * * If the table does not have any of the requested scripts, then `DFLT`, * `dflt`, and `latn` tags are tried in that order. If the table still does not * have any of these scripts, @script_index is set to * #HB_OT_LAYOUT_NO_SCRIPT_INDEX and @chosen_script is set to #HB_TAG_NONE. * * Return value: * `true` if one of the requested scripts is selected, `false` if a fallback * script is selected or if no scripts are selected. * * Since: 2.0.0 **/ hb_bool_t hb_ot_layout_table_select_script (hb_face_t *face, hb_tag_t table_tag, unsigned int script_count, const hb_tag_t *script_tags, unsigned int *script_index /* OUT */, hb_tag_t *chosen_script /* OUT */) { … } /** * hb_ot_layout_table_get_feature_tags: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @start_offset: offset of the first feature tag to retrieve * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return; * Output = the actual number of feature tags returned (may be zero) * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table * * Fetches a list of all feature tags in the given face's GSUB or GPOS table. * Note that there might be duplicate feature tags, belonging to different * script/language-system pairs of the table. * * Return value: Total number of feature tags. * * Since: 0.6.0 * **/ unsigned int hb_ot_layout_table_get_feature_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int start_offset, unsigned int *feature_count /* IN/OUT */, hb_tag_t *feature_tags /* OUT */) { … } /** * hb_ot_layout_table_find_feature: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @feature_tag: The #hb_tag_t of the requested feature tag * @feature_index: (out): The index of the requested feature * * Fetches the index for a given feature tag in the specified face's GSUB table * or GPOS table. * * Return value: `true` if the feature is found, `false` otherwise * * Since: 0.6.0 * **/ bool hb_ot_layout_table_find_feature (hb_face_t *face, hb_tag_t table_tag, hb_tag_t feature_tag, unsigned int *feature_index /* OUT */) { … } /** * hb_ot_layout_script_get_language_tags: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @start_offset: offset of the first language tag to retrieve * @language_count: (inout) (optional): Input = the maximum number of language tags to return; * Output = the actual number of language tags returned (may be zero) * @language_tags: (out) (array length=language_count): Array of language tags found in the table * * Fetches a list of language tags in the given face's GSUB or GPOS table, underneath * the specified script index. The list returned will begin at the offset provided. * * Return value: Total number of language tags. * * Since: 0.6.0 * **/ unsigned int hb_ot_layout_script_get_language_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int start_offset, unsigned int *language_count /* IN/OUT */, hb_tag_t *language_tags /* OUT */) { … } #ifndef HB_DISABLE_DEPRECATED /** * hb_ot_layout_script_find_language: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_tag: The #hb_tag_t of the requested language * @language_index: The index of the requested language * * Fetches the index of a given language tag in the specified face's GSUB table * or GPOS table, underneath the specified script tag. * * Return value: `true` if the language tag is found, `false` otherwise * * Since: 0.6.0 * Deprecated: 2.0.0 **/ hb_bool_t hb_ot_layout_script_find_language (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, hb_tag_t language_tag, unsigned int *language_index) { … } #endif /** * hb_ot_layout_script_select_language2: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_count: The number of languages in the specified script * @language_tags: The array of language tags * @language_index: (out): The index of the chosen language * @chosen_language: (out): #hb_tag_t of the chosen language * * Fetches the index of the first language tag fom @language_tags that is present * in the specified face's GSUB or GPOS table, underneath the specified script * index. * * If none of the given language tags is found, `false` is returned and * @language_index is set to #HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX and * @chosen_language is set to #HB_TAG_NONE. * * Return value: `true` if one of the given language tags is found, `false` otherwise * * Since: 7.0.0 **/ hb_bool_t hb_ot_layout_script_select_language2 (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_count, const hb_tag_t *language_tags, unsigned int *language_index /* OUT */, hb_tag_t *chosen_language /* OUT */) { … } /** * hb_ot_layout_script_select_language: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_count: The number of languages in the specified script * @language_tags: The array of language tags * @language_index: (out): The index of the requested language * * Fetches the index of the first language tag fom @language_tags that is present * in the specified face's GSUB or GPOS table, underneath the specified script * index. * * If none of the given language tags is found, `false` is returned and * @language_index is set to the default language index. * * Return value: `true` if one of the given language tags is found, `false` otherwise * * Since: 2.0.0 **/ hb_bool_t hb_ot_layout_script_select_language (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_count, const hb_tag_t *language_tags, unsigned int *language_index /* OUT */) { … } /** * hb_ot_layout_language_get_required_feature_index: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_index: The index of the requested language tag * @feature_index: (out): The index of the requested feature * * Fetches the index of a requested feature in the given face's GSUB or GPOS table, * underneath the specified script and language. * * Return value: `true` if the feature is found, `false` otherwise * * Since: 0.6.0 * **/ hb_bool_t hb_ot_layout_language_get_required_feature_index (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_index, unsigned int *feature_index /* OUT */) { … } /** * hb_ot_layout_language_get_required_feature: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_index: The index of the requested language tag * @feature_index: (out): The index of the requested feature * @feature_tag: (out): The #hb_tag_t of the requested feature * * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table, * underneath the specified script and language. * * Return value: `true` if the feature is found, `false` otherwise * * Since: 0.9.30 **/ hb_bool_t hb_ot_layout_language_get_required_feature (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_index, unsigned int *feature_index /* OUT */, hb_tag_t *feature_tag /* OUT */) { … } /** * hb_ot_layout_language_get_feature_indexes: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_index: The index of the requested language tag * @start_offset: offset of the first feature tag to retrieve * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return; * Output: the actual number of feature tags returned (may be zero) * @feature_indexes: (out) (array length=feature_count): The array of feature indexes found for the query * * Fetches a list of all features in the specified face's GSUB table * or GPOS table, underneath the specified script and language. The list * returned will begin at the offset provided. * * Return value: Total number of features. * * Since: 0.6.0 * **/ unsigned int hb_ot_layout_language_get_feature_indexes (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_index, unsigned int start_offset, unsigned int *feature_count /* IN/OUT */, unsigned int *feature_indexes /* OUT */) { … } /** * hb_ot_layout_language_get_feature_tags: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_index: The index of the requested language tag * @start_offset: offset of the first feature tag to retrieve * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return; * Output = the actual number of feature tags returned (may be zero) * @feature_tags: (out) (array length=feature_count): The array of #hb_tag_t feature tags found for the query * * Fetches a list of all features in the specified face's GSUB table * or GPOS table, underneath the specified script and language. The list * returned will begin at the offset provided. * * Return value: Total number of feature tags. * * Since: 0.6.0 * **/ unsigned int hb_ot_layout_language_get_feature_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_index, unsigned int start_offset, unsigned int *feature_count /* IN/OUT */, hb_tag_t *feature_tags /* OUT */) { … } /** * hb_ot_layout_language_find_feature: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_index: The index of the requested language tag * @feature_tag: #hb_tag_t of the feature tag requested * @feature_index: (out): The index of the requested feature * * Fetches the index of a given feature tag in the specified face's GSUB table * or GPOS table, underneath the specified script and language. * * Return value: `true` if the feature is found, `false` otherwise * * Since: 0.6.0 * **/ hb_bool_t hb_ot_layout_language_find_feature (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_index, hb_tag_t feature_tag, unsigned int *feature_index /* OUT */) { … } /** * hb_ot_layout_feature_get_lookups: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @feature_index: The index of the requested feature * @start_offset: offset of the first lookup to retrieve * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return; * Output = the actual number of lookups returned (may be zero) * @lookup_indexes: (out) (array length=lookup_count): The array of lookup indexes found for the query * * Fetches a list of all lookups enumerated for the specified feature, in * the specified face's GSUB table or GPOS table. The list returned will * begin at the offset provided. * * Return value: Total number of lookups. * * Since: 0.9.7 **/ unsigned int hb_ot_layout_feature_get_lookups (hb_face_t *face, hb_tag_t table_tag, unsigned int feature_index, unsigned int start_offset, unsigned int *lookup_count /* IN/OUT */, unsigned int *lookup_indexes /* OUT */) { … } /** * hb_ot_layout_table_get_lookup_count: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * * Fetches the total number of lookups enumerated in the specified * face's GSUB table or GPOS table. * * Return value: Total number of lookups. * * Since: 0.9.22 **/ unsigned int hb_ot_layout_table_get_lookup_count (hb_face_t *face, hb_tag_t table_tag) { … } struct hb_collect_features_context_t { … }; static void langsys_collect_features (hb_collect_features_context_t *c, const OT::LangSys &l) { … } static void script_collect_features (hb_collect_features_context_t *c, const OT::Script &s, const hb_tag_t *languages) { … } /** * hb_ot_layout_collect_features: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @scripts: (nullable) (array zero-terminated=1): The array of scripts to collect features for, * terminated by %HB_TAG_NONE * @languages: (nullable) (array zero-terminated=1): The array of languages to collect features for, * terminated by %HB_TAG_NONE * @features: (nullable) (array zero-terminated=1): The array of features to collect, * terminated by %HB_TAG_NONE * @feature_indexes: (out): The set of feature indexes found for the query * * Fetches a list of all feature indexes in the specified face's GSUB table * or GPOS table, underneath the specified scripts, languages, and features. * If no list of scripts is provided, all scripts will be queried. If no list * of languages is provided, all languages will be queried. If no list of * features is provided, all features will be queried. * * Since: 1.8.5 **/ void hb_ot_layout_collect_features (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *feature_indexes /* OUT */) { … } /** * hb_ot_layout_collect_features_map: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @script_index: The index of the requested script tag * @language_index: The index of the requested language tag * @feature_map: (out): The map of feature tag to feature index. * * Fetches the mapping from feature tags to feature indexes for * the specified script and language. * * Since: 8.1.0 **/ void hb_ot_layout_collect_features_map (hb_face_t *face, hb_tag_t table_tag, unsigned script_index, unsigned language_index, hb_map_t *feature_map /* OUT */) { … } /** * hb_ot_layout_collect_lookups: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @scripts: (nullable) (array zero-terminated=1): The array of scripts to collect lookups for, * terminated by %HB_TAG_NONE * @languages: (nullable) (array zero-terminated=1): The array of languages to collect lookups for, * terminated by %HB_TAG_NONE * @features: (nullable) (array zero-terminated=1): The array of features to collect lookups for, * terminated by %HB_TAG_NONE * @lookup_indexes: (out): The array of lookup indexes found for the query * * Fetches a list of all feature-lookup indexes in the specified face's GSUB * table or GPOS table, underneath the specified scripts, languages, and * features. If no list of scripts is provided, all scripts will be queried. * If no list of languages is provided, all languages will be queried. If no * list of features is provided, all features will be queried. * * Since: 0.9.8 **/ void hb_ot_layout_collect_lookups (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */) { … } #ifndef HB_NO_LAYOUT_COLLECT_GLYPHS /** * hb_ot_layout_lookup_collect_glyphs: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @lookup_index: The index of the feature lookup to query * @glyphs_before: (out): Array of glyphs preceding the substitution range * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup * @glyphs_after: (out): Array of glyphs following the substitution range * @glyphs_output: (out): Array of glyphs that would be the substituted output of the lookup * * Fetches a list of all glyphs affected by the specified lookup in the * specified face's GSUB table or GPOS table. * * Since: 0.9.7 **/ void hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, hb_tag_t table_tag, unsigned int lookup_index, hb_set_t *glyphs_before, /* OUT. May be NULL */ hb_set_t *glyphs_input, /* OUT. May be NULL */ hb_set_t *glyphs_after, /* OUT. May be NULL */ hb_set_t *glyphs_output /* OUT. May be NULL */) { … } #endif /* Variations support */ /** * hb_ot_layout_table_find_feature_variations: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @coords: The variation coordinates to query * @num_coords: The number of variation coordinates * @variations_index: (out): The array of feature variations found for the query * * Fetches a list of feature variations in the specified face's GSUB table * or GPOS table, at the specified variation coordinates. * * Return value: `true` if feature variations were found, `false` otherwise. * * Since: 1.4.0 * **/ hb_bool_t hb_ot_layout_table_find_feature_variations (hb_face_t *face, hb_tag_t table_tag, const int *coords, unsigned int num_coords, unsigned int *variations_index /* out */) { … } /** * hb_ot_layout_feature_with_variations_get_lookups: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS * @feature_index: The index of the feature to query * @variations_index: The index of the feature variation to query * @start_offset: offset of the first lookup to retrieve * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return; * Output = the actual number of lookups returned (may be zero) * @lookup_indexes: (out) (array length=lookup_count): The array of lookups found for the query * * Fetches a list of all lookups enumerated for the specified feature, in * the specified face's GSUB table or GPOS table, enabled at the specified * variations index. The list returned will begin at the offset provided. * * Return value: Total number of lookups. * * Since: 1.4.0 * **/ unsigned int hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face, hb_tag_t table_tag, unsigned int feature_index, unsigned int variations_index, unsigned int start_offset, unsigned int *lookup_count /* IN/OUT */, unsigned int *lookup_indexes /* OUT */) { … } /* * OT::GSUB */ /** * hb_ot_layout_has_substitution: * @face: #hb_face_t to work upon * * Tests whether the specified face includes any GSUB substitutions. * * Return value: `true` if data found, `false` otherwise * * Since: 0.6.0 * **/ hb_bool_t hb_ot_layout_has_substitution (hb_face_t *face) { … } /** * hb_ot_layout_lookup_would_substitute: * @face: #hb_face_t to work upon * @lookup_index: The index of the lookup to query * @glyphs: The sequence of glyphs to query for substitution * @glyphs_length: The length of the glyph sequence * @zero_context: #hb_bool_t indicating whether pre-/post-context are disallowed * in substitutions * * Tests whether a specified lookup in the specified face would * trigger a substitution on the given glyph sequence. * * Return value: `true` if a substitution would be triggered, `false` otherwise * * Since: 0.9.7 **/ hb_bool_t hb_ot_layout_lookup_would_substitute (hb_face_t *face, unsigned int lookup_index, const hb_codepoint_t *glyphs, unsigned int glyphs_length, hb_bool_t zero_context) { … } /** * hb_ot_layout_substitute_start: * @font: #hb_font_t to use * @buffer: #hb_buffer_t buffer to work upon * * Called before substitution lookups are performed, to ensure that glyph * class and other properties are set on the glyphs in the buffer. * **/ void hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer) { … } /** * hb_ot_layout_lookup_substitute_closure: * @face: #hb_face_t to work upon * @lookup_index: index of the feature lookup to query * @glyphs: (out): Array of glyphs comprising the transitive closure of the lookup * * Compute the transitive closure of glyphs needed for a * specified lookup. * * Since: 0.9.7 **/ void hb_ot_layout_lookup_substitute_closure (hb_face_t *face, unsigned int lookup_index, hb_set_t *glyphs /* OUT */) { … } /** * hb_ot_layout_lookups_substitute_closure: * @face: #hb_face_t to work upon * @lookups: The set of lookups to query * @glyphs: (out): Array of glyphs comprising the transitive closure of the lookups * * Compute the transitive closure of glyphs needed for all of the * provided lookups. * * Since: 1.8.1 **/ void hb_ot_layout_lookups_substitute_closure (hb_face_t *face, const hb_set_t *lookups, hb_set_t *glyphs /* OUT */) { … } /* * GPOS */ /** * hb_ot_layout_has_positioning: * @face: #hb_face_t to work upon * * Tests whether the specified face includes any GPOS positioning. * * Return value: `true` if the face has GPOS data, `false` otherwise * **/ hb_bool_t hb_ot_layout_has_positioning (hb_face_t *face) { … } /** * hb_ot_layout_position_start: * @font: #hb_font_t to use * @buffer: #hb_buffer_t buffer to work upon * * Called before positioning lookups are performed, to ensure that glyph * attachment types and glyph-attachment chains are set for the glyphs in the buffer. * **/ void hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer) { … } /** * hb_ot_layout_position_finish_advances: * @font: #hb_font_t to use * @buffer: #hb_buffer_t buffer to work upon * * Called after positioning lookups are performed, to finish glyph advances. * **/ void hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer) { … } /** * hb_ot_layout_position_finish_offsets: * @font: #hb_font_t to use * @buffer: #hb_buffer_t buffer to work upon * * Called after positioning lookups are performed, to finish glyph offsets. * **/ void hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) { … } #ifndef HB_NO_LAYOUT_FEATURE_PARAMS /** * hb_ot_layout_get_size_params: * @face: #hb_face_t to work upon * @design_size: (out): The design size of the face * @subfamily_id: (out): The identifier of the face within the font subfamily * @subfamily_name_id: (out): The ‘name’ table name ID of the face within the font subfamily * @range_start: (out): The minimum size of the recommended size range for the face * @range_end: (out): The maximum size of the recommended size range for the face * * Fetches optical-size feature data (i.e., the `size` feature from GPOS). Note that * the subfamily_id and the subfamily name string (accessible via the subfamily_name_id) * as used here are defined as pertaining only to fonts within a font family that differ * specifically in their respective size ranges; other ways to differentiate fonts within * a subfamily are not covered by the `size` feature. * * For more information on this distinction, see the [`size` feature documentation]( * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size). * * Return value: `true` if data found, `false` otherwise * * Since: 0.9.10 **/ hb_bool_t hb_ot_layout_get_size_params (hb_face_t *face, unsigned int *design_size, /* OUT. May be NULL */ unsigned int *subfamily_id, /* OUT. May be NULL */ hb_ot_name_id_t *subfamily_name_id, /* OUT. May be NULL */ unsigned int *range_start, /* OUT. May be NULL */ unsigned int *range_end /* OUT. May be NULL */) { … } /** * hb_ot_layout_feature_get_name_ids: * @face: #hb_face_t to work upon * @table_tag: table tag to query, "GSUB" or "GPOS". * @feature_index: index of feature to query. * @label_id: (out) (optional): The ‘name’ table name ID that specifies a string * for a user-interface label for this feature. (May be NULL.) * @tooltip_id: (out) (optional): The ‘name’ table name ID that specifies a string * that an application can use for tooltip text for this * feature. (May be NULL.) * @sample_id: (out) (optional): The ‘name’ table name ID that specifies sample text * that illustrates the effect of this feature. (May be NULL.) * @num_named_parameters: (out) (optional): Number of named parameters. (May be zero.) * @first_param_id: (out) (optional): The first ‘name’ table name ID used to specify * strings for user-interface labels for the feature * parameters. (Must be zero if numParameters is zero.) * * Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or * "Character Variant" ('cvXX') features. * * Return value: `true` if data found, `false` otherwise * * Since: 2.0.0 **/ hb_bool_t hb_ot_layout_feature_get_name_ids (hb_face_t *face, hb_tag_t table_tag, unsigned int feature_index, hb_ot_name_id_t *label_id, /* OUT. May be NULL */ hb_ot_name_id_t *tooltip_id, /* OUT. May be NULL */ hb_ot_name_id_t *sample_id, /* OUT. May be NULL */ unsigned int *num_named_parameters, /* OUT. May be NULL */ hb_ot_name_id_t *first_param_id /* OUT. May be NULL */) { … } /** * hb_ot_layout_feature_get_characters: * @face: #hb_face_t to work upon * @table_tag: table tag to query, "GSUB" or "GPOS". * @feature_index: index of feature to query. * @start_offset: offset of the first character to retrieve * @char_count: (inout) (optional): Input = the maximum number of characters to return; * Output = the actual number of characters returned (may be zero) * @characters: (out caller-allocates) (array length=char_count): A buffer pointer. * The Unicode codepoints of the characters for which this feature provides * glyph variants. * * Fetches a list of the characters defined as having a variant under the specified * "Character Variant" ("cvXX") feature tag. * * Return value: Number of total sample characters in the cvXX feature. * * Since: 2.0.0 **/ unsigned int hb_ot_layout_feature_get_characters (hb_face_t *face, hb_tag_t table_tag, unsigned int feature_index, unsigned int start_offset, unsigned int *char_count, /* IN/OUT. May be NULL */ hb_codepoint_t *characters /* OUT. May be NULL */) { … } #endif /* * Parts of different types are implemented here such that they have direct * access to GSUB/GPOS lookups. */ struct GSUBProxy { … }; struct GPOSProxy { … }; static inline bool apply_forward (OT::hb_ot_apply_context_t *c, const OT::hb_ot_layout_lookup_accelerator_t &accel, unsigned subtable_count) { … } static inline bool apply_backward (OT::hb_ot_apply_context_t *c, const OT::hb_ot_layout_lookup_accelerator_t &accel, unsigned subtable_count) { … } template <typename Proxy> static inline bool apply_string (OT::hb_ot_apply_context_t *c, const typename Proxy::Lookup &lookup, const OT::hb_ot_layout_lookup_accelerator_t &accel) { … } template <typename Proxy> inline void hb_ot_map_t::apply (const Proxy &proxy, const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const { … } void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const { … } void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const { … } void hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c, const OT::SubstLookup &lookup, const OT::hb_ot_layout_lookup_accelerator_t &accel) { … } #ifndef HB_NO_BASE static void choose_base_tags (hb_script_t script, hb_language_t language, hb_tag_t *script_tag, hb_tag_t *language_tag) { … } /** * hb_ot_layout_get_font_extents: * @font: a font * @direction: text direction. * @script_tag: script tag. * @language_tag: language tag. * @extents: (out) (nullable): font extents if found. * * Fetches script/language-specific font extents. These values are * looked up in the `BASE` table's `MinMax` records. * * If no such extents are found, the default extents for the font are * fetched. As such, the return value of this function can for the * most part be ignored. Note that the per-script/language extents * do not have a line-gap value, and the line-gap is set to zero in * that case. * * Return value: `true` if found script/language-specific font extents. * * Since: 8.0.0 **/ hb_bool_t hb_ot_layout_get_font_extents (hb_font_t *font, hb_direction_t direction, hb_tag_t script_tag, hb_tag_t language_tag, hb_font_extents_t *extents) { … } /** * hb_ot_layout_get_font_extents2: * @font: a font * @direction: text direction. * @script: script. * @language: (nullable): language. * @extents: (out) (nullable): font extents if found. * * Fetches script/language-specific font extents. These values are * looked up in the `BASE` table's `MinMax` records. * * If no such extents are found, the default extents for the font are * fetched. As such, the return value of this function can for the * most part be ignored. Note that the per-script/language extents * do not have a line-gap value, and the line-gap is set to zero in * that case. * * This function is like hb_ot_layout_get_font_extents() but takes * #hb_script_t and #hb_language_t instead of OpenType #hb_tag_t. * * Return value: `true` if found script/language-specific font extents. * * Since: 8.0.0 **/ hb_bool_t hb_ot_layout_get_font_extents2 (hb_font_t *font, hb_direction_t direction, hb_script_t script, hb_language_t language, hb_font_extents_t *extents) { … } /** * hb_ot_layout_get_horizontal_baseline_tag_for_script: * @script: a script tag. * * Fetches the dominant horizontal baseline tag used by @script. * * Return value: dominant baseline tag for the @script. * * Since: 4.0.0 **/ hb_ot_layout_baseline_tag_t hb_ot_layout_get_horizontal_baseline_tag_for_script (hb_script_t script) { … } /** * hb_ot_layout_get_baseline: * @font: a font * @baseline_tag: a baseline tag * @direction: text direction. * @script_tag: script tag. * @language_tag: language tag, currently unused. * @coord: (out) (nullable): baseline value if found. * * Fetches a baseline value from the face. * * Return value: `true` if found baseline value in the font. * * Since: 2.6.0 **/ hb_bool_t hb_ot_layout_get_baseline (hb_font_t *font, hb_ot_layout_baseline_tag_t baseline_tag, hb_direction_t direction, hb_tag_t script_tag, hb_tag_t language_tag, hb_position_t *coord /* OUT. May be NULL. */) { … } /** * hb_ot_layout_get_baseline2: * @font: a font * @baseline_tag: a baseline tag * @direction: text direction. * @script: script. * @language: (nullable): language, currently unused. * @coord: (out) (nullable): baseline value if found. * * Fetches a baseline value from the face. * * This function is like hb_ot_layout_get_baseline() but takes * #hb_script_t and #hb_language_t instead of OpenType #hb_tag_t. * * Return value: `true` if found baseline value in the font. * * Since: 8.0.0 **/ hb_bool_t hb_ot_layout_get_baseline2 (hb_font_t *font, hb_ot_layout_baseline_tag_t baseline_tag, hb_direction_t direction, hb_script_t script, hb_language_t language, hb_position_t *coord /* OUT. May be NULL. */) { … } /** * hb_ot_layout_get_baseline_with_fallback: * @font: a font * @baseline_tag: a baseline tag * @direction: text direction. * @script_tag: script tag. * @language_tag: language tag, currently unused. * @coord: (out): baseline value if found. * * Fetches a baseline value from the face, and synthesizes * it if the font does not have it. * * Since: 4.0.0 **/ void hb_ot_layout_get_baseline_with_fallback (hb_font_t *font, hb_ot_layout_baseline_tag_t baseline_tag, hb_direction_t direction, hb_tag_t script_tag, hb_tag_t language_tag, hb_position_t *coord /* OUT */) { … } /** * hb_ot_layout_get_baseline_with_fallback2: * @font: a font * @baseline_tag: a baseline tag * @direction: text direction. * @script: script. * @language: (nullable): language, currently unused. * @coord: (out): baseline value if found. * * Fetches a baseline value from the face, and synthesizes * it if the font does not have it. * * This function is like hb_ot_layout_get_baseline_with_fallback() but takes * #hb_script_t and #hb_language_t instead of OpenType #hb_tag_t. * * Since: 8.0.0 **/ void hb_ot_layout_get_baseline_with_fallback2 (hb_font_t *font, hb_ot_layout_baseline_tag_t baseline_tag, hb_direction_t direction, hb_script_t script, hb_language_t language, hb_position_t *coord /* OUT */) { … } #endif struct hb_get_glyph_alternates_dispatch_t : hb_dispatch_context_t<hb_get_glyph_alternates_dispatch_t, unsigned> { … }; #ifndef HB_NO_LAYOUT_RARELY_USED /** * hb_ot_layout_lookup_get_glyph_alternates: * @face: a face. * @lookup_index: index of the feature lookup to query. * @glyph: a glyph id. * @start_offset: starting offset. * @alternate_count: (inout) (optional): Input = the maximum number of alternate glyphs to return; * Output = the actual number of alternate glyphs returned (may be zero). * @alternate_glyphs: (out caller-allocates) (array length=alternate_count): A glyphs buffer. * Alternate glyphs associated with the glyph id. * * Fetches alternates of a glyph from a given GSUB lookup index. * * Return value: Total number of alternates found in the specific lookup index for the given glyph id. * * Since: 2.6.8 **/ HB_EXTERN unsigned hb_ot_layout_lookup_get_glyph_alternates (hb_face_t *face, unsigned lookup_index, hb_codepoint_t glyph, unsigned start_offset, unsigned *alternate_count /* IN/OUT. May be NULL. */, hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) { … } struct hb_position_single_dispatch_t : hb_dispatch_context_t<hb_position_single_dispatch_t, bool> { … }; /** * hb_ot_layout_lookup_get_optical_bound: * @font: a font. * @lookup_index: index of the feature lookup to query. * @direction: edge of the glyph to query. * @glyph: a glyph id. * * Fetches the optical bound of a glyph positioned at the margin of text. * The direction identifies which edge of the glyph to query. * * Return value: Adjustment value. Negative values mean the glyph will stick out of the margin. * * Since: 5.3.0 **/ hb_position_t hb_ot_layout_lookup_get_optical_bound (hb_font_t *font, unsigned lookup_index, hb_direction_t direction, hb_codepoint_t glyph) { … } #endif #endif