Fix crash when fallback font is not #0 in multi font engine
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Fri, 26 Aug 2011 06:07:20 +0000 (08:07 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 26 Aug 2011 12:29:46 +0000 (14:29 +0200)
Easily reproducible by testing Chinese with the threaded
renderer. The multi engine would then have a list of engines
with a single item, but the glyphs might belong to e.g. engine
11. In that case, engine() would assert when it couldn't find
the engine if the layout had been done in a different thread.
We force the loading of the required engine if it's not already
loaded.

Note that this fix does not work on Mac, as loadEngine() will
crash there, so the layout has to be done in the same thread
as the rendering, since loading the engines is part of the
layout process.

Task-number: QTBUG-21112
Change-Id: I71cc396664e3b95fbb4815a90873457e1f89528e
Reviewed-on: http://codereview.qt.nokia.com/3631
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
src/gui/text/qfontengine_p.h
src/gui/text/qtextlayout.cpp

index 5f779e1..e9a8d6f 100644 (file)
@@ -434,6 +434,11 @@ public:
     QFontEngine *engine(int at) const
     {Q_ASSERT(at < engines.size()); return engines.at(at); }
 
+    inline void ensureEngineAt(int at)
+    {
+        if (at >= engines.size() || engines.at(at) == 0)
+            loadEngine(at);
+    }
 
 protected:
     friend class QPSPrintEnginePrivate;
index 8c5e63d..d253c02 100644 (file)
@@ -2305,6 +2305,7 @@ QList<QGlyphRun> QTextLine::glyphRuns(int from, int length) const
                         continue;
 
                     QGlyphLayout subLayout = glyphLayout.mid(start, end - start);
+                    multiFontEngine->ensureEngineAt(which);
                     glyphRuns.append(glyphRunWithInfo(multiFontEngine->engine(which),
                                                       subLayout, pos, flags, x, width));
                     for (int i = 0; i < subLayout.numGlyphs; i++) {
@@ -2317,6 +2318,7 @@ QList<QGlyphRun> QTextLine::glyphRuns(int from, int length) const
                 }
 
                 QGlyphLayout subLayout = glyphLayout.mid(start, end - start);
+                multiFontEngine->ensureEngineAt(which);
                 QGlyphRun glyphRun = glyphRunWithInfo(multiFontEngine->engine(which),
                                                       subLayout, pos, flags, x, width);
                 if (!glyphRun.isEmpty())