summaryrefslogtreecommitdiff
path: root/src/mbgl/style/style_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style/style_impl.cpp')
-rw-r--r--src/mbgl/style/style_impl.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/mbgl/style/style_impl.cpp b/src/mbgl/style/style_impl.cpp
index 59cb57aca6..83570e40e0 100644
--- a/src/mbgl/style/style_impl.cpp
+++ b/src/mbgl/style/style_impl.cpp
@@ -341,9 +341,23 @@ void Style::Impl::onSourceDescriptionChanged(Source& source) {
void Style::Impl::onSpriteLoaded(std::vector<Immutable<style::Image::Impl>> images_) {
auto newImages = makeMutable<ImageImpls>(*images);
+ assert(std::is_sorted(newImages->begin(), newImages->end()));
+
+ for (auto it = images_.begin(); it != images_.end();) {
+ const auto& image = *it;
+ const auto first = std::lower_bound(newImages->begin(), newImages->end(), image);
+ auto found = first != newImages->end() && (image->id == (*first)->id) ? first : newImages->end();
+ if (found != newImages->end()) {
+ *found = std::move(*it);
+ it = images_.erase(it);
+ } else {
+ ++it;
+ }
+ }
+
newImages->insert(
newImages->end(), std::make_move_iterator(images_.begin()), std::make_move_iterator(images_.end()));
- std::sort(newImages->begin(), newImages->end(), [](const auto& a, const auto& b) { return a->id < b->id; });
+ std::sort(newImages->begin(), newImages->end());
images = std::move(newImages);
spriteLoaded = true;
observer->onUpdate(); // For *-pattern properties.