diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 086a8dbefa2..bb4fb8d0834 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -1860,6 +1860,7 @@ void QTextLine::layout_helper(int maxGlyphs) bool manuallyWrapped = false; bool hasInlineObject = false; + bool reachedEndOfLine = false; QFixed maxInlineObjectHeight = 0; const bool includeTrailingSpaces = eng->option.flags() & QTextOption::IncludeTrailingSpaces; @@ -2087,6 +2088,7 @@ void QTextLine::layout_helper(int maxGlyphs) newItem = item + 1; } LB_DEBUG("reached end of line"); + reachedEndOfLine = true; lbh.checkFullOtherwiseExtend(line); line.textWidth += lbh.commitedSoftHyphenWidth; found: @@ -2097,6 +2099,7 @@ found: lbh.calculateRightBearing(); // Then apply any negative right bearing + const QFixed textWidthWithoutBearing = line.textWidth; line.textWidth += lbh.negativeRightBearing(); if (line.length == 0) { @@ -2168,7 +2171,11 @@ found: eng->maxWidth = qMax(eng->maxWidth, line.textWidth); } else { eng->minWidth = qMax(eng->minWidth, lbh.minw); - if (qAddOverflow(eng->layoutData->currentMaxWidth, line.textWidth, &eng->layoutData->currentMaxWidth)) + + const QFixed actualTextWidth = manuallyWrapped || reachedEndOfLine + ? line.textWidth + : textWidthWithoutBearing; + if (qAddOverflow(eng->layoutData->currentMaxWidth, actualTextWidth, &eng->layoutData->currentMaxWidth)) eng->layoutData->currentMaxWidth = QFIXED_MAX; if (!manuallyWrapped) { if (qAddOverflow(eng->layoutData->currentMaxWidth, lbh.spaceData.textWidth, &eng->layoutData->currentMaxWidth)) diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp index 5ef35c16e09..b7720a8ac56 100644 --- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp +++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp @@ -130,6 +130,7 @@ private slots: void negativeLineWidth(); void embeddedImageLineHeight(); void unmatchedShapedSubstring(); + void maximumLayoutWidthInWrappedLayout(); private: QFont testFont; @@ -2836,5 +2837,43 @@ void tst_QTextLayout::unmatchedShapedSubstring() QVERIFY(glyphRuns.size() > 0); } +void tst_QTextLayout::maximumLayoutWidthInWrappedLayout() +{ + QString s = QString::fromUtf8("Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + "Integer at ante dui Curabitur ante est, pulvinar quis adipiscing a, iaculis id ipsum. Nunc blandit\n" + "condimentum odio vel egestas. in ipsum lacinia sit amet\n" + "mattis orci interdum. Quisque vitae accumsan lectus. Ut nisi turpis,\n" + "sollicitudin ut dignissim id, fermentum ac est. Maecenas nec libero leo. Sed ac\n" + "mattis orci interdum. Quisque vitae accumsan lectus. Ut nisi turpis,\n" + "sollicitudin ut dignissim id, fermentum ac est. Maecenas nec libero leo. Sed ac\n" + "leo eget ipsum ultricies viverra sit amet eu orci. Praesent et tortor risus,\n" + "viverra accumsan sapien. Sed faucibus eleifend lectus, sed euismod urna porta\n" + "eu. Quisque vitae accumsan lectus."); + s.replace(QChar::LineFeed, QChar::LineSeparator); + + QTextLayout reference; + reference.setText(s); + reference.beginLayout(); + forever { + QTextLine line = reference.createLine(); + if (!line.isValid()) + break; + } + reference.endLayout(); + + QTextLayout breakByWidth; + breakByWidth.setText(s); + breakByWidth.beginLayout(); + forever { + QTextLine line = breakByWidth.createLine(); + if (!line.isValid()) + break; + line.setLineWidth(100); + } + breakByWidth.endLayout(); + + QCOMPARE(reference.maximumWidth(), breakByWidth.maximumWidth()); +} + QTEST_MAIN(tst_QTextLayout) #include "tst_qtextlayout.moc"