changeset 98124:629cccd78d85

(Ffont_shape_gstring): Make glyphs of non-nil adjustment compose a grapheme cluster with the preceding base glyph.
author Kenichi Handa <handa@m17n.org>
date Wed, 10 Sep 2008 05:54:09 +0000
parents c674ed7591e1
children 1ef10fc25cde
files src/font.c
diffstat 1 files changed, 27 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/font.c	Wed Sep 10 05:49:38 2008 +0000
+++ b/src/font.c	Wed Sep 10 05:54:09 2008 +0000
@@ -4224,7 +4224,7 @@
 {
   struct font *font;
   Lisp_Object font_object, n, glyph;
-  int i;
+  int i, j, from, to;
   
   if (! composition_gstring_p (gstring))
     signal_error ("Invalid glyph-string: ", gstring);
@@ -4250,23 +4250,42 @@
     return Qnil;
   
   glyph = LGSTRING_GLYPH (gstring, 0);
-  for (i = 1; i < LGSTRING_GLYPH_LEN (gstring); i++)
+  from = LGLYPH_FROM (glyph);
+  to = LGLYPH_TO (glyph);
+  for (i = 1, j = 0; i < LGSTRING_GLYPH_LEN (gstring); i++)
     {
       Lisp_Object this = LGSTRING_GLYPH (gstring, i);
 
       if (NILP (this))
 	break;
       if (NILP (LGLYPH_ADJUSTMENT (this)))
-	glyph = this;
+	{
+	  if (j < i - 1)
+	    for (; j < i; j++)
+	      {
+		glyph = LGSTRING_GLYPH (gstring, j);
+		LGLYPH_SET_FROM (glyph, from);
+		LGLYPH_SET_TO (glyph, to);
+	      }
+	  from = LGLYPH_FROM (this);
+	  to = LGLYPH_TO (this);
+	  j = i;
+	}
       else
 	{
-	  int from = LGLYPH_FROM (glyph);
-	  int to = LGLYPH_TO (glyph);
-
-	  LGLYPH_SET_FROM (this, from);
-	  LGLYPH_SET_TO (this, to);
+	  if (from > LGLYPH_FROM (this))
+	    from = LGLYPH_FROM (this);
+	  if (to < LGLYPH_TO (this))
+	    to = LGLYPH_TO (this);
 	}
     }
+  if (j < i - 1)
+    for (; j < i; j++)
+      {
+	glyph = LGSTRING_GLYPH (gstring, j);
+	LGLYPH_SET_FROM (glyph, from);
+	LGLYPH_SET_TO (glyph, to);
+      }
   return composition_gstring_put_cache (gstring, XINT (n));
 }