diff options
author | Owen Taylor <otaylor@src.gnome.org> | 2000-01-13 04:12:07 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-01-13 04:12:07 +0000 |
commit | 282fb5fc9f9d01c4d933a6eb6bee6ae9f0d512c7 (patch) | |
tree | 0b19c69692a2fe52a1b33d5e27c97b26a64417e3 /modules/hangul | |
parent | 66ae87f9fc45f5f564acf5014e9bd1341d052958 (diff) | |
download | pango-282fb5fc9f9d01c4d933a6eb6bee6ae9f0d512c7.tar.gz |
Initial revision
Diffstat (limited to 'modules/hangul')
-rw-r--r-- | modules/hangul/Makefile.am | 12 | ||||
-rw-r--r-- | modules/hangul/hangul-x.c | 759 | ||||
-rw-r--r-- | modules/hangul/hangul.c | 759 | ||||
-rw-r--r-- | modules/hangul/tables-johabfont.i | 608 | ||||
-rw-r--r-- | modules/hangul/tables-ksc5601.i | 708 |
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} +}; + |