Avoid populating font family aliases if family matched
When trying to match a font request to fonts in the database we might end up with a mismatch due to the style not being available, but the font family itself was. If that's the case there's no point in trying to populate font aliases, so we explicitly propagate this fact back to QFontDatabasePrivate::findFont so that it can choose to not populate family aliases. Fixes: QTBUG-98369 Fixes: QTBUG-99216 Pick-to: 6.3 6.2 5.15 Change-Id: I14470554c73eace836f57cb65e63ada594ccf62e Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>bb10
parent
173dd2a033
commit
69d525a6fa
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue