hb-unicode.cc 14.0 KB
Newer Older
B
Behdad Esfahbod 已提交
1
/*
B
Behdad Esfahbod 已提交
2
 * Copyright © 2009  Red Hat, Inc.
3 4
 * Copyright © 2011  Codethink Limited
 * Copyright © 2010,2011,2012  Google, Inc.
B
Behdad Esfahbod 已提交
5
 *
B
Behdad Esfahbod 已提交
6
 *  This is part of HarfBuzz, a text shaping library.
B
Behdad Esfahbod 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 * Red Hat Author(s): Behdad Esfahbod
27
 * Codethink Author(s): Ryan Lortie
28
 * Google Author(s): Behdad Esfahbod
B
Behdad Esfahbod 已提交
29 30
 */

31
#include "hb.hh"
B
Behdad Esfahbod 已提交
32

33
#include "hb-unicode.hh"
B
Behdad Esfahbod 已提交
34

B
Behdad Esfahbod 已提交
35

B
Behdad Esfahbod 已提交
36 37
/**
 * SECTION: hb-unicode
38
 * @title: hb-unicode
B
Behdad Esfahbod 已提交
39 40 41 42 43 44 45 46 47 48 49
 * @short_description: Unicode character property access
 * @include: hb.h
 *
 * Unicode functions are used to access Unicode character properties.
 * Client can pass its own Unicode functions to HarfBuzz, or access
 * the built-in Unicode functions that come with HarfBuzz.
 *
 * With the Unicode functions, one can query variour Unicode character
 * properties, such as General Category, Script, Combining Class, etc.
 **/

B
Behdad Esfahbod 已提交
50

B
Behdad Esfahbod 已提交
51 52 53 54
/*
 * hb_unicode_funcs_t
 */

55
static hb_unicode_combining_class_t
56 57 58
hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
				hb_codepoint_t      unicode   HB_UNUSED,
				void               *user_data HB_UNUSED)
B
Behdad Esfahbod 已提交
59
{
60
  return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED;
61 62
}

63
#ifndef HB_DISABLE_DEPRECATED
B
Behdad Esfahbod 已提交
64
static unsigned int
65 66 67
hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
				hb_codepoint_t      unicode   HB_UNUSED,
				void               *user_data HB_UNUSED)
B
Behdad Esfahbod 已提交
68 69 70
{
  return 1;
}
71
#endif
B
Behdad Esfahbod 已提交
72 73

static hb_unicode_general_category_t
74 75 76
hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
				 hb_codepoint_t      unicode   HB_UNUSED,
				 void               *user_data HB_UNUSED)
B
Behdad Esfahbod 已提交
77 78 79 80 81
{
  return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER;
}

static hb_codepoint_t
82
hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
83
			  hb_codepoint_t      unicode,
84
			  void               *user_data HB_UNUSED)
B
Behdad Esfahbod 已提交
85 86 87 88 89
{
  return unicode;
}

static hb_script_t
90 91 92
hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
		       hb_codepoint_t      unicode   HB_UNUSED,
		       void               *user_data HB_UNUSED)
B
Behdad Esfahbod 已提交
93 94 95
{
  return HB_SCRIPT_UNKNOWN;
}
96

97
static hb_bool_t
98
hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
99 100 101 102 103
			hb_codepoint_t      a         HB_UNUSED,
			hb_codepoint_t      b         HB_UNUSED,
			hb_codepoint_t     *ab        HB_UNUSED,
			void               *user_data HB_UNUSED)
{
104
  return false;
105 106 107
}

static hb_bool_t
108
hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
109 110 111 112 113
			  hb_codepoint_t      ab        HB_UNUSED,
			  hb_codepoint_t     *a         HB_UNUSED,
			  hb_codepoint_t     *b         HB_UNUSED,
			  void               *user_data HB_UNUSED)
{
114
  return false;
115 116
}

117

