blob: 386b98d58031ecfdf8ff2b6335969f58edc498d4 [file] [log] [blame]
Behdad Esfahbod64aef3a2008-01-23 16:14:38 -05001/*
Behdad Esfahbod2409d5f2011-04-21 17:14:28 -04002 * Copyright © 2007,2008,2009 Red Hat, Inc.
Behdad Esfahbod64aef3a2008-01-23 16:14:38 -05003 *
Behdad Esfahbodc755cb32010-04-22 00:11:43 -04004 * This is part of HarfBuzz, a text shaping library.
Behdad Esfahbod64aef3a2008-01-23 16:14:38 -05005 *
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
11 *
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16 * DAMAGE.
17 *
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23 *
24 * Red Hat Author(s): Behdad Esfahbod
25 */
26
Khaled Hosny7b9e23f2021-02-10 23:37:43 +020027#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
Behdad Esfahbodd1c9eb42012-04-12 13:17:44 -040028#error "Include <hb-ot.h> instead."
29#endif
30
Behdad Esfahbodfd92a3d2008-01-24 03:11:09 -050031#ifndef HB_OT_LAYOUT_H
32#define HB_OT_LAYOUT_H
Behdad Esfahbod12c45682006-12-28 06:10:59 -050033
Behdad Esfahbodd1c9eb42012-04-12 13:17:44 -040034#include "hb.h"
Behdad Esfahbod12c45682006-12-28 06:10:59 -050035
Behdad Esfahbod477bc9a2018-10-12 15:52:31 -040036#include "hb-ot-name.h"
Behdad Esfahbod8a3511a2009-11-04 19:45:39 -050037
Behdad Esfahbodf96ffd42009-05-24 15:01:16 -040038HB_BEGIN_DECLS
Behdad Esfahbod12c45682006-12-28 06:10:59 -050039
Behdad Esfahbodacdba3f2010-07-23 15:11:18 -040040
Khaled Hosny8e8c3e52020-12-30 23:37:49 +020041/**
42 * HB_OT_TAG_BASE:
43 *
44 * OpenType [Baseline Table](https://docs.microsoft.com/en-us/typography/opentype/spec/base).
45 */
Behdad Esfahbod551fa2d2018-02-25 16:32:17 -080046#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
Khaled Hosny8e8c3e52020-12-30 23:37:49 +020047/**
48 * HB_OT_TAG_GDEF:
49 *
50 * OpenType [Glyph Definition Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gdef).
51 */
Behdad Esfahbod0ead4812009-08-02 17:41:36 -040052#define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
Khaled Hosny8e8c3e52020-12-30 23:37:49 +020053/**
54 * HB_OT_TAG_GSUB:
55 *
56 * OpenType [Glyph Substitution Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gsub).
57 */
Behdad Esfahbod0ead4812009-08-02 17:41:36 -040058#define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
Khaled Hosny8e8c3e52020-12-30 23:37:49 +020059/**
60 * HB_OT_TAG_GPOS:
61 *
62 * OpenType [Glyph Positioning Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gpos).
63 */
Behdad Esfahbod0ead4812009-08-02 17:41:36 -040064#define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
Khaled Hosny8e8c3e52020-12-30 23:37:49 +020065/**
66 * HB_OT_TAG_JSTF:
67 *
68 * OpenType [Justification Table](https://docs.microsoft.com/en-us/typography/opentype/spec/jstf).
69 */
Behdad Esfahbod6c48f202013-09-09 15:43:10 -040070#define HB_OT_TAG_JSTF HB_TAG('J','S','T','F')
Behdad Esfahbodfd92a3d2008-01-24 03:11:09 -050071
Behdad Esfahbodcfe98822012-07-27 03:06:30 -040072
Behdad Esfahbod590d55c2008-01-24 19:13:50 -050073/*
Behdad Esfahbod46072b72018-10-27 04:21:20 -070074 * Script & Language tags.
75 */
76
Khaled Hosny3ba1e7e2020-12-31 17:11:35 +020077/**
78 * HB_OT_TAG_DEFAULT_SCRIPT:
79 *
80 * OpenType script tag, `DFLT`, for features that are not script-specific.
81 *
82 */
Behdad Esfahbod46072b72018-10-27 04:21:20 -070083#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
Khaled Hosny3ba1e7e2020-12-31 17:11:35 +020084/**
85 * HB_OT_TAG_DEFAULT_LANGUAGE:
86 *
87 * OpenType language tag, `dflt`. Not a valid language tag, but some fonts
88 * mistakenly use it.
89 */
Behdad Esfahbod46072b72018-10-27 04:21:20 -070090#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
91
92/**
93 * HB_OT_MAX_TAGS_PER_SCRIPT:
94 *
Khaled Hosny8e8c3e52020-12-30 23:37:49 +020095 * Maximum number of OpenType tags that can correspond to a give #hb_script_t.
96 *
Behdad Esfahbod46072b72018-10-27 04:21:20 -070097 * Since: 2.0.0
98 **/
99#define HB_OT_MAX_TAGS_PER_SCRIPT 3u
100/**
101 * HB_OT_MAX_TAGS_PER_LANGUAGE:
102 *
Khaled Hosny8e8c3e52020-12-30 23:37:49 +0200103 * Maximum number of OpenType tags that can correspond to a give #hb_language_t.
104 *
Behdad Esfahbod46072b72018-10-27 04:21:20 -0700105 * Since: 2.0.0
106 **/
107#define HB_OT_MAX_TAGS_PER_LANGUAGE 3u
108
109HB_EXTERN void
110hb_ot_tags_from_script_and_language (hb_script_t script,
111 hb_language_t language,
112 unsigned int *script_count /* IN/OUT */,
113 hb_tag_t *script_tags /* OUT */,
114 unsigned int *language_count /* IN/OUT */,
115 hb_tag_t *language_tags /* OUT */);
116
117HB_EXTERN hb_script_t
118hb_ot_tag_to_script (hb_tag_t tag);
119
120HB_EXTERN hb_language_t
121hb_ot_tag_to_language (hb_tag_t tag);
122
123HB_EXTERN void
124hb_ot_tags_to_script_and_language (hb_tag_t script_tag,
125 hb_tag_t language_tag,
126 hb_script_t *script /* OUT */,
127 hb_language_t *language /* OUT */);
128
129
130/*
Behdad Esfahbod590d55c2008-01-24 19:13:50 -0500131 * GDEF
132 */
133
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800134HB_EXTERN hb_bool_t
Behdad Esfahbodb4b42722009-11-06 17:46:33 -0500135hb_ot_layout_has_glyph_classes (hb_face_t *face);
Behdad Esfahbod590d55c2008-01-24 19:13:50 -0500136
Nathan Willis930f6fc2019-03-16 15:10:21 +0000137/**
Behdad Esfahbod81b79df2019-05-11 00:53:52 -0700138 * hb_ot_layout_glyph_class_t:
Nathan Willis34490312019-03-16 15:38:08 +0000139 * @HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED: Glyphs not matching the other classifications
140 * @HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH: Spacing, single characters, capable of accepting marks
141 * @HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE: Glyphs that represent ligation of multiple characters
142 * @HB_OT_LAYOUT_GLYPH_CLASS_MARK: Non-spacing, combining glyphs that represent marks
143 * @HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT: Spacing glyphs that represent part of a single character
Nathan Willis930f6fc2019-03-16 15:10:21 +0000144 *
Nathan Willis34490312019-03-16 15:38:08 +0000145 * The GDEF classes defined for glyphs.
Nathan Willis930f6fc2019-03-16 15:10:21 +0000146 *
147 **/
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800148typedef enum {
Behdad Esfahbod5a08ecf2012-11-16 13:34:29 -0800149 HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED = 0,
150 HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH = 1,
151 HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE = 2,
152 HB_OT_LAYOUT_GLYPH_CLASS_MARK = 3,
153 HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT = 4
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800154} hb_ot_layout_glyph_class_t;
155
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800156HB_EXTERN hb_ot_layout_glyph_class_t
Behdad Esfahbod5a08ecf2012-11-16 13:34:29 -0800157hb_ot_layout_get_glyph_class (hb_face_t *face,
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800158 hb_codepoint_t glyph);
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800159
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800160HB_EXTERN void
Behdad Esfahbod89ca8ee2012-11-16 13:53:40 -0800161hb_ot_layout_get_glyphs_in_class (hb_face_t *face,
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800162 hb_ot_layout_glyph_class_t klass,
163 hb_set_t *glyphs /* OUT */);
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800164
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400165/* Not that useful. Provides list of attach points for a glyph that a
166 * client may want to cache */
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800167HB_EXTERN unsigned int
Behdad Esfahbod0ead4812009-08-02 17:41:36 -0400168hb_ot_layout_get_attach_points (hb_face_t *face,
Behdad Esfahbod79420ad2009-05-26 12:24:16 -0400169 hb_codepoint_t glyph,
Behdad Esfahbode21899b2009-11-04 16:36:14 -0500170 unsigned int start_offset,
Behdad Esfahbod79420ad2009-05-26 12:24:16 -0400171 unsigned int *point_count /* IN/OUT */,
172 unsigned int *point_array /* OUT */);
173
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400174/* Ligature caret positions */
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800175HB_EXTERN unsigned int
Behdad Esfahbode2046742010-10-27 12:32:02 -0400176hb_ot_layout_get_ligature_carets (hb_font_t *font,
Behdad Esfahbode2046742010-10-27 12:32:02 -0400177 hb_direction_t direction,
178 hb_codepoint_t glyph,
179 unsigned int start_offset,
180 unsigned int *caret_count /* IN/OUT */,
Behdad Esfahbod60fbb362011-05-19 18:46:15 -0400181 hb_position_t *caret_array /* OUT */);
Behdad Esfahbod62964af2009-05-26 12:40:10 -0400182
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400183
Behdad Esfahbod706ab252008-01-28 05:58:50 -0500184/*
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400185 * GSUB/GPOS feature query and enumeration interface
Behdad Esfahbod706ab252008-01-28 05:58:50 -0500186 */
187
Khaled Hosny8e8c3e52020-12-30 23:37:49 +0200188/**
189 * HB_OT_LAYOUT_NO_SCRIPT_INDEX:
190 *
191 * Special value for script index indicating unsupported script.
192 */
Behdad Esfahbod76271002014-07-11 14:54:42 -0400193#define HB_OT_LAYOUT_NO_SCRIPT_INDEX 0xFFFFu
Khaled Hosny8e8c3e52020-12-30 23:37:49 +0200194/**
195 * HB_OT_LAYOUT_NO_FEATURE_INDEX:
196 *
197 * Special value for feature index indicating unsupported feature.
198 */
Behdad Esfahbod76271002014-07-11 14:54:42 -0400199#define HB_OT_LAYOUT_NO_FEATURE_INDEX 0xFFFFu
Khaled Hosny8e8c3e52020-12-30 23:37:49 +0200200/**
201 * HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX:
202 *
203 * Special value for language index indicating default or unsupported language.
204 */
Behdad Esfahbod76271002014-07-11 14:54:42 -0400205#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu
Khaled Hosny8e8c3e52020-12-30 23:37:49 +0200206/**
207 * HB_OT_LAYOUT_NO_VARIATIONS_INDEX:
208 *
209 * Special value for variations index indicating unsupported variation.
210 */
Behdad Esfahbod30c42b62016-09-10 03:32:39 -0700211#define HB_OT_LAYOUT_NO_VARIATIONS_INDEX 0xFFFFFFFFu
Behdad Esfahbod706ab252008-01-28 05:58:50 -0500212
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800213HB_EXTERN unsigned int
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400214hb_ot_layout_table_get_script_tags (hb_face_t *face,
215 hb_tag_t table_tag,
Behdad Esfahbode21899b2009-11-04 16:36:14 -0500216 unsigned int start_offset,
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400217 unsigned int *script_count /* IN/OUT */,
218 hb_tag_t *script_tags /* OUT */);
Behdad Esfahbod706ab252008-01-28 05:58:50 -0500219
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800220HB_EXTERN hb_bool_t
Behdad Esfahbod0ead4812009-08-02 17:41:36 -0400221hb_ot_layout_table_find_script (hb_face_t *face,
222 hb_tag_t table_tag,
223 hb_tag_t script_tag,
Evgeniy Reiznerb4377af2020-01-31 15:11:45 +0200224 unsigned int *script_index /* OUT */);
Behdad Esfahbod706ab252008-01-28 05:58:50 -0500225
David Corbett91067712017-12-08 11:21:14 -0500226HB_EXTERN hb_bool_t
227hb_ot_layout_table_select_script (hb_face_t *face,
228 hb_tag_t table_tag,
229 unsigned int script_count,
230 const hb_tag_t *script_tags,
231 unsigned int *script_index /* OUT */,
232 hb_tag_t *chosen_script /* OUT */);
233
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800234HB_EXTERN unsigned int
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400235hb_ot_layout_table_get_feature_tags (hb_face_t *face,
236 hb_tag_t table_tag,
Behdad Esfahbode21899b2009-11-04 16:36:14 -0500237 unsigned int start_offset,
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400238 unsigned int *feature_count /* IN/OUT */,
239 hb_tag_t *feature_tags /* OUT */);
Behdad Esfahbod706ab252008-01-28 05:58:50 -0500240
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800241HB_EXTERN unsigned int
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400242hb_ot_layout_script_get_language_tags (hb_face_t *face,
243 hb_tag_t table_tag,
244 unsigned int script_index,
Behdad Esfahbode21899b2009-11-04 16:36:14 -0500245 unsigned int start_offset,
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400246 unsigned int *language_count /* IN/OUT */,
247 hb_tag_t *language_tags /* OUT */);
Behdad Esfahbod4a26ea42008-01-28 07:40:10 -0500248
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800249HB_EXTERN hb_bool_t
Behdad Esfahbodcf975ac2018-10-11 14:07:44 -0400250hb_ot_layout_script_select_language (hb_face_t *face,
251 hb_tag_t table_tag,
252 unsigned int script_index,
253 unsigned int language_count,
254 const hb_tag_t *language_tags,
255 unsigned int *language_index /* OUT */);
David Corbett91067712017-12-08 11:21:14 -0500256
257HB_EXTERN hb_bool_t
Behdad Esfahbodedec8942023-01-20 09:28:59 -0700258hb_ot_layout_script_select_language2 (hb_face_t *face,
259 hb_tag_t table_tag,
260 unsigned int script_index,
261 unsigned int language_count,
262 const hb_tag_t *language_tags,
263 unsigned int *language_index /* OUT */,
264 hb_tag_t *chosen_language /* OUT */);
265
266HB_EXTERN hb_bool_t
Behdad Esfahbod911ca382014-06-24 10:20:36 -0600267hb_ot_layout_language_get_required_feature_index (hb_face_t *face,
268 hb_tag_t table_tag,
269 unsigned int script_index,
270 unsigned int language_index,
Evgeniy Reiznerb4377af2020-01-31 15:11:45 +0200271 unsigned int *feature_index /* OUT */);
Behdad Esfahbod911ca382014-06-24 10:20:36 -0600272
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800273HB_EXTERN hb_bool_t
Jonathan Kewda132932014-04-27 14:05:24 +0100274hb_ot_layout_language_get_required_feature (hb_face_t *face,
275 hb_tag_t table_tag,
276 unsigned int script_index,
277 unsigned int language_index,
Evgeniy Reiznerb4377af2020-01-31 15:11:45 +0200278 unsigned int *feature_index /* OUT */,
279 hb_tag_t *feature_tag /* OUT */);
Behdad Esfahbodc4473352008-02-18 21:14:23 -0500280
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800281HB_EXTERN unsigned int
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400282hb_ot_layout_language_get_feature_indexes (hb_face_t *face,
283 hb_tag_t table_tag,
284 unsigned int script_index,
285 unsigned int language_index,
Behdad Esfahbode21899b2009-11-04 16:36:14 -0500286 unsigned int start_offset,
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400287 unsigned int *feature_count /* IN/OUT */,
288 unsigned int *feature_indexes /* OUT */);
Behdad Esfahbod4a26ea42008-01-28 07:40:10 -0500289
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800290HB_EXTERN unsigned int
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400291hb_ot_layout_language_get_feature_tags (hb_face_t *face,
292 hb_tag_t table_tag,
293 unsigned int script_index,
294 unsigned int language_index,
Behdad Esfahbode21899b2009-11-04 16:36:14 -0500295 unsigned int start_offset,
Behdad Esfahbodbff3c0f2009-08-07 19:46:30 -0400296 unsigned int *feature_count /* IN/OUT */,
297 hb_tag_t *feature_tags /* OUT */);
Behdad Esfahbod4a26ea42008-01-28 07:40:10 -0500298
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800299HB_EXTERN hb_bool_t
Behdad Esfahbod0ead4812009-08-02 17:41:36 -0400300hb_ot_layout_language_find_feature (hb_face_t *face,
301 hb_tag_t table_tag,
302 unsigned int script_index,
303 unsigned int language_index,
304 hb_tag_t feature_tag,
Evgeniy Reiznerb4377af2020-01-31 15:11:45 +0200305 unsigned int *feature_index /* OUT */);
Behdad Esfahbodc4473352008-02-18 21:14:23 -0500306
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800307HB_EXTERN unsigned int
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800308hb_ot_layout_feature_get_lookups (hb_face_t *face,
309 hb_tag_t table_tag,
310 unsigned int feature_index,
311 unsigned int start_offset,
312 unsigned int *lookup_count /* IN/OUT */,
313 unsigned int *lookup_indexes /* OUT */);
314
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800315HB_EXTERN unsigned int
Behdad Esfahbod27674b42013-10-03 14:54:50 -0400316hb_ot_layout_table_get_lookup_count (hb_face_t *face,
317 hb_tag_t table_tag);
318
Garret Rieger7d92bef2018-07-30 17:17:43 -0700319HB_EXTERN void
320hb_ot_layout_collect_features (hb_face_t *face,
Ebrahim Byagowia0b4ac42019-08-24 17:57:14 +0430321 hb_tag_t table_tag,
322 const hb_tag_t *scripts,
323 const hb_tag_t *languages,
324 const hb_tag_t *features,
325 hb_set_t *feature_indexes /* OUT */);
Behdad Esfahbod27674b42013-10-03 14:54:50 -0400326
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800327HB_EXTERN void
Behdad Esfahboddc35a0f2023-07-30 16:32:11 -0600328hb_ot_layout_collect_features_map (hb_face_t *face,
329 hb_tag_t table_tag,
330 unsigned script_index,
331 unsigned language_index,
332 hb_map_t *feature_map /* OUT */);
333
334HB_EXTERN void
Behdad Esfahboda88e7162012-11-24 02:31:02 -0500335hb_ot_layout_collect_lookups (hb_face_t *face,
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800336 hb_tag_t table_tag,
337 const hb_tag_t *scripts,
338 const hb_tag_t *languages,
339 const hb_tag_t *features,
340 hb_set_t *lookup_indexes /* OUT */);
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800341
Qunxin Liu8ffc9ad2019-10-31 15:59:02 -0700342HB_EXTERN void
Behdad Esfahbode8cfdd72012-11-16 19:07:06 -0800343hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800344 hb_tag_t table_tag,
345 unsigned int lookup_index,
Ebrahim Byagowi63109432018-10-13 14:00:05 +0330346 hb_set_t *glyphs_before, /* OUT. May be NULL */
347 hb_set_t *glyphs_input, /* OUT. May be NULL */
348 hb_set_t *glyphs_after, /* OUT. May be NULL */
349 hb_set_t *glyphs_output /* OUT. May be NULL */);
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800350
Behdad Esfahbodc4473352008-02-18 21:14:23 -0500351
Behdad Esfahbod30c42b62016-09-10 03:32:39 -0700352/* Variations support */
353
354HB_EXTERN hb_bool_t
355hb_ot_layout_table_find_feature_variations (hb_face_t *face,
356 hb_tag_t table_tag,
357 const int *coords,
358 unsigned int num_coords,
359 unsigned int *variations_index /* out */);
360
Behdad Esfahbodec87ba92016-09-10 03:53:11 -0700361HB_EXTERN unsigned int
362hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face,
363 hb_tag_t table_tag,
364 unsigned int feature_index,
365 unsigned int variations_index,
366 unsigned int start_offset,
367 unsigned int *lookup_count /* IN/OUT */,
368 unsigned int *lookup_indexes /* OUT */);
369
Behdad Esfahbod706ab252008-01-28 05:58:50 -0500370
Behdad Esfahbod2d15e722009-04-15 19:50:16 -0400371/*
372 * GSUB
373 */
374
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800375HB_EXTERN hb_bool_t
Behdad Esfahbod0ead4812009-08-02 17:41:36 -0400376hb_ot_layout_has_substitution (hb_face_t *face);
Behdad Esfahbodf9cd1012009-07-28 15:43:34 -0400377
Behdad Esfahbode13aaaa2020-06-18 15:22:54 -0700378HB_EXTERN unsigned
379hb_ot_layout_lookup_get_glyph_alternates (hb_face_t *face,
380 unsigned lookup_index,
381 hb_codepoint_t glyph,
382 unsigned start_offset,
383 unsigned *alternate_count /* IN/OUT */,
384 hb_codepoint_t *alternate_glyphs /* OUT */);
385
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800386HB_EXTERN hb_bool_t
Behdad Esfahbod362a9902012-11-15 14:57:31 -0800387hb_ot_layout_lookup_would_substitute (hb_face_t *face,
Behdad Esfahbodd9b204d2012-08-23 16:22:28 -0400388 unsigned int lookup_index,
Behdad Esfahbode72b3602012-07-19 14:35:23 -0400389 const hb_codepoint_t *glyphs,
390 unsigned int glyphs_length,
Behdad Esfahbodd9b204d2012-08-23 16:22:28 -0400391 hb_bool_t zero_context);
Behdad Esfahbode72b3602012-07-19 14:35:23 -0400392
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800393HB_EXTERN void
Behdad Esfahbod362a9902012-11-15 14:57:31 -0800394hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
Ebrahim Byagowia0b4ac42019-08-24 17:57:14 +0430395 unsigned int lookup_index,
396 hb_set_t *glyphs
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800397 /*TODO , hb_bool_t inclusive */);
398
Garret Rieger57badad2018-06-06 16:02:51 -0700399HB_EXTERN void
400hb_ot_layout_lookups_substitute_closure (hb_face_t *face,
Ebrahim Byagowia0b4ac42019-08-24 17:57:14 +0430401 const hb_set_t *lookups,
402 hb_set_t *glyphs);
Garret Rieger57badad2018-06-06 16:02:51 -0700403
404
Behdad Esfahbodf9cd1012009-07-28 15:43:34 -0400405/*
406 * GPOS
407 */
408
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800409HB_EXTERN hb_bool_t
Behdad Esfahbod0ead4812009-08-02 17:41:36 -0400410hb_ot_layout_has_positioning (hb_face_t *face);
Behdad Esfahbodf9cd1012009-07-28 15:43:34 -0400411
Behdad Esfahbode9ad71d2012-11-30 08:10:26 +0200412/* Optical 'size' feature info. Returns true if found.
Ebrahim Byagowif24b0b92018-04-12 13:40:45 +0430413 * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800414HB_EXTERN hb_bool_t
Behdad Esfahboda7aba992018-10-30 14:04:09 -0700415hb_ot_layout_get_size_params (hb_face_t *face,
416 unsigned int *design_size, /* OUT. May be NULL */
417 unsigned int *subfamily_id, /* OUT. May be NULL */
418 hb_ot_name_id_t *subfamily_name_id, /* OUT. May be NULL */
419 unsigned int *range_start, /* OUT. May be NULL */
420 unsigned int *range_end /* OUT. May be NULL */);
Behdad Esfahbodf54cce32012-11-26 14:02:31 +0200421
Behdad Esfahbod5d6f1a82022-08-31 08:31:24 -0600422HB_EXTERN hb_position_t
Behdad Esfahbod71c6cba2022-09-01 13:43:19 -0600423hb_ot_layout_lookup_get_optical_bound (hb_font_t *font,
424 unsigned lookup_index,
425 hb_direction_t direction,
426 hb_codepoint_t glyph);
Behdad Esfahbod5d6f1a82022-08-31 08:31:24 -0600427
Ebrahim Byagowi63109432018-10-13 14:00:05 +0330428
Behdad Esfahbod71c6cba2022-09-01 13:43:19 -0600429/*
430 * GSUB/GPOS
431 */
432
Ebrahim Byagowidc49bd82018-10-12 03:00:59 +0330433HB_EXTERN hb_bool_t
Behdad Esfahboda7aba992018-10-30 14:04:09 -0700434hb_ot_layout_feature_get_name_ids (hb_face_t *face,
435 hb_tag_t table_tag,
436 unsigned int feature_index,
437 hb_ot_name_id_t *label_id /* OUT. May be NULL */,
438 hb_ot_name_id_t *tooltip_id /* OUT. May be NULL */,
439 hb_ot_name_id_t *sample_id /* OUT. May be NULL */,
440 unsigned int *num_named_parameters /* OUT. May be NULL */,
441 hb_ot_name_id_t *first_param_id /* OUT. May be NULL */);
Ebrahim Byagowidc49bd82018-10-12 03:00:59 +0330442
443
444HB_EXTERN unsigned int
445hb_ot_layout_feature_get_characters (hb_face_t *face,
446 hb_tag_t table_tag,
447 unsigned int feature_index,
Ebrahim Byagowidc49bd82018-10-12 03:00:59 +0330448 unsigned int start_offset,
449 unsigned int *char_count /* IN/OUT. May be NULL */,
450 hb_codepoint_t *characters /* OUT. May be NULL */);
Behdad Esfahbod2d15e722009-04-15 19:50:16 -0400451
Behdad Esfahbod71c6cba2022-09-01 13:43:19 -0600452
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430453/*
454 * BASE
455 */
456
Behdad Esfahbod3e110c62023-05-19 11:06:26 -0600457HB_EXTERN hb_bool_t
458hb_ot_layout_get_font_extents (hb_font_t *font,
Behdad Esfahbod08948132023-05-19 11:30:03 -0600459 hb_direction_t direction,
460 hb_tag_t script_tag,
461 hb_tag_t language_tag,
462 hb_font_extents_t *extents);
463
464HB_EXTERN hb_bool_t
465hb_ot_layout_get_font_extents2 (hb_font_t *font,
466 hb_direction_t direction,
467 hb_script_t script,
468 hb_language_t language,
469 hb_font_extents_t *extents);
470
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430471/**
472 * hb_ot_layout_baseline_tag_t:
Ebrahim Byagowi4d1872b2019-08-03 14:06:46 +0430473 * @HB_OT_LAYOUT_BASELINE_TAG_ROMAN: The baseline used by alphabetic scripts such as Latin, Cyrillic and Greek.
474 * In vertical writing mode, the alphabetic baseline for characters rotated 90 degrees clockwise.
475 * (This would not apply to alphabetic characters that remain upright in vertical writing mode, since these
476 * characters are not rotated.)
477 * @HB_OT_LAYOUT_BASELINE_TAG_HANGING: The hanging baseline. In horizontal direction, this is the horizontal
478 * line from which syllables seem, to hang in Tibetan and other similar scripts. In vertical writing mode,
479 * for Tibetan (or some other similar script) characters rotated 90 degrees clockwise.
480 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_BOTTOM_OR_LEFT: Ideographic character face bottom or left edge,
481 * if the direction is horizontal or vertical, respectively.
482 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_TOP_OR_RIGHT: Ideographic character face top or right edge,
483 * if the direction is horizontal or vertical, respectively.
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200484 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_CENTRAL: The center of the ideographic character face. Since: 4.0.0
Ebrahim Byagowi4d1872b2019-08-03 14:06:46 +0430485 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_BOTTOM_OR_LEFT: Ideographic em-box bottom or left edge,
486 * if the direction is horizontal or vertical, respectively.
487 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT: Ideographic em-box top or right edge baseline,
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200488 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_CENTRAL: The center of the ideographic em-box. Since: 4.0.0
Ebrahim Byagowi4d1872b2019-08-03 14:06:46 +0430489 * if the direction is horizontal or vertical, respectively.
490 * @HB_OT_LAYOUT_BASELINE_TAG_MATH: The baseline about which mathematical characters are centered.
491 * In vertical writing mode when mathematical characters rotated 90 degrees clockwise, are centered.
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430492 *
Khaled Hosny8e8c3e52020-12-30 23:37:49 +0200493 * Baseline tags from [Baseline Tags](https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags) registry.
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430494 *
Behdad Esfahbod64611432019-08-13 22:20:54 -0700495 * Since: 2.6.0
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430496 */
497typedef enum {
498 HB_OT_LAYOUT_BASELINE_TAG_ROMAN = HB_TAG ('r','o','m','n'),
499 HB_OT_LAYOUT_BASELINE_TAG_HANGING = HB_TAG ('h','a','n','g'),
500 HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_BOTTOM_OR_LEFT = HB_TAG ('i','c','f','b'),
501 HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_TOP_OR_RIGHT = HB_TAG ('i','c','f','t'),
Matthias Clasen95bb2ff2022-02-16 13:10:52 -0600502 HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_CENTRAL = HB_TAG ('I','c','f','c'),
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430503 HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_BOTTOM_OR_LEFT = HB_TAG ('i','d','e','o'),
504 HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT = HB_TAG ('i','d','t','p'),
Matthias Clasen95bb2ff2022-02-16 13:10:52 -0600505 HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_CENTRAL = HB_TAG ('I','d','c','e'),
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430506 HB_OT_LAYOUT_BASELINE_TAG_MATH = HB_TAG ('m','a','t','h'),
507
Khaled Hosnya3fe43a2020-12-30 21:58:43 +0200508 /*< private >*/
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430509 _HB_OT_LAYOUT_BASELINE_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
510} hb_ot_layout_baseline_tag_t;
511
Behdad Esfahbod98079102022-02-13 18:15:32 -0600512HB_EXTERN hb_ot_layout_baseline_tag_t
513hb_ot_layout_get_horizontal_baseline_tag_for_script (hb_script_t script);
514
Ebrahim Byagowi9f2b4952019-07-30 04:42:51 +0430515HB_EXTERN hb_bool_t
516hb_ot_layout_get_baseline (hb_font_t *font,
517 hb_ot_layout_baseline_tag_t baseline_tag,
518 hb_direction_t direction,
519 hb_tag_t script_tag,
520 hb_tag_t language_tag,
521 hb_position_t *coord /* OUT. May be NULL. */);
522
Behdad Esfahbod08948132023-05-19 11:30:03 -0600523HB_EXTERN hb_bool_t
524hb_ot_layout_get_baseline2 (hb_font_t *font,
525 hb_ot_layout_baseline_tag_t baseline_tag,
526 hb_direction_t direction,
527 hb_script_t script,
528 hb_language_t language,
529 hb_position_t *coord /* OUT. May be NULL. */);
530
Matthias Clasenf81578f2022-02-13 19:15:36 -0600531HB_EXTERN void
532hb_ot_layout_get_baseline_with_fallback (hb_font_t *font,
533 hb_ot_layout_baseline_tag_t baseline_tag,
534 hb_direction_t direction,
535 hb_tag_t script_tag,
536 hb_tag_t language_tag,
537 hb_position_t *coord /* OUT */);
538
Behdad Esfahbod08948132023-05-19 11:30:03 -0600539HB_EXTERN void
540hb_ot_layout_get_baseline_with_fallback2 (hb_font_t *font,
541 hb_ot_layout_baseline_tag_t baseline_tag,
542 hb_direction_t direction,
543 hb_script_t script,
544 hb_language_t language,
545 hb_position_t *coord /* OUT */);
546
Behdad Esfahbodf96ffd42009-05-24 15:01:16 -0400547HB_END_DECLS
Behdad Esfahbod12c45682006-12-28 06:10:59 -0500548
Behdad Esfahbodfd92a3d2008-01-24 03:11:09 -0500549#endif /* HB_OT_LAYOUT_H */