From f921c2e8ecbc8fd86e58fe9e2f78bb3effe21ef6 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 23 Jul 2015 11:59:51 +0200 Subject: [PATCH] Fix some row breaking problems with large insets When a row is too large due to a wide inset, it does not make sense to break text before if the problem is the same in the next row. Therefore give up breaking in this case. Note that this was explicitely taken care of in the old-world rowBreakPoint code. Fixes bug #9691. --- src/Row.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Row.cpp b/src/Row.cpp index a61e19f9f1..7108c3c2ad 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -404,7 +404,8 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) ++cit_brk; while (cit_brk != beg) { --cit_brk; - Element & brk = *cit_brk; + // make a copy of the element to work on it. + Element brk = *cit_brk; wid_brk -= brk.dim.wid; if (brk.countSeparators() == 0 || brk.pos < keep) continue; @@ -415,6 +416,15 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) * break-up. */ if (brk.breakAt(min(w - wid_brk, brk.dim.wid - 2), false)) { + /* if this element originally did not cause a row overflow + * in itself, and the remainder of the row would still be + * too large after breaking, then we will have issues in + * next row. Thus breaking does not help. + */ + if (wid_brk + cit_brk->dim.wid < w + && dim_.wid - (wid_brk + brk.dim.wid) >= w) { + break; + } end_ = brk.endpos; /* after breakAt, there may be spaces at the end of the * string, but they are not counted in the string length @@ -424,6 +434,7 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) */ brk.str = rtrim(brk.str); brk.endpos = brk.pos + brk.str.length(); + *cit_brk = brk; dim_.wid = wid_brk + brk.dim.wid; // If there are other elements, they should be removed. elements_.erase(cit_brk + 1, end); -- 2.39.2