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