diff options
Diffstat (limited to 'src/gui/text/qfontdatabase.cpp')
-rw-r--r-- | src/gui/text/qfontdatabase.cpp | 130 |
1 files changed, 86 insertions, 44 deletions
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 99814dba82..dd11cd8382 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -50,7 +50,6 @@ #include <QtCore/qmath.h> #include <stdlib.h> -#include <limits.h> #include <algorithm> @@ -84,60 +83,91 @@ static int getFontWeight(const QString &weightString) { QString s = weightString.toLower(); + // Order here is important. We want to match the common cases first, but we + // must also take care to acknowledge the cost of our tests. + // + // As a result, we test in two orders; the order of commonness, and the + // order of "expense". + // + // A simple string test is the cheapest, so let's do that first. // Test in decreasing order of commonness - if (s == QLatin1String("normal") - || s.compare(QCoreApplication::translate("QFontDatabase", "Normal"), Qt::CaseInsensitive) == 0) + if (s == QLatin1String("normal") || s == QLatin1String("regular")) return QFont::Normal; - if (s == QLatin1String("medium")) - return qt_mediumFontWeight; - if (s == QLatin1String("bold") - || s.compare(QCoreApplication::translate("QFontDatabase", "Bold"), Qt::CaseInsensitive) == 0) + if (s == QLatin1String("bold")) return QFont::Bold; - if (s == QLatin1String("demibold") || s == QLatin1String("demi bold") - || s.compare(QCoreApplication::translate("QFontDatabase", "Demi Bold"), Qt::CaseInsensitive) == 0) + if (s == QLatin1String("semibold") || s == QLatin1String("semi bold") + || s == QLatin1String("demibold") || s == QLatin1String("demi bold")) return QFont::DemiBold; - if (s == QLatin1String("black") - || s.compare(QCoreApplication::translate("QFontDatabase", "Black"), Qt::CaseInsensitive) == 0) + if (s == QLatin1String("medium")) + return QFont::Medium; + if (s == QLatin1String("black")) return QFont::Black; if (s == QLatin1String("light")) return QFont::Light; if (s == QLatin1String("thin")) - return qt_thinFontWeight; - if (s == QLatin1String("extralight")) - return qt_extralightFontWeight; - - if (s.contains(QLatin1String("bold")) - || s.contains(QCoreApplication::translate("QFontDatabase", "Bold"), Qt::CaseInsensitive)) { - if (s.contains(QLatin1String("demi")) - || s.compare(QCoreApplication::translate("QFontDatabase", "Demi"), Qt::CaseInsensitive) == 0) - return (int) QFont::DemiBold; - return (int) QFont::Bold; + return QFont::Thin; + const QStringRef s2 = s.midRef(2); + if (s.startsWith(QLatin1String("ex")) || s.startsWith(QLatin1String("ul"))) { + if (s2 == QLatin1String("tralight") || s == QLatin1String("tra light")) + return QFont::ExtraLight; + if (s2 == QLatin1String("trabold") || s2 == QLatin1String("tra bold")) + return QFont::ExtraBold; } - if (s.contains(QLatin1String("light")) - || s.compare(QCoreApplication::translate("QFontDatabase", "Light"), Qt::CaseInsensitive) == 0) - return (int) QFont::Light; - - if (s.contains(QLatin1String("black")) - || s.compare(QCoreApplication::translate("QFontDatabase", "Black"), Qt::CaseInsensitive) == 0) - return (int) QFont::Black; - - return (int) QFont::Normal; -} - -// convert 0 ~ 1000 integer to QFont::Weight -QFont::Weight weightFromInteger(int weight) -{ - if (weight < 400) + // Next up, let's see if contains() matches: slightly more expensive, but + // still fast enough. + if (s.contains(QLatin1String("bold"))) { + if (s.contains(QLatin1String("demi"))) + return QFont::DemiBold; + return QFont::Bold; + } + if (s.contains(QLatin1String("light"))) return QFont::Light; - else if (weight < 600) + if (s.contains(QLatin1String("black"))) + return QFont::Black; + + // Now, we perform string translations & comparisons with those. + // These are (very) slow compared to simple string ops, so we do these last. + // As using translated values for such things is not very common, this should + // not be too bad. + if (s.compare(QCoreApplication::translate("QFontDatabase", "Normal", "The Normal or Regular font weight"), Qt::CaseInsensitive) == 0) return QFont::Normal; - else if (weight < 700) - return QFont::DemiBold; - else if (weight < 800) + const QString translatedBold = QCoreApplication::translate("QFontDatabase", "Bold").toLower(); + if (s == translatedBold) return QFont::Bold; - else + if (s.compare(QCoreApplication::translate("QFontDatabase", "Demi Bold"), Qt::CaseInsensitive) == 0) + return QFont::DemiBold; + if (s.compare(QCoreApplication::translate("QFontDatabase", "Medium", "The Medium font weight"), Qt::CaseInsensitive) == 0) + return QFont::Medium; + if (s.compare(QCoreApplication::translate("QFontDatabase", "Black"), Qt::CaseInsensitive) == 0) return QFont::Black; + const QString translatedLight = QCoreApplication::translate("QFontDatabase", "Light").toLower(); + if (s == translatedLight) + return QFont::Light; + if (s.compare(QCoreApplication::translate("QFontDatabase", "Thin"), Qt::CaseInsensitive) == 0) + return QFont::Thin; + if (s.compare(QCoreApplication::translate("QFontDatabase", "Extra Light"), Qt::CaseInsensitive) == 0) + return QFont::ExtraLight; + if (s.compare(QCoreApplication::translate("QFontDatabase", "Extra Bold"), Qt::CaseInsensitive) == 0) + return QFont::ExtraBold; + + // And now the contains() checks for the translated strings. + const QString translatedExtra = QCoreApplication::translate("QFontDatabase", "Extra").toLower(); + if (s.contains(translatedBold)) { + QString translatedDemi = QCoreApplication::translate("QFontDatabase", "Demi").toLower(); + if (s .contains(translatedDemi)) + return QFont::DemiBold; + if (s.contains(translatedExtra)) + return QFont::ExtraBold; + return QFont::Bold; + } + + if (s.contains(translatedLight)) { + if (s.contains(translatedExtra)) + return QFont::ExtraLight; + return QFont::Light; + } + return QFont::Normal; } struct QtFontEncoding @@ -1117,7 +1147,10 @@ static int match(int script, const QFontDef &request, load(family_name, script); - const size_t writingSystem = std::find(scriptForWritingSystem, scriptForWritingSystem + QFontDatabase::WritingSystemsCount, script) - scriptForWritingSystem; + size_t writingSystem = std::find(scriptForWritingSystem, scriptForWritingSystem + + QFontDatabase::WritingSystemsCount, script) - scriptForWritingSystem; + if (writingSystem >= QFontDatabase::WritingSystemsCount) + writingSystem = QFontDatabase::Any; QFontDatabasePrivate *db = privateDb(); for (int x = 0; x < db->count; ++x) { @@ -1562,6 +1595,15 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty QtFontStyle::Key styleKey(style); QtFontFamily *f = d->family(familyName); + if (!f) { + for (int i = 0; i < d->count; i++) { + if (d->families[i]->matchesFamilyName(familyName)) { + f = d->families[i]; + f->ensurePopulated(); + break; + } + } + } if (!f) return smoothScalable; for (int j = 0; j < f->count; j++) { @@ -1639,7 +1681,7 @@ QList<int> QFontDatabase::pointSizes(const QString &family, for (int l = 0; l < style->count; l++) { const QtFontSize *size = style->pixelSizes + l; - if (size->pixelSize != 0 && size->pixelSize != USHRT_MAX) { + if (size->pixelSize != 0 && size->pixelSize != SMOOTH_SCALABLE) { const uint pointSize = qRound(size->pixelSize * 72.0 / dpi); if (! sizes.contains(pointSize)) sizes.append(pointSize); @@ -1742,7 +1784,7 @@ QList<int> QFontDatabase::smoothSizes(const QString &family, for (int l = 0; l < style->count; l++) { const QtFontSize *size = style->pixelSizes + l; - if (size->pixelSize != 0 && size->pixelSize != USHRT_MAX) { + if (size->pixelSize != 0 && size->pixelSize != SMOOTH_SCALABLE) { const uint pointSize = qRound(size->pixelSize * 72.0 / dpi); if (! sizes.contains(pointSize)) sizes.append(pointSize); |