diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-02-25 10:19:56 +0200 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-02-25 18:36:07 +0200 |
commit | d9d00c394d4a883ea2fb6d997280f0f7e90bfc44 (patch) | |
tree | abb6c5deb5309df1366ad9b0e394244f2e57b57a | |
parent | 75f861fe4701e82081566c76c949bada75169be7 (diff) | |
download | qtlocation-mapboxgl-d9d00c394d4a883ea2fb6d997280f0f7e90bfc44.tar.gz |
[core] Add layer serialization method
-rw-r--r-- | include/mbgl/style/filter.hpp | 2 | ||||
-rw-r--r-- | include/mbgl/style/layer.hpp | 3 | ||||
-rw-r--r-- | include/mbgl/style/layers/layer.hpp.ejs | 1 | ||||
-rw-r--r-- | src/mbgl/style/layer.cpp | 53 | ||||
-rw-r--r-- | src/mbgl/style/layers/layer.cpp.ejs | 69 |
5 files changed, 106 insertions, 22 deletions
diff --git a/include/mbgl/style/filter.hpp b/include/mbgl/style/filter.hpp index c9dc9fb1ec..e0623a20d4 100644 --- a/include/mbgl/style/filter.hpp +++ b/include/mbgl/style/filter.hpp @@ -28,6 +28,8 @@ public: bool operator()(const expression::EvaluationContext& context) const; + operator bool() const { return expression || legacyFilter; } + friend bool operator==(const Filter& lhs, const Filter& rhs) { if (!lhs.expression || !rhs.expression) { return lhs.expression == rhs.expression; diff --git a/include/mbgl/style/layer.hpp b/include/mbgl/style/layer.hpp index c80312bc23..c858541e01 100644 --- a/include/mbgl/style/layer.hpp +++ b/include/mbgl/style/layer.hpp @@ -114,6 +114,7 @@ public: optional<conversion::Error> setVisibility(const conversion::Convertible& value); virtual StyleProperty getProperty(const std::string&) const = 0; + virtual Value serialize() const; // Private implementation // TODO : We should not have public mutable data members. @@ -140,6 +141,8 @@ public: protected: virtual Mutable<Impl> mutableBaseImpl() const = 0; + void serializeProperty( + Value&, const StyleProperty&, const char* propertyName, uint8_t propertyId, uint8_t paintPropertyCount) const; LayerObserver* observer; mapbox::base::WeakPtrFactory<Layer> weakFactory {this}; diff --git a/include/mbgl/style/layers/layer.hpp.ejs b/include/mbgl/style/layers/layer.hpp.ejs index 3709f53bee..aecbe25601 100644 --- a/include/mbgl/style/layers/layer.hpp.ejs +++ b/include/mbgl/style/layers/layer.hpp.ejs @@ -40,6 +40,7 @@ public: optional<conversion::Error> setProperty(const std::string& name, const conversion::Convertible& value) final; StyleProperty getProperty(const std::string& name) const final; + Value serialize() const final; <% if (layoutProperties.length) { -%> // Layout properties diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp index 04a897022c..203a5f5c97 100644 --- a/src/mbgl/style/layer.cpp +++ b/src/mbgl/style/layer.cpp @@ -91,6 +91,59 @@ void Layer::setMaxZoom(float maxZoom) { observer->onLayerChanged(*this); } +Value Layer::serialize() const { + mapbox::base::ValueObject result; + result.emplace("id", getID()); + + auto source = getSourceID(); + if (!source.empty()) { + result.emplace("source", std::move(source)); + } + + if (!std::string(Layer::getTypeInfo()->type).empty()) { + result.emplace("type", getID()); + } + + auto sourceLayer = getSourceLayer(); + if (!sourceLayer.empty()) { + result.emplace("source-layer", std::move(sourceLayer)); + } + + if (getFilter()) { + result.emplace("filter", getFilter().serialize()); + } + + if (getMinZoom() != -std::numeric_limits<float>::infinity()) { + result.emplace("minzoom", getMinZoom()); + } + + if (getMaxZoom() != std::numeric_limits<float>::infinity()) { + result.emplace("maxzoom", getMaxZoom()); + } + + if (getVisibility() == VisibilityType::None) { + result["layout"] = mapbox::base::ValueObject{{"visibility", "none"}}; + } + + return result; +} + +void Layer::serializeProperty(Value& out, + const StyleProperty& property, + const char* propertyName, + uint8_t propertyId, + uint8_t paintPropertyCount) const { + assert(out.getObject()); + auto& object = *(out.getObject()); + std::string propertyType = propertyId < paintPropertyCount ? "paint" : "layout"; + if (object.count(propertyType)) { + assert(object[propertyType].getObject()); + object[propertyType].getObject()->emplace(propertyName, property.getValue()); + } else { + object[propertyType] = mapbox::base::ValueObject{{propertyName, property.getValue()}}; + } +} + void Layer::setObserver(LayerObserver* observer_) { observer = observer_ ? observer_ : &nullObserver; } diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs index e74e7ab345..47a1739cc7 100644 --- a/src/mbgl/style/layers/layer.cpp.ejs +++ b/src/mbgl/style/layers/layer.cpp.ejs @@ -200,6 +200,8 @@ using namespace conversion; namespace { +constexpr uint8_t PaintPropertyCount = <%- paintProperties.length * 2 -%>u; + enum class Property : uint8_t { <% for (const property of paintProperties) { -%> <%- camelize(property.name) %>, @@ -207,8 +209,12 @@ enum class Property : uint8_t { <% for (const property of paintProperties) { -%> <%- camelize(property.name) %>Transition, <% } -%> -<% for (const property of layoutProperties) { -%> - <%- camelize(property.name) %>, +<% for (let i = 0; i < layoutProperties.length; ++i) { -%> +<% if (i===0) { -%> + <%- camelize(layoutProperties[i].name) %> = PaintPropertyCount, +<% } else { -%> + <%- camelize(layoutProperties[i].name) %>, +<% } -%> <% } -%> }; @@ -225,8 +231,46 @@ MAPBOX_ETERNAL_CONSTEXPR const auto layerProperties = mapbox::eternal::hash_map< <%- paintProperties.map(p => `{"${p.name}-transition", toUint8(Property::${camelize(p.name)}Transition)}`).join(',\n ') %>, <%- layoutProperties.map(p => `{"${p.name}", toUint8(Property::${camelize(p.name)})}`).join(',\n ') %>}); <% } -%> + +StyleProperty getLayerProperty(const <%- camelize(type) %>Layer& layer, Property property) { + switch (property) { +<% for (const property of paintProperties) { -%> + case Property::<%- camelize(property.name) %>: + return makeStyleProperty(layer.get<%- camelize(property.name) %>()); +<% } -%> +<% for (const property of paintProperties) { -%> + case Property::<%- camelize(property.name) %>Transition: + return makeStyleProperty(layer.get<%- camelize(property.name) %>Transition()); +<% } -%> +<% for (const property of layoutProperties) { -%> + case Property::<%- camelize(property.name) %>: + return makeStyleProperty(layer.get<%- camelize(property.name) %>()); +<% } -%> + } + return {}; +} + +StyleProperty getLayerProperty(const <%- camelize(type) -%>Layer& layer, const std::string& name) { + const auto it = layerProperties.find(name.c_str()); + if (it == layerProperties.end()) { + return {}; + } + return getLayerProperty(layer, static_cast<Property>(it->second)); +} + } // namespace +Value <%- camelize(type) %>Layer::serialize() const { + auto result = Layer::serialize(); + assert(result.getObject()); + for (const auto& property : layerProperties) { + auto styleProperty = getLayerProperty(*this, static_cast<Property>(property.second)); + if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); + } + return result; +} + optional<Error> <%- camelize(type) %>Layer::setProperty(const std::string& name, const Convertible& value) { const auto it = layerProperties.find(name.c_str()); if (it == layerProperties.end()) { @@ -289,26 +333,7 @@ optional<Error> <%- camelize(type) %>Layer::setProperty(const std::string& name, } StyleProperty <%- camelize(type) %>Layer::getProperty(const std::string& name) const { - const auto it = layerProperties.find(name.c_str()); - if (it == layerProperties.end()) { - return {}; - } - - switch (static_cast<Property>(it->second)) { -<% for (const property of paintProperties) { -%> - case Property::<%- camelize(property.name) %>: - return makeStyleProperty(get<%- camelize(property.name) %>()); -<% } -%> -<% for (const property of paintProperties) { -%> - case Property::<%- camelize(property.name) %>Transition: - return makeStyleProperty(get<%- camelize(property.name) %>Transition()); -<% } -%> -<% for (const property of layoutProperties) { -%> - case Property::<%- camelize(property.name) %>: - return makeStyleProperty(get<%- camelize(property.name) %>()); -<% } -%> - } - return {}; + return getLayerProperty(*this, name); } Mutable<Layer::Impl> <%- camelize(type) %>Layer::mutableBaseImpl() const { |