blob: 7b821b46d5e50bfaed25e7743796c773ff1bc87c [file] [log] [blame]
Behdad Esfahbodfb194b82011-04-20 02:00:47 -04001/*
Behdad Esfahbod2409d5f2011-04-21 17:14:28 -04002 * Copyright © 2009 Red Hat, Inc.
Behdad Esfahbod6adf4172012-08-01 18:07:42 -04003 * Copyright © 2011 Codethink Limited
4 * Copyright © 2010,2011,2012 Google, Inc.
Behdad Esfahbodfb194b82011-04-20 02:00:47 -04005 *
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
Behdad Esfahbodc77ae402018-08-25 22:36:36 -070031#include "hb.hh"
Behdad Esfahbodfb194b82011-04-20 02:00:47 -040032
Behdad Esfahbodc77ae402018-08-25 22:36:36 -070033#include "hb-unicode.hh"
Behdad Esfahbodfb194b82011-04-20 02:00:47 -040034
Behdad Esfahbodfb194b82011-04-20 02:00:47 -040035
36
37/*
38 * hb_unicode_funcs_t
39 */
40
Behdad Esfahbod21fdcee2012-08-01 16:23:44 -040041static hb_unicode_combining_class_t
Behdad Esfahbodc4641722011-07-07 23:47:19 -040042hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
43 hb_codepoint_t unicode HB_UNUSED,
44 void *user_data HB_UNUSED)
Behdad Esfahbod891c4752011-07-07 23:19:27 -040045{
Behdad Esfahbod21fdcee2012-08-01 16:23:44 -040046 return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED;
Behdad Esfahbodfb194b82011-04-20 02:00:47 -040047}
48
Behdad Esfahbod891c4752011-07-07 23:19:27 -040049static unsigned int
Behdad Esfahbodc4641722011-07-07 23:47:19 -040050hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
51 hb_codepoint_t unicode HB_UNUSED,
52 void *user_data HB_UNUSED)
Behdad Esfahbod891c4752011-07-07 23:19:27 -040053{
54 return 1;
55}
56
57static hb_unicode_general_category_t
Behdad Esfahbodc4641722011-07-07 23:47:19 -040058hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
59 hb_codepoint_t unicode HB_UNUSED,
60 void *user_data HB_UNUSED)
Behdad Esfahbod891c4752011-07-07 23:19:27 -040061{
62 return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER;
63}
64
65static hb_codepoint_t
Behdad Esfahbodc4641722011-07-07 23:47:19 -040066hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
Ebrahim Byagowi24b8b9b2018-04-23 19:03:57 +043067 hb_codepoint_t unicode,
Behdad Esfahbodc4641722011-07-07 23:47:19 -040068 void *user_data HB_UNUSED)
Behdad Esfahbod891c4752011-07-07 23:19:27 -040069{
70 return unicode;
71}
72
73static hb_script_t
Behdad Esfahbodc4641722011-07-07 23:47:19 -040074hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
75 hb_codepoint_t unicode HB_UNUSED,
76 void *user_data HB_UNUSED)
Behdad Esfahbod891c4752011-07-07 23:19:27 -040077{
78 return HB_SCRIPT_UNKNOWN;
79}
Behdad Esfahbodfb194b82011-04-20 02:00:47 -040080
Behdad Esfahbodc4641722011-07-07 23:47:19 -040081static hb_bool_t
Behdad Esfahbod22fdc662011-07-20 21:51:37 -040082hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
Behdad Esfahbodc4641722011-07-07 23:47:19 -040083 hb_codepoint_t a HB_UNUSED,
84 hb_codepoint_t b HB_UNUSED,
85 hb_codepoint_t *ab HB_UNUSED,
86 void *user_data HB_UNUSED)
87{
Behdad Esfahbod0594a242012-06-05 20:35:40 -040088 return false;
Behdad Esfahbodc4641722011-07-07 23:47:19 -040089}
90
91static hb_bool_t
Behdad Esfahbod22fdc662011-07-20 21:51:37 -040092hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
Behdad Esfahbodc4641722011-07-07 23:47:19 -040093 hb_codepoint_t ab HB_UNUSED,
94 hb_codepoint_t *a HB_UNUSED,
95 hb_codepoint_t *b HB_UNUSED,
96 void *user_data HB_UNUSED)
97{
Behdad Esfahbod0594a242012-06-05 20:35:40 -040098 return false;
Behdad Esfahbodc4641722011-07-07 23:47:19 -040099}
100
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400101
Behdad Esfahbod378d2792012-07-31 21:36:16 -0400102static unsigned int
103hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
104 hb_codepoint_t u HB_UNUSED,
105 hb_codepoint_t *decomposed HB_UNUSED,
106 void *user_data HB_UNUSED)
107{
108 return 0;
109}
110
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400111
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400112#define HB_UNICODE_FUNCS_IMPLEMENT_SET \
113 HB_UNICODE_FUNCS_IMPLEMENT (glib) \
114 HB_UNICODE_FUNCS_IMPLEMENT (icu) \
Behdad Esfahbod3f33f0d2012-10-02 16:03:18 -0400115 HB_UNICODE_FUNCS_IMPLEMENT (ucdn) \
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400116 HB_UNICODE_FUNCS_IMPLEMENT (nil) \
117 /* ^--- Add new callbacks before nil */
118
119#define hb_nil_get_unicode_funcs hb_unicode_funcs_get_empty
120
121/* Prototype them all */
122#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
123extern "C" hb_unicode_funcs_t *hb_##set##_get_unicode_funcs (void);
124HB_UNICODE_FUNCS_IMPLEMENT_SET
125#undef HB_UNICODE_FUNCS_IMPLEMENT
126
127
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400128hb_unicode_funcs_t *
Behdad Esfahbodd4bee9f2011-04-27 09:24:37 -0400129hb_unicode_funcs_get_default (void)
130{
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400131#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
132 return hb_##set##_get_unicode_funcs ();
133
Behdad Esfahbod53543f82017-01-05 20:12:32 -0800134#if defined(HAVE_UCDN)
135 HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
136#elif defined(HAVE_GLIB)
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400137 HB_UNICODE_FUNCS_IMPLEMENT(glib)
Behdad Esfahbodaf1aa362014-03-14 15:52:47 -0700138#elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400139 HB_UNICODE_FUNCS_IMPLEMENT(icu)
140#else
141#define HB_UNICODE_FUNCS_NIL 1
142 HB_UNICODE_FUNCS_IMPLEMENT(nil)
143#endif
144
145#undef HB_UNICODE_FUNCS_IMPLEMENT
Behdad Esfahbodd4bee9f2011-04-27 09:24:37 -0400146}
147
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400148#if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
Behdad Esfahbodcdcdfe62015-04-08 13:25:04 -0700149#error "Could not find any Unicode functions implementation, you have to provide your own"
150#error "Consider building hb-ucdn.c. If you absolutely want to build without any, check the code."
Behdad Esfahbod09732cc2014-03-19 12:00:17 -0700151#endif
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400152
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400153/**
Behdad Esfahbod085d4292013-09-12 17:14:33 -0400154 * hb_unicode_funcs_create: (Xconstructor)
Behdad Esfahbodb91904a2015-01-06 15:43:14 -0800155 * @parent: (nullable):
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400156 *
157 *
158 *
159 * Return value: (transfer full):
160 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430161 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400162 **/
Behdad Esfahbodd4bee9f2011-04-27 09:24:37 -0400163hb_unicode_funcs_t *
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400164hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
165{
166 hb_unicode_funcs_t *ufuncs;
167
Behdad Esfahbod47e71d92011-04-27 16:38:03 -0400168 if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ()))
Behdad Esfahbodf06ab8a2012-06-05 12:31:51 -0400169 return hb_unicode_funcs_get_empty ();
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400170
Behdad Esfahbodc784c672011-05-02 15:59:57 -0400171 if (!parent)
Behdad Esfahbodf06ab8a2012-06-05 12:31:51 -0400172 parent = hb_unicode_funcs_get_empty ();
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400173
Behdad Esfahbodc784c672011-05-02 15:59:57 -0400174 hb_unicode_funcs_make_immutable (parent);
175 ufuncs->parent = hb_unicode_funcs_reference (parent);
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400176
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400177 ufuncs->func = parent->func;
Behdad Esfahbodc784c672011-05-02 15:59:57 -0400178
179 /* We can safely copy user_data from parent since we hold a reference
180 * onto it and it's immutable. We should not copy the destroy notifiers
181 * though. */
182 ufuncs->user_data = parent->user_data;
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400183
184 return ufuncs;
185}
186
Behdad Esfahbodbe4560a2012-06-05 18:14:03 -0400187
Behdad Esfahbod35066722018-08-06 06:17:48 -0700188DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
189{
Behdad Esfahbodbe4560a2012-06-05 18:14:03 -0400190 HB_OBJECT_HEADER_STATIC,
191
Behdad Esfahboddbdbfe32017-10-15 12:11:08 +0200192 nullptr, /* parent */
Behdad Esfahbod0594a242012-06-05 20:35:40 -0400193 true, /* immutable */
Behdad Esfahbodbe4560a2012-06-05 18:14:03 -0400194 {
195#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
196 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
197#undef HB_UNICODE_FUNC_IMPLEMENT
198 }
199};
200
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400201/**
202 * hb_unicode_funcs_get_empty:
203 *
204 *
205 *
206 * Return value: (transfer full):
207 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430208 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400209 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400210hb_unicode_funcs_t *
Behdad Esfahbod80a68332011-05-11 18:14:44 -0400211hb_unicode_funcs_get_empty (void)
212{
Behdad Esfahbod35066722018-08-06 06:17:48 -0700213 return const_cast<hb_unicode_funcs_t *> (&Null(hb_unicode_funcs_t));
Behdad Esfahbod80a68332011-05-11 18:14:44 -0400214}
215
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400216/**
217 * hb_unicode_funcs_reference: (skip)
218 * @ufuncs: Unicode functions.
219 *
220 *
221 *
222 * Return value: (transfer full):
223 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430224 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400225 **/
Behdad Esfahbod80a68332011-05-11 18:14:44 -0400226hb_unicode_funcs_t *
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400227hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
228{
Behdad Esfahbod47e71d92011-04-27 16:38:03 -0400229 return hb_object_reference (ufuncs);
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400230}
231
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400232/**
233 * hb_unicode_funcs_destroy: (skip)
234 * @ufuncs: Unicode functions.
235 *
236 *
237 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430238 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400239 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400240void
241hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
242{
Behdad Esfahbod47e71d92011-04-27 16:38:03 -0400243 if (!hb_object_destroy (ufuncs)) return;
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400244
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400245#define HB_UNICODE_FUNC_IMPLEMENT(name) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400246 if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
247 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
248#undef HB_UNICODE_FUNC_IMPLEMENT
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400249
Behdad Esfahbodc784c672011-05-02 15:59:57 -0400250 hb_unicode_funcs_destroy (ufuncs->parent);
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400251
252 free (ufuncs);
253}
254
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400255/**
256 * hb_unicode_funcs_set_user_data: (skip)
257 * @ufuncs: Unicode functions.
258 * @key:
259 * @data:
260 * @destroy:
261 * @replace:
262 *
263 *
264 *
265 * Return value:
266 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430267 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400268 **/
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400269hb_bool_t
270hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
271 hb_user_data_key_t *key,
272 void * data,
Behdad Esfahbod33ccc772011-08-09 00:43:24 +0200273 hb_destroy_func_t destroy,
274 hb_bool_t replace)
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400275{
Behdad Esfahbod33ccc772011-08-09 00:43:24 +0200276 return hb_object_set_user_data (ufuncs, key, data, destroy, replace);
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400277}
278
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400279/**
280 * hb_unicode_funcs_get_user_data: (skip)
281 * @ufuncs: Unicode functions.
282 * @key:
283 *
284 *
285 *
286 * Return value: (transfer none):
287 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430288 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400289 **/
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400290void *
291hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
292 hb_user_data_key_t *key)
293{
294 return hb_object_get_user_data (ufuncs, key);
295}
296
297
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400298/**
299 * hb_unicode_funcs_make_immutable:
300 * @ufuncs: Unicode functions.
301 *
302 *
303 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430304 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400305 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400306void
307hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
308{
Behdad Esfahbod3f310dc2014-07-22 16:26:27 -0400309 if (unlikely (hb_object_is_inert (ufuncs)))
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400310 return;
Behdad Esfahbod90a0f9f2018-09-26 15:03:07 -0400311 if (ufuncs->immutable)
312 return;
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400313
Behdad Esfahbod0594a242012-06-05 20:35:40 -0400314 ufuncs->immutable = true;
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400315}
316
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400317/**
318 * hb_unicode_funcs_is_immutable:
319 * @ufuncs: Unicode functions.
320 *
321 *
322 *
323 * Return value:
324 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430325 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400326 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400327hb_bool_t
328hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
329{
330 return ufuncs->immutable;
331}
332
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400333/**
334 * hb_unicode_funcs_get_parent:
335 * @ufuncs: Unicode functions.
336 *
337 *
338 *
339 * Return value:
340 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430341 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400342 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400343hb_unicode_funcs_t *
344hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs)
345{
Behdad Esfahbodf06ab8a2012-06-05 12:31:51 -0400346 return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty ();
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400347}
348
349
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400350#define HB_UNICODE_FUNC_IMPLEMENT(name) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400351 \
352void \
353hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400354 hb_unicode_##name##_func_t func, \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400355 void *user_data, \
356 hb_destroy_func_t destroy) \
357{ \
358 if (ufuncs->immutable) \
359 return; \
360 \
361 if (ufuncs->destroy.name) \
362 ufuncs->destroy.name (ufuncs->user_data.name); \
363 \
364 if (func) { \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400365 ufuncs->func.name = func; \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400366 ufuncs->user_data.name = user_data; \
367 ufuncs->destroy.name = destroy; \
368 } else { \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400369 ufuncs->func.name = ufuncs->parent->func.name; \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400370 ufuncs->user_data.name = ufuncs->parent->user_data.name; \
Behdad Esfahboddbdbfe32017-10-15 12:11:08 +0200371 ufuncs->destroy.name = nullptr; \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400372 } \
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400373}
374
Behdad Esfahbod74703152012-08-01 17:01:59 -0400375HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400376#undef HB_UNICODE_FUNC_IMPLEMENT
377
378
379#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400380 \
381return_type \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400382hb_unicode_##name (hb_unicode_funcs_t *ufuncs, \
383 hb_codepoint_t unicode) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400384{ \
Behdad Esfahbod74703152012-08-01 17:01:59 -0400385 return ufuncs->name (unicode); \
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400386}
Behdad Esfahbod74703152012-08-01 17:01:59 -0400387HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400388#undef HB_UNICODE_FUNC_IMPLEMENT
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400389
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400390/**
391 * hb_unicode_compose:
392 * @ufuncs: Unicode functions.
393 * @a:
394 * @b:
395 * @ab: (out):
396 *
397 *
398 *
399 * Return value:
400 *
Sascha Brawer01c3a882015-06-01 13:22:01 +0200401 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400402 **/
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400403hb_bool_t
404hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
405 hb_codepoint_t a,
406 hb_codepoint_t b,
407 hb_codepoint_t *ab)
408{
Behdad Esfahbod74703152012-08-01 17:01:59 -0400409 return ufuncs->compose (a, b, ab);
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400410}
411
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400412/**
413 * hb_unicode_decompose:
414 * @ufuncs: Unicode functions.
415 * @ab:
416 * @a: (out):
417 * @b: (out):
418 *
419 *
420 *
421 * Return value:
422 *
Sascha Brawer01c3a882015-06-01 13:22:01 +0200423 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400424 **/
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400425hb_bool_t
426hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
427 hb_codepoint_t ab,
428 hb_codepoint_t *a,
429 hb_codepoint_t *b)
430{
Behdad Esfahbod74703152012-08-01 17:01:59 -0400431 return ufuncs->decompose (ab, a, b);
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400432}
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400433
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400434/**
435 * hb_unicode_decompose_compatibility:
436 * @ufuncs: Unicode functions.
437 * @u:
438 * @decomposed: (out):
439 *
440 *
441 *
442 * Return value:
443 *
Sascha Brawer01c3a882015-06-01 13:22:01 +0200444 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400445 **/
Behdad Esfahbod378d2792012-07-31 21:36:16 -0400446unsigned int
447hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
448 hb_codepoint_t u,
449 hb_codepoint_t *decomposed)
450{
Behdad Esfahbod74703152012-08-01 17:01:59 -0400451 return ufuncs->decompose_compatibility (u, decomposed);
Behdad Esfahbod378d2792012-07-31 21:36:16 -0400452}
Behdad Esfahbod2db2a562012-04-05 16:40:37 -0400453
454
Behdad Esfahbodc77ae402018-08-25 22:36:36 -0700455/* See hb-unicode.hh for details. */
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400456const uint8_t
457_hb_modified_combining_class[256] =
Behdad Esfahbod2db2a562012-04-05 16:40:37 -0400458{
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400459 0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */
460 1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */
461 2, 3, 4, 5, 6,
462 7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */
463 8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */
464 9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */
Behdad Esfahbod2db2a562012-04-05 16:40:37 -0400465
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400466 /* Hebrew */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400467 HB_MODIFIED_COMBINING_CLASS_CCC10,
468 HB_MODIFIED_COMBINING_CLASS_CCC11,
469 HB_MODIFIED_COMBINING_CLASS_CCC12,
470 HB_MODIFIED_COMBINING_CLASS_CCC13,
471 HB_MODIFIED_COMBINING_CLASS_CCC14,
472 HB_MODIFIED_COMBINING_CLASS_CCC15,
473 HB_MODIFIED_COMBINING_CLASS_CCC16,
474 HB_MODIFIED_COMBINING_CLASS_CCC17,
475 HB_MODIFIED_COMBINING_CLASS_CCC18,
476 HB_MODIFIED_COMBINING_CLASS_CCC19,
477 HB_MODIFIED_COMBINING_CLASS_CCC20,
478 HB_MODIFIED_COMBINING_CLASS_CCC21,
479 HB_MODIFIED_COMBINING_CLASS_CCC22,
480 HB_MODIFIED_COMBINING_CLASS_CCC23,
481 HB_MODIFIED_COMBINING_CLASS_CCC24,
482 HB_MODIFIED_COMBINING_CLASS_CCC25,
483 HB_MODIFIED_COMBINING_CLASS_CCC26,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400484
485 /* Arabic */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400486 HB_MODIFIED_COMBINING_CLASS_CCC27,
487 HB_MODIFIED_COMBINING_CLASS_CCC28,
488 HB_MODIFIED_COMBINING_CLASS_CCC29,
489 HB_MODIFIED_COMBINING_CLASS_CCC30,
490 HB_MODIFIED_COMBINING_CLASS_CCC31,
491 HB_MODIFIED_COMBINING_CLASS_CCC32,
492 HB_MODIFIED_COMBINING_CLASS_CCC33,
493 HB_MODIFIED_COMBINING_CLASS_CCC34,
494 HB_MODIFIED_COMBINING_CLASS_CCC35,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400495
496 /* Syriac */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400497 HB_MODIFIED_COMBINING_CLASS_CCC36,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400498
499 37, 38, 39,
500 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
501 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
502 80, 81, 82, 83,
503
504 /* Telugu */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400505 HB_MODIFIED_COMBINING_CLASS_CCC84,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400506 85, 86, 87, 88, 89, 90,
Behdad Esfahbod21756932012-08-08 01:20:45 -0400507 HB_MODIFIED_COMBINING_CLASS_CCC91,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400508 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
509
510 /* Thai */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400511 HB_MODIFIED_COMBINING_CLASS_CCC103,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400512 104, 105, 106,
Behdad Esfahbod21756932012-08-08 01:20:45 -0400513 HB_MODIFIED_COMBINING_CLASS_CCC107,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400514 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
515
516 /* Lao */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400517 HB_MODIFIED_COMBINING_CLASS_CCC118,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400518 119, 120, 121,
Behdad Esfahbod21756932012-08-08 01:20:45 -0400519 HB_MODIFIED_COMBINING_CLASS_CCC122,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400520 123, 124, 125, 126, 127, 128,
521
522 /* Tibetan */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400523 HB_MODIFIED_COMBINING_CLASS_CCC129,
524 HB_MODIFIED_COMBINING_CLASS_CCC130,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400525 131,
Behdad Esfahbod56c9e7c2012-08-09 21:12:30 -0400526 HB_MODIFIED_COMBINING_CLASS_CCC132,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400527 133, 134, 135, 136, 137, 138, 139,
528
529
530 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
531 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
532 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
533 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
534 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
535 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
536
537 200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */
538 201,
539 202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */
540 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
541 214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */
542 215,
543 216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */
544 217,
545 218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */
546 219,
547 220, /* HB_UNICODE_COMBINING_CLASS_BELOW */
548 221,
549 222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */
550 223,
551 224, /* HB_UNICODE_COMBINING_CLASS_LEFT */
552 225,
553 226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */
554 227,
555 228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */
556 229,
557 230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */
558 231,
559 232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */
560 233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */
561 234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */
562 235, 236, 237, 238, 239,
563 240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */
564 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
565 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
566};
Behdad Esfahbod1e8f1952018-10-03 17:46:48 +0200567
568
569/*
570 * Emoji
571 */
572
573#include "hb-unicode-emoji-table.hh"
574
575bool
576_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp)
577{
578 return hb_bsearch_r (&cp, _hb_unicode_emoji_Extended_Pictographic_table,
579 ARRAY_LENGTH (_hb_unicode_emoji_Extended_Pictographic_table),
580 sizeof (hb_unicode_range_t),
581 hb_unicode_range_t::cmp, nullptr);
582}