[core] Add a method for statically evaluating font stacks used by a style
This commit is contained in:
@@ -27,6 +27,9 @@ public:
|
||||
|
||||
T evaluate(const StyleCalculationParameters&) const;
|
||||
|
||||
float getBase() const { return base; }
|
||||
const std::vector<std::pair<float, T>>& getStops() const { return stops; }
|
||||
|
||||
private:
|
||||
float base = 1;
|
||||
std::vector<std::pair<float, T>> stops;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <set>
|
||||
|
||||
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<std::string> StyleParser::fontStacks() const {
|
||||
std::set<std::string> result;
|
||||
|
||||
for (const auto& layer : layers) {
|
||||
if (layer->is<SymbolLayer>()) {
|
||||
LayoutProperty<std::string> property = layer->as<SymbolLayer>()->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<std::string>(result.begin(), result.end());
|
||||
}
|
||||
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -28,6 +28,9 @@ public:
|
||||
std::vector<std::unique_ptr<Source>> sources;
|
||||
std::vector<std::unique_ptr<StyleLayer>> layers;
|
||||
|
||||
// Statically evaluate layer properties to determine what font stacks are used.
|
||||
std::vector<std::string> fontStacks() const;
|
||||
|
||||
static std::unique_ptr<SourceInfo> parseTileJSON(const std::string& json, const std::string& sourceURL, SourceType);
|
||||
static std::unique_ptr<SourceInfo> parseTileJSON(const JSValue&);
|
||||
|
||||
|
||||
38
test/fixtures/style_parser/font_stacks.json
vendored
Normal file
38
test/fixtures/style_parser/font_stacks.json
vendored
Normal file
@@ -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"]]]
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user