mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 17:39:42 +00:00
Scale journal fonts separately from common ones
This commit is contained in:
parent
f89393fd62
commit
c9c0230d2a
11 changed files with 102 additions and 24 deletions
|
@ -264,18 +264,29 @@ struct TypesetBookImpl::Typesetter : BookTypesetter
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Style * createStyle (char const * fontName, const Colour& fontColour)
|
Style * createStyle (const std::string& fontName, const Colour& fontColour)
|
||||||
{
|
{
|
||||||
if (strcmp(fontName, "") == 0)
|
const std::string templateName = "Journalbook ";
|
||||||
return createStyle(MyGUI::FontManager::getInstance().getDefaultFont().c_str(), fontColour);
|
std::string bookFont;
|
||||||
|
if (fontName.empty())
|
||||||
|
{
|
||||||
|
bookFont = MyGUI::FontManager::getInstance().getDefaultFont();
|
||||||
|
bookFont = templateName + bookFont;
|
||||||
|
return createStyle(bookFont, fontColour);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fontName.compare(0, templateName.size(), templateName) == 0)
|
||||||
|
bookFont = fontName;
|
||||||
|
else
|
||||||
|
bookFont = templateName + bookFont;
|
||||||
|
|
||||||
for (Styles::iterator i = mBook->mStyles.begin (); i != mBook->mStyles.end (); ++i)
|
for (Styles::iterator i = mBook->mStyles.begin (); i != mBook->mStyles.end (); ++i)
|
||||||
if (i->match (fontName, fontColour, fontColour, fontColour, 0))
|
if (i->match (bookFont.c_str(), fontColour, fontColour, fontColour, 0))
|
||||||
return &*i;
|
return &*i;
|
||||||
|
|
||||||
MyGUI::IFont* font = MyGUI::FontManager::getInstance().getByName(fontName);
|
MyGUI::IFont* font = MyGUI::FontManager::getInstance().getByName(bookFont);
|
||||||
if (!font)
|
if (!font)
|
||||||
throw std::runtime_error(std::string("can't find font ") + fontName);
|
throw std::runtime_error(std::string("can't find font ") + bookFont);
|
||||||
|
|
||||||
StyleImpl & style = *mBook->mStyles.insert (mBook->mStyles.end (), StyleImpl ());
|
StyleImpl & style = *mBook->mStyles.insert (mBook->mStyles.end (), StyleImpl ());
|
||||||
style.mFont = font;
|
style.mFont = font;
|
||||||
|
|
|
@ -102,7 +102,7 @@ namespace MWGui
|
||||||
static Ptr create (int pageWidth, int pageHeight);
|
static Ptr create (int pageWidth, int pageHeight);
|
||||||
|
|
||||||
/// Create a simple text style consisting of a font and a text color.
|
/// Create a simple text style consisting of a font and a text color.
|
||||||
virtual Style* createStyle (char const * Font, const Colour& Colour) = 0;
|
virtual Style* createStyle (const std::string& fontName, const Colour& colour) = 0;
|
||||||
|
|
||||||
/// Create a hyper-link style with a user-defined identifier based on an
|
/// Create a hyper-link style with a user-defined identifier based on an
|
||||||
/// existing style. The unique flag forces a new instance of this style
|
/// existing style. The unique flag forces a new instance of this style
|
||||||
|
|
|
@ -377,7 +377,7 @@ namespace MWGui
|
||||||
if (attr.find("face") != attr.end())
|
if (attr.find("face") != attr.end())
|
||||||
{
|
{
|
||||||
std::string face = attr.at("face");
|
std::string face = attr.at("face");
|
||||||
mTextStyle.mFont = face;
|
mTextStyle.mFont = "Journalbook "+face;
|
||||||
}
|
}
|
||||||
if (attr.find("size") != attr.end())
|
if (attr.find("size") != attr.end())
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace MWGui
|
||||||
{
|
{
|
||||||
TextStyle() :
|
TextStyle() :
|
||||||
mColour(0,0,0)
|
mColour(0,0,0)
|
||||||
, mFont("Default")
|
, mFont("")
|
||||||
, mTextSize(16)
|
, mTextSize(16)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,47 +293,90 @@ namespace MWGui
|
||||||
|
|
||||||
void WindowManager::loadFontDelegate(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
|
void WindowManager::loadFontDelegate(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
|
||||||
{
|
{
|
||||||
MyGUI::xml::ElementEnumerator root = _node->getElementEnumerator();
|
const std::string templateName = "Journalbook ";
|
||||||
while (root.next("Resource"))
|
MyGUI::xml::ElementEnumerator font = _node->getElementEnumerator();
|
||||||
|
bool createCopy = false;
|
||||||
|
while (font.next("Resource"))
|
||||||
{
|
{
|
||||||
std::string type, name;
|
std::string type, name;
|
||||||
root->findAttribute("type", type);
|
font->findAttribute("type", type);
|
||||||
root->findAttribute("name", name);
|
font->findAttribute("name", name);
|
||||||
|
|
||||||
if (name.empty())
|
if (name.empty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (Misc::StringUtils::ciEqual(type, "ResourceTrueTypeFont"))
|
if (Misc::StringUtils::ciEqual(type, "ResourceTrueTypeFont"))
|
||||||
{
|
{
|
||||||
|
createCopy = true;
|
||||||
|
|
||||||
// For TrueType fonts we should override Size and Resolution properties
|
// For TrueType fonts we should override Size and Resolution properties
|
||||||
// to allow to configure font size via config file, without need to edit XML file.
|
// to allow to configure font size via config file, without need to edit XML files.
|
||||||
// Also we should take UI scaling factor in account
|
// Also we should take UI scaling factor in account.
|
||||||
int resolution = Settings::Manager::getInt("ttf resolution", "GUI");
|
int resolution = Settings::Manager::getInt("ttf resolution", "GUI");
|
||||||
resolution = std::min(960, std::max(48, resolution));
|
resolution = std::min(960, std::max(48, resolution));
|
||||||
|
|
||||||
float uiScale = Settings::Manager::getFloat("scaling factor", "GUI");
|
float uiScale = Settings::Manager::getFloat("scaling factor", "GUI");
|
||||||
|
resolution *= uiScale;
|
||||||
|
|
||||||
if (uiScale > 1.0f)
|
MyGUI::xml::ElementPtr resolutionNode = font->createChild("Property");
|
||||||
resolution *= uiScale;
|
|
||||||
|
|
||||||
MyGUI::xml::ElementPtr resolutionNode = root->createChild("Property");
|
|
||||||
resolutionNode->addAttribute("key", "Resolution");
|
resolutionNode->addAttribute("key", "Resolution");
|
||||||
resolutionNode->addAttribute("value", std::to_string(resolution));
|
resolutionNode->addAttribute("value", std::to_string(resolution));
|
||||||
|
|
||||||
MyGUI::xml::ElementPtr sizeNode = root->createChild("Property");
|
MyGUI::xml::ElementPtr sizeNode = font->createChild("Property");
|
||||||
sizeNode->addAttribute("key", "Size");
|
sizeNode->addAttribute("key", "Size");
|
||||||
sizeNode->addAttribute("value", std::to_string(mFontHeight));
|
sizeNode->addAttribute("value", std::to_string(mFontHeight));
|
||||||
}
|
}
|
||||||
else if (Misc::StringUtils::ciEqual(type, "ResourceSkin"))
|
else if (Misc::StringUtils::ciEqual(type, "ResourceSkin"))
|
||||||
{
|
{
|
||||||
// We should adjust line height for MyGUI widgets depending on font size
|
// We should adjust line height for MyGUI widgets depending on font size
|
||||||
MyGUI::xml::ElementPtr heightNode = root->createChild("Property");
|
MyGUI::xml::ElementPtr heightNode = font->createChild("Property");
|
||||||
heightNode->addAttribute("key", "HeightLine");
|
heightNode->addAttribute("key", "HeightLine");
|
||||||
heightNode->addAttribute("value", std::to_string(mFontHeight+2));
|
heightNode->addAttribute("value", std::to_string(mFontHeight+2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyGUI::ResourceManager::getInstance().loadFromXmlNode(_node, _file, _version);
|
MyGUI::ResourceManager::getInstance().loadFromXmlNode(_node, _file, _version);
|
||||||
|
|
||||||
|
if (createCopy)
|
||||||
|
{
|
||||||
|
MyGUI::xml::ElementPtr copy = _node->createCopy();
|
||||||
|
|
||||||
|
MyGUI::xml::ElementEnumerator copyFont = copy->getElementEnumerator();
|
||||||
|
while (copyFont.next("Resource"))
|
||||||
|
{
|
||||||
|
std::string type, name;
|
||||||
|
copyFont->findAttribute("type", type);
|
||||||
|
copyFont->findAttribute("name", name);
|
||||||
|
|
||||||
|
if (name.empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (Misc::StringUtils::ciEqual(type, "ResourceTrueTypeFont"))
|
||||||
|
{
|
||||||
|
// Since the journal and books use the custom scaling factor depending on resolution,
|
||||||
|
// setup separate fonts with different Resolution to fit these windows.
|
||||||
|
// These fonts have an internal prefix.
|
||||||
|
int resolution = Settings::Manager::getInt("ttf resolution", "GUI");
|
||||||
|
resolution = std::min(960, std::max(48, resolution));
|
||||||
|
|
||||||
|
float currentX = Settings::Manager::getInt("resolution x", "Video");
|
||||||
|
float currentY = Settings::Manager::getInt("resolution y", "Video");
|
||||||
|
// TODO: read size from openmw_layout.xml
|
||||||
|
float heightScale = (currentY / 520);
|
||||||
|
float widthScale = (currentX / 600);
|
||||||
|
float uiScale = std::min(widthScale, heightScale);
|
||||||
|
resolution *= uiScale;
|
||||||
|
|
||||||
|
MyGUI::xml::ElementPtr resolutionNode = copyFont->createChild("Property");
|
||||||
|
resolutionNode->addAttribute("key", "Resolution");
|
||||||
|
resolutionNode->addAttribute("value", std::to_string(resolution));
|
||||||
|
|
||||||
|
copyFont->setAttribute("name", "Journalbook " + name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::ResourceManager::getInstance().loadFromXmlNode(copy, _file, _version);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::initUI()
|
void WindowManager::initUI()
|
||||||
|
|
|
@ -480,6 +480,14 @@ namespace Gui
|
||||||
|
|
||||||
font->deserialization(root, MyGUI::Version(3,2,0));
|
font->deserialization(root, MyGUI::Version(3,2,0));
|
||||||
|
|
||||||
|
// Setup "book" version of font as fallback if we will not use TrueType fonts
|
||||||
|
MyGUI::ResourceManualFont* bookFont = static_cast<MyGUI::ResourceManualFont*>(
|
||||||
|
MyGUI::FactoryManager::getInstance().createObject("Resource", "ResourceManualFont"));
|
||||||
|
mFonts.push_back(bookFont);
|
||||||
|
bookFont->deserialization(root, MyGUI::Version(3,2,0));
|
||||||
|
bookFont->setResourceName("Journalbook " + resourceName);
|
||||||
|
|
||||||
|
// Remove automatically registered fonts
|
||||||
for (std::vector<MyGUI::ResourceManualFont*>::iterator it = mFonts.begin(); it != mFonts.end();)
|
for (std::vector<MyGUI::ResourceManualFont*>::iterator it = mFonts.begin(); it != mFonts.end();)
|
||||||
{
|
{
|
||||||
if ((*it)->getResourceName() == font->getResourceName())
|
if ((*it)->getResourceName() == font->getResourceName())
|
||||||
|
@ -487,10 +495,17 @@ namespace Gui
|
||||||
MyGUI::ResourceManager::getInstance().removeByName(font->getResourceName());
|
MyGUI::ResourceManager::getInstance().removeByName(font->getResourceName());
|
||||||
it = mFonts.erase(it);
|
it = mFonts.erase(it);
|
||||||
}
|
}
|
||||||
|
else if ((*it)->getResourceName() == bookFont->getResourceName())
|
||||||
|
{
|
||||||
|
MyGUI::ResourceManager::getInstance().removeByName(bookFont->getResourceName());
|
||||||
|
it = mFonts.erase(it);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
|
|
||||||
MyGUI::ResourceManager::getInstance().addResource(font);
|
MyGUI::ResourceManager::getInstance().addResource(font);
|
||||||
|
MyGUI::ResourceManager::getInstance().addResource(bookFont);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <components/debug/debuglog.hpp>
|
#include <components/debug/debuglog.hpp>
|
||||||
|
|
||||||
|
#include <MyGUI_ResourceManager.h>
|
||||||
|
|
||||||
#include <osgViewer/Viewer>
|
#include <osgViewer/Viewer>
|
||||||
|
|
||||||
#include <SDL_video.h>
|
#include <SDL_video.h>
|
||||||
|
@ -89,6 +91,9 @@ namespace SDLUtil
|
||||||
SDL_SetWindowSize(mWindow, width, height);
|
SDL_SetWindowSize(mWindow, width, height);
|
||||||
SDL_SetWindowBordered(mWindow, windowBorder ? SDL_TRUE : SDL_FALSE);
|
SDL_SetWindowBordered(mWindow, windowBorder ? SDL_TRUE : SDL_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We should reload TrueType fonts for new resolution
|
||||||
|
MyGUI::ResourceManager::getInstance().load("openmw_font.xml");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ ttf resolution
|
||||||
:Default: 96
|
:Default: 96
|
||||||
|
|
||||||
Allows to specify resolution for in-game TrueType fonts.
|
Allows to specify resolution for in-game TrueType fonts.
|
||||||
Note: actual resolution depends on "scaling factor" setting value, this value is for 1.0 or lower scaling factor.
|
Note: actual resolution depends on "scaling factor" setting value, this value is for 1.0 scaling factor.
|
||||||
|
|
||||||
menu transparency
|
menu transparency
|
||||||
-----------------
|
-----------------
|
||||||
|
|
|
@ -32,11 +32,13 @@
|
||||||
</Widget>
|
</Widget>
|
||||||
|
|
||||||
<Widget type="TextBox" skin="NormalText" position="30 358 250 16" name="LeftPageNumber">
|
<Widget type="TextBox" skin="NormalText" position="30 358 250 16" name="LeftPageNumber">
|
||||||
|
<Property key="FontName" value="Journalbook Magic Cards"/>
|
||||||
<Property key="TextColour" value="0 0 0"/>
|
<Property key="TextColour" value="0 0 0"/>
|
||||||
<Property key="TextAlign" value="Center"/>
|
<Property key="TextAlign" value="Center"/>
|
||||||
<Property key="NeedMouse" value="false"/>
|
<Property key="NeedMouse" value="false"/>
|
||||||
</Widget>
|
</Widget>
|
||||||
<Widget type="TextBox" skin="NormalText" position="310 358 250 16" name="RightPageNumber">
|
<Widget type="TextBox" skin="NormalText" position="310 358 250 16" name="RightPageNumber">
|
||||||
|
<Property key="FontName" value="Journalbook Magic Cards"/>
|
||||||
<Property key="TextColour" value="0 0 0"/>
|
<Property key="TextColour" value="0 0 0"/>
|
||||||
<Property key="TextAlign" value="Center"/>
|
<Property key="TextAlign" value="Center"/>
|
||||||
<Property key="NeedMouse" value="false"/>
|
<Property key="NeedMouse" value="false"/>
|
||||||
|
|
|
@ -25,10 +25,12 @@
|
||||||
</Widget>
|
</Widget>
|
||||||
|
|
||||||
<Widget type="TextBox" skin="NormalText" position="150 350 32 16" name="PageOneNum">
|
<Widget type="TextBox" skin="NormalText" position="150 350 32 16" name="PageOneNum">
|
||||||
|
<Property key="FontName" value="Journalbook Magic Cards"/>
|
||||||
<Property key="TextColour" value="0 0 0"/>
|
<Property key="TextColour" value="0 0 0"/>
|
||||||
</Widget>
|
</Widget>
|
||||||
|
|
||||||
<Widget type="TextBox" skin="NormalText" position="410 350 32 16" name="PageTwoNum">
|
<Widget type="TextBox" skin="NormalText" position="410 350 32 16" name="PageTwoNum">
|
||||||
|
<Property key="FontName" value="Journalbook Magic Cards"/>
|
||||||
<Property key="TextColour" value="0 0 0"/>
|
<Property key="TextColour" value="0 0 0"/>
|
||||||
</Widget>
|
</Widget>
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<MyGUI type="Resource" version="1.1">
|
<MyGUI type="Resource" version="1.1">
|
||||||
<Resource type="ResourceSkin" name="MW_BookClient" size="10 10">
|
<Resource type="ResourceSkin" name="MW_BookClient" size="10 10">
|
||||||
<Property key="FontName" value="Default"/>
|
<Property key="FontName" value="Journalbook Magic Cards"/>
|
||||||
<Property key="TextAlign" value="Left Top"/>
|
<Property key="TextAlign" value="Left Top"/>
|
||||||
<Property key="TextColour" value="0 0 0"/>
|
<Property key="TextColour" value="0 0 0"/>
|
||||||
<BasisSkin type="EditText" offset="0 0 10 10" align="Stretch"/>
|
<BasisSkin type="EditText" offset="0 0 10 10" align="Stretch"/>
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
</Resource>
|
</Resource>
|
||||||
|
|
||||||
<Resource type="ResourceSkin" name="MW_QuestLink" size="5 5">
|
<Resource type="ResourceSkin" name="MW_QuestLink" size="5 5">
|
||||||
<Property key="FontName" value="Default"/>
|
<Property key="FontName" value="Journalbook Magic Cards"/>
|
||||||
<Property key="TextAlign" value="Left VCenter"/>
|
<Property key="TextAlign" value="Left VCenter"/>
|
||||||
|
|
||||||
<BasisSkin type="SimpleText" offset="2 0 1 5" align="Stretch">
|
<BasisSkin type="SimpleText" offset="2 0 1 5" align="Stretch">
|
||||||
|
|
Loading…
Reference in a new issue