#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class LayerManagerDefault final : public LayerManager { public: LayerManagerDefault(); /** * Enables a layer type for JSON style only. * * We might not want to expose runtime API for some layer types * in order to save binary size (the corresponding SDK layer wrappers * should be excluded from the project build). */ void addLayerTypeCoreOnly(std::unique_ptr) override; private: void addLayerType(std::unique_ptr); // LayerManager overrides. LayerFactory* getFactory(const std::string& type) noexcept final; LayerFactory* getFactory(const style::LayerTypeInfo*) noexcept final; std::vector> factories; std::map typeToFactory; }; void LayerManagerDefault::addLayerTypeCoreOnly(std::unique_ptr layerFactory) { addLayerType(std::move(layerFactory)); } LayerManagerDefault::LayerManagerDefault() { // VALIDATION ONLY: 30-01 source-less Core RenderLayer experiment. addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); #if !defined(MBGL_LAYER_FILL_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_LINE_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_CIRCLE_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_SYMBOL_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_RASTER_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_BACKGROUND_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_HILLSHADE_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_COLOR_RELIEF_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_FILL_EXTRUSION_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MBGL_LAYER_HEATMAP_DISABLE_ALL) addLayerType(std::make_unique()); #endif #ifdef MLN_RENDER_BACKEND_OPENGL #if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) addLayerType(std::make_unique()); #endif #endif #if !defined(MBGL_LAYER_LOCATION_INDICATOR_DISABLE_ALL) addLayerType(std::make_unique()); #endif #if !defined(MLN_LAYER_CUSTOM_DRAWABLE_DISABLE_ALL) addLayerType(std::make_unique()); #endif } void LayerManagerDefault::addLayerType(std::unique_ptr factory) { std::string type{factory->getTypeInfo()->type}; if (!type.empty()) { typeToFactory.emplace(std::make_pair(std::move(type), factory.get())); } else { Log::Warning(Event::Setup, "Failure adding layer factory. getTypeInfo() returned an empty " "type string."); } factories.emplace_back(std::move(factory)); } LayerFactory* LayerManagerDefault::getFactory(const mbgl::style::LayerTypeInfo* typeInfo) noexcept { assert(typeInfo); for (const auto& factory : factories) { if (layerTypeInfoEquals(factory->getTypeInfo(), typeInfo)) { return factory.get(); } } assert(false); return nullptr; } LayerFactory* LayerManagerDefault::getFactory(const std::string& type) noexcept { auto search = typeToFactory.find(type); return (search != typeToFactory.end()) ? search->second : nullptr; } // static LayerManager* LayerManager::get() noexcept { static LayerManagerDefault instance; return &instance; } #if defined(MBGL_LAYER_LINE_DISABLE_ALL) || defined(MBGL_LAYER_SYMBOL_DISABLE_ALL) || \ defined(MBGL_LAYER_FILL_DISABLE_ALL) const bool LayerManager::annotationsEnabled = false; #else const bool LayerManager::annotationsEnabled = true; #endif } // namespace mbgl