MyGUI
3.2.1
|
00001 /* 00002 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 00003 * Distributed under the MIT License 00004 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 00005 */ 00006 00007 #include "MyGUI_Precompiled.h" 00008 #include "MyGUI_ResourceImageSet.h" 00009 #include "MyGUI_ResourceManager.h" 00010 #include "MyGUI_LanguageManager.h" 00011 #include "MyGUI_Constants.h" 00012 00013 namespace MyGUI 00014 { 00015 00016 std::vector<IntPoint> ResourceImageSet::mFramesEmpty; 00017 00018 ResourceImageSet::ResourceImageSet() 00019 { 00020 } 00021 00022 ResourceImageSet::~ResourceImageSet() 00023 { 00024 } 00025 00026 void ResourceImageSet::deserialization(xml::ElementPtr _node, Version _version) 00027 { 00028 Base::deserialization(_node, _version); 00029 00030 // берем детей и крутимся, основной цикл 00031 xml::ElementEnumerator group_node = _node->getElementEnumerator(); 00032 while (group_node.next("Group")) 00033 { 00034 GroupImage group; 00035 group.name = group_node->findAttribute("name"); 00036 00037 group.texture = group_node->findAttribute("texture"); 00038 // tags replacement support for Skins 00039 if (_version >= Version(1, 1)) 00040 { 00041 group.texture = LanguageManager::getInstance().replaceTags(group.texture); 00042 } 00043 00044 group.size = IntSize::parse(group_node->findAttribute("size")); 00045 00046 xml::ElementEnumerator index_node = group_node->getElementEnumerator(); 00047 while (index_node.next("Index")) 00048 { 00049 IndexImage index; 00050 index.name = index_node->findAttribute("name"); 00051 index.rate = utility::parseFloat(index_node->findAttribute("rate")); 00052 00053 xml::ElementEnumerator frame_node = index_node->getElementEnumerator(); 00054 while (frame_node.next("Frame")) 00055 { 00056 size_t count = utility::parseSizeT(frame_node->findAttribute("count")); 00057 const IntPoint& point = IntPoint::parse(frame_node->findAttribute("point")); 00058 if ((count < 1) || (count > 256)) count = 1; 00059 while (count > 0) 00060 { 00061 index.frames.push_back(point); 00062 -- count; 00063 } 00064 } 00065 00066 group.indexes.push_back(index); 00067 } 00068 00069 AddGroupImage(group); 00070 } 00071 } 00072 00073 ImageIndexInfo ResourceImageSet::getIndexInfo(const std::string& _group, const std::string& _index) 00074 { 00075 size_t index_group = getGroupIndex(_group); 00076 if (index_group != ITEM_NONE) 00077 { 00078 GroupImage& group = mGroups[index_group]; 00079 size_t index_image = getImageIndex(group, _index); 00080 if (index_image != ITEM_NONE) 00081 { 00082 IndexImage& index = group.indexes[index_image]; 00083 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 00084 } 00085 } 00086 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 00087 } 00088 00089 ImageIndexInfo ResourceImageSet::getIndexInfo(size_t _group, const std::string& _index) 00090 { 00091 if (_group < mGroups.size()) 00092 { 00093 GroupImage& group = mGroups[_group]; 00094 size_t index_image = getImageIndex(group, _index); 00095 if (index_image != ITEM_NONE) 00096 { 00097 IndexImage& index = group.indexes[index_image]; 00098 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 00099 } 00100 } 00101 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 00102 } 00103 00104 ImageIndexInfo ResourceImageSet::getIndexInfo(const std::string& _group, size_t _index) 00105 { 00106 size_t index_group = getGroupIndex(_group); 00107 if (index_group != ITEM_NONE) 00108 { 00109 GroupImage& group = mGroups[index_group]; 00110 if (_index < group.indexes.size()) 00111 { 00112 IndexImage& index = group.indexes[_index]; 00113 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 00114 } 00115 } 00116 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 00117 } 00118 00119 ImageIndexInfo ResourceImageSet::getIndexInfo(size_t _group, size_t _index) 00120 { 00121 if (_group < mGroups.size()) 00122 { 00123 GroupImage& group = mGroups[_group]; 00124 if (_index < group.indexes.size()) 00125 { 00126 IndexImage& index = group.indexes[_index]; 00127 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 00128 } 00129 } 00130 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 00131 } 00132 00133 ImageIndexInfo ResourceImageSet::getIndexInfo(const IntSize& _group, size_t _index) 00134 { 00135 size_t index_group = getGroupIndex(_group); 00136 if (index_group != ITEM_NONE) 00137 { 00138 GroupImage& group = mGroups[index_group]; 00139 if (_index < group.indexes.size()) 00140 { 00141 IndexImage& index = group.indexes[_index]; 00142 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 00143 } 00144 } 00145 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 00146 } 00147 00148 ImageIndexInfo ResourceImageSet::getIndexInfo(const IntSize& _group, const std::string& _index) 00149 { 00150 size_t index_group = getGroupIndex(_group); 00151 if (index_group != ITEM_NONE) 00152 { 00153 GroupImage& group = mGroups[index_group]; 00154 size_t index_image = getImageIndex(group, _index); 00155 if (index_image != ITEM_NONE) 00156 { 00157 IndexImage& index = group.indexes[index_image]; 00158 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 00159 } 00160 } 00161 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 00162 } 00163 00164 size_t ResourceImageSet::getGroupIndex(const std::string& _name) 00165 { 00166 for (size_t index = 0; index < mGroups.size(); ++index) 00167 { 00168 if (mGroups[index].name == _name) 00169 return index; 00170 } 00171 return ITEM_NONE; 00172 } 00173 00174 size_t ResourceImageSet::getGroupIndex(const IntSize& _size) 00175 { 00176 for (size_t index = 0; index < mGroups.size(); ++index) 00177 { 00178 if (mGroups[index].size == _size) 00179 return index; 00180 } 00181 return ITEM_NONE; 00182 } 00183 00184 size_t ResourceImageSet::getImageIndex(GroupImage& _group, const std::string& _name) 00185 { 00186 VectorIndexImage& indexes = _group.indexes; 00187 for (size_t index = 0; index < indexes.size(); ++index) 00188 { 00189 if (indexes[index].name == _name) 00190 return index; 00191 } 00192 return ITEM_NONE; 00193 } 00194 00195 const IntSize& ResourceImageSet::getGroupSize(size_t _index) 00196 { 00197 if (_index >= mGroups.size()) 00198 return Constants::getZeroIntSize(); 00199 return mGroups[_index].size; 00200 } 00201 00202 const IntSize& ResourceImageSet::getGroupSize(const std::string& _group) 00203 { 00204 for (size_t index = 0; index < mGroups.size(); ++index) 00205 { 00206 if (mGroups[index].name == _group) 00207 return mGroups[index].size; 00208 } 00209 return Constants::getZeroIntSize(); 00210 } 00211 00212 EnumeratorGroupImage ResourceImageSet::getEnumerator() const 00213 { 00214 return EnumeratorGroupImage(mGroups); 00215 } 00216 00217 void ResourceImageSet::AddGroupImage(const GroupImage& _group) 00218 { 00219 mGroups.push_back(_group); 00220 } 00221 00222 } // namespace MyGUI