Blame src/hb-unicode.cc

Packit Service 5bcba8
/*
Packit Service 5bcba8
 * Copyright © 2009  Red Hat, Inc.
Packit Service 5bcba8
 * Copyright © 2011  Codethink Limited
Packit Service 5bcba8
 * Copyright © 2010,2011,2012  Google, Inc.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 *  This is part of HarfBuzz, a text shaping library.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Permission is hereby granted, without written agreement and without
Packit Service 5bcba8
 * license or royalty fees, to use, copy, modify, and distribute this
Packit Service 5bcba8
 * software and its documentation for any purpose, provided that the
Packit Service 5bcba8
 * above copyright notice and the following two paragraphs appear in
Packit Service 5bcba8
 * all copies of this software.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
Packit Service 5bcba8
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
Packit Service 5bcba8
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
Packit Service 5bcba8
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
Packit Service 5bcba8
 * DAMAGE.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
Packit Service 5bcba8
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
Packit Service 5bcba8
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
Packit Service 5bcba8
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
Packit Service 5bcba8
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Red Hat Author(s): Behdad Esfahbod
Packit Service 5bcba8
 * Codethink Author(s): Ryan Lortie
Packit Service 5bcba8
 * Google Author(s): Behdad Esfahbod
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
#include "hb-private.hh"
Packit Service 5bcba8
Packit Service 5bcba8
#include "hb-unicode-private.hh"
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
/*
Packit Service 5bcba8
 * hb_unicode_funcs_t
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
static hb_unicode_combining_class_t
Packit Service 5bcba8
hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
Packit Service 5bcba8
				hb_codepoint_t      unicode   HB_UNUSED,
Packit Service 5bcba8
				void               *user_data HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
static unsigned int
Packit Service 5bcba8
hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
Packit Service 5bcba8
				hb_codepoint_t      unicode   HB_UNUSED,
Packit Service 5bcba8
				void               *user_data HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return 1;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
static hb_unicode_general_category_t
Packit Service 5bcba8
hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
Packit Service 5bcba8
				 hb_codepoint_t      unicode   HB_UNUSED,
Packit Service 5bcba8
				 void               *user_data HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
static hb_codepoint_t
Packit Service 5bcba8
hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
Packit Service 5bcba8
			  hb_codepoint_t      unicode   HB_UNUSED,
Packit Service 5bcba8
			  void               *user_data HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return unicode;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
static hb_script_t
Packit Service 5bcba8
hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
Packit Service 5bcba8
		       hb_codepoint_t      unicode   HB_UNUSED,
Packit Service 5bcba8
		       void               *user_data HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return HB_SCRIPT_UNKNOWN;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
static hb_bool_t
Packit Service 5bcba8
hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
Packit Service 5bcba8
			hb_codepoint_t      a         HB_UNUSED,
Packit Service 5bcba8
			hb_codepoint_t      b         HB_UNUSED,
Packit Service 5bcba8
			hb_codepoint_t     *ab        HB_UNUSED,
Packit Service 5bcba8
			void               *user_data HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return false;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
static hb_bool_t
Packit Service 5bcba8
hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
Packit Service 5bcba8
			  hb_codepoint_t      ab        HB_UNUSED,
Packit Service 5bcba8
			  hb_codepoint_t     *a         HB_UNUSED,
Packit Service 5bcba8
			  hb_codepoint_t     *b         HB_UNUSED,
Packit Service 5bcba8
			  void               *user_data HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return false;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
static unsigned int
Packit Service 5bcba8
hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs     HB_UNUSED,
Packit Service 5bcba8
					hb_codepoint_t      u          HB_UNUSED,
Packit Service 5bcba8
					hb_codepoint_t     *decomposed HB_UNUSED,
Packit Service 5bcba8
					void               *user_data  HB_UNUSED)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return 0;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
#define HB_UNICODE_FUNCS_IMPLEMENT_SET \
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT (glib) \
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT (icu) \
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT (ucdn) \
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT (nil) \
Packit Service 5bcba8
  /* ^--- Add new callbacks before nil */
