Fix assert on justification of QTextLine with only spaces

In the justification code, we unconditionally subtracted one
from the line_length, but then compared the result to 0 afterwards,
so we did not support when the line_length is 0 initially, which
can happen if it only consists of spaces (in which case
trailingSpaces will be non-zero and line_length will be zero.)
The fix is to bail out for both strings of length 1 and length 0.

[ChangeLog][Text] Fixed an assert when justifying a QTextLine
which only contains spaces.

Task-number: QTBUG-38520
Change-Id: Ib04993f47eb2f9f7fc49c4a5400f18f9682a72f2
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2014-04-29 09:06:08 +02:00 committed by The Qt Project
parent 12eb3b51c4
commit 7eae50a52d
2 changed files with 16 additions and 1 deletions

View File

@ -2057,7 +2057,7 @@ void QTextEngine::justify(const QScriptLine &line)
// subtract one char more, as we can't justfy after the last character
--line_length;
if (!line_length)
if (line_length <= 0)
return;
int firstItem = findItem(line.from);

View File

@ -122,6 +122,7 @@ private slots:
void boundingRectForUnsetLineWidth();
void boundingRectForSetLineWidth();
void glyphLessItems();
void justifyTrailingSpaces();
// QTextLine stuff
void setNumColumnsWrapAtWordBoundaryOrAnywhere();
@ -1996,5 +1997,19 @@ void tst_QTextLayout::cursorInNonStopChars()
QVERIFY(line.cursorToX(2) == line.cursorToX(3));
}
void tst_QTextLayout::justifyTrailingSpaces()
{
QTextLayout layout(QStringLiteral(" t"), testFont);
layout.setTextOption(QTextOption(Qt::AlignJustify));
layout.beginLayout();
QTextLine line = layout.createLine();
line.setLineWidth(5);
layout.endLayout();
QVERIFY(qFuzzyIsNull(layout.lineAt(0).cursorToX(0)));
}
QTEST_MAIN(tst_QTextLayout)
#include "tst_qtextlayout.moc"