summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/text/qtextengine.cpp10
-rw-r--r--tests/auto/gui/text/qfontmetrics/testfont.qrc1
-rw-r--r--tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp27
3 files changed, 38 insertions, 0 deletions
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 8de16038ad..bdb5592e9e 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -3192,6 +3192,16 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
QChar ellipsisChar(0x2026);
+ // We only want to use the ellipsis character if it is from the main
+ // font (not one of the fallbacks), since using a fallback font
+ // will affect the metrics of the text, potentially causing it to shift
+ // when it is being elided.
+ if (engine->type() == QFontEngine::Multi) {
+ QFontEngineMulti *multiEngine = static_cast<QFontEngineMulti *>(engine);
+ multiEngine->ensureEngineAt(0);
+ engine = multiEngine->engine(0);
+ }
+
glyph_t glyph = engine->glyphIndex(ellipsisChar.unicode());
QGlyphLayout glyphs;
diff --git a/tests/auto/gui/text/qfontmetrics/testfont.qrc b/tests/auto/gui/text/qfontmetrics/testfont.qrc
index bc0c0b0959..30b4a3f82e 100644
--- a/tests/auto/gui/text/qfontmetrics/testfont.qrc
+++ b/tests/auto/gui/text/qfontmetrics/testfont.qrc
@@ -1,5 +1,6 @@
<RCC>
<qresource prefix="/fonts">
<file>ucs4font.ttf</file>
+ <file alias="testfont.ttf">../../../shared/resources/testfont.ttf</file>
</qresource>
</RCC>
diff --git a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
index 9e705b4a00..a0e8525268 100644
--- a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
+++ b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
@@ -58,6 +58,7 @@ private slots:
void lineWidth();
void mnemonicTextWidth();
void leadingBelowLine();
+ void elidedMetrics();
};
void tst_QFontMetrics::same()
@@ -331,5 +332,31 @@ void tst_QFontMetrics::leadingBelowLine()
QCOMPARE(line.base(), line.ascent);
}
+void tst_QFontMetrics::elidedMetrics()
+{
+ QString testFont = QFINDTESTDATA("fonts/testfont.ttf");
+ QVERIFY(!testFont.isEmpty());
+
+ int id = QFontDatabase::addApplicationFont(testFont);
+ QVERIFY(id >= 0);
+
+ QFont font(QFontDatabase::applicationFontFamilies(id).at(0));
+ font.setPixelSize(12.0);
+
+ QFontMetricsF metrics(font);
+ QString s = QStringLiteral("VeryLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongText");
+
+ QRectF boundingRect = metrics.boundingRect(s);
+
+ QString elided = metrics.elidedText(s, Qt::ElideRight, boundingRect.width() / 2.0);
+
+ QRectF elidedBoundingRect = metrics.boundingRect(elided);
+
+ QCOMPARE(boundingRect.height(), elidedBoundingRect.height());
+ QCOMPARE(boundingRect.y(), elidedBoundingRect.y());
+
+ QFontDatabase::removeApplicationFont(id);
+}
+
QTEST_MAIN(tst_QFontMetrics)
#include "tst_qfontmetrics.moc"