#include #include #include #include #include #include #include namespace mbgl { class OffscreenView::Impl { public: Impl(gl::Context& context_, const Size size_) : context(context_), size(std::move(size_)) { assert(!size.isEmpty()); } void bind() { if (!framebuffer) { color = context.createRenderbuffer(size); depthStencil = context.createRenderbuffer(size); framebuffer = context.createFramebuffer(*color, *depthStencil); } else { context.bindFramebuffer = framebuffer->framebuffer; } context.viewport = { 0, 0, size }; } PremultipliedImage readStillImage() { return context.readFramebuffer(size); } const Size& getSize() const { return size; } private: gl::Context& context; const Size size; optional framebuffer; optional> color; optional> depthStencil; }; OffscreenView::OffscreenView(gl::Context& context, const Size size) : impl(std::make_unique(context, std::move(size))) { } OffscreenView::~OffscreenView() = default; void OffscreenView::bind() { impl->bind(); } PremultipliedImage OffscreenView::readStillImage() { return impl->readStillImage(); } const Size& OffscreenView::getSize() const { return impl->getSize(); } } // namespace mbgl