From: Eli Zaretskii <eliz@gnu.org>
Date: Mon, 9 Nov 2020 15:22:25 +0000 (+0200)
Subject: Avoid breaking Arabic shaping in 'window-text-pixel-size'
X-Git-Tag: emacs-27.1.90~69
X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=13ab70c80e2e31fdf0a289c8e730a33a1cf5d6ae;p=emacs.git

Avoid breaking Arabic shaping in 'window-text-pixel-size'

* src/xdisp.c (CHAR_COMPOSED_P): If the bidi_p flag is not set,
pass -1 to composition_reseat_it, so that the shaping engine will
figure out the directionality of the text.  This is important,
e.g., when using move_it_* functions in some context that is not
redisplay, such as 'window-text-pixel-size'.  (Bug#44521)
---

diff --git a/src/xdisp.c b/src/xdisp.c
index 60864c2671c..ac706d08414 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -7221,14 +7221,21 @@ static next_element_function const get_next_element[NUM_IT_METHODS] =
 
 
 /* Return true iff a character at CHARPOS (and BYTEPOS) is composed
-   (possibly with the following characters).  */
+   (possibly with the following characters).
+
+  Note: we pass -1 as the "resolved bidi level" when the iterator
+  doesn't have the bidi_p flag set, because in that case we really
+  don't know what is the directionality of the text, so we leave it to
+  the shaping engine to figure that out.  */
 
 #define CHAR_COMPOSED_P(IT,CHARPOS,BYTEPOS,END_CHARPOS)			\
   ((IT)->cmp_it.id >= 0							\
    || ((IT)->cmp_it.stop_pos == (CHARPOS)				\
        && composition_reseat_it (&(IT)->cmp_it, CHARPOS, BYTEPOS,	\
 				 END_CHARPOS, (IT)->w,			\
-				 (IT)->bidi_it.resolved_level,		\
+				 (IT)->bidi_p				\
+				 ? (IT)->bidi_it.resolved_level		\
+				 : -1,					\
 				 FACE_FROM_ID_OR_NULL ((IT)->f,		\
 						       (IT)->face_id),	\
 				 (IT)->string)))