summaryrefslogtreecommitdiff
path: root/modules/hangul
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@src.gnome.org>2000-01-13 04:12:07 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-01-13 04:12:07 +0000
commit282fb5fc9f9d01c4d933a6eb6bee6ae9f0d512c7 (patch)
tree0b19c69692a2fe52a1b33d5e27c97b26a64417e3 /modules/hangul
parent66ae87f9fc45f5f564acf5014e9bd1341d052958 (diff)
downloadpango-282fb5fc9f9d01c4d933a6eb6bee6ae9f0d512c7.tar.gz
Initial revision
Diffstat (limited to 'modules/hangul')
-rw-r--r--modules/hangul/Makefile.am12
-rw-r--r--modules/hangul/hangul-x.c759
-rw-r--r--modules/hangul/hangul.c759
-rw-r--r--modules/hangul/tables-johabfont.i608
-rw-r--r--modules/hangul/tables-ksc5601.i708
5 files changed, 2846 insertions, 0 deletions
diff --git a/modules/hangul/Makefile.am b/modules/hangul/Makefile.am
new file mode 100644
index 00000000..4c39984e
--- /dev/null
+++ b/modules/hangul/Makefile.am
@@ -0,0 +1,12 @@
+## Process this file with automake to create Makefile.in.
+
+noinst_LTLIBRARIES = pango-hangul.la
+
+INCLUDES = -I$(top_srcdir)/libpango
+
+pango_hangul_la_SOURCES = hangul.c
+pango_hangul_la_LDFLAGS = -rpath $(libdir) -export-dynamic -avoid-version -module
+
+EXTRA_DIST = \
+ tables-ksc5601.i \
+ tables-johabfont.i
diff --git a/modules/hangul/hangul-x.c b/modules/hangul/hangul-x.c
new file mode 100644
index 00000000..b76ed86f
--- /dev/null
+++ b/modules/hangul/hangul-x.c
@@ -0,0 +1,759 @@
+/* Pango
+ * hangul.c:
+ *
+ * Copyright (C) 1999 Changwoo Ryu
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <glib.h>
+
+#include "pango.h"
+#include "pangox.h"
+#include "utils.h"
+#include <unicode.h>
+
+#define MEMBERS(strct) sizeof(strct) / sizeof(strct[1])
+
+static PangoEngineRange hangul_ranges[] = {
+
+ /* Hangul Jamo U+1100 -- U+11FF */
+ { 0x1100, 0x11ff, "*" },
+ /* Hangul Compatibility Jamo U+3130 -- U+318F */
+/* { 0x3130, 0x318f, "*" }, */
+ /* Hangul (pre-composed) Syllables U+AC00 -- U+D7A3 */
+ { 0xac00, 0xd7a3, "*" }
+};
+
+
+static PangoEngineInfo script_engines[] = {
+ {
+ "HangulScriptEngineLang",
+ PANGO_ENGINE_TYPE_LANG,
+ PANGO_RENDER_TYPE_NONE,
+ hangul_ranges, MEMBERS(hangul_ranges)
+ },
+ {
+ "HangulScriptEngineX",
+ PANGO_ENGINE_TYPE_SHAPE,
+ PANGO_RENDER_TYPE_X,
+ hangul_ranges, MEMBERS(hangul_ranges)
+ }
+};
+
+static gint n_script_engines = MEMBERS (script_engines);
+
+/*
+ * Language script engine
+ */
+
+static void
+hangul_engine_break (gchar *text,
+ gint len,
+ PangoAnalysis *analysis,
+ PangoLogAttr *attrs)
+{
+ /* (FIXME) */
+}
+
+static PangoEngine *
+hangul_engine_lang_new ()
+{
+ PangoEngineLang *result;
+
+ result = g_new (PangoEngineLang, 1);
+
+ result->engine.id = "HangulScriptEngine";
+ result->engine.type = PANGO_ENGINE_TYPE_LANG;
+ result->engine.length = sizeof (result);
+ result->script_break = hangul_engine_break;
+
+ return (PangoEngine *) result;
+}
+
+/*
+ * X window system script engine portion
+ */
+
+static void
+set_glyph (PangoGlyphString *glyphs, gint i, PangoCFont *cfont,
+ PangoGlyphIndex glyph)
+{
+ gint width;
+
+ glyphs->glyphs[i].font = cfont;
+ glyphs->glyphs[i].glyph = glyph;
+
+ glyphs->geometry[i].x_offset = 0;
+ glyphs->geometry[i].y_offset = 0;
+
+ pango_x_glyph_extents (&glyphs->glyphs[i],
+ NULL, NULL, &width, NULL, NULL, NULL, NULL);
+ glyphs->geometry[i].width = width * 72;
+}
+
+
+/*
+ * From 3.10 of the Unicode 2.0 Book; used for combining Jamos.
+ */
+
+#define SBASE 0xAC00
+#define LBASE 0x1100
+#define VBASE 0x1161
+#define TBASE 0x11A7
+#define SCOUNT 11172
+#define LCOUNT 19
+#define VCOUNT 21
+#define TCOUNT 28
+#define NCOUNT (VCOUNT * TCOUNT)
+
+/*
+ * Unicode 2.0 doesn't define the fill for trailing consonants, but
+ * I'll use 0x11A7 as that purpose internally.
+ */
+
+#define LFILL 0x115F
+#define VFILL 0x1160
+#define TFILL 0x11A7
+
+#define IS_L(wc) (wc >= 0x1100 && wc < 0x115F)
+#define IS_V(wc) (wc >= 0x1160 && wc < 0x11A2)
+#define IS_T(wc) (wc >= 0x11A7 && wc < 0x11F9)
+
+
+typedef void (* RenderSyllableFunc) (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters);
+
+
+
+#include "tables-johabfont.i"
+#include "tables-ksc5601.i"
+
+#define JOHAB_COMMON \
+ int i; \
+ PangoGlyphIndex gindex; \
+ \
+ /* \
+ * Check if there are one CHOSEONG, one JUNGSEONG, and no more \
+ * than one JONGSEONG. \
+ */ \
+ int n_cho = 0, n_jung = 0, n_jong = 0; \
+ i = 0; \
+ while (i < length && IS_L (text[i])) \
+ { \
+ n_cho++; \
+ i++; \
+ } \
+ while (i < length && IS_V (text[i])) \
+ { \
+ n_jung++; \
+ i++; \
+ } \
+ while (i < length && IS_T (text[i])) \
+ { \
+ n_jong++; \
+ i++; \
+ } \
+ \
+ if (n_cho <= 1 && n_jung <= 1 && n_jong <= 1) \
+ { \
+ GUChar2 l, v, t; \
+ \
+ if (n_cho > 0) \
+ l = text[0]; \
+ else \
+ l = LFILL; \
+ \
+ if (n_jung > 0) \
+ v = text[n_cho]; \
+ else \
+ v = VFILL; \
+ \
+ if (n_jong > 0) \
+ t = text[n_cho + n_jung]; \
+ else \
+ t = TFILL; \
+ \
+ /* COMPOSABLE */ \
+ if ((__choseong_johabfont_base[l - LBASE] != 0 || l == LFILL) && \
+ (__jungseong_johabfont_base[v - VBASE] != 0 || v == VFILL) && \
+ (__jongseong_johabfont_base[t - TBASE] != 0 || t == TFILL)) \
+ { \
+ if (l != LFILL) \
+ { \
+ gindex = __choseong_johabfont_base[l - LBASE]; \
+ if (t == TFILL) \
+ { \
+ if (v == VFILL) \
+ gindex += 1; \
+ else \
+ gindex += __choseong_map_1[v - VBASE]; \
+ } \
+ else \
+ { \
+ if (v == VFILL) \
+ gindex += 6; \
+ else \
+ gindex += __choseong_map_2[v - VBASE]; \
+ } \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, gindex); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ if (v != VFILL) \
+ { \
+ gindex = __jungseong_johabfont_base[v - VBASE]; \
+ switch (__johabfont_jungseong_kind[v - VBASE]) \
+ { \
+ case 3: \
+ gindex += __johabfont_jongseong_kind[t - TBASE]; \
+ break; \
+ case 4: \
+ gindex += ((l == 0x1100 || l == 0x110f) ? 0 : 1) + \
+ ((t != TFILL) ? 2 : 0); \
+ break; \
+ } \
+ \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, gindex); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ if (t != TFILL) \
+ { \
+ gindex = __jongseong_johabfont_base[t - TBASE] + \
+ __jongseong_map[v - VBASE]; \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, gindex); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ if (v == VFILL && t == TFILL) /* dummy for no zero width */ \
+ { \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, JOHAB_FILLER); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ return; \
+ } \
+ }
+
+static void
+render_syllable_with_johabs (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+JOHAB_COMMON
+
+ /* Render as uncomposed forms as a fallback. */
+ for (i = 0; i < length; i++)
+ {
+ int j;
+
+ /*
+ * Uses KSC5601 symbol glyphs which johabS-1 has; they're
+ * not in the normal johab-1. The glyphs are better than composable
+ * components.
+ */
+ for (j = 0; j < 3; j++)
+ {
+ gindex = __jamo_to_ksc5601[text[i] - LBASE][j];
+
+ if (gindex != 0)
+ {
+ if ((gindex >= 0x2421) && (gindex <= 0x247f))
+ gindex += (0x032b - 0x2420);
+ else if ((gindex >= 0x2421) && (gindex <= 0x247f))
+ gindex += (0x02cd - 0x2321);
+ else
+ break;
+
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+ else
+ break;
+ }
+ }
+}
+
+static void
+render_syllable_with_johab (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+JOHAB_COMMON
+
+ /* Render as uncomposed forms as a fallback. */
+ for (i = 0; i < length; i++)
+ {
+ int j;
+ GUChar2 wc;
+
+ wc = text[i];
+ for (j = 0; (j < 3) && (__jamo_to_johabfont[wc-LBASE][j] != 0); j++)
+ {
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont,
+ __jamo_to_johabfont[wc - LBASE][j]);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ if (IS_L (wc))
+ {
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, JOHAB_FILLER);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+ }
+ }
+}
+
+static void
+render_syllable_with_iso10646 (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+ PangoGlyphIndex gindex;
+ int i;
+
+ /*
+ * Check if there are one CHOSEONG, one JUNGSEONG, and no more
+ * than one JONGSEONG.
+ */
+ int n_cho = 0, n_jung = 0, n_jong = 0;
+ i = 0;
+ while (i < length && IS_L (text[i]))
+ {
+ n_cho++;
+ i++;
+ }
+ while (i < length && IS_V (text[i]))
+ {
+ n_jung++;
+ i++;
+ }
+ while (i < length && IS_T (text[i]))
+ {
+ n_jong++;
+ i++;
+ }
+
+ if (n_cho == 1 && n_jung == 1 && n_jong <= 1)
+ {
+ int lindex, vindex, tindex;
+
+ lindex = text[0] - LBASE;
+ vindex = text[1] - VBASE;
+ if (n_jong > 0)
+ tindex = text[2] - TBASE;
+ else
+ tindex = 0;
+
+ /* COMPOSABLE */
+ if (lindex >= 0 && lindex < LCOUNT &&
+ vindex >= 0 && vindex < VCOUNT &&
+ tindex >= 0 && tindex < TCOUNT)
+ {
+ gindex = (lindex * VCOUNT + vindex) * TCOUNT + tindex + SBASE;
+ /* easy for composed syllables. */
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ return;
+ }
+ }
+
+ /* Render as uncomposed forms as a fallback. */
+ for (i = 0; i < length; i++)
+ {
+ gindex = text[i];
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+}
+
+static void
+render_syllable_with_ksc5601 (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+ guint16 sindex;
+ PangoGlyphIndex gindex;
+ int i;
+
+ /*
+ * Check if there are one CHOSEONG, one JUNGSEONG, and no more
+ * than one JONGSEONG.
+ */
+ int n_cho = 0, n_jung = 0, n_jong = 0;
+ i = 0;
+ while (i < length && IS_L (text[i]))
+ {
+ n_cho++;
+ i++;
+ }
+ while (i < length && IS_V (text[i]))
+ {
+ n_jung++;
+ i++;
+ }
+ while (i < length && IS_T (text[i]))
+ {
+ n_jong++;
+ i++;
+ }
+
+ if (n_cho == 1 && n_jung == 1 && n_jong <= 1)
+ {
+ int lindex, vindex, tindex;
+
+ lindex = text[0] - LBASE;
+ vindex = text[1] - VBASE;
+ if (n_jong > 0)
+ tindex = text[2] - TBASE;
+ else
+ tindex = 0;
+
+ /* COMPOSABLE */
+ if (lindex >= 0 && lindex < LCOUNT &&
+ vindex >= 0 && vindex < VCOUNT &&
+ tindex >= 0 && tindex < TCOUNT)
+ {
+ int l = 0;
+ int u = KSC5601_HANGUL - 1;
+ guint16 try;
+
+ sindex = (lindex * VCOUNT + vindex) * TCOUNT + tindex + SBASE;
+
+ /* Do binary search. */
+ while (l <= u)
+ {
+ int m = (l + u) / 2;
+ try = __ksc5601_hangul_to_ucs[m];
+ if (try > sindex)
+ u = m - 1;
+ else if (try < sindex)
+ l = m + 1;
+ else
+ {
+ gindex = (((m / 94) + 0x30) << 8) | ((m % 94) + 0x21);
+
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ return;
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < length; i++)
+ {
+ int j;
+
+ gindex = text[i];
+ for (j = 0; (j < 3) && (__jamo_to_ksc5601[gindex - LBASE][j] != 0); j++)
+ {
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont,
+ __jamo_to_ksc5601[gindex - LBASE][j]);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+ }
+}
+
+/* Compare the tail of a to b */
+static gboolean
+match_end (char *a, char *b)
+{
+ size_t len_a = strlen (a);
+ size_t len_b = strlen (b);
+
+ if (len_b > len_a)
+ return FALSE;
+ else
+ return (strcmp (a + len_a - len_b, b) == 0);
+}
+
+static gboolean
+ranges_include_korean (int *ranges,
+ int n_ranges)
+{
+ gboolean have_syllables = FALSE;
+ gboolean have_jamos = FALSE;
+ gint i;
+
+ /* Check for syllables and for uncomposed jamos */
+
+ for (i=0; i<n_ranges; i++)
+ {
+ if (ranges[2*i] <= 0xac00 && ranges[2*i+1] >= 0xd7a3)
+ have_syllables = 1;
+ if (ranges[2*i] <= 0x1100 && ranges[2*i+1] >= 0x11ff)
+ have_jamos = 1;
+ }
+
+ return have_syllables && have_jamos;
+}
+
+static gboolean
+find_cfont (PangoFont *font, gchar **charsets, gint n_charsets,
+ PangoCFont **cfont, RenderSyllableFunc *render_func)
+{
+ int i;
+ char **xlfds;
+ int n_xlfds;
+
+ pango_x_list_cfonts (font, charsets, n_charsets, &xlfds, &n_xlfds);
+
+ *cfont = NULL;
+ for (i=0; i<n_xlfds; i++)
+ {
+ if (match_end (xlfds[i], "johabs-1"))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_johabs;
+ break;
+ }
+ if (match_end (xlfds[i], "johab-1"))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_johab;
+ break;
+ }
+ else if (match_end (xlfds[i], "iso10646-1"))
+ {
+ gint *ranges;
+ int n_ranges;
+
+ pango_x_xlfd_get_ranges (font, xlfds[i], &ranges, &n_ranges);
+
+ if (ranges_include_korean (ranges, n_ranges))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_iso10646;
+ g_free (ranges);
+ break;
+ }
+
+ g_free (ranges);
+ }
+ else if (match_end (xlfds[i], "ksc5601.1987-0"))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_ksc5601;
+ break;
+ }
+ }
+
+ for (i=0; i<n_xlfds; i++)
+ g_free (xlfds[i]);
+ g_free (xlfds);
+
+ return (*cfont != NULL);
+}
+
+static void
+hangul_engine_shape (PangoFont *font,
+ gchar *text,
+ gint length,
+ PangoAnalysis *analysis,
+ PangoGlyphString *glyphs)
+{
+ PangoCFont *cfont;
+ RenderSyllableFunc render_func = NULL;
+
+ char *ptr, *next;
+ int i, n_chars;
+ GUChar2 jamos[4];
+ int n_jamos = 0;
+
+ int n_glyphs = 0, n_clusters = 0;
+
+ static char *default_charset[] = {
+ "johabs-1"
+ };
+
+ static char *secondary_charset[] = {
+ "johab-1"
+ };
+
+ static char *fallback_charsets[] = {
+ "iso10646-1",
+ "ksc5601.1987-0"
+ };
+
+ g_return_if_fail (font != NULL);
+ g_return_if_fail (text != NULL);
+ g_return_if_fail (length >= 0);
+ g_return_if_fail (analysis != NULL);
+
+ /* check available fonts. Always use a johab font if available;
+ * otherwise use iso-10646 or KSC font depending on the ordering
+ * of the fontlist.
+ */
+ if (!find_cfont (font, default_charset, 1, &cfont, &render_func))
+ if (!find_cfont (font, secondary_charset, 1, &cfont, &render_func))
+ if (!find_cfont (font, fallback_charsets, 2, &cfont, &render_func))
+ {
+ g_warning ("No available Hangul fonts.");
+ return;
+ }
+
+ n_chars = unicode_strlen (text, length);
+ ptr = text;
+
+ for (i = 0; i < n_chars; i++)
+ {
+ GUChar4 wc4;
+ GUChar2 wcs[4], wc;
+ int n_code = 0;
+
+ _pango_utf8_iterate (ptr, &next, &wc4);
+ if (wc4 >= SBASE && wc4 < (SBASE + SCOUNT))
+ {
+ /* decompose the syllable. */
+ gint16 sindex;
+
+ sindex = wc4 - SBASE;
+ wcs[0] = LBASE + (sindex / NCOUNT);
+ wcs[1] = VBASE + ((sindex % NCOUNT) / TCOUNT);
+ wcs[2] = TBASE + (sindex % TCOUNT);
+ n_code = 3;
+
+ if (n_jamos > 0)
+ {
+ (*render_func) (cfont, jamos, n_jamos,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ n_jamos = 0;
+ }
+
+ /* Draw a syllable. */
+ (*render_func) (cfont, wcs, 3,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ /* Clear. */
+ }
+ else if (wc4 >= 0x1100 && wc4 <= 0x11ff)
+ {
+ wc = (GUChar2) wc4;
+
+ if (n_jamos == 0)
+ {
+ jamos[n_jamos++] = wc;
+ }
+ else
+ {
+ /* Check syllable boundaries. */
+ if ((IS_T (jamos[n_jamos - 1]) && IS_L (wc)) ||
+ (IS_V (jamos[n_jamos - 1]) && IS_L (wc)) ||
+ (IS_T (jamos[n_jamos - 1]) && IS_V (wc)))
+ {
+ /* Draw a syllable. */
+ (*render_func) (cfont, jamos, n_jamos,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ /* Clear. */
+ n_jamos = 0;
+ }
+ jamos[n_jamos++] = wc;
+ }
+ }
+ else
+ {
+ g_warning ("Unknown character 0x04%x", wc4);
+ continue;
+ }
+
+ ptr = next;
+ }
+
+ /* Draw the remaining Jamos. */
+ if (n_jamos > 0)
+ {
+ (*render_func) (cfont, jamos, n_jamos,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ n_jamos = 0;
+ }
+}
+
+
+static PangoEngine *
+hangul_engine_x_new ()
+{
+ PangoEngineShape *result;
+
+ result = g_new (PangoEngineShape, 1);
+
+ result->engine.id = "HangulScriptEngine";
+ result->engine.type = PANGO_ENGINE_TYPE_LANG;
+ result->engine.length = sizeof (result);
+ result->script_shape = hangul_engine_shape;
+
+ return (PangoEngine *)result;
+}
+
+
+
+/* The following three functions provide the public module API for
+ * Pango
+ */
+
+void
+script_engine_list (PangoEngineInfo **engines, gint *n_engines)
+{
+ *engines = script_engines;
+ *n_engines = n_script_engines;
+}
+
+PangoEngine *
+script_engine_load (const char *id)
+{
+ if (!strcmp (id, "HangulScriptEngineLang"))
+ return hangul_engine_lang_new ();
+ else if (!strcmp (id, "HangulScriptEngineX"))
+ return hangul_engine_x_new ();
+ else
+ return NULL;
+}
+
+void
+script_engine_unload (PangoEngine *engine)
+{
+}
+
diff --git a/modules/hangul/hangul.c b/modules/hangul/hangul.c
new file mode 100644
index 00000000..b76ed86f
--- /dev/null
+++ b/modules/hangul/hangul.c
@@ -0,0 +1,759 @@
+/* Pango
+ * hangul.c:
+ *
+ * Copyright (C) 1999 Changwoo Ryu
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <glib.h>
+
+#include "pango.h"
+#include "pangox.h"
+#include "utils.h"
+#include <unicode.h>
+
+#define MEMBERS(strct) sizeof(strct) / sizeof(strct[1])
+
+static PangoEngineRange hangul_ranges[] = {
+
+ /* Hangul Jamo U+1100 -- U+11FF */
+ { 0x1100, 0x11ff, "*" },
+ /* Hangul Compatibility Jamo U+3130 -- U+318F */
+/* { 0x3130, 0x318f, "*" }, */
+ /* Hangul (pre-composed) Syllables U+AC00 -- U+D7A3 */
+ { 0xac00, 0xd7a3, "*" }
+};
+
+
+static PangoEngineInfo script_engines[] = {
+ {
+ "HangulScriptEngineLang",
+ PANGO_ENGINE_TYPE_LANG,
+ PANGO_RENDER_TYPE_NONE,
+ hangul_ranges, MEMBERS(hangul_ranges)
+ },
+ {
+ "HangulScriptEngineX",
+ PANGO_ENGINE_TYPE_SHAPE,
+ PANGO_RENDER_TYPE_X,
+ hangul_ranges, MEMBERS(hangul_ranges)
+ }
+};
+
+static gint n_script_engines = MEMBERS (script_engines);
+
+/*
+ * Language script engine
+ */
+
+static void
+hangul_engine_break (gchar *text,
+ gint len,
+ PangoAnalysis *analysis,
+ PangoLogAttr *attrs)
+{
+ /* (FIXME) */
+}
+
+static PangoEngine *
+hangul_engine_lang_new ()
+{
+ PangoEngineLang *result;
+
+ result = g_new (PangoEngineLang, 1);
+
+ result->engine.id = "HangulScriptEngine";
+ result->engine.type = PANGO_ENGINE_TYPE_LANG;
+ result->engine.length = sizeof (result);
+ result->script_break = hangul_engine_break;
+
+ return (PangoEngine *) result;
+}
+
+/*
+ * X window system script engine portion
+ */
+
+static void
+set_glyph (PangoGlyphString *glyphs, gint i, PangoCFont *cfont,
+ PangoGlyphIndex glyph)
+{
+ gint width;
+
+ glyphs->glyphs[i].font = cfont;
+ glyphs->glyphs[i].glyph = glyph;
+
+ glyphs->geometry[i].x_offset = 0;
+ glyphs->geometry[i].y_offset = 0;
+
+ pango_x_glyph_extents (&glyphs->glyphs[i],
+ NULL, NULL, &width, NULL, NULL, NULL, NULL);
+ glyphs->geometry[i].width = width * 72;
+}
+
+
+/*
+ * From 3.10 of the Unicode 2.0 Book; used for combining Jamos.
+ */
+
+#define SBASE 0xAC00
+#define LBASE 0x1100
+#define VBASE 0x1161
+#define TBASE 0x11A7
+#define SCOUNT 11172
+#define LCOUNT 19
+#define VCOUNT 21
+#define TCOUNT 28
+#define NCOUNT (VCOUNT * TCOUNT)
+
+/*
+ * Unicode 2.0 doesn't define the fill for trailing consonants, but
+ * I'll use 0x11A7 as that purpose internally.
+ */
+
+#define LFILL 0x115F
+#define VFILL 0x1160
+#define TFILL 0x11A7
+
+#define IS_L(wc) (wc >= 0x1100 && wc < 0x115F)
+#define IS_V(wc) (wc >= 0x1160 && wc < 0x11A2)
+#define IS_T(wc) (wc >= 0x11A7 && wc < 0x11F9)
+
+
+typedef void (* RenderSyllableFunc) (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters);
+
+
+
+#include "tables-johabfont.i"
+#include "tables-ksc5601.i"
+
+#define JOHAB_COMMON \
+ int i; \
+ PangoGlyphIndex gindex; \
+ \
+ /* \
+ * Check if there are one CHOSEONG, one JUNGSEONG, and no more \
+ * than one JONGSEONG. \
+ */ \
+ int n_cho = 0, n_jung = 0, n_jong = 0; \
+ i = 0; \
+ while (i < length && IS_L (text[i])) \
+ { \
+ n_cho++; \
+ i++; \
+ } \
+ while (i < length && IS_V (text[i])) \
+ { \
+ n_jung++; \
+ i++; \
+ } \
+ while (i < length && IS_T (text[i])) \
+ { \
+ n_jong++; \
+ i++; \
+ } \
+ \
+ if (n_cho <= 1 && n_jung <= 1 && n_jong <= 1) \
+ { \
+ GUChar2 l, v, t; \
+ \
+ if (n_cho > 0) \
+ l = text[0]; \
+ else \
+ l = LFILL; \
+ \
+ if (n_jung > 0) \
+ v = text[n_cho]; \
+ else \
+ v = VFILL; \
+ \
+ if (n_jong > 0) \
+ t = text[n_cho + n_jung]; \
+ else \
+ t = TFILL; \
+ \
+ /* COMPOSABLE */ \
+ if ((__choseong_johabfont_base[l - LBASE] != 0 || l == LFILL) && \
+ (__jungseong_johabfont_base[v - VBASE] != 0 || v == VFILL) && \
+ (__jongseong_johabfont_base[t - TBASE] != 0 || t == TFILL)) \
+ { \
+ if (l != LFILL) \
+ { \
+ gindex = __choseong_johabfont_base[l - LBASE]; \
+ if (t == TFILL) \
+ { \
+ if (v == VFILL) \
+ gindex += 1; \
+ else \
+ gindex += __choseong_map_1[v - VBASE]; \
+ } \
+ else \
+ { \
+ if (v == VFILL) \
+ gindex += 6; \
+ else \
+ gindex += __choseong_map_2[v - VBASE]; \
+ } \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, gindex); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ if (v != VFILL) \
+ { \
+ gindex = __jungseong_johabfont_base[v - VBASE]; \
+ switch (__johabfont_jungseong_kind[v - VBASE]) \
+ { \
+ case 3: \
+ gindex += __johabfont_jongseong_kind[t - TBASE]; \
+ break; \
+ case 4: \
+ gindex += ((l == 0x1100 || l == 0x110f) ? 0 : 1) + \
+ ((t != TFILL) ? 2 : 0); \
+ break; \
+ } \
+ \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, gindex); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ if (t != TFILL) \
+ { \
+ gindex = __jongseong_johabfont_base[t - TBASE] + \
+ __jongseong_map[v - VBASE]; \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, gindex); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ if (v == VFILL && t == TFILL) /* dummy for no zero width */ \
+ { \
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1); \
+ set_glyph (glyphs, *n_glyphs, cfont, JOHAB_FILLER); \
+ glyphs->log_clusters[*n_glyphs] = n_clusters; \
+ (*n_glyphs)++; \
+ } \
+ \
+ return; \
+ } \
+ }
+
+static void
+render_syllable_with_johabs (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+JOHAB_COMMON
+
+ /* Render as uncomposed forms as a fallback. */
+ for (i = 0; i < length; i++)
+ {
+ int j;
+
+ /*
+ * Uses KSC5601 symbol glyphs which johabS-1 has; they're
+ * not in the normal johab-1. The glyphs are better than composable
+ * components.
+ */
+ for (j = 0; j < 3; j++)
+ {
+ gindex = __jamo_to_ksc5601[text[i] - LBASE][j];
+
+ if (gindex != 0)
+ {
+ if ((gindex >= 0x2421) && (gindex <= 0x247f))
+ gindex += (0x032b - 0x2420);
+ else if ((gindex >= 0x2421) && (gindex <= 0x247f))
+ gindex += (0x02cd - 0x2321);
+ else
+ break;
+
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+ else
+ break;
+ }
+ }
+}
+
+static void
+render_syllable_with_johab (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+JOHAB_COMMON
+
+ /* Render as uncomposed forms as a fallback. */
+ for (i = 0; i < length; i++)
+ {
+ int j;
+ GUChar2 wc;
+
+ wc = text[i];
+ for (j = 0; (j < 3) && (__jamo_to_johabfont[wc-LBASE][j] != 0); j++)
+ {
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont,
+ __jamo_to_johabfont[wc - LBASE][j]);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ if (IS_L (wc))
+ {
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, JOHAB_FILLER);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+ }
+ }
+}
+
+static void
+render_syllable_with_iso10646 (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+ PangoGlyphIndex gindex;
+ int i;
+
+ /*
+ * Check if there are one CHOSEONG, one JUNGSEONG, and no more
+ * than one JONGSEONG.
+ */
+ int n_cho = 0, n_jung = 0, n_jong = 0;
+ i = 0;
+ while (i < length && IS_L (text[i]))
+ {
+ n_cho++;
+ i++;
+ }
+ while (i < length && IS_V (text[i]))
+ {
+ n_jung++;
+ i++;
+ }
+ while (i < length && IS_T (text[i]))
+ {
+ n_jong++;
+ i++;
+ }
+
+ if (n_cho == 1 && n_jung == 1 && n_jong <= 1)
+ {
+ int lindex, vindex, tindex;
+
+ lindex = text[0] - LBASE;
+ vindex = text[1] - VBASE;
+ if (n_jong > 0)
+ tindex = text[2] - TBASE;
+ else
+ tindex = 0;
+
+ /* COMPOSABLE */
+ if (lindex >= 0 && lindex < LCOUNT &&
+ vindex >= 0 && vindex < VCOUNT &&
+ tindex >= 0 && tindex < TCOUNT)
+ {
+ gindex = (lindex * VCOUNT + vindex) * TCOUNT + tindex + SBASE;
+ /* easy for composed syllables. */
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ return;
+ }
+ }
+
+ /* Render as uncomposed forms as a fallback. */
+ for (i = 0; i < length; i++)
+ {
+ gindex = text[i];
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+}
+
+static void
+render_syllable_with_ksc5601 (PangoCFont *cfont,
+ GUChar2 *text, int length,
+ PangoGlyphString *glyphs,
+ int *n_glyphs, int n_clusters)
+{
+ guint16 sindex;
+ PangoGlyphIndex gindex;
+ int i;
+
+ /*
+ * Check if there are one CHOSEONG, one JUNGSEONG, and no more
+ * than one JONGSEONG.
+ */
+ int n_cho = 0, n_jung = 0, n_jong = 0;
+ i = 0;
+ while (i < length && IS_L (text[i]))
+ {
+ n_cho++;
+ i++;
+ }
+ while (i < length && IS_V (text[i]))
+ {
+ n_jung++;
+ i++;
+ }
+ while (i < length && IS_T (text[i]))
+ {
+ n_jong++;
+ i++;
+ }
+
+ if (n_cho == 1 && n_jung == 1 && n_jong <= 1)
+ {
+ int lindex, vindex, tindex;
+
+ lindex = text[0] - LBASE;
+ vindex = text[1] - VBASE;
+ if (n_jong > 0)
+ tindex = text[2] - TBASE;
+ else
+ tindex = 0;
+
+ /* COMPOSABLE */
+ if (lindex >= 0 && lindex < LCOUNT &&
+ vindex >= 0 && vindex < VCOUNT &&
+ tindex >= 0 && tindex < TCOUNT)
+ {
+ int l = 0;
+ int u = KSC5601_HANGUL - 1;
+ guint16 try;
+
+ sindex = (lindex * VCOUNT + vindex) * TCOUNT + tindex + SBASE;
+
+ /* Do binary search. */
+ while (l <= u)
+ {
+ int m = (l + u) / 2;
+ try = __ksc5601_hangul_to_ucs[m];
+ if (try > sindex)
+ u = m - 1;
+ else if (try < sindex)
+ l = m + 1;
+ else
+ {
+ gindex = (((m / 94) + 0x30) << 8) | ((m % 94) + 0x21);
+
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont, gindex);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ return;
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < length; i++)
+ {
+ int j;
+
+ gindex = text[i];
+ for (j = 0; (j < 3) && (__jamo_to_ksc5601[gindex - LBASE][j] != 0); j++)
+ {
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ set_glyph (glyphs, *n_glyphs, cfont,
+ __jamo_to_ksc5601[gindex - LBASE][j]);
+ glyphs->log_clusters[*n_glyphs] = n_clusters;
+ (*n_glyphs)++;
+ }
+ }
+}
+
+/* Compare the tail of a to b */
+static gboolean
+match_end (char *a, char *b)
+{
+ size_t len_a = strlen (a);
+ size_t len_b = strlen (b);
+
+ if (len_b > len_a)
+ return FALSE;
+ else
+ return (strcmp (a + len_a - len_b, b) == 0);
+}
+
+static gboolean
+ranges_include_korean (int *ranges,
+ int n_ranges)
+{
+ gboolean have_syllables = FALSE;
+ gboolean have_jamos = FALSE;
+ gint i;
+
+ /* Check for syllables and for uncomposed jamos */
+
+ for (i=0; i<n_ranges; i++)
+ {
+ if (ranges[2*i] <= 0xac00 && ranges[2*i+1] >= 0xd7a3)
+ have_syllables = 1;
+ if (ranges[2*i] <= 0x1100 && ranges[2*i+1] >= 0x11ff)
+ have_jamos = 1;
+ }
+
+ return have_syllables && have_jamos;
+}
+
+static gboolean
+find_cfont (PangoFont *font, gchar **charsets, gint n_charsets,
+ PangoCFont **cfont, RenderSyllableFunc *render_func)
+{
+ int i;
+ char **xlfds;
+ int n_xlfds;
+
+ pango_x_list_cfonts (font, charsets, n_charsets, &xlfds, &n_xlfds);
+
+ *cfont = NULL;
+ for (i=0; i<n_xlfds; i++)
+ {
+ if (match_end (xlfds[i], "johabs-1"))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_johabs;
+ break;
+ }
+ if (match_end (xlfds[i], "johab-1"))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_johab;
+ break;
+ }
+ else if (match_end (xlfds[i], "iso10646-1"))
+ {
+ gint *ranges;
+ int n_ranges;
+
+ pango_x_xlfd_get_ranges (font, xlfds[i], &ranges, &n_ranges);
+
+ if (ranges_include_korean (ranges, n_ranges))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_iso10646;
+ g_free (ranges);
+ break;
+ }
+
+ g_free (ranges);
+ }
+ else if (match_end (xlfds[i], "ksc5601.1987-0"))
+ {
+ *cfont = pango_x_load_xlfd (font, xlfds[i]);
+ *render_func = render_syllable_with_ksc5601;
+ break;
+ }
+ }
+
+ for (i=0; i<n_xlfds; i++)
+ g_free (xlfds[i]);
+ g_free (xlfds);
+
+ return (*cfont != NULL);
+}
+
+static void
+hangul_engine_shape (PangoFont *font,
+ gchar *text,
+ gint length,
+ PangoAnalysis *analysis,
+ PangoGlyphString *glyphs)
+{
+ PangoCFont *cfont;
+ RenderSyllableFunc render_func = NULL;
+
+ char *ptr, *next;
+ int i, n_chars;
+ GUChar2 jamos[4];
+ int n_jamos = 0;
+
+ int n_glyphs = 0, n_clusters = 0;
+
+ static char *default_charset[] = {
+ "johabs-1"
+ };
+
+ static char *secondary_charset[] = {
+ "johab-1"
+ };
+
+ static char *fallback_charsets[] = {
+ "iso10646-1",
+ "ksc5601.1987-0"
+ };
+
+ g_return_if_fail (font != NULL);
+ g_return_if_fail (text != NULL);
+ g_return_if_fail (length >= 0);
+ g_return_if_fail (analysis != NULL);
+
+ /* check available fonts. Always use a johab font if available;
+ * otherwise use iso-10646 or KSC font depending on the ordering
+ * of the fontlist.
+ */
+ if (!find_cfont (font, default_charset, 1, &cfont, &render_func))
+ if (!find_cfont (font, secondary_charset, 1, &cfont, &render_func))
+ if (!find_cfont (font, fallback_charsets, 2, &cfont, &render_func))
+ {
+ g_warning ("No available Hangul fonts.");
+ return;
+ }
+
+ n_chars = unicode_strlen (text, length);
+ ptr = text;
+
+ for (i = 0; i < n_chars; i++)
+ {
+ GUChar4 wc4;
+ GUChar2 wcs[4], wc;
+ int n_code = 0;
+
+ _pango_utf8_iterate (ptr, &next, &wc4);
+ if (wc4 >= SBASE && wc4 < (SBASE + SCOUNT))
+ {
+ /* decompose the syllable. */
+ gint16 sindex;
+
+ sindex = wc4 - SBASE;
+ wcs[0] = LBASE + (sindex / NCOUNT);
+ wcs[1] = VBASE + ((sindex % NCOUNT) / TCOUNT);
+ wcs[2] = TBASE + (sindex % TCOUNT);
+ n_code = 3;
+
+ if (n_jamos > 0)
+ {
+ (*render_func) (cfont, jamos, n_jamos,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ n_jamos = 0;
+ }
+
+ /* Draw a syllable. */
+ (*render_func) (cfont, wcs, 3,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ /* Clear. */
+ }
+ else if (wc4 >= 0x1100 && wc4 <= 0x11ff)
+ {
+ wc = (GUChar2) wc4;
+
+ if (n_jamos == 0)
+ {
+ jamos[n_jamos++] = wc;
+ }
+ else
+ {
+ /* Check syllable boundaries. */
+ if ((IS_T (jamos[n_jamos - 1]) && IS_L (wc)) ||
+ (IS_V (jamos[n_jamos - 1]) && IS_L (wc)) ||
+ (IS_T (jamos[n_jamos - 1]) && IS_V (wc)))
+ {
+ /* Draw a syllable. */
+ (*render_func) (cfont, jamos, n_jamos,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ /* Clear. */
+ n_jamos = 0;
+ }
+ jamos[n_jamos++] = wc;
+ }
+ }
+ else
+ {
+ g_warning ("Unknown character 0x04%x", wc4);
+ continue;
+ }
+
+ ptr = next;
+ }
+
+ /* Draw the remaining Jamos. */
+ if (n_jamos > 0)
+ {
+ (*render_func) (cfont, jamos, n_jamos,
+ glyphs, &n_glyphs, n_clusters);
+ n_clusters++;
+ n_jamos = 0;
+ }
+}
+
+
+static PangoEngine *
+hangul_engine_x_new ()
+{
+ PangoEngineShape *result;
+
+ result = g_new (PangoEngineShape, 1);
+
+ result->engine.id = "HangulScriptEngine";
+ result->engine.type = PANGO_ENGINE_TYPE_LANG;
+ result->engine.length = sizeof (result);
+ result->script_shape = hangul_engine_shape;
+
+ return (PangoEngine *)result;
+}
+
+
+
+/* The following three functions provide the public module API for
+ * Pango
+ */
+
+void
+script_engine_list (PangoEngineInfo **engines, gint *n_engines)
+{
+ *engines = script_engines;
+ *n_engines = n_script_engines;
+}
+
+PangoEngine *
+script_engine_load (const char *id)
+{
+ if (!strcmp (id, "HangulScriptEngineLang"))
+ return hangul_engine_lang_new ();
+ else if (!strcmp (id, "HangulScriptEngineX"))
+ return hangul_engine_x_new ();
+ else
+ return NULL;
+}
+
+void
+script_engine_unload (PangoEngine *engine)
+{
+}
+
diff --git a/modules/hangul/tables-johabfont.i b/modules/hangul/tables-johabfont.i
new file mode 100644
index 00000000..8d2cb05c
--- /dev/null
+++ b/modules/hangul/tables-johabfont.i
@@ -0,0 +1,608 @@
+/* -*-c-*- */
+
+#define JOHAB_LBASE 0x0001
+#define JOHAB_VBASE 0x0137
+#define JOHAB_TBASE 0x0195
+
+#define JOHAB_FILLER 0x0000
+
+const static guint16 __choseong_johabfont_base[] =
+{
+ /* the basic 19 CHOSEONGs */
+ 0x0001, 0x000b, 0x0015, 0x001f, 0x0029,
+ 0x0033, 0x003d, 0x0047, 0x0051, 0x005b,
+ 0x0065, 0x006f, 0x0079, 0x0083, 0x008d,
+ 0x0097, 0x00a1, 0x00ab, 0x00b5,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x00c9, /* PIEUP-KIYEOK */
+ 0,
+ 0x00dd, /* PIEUP-TIKEUT */
+ 0x00fb, /* PIEUP-SIOS */
+ 0, 0, 0, 0, 0,
+ 0x0119, /* PIEUP-CIEUC */
+ 0, 0, 0,
+ 0x00bf, /* KAPYEOUNPIEUP */
+ 0,
+ 0x00d3, /* SIOS-KIYEOK */
+ 0,
+ 0x00e7, /* SIOS-TIKEUT */
+ 0, 0,
+ 0x00f1, /* SIOS-PIEUP */
+ 0, 0, 0,
+ 0x0123, /* SIOS-CIEUC */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0105, /* PANSIOS */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ 0x012d, /* YESIEUNG */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,
+ 0x010f, /* YEORINHIEUH */
+ 0, 0, 0, 0, 0, /* reserved */
+ 0 /* CHOSEONG filler */
+};
+
+const static guint16 __jungseong_johabfont_base[] =
+{
+ /* the basic 21 JUNGSEONGs */
+ 0x0137, 0x013a, 0x013d, 0x0140, 0x0143,
+ 0x0146, 0x0149, 0x014c, 0x014f, 0x0153,
+ 0x0157, 0x015b, 0x015f, 0x0163, 0x0166,
+ 0x0169, 0x016c, 0x016f, 0x0172, 0x0176,
+ 0x017a,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0x017d, /* YO-YA */
+ 0x0180, /* YO-YAE */
+ 0, 0,
+ 0x0183, /* YO-I */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0186, /* YU-YEO */
+ 0x0189, /* YU-YE */
+ 0,
+ 0x018c, /* YU-I */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x018f, /* ARAEA */
+ 0, 0,
+ 0x0192, /* ARAEA-I */
+ 0,
+ 0, 0, 0, 0 /* reserved */
+};
+
+const static gint16 __jongseong_johabfont_base[] =
+{
+ 0, /* (INTERNAL) JONGSEONG filler */
+ /* The basic 27 (28 - jongseong filter) CHONGSEONGs */
+ 0x0195, 0x0199, 0x019d, 0x01a1, 0x01a5,
+ 0x01a9, 0x01ad, 0x01b1, 0x01b5, 0x01b9,
+ 0x01bd, 0x01c1, 0x01c5, 0x01c9, 0x01cd,
+ 0x01d1, 0x01d5, 0x01d9, 0x01dd, 0x01e1,
+ 0x01e5, 0x01e9, 0x01ed, 0x01f1, 0x01f5,
+ 0x01f9, 0x01fd,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,
+ 0x0201, /* RIEUL-YEORINHIEUH */
+ 0x0205, /* MIEUM-KIYEOK */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ 0x020d, /* YESIEUNG */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0209, /* YEORINHIEUH */
+ 0, 0, 0, 0, 0, 0 /* reserved */
+};
+
+/*
+ * This table represents how many glyphs are available for each
+ * JUNGSEONGs in johab-font -- some are 3 and some are 4.
+ */
+const static gint __johabfont_jungseong_kind[] =
+{
+ /* The basic 21 JUNGSEONGs. */
+ 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
+ 4, 4, 4, 3, 3, 3, 3, 3, 4, 4,
+ 3,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 3, /* YO-YA */
+ 3, /* YO-YAE */
+ 0, 0,
+ 3, /* YO-I */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, /* YU-YEO */
+ 3, /* YU-YE */
+ 0,
+ 3, /* YU-I */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, /* ARAEA */
+ 0, 0,
+ 3, /* ARAEA-I */
+ 0,
+ 0, 0, 0, 0 /* reserved */
+};
+
+const static gint __choseong_map_1[] = {
+ /* The basic 21 JUNGSEONGs. */
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,
+ 3, 3, 1, 2, 4, 4, 4, 2, 1, 3,
+ 0,
+
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ 3, /* YO-YA */
+ 3, /* YO-YAE */
+ -1, -1,
+ 3, /* YO-I */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4, /* YU-YEO */
+ 4, /* YU-YE */
+ -1,
+ 4, /* YU-I */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 2, /* ARAEA */
+ -1, -1,
+ 4, /* ARAEA-I */
+ -1,
+ -1, -1, -1, -1 /* reserved */
+};
+
+const static gint __choseong_map_2[] = {
+ /* The basic 21 JUNGSEONGs. */
+ 5, 5, 5, 5, 5, 5, 5, 5, 6, 8,
+ 8, 8, 6, 7, 9, 9, 9, 7, 6, 8,
+ 5,
+
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ 8, /* YO-YA */
+ 8, /* YO-YAE */
+ -1, -1,
+ 8, /* YO-I */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9, /* YU-YEO */
+ 9, /* YU-YE */
+ -1,
+ 9, /* YU-I */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 6, /* ARAEA */
+ -1, -1,
+ 9, /* ARAEA-I */
+ -1,
+ -1, -1, -1, -1 /* reserved */
+};
+
+const static gint __johabfont_jongseong_kind[] =
+{
+ 0, /* (internal) CHONGSEONG filler */
+ /* The basic 27 (28 - jongseong filter) CHONGSEONGs */
+ 1, 1, 1, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1,
+
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ 1, /* YEORINHIEUH */
+ 1, /* MIEUM-KIYEOK */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1,
+ 1, /* YESIEUNG */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 1, /* YEORINHIEUH */
+ -1, -1, -1, -1, -1, -1 /* reserved */
+};
+
+const static gint __jongseong_map[] =
+{
+ /* The basic 21 JUNGSEONGs. */
+ 0, 2, 0, 2, 1, 2, 1, 2, 3, 0,
+ 0, 0, 3, 3, 1, 1, 1, 3, 3, 0,
+ 1,
+
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ 0, /* YO-YA */
+ 0, /* YO-YAE */
+ -1, -1,
+ 1, /* YO-I */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 1, /* YU-YEO */
+ 1, /* YU-YE */
+ -1,
+ 1, /* YU-I */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 3, /* ARAEA */
+ -1, -1,
+ 0, /* ARAEA-I */
+ -1,
+ -1, -1, -1, -1 /* reserved */
+};
+
+
+/*
+ * Jamos
+ */
+
+/* from the CHOSEONG section -- mordern */
+#define JOHAB_KIYEOK 0x0002
+#define JOHAB_SSANGKIYEOK 0x000c
+#define JOHAB_NIEUN 0x0016
+#define JOHAB_TIKEUT 0x0020
+#define JOHAB_SSANGTIKEUT 0x002a
+#define JOHAB_RIEUL 0x0034
+#define JOHAB_MIEUM 0x003e
+#define JOHAB_PIEUP 0x0048
+#define JOHAB_SSANGPIEUP 0x0052
+#define JOHAB_SIOS 0x005c
+#define JOHAB_SSANGSIOS 0x0066
+#define JOHAB_IEUNG 0x0070
+#define JOHAB_CIEUC 0x007a
+#define JOHAB_SSANGCIEUC 0x0084
+#define JOHAB_CHIEUCH 0x008e
+#define JOHAB_KHIEUKH 0x0098
+#define JOHAB_THIEUTH 0x00a2
+#define JOHAB_PHIEUPH 0x00ac
+#define JOHAB_HIEUH 0x00b6
+
+/* from the CHOSEONG section -- extra */
+#define JOHAB_KAPYEOUNPIEUP 0x00c0
+#define JOHAB_PIEUP_KIYEOK 0x00ca
+#define JOHAB_SIOS_KIYEOK 0x00d4
+#define JOHAB_PIEUP_TIKEUT 0x00de
+#define JOHAB_SIOS_TIKEUT 0x00e8
+#define JOHAB_SIOS_PIEUP 0x00f2
+#define JOHAB_PIEUP_SIOS 0x00fc
+#define JOHAB_PANSIOS 0x0106
+#define JOHAB_YESIEUNG 0x0110
+#define JOHAB_PIEUP_CIEUC 0x011a
+#define JOHAB_SIOS_CIEUC 0x0124
+#define JOHAB_YEORINHIEUH 0x012e
+
+/* from the JONGSEONG section -- modern */
+#define JOHAB_KIYEOK_SIOS 0x019d
+#define JOHAB_NIEUN_CIEUC 0x01a5
+#define JOHAB_NIEUN_HIEUH 0x01a9
+#define JOHAB_RIEUL_KIYEOK 0x01b5
+#define JOHAB_RIEUL_MIEUM 0x01b9
+#define JOHAB_RIEUL_PIEUP 0x01bd
+#define JOHAB_RIEUL_SIOS 0x01c1
+#define JOHAB_RIEUL_THIEUTH 0x01c5
+#define JOHAB_RIEUL_PHIEUPH 0x01c9
+#define JOHAB_RIEUL_HIEUH 0x01cd
+
+/* from the JONGSEONG section -- extra */
+#define JOHAB_RIEUL_YEORINHIEUH 0x0201
+#define JOHAB_MIEUM_KIYEOK 0x0205
+
+/* from the JUNGSEONG section -- modern */
+#define JOHAB_A 0x0137
+#define JOHAB_AE 0x013a
+#define JOHAB_YA 0x013d
+#define JOHAB_YAE 0x014d
+#define JOHAB_EO 0x0143
+#define JOHAB_E 0x0146
+#define JOHAB_YEO 0x0149
+#define JOHAB_YE 0x014c
+#define JOHAB_O 0x014e
+#define JOHAB_WA 0x0153
+#define JOHAB_WAE 0x0157
+#define JOHAB_OE 0x015b
+#define JOHAB_YO 0x015e
+#define JOHAB_U 0x0163
+#define JOHAB_WEO 0x0166
+#define JOHAB_WE 0x0169
+#define JOHAB_WI 0x016c
+#define JOHAB_YU 0x016f
+#define JOHAB_EU 0x0172
+#define JOHAB_YI 0x0176
+#define JOHAB_I 0x017a
+
+/* from the JUNGSEONG section -- extra */
+#define JOHAB_YO_YA 0x017d
+#define JOHAB_YO_YAE 0x0180
+#define JOHAB_YO_I 0x0183
+#define JOHAB_YU_YEO 0x0186
+#define JOHAB_YU_YE 0x0189
+#define JOHAB_YU_I 0x018c
+#define JOHAB_ARAEA 0x018f
+#define JOHAB_ARAEA_I 0x0192
+
+/*
+ * Some jamos are not representable with KSC5601.
+ * Choose similar modern jamos, but different with glyphs.
+ */
+#define JOHAB_CHITUEUMSIOS 0x005e
+#define JOHAB_CEONGCHITUEUMSIOS 0x0060
+#define JOHAB_CHITUEUMCIEUC 0x007c
+#define JOHAB_CEONGEUMCIEUC 0x007e
+#define JOHAB_CHITUEUMCHIEUCH 0x0090
+#define JOHAB_CEONGEUMCHIEUCH 0x0092
+
+static guint16 __jamo_to_johabfont[0x100][3] =
+{
+ /*
+ * CHOSEONG
+ */
+ /* CHOSEONG 0x1100 -- 0x1112 : matched to each ksc5601 Jamos extactly. */
+ {JOHAB_KIYEOK, 0, 0},
+ {JOHAB_SSANGKIYEOK, 0, 0},
+ {JOHAB_NIEUN, 0, 0},
+ {JOHAB_TIKEUT, 0, 0},
+ {JOHAB_SSANGTIKEUT, 0, 0},
+ {JOHAB_RIEUL, 0, 0},
+ {JOHAB_MIEUM, 0, 0},
+ {JOHAB_PIEUP, 0, 0},
+ {JOHAB_SSANGPIEUP, 0, 0},
+ {JOHAB_SIOS, 0, 0},
+ {JOHAB_SSANGSIOS, 0, 0},
+ {JOHAB_IEUNG, 0, 0},
+ {JOHAB_CIEUC, 0, 0},
+ {JOHAB_SSANGCIEUC, 0, 0},
+ {JOHAB_CHIEUCH, 0, 0},
+ {JOHAB_KHIEUKH, 0, 0},
+ {JOHAB_THIEUTH, 0, 0},
+ {JOHAB_PHIEUPH, 0, 0},
+ {JOHAB_HIEUH, 0, 0},
+ /* Some of the following are representable as a glyph, the others not. */
+ {JOHAB_NIEUN, JOHAB_KIYEOK, 0},
+ {JOHAB_NIEUN, JOHAB_NIEUN, 0},
+ {JOHAB_NIEUN, JOHAB_TIKEUT, 0},
+ {JOHAB_NIEUN, JOHAB_PIEUP, 0},
+ {JOHAB_TIKEUT, JOHAB_KIYEOK, 0},
+ {JOHAB_RIEUL, JOHAB_NIEUN, 0},
+ {JOHAB_RIEUL, JOHAB_RIEUL, 0},
+ {JOHAB_RIEUL_HIEUH, 0, 0},
+ {JOHAB_RIEUL, JOHAB_IEUNG, 0},
+ {JOHAB_MIEUM, JOHAB_PIEUP, 0},
+ {JOHAB_MIEUM, JOHAB_IEUNG, 0}, /* KAPYEOUNMIEUM */
+ {JOHAB_PIEUP_KIYEOK, 0, 0},
+ {JOHAB_PIEUP, JOHAB_NIEUN, 0},
+ {JOHAB_PIEUP_TIKEUT, 0, 0},
+ {JOHAB_PIEUP_SIOS, 0, 0},
+ {JOHAB_PIEUP, JOHAB_SIOS, JOHAB_KIYEOK},
+ {JOHAB_PIEUP, JOHAB_SIOS, JOHAB_TIKEUT},
+ {JOHAB_PIEUP, JOHAB_SIOS, JOHAB_PIEUP},
+ {JOHAB_PIEUP, JOHAB_SIOS, JOHAB_SIOS},
+ {JOHAB_PIEUP, JOHAB_SIOS, JOHAB_CIEUC},
+ {JOHAB_PIEUP_CIEUC, 0, 0},
+ {JOHAB_PIEUP, JOHAB_CHIEUCH, 0},
+ {JOHAB_PIEUP, JOHAB_THIEUTH, 0},
+ {JOHAB_PIEUP, JOHAB_PHIEUPH, 0},
+ {JOHAB_KAPYEOUNPIEUP, 0, 0},
+ {JOHAB_SSANGPIEUP, JOHAB_IEUNG, 0}, /* KAPYEOUNSSANGPIEUP */
+ {JOHAB_SIOS_KIYEOK, 0, 0},
+ {JOHAB_SIOS, JOHAB_NIEUN, 0},
+ {JOHAB_SIOS_TIKEUT, 0, 0},
+ {JOHAB_SIOS, JOHAB_RIEUL, 0},
+ {JOHAB_SIOS, JOHAB_MIEUM, 0},
+ {JOHAB_SIOS_PIEUP, 0, 0},
+ {JOHAB_SIOS, JOHAB_PIEUP, JOHAB_KIYEOK},
+ {JOHAB_SIOS, JOHAB_SIOS, JOHAB_SIOS},
+ {JOHAB_SIOS, JOHAB_IEUNG, 0},
+ {JOHAB_SIOS_CIEUC, 0, 0},
+ {JOHAB_SIOS, JOHAB_CHIEUCH, 0},
+ {JOHAB_SIOS, JOHAB_KHIEUKH, 0},
+ {JOHAB_SIOS, JOHAB_THIEUTH, 0},
+ {JOHAB_SIOS, JOHAB_PHIEUPH, 0},
+ {JOHAB_SIOS, JOHAB_HIEUH, 0},
+ {JOHAB_CHITUEUMSIOS, 0, 0},
+ {JOHAB_CHITUEUMSIOS, JOHAB_CHITUEUMSIOS, 0},
+ {JOHAB_CEONGCHITUEUMSIOS, 0, 0},
+ {JOHAB_CEONGCHITUEUMSIOS, JOHAB_CEONGCHITUEUMSIOS, 0},
+ {JOHAB_PANSIOS, 0, 0},
+ {JOHAB_IEUNG, JOHAB_KIYEOK, 0},
+ {JOHAB_IEUNG, JOHAB_TIKEUT, 0},
+ {JOHAB_IEUNG, JOHAB_MIEUM, 0},
+ {JOHAB_IEUNG, JOHAB_PIEUP, 0},
+ {JOHAB_IEUNG, JOHAB_SIOS, 0},
+ {JOHAB_IEUNG, JOHAB_PANSIOS, 0},
+ {JOHAB_IEUNG, JOHAB_IEUNG, 0},
+ {JOHAB_IEUNG, JOHAB_CIEUC, 0},
+ {JOHAB_IEUNG, JOHAB_CHIEUCH, 0},
+ {JOHAB_IEUNG, JOHAB_THIEUTH, 0},
+ {JOHAB_IEUNG, JOHAB_PHIEUPH, 0},
+ {JOHAB_YESIEUNG, 0, 0},
+ {JOHAB_CIEUC, JOHAB_IEUNG, 0},
+ {JOHAB_CHITUEUMCIEUC, 0, 0},
+ {JOHAB_CHITUEUMCIEUC, JOHAB_CHITUEUMCIEUC, 0},
+ {JOHAB_CEONGEUMCIEUC, 0, 0},
+ {JOHAB_CEONGEUMCIEUC, JOHAB_CEONGEUMCIEUC, 0},
+ {JOHAB_CHIEUCH, JOHAB_KHIEUKH, 0},
+ {JOHAB_CHIEUCH, JOHAB_HIEUH, 0},
+ {JOHAB_CHITUEUMCHIEUCH, 0, 0},
+ {JOHAB_CEONGEUMCHIEUCH, 0, 0},
+ {JOHAB_PHIEUPH, JOHAB_PIEUP, 0},
+ {JOHAB_PHIEUPH, JOHAB_IEUNG, 0}, /* KAPYEOUNPHIEUPH */
+ {JOHAB_HIEUH, JOHAB_HIEUH, 0},
+ {JOHAB_YEORINHIEUH, 0, 0},
+ /* 0x115A ~ 0x115E -- reserved */
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ /* CHOSEONG FILLER */
+ {0, 0, 0},
+
+ /*
+ * JUNGSEONG
+ */
+ /*
+ * JUNGSEONG
+ */
+ {0, 0, 0}, /* JUNGSEONG FILL */
+ /* JUNGSEONG 0x1161 -- 0x1175 : matched to each ksc5601 Jamos extactly. */
+ {JOHAB_A, 0, 0},
+ {JOHAB_AE, 0, 0},
+ {JOHAB_YA, 0, 0},
+ {JOHAB_YAE, 0, 0},
+ {JOHAB_EO, 0, 0},
+ {JOHAB_E, 0, 0},
+ {JOHAB_YEO, 0, 0},
+ {JOHAB_YE, 0, 0},
+ {JOHAB_O, 0, 0},
+ {JOHAB_WA, 0, 0},
+ {JOHAB_WAE, 0, 0},
+ {JOHAB_OE, 0, 0},
+ {JOHAB_YO, 0, 0},
+ {JOHAB_U, 0, 0},
+ {JOHAB_WEO, 0, 0},
+ {JOHAB_WE, 0, 0},
+ {JOHAB_WI, 0, 0},
+ {JOHAB_YU, 0, 0},
+ {JOHAB_EU, 0, 0},
+ {JOHAB_YI, 0, 0},
+ {JOHAB_I, 0, 0},
+ /* Some of the following are representable as a glyph, the others not. */
+ {JOHAB_A, JOHAB_O, 0},
+ {JOHAB_A, JOHAB_U, 0},
+ {JOHAB_YA, JOHAB_O, 0},
+ {JOHAB_YA, JOHAB_YO, 0},
+ {JOHAB_EO, JOHAB_O, 0},
+ {JOHAB_EO, JOHAB_U, 0},
+ {JOHAB_EO, JOHAB_EU, 0},
+ {JOHAB_YEO, JOHAB_O, 0},
+ {JOHAB_YEO, JOHAB_U, 0},
+ {JOHAB_O, JOHAB_EO, 0},
+ {JOHAB_O, JOHAB_E, 0},
+ {JOHAB_O, JOHAB_YE, 0},
+ {JOHAB_O, JOHAB_O, 0},
+ {JOHAB_O, JOHAB_U, 0},
+ {JOHAB_YO_YA, 0, 0},
+ {JOHAB_YO_YAE, 0, 0},
+ {JOHAB_YO, JOHAB_YEO, 0},
+ {JOHAB_YO, JOHAB_O, 0},
+ {JOHAB_YO_I, 0, 0},
+ {JOHAB_U, JOHAB_A, 0},
+ {JOHAB_U, JOHAB_AE, 0},
+ {JOHAB_U, JOHAB_EO, JOHAB_EU},
+ {JOHAB_U, JOHAB_YE, 0},
+ {JOHAB_U, JOHAB_U, 0},
+ {JOHAB_YU, JOHAB_A, 0},
+ {JOHAB_YU, JOHAB_EO, 0},
+ {JOHAB_YU, JOHAB_E, 0},
+ {JOHAB_YU_YEO, 0, 0},
+ {JOHAB_YU_YE, 0, 0},
+ {JOHAB_YU, JOHAB_U, 0},
+ {JOHAB_YU_I, 0, 0},
+ {JOHAB_EU, JOHAB_U, 0},
+ {JOHAB_EU, JOHAB_EU, 0},
+ {JOHAB_YI, JOHAB_U, 0},
+ {JOHAB_I, JOHAB_A, 0},
+ {JOHAB_I, JOHAB_YA, 0},
+ {JOHAB_I, JOHAB_O, 0},
+ {JOHAB_I, JOHAB_U, 0},
+ {JOHAB_I, JOHAB_EU, 0},
+ {JOHAB_I, JOHAB_ARAEA, 0},
+ {JOHAB_ARAEA, 0, 0},
+ {JOHAB_ARAEA, JOHAB_EO, 0},
+ {JOHAB_ARAEA, JOHAB_U, 0},
+ {JOHAB_ARAEA, JOHAB_I, 0},
+ {JOHAB_ARAEA, JOHAB_ARAEA, 0},
+ /* 0x11A3 ~ 0x11A7 -- reserved */
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0}, /* (INTERNAL) JONGSEONG FILL */
+
+ /*
+ * JONGSEONG
+ */
+ {JOHAB_KIYEOK, 0, 0},
+ {JOHAB_SSANGKIYEOK, 0, 0},
+ {JOHAB_KIYEOK_SIOS, 0, 0},
+ {JOHAB_NIEUN, 0, 0},
+ {JOHAB_NIEUN_CIEUC, 0, 0},
+ {JOHAB_NIEUN_HIEUH, 0, 0},
+ {JOHAB_TIKEUT, 0, 0},
+ {JOHAB_RIEUL, 0, 0},
+ {JOHAB_RIEUL_KIYEOK, 0, 0},
+ {JOHAB_RIEUL_MIEUM, 0, 0},
+ {JOHAB_RIEUL_PIEUP, 0, 0},
+ {JOHAB_RIEUL_SIOS, 0, 0},
+ {JOHAB_RIEUL, JOHAB_TIKEUT, 0},
+ {JOHAB_RIEUL_PHIEUPH, 0, 0},
+ {JOHAB_RIEUL_HIEUH, 0, 0},
+ {JOHAB_MIEUM, 0, 0},
+ {JOHAB_PIEUP, 0, 0},
+ {JOHAB_PIEUP_SIOS, 0, 0},
+ {JOHAB_SIOS, 0, 0},
+ {JOHAB_SSANGSIOS, 0, 0},
+ {JOHAB_IEUNG, 0, 0},
+ {JOHAB_CIEUC, 0, 0},
+ {JOHAB_CHIEUCH, 0, 0},
+ {JOHAB_KHIEUKH, 0, 0},
+ {JOHAB_THIEUTH, 0, 0},
+ {JOHAB_PHIEUPH, 0, 0},
+ {JOHAB_HIEUH, 0, 0},
+ {JOHAB_KIYEOK, JOHAB_RIEUL, 0},
+ {JOHAB_KIYEOK, JOHAB_SIOS, JOHAB_KIYEOK},
+ {JOHAB_NIEUN, JOHAB_KIYEOK, 0},
+ {JOHAB_NIEUN, JOHAB_TIKEUT, 0},
+ {JOHAB_NIEUN, JOHAB_SIOS, 0},
+ {JOHAB_NIEUN, JOHAB_PANSIOS, 0},
+ {JOHAB_NIEUN, JOHAB_THIEUTH, 0},
+ {JOHAB_TIKEUT, JOHAB_KIYEOK, 0},
+ {JOHAB_TIKEUT, JOHAB_RIEUL, 0},
+ {JOHAB_RIEUL, JOHAB_KIYEOK, JOHAB_SIOS},
+ {JOHAB_RIEUL, JOHAB_NIEUN, 0},
+ {JOHAB_RIEUL, JOHAB_TIKEUT, 0},
+ {JOHAB_RIEUL, JOHAB_TIKEUT, JOHAB_HIEUH},
+ {JOHAB_RIEUL, JOHAB_RIEUL, 0},
+ {JOHAB_RIEUL, JOHAB_MIEUM, JOHAB_KIYEOK},
+ {JOHAB_RIEUL, JOHAB_MIEUM, JOHAB_SIOS},
+ {JOHAB_RIEUL, JOHAB_PIEUP, JOHAB_SIOS},
+ {JOHAB_RIEUL, JOHAB_PHIEUPH, JOHAB_HIEUH},
+ {JOHAB_RIEUL, JOHAB_KAPYEOUNPIEUP, 0},
+ {JOHAB_RIEUL, JOHAB_SIOS, JOHAB_SIOS},
+ {JOHAB_RIEUL, JOHAB_PANSIOS, 0},
+ {JOHAB_RIEUL, JOHAB_KHIEUKH, 0},
+ {JOHAB_RIEUL_YEORINHIEUH, 0, 0},
+ {JOHAB_MIEUM, JOHAB_KIYEOK, 0},
+ {JOHAB_MIEUM, JOHAB_RIEUL, 0},
+ {JOHAB_MIEUM, JOHAB_PIEUP, 0},
+ {JOHAB_MIEUM, JOHAB_SIOS, 0},
+ {JOHAB_MIEUM, JOHAB_SIOS, JOHAB_SIOS},
+ {JOHAB_MIEUM, JOHAB_PANSIOS, 0},
+ {JOHAB_MIEUM, JOHAB_CHIEUCH, 0},
+ {JOHAB_MIEUM, JOHAB_HIEUH, 0},
+ {JOHAB_MIEUM, JOHAB_IEUNG, 0}, /* KAPYEOUNMIEUM */
+ {JOHAB_PIEUP, JOHAB_RIEUL, 0},
+ {JOHAB_PIEUP, JOHAB_PHIEUPH, 0},
+ {JOHAB_PIEUP, JOHAB_HIEUH, 0},
+ {JOHAB_KAPYEOUNPIEUP, 0, 0},
+ {JOHAB_SIOS_KIYEOK, 0, 0},
+ {JOHAB_SIOS_TIKEUT, 0, 0},
+ {JOHAB_SIOS, JOHAB_RIEUL, 0},
+ {JOHAB_SIOS_PIEUP, 0, 0},
+ {JOHAB_PANSIOS, 0, 0},
+ {JOHAB_IEUNG, JOHAB_KIYEOK, 0},
+ {JOHAB_IEUNG, JOHAB_KIYEOK, JOHAB_KIYEOK},
+ {JOHAB_IEUNG, JOHAB_IEUNG, 0},
+ {JOHAB_IEUNG, JOHAB_KHIEUKH, 0},
+ {JOHAB_YESIEUNG, 0, 0},
+ {JOHAB_YESIEUNG, JOHAB_SIOS, 0},
+ {JOHAB_YESIEUNG, JOHAB_PANSIOS, 0},
+ {JOHAB_PHIEUPH, JOHAB_PIEUP, 0},
+ {JOHAB_PHIEUPH, JOHAB_IEUNG, 0}, /* KAPYEOUNPHIEUPH */
+ {JOHAB_HIEUH, JOHAB_NIEUN, 0},
+ {JOHAB_HIEUH, JOHAB_RIEUL, 0},
+ {JOHAB_HIEUH, JOHAB_MIEUM, 0},
+ {JOHAB_HIEUH, JOHAB_PIEUP, 0},
+ {JOHAB_YEORINHIEUH, 0, 0},
+ /* reserved */
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0}
+};
+
diff --git a/modules/hangul/tables-ksc5601.i b/modules/hangul/tables-ksc5601.i
new file mode 100644
index 00000000..3f5b818f
--- /dev/null
+++ b/modules/hangul/tables-ksc5601.i
@@ -0,0 +1,708 @@
+/* -*-c-*- */
+
+/* ks c 5601 HANGUL syllables -> UCS2 table
+ *
+ * This table is a part of the GNU C library:
+ *
+ * Copyright (C) 1998 Free Software Foundation, Inc.
+ */
+
+#define KSC5601_HANGUL 2350
+#define KSC5601_HANJA 4888
+#define KSC5601_SYMBOL 986
+
+static guint16 __ksc5601_hangul_to_ucs[KSC5601_HANGUL]=
+{
+ 0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10,
+ 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19,
+ 0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d,
+ 0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b,
+ 0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77,
+ 0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86,
+ 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d,
+ 0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf,
+ 0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4,
+ 0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7,
+ 0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5,
+ 0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06, 0xad0c, 0xad0d,
+ 0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad29, 0xad2c, 0xad2d,
+ 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45, 0xad47, 0xad49,
+ 0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c, 0xad6d, 0xad70,
+ 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c, 0xad7d, 0xad7f,
+ 0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90, 0xad9c, 0xad9d,
+ 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8, 0xadd0, 0xadd1,
+ 0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9, 0xadfc, 0xadff,
+ 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d, 0xae14, 0xae30,
+ 0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40, 0xae41, 0xae43,
+ 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e, 0xae50, 0xae54,
+ 0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61, 0xae65, 0xae68,
+ 0xae69, 0xae6c, 0xae70, 0xae78, 0xae79, 0xae7b, 0xae7c, 0xae7d,
+ 0xae84, 0xae85, 0xae8c, 0xaebc, 0xaebd, 0xaebe, 0xaec0, 0xaec4,
+ 0xaecc, 0xaecd, 0xaecf, 0xaed0, 0xaed1, 0xaed8, 0xaed9, 0xaedc,
+ 0xaee8, 0xaeeb, 0xaeed, 0xaef4, 0xaef8, 0xaefc, 0xaf07, 0xaf08,
+ 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d, 0xaf30, 0xaf32, 0xaf34, 0xaf3c,
+ 0xaf3d, 0xaf3f, 0xaf41, 0xaf42, 0xaf43, 0xaf48, 0xaf49, 0xaf50,
+ 0xaf5c, 0xaf5d, 0xaf64, 0xaf65, 0xaf79, 0xaf80, 0xaf84, 0xaf88,
+ 0xaf90, 0xaf91, 0xaf95, 0xaf9c, 0xafb8, 0xafb9, 0xafbc, 0xafc0,
+ 0xafc7, 0xafc8, 0xafc9, 0xafcb, 0xafcd, 0xafce, 0xafd4, 0xafdc,
+ 0xafe8, 0xafe9, 0xaff0, 0xaff1, 0xaff4, 0xaff8, 0xb000, 0xb001,
+ 0xb004, 0xb00c, 0xb010, 0xb014, 0xb01c, 0xb01d, 0xb028, 0xb044,
+ 0xb045, 0xb048, 0xb04a, 0xb04c, 0xb04e, 0xb053, 0xb054, 0xb055,
+ 0xb057, 0xb059, 0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c,
+ 0xb08d, 0xb08f, 0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f,
+ 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad,
+ 0xb0ae, 0xb0af, 0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc,
+ 0xb0c4, 0xb0c5, 0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4,
+ 0xb0d8, 0xb0e0, 0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110,
+ 0xb112, 0xb113, 0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123,
+ 0xb124, 0xb125, 0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138,
+ 0xb139, 0xb140, 0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154,
+ 0xb155, 0xb158, 0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180,
+ 0xb182, 0xb188, 0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194,
+ 0xb198, 0xb19c, 0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd,
+ 0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd,
+ 0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217,
+ 0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268,
+ 0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290,
+ 0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3,
+ 0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9,
+ 0xb2cc, 0xb2d0, 0xb2d2, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2,
+ 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee,
+ 0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa,
+ 0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311,
+ 0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358,
+ 0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365, 0xb367, 0xb369,
+ 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378, 0xb380, 0xb381,
+ 0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394, 0xb3a0, 0xb3a1,
+ 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb, 0xb3cc, 0xb3ce,
+ 0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db, 0xb3dd, 0xb3e0,
+ 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c, 0xb420, 0xb428,
+ 0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454, 0xb458, 0xb460,
+ 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488, 0xb49d, 0xb4a4,
+ 0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0, 0xb4c4, 0xb4c8,
+ 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3, 0xb4e4, 0xb4e6,
+ 0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514, 0xb515, 0xb518,
+ 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528, 0xb529, 0xb52a,
+ 0xb530, 0xb531, 0xb534, 0xb538, 0xb540, 0xb541, 0xb543, 0xb544,
+ 0xb545, 0xb54b, 0xb54c, 0xb54d, 0xb550, 0xb554, 0xb55c, 0xb55d,
+ 0xb55f, 0xb560, 0xb561, 0xb5a0, 0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa,
+ 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc,
+ 0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc, 0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1,
+ 0xb5d8, 0xb5ec, 0xb610, 0xb611, 0xb614, 0xb618, 0xb625, 0xb62c,
+ 0xb634, 0xb648, 0xb664, 0xb668, 0xb69c, 0xb69d, 0xb6a0, 0xb6a4,
+ 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4, 0xb6f0, 0xb6f4, 0xb6f8, 0xb700,
+ 0xb701, 0xb705, 0xb728, 0xb729, 0xb72c, 0xb72f, 0xb730, 0xb738,
+ 0xb739, 0xb73b, 0xb744, 0xb748, 0xb74c, 0xb754, 0xb755, 0xb760,
+ 0xb764, 0xb768, 0xb770, 0xb771, 0xb773, 0xb775, 0xb77c, 0xb77d,
+ 0xb780, 0xb784, 0xb78c, 0xb78d, 0xb78f, 0xb790, 0xb791, 0xb792,
+ 0xb796, 0xb797, 0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9,
+ 0xb7ab, 0xb7ac, 0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9,
+ 0xb7ec, 0xb7ed, 0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800,
+ 0xb801, 0xb807, 0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819,
+ 0xb81b, 0xb81d, 0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835,
+ 0xb837, 0xb838, 0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c,
+ 0xb85d, 0xb860, 0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878,
+ 0xb87c, 0xb88d, 0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1,
+ 0xb8c3, 0xb8c5, 0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1,
+ 0xb8e8, 0xb8e9, 0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd,
+ 0xb904, 0xb918, 0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c,
+ 0xb94f, 0xb951, 0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969,
+ 0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985,
+ 0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0,
+ 0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc,
+ 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db,
+ 0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec,
+ 0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01,
+ 0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48,
+ 0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58,
+ 0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71,
+ 0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8,
+ 0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb,
+ 0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc, 0xbb00, 0xbb04,
+ 0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20, 0xbb29, 0xbb2b,
+ 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e,
+ 0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f, 0xbb50, 0xbb54,
+ 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c, 0xbb90, 0xbba4,
+ 0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4, 0xbbc8, 0xbbd0,
+ 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00, 0xbc02, 0xbc08,
+ 0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11, 0xbc14, 0xbc15,
+ 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f,
+ 0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30, 0xbc31, 0xbc34,
+ 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45, 0xbc49, 0xbc4c,
+ 0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88, 0xbc8b, 0xbc8c,
+ 0xbc8e, 0xbc94, 0xbc95, 0xbc97, 0xbc99, 0xbc9a, 0xbca0, 0xbca1,
+ 0xbca4, 0xbca7, 0xbca8, 0xbcb0, 0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5,
+ 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4, 0xbccd, 0xbccf, 0xbcd0, 0xbcd1,
+ 0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc,
+ 0xbd04, 0xbd05, 0xbd07, 0xbd09, 0xbd10, 0xbd14, 0xbd24, 0xbd2c,
+ 0xbd40, 0xbd48, 0xbd49, 0xbd4c, 0xbd50, 0xbd58, 0xbd59, 0xbd64,
+ 0xbd68, 0xbd80, 0xbd81, 0xbd84, 0xbd87, 0xbd88, 0xbd89, 0xbd8a,
+ 0xbd90, 0xbd91, 0xbd93, 0xbd95, 0xbd99, 0xbd9a, 0xbd9c, 0xbda4,
+ 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5, 0xbdd8, 0xbddc, 0xbde9, 0xbdf0,
+ 0xbdf4, 0xbdf8, 0xbe00, 0xbe03, 0xbe05, 0xbe0c, 0xbe0d, 0xbe10,
+ 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f, 0xbe44, 0xbe45, 0xbe48, 0xbe4c,
+ 0xbe4e, 0xbe54, 0xbe55, 0xbe57, 0xbe59, 0xbe5a, 0xbe5b, 0xbe60,
+ 0xbe61, 0xbe64, 0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74,
+ 0xbe75, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d,
+ 0xbe8f, 0xbe90, 0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1,
+ 0xbed4, 0xbed7, 0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec,
+ 0xbf01, 0xbf08, 0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d,
+ 0xbf40, 0xbf41, 0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94,
+ 0xbfb0, 0xbfc5, 0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf,
+ 0xbfe1, 0xc03c, 0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069,
+ 0xc090, 0xc091, 0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5,
+ 0xc0ac, 0xc0ad, 0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6,
+ 0xc0bc, 0xc0bd, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9,
+ 0xc0cc, 0xc0d0, 0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4,
+ 0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100,
+ 0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f,
+ 0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f,
+ 0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148,
+ 0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c,
+ 0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178,
+ 0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c,
+ 0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0,
+ 0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0,
+ 0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200,
+ 0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c,
+ 0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d, 0xc22f, 0xc231,
+ 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254, 0xc258, 0xc260,
+ 0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c, 0xc27d, 0xc27f,
+ 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b, 0xc29d, 0xc2a4,
+ 0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5, 0xc2b7, 0xc2b9,
+ 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb, 0xc2ec, 0xc2ed,
+ 0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb, 0xc2fc, 0xc300,
+ 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314, 0xc315, 0xc318,
+ 0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345, 0xc368, 0xc369,
+ 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c, 0xc37d, 0xc384,
+ 0xc388, 0xc38c, 0xc3c0, 0xc3d8, 0xc3d9, 0xc3dc, 0xc3df, 0xc3e0,
+ 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5, 0xc3f8, 0xc408,
+ 0xc410, 0xc424, 0xc42c, 0xc430, 0xc434, 0xc43c, 0xc43d, 0xc448,
+ 0xc464, 0xc465, 0xc468, 0xc46c, 0xc474, 0xc475, 0xc479, 0xc480,
+ 0xc494, 0xc49c, 0xc4b8, 0xc4bc, 0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4,
+ 0xc4f8, 0xc4fa, 0xc4ff, 0xc500, 0xc501, 0xc50c, 0xc510, 0xc514,
+ 0xc51c, 0xc528, 0xc529, 0xc52c, 0xc530, 0xc538, 0xc539, 0xc53b,
+ 0xc53d, 0xc544, 0xc545, 0xc548, 0xc549, 0xc54a, 0xc54c, 0xc54d,
+ 0xc54e, 0xc553, 0xc554, 0xc555, 0xc557, 0xc558, 0xc559, 0xc55d,
+ 0xc55e, 0xc560, 0xc561, 0xc564, 0xc568, 0xc570, 0xc571, 0xc573,
+ 0xc574, 0xc575, 0xc57c, 0xc57d, 0xc580, 0xc584, 0xc587, 0xc58c,
+ 0xc58d, 0xc58f, 0xc591, 0xc595, 0xc597, 0xc598, 0xc59c, 0xc5a0,
+ 0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8, 0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd,
+ 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca,
+ 0xc5cc, 0xc5ce, 0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1,
+ 0xc5e3, 0xc5e5, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6,
+ 0xc5f7, 0xc5fc, 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605,
+ 0xc606, 0xc607, 0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b,
+ 0xc61c, 0xc624, 0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630,
+ 0xc633, 0xc634, 0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641,
+ 0xc644, 0xc648, 0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c,
+ 0xc65d, 0xc660, 0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c,
+ 0xc680, 0xc688, 0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698,
+ 0xc69c, 0xc6a4, 0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4,
+ 0xc6b8, 0xc6b9, 0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc,
+ 0xc6cd, 0xc6d0, 0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8,
+ 0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705,
+ 0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721,
+ 0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c,
+ 0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751,
+ 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c,
+ 0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d,
+ 0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a,
+ 0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a,
+ 0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad,
+ 0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8,
+ 0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8,
+ 0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a, 0xc810, 0xc811,
+ 0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820, 0xc824, 0xc82c,
+ 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840, 0xc848, 0xc849,
+ 0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874, 0xc878, 0xc87a,
+ 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887, 0xc88b, 0xc88c,
+ 0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8, 0xc8bc, 0xc8bd,
+ 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7, 0xc8d9, 0xc8e0,
+ 0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900, 0xc904, 0xc905,
+ 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918, 0xc92c, 0xc934,
+ 0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961, 0xc963, 0xc96c,
+ 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c, 0xc990, 0xc998,
+ 0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4, 0xc9c7, 0xc9c8,
+ 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3, 0xc9d5, 0xc9d6, 0xc9d9, 0xc9da,
+ 0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2, 0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed,
+ 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8, 0xc9f9, 0xc9fc, 0xca00, 0xca08,
+ 0xca09, 0xca0b, 0xca0c, 0xca0d, 0xca14, 0xca18, 0xca29, 0xca4c,
+ 0xca4d, 0xca50, 0xca54, 0xca5c, 0xca5d, 0xca5f, 0xca60, 0xca61,
+ 0xca68, 0xca7d, 0xca84, 0xca98, 0xcabc, 0xcabd, 0xcac0, 0xcac4,
+ 0xcacc, 0xcacd, 0xcacf, 0xcad1, 0xcad3, 0xcad8, 0xcad9, 0xcae0,
+ 0xcaec, 0xcaf4, 0xcb08, 0xcb10, 0xcb14, 0xcb18, 0xcb20, 0xcb21,
+ 0xcb41, 0xcb48, 0xcb49, 0xcb4c, 0xcb50, 0xcb58, 0xcb59, 0xcb5d,
+ 0xcb64, 0xcb78, 0xcb79, 0xcb9c, 0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7,
+ 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10, 0xcc14, 0xcc1c, 0xcc1d, 0xcc21,
+ 0xcc22, 0xcc27, 0xcc28, 0xcc29, 0xcc2c, 0xcc2e, 0xcc30, 0xcc38,
+ 0xcc39, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48,
+ 0xcc4c, 0xcc54, 0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64,
+ 0xcc66, 0xcc68, 0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0,
+ 0xcca8, 0xcca9, 0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8,
+ 0xccbc, 0xccc4, 0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4,
+ 0xccec, 0xccf0, 0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18,
+ 0xcd19, 0xcd1b, 0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c,
+ 0xcd60, 0xcd64, 0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88,
+ 0xcd94, 0xcd95, 0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9,
+ 0xcdb0, 0xcdc4, 0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8,
+ 0xcdf9, 0xcdfb, 0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19,
+ 0xce20, 0xce21, 0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35,
+ 0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69,
+ 0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85,
+ 0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1,
+ 0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5,
+ 0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9,
+ 0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15,
+ 0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31,
+ 0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67,
+ 0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c,
+ 0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8,
+ 0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011,
+ 0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c, 0xd044, 0xd045,
+ 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060, 0xd06c, 0xd06d,
+ 0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4, 0xd0a5, 0xd0a8,
+ 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0, 0xd0c1, 0xd0c4,
+ 0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0dc,
+ 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef, 0xd0f0, 0xd0f1,
+ 0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138, 0xd13a, 0xd140,
+ 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d, 0xd150, 0xd154,
+ 0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c, 0xd17c, 0xd184,
+ 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0, 0xd1b1, 0xd1b3,
+ 0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4, 0xd1f8, 0xd207,
+ 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234, 0xd23c, 0xd23d,
+ 0xd23f, 0xd241, 0xd248, 0xd25c, 0xd264, 0xd280, 0xd281, 0xd284,
+ 0xd288, 0xd290, 0xd291, 0xd295, 0xd29c, 0xd2a0, 0xd2a4, 0xd2ac,
+ 0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc, 0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8,
+ 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8, 0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0,
+ 0xd2f1, 0xd2f4, 0xd2f8, 0xd300, 0xd301, 0xd303, 0xd305, 0xd30c,
+ 0xd30d, 0xd30e, 0xd310, 0xd314, 0xd316, 0xd31c, 0xd31d, 0xd31f,
+ 0xd320, 0xd321, 0xd325, 0xd328, 0xd329, 0xd32c, 0xd330, 0xd338,
+ 0xd339, 0xd33b, 0xd33c, 0xd33d, 0xd344, 0xd345, 0xd37c, 0xd37d,
+ 0xd380, 0xd384, 0xd38c, 0xd38d, 0xd38f, 0xd390, 0xd391, 0xd398,
+ 0xd399, 0xd39c, 0xd3a0, 0xd3a8, 0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4,
+ 0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5, 0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8,
+ 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed, 0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd,
+ 0xd3ff, 0xd401, 0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460,
+ 0xd464, 0xd46d, 0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480,
+ 0xd482, 0xd488, 0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc,
+ 0xd4d0, 0xd4d4, 0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8,
+ 0xd4fb, 0xd4fd, 0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517,
+ 0xd53c, 0xd53d, 0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551,
+ 0xd558, 0xd559, 0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b,
+ 0xd56d, 0xd574, 0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587,
+ 0xd588, 0xd589, 0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0,
+ 0xd5d2, 0xd5d8, 0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8,
+ 0xd5ec, 0xd5f4, 0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604,
+ 0xd608, 0xd610, 0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620,
+ 0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648,
+ 0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c,
+ 0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c,
+ 0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac,
+ 0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1,
+ 0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5,
+ 0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c,
+ 0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738,
+ 0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756,
+ 0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769,
+ 0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789,
+ 0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d
+};
+
+
+#define KSC_KIYEOK 0x2421
+#define KSC_SSANGKIYEOK 0x2422
+#define KSC_KIYEOK_SIOS 0x2423
+#define KSC_NIEUN 0x2424
+#define KSC_NIEUN_CIEUC 0x2425
+#define KSC_NIEUN_HIEUH 0x2426
+#define KSC_TIKEUT 0x2427
+#define KSC_SSANGTIKEUT 0x2428
+#define KSC_RIEUL 0x2429
+#define KSC_RIEUL_KIYEOK 0x242a
+#define KSC_RIEUL_MIEUM 0x242b
+#define KSC_RIEUL_PIEUP 0x242c
+#define KSC_RIEUL_SIOS 0x242d
+#define KSC_RIEUL_THIEUTH 0x242e
+#define KSC_RIEUL_PHIEUPH 0x242f
+#define KSC_RIEUL_HIEUH 0x2430
+#define KSC_MIEUM 0x2431
+#define KSC_PIEUP 0x2432
+#define KSC_SSANGPIEUP 0x2433
+#define KSC_PIEUP_SIOS 0x2434
+#define KSC_SIOS 0x2435
+#define KSC_SSANGSIOS 0x2436
+#define KSC_IEUNG 0x2437
+#define KSC_CIEUC 0x2438
+#define KSC_SSANGCIEUC 0x2439
+#define KSC_CHIEUCH 0x243a
+#define KSC_KHIEUKH 0x243b
+#define KSC_THIEUTH 0x243c
+#define KSC_PHIEUPH 0x243d
+#define KSC_HIEUH 0x243e
+
+#define KSC_A 0x243f
+#define KSC_AE 0x2440
+#define KSC_YA 0x2441
+#define KSC_YAE 0x2442
+#define KSC_EO 0x2443
+#define KSC_E 0x2444
+#define KSC_YEO 0x2445
+#define KSC_YE 0x2446
+#define KSC_O 0x2447
+#define KSC_WA 0x2448
+#define KSC_WAE 0x2449
+#define KSC_OE 0x244a
+#define KSC_YO 0x244b
+#define KSC_U 0x244c
+#define KSC_WEO 0x244d
+#define KSC_WE 0x244e
+#define KSC_WI 0x244f
+#define KSC_YU 0x2450
+#define KSC_EU 0x2451
+#define KSC_YI 0x2452
+#define KSC_I 0x2453
+
+#define KSC_SSANGNIEUN 0x2455
+#define KSC_NIEUN_TIKEUT 0x2456
+#define KSC_NIEUN_SIOS 0x2457
+#define KSC_NIEUN_PANSIOS 0x2458
+#define KSC_RIEUL_KIYEOK_SIOS 0x2459
+#define KSC_RIEUL_TIKEUT 0x245a
+#define KSC_RIEUL_PIEUP_SIOS 0x245b
+#define KSC_RIEUL_PANSIOS 0x245c
+#define KSC_RIEUL_YEORINHIEUH 0x245d
+#define KSC_MIEUM_PIEUP 0x245e
+#define KSC_MIEUM_SIOS 0x245f
+#define KSC_MIEUM_PANSIOS 0x2460
+#define KSC_KAPYEOUNMIEUM 0x2461
+#define KSC_PIEUP_KIYEOK 0x2462
+#define KSC_PIEUP_TIKEUT 0x2463
+#define KSC_PIEUP_SIOS_KIYEOK 0x2464
+#define KSC_PIEUP_SIOS_TIKEUT 0x2465
+#define KSC_PIEUP_CIEUC 0x2466
+#define KSC_PIEUP_THIEUTH 0x2467
+#define KSC_KAPYEOUNPIEUP 0x2468
+#define KSC_KAPYEOUNSSANGPIEUP 0x2469
+#define KSC_SIOS_KIYEOK 0x246a
+#define KSC_SIOS_NIEUN 0x246b
+#define KSC_SIOS_TIKEUT 0x246c
+#define KSC_SIOS_PIEUP 0x246d
+#define KSC_SIOS_CIEUC 0x246e
+#define KSC_PANSIOS 0x246f
+#define KSC_SSANGIEUNG 0x2470
+#define KSC_YESIEUNG 0x2471
+#define KSC_IEUNG_CIEUC 0x2472
+#define KSC_IEUNG_PANSIOS 0x2473
+#define KSC_KAPYEOUNPHIEUPH 0x2474
+#define KSC_SSANGHIEUH 0x2475
+#define KSC_YEORINHIEUH 0x2476
+#define KSC_YO_YA 0x2477
+#define KSC_YO_YAE 0x2478
+#define KSC_YO_I 0x2479
+#define KSC_YU_YEO 0x247a
+#define KSC_YU_YE 0x247b
+#define KSC_YU_I 0x247c
+#define KSC_ARAEA 0x247d
+#define KSC_ARAEA_I 0x247e
+
+/*
+ * Some jamos are not representable with KSC5601. These are ugly
+ * fallbacks:
+ *
+ * CHITUEUMSIOS: 0x233c (less than)
+ * CEONGCHITUEUMSIOS: 0x233e (greater than)
+ * CHITUEUMCIEUC 0x237b (left bracket)
+ * CEONGEUMCIEUC 0x237d (right bracket)
+ * CHITUEUMCHIEUCH 0x237b (left brace)
+ * CEONGEUMCHIEUCH 0x237d (right brace)
+ */
+#define KSC_CHITUEUMSIOS 0x233c
+#define KSC_CEONGCHITUEUMSIOS 0x233e
+#define KSC_CHITUEUMCIEUC 0x235b
+#define KSC_CEONGEUMCIEUC 0x235d
+#define KSC_CHITUEUMCHIEUCH 0x237b
+#define KSC_CEONGEUMCHIEUCH 0x237d
+
+static guint16 __jamo_to_ksc5601[0x100][3] =
+{
+ /*
+ * CHOSEONG
+ */
+ /* CHOSEONG 0x1100 -- 0x1112 : matched to each ksc5601 Jamos extactly. */
+ {KSC_KIYEOK, 0, 0},
+ {KSC_SSANGKIYEOK, 0, 0},
+ {KSC_NIEUN, 0, 0},
+ {KSC_TIKEUT, 0, 0},
+ {KSC_SSANGTIKEUT, 0, 0},
+ {KSC_RIEUL, 0, 0},
+ {KSC_MIEUM, 0, 0},
+ {KSC_PIEUP, 0, 0},
+ {KSC_SSANGPIEUP, 0, 0},
+ {KSC_SIOS, 0, 0},
+ {KSC_SSANGSIOS, 0, 0},
+ {KSC_IEUNG, 0, 0},
+ {KSC_CIEUC, 0, 0},
+ {KSC_SSANGCIEUC, 0, 0},
+ {KSC_CHIEUCH, 0, 0},
+ {KSC_KHIEUKH, 0, 0},
+ {KSC_THIEUTH, 0, 0},
+ {KSC_PHIEUPH, 0, 0},
+ {KSC_HIEUH, 0, 0},
+ /* Some of the following are representable as a glyph, the others not. */
+ {KSC_NIEUN, KSC_KIYEOK, 0},
+ {KSC_SSANGNIEUN, 0, 0},
+ {KSC_NIEUN_TIKEUT, 0, 0},
+ {KSC_NIEUN, KSC_PIEUP, 0},
+ {KSC_TIKEUT, KSC_KIYEOK, 0},
+ {KSC_RIEUL, KSC_NIEUN, 0},
+ {KSC_RIEUL, KSC_RIEUL, 0},
+ {KSC_RIEUL_HIEUH, 0, 0},
+ {KSC_RIEUL, KSC_IEUNG, 0},
+ {KSC_MIEUM_PIEUP, 0, 0},
+ {KSC_KAPYEOUNMIEUM, 0, 0},
+ {KSC_PIEUP_KIYEOK, 0, 0},
+ {KSC_PIEUP, KSC_NIEUN, 0},
+ {KSC_PIEUP_TIKEUT, 0, 0},
+ {KSC_PIEUP_SIOS, 0, 0},
+ {KSC_PIEUP_SIOS_KIYEOK, 0, 0},
+ {KSC_PIEUP_SIOS_TIKEUT, 0, 0},
+ {KSC_PIEUP, KSC_SIOS, KSC_PIEUP},
+ {KSC_PIEUP, KSC_SIOS, KSC_SIOS},
+ {KSC_PIEUP, KSC_SIOS, KSC_CIEUC},
+ {KSC_PIEUP_CIEUC, 0, 0},
+ {KSC_PIEUP, KSC_CHIEUCH, 0},
+ {KSC_PIEUP_THIEUTH, 0, 0},
+ {KSC_PIEUP, KSC_PHIEUPH, 0},
+ {KSC_KAPYEOUNPIEUP, 0, 0},
+ {KSC_KAPYEOUNSSANGPIEUP, 0, 0},
+ {KSC_SIOS_KIYEOK, 0, 0},
+ {KSC_SIOS_NIEUN, 0, 0},
+ {KSC_SIOS_TIKEUT, 0, 0},
+ {KSC_SIOS, KSC_RIEUL, 0},
+ {KSC_SIOS, KSC_MIEUM, 0},
+ {KSC_SIOS_PIEUP, 0, 0},
+ {KSC_SIOS, KSC_PIEUP, KSC_KIYEOK},
+ {KSC_SIOS, KSC_SIOS, KSC_SIOS},
+ {KSC_SIOS, KSC_IEUNG, 0},
+ {KSC_SIOS_CIEUC, 0, 0},
+ {KSC_SIOS, KSC_CHIEUCH, 0},
+ {KSC_SIOS, KSC_KHIEUKH, 0},
+ {KSC_SIOS, KSC_THIEUTH, 0},
+ {KSC_SIOS, KSC_PHIEUPH, 0},
+ {KSC_SIOS, KSC_HIEUH, 0},
+ {KSC_CHITUEUMSIOS, 0, 0},
+ {KSC_CHITUEUMSIOS, KSC_CHITUEUMSIOS, 0},
+ {KSC_CEONGCHITUEUMSIOS, 0, 0},
+ {KSC_CEONGCHITUEUMSIOS, KSC_CEONGCHITUEUMSIOS, 0},
+ {KSC_PANSIOS, 0, 0},
+ {KSC_IEUNG, KSC_KIYEOK, 0},
+ {KSC_IEUNG, KSC_TIKEUT, 0},
+ {KSC_IEUNG, KSC_MIEUM, 0},
+ {KSC_IEUNG, KSC_PIEUP, 0},
+ {KSC_IEUNG, KSC_SIOS, 0},
+ {KSC_IEUNG_PANSIOS, 0, 0},
+ {KSC_SSANGIEUNG, 0, 0},
+ {KSC_IEUNG_CIEUC, 0, 0},
+ {KSC_IEUNG, KSC_CHIEUCH, 0},
+ {KSC_IEUNG, KSC_THIEUTH, 0},
+ {KSC_IEUNG, KSC_PHIEUPH, 0},
+ {KSC_YESIEUNG, 0, 0},
+ {KSC_CIEUC, KSC_IEUNG, 0},
+ {KSC_CHITUEUMCIEUC, 0, 0},
+ {KSC_CHITUEUMCIEUC, KSC_CHITUEUMCIEUC, 0},
+ {KSC_CEONGEUMCIEUC, 0, 0},
+ {KSC_CEONGEUMCIEUC, KSC_CEONGEUMCIEUC, 0},
+ {KSC_CHIEUCH, KSC_KHIEUKH, 0},
+ {KSC_CHIEUCH, KSC_HIEUH, 0},
+ {KSC_CHITUEUMCHIEUCH, 0, 0},
+ {KSC_CEONGEUMCHIEUCH, 0, 0},
+ {KSC_PHIEUPH, KSC_PIEUP, 0},
+ {KSC_KAPYEOUNPHIEUPH, 0, 0},
+ {KSC_SSANGHIEUH, 0, 0},
+ {KSC_YEORINHIEUH, 0, 0},
+ /* 0x115A ~ 0x115E -- reserved */
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ /* CHOSEONG FILLER */
+ {0, 0, 0},
+
+ /*
+ * JUNGSEONG
+ */
+ /*
+ * JUNGSEONG
+ */
+ {0, 0, 0}, /* JUNGSEONG FILL */
+ /* JUNGSEONG 0x1161 -- 0x1175 : matched to each ksc5601 Jamos extactly. */
+ {KSC_A, 0, 0},
+ {KSC_AE, 0, 0},
+ {KSC_YA, 0, 0},
+ {KSC_YAE, 0, 0},
+ {KSC_EO, 0, 0},
+ {KSC_E, 0, 0},
+ {KSC_YEO, 0, 0},
+ {KSC_YE, 0, 0},
+ {KSC_O, 0, 0},
+ {KSC_WA, 0, 0},
+ {KSC_WAE, 0, 0},
+ {KSC_OE, 0, 0},
+ {KSC_YO, 0, 0},
+ {KSC_U, 0, 0},
+ {KSC_WEO, 0, 0},
+ {KSC_WE, 0, 0},
+ {KSC_WI, 0, 0},
+ {KSC_YU, 0, 0},
+ {KSC_EU, 0, 0},
+ {KSC_YI, 0, 0},
+ {KSC_I, 0, 0},
+ /* Some of the following are representable as a glyph, the others not. */
+ {KSC_A, KSC_O, 0},
+ {KSC_A, KSC_U, 0},
+ {KSC_YA, KSC_O, 0},
+ {KSC_YA, KSC_YO, 0},
+ {KSC_EO, KSC_O, 0},
+ {KSC_EO, KSC_U, 0},
+ {KSC_EO, KSC_EU, 0},
+ {KSC_YEO, KSC_O, 0},
+ {KSC_YEO, KSC_U, 0},
+ {KSC_O, KSC_EO, 0},
+ {KSC_O, KSC_E, 0},
+ {KSC_O, KSC_YE, 0},
+ {KSC_O, KSC_O, 0},
+ {KSC_O, KSC_U, 0},
+ {KSC_YO_YA, 0, 0},
+ {KSC_YO_YAE, 0, 0},
+ {KSC_YO, KSC_YEO, 0},
+ {KSC_YO, KSC_O, 0},
+ {KSC_YO_I, 0, 0},
+ {KSC_U, KSC_A, 0},
+ {KSC_U, KSC_AE, 0},
+ {KSC_U, KSC_EO, KSC_EU},
+ {KSC_U, KSC_YE, 0},
+ {KSC_U, KSC_U, 0},
+ {KSC_YU, KSC_A, 0},
+ {KSC_YU, KSC_EO, 0},
+ {KSC_YU, KSC_E, 0},
+ {KSC_YU_YEO, 0, 0},
+ {KSC_YU_YE, 0, 0},
+ {KSC_YU, KSC_U, 0},
+ {KSC_YU_I, 0, 0},
+ {KSC_EU, KSC_U, 0},
+ {KSC_EU, KSC_EU, 0},
+ {KSC_YI, KSC_U, 0},
+ {KSC_I, KSC_A, 0},
+ {KSC_I, KSC_YA, 0},
+ {KSC_I, KSC_O, 0},
+ {KSC_I, KSC_U, 0},
+ {KSC_I, KSC_EU, 0},
+ {KSC_I, KSC_ARAEA, 0},
+ {KSC_ARAEA, 0, 0},
+ {KSC_ARAEA, KSC_EO, 0},
+ {KSC_ARAEA, KSC_U, 0},
+ {KSC_ARAEA, KSC_I, 0},
+ {KSC_ARAEA, KSC_ARAEA, 0},
+ /* 0x11A3 ~ 0x11A7 -- reserved */
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0}, /* (INTERNAL) JONGSEONG FILL */
+
+ /*
+ * JONGSEONG
+ */
+ {KSC_KIYEOK, 0, 0},
+ {KSC_SSANGKIYEOK, 0, 0},
+ {KSC_KIYEOK_SIOS, 0, 0},
+ {KSC_NIEUN, 0, 0},
+ {KSC_NIEUN_CIEUC, 0, 0},
+ {KSC_NIEUN_HIEUH, 0, 0},
+ {KSC_TIKEUT, 0, 0},
+ {KSC_RIEUL, 0, 0},
+ {KSC_RIEUL_KIYEOK, 0, 0},
+ {KSC_RIEUL_MIEUM, 0, 0},
+ {KSC_RIEUL_PIEUP, 0, 0},
+ {KSC_RIEUL_SIOS, 0, 0},
+ {KSC_RIEUL_TIKEUT, 0, 0},
+ {KSC_RIEUL_PHIEUPH, 0, 0},
+ {KSC_RIEUL_HIEUH, 0, 0},
+ {KSC_MIEUM, 0, 0},
+ {KSC_PIEUP, 0, 0},
+ {KSC_PIEUP_SIOS, 0, 0},
+ {KSC_SIOS, 0, 0},
+ {KSC_SSANGSIOS, 0, 0},
+ {KSC_IEUNG, 0, 0},
+ {KSC_CIEUC, 0, 0},
+ {KSC_CHIEUCH, 0, 0},
+ {KSC_KHIEUKH, 0, 0},
+ {KSC_THIEUTH, 0, 0},
+ {KSC_PHIEUPH, 0, 0},
+ {KSC_HIEUH, 0, 0},
+ {KSC_KIYEOK, KSC_RIEUL, 0},
+ {KSC_KIYEOK, KSC_SIOS, KSC_KIYEOK},
+ {KSC_NIEUN, KSC_KIYEOK, 0},
+ {KSC_NIEUN_TIKEUT, 0, 0},
+ {KSC_NIEUN_SIOS, 0, 0},
+ {KSC_NIEUN_PANSIOS, 0, 0},
+ {KSC_NIEUN, KSC_THIEUTH, 0},
+ {KSC_TIKEUT, KSC_KIYEOK, 0},
+ {KSC_TIKEUT, KSC_RIEUL, 0},
+ {KSC_RIEUL_KIYEOK_SIOS, 0, 0},
+ {KSC_RIEUL, KSC_NIEUN, 0},
+ {KSC_RIEUL_TIKEUT, 0, 0},
+ {KSC_RIEUL, KSC_TIKEUT, KSC_HIEUH},
+ {KSC_RIEUL, KSC_RIEUL, 0},
+ {KSC_RIEUL, KSC_MIEUM, KSC_KIYEOK},
+ {KSC_RIEUL, KSC_MIEUM, KSC_SIOS},
+ {KSC_RIEUL_PIEUP_SIOS, 0, 0},
+ {KSC_RIEUL, KSC_PHIEUPH, KSC_HIEUH},
+ {KSC_RIEUL, KSC_KAPYEOUNPIEUP, 0},
+ {KSC_RIEUL, KSC_SIOS, KSC_SIOS},
+ {KSC_RIEUL_PANSIOS, 0, 0},
+ {KSC_RIEUL, KSC_KHIEUKH, 0},
+ {KSC_RIEUL_YEORINHIEUH, 0, 0},
+ {KSC_MIEUM, KSC_KIYEOK, 0},
+ {KSC_MIEUM, KSC_RIEUL, 0},
+ {KSC_MIEUM_PIEUP, 0, 0},
+ {KSC_MIEUM_SIOS, 0, 0},
+ {KSC_MIEUM, KSC_SIOS, KSC_SIOS},
+ {KSC_MIEUM_PANSIOS, 0, 0},
+ {KSC_MIEUM, KSC_CHIEUCH, 0},
+ {KSC_MIEUM, KSC_HIEUH, 0},
+ {KSC_KAPYEOUNMIEUM, 0, 0},
+ {KSC_PIEUP, KSC_RIEUL, 0},
+ {KSC_PIEUP, KSC_PHIEUPH, 0},
+ {KSC_PIEUP, KSC_HIEUH, 0},
+ {KSC_KAPYEOUNPIEUP, 0, 0},
+ {KSC_SIOS_KIYEOK, 0, 0},
+ {KSC_SIOS_TIKEUT, 0, 0},
+ {KSC_SIOS, KSC_RIEUL, 0},
+ {KSC_SIOS_PIEUP, 0, 0},
+ {KSC_PANSIOS, 0, 0},
+ {KSC_IEUNG, KSC_KIYEOK, 0},
+ {KSC_IEUNG, KSC_KIYEOK, KSC_KIYEOK},
+ {KSC_SSANGIEUNG, 0, 0},
+ {KSC_IEUNG, KSC_KHIEUKH, 0},
+ {KSC_YESIEUNG, 0, 0},
+ {KSC_YESIEUNG, KSC_SIOS, 0},
+ {KSC_YESIEUNG, KSC_PANSIOS, 0},
+ {KSC_PHIEUPH, KSC_PIEUP, 0},
+ {KSC_KAPYEOUNPHIEUPH, 0, 0},
+ {KSC_HIEUH, KSC_NIEUN, 0},
+ {KSC_HIEUH, KSC_RIEUL, 0},
+ {KSC_HIEUH, KSC_MIEUM, 0},
+ {KSC_HIEUH, KSC_PIEUP, 0},
+ {KSC_YEORINHIEUH, 0, 0},
+ /* reserved */
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0}
+};
+