summaryrefslogtreecommitdiff
path: root/src/mbgl/sprite/sprite_store.cpp
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2015-11-05 15:05:43 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-11-12 13:03:14 -0800
commit1e350b7ea485117cadc413d4d41062cf3c3c43a1 (patch)
tree8dde92582eda347a7c88c0e655270cef82e44744 /src/mbgl/sprite/sprite_store.cpp
parent0dc1519a1891dac6272f69dd1d1768f15908003c (diff)
downloadqtlocation-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.cpp71
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