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 |