blob: b69eec680127374c791ee3ae0393795ee34936cd [file] [log] [blame]
Behdad Esfahbod5c441882009-08-10 20:05:16 -04001/*
2 * Copyright (C) 2009 Red Hat, Inc.
3 *
Behdad Esfahbodc755cb32010-04-22 00:11:43 -04004 * This is part of HarfBuzz, a text shaping library.
Behdad Esfahbod5c441882009-08-10 20:05:16 -04005 *
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
11 *
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16 * DAMAGE.
17 *
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23 *
24 * Red Hat Author(s): Behdad Esfahbod
25 */
26
27#include "hb-private.h"
28
29#include "hb-unicode-private.h"
30
Behdad Esfahbodacdba3f2010-07-23 15:11:18 -040031HB_BEGIN_DECLS
32
33
Behdad Esfahbod5c441882009-08-10 20:05:16 -040034/*
35 * hb_unicode_funcs_t
36 */
37
Behdad Esfahbod49f261d2009-08-10 23:35:05 -040038static hb_codepoint_t hb_unicode_get_mirroring_nil (hb_codepoint_t unicode) { return unicode; }
Behdad Esfahbod33d13fd2010-04-29 13:56:44 -040039static hb_category_t hb_unicode_get_general_category_nil (hb_codepoint_t unicode HB_UNUSED) { return HB_CATEGORY_OTHER_LETTER; }
40static hb_script_t hb_unicode_get_script_nil (hb_codepoint_t unicode HB_UNUSED) { return HB_SCRIPT_UNKNOWN; }
41static unsigned int hb_unicode_get_combining_class_nil (hb_codepoint_t unicode HB_UNUSED) { return 0; }
42static unsigned int hb_unicode_get_eastasian_width_nil (hb_codepoint_t unicode HB_UNUSED) { return 1; }
Behdad Esfahbod48910f82009-08-10 23:05:05 -040043
Behdad Esfahbodaf9e1042009-08-10 23:21:33 -040044hb_unicode_funcs_t _hb_unicode_funcs_nil = {
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -040045 HB_REFERENCE_COUNT_INVALID, /* ref_count */
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -040046 TRUE, /* immutable */
Behdad Esfahbodbf36a102010-05-24 17:46:21 +010047 {
48 hb_unicode_get_general_category_nil,
49 hb_unicode_get_combining_class_nil,
50 hb_unicode_get_mirroring_nil,
51 hb_unicode_get_script_nil,
52 hb_unicode_get_eastasian_width_nil
53 }
Behdad Esfahbod5c441882009-08-10 20:05:16 -040054};
55
56hb_unicode_funcs_t *
57hb_unicode_funcs_create (void)
58{
59 hb_unicode_funcs_t *ufuncs;
60
61 if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
62 return &_hb_unicode_funcs_nil;
63
Behdad Esfahbodf97bf4f2010-05-24 17:50:19 +010064 ufuncs->v = _hb_unicode_funcs_nil.v;
Behdad Esfahbod48910f82009-08-10 23:05:05 -040065
Behdad Esfahbod5c441882009-08-10 20:05:16 -040066 return ufuncs;
67}
68
69hb_unicode_funcs_t *
70hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
71{
72 HB_OBJECT_DO_REFERENCE (ufuncs);
73}
74
75unsigned int
76hb_unicode_funcs_get_reference_count (hb_unicode_funcs_t *ufuncs)
77{
78 HB_OBJECT_DO_GET_REFERENCE_COUNT (ufuncs);
79}
80
81void
82hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
83{
84 HB_OBJECT_DO_DESTROY (ufuncs);
85
86 free (ufuncs);
87}
88
89hb_unicode_funcs_t *
90hb_unicode_funcs_copy (hb_unicode_funcs_t *other_ufuncs)
91{
92 hb_unicode_funcs_t *ufuncs;
93
94 if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
95 return &_hb_unicode_funcs_nil;
96
Behdad Esfahbodf97bf4f2010-05-24 17:50:19 +010097 ufuncs->v = other_ufuncs->v;
Behdad Esfahbod5c441882009-08-10 20:05:16 -040098
99 return ufuncs;
100}
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400101
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400102void
103hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
104{
105 if (HB_OBJECT_IS_INERT (ufuncs))
106 return;
107
108 ufuncs->immutable = TRUE;
109}
110
Behdad Esfahbod645f6f22010-10-04 17:01:01 -0400111hb_bool_t
112hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
113{
114 return ufuncs->immutable;
115}
116
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400117
118void
Behdad Esfahbod49f261d2009-08-10 23:35:05 -0400119hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
120 hb_unicode_get_mirroring_func_t mirroring_func)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400121{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400122 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400123 return;
124
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100125 ufuncs->v.get_mirroring = mirroring_func ? mirroring_func : hb_unicode_get_mirroring_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400126}
127
128void
129hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
130 hb_unicode_get_general_category_func_t general_category_func)
131{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400132 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400133 return;
134
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100135 ufuncs->v.get_general_category = general_category_func ? general_category_func : hb_unicode_get_general_category_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400136}
137
138void
139hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
140 hb_unicode_get_script_func_t script_func)
141{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400142 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400143 return;
144
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100145 ufuncs->v.get_script = script_func ? script_func : hb_unicode_get_script_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400146}
147
148void
149hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
150 hb_unicode_get_combining_class_func_t combining_class_func)
151{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400152 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400153 return;
154
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100155 ufuncs->v.get_combining_class = combining_class_func ? combining_class_func : hb_unicode_get_combining_class_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400156}
157
158void
159hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
160 hb_unicode_get_eastasian_width_func_t eastasian_width_func)
161{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400162 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400163 return;
164
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100165 ufuncs->v.get_eastasian_width = eastasian_width_func ? eastasian_width_func : hb_unicode_get_eastasian_width_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400166}
167
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500168
Behdad Esfahbod19c0eab2010-10-04 16:45:21 -0400169hb_unicode_get_mirroring_func_t
170hb_unicode_funcs_get_mirroring_func (hb_unicode_funcs_t *ufuncs)
171{
172 return ufuncs->v.get_mirroring;
173}
174
175hb_unicode_get_general_category_func_t
176hb_unicode_funcs_get_general_category_func (hb_unicode_funcs_t *ufuncs)
177{
178 return ufuncs->v.get_general_category;
179}
180
181hb_unicode_get_script_func_t
182hb_unicode_funcs_get_script_func (hb_unicode_funcs_t *ufuncs)
183{
184 return ufuncs->v.get_script;
185}
186
187hb_unicode_get_combining_class_func_t
188hb_unicode_funcs_get_combining_class_func (hb_unicode_funcs_t *ufuncs)
189{
190 return ufuncs->v.get_combining_class;
191}
192
193hb_unicode_get_eastasian_width_func_t
194hb_unicode_funcs_get_eastasian_width_func (hb_unicode_funcs_t *ufuncs)
195{
196 return ufuncs->v.get_eastasian_width;
197}
198
199
200
Behdad Esfahbod5ceefa12009-12-20 15:29:16 +0100201hb_codepoint_t
202hb_unicode_get_mirroring (hb_unicode_funcs_t *ufuncs,
203 hb_codepoint_t unicode)
204{
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100205 return ufuncs->v.get_mirroring (unicode);
Behdad Esfahbod5ceefa12009-12-20 15:29:16 +0100206}
207
208hb_category_t
209hb_unicode_get_general_category (hb_unicode_funcs_t *ufuncs,
210 hb_codepoint_t unicode)
211{
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100212 return ufuncs->v.get_general_category (unicode);
Behdad Esfahbod5ceefa12009-12-20 15:29:16 +0100213}
214
215hb_script_t
216hb_unicode_get_script (hb_unicode_funcs_t *ufuncs,
217 hb_codepoint_t unicode)
218{
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100219 return ufuncs->v.get_script (unicode);
Behdad Esfahbod5ceefa12009-12-20 15:29:16 +0100220}
221
222unsigned int
223hb_unicode_get_combining_class (hb_unicode_funcs_t *ufuncs,
224 hb_codepoint_t unicode)
225{
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100226 return ufuncs->v.get_combining_class (unicode);
Behdad Esfahbod5ceefa12009-12-20 15:29:16 +0100227}
228
229unsigned int
230hb_unicode_get_eastasian_width (hb_unicode_funcs_t *ufuncs,
231 hb_codepoint_t unicode)
232{
Behdad Esfahbodbf36a102010-05-24 17:46:21 +0100233 return ufuncs->v.get_eastasian_width (unicode);
Behdad Esfahbod5ceefa12009-12-20 15:29:16 +0100234}
235
236
Behdad Esfahbod5d91c3d2011-03-16 17:36:32 -0300237/* hb_script_t */
238
239static const hb_tag_t script_to_iso15924_tag[] =
240{
241 HB_TAG('Z','y','y','y'), /* HB_SCRIPT_COMMON */
242 HB_TAG('Q','a','a','i'), /* HB_SCRIPT_INHERITED */
243 HB_TAG('A','r','a','b'), /* HB_SCRIPT_ARABIC */
244 HB_TAG('A','r','m','n'), /* HB_SCRIPT_ARMENIAN */
245 HB_TAG('B','e','n','g'), /* HB_SCRIPT_BENGALI */
246 HB_TAG('B','o','p','o'), /* HB_SCRIPT_BOPOMOFO */
247 HB_TAG('C','h','e','r'), /* HB_SCRIPT_CHEROKEE */
248 HB_TAG('Q','a','a','c'), /* HB_SCRIPT_COPTIC */
249 HB_TAG('C','y','r','l'), /* HB_SCRIPT_CYRILLIC */
250 HB_TAG('D','s','r','t'), /* HB_SCRIPT_DESERET */
251 HB_TAG('D','e','v','a'), /* HB_SCRIPT_DEVANAGARI */
252 HB_TAG('E','t','h','i'), /* HB_SCRIPT_ETHIOPIC */
253 HB_TAG('G','e','o','r'), /* HB_SCRIPT_GEORGIAN */
254 HB_TAG('G','o','t','h'), /* HB_SCRIPT_GOTHIC */
255 HB_TAG('G','r','e','k'), /* HB_SCRIPT_GREEK */
256 HB_TAG('G','u','j','r'), /* HB_SCRIPT_GUJARATI */
257 HB_TAG('G','u','r','u'), /* HB_SCRIPT_GURMUKHI */
258 HB_TAG('H','a','n','i'), /* HB_SCRIPT_HAN */
259 HB_TAG('H','a','n','g'), /* HB_SCRIPT_HANGUL */
260 HB_TAG('H','e','b','r'), /* HB_SCRIPT_HEBREW */
261 HB_TAG('H','i','r','a'), /* HB_SCRIPT_HIRAGANA */
262 HB_TAG('K','n','d','a'), /* HB_SCRIPT_KANNADA */
263 HB_TAG('K','a','n','a'), /* HB_SCRIPT_KATAKANA */
264 HB_TAG('K','h','m','r'), /* HB_SCRIPT_KHMER */
265 HB_TAG('L','a','o','o'), /* HB_SCRIPT_LAO */
266 HB_TAG('L','a','t','n'), /* HB_SCRIPT_LATIN */
267 HB_TAG('M','l','y','m'), /* HB_SCRIPT_MALAYALAM */
268 HB_TAG('M','o','n','g'), /* HB_SCRIPT_MONGOLIAN */
269 HB_TAG('M','y','m','r'), /* HB_SCRIPT_MYANMAR */
270 HB_TAG('O','g','a','m'), /* HB_SCRIPT_OGHAM */
271 HB_TAG('I','t','a','l'), /* HB_SCRIPT_OLD_ITALIC */
272 HB_TAG('O','r','y','a'), /* HB_SCRIPT_ORIYA */
273 HB_TAG('R','u','n','r'), /* HB_SCRIPT_RUNIC */
274 HB_TAG('S','i','n','h'), /* HB_SCRIPT_SINHALA */
275 HB_TAG('S','y','r','c'), /* HB_SCRIPT_SYRIAC */
276 HB_TAG('T','a','m','l'), /* HB_SCRIPT_TAMIL */
277 HB_TAG('T','e','l','u'), /* HB_SCRIPT_TELUGU */
278 HB_TAG('T','h','a','a'), /* HB_SCRIPT_THAANA */
279 HB_TAG('T','h','a','i'), /* HB_SCRIPT_THAI */
280 HB_TAG('T','i','b','t'), /* HB_SCRIPT_TIBETAN */
281 HB_TAG('C','a','n','s'), /* HB_SCRIPT_CANADIAN_ABORIGINAL */
282 HB_TAG('Y','i','i','i'), /* HB_SCRIPT_YI */
283 HB_TAG('T','g','l','g'), /* HB_SCRIPT_TAGALOG */
284 HB_TAG('H','a','n','o'), /* HB_SCRIPT_HANUNOO */
285 HB_TAG('B','u','h','d'), /* HB_SCRIPT_BUHID */
286 HB_TAG('T','a','g','b'), /* HB_SCRIPT_TAGBANWA */
287
288 /* Unicode-4.0 additions */
289 HB_TAG('B','r','a','i'), /* HB_SCRIPT_BRAILLE */
290 HB_TAG('C','p','r','t'), /* HB_SCRIPT_CYPRIOT */
291 HB_TAG('L','i','m','b'), /* HB_SCRIPT_LIMBU */
292 HB_TAG('O','s','m','a'), /* HB_SCRIPT_OSMANYA */
293 HB_TAG('S','h','a','w'), /* HB_SCRIPT_SHAVIAN */
294 HB_TAG('L','i','n','b'), /* HB_SCRIPT_LINEAR_B */
295 HB_TAG('T','a','l','e'), /* HB_SCRIPT_TAI_LE */
296 HB_TAG('U','g','a','r'), /* HB_SCRIPT_UGARITIC */
297
298 /* Unicode-4.1 additions */
299 HB_TAG('T','a','l','u'), /* HB_SCRIPT_NEW_TAI_LUE */
300 HB_TAG('B','u','g','i'), /* HB_SCRIPT_BUGINESE */
301 HB_TAG('G','l','a','g'), /* HB_SCRIPT_GLAGOLITIC */
302 HB_TAG('T','f','n','g'), /* HB_SCRIPT_TIFINAGH */
303 HB_TAG('S','y','l','o'), /* HB_SCRIPT_SYLOTI_NAGRI */
304 HB_TAG('X','p','e','o'), /* HB_SCRIPT_OLD_PERSIAN */
305 HB_TAG('K','h','a','r'), /* HB_SCRIPT_KHAROSHTHI */
306
307 /* Unicode-5.0 additions */
308 HB_TAG('Z','z','z','z'), /* HB_SCRIPT_UNKNOWN */
309 HB_TAG('B','a','l','i'), /* HB_SCRIPT_BALINESE */
310 HB_TAG('X','s','u','x'), /* HB_SCRIPT_CUNEIFORM */
311 HB_TAG('P','h','n','x'), /* HB_SCRIPT_PHOENICIAN */
312 HB_TAG('P','h','a','g'), /* HB_SCRIPT_PHAGS_PA */
313 HB_TAG('N','k','o','o'), /* HB_SCRIPT_NKO */
314
315 /* Unicode-5.1 additions */
316 HB_TAG('K','a','l','i'), /* HB_SCRIPT_KAYAH_LI */
317 HB_TAG('L','e','p','c'), /* HB_SCRIPT_LEPCHA */
318 HB_TAG('R','j','n','g'), /* HB_SCRIPT_REJANG */
319 HB_TAG('S','u','n','d'), /* HB_SCRIPT_SUNDANESE */
320 HB_TAG('S','a','u','r'), /* HB_SCRIPT_SAURASHTRA */
321 HB_TAG('C','h','a','m'), /* HB_SCRIPT_CHAM */
322 HB_TAG('O','l','c','k'), /* HB_SCRIPT_OL_CHIKI */
323 HB_TAG('V','a','i','i'), /* HB_SCRIPT_VAI */
324 HB_TAG('C','a','r','i'), /* HB_SCRIPT_CARIAN */
325 HB_TAG('L','y','c','i'), /* HB_SCRIPT_LYCIAN */
326 HB_TAG('L','y','d','i'), /* HB_SCRIPT_LYDIAN */
327
328 /* Unicode-5.2 additions */
329 HB_TAG('A','v','s','t'), /* HB_SCRIPT_AVESTAN */
330 HB_TAG('B','a','m','u'), /* HB_SCRIPT_BAMUM */
331 HB_TAG('E','g','y','p'), /* HB_SCRIPT_EGYPTIAN_HIEROGLYPHS */
332 HB_TAG('A','r','m','i'), /* HB_SCRIPT_IMPERIAL_ARAMAIC */
333 HB_TAG('P','h','l','i'), /* HB_SCRIPT_INSCRIPTIONAL_PAHLAVI */
334 HB_TAG('P','r','t','i'), /* HB_SCRIPT_INSCRIPTIONAL_PARTHIAN */
335 HB_TAG('J','a','v','a'), /* HB_SCRIPT_JAVANESE */
336 HB_TAG('K','t','h','i'), /* HB_SCRIPT_KAITHI */
337 HB_TAG('L','i','s','u'), /* HB_SCRIPT_LISU */
338 HB_TAG('M','t','e','i'), /* HB_SCRIPT_MEETEI_MAYEK */
339 HB_TAG('S','a','r','b'), /* HB_SCRIPT_OLD_SOUTH_ARABIAN */
340 HB_TAG('O','r','k','h'), /* HB_SCRIPT_OLD_TURKIC */
341 HB_TAG('S','a','m','r'), /* HB_SCRIPT_SAMARITAN */
342 HB_TAG('L','a','n','a'), /* HB_SCRIPT_TAI_THAM */
343 HB_TAG('T','a','v','t'), /* HB_SCRIPT_TAI_VIET */
344
345 /* Unicode-6.0 additions */
346 HB_TAG('B','a','t','k'), /* HB_SCRIPT_BATAK */
347 HB_TAG('B','r','a','h'), /* HB_SCRIPT_BRAHMI */
348 HB_TAG('M','a','n','d') /* HB_SCRIPT_MANDAIC */
349};
350
351struct tag_script_pair {
352 hb_tag_t tag;
353 hb_script_t script;
354};
355static const struct tag_script_pair script_from_iso15924_tag[] =
356{
357 {HB_TAG('A','r','a','b'), HB_SCRIPT_ARABIC},
358 {HB_TAG('A','r','m','i'), HB_SCRIPT_IMPERIAL_ARAMAIC},
359 {HB_TAG('A','r','m','n'), HB_SCRIPT_ARMENIAN},
360 {HB_TAG('A','v','s','t'), HB_SCRIPT_AVESTAN},
361 {HB_TAG('B','a','l','i'), HB_SCRIPT_BALINESE},
362 {HB_TAG('B','a','m','u'), HB_SCRIPT_BAMUM},
363 {HB_TAG('B','a','t','k'), HB_SCRIPT_BATAK},
364 {HB_TAG('B','e','n','g'), HB_SCRIPT_BENGALI},
365 {HB_TAG('B','o','p','o'), HB_SCRIPT_BOPOMOFO},
366 {HB_TAG('B','r','a','h'), HB_SCRIPT_BRAHMI},
367 {HB_TAG('B','r','a','i'), HB_SCRIPT_BRAILLE},
368 {HB_TAG('B','u','g','i'), HB_SCRIPT_BUGINESE},
369 {HB_TAG('B','u','h','d'), HB_SCRIPT_BUHID},
370 {HB_TAG('C','a','n','s'), HB_SCRIPT_CANADIAN_ABORIGINAL},
371 {HB_TAG('C','a','r','i'), HB_SCRIPT_CARIAN},
372 {HB_TAG('C','h','a','m'), HB_SCRIPT_CHAM},
373 {HB_TAG('C','h','e','r'), HB_SCRIPT_CHEROKEE},
374 {HB_TAG('C','p','r','t'), HB_SCRIPT_CYPRIOT},
375 {HB_TAG('C','y','r','l'), HB_SCRIPT_CYRILLIC},
376 {HB_TAG('C','y','r','s'), HB_SCRIPT_CYRILLIC},
377 {HB_TAG('D','e','v','a'), HB_SCRIPT_DEVANAGARI},
378 {HB_TAG('D','s','r','t'), HB_SCRIPT_DESERET},
379 {HB_TAG('E','g','y','p'), HB_SCRIPT_EGYPTIAN_HIEROGLYPHS},
380 {HB_TAG('E','t','h','i'), HB_SCRIPT_ETHIOPIC},
381 {HB_TAG('G','e','o','a'), HB_SCRIPT_GEORGIAN},
382 {HB_TAG('G','e','o','n'), HB_SCRIPT_GEORGIAN},
383 {HB_TAG('G','e','o','r'), HB_SCRIPT_GEORGIAN},
384 {HB_TAG('G','l','a','g'), HB_SCRIPT_GLAGOLITIC},
385 {HB_TAG('G','o','t','h'), HB_SCRIPT_GOTHIC},
386 {HB_TAG('G','r','e','k'), HB_SCRIPT_GREEK},
387 {HB_TAG('G','u','j','r'), HB_SCRIPT_GUJARATI},
388 {HB_TAG('G','u','r','u'), HB_SCRIPT_GURMUKHI},
389 {HB_TAG('H','a','n','g'), HB_SCRIPT_HANGUL},
390 {HB_TAG('H','a','n','i'), HB_SCRIPT_HAN},
391 {HB_TAG('H','a','n','o'), HB_SCRIPT_HANUNOO},
392 {HB_TAG('H','e','b','r'), HB_SCRIPT_HEBREW},
393 {HB_TAG('H','i','r','a'), HB_SCRIPT_HIRAGANA},
394 {HB_TAG('I','t','a','l'), HB_SCRIPT_OLD_ITALIC},
395 {HB_TAG('J','a','v','a'), HB_SCRIPT_JAVANESE},
396 {HB_TAG('K','a','l','i'), HB_SCRIPT_KAYAH_LI},
397 {HB_TAG('K','a','n','a'), HB_SCRIPT_KATAKANA},
398 {HB_TAG('K','h','a','r'), HB_SCRIPT_KHAROSHTHI},
399 {HB_TAG('K','h','m','r'), HB_SCRIPT_KHMER},
400 {HB_TAG('K','n','d','a'), HB_SCRIPT_KANNADA},
401 {HB_TAG('K','t','h','i'), HB_SCRIPT_KAITHI},
402 {HB_TAG('L','a','n','a'), HB_SCRIPT_TAI_THAM},
403 {HB_TAG('L','a','o','o'), HB_SCRIPT_LAO},
404 {HB_TAG('L','a','t','f'), HB_SCRIPT_LATIN},
405 {HB_TAG('L','a','t','g'), HB_SCRIPT_LATIN},
406 {HB_TAG('L','a','t','n'), HB_SCRIPT_LATIN},
407 {HB_TAG('L','e','p','c'), HB_SCRIPT_LEPCHA},
408 {HB_TAG('L','i','m','b'), HB_SCRIPT_LIMBU},
409 {HB_TAG('L','i','n','b'), HB_SCRIPT_LINEAR_B},
410 {HB_TAG('L','i','s','u'), HB_SCRIPT_LISU},
411 {HB_TAG('L','y','c','i'), HB_SCRIPT_LYCIAN},
412 {HB_TAG('L','y','d','i'), HB_SCRIPT_LYDIAN},
413 {HB_TAG('M','a','n','d'), HB_SCRIPT_MANDAIC},
414 {HB_TAG('M','l','y','m'), HB_SCRIPT_MALAYALAM},
415 {HB_TAG('M','o','n','g'), HB_SCRIPT_MONGOLIAN},
416 {HB_TAG('M','t','e','i'), HB_SCRIPT_MEETEI_MAYEK},
417 {HB_TAG('M','y','m','r'), HB_SCRIPT_MYANMAR},
418 {HB_TAG('N','k','o','o'), HB_SCRIPT_NKO},
419 {HB_TAG('O','g','a','m'), HB_SCRIPT_OGHAM},
420 {HB_TAG('O','l','c','k'), HB_SCRIPT_OL_CHIKI},
421 {HB_TAG('O','r','k','h'), HB_SCRIPT_OLD_TURKIC},
422 {HB_TAG('O','r','y','a'), HB_SCRIPT_ORIYA},
423 {HB_TAG('O','s','m','a'), HB_SCRIPT_OSMANYA},
424 {HB_TAG('P','h','a','g'), HB_SCRIPT_PHAGS_PA},
425 {HB_TAG('P','h','l','i'), HB_SCRIPT_INSCRIPTIONAL_PAHLAVI},
426 {HB_TAG('P','h','n','x'), HB_SCRIPT_PHOENICIAN},
427 {HB_TAG('P','r','t','i'), HB_SCRIPT_INSCRIPTIONAL_PARTHIAN},
428 {HB_TAG('Q','a','a','c'), HB_SCRIPT_COPTIC},
429 {HB_TAG('Q','a','a','i'), HB_SCRIPT_INHERITED},
430 {HB_TAG('R','j','n','g'), HB_SCRIPT_REJANG},
431 {HB_TAG('R','u','n','r'), HB_SCRIPT_RUNIC},
432 {HB_TAG('S','a','m','r'), HB_SCRIPT_SAMARITAN},
433 {HB_TAG('S','a','r','b'), HB_SCRIPT_OLD_SOUTH_ARABIAN},
434 {HB_TAG('S','a','u','r'), HB_SCRIPT_SAURASHTRA},
435 {HB_TAG('S','h','a','w'), HB_SCRIPT_SHAVIAN},
436 {HB_TAG('S','i','n','h'), HB_SCRIPT_SINHALA},
437 {HB_TAG('S','u','n','d'), HB_SCRIPT_SUNDANESE},
438 {HB_TAG('S','y','l','o'), HB_SCRIPT_SYLOTI_NAGRI},
439 {HB_TAG('S','y','r','c'), HB_SCRIPT_SYRIAC},
440 {HB_TAG('S','y','r','e'), HB_SCRIPT_SYRIAC},
441 {HB_TAG('S','y','r','n'), HB_SCRIPT_SYRIAC},
442 {HB_TAG('T','a','g','b'), HB_SCRIPT_TAGBANWA},
443 {HB_TAG('T','a','l','e'), HB_SCRIPT_TAI_LE},
444 {HB_TAG('T','a','l','u'), HB_SCRIPT_NEW_TAI_LUE},
445 {HB_TAG('T','a','m','l'), HB_SCRIPT_TAMIL},
446 {HB_TAG('T','a','v','t'), HB_SCRIPT_TAI_VIET},
447 {HB_TAG('T','e','l','u'), HB_SCRIPT_TELUGU},
448 {HB_TAG('T','f','n','g'), HB_SCRIPT_TIFINAGH},
449 {HB_TAG('T','g','l','g'), HB_SCRIPT_TAGALOG},
450 {HB_TAG('T','h','a','a'), HB_SCRIPT_THAANA},
451 {HB_TAG('T','h','a','i'), HB_SCRIPT_THAI},
452 {HB_TAG('T','i','b','t'), HB_SCRIPT_TIBETAN},
453 {HB_TAG('U','g','a','r'), HB_SCRIPT_UGARITIC},
454 {HB_TAG('V','a','i','i'), HB_SCRIPT_VAI},
455 {HB_TAG('X','p','e','o'), HB_SCRIPT_OLD_PERSIAN},
456 {HB_TAG('X','s','u','x'), HB_SCRIPT_CUNEIFORM},
457 {HB_TAG('Y','i','i','i'), HB_SCRIPT_YI},
458 {HB_TAG('Z','y','y','y'), HB_SCRIPT_COMMON},
459 {HB_TAG('Z','z','z','z'), HB_SCRIPT_UNKNOWN}
460};
461
462static int
463_tag_cmp (hb_tag_t *pa, hb_tag_t *pb)
464{
465 hb_tag_t a = *pa, b = *pb;
466 return a < b ? -1 : a == b ? 0 : +1;
467}
468
469
470hb_script_t
471hb_script_from_iso15924_tag (hb_tag_t tag)
472{
473 const struct tag_script_pair *pair;
474
475 /* Be lenient, adjust case (one capital letter followed by three small letters) */
476 tag = (tag & 0xDFDFDFDF) | 0x00202020;
477
478 pair = (const struct tag_script_pair *) bsearch (&tag,
479 script_from_iso15924_tag,
480 ARRAY_LENGTH (script_from_iso15924_tag),
481 sizeof (script_from_iso15924_tag[0]),
482 (hb_compare_func_t) _tag_cmp);
483
484 if (pair)
485 return pair->script;
486
487 /* If it looks right, just use the tag as a script */
488 if (((uint32_t) tag & 0xE0E0E0E0) == 0x40606060)
489 return (hb_script_t) tag;
490
491 /* Otherwise, return unknown */
492 return HB_SCRIPT_UNKNOWN;
493}
494
495hb_tag_t
496hb_script_to_iso15924_tag (hb_script_t script)
497{
498 if (likely ((unsigned int) script < ARRAY_LENGTH (script_to_iso15924_tag)))
499 return script_to_iso15924_tag[script];
500
501 /* if script is of the right shape (one capital letter followed by three small letters),
502 * return as is. */
503 if (((uint32_t) script & 0xE0E0E0E0) == 0x40606060)
504 return (hb_tag_t) script;
505
506 /* Otherwise, we don't know what that is */
507 return script_to_iso15924_tag[HB_SCRIPT_UNKNOWN];
508}
509
Behdad Esfahbod5ceefa12009-12-20 15:29:16 +0100510
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500511#define LTR HB_DIRECTION_LTR
512#define RTL HB_DIRECTION_RTL
513const hb_direction_t horiz_dir[] =
514{
515 LTR, /* Zyyy */
516 LTR, /* Qaai */
517 RTL, /* Arab */
518 LTR, /* Armn */
519 LTR, /* Beng */
520 LTR, /* Bopo */
521 LTR, /* Cher */
522 LTR, /* Qaac */
523 LTR, /* Cyrl (Cyrs) */
524 LTR, /* Dsrt */
525 LTR, /* Deva */
526 LTR, /* Ethi */
527 LTR, /* Geor (Geon, Geoa) */
528 LTR, /* Goth */
529 LTR, /* Grek */
530 LTR, /* Gujr */
531 LTR, /* Guru */
532 LTR, /* Hani */
533 LTR, /* Hang */
534 RTL, /* Hebr */
535 LTR, /* Hira */
536 LTR, /* Knda */
537 LTR, /* Kana */
538 LTR, /* Khmr */
539 LTR, /* Laoo */
540 LTR, /* Latn (Latf, Latg) */
541 LTR, /* Mlym */
542 LTR, /* Mong */
543 LTR, /* Mymr */
544 LTR, /* Ogam */
545 LTR, /* Ital */
546 LTR, /* Orya */
547 LTR, /* Runr */
548 LTR, /* Sinh */
549 RTL, /* Syrc (Syrj, Syrn, Syre) */
550 LTR, /* Taml */
551 LTR, /* Telu */
552 RTL, /* Thaa */
553 LTR, /* Thai */
554 LTR, /* Tibt */
555 LTR, /* Cans */
556 LTR, /* Yiii */
557 LTR, /* Tglg */
558 LTR, /* Hano */
559 LTR, /* Buhd */
560 LTR, /* Tagb */
561
562 /* Unicode-4.0 additions */
563 LTR, /* Brai */
Behdad Esfahbod93ac7092010-05-26 16:22:00 -0400564 RTL, /* Cprt */
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500565 LTR, /* Limb */
566 LTR, /* Osma */
567 LTR, /* Shaw */
568 LTR, /* Linb */
569 LTR, /* Tale */
570 LTR, /* Ugar */
571
572 /* Unicode-4.1 additions */
573 LTR, /* Talu */
574 LTR, /* Bugi */
575 LTR, /* Glag */
576 LTR, /* Tfng */
577 LTR, /* Sylo */
578 LTR, /* Xpeo */
579 LTR, /* Khar */
580
581 /* Unicode-5.0 additions */
582 LTR, /* Zzzz */
583 LTR, /* Bali */
584 LTR, /* Xsux */
585 RTL, /* Phnx */
586 LTR, /* Phag */
587 RTL, /* Nkoo */
588
589 /* Unicode-5.1 additions */
590 LTR, /* Kali */
591 LTR, /* Lepc */
592 LTR, /* Rjng */
593 LTR, /* Sund */
594 LTR, /* Saur */
595 LTR, /* Cham */
596 LTR, /* Olck */
597 LTR, /* Vaii */
598 LTR, /* Cari */
599 LTR, /* Lyci */
Behdad Esfahbod4fa67f32010-05-21 13:29:12 +0100600 LTR, /* Lydi */
601
602 /* Unicode-5.2 additions */
603 RTL, /* Avst */
604 LTR, /* Bamu */
605 LTR, /* Egyp */
606 RTL, /* Armi */
607 RTL, /* Phli */
608 RTL, /* Prti */
609 LTR, /* Java */
610 LTR, /* Kthi */
611 LTR, /* Lisu */
612 LTR, /* Mtei */
613 RTL, /* Sarb */
614 RTL, /* Orkh */
615 RTL, /* Samr */
616 LTR, /* Lana */
Behdad Esfahbodafab01c2010-11-17 14:35:34 -0500617 LTR, /* Tavt */
618
619 /* Unicode-6.0 additions */
620 LTR, /* Batk */
621 LTR, /* Brah */
622 RTL /* Mand */
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500623};
624#undef LTR
625#undef RTL
626
Behdad Esfahbod11a81612010-05-13 00:01:40 -0400627hb_direction_t
Behdad Esfahbod3286fc02011-03-16 14:53:32 -0300628hb_script_get_horizontal_direction (hb_script_t script)
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500629{
Behdad Esfahbod64d3fc82010-05-03 22:51:19 -0400630 if (unlikely ((unsigned int) script >= ARRAY_LENGTH (horiz_dir)))
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500631 return HB_DIRECTION_LTR;
632
633 return horiz_dir[script];
634}
Behdad Esfahbodacdba3f2010-07-23 15:11:18 -0400635
636
637HB_END_DECLS