1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/harfbuzz/src/hb-unicode.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,563 @@ 1.4 +/* 1.5 + * Copyright © 2009 Red Hat, Inc. 1.6 + * Copyright © 2011 Codethink Limited 1.7 + * Copyright © 2010,2011,2012 Google, Inc. 1.8 + * 1.9 + * This is part of HarfBuzz, a text shaping library. 1.10 + * 1.11 + * Permission is hereby granted, without written agreement and without 1.12 + * license or royalty fees, to use, copy, modify, and distribute this 1.13 + * software and its documentation for any purpose, provided that the 1.14 + * above copyright notice and the following two paragraphs appear in 1.15 + * all copies of this software. 1.16 + * 1.17 + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 1.18 + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 1.19 + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 1.20 + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 1.21 + * DAMAGE. 1.22 + * 1.23 + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 1.24 + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 1.25 + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 1.26 + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 1.27 + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 1.28 + * 1.29 + * Red Hat Author(s): Behdad Esfahbod 1.30 + * Codethink Author(s): Ryan Lortie 1.31 + * Google Author(s): Behdad Esfahbod 1.32 + */ 1.33 + 1.34 +#include "hb-private.hh" 1.35 + 1.36 +#include "hb-unicode-private.hh" 1.37 + 1.38 + 1.39 + 1.40 +/* 1.41 + * hb_unicode_funcs_t 1.42 + */ 1.43 + 1.44 +static hb_unicode_combining_class_t 1.45 +hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.46 + hb_codepoint_t unicode HB_UNUSED, 1.47 + void *user_data HB_UNUSED) 1.48 +{ 1.49 + return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED; 1.50 +} 1.51 + 1.52 +static unsigned int 1.53 +hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.54 + hb_codepoint_t unicode HB_UNUSED, 1.55 + void *user_data HB_UNUSED) 1.56 +{ 1.57 + return 1; 1.58 +} 1.59 + 1.60 +static hb_unicode_general_category_t 1.61 +hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.62 + hb_codepoint_t unicode HB_UNUSED, 1.63 + void *user_data HB_UNUSED) 1.64 +{ 1.65 + return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER; 1.66 +} 1.67 + 1.68 +static hb_codepoint_t 1.69 +hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.70 + hb_codepoint_t unicode HB_UNUSED, 1.71 + void *user_data HB_UNUSED) 1.72 +{ 1.73 + return unicode; 1.74 +} 1.75 + 1.76 +static hb_script_t 1.77 +hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.78 + hb_codepoint_t unicode HB_UNUSED, 1.79 + void *user_data HB_UNUSED) 1.80 +{ 1.81 + return HB_SCRIPT_UNKNOWN; 1.82 +} 1.83 + 1.84 +static hb_bool_t 1.85 +hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.86 + hb_codepoint_t a HB_UNUSED, 1.87 + hb_codepoint_t b HB_UNUSED, 1.88 + hb_codepoint_t *ab HB_UNUSED, 1.89 + void *user_data HB_UNUSED) 1.90 +{ 1.91 + return false; 1.92 +} 1.93 + 1.94 +static hb_bool_t 1.95 +hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.96 + hb_codepoint_t ab HB_UNUSED, 1.97 + hb_codepoint_t *a HB_UNUSED, 1.98 + hb_codepoint_t *b HB_UNUSED, 1.99 + void *user_data HB_UNUSED) 1.100 +{ 1.101 + return false; 1.102 +} 1.103 + 1.104 + 1.105 +static unsigned int 1.106 +hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 1.107 + hb_codepoint_t u HB_UNUSED, 1.108 + hb_codepoint_t *decomposed HB_UNUSED, 1.109 + void *user_data HB_UNUSED) 1.110 +{ 1.111 + return 0; 1.112 +} 1.113 + 1.114 + 1.115 +#define HB_UNICODE_FUNCS_IMPLEMENT_SET \ 1.116 + HB_UNICODE_FUNCS_IMPLEMENT (glib) \ 1.117 + HB_UNICODE_FUNCS_IMPLEMENT (icu) \ 1.118 + HB_UNICODE_FUNCS_IMPLEMENT (ucdn) \ 1.119 + HB_UNICODE_FUNCS_IMPLEMENT (nil) \ 1.120 + /* ^--- Add new callbacks before nil */ 1.121 + 1.122 +#define hb_nil_get_unicode_funcs hb_unicode_funcs_get_empty 1.123 + 1.124 +/* Prototype them all */ 1.125 +#define HB_UNICODE_FUNCS_IMPLEMENT(set) \ 1.126 +extern "C" hb_unicode_funcs_t *hb_##set##_get_unicode_funcs (void); 1.127 +HB_UNICODE_FUNCS_IMPLEMENT_SET 1.128 +#undef HB_UNICODE_FUNCS_IMPLEMENT 1.129 + 1.130 + 1.131 +hb_unicode_funcs_t * 1.132 +hb_unicode_funcs_get_default (void) 1.133 +{ 1.134 +#define HB_UNICODE_FUNCS_IMPLEMENT(set) \ 1.135 + return hb_##set##_get_unicode_funcs (); 1.136 + 1.137 +#ifdef HAVE_GLIB 1.138 + HB_UNICODE_FUNCS_IMPLEMENT(glib) 1.139 +#elif 0 && defined(HAVE_ICU) 1.140 + HB_UNICODE_FUNCS_IMPLEMENT(icu) 1.141 +#elif defined(HAVE_UCDN) 1.142 + HB_UNICODE_FUNCS_IMPLEMENT(ucdn) 1.143 +#else 1.144 +#define HB_UNICODE_FUNCS_NIL 1 1.145 + HB_UNICODE_FUNCS_IMPLEMENT(nil) 1.146 +#endif 1.147 + 1.148 +#undef HB_UNICODE_FUNCS_IMPLEMENT 1.149 +} 1.150 + 1.151 +#if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL) 1.152 +#pragma message("Could not find any Unicode functions implementation, you have to provide your own.") 1.153 +#pragma message("To suppress this warnings, define HB_NO_UNICODE_FUNCS.") 1.154 +#endif 1.155 + 1.156 +/** 1.157 + * hb_unicode_funcs_create: (Xconstructor) 1.158 + * @parent: (allow-none): 1.159 + * 1.160 + * 1.161 + * 1.162 + * Return value: (transfer full): 1.163 + * 1.164 + * Since: 1.0 1.165 + **/ 1.166 +hb_unicode_funcs_t * 1.167 +hb_unicode_funcs_create (hb_unicode_funcs_t *parent) 1.168 +{ 1.169 + hb_unicode_funcs_t *ufuncs; 1.170 + 1.171 + if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ())) 1.172 + return hb_unicode_funcs_get_empty (); 1.173 + 1.174 + if (!parent) 1.175 + parent = hb_unicode_funcs_get_empty (); 1.176 + 1.177 + hb_unicode_funcs_make_immutable (parent); 1.178 + ufuncs->parent = hb_unicode_funcs_reference (parent); 1.179 + 1.180 + ufuncs->func = parent->func; 1.181 + 1.182 + /* We can safely copy user_data from parent since we hold a reference 1.183 + * onto it and it's immutable. We should not copy the destroy notifiers 1.184 + * though. */ 1.185 + ufuncs->user_data = parent->user_data; 1.186 + 1.187 + return ufuncs; 1.188 +} 1.189 + 1.190 + 1.191 +const hb_unicode_funcs_t _hb_unicode_funcs_nil = { 1.192 + HB_OBJECT_HEADER_STATIC, 1.193 + 1.194 + NULL, /* parent */ 1.195 + true, /* immutable */ 1.196 + { 1.197 +#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil, 1.198 + HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 1.199 +#undef HB_UNICODE_FUNC_IMPLEMENT 1.200 + } 1.201 +}; 1.202 + 1.203 +/** 1.204 + * hb_unicode_funcs_get_empty: 1.205 + * 1.206 + * 1.207 + * 1.208 + * Return value: (transfer full): 1.209 + * 1.210 + * Since: 1.0 1.211 + **/ 1.212 +hb_unicode_funcs_t * 1.213 +hb_unicode_funcs_get_empty (void) 1.214 +{ 1.215 + return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil); 1.216 +} 1.217 + 1.218 +/** 1.219 + * hb_unicode_funcs_reference: (skip) 1.220 + * @ufuncs: Unicode functions. 1.221 + * 1.222 + * 1.223 + * 1.224 + * Return value: (transfer full): 1.225 + * 1.226 + * Since: 1.0 1.227 + **/ 1.228 +hb_unicode_funcs_t * 1.229 +hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs) 1.230 +{ 1.231 + return hb_object_reference (ufuncs); 1.232 +} 1.233 + 1.234 +/** 1.235 + * hb_unicode_funcs_destroy: (skip) 1.236 + * @ufuncs: Unicode functions. 1.237 + * 1.238 + * 1.239 + * 1.240 + * Since: 1.0 1.241 + **/ 1.242 +void 1.243 +hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs) 1.244 +{ 1.245 + if (!hb_object_destroy (ufuncs)) return; 1.246 + 1.247 +#define HB_UNICODE_FUNC_IMPLEMENT(name) \ 1.248 + if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name); 1.249 + HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 1.250 +#undef HB_UNICODE_FUNC_IMPLEMENT 1.251 + 1.252 + hb_unicode_funcs_destroy (ufuncs->parent); 1.253 + 1.254 + free (ufuncs); 1.255 +} 1.256 + 1.257 +/** 1.258 + * hb_unicode_funcs_set_user_data: (skip) 1.259 + * @ufuncs: Unicode functions. 1.260 + * @key: 1.261 + * @data: 1.262 + * @destroy: 1.263 + * @replace: 1.264 + * 1.265 + * 1.266 + * 1.267 + * Return value: 1.268 + * 1.269 + * Since: 1.0 1.270 + **/ 1.271 +hb_bool_t 1.272 +hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs, 1.273 + hb_user_data_key_t *key, 1.274 + void * data, 1.275 + hb_destroy_func_t destroy, 1.276 + hb_bool_t replace) 1.277 +{ 1.278 + return hb_object_set_user_data (ufuncs, key, data, destroy, replace); 1.279 +} 1.280 + 1.281 +/** 1.282 + * hb_unicode_funcs_get_user_data: (skip) 1.283 + * @ufuncs: Unicode functions. 1.284 + * @key: 1.285 + * 1.286 + * 1.287 + * 1.288 + * Return value: (transfer none): 1.289 + * 1.290 + * Since: 1.0 1.291 + **/ 1.292 +void * 1.293 +hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs, 1.294 + hb_user_data_key_t *key) 1.295 +{ 1.296 + return hb_object_get_user_data (ufuncs, key); 1.297 +} 1.298 + 1.299 + 1.300 +/** 1.301 + * hb_unicode_funcs_make_immutable: 1.302 + * @ufuncs: Unicode functions. 1.303 + * 1.304 + * 1.305 + * 1.306 + * Since: 1.0 1.307 + **/ 1.308 +void 1.309 +hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs) 1.310 +{ 1.311 + if (hb_object_is_inert (ufuncs)) 1.312 + return; 1.313 + 1.314 + ufuncs->immutable = true; 1.315 +} 1.316 + 1.317 +/** 1.318 + * hb_unicode_funcs_is_immutable: 1.319 + * @ufuncs: Unicode functions. 1.320 + * 1.321 + * 1.322 + * 1.323 + * Return value: 1.324 + * 1.325 + * Since: 1.0 1.326 + **/ 1.327 +hb_bool_t 1.328 +hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs) 1.329 +{ 1.330 + return ufuncs->immutable; 1.331 +} 1.332 + 1.333 +/** 1.334 + * hb_unicode_funcs_get_parent: 1.335 + * @ufuncs: Unicode functions. 1.336 + * 1.337 + * 1.338 + * 1.339 + * Return value: 1.340 + * 1.341 + * Since: 1.0 1.342 + **/ 1.343 +hb_unicode_funcs_t * 1.344 +hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs) 1.345 +{ 1.346 + return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty (); 1.347 +} 1.348 + 1.349 + 1.350 +#define HB_UNICODE_FUNC_IMPLEMENT(name) \ 1.351 + \ 1.352 +void \ 1.353 +hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \ 1.354 + hb_unicode_##name##_func_t func, \ 1.355 + void *user_data, \ 1.356 + hb_destroy_func_t destroy) \ 1.357 +{ \ 1.358 + if (ufuncs->immutable) \ 1.359 + return; \ 1.360 + \ 1.361 + if (ufuncs->destroy.name) \ 1.362 + ufuncs->destroy.name (ufuncs->user_data.name); \ 1.363 + \ 1.364 + if (func) { \ 1.365 + ufuncs->func.name = func; \ 1.366 + ufuncs->user_data.name = user_data; \ 1.367 + ufuncs->destroy.name = destroy; \ 1.368 + } else { \ 1.369 + ufuncs->func.name = ufuncs->parent->func.name; \ 1.370 + ufuncs->user_data.name = ufuncs->parent->user_data.name; \ 1.371 + ufuncs->destroy.name = NULL; \ 1.372 + } \ 1.373 +} 1.374 + 1.375 +HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 1.376 +#undef HB_UNICODE_FUNC_IMPLEMENT 1.377 + 1.378 + 1.379 +#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \ 1.380 + \ 1.381 +return_type \ 1.382 +hb_unicode_##name (hb_unicode_funcs_t *ufuncs, \ 1.383 + hb_codepoint_t unicode) \ 1.384 +{ \ 1.385 + return ufuncs->name (unicode); \ 1.386 +} 1.387 +HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE 1.388 +#undef HB_UNICODE_FUNC_IMPLEMENT 1.389 + 1.390 +/** 1.391 + * hb_unicode_compose: 1.392 + * @ufuncs: Unicode functions. 1.393 + * @a: 1.394 + * @b: 1.395 + * @ab: (out): 1.396 + * 1.397 + * 1.398 + * 1.399 + * Return value: 1.400 + * 1.401 + * Since: 1.0 1.402 + **/ 1.403 +hb_bool_t 1.404 +hb_unicode_compose (hb_unicode_funcs_t *ufuncs, 1.405 + hb_codepoint_t a, 1.406 + hb_codepoint_t b, 1.407 + hb_codepoint_t *ab) 1.408 +{ 1.409 + return ufuncs->compose (a, b, ab); 1.410 +} 1.411 + 1.412 +/** 1.413 + * hb_unicode_decompose: 1.414 + * @ufuncs: Unicode functions. 1.415 + * @ab: 1.416 + * @a: (out): 1.417 + * @b: (out): 1.418 + * 1.419 + * 1.420 + * 1.421 + * Return value: 1.422 + * 1.423 + * Since: 1.0 1.424 + **/ 1.425 +hb_bool_t 1.426 +hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, 1.427 + hb_codepoint_t ab, 1.428 + hb_codepoint_t *a, 1.429 + hb_codepoint_t *b) 1.430 +{ 1.431 + return ufuncs->decompose (ab, a, b); 1.432 +} 1.433 + 1.434 +/** 1.435 + * hb_unicode_decompose_compatibility: 1.436 + * @ufuncs: Unicode functions. 1.437 + * @u: 1.438 + * @decomposed: (out): 1.439 + * 1.440 + * 1.441 + * 1.442 + * Return value: 1.443 + * 1.444 + * Since: 1.0 1.445 + **/ 1.446 +unsigned int 1.447 +hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, 1.448 + hb_codepoint_t u, 1.449 + hb_codepoint_t *decomposed) 1.450 +{ 1.451 + return ufuncs->decompose_compatibility (u, decomposed); 1.452 +} 1.453 + 1.454 + 1.455 +/* See hb-unicode-private.hh for details. */ 1.456 +const uint8_t 1.457 +_hb_modified_combining_class[256] = 1.458 +{ 1.459 + 0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */ 1.460 + 1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */ 1.461 + 2, 3, 4, 5, 6, 1.462 + 7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */ 1.463 + 8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */ 1.464 + 9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */ 1.465 + 1.466 + /* Hebrew */ 1.467 + HB_MODIFIED_COMBINING_CLASS_CCC10, 1.468 + HB_MODIFIED_COMBINING_CLASS_CCC11, 1.469 + HB_MODIFIED_COMBINING_CLASS_CCC12, 1.470 + HB_MODIFIED_COMBINING_CLASS_CCC13, 1.471 + HB_MODIFIED_COMBINING_CLASS_CCC14, 1.472 + HB_MODIFIED_COMBINING_CLASS_CCC15, 1.473 + HB_MODIFIED_COMBINING_CLASS_CCC16, 1.474 + HB_MODIFIED_COMBINING_CLASS_CCC17, 1.475 + HB_MODIFIED_COMBINING_CLASS_CCC18, 1.476 + HB_MODIFIED_COMBINING_CLASS_CCC19, 1.477 + HB_MODIFIED_COMBINING_CLASS_CCC20, 1.478 + HB_MODIFIED_COMBINING_CLASS_CCC21, 1.479 + HB_MODIFIED_COMBINING_CLASS_CCC22, 1.480 + HB_MODIFIED_COMBINING_CLASS_CCC23, 1.481 + HB_MODIFIED_COMBINING_CLASS_CCC24, 1.482 + HB_MODIFIED_COMBINING_CLASS_CCC25, 1.483 + HB_MODIFIED_COMBINING_CLASS_CCC26, 1.484 + 1.485 + /* Arabic */ 1.486 + HB_MODIFIED_COMBINING_CLASS_CCC27, 1.487 + HB_MODIFIED_COMBINING_CLASS_CCC28, 1.488 + HB_MODIFIED_COMBINING_CLASS_CCC29, 1.489 + HB_MODIFIED_COMBINING_CLASS_CCC30, 1.490 + HB_MODIFIED_COMBINING_CLASS_CCC31, 1.491 + HB_MODIFIED_COMBINING_CLASS_CCC32, 1.492 + HB_MODIFIED_COMBINING_CLASS_CCC33, 1.493 + HB_MODIFIED_COMBINING_CLASS_CCC34, 1.494 + HB_MODIFIED_COMBINING_CLASS_CCC35, 1.495 + 1.496 + /* Syriac */ 1.497 + HB_MODIFIED_COMBINING_CLASS_CCC36, 1.498 + 1.499 + 37, 38, 39, 1.500 + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 1.501 + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1.502 + 80, 81, 82, 83, 1.503 + 1.504 + /* Telugu */ 1.505 + HB_MODIFIED_COMBINING_CLASS_CCC84, 1.506 + 85, 86, 87, 88, 89, 90, 1.507 + HB_MODIFIED_COMBINING_CLASS_CCC91, 1.508 + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 1.509 + 1.510 + /* Thai */ 1.511 + HB_MODIFIED_COMBINING_CLASS_CCC103, 1.512 + 104, 105, 106, 1.513 + HB_MODIFIED_COMBINING_CLASS_CCC107, 1.514 + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 1.515 + 1.516 + /* Lao */ 1.517 + HB_MODIFIED_COMBINING_CLASS_CCC118, 1.518 + 119, 120, 121, 1.519 + HB_MODIFIED_COMBINING_CLASS_CCC122, 1.520 + 123, 124, 125, 126, 127, 128, 1.521 + 1.522 + /* Tibetan */ 1.523 + HB_MODIFIED_COMBINING_CLASS_CCC129, 1.524 + HB_MODIFIED_COMBINING_CLASS_CCC130, 1.525 + 131, 1.526 + HB_MODIFIED_COMBINING_CLASS_CCC132, 1.527 + 133, 134, 135, 136, 137, 138, 139, 1.528 + 1.529 + 1.530 + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 1.531 + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1.532 + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 1.533 + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 1.534 + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 1.535 + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 1.536 + 1.537 + 200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */ 1.538 + 201, 1.539 + 202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */ 1.540 + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 1.541 + 214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */ 1.542 + 215, 1.543 + 216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */ 1.544 + 217, 1.545 + 218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */ 1.546 + 219, 1.547 + 220, /* HB_UNICODE_COMBINING_CLASS_BELOW */ 1.548 + 221, 1.549 + 222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */ 1.550 + 223, 1.551 + 224, /* HB_UNICODE_COMBINING_CLASS_LEFT */ 1.552 + 225, 1.553 + 226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */ 1.554 + 227, 1.555 + 228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */ 1.556 + 229, 1.557 + 230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */ 1.558 + 231, 1.559 + 232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */ 1.560 + 233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */ 1.561 + 234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */ 1.562 + 235, 236, 237, 238, 239, 1.563 + 240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */ 1.564 + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 1.565 + 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */ 1.566 +};