[gtk+/wip/matthiasc/font-variations: 54/62] gtk-demo Populate scripts/langs for font features



commit 60489d0d4c5bada1f7531ed35b24a5072fdfe910
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Dec 27 18:30:00 2017 -0500

    gtk-demo Populate scripts/langs for font features
    
    We didn't have names for most scripts and languages, and
    no translations at all. Copy the necessary code from gtk
    here.

 demos/gtk-demo/font_features.c  |   94 +++-------------
 demos/gtk-demo/language-names.c |  233 +++++++++++++++++++++++++++++++++++++++
 demos/gtk-demo/language-names.h |   13 ++
 demos/gtk-demo/meson.build      |    2 +-
 demos/gtk-demo/script-names.c   |  184 ++++++++++++++++++++++++++++++
 demos/gtk-demo/script-names.h   |   13 ++
 6 files changed, 460 insertions(+), 79 deletions(-)
---
diff --git a/demos/gtk-demo/font_features.c b/demos/gtk-demo/font_features.c
index 7c5693b..2f6760b 100644
--- a/demos/gtk-demo/font_features.c
+++ b/demos/gtk-demo/font_features.c
@@ -23,6 +23,8 @@
 
 #include "open-type-layout.h"
 #include "fontplane.h"
+#include "script-names.h"
+#include "language-names.h"
 
 
 #define MAKE_TAG(a,b,c,d) (unsigned int)(((a) << 24) | ((b) << 16) | ((c) <<  8) | (d))
@@ -315,52 +317,6 @@ get_pango_font (void)
   return pango_context_load_font (context, desc);
 }
 
