Avoid endless loop when the window is too narrow

* breakRow: remove wrong condition that would silently eat the contents of the
   paragraph when the window is narrower than left margin

 * breakRow: make sure that there is at least one element in each row

 * breakAt: when force-breaking a row element, make sure it is not empty. Doing
   so may create empty rows and therefore a endless loop.

Fixes bugs #9962 and #10001.
This commit is contained in:
Jean-Marc Lasgouttes 2016-03-02 23:59:40 +01:00
parent 7d163d4e78
commit 8009edd3d4
2 changed files with 4 additions and 4 deletions

View File

@ -803,7 +803,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
// the width available for the row. // the width available for the row.
int const width = max_width_ - row.right_margin; int const width = max_width_ - row.right_margin;
if (pos >= end || row.width() > width) { if (pos >= end) {
row.endpos(end); row.endpos(end);
return; return;
} }
@ -828,7 +828,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
// or the end of the par, then build a representation of the row. // or the end of the par, then build a representation of the row.
pos_type i = pos; pos_type i = pos;
FontIterator fi = FontIterator(*this, par, pit, pos); FontIterator fi = FontIterator(*this, par, pit, pos);
while (i < end && row.width() <= width) { do {
char_type c = par.getChar(i); char_type c = par.getChar(i);
// The most special cases are handled first. // The most special cases are handled first.
if (par.isInset(i)) { if (par.isInset(i)) {
@ -893,7 +893,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
++i; ++i;
++fi; ++fi;
} } while (i < end && row.width() <= width);
row.finalizeLast(); row.finalizeLast();
row.endpos(i); row.endpos(i);

View File

@ -240,7 +240,7 @@ bool GuiFontMetrics::breakAt(docstring & s, int & x, bool const rtl, bool const
line.setLineWidth(x); line.setLineWidth(x);
tl.createLine(); tl.createLine();
tl.endLayout(); tl.endLayout();
if (int(line.naturalTextWidth()) > x) if ((force && line.textLength() == 1) || int(line.naturalTextWidth()) > x)
return false; return false;
x = int(line.naturalTextWidth()); x = int(line.naturalTextWidth());
// The -1 is here to account for the leading zerow_nbsp. // The -1 is here to account for the leading zerow_nbsp.