diff options
author | Romain Quidet <romain.quidet.ext@mappy.com> | 2015-11-30 14:18:10 +0100 |
---|---|---|
committer | Minh Nguyễn <mxn@1ec5.org> | 2015-12-15 16:36:17 -0800 |
commit | af45d87e54e36f9899507d31c4b79669a254350e (patch) | |
tree | 0840dcb2a9b9736e28e32473b750a2687ade3743 | |
parent | 02a32b55e4ec392d213d435354bbcd2f33cef40c (diff) | |
download | qtlocation-mapboxgl-af45d87e54e36f9899507d31c4b79669a254350e.tar.gz |
2210: Sprites can be removed / updated correctly
-rw-r--r-- | platform/ios/MGLMapView.mm | 2 | ||||
-rw-r--r-- | src/mbgl/annotation/annotation_manager.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/annotation/annotation_manager.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/map/map.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/map_context.cpp | 7 | ||||
-rw-r--r-- | src/mbgl/map/map_context.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/sprite/sprite_atlas.cpp | 11 |
7 files changed, 24 insertions, 5 deletions
diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index fc4a655e6f..5d944e81fe 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -2718,7 +2718,7 @@ std::chrono::steady_clock::duration MGLDurationInSeconds(float duration) { // remove sprite NSString *symbolName = [MGLAnnotationSpritePrefix stringByAppendingString:annotationImage.reuseIdentifier]; - _mbglMap->removeSprite(symbolName.UTF8String); + _mbglMap->removeAnnotationIcon(symbolName.UTF8String); [self installAnnotationImage:annotationImage]; _mbglMap->update(mbgl::Update::Annotations); } 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. |