Packit Service 5bcba8
Packit Service 5bcba8
#define hb_nil_get_unicode_funcs hb_unicode_funcs_get_empty
Packit Service 5bcba8
Packit Service 5bcba8
/* Prototype them all */
Packit Service 5bcba8
#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
Packit Service 5bcba8
extern "C" hb_unicode_funcs_t *hb_##set##_get_unicode_funcs (void);
Packit Service 5bcba8
HB_UNICODE_FUNCS_IMPLEMENT_SET
Packit Service 5bcba8
#undef HB_UNICODE_FUNCS_IMPLEMENT
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
hb_unicode_funcs_t *
Packit Service 5bcba8
hb_unicode_funcs_get_default (void)
Packit Service 5bcba8
{
Packit Service 5bcba8
#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
Packit Service 5bcba8
  return hb_##set##_get_unicode_funcs ();
Packit Service 5bcba8
Packit Service 5bcba8
#if defined(HAVE_UCDN)
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
Packit Service 5bcba8
#elif defined(HAVE_GLIB)
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT(glib)
Packit Service 5bcba8
#elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT(icu)
Packit Service 5bcba8
#else
Packit Service 5bcba8
#define HB_UNICODE_FUNCS_NIL 1
Packit Service 5bcba8
  HB_UNICODE_FUNCS_IMPLEMENT(nil)
Packit Service 5bcba8
#endif
Packit Service 5bcba8
Packit Service 5bcba8
#undef HB_UNICODE_FUNCS_IMPLEMENT
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
#if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
Packit Service 5bcba8
#error "Could not find any Unicode functions implementation, you have to provide your own"
Packit Service 5bcba8
#error "Consider building hb-ucdn.c.  If you absolutely want to build without any, check the code."
Packit Service 5bcba8
#endif
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_create: (Xconstructor)
Packit Service 5bcba8
 * @parent: (nullable):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: (transfer full):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_unicode_funcs_t *
Packit Service 5bcba8
hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
Packit Service 5bcba8
{
Packit Service 5bcba8
  hb_unicode_funcs_t *ufuncs;
Packit Service 5bcba8
Packit Service 5bcba8
  if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ()))
Packit Service 5bcba8
    return hb_unicode_funcs_get_empty ();
Packit Service 5bcba8
Packit Service 5bcba8
  if (!parent)
Packit Service 5bcba8
    parent = hb_unicode_funcs_get_empty ();
Packit Service 5bcba8
Packit Service 5bcba8
  hb_unicode_funcs_make_immutable (parent);
Packit Service 5bcba8
  ufuncs->parent = hb_unicode_funcs_reference (parent);
Packit Service 5bcba8
Packit Service 5bcba8
  ufuncs->func = parent->func;
Packit Service 5bcba8
Packit Service 5bcba8
  /* We can safely copy user_data from parent since we hold a reference
Packit Service 5bcba8
   * onto it and it's immutable.  We should not copy the destroy notifiers
Packit Service 5bcba8
   * though. */
Packit Service 5bcba8
  ufuncs->user_data = parent->user_data;
Packit Service 5bcba8
Packit Service 5bcba8
  return ufuncs;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
Packit Service 5bcba8
  HB_OBJECT_HEADER_STATIC,
Packit Service 5bcba8
Packit Service 5bcba8
  NULL, /* parent */
Packit Service 5bcba8
  true, /* immutable */
