diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> | 2010-10-08 08:55:54 (GMT) |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> | 2010-10-08 10:22:22 (GMT) |
commit | 4cff91c66207b870e12365421e63cd978e162e64 (patch) | |
tree | aa878b35ba488e16131164d2d42ec160024648db /src/gui/text | |
parent | 4c9e2a4376a52891a21f75e2a441848234ed93c2 (diff) | |
download | Qt-4cff91c66207b870e12365421e63cd978e162e64.zip Qt-4cff91c66207b870e12365421e63cd978e162e64.tar.gz Qt-4cff91c66207b870e12365421e63cd978e162e64.tar.bz2 |
Fix infinite loop when justifying undisplayable Arabic text
If the Arabic text is for some reason undisplayable, e.g. because of
QTBUG-13132, the font engine will be unable to find the tatweel character
and the kashida width may be returned as 0. This would potentially cause
an infinite loop, as "need" would remain >= minKashida forever because
x - 0 is still >= 0.
Task-number: QTBUG-13130
Reviewed-by: Lars
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qtextengine.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 05de8f5..3bd6122 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -1949,9 +1949,11 @@ void QTextEngine::justify(const QScriptLine &line) if (kashida_pos >= 0) { // qDebug("kashida position at %d in word", kashida_pos); set(&justificationPoints[nPoints], kashida_type, g.mid(kashida_pos), fontEngine(si)); - minKashida = qMin(minKashida, justificationPoints[nPoints].kashidaWidth); - maxJustify = qMax(maxJustify, justificationPoints[nPoints].type); - ++nPoints; + if (justificationPoints[nPoints].kashidaWidth > 0) { + minKashida = qMin(minKashida, justificationPoints[nPoints].kashidaWidth); + maxJustify = qMax(maxJustify, justificationPoints[nPoints].type); + ++nPoints; + } } kashida_pos = -1; kashida_type = HB_Arabic_Normal; @@ -1975,9 +1977,11 @@ void QTextEngine::justify(const QScriptLine &line) } if (kashida_pos >= 0) { set(&justificationPoints[nPoints], kashida_type, g.mid(kashida_pos), fontEngine(si)); - minKashida = qMin(minKashida, justificationPoints[nPoints].kashidaWidth); - maxJustify = qMax(maxJustify, justificationPoints[nPoints].type); - ++nPoints; + if (justificationPoints[nPoints].kashidaWidth > 0) { + minKashida = qMin(minKashida, justificationPoints[nPoints].kashidaWidth); + maxJustify = qMax(maxJustify, justificationPoints[nPoints].type); + ++nPoints; + } } } |