118
#ifndef HB_DISABLE_DEPRECATED
119 120 121 122 123 124 125 126
static unsigned int
hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs     HB_UNUSED,
					hb_codepoint_t      u          HB_UNUSED,
					hb_codepoint_t     *decomposed HB_UNUSED,
					void               *user_data  HB_UNUSED)
{
  return 0;
}
127
#endif
128

129
hb_unicode_funcs_t *
130
hb_unicode_funcs_get_default ()
131
{
132 133
#if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD)
  return hb_ucd_get_unicode_funcs ();
134
#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB)
B
Minor  
Behdad Esfahbod 已提交
135
  extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs ();
136
  return hb_glib_get_unicode_funcs ();
137
#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
B
Minor  
Behdad Esfahbod 已提交
138
  extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs ();
139
  return hb_icu_get_unicode_funcs ();
140 141
#else
#define HB_UNICODE_FUNCS_NIL 1
142
  return hb_unicode_funcs_get_empty ();
143
#endif
144 145
}

146
#if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
147
#error "Could not find any Unicode functions implementation, you have to provide your own"
148
#error "Consider building hb-ucd.cc.  If you absolutely want to build without any, check the code."
B
Behdad Esfahbod 已提交
149
#endif
150

151
/**
152
 * hb_unicode_funcs_create: (Xconstructor)
153
 * @parent: (nullable):
154
 *
155
 *
156 157 158
 *
 * Return value: (transfer full):
 *
B
Behdad Esfahbod 已提交
159
 * Since: 0.9.2
160
 **/
B
Behdad Esfahbod 已提交
161
hb_unicode_funcs_t *
162
hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
B
Behdad Esfahbod 已提交
163 164 165
{
  hb_unicode_funcs_t *ufuncs;

166
  if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ()))
167
    return hb_unicode_funcs_get_empty ();
B
Behdad Esfahbod 已提交
168

169
  if (!parent)
170
    parent = hb_unicode_funcs_get_empty ();
171

172 173
  hb_unicode_funcs_make_immutable (parent);
  ufuncs->parent = hb_unicode_funcs_reference (parent);
174

175
  ufuncs->func = parent->func;
176 177 178 179 180

  /* We can safely copy user_data from parent since we hold a reference
   * onto it and it's immutable.  We should not copy the destroy notifiers
   * though. */
  ufuncs->user_data = parent->user_data;
181

B
Behdad Esfahbod 已提交
182 183 184
  return ufuncs;
}

185

186 187
DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
{
188 189
  HB_OBJECT_HEADER_STATIC,

B
Behdad Esfahbod 已提交
190
  nullptr, /* parent */
191
  {
192
#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
193
    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
194
#undef HB_UNICODE_FUNC_IMPLEMENT
195 196
  }
};
197

198 199 200
/**
 * hb_unicode_funcs_get_empty:
 *
201
 *
202 203 204
 *
 * Return value: (transfer full):
 *
B
Behdad Esfahbod 已提交
205
 * Since: 0.9.2
206
 **/
207
hb_unicode_funcs_t *
208
hb_unicode_funcs_get_empty ()
209
{
210
  return const_cast<hb_unicode_funcs_t *> (&Null(hb_unicode_funcs_t));
211 212
}

213 214 215 216
/**
 * hb_unicode_funcs_reference: (skip)
 * @ufuncs: Unicode functions.
 *
217
 *
218 219 220
 *
 * Return value: (transfer full):
 *
B
Behdad Esfahbod 已提交
221
 * Since: 0.9.2
222
 **/
B
Behdad Esfahbod 已提交
223 224 225
hb_unicode_funcs_t *
hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
{
226
  return hb_object_reference (ufuncs);
B
Behdad Esfahbod 已提交
227 228
}

229 230 231 232
/**
 * hb_unicode_funcs_destroy: (skip)
 * @ufuncs: Unicode functions.
 *
233
 *
234
 *
B
Behdad Esfahbod 已提交
235
 * Since: 0.9.2
236
 **/
