31 #include "ext/tinyxml/fife_tinyxml.h"
32 #include "util/log/logger.h"
33 #include "util/resource/resourcemanager.h"
34 #include "util/resource/resource.h"
35 #include "video/image.h"
36 #include "video/renderbackend.h"
38 #include "imagemanager.h"
41 static Logger _log(LM_RESMGR);
50 ImageHandleMapConstIterator it = m_imgHandleMap.begin(),
51 itend = m_imgHandleMap.end();
53 for ( ; it != itend; ++it) {
54 totalSize += it->second->getSize();
61 ImageHandleMapConstIterator it = m_imgHandleMap.begin(),
62 itend = m_imgHandleMap.end();
65 for ( ; it != itend; ++it) {
66 if ( it->second->getState() == IResource::RES_NOT_LOADED ) {
75 ImageHandleMapConstIterator it = m_imgHandleMap.begin(),
76 itend = m_imgHandleMap.end();
79 for ( ; it != itend; ++it) {
80 if ( it->second->getState() == IResource::RES_LOADED ) {
89 return m_imgHandleMap.size();
93 Image* ptr = RenderBackend::instance()->createImage(loader);
99 FL_WARN(_log,
LMsg(
"ImageManager::create(std::string, IResourceLoader* loader) - ") <<
"Resource name " << name <<
" was previously created. Returning original Image...");
103 Image* ptr = RenderBackend::instance()->createImage(name, loader);
108 ImageNameMapIterator nit = m_imgNameMap.find(name);
110 if (nit != m_imgNameMap.end()) {
111 if ( nit->second->getState() == IResource::RES_NOT_LOADED ) {
122 if (ptr->getState() == IResource::RES_NOT_LOADED){
123 FL_WARN(_log,
LMsg(
"ImageManager::load(std::string) - ") <<
"Resource name " << name <<
" was not found and could not be loaded.");
131 uint8_t* pixdata =
new uint8_t[width * height * 4];
132 memset(pixdata, 0, width * height * 4);
133 Image* ptr = RenderBackend::instance()->createImage(pixdata, width, height);
135 ptr->setState(IResource::RES_LOADED);
140 ImageNameMapIterator nit = m_imgNameMap.find(name);
141 if (nit != m_imgNameMap.end()) {
144 uint8_t* pixdata =
new uint8_t[width * height * 4];
145 memset(pixdata, 0, width * height * 4);
146 Image* ptr = RenderBackend::instance()->createImage(name, pixdata, width, height);
148 ptr->setState(IResource::RES_LOADED);
154 assert(!(
exists(res->getHandle()) ||
exists(res->getName())));
158 std::pair<ImageHandleMapIterator, bool> returnValue;
159 returnValue = m_imgHandleMap.insert ( ImageHandleMapPair(res->getHandle(), resptr));
161 if (returnValue.second) {
162 m_imgNameMap.insert ( ImageNameMapPair(returnValue.first->second->getName(), returnValue.first->second) );
165 FL_WARN(_log,
LMsg(
"ImageManager::add(IResource*) - ") <<
"Resource " << res->getName() <<
" already exists.... ignoring.");
168 return returnValue.first->second;
172 ImageNameMapIterator it = m_imgNameMap.find(name);
173 if (it != m_imgNameMap.end()) {
181 ImageHandleMapConstIterator it = m_imgHandleMap.find(handle);
182 if (it != m_imgHandleMap.end()) {
190 ImageNameMapIterator nit = m_imgNameMap.find(name);
192 if (nit != m_imgNameMap.end()) {
193 if ( nit->second->getState() == IResource::RES_LOADED) {
200 FL_WARN(_log,
LMsg(
"ImageManager::reload(std::string) - ") <<
"Resource name " << name <<
" not found.");
204 ImageHandleMapIterator it = m_imgHandleMap.find(handle);
206 if ( it != m_imgHandleMap.end()) {
207 if ( it->second->getState() == IResource::RES_LOADED) {
214 FL_WARN(_log,
LMsg(
"ImageManager::reload(ResourceHandle) - ") <<
"Resource handle " << handle <<
" not found.");
219 ImageHandleMapIterator it = m_imgHandleMap.begin(),
220 itend = m_imgHandleMap.end();
222 for ( ; it != itend; ++it) {
223 if ( it->second->getState() == IResource::RES_LOADED) {
231 ImageHandleMapIterator it = m_imgHandleMap.begin(),
232 itend = m_imgHandleMap.end();
235 for ( ; it != itend; ++it) {
236 if (it->second.useCount() == 2 && it->second->getState() != IResource::RES_LOADED){
241 FL_DBG(_log,
LMsg(
"ImageManager::loadUnreferenced() - ") <<
"Loaded " << count <<
" unreferenced resources.");
245 ImageNameMapIterator nit = m_imgNameMap.find(name);
247 if (nit != m_imgNameMap.end()) {
248 if ( nit->second->getState() == IResource::RES_LOADED) {
254 FL_WARN(_log,
LMsg(
"ImageManager::free(std::string) - ") <<
"Resource name " << name <<
" not found.");
258 ImageHandleMapConstIterator it = m_imgHandleMap.find(handle);
259 if (it != m_imgHandleMap.end()) {
260 if ( it->second->getState() == IResource::RES_LOADED) {
266 FL_WARN(_log,
LMsg(
"ImageManager::free(ResourceHandle) - ") <<
"Resource handle " << handle <<
" not found.");
270 ImageHandleMapIterator it = m_imgHandleMap.begin(),
271 itend = m_imgHandleMap.end();
275 for ( ; it != itend; ++it) {
276 if ( it->second->getState() == IResource::RES_LOADED) {
282 FL_DBG(_log,
LMsg(
"ImageManager::freeAll() - ") <<
"Freed all " << count <<
" resources.");
286 ImageHandleMapIterator it = m_imgHandleMap.begin(),
287 itend = m_imgHandleMap.end();
290 for ( ; it != itend; ++it) {
291 if (it->second.useCount() == 2 && it->second->getState() == IResource::RES_LOADED ){
297 FL_DBG(_log,
LMsg(
"ImageManager::freeUnreferenced() - ") <<
"Freed " << count <<
" unreferenced resources.");
301 ImageHandleMapIterator it = m_imgHandleMap.find(resource->getHandle());
302 ImageNameMapIterator nit = m_imgNameMap.find(resource->getName());
304 if (it != m_imgHandleMap.end()) {
305 m_imgHandleMap.erase(it);
307 if (nit != m_imgNameMap.end()) {
308 m_imgNameMap.erase(nit);
314 FL_WARN(_log,
LMsg(
"ImageManager::remove(ResourcePtr&) - ") <<
"Resource " << resource->getName() <<
" was not found.");
320 ImageNameMapIterator nit = m_imgNameMap.find(name);
321 if (nit != m_imgNameMap.end()) {
322 handle = nit->second->getHandle();
323 m_imgNameMap.erase(nit);
326 FL_WARN(_log,
LMsg(
"ImageManager::remove(std::string) - ") <<
"Resource " << name <<
" was not found.");
330 ImageHandleMapIterator it = m_imgHandleMap.find(handle);
331 if ( it != m_imgHandleMap.end()) {
332 m_imgHandleMap.erase(it);
342 ImageHandleMapIterator it = m_imgHandleMap.find(handle);
344 if (it != m_imgHandleMap.end()) {
345 name = it->second->getName();
346 m_imgHandleMap.erase(it);
349 FL_WARN(_log,
LMsg(
"ImageManager::remove(ResourceHandle) - ") <<
"Resource handle " << handle <<
" was not found.");
353 ImageNameMapIterator nit = m_imgNameMap.find(name);
354 if ( nit != m_imgNameMap.end() ) {
355 m_imgNameMap.erase(nit);
364 assert (m_imgHandleMap.size() == m_imgNameMap.size());
366 size_t count = m_imgHandleMap.size();
368 m_imgHandleMap.clear();
369 m_imgNameMap.clear();
371 FL_DBG(_log,
LMsg(
"ImageManager::removeAll() - ") <<
"Removed all " << count <<
" resources.");
375 ImageHandleMapIterator it = m_imgHandleMap.begin(),
376 itend = m_imgHandleMap.end();
378 std::vector<int> imgHandles;
381 for ( ; it != itend; ++it) {
382 if ( it->second.useCount() == 2) {
383 imgHandles.push_back(it->second->getHandle());
388 for (std::vector<int>::iterator it = imgHandles.begin(); it != imgHandles.end(); ++it) {
392 FL_DBG(_log,
LMsg(
"ImageManager::removeUnreferenced() - ") <<
"Removed " << count <<
" unreferenced resources.");
396 ImageNameMapIterator nit = m_imgNameMap.find(name);
398 if (nit != m_imgNameMap.end()) {
399 if (nit->second->getState() != IResource::RES_LOADED){
412 ImageHandleMapConstIterator it = m_imgHandleMap.find(handle);
413 if (it != m_imgHandleMap.end()) {
414 if (it->second->getState() != IResource::RES_LOADED){
421 FL_WARN(_log,
LMsg(
"ImageManager::get(ResourceHandle) - ") <<
"Resource handle " << handle <<
" is undefined.");
426 ImagePtr ImageManager::getPtr(
const std::string& name) {
427 ImageNameMapIterator nit = m_imgNameMap.find(name);
429 if (nit != m_imgNameMap.end()) {
433 FL_WARN(_log, LMsg(
"ImageManager::getPtr(std::string) - ") <<
"Resource " << name <<
" is undefined.");
438 ImagePtr ImageManager::getPtr(ResourceHandle handle) {
439 ImageHandleMapConstIterator it = m_imgHandleMap.find(handle);
440 if (it != m_imgHandleMap.end()) {
444 FL_WARN(_log, LMsg(
"ImageManager::getPtr(ResourceHandle) - ") <<
"Resource handle " << handle <<
" is undefined.");
450 ImageNameMapIterator nit = m_imgNameMap.find(name);
451 if (nit != m_imgNameMap.end()) {
452 return nit->second->getHandle();
455 FL_WARN(_log,
LMsg(
"ImageManager::getResourceHandle(std::string) - ") <<
"Resource " << name <<
" is undefined.");
460 void ImageManager::invalidate(
const std::string& name) {
461 ImageNameMapIterator it = m_imgNameMap.find(name);
462 if (it != m_imgNameMap.end()) {
463 if (it->second->getState() == IResource::RES_LOADED){
464 it->second.get()->invalidate();
469 void ImageManager::invalidate(ResourceHandle handle) {
470 ImageHandleMapIterator it = m_imgHandleMap.find(handle);
471 if (it != m_imgHandleMap.end()) {
472 if (it->second->getState() == IResource::RES_LOADED) {
473 it->second.get()->invalidate();
478 void ImageManager::invalidateAll() {
479 ImageHandleMapIterator it = m_imgHandleMap.begin(),
480 itend = m_imgHandleMap.end();
482 for ( ; it != itend; ++it) {
483 if (it->second->getState() == IResource::RES_LOADED) {
484 it->second.get()->invalidate();