summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/map/source.cpp87
-rw-r--r--src/mbgl/map/source.hpp30
-rw-r--r--src/mbgl/map/source_info.cpp119
-rw-r--r--src/mbgl/map/source_info.hpp38
4 files changed, 158 insertions, 116 deletions
diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp
index 16e2630a94..548c837add 100644
--- a/src/mbgl/map/source.cpp
+++ b/src/mbgl/map/source.cpp
@@ -33,93 +33,6 @@
namespace mbgl {
-void parse(const rapidjson::Value& value, std::vector<std::string>& target, const char *name) {
- if (!value.HasMember(name))
- return;
-
- const rapidjson::Value& property = value[name];
- if (!property.IsArray())
- return;
-
- for (rapidjson::SizeType i = 0; i < property.Size(); i++)
- if (!property[i].IsString())
- return;
-
- for (rapidjson::SizeType i = 0; i < property.Size(); i++)
- target.emplace_back(std::string(property[i].GetString(), property[i].GetStringLength()));
-}
-
-void parse(const rapidjson::Value& value, std::string& target, const char* name) {
- if (!value.HasMember(name))
- return;
-
- const rapidjson::Value& property = value[name];
- if (!property.IsString())
- return;
-
- target = { property.GetString(), property.GetStringLength() };
-}
-
-void parse(const rapidjson::Value& value, uint16_t& target, const char* name) {
- if (!value.HasMember(name))
- return;
-
- const rapidjson::Value& property = value[name];
- if (!property.IsUint())
- return;
-
- unsigned int uint = property.GetUint();
- if (uint > std::numeric_limits<uint16_t>::max())
- return;
-
- target = uint;
-}
-
-template <size_t N>
-void parse(const rapidjson::Value& value, std::array<float, N>& target, const char* name) {
- if (!value.HasMember(name))
- return;
-
- const rapidjson::Value& property = value[name];
- if (!property.IsArray() || property.Size() != N)
- return;
-
- for (rapidjson::SizeType i = 0; i < property.Size(); i++)
- if (!property[i].IsNumber())
- return;
-
- for (rapidjson::SizeType i = 0; i < property.Size(); i++)
- target[i] = property[i].GetDouble();
-}
-
-void SourceInfo::parseTileJSONProperties(const rapidjson::Value& value) {
- parse(value, tiles, "tiles");
- parse(value, min_zoom, "minzoom");
- parse(value, max_zoom, "maxzoom");
- parse(value, attribution, "attribution");
- parse(value, center, "center");
- parse(value, bounds, "bounds");
-}
-
-std::string SourceInfo::tileURL(const TileID& id, float pixelRatio) const {
- std::string result = tiles.at(0);
- result = util::mapbox::normalizeTileURL(result, url, type);
- result = util::replaceTokens(result, [&](const std::string &token) -> std::string {
- if (token == "z") return util::toString(std::min(id.z, static_cast<int8_t>(max_zoom)));
- if (token == "x") return util::toString(id.x);
- if (token == "y") return util::toString(id.y);
- if (token == "prefix") {
- std::string prefix { 2 };
- prefix[0] = "0123456789abcdef"[id.x % 16];
- prefix[1] = "0123456789abcdef"[id.y % 16];
- return prefix;
- }
- if (token == "ratio") return pixelRatio > 1.0 ? "@2x" : "";
- return "";
- });
- return result;
-}
-
Source::Source() {}
Source::~Source() = default;
diff --git a/src/mbgl/map/source.hpp b/src/mbgl/map/source.hpp
index 4d985091f5..dd94dc1fe2 100644
--- a/src/mbgl/map/source.hpp
+++ b/src/mbgl/map/source.hpp
@@ -1,24 +1,13 @@
#ifndef MBGL_MAP_SOURCE
#define MBGL_MAP_SOURCE
-#include <mbgl/map/tile_id.hpp>
-#include <mbgl/map/tile_data.hpp>
#include <mbgl/map/tile_cache.hpp>
-#include <mbgl/style/types.hpp>
+#include <mbgl/map/source_info.hpp>
-#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/mat4.hpp>
-#include <mbgl/util/ptr.hpp>
-#include <mbgl/util/chrono.hpp>
-#include <mbgl/util/constants.hpp>
-#include <rapidjson/document.h>
-
-#include <cstdint>
#include <forward_list>
-#include <iosfwd>
#include <map>
-#include <unordered_set>
namespace mbgl {
@@ -30,23 +19,6 @@ class Tile;
struct ClipID;
struct box;
-class SourceInfo : private util::noncopyable {
-public:
- SourceType type = SourceType::Vector;
- std::string url;
- std::vector<std::string> tiles;
- uint16_t tile_size = util::tileSize;
- uint16_t min_zoom = 0;
- uint16_t max_zoom = 22;
- std::string attribution;
- std::array<float, 3> center = {{0, 0, 0}};
- std::array<float, 4> bounds = {{-180, -90, 180, 90}};
- std::string source_id = "";
-
- void parseTileJSONProperties(const rapidjson::Value&);
- std::string tileURL(const TileID& id, float pixelRatio) const;
-};
-
class Source : private util::noncopyable {
public:
class Observer {
diff --git a/src/mbgl/map/source_info.cpp b/src/mbgl/map/source_info.cpp
new file mode 100644
index 0000000000..b8ab84b550
--- /dev/null
+++ b/src/mbgl/map/source_info.cpp
@@ -0,0 +1,119 @@
+#include <mbgl/map/source_info.hpp>
+#include <mbgl/util/mapbox.hpp>
+#include <mbgl/util/string.hpp>
+#include <mbgl/util/token.hpp>
+
+namespace mbgl {
+
+namespace {
+
+void parse(const rapidjson::Value& value, std::vector<std::string>& target, const char* name) {
+ if (!value.HasMember(name)) {
+ return;
+ }
+
+ const rapidjson::Value& property = value[name];
+ if (!property.IsArray()) {
+ return;
+ }
+
+ for (rapidjson::SizeType i = 0; i < property.Size(); i++) {
+ if (!property[i].IsString()) {
+ return;
+ }
+ }
+
+ for (rapidjson::SizeType i = 0; i < property.Size(); i++) {
+ target.emplace_back(std::string(property[i].GetString(), property[i].GetStringLength()));
+ }
+}
+
+void parse(const rapidjson::Value& value, std::string& target, const char* name) {
+ if (!value.HasMember(name)) {
+ return;
+ }
+
+ const rapidjson::Value& property = value[name];
+ if (!property.IsString()) {
+ return;
+ }
+
+ target = { property.GetString(), property.GetStringLength() };
+}
+
+void parse(const rapidjson::Value& value, uint16_t& target, const char* name) {
+ if (!value.HasMember(name)) {
+ return;
+ }
+
+ const rapidjson::Value& property = value[name];
+ if (!property.IsUint()) {
+ return;
+ }
+
+ unsigned int uint = property.GetUint();
+ if (uint > std::numeric_limits<uint16_t>::max()) {
+ return;
+ }
+
+ target = uint;
+}
+
+template <size_t N>
+void parse(const rapidjson::Value& value, std::array<float, N>& target, const char* name) {
+ if (!value.HasMember(name)) {
+ return;
+ }
+
+ const rapidjson::Value& property = value[name];
+ if (!property.IsArray() || property.Size() != N) {
+ return;
+ }
+
+ for (rapidjson::SizeType i = 0; i < property.Size(); i++) {
+ if (!property[i].IsNumber()) {
+ return;
+ }
+ }
+
+ for (rapidjson::SizeType i = 0; i < property.Size(); i++) {
+ target[i] = property[i].GetDouble();
+ }
+}
+
+} // end namespace
+
+void SourceInfo::parseTileJSONProperties(const rapidjson::Value& value) {
+ parse(value, tiles, "tiles");
+ parse(value, min_zoom, "minzoom");
+ parse(value, max_zoom, "maxzoom");
+ parse(value, attribution, "attribution");
+ parse(value, center, "center");
+ parse(value, bounds, "bounds");
+}
+
+std::string SourceInfo::tileURL(const TileID& id, float pixelRatio) const {
+ std::string result = tiles.at(0);
+ result = util::mapbox::normalizeTileURL(result, url, type);
+ result = util::replaceTokens(result, [&](const std::string& token) -> std::string {
+ if (token == "z") {
+ return util::toString(std::min(id.z, static_cast<int8_t>(max_zoom)));
+ } else if (token == "x") {
+ return util::toString(id.x);
+ } else if (token == "y") {
+ return util::toString(id.y);
+ } else if (token == "prefix") {
+ std::string prefix{ 2 };
+ prefix[0] = "0123456789abcdef"[id.x % 16];
+ prefix[1] = "0123456789abcdef"[id.y % 16];
+ return prefix;
+ } else if (token == "ratio") {
+ return pixelRatio > 1.0 ? "@2x" : "";
+ } else {
+ return "";
+ }
+ });
+ return result;
+}
+
+} // namespace mbgl
diff --git a/src/mbgl/map/source_info.hpp b/src/mbgl/map/source_info.hpp
new file mode 100644
index 0000000000..725e9f4249
--- /dev/null
+++ b/src/mbgl/map/source_info.hpp
@@ -0,0 +1,38 @@
+#ifndef MBGL_MAP_SOURCE_INFO
+#define MBGL_MAP_SOURCE_INFO
+
+#include <mbgl/style/types.hpp>
+#include <mbgl/map/tile_id.hpp>
+
+#include <mbgl/util/noncopyable.hpp>
+#include <mbgl/util/constants.hpp>
+
+#include <mapbox/variant.hpp>
+#include <rapidjson/document.h>
+
+#include <array>
+#include <vector>
+#include <cstdint>
+
+namespace mbgl {
+
+class SourceInfo : private util::noncopyable {
+public:
+ SourceType type = SourceType::Vector;
+ std::string url;
+ std::vector<std::string> tiles;
+ uint16_t tile_size = util::tileSize;
+ uint16_t min_zoom = 0;
+ uint16_t max_zoom = 22;
+ std::string attribution;
+ std::array<float, 3> center = { { 0, 0, 0 } };
+ std::array<float, 4> bounds = { { -180, -90, 180, 90 } };
+ std::string source_id = "";
+
+ void parseTileJSONProperties(const rapidjson::Value&);
+ std::string tileURL(const TileID& id, float pixelRatio) const;
+};
+
+} // namespace mbgl
+
+#endif // MBGL_MAP_SOURCE_INFO