-static struct { const char *name; hb_script_t script; } script_names[] = {
-  { "Common", HB_SCRIPT_COMMON },
-  { "Inherited", HB_SCRIPT_INHERITED },
-  { "Unknown", HB_SCRIPT_UNKNOWN },
-  { "Arabic", HB_SCRIPT_ARABIC },
-  { "Armenian", HB_SCRIPT_ARMENIAN },
-  { "Bengali", HB_SCRIPT_BENGALI },
-  { "Cyrillic", HB_SCRIPT_CYRILLIC },
-  { "Devanagari", HB_SCRIPT_DEVANAGARI },
-  { "Georgian", HB_SCRIPT_GEORGIAN },
-  { "Greek", HB_SCRIPT_GREEK },
-  { "Gujarati", HB_SCRIPT_GUJARATI },
-  { "Gurmukhi", HB_SCRIPT_GURMUKHI },
-  { "Hangul", HB_SCRIPT_HANGUL },
-  { "Han", HB_SCRIPT_HAN },
-  { "Hebrew", HB_SCRIPT_HEBREW },
-  { "Hiragana", HB_SCRIPT_HIRAGANA },
-  { "Kannada", HB_SCRIPT_KANNADA },
-  { "Katakana", HB_SCRIPT_KATAKANA },
-  { "Lao", HB_SCRIPT_LAO },
-  { "Latin", HB_SCRIPT_LATIN },
-  { "Malayalam", HB_SCRIPT_MALAYALAM },
-  { "Oriya", HB_SCRIPT_ORIYA },
-  { "Tamil", HB_SCRIPT_TAMIL },
-  { "Telugu", HB_SCRIPT_TELUGU },
-  { "Thai", HB_SCRIPT_THAI },
-  { "Tibetan", HB_SCRIPT_TIBETAN },
-  { "Bopomofo", HB_SCRIPT_BOPOMOFO }
-  /* FIXME: complete */
-};
-
-static struct { const char *name; hb_tag_t tag; } language_names[] = {
-  { "Arabic", HB_TAG ('A','R','A',' ') },
-  { "Romanian", HB_TAG ('R','O','M',' ') },
-  { "Skolt Sami", HB_TAG ('S','K','S',' ') },
-  { "Northern Sami", HB_TAG ('N','S','M',' ') },
-  { "Kildin Sami", HB_TAG ('K','S','M',' ') },
-  { "Moldavian", HB_TAG ('M','O','L',' ') },
-  { "Turkish", HB_TAG ('T','R','K',' ') },
-  { "Azerbaijani", HB_TAG ('A','Z','E',' ') },
-  { "Crimean Tatar", HB_TAG ('C','R','T',' ') },
-  { "Serbian", HB_TAG ('S','R','B',' ') },
-  { "German", HB_TAG ('D','E','U',' ') }
-  /* FIXME: complete */
-};
-
 typedef struct {
   hb_tag_t script_tag;
   hb_tag_t lang_tag;
@@ -410,7 +366,7 @@ update_script_combo (void)
 {
   GtkListStore *store;
   hb_font_t *hb_font;
-  gint i, j, k, l;
+  gint i, j, k;
   FT_Face ft_face;
   PangoFont *pango_font;
   GHashTable *tags;
@@ -483,48 +439,30 @@ update_script_combo (void)
       char langbuf[5];
       char *name;
 
+      hb_tag_to_string (pair->script_tag, scriptbuf);
+      scriptbuf[4] = 0;
+
+      hb_tag_to_string (pair->lang_tag, langbuf);
+      langbuf[4] = 0;
+
       if (pair->script_tag == HB_OT_TAG_DEFAULT_SCRIPT)
         scriptname = "Default";
       else if (pair->script_tag == HB_TAG ('m','a','t','h'))
         scriptname = "Math";
       else
-        {
-          hb_script_t script;
+        scriptname = get_script_name_for_tag (pair->script_tag);
 
-          hb_tag_to_string (pair->script_tag, scriptbuf);
-          scriptbuf[4] = 0;
-          scriptname = scriptbuf;
+      if (!scriptname)
+        scriptname = scriptbuf;
 
-          script = hb_script_from_iso15924_tag (pair->script_tag);
-          for (k = 0; k < G_N_ELEMENTS (script_names); k++)
-            {
-              if (script == script_names[k].script)
-                {
-                  scriptname = script_names[k].name;
-                  break;
-                }
-            }
-        }
+      langname = get_language_name_for_tag (pair->lang_tag);
+      if (!langname)
+        langname = langbuf;
 
       if (pair->lang_tag == HB_OT_TAG_DEFAULT_LANGUAGE)
         name = g_strdup_printf ("%s Script", scriptname);
       else
-        {
-          hb_tag_to_string (pair->lang_tag, langbuf);
-          langbuf[4] = 0;
-          langname = langbuf;
-
-          for (l = 0; l < G_N_ELEMENTS (language_names); l++)
-            {
-              if (pair->lang_tag == language_names[l].tag)
-                {
-                  langname = language_names[l].name;
-                  break;
-                }
-            }
-
-          name = g_strdup (langname);
-        }
+        name = g_strdup (langname);
 
       gtk_list_store_insert_with_values (store, NULL, -1,
                                          0, name,
diff --git a/demos/gtk-demo/language-names.c b/demos/gtk-demo/language-names.c
new file mode 100644
index 0000000..2d433cf
--- /dev/null
+++ b/demos/gtk-demo/language-names.c
@@ -0,0 +1,233 @@
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <dirent.h>
+#include <locale.h>
+#include <langinfo.h>
+#include <sys/stat.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <hb-ot.h>
+
+#include "language-names.h"
+
+#define ISO_CODES_PREFIX "/usr"
+#define ISO_CODES_DATADIR ISO_CODES_PREFIX "/share/xml/iso-codes"
+#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX "/share/locale"
+
+static GHashTable *language_map;
+
+static char *
+get_first_item_in_semicolon_list (const char *list)
+{
+  char **items;
+  char  *item;
+
+  items = g_strsplit (list, "; ", 2);
+
+  item = g_strdup (items[0]);
+  g_strfreev (items);
+
+  return item;
+}
+
+static char *
+capitalize_utf8_string (const char *str)
+{
+  char first[8] = { 0 };
+
+  if (!str)
+    return NULL;
+
+  g_unichar_to_utf8 (g_unichar_totitle (g_utf8_get_char (str)), first);
+
+  return g_strconcat (first, g_utf8_offset_to_pointer (str, 1), NULL);
+}
+
+static char *
+get_display_name (const char *language)
+{
+  const char  *translated;
+  char *tmp;
+  char *name;
+
+  translated = dgettext ("iso_639", language);
+
+  tmp = get_first_item_in_semicolon_list (translated);
+  name = capitalize_utf8_string (tmp);
+  g_free (tmp);
+
+  return name;
+}
+
+static void
+languages_parse_start_tag (GMarkupParseContext  *ctx,
+                           const char           *element_name,
+                           const char          **attr_names,
+                           const char          **attr_values,
+                           gpointer              user_data,
+                           GError              **error)
+{
+  const char *ccode_longB;
+  const char *ccode_longT;
+  const char *ccode;
+  const char *ccode_id;
+  const char *lang_name;
+  char *display_name;
+
+  if (!(g_str_equal (element_name, "iso_639_entry") ||
+        g_str_equal (element_name, "iso_639_3_entry")) ||
+        attr_names == NULL ||
+        attr_values == NULL)
+    return;
+
+  ccode = NULL;
+  ccode_longB = NULL;
+  ccode_longT = NULL;
+  ccode_id = NULL;
+  lang_name = NULL;
+
+  while (*attr_names && *attr_values)
+    {
+      if (g_str_equal (*attr_names, "iso_639_1_code"))
+        {
+          if (**attr_values)
+            {
+              if (strlen (*attr_values) != 2)
+                return;
+              ccode = *attr_values;
+            }
+        }
+      else if (g_str_equal (*attr_names, "iso_639_2B_code"))
+        {
+          if (**attr_values)
+            {
+              if (strlen (*attr_values) != 3)
+                return;
+              ccode_longB = *attr_values;
+            }
+        }
+      else if (g_str_equal (*attr_names, "iso_639_2T_code"))
+        {
+          if (**attr_values)
+            {
+              if (strlen (*attr_values) != 3)
+                return;
+              ccode_longT = *attr_values;
+            }
+        }
+      else if (g_str_equal (*attr_names, "id"))
+        {
+          if (**attr_values)
+            {
+              if (strlen (*attr_values) != 2 &&
+                  strlen (*attr_values) != 3)
+                return;
+              ccode_id = *attr_values;
+            }
+        }
+      else if (g_str_equal (*attr_names, "name"))
+        {
+          lang_name = *attr_values;
+        }
+
+      ++attr_names;
+      ++attr_values;
+    }
+
+  if (lang_name == NULL)
+    return;
+
+  display_name = get_display_name (lang_name);
+
+  if (ccode != NULL)
+    g_hash_table_insert (language_map,
+                         pango_language_from_string (ccode),
+                         g_strdup (display_name));
+
+  if (ccode_longB != NULL)
+    g_hash_table_insert (language_map,
+                         pango_language_from_string (ccode_longB),
+                         g_strdup (display_name));
+
+  if (ccode_longT != NULL)
+    g_hash_table_insert (language_map,
+                         pango_language_from_string (ccode_longT),
+                         g_strdup (display_name));
+
+  if (ccode_id != NULL)
+    g_hash_table_insert (language_map,
+                         pango_language_from_string (ccode_id),
+                         g_strdup (display_name));
+
+  g_free (display_name);
+}
+
+static void
+languages_variant_init (const char *variant)
+{
+  gboolean res;
+  gsize    buf_len;
+  g_autofree char *buf = NULL;
+  g_autofree char *filename = NULL;
+  g_autoptr (GError) error = NULL;
+
+  bindtextdomain (variant, ISO_CODES_LOCALESDIR);
+  bind_textdomain_codeset (variant, "UTF-8");
+
+  error = NULL;
+  filename = g_strconcat (ISO_CODES_DATADIR, "/", variant, ".xml", NULL);
+  res = g_file_get_contents (filename, &buf, &buf_len, &error);
+  if (res)
+    {
+      g_autoptr (GMarkupParseContext) ctx = NULL;
+      GMarkupParser parser = { languages_parse_start_tag, NULL, NULL, NULL, NULL };
+
+      ctx = g_markup_parse_context_new (&parser, 0, NULL, NULL);
+
+      error = NULL;
+      res = g_markup_parse_context_parse (ctx, buf, buf_len, &error);
+
+      if (!res)
+        g_warning ("Failed to parse '%s': %s\n", filename, error->message);
+    }
+  else
+    g_warning ("Failed to load '%s': %s\n", filename, error->message);
+}
+
+static void
+languages_init (void)
+{
+  if (language_map)
+    return;
+
+  language_map = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+  languages_variant_init ("iso_639");
+  languages_variant_init ("iso_639_3");
+}
+
+const char *
+get_language_name (PangoLanguage *language)
+{
+  languages_init ();
+
+  return (const char *) g_hash_table_lookup (language_map, language);
+}
+
+const char *
+get_language_name_for_tag (guint32 tag)
+{
+  hb_language_t lang;
+  const char *s;
+
+  lang = hb_ot_tag_to_language (tag);
+  s = hb_language_to_string (lang);
+
+  return get_language_name (pango_language_from_string (s));
+}
diff --git a/demos/gtk-demo/language-names.h b/demos/gtk-demo/language-names.h
new file mode 100644
index 0000000..562f7ae
--- /dev/null
+++ b/demos/gtk-demo/language-names.h
@@ -0,0 +1,13 @@
+#ifndef LANGUAGE_NAMES_H
+#define LANGUAGE_NAMES_H
+
+#include <pango/pango.h>
+
+G_BEGIN_DECLS
+
+const char * get_language_name (PangoLanguage *language);
+const char * get_language_name_for_tag (guint32 tag);
+
+G_END_DECLS
+
+#endif
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index acd0c6a..f4c3613 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -94,7 +94,7 @@ gtkdemo_resources = gnome.compile_resources('gtkdemo_resources',
                                             source_dir: '.')
 
 executable('gtk4-demo',
-           'main.c', 'gtkfishbowl.c', 'fontplane.c', demos, demos_h, gtkdemo_resources,
+           'main.c', 'gtkfishbowl.c', 'fontplane.c', 'script-names.c', 'language-names.c', demos, demos_h, 
gtkdemo_resources,
            c_args: gtkdemo_args,
            dependencies: gtkdemo_deps,
            include_directories: confinc,
diff --git a/demos/gtk-demo/script-names.c b/demos/gtk-demo/script-names.c
new file mode 100644
index 0000000..5049c34
--- /dev/null
+++ b/demos/gtk-demo/script-names.c
@@ -0,0 +1,184 @@
+#include "config.h"
+#include <glib.h>
+#include <glib/gi18n-lib.h>
+#include <hb-ot.h>
+
+#include "script-names.h"
+
+static struct {
+  GUnicodeScript script;
+  hb_script_t hb_script;
+  const char *name;
+} scripts[] =
+{
+  { G_UNICODE_SCRIPT_COMMON, HB_SCRIPT_COMMON,  NULL },
+  { G_UNICODE_SCRIPT_INHERITED, HB_SCRIPT_INHERITED,  NULL },
+  { G_UNICODE_SCRIPT_ARABIC, HB_SCRIPT_ARABIC,  NC_("Script", "Arabic") },
+  { G_UNICODE_SCRIPT_ARMENIAN, HB_SCRIPT_ARMENIAN,  NC_("Script", "Armenian") },
+  { G_UNICODE_SCRIPT_BENGALI, HB_SCRIPT_BENGALI,  NC_("Script", "Bengali") },
+  { G_UNICODE_SCRIPT_BOPOMOFO, HB_SCRIPT_BOPOMOFO,  NC_("Script", "Bopomofo") },
+  { G_UNICODE_SCRIPT_CHEROKEE, HB_SCRIPT_CHEROKEE,  NC_("Script", "Cherokee") },
+  { G_UNICODE_SCRIPT_COPTIC, HB_SCRIPT_COPTIC,  NC_("Script", "Coptic") },
+  { G_UNICODE_SCRIPT_CYRILLIC, HB_SCRIPT_CYRILLIC,  NC_("Script", "Cyrillic") },
+  { G_UNICODE_SCRIPT_DESERET, HB_SCRIPT_DESERET,  NC_("Script", "Deseret") },
+  { G_UNICODE_SCRIPT_DEVANAGARI, HB_SCRIPT_DEVANAGARI,  NC_("Script", "Devanagari") },
+  { G_UNICODE_SCRIPT_ETHIOPIC, HB_SCRIPT_ETHIOPIC,  NC_("Script", "Ethiopic") },
+  { G_UNICODE_SCRIPT_GEORGIAN, HB_SCRIPT_GEORGIAN,  NC_("Script", "Georgian") },
+  { G_UNICODE_SCRIPT_GOTHIC, HB_SCRIPT_GOTHIC,  NC_("Script", "Gothic") },
+  { G_UNICODE_SCRIPT_GREEK, HB_SCRIPT_GREEK,  NC_("Script", "Greek") },
+  { G_UNICODE_SCRIPT_GUJARATI, HB_SCRIPT_GUJARATI,  NC_("Script", "Gujarati") },
+  { G_UNICODE_SCRIPT_GURMUKHI, HB_SCRIPT_GURMUKHI,  NC_("Script", "Gurmukhi") },
+  { G_UNICODE_SCRIPT_HAN, HB_SCRIPT_HAN,  NC_("Script", "Han") },
+  { G_UNICODE_SCRIPT_HANGUL, HB_SCRIPT_HANGUL,  NC_("Script", "Hangul") },
+  { G_UNICODE_SCRIPT_HEBREW, HB_SCRIPT_HEBREW,  NC_("Script", "Hebrew") },
+  { G_UNICODE_SCRIPT_HIRAGANA, HB_SCRIPT_HIRAGANA,  NC_("Script", "Hiragana") },
+  { G_UNICODE_SCRIPT_KANNADA, HB_SCRIPT_KANNADA,  NC_("Script", "Kannada") },
+  { G_UNICODE_SCRIPT_KATAKANA, HB_SCRIPT_KATAKANA,  NC_("Script", "Katakana") },
+  { G_UNICODE_SCRIPT_KHMER, HB_SCRIPT_KHMER,  NC_("Script", "Khmer") },
+  { G_UNICODE_SCRIPT_LAO, HB_SCRIPT_LAO,  NC_("Script", "Lao") },
+  { G_UNICODE_SCRIPT_LATIN, HB_SCRIPT_LATIN,  NC_("Script", "Latin") },
+  { G_UNICODE_SCRIPT_MALAYALAM, HB_SCRIPT_MALAYALAM,  NC_("Script", "Malayalam") },
+  { G_UNICODE_SCRIPT_MONGOLIAN, HB_SCRIPT_MONGOLIAN,  NC_("Script", "Mongolian") },
+  { G_UNICODE_SCRIPT_MYANMAR, HB_SCRIPT_MYANMAR,  NC_("Script", "Myanmar") },
+  { G_UNICODE_SCRIPT_OGHAM, HB_SCRIPT_OGHAM,  NC_("Script", "Ogham") },
+  { G_UNICODE_SCRIPT_OLD_ITALIC, HB_SCRIPT_OLD_ITALIC,  NC_("Script", "Old Italic") },
+  { G_UNICODE_SCRIPT_ORIYA, HB_SCRIPT_ORIYA,  NC_("Script", "Oriya") },
+  { G_UNICODE_SCRIPT_RUNIC, HB_SCRIPT_RUNIC,  NC_("Script", "Runic") },
+  { G_UNICODE_SCRIPT_SINHALA, HB_SCRIPT_SINHALA,  NC_("Script", "Sinhala") },
+  { G_UNICODE_SCRIPT_SYRIAC, HB_SCRIPT_SYRIAC,  NC_("Script", "Syriac") },
+  { G_UNICODE_SCRIPT_TAMIL, HB_SCRIPT_TAMIL,  NC_("Script", "Tamil") },
+  { G_UNICODE_SCRIPT_TELUGU, HB_SCRIPT_TELUGU,  NC_("Script", "Telugu") },
+  { G_UNICODE_SCRIPT_THAANA, HB_SCRIPT_THAANA,  NC_("Script", "Thaana") },
+  { G_UNICODE_SCRIPT_THAI, HB_SCRIPT_THAI,  NC_("Script", "Thai") },
+  { G_UNICODE_SCRIPT_TIBETAN, HB_SCRIPT_TIBETAN,  NC_("Script", "Tibetan") },
+  { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, HB_SCRIPT_CANADIAN_ABORIGINAL,  NC_("Script", "Canadian 
Aboriginal") },
+  { G_UNICODE_SCRIPT_YI, HB_SCRIPT_YI,  NC_("Script", "Yi") },
+  { G_UNICODE_SCRIPT_TAGALOG, HB_SCRIPT_TAGALOG,  NC_("Script", "Tagalog") },
+  { G_UNICODE_SCRIPT_HANUNOO, HB_SCRIPT_HANUNOO,  NC_("Script", "Hanunoo") },
+  { G_UNICODE_SCRIPT_BUHID, HB_SCRIPT_BUHID,  NC_("Script", "Buhid") },
+  { G_UNICODE_SCRIPT_TAGBANWA, HB_SCRIPT_TAGBANWA,  NC_("Script", "Tagbanwa") },
+  { G_UNICODE_SCRIPT_BRAILLE, HB_SCRIPT_BRAILLE,  NC_("Script", "Braille") },
+  { G_UNICODE_SCRIPT_CYPRIOT, HB_SCRIPT_CYPRIOT,  NC_("Script", "Cypriot") },
+  { G_UNICODE_SCRIPT_LIMBU, HB_SCRIPT_LIMBU,  NC_("Script", "Limbu") },
+  { G_UNICODE_SCRIPT_OSMANYA, HB_SCRIPT_OSMANYA,  NC_("Script", "Osmanya") },
+  { G_UNICODE_SCRIPT_SHAVIAN, HB_SCRIPT_SHAVIAN,  NC_("Script", "Shavian") },
+  { G_UNICODE_SCRIPT_LINEAR_B, HB_SCRIPT_LINEAR_B,  NC_("Script", "Linear B") },
+  { G_UNICODE_SCRIPT_TAI_LE, HB_SCRIPT_TAI_LE,  NC_("Script", "Tai Le") },
+  { G_UNICODE_SCRIPT_UGARITIC, HB_SCRIPT_UGARITIC,  NC_("Script", "Ugaritic") },
+  { G_UNICODE_SCRIPT_NEW_TAI_LUE, HB_SCRIPT_NEW_TAI_LUE,  NC_("Script", "New Tai Lue") },
+  { G_UNICODE_SCRIPT_BUGINESE, HB_SCRIPT_BUGINESE,  NC_("Script", "Buginese") },
+  { G_UNICODE_SCRIPT_GLAGOLITIC, HB_SCRIPT_GLAGOLITIC,  NC_("Script", "Glagolitic") },
+  { G_UNICODE_SCRIPT_TIFINAGH, HB_SCRIPT_TIFINAGH,  NC_("Script", "Tifinagh") },
+  { G_UNICODE_SCRIPT_SYLOTI_NAGRI, HB_SCRIPT_SYLOTI_NAGRI,  NC_("Script", "Syloti Nagri") },
+  { G_UNICODE_SCRIPT_OLD_PERSIAN, HB_SCRIPT_OLD_PERSIAN,  NC_("Script", "Old Persian") },
+  { G_UNICODE_SCRIPT_KHAROSHTHI, HB_SCRIPT_KHAROSHTHI,  NC_("Script", "Kharoshthi") },
+  { G_UNICODE_SCRIPT_UNKNOWN, HB_SCRIPT_UNKNOWN,  NC_("Script", "Unknown") },
+  { G_UNICODE_SCRIPT_BALINESE, HB_SCRIPT_BALINESE,  NC_("Script", "Balinese") },
+  { G_UNICODE_SCRIPT_CUNEIFORM, HB_SCRIPT_CUNEIFORM,  NC_("Script", "Cuneiform") },
+  { G_UNICODE_SCRIPT_PHOENICIAN, HB_SCRIPT_PHOENICIAN,  NC_("Script", "Phoenician") },
+  { G_UNICODE_SCRIPT_PHAGS_PA, HB_SCRIPT_PHAGS_PA,  NC_("Script", "Phags-pa") },
+  { G_UNICODE_SCRIPT_NKO, HB_SCRIPT_NKO,  NC_("Script", "N'Ko") },
+  { G_UNICODE_SCRIPT_KAYAH_LI, HB_SCRIPT_KAYAH_LI,  NC_("Script", "Kayah Li") },
+  { G_UNICODE_SCRIPT_LEPCHA, HB_SCRIPT_LEPCHA,  NC_("Script", "Lepcha") },
+  { G_UNICODE_SCRIPT_REJANG, HB_SCRIPT_REJANG,  NC_("Script", "Rejang") },
+  { G_UNICODE_SCRIPT_SUNDANESE, HB_SCRIPT_SUNDANESE,  NC_("Script", "Sundanese") },
+  { G_UNICODE_SCRIPT_SAURASHTRA, HB_SCRIPT_SAURASHTRA,  NC_("Script", "Saurashtra") },
+  { G_UNICODE_SCRIPT_CHAM, HB_SCRIPT_CHAM,  NC_("Script", "Cham") },
+  { G_UNICODE_SCRIPT_OL_CHIKI, HB_SCRIPT_OL_CHIKI,  NC_("Script", "Ol Chiki") },
+  { G_UNICODE_SCRIPT_VAI, HB_SCRIPT_VAI,  NC_("Script", "Vai") },
+  { G_UNICODE_SCRIPT_CARIAN, HB_SCRIPT_CARIAN,  NC_("Script", "Carian") },
+  { G_UNICODE_SCRIPT_LYCIAN, HB_SCRIPT_LYCIAN,  NC_("Script", "Lycian") },
+  { G_UNICODE_SCRIPT_LYDIAN, HB_SCRIPT_LYDIAN,  NC_("Script", "Lydian") },
+  { G_UNICODE_SCRIPT_AVESTAN, HB_SCRIPT_AVESTAN,  NC_("Script", "Avestan") },
+  { G_UNICODE_SCRIPT_BAMUM, HB_SCRIPT_BAMUM,  NC_("Script", "Bamum") },
+  { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,  NC_("Script", "Egyptian 
Hieroglpyhs") },
+  { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, HB_SCRIPT_IMPERIAL_ARAMAIC,  NC_("Script", "Imperial Aramaic") },
+  { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,  NC_("Script", "Inscriptional 
Pahlavi") },
+  { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,  NC_("Script", "Inscriptional 
Parthian") },
+  { G_UNICODE_SCRIPT_JAVANESE, HB_SCRIPT_JAVANESE,  NC_("Script", "Javanese") },
+  { G_UNICODE_SCRIPT_KAITHI, HB_SCRIPT_KAITHI,  NC_("Script", "Kaithi") },
+  { G_UNICODE_SCRIPT_LISU, HB_SCRIPT_LISU,  NC_("Script", "Lisu") },
+  { G_UNICODE_SCRIPT_MEETEI_MAYEK, HB_SCRIPT_MEETEI_MAYEK,  NC_("Script", "Meetei Mayek") },
+  { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, HB_SCRIPT_OLD_SOUTH_ARABIAN,  NC_("Script", "Old South Arabian") },
+  { G_UNICODE_SCRIPT_OLD_TURKIC, HB_SCRIPT_OLD_TURKIC,  NC_("Script", "Old Turkic") },
+  { G_UNICODE_SCRIPT_SAMARITAN, HB_SCRIPT_SAMARITAN,  NC_("Script", "Samaritan") },
+  { G_UNICODE_SCRIPT_TAI_THAM, HB_SCRIPT_TAI_THAM,  NC_("Script", "Tai Tham") },
+  { G_UNICODE_SCRIPT_TAI_VIET, HB_SCRIPT_TAI_VIET,  NC_("Script", "Tai Viet") },
+  { G_UNICODE_SCRIPT_BATAK, HB_SCRIPT_BATAK,  NC_("Script", "Batak") },
+  { G_UNICODE_SCRIPT_BRAHMI, HB_SCRIPT_BRAHMI,  NC_("Script", "Brahmi") },
+  { G_UNICODE_SCRIPT_MANDAIC, HB_SCRIPT_MANDAIC,  NC_("Script", "Mandaic") },
+  { G_UNICODE_SCRIPT_CHAKMA, HB_SCRIPT_CHAKMA,  NC_("Script", "Chakma") },
+  { G_UNICODE_SCRIPT_MEROITIC_CURSIVE, HB_SCRIPT_MEROITIC_CURSIVE,  NC_("Script", "Meroitic Cursive") },
+  { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, HB_SCRIPT_MEROITIC_HIEROGLYPHS,  NC_("Script", "Meroitic 
Hieroglyphs") },
+  { G_UNICODE_SCRIPT_MIAO, HB_SCRIPT_MIAO,  NC_("Script", "Miao") },
+  { G_UNICODE_SCRIPT_SHARADA, HB_SCRIPT_SHARADA,  NC_("Script", "Sharada") },
+  { G_UNICODE_SCRIPT_SORA_SOMPENG, HB_SCRIPT_SORA_SOMPENG,  NC_("Script", "Sora Sompeng") },
+  { G_UNICODE_SCRIPT_TAKRI, HB_SCRIPT_TAKRI,  NC_("Script", "Takri") },
+  { G_UNICODE_SCRIPT_BASSA_VAH, HB_SCRIPT_BASSA_VAH,  NC_("Script", "Bassa") },
+  { G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN, HB_SCRIPT_CAUCASIAN_ALBANIAN,  NC_("Script", "Caucasian Albanian") 
},
+  { G_UNICODE_SCRIPT_DUPLOYAN, HB_SCRIPT_DUPLOYAN,  NC_("Script", "Duployan") },
+  { G_UNICODE_SCRIPT_ELBASAN, HB_SCRIPT_ELBASAN,  NC_("Script", "Elbasan") },
+  { G_UNICODE_SCRIPT_GRANTHA, HB_SCRIPT_GRANTHA,  NC_("Script", "Grantha") },
+  { G_UNICODE_SCRIPT_KHOJKI, HB_SCRIPT_KHOJKI,  NC_("Script", "Kjohki") },
+  { G_UNICODE_SCRIPT_KHUDAWADI, HB_SCRIPT_KHUDAWADI,  NC_("Script", "Khudawadi, Sindhi") },
+  { G_UNICODE_SCRIPT_LINEAR_A, HB_SCRIPT_LINEAR_A,  NC_("Script", "Linear A") },
+  { G_UNICODE_SCRIPT_MAHAJANI, HB_SCRIPT_MAHAJANI,  NC_("Script", "Mahajani") },
+  { G_UNICODE_SCRIPT_MANICHAEAN, HB_SCRIPT_MANICHAEAN,  NC_("Script", "Manichaean") },
+  { G_UNICODE_SCRIPT_MENDE_KIKAKUI, HB_SCRIPT_MENDE_KIKAKUI,  NC_("Script", "Mende Kikakui") },
+  { G_UNICODE_SCRIPT_MODI, HB_SCRIPT_MODI,  NC_("Script", "Modi") },
+  { G_UNICODE_SCRIPT_MRO, HB_SCRIPT_MRO,  NC_("Script", "Mro") },
+  { G_UNICODE_SCRIPT_NABATAEAN, HB_SCRIPT_NABATAEAN,  NC_("Script", "Nabataean") },
+  { G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN, HB_SCRIPT_OLD_NORTH_ARABIAN,  NC_("Script", "Old North Arabian") },
+  { G_UNICODE_SCRIPT_OLD_PERMIC, HB_SCRIPT_OLD_PERMIC,  NC_("Script", "Old Permic") },
+  { G_UNICODE_SCRIPT_PAHAWH_HMONG, HB_SCRIPT_PAHAWH_HMONG,  NC_("Script", "Pahawh Hmong") },
+  { G_UNICODE_SCRIPT_PALMYRENE, HB_SCRIPT_PALMYRENE,  NC_("Script", "Palmyrene") },
+  { G_UNICODE_SCRIPT_PAU_CIN_HAU, HB_SCRIPT_PAU_CIN_HAU,  NC_("Script", "Pau Cin Hau") },
+  { G_UNICODE_SCRIPT_PSALTER_PAHLAVI, HB_SCRIPT_PSALTER_PAHLAVI,  NC_("Script", "Psalter Pahlavi") },
+  { G_UNICODE_SCRIPT_SIDDHAM, HB_SCRIPT_SIDDHAM,  NC_("Script", "Siddham") },
+  { G_UNICODE_SCRIPT_TIRHUTA, HB_SCRIPT_TIRHUTA,  NC_("Script", "Tirhuta") },
+  { G_UNICODE_SCRIPT_WARANG_CITI, HB_SCRIPT_WARANG_CITI,  NC_("Script", "Warang Citi") },
+  { G_UNICODE_SCRIPT_AHOM, HB_SCRIPT_AHOM,  NC_("Script", "Ahom") },
+  { G_UNICODE_SCRIPT_ANATOLIAN_HIEROGLYPHS, HB_SCRIPT_ANATOLIAN_HIEROGLYPHS,  NC_("Script", "Anatolian 
Hieroglyphs") },
+  { G_UNICODE_SCRIPT_HATRAN, HB_SCRIPT_HATRAN,  NC_("Script", "Hatran") },
+  { G_UNICODE_SCRIPT_MULTANI, HB_SCRIPT_MULTANI,  NC_("Script", "Multani") },
+  { G_UNICODE_SCRIPT_OLD_HUNGARIAN, HB_SCRIPT_OLD_HUNGARIAN,  NC_("Script", "Old Hungarian") },
+  { G_UNICODE_SCRIPT_SIGNWRITING, HB_SCRIPT_SIGNWRITING,  NC_("Script", "Signwriting") },
+  { G_UNICODE_SCRIPT_ADLAM, HB_SCRIPT_ADLAM,  NC_("Script", "Adlam") },
+  { G_UNICODE_SCRIPT_BHAIKSUKI, HB_SCRIPT_BHAIKSUKI,  NC_("Script", "Bhaiksuki") },
+  { G_UNICODE_SCRIPT_MARCHEN, HB_SCRIPT_MARCHEN,  NC_("Script", "Marchen") },
+  { G_UNICODE_SCRIPT_NEWA, HB_SCRIPT_NEWA,  NC_("Script", "Newa") },
+  { G_UNICODE_SCRIPT_OSAGE, HB_SCRIPT_OSAGE,  NC_("Script", "Osage") },
+  { G_UNICODE_SCRIPT_TANGUT, HB_SCRIPT_TANGUT,  NC_("Script", "Tangut") },
+  { G_UNICODE_SCRIPT_MASARAM_GONDI, HB_SCRIPT_INVALID,  NC_("Script", "Masaram Gondi") },
+  { G_UNICODE_SCRIPT_NUSHU, HB_SCRIPT_INVALID,  NC_("Script", "Nushu") },
+  { G_UNICODE_SCRIPT_SOYOMBO, HB_SCRIPT_INVALID,  NC_("Script", "Soyombo") },
+  { G_UNICODE_SCRIPT_ZANABAZAR_SQUARE, HB_SCRIPT_INVALID,  NC_("Script", "Zanabazar Square") },
+};
+
+const char *
+get_script_name (GUnicodeScript script)
+{
+  int i;
+
+  for (i = 0; i < G_N_ELEMENTS (scripts); i++)
+    {
+      if (scripts[i].script == script)
+        return g_dpgettext2 (GETTEXT_PACKAGE, "Script", scripts[i].name);
+    }
+
+  return NULL;
+}
+
+const char *
+get_script_name_for_tag (guint32 tag)
+{
+  int i;
+
+  for (i = 0; i < G_N_ELEMENTS (scripts); i++)
+    {
+      if (scripts[i].hb_script == hb_script_from_iso15924_tag (tag))
+        return g_dpgettext2 (GETTEXT_PACKAGE, "Script", scripts[i].name);
+    }
+
+  return NULL;
+}
diff --git a/demos/gtk-demo/script-names.h b/demos/gtk-demo/script-names.h
new file mode 100644
index 0000000..3036c05
--- /dev/null
+++ b/demos/gtk-demo/script-names.h
@@ -0,0 +1,13 @@
+#ifndef SCRIPT_NAMES_H
+#define SCRIPT_NAMES_H
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+const char * get_script_name (GUnicodeScript script);
+const char * get_script_name_for_tag (guint32 tag);
+
+G_END_DECLS
+
+#endif


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]