/* * Copyright (C) 2009,2010 Red Hat, Inc. * * This is part of HarfBuzz, a text shaping library. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and its documentation for any purpose, provided that the * above copyright notice and the following two paragraphs appear in * all copies of this software. * * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Red Hat Author(s): Behdad Esfahbod */ #include "hb-private.h" HB_BEGIN_DECLS /* hb_tag_t */ hb_tag_t hb_tag_from_string (const char *s) { char tag[4]; unsigned int i; if (!s) return HB_TAG_NONE; for (i = 0; i < 4 && s[i]; i++) tag[i] = s[i]; for (; i < 4; i++) tag[i] = ' '; return HB_TAG_CHAR4 (tag); } /* hb_language_t */ struct _hb_language_t { const char s[1]; }; static const char canon_map[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0, 0, 0, 0, 0, 0, '-', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, '-', 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, 0 }; static hb_bool_t lang_equal (const void *v1, const void *v2) { const unsigned char *p1 = v1; const unsigned char *p2 = v2; while (canon_map[*p1] && canon_map[*p1] == canon_map[*p2]) { p1++, p2++; } return (canon_map[*p1] == canon_map[*p2]); } #if 0 static unsigned int lang_hash (const void *key) { const unsigned char *p = key; unsigned int h = 0; while (canon_map[*p]) { h = (h << 5) - h + canon_map[*p]; p++; } return h; } #endif hb_language_t hb_language_from_string (const char *str) { static unsigned int num_langs; static unsigned int num_alloced; static hb_language_t *langs; unsigned int i; unsigned char *p; /* TODO Use a hash table or something */ if (!str || !*str) return NULL; for (i = 0; i < num_langs; i++) if (lang_equal (str, langs[i]->s)) return langs[i]; if (unlikely (num_langs == num_alloced)) { unsigned int new_alloced = 2 * (8 + num_alloced); hb_language_t *new_langs = realloc (langs, new_alloced * sizeof (langs[0])); if (!new_langs) return NULL; num_alloced = new_alloced; langs = new_langs; } langs[i] = (hb_language_t) strdup (str); for (p = (unsigned char *) langs[i]->s; *p; p++) *p = canon_map[*p]; num_langs++; return langs[i]; } const char * hb_language_to_string (hb_language_t language) { return language->s; } /* hb_script_t */ static const hb_tag_t script_to_iso15924_tag[] = { HB_TAG('Z','y','y','y'), /* HB_SCRIPT_COMMON */ HB_TAG('Q','a','a','i'), /* HB_SCRIPT_INHERITED */ HB_TAG('A','r','a','b'), /* HB_SCRIPT_ARABIC */ HB_TAG('A','r','m','n'), /* HB_SCRIPT_ARMENIAN */ HB_TAG('B','e','n','g'), /* HB_SCRIPT_BENGALI */ HB_TAG('B','o','p','o'), /* HB_SCRIPT_BOPOMOFO */ HB_TAG('C','h','e','r'), /* HB_SCRIPT_CHEROKEE */ HB_TAG('Q','a','a','c'), /* HB_SCRIPT_COPTIC */ HB_TAG('C','y','r','l'), /* HB_SCRIPT_CYRILLIC */ HB_TAG('D','s','r','t'), /* HB_SCRIPT_DESERET */ HB_TAG('D','e','v','a'), /* HB_SCRIPT_DEVANAGARI */ HB_TAG('E','t','h','i'), /* HB_SCRIPT_ETHIOPIC */ HB_TAG('G','e','o','r'), /* HB_SCRIPT_GEORGIAN */ HB_TAG('G','o','t','h'), /* HB_SCRIPT_GOTHIC */ HB_TAG('G','r','e','k'), /* HB_SCRIPT_GREEK */ HB_TAG('G','u','j','r'), /* HB_SCRIPT_GUJARATI */ HB_TAG('G','u','r','u'), /* HB_SCRIPT_GURMUKHI */ HB_TAG('H','a','n','i'), /* HB_SCRIPT_HAN */ HB_TAG('H','a','n','g'), /* HB_SCRIPT_HANGUL */ HB_TAG('H','e','b','r'), /* HB_SCRIPT_HEBREW */ HB_TAG('H','i','r','a'), /* HB_SCRIPT_HIRAGANA */ HB_TAG('K','n','d','a'), /* HB_SCRIPT_KANNADA */ HB_TAG('K','a','n','a'), /* HB_SCRIPT_KATAKANA */ HB_TAG('K','h','m','r'), /* HB_SCRIPT_KHMER */ HB_TAG('L','a','o','o'), /* HB_SCRIPT_LAO */ HB_TAG('L','a','t','n'), /* HB_SCRIPT_LATIN */ HB_TAG('M','l','y','m'), /* HB_SCRIPT_MALAYALAM */ HB_TAG('M','o','n','g'), /* HB_SCRIPT_MONGOLIAN */ HB_TAG('M','y','m','r'), /* HB_SCRIPT_MYANMAR */ HB_TAG('O','g','a','m'), /* HB_SCRIPT_OGHAM */ HB_TAG('I','t','a','l'), /* HB_SCRIPT_OLD_ITALIC */ HB_TAG('O','r','y','a'), /* HB_SCRIPT_ORIYA */ HB_TAG('R','u','n','r'), /* HB_SCRIPT_RUNIC */ HB_TAG('S','i','n','h'), /* HB_SCRIPT_SINHALA */ HB_TAG('S','y','r','c'), /* HB_SCRIPT_SYRIAC */ HB_TAG('T','a','m','l'), /* HB_SCRIPT_TAMIL */ HB_TAG('T','e','l','u'), /* HB_SCRIPT_TELUGU */ HB_TAG('T','h','a','a'), /* HB_SCRIPT_THAANA */ HB_TAG('T','h','a','i'), /* HB_SCRIPT_THAI */ HB_TAG('T','i','b','t'), /* HB_SCRIPT_TIBETAN */ HB_TAG('C','a','n','s'), /* HB_SCRIPT_CANADIAN_ABORIGINAL */ HB_TAG('Y','i','i','i'), /* HB_SCRIPT_YI */ HB_TAG('T','g','l','g'), /* HB_SCRIPT_TAGALOG */ HB_TAG('H','a','n','o'), /* HB_SCRIPT_HANUNOO */ HB_TAG('B','u','h','d'), /* HB_SCRIPT_BUHID */ HB_TAG('T','a','g','b'), /* HB_SCRIPT_TAGBANWA */ /* Unicode-4.0 additions */ HB_TAG('B','r','a','i'), /* HB_SCRIPT_BRAILLE */ HB_TAG('C','p','r','t'), /* HB_SCRIPT_CYPRIOT */ HB_TAG('L','i','m','b'), /* HB_SCRIPT_LIMBU */ HB_TAG('O','s','m','a'), /* HB_SCRIPT_OSMANYA */ HB_TAG('S','h','a','w'), /* HB_SCRIPT_SHAVIAN */ HB_TAG('L','i','n','b'), /* HB_SCRIPT_LINEAR_B */ HB_TAG('T','a','l','e'), /* HB_SCRIPT_TAI_LE */ HB_TAG('U','g','a','r'), /* HB_SCRIPT_UGARITIC */ /* Unicode-4.1 additions */ HB_TAG('T','a','l','u'), /* HB_SCRIPT_NEW_TAI_LUE */ HB_TAG('B','u','g','i'), /* HB_SCRIPT_BUGINESE */ HB_TAG('G','l','a','g'), /* HB_SCRIPT_GLAGOLITIC */ HB_TAG('T','f','n','g'), /* HB_SCRIPT_TIFINAGH */ HB_TAG('S','y','l','o'), /* HB_SCRIPT_SYLOTI_NAGRI */ HB_TAG('X','p','e','o'), /* HB_SCRIPT_OLD_PERSIAN */ HB_TAG('K','h','a','r'), /* HB_SCRIPT_KHAROSHTHI */ /* Unicode-5.0 additions */ HB_TAG('Z','z','z','z'), /* HB_SCRIPT_UNKNOWN */ HB_TAG('B','a','l','i'), /* HB_SCRIPT_BALINESE */ HB_TAG('X','s','u','x'), /* HB_SCRIPT_CUNEIFORM */ HB_TAG('P','h','n','x'), /* HB_SCRIPT_PHOENICIAN */ HB_TAG('P','h','a','g'), /* HB_SCRIPT_PHAGS_PA */ HB_TAG('N','k','o','o'), /* HB_SCRIPT_NKO */ /* Unicode-5.1 additions */ HB_TAG('K','a','l','i'), /* HB_SCRIPT_KAYAH_LI */ HB_TAG('L','e','p','c'), /* HB_SCRIPT_LEPCHA */ HB_TAG('R','j','n','g'), /* HB_SCRIPT_REJANG */ HB_TAG('S','u','n','d'), /* HB_SCRIPT_SUNDANESE */ HB_TAG('S','a','u','r'), /* HB_SCRIPT_SAURASHTRA */ HB_TAG('C','h','a','m'), /* HB_SCRIPT_CHAM */ HB_TAG('O','l','c','k'), /* HB_SCRIPT_OL_CHIKI */ HB_TAG('V','a','i','i'), /* HB_SCRIPT_VAI */ HB_TAG('C','a','r','i'), /* HB_SCRIPT_CARIAN */ HB_TAG('L','y','c','i'), /* HB_SCRIPT_LYCIAN */ HB_TAG('L','y','d','i'), /* HB_SCRIPT_LYDIAN */ /* Unicode-5.2 additions */ HB_TAG('A','v','s','t'), /* HB_SCRIPT_AVESTAN */ HB_TAG('B','a','m','u'), /* HB_SCRIPT_BAMUM */ HB_TAG('E','g','y','p'), /* HB_SCRIPT_EGYPTIAN_HIEROGLYPHS */ HB_TAG('A','r','m','i'), /* HB_SCRIPT_IMPERIAL_ARAMAIC */ HB_TAG('P','h','l','i'), /* HB_SCRIPT_INSCRIPTIONAL_PAHLAVI */ HB_TAG('P','r','t','i'), /* HB_SCRIPT_INSCRIPTIONAL_PARTHIAN */ HB_TAG('J','a','v','a'), /* HB_SCRIPT_JAVANESE */ HB_TAG('K','t','h','i'), /* HB_SCRIPT_KAITHI */ HB_TAG('L','i','s','u'), /* HB_SCRIPT_LISU */ HB_TAG('M','t','e','i'), /* HB_SCRIPT_MEETEI_MAYEK */ HB_TAG('S','a','r','b'), /* HB_SCRIPT_OLD_SOUTH_ARABIAN */ HB_TAG('O','r','k','h'), /* HB_SCRIPT_OLD_TURKIC */ HB_TAG('S','a','m','r'), /* HB_SCRIPT_SAMARITAN */ HB_TAG('L','a','n','a'), /* HB_SCRIPT_TAI_THAM */ HB_TAG('T','a','v','t'), /* HB_SCRIPT_TAI_VIET */ /* Unicode-6.0 additions */ HB_TAG('B','a','t','k'), /* HB_SCRIPT_BATAK */ HB_TAG('B','r','a','h'), /* HB_SCRIPT_BRAHMI */ HB_TAG('M','a','n','d') /* HB_SCRIPT_MANDAIC */ }; struct tag_script_pair { hb_tag_t tag; hb_script_t script; }; static const struct tag_script_pair script_from_iso15924_tag[] = { {HB_TAG('A','r','a','b'), HB_SCRIPT_ARABIC}, {HB_TAG('A','r','m','i'), HB_SCRIPT_IMPERIAL_ARAMAIC}, {HB_TAG('A','r','m','n'), HB_SCRIPT_ARMENIAN}, {HB_TAG('A','v','s','t'), HB_SCRIPT_AVESTAN}, {HB_TAG('B','a','l','i'), HB_SCRIPT_BALINESE}, {HB_TAG('B','a','m','u'), HB_SCRIPT_BAMUM}, {HB_TAG('B','a','t','k'), HB_SCRIPT_BATAK}, {HB_TAG('B','e','n','g'), HB_SCRIPT_BENGALI}, {HB_TAG('B','o','p','o'), HB_SCRIPT_BOPOMOFO}, {HB_TAG('B','r','a','h'), HB_SCRIPT_BRAHMI}, {HB_TAG('B','r','a','i'), HB_SCRIPT_BRAILLE}, {HB_TAG('B','u','g','i'), HB_SCRIPT_BUGINESE}, {HB_TAG('B','u','h','d'), HB_SCRIPT_BUHID}, {HB_TAG('C','a','n','s'), HB_SCRIPT_CANADIAN_ABORIGINAL}, {HB_TAG('C','a','r','i'), HB_SCRIPT_CARIAN}, {HB_TAG('C','h','a','m'), HB_SCRIPT_CHAM}, {HB_TAG('C','h','e','r'), HB_SCRIPT_CHEROKEE}, {HB_TAG('C','p','r','t'), HB_SCRIPT_CYPRIOT}, {HB_TAG('C','y','r','l'), HB_SCRIPT_CYRILLIC}, {HB_TAG('C','y','r','s'), HB_SCRIPT_CYRILLIC}, {HB_TAG('D','e','v','a'), HB_SCRIPT_DEVANAGARI}, {HB_TAG('D','s','r','t'), HB_SCRIPT_DESERET}, {HB_TAG('E','g','y','p'), HB_SCRIPT_EGYPTIAN_HIEROGLYPHS}, {HB_TAG('E','t','h','i'), HB_SCRIPT_ETHIOPIC}, {HB_TAG('G','e','o','a'), HB_SCRIPT_GEORGIAN}, {HB_TAG('G','e','o','n'), HB_SCRIPT_GEORGIAN}, {HB_TAG('G','e','o','r'), HB_SCRIPT_GEORGIAN}, {HB_TAG('G','l','a','g'), HB_SCRIPT_GLAGOLITIC}, {HB_TAG('G','o','t','h'), HB_SCRIPT_GOTHIC}, {HB_TAG('G','r','e','k'), HB_SCRIPT_GREEK}, {HB_TAG('G','u','j','r'), HB_SCRIPT_GUJARATI}, {HB_TAG('G','u','r','u'), HB_SCRIPT_GURMUKHI}, {HB_TAG('H','a','n','g'), HB_SCRIPT_HANGUL}, {HB_TAG('H','a','n','i'), HB_SCRIPT_HAN}, {HB_TAG('H','a','n','o'), HB_SCRIPT_HANUNOO}, {HB_TAG('H','e','b','r'), HB_SCRIPT_HEBREW}, {HB_TAG('H','i','r','a'), HB_SCRIPT_HIRAGANA}, {HB_TAG('I','t','a','l'), HB_SCRIPT_OLD_ITALIC}, {HB_TAG('J','a','v','a'), HB_SCRIPT_JAVANESE}, {HB_TAG('K','a','l','i'), HB_SCRIPT_KAYAH_LI}, {HB_TAG('K','a','n','a'), HB_SCRIPT_KATAKANA}, {HB_TAG('K','h','a','r'), HB_SCRIPT_KHAROSHTHI}, {HB_TAG('K','h','m','r'), HB_SCRIPT_KHMER}, {HB_TAG('K','n','d','a'), HB_SCRIPT_KANNADA}, {HB_TAG('K','t','h','i'), HB_SCRIPT_KAITHI}, {HB_TAG('L','a','n','a'), HB_SCRIPT_TAI_THAM}, {HB_TAG('L','a','o','o'), HB_SCRIPT_LAO}, {HB_TAG('L','a','t','f'), HB_SCRIPT_LATIN}, {HB_TAG('L','a','t','g'), HB_SCRIPT_LATIN}, {HB_TAG('L','a','t','n'), HB_SCRIPT_LATIN}, {HB_TAG('L','e','p','c'), HB_SCRIPT_LEPCHA}, {HB_TAG('L','i','m','b'), HB_SCRIPT_LIMBU}, {HB_TAG('L','i','n','b'), HB_SCRIPT_LINEAR_B}, {HB_TAG('L','i','s','u'), HB_SCRIPT_LISU}, {HB_TAG('L','y','c','i'), HB_SCRIPT_LYCIAN}, {HB_TAG('L','y','d','i'), HB_SCRIPT_LYDIAN}, {HB_TAG('M','a','n','d'), HB_SCRIPT_MANDAIC}, {HB_TAG('M','l','y','m'), HB_SCRIPT_MALAYALAM}, {HB_TAG('M','o','n','g'), HB_SCRIPT_MONGOLIAN}, {HB_TAG('M','t','e','i'), HB_SCRIPT_MEETEI_MAYEK}, {HB_TAG('M','y','m','r'), HB_SCRIPT_MYANMAR}, {HB_TAG('N','k','o','o'), HB_SCRIPT_NKO}, {HB_TAG('O','g','a','m'), HB_SCRIPT_OGHAM}, {HB_TAG('O','l','c','k'), HB_SCRIPT_OL_CHIKI}, {HB_TAG('O','r','k','h'), HB_SCRIPT_OLD_TURKIC}, {HB_TAG('O','r','y','a'), HB_SCRIPT_ORIYA}, {HB_TAG('O','s','m','a'), HB_SCRIPT_OSMANYA}, {HB_TAG('P','h','a','g'), HB_SCRIPT_PHAGS_PA}, {HB_TAG('P','h','l','i'), HB_SCRIPT_INSCRIPTIONAL_PAHLAVI}, {HB_TAG('P','h','n','x'), HB_SCRIPT_PHOENICIAN}, {HB_TAG('P','r','t','i'), HB_SCRIPT_INSCRIPTIONAL_PARTHIAN}, {HB_TAG('Q','a','a','c'), HB_SCRIPT_COPTIC}, {HB_TAG('Q','a','a','i'), HB_SCRIPT_INHERITED}, {HB_TAG('R','j','n','g'), HB_SCRIPT_REJANG}, {HB_TAG('R','u','n','r'), HB_SCRIPT_RUNIC}, {HB_TAG('S','a','m','r'), HB_SCRIPT_SAMARITAN}, {HB_TAG('S','a','r','b'), HB_SCRIPT_OLD_SOUTH_ARABIAN}, {HB_TAG('S','a','u','r'), HB_SCRIPT_SAURASHTRA}, {HB_TAG('S','h','a','w'), HB_SCRIPT_SHAVIAN}, {HB_TAG('S','i','n','h'), HB_SCRIPT_SINHALA}, {HB_TAG('S','u','n','d'), HB_SCRIPT_SUNDANESE}, {HB_TAG('S','y','l','o'), HB_SCRIPT_SYLOTI_NAGRI}, {HB_TAG('S','y','r','c'), HB_SCRIPT_SYRIAC}, {HB_TAG('S','y','r','e'), HB_SCRIPT_SYRIAC}, {HB_TAG('S','y','r','n'), HB_SCRIPT_SYRIAC}, {HB_TAG('T','a','g','b'), HB_SCRIPT_TAGBANWA}, {HB_TAG('T','a','l','e'), HB_SCRIPT_TAI_LE}, {HB_TAG('T','a','l','u'), HB_SCRIPT_NEW_TAI_LUE}, {HB_TAG('T','a','m','l'), HB_SCRIPT_TAMIL}, {HB_TAG('T','a','v','t'), HB_SCRIPT_TAI_VIET}, {HB_TAG('T','e','l','u'), HB_SCRIPT_TELUGU}, {HB_TAG('T','f','n','g'), HB_SCRIPT_TIFINAGH}, {HB_TAG('T','g','l','g'), HB_SCRIPT_TAGALOG}, {HB_TAG('T','h','a','a'), HB_SCRIPT_THAANA}, {HB_TAG('T','h','a','i'), HB_SCRIPT_THAI}, {HB_TAG('T','i','b','t'), HB_SCRIPT_TIBETAN}, {HB_TAG('U','g','a','r'), HB_SCRIPT_UGARITIC}, {HB_TAG('V','a','i','i'), HB_SCRIPT_VAI}, {HB_TAG('X','p','e','o'), HB_SCRIPT_OLD_PERSIAN}, {HB_TAG('X','s','u','x'), HB_SCRIPT_CUNEIFORM}, {HB_TAG('Y','i','i','i'), HB_SCRIPT_YI}, {HB_TAG('Z','y','y','y'), HB_SCRIPT_COMMON}, {HB_TAG('Z','z','z','z'), HB_SCRIPT_UNKNOWN} }; static int _tag_cmp (hb_tag_t *pa, hb_tag_t *pb) { hb_tag_t a = *pa, b = *pb; return a < b ? -1 : a == b ? 0 : +1; } hb_script_t hb_script_from_iso15924_tag (hb_tag_t tag) { const struct tag_script_pair *pair; /* Be lenient, adjust case (one capital letter followed by three small letters) */ tag = (tag & 0xDFDFDFDF) | 0x00202020; pair = (const struct tag_script_pair *) bsearch (&tag, script_from_iso15924_tag, ARRAY_LENGTH (script_from_iso15924_tag), sizeof (script_from_iso15924_tag[0]), (hb_compare_func_t) _tag_cmp); if (pair) return pair->script; /* If it looks right, just use the tag as a script */ if (((uint32_t) tag & 0xE0E0E0E0) == 0x40606060) return (hb_script_t) tag; /* Otherwise, return unknown */ return HB_SCRIPT_UNKNOWN; } hb_script_t hb_script_from_string (const char *s) { return hb_script_from_iso15924_tag (hb_tag_from_string (s)); } hb_tag_t hb_script_to_iso15924_tag (hb_script_t script) { if (likely ((unsigned int) script < ARRAY_LENGTH (script_to_iso15924_tag))) return script_to_iso15924_tag[script]; /* if script is of the right shape (one capital letter followed by three small letters), * return as is. */ if (((uint32_t) script & 0xE0E0E0E0) == 0x40606060) return (hb_tag_t) script; /* Otherwise, we don't know what that is */ return script_to_iso15924_tag[HB_SCRIPT_UNKNOWN]; } #define LTR HB_DIRECTION_LTR #define RTL HB_DIRECTION_RTL const hb_direction_t horiz_dir[] = { LTR, /* Zyyy */ LTR, /* Qaai */ RTL, /* Arab */ LTR, /* Armn */ LTR, /* Beng */ LTR, /* Bopo */ LTR, /* Cher */ LTR, /* Qaac */ LTR, /* Cyrl (Cyrs) */ LTR, /* Dsrt */ LTR, /* Deva */ LTR, /* Ethi */ LTR, /* Geor (Geon, Geoa) */ LTR, /* Goth */ LTR, /* Grek */ LTR, /* Gujr */ LTR, /* Guru */ LTR, /* Hani */ LTR, /* Hang */ RTL, /* Hebr */ LTR, /* Hira */ LTR, /* Knda */ LTR, /* Kana */ LTR, /* Khmr */ LTR, /* Laoo */ LTR, /* Latn (Latf, Latg) */ LTR, /* Mlym */ LTR, /* Mong */ LTR, /* Mymr */ LTR, /* Ogam */ LTR, /* Ital */ LTR, /* Orya */ LTR, /* Runr */ LTR, /* Sinh */ RTL, /* Syrc (Syrj, Syrn, Syre) */ LTR, /* Taml */ LTR, /* Telu */ RTL, /* Thaa */ LTR, /* Thai */ LTR, /* Tibt */ LTR, /* Cans */ LTR, /* Yiii */ LTR, /* Tglg */ LTR, /* Hano */ LTR, /* Buhd */ LTR, /* Tagb */ /* Unicode-4.0 additions */ LTR, /* Brai */ RTL, /* Cprt */ LTR, /* Limb */ LTR, /* Osma */ LTR, /* Shaw */ LTR, /* Linb */ LTR, /* Tale */ LTR, /* Ugar */ /* Unicode-4.1 additions */ LTR, /* Talu */ LTR, /* Bugi */ LTR, /* Glag */ LTR, /* Tfng */ LTR, /* Sylo */ LTR, /* Xpeo */ LTR, /* Khar */ /* Unicode-5.0 additions */ LTR, /* Zzzz */ LTR, /* Bali */ LTR, /* Xsux */ RTL, /* Phnx */ LTR, /* Phag */ RTL, /* Nkoo */ /* Unicode-5.1 additions */ LTR, /* Kali */ LTR, /* Lepc */ LTR, /* Rjng */ LTR, /* Sund */ LTR, /* Saur */ LTR, /* Cham */ LTR, /* Olck */ LTR, /* Vaii */ LTR, /* Cari */ LTR, /* Lyci */ LTR, /* Lydi */ /* Unicode-5.2 additions */ RTL, /* Avst */ LTR, /* Bamu */ LTR, /* Egyp */ RTL, /* Armi */ RTL, /* Phli */ RTL, /* Prti */ LTR, /* Java */ LTR, /* Kthi */ LTR, /* Lisu */ LTR, /* Mtei */ RTL, /* Sarb */ RTL, /* Orkh */ RTL, /* Samr */ LTR, /* Lana */ LTR, /* Tavt */ /* Unicode-6.0 additions */ LTR, /* Batk */ LTR, /* Brah */ RTL /* Mand */ }; #undef LTR #undef RTL hb_direction_t hb_script_get_horizontal_direction (hb_script_t script) { if (unlikely ((unsigned int) script >= ARRAY_LENGTH (horiz_dir))) return HB_DIRECTION_LTR; return horiz_dir[script]; } HB_END_DECLS