From d38454a125c4b5ce409aed8f674831b5fe481920 Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Tue, 30 Aug 2022 21:08:54 +0000 Subject: [PATCH] Backport fonts fixes to 0.48 --- README.md | 4 +- apps/launcher/advancedpage.cpp | 5 - apps/openmw/mwgui/debugwindow.cpp | 4 +- apps/openmw/mwgui/dialogue.cpp | 39 ++++++++ apps/openmw/mwgui/dialogue.hpp | 9 +- apps/openmw/mwgui/itemwidget.cpp | 19 +++- apps/openmw/mwgui/trainingwindow.cpp | 4 +- apps/openmw/mwgui/windowmanagerimp.cpp | 1 - components/fontloader/fontloader.cpp | 92 +++++++++++++----- components/fontloader/fontloader.hpp | 3 +- components/myguiplatform/scalinglayer.cpp | 14 +-- components/myguiplatform/scalinglayer.hpp | 3 +- components/widgets/fontwrapper.hpp | 2 +- docs/source/reference/modding/font.rst | 17 ++-- .../source/reference/modding/settings/GUI.rst | 14 +-- files/data/CMakeLists.txt | 12 +-- files/data/fonts/DejaVuLGCSansMono.omwfont | 1 + ...yembedt.omwfont => DemonicLetters.omwfont} | 8 +- files/data/fonts/DemonicLetters.ttf | Bin 0 -> 21188 bytes ...ense.txt => DemonicLettersFontLicense.txt} | 3 + .../{Pelagiad.omwfont => MysticCards.omwfont} | 23 ++--- files/data/fonts/MysticCards.ttf | Bin 0 -> 29328 bytes ...License.txt => MysticCardsFontLicense.txt} | 3 + files/data/fonts/OMWAyembedt.ttf | Bin 25550 -> 0 bytes files/data/fonts/Pelagiad.ttf | Bin 29820 -> 0 bytes files/data/l10n/SettingsMenu/ru.yaml | 2 +- .../data/mygui/openmw_dialogue_window.layout | 2 +- .../mygui/openmw_persuasion_dialog.layout | 8 +- files/data/mygui/openmw_resources.xml | 16 +-- .../data/mygui/openmw_settings_window.layout | 52 +++++----- files/data/mygui/openmw_stats_window.layout | 6 +- files/data/mygui/openmw_text.skin.xml | 6 +- .../openmw_wait_dialog_progressbar.layout | 2 +- files/openmw.cfg | 4 +- files/openmw.cfg.local | 4 +- files/settings-default.cfg | 3 - files/ui/advancedpage.ui | 29 +----- 37 files changed, 239 insertions(+), 175 deletions(-) rename files/data/fonts/{OMWAyembedt.omwfont => DemonicLetters.omwfont} (52%) create mode 100644 files/data/fonts/DemonicLetters.ttf rename files/data/fonts/{OMWAyembedtFontLicense.txt => DemonicLettersFontLicense.txt} (97%) rename files/data/fonts/{Pelagiad.omwfont => MysticCards.omwfont} (69%) create mode 100644 files/data/fonts/MysticCards.ttf rename files/data/fonts/{PelagiadFontLicense.txt => MysticCardsFontLicense.txt} (97%) delete mode 100644 files/data/fonts/OMWAyembedt.ttf delete mode 100644 files/data/fonts/Pelagiad.ttf diff --git a/README.md b/README.md index b1ea6cbde3..e19ea468e1 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ OpenMW also comes with OpenMW-CS, a replacement for Bethesda's Construction Set. Font Licenses: * DejaVuLGCSansMono.ttf: custom (see [files/data/fonts/DejaVuFontLicense.txt](https://gitlab.com/OpenMW/openmw/-/raw/master/files/data/fonts/DejaVuFontLicense.txt) for more information) -* OMWAyembedt.ttf: SIL Open Font License (see [files/data/fonts/OMWAyembedtFontLicense.txt](https://gitlab.com/OpenMW/openmw/-/raw/master/files/data/fonts/OMWAyembedtFontLicense.txt) for more information) -* Pelagiad.ttf: SIL Open Font License (see [files/data/fonts/PelagiadFontLicense.txt](https://gitlab.com/OpenMW/openmw/-/raw/master/files/data/fonts/PelagiadFontLicense.txt) for more information) +* DemonicLetters.ttf: SIL Open Font License (see [files/data/fonts/DemonicLettersFontLicense.txt](https://gitlab.com/OpenMW/openmw/-/raw/master/files/data/fonts/DemonicLettersFontLicense.txt) for more information) +* MysticCards.ttf: SIL Open Font License (see [files/data/fonts/MysticCardsFontLicense.txt](https://gitlab.com/OpenMW/openmw/-/raw/master/files/data/fonts/MysticCardsFontLicense.txt) for more information) Current Status -------------- diff --git a/apps/launcher/advancedpage.cpp b/apps/launcher/advancedpage.cpp index 51695654ba..e6dd74dbd7 100644 --- a/apps/launcher/advancedpage.cpp +++ b/apps/launcher/advancedpage.cpp @@ -205,7 +205,6 @@ bool Launcher::AdvancedPage::loadSettings() loadSettingBool(graphicHerbalismCheckBox, "graphic herbalism", "Game"); scalingSpinBox->setValue(Settings::Manager::getFloat("scaling factor", "GUI")); fontSizeSpinBox->setValue(Settings::Manager::getInt("font size", "GUI")); - ttfResolutionSpinBox->setValue(Settings::Manager::getInt("ttf resolution", "GUI")); } // Bug fixes @@ -373,10 +372,6 @@ void Launcher::AdvancedPage::saveSettings() int fontSize = fontSizeSpinBox->value(); if (fontSize != Settings::Manager::getInt("font size", "GUI")) Settings::Manager::setInt("font size", "GUI", fontSize); - - int ttfResolution = ttfResolutionSpinBox->value(); - if (ttfResolution != Settings::Manager::getInt("ttf resolution", "GUI")) - Settings::Manager::setInt("ttf resolution", "GUI", ttfResolution); } // Bug fixes diff --git a/apps/openmw/mwgui/debugwindow.cpp b/apps/openmw/mwgui/debugwindow.cpp index f4a4814654..93f5fdb076 100644 --- a/apps/openmw/mwgui/debugwindow.cpp +++ b/apps/openmw/mwgui/debugwindow.cpp @@ -92,14 +92,14 @@ namespace MWGui // - Shader editor MyGUI::TabItem* itemLV = mTabControl->addItem("Log Viewer"); - itemLV->setCaptionWithReplacing("#{DebugMenu:LogViewer}"); + itemLV->setCaptionWithReplacing(" #{DebugMenu:LogViewer} "); mLogView = itemLV->createWidgetReal ("LogEdit", MyGUI::FloatCoord(0,0,1,1), MyGUI::Align::Stretch); mLogView->setEditReadOnly(true); #ifndef BT_NO_PROFILE MyGUI::TabItem* item = mTabControl->addItem("Physics Profiler"); - item->setCaptionWithReplacing("#{DebugMenu:PhysicsProfiler}"); + item->setCaptionWithReplacing(" #{DebugMenu:PhysicsProfiler} "); mBulletProfilerEdit = item->createWidgetReal ("LogEdit", MyGUI::FloatCoord(0,0,1,1), MyGUI::Align::Stretch); #else diff --git a/apps/openmw/mwgui/dialogue.cpp b/apps/openmw/mwgui/dialogue.cpp index 1e740abe22..5fa144d254 100644 --- a/apps/openmw/mwgui/dialogue.cpp +++ b/apps/openmw/mwgui/dialogue.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -25,6 +26,7 @@ #include "bookpage.hpp" #include "textcolours.hpp" +#include "tooltips.hpp" #include "journalbooks.hpp" // to_utf8_span @@ -59,6 +61,8 @@ namespace MWGui PersuasionDialog::PersuasionDialog(ResponseCallback* callback) : WindowModal("openmw_persuasion_dialog.layout") , mCallback(callback) + , mInitialGoldLabelWidth(0) + , mInitialMainWidgetWidth(0) { getWidget(mCancelButton, "CancelButton"); getWidget(mAdmireButton, "AdmireButton"); @@ -68,6 +72,26 @@ namespace MWGui getWidget(mBribe100Button, "Bribe100Button"); getWidget(mBribe1000Button, "Bribe1000Button"); getWidget(mGoldLabel, "GoldLabel"); + getWidget(mActionsBox, "ActionsBox"); + + int totalHeight = 3; + adjustAction(mAdmireButton, totalHeight); + adjustAction(mIntimidateButton, totalHeight); + adjustAction(mTauntButton, totalHeight); + adjustAction(mBribe10Button, totalHeight); + adjustAction(mBribe100Button, totalHeight); + adjustAction(mBribe1000Button, totalHeight); + totalHeight += 3; + + int diff = totalHeight - mActionsBox->getSize().height; + if (diff > 0) + { + auto mainWidgetSize = mMainWidget->getSize(); + mMainWidget->setSize(mainWidgetSize.width, mainWidgetSize.height + diff); + } + + mInitialGoldLabelWidth = mActionsBox->getSize().width - mCancelButton->getSize().width - 8; + mInitialMainWidgetWidth = mMainWidget->getSize().width; mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &PersuasionDialog::onCancel); mAdmireButton->eventMouseButtonClick += MyGUI::newDelegate(this, &PersuasionDialog::onPersuade); @@ -78,6 +102,14 @@ namespace MWGui mBribe1000Button->eventMouseButtonClick += MyGUI::newDelegate(this, &PersuasionDialog::onPersuade); } + void PersuasionDialog::adjustAction(MyGUI::Widget* action, int& totalHeight) + { + const int lineHeight = MWBase::Environment::get().getWindowManager()->getFontHeight() + 2; + auto currentCoords = action->getCoord(); + action->setCoord(currentCoords.left, totalHeight, currentCoords.width, lineHeight); + totalHeight += lineHeight; + } + void PersuasionDialog::onCancel(MyGUI::Widget *sender) { setVisible(false); @@ -114,6 +146,13 @@ namespace MWGui mBribe1000Button->setEnabled (playerGold >= 1000); mGoldLabel->setCaptionWithReplacing("#{sGold}: " + MyGUI::utility::toString(playerGold)); + + int diff = mGoldLabel->getRequestedSize().width - mInitialGoldLabelWidth; + if (diff > 0) + mMainWidget->setSize(mInitialMainWidgetWidth + diff, mMainWidget->getSize().height); + else + mMainWidget->setSize(mInitialMainWidgetWidth, mMainWidget->getSize().height); + WindowModal::onOpen(); } diff --git a/apps/openmw/mwgui/dialogue.hpp b/apps/openmw/mwgui/dialogue.hpp index aff09c0211..f2bf961e5e 100644 --- a/apps/openmw/mwgui/dialogue.hpp +++ b/apps/openmw/mwgui/dialogue.hpp @@ -12,6 +12,7 @@ namespace Gui { + class AutoSizedTextBox; class MWList; } @@ -31,6 +32,9 @@ namespace MWGui private: std::unique_ptr mCallback; + int mInitialGoldLabelWidth; + int mInitialMainWidgetWidth; + MyGUI::Button* mCancelButton; MyGUI::Button* mAdmireButton; MyGUI::Button* mIntimidateButton; @@ -38,7 +42,10 @@ namespace MWGui MyGUI::Button* mBribe10Button; MyGUI::Button* mBribe100Button; MyGUI::Button* mBribe1000Button; - MyGUI::TextBox* mGoldLabel; + MyGUI::Widget* mActionsBox; + Gui::AutoSizedTextBox* mGoldLabel; + + void adjustAction(MyGUI::Widget* action, int& totalHeight); void onCancel (MyGUI::Widget* sender); void onPersuade (MyGUI::Widget* sender); diff --git a/apps/openmw/mwgui/itemwidget.cpp b/apps/openmw/mwgui/itemwidget.cpp index 3f0ac39693..a5658cb5d9 100644 --- a/apps/openmw/mwgui/itemwidget.cpp +++ b/apps/openmw/mwgui/itemwidget.cpp @@ -25,14 +25,29 @@ namespace if (count == 1) return ""; + // With small text size we can use up to 4 characters, while with large ones - only up to 3. + if (fontHeight > 16) + { + if (count > 999999999) + return MyGUI::utility::toString(count/1000000000) + "b"; + else if (count > 9999999) + return ">9m"; + else if (count > 999999) + return MyGUI::utility::toString(count/1000000) + "m"; + else if (count > 9999) + return ">9k"; + else if (count > 999) + return MyGUI::utility::toString(count/1000) + "k"; + else + return MyGUI::utility::toString(count); + } + if (count > 999999999) return MyGUI::utility::toString(count/1000000000) + "b"; else if (count > 999999) return MyGUI::utility::toString(count/1000000) + "m"; else if (count > 9999) return MyGUI::utility::toString(count/1000) + "k"; - else if (fontHeight >= 18 && count > 999) - return MyGUI::utility::toString(count/1000) + "k"; else return MyGUI::utility::toString(count); } diff --git a/apps/openmw/mwgui/trainingwindow.cpp b/apps/openmw/mwgui/trainingwindow.cpp index 96267cc7b2..24a4eb3607 100644 --- a/apps/openmw/mwgui/trainingwindow.cpp +++ b/apps/openmw/mwgui/trainingwindow.cpp @@ -98,6 +98,8 @@ namespace MWGui const MWWorld::Store &gmst = MWBase::Environment::get().getWorld()->getStore().get(); + const int lineHeight = MWBase::Environment::get().getWindowManager()->getFontHeight() + 2; + for (int i=0; i<3; ++i) { int price = static_cast(pcStats.getSkill (skills[i].first).getBase() * gmst.find("iTrainingMod")->mValue.getInteger()); @@ -105,7 +107,7 @@ namespace MWGui price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr, price, true); MyGUI::Button* button = mTrainingOptions->createWidget(price <= playerGold ? "SandTextButton" : "SandTextButtonDisabled", // can't use setEnabled since that removes tooltip - MyGUI::IntCoord(5, 5+i*18, mTrainingOptions->getWidth()-10, 18), MyGUI::Align::Default); + MyGUI::IntCoord(5, 5+i*lineHeight, mTrainingOptions->getWidth()-10, lineHeight), MyGUI::Align::Default); button->setUserData(skills[i].first); button->eventMouseButtonClick += MyGUI::newDelegate(this, &TrainingWindow::onTrainingSelected); diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index ac9b83eaba..b78276b259 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -207,7 +207,6 @@ namespace MWGui // Load fonts mFontLoader = std::make_unique(encoding, resourceSystem->getVFS(), mScalingFactor); - mFontLoader->loadFonts(); //Register own widgets with MyGUI MyGUI::FactoryManager::getInstance().registerFactory("Widget"); diff --git a/components/fontloader/fontloader.cpp b/components/fontloader/fontloader.cpp index fd415a20f3..c4fb3e4e18 100644 --- a/components/fontloader/fontloader.cpp +++ b/components/fontloader/fontloader.cpp @@ -25,11 +25,52 @@ #include #include +#include #include namespace { + MyGUI::xml::ElementPtr getProperty(MyGUI::xml::ElementPtr resourceNode, const std::string propertyName) + { + MyGUI::xml::ElementPtr propertyNode = nullptr; + MyGUI::xml::ElementEnumerator propertyIterator = resourceNode->getElementEnumerator(); + while (propertyIterator.next("Property")) + { + std::string key = propertyIterator->findAttribute("key"); + + if (key == propertyName) + { + propertyNode = propertyIterator.current(); + break; + } + } + + return propertyNode; + } + + MyGUI::IntSize getBookSize(MyGUI::IDataStream* layersStream) + { + MyGUI::xml::Document xmlDocument; + xmlDocument.open(layersStream); + MyGUI::xml::ElementPtr root = xmlDocument.getRoot(); + MyGUI::xml::ElementEnumerator layersIterator = root->getElementEnumerator(); + while (layersIterator.next("Layer")) + { + std::string name = layersIterator->findAttribute("name"); + + if (name == "JournalBooks") + { + MyGUI::xml::ElementPtr sizeProperty = getProperty(layersIterator.current(), "Size"); + const std::string& sizeValue = sizeProperty != nullptr ? sizeProperty->findAttribute("value") : std::string(); + if (!sizeValue.empty()) + return MyGUI::IntSize::parse(sizeValue); + } + } + + return MyGUI::RenderManager::getInstance().getViewSize(); + } + unsigned long utf8ToUnicode(std::string_view utf8) { if (utf8.empty()) @@ -155,7 +196,7 @@ namespace Gui FontLoader::FontLoader(ToUTF8::FromType encoding, const VFS::Manager* vfs, float scalingFactor) : mVFS(vfs) - , mFontHeight(std::clamp(Settings::Manager::getInt("font size", "GUI"), 12, 20)) + , mFontHeight(std::clamp(Settings::Manager::getInt("font size", "GUI"), 12, 18)) , mScalingFactor(scalingFactor) { if (encoding == ToUTF8::WINDOWS_1252) @@ -165,6 +206,8 @@ namespace Gui MyGUI::ResourceManager::getInstance().unregisterLoadXmlDelegate("Resource"); MyGUI::ResourceManager::getInstance().registerLoadXmlDelegate("Resource") = MyGUI::newDelegate(this, &FontLoader::overrideLineHeight); + + loadFonts(); } void FontLoader::loadFonts() @@ -176,10 +219,10 @@ namespace Gui loadFont("DejaVuLGCSansMono", "MonoFont"); // We need to use a TrueType monospace font to display debug texts properly. // Use our TrueType fonts as a fallback. - if (!MyGUI::ResourceManager::getInstance().isExist("DefaultFont") && !Misc::StringUtils::ciEqual(defaultFont, "Pelagiad")) - loadFont("Pelagiad", "DefaultFont"); - if (!MyGUI::ResourceManager::getInstance().isExist("ScrollFont") && !Misc::StringUtils::ciEqual(scrollFont, "OMWAyembedt")) - loadFont("OMWAyembedt", "ScrollFont"); + if (!MyGUI::ResourceManager::getInstance().isExist("DefaultFont") && !Misc::StringUtils::ciEqual(defaultFont, "MysticCards")) + loadFont("MysticCards", "DefaultFont"); + if (!MyGUI::ResourceManager::getInstance().isExist("ScrollFont") && !Misc::StringUtils::ciEqual(scrollFont, "DemonicLetters")) + loadFont("DemonicLetters", "ScrollFont"); } void FontLoader::loadFont(const std::string& fileName, const std::string& fontId) @@ -203,6 +246,11 @@ namespace Gui return; } + // TODO: it may be worth to take in account resolution change, but it is not safe to replace used assets + std::unique_ptr layersStream(dataManager->getData("openmw_layers.xml")); + MyGUI::IntSize bookSize = getBookSize(layersStream.get()); + float bookScale = osgMyGUI::ScalingLayer::getScaleFactor(bookSize); + std::string oldDataPath = dataManager->getDataPath(""); dataManager->setResourcePath("fonts"); std::unique_ptr dataStream(dataManager->getData(fileName)); @@ -226,15 +274,17 @@ namespace Gui return; } - // For TrueType fonts we should override Size and Resolution properties - // to allow to configure font size via config file, without need to edit XML files. - // Also we should take UI scaling factor in account. - int resolution = Settings::Manager::getInt("ttf resolution", "GUI"); - resolution = std::clamp(resolution, 50, 125) * mScalingFactor; + int resolution = 70; + MyGUI::xml::ElementPtr resolutionNode = getProperty(resourceNode.current(), "Resolution"); + if (resolutionNode == nullptr) + { + resolutionNode = resourceNode->createChild("Property"); + resolutionNode->addAttribute("key", "Resolution"); + } + else + resolution = MyGUI::utility::parseInt(resolutionNode->findAttribute("value")); - MyGUI::xml::ElementPtr resolutionNode = resourceNode->createChild("Property"); - resolutionNode->addAttribute("key", "Resolution"); - resolutionNode->addAttribute("value", std::to_string(resolution)); + resolutionNode->setAttribute("value", MyGUI::utility::toString(resolution * std::ceil(mScalingFactor))); MyGUI::xml::ElementPtr sizeNode = resourceNode->createChild("Property"); sizeNode->addAttribute("key", "Size"); @@ -246,16 +296,7 @@ namespace Gui font->setResourceName(fontId); MyGUI::ResourceManager::getInstance().addResource(font); - float currentX = Settings::Manager::getInt("resolution x", "Video"); - float currentY = Settings::Manager::getInt("resolution y", "Video"); - // TODO: read size from openmw_layout.xml somehow - // TODO: it may be worth to take in account resolution change, but it is not safe to replace used assets - float heightScale = (currentY / 520); - float widthScale = (currentX / 600); - float uiScale = std::min(widthScale, heightScale); - resolution = Settings::Manager::getInt("ttf resolution", "GUI"); - resolution = std::clamp(resolution, 50, 125) * uiScale; - resolutionNode->setAttribute("value", std::to_string(resolution)); + resolutionNode->setAttribute("value", MyGUI::utility::toString(static_cast(resolution * bookScale * mScalingFactor))); MyGUI::ResourceTrueTypeFont* bookFont = static_cast( MyGUI::FactoryManager::getInstance().createObject("Resource", "ResourceTrueTypeFont")); @@ -553,12 +594,9 @@ namespace Gui std::string FontLoader::getFontForFace(const std::string& face) { const std::string lowerFace = Misc::StringUtils::lowerCase(face); - - if (lowerFace == "magic cards") - return "DefaultFont"; if (lowerFace == "daedric") return "ScrollFont"; - return face; + return "DefaultFont"; } } diff --git a/components/fontloader/fontloader.hpp b/components/fontloader/fontloader.hpp index 3a2151787b..abc0b22bc6 100644 --- a/components/fontloader/fontloader.hpp +++ b/components/fontloader/fontloader.hpp @@ -27,8 +27,6 @@ namespace Gui public: FontLoader (ToUTF8::FromType encoding, const VFS::Manager* vfs, float scalingFactor); - void loadFonts(); - void overrideLineHeight(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version); int getFontHeight(); @@ -41,6 +39,7 @@ namespace Gui int mFontHeight; float mScalingFactor; + void loadFonts(); void loadFont(const std::string& fontName, const std::string& fontId); void loadBitmapFont (const std::string& fileName, const std::string& fontId); diff --git a/components/myguiplatform/scalinglayer.cpp b/components/myguiplatform/scalinglayer.cpp index 75a149c810..e0ab25819c 100644 --- a/components/myguiplatform/scalinglayer.cpp +++ b/components/myguiplatform/scalinglayer.cpp @@ -63,7 +63,7 @@ namespace osgMyGUI void ScalingLayer::screenToLayerCoords(int& _left, int& _top) const { - float scale = getScaleFactor(); + float scale = getScaleFactor(mViewSize); if (scale <= 0.f) return; @@ -79,14 +79,14 @@ namespace osgMyGUI _top += mViewSize.height/2; } - float ScalingLayer::getScaleFactor() const + float ScalingLayer::getScaleFactor(const MyGUI::IntSize& _layerViewSize) { MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); float w = static_cast(viewSize.width); float h = static_cast(viewSize.height); - float heightScale = (h / mViewSize.height); - float widthScale = (w / mViewSize.width); + float heightScale = (h / _layerViewSize.height); + float widthScale = (w / _layerViewSize.width); return std::min(widthScale, heightScale); } @@ -100,12 +100,12 @@ namespace osgMyGUI { MyGUI::IntSize globalViewSize = MyGUI::RenderManager::getInstance().getViewSize(); MyGUI::IntSize viewSize = globalViewSize; - float scale = getScaleFactor(); + float scale = getScaleFactor(mViewSize); viewSize.width = static_cast(viewSize.width / scale); viewSize.height = static_cast(viewSize.height / scale); - float hoffset = (globalViewSize.width - mViewSize.width*getScaleFactor())/2.f / static_cast(globalViewSize.width); - float voffset = (globalViewSize.height - mViewSize.height*getScaleFactor())/2.f / static_cast(globalViewSize.height); + float hoffset = (globalViewSize.width - mViewSize.width*getScaleFactor(mViewSize))/2.f / static_cast(globalViewSize.width); + float voffset = (globalViewSize.height - mViewSize.height*getScaleFactor(mViewSize))/2.f / static_cast(globalViewSize.height); ProxyRenderTarget proxy(_target, viewSize, hoffset, voffset); diff --git a/components/myguiplatform/scalinglayer.hpp b/components/myguiplatform/scalinglayer.hpp index f9fd92a784..805edb0d01 100644 --- a/components/myguiplatform/scalinglayer.hpp +++ b/components/myguiplatform/scalinglayer.hpp @@ -21,9 +21,10 @@ namespace osgMyGUI void resizeView(const MyGUI::IntSize& _viewSize) override; + static float getScaleFactor(const MyGUI::IntSize& _layerViewSize); + private: void screenToLayerCoords(int& _left, int& _top) const; - float getScaleFactor() const; }; } diff --git a/components/widgets/fontwrapper.hpp b/components/widgets/fontwrapper.hpp index 16ebba3587..b4150a725a 100644 --- a/components/widgets/fontwrapper.hpp +++ b/components/widgets/fontwrapper.hpp @@ -35,7 +35,7 @@ namespace Gui std::string getFontSize() { // Note: we can not use the FontLoader here, so there is a code duplication a bit. - static const std::string fontSize = std::to_string(std::clamp(Settings::Manager::getInt("font size", "GUI"), 12, 20)); + static const std::string fontSize = std::to_string(std::clamp(Settings::Manager::getInt("font size", "GUI"), 12, 18)); return fontSize; } }; diff --git a/docs/source/reference/modding/font.rst b/docs/source/reference/modding/font.rst index 8b3be358e6..ae2a457e44 100644 --- a/docs/source/reference/modding/font.rst +++ b/docs/source/reference/modding/font.rst @@ -3,8 +3,8 @@ Fonts Default UI font and font used in magic scrolls are defined in ``openmw.cfg``: - fallback=Fonts_Font_0,Pelagiad - fallback=Fonts_Font_2,OMWAyembedt + fallback=Fonts_Font_0,MysticCards + fallback=Fonts_Font_2,DemonicLetters When there are no ``Fonts_Font_*`` lines in user's ``openmw.cfg``, built-in TrueType fonts are used. Font used by console and another debug windows is not configurable (so ``Fonts_Font_1`` is unused). @@ -30,23 +30,22 @@ TrueType fonts -------------- Unlike vanilla Morrowind, OpenMW directly supports TrueType (``.ttf``) fonts. This is the recommended fonts format. -OpenMW has build-in TrueType fonts: Pelagiad, OMWAyembedt and DejaVuLGCSansMono, which are used by default. +OpenMW has build-in TrueType fonts: MysticCards, DemonicLetters and DejaVuLGCSansMono, which are used by default. TrueType fonts are configured via ``openmw.cfg`` too: - fallback=Fonts_Font_0,Pelagiad - fallback=Fonts_Font_2,OMWAyembedt + fallback=Fonts_Font_0,MysticCards + fallback=Fonts_Font_2,DemonicLetters In this example, OpenMW will scan ``Fonts`` folder in data directories for ``.omwfont`` files. These files are XML files with schema provided by MyGUI. OpenMW uses ``.omwfont`` files which name (without extension) matches ``openmw.cfg`` entries. -It is also possible to adjust the font size and resolution via ``settings.cfg`` file:: +It is also possible to adjust the font size via ``settings.cfg`` file:: [GUI] font size = 16 - ttf resolution = 75 -The ``font size`` setting accepts clamped values in range from 12 to 20 while ``ttf resolution`` setting accepts values from 50 to 125. +The ``font size`` setting accepts clamped values in range from 12 to 18. -Any Resolution or Size properties in the ``.omwfont`` file have no effect because the engine settings override them. +Any Size property in the ``.omwfont`` file has no effect because the engine overrides it. The engine automatically takes UI scaling factor into account, so don't account for it when tweaking the settings. diff --git a/docs/source/reference/modding/settings/GUI.rst b/docs/source/reference/modding/settings/GUI.rst index 08f3fbd830..d9ab6af197 100644 --- a/docs/source/reference/modding/settings/GUI.rst +++ b/docs/source/reference/modding/settings/GUI.rst @@ -17,7 +17,7 @@ font size --------- :Type: integer -:Range: 12 to 20 +:Range: 12 to 18 :Default: 16 Allows to specify glyph size for in-game fonts. @@ -26,18 +26,6 @@ TrueType fonts do not have this issue. This setting can be configured in the Interface section of Advanced tab of the launcher. -ttf resolution --------------- - -:Type: integer -:Range: 50 to 125 -:Default: 75 - -Allows to specify resolution for in-game TrueType fonts. -Note: actual resolution depends on "scaling factor" setting value, this value is for 1.0 scaling factor. - -This setting can be configured in the Interface section of Advanced tab of the launcher. - menu transparency ----------------- diff --git a/files/data/CMakeLists.txt b/files/data/CMakeLists.txt index 6186759102..2630fbed84 100644 --- a/files/data/CMakeLists.txt +++ b/files/data/CMakeLists.txt @@ -13,12 +13,12 @@ set(BUILTIN_DATA_FILES fonts/DejaVuFontLicense.txt fonts/DejaVuLGCSansMono.ttf fonts/DejaVuLGCSansMono.omwfont - fonts/OMWAyembedt.ttf - fonts/OMWAyembedt.omwfont - fonts/OMWAyembedtFontLicense.txt - fonts/Pelagiad.ttf - fonts/Pelagiad.omwfont - fonts/PelagiadFontLicense.txt + fonts/DemonicLetters.ttf + fonts/DemonicLetters.omwfont + fonts/DemonicLettersFontLicense.txt + fonts/MysticCards.ttf + fonts/MysticCards.omwfont + fonts/MysticCardsFontLicense.txt l10n/BuiltInShaders/de.yaml l10n/BuiltInShaders/en.yaml diff --git a/files/data/fonts/DejaVuLGCSansMono.omwfont b/files/data/fonts/DejaVuLGCSansMono.omwfont index 5e6726c2fb..0d5a115c18 100644 --- a/files/data/fonts/DejaVuLGCSansMono.omwfont +++ b/files/data/fonts/DejaVuLGCSansMono.omwfont @@ -4,6 +4,7 @@ + diff --git a/files/data/fonts/OMWAyembedt.omwfont b/files/data/fonts/DemonicLetters.omwfont similarity index 52% rename from files/data/fonts/OMWAyembedt.omwfont rename to files/data/fonts/DemonicLetters.omwfont index 5abf514e24..adbf7bd7b5 100644 --- a/files/data/fonts/OMWAyembedt.omwfont +++ b/files/data/fonts/DemonicLetters.omwfont @@ -1,11 +1,15 @@ - + + + - + + + diff --git a/files/data/fonts/DemonicLetters.ttf b/files/data/fonts/DemonicLetters.ttf new file mode 100644 index 0000000000000000000000000000000000000000..33b5fc7c2dd725da319c91584e6c39be9b0adfd9 GIT binary patch literal 21188 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

