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