hb-unicode.cc revision c57d454accff66e5f2c58006e8fb40bc020b6182
15c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod/* 25c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * Copyright (C) 2009 Red Hat, Inc. 32fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie * Copyright © 2011 Codethink Limited 4fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod * Copyright (C) 2010 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 EsfahbodHB_BEGIN_DECLS 36acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod 37acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod 385c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod/* 395c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * hb_unicode_funcs_t 405c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod */ 415c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 42fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodstatic unsigned int 43fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_get_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 44fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 45fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod void *user_data HB_UNUSED) 462fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie{ 47fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod return 0; 48fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod} 49fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 50fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodstatic unsigned int 51fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_get_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 52fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 53fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod void *user_data HB_UNUSED) 54fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod{ 55fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod return 1; 562fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie} 572fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 582fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortiestatic hb_unicode_general_category_t 592fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortiehb_unicode_get_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 60fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 61fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod void *user_data HB_UNUSED) 622fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie{ 632fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER; 642fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie} 652fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 66fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodstatic hb_codepoint_t 67fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_get_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 68fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 69fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod void *user_data HB_UNUSED) 702fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie{ 71fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod return unicode; 722fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie} 732fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 74fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodstatic hb_script_t 75fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_get_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, 76fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_codepoint_t unicode HB_UNUSED, 77fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod void *user_data HB_UNUSED) 782fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie{ 79fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod return HB_SCRIPT_UNKNOWN; 802fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie} 812fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 8248910f8f0034c54b4e11cef3d08aa40e52c06b28Behdad Esfahbod 83af9e104028b7cdc1fbba0eb1d86cfa4d5258657fBehdad Esfahbodhb_unicode_funcs_t _hb_unicode_funcs_nil = { 8404cc0a29ee1472c318c36efcd19b9c1a6657d9eaBehdad Esfahbod HB_REFERENCE_COUNT_INVALID, /* ref_count */ 852fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie NULL, /* parent */ 86eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod TRUE, /* immutable */ 87bf36a1074ab23abeab0a7a6c47db26770dc1ab0aBehdad Esfahbod { 88fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_unicode_get_combining_class_nil, 89fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_unicode_get_eastasian_width_nil, 90fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_unicode_get_general_category_nil, 91fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_unicode_get_mirroring_nil, 92fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_unicode_get_script_nil, 93bf36a1074ab23abeab0a7a6c47db26770dc1ab0aBehdad Esfahbod } 945c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod}; 955c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 96fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 975c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodhb_unicode_funcs_t * 982fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortiehb_unicode_funcs_create (hb_unicode_funcs_t *parent) 995c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod{ 1005c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod hb_unicode_funcs_t *ufuncs; 1015c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 1025c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs)) 1035c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod return &_hb_unicode_funcs_nil; 1045c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 105fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod if (parent != NULL) 106fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod { 1072fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie hb_unicode_funcs_make_immutable (parent); 108fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->parent = hb_unicode_funcs_reference (parent); 109fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 110fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->get = parent->get; 111fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 112fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod /* We can safely copy user_data from parent since we hold a reference 113fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod * onto it and it's immutable. We should not copy the destroy notifiers 114fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod * though. */ 115fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->user_data = parent->user_data; 116fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod } 117fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod else 118fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod { 119fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->get = _hb_unicode_funcs_nil.get; 1202fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie } 12148910f8f0034c54b4e11cef3d08aa40e52c06b28Behdad Esfahbod 1225c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod return ufuncs; 1235c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod} 1245c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 1255c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodhb_unicode_funcs_t * 1265c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodhb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs) 1275c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod{ 1285c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod HB_OBJECT_DO_REFERENCE (ufuncs); 1295c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod} 1305c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 1315c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodvoid 1325c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodhb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs) 1335c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod{ 1345c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod HB_OBJECT_DO_DESTROY (ufuncs); 1355c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 136fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod#define DESTROY(name) if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name) 137fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod DESTROY (combining_class); 138fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod DESTROY (eastasian_width); 139fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod DESTROY (general_category); 140fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod DESTROY (mirroring); 141fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod DESTROY (script); 142fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod#undef DESTROY 143fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 1442fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie if (ufuncs->parent != NULL) 1452fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie hb_unicode_funcs_destroy (ufuncs->parent); 1462fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie 1475c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod free (ufuncs); 1485c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod} 1495c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 150eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbodvoid 151eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbodhb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs) 152eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod{ 153eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod if (HB_OBJECT_IS_INERT (ufuncs)) 154eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod return; 155eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod 156eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod ufuncs->immutable = TRUE; 157eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod} 158eb27ec0cef0d92740875ab5035b53acc639e5faeBehdad Esfahbod 159645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbodhb_bool_t 160645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbodhb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs) 161645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod{ 162645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod return ufuncs->immutable; 163645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod} 164645f6f265b5f6fb85b3c0f59ea874d58c86e3917Behdad Esfahbod 165fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_funcs_t * 166fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs) 167fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod{ 168fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod return ufuncs->parent; 169fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod} 170fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod 17104cc0a29ee1472c318c36efcd19b9c1a6657d9eaBehdad Esfahbod 172fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod#define IMPLEMENT(return_type, name) \ 173fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod \ 1742fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortievoid \ 1752fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortiehb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \ 1762fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie hb_unicode_get_##name##_func_t func, \ 1772fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie void *user_data, \ 1782fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie hb_destroy_func_t destroy) \ 1792fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie{ \ 1802fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie if (ufuncs->immutable) \ 1812fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie return; \ 1822fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie \ 183fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod if (ufuncs->destroy.name) \ 184fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->destroy.name (ufuncs->user_data.name); \ 185fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod \ 186fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod if (func) { \ 187fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->get.name = func; \ 188fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->user_data.name = user_data; \ 189fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->destroy.name = destroy; \ 1902fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie } else if (ufuncs->parent != NULL) { \ 191fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->get.name = ufuncs->parent->get.name; \ 192fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->user_data.name = ufuncs->parent->user_data.name; \ 193fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->destroy.name = NULL; \ 1942fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie } else { \ 195fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->get.name = hb_unicode_get_##name##_nil; \ 196fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->user_data.name = NULL; \ 197fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod ufuncs->destroy.name = NULL; \ 1982fd0c577e322ccbf762927bc4600b3ea31db4c80Ryan Lortie } \ 199fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod} \ 200fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod \ 201fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodreturn_type \ 202fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbodhb_unicode_get_##name (hb_unicode_funcs_t *ufuncs, \ 203fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod hb_codepoint_t unicode) \ 204fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod{ \ 205fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod return ufuncs->get.name (ufuncs, unicode, ufuncs->user_data.name); \ 20604cc0a29ee1472c318c36efcd19b9c1a6657d9eaBehdad Esfahbod} 20704cc0a29ee1472c318c36efcd19b9c1a6657d9eaBehdad Esfahbod 208fb194b8794898f51eb596fa4092c26606889d376Behdad EsfahbodIMPLEMENT (unsigned int, combining_class) 209fb194b8794898f51eb596fa4092c26606889d376Behdad EsfahbodIMPLEMENT (unsigned int, eastasian_width) 210fb194b8794898f51eb596fa4092c26606889d376Behdad EsfahbodIMPLEMENT (hb_unicode_general_category_t, general_category) 211fb194b8794898f51eb596fa4092c26606889d376Behdad EsfahbodIMPLEMENT (hb_codepoint_t, mirroring) 212fb194b8794898f51eb596fa4092c26606889d376Behdad EsfahbodIMPLEMENT (hb_script_t, script) 2135ceefa1d8dbd310570ea8d1c47107fe8d3dc96d9Behdad Esfahbod 214fb194b8794898f51eb596fa4092c26606889d376Behdad Esfahbod#undef IMPLEMENT 2155ceefa1d8dbd310570ea8d1c47107fe8d3dc96d9Behdad Esfahbod 2165ceefa1d8dbd310570ea8d1c47107fe8d3dc96d9Behdad Esfahbod 217acdba3f90b232fc12fcb200dca2584481b339118Behdad EsfahbodHB_END_DECLS 218