diff options
-rw-r--r-- | ChangeLog | 35 | ||||
-rw-r--r-- | ChangeLog.pre-1-10 | 35 | ||||
-rw-r--r-- | ChangeLog.pre-1-8 | 35 | ||||
-rw-r--r-- | modules/thai/Makefile.am | 2 | ||||
-rw-r--r-- | modules/thai/thai-charprop.c | 138 | ||||
-rw-r--r-- | modules/thai/thai-charprop.h | 98 | ||||
-rw-r--r-- | modules/thai/thai-fc.c | 30 | ||||
-rw-r--r-- | modules/thai/thai-ot.c | 92 | ||||
-rw-r--r-- | modules/thai/thai-shaper.c | 364 | ||||
-rw-r--r-- | modules/thai/thai-shaper.h | 4 |
10 files changed, 577 insertions, 256 deletions
@@ -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 |