diff --git a/include/mbgl/style/layer.hpp b/include/mbgl/style/layer.hpp index 8f7c9d5d6a1..57bd0bf32dc 100644 --- a/include/mbgl/style/layer.hpp +++ b/include/mbgl/style/layer.hpp @@ -141,6 +141,7 @@ class Layer { protected: virtual Mutable mutableBaseImpl() const = 0; + void serializeProperty(Value&, const StyleProperty&, const char* propertyName, uint8_t propertyId, uint8_t paintPropertyCount) const; LayerObserver* observer; mapbox::base::WeakPtrFactory weakFactory {this}; diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp index ade35011bb0..345af12a2ed 100644 --- a/src/mbgl/style/layer.cpp +++ b/src/mbgl/style/layer.cpp @@ -121,9 +121,25 @@ Value Layer::serialize() const { 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/background_layer.cpp b/src/mbgl/style/layers/background_layer.cpp index b1ddb0381ce..941b975452e 100644 --- a/src/mbgl/style/layers/background_layer.cpp +++ b/src/mbgl/style/layers/background_layer.cpp @@ -202,30 +202,11 @@ StyleProperty getLayerProperty(const BackgroundLayer& layer, const std::string& Value BackgroundLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/circle_layer.cpp b/src/mbgl/style/layers/circle_layer.cpp index b0358f5bad8..a029b93e7ba 100644 --- a/src/mbgl/style/layers/circle_layer.cpp +++ b/src/mbgl/style/layers/circle_layer.cpp @@ -482,30 +482,11 @@ StyleProperty getLayerProperty(const CircleLayer& layer, const std::string& name Value CircleLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/fill_extrusion_layer.cpp b/src/mbgl/style/layers/fill_extrusion_layer.cpp index ddf7c618b0a..6caac6a87ed 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer.cpp +++ b/src/mbgl/style/layers/fill_extrusion_layer.cpp @@ -377,30 +377,11 @@ StyleProperty getLayerProperty(const FillExtrusionLayer& layer, const std::strin Value FillExtrusionLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/fill_layer.cpp b/src/mbgl/style/layers/fill_layer.cpp index 8cc5500e4db..6db2b25a79b 100644 --- a/src/mbgl/style/layers/fill_layer.cpp +++ b/src/mbgl/style/layers/fill_layer.cpp @@ -362,30 +362,11 @@ StyleProperty getLayerProperty(const FillLayer& layer, const std::string& name) Value FillLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/heatmap_layer.cpp b/src/mbgl/style/layers/heatmap_layer.cpp index 7f0a02ef046..baa1bd606cf 100644 --- a/src/mbgl/style/layers/heatmap_layer.cpp +++ b/src/mbgl/style/layers/heatmap_layer.cpp @@ -274,30 +274,11 @@ StyleProperty getLayerProperty(const HeatmapLayer& layer, const std::string& nam Value HeatmapLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/hillshade_layer.cpp b/src/mbgl/style/layers/hillshade_layer.cpp index 3353c0c199c..5a5ab9fb231 100644 --- a/src/mbgl/style/layers/hillshade_layer.cpp +++ b/src/mbgl/style/layers/hillshade_layer.cpp @@ -307,30 +307,11 @@ StyleProperty getLayerProperty(const HillshadeLayer& layer, const std::string& n Value HillshadeLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs index 704dd5ed123..47a1739cc73 100644 --- a/src/mbgl/style/layers/layer.cpp.ejs +++ b/src/mbgl/style/layers/layer.cpp.ejs @@ -262,30 +262,11 @@ StyleProperty getLayerProperty(const <%- camelize(type) -%>Layer& layer, const s Value <%- camelize(type) %>Layer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/line_layer.cpp b/src/mbgl/style/layers/line_layer.cpp index 4c107dbbd9c..04ac30c56e5 100644 --- a/src/mbgl/style/layers/line_layer.cpp +++ b/src/mbgl/style/layers/line_layer.cpp @@ -579,30 +579,11 @@ StyleProperty getLayerProperty(const LineLayer& layer, const std::string& name) Value LineLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/raster_layer.cpp b/src/mbgl/style/layers/raster_layer.cpp index 5403151ff7a..54e824575ac 100644 --- a/src/mbgl/style/layers/raster_layer.cpp +++ b/src/mbgl/style/layers/raster_layer.cpp @@ -377,30 +377,11 @@ StyleProperty getLayerProperty(const RasterLayer& layer, const std::string& name Value RasterLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; } diff --git a/src/mbgl/style/layers/symbol_layer.cpp b/src/mbgl/style/layers/symbol_layer.cpp index 538b7a3fa16..70066839acc 100644 --- a/src/mbgl/style/layers/symbol_layer.cpp +++ b/src/mbgl/style/layers/symbol_layer.cpp @@ -1367,30 +1367,11 @@ StyleProperty getLayerProperty(const SymbolLayer& layer, const std::string& name Value SymbolLayer::serialize() const { auto result = Layer::serialize(); - auto* object = result.getObject(); - assert(object); - mapbox::base::ValueObject paintProperties; - mapbox::base::ValueObject layoutProperties; + assert(result.getObject()); for (const auto& property : layerProperties) { auto styleProperty = getLayerProperty(*this, static_cast(property.second)); if (styleProperty.getKind() == StyleProperty::Kind::Undefined) continue; - if (property.second < PaintPropertyCount) { - paintProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } else { - layoutProperties.emplace(property.first.c_str(), styleProperty.getValue()); - } - } - - if (getVisibility() == VisibilityType::None) { - layoutProperties.emplace("visibility", "none"); - } - - if (!paintProperties.empty()) { - object->emplace("paint", std::move(paintProperties)); - } - - if (!layoutProperties.empty()) { - object->emplace("layout", std::move(layoutProperties)); + serializeProperty(result, styleProperty, property.first.c_str(), property.second, PaintPropertyCount); } return result; }