Coverage Report

Created: 2023-12-13 20:00

/src/harfbuzz/src/hb-ot-layout.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright © 2007,2008,2009  Red Hat, Inc.
3
 *
4
 *  This is part of HarfBuzz, a text shaping library.
5
 *
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
27
#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
28
#error "Include <hb-ot.h> instead."
29
#endif
30
31
#ifndef HB_OT_LAYOUT_H
32
#define HB_OT_LAYOUT_H
33
34
#include "hb.h"
35
36
#include "hb-ot-name.h"
37
38
HB_BEGIN_DECLS
39
40
41
/**
42
 * HB_OT_TAG_BASE:
43
 *
44
 * OpenType [Baseline Table](https://docs.microsoft.com/en-us/typography/opentype/spec/base).
45
 */
46
#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
47
/**
48
 * HB_OT_TAG_GDEF:
49
 *
50
 * OpenType [Glyph Definition Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gdef).
51
 */
52
#define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
53
/**
54
 * HB_OT_TAG_GSUB:
55
 *
56
 * OpenType [Glyph Substitution Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gsub).
57
 */
58
24.0M
#define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
59
/**
60
 * HB_OT_TAG_GPOS:
61
 *
62
 * OpenType [Glyph Positioning Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gpos).
63
 */
64
21.4M
#define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
65
/**
66
 * HB_OT_TAG_JSTF:
67
 *
68
 * OpenType [Justification Table](https://docs.microsoft.com/en-us/typography/opentype/spec/jstf).
69
 */
70
#define HB_OT_TAG_JSTF HB_TAG('J','S','T','F')
71
72
73
/*
74
 * Script & Language tags.
75
 */
76
77
/**
78
 * HB_OT_TAG_DEFAULT_SCRIPT:
79
 *
80
 * OpenType script tag, `DFLT`, for features that are not script-specific.
81
 *
82
 */
83
1.70M
#define HB_OT_TAG_DEFAULT_SCRIPT  HB_TAG ('D', 'F', 'L', 'T')
84
/**
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
 */
90
1.63M
#define HB_OT_TAG_DEFAULT_LANGUAGE  HB_TAG ('d', 'f', 'l', 't')
91
92
/**
93
 * HB_OT_MAX_TAGS_PER_SCRIPT:
94
 *
95
 * Maximum number of OpenType tags that can correspond to a give #hb_script_t.
96
 *
97
 * Since: 2.0.0
98
 **/
99
440k
#define HB_OT_MAX_TAGS_PER_SCRIPT 3u
100
/**
101
 * HB_OT_MAX_TAGS_PER_LANGUAGE:
102
 *
103
 * Maximum number of OpenType tags that can correspond to a give #hb_language_t.
104
 *
105
 * Since: 2.0.0
106
 **/
107
440k
#define HB_OT_MAX_TAGS_PER_LANGUAGE 3u
108
109
HB_EXTERN void
110
hb_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
117
HB_EXTERN hb_script_t
118
hb_ot_tag_to_script (hb_tag_t tag);
119
120
HB_EXTERN hb_language_t
121
hb_ot_tag_to_language (hb_tag_t tag);
122
123
HB_EXTERN void
124
hb_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
/*
131
 * GDEF
132
 */
133
134
HB_EXTERN hb_bool_t
135
hb_ot_layout_has_glyph_classes (hb_face_t *face);
136
137
/**
138
 * hb_ot_layout_glyph_class_t:
139
 * @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
144
 *
145
 * The GDEF classes defined for glyphs.
146
 *
147
 **/
148
typedef enum {
149
  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
154
} hb_ot_layout_glyph_class_t;
155
156
HB_EXTERN hb_ot_layout_glyph_class_t
157
hb_ot_layout_get_glyph_class (hb_face_t      *face,
158
            hb_codepoint_t  glyph);
159
160
HB_EXTERN void
161
hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
162
          hb_ot_layout_glyph_class_t  klass,
163
          hb_set_t                   *glyphs /* OUT */);
164
165
/* Not that useful.  Provides list of attach points for a glyph that a
166
 * client may want to cache */
167
HB_EXTERN unsigned int
168
hb_ot_layout_get_attach_points (hb_face_t      *face,
169
        hb_codepoint_t  glyph,
170
        unsigned int    start_offset,
171
        unsigned int   *point_count /* IN/OUT */,
172
        unsigned int   *point_array /* OUT */);
