diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-02-15 01:38:45 +0200 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-02-17 10:14:05 +0200 |
commit | b97f40469b6f3d386ae93bc9a23722ff017162f0 (patch) | |
tree | a94e1b72152429176b30c33d1c83fea877960204 /src/mbgl/style/style_impl.cpp | |
parent | 02274e76019bcfb938f50cdb638eca49c33de786 (diff) | |
download | qtlocation-mapboxgl-b97f40469b6f3d386ae93bc9a23722ff017162f0.tar.gz |
[core] Fix sprite sheet merging in Style::Impl::onSpriteLoaded
If we get a new sprite sheet from the server, we need to merge current
sprite sheet with a new one, while overwiting duplicates and keeping
old unique images in a style.
Diffstat (limited to 'src/mbgl/style/style_impl.cpp')
-rw-r--r-- | src/mbgl/style/style_impl.cpp | 16 |
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. |