hb-unicode.cc revision 6adf417bc15d4524e280b284e3accd1ae647662e
15c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod/* 22409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Copyright © 2009 Red Hat, Inc. 36adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * Copyright © 2011 Codethink Limited 46adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * Copyright © 2010,2011,2012 Google, Inc. 55c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * 6c755cb3e3ac55156d0d2ec05adea7a650b97cc41Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 75c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * 85c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * Permission is hereby granted, without written agreement and without 95c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 105c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * software and its documentation for any purpose, provided that the 115c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 125c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * all copies of this software. 135c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * 145c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 155c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 165c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 175c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 185c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * DAMAGE. 195c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * 205c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 215c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 225c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 235c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 245c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 255c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * 265c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * Red Hat Author(s): Behdad Esfahbod 272fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie * Codethink Author(s): Ryan Lortie 28fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod * Google Author(s): Behdad Esfahbod 295c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod */ 305c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 31c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#include "hb-private.hh" 325c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 33fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod#include "hb-unicode-private.hh" 345c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 35acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod 36acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod 375c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod/* 385c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * hb_unicode_funcs_t 395c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod */ 405c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 4121fdcee00125b6e1c09f0bed3064d16ccd3a7a5dBehdad Esfahbodstatic hb_unicode_combining_class_t 42c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 43c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 44c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod void *user_data HB_UNUSED) 45891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod{ 4621fdcee00125b6e1c09f0bed3064d16ccd3a7a5dBehdad Esfahbod return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED; 472fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie} 482fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 49891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbodstatic unsigned int 50c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 51c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 52c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod void *user_data HB_UNUSED) 53891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod{ 54891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod return 1; 55891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod} 56891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod 57891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbodstatic hb_unicode_general_category_t 58c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 59c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 60c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod void *user_data HB_UNUSED) 61891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod{ 62891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER; 63891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod} 64891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod 65891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbodstatic hb_codepoint_t 66c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 67c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 68c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod void *user_data HB_UNUSED) 69891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod{ 70891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod return unicode; 71891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod} 72891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod 73891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbodstatic hb_script_t 74c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 75c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 76c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod void *user_data HB_UNUSED) 77891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod{ 78891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod return HB_SCRIPT_UNKNOWN; 79891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod} 802fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 81c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodstatic hb_bool_t 8222fdc66712464bdb02e45eed49e4be57e79b442fBehdad Esfahbodhb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 83c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t a HB_UNUSED, 84c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t b HB_UNUSED, 85c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t *ab HB_UNUSED, 86c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod void *user_data HB_UNUSED) 87c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod{ 880594a2448440208efa0acac9a5d8d52d43108289Behdad Esfahbod return false; 89c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod} 90c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod 91c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodstatic hb_bool_t 9222fdc66712464bdb02e45eed49e4be57e79b442fBehdad Esfahbodhb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 93c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t ab HB_UNUSED, 94c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t *a HB_UNUSED, 95c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t *b HB_UNUSED, 96c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod void *user_data HB_UNUSED) 97c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod{ 980594a2448440208efa0acac9a5d8d52d43108289Behdad Esfahbod return false; 99c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod} 100c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod 10148910f8f0034c54b4e11cef3d08aa40e52c06b28Behdad Esfahbod 102378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbodstatic unsigned int 103378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbodhb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 104378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod hb_codepoint_t u HB_UNUSED, 105378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod hb_codepoint_t *decomposed HB_UNUSED, 106378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod void *user_data HB_UNUSED) 107378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod{ 108378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod return 0; 109378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod} 110378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod 111fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 1125c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodhb_unicode_funcs_t * 113d4bee9f813bb299b1c4aab7c33d588be2a7d354bBehdad Esfahbodhb_unicode_funcs_get_default (void) 114d4bee9f813bb299b1c4aab7c33d588be2a7d354bBehdad Esfahbod{ 115be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_default); 116d4bee9f813bb299b1c4aab7c33d588be2a7d354bBehdad Esfahbod} 117d4bee9f813bb299b1c4aab7c33d588be2a7d354bBehdad Esfahbod 118d4bee9f813bb299b1c4aab7c33d588be2a7d354bBehdad Esfahbodhb_unicode_funcs_t * 1192fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortiehb_unicode_funcs_create (hb_unicode_funcs_t *parent) 1205c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod{ 1215c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod hb_unicode_funcs_t *ufuncs; 1225c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 12347e71d9661946a4ffb96026bf1d697d788414ab5Behdad Esfahbod if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ())) 124f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod return hb_unicode_funcs_get_empty (); 1255c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 126c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod if (!parent) 127f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod parent = hb_unicode_funcs_get_empty (); 128fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 129c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod hb_unicode_funcs_make_immutable (parent); 130c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod ufuncs->parent = hb_unicode_funcs_reference (parent); 131fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 132c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod ufuncs->func = parent->func; 133c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod 134c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod /* We can safely copy user_data from parent since we hold a reference 135c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod * onto it and it's immutable. We should not copy the destroy notifiers 136c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod * though. */ 137c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod ufuncs->user_data = parent->user_data; 13848910f8f0034c54b4e11cef3d08aa40e52c06b28Behdad Esfahbod 1395c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod return ufuncs; 1405c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod} 1415c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 142f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod 143be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbodextern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil; 144be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbodconst hb_unicode_funcs_t _hb_unicode_funcs_nil = { 145be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod HB_OBJECT_HEADER_STATIC, 146be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod 147be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod NULL, /* parent */ 1480594a2448440208efa0acac9a5d8d52d43108289Behdad Esfahbod true, /* immutable */ 149be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod { 150f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil, 151be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 152f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod#undef HB_UNICODE_FUNC_IMPLEMENT 153be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod } 154be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod}; 155f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod 156be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbodhb_unicode_funcs_t * 157be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbodhb_unicode_funcs_get_empty (void) 158be4560a3b5e8599cbe2b29a01a60c21c9e2b194fBehdad Esfahbod{ 159f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil); 16080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod} 16180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 16280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbodhb_unicode_funcs_t * 1635c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodhb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs) 1645c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod{ 16547e71d9661946a4ffb96026bf1d697d788414ab5Behdad Esfahbod return hb_object_reference (ufuncs); 1665c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod} 1675c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 1685c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodvoid 1695c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodhb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs) 1705c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod{ 17147e71d9661946a4ffb96026bf1d697d788414ab5Behdad Esfahbod if (!hb_object_destroy (ufuncs)) return; 1725c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 173891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod#define HB_UNICODE_FUNC_IMPLEMENT(name) \ 1744b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name); 1754b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 1764b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod#undef HB_UNICODE_FUNC_IMPLEMENT 177fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 178c784c67a28f5b92d396eaa9529d57ef91a5cb9acBehdad Esfahbod hb_unicode_funcs_destroy (ufuncs->parent); 1792fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 1805c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod free (ufuncs); 1815c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod} 1825c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 1835fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbodhb_bool_t 1845fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbodhb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs, 1855fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod hb_user_data_key_t *key, 1865fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod void * data, 18733ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod hb_destroy_func_t destroy, 18833ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod hb_bool_t replace) 1895fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod{ 19033ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod return hb_object_set_user_data (ufuncs, key, data, destroy, replace); 1915fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod} 1925fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod 1935fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbodvoid * 1945fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbodhb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs, 1955fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod hb_user_data_key_t *key) 1965fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod{ 1975fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod return hb_object_get_user_data (ufuncs, key); 1985fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod} 1995fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod 2005fa849b77d49da2212825ebb1bea9145713b8449Behdad Esfahbod 201eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbodvoid 202eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbodhb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs) 203eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod{ 20447e71d9661946a4ffb96026bf1d697d788414ab5Behdad Esfahbod if (hb_object_is_inert (ufuncs)) 205eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod return; 206eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod 2070594a2448440208efa0acac9a5d8d52d43108289Behdad Esfahbod ufuncs->immutable = true; 208eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod} 209eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod 210645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbodhb_bool_t 211645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbodhb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs) 212645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod{ 213645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod return ufuncs->immutable; 214645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod} 215645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod 216fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_funcs_t * 217fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs) 218fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod{ 219f06ab8a4262c759b4723614fd28f55ee77aa8466Behdad Esfahbod return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty (); 220fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod} 221fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 22204cc0a29ee1472c318c36efcd19b9c1a6657d9eaBehdad Esfahbod 223891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod#define HB_UNICODE_FUNC_IMPLEMENT(name) \ 2244b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod \ 2254b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbodvoid \ 2264b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbodhb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \ 227c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_unicode_##name##_func_t func, \ 2284b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod void *user_data, \ 2294b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod hb_destroy_func_t destroy) \ 2304b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod{ \ 2314b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod if (ufuncs->immutable) \ 2324b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod return; \ 2334b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod \ 2344b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod if (ufuncs->destroy.name) \ 2354b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod ufuncs->destroy.name (ufuncs->user_data.name); \ 2364b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod \ 2374b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod if (func) { \ 238c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod ufuncs->func.name = func; \ 2394b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod ufuncs->user_data.name = user_data; \ 2404b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod ufuncs->destroy.name = destroy; \ 2414b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod } else { \ 242c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod ufuncs->func.name = ufuncs->parent->func.name; \ 2434b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod ufuncs->user_data.name = ufuncs->parent->user_data.name; \ 2444b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod ufuncs->destroy.name = NULL; \ 2454b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod } \ 246891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod} 247891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod 2487470315a3e782aa6192bbe64f7a3944266fb1521Behdad EsfahbodHB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 249891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod#undef HB_UNICODE_FUNC_IMPLEMENT 250891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod 251891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod 252891c4755baae6cd59fad59d27fd8933e5f548a74Behdad Esfahbod#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \ 2534b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod \ 2544b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbodreturn_type \ 255c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_##name (hb_unicode_funcs_t *ufuncs, \ 256c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t unicode) \ 2574b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod{ \ 2587470315a3e782aa6192bbe64f7a3944266fb1521Behdad Esfahbod return ufuncs->name (unicode); \ 2594b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod} 2607470315a3e782aa6192bbe64f7a3944266fb1521Behdad EsfahbodHB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE 2614b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod#undef HB_UNICODE_FUNC_IMPLEMENT 2625ceefa1d8dbd310570ea8d1c47107fe8d3dc96d9Behdad Esfahbod 263c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_bool_t 264c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_compose (hb_unicode_funcs_t *ufuncs, 265c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t a, 266c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t b, 267c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t *ab) 268c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod{ 2697470315a3e782aa6192bbe64f7a3944266fb1521Behdad Esfahbod return ufuncs->compose (a, b, ab); 270c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod} 271c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod 272c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_bool_t 273c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbodhb_unicode_decompose (hb_unicode_funcs_t *ufuncs, 274c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t ab, 275c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t *a, 276c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod hb_codepoint_t *b) 277c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod{ 2787470315a3e782aa6192bbe64f7a3944266fb1521Behdad Esfahbod return ufuncs->decompose (ab, a, b); 279c4641723fbf6532b2e80a662e15573b31276bc73Behdad Esfahbod} 2805ceefa1d8dbd310570ea8d1c47107fe8d3dc96d9Behdad Esfahbod 281378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbodunsigned int 282378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbodhb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, 283378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod hb_codepoint_t u, 284378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod hb_codepoint_t *decomposed) 285378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod{ 2867470315a3e782aa6192bbe64f7a3944266fb1521Behdad Esfahbod return ufuncs->decompose_compatibility (u, decomposed); 287378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod} 2882db2a566826ed4763ce69629194ec656bd48b0bdBehdad Esfahbod 2892db2a566826ed4763ce69629194ec656bd48b0bdBehdad Esfahbod 2906adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbodconst uint8_t 2916adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod_hb_modified_combining_class[256] = 2922db2a566826ed4763ce69629194ec656bd48b0bdBehdad Esfahbod{ 2936adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */ 2946adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */ 2956adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 2, 3, 4, 5, 6, 2966adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */ 2976adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */ 2986adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */ 2996adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3006adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* Hebrew */ 3016adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3026adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* 3036adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * We permute the "fixed-position" classes 10-26 into the order 3046adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * described in the SBL Hebrew manual: 3056adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * 3066adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * http://www.sbl-site.org/Fonts/SBLHebrewUserManual1.5x.pdf 3076adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * 3086adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * (as recommended by: 3096adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * http://forum.fontlab.com/archive-old-microsoft-volt-group/vista-and-diacritic-ordering-t6751.0.html) 3106adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * 3116adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * More details here: 3126adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * https://bugzilla.mozilla.org/show_bug.cgi?id=662055 3136adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod */ 3146adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 22, /* HB_UNICODE_COMBINING_CLASS_CCC10 sheva */ 3156adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 15, /* HB_UNICODE_COMBINING_CLASS_CCC11 hataf segol */ 3166adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 16, /* HB_UNICODE_COMBINING_CLASS_CCC12 hataf patah*/ 3176adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 17, /* HB_UNICODE_COMBINING_CLASS_CCC13 hataf qamats */ 3186adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 23, /* HB_UNICODE_COMBINING_CLASS_CCC14 hiriq */ 3196adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 18, /* HB_UNICODE_COMBINING_CLASS_CCC15 tsere */ 3206adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 19, /* HB_UNICODE_COMBINING_CLASS_CCC16 segol */ 3216adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 20, /* HB_UNICODE_COMBINING_CLASS_CCC17 patah */ 3226adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 21, /* HB_UNICODE_COMBINING_CLASS_CCC18 qamats */ 3236adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 14, /* HB_UNICODE_COMBINING_CLASS_CCC19 holam */ 3246adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 24, /* HB_UNICODE_COMBINING_CLASS_CCC20 qubuts */ 3256adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 12, /* HB_UNICODE_COMBINING_CLASS_CCC21 dagesh */ 3266adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 25, /* HB_UNICODE_COMBINING_CLASS_CCC22 meteg */ 3276adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 13, /* HB_UNICODE_COMBINING_CLASS_CCC23 rafe */ 3286adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 10, /* HB_UNICODE_COMBINING_CLASS_CCC24 shin dot */ 3296adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 11, /* HB_UNICODE_COMBINING_CLASS_CCC25 sin dot */ 3306adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3316adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 26, /* HB_UNICODE_COMBINING_CLASS_CCC26 */ 3326adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3336adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* Arabic */ 3346adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3356adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* 3366adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * Modify to move Shadda (ccc=33) before other marks. See: 3376adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * http://unicode.org/faq/normalization.html#8 3386adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * http://unicode.org/faq/normalization.html#9 3396adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod */ 3406adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 28, /* HB_UNICODE_COMBINING_CLASS_CCC27 */ 3416adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 29, /* HB_UNICODE_COMBINING_CLASS_CCC28 */ 3426adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 30, /* HB_UNICODE_COMBINING_CLASS_CCC29 */ 3436adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 31, /* HB_UNICODE_COMBINING_CLASS_CCC30 */ 3446adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 32, /* HB_UNICODE_COMBINING_CLASS_CCC31 */ 3456adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 33, /* HB_UNICODE_COMBINING_CLASS_CCC32 */ 3466adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 27, /* HB_UNICODE_COMBINING_CLASS_CCC33 shadda */ 3476adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3486adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 34, /* HB_UNICODE_COMBINING_CLASS_CCC34 */ 3496adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 35, /* HB_UNICODE_COMBINING_CLASS_CCC35 */ 3506adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3516adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* Syriac */ 3526adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 36, /* HB_UNICODE_COMBINING_CLASS_CCC36 */ 3536adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3546adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 37, 38, 39, 3556adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 3566adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 3576adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 80, 81, 82, 83, 3586adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3596adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* Telugu */ 3606adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3616adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* 3626adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * Modify Telugu length marks (ccc=84, ccc=91). 3636adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * These are the only matras in the main Indic scripts range that have 3646adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * a non-zero ccc. That makes them reorder with the Halant that is 3656adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * ccc=9. Just zero them, we don't need them in our Indic shaper. 3666adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod */ 3676adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 0, /* HB_UNICODE_COMBINING_CLASS_CCC84 */ 3686adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 85, 86, 87, 88, 89, 90, 3696adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 0, /* HB_UNICODE_COMBINING_CLASS_CCC91 */ 3706adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 3716adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3726adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* Thai */ 3736adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3746adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* 3756adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * Modify U+0E38 and U+0E39 (ccc=104) to be reordered before U+0E3A (ccc=9). 3766adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod * Uniscribe does this too. 3776adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod */ 3786adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3, /* HB_UNICODE_COMBINING_CLASS_CCC103 */ 3796adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3806adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 104, 105, 106, 3816adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 107, /* HB_UNICODE_COMBINING_CLASS_CCC107 */ 3826adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 3836adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3846adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* Lao */ 3856adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 118, /* HB_UNICODE_COMBINING_CLASS_CCC118 */ 3866adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 119, 120, 121, 3876adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 122, /* HB_UNICODE_COMBINING_CLASS_CCC122 */ 3886adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 123, 124, 125, 126, 127, 128, 3896adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3906adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod /* Tibetan */ 3916adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 129, /* HB_UNICODE_COMBINING_CLASS_CCC129 */ 3926adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 130, /* HB_UNICODE_COMBINING_CLASS_CCC130 */ 3936adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 131, 3946adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 132, /* HB_UNICODE_COMBINING_CLASS_CCC133 */ 3956adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 133, 134, 135, 136, 137, 138, 139, 3966adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3976adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 3986adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 3996adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 4006adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 4016adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 4026adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 4036adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 4046adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 4056adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */ 4066adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 201, 4076adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */ 4086adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 4096adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */ 4106adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 215, 4116adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */ 4126adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 217, 4136adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */ 4146adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 219, 4156adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 220, /* HB_UNICODE_COMBINING_CLASS_BELOW */ 4166adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 221, 4176adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */ 4186adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 223, 4196adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 224, /* HB_UNICODE_COMBINING_CLASS_LEFT */ 4206adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 225, 4216adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */ 4226adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 227, 4236adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */ 4246adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 229, 4256adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */ 4266adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 231, 4276adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */ 4286adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */ 4296adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */ 4306adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 235, 236, 237, 238, 239, 4316adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */ 4326adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 4336adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */ 4346adf417bc15d4524e280b284e3accd1ae647662eBehdad Esfahbod}; 435