Index: Makefile.am
===================================================================
RCS file: /cvs/gnome/pango/modules/thai/Makefile.am,v
retrieving revision 1.23
diff -u -r1.23 Makefile.am
--- Makefile.am	7 Jun 2004 08:06:44 -0000	1.23
+++ Makefile.am	2 Nov 2004 12:12:49 -0000
@@ -19,7 +19,7 @@
 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
Index: thai-charprop.c
===================================================================
RCS file: thai-charprop.c
diff -N thai-charprop.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ thai-charprop.c	2 Nov 2004 12:12:50 -0000
@@ -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'},
+};
+
Index: thai-charprop.h
===================================================================
RCS file: thai-charprop.h
diff -N thai-charprop.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ thai-charprop.h	2 Nov 2004 12:12:51 -0000
@@ -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__ */
Index: thai-fc.c
===================================================================
RCS file: /cvs/gnome/pango/modules/thai/thai-fc.c,v
retrieving revision 1.16
diff -u -r1.16 thai-fc.c
--- thai-fc.c	12 Oct 2004 12:14:43 -0000	1.16
+++ thai-fc.c	2 Nov 2004 12:12:52 -0000
@@ -46,7 +46,8 @@
 /* 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 @@
     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 @@
 static gunichar
 get_glyph_index_tis (ThaiFontInfo *font_info, guchar c)
 {
+  if (!(c & 0x80))
+    return lao_0[c & 0x7f];
+
   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;
   }
 }
Index: thai-ot.c
===================================================================
RCS file: /cvs/gnome/pango/modules/thai/thai-ot.c,v
retrieving revision 1.4
diff -u -r1.4 thai-ot.c
--- thai-ot.c	8 Oct 2004 06:14:51 -0000	1.4
+++ thai-ot.c	2 Nov 2004 12:12:53 -0000
@@ -120,19 +120,93 @@
   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 @@
 				     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);
Index: thai-shaper.c
===================================================================
RCS file: /cvs/gnome/pango/modules/thai/thai-shaper.c,v
retrieving revision 1.15
diff -u -r1.15 thai-shaper.c
--- thai-shaper.c	9 Oct 2004 05:37:47 -0000	1.15
+++ thai-shaper.c	2 Nov 2004 12:12:55 -0000
@@ -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 @@
   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 @@
 	  {
             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 @@
 	    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 @@
 	  {
             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 @@
 	    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 @@
 	    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 @@
 {
   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 @@
   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 @@
 		 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;
Index: thai-shaper.h
===================================================================
RCS file: /cvs/gnome/pango/modules/thai/thai-shaper.h,v
retrieving revision 1.12
diff -u -r1.12 thai-shaper.h
--- thai-shaper.h	12 Oct 2004 12:14:43 -0000	1.12
+++ thai-shaper.h	2 Nov 2004 12:12:55 -0000
@@ -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
