1 /* 2 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 3 * Distributed under the MIT License 4 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 5 */ 6 7 #include "MyGUI_Precompiled.h" 8 #include "MyGUI_ResourceImageSet.h" 9 #include "MyGUI_ResourceManager.h" 10 #include "MyGUI_LanguageManager.h" 11 #include "MyGUI_Constants.h" 12 13 namespace MyGUI 14 { 15 16 std::vector<IntPoint> ResourceImageSet::mFramesEmpty; 17 deserialization(xml::ElementPtr _node,Version _version)18 void ResourceImageSet::deserialization(xml::ElementPtr _node, Version _version) 19 { 20 Base::deserialization(_node, _version); 21 22 // берем детей и крутимся, основной цикл 23 xml::ElementEnumerator group_node = _node->getElementEnumerator(); 24 while (group_node.next("Group")) 25 { 26 GroupImage group; 27 group.name = group_node->findAttribute("name"); 28 29 group.texture = group_node->findAttribute("texture"); 30 // tags replacement support for Skins 31 if (_version >= Version(1, 1)) 32 { 33 group.texture = LanguageManager::getInstance().replaceTags(group.texture); 34 } 35 36 group.size = IntSize::parse(group_node->findAttribute("size")); 37 38 xml::ElementEnumerator index_node = group_node->getElementEnumerator(); 39 while (index_node.next("Index")) 40 { 41 IndexImage index; 42 index.name = index_node->findAttribute("name"); 43 index.rate = utility::parseFloat(index_node->findAttribute("rate")); 44 45 xml::ElementEnumerator frame_node = index_node->getElementEnumerator(); 46 while (frame_node.next("Frame")) 47 { 48 size_t count = utility::parseSizeT(frame_node->findAttribute("count")); 49 const IntPoint& point = IntPoint::parse(frame_node->findAttribute("point")); 50 if ((count < 1) || (count > 256)) count = 1; 51 while (count > 0) 52 { 53 index.frames.push_back(point); 54 -- count; 55 } 56 } 57 58 group.indexes.push_back(index); 59 } 60 61 AddGroupImage(group); 62 } 63 } 64 getIndexInfo(const std::string & _group,const std::string & _index)65 ImageIndexInfo ResourceImageSet::getIndexInfo(const std::string& _group, const std::string& _index) 66 { 67 size_t index_group = getGroupIndex(_group); 68 if (index_group != ITEM_NONE) 69 { 70 GroupImage& group = mGroups[index_group]; 71 size_t index_image = getImageIndex(group, _index); 72 if (index_image != ITEM_NONE) 73 { 74 IndexImage& index = group.indexes[index_image]; 75 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 76 } 77 } 78 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 79 } 80 getIndexInfo(size_t _group,const std::string & _index)81 ImageIndexInfo ResourceImageSet::getIndexInfo(size_t _group, const std::string& _index) 82 { 83 if (_group < mGroups.size()) 84 { 85 GroupImage& group = mGroups[_group]; 86 size_t index_image = getImageIndex(group, _index); 87 if (index_image != ITEM_NONE) 88 { 89 IndexImage& index = group.indexes[index_image]; 90 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 91 } 92 } 93 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 94 } 95 getIndexInfo(const std::string & _group,size_t _index)96 ImageIndexInfo ResourceImageSet::getIndexInfo(const std::string& _group, size_t _index) 97 { 98 size_t index_group = getGroupIndex(_group); 99 if (index_group != ITEM_NONE) 100 { 101 GroupImage& group = mGroups[index_group]; 102 if (_index < group.indexes.size()) 103 { 104 IndexImage& index = group.indexes[_index]; 105 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 106 } 107 } 108 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 109 } 110 getIndexInfo(size_t _group,size_t _index)111 ImageIndexInfo ResourceImageSet::getIndexInfo(size_t _group, size_t _index) 112 { 113 if (_group < mGroups.size()) 114 { 115 GroupImage& group = mGroups[_group]; 116 if (_index < group.indexes.size()) 117 { 118 IndexImage& index = group.indexes[_index]; 119 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 120 } 121 } 122 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 123 } 124 getIndexInfo(const IntSize & _group,size_t _index)125 ImageIndexInfo ResourceImageSet::getIndexInfo(const IntSize& _group, size_t _index) 126 { 127 size_t index_group = getGroupIndex(_group); 128 if (index_group != ITEM_NONE) 129 { 130 GroupImage& group = mGroups[index_group]; 131 if (_index < group.indexes.size()) 132 { 133 IndexImage& index = group.indexes[_index]; 134 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 135 } 136 } 137 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 138 } 139 getIndexInfo(const IntSize & _group,const std::string & _index)140 ImageIndexInfo ResourceImageSet::getIndexInfo(const IntSize& _group, const std::string& _index) 141 { 142 size_t index_group = getGroupIndex(_group); 143 if (index_group != ITEM_NONE) 144 { 145 GroupImage& group = mGroups[index_group]; 146 size_t index_image = getImageIndex(group, _index); 147 if (index_image != ITEM_NONE) 148 { 149 IndexImage& index = group.indexes[index_image]; 150 return ImageIndexInfo(group.texture, group.size, index.rate, index.frames); 151 } 152 } 153 return ImageIndexInfo(Constants::getEmptyString(), Constants::getZeroIntSize(), 0, mFramesEmpty); 154 } 155 getGroupIndex(const std::string & _name)156 size_t ResourceImageSet::getGroupIndex(const std::string& _name) 157 { 158 for (size_t index = 0; index < mGroups.size(); ++index) 159 { 160 if (mGroups[index].name == _name) 161 return index; 162 } 163 return ITEM_NONE; 164 } 165 getGroupIndex(const IntSize & _size)166 size_t ResourceImageSet::getGroupIndex(const IntSize& _size) 167 { 168 for (size_t index = 0; index < mGroups.size(); ++index) 169 { 170 if (mGroups[index].size == _size) 171 return index; 172 } 173 return ITEM_NONE; 174 } 175 getImageIndex(GroupImage & _group,const std::string & _name)176 size_t ResourceImageSet::getImageIndex(GroupImage& _group, const std::string& _name) 177 { 178 VectorIndexImage& indexes = _group.indexes; 179 for (size_t index = 0; index < indexes.size(); ++index) 180 { 181 if (indexes[index].name == _name) 182 return index; 183 } 184 return ITEM_NONE; 185 } 186 getGroupSize(size_t _index)187 const IntSize& ResourceImageSet::getGroupSize(size_t _index) 188 { 189 if (_index >= mGroups.size()) 190 return Constants::getZeroIntSize(); 191 return mGroups[_index].size; 192 } 193 getGroupSize(const std::string & _group)194 const IntSize& ResourceImageSet::getGroupSize(const std::string& _group) 195 { 196 for (size_t index = 0; index < mGroups.size(); ++index) 197 { 198 if (mGroups[index].name == _group) 199 return mGroups[index].size; 200 } 201 return Constants::getZeroIntSize(); 202 } 203 getEnumerator() const204 EnumeratorGroupImage ResourceImageSet::getEnumerator() const 205 { 206 return EnumeratorGroupImage(mGroups); 207 } 208 AddGroupImage(const GroupImage & _group)209 void ResourceImageSet::AddGroupImage(const GroupImage& _group) 210 { 211 mGroups.push_back(_group); 212 } 213 214 } // namespace MyGUI 215