[API] Use ISO 15924 tags for hb_script_t
authorBehdad Esfahbod <behdad@behdad.org>
Tue, 19 Apr 2011 03:40:21 +0000 (23:40 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Tue, 19 Apr 2011 03:40:21 +0000 (23:40 -0400)
This simplifies the code, reduces static data, and makes the design
more extensible to future additions of new scripts.

src/hb-common.c
src/hb-common.h
src/hb-ot-map.cc
src/hb-ot-shape-complex-private.hh
src/hb-ot-tag.c
src/hb-ot-tag.h
src/hb-shape.cc
test/test-types.c

index a913415..56537e4 100644 (file)
@@ -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:
+
+    /* 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 horiz_dir[script];
+  return HB_DIRECTION_LTR;
 }
 
 
index 21caa71..c6481bb 100644 (file)
@@ -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;
 
 
index ca96ba9..7793600 100644 (file)
@@ -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];
index fed167d..8147945 100644 (file)
@@ -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:
index 8f62f84..ecc1882 100644 (file)
 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};
-
-  /* XXX Handle non-enum scripts */
+  hb_tag_t new_tag;
 
-  if (unlikely ((unsigned int) script >= ARRAY_LENGTH (ot_scripts)))
-    return def_tag;
+  *script_tag_2 = HB_TAG_NONE;
+  *script_tag_1 = hb_ot_old_tag_from_script (script);
 
-  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;
-  }
+  return hb_ot_old_tag_to_script (tag);
+}
 
-  /* XXX Convert to non-enum scripts */
 
-  return HB_SCRIPT_UNKNOWN;
-}
+/* hb_language_t */
 
 typedef struct {
   char language[6];
index 4a5e26d..345c80e 100644 (file)
@@ -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);
index 9e2ea4e..368abfc 100644 (file)
@@ -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;
       }
index 48aa087..5d7043e 100644 (file)
@@ -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));