blob: 487d10b9395db248ed6a6ef09bf4c8c4983eab57 [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 Esfahbodc57d4542011-04-20 18:50:27 -040031#include "hb-private.hh"
Behdad Esfahbodfb194b82011-04-20 02:00:47 -040032
33#include "hb-unicode-private.hh"
34
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,
67 hb_codepoint_t unicode HB_UNUSED,
68 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
134#ifdef HAVE_GLIB
135 HB_UNICODE_FUNCS_IMPLEMENT(glib)
Behdad Esfahbodaf1aa362014-03-14 15:52:47 -0700136#elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400137 HB_UNICODE_FUNCS_IMPLEMENT(icu)
Behdad Esfahbod3f33f0d2012-10-02 16:03:18 -0400138#elif defined(HAVE_UCDN)
139 HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
Behdad Esfahbodd5045a52012-08-11 21:26:25 -0400140#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 Esfahbodbe4560a2012-06-05 18:14:03 -0400188const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
189 HB_OBJECT_HEADER_STATIC,
190
191 NULL, /* parent */
Behdad Esfahbod0594a242012-06-05 20:35:40 -0400192 true, /* immutable */
Behdad Esfahbodbe4560a2012-06-05 18:14:03 -0400193 {
194#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
195 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
196#undef HB_UNICODE_FUNC_IMPLEMENT
197 }
198};
199
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400200/**
201 * hb_unicode_funcs_get_empty:
202 *
203 *
204 *
205 * Return value: (transfer full):
206 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430207 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400208 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400209hb_unicode_funcs_t *
Behdad Esfahbod80a68332011-05-11 18:14:44 -0400210hb_unicode_funcs_get_empty (void)
211{
Behdad Esfahbodf06ab8a2012-06-05 12:31:51 -0400212 return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil);
Behdad Esfahbod80a68332011-05-11 18:14:44 -0400213}
214
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400215/**
216 * hb_unicode_funcs_reference: (skip)
217 * @ufuncs: Unicode functions.
218 *
219 *
220 *
221 * Return value: (transfer full):
222 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430223 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400224 **/
Behdad Esfahbod80a68332011-05-11 18:14:44 -0400225hb_unicode_funcs_t *
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400226hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
227{
Behdad Esfahbod47e71d92011-04-27 16:38:03 -0400228 return hb_object_reference (ufuncs);
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400229}
230
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400231/**
232 * hb_unicode_funcs_destroy: (skip)
233 * @ufuncs: Unicode functions.
234 *
235 *
236 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430237 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400238 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400239void
240hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
241{
Behdad Esfahbod47e71d92011-04-27 16:38:03 -0400242 if (!hb_object_destroy (ufuncs)) return;
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400243
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400244#define HB_UNICODE_FUNC_IMPLEMENT(name) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400245 if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
246 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
247#undef HB_UNICODE_FUNC_IMPLEMENT
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400248
Behdad Esfahbodc784c672011-05-02 15:59:57 -0400249 hb_unicode_funcs_destroy (ufuncs->parent);
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400250
251 free (ufuncs);
252}
253
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400254/**
255 * hb_unicode_funcs_set_user_data: (skip)
256 * @ufuncs: Unicode functions.
257 * @key:
258 * @data:
259 * @destroy:
260 * @replace:
261 *
262 *
263 *
264 * Return value:
265 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430266 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400267 **/
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400268hb_bool_t
269hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
270 hb_user_data_key_t *key,
271 void * data,
Behdad Esfahbod33ccc772011-08-09 00:43:24 +0200272 hb_destroy_func_t destroy,
273 hb_bool_t replace)
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400274{
Behdad Esfahbod33ccc772011-08-09 00:43:24 +0200275 return hb_object_set_user_data (ufuncs, key, data, destroy, replace);
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400276}
277
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400278/**
279 * hb_unicode_funcs_get_user_data: (skip)
280 * @ufuncs: Unicode functions.
281 * @key:
282 *
283 *
284 *
285 * Return value: (transfer none):
286 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430287 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400288 **/
Behdad Esfahbod5fa849b2011-04-27 21:46:01 -0400289void *
290hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
291 hb_user_data_key_t *key)
292{
293 return hb_object_get_user_data (ufuncs, key);
294}
295
296
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400297/**
298 * hb_unicode_funcs_make_immutable:
299 * @ufuncs: Unicode functions.
300 *
301 *
302 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430303 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400304 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400305void
306hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
307{
Behdad Esfahbod3f310dc2014-07-22 16:26:27 -0400308 if (unlikely (hb_object_is_inert (ufuncs)))
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400309 return;
310
Behdad Esfahbod0594a242012-06-05 20:35:40 -0400311 ufuncs->immutable = true;
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400312}
313
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400314/**
315 * hb_unicode_funcs_is_immutable:
316 * @ufuncs: Unicode functions.
317 *
318 *
319 *
320 * Return value:
321 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430322 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400323 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400324hb_bool_t
325hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
326{
327 return ufuncs->immutable;
328}
329
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400330/**
331 * hb_unicode_funcs_get_parent:
332 * @ufuncs: Unicode functions.
333 *
334 *
335 *
336 * Return value:
337 *
Behdad Esfahbodb8811422015-09-03 15:53:22 +0430338 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400339 **/
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400340hb_unicode_funcs_t *
341hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs)
342{
Behdad Esfahbodf06ab8a2012-06-05 12:31:51 -0400343 return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty ();
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400344}
345
346
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400347#define HB_UNICODE_FUNC_IMPLEMENT(name) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400348 \
349void \
350hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400351 hb_unicode_##name##_func_t func, \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400352 void *user_data, \
353 hb_destroy_func_t destroy) \
354{ \
355 if (ufuncs->immutable) \
356 return; \
357 \
358 if (ufuncs->destroy.name) \
359 ufuncs->destroy.name (ufuncs->user_data.name); \
360 \
361 if (func) { \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400362 ufuncs->func.name = func; \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400363 ufuncs->user_data.name = user_data; \
364 ufuncs->destroy.name = destroy; \
365 } else { \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400366 ufuncs->func.name = ufuncs->parent->func.name; \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400367 ufuncs->user_data.name = ufuncs->parent->user_data.name; \
368 ufuncs->destroy.name = NULL; \
369 } \
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400370}
371
Behdad Esfahbod74703152012-08-01 17:01:59 -0400372HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
Behdad Esfahbod891c4752011-07-07 23:19:27 -0400373#undef HB_UNICODE_FUNC_IMPLEMENT
374
375
376#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400377 \
378return_type \
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400379hb_unicode_##name (hb_unicode_funcs_t *ufuncs, \
380 hb_codepoint_t unicode) \
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400381{ \
Behdad Esfahbod74703152012-08-01 17:01:59 -0400382 return ufuncs->name (unicode); \
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400383}
Behdad Esfahbod74703152012-08-01 17:01:59 -0400384HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
Behdad Esfahbod4b6317c2011-07-07 23:14:42 -0400385#undef HB_UNICODE_FUNC_IMPLEMENT
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400386
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400387/**
388 * hb_unicode_compose:
389 * @ufuncs: Unicode functions.
390 * @a:
391 * @b:
392 * @ab: (out):
393 *
394 *
395 *
396 * Return value:
397 *
Sascha Brawer01c3a882015-06-01 13:22:01 +0200398 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400399 **/
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400400hb_bool_t
401hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
402 hb_codepoint_t a,
403 hb_codepoint_t b,
404 hb_codepoint_t *ab)
405{
Behdad Esfahbod74703152012-08-01 17:01:59 -0400406 return ufuncs->compose (a, b, ab);
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400407}
408
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400409/**
410 * hb_unicode_decompose:
411 * @ufuncs: Unicode functions.
412 * @ab:
413 * @a: (out):
414 * @b: (out):
415 *
416 *
417 *
418 * Return value:
419 *
Sascha Brawer01c3a882015-06-01 13:22:01 +0200420 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400421 **/
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400422hb_bool_t
423hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
424 hb_codepoint_t ab,
425 hb_codepoint_t *a,
426 hb_codepoint_t *b)
427{
Behdad Esfahbod74703152012-08-01 17:01:59 -0400428 return ufuncs->decompose (ab, a, b);
Behdad Esfahbodc4641722011-07-07 23:47:19 -0400429}
Behdad Esfahbodfb194b82011-04-20 02:00:47 -0400430
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400431/**
432 * hb_unicode_decompose_compatibility:
433 * @ufuncs: Unicode functions.
434 * @u:
435 * @decomposed: (out):
436 *
437 *
438 *
439 * Return value:
440 *
Sascha Brawer01c3a882015-06-01 13:22:01 +0200441 * Since: 0.9.2
Behdad Esfahbod288f2892013-09-06 15:40:22 -0400442 **/
Behdad Esfahbod378d2792012-07-31 21:36:16 -0400443unsigned int
444hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
445 hb_codepoint_t u,
446 hb_codepoint_t *decomposed)
447{
Behdad Esfahbod74703152012-08-01 17:01:59 -0400448 return ufuncs->decompose_compatibility (u, decomposed);
Behdad Esfahbod378d2792012-07-31 21:36:16 -0400449}
Behdad Esfahbod2db2a562012-04-05 16:40:37 -0400450
451
Behdad Esfahbod21756932012-08-08 01:20:45 -0400452/* See hb-unicode-private.hh for details. */
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400453const uint8_t
454_hb_modified_combining_class[256] =
Behdad Esfahbod2db2a562012-04-05 16:40:37 -0400455{
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400456 0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */
457 1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */
458 2, 3, 4, 5, 6,
459 7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */
460 8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */
461 9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */
Behdad Esfahbod2db2a562012-04-05 16:40:37 -0400462
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400463 /* Hebrew */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400464 HB_MODIFIED_COMBINING_CLASS_CCC10,
465 HB_MODIFIED_COMBINING_CLASS_CCC11,
466 HB_MODIFIED_COMBINING_CLASS_CCC12,
467 HB_MODIFIED_COMBINING_CLASS_CCC13,
468 HB_MODIFIED_COMBINING_CLASS_CCC14,
469 HB_MODIFIED_COMBINING_CLASS_CCC15,
470 HB_MODIFIED_COMBINING_CLASS_CCC16,
471 HB_MODIFIED_COMBINING_CLASS_CCC17,
472 HB_MODIFIED_COMBINING_CLASS_CCC18,
473 HB_MODIFIED_COMBINING_CLASS_CCC19,
474 HB_MODIFIED_COMBINING_CLASS_CCC20,
475 HB_MODIFIED_COMBINING_CLASS_CCC21,
476 HB_MODIFIED_COMBINING_CLASS_CCC22,
477 HB_MODIFIED_COMBINING_CLASS_CCC23,
478 HB_MODIFIED_COMBINING_CLASS_CCC24,
479 HB_MODIFIED_COMBINING_CLASS_CCC25,
480 HB_MODIFIED_COMBINING_CLASS_CCC26,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400481
482 /* Arabic */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400483 HB_MODIFIED_COMBINING_CLASS_CCC27,
484 HB_MODIFIED_COMBINING_CLASS_CCC28,
485 HB_MODIFIED_COMBINING_CLASS_CCC29,
486 HB_MODIFIED_COMBINING_CLASS_CCC30,
487 HB_MODIFIED_COMBINING_CLASS_CCC31,
488 HB_MODIFIED_COMBINING_CLASS_CCC32,
489 HB_MODIFIED_COMBINING_CLASS_CCC33,
490 HB_MODIFIED_COMBINING_CLASS_CCC34,
491 HB_MODIFIED_COMBINING_CLASS_CCC35,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400492
493 /* Syriac */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400494 HB_MODIFIED_COMBINING_CLASS_CCC36,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400495
496 37, 38, 39,
497 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
498 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
499 80, 81, 82, 83,
500
501 /* Telugu */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400502 HB_MODIFIED_COMBINING_CLASS_CCC84,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400503 85, 86, 87, 88, 89, 90,
Behdad Esfahbod21756932012-08-08 01:20:45 -0400504 HB_MODIFIED_COMBINING_CLASS_CCC91,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400505 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
506
507 /* Thai */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400508 HB_MODIFIED_COMBINING_CLASS_CCC103,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400509 104, 105, 106,
Behdad Esfahbod21756932012-08-08 01:20:45 -0400510 HB_MODIFIED_COMBINING_CLASS_CCC107,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400511 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
512
513 /* Lao */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400514 HB_MODIFIED_COMBINING_CLASS_CCC118,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400515 119, 120, 121,
Behdad Esfahbod21756932012-08-08 01:20:45 -0400516 HB_MODIFIED_COMBINING_CLASS_CCC122,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400517 123, 124, 125, 126, 127, 128,
518
519 /* Tibetan */
Behdad Esfahbod21756932012-08-08 01:20:45 -0400520 HB_MODIFIED_COMBINING_CLASS_CCC129,
521 HB_MODIFIED_COMBINING_CLASS_CCC130,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400522 131,
Behdad Esfahbod56c9e7c2012-08-09 21:12:30 -0400523 HB_MODIFIED_COMBINING_CLASS_CCC132,
Behdad Esfahbod6adf4172012-08-01 18:07:42 -0400524 133, 134, 135, 136, 137, 138, 139,
525
526
527 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
528 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
529 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
530 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
531 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
532 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
533
534 200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */
535 201,
536 202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */
537 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
538 214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */
539 215,
540 216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */
541 217,
542 218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */
543 219,
544 220, /* HB_UNICODE_COMBINING_CLASS_BELOW */
545 221,
546 222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */
547 223,
548 224, /* HB_UNICODE_COMBINING_CLASS_LEFT */
549 225,
550 226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */
551 227,
552 228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */
553 229,
554 230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */
555 231,
556 232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */
557 233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */
558 234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */
559 235, 236, 237, 238, 239,
560 240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */
561 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
562 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
563};