Optimize Q*FontEngine*::stringToCMap()

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>
This commit is contained in:
Konstantin Ritt 2012-07-09 17:06:33 +03:00 committed by Qt by Nokia
parent 1db99a6250
commit 98c1eb1750
3 changed files with 14 additions and 6 deletions

View 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;
}

View 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;
}

View 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;
}