Fix infinite layout loop with negative line width

Setting a negative line width does not make much sense, but in
earlier Qt versions, this work the same as if the line width was 0
(just give you the minimal layout given wrapping constraints).

But since 991c056438b311566bc4ea543af0f33dfd5dffbb, we check if
current width > line width at an earlier point, and because 0 > -1,
we would exit immediately before adding any characters to the text
line.

To restore the behavior in earlier versions, we set the minimum
possible line width to 0.

Fixes: QTBUG-109474
Change-Id: Iceadd5135681f61b30de8221853834983941c5a4
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Reviewed-by: hjk <hjk@qt.io>
(cherry picked from commit 49a63d375972079ae3000c8b7d512d58d4de32bb)
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2023-01-05 09:20:42 +01:00
parent c613c5ce22
commit 78416e0ca4
2 changed files with 13 additions and 4 deletions

View File

@ -1612,10 +1612,7 @@ void QTextLine::setLineWidth(qreal width)
return;
}
if (width > QFIXED_MAX)
width = QFIXED_MAX;
line.width = QFixed::fromReal(width);
line.width = QFixed::fromReal(qBound(0.0, width, qreal(QFIXED_MAX)));
if (line.length
&& line.textWidth <= line.width
&& line.from + line.length == eng->layoutData->string.size())

View File

@ -126,6 +126,7 @@ private slots:
void softHyphens();
void min_maximumWidth_data();
void min_maximumWidth();
void negativeLineWidth();
private:
QFont testFont;
@ -2715,5 +2716,16 @@ void tst_QTextLayout::min_maximumWidth()
}
}
void tst_QTextLayout::negativeLineWidth()
{
QTextLayout layout;
layout.setText("Foo bar");
layout.beginLayout();
QTextLine line = layout.createLine();
line.setLineWidth(-1);
QVERIFY(line.textLength() > 0);
layout.endLayout();
}
QTEST_MAIN(tst_QTextLayout)
#include "tst_qtextlayout.moc"