summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorChangwoo Ryu <cwryu@debian.org>2004-04-17 16:17:57 +0000
committerChangwoo Ryu <cwryu@src.gnome.org>2004-04-17 16:17:57 +0000
commitfa764a7c02a2c4632749f85d37a192ad515e379e (patch)
treed58d96384867c3a93baaee63320c883d2be990a4 /modules
parent6b64bd1ac69d27c439da2ecef943ae61e4208c89 (diff)
downloadpango-fa764a7c02a2c4632749f85d37a192ad515e379e.tar.gz
handle non-Hangul unicode chars, fixes #129741, #137347.
2004-04-18 Changwoo Ryu <cwryu@debian.org> * modules/hangul/hangul-defs.h (IS_JAMO): * modules/hangul/hangul-fc.c (hangul_engine_shape, render_basic): handle non-Hangul unicode chars, fixes #129741, #137347.
Diffstat (limited to 'modules')
-rw-r--r--modules/hangul/hangul-defs.h1
-rw-r--r--modules/hangul/hangul-fc.c31
2 files changed, 27 insertions, 5 deletions
diff --git a/modules/hangul/hangul-defs.h b/modules/hangul/hangul-defs.h
index 2ddf339a..59ed4625 100644
--- a/modules/hangul/hangul-defs.h
+++ b/modules/hangul/hangul-defs.h
@@ -48,6 +48,7 @@
#define HTONE1 0x302E
#define HTONE2 0x302F
+#define IS_JAMO(wc) (wc >= LBASE && wc <= TEND)
#define IS_L(wc) (wc >= LBASE && wc <= LEND)
#define IS_V(wc) (wc >= VFILL && wc <= VEND)
#define IS_T(wc) (wc > TBASE && wc <= TEND)
diff --git a/modules/hangul/hangul-fc.c b/modules/hangul/hangul-fc.c
index c64d6de7..1e5b2229 100644
--- a/modules/hangul/hangul-fc.c
+++ b/modules/hangul/hangul-fc.c
@@ -1,7 +1,7 @@
/* Pango
* hangul-fc.c: Hangul shaper for FreeType based backends
*
- * Copyright (C) 2002 Changwoo Ryu
+ * Copyright (C) 2002-2004 Changwoo Ryu
* Author: Changwoo Ryu <cwryu@debian.org>
*
* This library is free software; you can redistribute it and/or
@@ -275,6 +275,21 @@ render_syllable (PangoFont *font, gunichar *text, int length,
render_tone(font, tone, glyphs, n_glyphs, cluster_offset);
}
+static void
+render_basic (PangoFont *font, gunichar wc,
+ PangoGlyphString *glyphs, int *n_glyphs, int cluster_offset)
+{
+ int index;
+ index = find_char (font, wc);
+ pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+ if (index)
+ set_glyph (font, glyphs, *n_glyphs, cluster_offset, index);
+ else
+ set_glyph (font, glyphs, *n_glyphs, cluster_offset,
+ get_unknown_glyph (font, wc));
+ (*n_glyphs)++;
+}
+
static void
hangul_engine_shape (PangoEngineShape *engine,
PangoFont *font,
@@ -307,13 +322,14 @@ hangul_engine_shape (PangoEngineShape *engine,
if (n_jamos)
{
gunichar prev = jamos[n_jamos - 1];
- if ((!IS_L (prev) && IS_S (wc)) ||
+ if ((!IS_JAMO (wc) && !IS_S (wc) && !IS_M (wc)) ||
+ (!IS_L (prev) && IS_S (wc)) ||
(IS_T (prev) && IS_L (wc)) ||
(IS_V (prev) && IS_L (wc)) ||
(IS_T (prev) && IS_V (wc)) ||
- IS_M(prev))
+ IS_M (prev))
{
- /* Draw a syllable. */
+ /* Draw a syllable with these jamos. */
render_syllable (font, jamos, n_jamos, glyphs,
&n_glyphs, start - text);
n_jamos = 0;
@@ -333,7 +349,12 @@ hangul_engine_shape (PangoEngineShape *engine,
jamos = g_renew (gunichar, jamos, max_jamos);
}
- if (IS_S (wc))
+ if (!IS_JAMO (wc) && !IS_S (wc) && !IS_M (wc))
+ {
+ render_basic (font, wc, glyphs, &n_glyphs, start - text);
+ start = g_utf8_next_char (p);
+ }
+ else if (IS_S (wc))
{
jamos[n_jamos++] = L_FROM_S (wc);
jamos[n_jamos++] = V_FROM_S (wc);