commit 894ae19224d0537c0c9ebd9ad45e547279769bd8
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
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);
 

Reply via email to