diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-05-19 01:13:46 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-05-22 10:44:18 +0300 |
commit | da81211feaffd89319330774b61b261b939dde33 (patch) | |
tree | 18a26cabee3d486f7684590c7b9d981c39661f4f | |
parent | b304b20073556d442764696dbe5ac09d5462ada0 (diff) | |
download | qtlocation-mapboxgl-da81211feaffd89319330774b61b261b939dde33.tar.gz |
Add callback for error notifications on renderStill()
The callback will be called when any of the resources requested
from the network failed to load.
There is not recovery implemented yet, so the closest thing to
reseting the Map object and reloading all the resources would
be setting a new style.
-rw-r--r-- | bin/render.cpp | 11 | ||||
-rw-r--r-- | include/mbgl/map/map.hpp | 2 | ||||
-rw-r--r-- | include/mbgl/platform/event.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/map_context.cpp | 11 | ||||
-rw-r--r-- | src/mbgl/map/map_context.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/map/resource_loader.cpp | 16 | ||||
-rw-r--r-- | src/mbgl/map/resource_loader.hpp | 2 | ||||
-rw-r--r-- | test/api/repeated_render.cpp | 4 | ||||
-rw-r--r-- | test/headless/headless.cpp | 2 |
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(); |