summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRomain Quidet <romain.quidet.ext@mappy.com>2015-11-30 14:18:10 +0100
committerMinh Nguyễn <mxn@1ec5.org>2015-12-15 16:36:17 -0800
commitaf45d87e54e36f9899507d31c4b79669a254350e (patch)
tree0840dcb2a9b9736e28e32473b750a2687ade3743 /src
parent02a32b55e4ec392d213d435354bbcd2f33cef40c (diff)
downloadqtlocation-mapboxgl-af45d87e54e36f9899507d31c4b79669a254350e.tar.gz
2210: Sprites can be removed / updated correctly
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/annotation/annotation_manager.cpp5
-rw-r--r--src/mbgl/annotation/annotation_manager.hpp1
-rw-r--r--src/mbgl/map/map.cpp2
-rw-r--r--src/mbgl/map/map_context.cpp7
-rw-r--r--src/mbgl/map/map_context.hpp1
-rw-r--r--src/mbgl/sprite/sprite_atlas.cpp11
6 files changed, 23 insertions, 4 deletions
diff --git a/src/mbgl/annotation/annotation_manager.cpp b/src/mbgl/annotation/annotation_manager.cpp
index a85021b774..6538cb8e9e 100644
--- a/src/mbgl/annotation/annotation_manager.cpp
+++ b/src/mbgl/annotation/annotation_manager.cpp
@@ -159,6 +159,11 @@ void AnnotationManager::addIcon(const std::string& name, std::shared_ptr<const S
spriteStore.setSprite(name, sprite);
spriteAtlas.updateDirty();
}
+
+void AnnotationManager::removeIcon(const std::string& name) {
+ spriteStore.removeSprite(name);
+ spriteAtlas.updateDirty();
+}
double AnnotationManager::getTopOffsetPixelsForIcon(const std::string& name) {
auto sprite = spriteStore.getSprite(name);
diff --git a/src/mbgl/annotation/annotation_manager.hpp b/src/mbgl/annotation/annotation_manager.hpp
index eee4c0a0cc..bc3f73e2ca 100644
--- a/src/mbgl/annotation/annotation_manager.hpp
+++ b/src/mbgl/annotation/annotation_manager.hpp
@@ -34,6 +34,7 @@ public:
LatLngBounds getBoundsForAnnotations(const AnnotationIDs&) const;
void addIcon(const std::string& name, std::shared_ptr<const SpriteImage>);
+ void removeIcon(const std::string& name);
double getTopOffsetPixelsForIcon(const std::string& name);
SpriteAtlas& getSpriteAtlas() { return spriteAtlas; }
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 3c585a8ae2..c07eda6b46 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -392,7 +392,7 @@ void Map::addAnnotationIcon(const std::string& name, std::shared_ptr<const Sprit
}
void Map::removeAnnotationIcon(const std::string& name) {
- addAnnotationIcon(name, nullptr);
+ removeAnnotationIcon(name);
}
double Map::getTopOffsetPixelsForAnnotationIcon(const std::string& symbol) {
diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp
index c5fcc7ff0e..179df004a7 100644
--- a/src/mbgl/map/map_context.cpp
+++ b/src/mbgl/map/map_context.cpp
@@ -272,6 +272,11 @@ void MapContext::addAnnotationIcon(const std::string& name, std::shared_ptr<cons
assert(util::ThreadContext::currentlyOn(util::ThreadType::Map));
data.getAnnotationManager()->addIcon(name, sprite);
}
+
+void MapContext::removeAnnotationIcon(const std::string& name) {
+ assert(util::ThreadContext::currentlyOn(util::ThreadType::Map));
+ data.getAnnotationManager()->removeIcon(name);
+}
double MapContext::getTopOffsetPixelsForAnnotationIcon(const std::string& name) {
assert(util::ThreadContext::currentlyOn(util::ThreadType::Map));
@@ -298,7 +303,7 @@ void MapContext::onLowMemory() {
style->onLowMemory();
asyncInvalidate.send();
}
-
+
void MapContext::onTileDataChanged() {
assert(util::ThreadContext::currentlyOn(util::ThreadType::Map));
updateFlags |= Update::Repaint;
diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp
index 8e0dbd80c0..554765eac6 100644
--- a/src/mbgl/map/map_context.hpp
+++ b/src/mbgl/map/map_context.hpp
@@ -52,6 +52,7 @@ public:
// Annotations
void addAnnotationIcon(const std::string&, std::shared_ptr<const SpriteImage>);
+ void removeAnnotationIcon(const std::string&);
double getTopOffsetPixelsForAnnotationIcon(const std::string&);
void updateAnnotations();
diff --git a/src/mbgl/sprite/sprite_atlas.cpp b/src/mbgl/sprite/sprite_atlas.cpp
index 6ebebb9507..b04d8edc5f 100644
--- a/src/mbgl/sprite/sprite_atlas.cpp
+++ b/src/mbgl/sprite/sprite_atlas.cpp
@@ -187,8 +187,15 @@ void SpriteAtlas::updateDirty() {
// The two names match;
Holder& holder = imageIterator->second;
holder.texture = spriteIterator->second;
- copy(holder, imageIterator->first.second);
-
+ if (holder.texture != nullptr)
+ {
+ copy(holder, imageIterator->first.second);
+ }
+ else
+ {
+ images.erase(imageIterator);
+ }
+
++imageIterator;
// Don't advance the spriteIterator because there might be another sprite with the same
// name, but a different wrap value.