changeset 97834:7ef2445b45d7

(x_draw_composite_glyph_string_foreground): Adjusted for the change of struct glyph_string. (x_draw_glyph_string): Likewise.
author Kenichi Handa <handa@m17n.org>
date Fri, 29 Aug 2008 07:58:22 +0000
parents 6e54941ad0d7
children b67aebf29570
files src/xterm.c
diffstat 1 files changed, 37 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/src/xterm.c	Fri Aug 29 07:58:08 2008 +0000
+++ b/src/xterm.c	Fri Aug 29 07:58:22 2008 +0000
@@ -1312,6 +1312,7 @@
      struct glyph_string *s;
 {
   int i, j, x;
+  struct font *font = s->font;
 
   /* If first glyph of S has a left box line, start drawing the text
      of S to the right of that box line.  */
@@ -1321,73 +1322,66 @@
   else
     x = s->x;
 
-  /* S is a glyph string for a composition.  S->gidx is the index of
-     the first character drawn for glyphs of this composition.
-     S->gidx == 0 means we are drawing the very first character of
+  /* S is a glyph string for a composition.  S->cmp_from is the index
+     of the first character drawn for glyphs of this composition.
+     S->cmp_from == 0 means we are drawing the very first character of
      this composition.  */
 
   /* Draw a rectangle for the composition if the font for the very
      first character of the composition could not be loaded.  */
   if (s->font_not_found_p)
     {
-      if (s->gidx == 0)
+      if (s->cmp_from == 0)
 	XDrawRectangle (s->display, s->window, s->gc, x, s->y,
 			s->width - 1, s->height - 1);
     }
+  else if (! s->first_glyph->u.cmp.automatic)
+    {
+      int y = s->ybase;
+
+      for (i = 0, j = s->cmp_from; i < s->nchars; i++, j++)
+	if (COMPOSITION_GLYPH (s->cmp, j) != '\t')
+	  {
+	    int xx = x + s->cmp->offsets[j * 2];
+	    int yy = y - s->cmp->offsets[j * 2 + 1];
+
+	    font->driver->draw (s, j, j + 1, xx, yy, 0);
+	    if (s->face->overstrike)
+	      font->driver->draw (s, j, j + 1, xx + 1, yy, 0);
+	  }
+    }
   else
     {
-      struct font *font = s->font;
+      Lisp_Object gstring = composition_gstring_from_id (s->cmp_id);
+      Lisp_Object glyph;
       int y = s->ybase;
       int width = 0;
 
-      if (s->cmp->method == COMPOSITION_WITH_GLYPH_STRING)
+      for (i = j = s->cmp_from; i < s->cmp_to; i++)
 	{
-	  Lisp_Object gstring = AREF (XHASH_TABLE (composition_hash_table)
-				      ->key_and_value,
-				      s->cmp->hash_index * 2);
-	  int from;
-
-	  for (i = from = 0; i < s->nchars; i++)
+	  glyph = LGSTRING_GLYPH (gstring, i);
+	  if (NILP (LGLYPH_ADJUSTMENT (glyph)))
+	    width += LGLYPH_WIDTH (glyph);
+	  else
 	    {
-	      Lisp_Object g = LGSTRING_GLYPH (gstring, i);
-	      Lisp_Object adjustment = LGLYPH_ADJUSTMENT (g);
 	      int xoff, yoff, wadjust;
 
-	      if (! VECTORP (adjustment))
+	      if (j < i)
 		{
-		  width += LGLYPH_WIDTH (g);
-		  continue;
-		}
-	      if (from < i)
-		{
-		  font->driver->draw (s, from, i, x, y, 0);
+		  font->driver->draw (s, j, i, x, y, 0);
 		  x += width;
 		}
-	      xoff = XINT (AREF (adjustment, 0));
-	      yoff = XINT (AREF (adjustment, 1));
-	      wadjust = XINT (AREF (adjustment, 2));
-
+	      xoff = LGLYPH_XOFF (glyph);
+	      yoff = LGLYPH_YOFF (glyph);
+	      wadjust = LGLYPH_WADJUST (glyph);
 	      font->driver->draw (s, i, i + 1, x + xoff, y + yoff, 0);
 	      x += wadjust;
-	      from = i + 1;
+	      j = i + 1;
 	      width = 0;
 	    }
-	  if (from < i)
-	    font->driver->draw (s, from, i, x, y, 0);
 	}
-      else
-	{
-	  for (i = 0, j = s->gidx; i < s->nchars; i++, j++)
-	    if (COMPOSITION_GLYPH (s->cmp, j) != '\t')
-	      {
-		int xx = x + s->cmp->offsets[j * 2];
-		int yy = y - s->cmp->offsets[j * 2 + 1];
-
-		font->driver->draw (s, j, j + 1, xx, yy, 0);
-		if (s->face->overstrike)
-		  font->driver->draw (s, j, j + 1, xx + 1, yy, 0);
-	      }
-	}
+      if (j < i)
+	font->driver->draw (s, j, i, x, y, 0);
     }
 }
 
@@ -2701,7 +2695,8 @@
       break;
 
     case COMPOSITE_GLYPH:
-      if (s->for_overlaps || s->gidx > 0)
+      if (s->for_overlaps || (s->cmp_from > 0
+			      && ! s->first_glyph->u.cmp.automatic))
 	s->background_filled_p = 1;
       else
 	x_draw_glyph_string_background (s, 1);