B
Behdad Esfahbod 已提交
237 238 239
void
hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
{
240
  if (!hb_object_destroy (ufuncs)) return;
B
Behdad Esfahbod 已提交
241

B
Behdad Esfahbod 已提交
242
#define HB_UNICODE_FUNC_IMPLEMENT(name) \
B
Behdad Esfahbod 已提交
243 244 245
  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_UNICODE_FUNC_IMPLEMENT
246

247
  hb_unicode_funcs_destroy (ufuncs->parent);
248

B
Behdad Esfahbod 已提交
249 250 251
  free (ufuncs);
}

252 253 254
/**
 * hb_unicode_funcs_set_user_data: (skip)
 * @ufuncs: Unicode functions.
255 256 257 258 259
 * @key:
 * @data:
 * @destroy:
 * @replace:
 *
260 261
 *
 *
262
 * Return value:
263
 *
B
Behdad Esfahbod 已提交
264
 * Since: 0.9.2
265
 **/
266 267 268 269
hb_bool_t
hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
			        hb_user_data_key_t *key,
			        void *              data,
270 271
			        hb_destroy_func_t   destroy,
				hb_bool_t           replace)
272
{
273
  return hb_object_set_user_data (ufuncs, key, data, destroy, replace);
274 275
}

276 277 278
/**
 * hb_unicode_funcs_get_user_data: (skip)
 * @ufuncs: Unicode functions.
279 280
 * @key:
 *
281 282 283 284
 *
 *
 * Return value: (transfer none):
 *
B
Behdad Esfahbod 已提交
285
 * Since: 0.9.2
286
 **/
287 288 289 290 291 292 293 294
void *
hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
			        hb_user_data_key_t *key)
{
  return hb_object_get_user_data (ufuncs, key);
}


295 296 297 298
/**
 * hb_unicode_funcs_make_immutable:
 * @ufuncs: Unicode functions.
 *
299
 *
300
 *
B
Behdad Esfahbod 已提交
301
 * Since: 0.9.2
302
 **/
303 304 305
void
hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
{
306
  if (hb_object_is_immutable (ufuncs))
307
    return;
308

309
  hb_object_make_immutable (ufuncs);
310 311
}

312 313 314 315 316
/**
 * hb_unicode_funcs_is_immutable:
 * @ufuncs: Unicode functions.
 *
 *
317 318
 *
 * Return value:
319
 *
B
Behdad Esfahbod 已提交
320
 * Since: 0.9.2
321
 **/
B
Behdad Esfahbod 已提交
322 323 324
hb_bool_t
hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
{
325
  return hb_object_is_immutable (ufuncs);
B
Behdad Esfahbod 已提交
326 327
}

328 329 330 331 332
/**
 * hb_unicode_funcs_get_parent:
 * @ufuncs: Unicode functions.
 *
 *
333 334
 *
 * Return value:
335
 *
B
Behdad Esfahbod 已提交
336
 * Since: 0.9.2
337
 **/
338 339 340
hb_unicode_funcs_t *
hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs)
{
341
  return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty ();
342 343
}

B
Behdad Esfahbod 已提交
344

B
Behdad Esfahbod 已提交
345
#define HB_UNICODE_FUNC_IMPLEMENT(name)						\
B
Behdad Esfahbod 已提交
346 347 348
										\
void										\
hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t		   *ufuncs,	\
349
				    hb_unicode_##name##_func_t	    func,	\
B
Behdad Esfahbod 已提交
350 351 352
				    void			   *user_data,	\
				    hb_destroy_func_t		    destroy)	\
{										\
353
  if (hb_object_is_immutable (ufuncs))						\
B
Behdad Esfahbod 已提交
354 355 356 357 358 359
    return;									\
										\
  if (ufuncs->destroy.name)							\
    ufuncs->destroy.name (ufuncs->user_data.name);				\
										\
  if (func) {									\
360
    ufuncs->func.name = func;							\
B
Behdad Esfahbod 已提交
361 362 363
    ufuncs->user_data.name = user_data;						\
    ufuncs->destroy.name = destroy;						\
  } else {									\
364
    ufuncs->func.name = ufuncs->parent->func.name;				\
B
Behdad Esfahbod 已提交
365
    ufuncs->user_data.name = ufuncs->parent->user_data.name;			\
B
Behdad Esfahbod 已提交
366
    ufuncs->destroy.name = nullptr;						\
B
Behdad Esfahbod 已提交
367
  }										\
B
Behdad Esfahbod 已提交
368 369
}

