[core] Add a method for statically evaluating font stacks used by a style

This commit is contained in:
John Firebaugh
2016-02-01 16:01:15 -08:00
parent 7d6c6c00ca
commit f3d4107d19
5 changed files with 74 additions and 0 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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&);

View 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"]]]
}
}
}]
}

View File

@@ -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]);
}