void OTMLNode::merge(const OTMLNodePtr& node) { for(const OTMLNodePtr& child : node->m_children) addChild(child->clone()); setTag(node->tag()); setSource(node->source()); }
void OTMLNode::copy(const OTMLNodePtr& node) { setTag(node->tag()); setValue(node->rawValue()); setUnique(node->isUnique()); setNull(node->isNull()); setSource(node->source()); clear(); for(const OTMLNodePtr& child : node->m_children) addChild(child->clone()); }
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); } }