From 62879eebd9965179af8602ba29ac0a64a739b757 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 18 Apr 2011 23:40:21 -0400 Subject: [PATCH] [API] Use ISO 15924 tags for hb_script_t This simplifies the code, reduces static data, and makes the design more extensible to future additions of new scripts. --- src/hb-common.c | 411 +++-------------------------- src/hb-common.h | 199 +++++++------- src/hb-ot-map.cc | 4 +- src/hb-ot-shape-complex-private.hh | 3 +- src/hb-ot-tag.c | 230 +++++++--------- src/hb-ot-tag.h | 6 +- src/hb-shape.cc | 4 +- test/test-types.c | 2 +- 8 files changed, 253 insertions(+), 606 deletions(-) diff --git a/src/hb-common.c b/src/hb-common.c index a913415dc..56537e479 100644 --- a/src/hb-common.c +++ b/src/hb-common.c @@ -143,253 +143,22 @@ hb_language_to_string (hb_language_t language) /* 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; + switch (tag) { + case HB_TAG('C','y','r','s'): return HB_SCRIPT_CYRILLIC; + case HB_TAG('G','e','o','a'): return HB_SCRIPT_GEORGIAN; + case HB_TAG('G','e','o','n'): return HB_SCRIPT_GEORGIAN; + case HB_TAG('L','a','t','f'): return HB_SCRIPT_LATIN; + case HB_TAG('L','a','t','g'): return HB_SCRIPT_LATIN; + case HB_TAG('S','y','r','e'): return HB_SCRIPT_SYRIAC; + case HB_TAG('S','y','r','j'): return HB_SCRIPT_SYRIAC; + case HB_TAG('S','y','r','n'): return HB_SCRIPT_SYRIAC; + } /* If it looks right, just use the tag as a script */ if (((uint32_t) tag & 0xE0E0E0E0) == 0x40606060) @@ -408,142 +177,42 @@ hb_script_from_string (const char *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]; + return (hb_tag_t) script; } - -#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; + switch ((hb_tag_t) script) + { + case HB_SCRIPT_ARABIC: + case HB_SCRIPT_HEBREW: + case HB_SCRIPT_SYRIAC: + case HB_SCRIPT_THAANA: - return horiz_dir[script]; + /* Unicode-4.0 additions */ + case HB_SCRIPT_CYPRIOT: + + /* Unicode-5.0 additions */ + case HB_SCRIPT_PHOENICIAN: + case HB_SCRIPT_NKO: + + /* Unicode-5.2 additions */ + case HB_SCRIPT_AVESTAN: + case HB_SCRIPT_IMPERIAL_ARAMAIC: + case HB_SCRIPT_INSCRIPTIONAL_PAHLAVI: + case HB_SCRIPT_INSCRIPTIONAL_PARTHIAN: + case HB_SCRIPT_OLD_SOUTH_ARABIAN: + case HB_SCRIPT_OLD_TURKIC: + case HB_SCRIPT_SAMARITAN: + + /* Unicode-6.0 additions */ + case HB_SCRIPT_MANDAIC: + + return HB_DIRECTION_RTL; + } + + return HB_DIRECTION_LTR; } diff --git a/src/hb-common.h b/src/hb-common.h index 21caa7161..c6481bbfb 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -148,117 +148,118 @@ typedef enum /* hb_script_t */ typedef enum -{ /* ISO 15924 code */ - HB_SCRIPT_INVALID = -1, - - HB_SCRIPT_COMMON = 0, /* Zyyy */ - HB_SCRIPT_INHERITED, /* Qaai */ - HB_SCRIPT_ARABIC, /* Arab */ - HB_SCRIPT_ARMENIAN, /* Armn */ - HB_SCRIPT_BENGALI, /* Beng */ - HB_SCRIPT_BOPOMOFO, /* Bopo */ - HB_SCRIPT_CHEROKEE, /* Cher */ - HB_SCRIPT_COPTIC, /* Qaac */ - HB_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */ - HB_SCRIPT_DESERET, /* Dsrt */ - HB_SCRIPT_DEVANAGARI, /* Deva */ - HB_SCRIPT_ETHIOPIC, /* Ethi */ - HB_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */ - HB_SCRIPT_GOTHIC, /* Goth */ - HB_SCRIPT_GREEK, /* Grek */ - HB_SCRIPT_GUJARATI, /* Gujr */ - HB_SCRIPT_GURMUKHI, /* Guru */ - HB_SCRIPT_HAN, /* Hani */ - HB_SCRIPT_HANGUL, /* Hang */ - HB_SCRIPT_HEBREW, /* Hebr */ - HB_SCRIPT_HIRAGANA, /* Hira */ - HB_SCRIPT_KANNADA, /* Knda */ - HB_SCRIPT_KATAKANA, /* Kana */ - HB_SCRIPT_KHMER, /* Khmr */ - HB_SCRIPT_LAO, /* Laoo */ - HB_SCRIPT_LATIN, /* Latn (Latf, Latg) */ - HB_SCRIPT_MALAYALAM, /* Mlym */ - HB_SCRIPT_MONGOLIAN, /* Mong */ - HB_SCRIPT_MYANMAR, /* Mymr */ - HB_SCRIPT_OGHAM, /* Ogam */ - HB_SCRIPT_OLD_ITALIC, /* Ital */ - HB_SCRIPT_ORIYA, /* Orya */ - HB_SCRIPT_RUNIC, /* Runr */ - HB_SCRIPT_SINHALA, /* Sinh */ - HB_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */ - HB_SCRIPT_TAMIL, /* Taml */ - HB_SCRIPT_TELUGU, /* Telu */ - HB_SCRIPT_THAANA, /* Thaa */ - HB_SCRIPT_THAI, /* Thai */ - HB_SCRIPT_TIBETAN, /* Tibt */ - HB_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */ - HB_SCRIPT_YI, /* Yiii */ - HB_SCRIPT_TAGALOG, /* Tglg */ - HB_SCRIPT_HANUNOO, /* Hano */ - HB_SCRIPT_BUHID, /* Buhd */ - HB_SCRIPT_TAGBANWA, /* Tagb */ +{ + HB_SCRIPT_COMMON = HB_TAG ('Z','y','y','y'), + HB_SCRIPT_INHERITED = HB_TAG ('Q','a','a','i'), + HB_SCRIPT_ARABIC = HB_TAG ('A','r','a','b'), + HB_SCRIPT_ARMENIAN = HB_TAG ('A','r','m','n'), + HB_SCRIPT_BENGALI = HB_TAG ('B','e','n','g'), + HB_SCRIPT_BOPOMOFO = HB_TAG ('B','o','p','o'), + HB_SCRIPT_CHEROKEE = HB_TAG ('C','h','e','r'), + HB_SCRIPT_COPTIC = HB_TAG ('Q','a','a','c'), + HB_SCRIPT_CYRILLIC = HB_TAG ('C','y','r','l'), + HB_SCRIPT_DESERET = HB_TAG ('D','s','r','t'), + HB_SCRIPT_DEVANAGARI = HB_TAG ('D','e','v','a'), + HB_SCRIPT_ETHIOPIC = HB_TAG ('E','t','h','i'), + HB_SCRIPT_GEORGIAN = HB_TAG ('G','e','o','r'), + HB_SCRIPT_GOTHIC = HB_TAG ('G','o','t','h'), + HB_SCRIPT_GREEK = HB_TAG ('G','r','e','k'), + HB_SCRIPT_GUJARATI = HB_TAG ('G','u','j','r'), + HB_SCRIPT_GURMUKHI = HB_TAG ('G','u','r','u'), + HB_SCRIPT_HAN = HB_TAG ('H','a','n','i'), + HB_SCRIPT_HANGUL = HB_TAG ('H','a','n','g'), + HB_SCRIPT_HEBREW = HB_TAG ('H','e','b','r'), + HB_SCRIPT_HIRAGANA = HB_TAG ('H','i','r','a'), + HB_SCRIPT_KANNADA = HB_TAG ('K','n','d','a'), + HB_SCRIPT_KATAKANA = HB_TAG ('K','a','n','a'), + HB_SCRIPT_KHMER = HB_TAG ('K','h','m','r'), + HB_SCRIPT_LAO = HB_TAG ('L','a','o','o'), + HB_SCRIPT_LATIN = HB_TAG ('L','a','t','n'), + HB_SCRIPT_MALAYALAM = HB_TAG ('M','l','y','m'), + HB_SCRIPT_MONGOLIAN = HB_TAG ('M','o','n','g'), + HB_SCRIPT_MYANMAR = HB_TAG ('M','y','m','r'), + HB_SCRIPT_OGHAM = HB_TAG ('O','g','a','m'), + HB_SCRIPT_OLD_ITALIC = HB_TAG ('I','t','a','l'), + HB_SCRIPT_ORIYA = HB_TAG ('O','r','y','a'), + HB_SCRIPT_RUNIC = HB_TAG ('R','u','n','r'), + HB_SCRIPT_SINHALA = HB_TAG ('S','i','n','h'), + HB_SCRIPT_SYRIAC = HB_TAG ('S','y','r','c'), + HB_SCRIPT_TAMIL = HB_TAG ('T','a','m','l'), + HB_SCRIPT_TELUGU = HB_TAG ('T','e','l','u'), + HB_SCRIPT_THAANA = HB_TAG ('T','h','a','a'), + HB_SCRIPT_THAI = HB_TAG ('T','h','a','i'), + HB_SCRIPT_TIBETAN = HB_TAG ('T','i','b','t'), + HB_SCRIPT_CANADIAN_ABORIGINAL = HB_TAG ('C','a','n','s'), + HB_SCRIPT_YI = HB_TAG ('Y','i','i','i'), + HB_SCRIPT_TAGALOG = HB_TAG ('T','g','l','g'), + HB_SCRIPT_HANUNOO = HB_TAG ('H','a','n','o'), + HB_SCRIPT_BUHID = HB_TAG ('B','u','h','d'), + HB_SCRIPT_TAGBANWA = HB_TAG ('T','a','g','b'), /* Unicode-4.0 additions */ - HB_SCRIPT_BRAILLE, /* Brai */ - HB_SCRIPT_CYPRIOT, /* Cprt */ - HB_SCRIPT_LIMBU, /* Limb */ - HB_SCRIPT_OSMANYA, /* Osma */ - HB_SCRIPT_SHAVIAN, /* Shaw */ - HB_SCRIPT_LINEAR_B, /* Linb */ - HB_SCRIPT_TAI_LE, /* Tale */ - HB_SCRIPT_UGARITIC, /* Ugar */ + HB_SCRIPT_BRAILLE = HB_TAG ('B','r','a','i'), + HB_SCRIPT_CYPRIOT = HB_TAG ('C','p','r','t'), + HB_SCRIPT_LIMBU = HB_TAG ('L','i','m','b'), + HB_SCRIPT_OSMANYA = HB_TAG ('O','s','m','a'), + HB_SCRIPT_SHAVIAN = HB_TAG ('S','h','a','w'), + HB_SCRIPT_LINEAR_B = HB_TAG ('L','i','n','b'), + HB_SCRIPT_TAI_LE = HB_TAG ('T','a','l','e'), + HB_SCRIPT_UGARITIC = HB_TAG ('U','g','a','r'), /* Unicode-4.1 additions */ - HB_SCRIPT_NEW_TAI_LUE, /* Talu */ - HB_SCRIPT_BUGINESE, /* Bugi */ - HB_SCRIPT_GLAGOLITIC, /* Glag */ - HB_SCRIPT_TIFINAGH, /* Tfng */ - HB_SCRIPT_SYLOTI_NAGRI, /* Sylo */ - HB_SCRIPT_OLD_PERSIAN, /* Xpeo */ - HB_SCRIPT_KHAROSHTHI, /* Khar */ + HB_SCRIPT_NEW_TAI_LUE = HB_TAG ('T','a','l','u'), + HB_SCRIPT_BUGINESE = HB_TAG ('B','u','g','i'), + HB_SCRIPT_GLAGOLITIC = HB_TAG ('G','l','a','g'), + HB_SCRIPT_TIFINAGH = HB_TAG ('T','f','n','g'), + HB_SCRIPT_SYLOTI_NAGRI = HB_TAG ('S','y','l','o'), + HB_SCRIPT_OLD_PERSIAN = HB_TAG ('X','p','e','o'), + HB_SCRIPT_KHAROSHTHI = HB_TAG ('K','h','a','r'), /* Unicode-5.0 additions */ - HB_SCRIPT_UNKNOWN, /* Zzzz */ - HB_SCRIPT_BALINESE, /* Bali */ - HB_SCRIPT_CUNEIFORM, /* Xsux */ - HB_SCRIPT_PHOENICIAN, /* Phnx */ - HB_SCRIPT_PHAGS_PA, /* Phag */ - HB_SCRIPT_NKO, /* Nkoo */ + HB_SCRIPT_UNKNOWN = HB_TAG ('Z','z','z','z'), + HB_SCRIPT_BALINESE = HB_TAG ('B','a','l','i'), + HB_SCRIPT_CUNEIFORM = HB_TAG ('X','s','u','x'), + HB_SCRIPT_PHOENICIAN = HB_TAG ('P','h','n','x'), + HB_SCRIPT_PHAGS_PA = HB_TAG ('P','h','a','g'), + HB_SCRIPT_NKO = HB_TAG ('N','k','o','o'), /* Unicode-5.1 additions */ - HB_SCRIPT_KAYAH_LI, /* Kali */ - HB_SCRIPT_LEPCHA, /* Lepc */ - HB_SCRIPT_REJANG, /* Rjng */ - HB_SCRIPT_SUNDANESE, /* Sund */ - HB_SCRIPT_SAURASHTRA, /* Saur */ - HB_SCRIPT_CHAM, /* Cham */ - HB_SCRIPT_OL_CHIKI, /* Olck */ - HB_SCRIPT_VAI, /* Vaii */ - HB_SCRIPT_CARIAN, /* Cari */ - HB_SCRIPT_LYCIAN, /* Lyci */ - HB_SCRIPT_LYDIAN, /* Lydi */ + HB_SCRIPT_KAYAH_LI = HB_TAG ('K','a','l','i'), + HB_SCRIPT_LEPCHA = HB_TAG ('L','e','p','c'), + HB_SCRIPT_REJANG = HB_TAG ('R','j','n','g'), + HB_SCRIPT_SUNDANESE = HB_TAG ('S','u','n','d'), + HB_SCRIPT_SAURASHTRA = HB_TAG ('S','a','u','r'), + HB_SCRIPT_CHAM = HB_TAG ('C','h','a','m'), + HB_SCRIPT_OL_CHIKI = HB_TAG ('O','l','c','k'), + HB_SCRIPT_VAI = HB_TAG ('V','a','i','i'), + HB_SCRIPT_CARIAN = HB_TAG ('C','a','r','i'), + HB_SCRIPT_LYCIAN = HB_TAG ('L','y','c','i'), + HB_SCRIPT_LYDIAN = HB_TAG ('L','y','d','i'), /* Unicode-5.2 additions */ - HB_SCRIPT_AVESTAN, /* Avst */ - HB_SCRIPT_BAMUM, /* Bamu */ - HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, /* Egyp */ - HB_SCRIPT_IMPERIAL_ARAMAIC, /* Armi */ - HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, /* Phli */ - HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, /* Prti */ - HB_SCRIPT_JAVANESE, /* Java */ - HB_SCRIPT_KAITHI, /* Kthi */ - HB_SCRIPT_LISU, /* Lisu */ - HB_SCRIPT_MEETEI_MAYEK, /* Mtei */ - HB_SCRIPT_OLD_SOUTH_ARABIAN, /* Sarb */ - HB_SCRIPT_OLD_TURKIC, /* Orkh */ - HB_SCRIPT_SAMARITAN, /* Samr */ - HB_SCRIPT_TAI_THAM, /* Lana */ - HB_SCRIPT_TAI_VIET, /* Tavt */ + HB_SCRIPT_AVESTAN = HB_TAG ('A','v','s','t'), + HB_SCRIPT_BAMUM = HB_TAG ('B','a','m','u'), + HB_SCRIPT_EGYPTIAN_HIEROGLYPHS = HB_TAG ('E','g','y','p'), + HB_SCRIPT_IMPERIAL_ARAMAIC = HB_TAG ('A','r','m','i'), + HB_SCRIPT_INSCRIPTIONAL_PAHLAVI = HB_TAG ('P','h','l','i'), + HB_SCRIPT_INSCRIPTIONAL_PARTHIAN = HB_TAG ('P','r','t','i'), + HB_SCRIPT_JAVANESE = HB_TAG ('J','a','v','a'), + HB_SCRIPT_KAITHI = HB_TAG ('K','t','h','i'), + HB_SCRIPT_LISU = HB_TAG ('L','i','s','u'), + HB_SCRIPT_MEETEI_MAYEK = HB_TAG ('M','t','e','i'), + HB_SCRIPT_OLD_SOUTH_ARABIAN = HB_TAG ('S','a','r','b'), + HB_SCRIPT_OLD_TURKIC = HB_TAG ('O','r','k','h'), + HB_SCRIPT_SAMARITAN = HB_TAG ('S','a','m','r'), + HB_SCRIPT_TAI_THAM = HB_TAG ('L','a','n','a'), + HB_SCRIPT_TAI_VIET = HB_TAG ('T','a','v','t'), /* Unicode-6.0 additions */ - HB_SCRIPT_BATAK, /* Batk */ - HB_SCRIPT_BRAHMI, /* Brah */ - HB_SCRIPT_MANDAIC /* Mand */ + HB_SCRIPT_BATAK = HB_TAG ('B','a','t','k'), + HB_SCRIPT_BRAHMI = HB_TAG ('B','r','a','h'), + HB_SCRIPT_MANDAIC = HB_TAG ('M','a','n','d'), + + /* No script set */ + HB_SCRIPT_INVALID = HB_TAG_NONE } hb_script_t; diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index ca96ba983..77936004e 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -73,10 +73,10 @@ hb_ot_map_t::compile (hb_face_t *face, /* Fetch script/language indices for GSUB/GPOS. We need these later to skip * features not available in either table and not waste precious bits for them. */ - const hb_tag_t *script_tags; + hb_tag_t script_tags[3] = {HB_TAG_NONE}; hb_tag_t language_tag; - script_tags = hb_ot_tags_from_script (props->script); + hb_ot_tags_from_script (props->script, &script_tags[0], &script_tags[1]); language_tag = hb_ot_tag_from_language (props->language); unsigned int script_index[2], language_index[2]; diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh index fed167dec..814794527 100644 --- a/src/hb-ot-shape-complex-private.hh +++ b/src/hb-ot-shape-complex-private.hh @@ -37,7 +37,8 @@ HB_BEGIN_DECLS static inline hb_ot_complex_shaper_t hb_ot_shape_complex_categorize (const hb_segment_properties_t *props) { - switch ((int) props->script) { + switch ((int) props->script) + { case HB_SCRIPT_ARABIC: case HB_SCRIPT_NKO: case HB_SCRIPT_SYRIAC: diff --git a/src/hb-ot-tag.c b/src/hb-ot-tag.c index 8f62f8499..ecc188249 100644 --- a/src/hb-ot-tag.c +++ b/src/hb-ot-tag.c @@ -32,151 +32,123 @@ HB_BEGIN_DECLS +/* hb_script_t */ + +static hb_tag_t +hb_ot_old_tag_from_script (hb_script_t script) +{ + switch ((hb_tag_t) script) { + case HB_SCRIPT_COPTIC: return HB_TAG('c','o','p','t'); + case HB_SCRIPT_HIRAGANA: return HB_TAG('k','a','n','a'); + case HB_SCRIPT_LAO: return HB_TAG('l','a','o',' '); + case HB_SCRIPT_YI: return HB_TAG('y','i',' ',' '); + /* Unicode-5.0 additions */ + case HB_SCRIPT_NKO: return HB_TAG('n','k','o',' '); + /* Unicode-5.1 additions */ + case HB_SCRIPT_VAI: return HB_TAG('v','a','i',' '); + /* Unicode-5.2 additions */ + case HB_SCRIPT_MEETEI_MAYEK: return HB_TAG('m','y','e','i'); + /* Unicode-6.0 additions */ + } + + /* Else, just change first char to lowercase and return */ + return ((hb_tag_t) script) | 0x02000000; +} + +static hb_script_t +hb_ot_old_tag_to_script (hb_tag_t tag) +{ + switch (tag) { + case HB_TAG('c','o','p','t'): return HB_SCRIPT_COPTIC; + case HB_TAG('k','a','n','a'): return HB_SCRIPT_HIRAGANA; + case HB_TAG('l','a','o',' '): return HB_SCRIPT_LAO; + case HB_TAG('y','i',' ',' '): return HB_SCRIPT_YI; + /* Unicode-5.0 additions */ + case HB_TAG('n','k','o',' '): return HB_SCRIPT_NKO; + /* Unicode-5.1 additions */ + case HB_TAG('v','a','i',' '): return HB_SCRIPT_VAI; + /* Unicode-5.2 additions */ + case HB_TAG('m','y','e','i'): return HB_SCRIPT_MEETEI_MAYEK; + /* Unicode-6.0 additions */ + } + + /* Else, just change first char to uppercase and return */ + return (hb_script_t) (tag & ~0x02000000); +} + +static hb_tag_t +hb_ot_new_tag_from_script (hb_script_t script) +{ + switch ((hb_tag_t) script) { + case HB_SCRIPT_BENGALI: return HB_TAG('b','n','g','2'); + case HB_SCRIPT_DEVANAGARI: return HB_TAG('d','e','v','2'); + case HB_SCRIPT_GUJARATI: return HB_TAG('g','j','r','2'); + case HB_SCRIPT_GURMUKHI: return HB_TAG('g','u','r','2'); + case HB_SCRIPT_KANNADA: return HB_TAG('k','n','d','2'); + case HB_SCRIPT_MALAYALAM: return HB_TAG('m','l','m','2'); + case HB_SCRIPT_ORIYA: return HB_TAG('o','r','y','2'); + case HB_SCRIPT_TAMIL: return HB_TAG('t','m','l','2'); + case HB_SCRIPT_TELUGU: return HB_TAG('t','e','l','2'); + } + + return HB_TAG_NONE; +} + +static hb_script_t +hb_ot_new_tag_to_script (hb_tag_t tag) +{ + switch (tag) { + case HB_TAG('b','n','g','2'): return HB_SCRIPT_BENGALI; + case HB_TAG('d','e','v','2'): return HB_SCRIPT_DEVANAGARI; + case HB_TAG('g','j','r','2'): return HB_SCRIPT_GUJARATI; + case HB_TAG('g','u','r','2'): return HB_SCRIPT_GURMUKHI; + case HB_TAG('k','n','d','2'): return HB_SCRIPT_KANNADA; + case HB_TAG('m','l','m','2'): return HB_SCRIPT_MALAYALAM; + case HB_TAG('o','r','y','2'): return HB_SCRIPT_ORIYA; + case HB_TAG('t','m','l','2'): return HB_SCRIPT_TAMIL; + case HB_TAG('t','e','l','2'): return HB_SCRIPT_TELUGU; + } + + return HB_SCRIPT_UNKNOWN; +} + /* * Complete list at: * http://www.microsoft.com/typography/otspec/scripttags.htm + * + * Most of the script tags are the same as the ISO 15924 tag but lowercased. + * So we just do that, and handle the exceptional cases in a switch. */ -static const hb_tag_t ot_scripts[][3] = { - {HB_TAG('D','F','L','T')}, /* HB_SCRIPT_COMMON */ - {HB_TAG('D','F','L','T')}, /* HB_SCRIPT_INHERITED */ - {HB_TAG('a','r','a','b')}, /* HB_SCRIPT_ARABIC */ - {HB_TAG('a','r','m','n')}, /* HB_SCRIPT_ARMENIAN */ - {HB_TAG('b','n','g','2'), 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('c','o','p','t')}, /* 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','2'), 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','j','r','2'), HB_TAG('g','u','j','r')}, /* HB_SCRIPT_GUJARATI */ - {HB_TAG('g','u','r','2'), 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('k','a','n','a')}, /* HB_SCRIPT_HIRAGANA */ - {HB_TAG('k','n','d','2'), 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',' ')}, /* HB_SCRIPT_LAO */ - {HB_TAG('l','a','t','n')}, /* HB_SCRIPT_LATIN */ - {HB_TAG('m','l','m','2'), 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','2'), 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','m','l','2'), HB_TAG('t','a','m','l')}, /* HB_SCRIPT_TAMIL */ - {HB_TAG('t','e','l','2'), 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',' ',' ')}, /* 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('D','F','L','T')}, /* 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',' ')}, /* 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',' ')}, /* 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','y','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 */ -}; - -const hb_tag_t * -hb_ot_tags_from_script (hb_script_t script) +void +hb_ot_tags_from_script (hb_script_t script, + hb_tag_t *script_tag_1, + hb_tag_t *script_tag_2) { - static const hb_tag_t def_tag[] = {HB_OT_TAG_DEFAULT_SCRIPT, HB_TAG_NONE}; + hb_tag_t new_tag; - /* XXX Handle non-enum scripts */ + *script_tag_2 = HB_TAG_NONE; + *script_tag_1 = hb_ot_old_tag_from_script (script); - if (unlikely ((unsigned int) script >= ARRAY_LENGTH (ot_scripts))) - return def_tag; - - return ot_scripts[script]; + new_tag = hb_ot_new_tag_from_script (script); + if (unlikely (new_tag != HB_TAG_NONE)) { + *script_tag_2 = *script_tag_1; + *script_tag_1 = new_tag; + } } hb_script_t hb_ot_tag_to_script (hb_tag_t tag) { - int i; + if (unlikely ((tag & 0x000000FF) == '2')) + return hb_ot_new_tag_to_script (tag); - for (i = 0; i < ARRAY_LENGTH (ot_scripts); i++) { - const hb_tag_t *p; - for (p = ot_scripts[i]; *p; p++) - if (tag == *p) - return i; - } - - /* XXX Convert to non-enum scripts */ - - return HB_SCRIPT_UNKNOWN; + return hb_ot_old_tag_to_script (tag); } + +/* hb_language_t */ + typedef struct { char language[6]; hb_tag_t tag; diff --git a/src/hb-ot-tag.h b/src/hb-ot-tag.h index 4a5e26da9..345c80ed5 100644 --- a/src/hb-ot-tag.h +++ b/src/hb-ot-tag.h @@ -35,8 +35,10 @@ HB_BEGIN_DECLS #define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T') #define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't') -const hb_tag_t * -hb_ot_tags_from_script (hb_script_t script); +void +hb_ot_tags_from_script (hb_script_t script, + hb_tag_t *script_tag_1, + hb_tag_t *script_tag_2); hb_script_t hb_ot_tag_to_script (hb_tag_t tag); diff --git a/src/hb-shape.cc b/src/hb-shape.cc index 9e2ea4ecd..368abfcac 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -78,7 +78,9 @@ hb_shape (hb_font_t *font, unsigned int count = buffer->len; for (unsigned int i = 0; i < count; i++) { hb_script_t script = get_script (buffer->info[i].codepoint); - if (likely (script > HB_SCRIPT_INHERITED)) { + if (likely (script != HB_SCRIPT_COMMON && + script != HB_SCRIPT_INHERITED && + script != HB_SCRIPT_UNKNOWN)) { buffer->props.script = script; break; } diff --git a/test/test-types.c b/test/test-types.c index 48aa087f7..5d7043ee5 100644 --- a/test/test-types.c +++ b/test/test-types.c @@ -108,7 +108,7 @@ test_types_script (void) hb_tag_t x123 = HB_TAG_CHAR4 ("x123"); - g_assert_cmpint ((signed) HB_SCRIPT_INVALID, ==, -1); + g_assert_cmpint ((hb_tag_t) HB_SCRIPT_INVALID, ==, HB_TAG_NONE); g_assert_cmphex (HB_SCRIPT_ARABIC, !=, HB_SCRIPT_LATIN); g_assert_cmphex (HB_SCRIPT_ARABIC, ==, hb_script_from_iso15924_tag (arab));