[glib] Add two-way script conversion functions
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 20 Apr 2011 06:44:29 +0000 (02:44 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 20 Apr 2011 06:44:29 +0000 (02:44 -0400)
Also optimizes the common-direction script lookup to be an array lookup.

src/hb-glib.cc
src/hb-glib.h

index a87031b..158a210 100644 (file)
 
 HB_BEGIN_DECLS
 
+static const hb_script_t
+glib_script_to_script[] =
+{
+  HB_SCRIPT_COMMON,
+  HB_SCRIPT_INHERITED,
+  HB_SCRIPT_ARABIC,
+  HB_SCRIPT_ARMENIAN,
+  HB_SCRIPT_BENGALI,
+  HB_SCRIPT_BOPOMOFO,
+  HB_SCRIPT_CHEROKEE,
+  HB_SCRIPT_COPTIC,
+  HB_SCRIPT_CYRILLIC,
+  HB_SCRIPT_DESERET,
+  HB_SCRIPT_DEVANAGARI,
+  HB_SCRIPT_ETHIOPIC,
+  HB_SCRIPT_GEORGIAN,
+  HB_SCRIPT_GOTHIC,
+  HB_SCRIPT_GREEK,
+  HB_SCRIPT_GUJARATI,
+  HB_SCRIPT_GURMUKHI,
+  HB_SCRIPT_HAN,
+  HB_SCRIPT_HANGUL,
+  HB_SCRIPT_HEBREW,
+  HB_SCRIPT_HIRAGANA,
+  HB_SCRIPT_KANNADA,
+  HB_SCRIPT_KATAKANA,
+  HB_SCRIPT_KHMER,
+  HB_SCRIPT_LAO,
+  HB_SCRIPT_LATIN,
+  HB_SCRIPT_MALAYALAM,
+  HB_SCRIPT_MONGOLIAN,
+  HB_SCRIPT_MYANMAR,
+  HB_SCRIPT_OGHAM,
+  HB_SCRIPT_OLD_ITALIC,
+  HB_SCRIPT_ORIYA,
+  HB_SCRIPT_RUNIC,
+  HB_SCRIPT_SINHALA,
+  HB_SCRIPT_SYRIAC,
+  HB_SCRIPT_TAMIL,
+  HB_SCRIPT_TELUGU,
+  HB_SCRIPT_THAANA,
+  HB_SCRIPT_THAI,
+  HB_SCRIPT_TIBETAN,
+  HB_SCRIPT_CANADIAN_ABORIGINAL,
+  HB_SCRIPT_YI,
+  HB_SCRIPT_TAGALOG,
+  HB_SCRIPT_HANUNOO,
+  HB_SCRIPT_BUHID,
+  HB_SCRIPT_TAGBANWA,
+
+  /* Unicode-4.0 additions */
+  HB_SCRIPT_BRAILLE,
+  HB_SCRIPT_CYPRIOT,
+  HB_SCRIPT_LIMBU,
+  HB_SCRIPT_OSMANYA,
+  HB_SCRIPT_SHAVIAN,
+  HB_SCRIPT_LINEAR_B,
+  HB_SCRIPT_TAI_LE,
+  HB_SCRIPT_UGARITIC,
+
+  /* Unicode-4.1 additions */
+  HB_SCRIPT_NEW_TAI_LUE,
+  HB_SCRIPT_BUGINESE,
+  HB_SCRIPT_GLAGOLITIC,
+  HB_SCRIPT_TIFINAGH,
+  HB_SCRIPT_SYLOTI_NAGRI,
+  HB_SCRIPT_OLD_PERSIAN,
+  HB_SCRIPT_KHAROSHTHI,
+
+  /* Unicode-5.0 additions */
+  HB_SCRIPT_UNKNOWN,
+  HB_SCRIPT_BALINESE,
+  HB_SCRIPT_CUNEIFORM,
+  HB_SCRIPT_PHOENICIAN,
+  HB_SCRIPT_PHAGS_PA,
+  HB_SCRIPT_NKO,
+
+  /* Unicode-5.1 additions */
+  HB_SCRIPT_KAYAH_LI,
+  HB_SCRIPT_LEPCHA,
+  HB_SCRIPT_REJANG,
+  HB_SCRIPT_SUNDANESE,
+  HB_SCRIPT_SAURASHTRA,
+  HB_SCRIPT_CHAM,
+  HB_SCRIPT_OL_CHIKI,
+  HB_SCRIPT_VAI,
+  HB_SCRIPT_CARIAN,
+  HB_SCRIPT_LYCIAN,
+  HB_SCRIPT_LYDIAN,
+
+  /* Unicode-5.2 additions */
+  HB_SCRIPT_AVESTAN,
+  HB_SCRIPT_BAMUM,
+  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,
+  HB_SCRIPT_IMPERIAL_ARAMAIC,
+  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
+  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
+  HB_SCRIPT_JAVANESE,
+  HB_SCRIPT_KAITHI,
+  HB_SCRIPT_TAI_THAM,
+  HB_SCRIPT_LISU,
+  HB_SCRIPT_MEETEI_MAYEK,
+  HB_SCRIPT_OLD_SOUTH_ARABIAN,
+  HB_SCRIPT_OLD_TURKIC,
+  HB_SCRIPT_SAMARITAN,
+  HB_SCRIPT_TAI_VIET,
+
+  /* Unicode-6.0 additions */
+  HB_SCRIPT_BATAK,
+  HB_SCRIPT_BRAHMI,
+  HB_SCRIPT_MANDAIC
+};
+
+hb_script_t
+hb_glib_script_to_script (GUnicodeScript script)
+{
+  if (likely ((unsigned int) script < ARRAY_LENGTH (glib_script_to_script)))
+    return glib_script_to_script[script];
+
+  if (unlikely (script == G_UNICODE_SCRIPT_INVALID_CODE))
+    return HB_SCRIPT_INVALID;
+
+  return HB_SCRIPT_UNKNOWN;
+}
+
+GUnicodeScript
+hb_glib_script_from_script (hb_script_t script)
+{
+  unsigned int count = ARRAY_LENGTH (glib_script_to_script);
+  for (unsigned int i = 0; i < count; i++)
+    if (glib_script_to_script[i] == script)
+      return (GUnicodeScript) i;
+
+  if (unlikely (script == HB_SCRIPT_INVALID))
+    return G_UNICODE_SCRIPT_INVALID_CODE;
+
+  return G_UNICODE_SCRIPT_UNKNOWN;
+}
+
 
 static unsigned int
 hb_glib_get_combining_class (hb_unicode_funcs_t *ufuncs,
@@ -76,136 +215,7 @@ hb_glib_get_script (hb_unicode_funcs_t *ufuncs,
                     hb_codepoint_t      unicode,
                     void               *user_data)
 {
-  GUnicodeScript script = g_unichar_get_script (unicode);
-  switch (script)
-  {
-#define MATCH_SCRIPT(C) case G_UNICODE_SCRIPT_##C: return HB_SCRIPT_##C
-#define MATCH_SCRIPT2(C1, C2) case G_UNICODE_SCRIPT_##C1: return HB_SCRIPT_##C2
-
-  MATCH_SCRIPT2(INVALID_CODE, INVALID);
-
-  MATCH_SCRIPT (COMMON);
-  MATCH_SCRIPT (INHERITED);
-  MATCH_SCRIPT (ARABIC);
-  MATCH_SCRIPT (ARMENIAN);
-  MATCH_SCRIPT (BENGALI);
-  MATCH_SCRIPT (BOPOMOFO);
-  MATCH_SCRIPT (CHEROKEE);
-  MATCH_SCRIPT (COPTIC);
-  MATCH_SCRIPT (CYRILLIC);
-  MATCH_SCRIPT (DESERET);
-  MATCH_SCRIPT (DEVANAGARI);
-  MATCH_SCRIPT (ETHIOPIC);
-  MATCH_SCRIPT (GEORGIAN);
-  MATCH_SCRIPT (GOTHIC);
-  MATCH_SCRIPT (GREEK);
-  MATCH_SCRIPT (GUJARATI);
-  MATCH_SCRIPT (GURMUKHI);
-  MATCH_SCRIPT (HAN);
-  MATCH_SCRIPT (HANGUL);
-  MATCH_SCRIPT (HEBREW);
-  MATCH_SCRIPT (HIRAGANA);
-  MATCH_SCRIPT (KANNADA);
-  MATCH_SCRIPT (KATAKANA);
-  MATCH_SCRIPT (KHMER);
-  MATCH_SCRIPT (LAO);
-  MATCH_SCRIPT (LATIN);
-  MATCH_SCRIPT (MALAYALAM);
-  MATCH_SCRIPT (MONGOLIAN);
-  MATCH_SCRIPT (MYANMAR);
-  MATCH_SCRIPT (OGHAM);
-  MATCH_SCRIPT (OLD_ITALIC);
-  MATCH_SCRIPT (ORIYA);
-  MATCH_SCRIPT (RUNIC);
-  MATCH_SCRIPT (SINHALA);
-  MATCH_SCRIPT (SYRIAC);
-  MATCH_SCRIPT (TAMIL);
-  MATCH_SCRIPT (TELUGU);
-  MATCH_SCRIPT (THAANA);
-  MATCH_SCRIPT (THAI);
-  MATCH_SCRIPT (TIBETAN);
-  MATCH_SCRIPT (CANADIAN_ABORIGINAL);
-  MATCH_SCRIPT (YI);
-  MATCH_SCRIPT (TAGALOG);
-  MATCH_SCRIPT (HANUNOO);
-  MATCH_SCRIPT (BUHID);
-  MATCH_SCRIPT (TAGBANWA);
-
-  /* Unicode-4.0 additions */
-  MATCH_SCRIPT (BRAILLE);
-  MATCH_SCRIPT (CYPRIOT);
-  MATCH_SCRIPT (LIMBU);
-  MATCH_SCRIPT (OSMANYA);
-  MATCH_SCRIPT (SHAVIAN);
-  MATCH_SCRIPT (LINEAR_B);
-  MATCH_SCRIPT (TAI_LE);
-  MATCH_SCRIPT (UGARITIC);
-
-  /* Unicode-4.1 additions */
-  MATCH_SCRIPT (NEW_TAI_LUE);
-  MATCH_SCRIPT (BUGINESE);
-  MATCH_SCRIPT (GLAGOLITIC);
-  MATCH_SCRIPT (TIFINAGH);
-  MATCH_SCRIPT (SYLOTI_NAGRI);
-  MATCH_SCRIPT (OLD_PERSIAN);
-  MATCH_SCRIPT (KHAROSHTHI);
-
-  /* Unicode-5.0 additions */
-  MATCH_SCRIPT (UNKNOWN);
-  MATCH_SCRIPT (BALINESE);
-  MATCH_SCRIPT (CUNEIFORM);
-  MATCH_SCRIPT (PHOENICIAN);
-  MATCH_SCRIPT (PHAGS_PA);
-  MATCH_SCRIPT (NKO);
-
-  /* Unicode-5.1 additions */
-  MATCH_SCRIPT (KAYAH_LI);
-  MATCH_SCRIPT (LEPCHA);
-  MATCH_SCRIPT (REJANG);
-  MATCH_SCRIPT (SUNDANESE);
-  MATCH_SCRIPT (SAURASHTRA);
-  MATCH_SCRIPT (CHAM);
-  MATCH_SCRIPT (OL_CHIKI);
-  MATCH_SCRIPT (VAI);
-  MATCH_SCRIPT (CARIAN);
-  MATCH_SCRIPT (LYCIAN);
-  MATCH_SCRIPT (LYDIAN);
-
-  /* Unicode-5.2 additions */
-#if GLIB_CHECK_VERSION(2,26,0)
-  MATCH_SCRIPT (AVESTAN);
-  MATCH_SCRIPT (BAMUM);
-  MATCH_SCRIPT (EGYPTIAN_HIEROGLYPHS);
-  MATCH_SCRIPT (IMPERIAL_ARAMAIC);
-  MATCH_SCRIPT (INSCRIPTIONAL_PAHLAVI);
-  MATCH_SCRIPT (INSCRIPTIONAL_PARTHIAN);
-  MATCH_SCRIPT (JAVANESE);
-  MATCH_SCRIPT (KAITHI);
-  MATCH_SCRIPT (TAI_THAM);
-  MATCH_SCRIPT (LISU);
-  MATCH_SCRIPT (MEETEI_MAYEK);
-  MATCH_SCRIPT (OLD_SOUTH_ARABIAN);
-#if GLIB_CHECK_VERSION(2,27,92)
-  MATCH_SCRIPT (OLD_TURKIC);
-#else
-  MATCH_SCRIPT2(OLD_TURKISH, OLD_TURKIC);
-#endif
-  MATCH_SCRIPT (SAMARITAN);
-  MATCH_SCRIPT (TAI_VIET);
-#endif
-
-  /* Unicode-6.0 additions */
-#if GLIB_CHECK_VERSION(2,28,0)
-  MATCH_SCRIPT (BATAK);
-  MATCH_SCRIPT (BRAHMI);
-  MATCH_SCRIPT (MANDAIC);
-#endif
-
-#undef MATCH_SCRIPT
-#undef MATCH_SCRIPT2
-  }
-
-  return HB_SCRIPT_UNKNOWN;
+  return hb_glib_script_to_script (g_unichar_get_script (unicode));
 }
 
 static hb_unicode_funcs_t glib_ufuncs = {
index 81ab15d..abec2d2 100644 (file)
 #define HB_GLIB_H
 
 #include "hb.h"
+#include <glib.h>
 
 HB_BEGIN_DECLS
 
 
+hb_script_t
+hb_glib_script_to_script (GUnicodeScript script);
+
+GUnicodeScript
+hb_glib_script_from_script (hb_script_t script);
+
+
 hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs (void);