diff --git a/fonts/OpenSans-Bold.ttf b/fonts/DAOpenSansBold.ttf similarity index 98% rename from fonts/OpenSans-Bold.ttf rename to fonts/DAOpenSansBold.ttf index fd79d43..bdc55af 100644 Binary files a/fonts/OpenSans-Bold.ttf and b/fonts/DAOpenSansBold.ttf differ diff --git a/fonts/DAOpenSansBoldItalic.ttf b/fonts/DAOpenSansBoldItalic.ttf new file mode 100644 index 0000000..47ebb8b Binary files /dev/null and b/fonts/DAOpenSansBoldItalic.ttf differ diff --git a/fonts/OpenSans-Regular.ttf b/fonts/DAOpenSansRegular.ttf similarity index 97% rename from fonts/OpenSans-Regular.ttf rename to fonts/DAOpenSansRegular.ttf index db43334..705a2e5 100644 Binary files a/fonts/OpenSans-Regular.ttf and b/fonts/DAOpenSansRegular.ttf differ diff --git a/fonts/DAOpenSansRegularItalic.ttf b/fonts/DAOpenSansRegularItalic.ttf new file mode 100644 index 0000000..6c6e046 Binary files /dev/null and b/fonts/DAOpenSansRegularItalic.ttf differ diff --git a/fonts/OpenSans-Semibold.ttf b/fonts/DAOpenSansSemibold.ttf similarity index 98% rename from fonts/OpenSans-Semibold.ttf rename to fonts/DAOpenSansSemibold.ttf index 1a7679e..71d61b7 100644 Binary files a/fonts/OpenSans-Semibold.ttf and b/fonts/DAOpenSansSemibold.ttf differ diff --git a/fonts/DAOpenSansSemiboldItalic.ttf b/fonts/DAOpenSansSemiboldItalic.ttf new file mode 100644 index 0000000..7e45d7a Binary files /dev/null and b/fonts/DAOpenSansSemiboldItalic.ttf differ diff --git a/fonts/fonts.qrc b/fonts/fonts.qrc index 1e965c5..fb1208d 100644 --- a/fonts/fonts.qrc +++ b/fonts/fonts.qrc @@ -1,7 +1,10 @@ - OpenSans-Regular.ttf - OpenSans-Bold.ttf - OpenSans-Semibold.ttf + DAOpenSansRegular.ttf + DAOpenSansRegularItalic.ttf + DAOpenSansBold.ttf + DAOpenSansBoldItalic.ttf + DAOpenSansSemibold.ttf + DAOpenSansSemiboldItalic.ttf diff --git a/ui/style/style_core_font.cpp b/ui/style/style_core_font.cpp index 6f765f7..cfe2111 100644 --- a/ui/style/style_core_font.cpp +++ b/ui/style/style_core_font.cpp @@ -66,15 +66,16 @@ bool LoadCustomFont(const QString &filePath, const QString &familyName, int flag return false; } - auto found = [&familyName, regularId] { + const auto found = [&] { for (auto &family : QFontDatabase::applicationFontFamilies(regularId)) { + UI_LOG(("Font: from '%1' loaded '%2'").arg(filePath).arg(family)); if (!family.trimmed().compare(familyName, Qt::CaseInsensitive)) { return true; } } return false; - }; - if (!found()) { + }(); + if (!found) { UI_LOG(("Font Error: could not locate '%1' font in '%2'.").arg(familyName).arg(filePath)); return false; } @@ -82,9 +83,43 @@ bool LoadCustomFont(const QString &filePath, const QString &familyName, int flag return ValidateFont(familyName, flags); } +enum { + FontTypeRegular = 0, + FontTypeRegularItalic, + FontTypeBold, + FontTypeBoldItalic, + FontTypeSemibold, + FontTypeSemiboldItalic, + + FontTypesCount, +}; +QString FontTypeNames[FontTypesCount] = { + "DAOpenSansRegular", + "DAOpenSansRegularItalic", + "DAOpenSansBold", + "DAOpenSansBoldItalic", + "DAOpenSansSemibold", + "DAOpenSansSemiboldItalic", +}; +int32 FontTypeFlags[FontTypesCount] = { + 0, + FontItalic, + FontBold, + FontBold | FontItalic, + 0, + FontItalic, +}; +QString FontTypeWindowsFallback[FontTypesCount] = { + "Segoe UI", + "Segoe UI", + "Segoe UI", + "Segoe UI", + "Segoe UI Semibold", + "Segoe UI Semibold", +}; + bool Started = false; -QString OpenSansOverride; -QString OpenSansSemiboldOverride; +QString Overrides[FontTypesCount]; } // namespace @@ -96,49 +131,66 @@ void StartFonts() { style_InitFontsResource(); - auto regular = LoadCustomFont(":/gui/fonts/OpenSans-Regular.ttf", "Open Sans"); - auto bold = LoadCustomFont(":/gui/fonts/OpenSans-Bold.ttf", "Open Sans", style::internal::FontBold); - auto semibold = LoadCustomFont(":/gui/fonts/OpenSans-Semibold.ttf", "Open Sans Semibold"); - + 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"). - if (!regular || !bold) { - if (ValidateFont("Segoe UI") && ValidateFont("Segoe UI", style::internal::FontBold)) { - OpenSansOverride = "Segoe UI"; - UI_LOG(("Fonts Info: Using Segoe UI instead of Open Sans.")); + // 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); +#endif // Q_OS_WIN } - if (!semibold) { - if (ValidateFont("Segoe UI Semibold")) { - OpenSansSemiboldOverride = "Segoe UI Semibold"; - UI_LOG(("Fonts Info: Using Segoe UI Semibold instead of Open Sans Semibold.")); - } - } - // Disable default fallbacks to Segoe UI, see: - // https://github.com/telegramdesktop/tdesktop/issues/5368 - // - //QFont::insertSubstitution("Open Sans", "Segoe UI"); - //QFont::insertSubstitution("Open Sans Semibold", "Segoe UI Semibold"); -#elif defined Q_OS_MAC // Q_OS_WIN +#ifdef Q_OS_MAC auto list = QStringList(); list.append(".SF NS Text"); list.append("Helvetica Neue"); list.append("Lucida Grande"); - QFont::insertSubstitutions("Open Sans", list); - QFont::insertSubstitutions("Open Sans Semibold", list); -#endif // Q_OS_WIN || Q_OS_MAC + for (const auto &name : FontTypeNames) { + QFont::insertSubstitutions(name, list); + } +#endif // Q_OS_MAC } -QString GetFontOverride(const QString &familyName) { +QString GetPossibleEmptyOverride(const QString &familyName, int32 flags) { + flags = flags & (FontBold | FontItalic); if (familyName == qstr("Open Sans")) { - return OpenSansOverride.isEmpty() ? familyName : OpenSansOverride; + if (flags == (FontBold | FontItalic)) { + return Overrides[FontTypeBoldItalic]; + } else if (flags == FontBold) { + return Overrides[FontTypeBold]; + } else if (flags == FontItalic) { + return Overrides[FontTypeRegularItalic]; + } else if (flags == 0) { + return Overrides[FontTypeRegular]; + } } else if (familyName == qstr("Open Sans Semibold")) { - return OpenSansSemiboldOverride.isEmpty() ? familyName : OpenSansSemiboldOverride; + if (flags == FontItalic) { + return Overrides[FontTypeSemiboldItalic]; + } else if (flags == 0) { + return Overrides[FontTypeSemibold]; + } } - return familyName; + return QString(); +} + +QString GetFontOverride(const QString &familyName, int32 flags) { + const auto result = GetPossibleEmptyOverride(familyName, flags); + return result.isEmpty() ? familyName : result; } void destroyFonts() { @@ -159,7 +211,7 @@ int registerFontFamily(const QString &family) { } FontData::FontData(int size, uint32 flags, int family, Font *other) -: f(GetFontOverride(fontFamilies[family])) +: f(GetFontOverride(fontFamilies[family], flags)) , m(f) , _size(size) , _flags(flags) diff --git a/ui/style/style_core_font.h b/ui/style/style_core_font.h index ee427e1..cd97457 100644 --- a/ui/style/style_core_font.h +++ b/ui/style/style_core_font.h @@ -15,7 +15,7 @@ namespace style { namespace internal { void StartFonts(); -[[nodiscard]] QString GetFontOverride(const QString &familyName); +[[nodiscard]] QString GetFontOverride(const QString &familyName, int32 flags = 0); void destroyFonts(); int registerFontFamily(const QString &family);