B
Behdad Esfahbod 已提交
370
HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
B
Behdad Esfahbod 已提交
371 372 373 374
#undef HB_UNICODE_FUNC_IMPLEMENT


#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name)				\
B
Behdad Esfahbod 已提交
375 376
										\
return_type									\
377 378
hb_unicode_##name (hb_unicode_funcs_t *ufuncs,					\
		   hb_codepoint_t      unicode)					\
B
Behdad Esfahbod 已提交
379
{										\
B
Behdad Esfahbod 已提交
380
  return ufuncs->name (unicode);						\
B
Behdad Esfahbod 已提交
381
}
B
Behdad Esfahbod 已提交
382
HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
B
Behdad Esfahbod 已提交
383
#undef HB_UNICODE_FUNC_IMPLEMENT
B
Behdad Esfahbod 已提交
384

385 386 387
/**
 * hb_unicode_compose:
 * @ufuncs: Unicode functions.
388 389
 * @a:
 * @b:
390 391 392
 * @ab: (out):
 *
 *
393 394
 *
 * Return value:
395
 *
S
Sascha Brawer 已提交
396
 * Since: 0.9.2
397
 **/
398 399 400 401 402 403
hb_bool_t
hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
		    hb_codepoint_t      a,
		    hb_codepoint_t      b,
		    hb_codepoint_t     *ab)
{
B
Behdad Esfahbod 已提交
404
  return ufuncs->compose (a, b, ab);
405 406
}

407 408 409
/**
 * hb_unicode_decompose:
 * @ufuncs: Unicode functions.
410
 * @ab:
411 412 413 414
 * @a: (out):
 * @b: (out):
 *
 *
415 416
 *
 * Return value:
417
 *
S
Sascha Brawer 已提交
418
 * Since: 0.9.2
419
 **/
420 421 422 423 424 425
hb_bool_t
hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
		      hb_codepoint_t      ab,
		      hb_codepoint_t     *a,
		      hb_codepoint_t     *b)
{
B
Behdad Esfahbod 已提交
426
  return ufuncs->decompose (ab, a, b);
427
}
B
Behdad Esfahbod 已提交
428

429
#ifndef HB_DISABLE_DEPRECATED
430 431 432
/**
 * hb_unicode_decompose_compatibility:
 * @ufuncs: Unicode functions.
433
 * @u:
434 435 436
 * @decomposed: (out):
 *
 *
437 438
 *
 * Return value:
439
 *
S
Sascha Brawer 已提交
440
 * Since: 0.9.2
B
Behdad Esfahbod 已提交
441
 * Deprecated: 2.0.0
442
 **/
443 444 445 446 447
unsigned int
hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
				    hb_codepoint_t      u,
				    hb_codepoint_t     *decomposed)
{
B
Behdad Esfahbod 已提交
448
  return ufuncs->decompose_compatibility (u, decomposed);
449
}
450
#endif
B
Behdad Esfahbod 已提交
451 452


