From 166e930d762b6f8f9c40d61678d4dac073d5a42e Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 1 May 2010 16:39:44 +0300 Subject: [PATCH] Fix display of truncated R2L lines on a TTY. xdisp.c (display_line): Fix prepending of truncation glyphs to R2L rows. (insert_left_trunc_glyphs): Support addition of left truncation glyphs to R2L rows. --- src/ChangeLog | 3 +++ src/xdisp.c | 71 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index a5548ff16fc..7becf77dde9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -4,6 +4,9 @@ (display_line): Use it. (extend_face_to_end_of_line): In almost-filled rows, extend only if the row is R2L and not continued. + (display_line): Fix prepending of truncation glyphs to R2L rows. + (insert_left_trunc_glyphs): Support addition of left truncation + glyphs to R2L rows. 2010-04-27 Eli Zaretskii diff --git a/src/xdisp.c b/src/xdisp.c index 45e6b83ec29..6d0683ba566 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -16739,24 +16739,61 @@ insert_left_trunc_glyphs (it) produce_special_glyphs (&truncate_it, IT_TRUNCATION); /* Overwrite glyphs from IT with truncation glyphs. */ - from = truncate_it.glyph_row->glyphs[TEXT_AREA]; - end = from + truncate_it.glyph_row->used[TEXT_AREA]; - to = it->glyph_row->glyphs[TEXT_AREA]; - toend = to + it->glyph_row->used[TEXT_AREA]; - - while (from < end) - *to++ = *from++; - - /* There may be padding glyphs left over. Overwrite them too. */ - while (to < toend && CHAR_GLYPH_PADDING_P (*to)) + if (!it->glyph_row->reversed_p) { from = truncate_it.glyph_row->glyphs[TEXT_AREA]; + end = from + truncate_it.glyph_row->used[TEXT_AREA]; + to = it->glyph_row->glyphs[TEXT_AREA]; + toend = to + it->glyph_row->used[TEXT_AREA]; + while (from < end) *to++ = *from++; + + /* There may be padding glyphs left over. Overwrite them too. */ + while (to < toend && CHAR_GLYPH_PADDING_P (*to)) + { + from = truncate_it.glyph_row->glyphs[TEXT_AREA]; + while (from < end) + *to++ = *from++; + } + + if (to > toend) + it->glyph_row->used[TEXT_AREA] = to - it->glyph_row->glyphs[TEXT_AREA]; } + else + { + /* In R2L rows, overwrite the last (rightmost) glyphs, and do + that back to front. */ + end = truncate_it.glyph_row->glyphs[TEXT_AREA]; + from = end + truncate_it.glyph_row->used[TEXT_AREA] - 1; + toend = it->glyph_row->glyphs[TEXT_AREA]; + to = toend + it->glyph_row->used[TEXT_AREA] - 1; + + while (from >= end && to >= toend) + *to-- = *from--; + while (to >= toend && CHAR_GLYPH_PADDING_P (*to)) + { + from = + truncate_it.glyph_row->glyphs[TEXT_AREA] + + truncate_it.glyph_row->used[TEXT_AREA] - 1; + while (from >= end && to >= toend) + *to-- = *from--; + } + if (from >= end) + { + /* Need to free some room before prepending additional + glyphs. */ + int move_by = from - end + 1; + struct glyph *g0 = it->glyph_row->glyphs[TEXT_AREA]; + struct glyph *g = g0 + it->glyph_row->used[TEXT_AREA] - 1; - if (to > toend) - it->glyph_row->used[TEXT_AREA] = to - it->glyph_row->glyphs[TEXT_AREA]; + for ( ; g >= g0; g--) + g[move_by] = *g; + while (from >= end) + *to-- = *from--; + it->glyph_row->used[TEXT_AREA] += move_by; + } + } } @@ -17938,10 +17975,14 @@ display_line (it) for (i = 0; i < row->used[TEXT_AREA]; i++) if (!CHAR_GLYPH_PADDING_P (row->glyphs[TEXT_AREA][i])) break; - /* Remove padding glyphs at the front of ROW, to + /* Remove any padding glyphs at the front of ROW, to make room for the truncation glyphs we will be - adding below. */ - unproduce_glyphs (it, i); + adding below. The loop below always inserts at + least one truncation glyph, so also remove the + last glyph added to ROW. */ + unproduce_glyphs (it, i + 1); + /* Adjust i for the loop below. */ + i = row->used[TEXT_AREA] - (i + 1); } for (n = row->used[TEXT_AREA]; i < n; ++i) -- 2.39.2