| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2009 Red Hat, Inc. | |
| 3 * | |
| 4 * This is part of HarfBuzz, a text shaping library. | |
| 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 | |
| 31 HB_BEGIN_DECLS | |
| 32 | |
| 33 | |
| 34 /* | |
| 35 * hb_unicode_funcs_t | |
| 36 */ | |
| 37 | |
| 38 static hb_codepoint_t hb_unicode_get_mirroring_nil (hb_codepoint_t unicode) { re
turn unicode; } | |
| 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 H
B_UNUSED) { return 0; } | |
| 42 static unsigned int hb_unicode_get_eastasian_width_nil (hb_codepoint_t unicode H
B_UNUSED) { return 1; } | |
| 43 | |
| 44 hb_unicode_funcs_t _hb_unicode_funcs_nil = { | |
| 45 HB_REFERENCE_COUNT_INVALID, /* ref_count */ | |
| 46 TRUE, /* immutable */ | |
| 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 } | |
| 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 | |
| 64 ufuncs->v = _hb_unicode_funcs_nil.v; | |
| 65 | |
| 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 | |
| 97 ufuncs->v = other_ufuncs->v; | |
| 98 | |
| 99 return ufuncs; | |
| 100 } | |
| 101 | |
| 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 | |
| 111 hb_bool_t | |
| 112 hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs) | |
| 113 { | |
| 114 return ufuncs->immutable; | |
| 115 } | |
| 116 | |
| 117 | |
| 118 void | |
| 119 hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs, | |
| 120 hb_unicode_get_mirroring_func_t mirroring_f
unc) | |
| 121 { | |
| 122 if (ufuncs->immutable) | |
| 123 return; | |
| 124 | |
| 125 ufuncs->v.get_mirroring = mirroring_func ? mirroring_func : hb_unicode_get_mir
roring_nil; | |
| 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 { | |
| 132 if (ufuncs->immutable) | |
| 133 return; | |
| 134 | |
| 135 ufuncs->v.get_general_category = general_category_func ? general_category_func
: hb_unicode_get_general_category_nil; | |
| 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 { | |
| 142 if (ufuncs->immutable) | |
| 143 return; | |
| 144 | |
| 145 ufuncs->v.get_script = script_func ? script_func : hb_unicode_get_script_nil; | |
| 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 { | |
| 152 if (ufuncs->immutable) | |
| 153 return; | |
| 154 | |
| 155 ufuncs->v.get_combining_class = combining_class_func ? combining_class_func :
hb_unicode_get_combining_class_nil; | |
| 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 { | |
| 162 if (ufuncs->immutable) | |
| 163 return; | |
| 164 | |
| 165 ufuncs->v.get_eastasian_width = eastasian_width_func ? eastasian_width_func :
hb_unicode_get_eastasian_width_nil; | |
| 166 } | |
| 167 | |
| 168 | |
| 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 | |
| 201 hb_codepoint_t | |
| 202 hb_unicode_get_mirroring (hb_unicode_funcs_t *ufuncs, | |
| 203 hb_codepoint_t unicode) | |
| 204 { | |
| 205 return ufuncs->v.get_mirroring (unicode); | |
| 206 } | |
| 207 | |
| 208 hb_category_t | |
| 209 hb_unicode_get_general_category (hb_unicode_funcs_t *ufuncs, | |
| 210 hb_codepoint_t unicode) | |
| 211 { | |
| 212 return ufuncs->v.get_general_category (unicode); | |
| 213 } | |
| 214 | |
| 215 hb_script_t | |
| 216 hb_unicode_get_script (hb_unicode_funcs_t *ufuncs, | |
| 217 hb_codepoint_t unicode) | |
| 218 { | |
| 219 return ufuncs->v.get_script (unicode); | |
| 220 } | |
| 221 | |
| 222 unsigned int | |
| 223 hb_unicode_get_combining_class (hb_unicode_funcs_t *ufuncs, | |
| 224 hb_codepoint_t unicode) | |
| 225 { | |
| 226 return ufuncs->v.get_combining_class (unicode); | |
| 227 } | |
| 228 | |
| 229 unsigned int | |
| 230 hb_unicode_get_eastasian_width (hb_unicode_funcs_t *ufuncs, | |
| 231 hb_codepoint_t unicode) | |
| 232 { | |
| 233 return ufuncs->v.get_eastasian_width (unicode); | |
| 234 } | |
| 235 | |
| 236 | |
| 237 | |
| 238 #define LTR HB_DIRECTION_LTR | |
| 239 #define RTL HB_DIRECTION_RTL | |
| 240 const hb_direction_t horiz_dir[] = | |
| 241 { | |
| 242 LTR, /* Zyyy */ | |
| 243 LTR, /* Qaai */ | |
| 244 RTL, /* Arab */ | |
| 245 LTR, /* Armn */ | |
| 246 LTR, /* Beng */ | |
| 247 LTR, /* Bopo */ | |
| 248 LTR, /* Cher */ | |
| 249 LTR, /* Qaac */ | |
| 250 LTR, /* Cyrl (Cyrs) */ | |
| 251 LTR, /* Dsrt */ | |
| 252 LTR, /* Deva */ | |
| 253 LTR, /* Ethi */ | |
| 254 LTR, /* Geor (Geon, Geoa) */ | |
| 255 LTR, /* Goth */ | |
| 256 LTR, /* Grek */ | |
| 257 LTR, /* Gujr */ | |
| 258 LTR, /* Guru */ | |
| 259 LTR, /* Hani */ | |
| 260 LTR, /* Hang */ | |
| 261 RTL, /* Hebr */ | |
| 262 LTR, /* Hira */ | |
| 263 LTR, /* Knda */ | |
| 264 LTR, /* Kana */ | |
| 265 LTR, /* Khmr */ | |
| 266 LTR, /* Laoo */ | |
| 267 LTR, /* Latn (Latf, Latg) */ | |
| 268 LTR, /* Mlym */ | |
| 269 LTR, /* Mong */ | |
| 270 LTR, /* Mymr */ | |
| 271 LTR, /* Ogam */ | |
| 272 LTR, /* Ital */ | |
| 273 LTR, /* Orya */ | |
| 274 LTR, /* Runr */ | |
| 275 LTR, /* Sinh */ | |
| 276 RTL, /* Syrc (Syrj, Syrn, Syre) */ | |
| 277 LTR, /* Taml */ | |
| 278 LTR, /* Telu */ | |
| 279 RTL, /* Thaa */ | |
| 280 LTR, /* Thai */ | |
| 281 LTR, /* Tibt */ | |
| 282 LTR, /* Cans */ | |
| 283 LTR, /* Yiii */ | |
| 284 LTR, /* Tglg */ | |
| 285 LTR, /* Hano */ | |
| 286 LTR, /* Buhd */ | |
| 287 LTR, /* Tagb */ | |
| 288 | |
| 289 /* Unicode-4.0 additions */ | |
| 290 LTR, /* Brai */ | |
| 291 RTL, /* Cprt */ | |
| 292 LTR, /* Limb */ | |
| 293 LTR, /* Osma */ | |
| 294 LTR, /* Shaw */ | |
| 295 LTR, /* Linb */ | |
| 296 LTR, /* Tale */ | |
| 297 LTR, /* Ugar */ | |
| 298 | |
| 299 /* Unicode-4.1 additions */ | |
| 300 LTR, /* Talu */ | |
| 301 LTR, /* Bugi */ | |
| 302 LTR, /* Glag */ | |
| 303 LTR, /* Tfng */ | |
| 304 LTR, /* Sylo */ | |
| 305 LTR, /* Xpeo */ | |
| 306 LTR, /* Khar */ | |
| 307 | |
| 308 /* Unicode-5.0 additions */ | |
| 309 LTR, /* Zzzz */ | |
| 310 LTR, /* Bali */ | |
| 311 LTR, /* Xsux */ | |
| 312 RTL, /* Phnx */ | |
| 313 LTR, /* Phag */ | |
| 314 RTL, /* Nkoo */ | |
| 315 | |
| 316 /* Unicode-5.1 additions */ | |
| 317 LTR, /* Kali */ | |
| 318 LTR, /* Lepc */ | |
| 319 LTR, /* Rjng */ | |
| 320 LTR, /* Sund */ | |
| 321 LTR, /* Saur */ | |
| 322 LTR, /* Cham */ | |
| 323 LTR, /* Olck */ | |
| 324 LTR, /* Vaii */ | |
| 325 LTR, /* Cari */ | |
| 326 LTR, /* Lyci */ | |
| 327 LTR, /* Lydi */ | |
| 328 | |
| 329 /* Unicode-5.2 additions */ | |
| 330 RTL, /* Avst */ | |
| 331 LTR, /* Bamu */ | |
| 332 LTR, /* Egyp */ | |
| 333 RTL, /* Armi */ | |
| 334 RTL, /* Phli */ | |
| 335 RTL, /* Prti */ | |
| 336 LTR, /* Java */ | |
| 337 LTR, /* Kthi */ | |
| 338 LTR, /* Lisu */ | |
| 339 LTR, /* Mtei */ | |
| 340 RTL, /* Sarb */ | |
| 341 RTL, /* Orkh */ | |
| 342 RTL, /* Samr */ | |
| 343 LTR, /* Lana */ | |
| 344 LTR, /* Tavt */ | |
| 345 | |
| 346 /* Unicode-6.0 additions */ | |
| 347 LTR, /* Batk */ | |
| 348 LTR, /* Brah */ | |
| 349 RTL /* Mand */ | |
| 350 }; | |
| 351 #undef LTR | |
| 352 #undef RTL | |
| 353 | |
| 354 hb_direction_t | |
| 355 _hb_script_get_horizontal_direction (hb_script_t script) | |
| 356 { | |
| 357 if (unlikely ((unsigned int) script >= ARRAY_LENGTH (horiz_dir))) | |
| 358 return HB_DIRECTION_LTR; | |
| 359 | |
| 360 return horiz_dir[script]; | |
| 361 } | |
| 362 | |
| 363 | |
| 364 HB_END_DECLS | |
| OLD | NEW |