15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2009  Red Hat, Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2011  Google, Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  This is part of HarfBuzz, a text shaping library.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Red Hat Author(s): Behdad Esfahbod
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Google Author(s): Behdad Esfahbod
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-private.hh"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-glib.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-unicode-private.hh"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !GLIB_CHECK_VERSION(2,29,14)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const hb_script_t
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)glib_script_to_script[] =
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_COMMON,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_INHERITED,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_ARABIC,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_ARMENIAN,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BENGALI,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BOPOMOFO,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CHEROKEE,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_COPTIC,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CYRILLIC,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_DESERET,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_DEVANAGARI,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_ETHIOPIC,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_GEORGIAN,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_GOTHIC,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_GREEK,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_GUJARATI,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_GURMUKHI,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_HAN,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_HANGUL,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_HEBREW,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_HIRAGANA,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_KANNADA,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_KATAKANA,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_KHMER,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LAO,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LATIN,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MALAYALAM,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MONGOLIAN,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MYANMAR,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_OGHAM,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_OLD_ITALIC,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_ORIYA,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_RUNIC,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SINHALA,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SYRIAC,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TAMIL,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TELUGU,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_THAANA,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_THAI,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TIBETAN,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CANADIAN_ABORIGINAL,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_YI,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TAGALOG,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_HANUNOO,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BUHID,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TAGBANWA,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Unicode-4.0 additions */
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BRAILLE,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CYPRIOT,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LIMBU,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_OSMANYA,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SHAVIAN,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LINEAR_B,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TAI_LE,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_UGARITIC,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Unicode-4.1 additions */
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_NEW_TAI_LUE,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BUGINESE,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_GLAGOLITIC,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TIFINAGH,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SYLOTI_NAGRI,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_OLD_PERSIAN,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_KHAROSHTHI,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Unicode-5.0 additions */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_UNKNOWN,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BALINESE,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CUNEIFORM,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_PHOENICIAN,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_PHAGS_PA,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_NKO,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Unicode-5.1 additions */
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_KAYAH_LI,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LEPCHA,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_REJANG,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SUNDANESE,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SAURASHTRA,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CHAM,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_OL_CHIKI,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_VAI,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CARIAN,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LYCIAN,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LYDIAN,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Unicode-5.2 additions */
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_AVESTAN,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BAMUM,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_IMPERIAL_ARAMAIC,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_JAVANESE,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_KAITHI,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TAI_THAM,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_LISU,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MEETEI_MAYEK,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_OLD_SOUTH_ARABIAN,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_OLD_TURKIC,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SAMARITAN,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TAI_VIET,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Unicode-6.0 additions */
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BATAK,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_BRAHMI,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MANDAIC,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Unicode-6.1 additions */
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_CHAKMA,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MEROITIC_CURSIVE,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MEROITIC_HIEROGLYPHS,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_MIAO,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SHARADA,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_SORA_SOMPENG,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HB_SCRIPT_TAKRI
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_script_t
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_script_to_script (GUnicodeScript script)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if GLIB_CHECK_VERSION(2,29,14)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (hb_script_t) g_unicode_script_to_iso15924 (script);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (likely ((unsigned int) script < ARRAY_LENGTH (glib_script_to_script)))
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return glib_script_to_script[script];
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (unlikely (script == G_UNICODE_SCRIPT_INVALID_CODE))
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HB_SCRIPT_INVALID;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HB_SCRIPT_UNKNOWN;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GUnicodeScript
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_script_from_script (hb_script_t script)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if GLIB_CHECK_VERSION(2,29,14)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_unicode_script_from_iso15924 (script);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int count = ARRAY_LENGTH (glib_script_to_script);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned int i = 0; i < count; i++)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (glib_script_to_script[i] == script)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (GUnicodeScript) i;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (unlikely (script == HB_SCRIPT_INVALID))
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return G_UNICODE_SCRIPT_INVALID_CODE;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return G_UNICODE_SCRIPT_UNKNOWN;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_unicode_combining_class_t
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 hb_codepoint_t      unicode,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 void               *user_data HB_UNUSED)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (hb_unicode_combining_class_t) g_unichar_combining_class (unicode);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned int
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs HB_UNUSED,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 hb_codepoint_t      unicode,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 void               *user_data HB_UNUSED)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_unichar_iswide (unicode) ? 2 : 1;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_unicode_general_category_t
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  hb_codepoint_t      unicode,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  void               *user_data HB_UNUSED)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* hb_unicode_general_category_t and GUnicodeType are identical */
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (hb_unicode_general_category_t) g_unichar_type (unicode);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_codepoint_t
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_unicode_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   hb_codepoint_t      unicode,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   void               *user_data HB_UNUSED)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_unichar_get_mirror_char (unicode, &unicode);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return unicode;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_script_t
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_unicode_script (hb_unicode_funcs_t *ufuncs HB_UNUSED,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			hb_codepoint_t      unicode,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			void               *user_data HB_UNUSED)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hb_glib_script_to_script (g_unichar_get_script (unicode));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_bool_t
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 hb_codepoint_t      a,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 hb_codepoint_t      b,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 hb_codepoint_t     *ab,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 void               *user_data HB_UNUSED)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if GLIB_CHECK_VERSION(2,29,12)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_unichar_compose (a, b, ab);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* We don't ifdef-out the fallback code such that compiler always
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * sees it and makes sure it's compilable. */
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gchar utf8[12];
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gchar *normalized;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int len;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_bool_t ret;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len = g_unichar_to_utf8 (a, utf8);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len += g_unichar_to_utf8 (b, utf8 + len);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFC);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len = g_utf8_strlen (normalized, -1);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (unlikely (!len))
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len == 1) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ab = g_utf8_get_char (normalized);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = true;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = false;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_free (normalized);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_bool_t
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   hb_codepoint_t      ab,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   hb_codepoint_t     *a,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   hb_codepoint_t     *b,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   void               *user_data HB_UNUSED)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if GLIB_CHECK_VERSION(2,29,12)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_unichar_decompose (ab, a, b);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* We don't ifdef-out the fallback code such that compiler always
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * sees it and makes sure it's compilable. */
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gchar utf8[6];
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gchar *normalized;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int len;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_bool_t ret;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len = g_unichar_to_utf8 (ab, utf8);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFD);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len = g_utf8_strlen (normalized, -1);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (unlikely (!len))
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len == 1) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *a = g_utf8_get_char (normalized);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *b = 0;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = *a != ab;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (len == 2) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *a = g_utf8_get_char (normalized);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *b = g_utf8_get_char (g_utf8_next_char (normalized));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Here's the ugly part: if ab decomposes to a single character and
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * that character decomposes again, we have to detect that and undo
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the second part :-(. */
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gchar *recomposed = g_utf8_normalize (normalized, -1, G_NORMALIZE_NFC);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hb_codepoint_t c = g_utf8_get_char (recomposed);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c != ab && c != *a) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *a = c;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *b = 0;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_free (recomposed);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = true;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If decomposed to more than two characters, take the last one,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * and recompose the rest to get the first component. */
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gchar *end = g_utf8_offset_to_pointer (normalized, len - 1);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gchar *recomposed;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *b = g_utf8_get_char (end);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    recomposed = g_utf8_normalize (normalized, end - normalized, G_NORMALIZE_NFC);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* We expect that recomposed has exactly one character now. */
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *a = g_utf8_get_char (recomposed);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_free (recomposed);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = true;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_free (normalized);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned int
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)hb_glib_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 hb_codepoint_t      u,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 hb_codepoint_t     *decomposed,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 void               *user_data HB_UNUSED)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if GLIB_CHECK_VERSION(2,29,12)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_unichar_fully_decompose (u, TRUE, decomposed, HB_UNICODE_MAX_DECOMPOSITION_LEN);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the user doesn't have GLib >= 2.29.12 we have to perform
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * a round trip to UTF-8 and the associated memory management dance. */
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gchar utf8[6];
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gchar *utf8_decomposed, *c;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gsize utf8_len, utf8_decomposed_len, i;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Convert @u to UTF-8 and normalise it in NFKD mode. This performs the compatibility decomposition. */
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  utf8_len = g_unichar_to_utf8 (u, utf8);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  utf8_decomposed = g_utf8_normalize (utf8, utf8_len, G_NORMALIZE_NFKD);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  utf8_decomposed_len = g_utf8_strlen (utf8_decomposed, -1);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert (utf8_decomposed_len <= HB_UNICODE_MAX_DECOMPOSITION_LEN);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0, c = utf8_decomposed; i < utf8_decomposed_len; i++, c = g_utf8_next_char (c))
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *decomposed++ = g_utf8_get_char (c);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_free (utf8_decomposed);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return utf8_decomposed_len;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_unicode_funcs_t *
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_glib_get_unicode_funcs (void)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const hb_unicode_funcs_t _hb_glib_unicode_funcs = {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HB_OBJECT_HEADER_STATIC,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* parent */
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, /* immutable */
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_glib_unicode_##name,
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)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return const_cast<hb_unicode_funcs_t *> (&_hb_glib_unicode_funcs);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385