emacs-diffs
[Top][All Lists]
Advanced

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

emacs-27 a76cafe: Fix handling of FROM = t and TO = t by 'window-text-pi


From: Eli Zaretskii
Subject: emacs-27 a76cafe: Fix handling of FROM = t and TO = t by 'window-text-pixel-size'
Date: Fri, 8 May 2020 06:37:21 -0400 (EDT)

branch: emacs-27
commit a76cafea0d55cc8df2a2c3556a628dac83762d9a
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Fix handling of FROM = t and TO = t by 'window-text-pixel-size'
    
    * src/xdisp.c (Fwindow_text_pixel_size): Use byte position for
    accessing buffer text, not character positions.  (Bug#41125)
---
 src/xdisp.c | 53 ++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 38 insertions(+), 15 deletions(-)

diff --git a/src/xdisp.c b/src/xdisp.c
index 19f4f32..c15dd47 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -10442,7 +10442,7 @@ include the height of both, if present, in the return 
value.  */)
   struct buffer *b;
   struct it it;
   struct buffer *old_b = NULL;
-  ptrdiff_t start, end, pos;
+  ptrdiff_t start, end, bpos;
   struct text_pos startp;
   void *itdata = NULL;
   int c, max_x = 0, max_y = 0, x = 0, y = 0;
@@ -10457,32 +10457,56 @@ include the height of both, if present, in the return 
value.  */)
     }
 
   if (NILP (from))
-    start = BEGV;
+    {
+      start = BEGV;
+      bpos = BEGV_BYTE;
+    }
   else if (EQ (from, Qt))
     {
-      start = pos = BEGV;
-      while ((pos++ < ZV) && (c = FETCH_CHAR (pos))
-            && (c == ' ' || c == '\t' || c == '\n' || c == '\r'))
-       start = pos;
-      while ((pos-- > BEGV) && (c = FETCH_CHAR (pos)) && (c == ' ' || c == 
'\t'))
-       start = pos;
+      start = BEGV;
+      bpos = BEGV_BYTE;
+      while (bpos < ZV_BYTE)
+       {
+         FETCH_CHAR_ADVANCE (c, start, bpos);
+         if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r'))
+           break;
+       }
+      while (bpos > BEGV_BYTE)
+       {
+         DEC_BOTH (start, bpos);
+         c = FETCH_CHAR (bpos);
+         if (!(c == ' ' || c == '\t'))
+           break;
+       }
     }
   else
     {
       CHECK_FIXNUM_COERCE_MARKER (from);
       start = min (max (XFIXNUM (from), BEGV), ZV);
+      bpos = CHAR_TO_BYTE (start);
     }
 
+  SET_TEXT_POS (startp, start, bpos);
+
   if (NILP (to))
     end = ZV;
   else if (EQ (to, Qt))
     {
-      end = pos = ZV;
-      while ((pos-- > BEGV) && (c = FETCH_CHAR (pos))
-            && (c == ' ' || c == '\t' || c == '\n' || c == '\r'))
-       end = pos;
-      while ((pos++ < ZV) && (c = FETCH_CHAR (pos)) && (c == ' ' || c == '\t'))
-       end = pos;
+      end = ZV;
+      bpos = ZV_BYTE;
+      while (bpos > BEGV_BYTE)
+       {
+         DEC_BOTH (end, bpos);
+         c = FETCH_CHAR (bpos);
+         if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r'))
+           break;
+       }
+      while (bpos < ZV_BYTE)
+       {
+         FETCH_CHAR_ADVANCE (c, end, bpos);
+         if (!(c == ' ' || c == '\t'))
+           break;
+       }
     }
   else
     {
@@ -10499,7 +10523,6 @@ include the height of both, if present, in the return 
value.  */)
     max_y = XFIXNUM (y_limit);
 
   itdata = bidi_shelve_cache ();
-  SET_TEXT_POS (startp, start, CHAR_TO_BYTE (start));
   start_display (&it, w, startp);
   /* It makes no sense to measure dimensions of region of text that
      crosses the point where bidi reordering changes scan direction.



reply via email to

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