173
174
/* Ligature caret positions */
175
HB_EXTERN unsigned int
176
hb_ot_layout_get_ligature_carets (hb_font_t      *font,
177
          hb_direction_t  direction,
178
          hb_codepoint_t  glyph,
179
          unsigned int    start_offset,
180
          unsigned int   *caret_count /* IN/OUT */,
181
          hb_position_t  *caret_array /* OUT */);
182
183
184
/*
185
 * GSUB/GPOS feature query and enumeration interface
186
 */
187
188
/**
189
 * HB_OT_LAYOUT_NO_SCRIPT_INDEX:
190
 *
191
 * Special value for script index indicating unsupported script.
192
 */
193
1.40M
#define HB_OT_LAYOUT_NO_SCRIPT_INDEX    0xFFFFu
194
/**
195
 * HB_OT_LAYOUT_NO_FEATURE_INDEX:
196
 *
197
 * Special value for feature index indicating unsupported feature.
198
 */
199
29.0M
#define HB_OT_LAYOUT_NO_FEATURE_INDEX   0xFFFFu
200
/**
201
 * HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX:
202
 *
203
 * Special value for language index indicating default or unsupported language.
204
 */
205
1.17M
#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu
206
/**
207
 * HB_OT_LAYOUT_NO_VARIATIONS_INDEX:
208
 *
209
 * Special value for variations index indicating unsupported variation.
210
 */
211
0
#define HB_OT_LAYOUT_NO_VARIATIONS_INDEX  0xFFFFFFFFu
212
213
HB_EXTERN unsigned int
214
hb_ot_layout_table_get_script_tags (hb_face_t    *face,
215
            hb_tag_t      table_tag,
216
            unsigned int  start_offset,
217
            unsigned int *script_count /* IN/OUT */,
218
            hb_tag_t     *script_tags /* OUT */);
219
220
HB_EXTERN hb_bool_t
221
hb_ot_layout_table_find_script (hb_face_t    *face,
222
        hb_tag_t      table_tag,
223
        hb_tag_t      script_tag,
224
        unsigned int *script_index /* OUT */);
225
226
HB_EXTERN hb_bool_t
227
hb_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
234
HB_EXTERN unsigned int
235
hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
236
             hb_tag_t      table_tag,
237
             unsigned int  start_offset,
238
             unsigned int *feature_count /* IN/OUT */,
239
             hb_tag_t     *feature_tags /* OUT */);
240
241
HB_EXTERN unsigned int
242
hb_ot_layout_script_get_language_tags (hb_face_t    *face,
243
               hb_tag_t      table_tag,
244
               unsigned int  script_index,
245
               unsigned int  start_offset,
246
               unsigned int *language_count /* IN/OUT */,
247
               hb_tag_t     *language_tags /* OUT */);
248
249
HB_EXTERN hb_bool_t
250
hb_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 */);
256
257
HB_EXTERN hb_bool_t
258
hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
259
              hb_tag_t      table_tag,
260
              unsigned int  script_index,
261
              unsigned int  language_index,
262
              unsigned int *feature_index /* OUT */);
263
264
HB_EXTERN hb_bool_t
265
hb_ot_layout_language_get_required_feature (hb_face_t    *face,
266
              hb_tag_t      table_tag,
267
              unsigned int  script_index,
268
              unsigned int  language_index,
269
              unsigned int *feature_index /* OUT */,
270
              hb_tag_t     *feature_tag /* OUT */);
271
272
HB_EXTERN unsigned int
273
hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
274
             hb_tag_t      table_tag,
275
             unsigned int  script_index,
276
             unsigned int  language_index,
277
             unsigned int  start_offset,
278
             unsigned int *feature_count /* IN/OUT */,
279
             unsigned int *feature_indexes /* OUT */);
280
281
HB_EXTERN unsigned int
282
hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
283
          hb_tag_t      table_tag,
284
          unsigned int  script_index,
285
          unsigned int  language_index,
286
          unsigned int  start_offset,
287
          unsigned int *feature_count /* IN/OUT */,
288
          hb_tag_t     *feature_tags /* OUT */);
289
290
HB_EXTERN hb_bool_t
291
hb_ot_layout_language_find_feature (hb_face_t    *face,
292
            hb_tag_t      table_tag,
293
            unsigned int  script_index,
294
            unsigned int  language_index,
295
            hb_tag_t      feature_tag,
296
            unsigned int *feature_index /* OUT */);
297
298
HB_EXTERN unsigned int
299
hb_ot_layout_feature_get_lookups (hb_face_t    *face,
300
          hb_tag_t      table_tag,
301
          unsigned int  feature_index,
302
          unsigned int  start_offset,
303
          unsigned int *lookup_count /* IN/OUT */,
304
          unsigned int *lookup_indexes /* OUT */);
