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