From ba7e2113f393c90776113ece5e7acad456f8e07c Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 25 Mar 2016 10:16:33 +0100 Subject: [PATCH] Fix some display bugs related to end of paragraph markers There are two regressions that are fixed here: * empty rows at the end of a paragraph (think after newline at end of paragraph or empty line in Verbatim) do not have an end-of-par marker. This is fixed by removing the early return in breakRow and letting the whole function be executed. This requires to relax an assertion in Paragraph::fontSpan. It makes sense here to query position at the end of the paragraph. * a newline at the end of a paragraph will be followed by and end-of-par marker. This is fixed by skipping the end-of-par marker when a new row has been requested. --- src/Paragraph.cpp | 5 ++++- src/TextMetrics.cpp | 12 ++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 734d18a81c..9fe4de821d 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -1731,7 +1731,10 @@ Font const & Paragraph::getFontSettings(BufferParams const & bparams, FontSpan Paragraph::fontSpan(pos_type pos) const { - LBUFERR(pos < size()); + LBUFERR(pos <= size()); + + if (pos == size()) + return FontSpan(pos, pos); pos_type start = 0; FontList::const_iterator cit = d->fontlist_.begin(); diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index e9303503a7..52af39a682 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -791,6 +791,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit pos_type const pos = row.pos(); pos_type const body_pos = par.beginOfBody(); bool const is_rtl = text_->isRTL(par); + bool need_new_row = false; row.clear(); row.left_margin = leftMargin(max_width_, pit, pos); @@ -803,11 +804,6 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit // the width available for the row. int const width = max_width_ - row.right_margin; - if (pos >= end) { - row.endpos(end); - return; - } - ParagraphList const & pars = text_->paragraphs(); #if 0 @@ -829,6 +825,9 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit pos_type i = pos; FontIterator fi = FontIterator(*this, par, pit, pos); do { + // this can happen for an empty row after a newline + if (i >= end) + break; char_type c = par.getChar(i); // The most special cases are handled first. if (par.isInset(i)) { @@ -887,6 +886,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit || (!row.empty() && row.back().inset && row.back().inset->display())) { row.right_boundary(true); + need_new_row = par.isNewline(i); ++i; break; } @@ -898,7 +898,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit row.endpos(i); // End of paragraph marker - if (lyxrc.paragraph_markers + if (lyxrc.paragraph_markers && !need_new_row && i == end && size_type(pit + 1) < pars.size()) { // add a virtual element for the end-of-paragraph // marker; it is shown on screen, but does not exist -- 2.39.5