#include #include #include #include #include #include #include #include #include namespace mbgl { Renderer::Renderer(gfx::RendererBackend& backend, float pixelRatio_, const std::optional& localFontFamily_) : impl(std::make_unique(backend, pixelRatio_, localFontFamily_)) {} Renderer::~Renderer() { gfx::BackendScope guard{impl->backend}; impl.reset(); } void Renderer::markContextLost() { impl->orchestrator.markContextLost(); } void Renderer::setObserver(RendererObserver* observer) { impl->setObserver(observer); impl->orchestrator.setObserver(observer); } void Renderer::render(const std::shared_ptr& updateParameters) { assert(updateParameters); if (auto renderTree = impl->orchestrator.createRenderTree(updateParameters)) { renderTree->prepare(); const auto& renderTreeParameters = renderTree->getParameters(); const auto& state = renderTreeParameters.transformParams.state; if (impl->staticData && impl->staticData->shaders) { auto& context = impl->backend.getContext(); auto& shaders = *impl->staticData->shaders; impl->orchestrator.updateLayers(shaders, context, state, updateParameters, *renderTree); } impl->render(*renderTree); } } std::vector Renderer::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const { return impl->orchestrator.queryRenderedFeatures(geometry, options); } std::vector Renderer::queryRenderedFeatures(const ScreenCoordinate& point, const RenderedQueryOptions& options) const { return impl->orchestrator.queryRenderedFeatures({point}, options); } std::vector Renderer::queryRenderedFeatures(const ScreenBox& box, const RenderedQueryOptions& options) const { return impl->orchestrator.queryRenderedFeatures( {box.min, {box.max.x, box.min.y}, box.max, {box.min.x, box.max.y}, box.min}, options); } AnnotationIDs Renderer::queryPointAnnotations(const ScreenBox& box) const { if (!LayerManager::annotationsEnabled) { return {}; } RenderedQueryOptions options; options.layerIDs = {{AnnotationManager::PointLayerID}}; auto features = queryRenderedFeatures(box, options); return getAnnotationIDs(features); } AnnotationIDs Renderer::queryShapeAnnotations(const ScreenBox& box) const { if (!LayerManager::annotationsEnabled) { return {}; } auto features = impl->orchestrator.queryShapeAnnotations( {box.min, {box.max.x, box.min.y}, box.max, {box.min.x, box.max.y}, box.min}); return getAnnotationIDs(features); } AnnotationIDs Renderer::getAnnotationIDs(const std::vector& features) const { if (!LayerManager::annotationsEnabled) { return {}; } std::set set; for (auto& feature : features) { assert(feature.id.is()); assert(feature.id.get() <= std::numeric_limits::max()); set.insert(static_cast(feature.id.get())); } AnnotationIDs ids; ids.reserve(set.size()); std::move(set.begin(), set.end(), std::back_inserter(ids)); return ids; } std::vector Renderer::querySourceFeatures(const std::string& sourceID, const SourceQueryOptions& options) const { return impl->orchestrator.querySourceFeatures(sourceID, options); } FeatureExtensionValue Renderer::queryFeatureExtensions(const std::string& sourceID, const Feature& feature, const std::string& extension, const std::string& extensionField, const std::optional>& args) const { return impl->orchestrator.queryFeatureExtensions(sourceID, feature, extension, extensionField, args); } void Renderer::setFeatureState(const std::string& sourceID, const std::optional& sourceLayerID, const std::string& featureID, const FeatureState& state) { impl->orchestrator.setFeatureState(sourceID, sourceLayerID, featureID, state); } void Renderer::getFeatureState(FeatureState& state, const std::string& sourceID, const std::optional& sourceLayerID, const std::string& featureID) const { impl->orchestrator.getFeatureState(state, sourceID, sourceLayerID, featureID); } void Renderer::removeFeatureState(const std::string& sourceID, const std::optional& sourceLayerID, const std::optional& featureID, const std::optional& stateKey) { impl->orchestrator.removeFeatureState(sourceID, sourceLayerID, featureID, stateKey); } void Renderer::dumpDebugLogs() { impl->orchestrator.dumpDebugLogs(); } void Renderer::collectPlacedSymbolData(bool enable) { impl->orchestrator.collectPlacedSymbolData(enable); } const std::vector& Renderer::getPlacedSymbolsData() const { return impl->orchestrator.getPlacedSymbolsData(); } void Renderer::reduceMemoryUse() { gfx::BackendScope guard{impl->backend}; impl->reduceMemoryUse(); impl->orchestrator.reduceMemoryUse(); } void Renderer::clearData() { impl->orchestrator.clearData(); } } // namespace mbgl