453
#ifndef HB_NO_OT_SHAPE
454
/* See hb-unicode.hh for details. */
455 456
const uint8_t
_hb_modified_combining_class[256] =
B
Behdad Esfahbod 已提交
457
{
458 459 460 461 462 463 464 465
  0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */
  1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */
  2, 3, 4, 5, 6,
  7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */
  8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */
  9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */

  /* Hebrew */
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
  HB_MODIFIED_COMBINING_CLASS_CCC10,
  HB_MODIFIED_COMBINING_CLASS_CCC11,
  HB_MODIFIED_COMBINING_CLASS_CCC12,
  HB_MODIFIED_COMBINING_CLASS_CCC13,
  HB_MODIFIED_COMBINING_CLASS_CCC14,
  HB_MODIFIED_COMBINING_CLASS_CCC15,
  HB_MODIFIED_COMBINING_CLASS_CCC16,
  HB_MODIFIED_COMBINING_CLASS_CCC17,
  HB_MODIFIED_COMBINING_CLASS_CCC18,
  HB_MODIFIED_COMBINING_CLASS_CCC19,
  HB_MODIFIED_COMBINING_CLASS_CCC20,
  HB_MODIFIED_COMBINING_CLASS_CCC21,
  HB_MODIFIED_COMBINING_CLASS_CCC22,
  HB_MODIFIED_COMBINING_CLASS_CCC23,
  HB_MODIFIED_COMBINING_CLASS_CCC24,
  HB_MODIFIED_COMBINING_CLASS_CCC25,
  HB_MODIFIED_COMBINING_CLASS_CCC26,
483 484

  /* Arabic */
485 486 487 488 489 490 491 492 493
  HB_MODIFIED_COMBINING_CLASS_CCC27,
  HB_MODIFIED_COMBINING_CLASS_CCC28,
  HB_MODIFIED_COMBINING_CLASS_CCC29,
  HB_MODIFIED_COMBINING_CLASS_CCC30,
  HB_MODIFIED_COMBINING_CLASS_CCC31,
  HB_MODIFIED_COMBINING_CLASS_CCC32,
  HB_MODIFIED_COMBINING_CLASS_CCC33,
  HB_MODIFIED_COMBINING_CLASS_CCC34,
  HB_MODIFIED_COMBINING_CLASS_CCC35,
494 495

  /* Syriac */
496
  HB_MODIFIED_COMBINING_CLASS_CCC36,
497 498 499 500 501 502 503

  37, 38, 39,
  40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  80, 81, 82, 83,

  /* Telugu */
504
  HB_MODIFIED_COMBINING_CLASS_CCC84,
505
  85, 86, 87, 88, 89, 90,
506
  HB_MODIFIED_COMBINING_CLASS_CCC91,
507 508 509
  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,

  /* Thai */
510
  HB_MODIFIED_COMBINING_CLASS_CCC103,
511
  104, 105, 106,
512
  HB_MODIFIED_COMBINING_CLASS_CCC107,
513 514 515
  108, 109, 110, 111, 112, 113, 114, 115, 116, 117,

  /* Lao */
516
  HB_MODIFIED_COMBINING_CLASS_CCC118,
517
  119, 120, 121,
518
  HB_MODIFIED_COMBINING_CLASS_CCC122,
519 520 521
  123, 124, 125, 126, 127, 128,

  /* Tibetan */
522 523
  HB_MODIFIED_COMBINING_CLASS_CCC129,
  HB_MODIFIED_COMBINING_CLASS_CCC130,
524
  131,
525
  HB_MODIFIED_COMBINING_CLASS_CCC132,
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
  133, 134, 135, 136, 137, 138, 139,


  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,

  200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */
  201,
  202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */
  203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
  214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */
  215,
  216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */
  217,
  218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */
  219,
  220, /* HB_UNICODE_COMBINING_CLASS_BELOW */
  221,
  222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */
  223,
  224, /* HB_UNICODE_COMBINING_CLASS_LEFT */
  225,
  226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */
  227,
  228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */
  229,
  230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */
  231,
  232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */
  233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */
  234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */
  235, 236, 237, 238, 239,
  240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */
  241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
  255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
};
566
#endif
567 568 569 570 571


/*
 * Emoji
 */
572
#ifndef HB_NO_EMOJI_SEQUENCES
573 574 575 576 577 578

#include "hb-unicode-emoji-table.hh"

bool
_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp)
{
579
  return _hb_emoji_is_Extended_Pictographic (cp);
580
}
B
Behdad Esfahbod 已提交
581
#endif