diff options
author | Ansis Brammanis <ansis.brammanis@gmail.com> | 2019-04-02 12:57:45 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-02 12:57:45 -0400 |
commit | 2455275bf47e1671a92eb2c1296c6b48f11f6b2e (patch) | |
tree | ad027661edc899feae56ad8b50ebd208f7a36d12 /src/mbgl/renderer/renderer_impl.cpp | |
parent | 805b1402452da74042b995d693c48ee4b79ae337 (diff) | |
download | qtlocation-mapboxgl-2455275bf47e1671a92eb2c1296c6b48f11f6b2e.tar.gz |
add onStyleImageMissing to allow dynamically loaded or generated images (#14253)
Also make `Style#updateImage(...)` much faster when the image doesn't change size. This can be useful for asynchronously generating images.
Diffstat (limited to 'src/mbgl/renderer/renderer_impl.cpp')
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 059bf6bf8d..7144a2dcee 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -83,6 +83,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { if (!imageManager) { imageManager = std::make_unique<ImageManager>(); + imageManager->setObserver(this); } if (updateParameters.mode != MapMode::Continuous) { @@ -143,6 +144,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { const ImageDifference imageDiff = diffImages(imageImpls, updateParameters.images); imageImpls = updateParameters.images; + // Only trigger tile reparse for changed images. Changed images only need a relayout when they have a different size. + bool hasImageDiff = !imageDiff.removed.empty(); + // Remove removed images from sprite atlas. for (const auto& entry : imageDiff.removed) { imageManager->removeImage(entry.first); @@ -155,9 +159,10 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { // Update changed images. for (const auto& entry : imageDiff.changed) { - imageManager->updateImage(entry.second.after); + hasImageDiff = imageManager->updateImage(entry.second.after) || hasImageDiff; } + imageManager->notifyIfMissingImageAdded(); imageManager->setLoaded(updateParameters.spriteLoaded); @@ -215,8 +220,6 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { renderSources.emplace(entry.first, std::move(renderSource)); } - const bool hasImageDiff = !(imageDiff.added.empty() && imageDiff.removed.empty() && imageDiff.changed.empty()); - // Update all sources. for (const auto& source : *sourceImpls) { std::vector<Immutable<Layer::Impl>> filteredLayers; @@ -837,4 +840,8 @@ void Renderer::Impl::onTileChanged(RenderSource&, const OverscaledTileID&) { observer->onInvalidate(); } +void Renderer::Impl::onStyleImageMissing(const std::string& id, std::function<void()> done) { + observer->onStyleImageMissing(id, std::move(done)); +} + } // namespace mbgl |