summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnsis Brammanis <ansis@mapbox.com>2019-03-27 14:08:00 -0400
committerAnsis Brammanis <ansis@mapbox.com>2019-03-27 14:08:00 -0400
commit2883ea10b023d2260dce03c8f18f8b7ffafa6c8c (patch)
tree651c425c86949e04b5e2c128b6ca93dfbaeee8c5
parentc7d53676d0dcbc72d71d921e385c656087b788a5 (diff)
downloadqtlocation-mapboxgl-2883ea10b023d2260dce03c8f18f8b7ffafa6c8c.tar.gz
add onStyleImageMissing
-rw-r--r--include/mbgl/map/map_observer.hpp1
-rw-r--r--include/mbgl/renderer/renderer_observer.hpp3
-rw-r--r--src/core-files.json1
-rw-r--r--src/mbgl/map/map_impl.cpp4
-rw-r--r--src/mbgl/map/map_impl.hpp1
-rw-r--r--src/mbgl/renderer/image_manager.cpp35
-rw-r--r--src/mbgl/renderer/image_manager.hpp8
-rw-r--r--src/mbgl/renderer/image_manager_observer.hpp12
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp6
-rw-r--r--src/mbgl/renderer/renderer_impl.hpp5
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;