hb-unicode.cc (17313B)
1 /* 2 * Copyright © 2009 Red Hat, Inc. 3 * Copyright © 2011 Codethink Limited 4 * Copyright © 2010,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): Behdad Esfahbod 27 * Codethink Author(s): Ryan Lortie 28 * Google Author(s): Behdad Esfahbod 29 */ 30 31 #include "hb.hh" 32 33 #include "hb-unicode.hh" 34 35 36 /** 37 * SECTION: hb-unicode 38 * @title: hb-unicode 39 * @short_description: Unicode character property access 40 * @include: hb.h 41 * 42 * Unicode functions are used to access Unicode character properties. 43 * With these functions, client programs can query various properties from 44 * the Unicode Character Database for any code point, such as General 45 * Category (gc), Script (sc), Canonical Combining Class (ccc), etc. 46 * 47 * Client programs can optionally pass in their own Unicode functions 48 * that implement the same queries. The set of functions available is 49 * defined by the virtual methods in #hb_unicode_funcs_t. 50 * 51 * HarfBuzz provides built-in default functions for each method in 52 * #hb_unicode_funcs_t. 53 **/ 54 55 56 /* 57 * hb_unicode_funcs_t 58 */ 59 60 static hb_unicode_combining_class_t 61 hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 62 hb_codepoint_t unicode HB_UNUSED, 63 void *user_data HB_UNUSED) 64 { 65 return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED; 66 } 67 68 #ifndef HB_DISABLE_DEPRECATED 69 static unsigned int 70 hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 71 hb_codepoint_t unicode HB_UNUSED, 72 void *user_data HB_UNUSED) 73 { 74 return 1; 75 } 76 #endif 77 78 static hb_unicode_general_category_t 79 hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 80 hb_codepoint_t unicode HB_UNUSED, 81 void *user_data HB_UNUSED) 82 { 83 return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER; 84 } 85 86 static hb_codepoint_t 87 hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 88 hb_codepoint_t unicode, 89 void *user_data HB_UNUSED) 90 { 91 return unicode; 92 } 93 94 static hb_script_t 95 hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 96 hb_codepoint_t unicode HB_UNUSED, 97 void *user_data HB_UNUSED) 98 { 99 return HB_SCRIPT_UNKNOWN; 100 } 101 102 static hb_bool_t 103 hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 104 hb_codepoint_t a HB_UNUSED, 105 hb_codepoint_t b HB_UNUSED, 106 hb_codepoint_t *ab HB_UNUSED, 107 void *user_data HB_UNUSED) 108 { 109 return false; 110 } 111 112 static hb_bool_t 113 hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 114 hb_codepoint_t ab HB_UNUSED, 115 hb_codepoint_t *a HB_UNUSED, 116 hb_codepoint_t *b HB_UNUSED, 117 void *user_data HB_UNUSED) 118 { 119 return false; 120 } 121 122 123 #ifndef HB_DISABLE_DEPRECATED 124 static unsigned int 125 hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 126 hb_codepoint_t u HB_UNUSED, 127 hb_codepoint_t *decomposed HB_UNUSED, 128 void *user_data HB_UNUSED) 129 { 130 return 0; 131 } 132 #endif 133 134 #if !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB) 135 #include "hb-glib.h" 136 #endif 137 #if !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN) 138 #include "hb-icu.h" 139 #endif 140 141 /** 142 * hb_unicode_funcs_get_default: 143 * 144 * Fetches a pointer to the default Unicode-functions structure that is used 145 * when no functions are explicitly set on #hb_buffer_t. 146 * 147 * Return value: (transfer none): a pointer to the #hb_unicode_funcs_t Unicode-functions structure 148 * 149 * Since: 0.9.2 150 **/ 151 hb_unicode_funcs_t * 152 hb_unicode_funcs_get_default () 153 { 154 #if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD) 155 return hb_ucd_get_unicode_funcs (); 156 #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB) 157 return hb_glib_get_unicode_funcs (); 158 #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN) 159 return hb_icu_get_unicode_funcs (); 160 #else 161 #define HB_UNICODE_FUNCS_NIL 1 162 return hb_unicode_funcs_get_empty (); 163 #endif 164 } 165 166 #if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL) 167 #error "Could not find any Unicode functions implementation, you have to provide your own" 168 #error "Consider building hb-ucd.cc. If you absolutely want to build without any, define HB_NO_UNICODE_FUNCS." 169 #endif 170 171 /** 172 * hb_unicode_funcs_create: 173 * @parent: (nullable): Parent Unicode-functions structure 174 * 175 * Creates a new #hb_unicode_funcs_t structure of Unicode functions. 176 * 177 * Return value: (transfer full): The Unicode-functions structure 178 * 179 * Since: 0.9.2 180 **/ 181 hb_unicode_funcs_t * 182 hb_unicode_funcs_create (hb_unicode_funcs_t *parent) 183 { 184 hb_unicode_funcs_t *ufuncs; 185 186 if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ())) 187 return hb_unicode_funcs_get_empty (); 188 189 if (!parent) 190 parent = hb_unicode_funcs_get_empty (); 191 192 hb_unicode_funcs_make_immutable (parent); 193 ufuncs->parent = hb_unicode_funcs_reference (parent); 194 195 ufuncs->func = parent->func; 196 197 /* We can safely copy user_data from parent since we hold a reference 198 * onto it and it's immutable. We should not copy the destroy notifiers 199 * though. */ 200 ufuncs->user_data = parent->user_data; 201 202 return ufuncs; 203 } 204 205 206 DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) = 207 { 208 HB_OBJECT_HEADER_STATIC, 209 210 nullptr, /* parent */ 211 { 212 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil, 213 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 214 #undef HB_UNICODE_FUNC_IMPLEMENT 215 } 216 }; 217 218 /** 219 * hb_unicode_funcs_get_empty: 220 * 221 * Fetches the singleton empty Unicode-functions structure. 222 * 223 * Return value: (transfer full): The empty Unicode-functions structure 224 * 225 * Since: 0.9.2 226 **/ 227 hb_unicode_funcs_t * 228 hb_unicode_funcs_get_empty () 229 { 230 return const_cast<hb_unicode_funcs_t *> (&Null (hb_unicode_funcs_t)); 231 } 232 233 /** 234 * hb_unicode_funcs_reference: (skip) 235 * @ufuncs: The Unicode-functions structure 236 * 237 * Increases the reference count on a Unicode-functions structure. 238 * 239 * Return value: (transfer full): The Unicode-functions structure 240 * 241 * Since: 0.9.2 242 **/ 243 hb_unicode_funcs_t * 244 hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs) 245 { 246 return hb_object_reference (ufuncs); 247 } 248 249 /** 250 * hb_unicode_funcs_destroy: (skip) 251 * @ufuncs: The Unicode-functions structure 252 * 253 * Decreases the reference count on a Unicode-functions structure. When 254 * the reference count reaches zero, the Unicode-functions structure is 255 * destroyed, freeing all memory. 256 * 257 * Since: 0.9.2 258 **/ 259 void 260 hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs) 261 { 262 if (!hb_object_destroy (ufuncs)) return; 263 264 #define HB_UNICODE_FUNC_IMPLEMENT(name) \ 265 if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name); 266 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 267 #undef HB_UNICODE_FUNC_IMPLEMENT 268 269 hb_unicode_funcs_destroy (ufuncs->parent); 270 271 hb_free (ufuncs); 272 } 273 274 /** 275 * hb_unicode_funcs_set_user_data: (skip) 276 * @ufuncs: The Unicode-functions structure 277 * @key: The user-data key 278 * @data: A pointer to the user data 279 * @destroy: (nullable): A callback to call when @data is not needed anymore 280 * @replace: Whether to replace an existing data with the same key 281 * 282 * Attaches a user-data key/data pair to the specified Unicode-functions structure. 283 * 284 * Return value: `true` if success, `false` otherwise 285 * 286 * Since: 0.9.2 287 **/ 288 hb_bool_t 289 hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs, 290 hb_user_data_key_t *key, 291 void * data, 292 hb_destroy_func_t destroy, 293 hb_bool_t replace) 294 { 295 return hb_object_set_user_data (ufuncs, key, data, destroy, replace); 296 } 297 298 /** 299 * hb_unicode_funcs_get_user_data: (skip) 300 * @ufuncs: The Unicode-functions structure 301 * @key: The user-data key to query 302 * 303 * Fetches the user-data associated with the specified key, 304 * attached to the specified Unicode-functions structure. 305 * 306 * Return value: (transfer none): A pointer to the user data 307 * 308 * Since: 0.9.2 309 **/ 310 void * 311 hb_unicode_funcs_get_user_data (const hb_unicode_funcs_t *ufuncs, 312 hb_user_data_key_t *key) 313 { 314 return hb_object_get_user_data (ufuncs, key); 315 } 316 317 318 /** 319 * hb_unicode_funcs_make_immutable: 320 * @ufuncs: The Unicode-functions structure 321 * 322 * Makes the specified Unicode-functions structure 323 * immutable. 324 * 325 * Since: 0.9.2 326 **/ 327 void 328 hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs) 329 { 330 if (hb_object_is_immutable (ufuncs)) 331 return; 332 333 hb_object_make_immutable (ufuncs); 334 } 335 336 /** 337 * hb_unicode_funcs_is_immutable: 338 * @ufuncs: The Unicode-functions structure 339 * 340 * Tests whether the specified Unicode-functions structure 341 * is immutable. 342 * 343 * Return value: `true` if @ufuncs is immutable, `false` otherwise 344 * 345 * Since: 0.9.2 346 **/ 347 hb_bool_t 348 hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs) 349 { 350 return hb_object_is_immutable (ufuncs); 351 } 352 353 /** 354 * hb_unicode_funcs_get_parent: 355 * @ufuncs: The Unicode-functions structure 356 * 357 * Fetches the parent of the Unicode-functions structure 358 * @ufuncs. 359 * 360 * Return value: The parent Unicode-functions structure 361 * 362 * Since: 0.9.2 363 **/ 364 hb_unicode_funcs_t * 365 hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs) 366 { 367 return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty (); 368 } 369 370 371 #define HB_UNICODE_FUNC_IMPLEMENT(name) \ 372 \ 373 void \ 374 hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \ 375 hb_unicode_##name##_func_t func, \ 376 void *user_data, \ 377 hb_destroy_func_t destroy) \ 378 { \ 379 if (hb_object_is_immutable (ufuncs)) \ 380 goto fail; \ 381 \ 382 if (!func) \ 383 { \ 384 if (destroy) \ 385 destroy (user_data); \ 386 destroy = nullptr; \ 387 user_data = ufuncs->parent->user_data.name; \ 388 } \ 389 \ 390 if (ufuncs->destroy.name) \ 391 ufuncs->destroy.name (ufuncs->user_data.name); \ 392 \ 393 if (func) \ 394 ufuncs->func.name = func; \ 395 else \ 396 ufuncs->func.name = ufuncs->parent->func.name; \ 397 ufuncs->user_data.name = user_data; \ 398 ufuncs->destroy.name = destroy; \ 399 return; \ 400 \ 401 fail: \ 402 if (destroy) \ 403 destroy (user_data); \ 404 } 405 406 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 407 #undef HB_UNICODE_FUNC_IMPLEMENT 408 409 410 #define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \ 411 \ 412 return_type \ 413 hb_unicode_##name (hb_unicode_funcs_t *ufuncs, \ 414 hb_codepoint_t unicode) \ 415 { \ 416 return ufuncs->name (unicode); \ 417 } 418 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE 419 #undef HB_UNICODE_FUNC_IMPLEMENT 420 421 /** 422 * hb_unicode_compose: 423 * @ufuncs: The Unicode-functions structure 424 * @a: The first Unicode code point to compose 425 * @b: The second Unicode code point to compose 426 * @ab: (out): The composition of @a, @b 427 * 428 * Fetches the composition of a sequence of two Unicode 429 * code points. 430 * 431 * Calls the composition function of the specified 432 * Unicode-functions structure @ufuncs. 433 * 434 * Return value: `true` if @a and @b composed, `false` otherwise 435 * 436 * Since: 0.9.2 437 **/ 438 hb_bool_t 439 hb_unicode_compose (hb_unicode_funcs_t *ufuncs, 440 hb_codepoint_t a, 441 hb_codepoint_t b, 442 hb_codepoint_t *ab) 443 { 444 return ufuncs->compose (a, b, ab); 445 } 446 447 /** 448 * hb_unicode_decompose: 449 * @ufuncs: The Unicode-functions structure 450 * @ab: Unicode code point to decompose 451 * @a: (out): The first code point of the decomposition of @ab 452 * @b: (out): The second code point of the decomposition of @ab 453 * 454 * Fetches the decomposition of a Unicode code point. 455 * 456 * Calls the decomposition function of the specified 457 * Unicode-functions structure @ufuncs. 458 * 459 * Return value: `true` if @ab was decomposed, `false` otherwise 460 * 461 * Since: 0.9.2 462 **/ 463 hb_bool_t 464 hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, 465 hb_codepoint_t ab, 466 hb_codepoint_t *a, 467 hb_codepoint_t *b) 468 { 469 return ufuncs->decompose (ab, a, b); 470 } 471 472 #ifndef HB_DISABLE_DEPRECATED 473 /** 474 * hb_unicode_decompose_compatibility: 475 * @ufuncs: The Unicode-functions structure 476 * @u: Code point to decompose 477 * @decomposed: (out): Compatibility decomposition of @u 478 * 479 * Fetches the compatibility decomposition of a Unicode 480 * code point. Deprecated. 481 * 482 * Return value: length of @decomposed. 483 * 484 * Since: 0.9.2 485 * Deprecated: 2.0.0 486 **/ 487 unsigned int 488 hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, 489 hb_codepoint_t u, 490 hb_codepoint_t *decomposed) 491 { 492 return ufuncs->decompose_compatibility (u, decomposed); 493 } 494 #endif 495 496 497 #ifndef HB_NO_OT_SHAPE 498 /* See hb-unicode.hh for details. */ 499 const uint8_t 500 _hb_modified_combining_class[256] = 501 { 502 0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */ 503 1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */ 504 2, 3, 4, 5, 6, 505 7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */ 506 8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */ 507 9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */ 508 509 /* Hebrew */ 510 HB_MODIFIED_COMBINING_CLASS_CCC10, 511 HB_MODIFIED_COMBINING_CLASS_CCC11, 512 HB_MODIFIED_COMBINING_CLASS_CCC12, 513 HB_MODIFIED_COMBINING_CLASS_CCC13, 514 HB_MODIFIED_COMBINING_CLASS_CCC14, 515 HB_MODIFIED_COMBINING_CLASS_CCC15, 516 HB_MODIFIED_COMBINING_CLASS_CCC16, 517 HB_MODIFIED_COMBINING_CLASS_CCC17, 518 HB_MODIFIED_COMBINING_CLASS_CCC18, 519 HB_MODIFIED_COMBINING_CLASS_CCC19, 520 HB_MODIFIED_COMBINING_CLASS_CCC20, 521 HB_MODIFIED_COMBINING_CLASS_CCC21, 522 HB_MODIFIED_COMBINING_CLASS_CCC22, 523 HB_MODIFIED_COMBINING_CLASS_CCC23, 524 HB_MODIFIED_COMBINING_CLASS_CCC24, 525 HB_MODIFIED_COMBINING_CLASS_CCC25, 526 HB_MODIFIED_COMBINING_CLASS_CCC26, 527 528 /* Arabic */ 529 HB_MODIFIED_COMBINING_CLASS_CCC27, 530 HB_MODIFIED_COMBINING_CLASS_CCC28, 531 HB_MODIFIED_COMBINING_CLASS_CCC29, 532 HB_MODIFIED_COMBINING_CLASS_CCC30, 533 HB_MODIFIED_COMBINING_CLASS_CCC31, 534 HB_MODIFIED_COMBINING_CLASS_CCC32, 535 HB_MODIFIED_COMBINING_CLASS_CCC33, 536 HB_MODIFIED_COMBINING_CLASS_CCC34, 537 HB_MODIFIED_COMBINING_CLASS_CCC35, 538 539 /* Syriac */ 540 HB_MODIFIED_COMBINING_CLASS_CCC36, 541 542 37, 38, 39, 543 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 544 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 545 80, 81, 82, 83, 546 547 /* Telugu */ 548 HB_MODIFIED_COMBINING_CLASS_CCC84, 549 85, 86, 87, 88, 89, 90, 550 HB_MODIFIED_COMBINING_CLASS_CCC91, 551 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 552 553 /* Thai */ 554 HB_MODIFIED_COMBINING_CLASS_CCC103, 555 104, 105, 106, 556 HB_MODIFIED_COMBINING_CLASS_CCC107, 557 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 558 559 /* Lao */ 560 HB_MODIFIED_COMBINING_CLASS_CCC118, 561 119, 120, 121, 562 HB_MODIFIED_COMBINING_CLASS_CCC122, 563 123, 124, 125, 126, 127, 128, 564 565 /* Tibetan */ 566 HB_MODIFIED_COMBINING_CLASS_CCC129, 567 HB_MODIFIED_COMBINING_CLASS_CCC130, 568 131, 569 HB_MODIFIED_COMBINING_CLASS_CCC132, 570 133, 134, 135, 136, 137, 138, 139, 571 572 573 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 574 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 575 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 576 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 577 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 578 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 579 580 200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */ 581 201, 582 202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */ 583 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 584 214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */ 585 215, 586 216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */ 587 217, 588 218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */ 589 219, 590 220, /* HB_UNICODE_COMBINING_CLASS_BELOW */ 591 221, 592 222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */ 593 223, 594 224, /* HB_UNICODE_COMBINING_CLASS_LEFT */ 595 225, 596 226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */ 597 227, 598 228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */ 599 229, 600 230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */ 601 231, 602 232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */ 603 233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */ 604 234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */ 605 235, 236, 237, 238, 239, 606 240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */ 607 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 608 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */ 609 }; 610 #endif 611 612 613 /* 614 * Emoji 615 */ 616 #ifndef HB_NO_EMOJI_SEQUENCES 617 618 #include "hb-unicode-emoji-table.hh" 619 620 bool 621 _hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp) 622 { 623 return _hb_emoji_is_Extended_Pictographic (cp); 624 } 625 #endif