std::string Config::getValue(const std::string& key) { OTMLNodePtr child = m_confsDoc->get(key); if(child) return child->value(); else return ""; }
void BitmapFont::load(const OTMLNodePtr& fontNode) { OTMLNodePtr textureNode = fontNode->at("texture"); std::string textureFile = stdext::resolve_path(textureNode->value(), textureNode->source()); Size glyphSize = fontNode->valueAt<Size>("glyph-size"); m_glyphHeight = fontNode->valueAt<int>("height"); m_yOffset = fontNode->valueAt("y-offset", 0); m_firstGlyph = fontNode->valueAt("first-glyph", 32); m_glyphSpacing = fontNode->valueAt("spacing", Size(0,0)); int spaceWidth = fontNode->valueAt("space-width", glyphSize.width()); // load font texture m_texture = g_textures.getTexture(textureFile); if(OTMLNodePtr node = fontNode->get("fixed-glyph-width")) { for(int glyph = m_firstGlyph; glyph < 256; ++glyph) m_glyphsSize[glyph] = Size(node->value<int>(), m_glyphHeight); } else { calculateGlyphsWidthsAutomatically(Image::load(textureFile), glyphSize); } // 32 and 160 are spaces ( ) m_glyphsSize[32].setWidth(spaceWidth); m_glyphsSize[160].setWidth(spaceWidth); // use 127 as spacer [Width: 1], Important for the current NPC highlighting system m_glyphsSize[127].setWidth(1); // new line actually has a size that will be useful in multiline algorithm m_glyphsSize[(uchar)'\n'] = Size(1, m_glyphHeight); // read custom widths /* if(OTMLNodePtr node = fontNode->get("glyph-widths")) { for(const OTMLNodePtr& child : node->children()) m_glyphsSize[stdext::safe_cast<int>(child->tag())].setWidth(child->value<int>()); } */ // calculate glyphs texture coords int numHorizontalGlyphs = m_texture->getSize().width() / glyphSize.width(); for(int glyph = m_firstGlyph; glyph < 256; ++glyph) { m_glyphsTextureCoords[glyph].setRect(((glyph - m_firstGlyph) % numHorizontalGlyphs) * glyphSize.width(), ((glyph - m_firstGlyph) / numHorizontalGlyphs) * glyphSize.height(), m_glyphsSize[glyph].width(), m_glyphHeight); } }
void Font::load(const OTMLNodePtr& fontNode) { OTMLNodePtr textureNode = fontNode->at("texture"); std::string textureFile = Fw::resolvePath(textureNode->value(), textureNode->source()); Size glyphSize = fontNode->valueAt<Size>("glyph-size"); m_glyphHeight = fontNode->valueAt<int>("height"); m_yOffset = fontNode->valueAt("y-offset", 0); m_firstGlyph = fontNode->valueAt("first-glyph", 32); m_glyphSpacing = fontNode->valueAt("spacing", Size(0,0)); // load font texture m_texture = g_textures.getTexture(textureFile); if(OTMLNodePtr node = fontNode->get("fixed-glyph-width")) { for(int glyph = m_firstGlyph; glyph < 256; ++glyph) m_glyphsSize[glyph] = Size(node->value<int>(), m_glyphHeight); } else { calculateGlyphsWidthsAutomatically(Image::load(textureFile), glyphSize); } // new line actually has a size that will be useful in multiline algorithm m_glyphsSize[(uchar)'\n'] = Size(1, m_glyphHeight); // read custom widths if(OTMLNodePtr node = fontNode->get("glyph-widths")) { for(const OTMLNodePtr& child : node->children()) m_glyphsSize[Fw::safeCast<int>(child->tag())].setWidth(child->value<int>()); } // calculate glyphs texture coords int numHorizontalGlyphs = m_texture->getSize().width() / glyphSize.width(); for(int glyph = m_firstGlyph; glyph < 256; ++glyph) { m_glyphsTextureCoords[glyph].setRect(((glyph - m_firstGlyph) % numHorizontalGlyphs) * glyphSize.width(), ((glyph - m_firstGlyph) / numHorizontalGlyphs) * glyphSize.height(), m_glyphsSize[glyph].width(), m_glyphHeight); } }
std::string OTMLEmitter::emitNode(const OTMLNodePtr& node, int currentDepth) { std::stringstream ss; // emit nodes if(currentDepth >= 0) { // fill spaces for current depth for(int i=0;i<currentDepth;++i) ss << " "; // emit node tag if(node->hasTag()) { ss << node->tag(); // add ':' to if the node is unique or has value if(node->hasValue() || node->isUnique() || node->isNull()) ss << ":"; } else ss << "-"; // emit node value if(node->isNull()) ss << " ~"; else if(node->hasValue()) { ss << " "; std::string value = node->value(); // emit multiline values if(value.find("\n") != std::string::npos) { if(value[value.length()-1] == '\n' && value[value.length()-2] == '\n') ss << "|+"; else if(value[value.length()-1] == '\n') ss << "|"; else ss << "|-"; // multilines for(std::size_t pos = 0; pos < value.length(); ++pos) { ss << "\n"; // fill spaces for multiline depth for(int i=0;i<currentDepth+1;++i) ss << " "; // fill until a new line while(pos < value.length()) { if(value[pos] == '\n') break; ss << value[pos++]; } } // emit inline values } else ss << value; } } // emit children for(int i=0;i<node->size();++i) { if(currentDepth >= 0 || i != 0) ss << "\n"; ss << emitNode(node->atIndex(i), currentDepth+1); } return ss.str(); }