Android: Fix synthesized oblique for non-latin scripts

In 5e3e34731b7880ac775e8f1fa156ce016e6820f1, a default implementation
of QPlatformFontDatabase::fallbacksForFamily() was added, but this
implementation included only the fonts with a matching style in
the returned list.

The result of this was that if a font face for a specific language
did not have e.g. an italic font, then we would show missing glyph
boxes instead. On Android, it would be impossible to show any
italic text in Chinese, Japanese, Hebrew, or Arabic.

[ChangeLog][QtGui][Text] Fixed synthesized oblique for non-latin
text on platforms using the basic font database, such as Android.

Task-number: QTBUG-51223
Change-Id: I494d8ad87292b65d4380a2e600c1c0dc7fc8f937
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2016-10-25 11:56:33 +02:00
parent 78ee77f491
commit aa2e2a8d5e

View File

@ -805,7 +805,8 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo
Q_UNUSED(family);
Q_UNUSED(styleHint);
QStringList retList;
QStringList preferredFallbacks;
QStringList otherFallbacks;
size_t writingSystem = std::find(scriptForWritingSystem,
scriptForWritingSystem + QFontDatabase::WritingSystemsCount,
@ -826,18 +827,18 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo
QtFontFoundry *foundry = f->foundries[j];
for (int k = 0; k < foundry->count; ++k) {
if (style == foundry->styles[k]->key.style) {
if (foundry->name.isEmpty())
retList.append(f->name);
else
retList.append(f->name + QLatin1String(" [") + foundry->name + QLatin1Char(']'));
break;
}
QString name = foundry->name.isEmpty()
? f->name
: f->name + QLatin1String(" [") + foundry->name + QLatin1Char(']');
if (style == foundry->styles[k]->key.style)
preferredFallbacks.append(name);
else
otherFallbacks.append(name);
}
}
}
return retList;
return preferredFallbacks + otherFallbacks;
}
static void initializeDb();