Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2009 Red Hat, Inc. |
| 3 | * |
Behdad Esfahbod | c755cb3 | 2010-04-22 00:11:43 -0400 | [diff] [blame] | 4 | * This is part of HarfBuzz, a text shaping library. |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 5 | * |
| 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 Esfahbod | acdba3f | 2010-07-23 15:11:18 -0400 | [diff] [blame] | 31 | HB_BEGIN_DECLS |
| 32 | |
| 33 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 34 | /* |
| 35 | * hb_unicode_funcs_t |
| 36 | */ |
| 37 | |
Behdad Esfahbod | 49f261d | 2009-08-10 23:35:05 -0400 | [diff] [blame] | 38 | static hb_codepoint_t hb_unicode_get_mirroring_nil (hb_codepoint_t unicode) { return unicode; } |
Behdad Esfahbod | 33d13fd | 2010-04-29 13:56:44 -0400 | [diff] [blame] | 39 | static hb_category_t hb_unicode_get_general_category_nil (hb_codepoint_t unicode HB_UNUSED) { return HB_CATEGORY_OTHER_LETTER; } |
| 40 | static hb_script_t hb_unicode_get_script_nil (hb_codepoint_t unicode HB_UNUSED) { return HB_SCRIPT_UNKNOWN; } |
| 41 | static unsigned int hb_unicode_get_combining_class_nil (hb_codepoint_t unicode HB_UNUSED) { return 0; } |
| 42 | static unsigned int hb_unicode_get_eastasian_width_nil (hb_codepoint_t unicode HB_UNUSED) { return 1; } |
Behdad Esfahbod | 48910f8 | 2009-08-10 23:05:05 -0400 | [diff] [blame] | 43 | |
Behdad Esfahbod | af9e104 | 2009-08-10 23:21:33 -0400 | [diff] [blame] | 44 | hb_unicode_funcs_t _hb_unicode_funcs_nil = { |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 45 | HB_REFERENCE_COUNT_INVALID, /* ref_count */ |
Behdad Esfahbod | eb27ec0 | 2009-08-10 23:25:28 -0400 | [diff] [blame] | 46 | TRUE, /* immutable */ |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 47 | { |
| 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 Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 54 | }; |
| 55 | |
| 56 | hb_unicode_funcs_t * |
| 57 | hb_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 Esfahbod | f97bf4f | 2010-05-24 17:50:19 +0100 | [diff] [blame] | 64 | ufuncs->v = _hb_unicode_funcs_nil.v; |
Behdad Esfahbod | 48910f8 | 2009-08-10 23:05:05 -0400 | [diff] [blame] | 65 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 66 | return ufuncs; |
| 67 | } |
| 68 | |
| 69 | hb_unicode_funcs_t * |
| 70 | hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs) |
| 71 | { |
| 72 | HB_OBJECT_DO_REFERENCE (ufuncs); |
| 73 | } |
| 74 | |
| 75 | unsigned int |
| 76 | hb_unicode_funcs_get_reference_count (hb_unicode_funcs_t *ufuncs) |
| 77 | { |
| 78 | HB_OBJECT_DO_GET_REFERENCE_COUNT (ufuncs); |
| 79 | } |
| 80 | |
| 81 | void |
| 82 | hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs) |
| 83 | { |
| 84 | HB_OBJECT_DO_DESTROY (ufuncs); |
| 85 | |
| 86 | free (ufuncs); |
| 87 | } |
| 88 | |
| 89 | hb_unicode_funcs_t * |
| 90 | hb_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 Esfahbod | f97bf4f | 2010-05-24 17:50:19 +0100 | [diff] [blame] | 97 | ufuncs->v = other_ufuncs->v; |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 98 | |
| 99 | return ufuncs; |
| 100 | } |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 101 | |
Behdad Esfahbod | eb27ec0 | 2009-08-10 23:25:28 -0400 | [diff] [blame] | 102 | void |
| 103 | hb_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 Esfahbod | 645f6f2 | 2010-10-04 17:01:01 -0400 | [diff] [blame] | 111 | hb_bool_t |
| 112 | hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs) |
| 113 | { |
| 114 | return ufuncs->immutable; |
| 115 | } |
| 116 | |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 117 | |
| 118 | void |
Behdad Esfahbod | 49f261d | 2009-08-10 23:35:05 -0400 | [diff] [blame] | 119 | hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs, |
| 120 | hb_unicode_get_mirroring_func_t mirroring_func) |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 121 | { |
Behdad Esfahbod | eb27ec0 | 2009-08-10 23:25:28 -0400 | [diff] [blame] | 122 | if (ufuncs->immutable) |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 123 | return; |
| 124 | |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 125 | ufuncs->v.get_mirroring = mirroring_func ? mirroring_func : hb_unicode_get_mirroring_nil; |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 126 | } |
| 127 | |
| 128 | void |
| 129 | hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs, |
| 130 | hb_unicode_get_general_category_func_t general_category_func) |
| 131 | { |
Behdad Esfahbod | eb27ec0 | 2009-08-10 23:25:28 -0400 | [diff] [blame] | 132 | if (ufuncs->immutable) |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 133 | return; |
| 134 | |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 135 | ufuncs->v.get_general_category = general_category_func ? general_category_func : hb_unicode_get_general_category_nil; |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 136 | } |
| 137 | |
| 138 | void |
| 139 | hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs, |
| 140 | hb_unicode_get_script_func_t script_func) |
| 141 | { |
Behdad Esfahbod | eb27ec0 | 2009-08-10 23:25:28 -0400 | [diff] [blame] | 142 | if (ufuncs->immutable) |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 143 | return; |
| 144 | |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 145 | ufuncs->v.get_script = script_func ? script_func : hb_unicode_get_script_nil; |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 146 | } |
| 147 | |
| 148 | void |
| 149 | hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs, |
| 150 | hb_unicode_get_combining_class_func_t combining_class_func) |
| 151 | { |
Behdad Esfahbod | eb27ec0 | 2009-08-10 23:25:28 -0400 | [diff] [blame] | 152 | if (ufuncs->immutable) |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 153 | return; |
| 154 | |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 155 | ufuncs->v.get_combining_class = combining_class_func ? combining_class_func : hb_unicode_get_combining_class_nil; |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 156 | } |
| 157 | |
| 158 | void |
| 159 | hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs, |
| 160 | hb_unicode_get_eastasian_width_func_t eastasian_width_func) |
| 161 | { |
Behdad Esfahbod | eb27ec0 | 2009-08-10 23:25:28 -0400 | [diff] [blame] | 162 | if (ufuncs->immutable) |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 163 | return; |
| 164 | |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 165 | ufuncs->v.get_eastasian_width = eastasian_width_func ? eastasian_width_func : hb_unicode_get_eastasian_width_nil; |
Behdad Esfahbod | 04cc0a2 | 2009-08-10 22:58:56 -0400 | [diff] [blame] | 166 | } |
| 167 | |
Behdad Esfahbod | ff44f88 | 2009-11-06 19:48:16 -0500 | [diff] [blame] | 168 | |
Behdad Esfahbod | 19c0eab | 2010-10-04 16:45:21 -0400 | [diff] [blame] | 169 | hb_unicode_get_mirroring_func_t |
| 170 | hb_unicode_funcs_get_mirroring_func (hb_unicode_funcs_t *ufuncs) |
| 171 | { |
| 172 | return ufuncs->v.get_mirroring; |
| 173 | } |
| 174 | |
| 175 | hb_unicode_get_general_category_func_t |
| 176 | hb_unicode_funcs_get_general_category_func (hb_unicode_funcs_t *ufuncs) |
| 177 | { |
| 178 | return ufuncs->v.get_general_category; |
| 179 | } |
| 180 | |
| 181 | hb_unicode_get_script_func_t |
| 182 | hb_unicode_funcs_get_script_func (hb_unicode_funcs_t *ufuncs) |
| 183 | { |
| 184 | return ufuncs->v.get_script; |
| 185 | } |
| 186 | |
| 187 | hb_unicode_get_combining_class_func_t |
| 188 | hb_unicode_funcs_get_combining_class_func (hb_unicode_funcs_t *ufuncs) |
| 189 | { |
| 190 | return ufuncs->v.get_combining_class; |
| 191 | } |
| 192 | |
| 193 | hb_unicode_get_eastasian_width_func_t |
| 194 | hb_unicode_funcs_get_eastasian_width_func (hb_unicode_funcs_t *ufuncs) |
| 195 | { |
| 196 | return ufuncs->v.get_eastasian_width; |
| 197 | } |
| 198 | |
| 199 | |
| 200 | |
Behdad Esfahbod | 5ceefa1 | 2009-12-20 15:29:16 +0100 | [diff] [blame] | 201 | hb_codepoint_t |
| 202 | hb_unicode_get_mirroring (hb_unicode_funcs_t *ufuncs, |
| 203 | hb_codepoint_t unicode) |
| 204 | { |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 205 | return ufuncs->v.get_mirroring (unicode); |
Behdad Esfahbod | 5ceefa1 | 2009-12-20 15:29:16 +0100 | [diff] [blame] | 206 | } |
| 207 | |
| 208 | hb_category_t |
| 209 | hb_unicode_get_general_category (hb_unicode_funcs_t *ufuncs, |
| 210 | hb_codepoint_t unicode) |
| 211 | { |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 212 | return ufuncs->v.get_general_category (unicode); |
Behdad Esfahbod | 5ceefa1 | 2009-12-20 15:29:16 +0100 | [diff] [blame] | 213 | } |
| 214 | |
| 215 | hb_script_t |
| 216 | hb_unicode_get_script (hb_unicode_funcs_t *ufuncs, |
| 217 | hb_codepoint_t unicode) |
| 218 | { |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 219 | return ufuncs->v.get_script (unicode); |
Behdad Esfahbod | 5ceefa1 | 2009-12-20 15:29:16 +0100 | [diff] [blame] | 220 | } |
| 221 | |
| 222 | unsigned int |
| 223 | hb_unicode_get_combining_class (hb_unicode_funcs_t *ufuncs, |
| 224 | hb_codepoint_t unicode) |
| 225 | { |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 226 | return ufuncs->v.get_combining_class (unicode); |
Behdad Esfahbod | 5ceefa1 | 2009-12-20 15:29:16 +0100 | [diff] [blame] | 227 | } |
| 228 | |
| 229 | unsigned int |
| 230 | hb_unicode_get_eastasian_width (hb_unicode_funcs_t *ufuncs, |
| 231 | hb_codepoint_t unicode) |
| 232 | { |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 233 | return ufuncs->v.get_eastasian_width (unicode); |
Behdad Esfahbod | 5ceefa1 | 2009-12-20 15:29:16 +0100 | [diff] [blame] | 234 | } |
| 235 | |
| 236 | |
Behdad Esfahbod | 5d91c3d | 2011-03-16 17:36:32 -0300 | [diff] [blame] | 237 | /* hb_script_t */ |
| 238 | |
| 239 | static 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 | |
| 351 | struct tag_script_pair { |
| 352 | hb_tag_t tag; |
| 353 | hb_script_t script; |
| 354 | }; |
| 355 | static 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 | |
| 462 | static 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 | |
| 470 | hb_script_t |
| 471 | hb_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 | |
| 495 | hb_tag_t |
| 496 | hb_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 Esfahbod | 5ceefa1 | 2009-12-20 15:29:16 +0100 | [diff] [blame] | 510 | |
Behdad Esfahbod | ff44f88 | 2009-11-06 19:48:16 -0500 | [diff] [blame] | 511 | #define LTR HB_DIRECTION_LTR |
| 512 | #define RTL HB_DIRECTION_RTL |
| 513 | const 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 Esfahbod | 93ac709 | 2010-05-26 16:22:00 -0400 | [diff] [blame] | 564 | RTL, /* Cprt */ |
Behdad Esfahbod | ff44f88 | 2009-11-06 19:48:16 -0500 | [diff] [blame] | 565 | 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 Esfahbod | 4fa67f3 | 2010-05-21 13:29:12 +0100 | [diff] [blame] | 600 | 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 Esfahbod | afab01c | 2010-11-17 14:35:34 -0500 | [diff] [blame] | 617 | LTR, /* Tavt */ |
| 618 | |
| 619 | /* Unicode-6.0 additions */ |
| 620 | LTR, /* Batk */ |
| 621 | LTR, /* Brah */ |
| 622 | RTL /* Mand */ |
Behdad Esfahbod | ff44f88 | 2009-11-06 19:48:16 -0500 | [diff] [blame] | 623 | }; |
| 624 | #undef LTR |
| 625 | #undef RTL |
| 626 | |
Behdad Esfahbod | 11a8161 | 2010-05-13 00:01:40 -0400 | [diff] [blame] | 627 | hb_direction_t |
Behdad Esfahbod | 3286fc0 | 2011-03-16 14:53:32 -0300 | [diff] [blame] | 628 | hb_script_get_horizontal_direction (hb_script_t script) |
Behdad Esfahbod | ff44f88 | 2009-11-06 19:48:16 -0500 | [diff] [blame] | 629 | { |
Behdad Esfahbod | 64d3fc8 | 2010-05-03 22:51:19 -0400 | [diff] [blame] | 630 | if (unlikely ((unsigned int) script >= ARRAY_LENGTH (horiz_dir))) |
Behdad Esfahbod | ff44f88 | 2009-11-06 19:48:16 -0500 | [diff] [blame] | 631 | return HB_DIRECTION_LTR; |
| 632 | |
| 633 | return horiz_dir[script]; |
| 634 | } |
Behdad Esfahbod | acdba3f | 2010-07-23 15:11:18 -0400 | [diff] [blame] | 635 | |
| 636 | |
| 637 | HB_END_DECLS |