305
306
HB_EXTERN unsigned int
307
hb_ot_layout_table_get_lookup_count (hb_face_t    *face,
308
             hb_tag_t      table_tag);
309
310
HB_EXTERN void
311
hb_ot_layout_collect_features (hb_face_t      *face,
312
             hb_tag_t        table_tag,
313
             const hb_tag_t *scripts,
314
             const hb_tag_t *languages,
315
             const hb_tag_t *features,
316
             hb_set_t       *feature_indexes /* OUT */);
317
318
HB_EXTERN void
319
hb_ot_layout_collect_lookups (hb_face_t      *face,
320
            hb_tag_t        table_tag,
321
            const hb_tag_t *scripts,
322
            const hb_tag_t *languages,
323
            const hb_tag_t *features,
324
            hb_set_t       *lookup_indexes /* OUT */);
325
326
HB_EXTERN void
327
hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
328
            hb_tag_t      table_tag,
329
            unsigned int  lookup_index,
330
            hb_set_t     *glyphs_before, /* OUT.  May be NULL */
331
            hb_set_t     *glyphs_input,  /* OUT.  May be NULL */
332
            hb_set_t     *glyphs_after,  /* OUT.  May be NULL */
333
            hb_set_t     *glyphs_output  /* OUT.  May be NULL */);
334
335
336
/* Variations support */
337
338
HB_EXTERN hb_bool_t
339
hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
340
              hb_tag_t      table_tag,
341
              const int    *coords,
342
              unsigned int  num_coords,
343
              unsigned int *variations_index /* out */);
344
345
HB_EXTERN unsigned int
346
hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
347
              hb_tag_t      table_tag,
348
              unsigned int  feature_index,
349
              unsigned int  variations_index,
350
              unsigned int  start_offset,
351
              unsigned int *lookup_count /* IN/OUT */,
352
              unsigned int *lookup_indexes /* OUT */);
353
354
355
/*
356
 * GSUB
357
 */
358
359
HB_EXTERN hb_bool_t
360
hb_ot_layout_has_substitution (hb_face_t *face);
361
362
HB_EXTERN unsigned
363
hb_ot_layout_lookup_get_glyph_alternates (hb_face_t      *face,
364
            unsigned        lookup_index,
365
            hb_codepoint_t  glyph,
366
            unsigned        start_offset,
367
            unsigned       *alternate_count /* IN/OUT */,
368
            hb_codepoint_t *alternate_glyphs /* OUT */);
369
370
HB_EXTERN hb_bool_t
371
hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
372
              unsigned int          lookup_index,
373
              const hb_codepoint_t *glyphs,
374
              unsigned int          glyphs_length,
375
              hb_bool_t             zero_context);
376
377
HB_EXTERN void
378
hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
379
          unsigned int  lookup_index,
380
          hb_set_t     *glyphs
381
          /*TODO , hb_bool_t  inclusive */);
382
383
HB_EXTERN void
384
hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
385
           const hb_set_t *lookups,
386
           hb_set_t       *glyphs);
387
388
389
/*
390
 * GPOS
391
 */
392
393
HB_EXTERN hb_bool_t
394
hb_ot_layout_has_positioning (hb_face_t *face);
395
396
/* Optical 'size' feature info.  Returns true if found.
397
 * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
398
HB_EXTERN hb_bool_t
399
hb_ot_layout_get_size_params (hb_face_t       *face,
400
            unsigned int    *design_size,       /* OUT.  May be NULL */
401
            unsigned int    *subfamily_id,      /* OUT.  May be NULL */
402
            hb_ot_name_id_t *subfamily_name_id, /* OUT.  May be NULL */
403
            unsigned int    *range_start,       /* OUT.  May be NULL */
404
            unsigned int    *range_end          /* OUT.  May be NULL */);
405
406
407
HB_EXTERN hb_bool_t
408
hb_ot_layout_feature_get_name_ids (hb_face_t       *face,
409
           hb_tag_t         table_tag,
410
           unsigned int     feature_index,
411
           hb_ot_name_id_t *label_id             /* OUT.  May be NULL */,
412
           hb_ot_name_id_t *tooltip_id           /* OUT.  May be NULL */,
413
           hb_ot_name_id_t *sample_id            /* OUT.  May be NULL */,
414
           unsigned int    *num_named_parameters /* OUT.  May be NULL */,
415
           hb_ot_name_id_t *first_param_id       /* OUT.  May be NULL */);
