]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix glyph string generation for multi-font compositions (Bug#26742)
authorYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Sun, 7 May 2017 23:20:53 +0000 (08:20 +0900)
committerYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Sun, 7 May 2017 23:20:53 +0000 (08:20 +0900)
* src/xdisp.c (glyph_string_containing_background_width): New function.
(draw_glyphs): Use it to get correct background width.
(compute_overhangs_and_x): Don't change x in the middle of composite
characters.

src/xdisp.c

index 41458c381769cb0d08b28baf55f1f33a7a60f10a..c730cdae05478eabc18e049abbba85e96fa05bb1 100644 (file)
@@ -25421,6 +25421,20 @@ set_glyph_string_background_width (struct glyph_string *s, int start, int last_x
 }
 
 
+/* Return glyph string that shares background with glyph string S and
+   whose `background_width' member has been set.  */
+
+static struct glyph_string *
+glyph_string_containing_background_width (struct glyph_string *s)
+{
+  if (s->cmp)
+    while (s->cmp_from)
+      s = s->prev;
+
+  return s;
+}
+
+
 /* Compute overhangs and x-positions for glyph string S and its
    predecessors, or successors.  X is the starting x-position for S.
    BACKWARD_P means process predecessors.  */
@@ -25434,7 +25448,8 @@ compute_overhangs_and_x (struct glyph_string *s, int x, bool backward_p)
        {
          if (FRAME_RIF (s->f)->compute_glyph_string_overhangs)
            FRAME_RIF (s->f)->compute_glyph_string_overhangs (s);
-         x -= s->width;
+         if (!s->cmp || s->cmp_to == s->cmp->glyph_len)
+           x -= s->width;
          s->x = x;
          s = s->prev;
        }
@@ -25446,7 +25461,8 @@ compute_overhangs_and_x (struct glyph_string *s, int x, bool backward_p)
          if (FRAME_RIF (s->f)->compute_glyph_string_overhangs)
            FRAME_RIF (s->f)->compute_glyph_string_overhangs (s);
          s->x = x;
-         x += s->width;
+         if (!s->cmp || s->cmp_to == s->cmp->glyph_len)
+           x += s->width;
          s = s->next;
        }
     }
@@ -25778,7 +25794,10 @@ draw_glyphs (struct window *w, int x, struct glyph_row *row,
   USE_SAFE_ALLOCA;
   BUILD_GLYPH_STRINGS (i, end, head, tail, hl, x, last_x);
   if (tail)
-    x_reached = tail->x + tail->background_width;
+    {
+      s = glyph_string_containing_background_width (tail);
+      x_reached = s->x + s->background_width;
+    }
   else
     x_reached = x;
 
@@ -25933,6 +25952,9 @@ draw_glyphs (struct window *w, int x, struct glyph_row *row,
          compute_overhangs_and_x (h, tail->x + tail->width, false);
          append_glyph_string_lists (&head, &tail, h, t);
        }
+      tail = glyph_string_containing_background_width (tail);
+      if (clip_tail)
+       clip_tail = glyph_string_containing_background_width (clip_tail);
       if (clip_head || clip_tail)
        for (s = head; s; s = s->next)
          {