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