diff options
author | Ansis Brammanis <ansis@mapbox.com> | 2019-03-27 14:08:00 -0400 |
---|---|---|
committer | Ansis Brammanis <ansis@mapbox.com> | 2019-03-27 14:08:00 -0400 |
commit | 2883ea10b023d2260dce03c8f18f8b7ffafa6c8c (patch) | |
tree | 651c425c86949e04b5e2c128b6ca93dfbaeee8c5 | |
parent | c7d53676d0dcbc72d71d921e385c656087b788a5 (diff) | |
download | qtlocation-mapboxgl-2883ea10b023d2260dce03c8f18f8b7ffafa6c8c.tar.gz |
add onStyleImageMissing
-rw-r--r-- | include/mbgl/map/map_observer.hpp | 1 | ||||
-rw-r--r-- | include/mbgl/renderer/renderer_observer.hpp | 3 | ||||
-rw-r--r-- | src/core-files.json | 1 | ||||
-rw-r--r-- | src/mbgl/map/map_impl.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/map/map_impl.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/image_manager.cpp | 35 | ||||
-rw-r--r-- | src/mbgl/renderer/image_manager.hpp | 8 | ||||
-rw-r--r-- | src/mbgl/renderer/image_manager_observer.hpp | 12 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.hpp | 5 |
10 files changed, 74 insertions, 2 deletions
diff --git a/include/mbgl/map/map_observer.hpp b/include/mbgl/map/map_observer.hpp index 8ad9e93d0b..39fe516ff3 100644 --- a/include/mbgl/map/map_observer.hpp +++ b/include/mbgl/map/map_observer.hpp @@ -46,6 +46,7 @@ public: virtual void onDidFinishLoadingStyle() {} virtual void onSourceChanged(style::Source&) {} virtual void onDidBecomeIdle() {} + virtual void onStyleImageMissing(const std::string&) {} }; } // namespace mbgl diff --git a/include/mbgl/renderer/renderer_observer.hpp b/include/mbgl/renderer/renderer_observer.hpp index 0a76d01ca7..71620355e8 100644 --- a/include/mbgl/renderer/renderer_observer.hpp +++ b/include/mbgl/renderer/renderer_observer.hpp @@ -31,6 +31,9 @@ public: // Final frame virtual void onDidFinishRenderingMap() {} + + // Style is missing an image + virtual void onStyleImageMissing(const std::string&) {} }; } // namespace mbgl diff --git a/src/core-files.json b/src/core-files.json index 139b93e368..b257666e3e 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -615,6 +615,7 @@ "mbgl/renderer/group_by_layout.hpp": "src/mbgl/renderer/group_by_layout.hpp", "mbgl/renderer/image_atlas.hpp": "src/mbgl/renderer/image_atlas.hpp", "mbgl/renderer/image_manager.hpp": "src/mbgl/renderer/image_manager.hpp", + "mbgl/renderer/image_manager_observer.hpp": "src/mbgl/renderer/image_manager_observer.hpp", "mbgl/renderer/layers/render_background_layer.hpp": "src/mbgl/renderer/layers/render_background_layer.hpp", "mbgl/renderer/layers/render_circle_layer.hpp": "src/mbgl/renderer/layers/render_circle_layer.hpp", "mbgl/renderer/layers/render_custom_layer.hpp": "src/mbgl/renderer/layers/render_custom_layer.hpp", diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index 348e26700f..ecb9238362 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -172,4 +172,8 @@ void Map::Impl::jumpTo(const CameraOptions& camera) { onUpdate(); } +void Map::Impl::onStyleImageMissing(const std::string& id) { + observer.onStyleImageMissing(id); +} + } // namespace mbgl diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index 13ffdc02ae..425e136b66 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -47,6 +47,7 @@ public: void onDidFinishRenderingFrame(RenderMode, bool) final; void onWillStartRenderingMap() final; void onDidFinishRenderingMap() final; + void onStyleImageMissing(const std::string&) final; // Map void jumpTo(const CameraOptions&); diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp index 9c9f6c6e08..f756e201cb 100644 --- a/src/mbgl/renderer/image_manager.cpp +++ b/src/mbgl/renderer/image_manager.cpp @@ -1,9 +1,16 @@ #include <mbgl/renderer/image_manager.hpp> #include <mbgl/util/logging.hpp> #include <mbgl/gfx/context.hpp> +#include <mbgl/renderer/image_manager_observer.hpp> namespace mbgl { +static ImageManagerObserver nullObserver; + +void ImageManager::setObserver(ImageManagerObserver* observer_) { + observer = observer_ ? observer_ : &nullObserver; +} + void ImageManager::setLoaded(bool loaded_) { if (loaded == loaded_) { return; @@ -13,7 +20,7 @@ void ImageManager::setLoaded(bool loaded_) { if (loaded) { for (const auto& entry : requestors) { - notify(*entry.first, entry.second); + checkMissingAndNotify(*entry.first, entry.second); } requestors.clear(); } @@ -73,7 +80,7 @@ void ImageManager::getImages(ImageRequestor& requestor, ImageRequestPair&& pair) } } if (isLoaded() || hasAllDependencies) { - notify(requestor, std::move(pair)); + checkMissingAndNotify(requestor, std::move(pair)); } else { requestors.emplace(&requestor, std::move(pair)); } @@ -81,6 +88,30 @@ void ImageManager::getImages(ImageRequestor& requestor, ImageRequestPair&& pair) void ImageManager::removeRequestor(ImageRequestor& requestor) { requestors.erase(&requestor); + missingImageRequestors.erase(&requestor); +} + +void ImageManager::imagesAdded() { + for (const auto& entry : missingImageRequestors) { + notify(*entry.first, entry.second); + } + requestors.clear(); +} + +void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageRequestPair& pair) { + bool missing = false; + for (const auto& dependency : pair.first) { + auto it = images.find(dependency.first); + if (it == images.end()) { + missing = true; + observer->onStyleImageMissing(dependency.first); + } + } + if (missing) { + missingImageRequestors.emplace(&requestor, std::move(pair)); + } else { + notify(requestor, pair); + } } void ImageManager::notify(ImageRequestor& requestor, const ImageRequestPair& pair) const { diff --git a/src/mbgl/renderer/image_manager.hpp b/src/mbgl/renderer/image_manager.hpp index e56f30ac3f..9adb0fa113 100644 --- a/src/mbgl/renderer/image_manager.hpp +++ b/src/mbgl/renderer/image_manager.hpp @@ -6,6 +6,7 @@ #include <mbgl/util/immutable.hpp> #include <mbgl/util/optional.hpp> #include <mbgl/gfx/texture.hpp> +#include <mbgl/renderer/image_manager_observer.hpp> #include <mapbox/shelf-pack.hpp> @@ -39,6 +40,8 @@ public: ImageManager(); ~ImageManager(); + void setObserver(ImageManagerObserver*); + void setLoaded(bool); bool isLoaded() const; @@ -52,15 +55,20 @@ public: void getImages(ImageRequestor&, ImageRequestPair&&); void removeRequestor(ImageRequestor&); + void imagesAdded(); private: + void checkMissingAndNotify(ImageRequestor&, const ImageRequestPair&); void notify(ImageRequestor&, const ImageRequestPair&) const; bool loaded = false; std::unordered_map<ImageRequestor*, ImageRequestPair> requestors; + std::unordered_map<ImageRequestor*, ImageRequestPair> missingImageRequestors; ImageMap images; + ImageManagerObserver* observer = nullptr; + // Pattern stuff public: optional<ImagePosition> getPattern(const std::string& name); diff --git a/src/mbgl/renderer/image_manager_observer.hpp b/src/mbgl/renderer/image_manager_observer.hpp new file mode 100644 index 0000000000..e483c5b8f6 --- /dev/null +++ b/src/mbgl/renderer/image_manager_observer.hpp @@ -0,0 +1,12 @@ +#pragma once + +namespace mbgl { + +class ImageManagerObserver { +public: + virtual ~ImageManagerObserver() = default; + + virtual void onStyleImageMissing(const std::string&) {} +}; + +} // namespace mbgl diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 311008507b..adef3890bf 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) { @@ -158,6 +159,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { imageManager->updateImage(entry.second.after); } + imageManager->imagesAdded(); imageManager->setLoaded(updateParameters.spriteLoaded); @@ -834,4 +836,8 @@ void Renderer::Impl::onTileChanged(RenderSource&, const OverscaledTileID&) { observer->onInvalidate(); } +void Renderer::Impl::onStyleImageMissing(const std::string& id) { + observer->onStyleImageMissing(id); +} + } // namespace mbgl diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index a036bfc7ff..8ec7d26988 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -11,6 +11,7 @@ #include <mbgl/map/zoom_history.hpp> #include <mbgl/text/cross_tile_symbol_index.hpp> #include <mbgl/text/glyph_manager_observer.hpp> +#include <mbgl/renderer/image_manager_observer.hpp> #include <mbgl/text/placement.hpp> #include <memory> @@ -34,6 +35,7 @@ class LineAtlas; class CrossTileSymbolIndex; class Renderer::Impl : public GlyphManagerObserver, + public ImageManagerObserver, public RenderSourceObserver{ public: Impl(RendererBackend&, float pixelRatio_, Scheduler&, GLContextMode, @@ -86,6 +88,9 @@ private: void onTileChanged(RenderSource&, const OverscaledTileID&) override; void onTileError(RenderSource&, const OverscaledTileID&, std::exception_ptr) override; + // ImageManagerObserver implementation + void onStyleImageMissing(const std::string&) override; + void updateFadingTiles(); friend class Renderer; |