[Top][All Lists]
[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);
}
}