diff --git a/src/mbgl/map/raster_tile_data.cpp b/src/mbgl/map/raster_tile_data.cpp index b0fa4d171..a8a1ab03d 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 = result.get(); } else { - state = State::invalid; + std::stringstream message; + message << "Failed to parse [" << std::string(id) << "]: " << result.get(); + error = message.str(); + state = State::obsolete; } callback(); diff --git a/src/mbgl/map/tile_data.hpp b/src/mbgl/map/tile_data.hpp index 476172ce5..e78d88841 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 c8a42f46a..70cc1065d 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 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 70434b7d6..3c8730e61 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 image); const StyleLayoutRaster &layout; diff --git a/src/mbgl/util/raster.cpp b/src/mbgl/util/raster.cpp index b6b5df27f..9b8254089 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(data); +bool Raster::load(std::unique_ptr 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 1789ae87f..39ab26ffc 100644 --- a/src/mbgl/util/raster.hpp +++ b/src/mbgl/util/raster.hpp @@ -6,7 +6,6 @@ #include #include -#include #include 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 image); // bind current texture void bind(bool linear = false); diff --git a/src/mbgl/util/worker.cpp b/src/mbgl/util/worker.cpp index cc9fa1566..9277daccc 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 callback) { - callback(bucket->setImage(data)); + void parseRasterTile(RasterBucket* bucket, std::string data, std::function callback) { + std::unique_ptr 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 callback) { @@ -56,7 +65,7 @@ Worker::Worker(std::size_t count) { Worker::~Worker() = default; -std::unique_ptr Worker::parseRasterTile(RasterBucket& bucket, std::string data, std::function callback) { +std::unique_ptr Worker::parseRasterTile(RasterBucket& bucket, std::string data, std::function 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 1c302d585..08fd56497 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 callback); + std::function callback); Request parseVectorTile( TileWorker&,