add possiblity to use system font (#2)

This commit is contained in:
ilya-fedin 2020-01-30 11:43:51 +04:00 committed by GitHub
parent ffca05522f
commit 3106a3474b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 90 additions and 50 deletions

View file

@ -19,6 +19,9 @@
namespace style {
namespace internal {
bool GetUseSystemFont();
namespace {
constexpr auto kMinContrastAlpha = 64;
@ -55,16 +58,18 @@ void ResolveMonospaceFont() {
if (!CustomMonospaceFont.isEmpty()) {
tryFont(CustomMonospaceFont);
}
tryFont("Consolas");
tryFont("Liberation Mono");
tryFont("Menlo");
tryFont("Courier");
if (!GetUseSystemFont()) {
tryFont("Consolas");
tryFont("Liberation Mono");
tryFont("Menlo");
tryFont("Courier");
}
if (family.isEmpty()) {
const auto type = QFontDatabase::FixedFont;
family = QFontDatabase::systemFont(type).family();
}
const auto size = st::normalFont->f.pixelSize();
ResolvedMonospaceFont = style::font(size, 0, family);
ResolvedMonospaceFont = style::font(size, 0, family)->monospace();
}
} // namespace

View file

@ -36,7 +36,7 @@ QVector<QString> fontFamilies;
QMap<uint32, FontData*> fontsMap;
uint32 fontKey(int size, uint32 flags, int family) {
return (((uint32(family) << 10) | uint32(size)) << 4) | flags;
return (((uint32(family) << 12) | uint32(size)) << 6) | flags;
}
QString RemoveSemiboldFromName(const QString &familyName) {
@ -170,9 +170,14 @@ QString Overrides[FontTypesCount];
QString CustomMainFont;
QString CustomSemiboldFont;
bool CustomSemiboldIsBold = false;
bool UseSystemFont = false;
} // namespace
bool GetUseSystemFont() {
return UseSystemFont;
}
void SetMainFont(const QString &familyName) {
CustomMainFont = familyName;
}
@ -185,6 +190,10 @@ void SetSemiboldIsBold(bool isBold) {
CustomSemiboldIsBold = isBold;
}
void SetUseSystemFont(bool isSystemFont) {
UseSystemFont = isSystemFont;
}
void StartFonts() {
if (Started) {
return;
@ -193,41 +202,43 @@ void StartFonts() {
style_InitFontsResource();
if (!UseSystemFont) {
#ifndef DESKTOP_APP_USE_PACKAGED_FONTS
bool areGood[FontTypesCount] = { false };
for (auto i = 0; i != FontTypesCount; ++i) {
const auto name = FontTypeNames[i];
const auto flags = FontTypeFlags[i];
areGood[i] = LoadCustomFont(":/gui/fonts/" + name + ".ttf", name, flags);
Overrides[i] = name;
bool areGood[FontTypesCount] = { false };
for (auto i = 0; i != FontTypesCount; ++i) {
const auto name = FontTypeNames[i];
const auto flags = FontTypeFlags[i];
areGood[i] = LoadCustomFont(":/gui/fonts/" + name + ".ttf", name, flags);
Overrides[i] = name;
#ifdef Q_OS_WIN
// Attempt to workaround a strange font bug with Open Sans Semibold not loading.
// See https://github.com/telegramdesktop/tdesktop/issues/3276 for details.
// Crash happens on "options.maxh / _t->_st->font->height" with "division by zero".
// In that place "_t->_st->font" is "semiboldFont" is "font(13 "Open Sans Semibold").
const auto fallback = FontTypeWindowsFallback[i];
if (!areGood[i]) {
if (ValidateFont(fallback, flags)) {
Overrides[i] = fallback;
UI_LOG(("Fonts Info: Using '%1' instead of '%2'.").arg(fallback).arg(name));
// Attempt to workaround a strange font bug with Open Sans Semibold not loading.
// See https://github.com/telegramdesktop/tdesktop/issues/3276 for details.
// Crash happens on "options.maxh / _t->_st->font->height" with "division by zero".
// In that place "_t->_st->font" is "semiboldFont" is "font(13 "Open Sans Semibold").
const auto fallback = FontTypeWindowsFallback[i];
if (!areGood[i]) {
if (ValidateFont(fallback, flags)) {
Overrides[i] = fallback;
UI_LOG(("Fonts Info: Using '%1' instead of '%2'.").arg(fallback).arg(name));
}
}
}
// Disable default fallbacks to Segoe UI, see:
// https://github.com/telegramdesktop/tdesktop/issues/5368
//
//QFont::insertSubstitution(name, fallback);
// Disable default fallbacks to Segoe UI, see:
// https://github.com/telegramdesktop/tdesktop/issues/5368
//
//QFont::insertSubstitution(name, fallback);
#endif // Q_OS_WIN
}
}
#endif // !DESKTOP_APP_USE_PACKAGED_FONTS
#ifdef Q_OS_MAC
auto list = QStringList();
list.append(".SF NS Text");
list.append("Helvetica Neue");
list.append("Lucida Grande");
for (const auto &name : FontTypeNames) {
QFont::insertSubstitutions(name, list);
}
auto list = QStringList();
list.append(".SF NS Text");
list.append("Helvetica Neue");
list.append("Lucida Grande");
for (const auto &name : FontTypeNames) {
QFont::insertSubstitutions(name, list);
}
#endif // Q_OS_MAC
}
if (!CustomMainFont.isEmpty() && ValidateFont(CustomMainFont)) {
Overrides[FontTypeRegular] = CustomMainFont;
@ -286,11 +297,14 @@ int registerFontFamily(const QString &family) {
}
FontData::FontData(int size, uint32 flags, int family, Font *other)
: f(ParseFamilyName(GetFontOverride(fontFamilies[family], flags)))
: f()
, m(f)
, _size(size)
, _flags(flags)
, _family(family) {
const auto fontOverride = GetFontOverride(fontFamilies[family], flags);
const auto possibleEmptyOverride = GetPossibleEmptyOverride(fontFamilies[family], flags);
if (other) {
memcpy(modified, other, sizeof(modified));
} else {
@ -298,11 +312,18 @@ FontData::FontData(int size, uint32 flags, int family, Font *other)
}
modified[_flags] = Font(this);
if (!UseSystemFont || !possibleEmptyOverride.isEmpty() || (_flags & FontMonospace)) {
f.setFamily(fontOverride);
}
f.setPixelSize(size);
if (_flags & FontBold) {
f.setBold(true);
} else if (fontFamilies[family] == "Open Sans Semibold" && CustomSemiboldIsBold) {
f.setBold(true);
} else if (fontFamilies[family] == "Open Sans Semibold" && UseSystemFont
&& possibleEmptyOverride.isEmpty()) {
f.setWeight(QFont::DemiBold);
#ifdef DESKTOP_APP_USE_PACKAGED_FONTS
} else if (fontFamilies[family] == "Open Sans Semibold") {
f.setWeight(QFont::DemiBold);
@ -313,7 +334,7 @@ FontData::FontData(int size, uint32 flags, int family, Font *other)
f.setStrikeOut(_flags & FontStrikeOut);
f.setStyleStrategy(QFont::PreferQuality);
if (IsRealSemibold(GetFontOverride(fontFamilies[family], flags))) {
if (IsRealSemibold(fontOverride)) {
f.setStyleName("Semibold");
}
@ -341,6 +362,10 @@ Font FontData::strikeout(bool set) const {
return otherFlagsFont(FontStrikeOut, set);
}
Font FontData::monospace(bool set) const {
return otherFlagsFont(FontMonospace, set);
}
int FontData::size() const {
return _size;
}

View file

@ -17,6 +17,7 @@ namespace internal {
void SetMainFont(const QString &familyName);
void SetSemiboldFont(const QString &familyName);
void SetSemiboldIsBold(bool isBold);
void SetUseSystemFont(bool isSystemFont);
void StartFonts();
[[nodiscard]] QString GetFontOverride(const QString &familyName, int32 flags = 0);
@ -63,8 +64,9 @@ enum FontFlags {
FontItalic = 0x02,
FontUnderline = 0x04,
FontStrikeOut = 0x08,
FontMonospace = 0x10,
FontDifferentFlags = 0x10,
FontDifferentFlags = 0x20,
};
class FontData {
@ -87,6 +89,7 @@ public:
Font italic(bool set = true) const;
Font underline(bool set = true) const;
Font strikeout(bool set = true) const;
Font monospace(bool set = true) const;
int size() const;
uint32 flags() const;

View file

@ -2015,8 +2015,8 @@ private:
auto result = f;
if ((flags & TextBlockFPre) || (flags & TextBlockFCode)) {
result = style::MonospaceFont();
if (result->size() != f->size() || result->flags() != f->flags()) {
result = style::font(f->size(), f->flags(), result->family());
if (result->size() != f->size()) {
result = style::font(f->size(), result->flags(), result->family());
}
} else {
if (flags & TextBlockFBold) {
@ -2027,9 +2027,13 @@ private:
result = style::font(f->size(), f->flags(), result->family());
}
}
if (flags & TextBlockFItalic) result = result->italic();
if (flags & TextBlockFUnderline) result = result->underline();
if (flags & TextBlockFStrikeOut) result = result->strikeout();
}
if (flags & TextBlockFItalic) result = result->italic();
if (flags & TextBlockFUnderline) result = result->underline();
if (flags & TextBlockFStrikeOut) result = result->strikeout();
if (flags & TextBlockFSemibold) {
if (flags & TextBlockFTilde) { // tilde fix in OpenSans
result = st::semiboldFont;
}

View file

@ -323,8 +323,8 @@ TextBlock::TextBlock(const style::font &font, const QString &str, QFixed minResi
if ((flags & TextBlockFPre) || (flags & TextBlockFCode)) {
blockFont = style::MonospaceFont();
if (blockFont->size() != font->size() || blockFont->flags() != font->flags()) {
blockFont = style::font(font->size(), font->flags(), blockFont->family());
if (blockFont->size() != font->size()) {
blockFont = style::font(font->size(), blockFont->flags(), blockFont->family());
}
} else {
if (flags & TextBlockFBold) {
@ -335,9 +335,13 @@ TextBlock::TextBlock(const style::font &font, const QString &str, QFixed minResi
blockFont = style::font(font->size(), font->flags(), blockFont->family());
}
}
if (flags & TextBlockFItalic) blockFont = blockFont->italic();
if (flags & TextBlockFUnderline) blockFont = blockFont->underline();
if (flags & TextBlockFStrikeOut) blockFont = blockFont->strikeout();
}
if (flags & TextBlockFItalic) blockFont = blockFont->italic();
if (flags & TextBlockFUnderline) blockFont = blockFont->underline();
if (flags & TextBlockFStrikeOut) blockFont = blockFont->strikeout();
if (flags & TextBlockFSemibold) {
if (flags & TextBlockFTilde) { // tilde fix in OpenSans
blockFont = st::semiboldFont;
}

View file

@ -657,9 +657,8 @@ void RemoveDocumentTags(
style::font AdjustFont(
const style::font &font,
const style::font &original) {
return (font->size() != original->size()
|| font->flags() != original->flags())
? style::font(original->size(), original->flags(), font->family())
return (font->size() != original->size())
? style::font(original->size(), font->flags(), font->family())
: font;
}