#include #include #include #include #include #include #include namespace mbgl { HeadlessFrontend::HeadlessFrontend(float pixelRatio_, FileSource& fileSource, Scheduler& scheduler, const optional programCacheDir, GLContextMode mode, const optional localFontFamily) : HeadlessFrontend({ 256, 256 }, pixelRatio_, fileSource, scheduler, programCacheDir, mode, localFontFamily) { } HeadlessFrontend::HeadlessFrontend(Size size_, float pixelRatio_, FileSource& fileSource, Scheduler& scheduler, const optional programCacheDir, GLContextMode mode, const optional localFontFamily) : size(size_), pixelRatio(pixelRatio_), backend({ static_cast(size.width * pixelRatio), static_cast(size.height * pixelRatio) }), asyncInvalidate([this] { if (renderer && updateParameters) { mbgl::BackendScope guard { backend }; renderer->render(*updateParameters); } }), renderer(std::make_unique(backend, pixelRatio, fileSource, scheduler, mode, programCacheDir, localFontFamily)) { } HeadlessFrontend::~HeadlessFrontend() = default; void HeadlessFrontend::reset() { assert(renderer); renderer.reset(); } void HeadlessFrontend::update(std::shared_ptr updateParameters_) { updateParameters = updateParameters_; asyncInvalidate.send(); } void HeadlessFrontend::setObserver(RendererObserver& observer_) { assert(renderer); renderer->setObserver(&observer_); } Size HeadlessFrontend::getSize() const { return size; } Renderer* HeadlessFrontend::getRenderer() { assert(renderer); return renderer.get(); } RendererBackend* HeadlessFrontend::getBackend() { return &backend; } CameraOptions HeadlessFrontend::getCameraOptions() { if (updateParameters) return RendererState::getCameraOptions(*updateParameters); static CameraOptions nullCamera; return nullCamera; } bool HeadlessFrontend::hasImage(const std::string& id) { if (updateParameters) { return RendererState::hasImage(*updateParameters, id); } return false; } bool HeadlessFrontend::hasLayer(const std::string& id) { if (updateParameters) { return RendererState::hasLayer(*updateParameters, id); } return false; } bool HeadlessFrontend::hasSource(const std::string& id) { if (updateParameters) { return RendererState::hasSource(*updateParameters, id); } return false; } ScreenCoordinate HeadlessFrontend::pixelForLatLng(const LatLng& coordinate) { if (updateParameters) { return RendererState::pixelForLatLng(*updateParameters, coordinate); } return ScreenCoordinate {}; } LatLng HeadlessFrontend::latLngForPixel(const ScreenCoordinate& point) { if (updateParameters) { return RendererState::latLngForPixel(*updateParameters, point); } return LatLng {}; } void HeadlessFrontend::setSize(Size size_) { if (size != size_) { size = size_; backend.setSize({ static_cast(size_.width * pixelRatio), static_cast(size_.height * pixelRatio) }); } } PremultipliedImage HeadlessFrontend::readStillImage() { return backend.readStillImage(); } PremultipliedImage HeadlessFrontend::render(Map& map) { PremultipliedImage result; map.renderStill([&](std::exception_ptr error) { if (error) { std::rethrow_exception(error); } else { result = backend.readStillImage(); } }); while (!result.valid()) { util::RunLoop::Get()->runOnce(); } return result; } optional HeadlessFrontend::getTransformState() const { if (updateParameters) { return updateParameters->transformState; } else { return {}; } } } // namespace mbgl