Fix bounding box of zero-width entities in QFontEngineFT
Freetype can give us non empty bounds for zero-width characters, this change just makes us skip metrics of characters already found to not contribute to text advance. The coretext and windows font-engines already uses the already calculated advance. Change-Id: I82b3521a4fb92614be509be5982cd5ab9c1eb7de Fixes: QTBUG-58854 Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
parent
d32a6793a4
commit
25677ec4b2
@ -663,6 +663,9 @@ glyph_metrics_t QFontEngine::tightBoundingBox(const QGlyphLayout &glyphs)
|
||||
QFixed ymax = 0;
|
||||
QFixed xmax = 0;
|
||||
for (int i = 0; i < glyphs.numGlyphs; i++) {
|
||||
// If shaping has found this should be ignored, ignore it.
|
||||
if (!glyphs.advances[i] || glyphs.attributes[i].dontPrint)
|
||||
continue;
|
||||
glyph_metrics_t bb = boundingBox(glyphs.glyphs[i]);
|
||||
QFixed x = overall.xoff + glyphs.offsets[i].x + bb.x;
|
||||
QFixed y = overall.yoff + glyphs.offsets[i].y + bb.y;
|
||||
|
@ -1672,6 +1672,9 @@ glyph_metrics_t QFontEngineFT::boundingBox(const QGlyphLayout &glyphs)
|
||||
QFixed ymax = 0;
|
||||
QFixed xmax = 0;
|
||||
for (int i = 0; i < glyphs.numGlyphs; i++) {
|
||||
// If shaping has found this should be ignored, ignore it.
|
||||
if (!glyphs.advances[i] || glyphs.attributes[i].dontPrint)
|
||||
continue;
|
||||
Glyph *g = cacheEnabled ? defaultGlyphSet.getGlyph(glyphs.glyphs[i]) : 0;
|
||||
if (!g) {
|
||||
if (!face)
|
||||
|
@ -59,6 +59,7 @@ private slots:
|
||||
void mnemonicTextWidth();
|
||||
void leadingBelowLine();
|
||||
void elidedMetrics();
|
||||
void zeroWidthMetrics();
|
||||
};
|
||||
|
||||
void tst_QFontMetrics::same()
|
||||
@ -358,5 +359,28 @@ void tst_QFontMetrics::elidedMetrics()
|
||||
QFontDatabase::removeApplicationFont(id);
|
||||
}
|
||||
|
||||
void tst_QFontMetrics::zeroWidthMetrics()
|
||||
{
|
||||
QString zwnj(QChar(0x200c));
|
||||
QString zwsp(QChar(0x200b));
|
||||
|
||||
QFont font;
|
||||
QFontMetricsF fm(font);
|
||||
QCOMPARE(fm.horizontalAdvance(zwnj), 0);
|
||||
QCOMPARE(fm.horizontalAdvance(zwsp), 0);
|
||||
QCOMPARE(fm.boundingRect(zwnj).width(), 0);
|
||||
QCOMPARE(fm.boundingRect(zwsp).width(), 0);
|
||||
|
||||
QString string1 = QStringLiteral("(") + zwnj + QStringLiteral(")");
|
||||
QString string2 = QStringLiteral("(") + zwnj + zwnj + QStringLiteral(")");
|
||||
QString string3 = QStringLiteral("(") + zwsp + QStringLiteral(")");
|
||||
QString string4 = QStringLiteral("(") + zwsp + zwsp + QStringLiteral(")");
|
||||
|
||||
QCOMPARE(fm.horizontalAdvance(string1), fm.horizontalAdvance(string2));
|
||||
QCOMPARE(fm.horizontalAdvance(string3), fm.horizontalAdvance(string4));
|
||||
QCOMPARE(fm.boundingRect(string1).width(), fm.boundingRect(string2).width());
|
||||
QCOMPARE(fm.boundingRect(string3).width(), fm.boundingRect(string4).width());
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QFontMetrics)
|
||||
#include "tst_qfontmetrics.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user