From 6be6263ebf32c45dcbbc2dbe2937422553bc897a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 15 May 2017 14:18:01 -0700 Subject: [core] Replace inline SpriteAtlas updates with diffing --- src/mbgl/style/style.cpp | 41 ++++++++++++++++++++++++++++++++++------- src/mbgl/style/style.hpp | 3 +++ 2 files changed, 37 insertions(+), 7 deletions(-) (limited to 'src/mbgl/style') 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> 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> 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 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>&& 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 #include #include +#include #include #include #include @@ -138,6 +139,7 @@ private: double defaultBearing = 0; double defaultPitch = 0; + std::vector> imageImpls; std::vector> sourceImpls; std::vector> layerImpls; @@ -179,6 +181,7 @@ private: UpdateBatch updateBatch; ZoomHistory zoomHistory; + bool spriteLoaded = false; public: bool loaded = false; -- cgit v1.2.1