Packit Service 5bcba8
  {
Packit Service 5bcba8
#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
Packit Service 5bcba8
    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
Packit Service 5bcba8
#undef HB_UNICODE_FUNC_IMPLEMENT
Packit Service 5bcba8
  }
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_get_empty:
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: (transfer full):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_unicode_funcs_t *
Packit Service 5bcba8
hb_unicode_funcs_get_empty (void)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_reference: (skip)
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: (transfer full):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_unicode_funcs_t *
Packit Service 5bcba8
hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return hb_object_reference (ufuncs);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_destroy: (skip)
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
void
Packit Service 5bcba8
hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
Packit Service 5bcba8
{
Packit Service 5bcba8
  if (!hb_object_destroy (ufuncs)) return;
Packit Service 5bcba8
Packit Service 5bcba8
#define HB_UNICODE_FUNC_IMPLEMENT(name) \
Packit Service 5bcba8
  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
Packit Service 5bcba8
    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
Packit Service 5bcba8
#undef HB_UNICODE_FUNC_IMPLEMENT
Packit Service 5bcba8
Packit Service 5bcba8
  hb_unicode_funcs_destroy (ufuncs->parent);
Packit Service 5bcba8
Packit Service 5bcba8
  free (ufuncs);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_set_user_data: (skip)
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 * @key: 
Packit Service 5bcba8
 * @data: 
Packit Service 5bcba8
 * @destroy: 
Packit Service 5bcba8
 * @replace: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_bool_t
Packit Service 5bcba8
hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
Packit Service 5bcba8
			        hb_user_data_key_t *key,
Packit Service 5bcba8
			        void *              data,
Packit Service 5bcba8
			        hb_destroy_func_t   destroy,
Packit Service 5bcba8
				hb_bool_t           replace)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return hb_object_set_user_data (ufuncs, key, data, destroy, replace);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_get_user_data: (skip)
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 * @key: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: (transfer none):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
void *
Packit Service 5bcba8
hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
Packit Service 5bcba8
			        hb_user_data_key_t *key)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return hb_object_get_user_data (ufuncs, key);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_make_immutable:
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
void
Packit Service 5bcba8
hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
Packit Service 5bcba8
{
Packit Service 5bcba8
  if (unlikely (hb_object_is_inert (ufuncs)))
Packit Service 5bcba8
    return;
Packit Service 5bcba8
Packit Service 5bcba8
  ufuncs->immutable = true;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_is_immutable:
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_bool_t
Packit Service 5bcba8
hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return ufuncs->immutable;
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_funcs_get_parent:
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_unicode_funcs_t *
Packit Service 5bcba8
hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty ();
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
#define HB_UNICODE_FUNC_IMPLEMENT(name)						\
Packit Service 5bcba8
										\
Packit Service 5bcba8
void										\
Packit Service 5bcba8
hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t		   *ufuncs,	\
Packit Service 5bcba8
				    hb_unicode_##name##_func_t	    func,	\
Packit Service 5bcba8
				    void			   *user_data,	\
Packit Service 5bcba8
				    hb_destroy_func_t		    destroy)	\
Packit Service 5bcba8
{										\
Packit Service 5bcba8
  if (ufuncs->immutable)							\
Packit Service 5bcba8
    return;									\
Packit Service 5bcba8
										\
Packit Service 5bcba8
  if (ufuncs->destroy.name)							\
Packit Service 5bcba8
    ufuncs->destroy.name (ufuncs->user_data.name);				\
Packit Service 5bcba8
										\
Packit Service 5bcba8
  if (func) {									\
Packit Service 5bcba8
    ufuncs->func.name = func;							\
Packit Service 5bcba8
    ufuncs->user_data.name = user_data;						\
Packit Service 5bcba8
    ufuncs->destroy.name = destroy;						\
Packit Service 5bcba8
  } else {									\
Packit Service 5bcba8
    ufuncs->func.name = ufuncs->parent->func.name;				\
Packit Service 5bcba8
    ufuncs->user_data.name = ufuncs->parent->user_data.name;			\
Packit Service 5bcba8
    ufuncs->destroy.name = NULL;						\
Packit Service 5bcba8
  }										\
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
Packit Service 5bcba8
#undef HB_UNICODE_FUNC_IMPLEMENT
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name)				\
Packit Service 5bcba8
										\
Packit Service 5bcba8
return_type									\
Packit Service 5bcba8
hb_unicode_##name (hb_unicode_funcs_t *ufuncs,					\
Packit Service 5bcba8
		   hb_codepoint_t      unicode)					\
Packit Service 5bcba8
{										\
Packit Service 5bcba8
  return ufuncs->name (unicode);						\
Packit Service 5bcba8
}
Packit Service 5bcba8
HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
Packit Service 5bcba8
#undef HB_UNICODE_FUNC_IMPLEMENT
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_compose:
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 * @a: 
Packit Service 5bcba8
 * @b: 
Packit Service 5bcba8
 * @ab: (out):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_bool_t
Packit Service 5bcba8
hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
Packit Service 5bcba8
		    hb_codepoint_t      a,
Packit Service 5bcba8
		    hb_codepoint_t      b,
Packit Service 5bcba8
		    hb_codepoint_t     *ab)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return ufuncs->compose (a, b, ab);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_decompose:
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 * @ab: 
Packit Service 5bcba8
 * @a: (out):
Packit Service 5bcba8
 * @b: (out):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
hb_bool_t
Packit Service 5bcba8
hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
Packit Service 5bcba8
		      hb_codepoint_t      ab,
Packit Service 5bcba8
		      hb_codepoint_t     *a,
Packit Service 5bcba8
		      hb_codepoint_t     *b)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return ufuncs->decompose (ab, a, b);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
/**
Packit Service 5bcba8
 * hb_unicode_decompose_compatibility:
Packit Service 5bcba8
 * @ufuncs: Unicode functions.
Packit Service 5bcba8
 * @u: 
Packit Service 5bcba8
 * @decomposed: (out):
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Return value: 
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Since: 0.9.2
Packit Service 5bcba8
 **/
