summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2023-01-05 09:20:42 +0100
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2023-01-09 14:48:39 +0100
commit49a63d375972079ae3000c8b7d512d58d4de32bb (patch)
treee883fb63190841683555910c2c428752b44a9cc1
parent07a978c756cba6953bf81497fa3a386793652242 (diff)
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. Pick-to: 6.5 Fixes: QTBUG-109474 Change-Id: Iceadd5135681f61b30de8221853834983941c5a4 Reviewed-by: Lars Knoll <lars@knoll.priv.no> Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--src/gui/text/qtextlayout.cpp5
-rw-r--r--tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp12
2 files changed, 13 insertions, 4 deletions
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index 6eaefc945c..7807cfb12d 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -1611,10 +1611,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())
diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
index 9e6daf81b1..cf835fe245 100644
--- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
@@ -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"