1 /* 2 * Copyright (C) 2012 Grigori Goronzy <greg (at) kinoho.net> 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include "hb-private.hh" 18 19 #include "hb-unicode-private.hh" 20 21 #include "ucdn.h" 22 23 static const hb_script_t ucdn_script_translate[] = 24 { 25 HB_SCRIPT_COMMON, 26 HB_SCRIPT_LATIN, 27 HB_SCRIPT_GREEK, 28 HB_SCRIPT_CYRILLIC, 29 HB_SCRIPT_ARMENIAN, 30 HB_SCRIPT_HEBREW, 31 HB_SCRIPT_ARABIC, 32 HB_SCRIPT_SYRIAC, 33 HB_SCRIPT_THAANA, 34 HB_SCRIPT_DEVANAGARI, 35 HB_SCRIPT_BENGALI, 36 HB_SCRIPT_GURMUKHI, 37 HB_SCRIPT_GUJARATI, 38 HB_SCRIPT_ORIYA, 39 HB_SCRIPT_TAMIL, 40 HB_SCRIPT_TELUGU, 41 HB_SCRIPT_KANNADA, 42 HB_SCRIPT_MALAYALAM, 43 HB_SCRIPT_SINHALA, 44 HB_SCRIPT_THAI, 45 HB_SCRIPT_LAO, 46 HB_SCRIPT_TIBETAN, 47 HB_SCRIPT_MYANMAR, 48 HB_SCRIPT_GEORGIAN, 49 HB_SCRIPT_HANGUL, 50 HB_SCRIPT_ETHIOPIC, 51 HB_SCRIPT_CHEROKEE, 52 HB_SCRIPT_CANADIAN_SYLLABICS, 53 HB_SCRIPT_OGHAM, 54 HB_SCRIPT_RUNIC, 55 HB_SCRIPT_KHMER, 56 HB_SCRIPT_MONGOLIAN, 57 HB_SCRIPT_HIRAGANA, 58 HB_SCRIPT_KATAKANA, 59 HB_SCRIPT_BOPOMOFO, 60 HB_SCRIPT_HAN, 61 HB_SCRIPT_YI, 62 HB_SCRIPT_OLD_ITALIC, 63 HB_SCRIPT_GOTHIC, 64 HB_SCRIPT_DESERET, 65 HB_SCRIPT_INHERITED, 66 HB_SCRIPT_TAGALOG, 67 HB_SCRIPT_HANUNOO, 68 HB_SCRIPT_BUHID, 69 HB_SCRIPT_TAGBANWA, 70 HB_SCRIPT_LIMBU, 71 HB_SCRIPT_TAI_LE, 72 HB_SCRIPT_LINEAR_B, 73 HB_SCRIPT_UGARITIC, 74 HB_SCRIPT_SHAVIAN, 75 HB_SCRIPT_OSMANYA, 76 HB_SCRIPT_CYPRIOT, 77 HB_SCRIPT_BRAILLE, 78 HB_SCRIPT_BUGINESE, 79 HB_SCRIPT_COPTIC, 80 HB_SCRIPT_NEW_TAI_LUE, 81 HB_SCRIPT_GLAGOLITIC, 82 HB_SCRIPT_TIFINAGH, 83 HB_SCRIPT_SYLOTI_NAGRI, 84 HB_SCRIPT_OLD_PERSIAN, 85 HB_SCRIPT_KHAROSHTHI, 86 HB_SCRIPT_BALINESE, 87 HB_SCRIPT_CUNEIFORM, 88 HB_SCRIPT_PHOENICIAN, 89 HB_SCRIPT_PHAGS_PA, 90 HB_SCRIPT_NKO, 91 HB_SCRIPT_SUNDANESE, 92 HB_SCRIPT_LEPCHA, 93 HB_SCRIPT_OL_CHIKI, 94 HB_SCRIPT_VAI, 95 HB_SCRIPT_SAURASHTRA, 96 HB_SCRIPT_KAYAH_LI, 97 HB_SCRIPT_REJANG, 98 HB_SCRIPT_LYCIAN, 99 HB_SCRIPT_CARIAN, 100 HB_SCRIPT_LYDIAN, 101 HB_SCRIPT_CHAM, 102 HB_SCRIPT_TAI_THAM, 103 HB_SCRIPT_TAI_VIET, 104 HB_SCRIPT_AVESTAN, 105 HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, 106 HB_SCRIPT_SAMARITAN, 107 HB_SCRIPT_LISU, 108 HB_SCRIPT_BAMUM, 109 HB_SCRIPT_JAVANESE, 110 HB_SCRIPT_MEETEI_MAYEK, 111 HB_SCRIPT_IMPERIAL_ARAMAIC, 112 HB_SCRIPT_OLD_SOUTH_ARABIAN, 113 HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, 114 HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, 115 HB_SCRIPT_OLD_TURKIC, 116 HB_SCRIPT_KAITHI, 117 HB_SCRIPT_BATAK, 118 HB_SCRIPT_BRAHMI, 119 HB_SCRIPT_MANDAIC, 120 HB_SCRIPT_CHAKMA, 121 HB_SCRIPT_MEROITIC_CURSIVE, 122 HB_SCRIPT_MEROITIC_HIEROGLYPHS, 123 HB_SCRIPT_MIAO, 124 HB_SCRIPT_SHARADA, 125 HB_SCRIPT_SORA_SOMPENG, 126 HB_SCRIPT_TAKRI, 127 HB_SCRIPT_UNKNOWN, 128 }; 129 130 static hb_unicode_combining_class_t 131 hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, 132 void *user_data HB_UNUSED) 133 { 134 return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode); 135 } 136 137 static unsigned int 138 hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, 139 void *user_data HB_UNUSED) 140 { 141 int w = ucdn_get_east_asian_width(unicode); 142 return (w == UCDN_EAST_ASIAN_F || w == UCDN_EAST_ASIAN_W) ? 2 : 1; 143 } 144 145 static hb_unicode_general_category_t 146 hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, 147 void *user_data HB_UNUSED) 148 { 149 return (hb_unicode_general_category_t)ucdn_get_general_category(unicode); 150 } 151 152 static hb_codepoint_t 153 hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, 154 void *user_data HB_UNUSED) 155 { 156 return ucdn_mirror(unicode); 157 } 158 159 static hb_script_t 160 hb_ucdn_script(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, 161 void *user_data HB_UNUSED) 162 { 163 return ucdn_script_translate[ucdn_get_script(unicode)]; 164 } 165 166 static hb_bool_t 167 hb_ucdn_compose(hb_unicode_funcs_t *ufuncs, 168 hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, 169 void *user_data HB_UNUSED) 170 { 171 return ucdn_compose(ab, a, b); 172 } 173 174 static hb_bool_t 175 hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs, 176 hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, 177 void *user_data HB_UNUSED) 178 { 179 return ucdn_decompose(ab, a, b); 180 } 181 182 static unsigned int 183 hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs, 184 hb_codepoint_t u, hb_codepoint_t *decomposed, 185 void *user_data HB_UNUSED) 186 { 187 return ucdn_compat_decompose(u, decomposed); 188 } 189 190 extern "C" HB_INTERNAL 191 hb_unicode_funcs_t * 192 hb_ucdn_get_unicode_funcs (void) 193 { 194 static const hb_unicode_funcs_t _hb_ucdn_unicode_funcs = { 195 HB_OBJECT_HEADER_STATIC, 196 197 NULL, /* parent */ 198 true, /* immutable */ 199 { 200 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_ucdn_##name, 201 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 202 #undef HB_UNICODE_FUNC_IMPLEMENT 203 } 204 }; 205 206 return const_cast<hb_unicode_funcs_t *> (&_hb_ucdn_unicode_funcs); 207 } 208 209