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.cpp44
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 {