diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2018-11-22 15:37:09 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2018-11-27 18:10:21 +0200 |
commit | 361982fef83a145769da5c04d1c19731df89921c (patch) | |
tree | e6212cb782cf9df83ecc3e32cb52beaebeb73ab8 /src/mbgl/style | |
parent | cca37e765bf9b853262783a6f7cc3d1a4c72957d (diff) | |
download | qtlocation-mapboxgl-361982fef83a145769da5c04d1c19731df89921c.tar.gz |
[core][Android][Darwin] LayerManager creates RenderLayer instances
`LayerManager` is now responsible for `RenderLayer` instances creation,
so that there is a single entry point for creating of objects, which
correspond to a certain layer type.
The `LayerType type` field is dropped from `Layer::Impl`.
Diffstat (limited to 'src/mbgl/style')
31 files changed, 279 insertions, 203 deletions
diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp index 56b825760b..abe6444701 100644 --- a/src/mbgl/style/layer.cpp +++ b/src/mbgl/style/layer.cpp @@ -5,6 +5,8 @@ #include <mbgl/style/conversion/filter.hpp> #include <mbgl/style/conversion_impl.hpp> +#include <mbgl/renderer/render_layer.hpp> + namespace mbgl { namespace style { @@ -17,10 +19,6 @@ Layer::Layer(Immutable<Impl> impl) Layer::~Layer() = default; -LayerType Layer::getType() const { - return baseImpl->type; -} - std::string Layer::getID() const { return baseImpl->id; } @@ -111,7 +109,9 @@ const LayerTypeInfo* Layer::getTypeInfo() const noexcept { return baseImpl->getTypeInfo(); } -optional<std::string> LayerFactory::getSource(const conversion::Convertible& value) const noexcept { +} // namespace style + +optional<std::string> LayerFactory::getSource(const style::conversion::Convertible& value) const noexcept { auto sourceValue = objectMember(value, "source"); if (!sourceValue) { return nullopt; @@ -125,7 +125,7 @@ optional<std::string> LayerFactory::getSource(const conversion::Convertible& val return source; } -bool LayerFactory::initSourceLayerAndFilter(Layer* layer, const conversion::Convertible& value) const noexcept { +bool LayerFactory::initSourceLayerAndFilter(style::Layer* layer, const style::conversion::Convertible& value) const noexcept { auto sourceLayerValue = objectMember(value, "source-layer"); if (sourceLayerValue) { optional<std::string> sourceLayer = toString(*sourceLayerValue); @@ -137,8 +137,8 @@ bool LayerFactory::initSourceLayerAndFilter(Layer* layer, const conversion::Conv auto filterValue = objectMember(value, "filter"); if (filterValue) { - conversion::Error error; - optional<Filter> filter = conversion::convert<Filter>(*filterValue, error); + style::conversion::Error error; + optional<style::Filter> filter = style::conversion::convert<style::Filter>(*filterValue, error); if (!filter) { return false; } @@ -148,5 +148,25 @@ bool LayerFactory::initSourceLayerAndFilter(Layer* layer, const conversion::Conv return true; } -} // namespace style +std::unique_ptr<style::Layer> LayerManager::createLayer( + const std::string& type, const std::string& id, + const style::conversion::Convertible& value, style::conversion::Error& error) noexcept { + if (LayerFactory* factory = getFactory(type)) { + auto layer = factory->createLayer(id, value); + if (!layer) { + error.message = "Error parsing a layer of type: " + type; + } + return layer; + } + error.message = "Unsupported layer type: " + type; + return nullptr; +} + +std::unique_ptr<RenderLayer> LayerManager::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + LayerFactory* factory = getFactory(impl->getTypeInfo()); + assert(factory); + return factory->createRenderLayer(std::move(impl)); +} + + } // namespace mbgl diff --git a/src/mbgl/style/layer_impl.cpp b/src/mbgl/style/layer_impl.cpp index c6a248de90..b6ab145012 100644 --- a/src/mbgl/style/layer_impl.cpp +++ b/src/mbgl/style/layer_impl.cpp @@ -3,9 +3,8 @@ namespace mbgl { namespace style { -Layer::Impl::Impl(LayerType type_, std::string layerID, std::string sourceID) - : type(type_), - id(std::move(layerID)), +Layer::Impl::Impl(std::string layerID, std::string sourceID) + : id(std::move(layerID)), source(std::move(sourceID)) { } diff --git a/src/mbgl/style/layer_impl.hpp b/src/mbgl/style/layer_impl.hpp index 948bbab619..c64173600e 100644 --- a/src/mbgl/style/layer_impl.hpp +++ b/src/mbgl/style/layer_impl.hpp @@ -29,7 +29,7 @@ namespace style { */ class Layer::Impl { public: - Impl(LayerType, std::string layerID, std::string sourceID); + Impl(std::string layerID, std::string sourceID); virtual ~Impl() = default; Impl& operator=(const Impl&) = delete; @@ -47,8 +47,6 @@ public: // Populates the given \a fontStack with fonts being used by the layer. virtual void populateFontStack(std::set<FontStack>& fontStack) const; - // Note: LayerType is deprecated, do not use it. - const LayerType type; std::string id; std::string source; std::string sourceLayer; @@ -61,5 +59,10 @@ protected: Impl(const Impl&) = default; }; +// To be used in the inherited classes. +#define DECLARE_LAYER_TYPE_INFO \ +const LayerTypeInfo* getTypeInfo() const noexcept final { return staticTypeInfo(); } \ +static const LayerTypeInfo* staticTypeInfo() noexcept + } // namespace style -} // namespace mbgl +} // namespace mbgl
\ No newline at end of file diff --git a/src/mbgl/style/layers/background_layer.cpp b/src/mbgl/style/layers/background_layer.cpp index 1342afd7b1..8beafb0278 100644 --- a/src/mbgl/style/layers/background_layer.cpp +++ b/src/mbgl/style/layers/background_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_background_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoBackground + +// static +const LayerTypeInfo* BackgroundLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"background", LayerTypeInfo::Source::NotRequired, LayerTypeInfo::Pass3D::NotRequired, LayerTypeInfo::Layout::NotRequired, LayerTypeInfo::Clipping::NotRequired }; -} // namespace + return &typeInfo; +} + BackgroundLayer::BackgroundLayer(const std::string& layerID) - : Layer(makeMutable<Impl>(LayerType::Background, layerID, std::string())) { + : Layer(makeMutable<Impl>(layerID, std::string())) { } BackgroundLayer::BackgroundLayer(Immutable<Impl> impl_) @@ -52,10 +58,6 @@ std::unique_ptr<Layer> BackgroundLayer::cloneRef(const std::string& id_) const { void BackgroundLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const { } -const LayerTypeInfo* BackgroundLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoBackground; -} - // Layout properties @@ -284,18 +286,20 @@ Mutable<Layer::Impl> BackgroundLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -BackgroundLayerFactory::BackgroundLayerFactory() = default; - -BackgroundLayerFactory::~BackgroundLayerFactory() = default; +} // namespace style -const LayerTypeInfo* BackgroundLayerFactory::getTypeInfo() const noexcept { - return &typeInfoBackground; +const style::LayerTypeInfo* BackgroundLayerFactory::getTypeInfo() const noexcept { + return style::BackgroundLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> BackgroundLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> BackgroundLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { (void)value; - return std::unique_ptr<style::Layer>(new BackgroundLayer(id)); + return std::unique_ptr<style::Layer>(new style::BackgroundLayer(id)); +} + +std::unique_ptr<RenderLayer> BackgroundLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderBackgroundLayer>(staticImmutableCast<style::BackgroundLayer::Impl>(std::move(impl))); } -} // namespace style } // namespace mbgl diff --git a/src/mbgl/style/layers/background_layer_impl.hpp b/src/mbgl/style/layers/background_layer_impl.hpp index 5407c4c065..0c68610c62 100644 --- a/src/mbgl/style/layers/background_layer_impl.hpp +++ b/src/mbgl/style/layers/background_layer_impl.hpp @@ -13,9 +13,10 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; BackgroundPaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/circle_layer.cpp b/src/mbgl/style/layers/circle_layer.cpp index c04d40083a..1e6200e4d2 100644 --- a/src/mbgl/style/layers/circle_layer.cpp +++ b/src/mbgl/style/layers/circle_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_circle_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoCircle + +// static +const LayerTypeInfo* CircleLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"circle", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::NotRequired, LayerTypeInfo::Layout::NotRequired, LayerTypeInfo::Clipping::NotRequired }; -} // namespace + return &typeInfo; +} + CircleLayer::CircleLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::Circle, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } CircleLayer::CircleLayer(Immutable<Impl> impl_) @@ -52,10 +58,6 @@ std::unique_ptr<Layer> CircleLayer::cloneRef(const std::string& id_) const { void CircleLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const { } -const LayerTypeInfo* CircleLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoCircle; -} - // Layout properties @@ -701,26 +703,28 @@ Mutable<Layer::Impl> CircleLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -CircleLayerFactory::CircleLayerFactory() = default; - -CircleLayerFactory::~CircleLayerFactory() = default; +} // namespace style -const LayerTypeInfo* CircleLayerFactory::getTypeInfo() const noexcept { - return &typeInfoCircle; +const style::LayerTypeInfo* CircleLayerFactory::getTypeInfo() const noexcept { + return style::CircleLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> CircleLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> CircleLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new CircleLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::CircleLayer(id, *source)); if (!initSourceLayerAndFilter(layer.get(), value)) { return nullptr; } return layer; } -} // namespace style +std::unique_ptr<RenderLayer> CircleLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderCircleLayer>(staticImmutableCast<style::CircleLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/circle_layer_impl.cpp b/src/mbgl/style/layers/circle_layer_impl.cpp index 358598e09c..bf0688ac8b 100644 --- a/src/mbgl/style/layers/circle_layer_impl.cpp +++ b/src/mbgl/style/layers/circle_layer_impl.cpp @@ -4,7 +4,7 @@ namespace mbgl { namespace style { bool CircleLayer::Impl::hasLayoutDifference(const Layer::Impl& other) const { - assert(other.type == LayerType::Circle); + assert(other.getTypeInfo() == getTypeInfo()); const auto& impl = static_cast<const style::CircleLayer::Impl&>(other); return filter != impl.filter || visibility != impl.visibility || diff --git a/src/mbgl/style/layers/circle_layer_impl.hpp b/src/mbgl/style/layers/circle_layer_impl.hpp index 5cd56b630c..9b3ce48706 100644 --- a/src/mbgl/style/layers/circle_layer_impl.hpp +++ b/src/mbgl/style/layers/circle_layer_impl.hpp @@ -13,9 +13,10 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; CirclePaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/custom_layer.cpp b/src/mbgl/style/layers/custom_layer.cpp index bff55a7a52..abea5d2d31 100644 --- a/src/mbgl/style/layers/custom_layer.cpp +++ b/src/mbgl/style/layers/custom_layer.cpp @@ -2,6 +2,8 @@ #include <mbgl/style/layers/custom_layer_impl.hpp> #include <mbgl/style/layer_observer.hpp> +#include <mbgl/renderer/layers/render_custom_layer.hpp> + namespace mbgl { namespace style { @@ -48,22 +50,24 @@ Mutable<Layer::Impl> CustomLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -const LayerTypeInfo* CustomLayer::Impl::getTypeInfo() const noexcept { +// static +const LayerTypeInfo* CustomLayer::Impl::staticTypeInfo() noexcept { return &typeInfoCustom; } -CustomLayerFactory::CustomLayerFactory() = default; - -CustomLayerFactory::~CustomLayerFactory() = default; +} // namespace style -const LayerTypeInfo* CustomLayerFactory::getTypeInfo() const noexcept { - return &typeInfoCustom; +const style::LayerTypeInfo* CustomLayerFactory::getTypeInfo() const noexcept { + return &style::typeInfoCustom; } -std::unique_ptr<style::Layer> CustomLayerFactory::createLayer(const std::string&, const conversion::Convertible&) { +std::unique_ptr<style::Layer> CustomLayerFactory::createLayer(const std::string&, const style::conversion::Convertible&) noexcept { assert(false); return nullptr; } -} // namespace style +std::unique_ptr<RenderLayer> CustomLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + return std::make_unique<RenderCustomLayer>(staticImmutableCast<style::CustomLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/custom_layer_impl.cpp b/src/mbgl/style/layers/custom_layer_impl.cpp index 05c41623c4..f82cb1ea2c 100644 --- a/src/mbgl/style/layers/custom_layer_impl.cpp +++ b/src/mbgl/style/layers/custom_layer_impl.cpp @@ -5,7 +5,7 @@ namespace style { CustomLayer::Impl::Impl(const std::string& id_, std::unique_ptr<CustomLayerHost> host_) - : Layer::Impl(LayerType::Custom, id_, std::string()) { + : Layer::Impl(id_, std::string()) { host = std::move(host_); } diff --git a/src/mbgl/style/layers/custom_layer_impl.hpp b/src/mbgl/style/layers/custom_layer_impl.hpp index 6c7a9078a5..1ebf1b53f1 100644 --- a/src/mbgl/style/layers/custom_layer_impl.hpp +++ b/src/mbgl/style/layers/custom_layer_impl.hpp @@ -18,9 +18,10 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; std::shared_ptr<CustomLayerHost> host; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/fill_extrusion_layer.cpp b/src/mbgl/style/layers/fill_extrusion_layer.cpp index 9a5cc02df4..7ca9d6ed6f 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer.cpp +++ b/src/mbgl/style/layers/fill_extrusion_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_fill_extrusion_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoFillExtrusion + +// static +const LayerTypeInfo* FillExtrusionLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"fill-extrusion", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::Required, LayerTypeInfo::Layout::Required, LayerTypeInfo::Clipping::NotRequired }; -} // namespace + return &typeInfo; +} + FillExtrusionLayer::FillExtrusionLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::FillExtrusion, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } FillExtrusionLayer::FillExtrusionLayer(Immutable<Impl> impl_) @@ -52,10 +58,6 @@ std::unique_ptr<Layer> FillExtrusionLayer::cloneRef(const std::string& id_) cons void FillExtrusionLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const { } -const LayerTypeInfo* FillExtrusionLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoFillExtrusion; -} - // Layout properties @@ -503,26 +505,28 @@ Mutable<Layer::Impl> FillExtrusionLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -FillExtrusionLayerFactory::FillExtrusionLayerFactory() = default; - -FillExtrusionLayerFactory::~FillExtrusionLayerFactory() = default; +} // namespace style -const LayerTypeInfo* FillExtrusionLayerFactory::getTypeInfo() const noexcept { - return &typeInfoFillExtrusion; +const style::LayerTypeInfo* FillExtrusionLayerFactory::getTypeInfo() const noexcept { + return style::FillExtrusionLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> FillExtrusionLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> FillExtrusionLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new FillExtrusionLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::FillExtrusionLayer(id, *source)); if (!initSourceLayerAndFilter(layer.get(), value)) { return nullptr; } return layer; } -} // namespace style +std::unique_ptr<RenderLayer> FillExtrusionLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderFillExtrusionLayer>(staticImmutableCast<style::FillExtrusionLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/fill_extrusion_layer_impl.cpp b/src/mbgl/style/layers/fill_extrusion_layer_impl.cpp index 357ea3e973..18eea1f7fc 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer_impl.cpp +++ b/src/mbgl/style/layers/fill_extrusion_layer_impl.cpp @@ -4,7 +4,7 @@ namespace mbgl { namespace style { bool FillExtrusionLayer::Impl::hasLayoutDifference(const Layer::Impl& other) const { - assert(other.type == LayerType::FillExtrusion); + assert(other.getTypeInfo() == getTypeInfo()); const auto& impl = static_cast<const style::FillExtrusionLayer::Impl&>(other); return filter != impl.filter || visibility != impl.visibility || diff --git a/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp b/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp index 6758320c2b..dcb6de1d8c 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp +++ b/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp @@ -13,10 +13,11 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; Properties<>::Unevaluated layout; FillExtrusionPaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/fill_layer.cpp b/src/mbgl/style/layers/fill_layer.cpp index 17a5eaf3b1..480fc597dd 100644 --- a/src/mbgl/style/layers/fill_layer.cpp +++ b/src/mbgl/style/layers/fill_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_fill_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoFill + +// static +const LayerTypeInfo* FillLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"fill", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::NotRequired, LayerTypeInfo::Layout::Required, LayerTypeInfo::Clipping::Required }; -} // namespace + return &typeInfo; +} + FillLayer::FillLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::Fill, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } FillLayer::FillLayer(Immutable<Impl> impl_) @@ -52,10 +58,6 @@ std::unique_ptr<Layer> FillLayer::cloneRef(const std::string& id_) const { void FillLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const { } -const LayerTypeInfo* FillLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoFill; -} - // Layout properties @@ -503,26 +505,28 @@ Mutable<Layer::Impl> FillLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -FillLayerFactory::FillLayerFactory() = default; - -FillLayerFactory::~FillLayerFactory() = default; +} // namespace style -const LayerTypeInfo* FillLayerFactory::getTypeInfo() const noexcept { - return &typeInfoFill; +const style::LayerTypeInfo* FillLayerFactory::getTypeInfo() const noexcept { + return style::FillLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> FillLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> FillLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new FillLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::FillLayer(id, *source)); if (!initSourceLayerAndFilter(layer.get(), value)) { return nullptr; } return layer; } -} // namespace style +std::unique_ptr<RenderLayer> FillLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderFillLayer>(staticImmutableCast<style::FillLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/fill_layer_impl.cpp b/src/mbgl/style/layers/fill_layer_impl.cpp index a8ba1b693b..4df32e02fa 100644 --- a/src/mbgl/style/layers/fill_layer_impl.cpp +++ b/src/mbgl/style/layers/fill_layer_impl.cpp @@ -4,7 +4,7 @@ namespace mbgl { namespace style { bool FillLayer::Impl::hasLayoutDifference(const Layer::Impl& other) const { - assert(other.type == LayerType::Fill); + assert(other.getTypeInfo() == getTypeInfo()); const auto& impl = static_cast<const style::FillLayer::Impl&>(other); return filter != impl.filter || visibility != impl.visibility || diff --git a/src/mbgl/style/layers/fill_layer_impl.hpp b/src/mbgl/style/layers/fill_layer_impl.hpp index 5b0592d062..92f3c97284 100644 --- a/src/mbgl/style/layers/fill_layer_impl.hpp +++ b/src/mbgl/style/layers/fill_layer_impl.hpp @@ -13,10 +13,11 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; Properties<>::Unevaluated layout; FillPaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/heatmap_layer.cpp b/src/mbgl/style/layers/heatmap_layer.cpp index 113f158f51..92477615b2 100644 --- a/src/mbgl/style/layers/heatmap_layer.cpp +++ b/src/mbgl/style/layers/heatmap_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_heatmap_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoHeatmap + +// static +const LayerTypeInfo* HeatmapLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"heatmap", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::Required, LayerTypeInfo::Layout::NotRequired, LayerTypeInfo::Clipping::NotRequired }; -} // namespace + return &typeInfo; +} + HeatmapLayer::HeatmapLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::Heatmap, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } HeatmapLayer::HeatmapLayer(Immutable<Impl> impl_) @@ -52,10 +58,6 @@ std::unique_ptr<Layer> HeatmapLayer::cloneRef(const std::string& id_) const { void HeatmapLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const { } -const LayerTypeInfo* HeatmapLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoHeatmap; -} - // Layout properties @@ -388,26 +390,28 @@ Mutable<Layer::Impl> HeatmapLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -HeatmapLayerFactory::HeatmapLayerFactory() = default; - -HeatmapLayerFactory::~HeatmapLayerFactory() = default; +} // namespace style -const LayerTypeInfo* HeatmapLayerFactory::getTypeInfo() const noexcept { - return &typeInfoHeatmap; +const style::LayerTypeInfo* HeatmapLayerFactory::getTypeInfo() const noexcept { + return style::HeatmapLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> HeatmapLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> HeatmapLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new HeatmapLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::HeatmapLayer(id, *source)); if (!initSourceLayerAndFilter(layer.get(), value)) { return nullptr; } return layer; } -} // namespace style +std::unique_ptr<RenderLayer> HeatmapLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderHeatmapLayer>(staticImmutableCast<style::HeatmapLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/heatmap_layer_impl.cpp b/src/mbgl/style/layers/heatmap_layer_impl.cpp index 8fd0cf72b2..dd5baaeb44 100644 --- a/src/mbgl/style/layers/heatmap_layer_impl.cpp +++ b/src/mbgl/style/layers/heatmap_layer_impl.cpp @@ -4,7 +4,7 @@ namespace mbgl { namespace style { bool HeatmapLayer::Impl::hasLayoutDifference(const Layer::Impl& other) const { - assert(other.type == LayerType::Heatmap); + assert(other.getTypeInfo() == getTypeInfo()); const auto& impl = static_cast<const style::HeatmapLayer::Impl&>(other); return filter != impl.filter || visibility != impl.visibility || diff --git a/src/mbgl/style/layers/heatmap_layer_impl.hpp b/src/mbgl/style/layers/heatmap_layer_impl.hpp index 7645fa0cc1..3022293860 100644 --- a/src/mbgl/style/layers/heatmap_layer_impl.hpp +++ b/src/mbgl/style/layers/heatmap_layer_impl.hpp @@ -13,9 +13,10 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; HeatmapPaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/hillshade_layer.cpp b/src/mbgl/style/layers/hillshade_layer.cpp index 81d2c32f6f..d914d0cdea 100644 --- a/src/mbgl/style/layers/hillshade_layer.cpp +++ b/src/mbgl/style/layers/hillshade_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_hillshade_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoHillshade + +// static +const LayerTypeInfo* HillshadeLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"hillshade", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::Required, LayerTypeInfo::Layout::NotRequired, LayerTypeInfo::Clipping::NotRequired }; -} // namespace + return &typeInfo; +} + HillshadeLayer::HillshadeLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::Hillshade, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } HillshadeLayer::HillshadeLayer(Immutable<Impl> impl_) @@ -52,10 +58,6 @@ std::unique_ptr<Layer> HillshadeLayer::cloneRef(const std::string& id_) const { void HillshadeLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const { } -const LayerTypeInfo* HillshadeLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoHillshade; -} - // Layout properties @@ -435,23 +437,25 @@ Mutable<Layer::Impl> HillshadeLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -HillshadeLayerFactory::HillshadeLayerFactory() = default; - -HillshadeLayerFactory::~HillshadeLayerFactory() = default; +} // namespace style -const LayerTypeInfo* HillshadeLayerFactory::getTypeInfo() const noexcept { - return &typeInfoHillshade; +const style::LayerTypeInfo* HillshadeLayerFactory::getTypeInfo() const noexcept { + return style::HillshadeLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> HillshadeLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> HillshadeLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new HillshadeLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::HillshadeLayer(id, *source)); return layer; } -} // namespace style +std::unique_ptr<RenderLayer> HillshadeLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderHillshadeLayer>(staticImmutableCast<style::HillshadeLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/hillshade_layer_impl.hpp b/src/mbgl/style/layers/hillshade_layer_impl.hpp index 520b18cc84..86409fa542 100644 --- a/src/mbgl/style/layers/hillshade_layer_impl.hpp +++ b/src/mbgl/style/layers/hillshade_layer_impl.hpp @@ -13,9 +13,10 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; HillshadePaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs index 0971e1af5b..d03e41da76 100644 --- a/src/mbgl/style/layers/layer.cpp.ejs +++ b/src/mbgl/style/layers/layer.cpp.ejs @@ -16,10 +16,12 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_<%- type.replace('-', '_') %>_layer.hpp> + namespace mbgl { namespace style { -namespace {<% +<% let layerCapabilities = {}; let defaults = { caps: { 'Source': 'NotRequired', 'Pass3D': 'NotRequired', @@ -60,19 +62,23 @@ layerCapabilities['line'] = layerCapabilities['fill']; layerCapabilities['heatmap'] = layerCapabilities['hillshade']; layerCapabilities['raster'] = layerCapabilities['circle']; %> - const LayerTypeInfo typeInfo<%- `${camelize(type)}`%> +// static +const LayerTypeInfo* <%- camelize(type) %>Layer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"<%- type %>", <%-`${layerCapabilities[type].map(cap => `LayerTypeInfo::${cap}`).join(',\n ')}` %> }; -} // namespace + return &typeInfo; +} + <% if (type === 'background') { -%> <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(const std::string& layerID) - : Layer(makeMutable<Impl>(LayerType::<%- camelize(type) %>, layerID, std::string())) { + : Layer(makeMutable<Impl>(layerID, std::string())) { } <% } else { -%> <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::<%- camelize(type) %>, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } <% } -%> @@ -106,10 +112,6 @@ void <%- camelize(type) %>Layer::Impl::stringifyLayout(rapidjson::Writer<rapidjs } <% } -%> -const LayerTypeInfo* <%- camelize(type) %>Layer::Impl::getTypeInfo() const noexcept { - return &typeInfo<%- camelize(type) %>; -} - // Layout properties <% for (const property of layoutProperties) { -%> @@ -311,25 +313,23 @@ Mutable<Layer::Impl> <%- camelize(type) %>Layer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -<%- camelize(type) %>LayerFactory::<%- camelize(type) %>LayerFactory() = default; - -<%- camelize(type) %>LayerFactory::~<%- camelize(type) %>LayerFactory() = default; +} // namespace style -const LayerTypeInfo* <%- camelize(type) %>LayerFactory::getTypeInfo() const noexcept { - return &typeInfo<%- camelize(type) %>; +const style::LayerTypeInfo* <%- camelize(type) %>LayerFactory::getTypeInfo() const noexcept { + return style::<%- camelize(type) %>Layer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> <%- camelize(type) %>LayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> <%- camelize(type) %>LayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { <% if (type === 'background') { -%> (void)value; - return std::unique_ptr<style::Layer>(new <%- camelize(type) %>Layer(id)); + return std::unique_ptr<style::Layer>(new style::<%- camelize(type) %>Layer(id)); <% } else { -%> optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new <%- camelize(type) %>Layer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::<%- camelize(type) %>Layer(id, *source)); <% if (type !== 'raster' && type !== 'hillshade') { -%> if (!initSourceLayerAndFilter(layer.get(), value)) { return nullptr; @@ -339,5 +339,9 @@ std::unique_ptr<style::Layer> <%- camelize(type) %>LayerFactory::createLayer(con <% } -%> } -} // namespace style +std::unique_ptr<RenderLayer> <%- camelize(type) %>LayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<Render<%- camelize(type) %>Layer>(staticImmutableCast<style::<%- camelize(type) %>Layer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/line_layer.cpp b/src/mbgl/style/layers/line_layer.cpp index aeb0635254..f021a5fd73 100644 --- a/src/mbgl/style/layers/line_layer.cpp +++ b/src/mbgl/style/layers/line_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_line_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoLine + +// static +const LayerTypeInfo* LineLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"line", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::NotRequired, LayerTypeInfo::Layout::Required, LayerTypeInfo::Clipping::Required }; -} // namespace + return &typeInfo; +} + LineLayer::LineLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::Line, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } LineLayer::LineLayer(Immutable<Impl> impl_) @@ -53,10 +59,6 @@ void LineLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer> layout.stringify(writer); } -const LayerTypeInfo* LineLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoLine; -} - // Layout properties PropertyValue<LineCapType> LineLayer::getDefaultLineCap() { @@ -842,26 +844,28 @@ Mutable<Layer::Impl> LineLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -LineLayerFactory::LineLayerFactory() = default; - -LineLayerFactory::~LineLayerFactory() = default; +} // namespace style -const LayerTypeInfo* LineLayerFactory::getTypeInfo() const noexcept { - return &typeInfoLine; +const style::LayerTypeInfo* LineLayerFactory::getTypeInfo() const noexcept { + return style::LineLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> LineLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> LineLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new LineLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::LineLayer(id, *source)); if (!initSourceLayerAndFilter(layer.get(), value)) { return nullptr; } return layer; } -} // namespace style +std::unique_ptr<RenderLayer> LineLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderLineLayer>(staticImmutableCast<style::LineLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/line_layer_impl.cpp b/src/mbgl/style/layers/line_layer_impl.cpp index 68cd3a8f49..b5183ba9ae 100644 --- a/src/mbgl/style/layers/line_layer_impl.cpp +++ b/src/mbgl/style/layers/line_layer_impl.cpp @@ -4,7 +4,7 @@ namespace mbgl { namespace style { bool LineLayer::Impl::hasLayoutDifference(const Layer::Impl& other) const { - assert(other.type == LayerType::Line); + assert(other.getTypeInfo() == getTypeInfo()); const auto& impl = static_cast<const style::LineLayer::Impl&>(other); return filter != impl.filter || visibility != impl.visibility || diff --git a/src/mbgl/style/layers/line_layer_impl.hpp b/src/mbgl/style/layers/line_layer_impl.hpp index cd56a18fa8..af6c13dfd3 100644 --- a/src/mbgl/style/layers/line_layer_impl.hpp +++ b/src/mbgl/style/layers/line_layer_impl.hpp @@ -13,10 +13,11 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; LineLayoutProperties::Unevaluated layout; LinePaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/raster_layer.cpp b/src/mbgl/style/layers/raster_layer.cpp index 0356c2f75c..40224a0b6d 100644 --- a/src/mbgl/style/layers/raster_layer.cpp +++ b/src/mbgl/style/layers/raster_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_raster_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoRaster + +// static +const LayerTypeInfo* RasterLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"raster", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::NotRequired, LayerTypeInfo::Layout::NotRequired, LayerTypeInfo::Clipping::NotRequired }; -} // namespace + return &typeInfo; +} + RasterLayer::RasterLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::Raster, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } RasterLayer::RasterLayer(Immutable<Impl> impl_) @@ -52,10 +58,6 @@ std::unique_ptr<Layer> RasterLayer::cloneRef(const std::string& id_) const { void RasterLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const { } -const LayerTypeInfo* RasterLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoRaster; -} - // Layout properties @@ -524,23 +526,25 @@ Mutable<Layer::Impl> RasterLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -RasterLayerFactory::RasterLayerFactory() = default; - -RasterLayerFactory::~RasterLayerFactory() = default; +} // namespace style -const LayerTypeInfo* RasterLayerFactory::getTypeInfo() const noexcept { - return &typeInfoRaster; +const style::LayerTypeInfo* RasterLayerFactory::getTypeInfo() const noexcept { + return style::RasterLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> RasterLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> RasterLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new RasterLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::RasterLayer(id, *source)); return layer; } -} // namespace style +std::unique_ptr<RenderLayer> RasterLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderRasterLayer>(staticImmutableCast<style::RasterLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/raster_layer_impl.hpp b/src/mbgl/style/layers/raster_layer_impl.hpp index 2e93ecec80..740efff322 100644 --- a/src/mbgl/style/layers/raster_layer_impl.hpp +++ b/src/mbgl/style/layers/raster_layer_impl.hpp @@ -13,9 +13,10 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; RasterPaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style diff --git a/src/mbgl/style/layers/symbol_layer.cpp b/src/mbgl/style/layers/symbol_layer.cpp index 65a81c1071..f4fbf550f2 100644 --- a/src/mbgl/style/layers/symbol_layer.cpp +++ b/src/mbgl/style/layers/symbol_layer.cpp @@ -11,21 +11,27 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/util/fnv_hash.hpp> +#include <mbgl/renderer/layers/render_symbol_layer.hpp> + namespace mbgl { namespace style { -namespace { - const LayerTypeInfo typeInfoSymbol + +// static +const LayerTypeInfo* SymbolLayer::Impl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo {"symbol", LayerTypeInfo::Source::Required, LayerTypeInfo::Pass3D::NotRequired, LayerTypeInfo::Layout::Required, LayerTypeInfo::Clipping::NotRequired }; -} // namespace + return &typeInfo; +} + SymbolLayer::SymbolLayer(const std::string& layerID, const std::string& sourceID) - : Layer(makeMutable<Impl>(LayerType::Symbol, layerID, sourceID)) { + : Layer(makeMutable<Impl>(layerID, sourceID)) { } SymbolLayer::SymbolLayer(Immutable<Impl> impl_) @@ -53,10 +59,6 @@ void SymbolLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffe layout.stringify(writer); } -const LayerTypeInfo* SymbolLayer::Impl::getTypeInfo() const noexcept { - return &typeInfoSymbol; -} - // Layout properties PropertyValue<SymbolPlacementType> SymbolLayer::getDefaultSymbolPlacement() { @@ -1992,26 +1994,28 @@ Mutable<Layer::Impl> SymbolLayer::mutableBaseImpl() const { return staticMutableCast<Layer::Impl>(mutableImpl()); } -SymbolLayerFactory::SymbolLayerFactory() = default; - -SymbolLayerFactory::~SymbolLayerFactory() = default; +} // namespace style -const LayerTypeInfo* SymbolLayerFactory::getTypeInfo() const noexcept { - return &typeInfoSymbol; +const style::LayerTypeInfo* SymbolLayerFactory::getTypeInfo() const noexcept { + return style::SymbolLayer::Impl::staticTypeInfo(); } -std::unique_ptr<style::Layer> SymbolLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { +std::unique_ptr<style::Layer> SymbolLayerFactory::createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept { optional<std::string> source = getSource(value); if (!source) { return nullptr; } - std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new SymbolLayer(id, *source)); + std::unique_ptr<style::Layer> layer = std::unique_ptr<style::Layer>(new style::SymbolLayer(id, *source)); if (!initSourceLayerAndFilter(layer.get(), value)) { return nullptr; } return layer; } -} // namespace style +std::unique_ptr<RenderLayer> SymbolLayerFactory::createRenderLayer(Immutable<style::Layer::Impl> impl) noexcept { + assert(impl->getTypeInfo() == getTypeInfo()); + return std::make_unique<RenderSymbolLayer>(staticImmutableCast<style::SymbolLayer::Impl>(std::move(impl))); +} + } // namespace mbgl diff --git a/src/mbgl/style/layers/symbol_layer_impl.cpp b/src/mbgl/style/layers/symbol_layer_impl.cpp index e177391686..3dd1da1136 100644 --- a/src/mbgl/style/layers/symbol_layer_impl.cpp +++ b/src/mbgl/style/layers/symbol_layer_impl.cpp @@ -6,7 +6,7 @@ namespace mbgl { namespace style { bool SymbolLayer::Impl::hasLayoutDifference(const Layer::Impl& other) const { - assert(other.type == LayerType::Symbol); + assert(other.getTypeInfo() == getTypeInfo()); const auto& impl = static_cast<const style::SymbolLayer::Impl&>(other); return filter != impl.filter || visibility != impl.visibility || diff --git a/src/mbgl/style/layers/symbol_layer_impl.hpp b/src/mbgl/style/layers/symbol_layer_impl.hpp index 01ff9772b8..a5b0332f6c 100644 --- a/src/mbgl/style/layers/symbol_layer_impl.hpp +++ b/src/mbgl/style/layers/symbol_layer_impl.hpp @@ -13,11 +13,12 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override; - const LayerTypeInfo* getTypeInfo() const noexcept final; void populateFontStack(std::set<FontStack>& fontStack) const final; SymbolLayoutProperties::Unevaluated layout; SymbolPaintProperties::Transitionable paint; + + DECLARE_LAYER_TYPE_INFO; }; } // namespace style |