summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/render.cpp11
-rw-r--r--include/mbgl/map/map.hpp2
-rw-r--r--include/mbgl/platform/event.hpp2
-rw-r--r--src/mbgl/map/map_context.cpp11
-rw-r--r--src/mbgl/map/map_context.hpp3
-rw-r--r--src/mbgl/map/resource_loader.cpp16
-rw-r--r--src/mbgl/map/resource_loader.hpp2
-rw-r--r--test/api/repeated_render.cpp4
-rw-r--r--test/headless/headless.cpp2
9 files changed, 46 insertions, 7 deletions
diff --git a/bin/render.cpp b/bin/render.cpp
index 33e216f52a..740d3dffe5 100644
--- a/bin/render.cpp
+++ b/bin/render.cpp
@@ -111,7 +111,16 @@ int main(int argc, char *argv[]) {
util::write_file(output, png);
});
- map.renderStill([async](std::unique_ptr<const StillImage> image) {
+ map.renderStill([async](std::exception_ptr error, std::unique_ptr<const StillImage> image) {
+ try {
+ if (error) {
+ std::rethrow_exception(error);
+ }
+ } catch(std::exception& e) {
+ std::cout << "Error: " << e.what() << std::endl;
+ exit(1);
+ }
+
async->data = const_cast<StillImage *>(image.release());
uv_async_send(async);
});
diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp
index e71c5f5b4d..a6aac08b3c 100644
--- a/include/mbgl/map/map.hpp
+++ b/include/mbgl/map/map.hpp
@@ -42,7 +42,7 @@ public:
// Register a callback that will get called (on the render thread) when all resources have
// been loaded and a complete render occurs.
- using StillImageCallback = std::function<void(std::unique_ptr<const StillImage>)>;
+ using StillImageCallback = std::function<void(std::exception_ptr, std::unique_ptr<const StillImage>)>;
void renderStill(StillImageCallback callback);
// Triggers a synchronous or asynchronous render.
diff --git a/include/mbgl/platform/event.hpp b/include/mbgl/platform/event.hpp
index 5fd64119cc..8cdd1d50a9 100644
--- a/include/mbgl/platform/event.hpp
+++ b/include/mbgl/platform/event.hpp
@@ -29,6 +29,7 @@ enum class Event : uint8_t {
ParseStyle,
ParseTile,
Render,
+ ResourceLoader,
Database,
HttpRequest,
Sprite,
@@ -46,6 +47,7 @@ MBGL_DEFINE_ENUM_CLASS(EventClass, Event, {
{ Event::ParseStyle, "ParseStyle" },
{ Event::ParseTile, "ParseTile" },
{ Event::Render, "Render" },
+ { Event::ResourceLoader, "ResourceLoader" },
{ Event::Database, "Database" },
{ Event::HttpRequest, "HttpRequest" },
{ Event::Sprite, "Sprite" },
diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp
index f373274ebd..28bd8903ed 100644
--- a/src/mbgl/map/map_context.cpp
+++ b/src/mbgl/map/map_context.cpp
@@ -232,7 +232,7 @@ void MapContext::render() {
painter->render(*style, transformState, data.getAnimationTime());
if (data.mode == MapMode::Still) {
- callback(view.readStillImage());
+ callback(nullptr, view.readStillImage());
callback = nullptr;
}
@@ -274,4 +274,13 @@ void MapContext::onTileDataChanged() {
triggerUpdate();
}
+void MapContext::onResourceLoadingFailed(std::exception_ptr error) {
+ assert(Environment::currentlyOn(ThreadType::Map));
+
+ if (data.mode == MapMode::Still && callback) {
+ callback(error, nullptr);
+ callback = nullptr;
+ }
+}
+
}
diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp
index c842454849..fb9fdb4d4b 100644
--- a/src/mbgl/map/map_context.hpp
+++ b/src/mbgl/map/map_context.hpp
@@ -43,7 +43,7 @@ public:
void resize(uint16_t width, uint16_t height, float ratio);
- using StillImageCallback = std::function<void(std::unique_ptr<const StillImage>)>;
+ using StillImageCallback = std::function<void(std::exception_ptr, std::unique_ptr<const StillImage>)>;
void renderStill(StillImageCallback callback);
void triggerUpdate(Update = Update::Nothing);
@@ -61,6 +61,7 @@ public:
// ResourceLoader::Observer implementation.
void onTileDataChanged() override;
+ void onResourceLoadingFailed(std::exception_ptr error) override;
private:
void updateTiles();
diff --git a/src/mbgl/map/resource_loader.cpp b/src/mbgl/map/resource_loader.cpp
index 2be86dc5e2..620b1b1379 100644
--- a/src/mbgl/map/resource_loader.cpp
+++ b/src/mbgl/map/resource_loader.cpp
@@ -130,4 +130,20 @@ void ResourceLoader::emitTileDataChanged() {
}
}
+void ResourceLoader::emitResourceLoadingFailed(std::exception_ptr error) {
+ assert(Environment::currentlyOn(ThreadType::Map));
+
+ try {
+ if (error) {
+ std::rethrow_exception(error);
+ }
+ } catch(const std::exception& e) {
+ Log::Error(Event::ResourceLoader, e.what());
+ }
+
+ if (observer_) {
+ observer_->onResourceLoadingFailed(error);
+ }
+}
+
}
diff --git a/src/mbgl/map/resource_loader.hpp b/src/mbgl/map/resource_loader.hpp
index 379444135e..fb05e67e1d 100644
--- a/src/mbgl/map/resource_loader.hpp
+++ b/src/mbgl/map/resource_loader.hpp
@@ -32,6 +32,7 @@ public:
virtual ~Observer() = default;
virtual void onTileDataChanged() = 0;
+ virtual void onResourceLoadingFailed(std::exception_ptr error) = 0;
};
ResourceLoader();
@@ -72,6 +73,7 @@ public:
private:
void emitTileDataChanged();
+ void emitResourceLoadingFailed(std::exception_ptr error);
bool shouldReparsePartialTiles_ = false;
diff --git a/test/api/repeated_render.cpp b/test/api/repeated_render.cpp
index ce7e6cbb0b..f563b00071 100644
--- a/test/api/repeated_render.cpp
+++ b/test/api/repeated_render.cpp
@@ -28,7 +28,7 @@ TEST(API, RepeatedRender) {
map.resize(128, 512, 1);
map.setStyleJSON(style, "test/suite");
std::promise<std::unique_ptr<const StillImage>> promise;
- map.renderStill([&promise](std::unique_ptr<const StillImage> image) {
+ map.renderStill([&promise](std::exception_ptr, std::unique_ptr<const StillImage> image) {
promise.set_value(std::move(image));
});
auto result = promise.get_future().get();
@@ -42,7 +42,7 @@ TEST(API, RepeatedRender) {
map.resize(512, 512, 2);
map.setStyleJSON(style, "TEST_DATA/suite");
std::promise<std::unique_ptr<const StillImage>> promise;
- map.renderStill([&promise](std::unique_ptr<const StillImage> image) {
+ map.renderStill([&promise](std::exception_ptr, std::unique_ptr<const StillImage> image) {
promise.set_value(std::move(image));
});
auto result = promise.get_future().get();
diff --git a/test/headless/headless.cpp b/test/headless/headless.cpp
index a02062dbdd..8dfed0383b 100644
--- a/test/headless/headless.cpp
+++ b/test/headless/headless.cpp
@@ -152,7 +152,7 @@ TEST_P(HeadlessTest, render) {
map.setLatLngZoom(mbgl::LatLng(latitude, longitude), zoom);
map.setBearing(bearing);
- map.renderStill([&](std::unique_ptr<const StillImage> image) {
+ map.renderStill([&](std::exception_ptr, std::unique_ptr<const StillImage> image) {
const std::string png = util::compress_png(image->width, image->height, image->pixels.get());
util::write_file("test/suite/tests/" + base + "/" + name + "/actual.png", png);
promise.set_value();