summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheppitak Karoonboonyanan <thep@linux.thai.net>2004-11-28 15:21:52 +0000
committerTheppitak Karoonboonyanan <tkaroonb@src.gnome.org>2004-11-28 15:21:52 +0000
commite1cf2a71ca777a6b4d8dd3cc1718174876a5864d (patch)
treea006f254ae654030157886102763ff4899b25aa3
parentedc5cfd22952ec366d567c425dc46bcbb037fc07 (diff)
downloadpango-e1cf2a71ca777a6b4d8dd3cc1718174876a5864d.tar.gz
Add Lao support to Thai module. (#156781)
2004-11-28 Theppitak Karoonboonyanan <thep@linux.thai.net> Add Lao support to Thai module. (#156781) * modules/thai/Makefile.am modules/thai/thai-shaper.[ch] +modules/thai/thai-charprop.[ch]: Split WTT tables into a separate source. Extend the tables for Lao. 3 new classes are added (AM for SaraAm, AD4 for Nikkhahit, BCON for Lao semivowels). Now the range 0x00-0x7f in TIS is used to store Lao characters. Rewrite ucs2tis() et al macros accordingly. * modules/thai/thai-shaper.c (get_next_cluster): Rewrite the clusterization code, so it's not specific to Thai-English texts. (Note that the special case of SaraAm is now handled by the new WTT character class. So, the extra checks are now eliminated.) * modules/thai/thai-shaper.c (get_glyphs_list, add_cluster): Add glyph calculation for Lao clusters. * modules/thai/thai-shaper.c (ThaiShapeTable structs, get_adjusted_glyphs_list): Generalize the shaping maps according to the new 8-bit internal encoding scheme. Now the character ranges are relocatable rather than hard-coded. Add Lao shaping table. * modules/thai/thai-shaper.c (get_adjusted_glyphs_list): Add special case for Lao, where clusters can be longer than those of Thai. * modules/thai/thai-fc.c (get_glyph_index_tis): Add Lao glyphs lookup. * modules/thai/thai-ot.c (thai_ot_shape, +lao_ot_get_ruleset): Add Lao OT rulesets retrieval. * modules/thai/thai-fc.c (PangoEngineScriptInfo thai_scripts[]): Add Lao script entry.
-rw-r--r--ChangeLog35
-rw-r--r--ChangeLog.pre-1-1035
-rw-r--r--ChangeLog.pre-1-835
-rw-r--r--modules/thai/Makefile.am2
-rw-r--r--modules/thai/thai-charprop.c138
-rw-r--r--modules/thai/thai-charprop.h98
-rw-r--r--modules/thai/thai-fc.c30
-rw-r--r--modules/thai/thai-ot.c92
-rw-r--r--modules/thai/thai-shaper.c364
-rw-r--r--modules/thai/thai-shaper.h4
10 files changed, 577 insertions, 256 deletions
diff --git a/ChangeLog b/ChangeLog
index 00cc7733..bf02009f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+2004-11-28 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ Add Lao support to Thai module. (#156781)
+
+ * modules/thai/Makefile.am modules/thai/thai-shaper.[ch]
+ +modules/thai/thai-charprop.[ch]: Split WTT tables into a separate
+ source. Extend the tables for Lao. 3 new classes are added (AM for
+ SaraAm, AD4 for Nikkhahit, BCON for Lao semivowels). Now the range
+ 0x00-0x7f in TIS is used to store Lao characters. Rewrite ucs2tis()
+ et al macros accordingly.
+
+ * modules/thai/thai-shaper.c (get_next_cluster): Rewrite the
+ clusterization code, so it's not specific to Thai-English texts. (Note
+ that the special case of SaraAm is now handled by the new WTT character
+ class. So, the extra checks are now eliminated.)
+
+ * modules/thai/thai-shaper.c (get_glyphs_list, add_cluster):
+ Add glyph calculation for Lao clusters.
+
+ * modules/thai/thai-shaper.c (ThaiShapeTable structs,
+ get_adjusted_glyphs_list): Generalize the shaping maps according to
+ the new 8-bit internal encoding scheme. Now the character ranges are
+ relocatable rather than hard-coded. Add Lao shaping table.
+
+ * modules/thai/thai-shaper.c (get_adjusted_glyphs_list): Add special
+ case for Lao, where clusters can be longer than those of Thai.
+
+ * modules/thai/thai-fc.c (get_glyph_index_tis): Add Lao glyphs lookup.
+
+ * modules/thai/thai-ot.c (thai_ot_shape, +lao_ot_get_ruleset): Add Lao
+ OT rulesets retrieval.
+
+ * modules/thai/thai-fc.c (PangoEngineScriptInfo thai_scripts[]):
+ Add Lao script entry.
+
Thu Nov 25 14:10:53 2004 Manish Singh <yosh@gimp.org>
* autogen.sh: rm autom4te.cache, since it might interfere with
diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10
index 00cc7733..bf02009f 100644
--- a/ChangeLog.pre-1-10
+++ b/ChangeLog.pre-1-10
@@ -1,3 +1,38 @@
+2004-11-28 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ Add Lao support to Thai module. (#156781)
+
+ * modules/thai/Makefile.am modules/thai/thai-shaper.[ch]
+ +modules/thai/thai-charprop.[ch]: Split WTT tables into a separate
+ source. Extend the tables for Lao. 3 new classes are added (AM for
+ SaraAm, AD4 for Nikkhahit, BCON for Lao semivowels). Now the range
+ 0x00-0x7f in TIS is used to store Lao characters. Rewrite ucs2tis()
+ et al macros accordingly.
+
+ * modules/thai/thai-shaper.c (get_next_cluster): Rewrite the
+ clusterization code, so it's not specific to Thai-English texts. (Note
+ that the special case of SaraAm is now handled by the new WTT character
+ class. So, the extra checks are now eliminated.)
+
+ * modules/thai/thai-shaper.c (get_glyphs_list, add_cluster):
+ Add glyph calculation for Lao clusters.
+
+ * modules/thai/thai-shaper.c (ThaiShapeTable structs,
+ get_adjusted_glyphs_list): Generalize the shaping maps according to
+ the new 8-bit internal encoding scheme. Now the character ranges are
+ relocatable rather than hard-coded. Add Lao shaping table.
+
+ * modules/thai/thai-shaper.c (get_adjusted_glyphs_list): Add special
+ case for Lao, where clusters can be longer than those of Thai.
+
+ * modules/thai/thai-fc.c (get_glyph_index_tis): Add Lao glyphs lookup.
+
+ * modules/thai/thai-ot.c (thai_ot_shape, +lao_ot_get_ruleset): Add Lao
+ OT rulesets retrieval.
+
+ * modules/thai/thai-fc.c (PangoEngineScriptInfo thai_scripts[]):
+ Add Lao script entry.
+
Thu Nov 25 14:10:53 2004 Manish Singh <yosh@gimp.org>
* autogen.sh: rm autom4te.cache, since it might interfere with
diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8
index 00cc7733..bf02009f 100644
--- a/ChangeLog.pre-1-8
+++ b/ChangeLog.pre-1-8
@@ -1,3 +1,38 @@
+2004-11-28 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ Add Lao support to Thai module. (#156781)
+
+ * modules/thai/Makefile.am modules/thai/thai-shaper.[ch]
+ +modules/thai/thai-charprop.[ch]: Split WTT tables into a separate
+ source. Extend the tables for Lao. 3 new classes are added (AM for
+ SaraAm, AD4 for Nikkhahit, BCON for Lao semivowels). Now the range
+ 0x00-0x7f in TIS is used to store Lao characters. Rewrite ucs2tis()
+ et al macros accordingly.
+
+ * modules/thai/thai-shaper.c (get_next_cluster): Rewrite the
+ clusterization code, so it's not specific to Thai-English texts. (Note
+ that the special case of SaraAm is now handled by the new WTT character
+ class. So, the extra checks are now eliminated.)
+
+ * modules/thai/thai-shaper.c (get_glyphs_list, add_cluster):
+ Add glyph calculation for Lao clusters.
+
+ * modules/thai/thai-shaper.c (ThaiShapeTable structs,
+ get_adjusted_glyphs_list): Generalize the shaping maps according to
+ the new 8-bit internal encoding scheme. Now the character ranges are
+ relocatable rather than hard-coded. Add Lao shaping table.
+
+ * modules/thai/thai-shaper.c (get_adjusted_glyphs_list): Add special
+ case for Lao, where clusters can be longer than those of Thai.
+
+ * modules/thai/thai-fc.c (get_glyph_index_tis): Add Lao glyphs lookup.
+
+ * modules/thai/thai-ot.c (thai_ot_shape, +lao_ot_get_ruleset): Add Lao
+ OT rulesets retrieval.
+
+ * modules/thai/thai-fc.c (PangoEngineScriptInfo thai_scripts[]):
+ Add Lao script entry.
+
Thu Nov 25 14:10:53 2004 Manish Singh <yosh@gimp.org>
* autogen.sh: rm autom4te.cache, since it might interfere with
diff --git a/modules/thai/Makefile.am b/modules/thai/Makefile.am
index d089a712..e8a33aaf 100644
--- a/modules/thai/Makefile.am
+++ b/modules/thai/Makefile.am
@@ -20,7 +20,7 @@ moduledir = $(libdir)/pango/$(PANGO_MODULE_VERSION)/modules
module_LTLIBRARIES =
noinst_LTLIBRARIES =
-common_sources = thai-shaper.c thai-shaper.h
+common_sources = thai-charprop.c thai-charprop.h thai-shaper.c thai-shaper.h
if HAVE_FREETYPE
diff --git a/modules/thai/thai-charprop.c b/modules/thai/thai-charprop.c
new file mode 100644
index 00000000..a9f7a056
--- /dev/null
+++ b/modules/thai/thai-charprop.c
@@ -0,0 +1,138 @@
+#include "thai-charprop.h"
+
+const gshort thai_char_type[256] = {
+ /* 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, A, B, C, D, E, F */
+
+ /* CL1 */
+ /*00*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ /*10*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+
+ /* Lao zone: [U+0E80..U+0EDF] */
+ /*20*/ _ND, _NC, _NC, _ND, _NC, _ND, _ND, _NC,
+ _NC, _ND, _NC, _ND, _ND, _NC, _ND, _ND,
+ /*30*/ _ND, _ND, _ND, _ND, _NC, _NC, _NC, _NC,
+ _ND, _NC, _NC, _UC, _NC, _UC, _NC, _UC,
+ /*40*/ _ND, _NC, _UC, _NC, _ND, _NC, _ND, _NC,
+ _ND, _ND, _NC, _NC, _ND, _NC, _NC, _ND,
+ /*50*/ _ND, _AV, _ND, _AM, _AV, _AV, _AV, _AV,
+ _BV, _BV, _ND, _AV, _BD, _NC, _ND, _ND,
+ /*60*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _AD,
+ _TN, _TN, _TN, _TN, _AD, _AD, _ND, _ND,
+ /*70*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ _ND, _ND, _ND, _ND, _NC, _NC, _ND, _ND,
+
+ /* CL2 */
+ /*80*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ /*90*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+
+ /* Thai zone: [U+0E00..U+0E5F] */
+ /*A0*/ _ND, _NC, _NC, _NC, _NC, _NC, _NC, _NC,
+ _NC, _NC, _NC, _NC, _NC, _SC, _BC, _BC,
+ /*B0*/ _SC, _NC, _NC, _NC, _NC, _NC, _NC, _NC,
+ _NC, _NC, _NC, _UC, _NC, _UC, _NC, _UC,
+ /*C0*/ _NC, _NC, _NC, _NC, _ND, _NC, _ND, _NC,
+ _NC, _NC, _NC, _NC, _UC, _NC, _NC, _ND,
+ /*D0*/ _ND, _AV, _ND, _AM, _AV, _AV, _AV, _AV,
+ _BV, _BV, _BD, _ND, _ND, _ND, _ND, _ND,
+ /*E0*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _AD,
+ _TN, _TN, _TN, _TN, _AD, _AD, _AD, _ND,
+ /*F0*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
+};
+
+const gshort thai_TAC_char_class[256] = {
+ /* 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, A, B, C, D, E, F */
+
+ /* CL1 */
+ /*00*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+ /*10*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+
+ /* Lao zone: [U+0E80..U+0EDF] */
+ /*20*/ NON,CONS,CONS, NON,CONS, NON, NON,CONS,
+ CONS, NON,CONS, NON, NON,CONS, NON, NON,
+ /*30*/ NON, NON, NON, NON,CONS,CONS,CONS,CONS,
+ NON,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
+ /*40*/ NON,CONS,CONS,CONS, NON,CONS, NON,CONS,
+ NON, NON,CONS,CONS, NON,CONS,CONS, NON,
+ /*50*/ FV1, AV2, FV1, AM, AV1, AV3, AV2, AV3,
+ BV1, BV2, NON, AV2,BCON, FV3, NON, NON,
+ /*60*/ LV, LV, LV, LV, LV, NON, NON, NON,
+ TONE,TONE,TONE,TONE, AD1, AD4, NON, NON,
+ /*70*/ NON, NON, NON, NON, NON, NON, NON, NON,
+ NON, NON, NON, NON,CONS,CONS, NON,CTRL,
+
+ /* CL2 */
+ /*80*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+ /*90*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
+
+ /* Thai zone: [U+0E00..U+0E5F] */
+ /*A0*/ NON,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
+ CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
+ /*B0*/ CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
+ CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
+ /*C0*/ CONS,CONS,CONS,CONS, FV3,CONS, FV3,CONS,
+ CONS,CONS,CONS,CONS,CONS,CONS,CONS, NON,
+ /*D0*/ FV1, AV2, FV1, AM, AV1, AV3, AV2, AV3,
+ BV1, BV2, BD, NON, NON, NON, NON, NON,
+ /*E0*/ LV, LV, LV, LV, LV, FV2, NON, AD2,
+ TONE,TONE,TONE,TONE, AD1, AD4, AD3, NON,
+ /*F0*/ NON, NON, NON, NON, NON, NON, NON, NON,
+ NON, NON, NON, NON, NON, NON, NON,CTRL,
+};
+
+const gchar thai_TAC_compose_input[20][20] = {
+ /* row: Cn-1, column: Cn */
+ /*CTRL NON CONS LV FV1 FV2 FV3 AM BV1 BV2
+ * BD TONE AD1 AD2 AD3 AD4 AV1 AV2 AV3 BCON*/
+/*CTRL*/{'X','A','A','A','A','A','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*NON */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*CONS*/{'X','A','A','A','A','S','A','C','C','C',
+ 'C','C','C','C','C','C','C','C','C','C'},
+/*LV */{'X','S','A','S','S','S','S','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*FV1 */{'X','A','A','A','A','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*FV2 */{'X','A','A','A','A','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*FV3 */{'X','A','A','A','S','A','S','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*AM */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*BV1 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','C','C','R','R','C','R','R','R','R'},
+/*BV2 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','C','R','R','R','R','R','R','R','R'},
+/*BD */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*TONE*/{'X','A','A','A','A','A','A','C','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*AD1 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*AD2 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*AD3 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','R','R','R','R','R','R','R','R','R'},
+/*AD4 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','C','R','R','R','R','R','R','R','R'},
+/*AV1 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','C','C','R','R','C','R','R','R','R'},
+/*AV2 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','C','R','R','R','R','R','R','R','R'},
+/*AV3 */{'X','A','A','A','S','S','A','R','R','R',
+ 'R','C','R','C','R','R','R','R','R','R'},
+/*BCON*/{'X','A','A','A','A','S','A','C','C','C',
+ 'R','C','R','R','R','C','C','C','C','R'},
+};
+
diff --git a/modules/thai/thai-charprop.h b/modules/thai/thai-charprop.h
new file mode 100644
index 00000000..38aec4c2
--- /dev/null
+++ b/modules/thai/thai-charprop.h
@@ -0,0 +1,98 @@
+/* Pango
+ * thai-charprop.h:
+ *
+ * Copyright (C) 1999 Red Hat Software
+ * Author: Owen Taylor <otaylor@redhat.com>
+ *
+ * Software and Language Engineering Laboratory, NECTEC
+ * Author: Theppitak Karoonboonyanan <thep@links.nectec.or.th>
+ *
+ * Copyright (c) 1996-2000 by Sun Microsystems, Inc.
+ * Author: Chookij Vanatham <Chookij.Vanatham@Eng.Sun.COM>
+ *
+ * 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.
+ */
+
+#ifndef __THAI_CHARPROP_H__
+#define __THAI_CHARPROP_H__
+
+#include <glib.h>
+
+#define isthai(wc) (0x0E00 <= (wc) && (wc) < 0x0E60)
+#define islao(wc) (0x0E80 <= (wc) && (wc) < 0x0EE0)
+/* ucs2tis()
+ * Lao: [0x0E80..0x0EDF] -> [0x20..0x7F]
+ * Thai: [0x0E00..0x0E5F] -> [0xA0..0xFF]
+ */
+#define ucs2tis(wc) (((wc) - 0x0E00 + 0x20)^0x80)
+
+/* Define TACTIS character classes */
+#define CTRL 0
+#define NON 1
+#define CONS 2
+#define LV 3
+#define FV1 4
+#define FV2 5
+#define FV3 6
+#define AM 7
+#define BV1 8
+#define BV2 9
+#define BD 10
+#define TONE 11
+#define AD1 12
+#define AD2 13
+#define AD3 14
+#define AD4 15
+#define AV1 16
+#define AV2 17
+#define AV3 18
+#define BCON 19
+
+#define _ND 0
+#define _NC 1
+#define _UC (1<<1)
+#define _BC (1<<2)
+#define _SC (1<<3)
+#define _AV (1<<4)
+#define _BV (1<<5)
+#define _TN (1<<6)
+#define _AD (1<<7)
+#define _BD (1<<8)
+#define _AM (1<<9)
+
+#define NoTailCons _NC
+#define UpTailCons _UC
+#define BotTailCons _BC
+#define SpltTailCons _SC
+#define Cons (NoTailCons|UpTailCons|BotTailCons|SpltTailCons)
+#define AboveVowel _AV
+#define BelowVowel _BV
+#define Tone _TN
+#define AboveDiac _AD
+#define BelowDiac _BD
+#define SaraAm _AM
+
+#define is_char_type(wc, mask) (thai_char_type[ucs2tis ((wc))] & (mask))
+#define TAC_char_class(wc) \
+ (isthai(wc)||islao(wc) ? thai_TAC_char_class[ucs2tis (wc)] : NON)
+#define TAC_compose_input(wc1,wc2) \
+ thai_TAC_compose_input[TAC_char_class(wc1)][TAC_char_class(wc2)]
+
+extern const gshort thai_char_type[256];
+extern const gshort thai_TAC_char_class[256];
+extern const gchar thai_TAC_compose_input[20][20];
+
+#endif /* __THAI_CHARPROP_H__ */
diff --git a/modules/thai/thai-fc.c b/modules/thai/thai-fc.c
index 8fa0a3e3..cb77a0b0 100644
--- a/modules/thai/thai-fc.c
+++ b/modules/thai/thai-fc.c
@@ -46,7 +46,8 @@ typedef PangoEngineShapeClass ThaiEngineFcClass ;
/* We handle the range U+0e01 to U+0e5b exactly
*/
static PangoEngineScriptInfo thai_scripts[] = {
- { PANGO_SCRIPT_THAI, "*" }
+ { PANGO_SCRIPT_THAI, "*" },
+ { PANGO_SCRIPT_LAO, "*" },
};
static PangoEngineInfo script_engines[] = {
@@ -117,6 +118,24 @@ static int tis620_2[128] = {
0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xf718, 0xf719, 0xf71a, 0
};
+static int lao_0[128] = {
+ /**/ 0, 0, 0, 0, 0, 0, 0, 0,
+ /**/ 0, 0, 0, 0, 0, 0, 0, 0,
+ /**/ 0, 0, 0, 0, 0, 0, 0, 0,
+ /**/ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0020, 0x0e81, 0x0e82, 0, 0x0e84, 0, 0, 0x0e87,
+ 0x0e88, 0, 0x0e8a, 0, 0, 0x0e8d, 0, 0,
+ 0, 0, 0, 0, 0x0e94, 0x0e95, 0x0e96, 0x0e97,
+ /**/ 0, 0x0e99, 0x0e9a, 0x0e9b, 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f,
+ /**/ 0, 0x0ea1, 0x0ea2, 0x0ea3, 0, 0x0ea5, 0, 0x0ea7,
+ /**/ 0, 0, 0x0eaa, 0x0eab, 0, 0x0ead, 0x0eae, 0x0eaf,
+ 0x0eb0, 0x0eb1, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7,
+ 0x0eb8, 0x0eb9, 0, 0x0ebb, 0x0ebc, 0x0ebd, 0, 0,
+ 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0, 0x0ec6, 0,
+ 0x0ec8, 0x0ec9, 0x0eca, 0x0ecb, 0x0ecc, 0x0ecd, 0, 0,
+ 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7,
+ 0x0ed8, 0x0ed9, 0, 0, 0x0edc, 0x0edd, 0, 0
+};
static int
contain_glyphs(PangoFont *font, const int glyph_map[128])
{
@@ -172,10 +191,13 @@ thai_get_font_info (PangoFont *font)
static gunichar
get_glyph_index_tis (ThaiFontInfo *font_info, guchar c)
{
+ if (!(c & 0x80))
+ return lao_0[c];
+
switch (font_info->font_set) {
- case THAI_FONT_TIS: return (c & 0x80) ? tis620_0[c & 0x7f] : c;
- case THAI_FONT_TIS_MAC: return (c & 0x80) ? tis620_1[c & 0x7f] : c;
- case THAI_FONT_TIS_WIN: return (c & 0x80) ? tis620_2[c & 0x7f] : c;
+ case THAI_FONT_TIS: return tis620_0[c & 0x7f];
+ case THAI_FONT_TIS_MAC: return tis620_1[c & 0x7f];
+ case THAI_FONT_TIS_WIN: return tis620_2[c & 0x7f];
default: return 0;
}
}
diff --git a/modules/thai/thai-ot.c b/modules/thai/thai-ot.c
index bd57b9b9..15956c4d 100644
--- a/modules/thai/thai-ot.c
+++ b/modules/thai/thai-ot.c
@@ -120,19 +120,93 @@ thai_ot_get_ruleset (PangoFont *font)
return ruleset;
}
+static PangoOTRuleset *
+lao_ot_get_ruleset (PangoFont *font)
+{
+ PangoFcFont *fc_font;
+ FT_Face face;
+ PangoOTInfo *info;
+ PangoOTRuleset *ruleset = NULL;
+
+ g_return_val_if_fail (font != NULL, NULL);
+
+ fc_font = PANGO_FC_FONT (font);
+ face = pango_fc_font_lock_face (fc_font);
+ g_assert (face != NULL);
+
+ info = pango_ot_info_get (face);
+ if (info != NULL)
+ {
+ static GQuark ruleset_quark = 0;
+
+ if (!ruleset_quark)
+ ruleset_quark = g_quark_from_string ("lao-ot-ruleset");
+
+ ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark);
+ if (!ruleset)
+ {
+ PangoOTTag thai_tag = FT_MAKE_TAG ('l', 'a', 'o', ' ');
+ guint script_index;
+ gint n = 0;
+
+ ruleset = pango_ot_ruleset_new (info);
+
+ if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GSUB,
+ thai_tag, &script_index))
+ {
+ n += maybe_add_gsub_feature (ruleset, info, script_index,
+ FT_MAKE_TAG ('c','c','m','p'),
+ 0xFFFF);
+ n += maybe_add_gsub_feature (ruleset, info, script_index,
+ FT_MAKE_TAG ('l','i','g','a'),
+ 0xFFFF);
+ }
+
+ if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GPOS,
+ thai_tag, &script_index))
+ {
+ n += maybe_add_gpos_feature (ruleset, info, script_index,
+ FT_MAKE_TAG ('k','e','r','n'),
+ 0xFFFF);
+ n += maybe_add_gpos_feature (ruleset, info, script_index,
+ FT_MAKE_TAG ('m','a','r','k'),
+ 0xFFFF);
+ n += maybe_add_gpos_feature (ruleset, info, script_index,
+ FT_MAKE_TAG ('m','k','m','k'),
+ 0xFFFF);
+ }
+
+ if (n > 0)
+ g_object_set_qdata_full (G_OBJECT (info), ruleset_quark, ruleset,
+ (GDestroyNotify)g_object_unref);
+ else
+ {
+ g_object_unref (ruleset);
+ ruleset = NULL;
+ }
+ }
+ }
+
+ pango_fc_font_unlock_face (fc_font);
+
+ return ruleset;
+}
+
void
thai_ot_shape (PangoFont *font,
PangoGlyphString *glyphs)
{
- PangoOTRuleset *ot_ruleset;
+ PangoOTRuleset *th_ruleset;
+ PangoOTRuleset *lo_ruleset;
g_return_if_fail (font != NULL);
g_return_if_fail (glyphs != NULL);
- ot_ruleset = thai_ot_get_ruleset (font);
+ th_ruleset = thai_ot_get_ruleset (font);
+ lo_ruleset = lao_ot_get_ruleset (font);
- if (ot_ruleset != NULL)
+ if (th_ruleset != NULL || lo_ruleset != NULL)
{
gint i;
PangoOTBuffer *buffer;
@@ -147,8 +221,16 @@ thai_ot_shape (PangoFont *font,
glyphs->log_clusters[i]);
}
- pango_ot_ruleset_substitute (ot_ruleset, buffer);
- pango_ot_ruleset_position (ot_ruleset, buffer);
+ if (th_ruleset != NULL)
+ {
+ pango_ot_ruleset_substitute (th_ruleset, buffer);
+ pango_ot_ruleset_position (th_ruleset, buffer);
+ }
+ if (lo_ruleset != NULL)
+ {
+ pango_ot_ruleset_substitute (lo_ruleset, buffer);
+ pango_ot_ruleset_position (lo_ruleset, buffer);
+ }
pango_ot_buffer_output (buffer, glyphs);
pango_ot_buffer_destroy (buffer);
diff --git a/modules/thai/thai-shaper.c b/modules/thai/thai-shaper.c
index 7c036e9a..74d1f275 100644
--- a/modules/thai/thai-shaper.c
+++ b/modules/thai/thai-shaper.c
@@ -31,221 +31,88 @@
#include <glib.h>
#include "pango-engine.h"
+#include "thai-charprop.h"
#include "thai-shaper.h"
#include "thai-ot.h"
#define MAX_CLUSTER_CHRS 256
#define MAX_GLYPHS 256
-/* Define TACTIS character classes */
-#define CTRL 0
-#define NON 1
-#define CONS 2
-#define LV 3
-#define FV1 4
-#define FV2 5
-#define FV3 6
-#define BV1 7
-#define BV2 8
-#define BD 9
-#define TONE 10
-#define AD1 11
-#define AD2 12
-#define AD3 13
-#define AV1 14
-#define AV2 15
-#define AV3 16
-
-#define _ND 0
-#define _NC 1
-#define _UC (1<<1)
-#define _BC (1<<2)
-#define _SC (1<<3)
-#define _AV (1<<4)
-#define _BV (1<<5)
-#define _TN (1<<6)
-#define _AD (1<<7)
-#define _BD (1<<8)
-#define _AM (1<<9)
-
-#define NoTailCons _NC
-#define UpTailCons _UC
-#define BotTailCons _BC
-#define SpltTailCons _SC
-#define Cons (NoTailCons|UpTailCons|BotTailCons|SpltTailCons)
-#define AboveVowel _AV
-#define BelowVowel _BV
-#define Tone _TN
-#define AboveDiac _AD
-#define BelowDiac _BD
-#define SaraAm _AM
-
-#define char_class(wc) TAC_char_class[(unsigned int)(wc)]
-#define is_char_type(wc, mask) (char_type_table[ucs2tis ((wc))] & (mask))
-
-static const gint char_type_table[256] = {
- /* 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, A, B, C, D, E, F */
-
- /*00*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*10*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*20*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*30*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*40*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*50*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*60*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*70*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*80*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- /*90*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
-
- /*A0*/ _ND, _NC, _NC, _NC, _NC, _NC, _NC, _NC,
- _NC, _NC, _NC, _NC, _NC, _SC, _BC, _BC,
- /*B0*/ _SC, _NC, _NC, _NC, _NC, _NC, _NC, _NC,
- _NC, _NC, _NC, _UC, _NC, _UC, _NC, _UC,
- /*C0*/ _NC, _NC, _NC, _NC, _ND, _NC, _ND, _NC,
- _NC, _NC, _NC, _NC, _UC, _NC, _NC, _ND,
- /*D0*/ _ND, _AV, _ND, _AM, _AV, _AV, _AV, _AV,
- _BV, _BV, _BD, _ND, _ND, _ND, _ND, _ND,
- /*E0*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _AD,
- _TN, _TN, _TN, _TN, _AD, _AD, _AD, _ND,
- /*F0*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
- _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND,
-};
-static const gint TAC_char_class[256] = {
- /* 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, A, B, C, D, E, F */
-
- /*00*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- /*10*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- /*20*/ NON, NON, NON, NON, NON, NON, NON, NON,
- NON, NON, NON, NON, NON, NON, NON, NON,
- /*30*/ NON, NON, NON, NON, NON, NON, NON, NON,
- NON, NON, NON, NON, NON, NON, NON, NON,
- /*40*/ NON, NON, NON, NON, NON, NON, NON, NON,
- NON, NON, NON, NON, NON, NON, NON, NON,
- /*50*/ NON, NON, NON, NON, NON, NON, NON, NON,
- NON, NON, NON, NON, NON, NON, NON, NON,
- /*60*/ NON, NON, NON, NON, NON, NON, NON, NON,
- NON, NON, NON, NON, NON, NON, NON, NON,
- /*70*/ NON, NON, NON, NON, NON, NON, NON, NON,
- NON, NON, NON, NON, NON, NON, NON,CTRL,
- /*80*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- /*90*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,
- /*A0*/ NON,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
- CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
- /*B0*/ CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
- CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS,
- /*C0*/ CONS,CONS,CONS,CONS, FV3,CONS, FV3,CONS,
- CONS,CONS,CONS,CONS,CONS,CONS,CONS, NON,
- /*D0*/ FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3,
- BV1, BV2, BD, NON, NON, NON, NON, NON,
- /*E0*/ LV, LV, LV, LV, LV, FV2, NON, AD2,
- TONE,TONE,TONE,TONE, AD1, AD1, AD3, NON,
- /*F0*/ NON, NON, NON, NON, NON, NON, NON, NON,
- NON, NON, NON, NON, NON, NON, NON,CTRL,
-};
+typedef struct {
+ guchar Start_TONE_AD, Start_AV, Start_BV_BD, Start_TailCutCons;
-static const gchar TAC_compose_and_input_check_type_table[17][17] = {
- /* Cn */ /* 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, A, B, C, D, E, F */
- /* Cn-1 00 */ { 'X', 'A', 'A', 'A', 'A', 'A', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* 10 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* 20 */ { 'X', 'A', 'A', 'A', 'A', 'S', 'A', 'C',
- 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C' },
- /* 30 */ {'X', 'S', 'A', 'S', 'S', 'S', 'S', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* 40 */ { 'X', 'S', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* 50 */ { 'X', 'A', 'A', 'A', 'A', 'S', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* 60 */ { 'X', 'A', 'A', 'A', 'S', 'A', 'S', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* 70 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'C', 'C', 'R', 'R', 'R', 'R', 'R' },
- /* 80 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'C', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* 90 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* A0 */ { 'X', 'A', 'A', 'A', 'A', 'A', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* B0 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* C0 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* D0 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' },
- /* E0 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'C', 'C', 'R', 'R', 'R', 'R', 'R' },
- /* F0 */ { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'C', 'R', 'R', 'R', 'R', 'R', 'R' },
- { 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R',
- 'R', 'R', 'C', 'R', 'C', 'R', 'R', 'R', 'R' }
-};
+ guchar ShiftDown_TONE_AD[8];
+ guchar ShiftDownLeft_TONE_AD[8];
+ guchar ShiftLeft_TONE_AD[8];
+ guchar ShiftLeft_AV[7];
+ guchar ShiftDown_BV_BD[3];
+ guchar TailCutCons[4];
-typedef struct {
- gint ShiftDown_TONE_AD[8];
- gint ShiftDownLeft_TONE_AD[8];
- gint ShiftLeft_TONE_AD[8];
- gint ShiftLeft_AV[7];
- gint ShiftDown_BV_BD[3];
- gint TailCutCons[4];
+ guchar AmComp[2]; /* Sara Am components */
} ThaiShapeTable;
-#define shiftdown_tone_ad(c,tbl) ((tbl)->ShiftDown_TONE_AD[(c)-0xE7])
-#define shiftdownleft_tone_ad(c,tbl) ((tbl)->ShiftDownLeft_TONE_AD[(c)-0xE7])
-#define shiftleft_tone_ad(c,tbl) ((tbl)->ShiftLeft_TONE_AD[(c)-0xE7])
-#define shiftleft_av(c,tbl) ((tbl)->ShiftLeft_AV[(c)-0xD1])
-#define shiftdown_bv_bd(c,tbl) ((tbl)->ShiftDown_BV_BD[(c)-0xD8])
-#define tailcutcons(c,tbl) ((tbl)->TailCutCons[(c)-0xAD])
+#define shiftdown_tone_ad(c,tbl) \
+ ((tbl)->ShiftDown_TONE_AD[(c)-(tbl)->Start_TONE_AD])
+#define shiftdownleft_tone_ad(c,tbl) \
+ ((tbl)->ShiftDownLeft_TONE_AD[(c)-(tbl)->Start_TONE_AD])
+#define shiftleft_tone_ad(c,tbl) \
+ ((tbl)->ShiftLeft_TONE_AD[(c)-(tbl)->Start_TONE_AD])
+#define shiftleft_av(c,tbl) \
+ ((tbl)->ShiftLeft_AV[(c)-(tbl)->Start_AV])
+#define shiftdown_bv_bd(c,tbl) \
+ ((tbl)->ShiftDown_BV_BD[(c)-(tbl)->Start_BV_BD])
+#define tailcutcons(c,tbl) \
+ ((tbl)->TailCutCons[(c)-(tbl)->Start_TailCutCons])
/* No adjusted vowel/tonemark glyphs (tis620-0)
*/
static const ThaiShapeTable tis620_0_shape_table = {
+ 0xE7, 0xD1, 0xD8, 0xAD,
{ 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE },
{ 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE },
{ 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE },
{ 0xD1, 0x00, 0x00, 0xD4, 0xD5, 0xD6, 0xD7 },
{ 0xD8, 0xD9, 0xDA },
- { 0xAD, 0x00, 0x00, 0xB0 }
+ { 0xAD, 0x00, 0x00, 0xB0 },
+ { 0xED, 0xD2 }
};
/* Macintosh
*/
static const ThaiShapeTable Mac_shape_table = {
+ 0xE7, 0xD1, 0xD8, 0xAD,
{ 0xE7, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0xED, 0xEE },
{ 0x93, 0x83, 0x84, 0x85, 0x86, 0x87, 0x8F, 0xEE },
{ 0x93, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x8F, 0xEE },
{ 0x92, 0x00, 0x00, 0x94, 0x95, 0x96, 0x97 },
{ 0xD8, 0xD9, 0xDA },
- { 0xAD, 0x00, 0x00, 0xB0 }
+ { 0xAD, 0x00, 0x00, 0xB0 },
+ { 0xED, 0xD2 }
};
/* Microsoft Window
*/
static const ThaiShapeTable Win_shape_table = {
+ 0xE7, 0xD1, 0xD8, 0xAD,
{ 0xE7, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0xED, 0xEE },
{ 0x9A, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x99, 0xEE },
{ 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x99, 0xEE },
{ 0x98, 0x00, 0x00, 0x81, 0x82, 0x83, 0x84 },
{ 0xFC, 0xFD, 0xFE },
- { 0x90, 0x00, 0x00, 0x80 }
+ { 0x90, 0x00, 0x00, 0x80 },
+ { 0xED, 0xD2 }
+};
+
+static const ThaiShapeTable Lao_shape_table = {
+ 0x67, 0x51, 0x58, 0x2D,
+ { 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E },
+ { 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E },
+ { 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E },
+ { 0x51, 0x00, 0x00, 0x54, 0x55, 0x56, 0x57 },
+ { 0x58, 0x59, 0x00 },
+ { 0x2D, 0x00, 0x00, 0x30 },
+ { 0x6D, 0x52 }
};
static void
@@ -297,7 +164,8 @@ get_adjusted_glyphs_list (ThaiFontInfo *font_info,
switch (num_chrs)
{
case 1:
- if (is_char_type (cluster[0], BelowVowel|BelowDiac|AboveVowel|AboveDiac|Tone))
+ if (is_char_type (cluster[0],
+ BelowVowel|BelowDiac|AboveVowel|AboveDiac|Tone|SaraAm))
{
gint n;
glyph_lists[0] = get_null_base_glyph (font_info);
@@ -320,8 +188,8 @@ get_adjusted_glyphs_list (ThaiFontInfo *font_info,
{
glyph_lists[0] =
thai_make_glyph_tis (font_info, ucs2tis (cluster[0]));
- glyph_lists[1] = thai_make_glyph_tis (font_info, 0xED);
- glyph_lists[2] = thai_make_glyph_tis (font_info, 0xD2);
+ glyph_lists[1] = thai_make_glyph_tis (font_info, shaping_table->AmComp[0]);
+ glyph_lists[2] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]);
return 3;
}
else if (is_char_type (cluster[0], UpTailCons) &&
@@ -330,8 +198,8 @@ get_adjusted_glyphs_list (ThaiFontInfo *font_info,
glyph_lists[0] =
thai_make_glyph_tis (font_info, ucs2tis (cluster[0]));
glyph_lists[1] = thai_make_glyph_tis (font_info,
- shiftleft_tone_ad (0xED, shaping_table));
- glyph_lists[2] = thai_make_glyph_tis (font_info, 0xD2);
+ shiftleft_tone_ad (shaping_table->AmComp[0], shaping_table));
+ glyph_lists[2] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]);
return 3;
}
else if (is_char_type (cluster[0], NoTailCons|BotTailCons|SpltTailCons) &&
@@ -418,10 +286,10 @@ get_adjusted_glyphs_list (ThaiFontInfo *font_info,
{
glyph_lists[0] =
thai_make_glyph_tis (font_info, ucs2tis (cluster[0]));
- glyph_lists[1] = thai_make_glyph_tis (font_info, 0xED);
+ glyph_lists[1] = thai_make_glyph_tis (font_info, shaping_table->AmComp[0]);
glyph_lists[2] =
thai_make_glyph_tis (font_info, ucs2tis (cluster[1]));
- glyph_lists[3] = thai_make_glyph_tis (font_info, 0xD2);
+ glyph_lists[3] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]);
return 4;
}
else if (is_char_type (cluster[0], UpTailCons) &&
@@ -431,10 +299,10 @@ get_adjusted_glyphs_list (ThaiFontInfo *font_info,
glyph_lists[0] =
thai_make_glyph_tis (font_info, ucs2tis (cluster[0]));
glyph_lists[1] = thai_make_glyph_tis (font_info,
- shiftleft_tone_ad (0xED, shaping_table));
+ shiftleft_tone_ad (shaping_table->AmComp[0], shaping_table));
glyph_lists[2] = thai_make_glyph_tis (font_info,
shiftleft_tone_ad (ucs2tis (cluster[1]), shaping_table));
- glyph_lists[3] = thai_make_glyph_tis (font_info, 0xD2);
+ glyph_lists[3] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]);
return 4;
}
else if (is_char_type (cluster[0], UpTailCons) &&
@@ -509,6 +377,14 @@ get_adjusted_glyphs_list (ThaiFontInfo *font_info,
return 3;
}
break;
+
+ default: /* e.g. Lao cluster with below cons + upper/lower vowel + tone */
+ {
+ gint i;
+ for (i = 0; i < num_chrs; i++)
+ glyph_lists[i] = thai_make_glyph_tis (font_info, ucs2tis (cluster[i]));
+ return num_chrs;
+ }
}
return 0;
@@ -522,30 +398,45 @@ get_glyphs_list (ThaiFontInfo *font_info,
{
gint i;
- switch (font_info->font_set)
+ switch (pango_script_for_unichar (cluster[0]))
{
- case THAI_FONT_NONE:
- for (i=0; i < num_chrs; i++)
- glyph_lists[i] = thai_make_unknown_glyph (font_info, glyph_lists[i]);
- return num_chrs;
-
- case THAI_FONT_TIS:
- /* TIS620-0 + Wtt2.0 Extension
- */
- return get_adjusted_glyphs_list (font_info, cluster,
- num_chrs, glyph_lists, &tis620_0_shape_table);
+ case PANGO_SCRIPT_THAI:
+ switch (font_info->font_set)
+ {
+ default:
+ case THAI_FONT_NONE:
+ for (i=0; i < num_chrs; i++)
+ glyph_lists[i] = thai_make_unknown_glyph (font_info, cluster[i]);
+ return num_chrs;
+
+ case THAI_FONT_TIS:
+ /* TIS620-0 + Wtt2.0 Extension
+ */
+ return get_adjusted_glyphs_list (font_info, cluster,
+ num_chrs, glyph_lists, &tis620_0_shape_table);
- case THAI_FONT_TIS_MAC:
- /* MacIntosh Extension
- */
- return get_adjusted_glyphs_list (font_info, cluster,
- num_chrs, glyph_lists, &Mac_shape_table);
+ case THAI_FONT_TIS_MAC:
+ /* MacIntosh Extension
+ */
+ return get_adjusted_glyphs_list (font_info, cluster,
+ num_chrs, glyph_lists, &Mac_shape_table);
- case THAI_FONT_TIS_WIN:
- /* Microsoft Extension
- */
+ case THAI_FONT_TIS_WIN:
+ /* Microsoft Extension
+ */
+ return get_adjusted_glyphs_list (font_info, cluster,
+ num_chrs, glyph_lists, &Win_shape_table);
+ }
+ break;
+
+ case PANGO_SCRIPT_LAO:
return get_adjusted_glyphs_list (font_info, cluster,
- num_chrs, glyph_lists, &Win_shape_table);
+ num_chrs, glyph_lists, &Lao_shape_table);
+
+ default:
+ for (i=0; i < num_chrs; i++)
+ glyph_lists[i] = thai_make_unknown_glyph (font_info, cluster[i]);
+ return num_chrs;
}
return 0; /* Quiet GCC */
@@ -562,27 +453,33 @@ add_cluster (ThaiFontInfo *font_info,
gint num_glyphs;
gint i;
- if (!isthai (cluster[0]))
+ if (isthai (cluster[0]))
{
- g_assert (num_chrs == 1);
- add_glyph (font_info, glyphs, cluster_start,
- thai_make_glyph_uni (font_info, cluster[0]),
- FALSE);
+ num_glyphs = get_glyphs_list(font_info, cluster, num_chrs, glyphs_list);
+ for (i=0; i<num_glyphs; i++)
+ add_glyph (font_info, glyphs, cluster_start, glyphs_list[i],
+ i == 0 ? FALSE : TRUE);
}
- else
+ else if (islao (cluster[0]))
{
num_glyphs = get_glyphs_list(font_info, cluster, num_chrs, glyphs_list);
for (i=0; i<num_glyphs; i++)
add_glyph (font_info, glyphs, cluster_start, glyphs_list[i],
i == 0 ? FALSE : TRUE);
}
+ else
+ {
+ g_assert (num_chrs == 1);
+ add_glyph (font_info, glyphs, cluster_start,
+ thai_make_glyph_uni (font_info, cluster[0]),
+ FALSE);
+ }
}
static gboolean
is_wtt_composible (gunichar cur_wc, gunichar nxt_wc)
{
- switch (TAC_compose_and_input_check_type_table[char_class (ucs2tis (cur_wc))]
- [char_class (ucs2tis (nxt_wc))])
+ switch (TAC_compose_input(cur_wc, nxt_wc))
{
case 'A':
case 'S':
@@ -603,40 +500,23 @@ get_next_cluster(const char *text,
gint length,
gunichar *cluster,
gint *num_chrs)
-{
+{
+ PangoScript cluster_script = PANGO_SCRIPT_INVALID_CODE, cur_script;
const char *p;
gint n_chars = 0;
+ gunichar current;
- p = text;
- while (p < text + length && n_chars < 3)
+ for (p = text; p < text + length; p = g_utf8_next_char (p))
{
- gunichar current = g_utf8_get_char (p);
-
- /* Non-thai characters get split into a single character cluster */
- if (!isthai (current))
- {
- if (n_chars == 0)
- {
- cluster[n_chars++] = current;
- p = g_utf8_next_char (p);
- }
- break;
- }
- else if (n_chars == 0 ||
- is_wtt_composible ((gunichar)(cluster[n_chars - 1]), current) ||
- (n_chars == 1 &&
- is_char_type (cluster[0], Cons) &&
- is_char_type (current, SaraAm)) ||
- (n_chars == 2 &&
- is_char_type (cluster[0], Cons) &&
- is_char_type (cluster[1], Tone) &&
- is_char_type (current, SaraAm)))
- {
- cluster[n_chars++] = current;
- p = g_utf8_next_char (p);
- }
- else
- break;
+ current = g_utf8_get_char (p);
+ cur_script = pango_script_for_unichar (current);
+ if (cluster_script == PANGO_SCRIPT_INVALID_CODE)
+ cluster_script = cur_script;
+ if (cur_script != cluster_script ||
+ (n_chars > 0 &&
+ !is_wtt_composible (cluster[n_chars - 1], current)))
+ break;
+ cluster[n_chars++] = current;
}
*num_chrs = n_chars;
diff --git a/modules/thai/thai-shaper.h b/modules/thai/thai-shaper.h
index f54814b8..09b8faef 100644
--- a/modules/thai/thai-shaper.h
+++ b/modules/thai/thai-shaper.h
@@ -1,10 +1,6 @@
#ifndef __THAI_SHAPER_H__
#define __THAI_SHAPER_H__
-#define isthai(wc) (wc >= 0xE00 && wc < 0xE80)
-#define ucs2tis(wc) (unsigned int)((unsigned int)(wc) - 0x0E00 + 0xA0)
-#define tis2uni(c) ((gunichar)(c) - 0xA0 + 0x0E00)
-
typedef struct _ThaiFontInfo ThaiFontInfo;
/* Font encodings we will use