diff options
Diffstat (limited to 'src/mbgl/style/style_impl.cpp')
-rw-r--r-- | src/mbgl/style/style_impl.cpp | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/src/mbgl/style/style_impl.cpp b/src/mbgl/style/style_impl.cpp index 5b52f1d72c..2d4376073d 100644 --- a/src/mbgl/style/style_impl.cpp +++ b/src/mbgl/style/style_impl.cpp @@ -98,7 +98,7 @@ void Style::Impl::parse(const std::string& json_) { sources.clear(); layers.clear(); - images.clear(); + images = makeMutable<ImageImpls>(); transitionOptions = parser.transition; @@ -274,17 +274,37 @@ bool Style::Impl::isLoaded() const { } void Style::Impl::addImage(std::unique_ptr<style::Image> image) { - images.remove(image->getID()); // We permit using addImage to update. - images.add(std::move(image)); + auto newImages = makeMutable<ImageImpls>(*images); + auto it = + std::lower_bound(newImages->begin(), newImages->end(), image->getID(), [](const auto& a, const std::string& b) { + return a->id < b; + }); + if (it != newImages->end() && (*it)->id == image->getID()) { + // We permit using addImage to update. + *it = std::move(image->baseImpl); + } else { + newImages->insert(it, std::move(image->baseImpl)); + } + images = std::move(newImages); observer->onUpdate(); } void Style::Impl::removeImage(const std::string& id) { - images.remove(id); + auto newImages = makeMutable<ImageImpls>(*images); + auto found = + std::find_if(newImages->begin(), newImages->end(), [&id](const auto& image) { return image->id == id; }); + if (found == images->end()) { + Log::Warning(Event::General, "Image '%s' is not present in style, cannot remove", id.c_str()); + return; + } + newImages->erase(found); + images = std::move(newImages); } -const style::Image* Style::Impl::getImage(const std::string& id) const { - return images.get(id); +const style::Image::Impl* Style::Impl::getImage(const std::string& id) const { + auto found = std::find_if(images->begin(), images->end(), [&id](const auto& image) { return image->id == id; }); + if (found == images->end()) return nullptr; + return found->get(); } void Style::Impl::setObserver(style::Observer* observer_) { @@ -319,10 +339,12 @@ void Style::Impl::onSourceDescriptionChanged(Source& source) { } } -void Style::Impl::onSpriteLoaded(std::vector<std::unique_ptr<Image>>&& images_) { - for (auto& image : images_) { - addImage(std::move(image)); - } +void Style::Impl::onSpriteLoaded(std::vector<Immutable<style::Image::Impl>> images_) { + auto newImages = makeMutable<ImageImpls>(*images); + 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; }); + images = std::move(newImages); spriteLoaded = true; observer->onUpdate(); // For *-pattern properties. } @@ -357,7 +379,7 @@ const std::string& Style::Impl::getGlyphURL() const { } Immutable<std::vector<Immutable<Image::Impl>>> Style::Impl::getImageImpls() const { - return images.getImpls(); + return images; } Immutable<std::vector<Immutable<Source::Impl>>> Style::Impl::getSourceImpls() const { |