You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw-tes3mp/apps/openmw/mwgui/resourceskin.cpp

84 lines
2.9 KiB
C++

#include "resourceskin.hpp"
#include <MyGUI_RenderManager.h>
#include <components/misc/stringops.hpp>
namespace MWGui
{
void resizeSkin(MyGUI::xml::ElementPtr _node)
{
_node->setAttribute("type", "ResourceSkin");
const std::string size = _node->findAttribute("size");
if (!size.empty())
return;
const std::string textureName = _node->findAttribute("texture");
if (textureName.empty())
return;
MyGUI::ITexture* texture = MyGUI::RenderManager::getInstance().getTexture(textureName);
if (!texture)
return;
MyGUI::IntCoord coord(0, 0, texture->getWidth(), texture->getHeight());
MyGUI::xml::ElementEnumerator basis = _node->getElementEnumerator();
const std::string textureSize = std::to_string(coord.width) + " " + std::to_string(coord.height);
_node->addAttribute("size", textureSize);
while (basis.next())
{
if (basis->getName() != "BasisSkin")
continue;
const std::string basisSkinType = basis->findAttribute("type");
if (Misc::StringUtils::ciEqual(basisSkinType, "SimpleText"))
continue;
const std::string offset = basis->findAttribute("offset");
if (!offset.empty())
continue;
basis->addAttribute("offset", coord);
MyGUI::xml::ElementEnumerator state = basis->getElementEnumerator();
while (state.next())
{
if (state->getName() == "State")
{
const std::string stateOffset = state->findAttribute("offset");
if (!stateOffset.empty())
continue;
state->addAttribute("offset", coord);
if (Misc::StringUtils::ciEqual(basisSkinType, "TileRect"))
{
MyGUI::xml::ElementEnumerator property = state->getElementEnumerator();
bool hasTileSize = false;
while (property.next("Property"))
{
const std::string key = property->findAttribute("key");
if (key != "TileSize")
continue;
hasTileSize = true;
}
if (!hasTileSize)
{
MyGUI::xml::ElementPtr tileSizeProperty = state->createChild("Property");
tileSizeProperty->addAttribute("key", "TileSize");
tileSizeProperty->addAttribute("value", textureSize);
}
}
}
}
}
}
void AutoSizedResourceSkin::deserialization(MyGUI::xml::ElementPtr _node, MyGUI::Version _version)
{
resizeSkin(_node);
Base::deserialization(_node, _version);
}
}