summaryrefslogtreecommitdiff
path: root/src/mbgl/style
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-05-15 14:18:01 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-05-30 11:34:13 -0700
commit6be6263ebf32c45dcbbc2dbe2937422553bc897a (patch)
treef12021eb71905a0734378b42b03aeba94e287040 /src/mbgl/style
parentfb3cef632d7732fab54f93971d3c8ef4d8291bef (diff)
downloadqtlocation-mapboxgl-6be6263ebf32c45dcbbc2dbe2937422553bc897a.tar.gz
[core] Replace inline SpriteAtlas updates with diffing
Diffstat (limited to 'src/mbgl/style')
-rw-r--r--src/mbgl/style/style.cpp41
-rw-r--r--src/mbgl/style/style.hpp3
2 files changed, 37 insertions, 7 deletions
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index 0a212b977f..bc5d77b4bd 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -361,6 +361,35 @@ void Style::update(const UpdateParameters& parameters) {
}
+ std::vector<Immutable<Image::Impl>> newImageImpls;
+ newImageImpls.reserve(images.size());
+ for (const auto& entry : images) {
+ newImageImpls.push_back(entry.second->impl);
+ }
+
+ const ImageDifference imageDiff = diffImages(imageImpls, newImageImpls);
+ imageImpls = std::move(newImageImpls);
+
+ // Remove removed images from sprite atlas.
+ for (const auto& entry : imageDiff.removed) {
+ spriteAtlas->removeImage(entry.first);
+ }
+
+ // Add added images to sprite atlas.
+ for (const auto& entry : imageDiff.added) {
+ spriteAtlas->addImage(entry.second);
+ }
+
+ // Update changed images.
+ for (const auto& entry : imageDiff.changed) {
+ spriteAtlas->updateImage(entry.second);
+ }
+
+ if (spriteLoaded && !spriteAtlas->isLoaded()) {
+ spriteAtlas->onSpriteLoaded();
+ }
+
+
std::vector<Immutable<Source::Impl>> newSourceImpls;
newSourceImpls.reserve(sources.size());
for (const auto& source : sources) {
@@ -509,6 +538,10 @@ bool Style::isLoaded() const {
return false;
}
+ if (!spriteLoaded) {
+ return false;
+ }
+
for (const auto& source: sources) {
if (!source->loaded) {
return false;
@@ -521,10 +554,6 @@ bool Style::isLoaded() const {
}
}
- if (!spriteAtlas->isLoaded()) {
- return false;
- }
-
return true;
}
@@ -535,13 +564,11 @@ void Style::addImage(std::unique_ptr<style::Image> image) {
Log::Warning(Event::Sprite, "Can't change sprite dimensions for '%s'", id.c_str());
return;
}
- spriteAtlas->addImage(image->impl);
images[id] = std::move(image);
}
void Style::removeImage(const std::string& id) {
images.erase(id);
- spriteAtlas->removeImage(id);
}
const style::Image* Style::getImage(const std::string& id) const {
@@ -764,7 +791,7 @@ void Style::onSpriteLoaded(std::vector<std::unique_ptr<Image>>&& images_) {
for (auto& image : images_) {
addImage(std::move(image));
}
- spriteAtlas->onSpriteLoaded();
+ spriteLoaded = true;
observer->onUpdate(Update::Repaint); // For *-pattern properties.
}
diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp
index 5d3c2899fd..2d0b9eddbb 100644
--- a/src/mbgl/style/style.hpp
+++ b/src/mbgl/style/style.hpp
@@ -6,6 +6,7 @@
#include <mbgl/style/layer_observer.hpp>
#include <mbgl/style/light_observer.hpp>
#include <mbgl/style/update_batch.hpp>
+#include <mbgl/style/image.hpp>
#include <mbgl/renderer/render_source.hpp>
#include <mbgl/renderer/render_source_observer.hpp>
#include <mbgl/renderer/render_layer.hpp>
@@ -138,6 +139,7 @@ private:
double defaultBearing = 0;
double defaultPitch = 0;
+ std::vector<Immutable<Image::Impl>> imageImpls;
std::vector<Immutable<Source::Impl>> sourceImpls;
std::vector<Immutable<Layer::Impl>> layerImpls;
@@ -179,6 +181,7 @@ private:
UpdateBatch updateBatch;
ZoomHistory zoomHistory;
+ bool spriteLoaded = false;
public:
bool loaded = false;