15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2009  Red Hat, Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2011  Codethink Limited
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2010,2011,2012  Google, Inc.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  This is part of HarfBuzz, a text shaping library.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Red Hat Author(s): Behdad Esfahbod
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Codethink Author(s): Ryan Lortie
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Google Author(s): Behdad Esfahbod
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-private.hh"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-unicode-private.hh"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hb_unicode_funcs_t
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_unicode_combining_class_t
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				hb_codepoint_t      unicode   HB_UNUSED,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				void               *user_data HB_UNUSED)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned int
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				hb_codepoint_t      unicode   HB_UNUSED,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				void               *user_data HB_UNUSED)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_unicode_general_category_t
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 hb_codepoint_t      unicode   HB_UNUSED,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 void               *user_data HB_UNUSED)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_codepoint_t
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  hb_codepoint_t      unicode   HB_UNUSED,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  void               *user_data HB_UNUSED)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return unicode;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_script_t
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       hb_codepoint_t      unicode   HB_UNUSED,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       void               *user_data HB_UNUSED)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HB_SCRIPT_UNKNOWN;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_bool_t
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			hb_codepoint_t      a         HB_UNUSED,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			hb_codepoint_t      b         HB_UNUSED,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			hb_codepoint_t     *ab        HB_UNUSED,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			void               *user_data HB_UNUSED)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_bool_t
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  hb_codepoint_t      ab        HB_UNUSED,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  hb_codepoint_t     *a         HB_UNUSED,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  hb_codepoint_t     *b         HB_UNUSED,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  void               *user_data HB_UNUSED)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned int
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs     HB_UNUSED,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					hb_codepoint_t      u          HB_UNUSED,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					hb_codepoint_t     *decomposed HB_UNUSED,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					void               *user_data  HB_UNUSED)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNCS_IMPLEMENT_SET \
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT (glib) \
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT (icu) \
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT (ucdn) \
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT (nil) \
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* ^--- Add new callbacks before nil */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define hb_nil_get_unicode_funcs hb_unicode_funcs_get_empty
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Prototype them all */
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" hb_unicode_funcs_t *hb_##set##_get_unicode_funcs (void);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_UNICODE_FUNCS_IMPLEMENT_SET
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_UNICODE_FUNCS_IMPLEMENT
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_t *
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_get_default (void)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hb_##set##_get_unicode_funcs ();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_GLIB
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT(glib)
13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT(icu)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(HAVE_UCDN)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNCS_NIL 1
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_UNICODE_FUNCS_IMPLEMENT(nil)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_UNICODE_FUNCS_IMPLEMENT
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef _MSC_VER
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#pragma message("Could not find any Unicode functions implementation, you have to provide your own")
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#pragma message("To suppress this warnings, define HB_NO_UNICODE_FUNCS")
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#warning "Could not find any Unicode functions implementation, you have to provide your own"
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#warning "To suppress this warning, define HB_NO_UNICODE_FUNCS"
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_create: (Xconstructor)
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @parent: (allow-none):
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: (transfer full):
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_t *
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_unicode_funcs_t *ufuncs;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ()))
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return hb_unicode_funcs_get_empty ();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!parent)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent = hb_unicode_funcs_get_empty ();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_unicode_funcs_make_immutable (parent);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ufuncs->parent = hb_unicode_funcs_reference (parent);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ufuncs->func = parent->func;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* We can safely copy user_data from parent since we hold a reference
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * onto it and it's immutable.  We should not copy the destroy notifiers
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * though. */
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ufuncs->user_data = parent->user_data;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ufuncs;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_OBJECT_HEADER_STATIC,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL, /* parent */
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  true, /* immutable */
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_UNICODE_FUNC_IMPLEMENT
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_get_empty:
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: (transfer full):
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_t *
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_get_empty (void)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_reference: (skip)
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: (transfer full):
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_t *
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hb_object_reference (ufuncs);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_destroy: (skip)
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!hb_object_destroy (ufuncs)) return;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNC_IMPLEMENT(name) \
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_UNICODE_FUNC_IMPLEMENT
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_unicode_funcs_destroy (ufuncs->parent);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  free (ufuncs);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_set_user_data: (skip)
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @key:
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @data:
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @destroy:
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @replace:
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value:
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_bool_t
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			        hb_user_data_key_t *key,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			        void *              data,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			        hb_destroy_func_t   destroy,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				hb_bool_t           replace)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hb_object_set_user_data (ufuncs, key, data, destroy, replace);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_get_user_data: (skip)
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @key:
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: (transfer none):
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			        hb_user_data_key_t *key)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hb_object_get_user_data (ufuncs, key);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_make_immutable:
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (unlikely (hb_object_is_inert (ufuncs)))
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ufuncs->immutable = true;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_is_immutable:
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value:
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_bool_t
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ufuncs->immutable;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_funcs_get_parent:
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value:
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_t *
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty ();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNC_IMPLEMENT(name)						\
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)										\
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void										\
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t		   *ufuncs,	\
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    hb_unicode_##name##_func_t	    func,	\
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    void			   *user_data,	\
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    hb_destroy_func_t		    destroy)	\
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){										\
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ufuncs->immutable)							\
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;									\
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)										\
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ufuncs->destroy.name)							\
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ufuncs->destroy.name (ufuncs->user_data.name);				\
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)										\
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (func) {									\
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ufuncs->func.name = func;							\
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ufuncs->user_data.name = user_data;						\
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ufuncs->destroy.name = destroy;						\
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {									\
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ufuncs->func.name = ufuncs->parent->func.name;				\
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ufuncs->user_data.name = ufuncs->parent->user_data.name;			\
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ufuncs->destroy.name = NULL;						\
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }										\
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_UNICODE_FUNC_IMPLEMENT
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name)				\
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)										\
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)return_type									\
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_##name (hb_unicode_funcs_t *ufuncs,					\
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   hb_codepoint_t      unicode)					\
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){										\
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ufuncs->name (unicode);						\
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_UNICODE_FUNC_IMPLEMENT
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_compose:
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @a:
396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @b:
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ab: (out):
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value:
402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_bool_t
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hb_codepoint_t      a,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hb_codepoint_t      b,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hb_codepoint_t     *ab)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ufuncs->compose (a, b, ab);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_decompose:
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ab:
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @a: (out):
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @b: (out):
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value:
424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_bool_t
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      hb_codepoint_t      ab,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      hb_codepoint_t     *a,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      hb_codepoint_t     *b)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ufuncs->decompose (ab, a, b);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_unicode_decompose_compatibility:
438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @ufuncs: Unicode functions.
439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @u:
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @decomposed: (out):
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value:
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned int
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    hb_codepoint_t      u,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    hb_codepoint_t     *decomposed)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ufuncs->decompose_compatibility (u, decomposed);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* See hb-unicode-private.hh for details. */
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8_t
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_modified_combining_class[256] =
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  2, 3, 4, 5, 6,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Hebrew */
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC10,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC11,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC12,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC13,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC14,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC15,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC16,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC17,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC18,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC19,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC20,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC21,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC22,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC23,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC24,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC25,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC26,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Arabic */
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC27,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC28,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC29,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC30,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC31,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC32,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC33,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC34,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC35,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Syriac */
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC36,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  37, 38, 39,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  80, 81, 82, 83,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Telugu */
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC84,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  85, 86, 87, 88, 89, 90,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC91,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Thai */
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC103,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  104, 105, 106,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC107,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Lao */
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC118,
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  119, 120, 121,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC122,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  123, 124, 125, 126, 127, 128,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Tibetan */
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC129,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC130,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  131,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_MODIFIED_COMBINING_CLASS_CCC132,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  133, 134, 135, 136, 137, 138, 139,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  201,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  215,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  217,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  219,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  220, /* HB_UNICODE_COMBINING_CLASS_BELOW */
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  221,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  223,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  224, /* HB_UNICODE_COMBINING_CLASS_LEFT */
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  225,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  227,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  229,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  231,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  235, 236, 237, 238, 239,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
569