ResourceHandle ResourceManager::GetResource(ResourceId_t id) { auto it = m_Registry.Find(id); if (it == m_Registry.End()) { return ResourceHandle(); } else { return it.GetValue().CreateHandle(); } }
ResourceHandle ResourceManager::loadResource(ResourceLoadOptions& options) { if( !archive ) return ResourceHandle(HandleInvalid); Path fileExt = PathGetFileExtension(options.name); // If the file has no extension, search for one with the same // name but with known resource loadable file extensions. if(fileExt.empty() && !findResource(options)) { LogError("Could not find matching file for '%s'", options.name.c_str()); return ResourceHandle(HandleInvalid); } // Check if the resource is already loaded. ResourceHandle handle = getResource(options.name); if( handle ) return handle; if( !validateResource(options.name) ) return ResourceHandle(HandleInvalid); Resource* resource = prepareResource(options); if( !resource ) return ResourceHandle(HandleInvalid); handle = ResourceHandleCreate(resource); if(handle == HandleInvalid) return ResourceHandle(HandleInvalid); // Register the decoded resource in the map. Path base = PathGetFile(options.name); auto key = MurmurHash64(base.c_str(), base.size(), 0); resources.set(key, handle); decodeResource(options); return handle; }
ResourceHandle ResourcesPage::getResourceFromTreeId( wxTreeItemId id ) { if( !id ) return ResourceHandle(); return GetResourceManager()->getResource( (String) GetItemText(id) ); }
std::shared_ptr<ResourceHandle> ResourceManager::Load(const Resource &r) { std::shared_ptr<IResourceLoader> loader = NULL; std::shared_ptr<ResourceHandle> handle = NULL; for (ResourceLoaders::iterator it = this->resourceLoaders.begin(); it != this->resourceLoaders.end(); ++it) { std::shared_ptr<IResourceLoader> l = *it; if (StringUtilities::WildcardMatch(l->GetPattern(), r.GetName())) { loader = l; break; } } if (!loader) { LogWarning("loader for file '" + r.GetName() + "' not found"); return handle; } int rawSize = this->file->GetRawResourceSize(r); if (rawSize < 0) { LogWarning("Resource not found: " + r.GetName()); return handle; } int allocSize = rawSize + (loader->AddNullZero() ? 1 : 0); char *rawBuffer = (loader->UseRawFile() ? Allocate(allocSize) : TG_NEW char[allocSize]); memset(rawBuffer, 0, allocSize); if (!rawBuffer || !this->file->GetRawResource(r, rawBuffer)) { return handle; } char *buffer = NULL; unsigned int size = 0; if (loader->UseRawFile()) { buffer = rawBuffer; handle = std::shared_ptr<ResourceHandle>(TG_NEW ResourceHandle(r, buffer, rawSize, this)); } else { size = loader->GetLoadedResourceSize(rawBuffer, rawSize); buffer = Allocate(size); if (!rawBuffer || !buffer) { LogError("Resource manager cache is out of memory."); return handle; } handle = std::shared_ptr<ResourceHandle>(TG_NEW ResourceHandle(r, buffer, size, this)); bool success = loader->LoadResource(rawBuffer, rawSize, handle); if (loader->DiscardRawBufferAfterLoad()) { SAFE_DELETE_ARRAY(rawBuffer); } if (!success) { return NULL; } } if (handle) { this->lru.push_front(handle); this->resources[r.GetName()] = handle; } return handle; }