commit 894ae19224d0537c0c9ebd9ad45e547279769bd8
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Wed Jan 3 18:28:55 2018 +0100
Remove 'premature optimization' that proved buggy
At some time it seemed like a good idea in breakRow() to return early
when the row was bound to be empty. It turns out that this creates two
symptoms:
* empty paragraphs will not have an end of paragraph marker
* since row width is not correctly computed in this case, caret ghosts
can appear in master.
This commit removes the oprimization and replace the do {} while()
construct to a straightforward while() {}.
Related to bug #10952.
(cherry picked from commit 76f0a3dd4ee5c7958c6dea79628ef8c2ac2c59bd)
---
src/TextMetrics.cpp | 12 ++----------
1 files changed, 2 insertions(+), 10 deletions(-)
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 6c5a322..6205144 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -834,11 +834,6 @@ bool TextMetrics::breakRow(Row & row, int const
right_margin) const
// the width available for the row.
int const width = max_width_ - row.right_margin;
- if (pos >= end || row.width() > width) {
- row.endpos(end);
- return need_new_row;
- }
-
#if 0
//FIXME: As long as leftMargin() is not correctly implemented for
// MARGIN_RIGHT_ADDRESS_BOX, we should also not do this here.
@@ -857,10 +852,7 @@ bool TextMetrics::breakRow(Row & row, int const
right_margin) const
// or the end of the par, then build a representation of the row.
pos_type i = pos;
FontIterator fi = FontIterator(*this, par, row.pit(), pos);
- do {
- // this can happen for an empty row after a newline
- if (i >= end)
- break;
+ while (i < end && row.width() <= width) {
char_type c = par.getChar(i);
// The most special cases are handled first.
if (par.isInset(i)) {
@@ -942,7 +934,7 @@ bool TextMetrics::breakRow(Row & row, int const
right_margin) const
++i;
++fi;
- } while (i < end && row.width() <= width);
+ }
row.finalizeLast();
row.endpos(i);