diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2015-11-05 15:05:43 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2015-11-12 13:03:14 -0800 |
commit | 1e350b7ea485117cadc413d4d41062cf3c3c43a1 (patch) | |
tree | 8dde92582eda347a7c88c0e655270cef82e44744 /src/mbgl/sprite/sprite_store.cpp | |
parent | 0dc1519a1891dac6272f69dd1d1768f15908003c (diff) | |
download | qtlocation-mapboxgl-1e350b7ea485117cadc413d4d41062cf3c3c43a1.tar.gz |
[core] Reorganize sprite related files
Diffstat (limited to 'src/mbgl/sprite/sprite_store.cpp')
-rw-r--r-- | src/mbgl/sprite/sprite_store.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/mbgl/sprite/sprite_store.cpp b/src/mbgl/sprite/sprite_store.cpp new file mode 100644 index 0000000000..fb6833114e --- /dev/null +++ b/src/mbgl/sprite/sprite_store.cpp @@ -0,0 +1,71 @@ +#include <mbgl/sprite/sprite_store.hpp> + +#include <mbgl/platform/log.hpp> + +namespace mbgl { + +void SpriteStore::setSprite(const std::string& name, std::shared_ptr<const SpriteImage> sprite) { + std::lock_guard<std::mutex> lock(mutex); + _setSprite(name, sprite); +} + +void SpriteStore::_setSprite(const std::string& name, + const std::shared_ptr<const SpriteImage>& sprite) { + if (sprite) { + auto it = sprites.find(name); + if (it != sprites.end()) { + // There is already a sprite with that name in our store. + if ((it->second->width != sprite->width || it->second->height != sprite->height)) { + Log::Warning(Event::Sprite, "Can't change sprite dimensions for '%s'", name.c_str()); + return; + } + it->second = sprite; + } else { + sprites.emplace(name, sprite); + } + + // Always add/replace the value in the dirty list. + auto dirty_it = dirty.find(name); + if (dirty_it != dirty.end()) { + dirty_it->second = sprite; + } else { + dirty.emplace(name, sprite); + } + } else if (sprites.erase(name) > 0) { + dirty.emplace(name, nullptr); + } +} + +void SpriteStore::setSprites(const Sprites& newSprites) { + std::lock_guard<std::mutex> lock(mutex); + for (const auto& pair : newSprites) { + _setSprite(pair.first, pair.second); + } +} + +void SpriteStore::removeSprite(const std::string& name) { + std::lock_guard<std::mutex> lock(mutex); + _setSprite(name); +} + +std::shared_ptr<const SpriteImage> SpriteStore::getSprite(const std::string& name) { + std::lock_guard<std::mutex> lock(mutex); + const auto it = sprites.find(name); + if (it != sprites.end()) { + return it->second; + } else { + if (!sprites.empty()) { + Log::Info(Event::Sprite, "Can't find sprite named '%s'", name.c_str()); + } + return nullptr; + } +} + +SpriteStore::Sprites SpriteStore::getDirty() { + Sprites result; + std::lock_guard<std::mutex> lock(mutex); + dirty.swap(result); + return result; +} + +} // namespace mbgl |