2 * Copyright © 1998-2004 David Turner and Werner Lemberg
3 * Copyright © 2004,2007,2009 Red Hat, Inc.
4 * Copyright © 2011,2012 Google, Inc.
6 * This is part of HarfBuzz, a text shaping library.
8 * 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.
14 * 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
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.
26 * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
27 * Google Author(s): Behdad Esfahbod
30 #if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
31 #error "Include <hb.h> instead."
37 #include "hb-common.h"
38 #include "hb-unicode.h"
45 * @codepoint: either a Unicode code point (before shaping) or a glyph index
47 * @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
53 * #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.
59 * The #hb_glyph_info_t is the structure that holds information about the
60 * glyphs and their relation to input text.
62 typedef struct hb_glyph_info_t {
63 hb_codepoint_t codepoint;
76 * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
77 * beginning of the cluster this glyph is part of,
78 * then both sides need to be re-shaped, as the
79 * result might be different.
80 * On the flip side, it means that when this
81 * flag is not present, then it is safe to break
82 * the glyph-run at the beginning of this
83 * cluster, and the two sides will represent the
84 * exact same result one would get if breaking
85 * input text at the beginning of this cluster
86 * and shaping the two sides separately.
87 * This can be used to optimize paragraph
88 * layout, by avoiding re-shaping of each line
89 * after line-breaking.
90 * @HB_GLYPH_FLAG_UNSAFE_TO_CONCAT: Indicates that if input text is changed on one
91 * side of the beginning of the cluster this glyph
92 * is part of, then the shaping results for the
93 * other side might change.
94 * Note that the absence of this flag will NOT by
95 * itself mean that it IS safe to concat text.
96 * Only two pieces of text both of which clear of
97 * this flag can be concatenated safely.
98 * This can be used to optimize paragraph
99 * layout, by avoiding re-shaping of each line
100 * after line-breaking, by limiting the
101 * reshaping to a small piece around the
102 * breaking positin only, even if the breaking
103 * position carries the
104 * #HB_GLYPH_FLAG_UNSAFE_TO_BREAK or when
105 * hyphenation or other text transformation
106 * happens at line-break position, in the following
108 * 1. Iterate back from the line-break position
109 * until the first cluster start position that is
110 * NOT unsafe-to-concat, 2. shape the segment from
111 * there till the end of line, 3. check whether the
112 * resulting glyph-run also is clear of the
113 * unsafe-to-concat at its start-of-text position;
114 * if it is, just splice it into place and the line
115 * is shaped; If not, move on to a position further
116 * back that is clear of unsafe-to-concat and retry
117 * from there, and repeat.
118 * At the start of next line a similar algorithm can
119 * be implemented. That is: 1. Iterate forward from
120 * the line-break position untill the first cluster
121 * start position that is NOT unsafe-to-concat, 2.
122 * shape the segment from beginning of the line to
123 * that position, 3. check whether the resulting
124 * glyph-run also is clear of the unsafe-to-concat
125 * at its end-of-text position; if it is, just splice
126 * it into place and the beginning is shaped; If not,
127 * move on to a position further forward that is clear
128 * of unsafe-to-concat and retry up to there, and repeat.
129 * A slight complication will arise in the
130 * implementation of the algorithm above,
131 * because while our buffer API has a way to
132 * return flags for position corresponding to
133 * start-of-text, there is currently no position
134 * corresponding to end-of-text. This limitation
135 * can be alleviated by shaping more text than needed
136 * and looking for unsafe-to-concat flag within text
138 * The #HB_GLYPH_FLAG_UNSAFE_TO_BREAK flag will
139 * always imply this flag.
141 * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
143 * Flags for #hb_glyph_info_t.
147 typedef enum { /*< flags >*/
148 HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001,
149 HB_GLYPH_FLAG_UNSAFE_TO_CONCAT = 0x00000002,
151 HB_GLYPH_FLAG_DEFINED = 0x00000003 /* OR of all defined flags */
154 HB_EXTERN hb_glyph_flags_t
155 hb_glyph_info_get_glyph_flags (const hb_glyph_info_t *info);
157 #define hb_glyph_info_get_glyph_flags(info) \
158 ((hb_glyph_flags_t) ((unsigned int) (info)->mask & HB_GLYPH_FLAG_DEFINED))
162 * hb_glyph_position_t:
163 * @x_advance: how much the line advances after drawing this glyph when setting
164 * text in horizontal direction.
165 * @y_advance: how much the line advances after drawing this glyph when setting
166 * text in vertical direction.
167 * @x_offset: how much the glyph moves on the X-axis before drawing it, this
168 * should not affect how much the line advances.
169 * @y_offset: how much the glyph moves on the Y-axis before drawing it, this
170 * should not affect how much the line advances.
172 * The #hb_glyph_position_t is the structure that holds the positions of the
173 * glyph in both horizontal and vertical directions. All positions in
174 * #hb_glyph_position_t are relative to the current point.
177 typedef struct hb_glyph_position_t {
178 hb_position_t x_advance;
179 hb_position_t y_advance;
180 hb_position_t x_offset;
181 hb_position_t y_offset;
185 } hb_glyph_position_t;
188 * hb_segment_properties_t:
189 * @direction: the #hb_direction_t of the buffer, see hb_buffer_set_direction().
190 * @script: the #hb_script_t of the buffer, see hb_buffer_set_script().
191 * @language: the #hb_language_t of the buffer, see hb_buffer_set_language().
193 * The structure that holds various text properties of an #hb_buffer_t. Can be
194 * set and retrieved using hb_buffer_set_segment_properties() and
195 * hb_buffer_get_segment_properties(), respectively.
197 typedef struct hb_segment_properties_t {
198 hb_direction_t direction;
200 hb_language_t language;
204 } hb_segment_properties_t;
207 * HB_SEGMENT_PROPERTIES_DEFAULT:
209 * The default #hb_segment_properties_t of of freshly created #hb_buffer_t.
211 #define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
213 HB_LANGUAGE_INVALID, \
218 hb_segment_properties_equal (const hb_segment_properties_t *a,
219 const hb_segment_properties_t *b);
221 HB_EXTERN unsigned int
222 hb_segment_properties_hash (const hb_segment_properties_t *p);
225 hb_segment_properties_overlay (hb_segment_properties_t *p,
226 const hb_segment_properties_t *src);
232 * The main structure holding the input text and its properties before shaping,
233 * and output glyphs and their information after shaping.
236 typedef struct hb_buffer_t hb_buffer_t;
238 HB_EXTERN hb_buffer_t *
239 hb_buffer_create (void);
241 HB_EXTERN hb_buffer_t *
242 hb_buffer_create_similar (const hb_buffer_t *src);
245 hb_buffer_reset (hb_buffer_t *buffer);
248 HB_EXTERN hb_buffer_t *
249 hb_buffer_get_empty (void);
251 HB_EXTERN hb_buffer_t *
252 hb_buffer_reference (hb_buffer_t *buffer);
255 hb_buffer_destroy (hb_buffer_t *buffer);
258 hb_buffer_set_user_data (hb_buffer_t *buffer,
259 hb_user_data_key_t *key,
261 hb_destroy_func_t destroy,
265 hb_buffer_get_user_data (hb_buffer_t *buffer,
266 hb_user_data_key_t *key);
270 * hb_buffer_content_type_t:
271 * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
272 * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
273 * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
275 * The type of #hb_buffer_t contents.
278 HB_BUFFER_CONTENT_TYPE_INVALID = 0,
279 HB_BUFFER_CONTENT_TYPE_UNICODE,
280 HB_BUFFER_CONTENT_TYPE_GLYPHS
281 } hb_buffer_content_type_t;
284 hb_buffer_set_content_type (hb_buffer_t *buffer,
285 hb_buffer_content_type_t content_type);
287 HB_EXTERN hb_buffer_content_type_t
288 hb_buffer_get_content_type (hb_buffer_t *buffer);
292 hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
293 hb_unicode_funcs_t *unicode_funcs);
295 HB_EXTERN hb_unicode_funcs_t *
296 hb_buffer_get_unicode_funcs (hb_buffer_t *buffer);
299 hb_buffer_set_direction (hb_buffer_t *buffer,
300 hb_direction_t direction);
302 HB_EXTERN hb_direction_t
303 hb_buffer_get_direction (hb_buffer_t *buffer);
306 hb_buffer_set_script (hb_buffer_t *buffer,
309 HB_EXTERN hb_script_t
310 hb_buffer_get_script (hb_buffer_t *buffer);
313 hb_buffer_set_language (hb_buffer_t *buffer,
314 hb_language_t language);
317 HB_EXTERN hb_language_t
318 hb_buffer_get_language (hb_buffer_t *buffer);
321 hb_buffer_set_segment_properties (hb_buffer_t *buffer,
322 const hb_segment_properties_t *props);
325 hb_buffer_get_segment_properties (hb_buffer_t *buffer,
326 hb_segment_properties_t *props);
329 hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
334 * @HB_BUFFER_FLAG_DEFAULT: the default buffer flag.
335 * @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning
336 * of text paragraph can be applied to this buffer. Should usually
337 * be set, unless you are passing to the buffer only part
338 * of the text without the full context.
339 * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
340 * paragraph can be applied to this buffer, similar to
341 * @HB_BUFFER_FLAG_BOT.
342 * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
343 * flag indication that character with Default_Ignorable
344 * Unicode property should use the corresponding glyph
345 * from the font, instead of hiding them (done by
346 * replacing them with the space glyph and zeroing the
347 * advance width.) This flag takes precedence over
348 * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES.
349 * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES:
350 * flag indication that character with Default_Ignorable
351 * Unicode property should be removed from glyph string
352 * instead of hiding them (done by replacing them with the
353 * space glyph and zeroing the advance width.)
354 * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
355 * precedence over this flag. Since: 1.8.0
356 * @HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE:
357 * flag indicating that a dotted circle should
358 * not be inserted in the rendering of incorrect
359 * character sequences (such at <0905 093E>). Since: 2.4.0
360 * @HB_BUFFER_FLAG_VERIFY:
361 * flag indicating that the hb_shape() call and its variants
362 * should perform various verification processes on the results
363 * of the shaping operation on the buffer. If the verification
364 * fails, then either a buffer message is sent, if a message
365 * handler is installed on the buffer, or a message is written
366 * to standard error. In either case, the shaping result might
367 * be modified to show the failed output. Since: 3.4.0
369 * Flags for #hb_buffer_t.
373 typedef enum { /*< flags >*/
374 HB_BUFFER_FLAG_DEFAULT = 0x00000000u,
375 HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */
376 HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */
377 HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u,
378 HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u,
379 HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE = 0x00000010u,
380 HB_BUFFER_FLAG_VERIFY = 0x00000020u
384 hb_buffer_set_flags (hb_buffer_t *buffer,
385 hb_buffer_flags_t flags);
387 HB_EXTERN hb_buffer_flags_t
388 hb_buffer_get_flags (hb_buffer_t *buffer);
391 * hb_buffer_cluster_level_t:
392 * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES: Return cluster values grouped by graphemes into
394 * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS: Return cluster values grouped into monotone order.
395 * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
396 * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
397 * equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
399 * Data type for holding HarfBuzz's clustering behavior options. The cluster level
400 * dictates one aspect of how HarfBuzz will treat non-base characters
403 * In @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES, non-base
404 * characters are merged into the cluster of the base character that precedes them.
406 * In @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS, non-base characters are initially
407 * assigned their own cluster values, which are not merged into preceding base
408 * clusters. This allows HarfBuzz to perform additional operations like reorder
409 * sequences of adjacent marks.
411 * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES is the default, because it maintains
412 * backward compatibility with older versions of HarfBuzz. New client programs that
413 * do not need to maintain such backward compatibility are recommended to use
414 * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS instead of the default.
419 HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES = 0,
420 HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS = 1,
421 HB_BUFFER_CLUSTER_LEVEL_CHARACTERS = 2,
422 HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
423 } hb_buffer_cluster_level_t;
426 hb_buffer_set_cluster_level (hb_buffer_t *buffer,
427 hb_buffer_cluster_level_t cluster_level);
429 HB_EXTERN hb_buffer_cluster_level_t
430 hb_buffer_get_cluster_level (hb_buffer_t *buffer);
433 * HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT:
435 * The default code point for replacing invalid characters in a given encoding.
436 * Set to U+FFFD REPLACEMENT CHARACTER.
440 #define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
443 hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
444 hb_codepoint_t replacement);
446 HB_EXTERN hb_codepoint_t
447 hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer);
450 hb_buffer_set_invisible_glyph (hb_buffer_t *buffer,
451 hb_codepoint_t invisible);
453 HB_EXTERN hb_codepoint_t
454 hb_buffer_get_invisible_glyph (hb_buffer_t *buffer);
457 hb_buffer_set_not_found_glyph (hb_buffer_t *buffer,
458 hb_codepoint_t not_found);
460 HB_EXTERN hb_codepoint_t
461 hb_buffer_get_not_found_glyph (hb_buffer_t *buffer);
469 hb_buffer_clear_contents (hb_buffer_t *buffer);
472 hb_buffer_pre_allocate (hb_buffer_t *buffer,
477 hb_buffer_allocation_successful (hb_buffer_t *buffer);
480 hb_buffer_reverse (hb_buffer_t *buffer);
483 hb_buffer_reverse_range (hb_buffer_t *buffer,
484 unsigned int start, unsigned int end);
487 hb_buffer_reverse_clusters (hb_buffer_t *buffer);
490 /* Filling the buffer in */
493 hb_buffer_add (hb_buffer_t *buffer,
494 hb_codepoint_t codepoint,
495 unsigned int cluster);
498 hb_buffer_add_utf8 (hb_buffer_t *buffer,
501 unsigned int item_offset,
505 hb_buffer_add_utf16 (hb_buffer_t *buffer,
506 const uint16_t *text,
508 unsigned int item_offset,
512 hb_buffer_add_utf32 (hb_buffer_t *buffer,
513 const uint32_t *text,
515 unsigned int item_offset,
519 hb_buffer_add_latin1 (hb_buffer_t *buffer,
522 unsigned int item_offset,
526 hb_buffer_add_codepoints (hb_buffer_t *buffer,
527 const hb_codepoint_t *text,
529 unsigned int item_offset,
533 hb_buffer_append (hb_buffer_t *buffer,
534 const hb_buffer_t *source,
539 hb_buffer_set_length (hb_buffer_t *buffer,
540 unsigned int length);
542 HB_EXTERN unsigned int
543 hb_buffer_get_length (hb_buffer_t *buffer);
545 /* Getting glyphs out of the buffer */
547 HB_EXTERN hb_glyph_info_t *
548 hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
549 unsigned int *length);
551 HB_EXTERN hb_glyph_position_t *
552 hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
553 unsigned int *length);
556 hb_buffer_has_positions (hb_buffer_t *buffer);
560 hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
568 * hb_buffer_serialize_flags_t:
569 * @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions.
570 * @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster.
571 * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
572 * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
573 * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
574 * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
575 * @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
576 * glyph offsets will reflect absolute glyph positions. Since: 1.8.0
578 * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
582 typedef enum { /*< flags >*/
583 HB_BUFFER_SERIALIZE_FLAG_DEFAULT = 0x00000000u,
584 HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS = 0x00000001u,
585 HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS = 0x00000002u,
586 HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES = 0x00000004u,
587 HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u,
588 HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u,
589 HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES = 0x00000020u
590 } hb_buffer_serialize_flags_t;
593 * hb_buffer_serialize_format_t:
594 * @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format.
595 * @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format.
596 * @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format.
598 * The buffer serialization and de-serialization format used in
599 * hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().
604 HB_BUFFER_SERIALIZE_FORMAT_TEXT = HB_TAG('T','E','X','T'),
605 HB_BUFFER_SERIALIZE_FORMAT_JSON = HB_TAG('J','S','O','N'),
606 HB_BUFFER_SERIALIZE_FORMAT_INVALID = HB_TAG_NONE
607 } hb_buffer_serialize_format_t;
609 HB_EXTERN hb_buffer_serialize_format_t
610 hb_buffer_serialize_format_from_string (const char *str, int len);
612 HB_EXTERN const char *
613 hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
615 HB_EXTERN const char **
616 hb_buffer_serialize_list_formats (void);
618 HB_EXTERN unsigned int
619 hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
623 unsigned int buf_size,
624 unsigned int *buf_consumed,
626 hb_buffer_serialize_format_t format,
627 hb_buffer_serialize_flags_t flags);
629 HB_EXTERN unsigned int
630 hb_buffer_serialize_unicode (hb_buffer_t *buffer,
634 unsigned int buf_size,
635 unsigned int *buf_consumed,
636 hb_buffer_serialize_format_t format,
637 hb_buffer_serialize_flags_t flags);
639 HB_EXTERN unsigned int
640 hb_buffer_serialize (hb_buffer_t *buffer,
644 unsigned int buf_size,
645 unsigned int *buf_consumed,
647 hb_buffer_serialize_format_t format,
648 hb_buffer_serialize_flags_t flags);
651 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
654 const char **end_ptr,
656 hb_buffer_serialize_format_t format);
659 hb_buffer_deserialize_unicode (hb_buffer_t *buffer,
662 const char **end_ptr,
663 hb_buffer_serialize_format_t format);
672 * hb_buffer_diff_flags_t:
673 * @HB_BUFFER_DIFF_FLAG_EQUAL: equal buffers.
674 * @HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH: buffers with different
675 * #hb_buffer_content_type_t.
676 * @HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH: buffers with differing length.
677 * @HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT: `.notdef` glyph is present in the
679 * @HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT: dotted circle glyph is present
680 * in the reference buffer.
681 * @HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH: difference in #hb_glyph_info_t.codepoint
682 * @HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH: difference in #hb_glyph_info_t.cluster
683 * @HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH: difference in #hb_glyph_flags_t.
684 * @HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH: difference in #hb_glyph_position_t.
686 * Flags from comparing two #hb_buffer_t's.
688 * Buffer with different #hb_buffer_content_type_t cannot be meaningfully
689 * compared in any further detail.
691 * For buffers with differing length, the per-glyph comparison is not
692 * attempted, though we do still scan reference buffer for dotted circle and
695 * If the buffers have the same length, we compare them glyph-by-glyph and
696 * report which aspect(s) of the glyph info/position are different.
700 typedef enum { /*< flags >*/
701 HB_BUFFER_DIFF_FLAG_EQUAL = 0x0000,
703 /* Buffers with different content_type cannot be meaningfully compared
704 * in any further detail. */
705 HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH = 0x0001,
707 /* For buffers with differing length, the per-glyph comparison is not
708 * attempted, though we do still scan reference for dottedcircle / .notdef
710 HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH = 0x0002,
712 /* We want to know if dottedcircle / .notdef glyphs are present in the
713 * reference, as we may not care so much about other differences in this
715 HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT = 0x0004,
716 HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT = 0x0008,
718 /* If the buffers have the same length, we compare them glyph-by-glyph
719 * and report which aspect(s) of the glyph info/position are different. */
720 HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH = 0x0010,
721 HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH = 0x0020,
722 HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH = 0x0040,
723 HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH = 0x0080
725 } hb_buffer_diff_flags_t;
727 /* Compare the contents of two buffers, report types of differences. */
728 HB_EXTERN hb_buffer_diff_flags_t
729 hb_buffer_diff (hb_buffer_t *buffer,
730 hb_buffer_t *reference,
731 hb_codepoint_t dottedcircle_glyph,
732 unsigned int position_fuzz);
740 * hb_buffer_message_func_t:
741 * @buffer: An #hb_buffer_t to work upon
742 * @font: The #hb_font_t the @buffer is shaped with
743 * @message: %NULL-terminated message passed to the function
744 * @user_data: User data pointer passed by the caller
746 * A callback method for #hb_buffer_t. The method gets called with the
747 * #hb_buffer_t it was set on, the #hb_font_t the buffer is shaped with and a
748 * message describing what step of the shaping process will be performed.
749 * Returning %false from this method will skip this shaping step and move to
752 * Return value: %true to perform the shaping step, %false to skip it.
756 typedef hb_bool_t (*hb_buffer_message_func_t) (hb_buffer_t *buffer,
762 hb_buffer_set_message_func (hb_buffer_t *buffer,
763 hb_buffer_message_func_t func,
764 void *user_data, hb_destroy_func_t destroy);
769 #endif /* HB_BUFFER_H */