b z3G||RIBXuRY#!)lSnB3LkT8Q6OGpS&4o<89jdGRUxI~=Z%BHmKy`oV^RVGQ;0YwrF zcW*f)gP<`Q=Lem@Mq}00tW2Mm~pve#2P6#F!Oztmw?zRio7KchDYBFI|`!OV3U$YRl6Tayzy( zKe>EmY;i(QFX;=5^Ow`(6XSY(YzggnO23j`o}OP>)-hsnY;O4~_6Pdd+*SQzdTubJa0@jNu?(+Z&Cv< z7p6gZ?0kAAy?iyLPo|gWNOKZI$Ml7<#pU#cm6@?cePLyBVIKR&vAJ=OolDP6E@G95 z*@?Mj4P0HAU%0xMo|;}xVbU@>Q~L7a*!aZk*y2T;87%7a5P4BIhV+6<(9kC?W1PM; zJvK9=)i8T<2nKwuPS zYf^FJ6Js+V2wcqFJGK``HP-iiex7fMC=Wh!!1oFHJ!a$Q?x*?f$ou^8f0*L`U1(F< zl@2^nl*IF#UHCr@j^G5W2cHY~;aeI<@okMkd}C=C-{lxpjw#3Sl*viulycfQ>zg!A zRny8NI5VBW$r(>&7jVkAh;y=KoR(e2Y2Kqae|=1OT)C#a&V|i+KYk2e1ip`n? - + + + - + + - + + - + + - + + - - - - + - - diff --git a/files/data/fonts/MysticCards.ttf b/files/data/fonts/MysticCards.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6e7401e1fcae4cf0d68f9227a299a818a586ca6 GIT binary patch literal 29328 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 - + diff --git a/files/data/mygui/openmw_persuasion_dialog.layout b/files/data/mygui/openmw_persuasion_dialog.layout index 3b10588ec8..977da40f8f 100644 --- a/files/data/mygui/openmw_persuasion_dialog.layout +++ b/files/data/mygui/openmw_persuasion_dialog.layout @@ -3,12 +3,12 @@ - + - + @@ -35,11 +35,11 @@ - + - + diff --git a/files/data/mygui/openmw_resources.xml b/files/data/mygui/openmw_resources.xml index 03ca91f5eb..70fccbfbe7 100644 --- a/files/data/mygui/openmw_resources.xml +++ b/files/data/mygui/openmw_resources.xml @@ -41,13 +41,13 @@ - + - + - - + + @@ -63,8 +63,8 @@ - - + + @@ -75,8 +75,8 @@ - - + + diff --git a/files/data/mygui/openmw_settings_window.layout b/files/data/mygui/openmw_settings_window.layout index d698844d2e..9042a13546 100644 --- a/files/data/mygui/openmw_settings_window.layout +++ b/files/data/mygui/openmw_settings_window.layout @@ -5,7 +5,7 @@ - + @@ -98,7 +98,7 @@ - + @@ -108,7 +108,7 @@ - + @@ -118,7 +118,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -140,7 +140,7 @@ - + @@ -198,9 +198,9 @@ - + - + @@ -211,15 +211,15 @@ - + - + - + @@ -237,10 +237,10 @@ - + - + @@ -250,15 +250,15 @@ - + - + - + @@ -270,11 +270,11 @@ - + - + @@ -286,7 +286,7 @@ - + @@ -296,7 +296,7 @@ - + @@ -306,7 +306,7 @@ - + @@ -369,7 +369,7 @@ - + @@ -432,7 +432,7 @@ - + @@ -529,7 +529,7 @@ - + @@ -637,7 +637,7 @@ - + @@ -678,7 +678,7 @@ - + diff --git a/files/data/mygui/openmw_stats_window.layout b/files/data/mygui/openmw_stats_window.layout index 77de3ac753..2fcede969f 100644 --- a/files/data/mygui/openmw_stats_window.layout +++ b/files/data/mygui/openmw_stats_window.layout @@ -21,7 +21,7 @@ - + @@ -41,7 +41,7 @@ - + @@ -61,7 +61,7 @@ - + diff --git a/files/data/mygui/openmw_text.skin.xml b/files/data/mygui/openmw_text.skin.xml index 5f96d0a57c..00a69c486b 100644 --- a/files/data/mygui/openmw_text.skin.xml +++ b/files/data/mygui/openmw_text.skin.xml @@ -149,18 +149,18 @@ color_misc=0,205,205 # ???? - + - + - + diff --git a/files/data/mygui/openmw_wait_dialog_progressbar.layout b/files/data/mygui/openmw_wait_dialog_progressbar.layout index 8147abbdfb..720bfa4327 100644 --- a/files/data/mygui/openmw_wait_dialog_progressbar.layout +++ b/files/data/mygui/openmw_wait_dialog_progressbar.layout @@ -4,7 +4,7 @@ - + diff --git a/files/openmw.cfg b/files/openmw.cfg index fb4cf70f5f..4c25d6ed98 100644 --- a/files/openmw.cfg +++ b/files/openmw.cfg @@ -71,9 +71,9 @@ fallback=Water_UnderwaterColor,012,030,037 fallback=Water_UnderwaterColorWeight,0.85 # fonts -fallback=Fonts_Font_0,Pelagiad +fallback=Fonts_Font_0,MysticCards fallback=Fonts_Font_1,DejaVuLGCSansMono -fallback=Fonts_Font_2,OMWAyembedt +fallback=Fonts_Font_2,DemonicLetters fallback=FontColor_color_normal,202,165,96 fallback=FontColor_color_normal_over,223,201,159 fallback=FontColor_color_normal_pressed,243,237,221 diff --git a/files/openmw.cfg.local b/files/openmw.cfg.local index cb05d5f22a..ee8bda8196 100644 --- a/files/openmw.cfg.local +++ b/files/openmw.cfg.local @@ -71,9 +71,9 @@ fallback=Water_UnderwaterColor,012,030,037 fallback=Water_UnderwaterColorWeight,0.85 # fonts -fallback=Fonts_Font_0,Pelagiad +fallback=Fonts_Font_0,MysticCards fallback=Fonts_Font_1,DejaVuLGCSansMono -fallback=Fonts_Font_2,OMWAyembedt +fallback=Fonts_Font_2,DemonicLetters fallback=FontColor_color_normal,202,165,96 fallback=FontColor_color_normal_over,223,201,159 fallback=FontColor_color_normal_pressed,243,237,221 diff --git a/files/settings-default.cfg b/files/settings-default.cfg index 644858c4ff..8a6fc40fd7 100644 --- a/files/settings-default.cfg +++ b/files/settings-default.cfg @@ -192,9 +192,6 @@ scaling factor = 1.0 # Size of in-game fonts font size = 16 -# Resolution of TrueType fonts glyphs -ttf resolution = 75 - # Transparency of GUI windows (0.0 to 1.0, transparent to opaque). menu transparency = 0.84 diff --git a/files/ui/advancedpage.ui b/files/ui/advancedpage.ui index 42b46080fd..6a50fc8a9b 100644 --- a/files/ui/advancedpage.ui +++ b/files/ui/advancedpage.ui @@ -946,7 +946,7 @@ 12 - 20 + 18 1 @@ -1063,33 +1063,6 @@ - - - - Resolution of TrueType fonts glyphs. Automatically takes in account UI scaling factor. -Lower values make text more blurry, higher ones - more pixelated. - - - TTF texture resolution - - - - - - - 50 - - - 125 - - - 5 - - - 75 - - -