blob: d0aed02d5343fe8221cfb4d34c4dd5485563f615 [file] [log] [blame]
Behdad Esfahboda2a9a022008-01-15 22:46:32 +00001/*
Behdad Esfahbod2409d5f2011-04-21 17:14:28 -04002 * Copyright © 1998-2004 David Turner and Werner Lemberg
3 * Copyright © 2004,2007,2009 Red Hat, Inc.
Behdad Esfahbod05207a72012-09-25 17:44:53 -04004 * Copyright © 2011,2012 Google, Inc.
Behdad Esfahbod9f8da382006-03-31 12:28:09 +00005 *
Behdad Esfahbod8f0d7e02011-04-15 18:59:56 -04006 * This is part of HarfBuzz, a text shaping library.
Behdad Esfahbod9f8da382006-03-31 12:28:09 +00007 *
Behdad Esfahboda2a9a022008-01-15 22:46:32 +00008 * Permission is hereby granted, without written agreement and without
9 * license or royalty fees, to use, copy, modify, and distribute this
10 * software and its documentation for any purpose, provided that the
11 * above copyright notice and the following two paragraphs appear in
12 * all copies of this software.
Behdad Esfahbod9f8da382006-03-31 12:28:09 +000013 *
Behdad Esfahboda2a9a022008-01-15 22:46:32 +000014 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18 * DAMAGE.
19 *
20 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
23 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25 *
26 * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
Behdad Esfahbodc910bec2011-04-13 15:49:06 -040027 * Google Author(s): Behdad Esfahbod
Behdad Esfahbod9f8da382006-03-31 12:28:09 +000028 */
Behdad Esfahboda2a9a022008-01-15 22:46:32 +000029
Behdad Esfahbodd1c9eb42012-04-12 13:17:44 -040030#ifndef HB_H_IN
31#error "Include <hb.h> instead."
32#endif
33
Behdad Esfahbod5c0adce2009-05-20 05:42:12 -040034#ifndef HB_BUFFER_H
35#define HB_BUFFER_H
Behdad Esfahbod9f8da382006-03-31 12:28:09 +000036
Behdad Esfahbodb857b492009-05-20 05:35:14 -040037#include "hb-common.h"
Behdad Esfahbod5ebabec2009-11-03 15:15:07 -050038#include "hb-unicode.h"
Behdad Esfahbodf9edf162012-11-15 12:14:09 -080039#include "hb-font.h"
Behdad Esfahbod9f8da382006-03-31 12:28:09 +000040
Behdad Esfahbodf96ffd42009-05-24 15:01:16 -040041HB_BEGIN_DECLS
Behdad Esfahbod9f8da382006-03-31 12:28:09 +000042
Khaled Hosnyfb192c22015-12-30 15:05:50 +040043/**
44 * hb_glyph_info_t:
45 * @codepoint: either a Unicode code point (before shaping) or a glyph index
46 * (after shaping).
Khaled Hosnyfb192c22015-12-30 15:05:50 +040047 * @cluster: the index of the character in the original text that corresponds
48 * to this #hb_glyph_info_t, or whatever the client passes to
49 * hb_buffer_add(). More than one #hb_glyph_info_t can have the same
50 * @cluster value, if they resulted from the same character (e.g. one
51 * to many glyph substitution), and when more than one character gets
52 * merged in the same glyph (e.g. many to one glyph substitution) the
Behdad Esfahbod97624d92016-01-11 12:58:45 +000053 * #hb_glyph_info_t will have the smallest cluster value of them.
54 * By default some characters are merged into the same cluster
55 * (e.g. combining marks have the same cluster as their bases)
56 * even if they are separate glyphs, hb_buffer_set_cluster_level()
57 * allow selecting more fine-grained cluster handling.
Khaled Hosnyfb192c22015-12-30 15:05:50 +040058 *
Khaled Hosny9ab9f972016-01-01 20:38:21 +040059 * The #hb_glyph_info_t is the structure that holds information about the
Khaled Hosnyfb192c22015-12-30 15:05:50 +040060 * glyphs and their relation to input text.
Khaled Hosnyfb192c22015-12-30 15:05:50 +040061 */
Behdad Esfahbod55bae682018-09-24 10:43:06 -040062typedef struct hb_glyph_info_t
63{
Behdad Esfahbodf1322e52009-08-01 22:53:04 -040064 hb_codepoint_t codepoint;
Behdad Esfahbod1dd1e562018-09-30 18:25:58 +020065 /*< private >*/
Behdad Esfahbod55bae682018-09-24 10:43:06 -040066 hb_mask_t mask;
Behdad Esfahbod1dd1e562018-09-30 18:25:58 +020067 /*< public >*/
Behdad Esfahbodf1322e52009-08-01 22:53:04 -040068 uint32_t cluster;
Behdad Esfahbodb54cd072011-04-15 19:12:01 -040069
70 /*< private >*/
Behdad Esfahbod6cb8c342010-10-27 14:27:03 -040071 hb_var_int_t var1;
72 hb_var_int_t var2;
Behdad Esfahbodc968fc22009-05-25 04:04:24 -040073} hb_glyph_info_t;
Behdad Esfahbod9f8da382006-03-31 12:28:09 +000074
bungeman671f0a72018-02-01 13:31:25 -050075/**
76 * hb_glyph_flags_t:
Behdad Esfahbod3b7aa652018-02-09 15:43:20 -060077 * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
78 * beginning of the cluster this glyph is part of,
79 * then both sides need to be re-shaped, as the
80 * result might be different. On the flip side,
81 * it means that when this flag is not present,
82 * then it's safe to break the glyph-run at the
83 * beginning of this cluster, and the two sides
84 * represent the exact same result one would get
85 * if breaking input text at the beginning of
Behdad Esfahbodd45f2402018-02-09 15:51:45 -060086 * this cluster and shaping the two sides
Behdad Esfahbod3b7aa652018-02-09 15:43:20 -060087 * separately. This can be used to optimize
88 * paragraph layout, by avoiding re-shaping
89 * of each line after line-breaking, or limiting
90 * the reshaping to a small piece around the
91 * breaking point only.
bungeman671f0a72018-02-01 13:31:25 -050092 */
Behdad Esfahbod40bd7e92016-05-02 14:47:45 +020093typedef enum { /*< flags >*/
Behdad Esfahbod5287ccc2017-08-10 14:25:53 -070094 HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001,
95
Behdad Esfahbodad1c1902018-09-30 18:26:45 +020096 HB_GLYPH_FLAG_DEFINED = 0x00000001 /*< skip >*/ /* OR of all defined flags */
Behdad Esfahbod40bd7e92016-05-02 14:47:45 +020097} hb_glyph_flags_t;
98
Behdad Esfahbodb2dd0c12017-08-23 13:12:54 -070099HB_EXTERN hb_glyph_flags_t
100hb_glyph_info_get_glyph_flags (const hb_glyph_info_t *info);
101
102#define hb_glyph_info_get_glyph_flags(info) \
103 ((hb_glyph_flags_t) ((unsigned int) (info)->mask & HB_GLYPH_FLAG_DEFINED))
104
105
Khaled Hosnyfb192c22015-12-30 15:05:50 +0400106/**
107 * hb_glyph_position_t:
108 * @x_advance: how much the line advances after drawing this glyph when setting
109 * text in horizontal direction.
110 * @y_advance: how much the line advances after drawing this glyph when setting
111 * text in vertical direction.
112 * @x_offset: how much the glyph moves on the X-axis before drawing it, this
113 * should not affect how much the line advances.
114 * @y_offset: how much the glyph moves on the Y-axis before drawing it, this
115 * should not affect how much the line advances.
116 *
117 * The #hb_glyph_position_t is the structure that holds the positions of the
118 * glyph in both horizontal and vertical directions. All positions in
119 * #hb_glyph_position_t are relative to the current point.
120 *
121 */
Behdad Esfahbod1bc1cb32012-06-16 15:21:55 -0400122typedef struct hb_glyph_position_t {
Behdad Esfahbodb857b492009-05-20 05:35:14 -0400123 hb_position_t x_advance;
124 hb_position_t y_advance;
Behdad Esfahbod9bef3612009-11-05 12:20:11 -0500125 hb_position_t x_offset;
126 hb_position_t y_offset;
Behdad Esfahbodb54cd072011-04-15 19:12:01 -0400127
128 /*< private >*/
Behdad Esfahbod88474c62010-10-27 14:42:15 -0400129 hb_var_int_t var;
Behdad Esfahbodc968fc22009-05-25 04:04:24 -0400130} hb_glyph_position_t;
Behdad Esfahbod9f8da382006-03-31 12:28:09 +0000131
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400132/**
133 * hb_segment_properties_t:
134 * @direction: the #hb_direction_t of the buffer, see hb_buffer_set_direction().
135 * @script: the #hb_script_t of the buffer, see hb_buffer_set_script().
136 * @language: the #hb_language_t of the buffer, see hb_buffer_set_language().
137 *
138 * The structure that holds various text properties of an #hb_buffer_t. Can be
139 * set and retrieved using hb_buffer_set_segment_properties() and
140 * hb_buffer_get_segment_properties(), respectively.
141 */
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800142typedef struct hb_segment_properties_t {
143 hb_direction_t direction;
144 hb_script_t script;
145 hb_language_t language;
146 /*< private >*/
147 void *reserved1;
148 void *reserved2;
149} hb_segment_properties_t;
150
151#define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
152 HB_SCRIPT_INVALID, \
153 HB_LANGUAGE_INVALID, \
Behdad Esfahbodfbb937b2017-10-15 12:04:16 +0200154 (void *) 0, \
155 (void *) 0}
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800156
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800157HB_EXTERN hb_bool_t
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800158hb_segment_properties_equal (const hb_segment_properties_t *a,
159 const hb_segment_properties_t *b);
160
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800161HB_EXTERN unsigned int
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800162hb_segment_properties_hash (const hb_segment_properties_t *p);
163
164
165
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400166/**
167 * hb_buffer_t:
168 *
169 * The main structure holding the input text and its properties before shaping,
170 * and output glyphs and their information after shaping.
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800171 */
172
173typedef struct hb_buffer_t hb_buffer_t;
174
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800175HB_EXTERN hb_buffer_t *
Behdad Esfahbode6c09cd2011-08-17 19:07:59 +0200176hb_buffer_create (void);
Behdad Esfahbod9f8da382006-03-31 12:28:09 +0000177
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800178HB_EXTERN hb_buffer_t *
Behdad Esfahbod80a68332011-05-11 18:14:44 -0400179hb_buffer_get_empty (void);
180
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800181HB_EXTERN hb_buffer_t *
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400182hb_buffer_reference (hb_buffer_t *buffer);
183
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800184HB_EXTERN void
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400185hb_buffer_destroy (hb_buffer_t *buffer);
186
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800187HB_EXTERN hb_bool_t
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400188hb_buffer_set_user_data (hb_buffer_t *buffer,
189 hb_user_data_key_t *key,
190 void * data,
Behdad Esfahbod33ccc772011-08-09 00:43:24 +0200191 hb_destroy_func_t destroy,
192 hb_bool_t replace);
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400193
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800194HB_EXTERN void *
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400195hb_buffer_get_user_data (hb_buffer_t *buffer,
196 hb_user_data_key_t *key);
197
Behdad Esfahbod39a97492017-08-11 15:52:06 -0700198
Khaled Hosny8ab797c2015-12-29 17:42:16 +0400199/**
200 * hb_buffer_content_type_t:
201 * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
202 * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
203 * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
204 */
Behdad Esfahbod92f9bfe2012-11-13 16:50:45 -0800205typedef enum {
206 HB_BUFFER_CONTENT_TYPE_INVALID = 0,
207 HB_BUFFER_CONTENT_TYPE_UNICODE,
208 HB_BUFFER_CONTENT_TYPE_GLYPHS
209} hb_buffer_content_type_t;
210
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800211HB_EXTERN void
Behdad Esfahbod96fdc042012-09-06 22:26:16 -0400212hb_buffer_set_content_type (hb_buffer_t *buffer,
213 hb_buffer_content_type_t content_type);
214
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800215HB_EXTERN hb_buffer_content_type_t
Behdad Esfahbod96fdc042012-09-06 22:26:16 -0400216hb_buffer_get_content_type (hb_buffer_t *buffer);
217
218
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800219HB_EXTERN void
Behdad Esfahbod5ebabec2009-11-03 15:15:07 -0500220hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
221 hb_unicode_funcs_t *unicode_funcs);
222
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800223HB_EXTERN hb_unicode_funcs_t *
Behdad Esfahbod5ebabec2009-11-03 15:15:07 -0500224hb_buffer_get_unicode_funcs (hb_buffer_t *buffer);
225
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800226HB_EXTERN void
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400227hb_buffer_set_direction (hb_buffer_t *buffer,
228 hb_direction_t direction);
229
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800230HB_EXTERN hb_direction_t
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400231hb_buffer_get_direction (hb_buffer_t *buffer);
232
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800233HB_EXTERN void
Behdad Esfahbodae070b72009-11-04 20:29:54 -0500234hb_buffer_set_script (hb_buffer_t *buffer,
235 hb_script_t script);
236
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800237HB_EXTERN hb_script_t
Behdad Esfahbodae070b72009-11-04 20:29:54 -0500238hb_buffer_get_script (hb_buffer_t *buffer);
239
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800240HB_EXTERN void
Behdad Esfahbodae070b72009-11-04 20:29:54 -0500241hb_buffer_set_language (hb_buffer_t *buffer,
242 hb_language_t language);
243
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800244
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800245HB_EXTERN hb_language_t
Behdad Esfahbodae070b72009-11-04 20:29:54 -0500246hb_buffer_get_language (hb_buffer_t *buffer);
Behdad Esfahbod9f8da382006-03-31 12:28:09 +0000247
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800248HB_EXTERN void
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800249hb_buffer_set_segment_properties (hb_buffer_t *buffer,
250 const hb_segment_properties_t *props);
251
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800252HB_EXTERN void
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800253hb_buffer_get_segment_properties (hb_buffer_t *buffer,
254 hb_segment_properties_t *props);
255
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800256HB_EXTERN void
Behdad Esfahbod3f82f8f2012-11-15 18:45:31 -0800257hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
Behdad Esfahbodf3064102012-11-15 18:39:46 -0800258
Behdad Esfahbod92f9bfe2012-11-13 16:50:45 -0800259
Khaled Hosnyfb192c22015-12-30 15:05:50 +0400260/**
261 * hb_buffer_flags_t:
262 * @HB_BUFFER_FLAG_DEFAULT: the default buffer flag.
263 * @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning
Behdad Esfahbod97624d92016-01-11 12:58:45 +0000264 * of text paragraph can be applied to this buffer. Should usually
265 * be set, unless you are passing to the buffer only part
Khaled Hosnyfb192c22015-12-30 15:05:50 +0400266 * of the text without the full context.
267 * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
Behdad Esfahbod97624d92016-01-11 12:58:45 +0000268 * paragraph can be applied to this buffer, similar to
Bruce Mitchener19a93fc2018-01-21 20:40:34 +0700269 * @HB_BUFFER_FLAG_BOT.
Khaled Hosnyfb192c22015-12-30 15:05:50 +0400270 * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
Behdad Esfahbod97624d92016-01-11 12:58:45 +0000271 * flag indication that character with Default_Ignorable
Khaled Hosnyfb192c22015-12-30 15:05:50 +0400272 * Unicode property should use the corresponding glyph
Behdad Esfahbod3b1e97f2018-01-10 03:35:20 +0100273 * from the font, instead of hiding them (done by
274 * replacing them with the space glyph and zeroing the
Bruce Mitchener19a93fc2018-01-21 20:40:34 +0700275 * advance width.) This flag takes precedence over
Behdad Esfahbod3b1e97f2018-01-10 03:35:20 +0100276 * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES.
277 * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES:
278 * flag indication that character with Default_Ignorable
279 * Unicode property should be removed from glyph string
280 * instead of hiding them (done by replacing them with the
281 * space glyph and zeroing the advance width.)
282 * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
283 * precedence over this flag. Since: 1.8.0
Khaled Hosnyfb192c22015-12-30 15:05:50 +0400284 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430285 * Since: 0.9.20
286 */
Behdad Esfahbod4dc798d2013-08-26 20:39:00 -0400287typedef enum { /*< flags >*/
Behdad Esfahbod11fb16c2013-10-17 20:57:57 +0200288 HB_BUFFER_FLAG_DEFAULT = 0x00000000u,
289 HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */
290 HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */
Behdad Esfahbod3b1e97f2018-01-10 03:35:20 +0100291 HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u,
292 HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u
Behdad Esfahbod92f9bfe2012-11-13 16:50:45 -0800293} hb_buffer_flags_t;
294
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800295HB_EXTERN void
Behdad Esfahbod0c7df222012-11-13 14:42:35 -0800296hb_buffer_set_flags (hb_buffer_t *buffer,
297 hb_buffer_flags_t flags);
298
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800299HB_EXTERN hb_buffer_flags_t
Behdad Esfahbod0c7df222012-11-13 14:42:35 -0800300hb_buffer_get_flags (hb_buffer_t *buffer);
301
Behdad Esfahbod55bae682018-09-24 10:43:06 -0400302/**
303 * hb_buffer_cluster_level_t:
304 * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES: Return cluster values grouped by graphemes into
305 * monotone order.
306 * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS: Return cluster values grouped into monotone order.
307 * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
308 * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
309 * equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
310 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430311 * Since: 0.9.42
312 */
Behdad Esfahbod376d5872015-07-22 16:51:12 +0100313typedef enum {
314 HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES = 0,
315 HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS = 1,
316 HB_BUFFER_CLUSTER_LEVEL_CHARACTERS = 2,
317 HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
318} hb_buffer_cluster_level_t;
Behdad Esfahbod5ebabec2009-11-03 15:15:07 -0500319
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800320HB_EXTERN void
Behdad Esfahbod376d5872015-07-22 16:51:12 +0100321hb_buffer_set_cluster_level (hb_buffer_t *buffer,
322 hb_buffer_cluster_level_t cluster_level);
323
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800324HB_EXTERN hb_buffer_cluster_level_t
Behdad Esfahbod376d5872015-07-22 16:51:12 +0100325hb_buffer_get_cluster_level (hb_buffer_t *buffer);
Behdad Esfahbod976c8f42014-07-16 15:34:20 -0400326
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400327/**
328 * HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT:
329 *
330 * The default code point for replacing invalid characters in a given encoding.
331 * Set to U+FFFD REPLACEMENT CHARACTER.
332 *
333 * Since: 0.9.31
334 */
Behdad Esfahbod976c8f42014-07-16 15:34:20 -0400335#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
336
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800337HB_EXTERN void
Behdad Esfahbod976c8f42014-07-16 15:34:20 -0400338hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
339 hb_codepoint_t replacement);
340
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800341HB_EXTERN hb_codepoint_t
Behdad Esfahbod976c8f42014-07-16 15:34:20 -0400342hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer);
343
Behdad Esfahbod71b65eb2018-10-07 18:41:52 +0200344HB_EXTERN void
Behdad Esfahbode42cd582018-10-07 20:46:11 -0400345hb_buffer_set_invisible_glyph (hb_buffer_t *buffer,
346 hb_codepoint_t invisible);
Behdad Esfahbod71b65eb2018-10-07 18:41:52 +0200347
348HB_EXTERN hb_codepoint_t
Behdad Esfahbode42cd582018-10-07 20:46:11 -0400349hb_buffer_get_invisible_glyph (hb_buffer_t *buffer);
Behdad Esfahbod71b65eb2018-10-07 18:41:52 +0200350
Behdad Esfahbod976c8f42014-07-16 15:34:20 -0400351
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800352HB_EXTERN void
Behdad Esfahbodc910bec2011-04-13 15:49:06 -0400353hb_buffer_reset (hb_buffer_t *buffer);
354
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800355HB_EXTERN void
Behdad Esfahbod1172dc72013-01-07 16:46:37 -0600356hb_buffer_clear_contents (hb_buffer_t *buffer);
Behdad Esfahbod82ecaff2012-11-13 13:57:52 -0800357
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800358HB_EXTERN hb_bool_t
Ryan Lortie02a534b2011-04-15 18:34:45 -0400359hb_buffer_pre_allocate (hb_buffer_t *buffer,
360 unsigned int size);
Behdad Esfahbodf9cd1012009-07-28 15:43:34 -0400361
Behdad Esfahbodaab0de52011-04-19 00:32:19 -0400362
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800363HB_EXTERN hb_bool_t
Behdad Esfahbodaab0de52011-04-19 00:32:19 -0400364hb_buffer_allocation_successful (hb_buffer_t *buffer);
365
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800366HB_EXTERN void
Behdad Esfahbodfbaf8ff2009-08-10 20:59:25 -0400367hb_buffer_reverse (hb_buffer_t *buffer);
368
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800369HB_EXTERN void
Behdad Esfahbod81bedda2015-04-30 13:04:16 -0400370hb_buffer_reverse_range (hb_buffer_t *buffer,
371 unsigned int start, unsigned int end);
372
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800373HB_EXTERN void
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500374hb_buffer_reverse_clusters (hb_buffer_t *buffer);
375
Behdad Esfahbodfbaf8ff2009-08-10 20:59:25 -0400376
377/* Filling the buffer in */
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400378
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800379HB_EXTERN void
Behdad Esfahbodf85faee2011-04-19 00:38:01 -0400380hb_buffer_add (hb_buffer_t *buffer,
381 hb_codepoint_t codepoint,
Behdad Esfahbodf85faee2011-04-19 00:38:01 -0400382 unsigned int cluster);
Behdad Esfahbod9f8da382006-03-31 12:28:09 +0000383
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800384HB_EXTERN void
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400385hb_buffer_add_utf8 (hb_buffer_t *buffer,
386 const char *text,
Behdad Esfahbod944b2ba2011-08-09 00:23:58 +0200387 int text_length,
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400388 unsigned int item_offset,
Behdad Esfahbod944b2ba2011-08-09 00:23:58 +0200389 int item_length);
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400390
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800391HB_EXTERN void
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400392hb_buffer_add_utf16 (hb_buffer_t *buffer,
393 const uint16_t *text,
Behdad Esfahbod944b2ba2011-08-09 00:23:58 +0200394 int text_length,
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400395 unsigned int item_offset,
Behdad Esfahbod944b2ba2011-08-09 00:23:58 +0200396 int item_length);
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400397
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800398HB_EXTERN void
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400399hb_buffer_add_utf32 (hb_buffer_t *buffer,
400 const uint32_t *text,
Behdad Esfahbod944b2ba2011-08-09 00:23:58 +0200401 int text_length,
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400402 unsigned int item_offset,
Behdad Esfahbod944b2ba2011-08-09 00:23:58 +0200403 int item_length);
Behdad Esfahbod1b7b97f2009-08-10 21:10:37 -0400404
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800405HB_EXTERN void
Behdad Esfahbod61820bc2015-01-26 14:25:52 -0800406hb_buffer_add_latin1 (hb_buffer_t *buffer,
407 const uint8_t *text,
408 int text_length,
409 unsigned int item_offset,
410 int item_length);
411
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800412HB_EXTERN void
Behdad Esfahbodbcba8b42014-07-16 14:59:04 -0400413hb_buffer_add_codepoints (hb_buffer_t *buffer,
414 const hb_codepoint_t *text,
415 int text_length,
416 unsigned int item_offset,
417 int item_length);
418
Behdad Esfahbod39a97492017-08-11 15:52:06 -0700419HB_EXTERN void
420hb_buffer_append (hb_buffer_t *buffer,
421 hb_buffer_t *source,
422 unsigned int start,
423 unsigned int end);
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400424
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800425HB_EXTERN hb_bool_t
Behdad Esfahbodc910bec2011-04-13 15:49:06 -0400426hb_buffer_set_length (hb_buffer_t *buffer,
427 unsigned int length);
Behdad Esfahbodfbaf8ff2009-08-10 20:59:25 -0400428
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800429HB_EXTERN unsigned int
Behdad Esfahbod3d145282009-11-06 15:13:17 -0500430hb_buffer_get_length (hb_buffer_t *buffer);
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400431
Behdad Esfahbodc910bec2011-04-13 15:49:06 -0400432/* Getting glyphs out of the buffer */
433
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800434HB_EXTERN hb_glyph_info_t *
Ryan Lortie70566be2011-04-15 18:32:36 -0400435hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
436 unsigned int *length);
Behdad Esfahbod11fbb542009-08-01 22:19:06 -0400437
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800438HB_EXTERN hb_glyph_position_t *
Ryan Lortie70566be2011-04-15 18:32:36 -0400439hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
440 unsigned int *length);
Behdad Esfahbod02a37062009-07-29 18:41:25 -0400441
442
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800443HB_EXTERN void
Behdad Esfahbod39b17832012-07-17 17:09:29 -0400444hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
445
Behdad Esfahbod39b17832012-07-17 17:09:29 -0400446
Behdad Esfahbodc54599a2012-11-15 16:14:23 -0800447/*
448 * Serialize
449 */
Behdad Esfahbod39b17832012-07-17 17:09:29 -0400450
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400451/**
452 * hb_buffer_serialize_flags_t:
453 * @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions.
454 * @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster.
455 * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
456 * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
457 * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
Behdad Esfahbod71fd6322018-01-10 02:20:14 +0100458 * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
Khaled Hosny0b22da92018-01-10 07:12:07 +0200459 * @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
460 * glyph offsets will reflect absolute glyph positions. Since: 1.8.0
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400461 *
462 * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
463 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430464 * Since: 0.9.20
465 */
Behdad Esfahbod4dc798d2013-08-26 20:39:00 -0400466typedef enum { /*< flags >*/
Behdad Esfahbod11fb16c2013-10-17 20:57:57 +0200467 HB_BUFFER_SERIALIZE_FLAG_DEFAULT = 0x00000000u,
468 HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS = 0x00000001u,
469 HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS = 0x00000002u,
Behdad Esfahbodfdd17702015-08-24 13:49:55 +0100470 HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES = 0x00000004u,
Behdad Esfahbod40bd7e92016-05-02 14:47:45 +0200471 HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u,
Behdad Esfahbod71fd6322018-01-10 02:20:14 +0100472 HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u,
473 HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES = 0x00000020u
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800474} hb_buffer_serialize_flags_t;
475
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400476/**
477 * hb_buffer_serialize_format_t:
478 * @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format.
479 * @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format.
Behdad Esfahbod97624d92016-01-11 12:58:45 +0000480 * @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format.
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400481 *
482 * The buffer serialization and de-serialization format used in
483 * hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().
484 *
485 * Since: 0.9.2
486 */
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800487typedef enum {
488 HB_BUFFER_SERIALIZE_FORMAT_TEXT = HB_TAG('T','E','X','T'),
489 HB_BUFFER_SERIALIZE_FORMAT_JSON = HB_TAG('J','S','O','N'),
490 HB_BUFFER_SERIALIZE_FORMAT_INVALID = HB_TAG_NONE
491} hb_buffer_serialize_format_t;
492
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800493HB_EXTERN hb_buffer_serialize_format_t
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800494hb_buffer_serialize_format_from_string (const char *str, int len);
495
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800496HB_EXTERN const char *
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800497hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
498
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800499HB_EXTERN const char **
Behdad Esfahbod072ae7a2012-11-15 13:14:12 -0800500hb_buffer_serialize_list_formats (void);
501
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800502HB_EXTERN unsigned int
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800503hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
504 unsigned int start,
505 unsigned int end,
506 char *buf,
507 unsigned int buf_size,
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400508 unsigned int *buf_consumed,
509 hb_font_t *font,
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800510 hb_buffer_serialize_format_t format,
511 hb_buffer_serialize_flags_t flags);
512
Chun-wei Fan835bbdc2015-11-19 18:34:12 +0800513HB_EXTERN hb_bool_t
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800514hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
515 const char *buf,
Khaled Hosny9ab9f972016-01-01 20:38:21 +0400516 int buf_len,
517 const char **end_ptr,
518 hb_font_t *font,
Behdad Esfahbodf9edf162012-11-15 12:14:09 -0800519 hb_buffer_serialize_format_t format);
520
521
Behdad Esfahbod0475ef22015-12-18 18:17:07 +0000522/*
Jonathan Kew331d66c2014-07-19 23:09:09 +0100523 * Compare buffers
524 */
525
526typedef enum { /*< flags >*/
527 HB_BUFFER_DIFF_FLAG_EQUAL = 0x0000,
528
529 /* Buffers with different content_type cannot be meaningfully compared
530 * in any further detail. */
Behdad Esfahbodd03f11f2017-09-04 20:14:13 -0700531 HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH = 0x0001,
Jonathan Kew331d66c2014-07-19 23:09:09 +0100532
533 /* For buffers with differing length, the per-glyph comparison is not
534 * attempted, though we do still scan reference for dottedcircle / .notdef
535 * glyphs. */
Behdad Esfahbodd03f11f2017-09-04 20:14:13 -0700536 HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH = 0x0002,
Jonathan Kew331d66c2014-07-19 23:09:09 +0100537
538 /* We want to know if dottedcircle / .notdef glyphs are present in the
539 * reference, as we may not care so much about other differences in this
540 * case. */
541 HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT = 0x0004,
542 HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT = 0x0008,
543
544 /* If the buffers have the same length, we compare them glyph-by-glyph
545 * and report which aspect(s) of the glyph info/position are different. */
546 HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH = 0x0010,
Behdad Esfahbod338e61a2017-08-14 12:36:38 -0700547 HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH = 0x0020,
Behdad Esfahbod3e8f4f12017-08-22 17:56:25 -0700548 HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH = 0x0040,
Jonathan Kew331d66c2014-07-19 23:09:09 +0100549 HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH = 0x0080
550
551} hb_buffer_diff_flags_t;
552
553/* Compare the contents of two buffers, report types of differences. */
fanc99948a94062017-10-07 18:57:14 +0800554HB_EXTERN hb_buffer_diff_flags_t
Jonathan Kew331d66c2014-07-19 23:09:09 +0100555hb_buffer_diff (hb_buffer_t *buffer,
556 hb_buffer_t *reference,
557 hb_codepoint_t dottedcircle_glyph,
558 unsigned int position_fuzz);
559
560
561/*
Behdad Esfahbod0475ef22015-12-18 18:17:07 +0000562 * Debugging.
563 */
564
565typedef hb_bool_t (*hb_buffer_message_func_t) (hb_buffer_t *buffer,
566 hb_font_t *font,
567 const char *message,
568 void *user_data);
569
570HB_EXTERN void
571hb_buffer_set_message_func (hb_buffer_t *buffer,
572 hb_buffer_message_func_t func,
573 void *user_data, hb_destroy_func_t destroy);
574
575
Behdad Esfahbodf96ffd42009-05-24 15:01:16 -0400576HB_END_DECLS
Behdad Esfahbod9f8da382006-03-31 12:28:09 +0000577
Behdad Esfahbod5c0adce2009-05-20 05:42:12 -0400578#endif /* HB_BUFFER_H */