diff src/w32term.c @ 97831:cdeb60ce9393

(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:57:31 +0000
parents 840bd675fd85
children 166909ca8be2
line wrap: on
line diff
--- a/src/w32term.c	Fri Aug 29 07:57:13 2008 +0000
+++ b/src/w32term.c	Fri Aug 29 07:57:31 2008 +0000
@@ -1341,6 +1341,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.  */
@@ -1350,9 +1351,9 @@
   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.  */
 
   SetTextColor (s->hdc, s->gc->foreground);
@@ -1363,67 +1364,66 @@
      first character of the composition could not be loaded.  */
   if (s->font_not_found_p)
     {
-      if (s->gidx == 0)
+      if (s->cmp_from == 0)
         w32_draw_rectangle (s->hdc, s->gc, x, s->y, s->width - 1,
                             s->height - 1);
     }
-  else
+  else if (! s->first_glyph->u.cmp.automatic)
     {
-      struct font *font = s->font;
       int y = s->ybase;
       int width = 0;
       HFONT old_font;
 
       old_font = SelectObject (s->hdc, FONT_HANDLE (font));
 
-      if (s->cmp->method == COMPOSITION_WITH_GLYPH_STRING)
+      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);
+	  }
+      SelectObject (s->hdc, old_font);
+    }
+  else
+    {
+      Lisp_Object gstring = composition_gstring_from_id (s->cmp_id);
+      Lisp_Object glyph;
+      int y = s->ybase;
+      int width = 0;
+      HFONT old_font;
+
+      old_font = SelectObject (s->hdc, FONT_HANDLE (font));
+
+      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);
+
       SelectObject (s->hdc, old_font);
     }
 }
@@ -2283,7 +2283,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);