summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/text/qfontdatabase.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 1486c035e8..f7705b16a9 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -905,6 +905,13 @@ static QtFontStyle *bestStyle(QtFontFoundry *foundry, const QtFontStyle::Key &st
return foundry->styles[best];
}
+enum {
+ FamilyMismatch = 0x800000,
+ ScriptMismatch = 0x080000,
+ PitchMismatch = 0x004000,
+ StyleMismatch = 0x002000,
+ BitmapScaledPenalty = 0x001000
+};
static
unsigned int bestFoundry(int script, unsigned int score, int styleStrategy,
@@ -1008,20 +1015,16 @@ unsigned int bestFoundry(int script, unsigned int score, int styleStrategy,
unsigned int this_score = 0x0000;
- enum {
- PitchMismatch = 0x4000,
- StyleMismatch = 0x2000,
- BitmapScaledPenalty = 0x1000
- };
+
if (pitch != '*') {
if ((pitch == 'm' && !family->fixedPitch)
|| (pitch == 'p' && family->fixedPitch))
- this_score += PitchMismatch;
+ this_score |= PitchMismatch;
}
if (styleKey != style->key)
- this_score += StyleMismatch;
+ this_score |= StyleMismatch;
if (!style->smoothScalable && px != size->pixelSize) // bitmap scaled
- this_score += BitmapScaledPenalty;
+ this_score |= BitmapScaledPenalty;
if (px != pixelSize) // close, but not exact, size match
this_score += qAbs(px - pixelSize);
@@ -1106,11 +1109,14 @@ static int match(int script,
if (!matchFamilyName(family_name, test.family))
continue;
+ score &= ~FamilyMismatch;
+
test.family->ensurePopulated();
// Check if family is supported in the script we want
if (writingSystem != QFontDatabase::Any && !familySupportsWritingSystem(test.family, writingSystem))
continue;
+ score &= ~ScriptMismatch;
// as we know the script is supported, we can be sure
// to find a matching font here.
@@ -2410,7 +2416,7 @@ QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &req,
QList<int> blackListed;
unsigned int score = UINT_MAX;
int index = match(multi ? QChar::Script_Common : script, request, family_name, foundry_name, &desc, blackListed, &score);
- if (score > 0 && QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFamilyAliases(family_name)) {
+ if ((score & FamilyMismatch) && QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFamilyAliases(family_name)) {
// We populated family aliases (e.g. localized families), so try again
index = match(multi ? QChar::Script_Common : script, request, family_name, foundry_name, &desc, blackListed);
}