1 /*
   2  * Copyright © 1998-2004  David Turner and Werner Lemberg
   3  * Copyright © 2004,2007,2009  Red Hat, Inc.
   4  * Copyright © 2011,2012  Google, Inc.
   5  *
   6  *  This is part of HarfBuzz, a text shaping library.
   7  *
   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.
  13  *
  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
  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
  27  * Google Author(s): Behdad Esfahbod
  28  */
  29 
  30 #ifndef HB_H_IN
  31 #error "Include <hb.h> instead."
  32 #endif
  33 
  34 #ifndef HB_BUFFER_H
  35 #define HB_BUFFER_H
  36 
  37 #include "hb-common.h"
  38 #include "hb-unicode.h"
  39 #include "hb-font.h"
  40 
  41 HB_BEGIN_DECLS
  42 
  43 
  44 typedef struct hb_glyph_info_t {
  45   hb_codepoint_t codepoint;
  46   hb_mask_t      mask;
  47   uint32_t       cluster;
  48 
  49   /*< private >*/
  50   hb_var_int_t   var1;
  51   hb_var_int_t   var2;
  52 } hb_glyph_info_t;
  53 
  54 typedef struct hb_glyph_position_t {
  55   hb_position_t  x_advance;
  56   hb_position_t  y_advance;
  57   hb_position_t  x_offset;
  58   hb_position_t  y_offset;
  59 
  60   /*< private >*/
  61   hb_var_int_t   var;
  62 } hb_glyph_position_t;
  63 
  64 
  65 typedef struct hb_segment_properties_t {
  66   hb_direction_t  direction;
  67   hb_script_t     script;
  68   hb_language_t   language;
  69   /*< private >*/
  70   void           *reserved1;
  71   void           *reserved2;
  72 } hb_segment_properties_t;
  73 
  74 #define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
  75                                        HB_SCRIPT_INVALID, \
  76                                        HB_LANGUAGE_INVALID, \
  77                                        NULL, \
  78                                        NULL}
  79 
  80 hb_bool_t
  81 hb_segment_properties_equal (const hb_segment_properties_t *a,
  82                              const hb_segment_properties_t *b);
  83 
  84 unsigned int
  85 hb_segment_properties_hash (const hb_segment_properties_t *p);
  86 
  87 
  88 
  89 /*
  90  * hb_buffer_t
  91  */
  92 
  93 typedef struct hb_buffer_t hb_buffer_t;
  94 
  95 hb_buffer_t *
  96 hb_buffer_create (void);
  97 
  98 hb_buffer_t *
  99 hb_buffer_get_empty (void);
 100 
 101 hb_buffer_t *
 102 hb_buffer_reference (hb_buffer_t *buffer);
 103 
 104 void
 105 hb_buffer_destroy (hb_buffer_t *buffer);
 106 
 107 hb_bool_t
 108 hb_buffer_set_user_data (hb_buffer_t        *buffer,
 109                          hb_user_data_key_t *key,
 110                          void *              data,
 111                          hb_destroy_func_t   destroy,
 112                          hb_bool_t           replace);
 113 
 114 void *
 115 hb_buffer_get_user_data (hb_buffer_t        *buffer,
 116                          hb_user_data_key_t *key);
 117 
 118 
 119 typedef enum {
 120   HB_BUFFER_CONTENT_TYPE_INVALID = 0,
 121   HB_BUFFER_CONTENT_TYPE_UNICODE,
 122   HB_BUFFER_CONTENT_TYPE_GLYPHS
 123 } hb_buffer_content_type_t;
 124 
 125 void
 126 hb_buffer_set_content_type (hb_buffer_t              *buffer,
 127                             hb_buffer_content_type_t  content_type);
 128 
 129 hb_buffer_content_type_t
 130 hb_buffer_get_content_type (hb_buffer_t *buffer);
 131 
 132 
 133 void
 134 hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
 135                              hb_unicode_funcs_t *unicode_funcs);
 136 
 137 hb_unicode_funcs_t *
 138 hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer);
 139 
 140 void
 141 hb_buffer_set_direction (hb_buffer_t    *buffer,
 142                          hb_direction_t  direction);
 143 
 144 hb_direction_t
 145 hb_buffer_get_direction (hb_buffer_t *buffer);
 146 
 147 void
 148 hb_buffer_set_script (hb_buffer_t *buffer,
 149                       hb_script_t  script);
 150 
 151 hb_script_t
 152 hb_buffer_get_script (hb_buffer_t *buffer);
 153 
 154 void
 155 hb_buffer_set_language (hb_buffer_t   *buffer,
 156                         hb_language_t  language);
 157 
 158 
 159 hb_language_t
 160 hb_buffer_get_language (hb_buffer_t *buffer);
 161 
 162 void
 163 hb_buffer_set_segment_properties (hb_buffer_t *buffer,
 164                                   const hb_segment_properties_t *props);
 165 
 166 void
 167 hb_buffer_get_segment_properties (hb_buffer_t *buffer,
 168                                   hb_segment_properties_t *props);
 169 
 170 void
 171 hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
 172 
 173 
 174 /*
 175  * Since: 0.9.20
 176  */
 177 typedef enum { /*< flags >*/
 178   HB_BUFFER_FLAG_DEFAULT                        = 0x00000000u,
 179   HB_BUFFER_FLAG_BOT                            = 0x00000001u, /* Beginning-of-text */
 180   HB_BUFFER_FLAG_EOT                            = 0x00000002u, /* End-of-text */
 181   HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES    = 0x00000004u
 182 } hb_buffer_flags_t;
 183 
 184 void
 185 hb_buffer_set_flags (hb_buffer_t       *buffer,
 186                      hb_buffer_flags_t  flags);
 187 
 188 hb_buffer_flags_t
 189 hb_buffer_get_flags (hb_buffer_t *buffer);
 190 
 191 /*
 192  * Since: 0.9.42
 193  */
 194 typedef enum {
 195   HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES    = 0,
 196   HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS   = 1,
 197   HB_BUFFER_CLUSTER_LEVEL_CHARACTERS            = 2,
 198   HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
 199 } hb_buffer_cluster_level_t;
 200 
 201 void
 202 hb_buffer_set_cluster_level (hb_buffer_t               *buffer,
 203                              hb_buffer_cluster_level_t  cluster_level);
 204 
 205 hb_buffer_cluster_level_t
 206 hb_buffer_get_cluster_level (hb_buffer_t *buffer);
 207 
 208 #define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
 209 
 210 /* Sets codepoint used to replace invalid UTF-8/16/32 entries.
 211  * Default is 0xFFFDu. */
 212 void
 213 hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
 214                                      hb_codepoint_t  replacement);
 215 
 216 hb_codepoint_t
 217 hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer);
 218 
 219 
 220 /* Resets the buffer.  Afterwards it's as if it was just created,
 221  * except that it has a larger buffer allocated perhaps... */
 222 void
 223 hb_buffer_reset (hb_buffer_t *buffer);
 224 
 225 /* Like reset, but does NOT clear unicode_funcs and replacement_codepoint. */
 226 void
 227 hb_buffer_clear_contents (hb_buffer_t *buffer);
 228 
 229 /* Returns false if allocation failed */
 230 hb_bool_t
 231 hb_buffer_pre_allocate (hb_buffer_t  *buffer,
 232                         unsigned int  size);
 233 
 234 
 235 /* Returns false if allocation has failed before */
 236 hb_bool_t
 237 hb_buffer_allocation_successful (hb_buffer_t  *buffer);
 238 
 239 void
 240 hb_buffer_reverse (hb_buffer_t *buffer);
 241 
 242 void
 243 hb_buffer_reverse_range (hb_buffer_t *buffer,
 244                          unsigned int start, unsigned int end);
 245 
 246 void
 247 hb_buffer_reverse_clusters (hb_buffer_t *buffer);
 248 
 249 
 250 /* Filling the buffer in */
 251 
 252 void
 253 hb_buffer_add (hb_buffer_t    *buffer,
 254                hb_codepoint_t  codepoint,
 255                unsigned int    cluster);
 256 
 257 void
 258 hb_buffer_add_utf8 (hb_buffer_t  *buffer,
 259                     const char   *text,
 260                     int           text_length,
 261                     unsigned int  item_offset,
 262                     int           item_length);
 263 
 264 void
 265 hb_buffer_add_utf16 (hb_buffer_t    *buffer,
 266                      const uint16_t *text,
 267                      int             text_length,
 268                      unsigned int    item_offset,
 269                      int             item_length);
 270 
 271 void
 272 hb_buffer_add_utf32 (hb_buffer_t    *buffer,
 273                      const uint32_t *text,
 274                      int             text_length,
 275                      unsigned int    item_offset,
 276                      int             item_length);
 277 
 278 /* Allows only access to first 256 Unicode codepoints. */
 279 void
 280 hb_buffer_add_latin1 (hb_buffer_t   *buffer,
 281                       const uint8_t *text,
 282                       int            text_length,
 283                       unsigned int   item_offset,
 284                       int            item_length);
 285 
 286 /* Like add_utf32 but does NOT check for invalid Unicode codepoints. */
 287 void
 288 hb_buffer_add_codepoints (hb_buffer_t          *buffer,
 289                           const hb_codepoint_t *text,
 290                           int                   text_length,
 291                           unsigned int          item_offset,
 292                           int                   item_length);
 293 
 294 
 295 /* Clears any new items added at the end */
 296 hb_bool_t
 297 hb_buffer_set_length (hb_buffer_t  *buffer,
 298                       unsigned int  length);
 299 
 300 /* Return value valid as long as buffer not modified */
 301 unsigned int
 302 hb_buffer_get_length (hb_buffer_t *buffer);
 303 
 304 /* Getting glyphs out of the buffer */
 305 
 306 /* Return value valid as long as buffer not modified */
 307 hb_glyph_info_t *
 308 hb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
 309                            unsigned int *length);
 310 
 311 /* Return value valid as long as buffer not modified */
 312 hb_glyph_position_t *
 313 hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
 314                                unsigned int *length);
 315 
 316 
 317 /* Reorders a glyph buffer to have canonical in-cluster glyph order / position.
 318  * The resulting clusters should behave identical to pre-reordering clusters.
 319  * NOTE: This has nothing to do with Unicode normalization. */
 320 void
 321 hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
 322 
 323 
 324 /*
 325  * Serialize
 326  */
 327 
 328 /*
 329  * Since: 0.9.20
 330  */
 331 typedef enum { /*< flags >*/
 332   HB_BUFFER_SERIALIZE_FLAG_DEFAULT              = 0x00000000u,
 333   HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS          = 0x00000001u,
 334   HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS         = 0x00000002u,
 335   HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES       = 0x00000004u,
 336   HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS        = 0x00000008u
 337 } hb_buffer_serialize_flags_t;
 338 
 339 typedef enum {
 340   HB_BUFFER_SERIALIZE_FORMAT_TEXT       = HB_TAG('T','E','X','T'),
 341   HB_BUFFER_SERIALIZE_FORMAT_JSON       = HB_TAG('J','S','O','N'),
 342   HB_BUFFER_SERIALIZE_FORMAT_INVALID    = HB_TAG_NONE
 343 } hb_buffer_serialize_format_t;
 344 
 345 /* len=-1 means str is NUL-terminated. */
 346 hb_buffer_serialize_format_t
 347 hb_buffer_serialize_format_from_string (const char *str, int len);
 348 
 349 const char *
 350 hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
 351 
 352 const char **
 353 hb_buffer_serialize_list_formats (void);
 354 
 355 /* Returns number of items, starting at start, that were serialized. */
 356 unsigned int
 357 hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
 358                             unsigned int start,
 359                             unsigned int end,
 360                             char *buf,
 361                             unsigned int buf_size,
 362                             unsigned int *buf_consumed, /* May be NULL */
 363                             hb_font_t *font, /* May be NULL */
 364                             hb_buffer_serialize_format_t format,
 365                             hb_buffer_serialize_flags_t flags);
 366 
 367 hb_bool_t
 368 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
 369                               const char *buf,
 370                               int buf_len, /* -1 means nul-terminated */
 371                               const char **end_ptr, /* May be NULL */
 372                               hb_font_t *font, /* May be NULL */
 373                               hb_buffer_serialize_format_t format);
 374 
 375 
 376 HB_END_DECLS
 377 
 378 #endif /* HB_BUFFER_H */