Skip to content

Commit

Permalink
Fix display of composed characters from L2R scripts in bidi buffers.
Browse files Browse the repository at this point in the history
 xdisp.c (set_iterator_to_next, next_element_from_composition): After
 advancing IT past the composition, resync the bidi iterator with 
 IT's position.  (Bug#5977)
  • Loading branch information
Eli-Zaretskii committed Apr 23, 2010
1 parent f079702 commit 9d9fe42
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/ChangeLog
Expand Up @@ -3,6 +3,9 @@
* xdisp.c (pop_it): When the stack is popped after displaying
from a string, bidi-iterate to exit from the text portion covered
by the `display' property or overlay. (Bug#5988, bug#5920)
(set_iterator_to_next, next_element_from_composition): Fix display
of composed characters from L2R scripts in bidi buffers.
(Bug#5977)

2010-04-23 Dan Nicolaescu <dann@ics.uci.edu>

Expand Down
20 changes: 19 additions & 1 deletion src/xdisp.c
Expand Up @@ -5309,7 +5309,7 @@ pop_it (it)
determine the paragraph base direction if the overlay we
just processed is at the beginning of a new
paragraph. */
if (it->bidi_it.first_elt)
if (it->bidi_it.first_elt && it->bidi_it.charpos < ZV)
bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
/* prev_stop can be zero, so check against BEGV as well. */
while (it->bidi_it.charpos >= BEGV
Expand Down Expand Up @@ -6274,6 +6274,15 @@ set_iterator_to_next (it, reseat_p)
{
IT_CHARPOS (*it) += it->cmp_it.nchars;
IT_BYTEPOS (*it) += it->cmp_it.nbytes;
if (it->bidi_p)
{
if (it->bidi_it.new_paragraph)
bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
/* Resync the bidi iterator with IT's new position.
FIXME: this doesn't support bidirectional text. */
while (it->bidi_it.charpos < IT_CHARPOS (*it))
bidi_get_next_char_visually (&it->bidi_it);
}
if (it->cmp_it.to < it->cmp_it.nglyphs)
it->cmp_it.from = it->cmp_it.to;
else
Expand Down Expand Up @@ -6995,6 +7004,15 @@ next_element_from_composition (it)
{
IT_CHARPOS (*it) += it->cmp_it.nchars;
IT_BYTEPOS (*it) += it->cmp_it.nbytes;
if (it->bidi_p)
{
if (it->bidi_it.new_paragraph)
bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
/* Resync the bidi iterator with IT's new position.
FIXME: this doesn't support bidirectional text. */
while (it->bidi_it.charpos < IT_CHARPOS (*it))
bidi_get_next_char_visually (&it->bidi_it);
}
return 0;
}
it->position = it->current.pos;
Expand Down

0 comments on commit 9d9fe42

Please sign in to comment.