17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Copyright © 1998-2004  David Turner and Werner Lemberg
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Copyright © 2004,2007,2009  Red Hat, Inc.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Copyright © 2011,2012  Google, Inc.
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *  This is part of HarfBuzz, a text shaping library.
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * Permission is hereby granted, without written agreement and without
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * software and its documentation for any purpose, provided that the
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * above copyright notice and the following two paragraphs appear in
12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch * all copies of this software.
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) *
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * DAMAGE.
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * Google Author(s): Behdad Esfahbod
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) */
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#ifndef HB_H_IN
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#error "Include <hb.h> instead."
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#ifndef HB_BUFFER_H
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#define HB_BUFFER_H
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "hb-common.h"
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "hb-unicode.h"
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "hb-font.h"
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)HB_BEGIN_DECLS
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)typedef struct hb_glyph_info_t {
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_codepoint_t codepoint;
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_mask_t      mask;
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  uint32_t       cluster;
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  /*< private >*/
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_var_int_t   var1;
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_var_int_t   var2;
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} hb_glyph_info_t;
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)typedef struct hb_glyph_position_t {
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_position_t  x_advance;
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_position_t  y_advance;
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_position_t  x_offset;
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_position_t  y_offset;
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  /*< private >*/
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  hb_var_int_t   var;
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} hb_glyph_position_t;
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)typedef struct hb_segment_properties_t {
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  hb_direction_t  direction;
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  hb_script_t     script;
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  hb_language_t   language;
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /*< private >*/
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void           *reserved1;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void           *reserved2;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} hb_segment_properties_t;
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)				       HB_SCRIPT_INVALID, \
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)				       HB_LANGUAGE_INVALID, \
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)				       NULL, \
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)				       NULL}
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_bool_t
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_segment_properties_equal (const hb_segment_properties_t *a,
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch			     const hb_segment_properties_t *b);
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochunsigned int
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_segment_properties_hash (const hb_segment_properties_t *p);
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * hb_buffer_t
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef struct hb_buffer_t hb_buffer_t;
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_t *
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_create (void);
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_t *
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)hb_buffer_get_empty (void);
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_t *
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_reference (hb_buffer_t *buffer);
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochhb_buffer_destroy (hb_buffer_t *buffer);
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_bool_t
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_set_user_data (hb_buffer_t        *buffer,
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)			 hb_user_data_key_t *key,
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)			 void *              data,
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)			 hb_destroy_func_t   destroy,
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)			 hb_bool_t           replace);
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void *
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_get_user_data (hb_buffer_t        *buffer,
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)			 hb_user_data_key_t *key);
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef enum {
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  HB_BUFFER_CONTENT_TYPE_INVALID = 0,
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  HB_BUFFER_CONTENT_TYPE_UNICODE,
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  HB_BUFFER_CONTENT_TYPE_GLYPHS
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} hb_buffer_content_type_t;
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_set_content_type (hb_buffer_t              *buffer,
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)			    hb_buffer_content_type_t  content_type);
1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_content_type_t
1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_get_content_type (hb_buffer_t *buffer);
1316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void
1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)			     hb_unicode_funcs_t *unicode_funcs);
1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_unicode_funcs_t *
1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer);
1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void
1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_set_direction (hb_buffer_t    *buffer,
1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)			 hb_direction_t  direction);
1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_direction_t
1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_get_direction (hb_buffer_t *buffer);
1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void
1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)hb_buffer_set_script (hb_buffer_t *buffer,
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)		      hb_script_t  script);
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_script_t
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_buffer_get_script (hb_buffer_t *buffer);
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_buffer_set_language (hb_buffer_t   *buffer,
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)			hb_language_t  language);
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_language_t
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_buffer_get_language (hb_buffer_t *buffer);
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_buffer_set_segment_properties (hb_buffer_t *buffer,
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)				  const hb_segment_properties_t *props);
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_buffer_get_segment_properties (hb_buffer_t *buffer,
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)				  hb_segment_properties_t *props);
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef enum { /*< flags >*/
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HB_BUFFER_FLAG_DEFAULT			= 0x00000000u,
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HB_BUFFER_FLAG_BOT				= 0x00000001u, /* Beginning-of-text */
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HB_BUFFER_FLAG_EOT				= 0x00000002u, /* End-of-text */
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES	= 0x00000004u
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} hb_buffer_flags_t;
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)hb_buffer_set_flags (hb_buffer_t       *buffer,
1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)		     hb_buffer_flags_t  flags);
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_flags_t
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_get_flags (hb_buffer_t *buffer);
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/* Sets codepoint used to replace invalid UTF-8/16/32 entries.
1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * Default is 0xFFFDu. */
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)				     hb_codepoint_t  replacement);
1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)hb_codepoint_t
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer);
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/* Resets the buffer.  Afterwards it's as if it was just created,
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * except that it has a larger buffer allocated perhaps... */
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_reset (hb_buffer_t *buffer);
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/* Like reset, but does NOT clear unicode_funcs and replacement_codepoint. */
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_clear_contents (hb_buffer_t *buffer);
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* Returns false if allocation failed */
212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_bool_t
213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_buffer_pre_allocate (hb_buffer_t  *buffer,
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)		        unsigned int  size);
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/* Returns false if allocation has failed before */
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_bool_t
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_allocation_successful (hb_buffer_t  *buffer);
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)hb_buffer_reverse (hb_buffer_t *buffer);
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)hb_buffer_reverse_clusters (hb_buffer_t *buffer);
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/* Filling the buffer in */
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_add (hb_buffer_t    *buffer,
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	       hb_codepoint_t  codepoint,
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	       unsigned int    cluster);
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_add_utf8 (hb_buffer_t  *buffer,
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch		    const char   *text,
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch		    int           text_length,
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch		    unsigned int  item_offset,
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch		    int           item_length);
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_buffer_add_utf16 (hb_buffer_t    *buffer,
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)		     const uint16_t *text,
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)		     int             text_length,
24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)		     unsigned int    item_offset,
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)		     int             item_length);
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)hb_buffer_add_utf32 (hb_buffer_t    *buffer,
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)		     const uint32_t *text,
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch		     int             text_length,
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch		     unsigned int    item_offset,
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)		     int             item_length);
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/* Like add_utf32 but does NOT check for invalid Unicode codepoints. */
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_add_codepoints (hb_buffer_t          *buffer,
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch			  const hb_codepoint_t *text,
260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch			  int                   text_length,
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch			  unsigned int          item_offset,
262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch			  int                   item_length);
263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* Clears any new items added at the end */
266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_bool_t
267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_buffer_set_length (hb_buffer_t  *buffer,
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		      unsigned int  length);
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* Return value valid as long as buffer not modified */
271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochunsigned int
272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_buffer_get_length (hb_buffer_t *buffer);
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
274ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* Getting glyphs out of the buffer */
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/* Return value valid as long as buffer not modified */
277ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochhb_glyph_info_t *
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           unsigned int *length);
280bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* Return value valid as long as buffer not modified */
282bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochhb_glyph_position_t *
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               unsigned int *length);
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/* Reorders a glyph buffer to have canonical in-cluster glyph order / position.
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * The resulting clusters should behave identical to pre-reordering clusters.
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * NOTE: This has nothing to do with Unicode normalization. */
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)/*
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Serialize
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtypedef enum { /*< flags >*/
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  HB_BUFFER_SERIALIZE_FLAG_DEFAULT		= 0x00000000u,
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS		= 0x00000001u,
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS		= 0x00000002u,
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES	= 0x00000004u
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} hb_buffer_serialize_flags_t;
304
305typedef enum {
306  HB_BUFFER_SERIALIZE_FORMAT_TEXT	= HB_TAG('T','E','X','T'),
307  HB_BUFFER_SERIALIZE_FORMAT_JSON	= HB_TAG('J','S','O','N'),
308  HB_BUFFER_SERIALIZE_FORMAT_INVALID	= HB_TAG_NONE
309} hb_buffer_serialize_format_t;
310
311/* len=-1 means str is NUL-terminated. */
312hb_buffer_serialize_format_t
313hb_buffer_serialize_format_from_string (const char *str, int len);
314
315const char *
316hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
317
318const char **
319hb_buffer_serialize_list_formats (void);
320
321/* Returns number of items, starting at start, that were serialized. */
322unsigned int
323hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
324			    unsigned int start,
325			    unsigned int end,
326			    char *buf,
327			    unsigned int buf_size,
328			    unsigned int *buf_consumed, /* May be NULL */
329			    hb_font_t *font, /* May be NULL */
330			    hb_buffer_serialize_format_t format,
331			    hb_buffer_serialize_flags_t flags);
332
333hb_bool_t
334hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
335			      const char *buf,
336			      int buf_len, /* -1 means nul-terminated */
337			      const char **end_ptr, /* May be NULL */
338			      hb_font_t *font, /* May be NULL */
339			      hb_buffer_serialize_format_t format);
340
341
342HB_END_DECLS
343
344#endif /* HB_BUFFER_H */
345