summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-05-08 12:02:16 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2020-05-26 20:35:04 +0300
commita6ea8d01cbfd48ba823d2e80442f741f7fcec328 (patch)
tree9f90e8fed1073549685814154cf1f882cefe15aa
parent6dc4e6029bda7155edf5d23363ba0a0ab1aa42f3 (diff)
downloadqtlocation-mapboxgl-a6ea8d01cbfd48ba823d2e80442f741f7fcec328.tar.gz
[core] Introduce TilesetSource
-rw-r--r--CMakeLists.txt2
-rw-r--r--include/mbgl/style/source.hpp3
-rw-r--r--include/mbgl/style/sources/raster_source.hpp11
-rw-r--r--include/mbgl/style/sources/tileset_source.hpp27
-rw-r--r--include/mbgl/style/sources/vector_source.hpp11
-rw-r--r--src/mbgl/style/source.cpp42
-rw-r--r--src/mbgl/style/sources/raster_source.cpp33
-rw-r--r--src/mbgl/style/sources/tileset_source.cpp77
-rw-r--r--src/mbgl/style/sources/vector_source.cpp32
9 files changed, 113 insertions, 125 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fde902980d..afa82b0b75 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -257,6 +257,7 @@ add_library(
${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/image_source.hpp
${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_dem_source.hpp
${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_source.hpp
+ ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/tileset_source.hpp
${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/vector_source.hpp
${PROJECT_SOURCE_DIR}/include/mbgl/style/style.hpp
${PROJECT_SOURCE_DIR}/include/mbgl/style/style_property.hpp
@@ -714,6 +715,7 @@ add_library(
${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source.cpp
${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source_impl.cpp
${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source_impl.hpp
+ ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/tileset_source.cpp
${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source.cpp
${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source_impl.cpp
${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source_impl.hpp
diff --git a/include/mbgl/style/source.hpp b/include/mbgl/style/source.hpp
index cfb8e1f0dd..3d5b0b1cbb 100644
--- a/include/mbgl/style/source.hpp
+++ b/include/mbgl/style/source.hpp
@@ -175,9 +175,6 @@ public:
protected:
explicit Source(Immutable<Impl>);
- void serializeUrlOrTileSet(Value&, const variant<std::string, Tileset>&) const;
- void serializeTileSet(Value&, const mbgl::Tileset&) const;
-
virtual Mutable<Impl> createMutable() const noexcept = 0;
virtual optional<conversion::Error> setPropertyInternal(const std::string& name,
const conversion::Convertible& value);
diff --git a/include/mbgl/style/sources/raster_source.hpp b/include/mbgl/style/sources/raster_source.hpp
index 013c15a74c..d6715a69ce 100644
--- a/include/mbgl/style/sources/raster_source.hpp
+++ b/include/mbgl/style/sources/raster_source.hpp
@@ -1,6 +1,6 @@
#pragma once
-#include <mbgl/style/source.hpp>
+#include <mbgl/style/sources/tileset_source.hpp>
#include <mbgl/util/tileset.hpp>
#include <mbgl/util/variant.hpp>
@@ -10,15 +10,11 @@ class AsyncRequest;
namespace style {
-class RasterSource : public Source {
+class RasterSource : public TilesetSource {
public:
RasterSource(std::string id, variant<std::string, Tileset> urlOrTileset, uint16_t tileSize);
~RasterSource() override;
- const Tileset* getTileset() const final;
- optional<Resource> getResource() const final;
- optional<std::string> getURL() const;
-
class Impl;
const Impl& impl() const;
@@ -30,8 +26,6 @@ public:
return weakFactory.makeWeakPtr();
}
- Value serialize() const override;
-
protected:
RasterSource(Immutable<Impl>, variant<std::string, Tileset> urlOrTileset_);
@@ -39,7 +33,6 @@ protected:
virtual Mutable<Source::Impl> createMutable(Tileset tileset) const noexcept;
private:
- const variant<std::string, Tileset> urlOrTileset;
std::unique_ptr<AsyncRequest> req;
mapbox::base::WeakPtrFactory<Source> weakFactory {this};
};
diff --git a/include/mbgl/style/sources/tileset_source.hpp b/include/mbgl/style/sources/tileset_source.hpp
new file mode 100644
index 0000000000..73e2b733ad
--- /dev/null
+++ b/include/mbgl/style/sources/tileset_source.hpp
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <mbgl/style/source.hpp>
+#include <mbgl/util/tileset.hpp>
+#include <mbgl/util/variant.hpp>
+
+namespace mbgl {
+
+namespace style {
+
+class TilesetSource : public Source {
+public:
+ ~TilesetSource() override;
+
+ const Tileset* getTileset() const final;
+ optional<Resource> getResource() const final;
+ optional<std::string> getURL() const;
+
+ Value serialize() const override;
+
+protected:
+ TilesetSource(Immutable<Impl>, variant<std::string, Tileset> urlOrTileset);
+ const variant<std::string, Tileset> urlOrTileset;
+};
+
+} // namespace style
+} // namespace mbgl
diff --git a/include/mbgl/style/sources/vector_source.hpp b/include/mbgl/style/sources/vector_source.hpp
index ff87084e19..c4e64cf777 100644
--- a/include/mbgl/style/sources/vector_source.hpp
+++ b/include/mbgl/style/sources/vector_source.hpp
@@ -1,6 +1,6 @@
#pragma once
-#include <mbgl/style/source.hpp>
+#include <mbgl/style/sources/tileset_source.hpp>
#include <mbgl/util/tileset.hpp>
#include <mbgl/util/variant.hpp>
@@ -10,16 +10,12 @@ class AsyncRequest;
namespace style {
-class VectorSource final : public Source {
+class VectorSource final : public TilesetSource {
public:
VectorSource(std::string id, variant<std::string, Tileset> urlOrTileset, optional<float> maxZoom = nullopt,
optional<float> minZoom = nullopt);
~VectorSource() final;
- const Tileset* getTileset() const final;
- optional<Resource> getResource() const final;
- optional<std::string> getURL() const;
-
class Impl;
const Impl& impl() const;
@@ -31,13 +27,10 @@ public:
return weakFactory.makeWeakPtr();
}
- Value serialize() const override;
-
protected:
Mutable<Source::Impl> createMutable() const noexcept final;
private:
- const variant<std::string, Tileset> urlOrTileset;
std::unique_ptr<AsyncRequest> req;
optional<float> maxZoom;
optional<float> minZoom;
diff --git a/src/mbgl/style/source.cpp b/src/mbgl/style/source.cpp
index 37eff9b121..9366117fc6 100644
--- a/src/mbgl/style/source.cpp
+++ b/src/mbgl/style/source.cpp
@@ -141,48 +141,6 @@ Value Source::serialize() const {
return result;
}
-std::string tilesetSchemeToString(mbgl::Tileset::Scheme scheme) {
- switch (scheme) {
- case mbgl::Tileset::Scheme::XYZ:
- return "xyz";
- case mbgl::Tileset::Scheme::TMS:
- return "tms";
- }
-
- return "xyz";
-}
-
-void Source::serializeTileSet(Value& value, const mbgl::Tileset& tileset) const {
- assert(value.getObject());
- const auto json = value.getObject();
- std::vector<mapbox::base::Value> tiles;
- tiles.reserve(tileset.tiles.size());
- for (const auto& tile : tileset.tiles) tiles.emplace_back(tile);
-
- json->insert({"tiles", std::move(tiles)});
- json->insert({"minzoom", tileset.zoomRange.min});
- json->insert({"maxzoom", tileset.zoomRange.max});
- json->insert({"scheme", tilesetSchemeToString(tileset.scheme)});
-
- if (tileset.bounds.has_value()) {
- json->insert({"bounds",
- std::vector<mapbox::base::Value>{tileset.bounds->southwest().longitude(),
- tileset.bounds->southwest().latitude(),
- tileset.bounds->northeast().longitude(),
- tileset.bounds->northeast().latitude()}});
- }
-}
-
-void Source::serializeUrlOrTileSet(Value& value, const mbgl::variant<std::string, mbgl::Tileset>& urlOrTileSet) const {
- assert(value.getObject());
-
- urlOrTileSet.match(
- [&](const std::string& url) {
- value.getObject()->insert({"url", url});
- },
- [&](const mbgl::Tileset& tileset) { serializeTileSet(value, tileset); });
-}
-
uint16_t Source::getTileSize() const {
return baseImpl->getTileSize();
}
diff --git a/src/mbgl/style/sources/raster_source.cpp b/src/mbgl/style/sources/raster_source.cpp
index 8ee442a200..255ef82186 100644
--- a/src/mbgl/style/sources/raster_source.cpp
+++ b/src/mbgl/style/sources/raster_source.cpp
@@ -14,10 +14,10 @@ namespace mbgl {
namespace style {
RasterSource::RasterSource(std::string id, variant<std::string, Tileset> urlOrTileset_, uint16_t tileSize)
- : Source(makeMutable<Impl>(std::move(id), tileSize)), urlOrTileset(std::move(urlOrTileset_)) {}
+ : TilesetSource(makeMutable<Impl>(std::move(id), tileSize), std::move(urlOrTileset_)) {}
RasterSource::RasterSource(Immutable<Impl> impl, variant<std::string, Tileset> urlOrTileset_)
- : Source(std::move(impl)), urlOrTileset(std::move(urlOrTileset_)) {}
+ : TilesetSource(std::move(impl), std::move(urlOrTileset_)) {}
RasterSource::~RasterSource() = default;
@@ -25,29 +25,6 @@ const RasterSource::Impl& RasterSource::impl() const {
return static_cast<const Impl&>(*baseImpl);
}
-const Tileset* RasterSource::getTileset() const {
- if (urlOrTileset.is<Tileset>()) {
- return &urlOrTileset.get<Tileset>();
- }
- return nullptr;
-}
-
-optional<std::string> RasterSource::getURL() const {
- if (urlOrTileset.is<Tileset>()) {
- return nullopt;
- }
-
- return urlOrTileset.get<std::string>();
-}
-
-optional<Resource> RasterSource::getResource() const {
- if (urlOrTileset.is<std::string>()) {
- return Resource::source(urlOrTileset.get<std::string>());
- }
-
- return nullopt;
-}
-
void RasterSource::loadDescription(FileSource& fileSource) {
if (urlOrTileset.is<Tileset>()) {
baseImpl = createMutable(urlOrTileset.get<Tileset>());
@@ -103,11 +80,5 @@ Mutable<Source::Impl> RasterSource::createMutable(Tileset tileset) const noexcep
return staticMutableCast<Source::Impl>(makeMutable<Impl>(impl(), std::move(tileset)));
}
-Value RasterSource::serialize() const {
- auto value = Source::serialize();
- serializeUrlOrTileSet(value, urlOrTileset);
- return value;
-}
-
} // namespace style
} // namespace mbgl
diff --git a/src/mbgl/style/sources/tileset_source.cpp b/src/mbgl/style/sources/tileset_source.cpp
new file mode 100644
index 0000000000..7de970969f
--- /dev/null
+++ b/src/mbgl/style/sources/tileset_source.cpp
@@ -0,0 +1,77 @@
+#include <mbgl/style/sources/tileset_source.hpp>
+
+#include <mbgl/style/conversion/tileset.hpp>
+#include <mbgl/style/conversion_impl.hpp>
+#include <mbgl/tile/tile.hpp>
+#include <mbgl/util/constants.hpp>
+#include <mbgl/util/enum.hpp>
+
+namespace mbgl {
+
+using TilesetScheme = Tileset::Scheme;
+MBGL_DEFINE_ENUM(TilesetScheme, {{TilesetScheme::XYZ, "xyz"}, {TilesetScheme::TMS, "tms"}});
+
+namespace style {
+
+TilesetSource::TilesetSource(Immutable<Impl> impl_, variant<std::string, Tileset> urlOrTileset_)
+ : Source(std::move(impl_)), urlOrTileset(std::move(urlOrTileset_)) {}
+
+TilesetSource::~TilesetSource() = default;
+
+const Tileset* TilesetSource::getTileset() const {
+ if (urlOrTileset.is<Tileset>()) {
+ return &urlOrTileset.get<Tileset>();
+ }
+ return nullptr;
+}
+
+optional<std::string> TilesetSource::getURL() const {
+ if (urlOrTileset.is<Tileset>()) return nullopt;
+ return urlOrTileset.get<std::string>();
+}
+
+optional<Resource> TilesetSource::getResource() const {
+ if (urlOrTileset.is<std::string>()) {
+ return Resource::source(urlOrTileset.get<std::string>());
+ }
+ return nullopt;
+}
+
+namespace {
+
+void serializeTileSet(Value& value, const mbgl::Tileset& tileset) {
+ assert(value.getObject());
+ PropertyMap* properties = value.getObject();
+ std::vector<mapbox::base::Value> tiles;
+ tiles.reserve(tileset.tiles.size());
+ for (const auto& tile : tileset.tiles) tiles.emplace_back(tile);
+
+ properties->insert({"tiles", std::move(tiles)});
+ properties->insert({"minzoom", tileset.zoomRange.min});
+ properties->insert({"maxzoom", tileset.zoomRange.max});
+ properties->insert({"scheme", conversion::makeValue(tileset.scheme)});
+
+ if (tileset.bounds.has_value()) {
+ properties->insert({"bounds",
+ std::vector<mapbox::base::Value>{tileset.bounds->southwest().longitude(),
+ tileset.bounds->southwest().latitude(),
+ tileset.bounds->northeast().longitude(),
+ tileset.bounds->northeast().latitude()}});
+ }
+}
+
+} // namespace
+
+Value TilesetSource::serialize() const {
+ auto result = Source::serialize();
+ assert(result.getObject());
+ urlOrTileset.match(
+ [&](const std::string& url) {
+ result.getObject()->insert({"url", url});
+ },
+ [&](const mbgl::Tileset& tileset) { serializeTileSet(result, tileset); });
+ return result;
+}
+
+} // namespace style
+} // namespace mbgl
diff --git a/src/mbgl/style/sources/vector_source.cpp b/src/mbgl/style/sources/vector_source.cpp
index 39f6fde76c..853d993863 100644
--- a/src/mbgl/style/sources/vector_source.cpp
+++ b/src/mbgl/style/sources/vector_source.cpp
@@ -19,8 +19,7 @@ VectorSource::VectorSource(std::string id,
variant<std::string, Tileset> urlOrTileset_,
optional<float> maxZoom_,
optional<float> minZoom_)
- : Source(makeMutable<Impl>(std::move(id))),
- urlOrTileset(std::move(urlOrTileset_)),
+ : TilesetSource(makeMutable<Impl>(std::move(id)), std::move(urlOrTileset_)),
maxZoom(std::move(maxZoom_)),
minZoom(std::move(minZoom_)) {}
@@ -30,29 +29,6 @@ const VectorSource::Impl& VectorSource::impl() const {
return static_cast<const Impl&>(*baseImpl);
}
-const Tileset* VectorSource::getTileset() const {
- if (urlOrTileset.is<Tileset>()) {
- return &urlOrTileset.get<Tileset>();
- }
- return nullptr;
-}
-
-optional<std::string> VectorSource::getURL() const {
- if (urlOrTileset.is<Tileset>()) {
- return {};
- }
-
- return urlOrTileset.get<std::string>();
-}
-
-optional<Resource> VectorSource::getResource() const {
- if (urlOrTileset.is<std::string>()) {
- return Resource::source(urlOrTileset.get<std::string>());
- }
-
- return nullopt;
-}
-
void VectorSource::loadDescription(FileSource& fileSource) {
if (urlOrTileset.is<Tileset>()) {
baseImpl = makeMutable<Impl>(impl(), urlOrTileset.get<Tileset>());
@@ -109,11 +85,5 @@ Mutable<Source::Impl> VectorSource::createMutable() const noexcept {
return staticMutableCast<Source::Impl>(makeMutable<Impl>(impl()));
}
-Value VectorSource::serialize() const {
- auto result = Source::serialize();
- serializeUrlOrTileSet(result, urlOrTileset);
- return result;
-}
-
} // namespace style
} // namespace mbgl