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:
parent
1db99a6250
commit
98c1eb1750
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user