From 9b0fab6b62df98519ebfab117f14b9d3465d8c68 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Fri, 21 Dec 2012 18:35:58 +0200 Subject: Update Qt internals to use QChar::Script ...and remove the outdated QUnicodeTables::Script enum. QFontEngineData now has one extra slot that never used (engines[QChar::Script_Inherited]). engines[QChar::Script_Unknown], if accessed, would be set with a Box engine instance, and could be used as a minor optimization some time later. In order to preserve the existing behavior, we map all scripts up to Latin to Common. Change-Id: Ide4182a0f8447b4bf25713ecc3fe8097b8fed040 Reviewed-by: Pierre Rossi Reviewed-by: Konstantin Ritt --- src/gui/text/qfontmetrics.cpp | 96 +++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 50 deletions(-) (limited to 'src/gui/text/qfontmetrics.cpp') diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index d0de086f22..0cde6e5020 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -45,7 +45,6 @@ #include "qfont_p.h" #include "qfontengine_p.h" -#include #include @@ -262,7 +261,7 @@ bool QFontMetrics::operator ==(const QFontMetrics &other) const */ int QFontMetrics::ascent() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->ascent()); } @@ -280,7 +279,7 @@ int QFontMetrics::ascent() const */ int QFontMetrics::descent() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->descent()); } @@ -295,7 +294,7 @@ int QFontMetrics::descent() const */ int QFontMetrics::height() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->ascent()) + qRound(engine->descent()); } @@ -309,7 +308,7 @@ int QFontMetrics::height() const */ int QFontMetrics::leading() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->leading()); } @@ -323,7 +322,7 @@ int QFontMetrics::leading() const */ int QFontMetrics::lineSpacing() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->leading()) + qRound(engine->ascent()) + qRound(engine->descent()); } @@ -340,7 +339,7 @@ int QFontMetrics::lineSpacing() const */ int QFontMetrics::minLeftBearing() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->minLeftBearing()); } @@ -357,7 +356,7 @@ int QFontMetrics::minLeftBearing() const */ int QFontMetrics::minRightBearing() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->minRightBearing()); } @@ -367,7 +366,7 @@ int QFontMetrics::minRightBearing() const */ int QFontMetrics::maxWidth() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->maxCharWidth()); } @@ -378,10 +377,10 @@ int QFontMetrics::maxWidth() const */ int QFontMetrics::xHeight() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); if (d->capital == QFont::SmallCaps) - return qRound(d->smallCapsFontPrivate()->engineForScript(QUnicodeTables::Common)->ascent()); + return qRound(d->smallCapsFontPrivate()->engineForScript(QChar::Script_Common)->ascent()); return qRound(engine->xHeight()); } @@ -392,7 +391,7 @@ int QFontMetrics::xHeight() const */ int QFontMetrics::averageCharWidth() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->averageCharWidth()); } @@ -403,7 +402,7 @@ int QFontMetrics::averageCharWidth() const */ bool QFontMetrics::inFont(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine = d->engineForScript(script); Q_ASSERT(engine != 0); if (engine->type() == QFontEngine::Box) @@ -417,7 +416,7 @@ bool QFontMetrics::inFont(QChar ch) const */ bool QFontMetrics::inFontUcs4(uint ucs4) const { - const int script = QUnicodeTables::script(ucs4); + const int script = QChar::script(ucs4); QFontEngine *engine = d->engineForScript(script); Q_ASSERT(engine != 0); if (engine->type() == QFontEngine::Box) @@ -439,7 +438,7 @@ bool QFontMetrics::inFontUcs4(uint ucs4) const */ int QFontMetrics::leftBearing(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -474,7 +473,7 @@ int QFontMetrics::leftBearing(QChar ch) const */ int QFontMetrics::rightBearing(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -530,7 +529,7 @@ int QFontMetrics::width(const QString &text, int len, int flags) const // Skip harfbuzz complex shaping, only use advances int numGlyphs = len; QVarLengthGlyphLayoutArray glyphs(numGlyphs); - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); if (!engine->stringToCMap(text.data(), len, &glyphs, &numGlyphs, 0)) { glyphs.resize(numGlyphs); if (!engine->stringToCMap(text.data(), len, &glyphs, &numGlyphs, 0)) @@ -577,7 +576,7 @@ int QFontMetrics::width(QChar ch) const if (QChar::category(ch.unicode()) == QChar::Mark_NonSpacing) return 0; - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -607,14 +606,13 @@ int QFontMetrics::width(QChar ch) const */ int QFontMetrics::charWidth(const QString &text, int pos) const { + int width = 0; if (pos < 0 || pos > (int)text.length()) - return 0; - - QChar ch = text.unicode()[pos]; - const int script = QUnicodeTables::script(ch); - int width; + return width; - if (script != QUnicodeTables::Common) { + QChar ch = text.at(pos); + const int script = ch.script(); + if (script != QChar::Script_Common) { // complex script shaping. Have to do some hard work int from = qMax(0, pos - 8); int to = qMin(text.length(), pos + 8); @@ -623,9 +621,7 @@ int QFontMetrics::charWidth(const QString &text, int pos) const layout.ignoreBidi = true; layout.itemize(); width = qRound(layout.width(pos-from, 1)); - } else if (QChar::category(ch.unicode()) == QChar::Mark_NonSpacing) { - width = 0; - } else { + } else if (ch.category() != QChar::Mark_NonSpacing) { QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -694,7 +690,7 @@ QRect QFontMetrics::boundingRect(const QString &text) const */ QRect QFontMetrics::boundingRect(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -895,7 +891,7 @@ QString QFontMetrics::elidedText(const QString &text, Qt::TextElideMode mode, in */ int QFontMetrics::underlinePos() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->underlinePosition()); } @@ -931,7 +927,7 @@ int QFontMetrics::strikeOutPos() const */ int QFontMetrics::lineWidth() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return qRound(engine->lineThickness()); } @@ -1129,7 +1125,7 @@ bool QFontMetricsF::operator ==(const QFontMetricsF &other) const */ qreal QFontMetricsF::ascent() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->ascent().toReal(); } @@ -1148,7 +1144,7 @@ qreal QFontMetricsF::ascent() const */ qreal QFontMetricsF::descent() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->descent().toReal(); } @@ -1163,7 +1159,7 @@ qreal QFontMetricsF::descent() const */ qreal QFontMetricsF::height() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return (engine->ascent() + engine->descent()).toReal(); @@ -1178,7 +1174,7 @@ qreal QFontMetricsF::height() const */ qreal QFontMetricsF::leading() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->leading().toReal(); } @@ -1192,7 +1188,7 @@ qreal QFontMetricsF::leading() const */ qreal QFontMetricsF::lineSpacing() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return (engine->leading() + engine->ascent() + engine->descent()).toReal(); } @@ -1209,7 +1205,7 @@ qreal QFontMetricsF::lineSpacing() const */ qreal QFontMetricsF::minLeftBearing() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->minLeftBearing(); } @@ -1226,7 +1222,7 @@ qreal QFontMetricsF::minLeftBearing() const */ qreal QFontMetricsF::minRightBearing() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->minRightBearing(); } @@ -1236,7 +1232,7 @@ qreal QFontMetricsF::minRightBearing() const */ qreal QFontMetricsF::maxWidth() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->maxCharWidth(); } @@ -1247,10 +1243,10 @@ qreal QFontMetricsF::maxWidth() const */ qreal QFontMetricsF::xHeight() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); if (d->capital == QFont::SmallCaps) - return d->smallCapsFontPrivate()->engineForScript(QUnicodeTables::Common)->ascent().toReal(); + return d->smallCapsFontPrivate()->engineForScript(QChar::Script_Common)->ascent().toReal(); return engine->xHeight().toReal(); } @@ -1261,7 +1257,7 @@ qreal QFontMetricsF::xHeight() const */ qreal QFontMetricsF::averageCharWidth() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->averageCharWidth().toReal(); } @@ -1272,7 +1268,7 @@ qreal QFontMetricsF::averageCharWidth() const */ bool QFontMetricsF::inFont(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine = d->engineForScript(script); Q_ASSERT(engine != 0); if (engine->type() == QFontEngine::Box) @@ -1288,7 +1284,7 @@ bool QFontMetricsF::inFont(QChar ch) const */ bool QFontMetricsF::inFontUcs4(uint ucs4) const { - const int script = QUnicodeTables::script(ucs4); + const int script = QChar::script(ucs4); QFontEngine *engine = d->engineForScript(script); Q_ASSERT(engine != 0); if (engine->type() == QFontEngine::Box) @@ -1310,7 +1306,7 @@ bool QFontMetricsF::inFontUcs4(uint ucs4) const */ qreal QFontMetricsF::leftBearing(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -1345,7 +1341,7 @@ qreal QFontMetricsF::leftBearing(QChar ch) const */ qreal QFontMetricsF::rightBearing(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -1414,10 +1410,10 @@ qreal QFontMetricsF::width(const QString &text) const */ qreal QFontMetricsF::width(QChar ch) const { - if (QChar::category(ch.unicode()) == QChar::Mark_NonSpacing) + if (ch.category() == QChar::Mark_NonSpacing) return 0.; - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -1482,7 +1478,7 @@ QRectF QFontMetricsF::boundingRect(const QString &text) const */ QRectF QFontMetricsF::boundingRect(QChar ch) const { - const int script = QUnicodeTables::script(ch); + const int script = ch.script(); QFontEngine *engine; if (d->capital == QFont::SmallCaps && ch.isLower()) engine = d->smallCapsFontPrivate()->engineForScript(script); @@ -1682,7 +1678,7 @@ QString QFontMetricsF::elidedText(const QString &text, Qt::TextElideMode mode, q */ qreal QFontMetricsF::underlinePos() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->underlinePosition().toReal(); } @@ -1717,7 +1713,7 @@ qreal QFontMetricsF::strikeOutPos() const */ qreal QFontMetricsF::lineWidth() const { - QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + QFontEngine *engine = d->engineForScript(QChar::Script_Common); Q_ASSERT(engine != 0); return engine->lineThickness().toReal(); } -- cgit v1.2.3