emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/dispnew.c,v


From: Chong Yidong
Subject: [Emacs-diffs] Changes to emacs/src/dispnew.c,v
Date: Thu, 09 Oct 2008 16:41:19 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Chong Yidong <cyd>      08/10/09 16:41:18

Index: dispnew.c
===================================================================
RCS file: /sources/emacs/emacs/src/dispnew.c,v
retrieving revision 1.422
retrieving revision 1.423
diff -u -b -r1.422 -r1.423
--- dispnew.c   4 Oct 2008 15:25:16 -0000       1.422
+++ dispnew.c   9 Oct 2008 16:41:17 -0000       1.423
@@ -4475,6 +4475,7 @@
       struct glyph *desired_glyph = desired_row->glyphs[TEXT_AREA];
       int overlapping_glyphs_p = current_row->contains_overlapping_glyphs_p;
       int desired_stop_pos = desired_row->used[TEXT_AREA];
+      int abort_skipping = 0;
 
       /* If the desired row extends its face to the text area end, and
         unless the current row also does so at the same position,
@@ -4494,7 +4495,7 @@
         in common.  */
       while (i < stop)
        {
-         int can_skip_p = 1;
+         int can_skip_p = !abort_skipping;
 
          /* Skip over glyphs that both rows have in common.  These
             don't have to be written.  We can't skip if the last
@@ -4511,11 +4512,13 @@
 
              rif->get_glyph_overhangs (glyph, XFRAME (w->frame),
                                        &left, &right);
-             can_skip_p = right == 0;
+             can_skip_p = (right == 0 && !abort_skipping);
            }
 
          if (can_skip_p)
            {
+             int start_hpos = i;
+
              while (i < stop
                     && GLYPH_EQUAL_P (desired_glyph, current_glyph))
                {
@@ -4547,6 +4550,12 @@
                      x -= desired_glyph->pixel_width;
                      left -= desired_glyph->pixel_width;
                    }
+
+                 /* Abort the skipping algorithm if we end up before
+                    our starting point, to avoid looping (bug#1070).
+                    This can happen when the lbearing is larger than
+                    the pixel width.  */
+                 abort_skipping = (i < start_hpos);
                }
            }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]