void FontPanel::generateFontTTFXml(MyGUI::xml::ElementPtr _root) { _root->addAttribute("type", "Resource"); _root->addAttribute("version", "1.1"); MyGUI::xml::ElementPtr node = _root->createChild("Resource"); node->addAttribute("type", "ResourceTrueTypeFont"); node->addAttribute("name", mFontName); addProperty(node, "Source", mComboFont->getOnlyText()); addProperty(node, "Size", MyGUI::utility::parseValue<int>(mEditSize->getOnlyText())); addProperty(node, "Resolution", MyGUI::utility::parseValue<int>(mEditResolution->getOnlyText())); addProperty(node, "Antialias", MyGUI::utility::parseValue<bool>(mComboAntialias->getOnlyText())); addProperty(node, "SpaceWidth", MyGUI::utility::parseValue<int>(mEditSpace->getOnlyText())); addProperty(node, "TabWidth", MyGUI::utility::parseValue<int>(mEditTab->getOnlyText())); addProperty(node, "CursorWidth", MyGUI::utility::parseValue<int>(mEditCursor->getOnlyText())); addProperty(node, "Distance", MyGUI::utility::parseValue<int>(mEditDistance->getOnlyText())); addProperty(node, "OffsetHeight", MyGUI::utility::parseValue<int>(mEditOffset->getOnlyText())); MyGUI::xml::ElementPtr node_codes = node->createChild("Codes"); //if (mEditRange1->getOnlyText() != "") // node_codes->createChild("Code")->addAttribute("range", mEditRange1->getOnlyText()); //if (mEditRange2->getOnlyText() != "") // node_codes->createChild("Code")->addAttribute("range", mEditRange2->getOnlyText()); for( int i = 1; i <= _countof(mEditRange); ++i ) { if (mEditRange[i]->getOnlyText() != "") node_codes->createChild("Code")->addAttribute("range", mEditRange[i]->getOnlyText()); } if (mEditHide->getOnlyText() != "") node_codes->createChild("Code")->addAttribute("hide", mEditHide->getOnlyText()); }
void PropertiesPanelView::save(MyGUI::xml::ElementPtr root) { root = root->createChild("PropertiesPanelView"); MyGUI::xml::ElementPtr nodeProp; for (VectorPanel::iterator iter = mPanels.begin(); iter != mPanels.end(); ++iter) { nodeProp = root->createChild("Property"); nodeProp->addAttribute("key", MyGUI::utility::toString("Panel","Minimized")); nodeProp->addAttribute("value", (*iter)->getPanelCell()->isMinimized()); } }
/* 一组递归函数,用来保存 */ void Framework::saveJoint(MyGUI::xml::ElementPtr node,Joint* joint,RigidPtr other) { node->addAttribute("type", joint->getTypeName()); joint->save(node); MyGUI::xml::ElementPtr child = node->createChild("rigid"); RigidPtr rgp = joint->other(other); if( rgp ) saveRigid(child,rgp,joint); }
void EditorState::saveSettings(const MyGUI::UString& _fileName) { std::string _instance = "Editor"; MyGUI::xml::Document doc; doc.createDeclaration(); MyGUI::xml::ElementPtr root = doc.createRoot("MyGUI"); root->addAttribute("type", "Settings"); mPropertiesPanelView->save(root); mSettingsWindow->save(root); mWidgetsWindow->save(root); mMetaSolutionWindow->save(root); // cleanup for duplicates std::reverse(recentFiles.begin(), recentFiles.end()); for (size_t i = 0; i < recentFiles.size(); ++i) recentFiles.erase(std::remove(recentFiles.begin() + i + 1, recentFiles.end(), recentFiles[i]), recentFiles.end()); // remove old files while (recentFiles.size() > MAX_RECENT_FILES) recentFiles.pop_back(); std::reverse(recentFiles.begin(), recentFiles.end()); for (std::vector<MyGUI::UString>::iterator iter = recentFiles.begin(); iter != recentFiles.end(); ++iter) { MyGUI::xml::ElementPtr nodeProp = root->createChild("RecentFile"); nodeProp->addAttribute("name", *iter); } for (std::vector<MyGUI::UString>::iterator iter = additionalPaths.begin(); iter != additionalPaths.end(); ++iter) { MyGUI::xml::ElementPtr nodeProp = root->createChild("AdditionalPath"); nodeProp->addAttribute("name", *iter); } if (!doc.save(_fileName)) { MYGUI_LOGGING(LogSection, Error, _instance << " : " << doc.getLastError()); return; } }
void Framework::saveRigid(MyGUI::xml::ElementPtr node,RigidPtr rgd,Joint* parent) { rgd->save(node); for(JointVec::iterator i=rgd->mJoints.begin();i!=rgd->mJoints.end();++i) { if( *i != parent ) { MyGUI::xml::ElementPtr js = node->createChild("joint");//(*i)->getTypeName()); saveJoint(js, *i,rgd); } } }
void FontExportSerializer::generateFontManualXml(MyGUI::xml::ElementPtr _root, const MyGUI::UString& _folderName, DataPtr _data) { MyGUI::IFont* resource = MyGUI::FontManager::getInstance().getByName(_data->getPropertyValue("FontName")); MyGUI::ResourceTrueTypeFont* font = resource != nullptr ? resource->castType<MyGUI::ResourceTrueTypeFont>(false) : nullptr; if (font != nullptr) { std::string textureName = _data->getPropertyValue("Name") + ".png"; MyGUI::ITexture* texture = font->getTextureFont(); if (texture == nullptr) return; texture->saveToFile(MyGUI::UString(common::concatenatePath(_folderName, MyGUI::UString(textureName))).asUTF8()); MyGUI::xml::ElementPtr node = _root->createChild("Resource"); node->addAttribute("type", "ResourceManualFont"); node->addAttribute("name", _data->getPropertyValue("Name")); addProperty(node, "Source", textureName); addProperty(node, "SourceSize", MyGUI::IntSize(texture->getWidth(), texture->getHeight())); addProperty(node, "DefaultHeight", font->getDefaultHeight()); MyGUI::xml::Element* codes = node->createChild("Codes"); std::vector<std::pair<MyGUI::Char, MyGUI::Char> > codePointRanges = font->getCodePointRanges(); MyGUI::Char substituteCodePoint = font->getSubstituteCodePoint(); bool isCustomSubstituteCodePoint = substituteCodePoint != MyGUI::FontCodeType::NotDefined; // Add all of the code points. Skip over the substitute code point -- unless it's been customized, in which case it // needs to be added here as a regular code point and then at the end as a substitute code point. for (std::vector<std::pair<MyGUI::Char, MyGUI::Char> >::const_iterator iter = codePointRanges.begin() ; iter != codePointRanges.end(); ++iter) for (MyGUI::Char code = iter->first; code <= iter->second && code >= iter->first; ++code) if (code != substituteCodePoint || isCustomSubstituteCodePoint) addCode(codes, code, font, false); // Always add the substitute code point last, even if it isn't the last one in the range. addCode(codes, substituteCodePoint, font, true); } }
void FontPanel::generateFontManualXml(MyGUI::xml::ElementPtr _root, const std::string& _textureName, const std::string& _fontName) { _root->addAttribute("type", "Resource"); _root->addAttribute("version", "1.1"); MyGUI::xml::ElementPtr node = _root->createChild("Resource"); node->addAttribute("type", "ResourceManualFont"); node->addAttribute("name", _fontName); addProperty(node, "Source", _textureName); addProperty(node, "DefaultHeight", mFontHeight); MyGUI::IFont* font = MyGUI::FontManager::getInstance().getByName(mFontName); MyGUI::xml::Element* codes = node->createChild("Codes"); addCode(codes, MyGUI::FontCodeType::Cursor, font); addCode(codes, MyGUI::FontCodeType::Selected, font); addCode(codes, MyGUI::FontCodeType::SelectedBack, font); addCode(codes, 32, font); addCode(codes, 9, font); MyGUI::IntSize range1 = MyGUI::IntSize::parse(mEditRange1->getOnlyText()); MyGUI::IntSize range2 = MyGUI::IntSize::parse(mEditRange2->getOnlyText()); MyGUI::IntSize hide1 = MyGUI::IntSize::parse(mEditHide->getOnlyText()); for (int index = range1.width; index <= range1.height; ++ index) { if (index < hide1.width || index > hide1.height) addCode(codes, index, font); } for (int index = range2.width; index <= range2.height; ++ index) { if (index < hide1.width || index > hide1.height) addCode(codes, index, font); } }
bool HotkeyManager::save( string xml ) { MyGUI::xml::Document doc; string path = Game::getSingleton().getResourcePath() + xml; MyGUI::xml::ElementPtr root = doc.createRoot("HKS"); doc.createDeclaration(); MyGUI::xml::ElementPtr node; for( HotkeyTable::iterator it = mHotkeys.begin();it!=mHotkeys.end();++it ) { node = root->createChild("hotkey"); node->addAttribute("name",it->mName); node->addAttribute("caption",it->mCaption); node->addAttribute("tip",it->mTip); node->addAttribute("key",it->mHotkey); } return doc.save( path ); }
/* 注意:这里要保证没有循环连接 */ void Framework::save( MyGUI::xml::ElementPtr node ) { if( !mName.empty() ) node->addAttribute("name",mName); //这里做检测保证框架没有循环连接的铰链 if(checkCycle()) { WARNING_LOG("Framework have cycle."); return; } RigidPtr body = getBodyRigid(); if(body) { MyGUI::xml::ElementPtr child = node->createChild("body"); saveRigid(child, body,nullptr); } }
void DemoKeeper::saveToFile(const std::string& _filename) { MyGUI::xml::Document doc; // есть такой файл if (!doc.open(_filename)) { doc.clear(); } doc.createDeclaration(); MyGUI::xml::ElementPtr root = doc.createRoot("AnimationGraph"); // сохраняем сами ноды wraps::BaseGraphView::EnumeratorNode node = mGraphView->getNodeEnumerator(); while (node.next()) { BaseAnimationNode* anim_node = dynamic_cast<BaseAnimationNode*>(node.current()); if (anim_node) { MyGUI::xml::ElementPtr node_type = root->createChild("Node"); node_type->addAttribute("type", anim_node->getType()); node_type->addAttribute("name", anim_node->getName()); anim_node->serialization(node_type); } } // сохраняем соединения node = mGraphView->getNodeEnumerator(); while (node.next()) { BaseAnimationNode* anim_node = dynamic_cast<BaseAnimationNode*>(node.current()); if (anim_node && anim_node->isAnyConnection()) { MyGUI::xml::ElementPtr connection = root->createChild("Connections"); connection->addAttribute("node", anim_node->getName()); wraps::EnumeratorConnection node_conn = anim_node->getConnectionEnumerator(); while (node_conn.next()) { wraps::EnumeratorConnection conn = node_conn->getConnectionEnumerator(); while (conn.next()) { BaseAnimationNode* anim_node2 = dynamic_cast<BaseAnimationNode*>(conn->getOwnerNode()); if (anim_node2) { MyGUI::xml::ElementPtr item = connection->createChild("Connection"); item->addAttribute("node", anim_node2->getName()); item->addAttribute("from", node_conn->getName()); item->addAttribute("to", conn->getName()); } } } } } // сохраняем данные для редактора MyGUI::xml::ElementPtr data = root->createChild("EditorData"); node = mGraphView->getNodeEnumerator(); while (node.next()) { BaseAnimationNode* anim_node = dynamic_cast<BaseAnimationNode*>(node.current()); if (anim_node) { MyGUI::xml::ElementPtr item_data = data->createChild("Node"); item_data->addAttribute("name", anim_node->getName()); item_data->addAttribute("coord", anim_node->getCoord().print()); } } doc.save(_filename); }
void addProperty(MyGUI::xml::ElementPtr _node, const std::string& _name, Type _value) { MyGUI::xml::ElementPtr node = _node->createChild("Property"); node->addAttribute("key", _name); node->addAttribute("value", _value); }
void FontLoader::loadFont(const std::string &fileName, bool exportToFile) { Ogre::DataStreamPtr file = Ogre::ResourceGroupManager::getSingleton().openResource(fileName); float fontSize; int one; file->read(&fontSize, sizeof(fontSize)); file->read(&one, sizeof(int)); assert(one == 1); file->read(&one, sizeof(int)); assert(one == 1); char name_[284]; file->read(name_, sizeof(name_)); std::string name(name_); GlyphInfo data[256]; file->read(data, sizeof(data)); file->close(); // Create the font texture std::string bitmapFilename = "Fonts/" + std::string(name) + ".tex"; Ogre::DataStreamPtr bitmapFile = Ogre::ResourceGroupManager::getSingleton().openResource(bitmapFilename); int width, height; bitmapFile->read(&width, sizeof(int)); bitmapFile->read(&height, sizeof(int)); std::vector<Ogre::uchar> textureData; textureData.resize(width*height*4); bitmapFile->read(&textureData[0], width*height*4); bitmapFile->close(); std::string resourceName; if (name.size() >= 5 && Misc::StringUtils::ciEqual(name.substr(0, 5), "magic")) resourceName = "Magic Cards"; else if (name.size() >= 7 && Misc::StringUtils::ciEqual(name.substr(0, 7), "century")) resourceName = "Century Gothic"; else if (name.size() >= 7 && Misc::StringUtils::ciEqual(name.substr(0, 7), "daedric")) resourceName = "Daedric"; else return; // no point in loading it, since there is no way of using additional fonts std::string textureName = name; Ogre::Image image; image.loadDynamicImage(&textureData[0], width, height, Ogre::PF_BYTE_RGBA); Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().createManual(textureName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, width, height, 0, Ogre::PF_BYTE_RGBA); texture->loadImage(image); if (exportToFile) image.save(resourceName + ".png"); // Register the font with MyGUI MyGUI::ResourceManualFont* font = static_cast<MyGUI::ResourceManualFont*>( MyGUI::FactoryManager::getInstance().createObject("Resource", "ResourceManualFont")); // We need to emulate loading from XML because the data members are private as of mygui 3.2.0 MyGUI::xml::Document xmlDocument; MyGUI::xml::ElementPtr root = xmlDocument.createRoot("ResourceManualFont"); root->addAttribute("name", resourceName); MyGUI::xml::ElementPtr defaultHeight = root->createChild("Property"); defaultHeight->addAttribute("key", "DefaultHeight"); defaultHeight->addAttribute("value", fontSize); MyGUI::xml::ElementPtr source = root->createChild("Property"); source->addAttribute("key", "Source"); source->addAttribute("value", std::string(textureName)); MyGUI::xml::ElementPtr codes = root->createChild("Codes"); for(int i = 0; i < 256; i++) { float x1 = data[i].top_left.x*width; float y1 = data[i].top_left.y*height; float w = data[i].top_right.x*width - x1; float h = data[i].bottom_left.y*height - y1; ToUTF8::Utf8Encoder encoder(mEncoding); unsigned long unicodeVal = utf8ToUnicode(getUtf8(i, encoder, mEncoding)); MyGUI::xml::ElementPtr code = codes->createChild("Code"); code->addAttribute("index", unicodeVal); code->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); code->addAttribute("advance", data[i].width); code->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); code->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); // More hacks! The french game uses several win1252 characters that are not included // in the cp437 encoding of the font. Fall back to similar available characters. if (mEncoding == ToUTF8::CP437) { std::multimap<int, int> additional; // <cp437, unicode> additional.insert(std::make_pair(39, 0x2019)); // apostrophe additional.insert(std::make_pair(45, 0x2013)); // dash additional.insert(std::make_pair(45, 0x2014)); // dash additional.insert(std::make_pair(34, 0x201D)); // right double quotation mark additional.insert(std::make_pair(34, 0x201C)); // left double quotation mark additional.insert(std::make_pair(44, 0x201A)); additional.insert(std::make_pair(44, 0x201E)); additional.insert(std::make_pair(43, 0x2020)); additional.insert(std::make_pair(94, 0x02C6)); additional.insert(std::make_pair(37, 0x2030)); additional.insert(std::make_pair(83, 0x0160)); additional.insert(std::make_pair(60, 0x2039)); additional.insert(std::make_pair(79, 0x0152)); additional.insert(std::make_pair(90, 0x017D)); additional.insert(std::make_pair(39, 0x2019)); additional.insert(std::make_pair(126, 0x02DC)); additional.insert(std::make_pair(84, 0x2122)); additional.insert(std::make_pair(83, 0x0161)); additional.insert(std::make_pair(62, 0x203A)); additional.insert(std::make_pair(111, 0x0153)); additional.insert(std::make_pair(122, 0x017E)); additional.insert(std::make_pair(89, 0x0178)); additional.insert(std::make_pair(156, 0x00A2)); additional.insert(std::make_pair(46, 0x2026)); for (std::multimap<int, int>::iterator it = additional.begin(); it != additional.end(); ++it) { if (it->first != i) continue; MyGUI::xml::ElementPtr code = codes->createChild("Code"); code->addAttribute("index", it->second); code->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); code->addAttribute("advance", data[i].width); code->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); code->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); } } // ASCII vertical bar, use this as text input cursor if (i == 124) { MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code"); cursorCode->addAttribute("index", MyGUI::FontCodeType::Cursor); cursorCode->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); cursorCode->addAttribute("advance", data[i].width); cursorCode->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); cursorCode->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); } // Question mark, use for NotDefined marker (used for glyphs not existing in the font) if (i == 63) { MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code"); cursorCode->addAttribute("index", MyGUI::FontCodeType::NotDefined); cursorCode->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); cursorCode->addAttribute("advance", data[i].width); cursorCode->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); cursorCode->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); } } // These are required as well, but the fonts don't provide them for (int i=0; i<2; ++i) { MyGUI::FontCodeType::Enum type; if(i == 0) type = MyGUI::FontCodeType::Selected; else if (i == 1) type = MyGUI::FontCodeType::SelectedBack; MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code"); cursorCode->addAttribute("index", type); cursorCode->addAttribute("coord", "0 0 0 0"); cursorCode->addAttribute("advance", "0"); cursorCode->addAttribute("bearing", "0 0"); cursorCode->addAttribute("size", "0 0"); } if (exportToFile) { xmlDocument.createDeclaration(); xmlDocument.save(resourceName + ".xml"); } font->deserialization(root, MyGUI::Version(3,2,0)); MyGUI::ResourceManager::getInstance().removeByName(font->getResourceName()); MyGUI::ResourceManager::getInstance().addResource(font); }