Optimize Q*FontEngine*::stringToCMap()
authorKonstantin Ritt <ritt.ks@gmail.com>
Mon, 9 Jul 2012 14:06:33 +0000 (17:06 +0300)
committerQt by Nokia <qt-info@nokia.com>
Tue, 10 Jul 2012 01:23:43 +0000 (03:23 +0200)
by avoiding the glyph metrics calculation when those metrics weren't requested
(QFontEngine::GlyphIndicesOnly flag has been passed).

As a side effect, this fixes a crash in case QGlyphLayout
was initialized only partially (with the glyphs array and the size).

Change-Id: I7d67abc2a74683131361fa21f8be203f61f247bc
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
src/gui/text/qfontengine.cpp
src/gui/text/qfontengine_qpa.cpp
src/gui/text/qfontengine_qpf.cpp

index 0f7efcc..e757102 100644 (file)
@@ -1190,8 +1190,7 @@ bool QFontEngineBox::stringToCMap(const QChar *, int len, QGlyphLayout *glyphs,
         return false;
     }
 
-    for (int i = 0; i < len; ++i)
-        glyphs->glyphs[i] = 0;
+    memset(glyphs->glyphs, 0, len * sizeof(HB_Glyph));
 
     *nglyphs = len;
     glyphs->numGlyphs = len;
@@ -1385,8 +1384,10 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len,
                 if (engine->type() == Box)
                     continue;
 
-                glyphs->advances_x[glyph_pos] = glyphs->advances_y[glyph_pos] = 0;
-                glyphs->offsets[glyph_pos] = QFixedPoint();
+                if (!(flags & GlyphIndicesOnly)) {
+                    glyphs->advances_x[glyph_pos] = glyphs->advances_y[glyph_pos] = 0;
+                    glyphs->offsets[glyph_pos] = QFixedPoint();
+                }
                 int num = 2;
                 QGlyphLayout offs = glyphs->mid(glyph_pos, num);
                 engine->stringToCMap(str + i, surrogate ? 2 : 1, &offs, &num, flags);
@@ -1411,6 +1412,7 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len,
 
     *nglyphs = ng;
     glyphs->numGlyphs = ng;
+
     return true;
 }
 
index af6620e..e56b30a 100644 (file)
@@ -383,7 +383,10 @@ bool QFontEngineQPA::stringToCMap(const QChar *str, int len, QGlyphLayout *glyph
 
     *nglyphs = glyph_pos;
     glyphs->numGlyphs = glyph_pos;
-    recalcAdvances(glyphs, flags);
+
+    if (!(flags & GlyphIndicesOnly))
+        recalcAdvances(glyphs, flags);
+
     return true;
 }
 
index 951be06..daa2c66 100644 (file)
@@ -592,7 +592,10 @@ bool QFontEngineQPF::stringToCMap(const QChar *str, int len, QGlyphLayout *glyph
 
     *nglyphs = glyph_pos;
     glyphs->numGlyphs = glyph_pos;
-    recalcAdvances(glyphs, flags);
+
+    if (!(flags & GlyphIndicesOnly))
+        recalcAdvances(glyphs, flags);
+
     return true;
 }