416
417
418
HB_EXTERN unsigned int
419
hb_ot_layout_feature_get_characters (hb_face_t      *face,
420
             hb_tag_t        table_tag,
421
             unsigned int    feature_index,
422
             unsigned int    start_offset,
423
             unsigned int   *char_count    /* IN/OUT.  May be NULL */,
424
             hb_codepoint_t *characters    /* OUT.     May be NULL */);
425
426
/*
427
 * BASE
428
 */
429
430
/**
431
 * hb_ot_layout_baseline_tag_t:
432
 * @HB_OT_LAYOUT_BASELINE_TAG_ROMAN: The baseline used by alphabetic scripts such as Latin, Cyrillic and Greek.
433
 * In vertical writing mode, the alphabetic baseline for characters rotated 90 degrees clockwise.
434
 * (This would not apply to alphabetic characters that remain upright in vertical writing mode, since these
435
 * characters are not rotated.)
436
 * @HB_OT_LAYOUT_BASELINE_TAG_HANGING: The hanging baseline. In horizontal direction, this is the horizontal
437
 * line from which syllables seem, to hang in Tibetan and other similar scripts. In vertical writing mode,
438
 * for Tibetan (or some other similar script) characters rotated 90 degrees clockwise.
439
 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_BOTTOM_OR_LEFT: Ideographic character face bottom or left edge,
440
 * if the direction is horizontal or vertical, respectively.
441
 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_TOP_OR_RIGHT: Ideographic character face top or right edge,
442
 * if the direction is horizontal or vertical, respectively.
443
 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_CENTRAL: The center of the ideographic character face. Since: 4.0.0
444
 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_BOTTOM_OR_LEFT: Ideographic em-box bottom or left edge,
445
 * if the direction is horizontal or vertical, respectively.
446
 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT: Ideographic em-box top or right edge baseline,
447
 * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_CENTRAL: The center of the ideographic em-box. Since: 4.0.0
448
 * if the direction is horizontal or vertical, respectively.
449
 * @HB_OT_LAYOUT_BASELINE_TAG_MATH: The baseline about which mathematical characters are centered.
450
 * In vertical writing mode when mathematical characters rotated 90 degrees clockwise, are centered.
451
 *
452
 * Baseline tags from [Baseline Tags](https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags) registry.
453
 *
454
 * Since: 2.6.0
455
 */
456
typedef enum {
457
  HB_OT_LAYOUT_BASELINE_TAG_ROMAN     = HB_TAG ('r','o','m','n'),
458
  HB_OT_LAYOUT_BASELINE_TAG_HANGING     = HB_TAG ('h','a','n','g'),
459
  HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_BOTTOM_OR_LEFT  = HB_TAG ('i','c','f','b'),
460
  HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_TOP_OR_RIGHT  = HB_TAG ('i','c','f','t'),
461
  HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_CENTRAL   = HB_TAG ('I','c','f','c'),
462
  HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_BOTTOM_OR_LEFT = HB_TAG ('i','d','e','o'),
463
  HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT = HB_TAG ('i','d','t','p'),
464
  HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_CENTRAL    = HB_TAG ('I','d','c','e'),
465
  HB_OT_LAYOUT_BASELINE_TAG_MATH      = HB_TAG ('m','a','t','h'),
466
467
  /*< private >*/
468
  _HB_OT_LAYOUT_BASELINE_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
469
} hb_ot_layout_baseline_tag_t;
470
471
HB_EXTERN hb_ot_layout_baseline_tag_t
472
hb_ot_layout_get_horizontal_baseline_tag_for_script (hb_script_t script);
473
474
HB_EXTERN hb_bool_t
475
hb_ot_layout_get_baseline (hb_font_t                   *font,
476
         hb_ot_layout_baseline_tag_t  baseline_tag,
477
         hb_direction_t               direction,
478
         hb_tag_t                     script_tag,
479
         hb_tag_t                     language_tag,
480
         hb_position_t               *coord        /* OUT.  May be NULL. */);
481
482
HB_EXTERN void
483
hb_ot_layout_get_baseline_with_fallback (hb_font_t                   *font,
484
           hb_ot_layout_baseline_tag_t  baseline_tag,
485
           hb_direction_t               direction,
486
           hb_tag_t                     script_tag,
487
           hb_tag_t                     language_tag,
488
           hb_position_t               *coord        /* OUT */);
489
490
HB_END_DECLS
491
492
#endif /* HB_OT_LAYOUT_H */