diff --git a/src/mbgl/style/function.hpp b/src/mbgl/style/function.hpp index 4d2e4fcbd..160f5be39 100644 --- a/src/mbgl/style/function.hpp +++ b/src/mbgl/style/function.hpp @@ -27,6 +27,9 @@ public: T evaluate(const StyleCalculationParameters&) const; + float getBase() const { return base; } + const std::vector>& getStops() const { return stops; } + private: float base = 1; std::vector> stops; diff --git a/src/mbgl/style/style_parser.cpp b/src/mbgl/style/style_parser.cpp index 7d53d603e..e3470e45d 100644 --- a/src/mbgl/style/style_parser.cpp +++ b/src/mbgl/style/style_parser.cpp @@ -18,6 +18,7 @@ #include #include +#include namespace mbgl { @@ -484,4 +485,23 @@ void StyleParser::parseVisibility(StyleLayer& layer, const JSValue& value) { layer.visibility = VisibilityTypeClass({ value["visibility"].GetString(), value["visibility"].GetStringLength() }); } +std::vector StyleParser::fontStacks() const { + std::set result; + + for (const auto& layer : layers) { + if (layer->is()) { + LayoutProperty property = layer->as()->layout.text.font; + if (property.parsedValue) { + for (const auto& stop : property.parsedValue->getStops()) { + result.insert(stop.second); + } + } else { + result.insert(property.value); + } + } + } + + return std::vector(result.begin(), result.end()); +} + } // namespace mbgl diff --git a/src/mbgl/style/style_parser.hpp b/src/mbgl/style/style_parser.hpp index 69bd8a3bf..162a10c87 100644 --- a/src/mbgl/style/style_parser.hpp +++ b/src/mbgl/style/style_parser.hpp @@ -28,6 +28,9 @@ public: std::vector> sources; std::vector> layers; + // Statically evaluate layer properties to determine what font stacks are used. + std::vector fontStacks() const; + static std::unique_ptr parseTileJSON(const std::string& json, const std::string& sourceURL, SourceType); static std::unique_ptr parseTileJSON(const JSValue&); diff --git a/test/fixtures/style_parser/font_stacks.json b/test/fixtures/style_parser/font_stacks.json new file mode 100644 index 000000000..07fe223d4 --- /dev/null +++ b/test/fixtures/style_parser/font_stacks.json @@ -0,0 +1,38 @@ +{ + "version": 8, + "sources": { + "source": { + "type": "vector", + "tiles": [] + } + }, + "layers": [{ + "id": "a", + "type": "symbol", + "source": "source", + "source-layer": "source-layer", + "layout": { + "text-font": ["a"] + } + }, { + "id": "a,b", + "type": "symbol", + "source": "source", + "source-layer": "source-layer", + "layout": { + "text-font": { + "stops": [[0, ["a", "b"]]] + } + } + }, { + "id": "a,b;a,b,c", + "type": "symbol", + "source": "source", + "source-layer": "source-layer", + "layout": { + "text-font": { + "stops": [[0, ["a", "b"]], [1, ["a", "b", "c"]]] + } + } + }] +} diff --git a/test/style/style_parser.cpp b/test/style/style_parser.cpp index 22b5acb12..1554c76a2 100644 --- a/test/style/style_parser.cpp +++ b/test/style/style_parser.cpp @@ -113,3 +113,13 @@ TEST(StyleParser, ParseTileJSONVector) { EXPECT_EQ("attribution", result->attribution); EXPECT_EQ("http://a.tiles.mapbox.com/mapbox.streets/{z}-{x}-{y}.vector.pbf?access_token=key", result->tiles[0]); } + +TEST(StyleParser, FontStacks) { + StyleParser parser; + parser.parse(util::read_file("test/fixtures/style_parser/font_stacks.json")); + auto result = parser.fontStacks(); + ASSERT_EQ(3, result.size()); + ASSERT_EQ("a", result[0]); + ASSERT_EQ("a,b", result[1]); + ASSERT_EQ("a,b,c", result[2]); +}