From 90046a56e8dbf1ee3931ce0caeb606a6f7d2dc45 Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Fri, 14 Jan 2011 14:14:33 +0100 Subject: Fix out of bounds handling in Mac shaper After ensure space, local QGlyphLayout variable should be updated to the moved address. stringToCMap returns true for success, so stringToCMapFailed should be the reverse of the return value. Out of bounds happened quite often in all situations using the QStackedTextEngine, because the memory allocated at the first time is usually not much, making it easier to trigger out of bounds in shaping. But it can also happen when using normal QTextLayout. Test it by comparing the width returned by normal QTextLayout and the width returned by QTextLayout created from QStackedTextEngine via QFontMetricsF. Task-number: QTBUG-16648 Reviewed-by: Eskil --- src/gui/text/qtextengine_mac.cpp | 5 +++-- tests/auto/qtextlayout/tst_qtextlayout.cpp | 12 +++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/gui/text/qtextengine_mac.cpp b/src/gui/text/qtextengine_mac.cpp index ce42241..c34bdb3 100644 --- a/src/gui/text/qtextengine_mac.cpp +++ b/src/gui/text/qtextengine_mac.cpp @@ -604,8 +604,9 @@ void QTextEngine::shapeTextMac(int item) const bool stringToCMapFailed = false; if (!fe->stringToCMap(str, len, &g, &num_glyphs, flags, log_clusters, attributes())) { ensureSpace(num_glyphs); - stringToCMapFailed = fe->stringToCMap(str, len, &g, &num_glyphs, flags, log_clusters, - attributes()); + g = availableGlyphs(&si); + stringToCMapFailed = !fe->stringToCMap(str, len, &g, &num_glyphs, flags, log_clusters, + attributes()); } if (!stringToCMapFailed) { diff --git a/tests/auto/qtextlayout/tst_qtextlayout.cpp b/tests/auto/qtextlayout/tst_qtextlayout.cpp index d6cf54c..0f1ff66 100644 --- a/tests/auto/qtextlayout/tst_qtextlayout.cpp +++ b/tests/auto/qtextlayout/tst_qtextlayout.cpp @@ -123,7 +123,7 @@ private slots: void testLineBreakingAllSpaces(); void lineWidthFromBOM(); void textWidthVsWIdth(); - + void textWidthWithStackedTextEngine(); private: QFont testFont; @@ -1388,6 +1388,16 @@ void tst_QTextLayout::textWidthVsWIdth() } } +void tst_QTextLayout::textWidthWithStackedTextEngine() +{ + QString text = QString::fromUtf8("คลิก ถัดไป เพื่อดำเนินการต่อ"); + QTextLayout layout(text); + layout.beginLayout(); + QTextLine line = layout.createLine(); + layout.endLayout(); + QFontMetricsF fm(layout.font()); + QCOMPARE(line.naturalTextWidth(), fm.width(text)); +} QTEST_MAIN(tst_QTextLayout) #include "tst_qtextlayout.moc" -- cgit v0.12