summaryrefslogtreecommitdiff
path: root/src/mbgl/style
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2018-11-22 15:37:09 +0200
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2018-11-26 22:11:28 +0200
commitff390189a8887b57780cc3bea3b7f30bbecc0fec (patch)
treefce4c858652596e6ce6331ef3a1a8e466391a8d4 /src/mbgl/style
parent6bb1e977eafc61af39d47df083bb3de13205fae9 (diff)
downloadqtlocation-mapboxgl-upstream/mikhail_render_layer_factory.tar.gz
[core][Android][Darwin] LayerManager creates RenderLayer instancesupstream/mikhail_render_layer_factory
`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')
-rw-r--r--src/mbgl/style/layer.cpp38
-rw-r--r--src/mbgl/style/layer_impl.cpp5
-rw-r--r--src/mbgl/style/layer_impl.hpp11
-rw-r--r--src/mbgl/style/layers/background_layer.cpp36
-rw-r--r--src/mbgl/style/layers/background_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/circle_layer.cpp36
-rw-r--r--src/mbgl/style/layers/circle_layer_impl.cpp2
-rw-r--r--src/mbgl/style/layers/circle_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/custom_layer.cpp20
-rw-r--r--src/mbgl/style/layers/custom_layer_impl.cpp2
-rw-r--r--src/mbgl/style/layers/custom_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/fill_extrusion_layer.cpp36
-rw-r--r--src/mbgl/style/layers/fill_extrusion_layer_impl.cpp2
-rw-r--r--src/mbgl/style/layers/fill_extrusion_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/fill_layer.cpp36
-rw-r--r--src/mbgl/style/layers/fill_layer_impl.cpp2
-rw-r--r--src/mbgl/style/layers/fill_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/heatmap_layer.cpp36
-rw-r--r--src/mbgl/style/layers/heatmap_layer_impl.cpp2
-rw-r--r--src/mbgl/style/layers/heatmap_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/hillshade_layer.cpp36
-rw-r--r--src/mbgl/style/layers/hillshade_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/layer.cpp.ejs40
-rw-r--r--src/mbgl/style/layers/line_layer.cpp36
-rw-r--r--src/mbgl/style/layers/line_layer_impl.cpp2
-rw-r--r--src/mbgl/style/layers/line_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/raster_layer.cpp36
-rw-r--r--src/mbgl/style/layers/raster_layer_impl.hpp3
-rw-r--r--src/mbgl/style/layers/symbol_layer.cpp36
-rw-r--r--src/mbgl/style/layers/symbol_layer_impl.cpp2
-rw-r--r--src/mbgl/style/layers/symbol_layer_impl.hpp3
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