Packit Service 5bcba8
unsigned int
Packit Service 5bcba8
hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
Packit Service 5bcba8
				    hb_codepoint_t      u,
Packit Service 5bcba8
				    hb_codepoint_t     *decomposed)
Packit Service 5bcba8
{
Packit Service 5bcba8
  return ufuncs->decompose_compatibility (u, decomposed);
Packit Service 5bcba8
}
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
/* See hb-unicode-private.hh for details. */
Packit Service 5bcba8
const uint8_t
Packit Service 5bcba8
_hb_modified_combining_class[256] =
Packit Service 5bcba8
{
Packit Service 5bcba8
  0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */
Packit Service 5bcba8
  1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */
Packit Service 5bcba8
  2, 3, 4, 5, 6,
Packit Service 5bcba8
  7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */
Packit Service 5bcba8
  8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */
Packit Service 5bcba8
  9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */
Packit Service 5bcba8
Packit Service 5bcba8
  /* Hebrew */
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC10,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC11,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC12,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC13,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC14,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC15,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC16,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC17,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC18,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC19,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC20,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC21,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC22,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC23,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC24,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC25,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC26,
Packit Service 5bcba8
Packit Service 5bcba8
  /* Arabic */
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC27,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC28,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC29,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC30,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC31,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC32,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC33,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC34,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC35,
Packit Service 5bcba8
Packit Service 5bcba8
  /* Syriac */
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC36,
Packit Service 5bcba8
Packit Service 5bcba8
  37, 38, 39,
Packit Service 5bcba8
  40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
Packit Service 5bcba8
  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
Packit Service 5bcba8
  80, 81, 82, 83,
Packit Service 5bcba8
Packit Service 5bcba8
  /* Telugu */
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC84,
Packit Service 5bcba8
  85, 86, 87, 88, 89, 90,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC91,
Packit Service 5bcba8
  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
Packit Service 5bcba8
Packit Service 5bcba8
  /* Thai */
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC103,
Packit Service 5bcba8
  104, 105, 106,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC107,
Packit Service 5bcba8
  108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
Packit Service 5bcba8
Packit Service 5bcba8
  /* Lao */
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC118,
Packit Service 5bcba8
  119, 120, 121,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC122,
Packit Service 5bcba8
  123, 124, 125, 126, 127, 128,
Packit Service 5bcba8
Packit Service 5bcba8
  /* Tibetan */
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC129,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC130,
Packit Service 5bcba8
  131,
Packit Service 5bcba8
  HB_MODIFIED_COMBINING_CLASS_CCC132,
Packit Service 5bcba8
  133, 134, 135, 136, 137, 138, 139,
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
Packit Service 5bcba8
  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
Packit Service 5bcba8
  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
Packit Service 5bcba8
  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
Packit Service 5bcba8
  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
Packit Service 5bcba8
  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
Packit Service 5bcba8
Packit Service 5bcba8
  200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */
Packit Service 5bcba8
  201,
Packit Service 5bcba8
  202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */
Packit Service 5bcba8
  203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
Packit Service 5bcba8
  214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */
Packit Service 5bcba8
  215,
Packit Service 5bcba8
  216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */
Packit Service 5bcba8
  217,
Packit Service 5bcba8
  218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */
Packit Service 5bcba8
  219,
Packit Service 5bcba8
  220, /* HB_UNICODE_COMBINING_CLASS_BELOW */
Packit Service 5bcba8
  221,
Packit Service 5bcba8
  222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */
Packit Service 5bcba8
  223,
Packit Service 5bcba8
  224, /* HB_UNICODE_COMBINING_CLASS_LEFT */
Packit Service 5bcba8
  225,
Packit Service 5bcba8
  226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */
Packit Service 5bcba8
  227,
Packit Service 5bcba8
  228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */
Packit Service 5bcba8
  229,
Packit Service 5bcba8
  230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */
Packit Service 5bcba8
  231,
Packit Service 5bcba8
  232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */
Packit Service 5bcba8
  233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */
Packit Service 5bcba8
  234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */
Packit Service 5bcba8
  235, 236, 237, 238, 239,
Packit Service 5bcba8
  240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */
Packit Service 5bcba8
  241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
Packit Service 5bcba8
  255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
Packit Service 5bcba8
};