#include #include #include #include #include #include /** The RenderFrontend is passed to the Map to facilitate rendering in a platform dependent way. */ class MGLRenderFrontend : public mbgl::RendererFrontend { public: MGLRenderFrontend(std::unique_ptr renderer_, MGLMapView* nativeView_, mbgl::RendererBackend& mbglBackend_, mbgl::View& mbglView_, bool async = false) : renderer(std::move(renderer_)) , nativeView(nativeView_) , mbglBackend(mbglBackend_) , mbglView(mbglView_) { if (async) { asyncInvalidate.emplace([&]() { [nativeView setNeedsGLDisplay]; }); } } void reset() override { if (renderer) { renderer.reset(); } } void update(std::shared_ptr updateParameters_) override { updateParameters = std::move(updateParameters_); if (asyncInvalidate) { asyncInvalidate->send(); } else { [nativeView setNeedsGLDisplay]; } } void setObserver(mbgl::RendererObserver& observer) override { if (!renderer) return; renderer->setObserver(&observer); } void render() { if (!renderer || !updateParameters) return; mbgl::BackendScope guard { mbglBackend, mbgl::BackendScope::ScopeType::Implicit }; renderer->render(mbglView, *updateParameters); } mbgl::Renderer* getRenderer() { return renderer.get(); } void onLowMemory() { if (!renderer) return; renderer->onLowMemory(); } private: std::unique_ptr renderer; __weak MGLMapView *nativeView = nullptr; mbgl::RendererBackend& mbglBackend; mbgl::View& mbglView; std::shared_ptr updateParameters; mbgl::optional asyncInvalidate; };