diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-07-02 16:04:30 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-07-02 23:21:42 +0300 |
commit | 9cc986e758da9c19cdd078c1acfd44efee8f33f6 (patch) | |
tree | 962b5d1e6ef0a528d6225c321ff56d5f100c5685 /src | |
parent | c357ce540ad712194ca70d606d3fd1ef1cf4cc41 (diff) | |
download | qtlocation-mapboxgl-9cc986e758da9c19cdd078c1acfd44efee8f33f6.tar.gz |
Report errors when parsing raster tiles
Use the same API/pattern for parsing raster tiles as we use for vector
tiles. Forward the error as an exception that will ultimately reach the
StillImageCallback.
Also set the tile to State::obsolete on error like we do for vector
tiles.
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/map/raster_tile_data.cpp | 11 | ||||
-rw-r--r-- | src/mbgl/map/tile_data.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/raster_bucket.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/raster_bucket.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/util/raster.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/util/raster.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/util/worker.cpp | 15 | ||||
-rw-r--r-- | src/mbgl/util/worker.hpp | 2 |
8 files changed, 26 insertions, 18 deletions
diff --git a/src/mbgl/map/raster_tile_data.cpp b/src/mbgl/map/raster_tile_data.cpp index b0fa4d171b..a8a1ab03dc 100644 --- a/src/mbgl/map/raster_tile_data.cpp +++ b/src/mbgl/map/raster_tile_data.cpp @@ -44,15 +44,18 @@ void RasterTileData::request(float pixelRatio, state = State::loaded; - workRequest = worker.parseRasterTile(bucket, res.data, [this, callback] (bool result) { + workRequest = worker.parseRasterTile(bucket, res.data, [this, callback] (TileParseResult result) { if (state != State::loaded) { return; } - if (result) { - state = State::parsed; + if (result.is<State>()) { + state = result.get<State>(); } else { - state = State::invalid; + std::stringstream message; + message << "Failed to parse [" << std::string(id) << "]: " << result.get<std::string>(); + error = message.str(); + state = State::obsolete; } callback(); diff --git a/src/mbgl/map/tile_data.hpp b/src/mbgl/map/tile_data.hpp index 476172ce55..e78d888415 100644 --- a/src/mbgl/map/tile_data.hpp +++ b/src/mbgl/map/tile_data.hpp @@ -28,9 +28,6 @@ public: // the TileData object is not effectively on the 'invalid' state and will // cause tiles on 'invalid' state to get reloaded. // - // Raster tiles (only) are changing to 'invalid' on error, which will cause a - // re-request of the tile. - // // loading: // A request to the FileSource was made for the actual tile data and TileData // is waiting for it to arrive. diff --git a/src/mbgl/renderer/raster_bucket.cpp b/src/mbgl/renderer/raster_bucket.cpp index c8a42f46a6..70cc1065d9 100644 --- a/src/mbgl/renderer/raster_bucket.cpp +++ b/src/mbgl/renderer/raster_bucket.cpp @@ -23,8 +23,8 @@ void RasterBucket::render(Painter& painter, painter.renderRaster(*this, layer_desc, id, matrix); } -bool RasterBucket::setImage(const std::string &data) { - return raster.load(data); +bool RasterBucket::setImage(std::unique_ptr<util::Image> image) { + return raster.load(std::move(image)); } void RasterBucket::drawRaster(RasterShader& shader, StaticVertexBuffer &vertices, VertexArrayObject &array) { diff --git a/src/mbgl/renderer/raster_bucket.hpp b/src/mbgl/renderer/raster_bucket.hpp index 70434b7d60..3c8730e61e 100644 --- a/src/mbgl/renderer/raster_bucket.hpp +++ b/src/mbgl/renderer/raster_bucket.hpp @@ -20,7 +20,7 @@ public: void render(Painter&, const StyleLayer&, const TileID&, const mat4&) override; bool hasData() const; - bool setImage(const std::string &data); + bool setImage(std::unique_ptr<util::Image> image); const StyleLayoutRaster &layout; diff --git a/src/mbgl/util/raster.cpp b/src/mbgl/util/raster.cpp index b6b5df27f6..9b82540894 100644 --- a/src/mbgl/util/raster.cpp +++ b/src/mbgl/util/raster.cpp @@ -25,8 +25,8 @@ bool Raster::isLoaded() const { return loaded; } -bool Raster::load(const std::string &data) { - img = std::make_unique<util::Image>(data); +bool Raster::load(std::unique_ptr<util::Image> image) { + img = std::move(image); width = img->getWidth(); height = img->getHeight(); diff --git a/src/mbgl/util/raster.hpp b/src/mbgl/util/raster.hpp index 1789ae87f7..39ab26ffc6 100644 --- a/src/mbgl/util/raster.hpp +++ b/src/mbgl/util/raster.hpp @@ -6,7 +6,6 @@ #include <mbgl/util/ptr.hpp> #include <mbgl/util/chrono.hpp> -#include <string> #include <mutex> typedef struct uv_loop_s uv_loop_t; @@ -20,7 +19,7 @@ public: ~Raster(); // load image data - bool load(const std::string &img); + bool load(std::unique_ptr<util::Image> image); // bind current texture void bind(bool linear = false); diff --git a/src/mbgl/util/worker.cpp b/src/mbgl/util/worker.cpp index cc9fa15667..9277dacccf 100644 --- a/src/mbgl/util/worker.cpp +++ b/src/mbgl/util/worker.cpp @@ -20,8 +20,17 @@ public: util::ThreadContext::setFileSource(fs); } - void parseRasterTile(RasterBucket* bucket, std::string data, std::function<void (bool)> callback) { - callback(bucket->setImage(data)); + void parseRasterTile(RasterBucket* bucket, std::string data, std::function<void (TileParseResult)> callback) { + std::unique_ptr<util::Image> image(new util::Image(data)); + if (!(*image)) { + callback(TileParseResult("error parsing raster image")); + } + + if (!bucket->setImage(std::move(image))) { + callback(TileParseResult("error setting raster image to bucket")); + } + + callback(TileParseResult(TileData::State::parsed)); } void parseVectorTile(TileWorker* worker, std::string data, std::function<void (TileParseResult)> callback) { @@ -56,7 +65,7 @@ Worker::Worker(std::size_t count) { Worker::~Worker() = default; -std::unique_ptr<WorkRequest> Worker::parseRasterTile(RasterBucket& bucket, std::string data, std::function<void (bool)> callback) { +std::unique_ptr<WorkRequest> Worker::parseRasterTile(RasterBucket& bucket, std::string data, std::function<void (TileParseResult)> callback) { current = (current + 1) % threads.size(); return threads[current]->invokeWithCallback(&Worker::Impl::parseRasterTile, callback, &bucket, data); } diff --git a/src/mbgl/util/worker.hpp b/src/mbgl/util/worker.hpp index 1c302d5850..08fd56497f 100644 --- a/src/mbgl/util/worker.hpp +++ b/src/mbgl/util/worker.hpp @@ -34,7 +34,7 @@ public: Request parseRasterTile( RasterBucket&, std::string data, - std::function<void (bool)> callback); + std::function<void (TileParseResult)> callback); Request parseVectorTile( TileWorker&, |