summaryrefslogtreecommitdiff
path: root/src/mbgl/tile/raster_tile_data.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/tile/raster_tile_data.cpp')
-rw-r--r--src/mbgl/tile/raster_tile_data.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/mbgl/tile/raster_tile_data.cpp b/src/mbgl/tile/raster_tile_data.cpp
new file mode 100644
index 0000000000..3f26bbdfdd
--- /dev/null
+++ b/src/mbgl/tile/raster_tile_data.cpp
@@ -0,0 +1,83 @@
+#include <mbgl/tile/raster_tile_data.hpp>
+#include <mbgl/source/source.hpp>
+#include <mbgl/storage/resource.hpp>
+#include <mbgl/storage/response.hpp>
+#include <mbgl/storage/file_source.hpp>
+#include <mbgl/util/worker.hpp>
+#include <mbgl/util/work_request.hpp>
+
+using namespace mbgl;
+
+RasterTileData::RasterTileData(const TileID& id_,
+ float pixelRatio,
+ const std::string& urlTemplate,
+ gl::TexturePool &texturePool_,
+ Worker& worker_,
+ FileSource& fileSource,
+ const std::function<void(std::exception_ptr)>& callback)
+ : TileData(id_),
+ texturePool(texturePool_),
+ worker(worker_) {
+ state = State::loading;
+
+ const Resource resource = Resource::tile(urlTemplate, pixelRatio, id.x, id.y, id.sourceZ);
+ req = fileSource.request(resource, [callback, this](Response res) {
+ if (res.error) {
+ callback(std::make_exception_ptr(std::runtime_error(res.error->message)));
+ } else if (res.notModified) {
+ modified = res.modified;
+ expires = res.expires;
+ } else if (res.noContent) {
+ state = State::parsed;
+ modified = res.modified;
+ expires = res.expires;
+ workRequest.reset();
+ bucket.reset();
+ callback(nullptr);
+ } else {
+ modified = res.modified;
+ expires = res.expires;
+
+ // Only overwrite the state when we didn't have a previous tile.
+ if (state == State::loading) {
+ state = State::loaded;
+ }
+
+ workRequest.reset();
+ workRequest = worker.parseRasterTile(std::make_unique<RasterBucket>(texturePool), res.data, [this, callback] (RasterTileParseResult result) {
+ workRequest.reset();
+ if (state != State::loaded) {
+ return;
+ }
+
+ std::exception_ptr error;
+ if (result.is<std::unique_ptr<Bucket>>()) {
+ state = State::parsed;
+ bucket = std::move(result.get<std::unique_ptr<Bucket>>());
+ } else {
+ error = result.get<std::exception_ptr>();
+ state = State::obsolete;
+ bucket.reset();
+ }
+
+ callback(error);
+ });
+ }
+ });
+}
+
+RasterTileData::~RasterTileData() {
+ cancel();
+}
+
+Bucket* RasterTileData::getBucket(StyleLayer const&) {
+ return bucket.get();
+}
+
+void RasterTileData::cancel() {
+ if (state != State::obsolete) {
+ state = State::obsolete;
+ }
+ req = nullptr;
+ workRequest.reset();
+}