void AbstractFramebuffer::read(const Range2Di& rectangle, Image2D& image) { bindInternal(FramebufferTarget::Read); const std::size_t dataSize = image.dataSize(rectangle.size()); char* const data = new char[dataSize]; (Context::current()->state().framebuffer->readImplementation)(rectangle, image.format(), image.type(), dataSize, data); image.setData(image.format(), image.type(), rectangle.size(), data); }
void CubeMapTexture::image(const Coordinate coordinate, const Int level, Image2D& image) { const Vector2i size = imageSize(level); const std::size_t dataSize = image.dataSize(size); char* data = new char[dataSize]; (this->*Context::current()->state().texture->getCubeImageImplementation)(coordinate, level, size, image.format(), image.type(), dataSize, data); image.setData(image.format(), image.type(), size, data); }
void AbstractFramebuffer::read(const Range2Di& rectangle, Image2D& image) { bindInternal(FramebufferTarget::Read); /* Reallocate only if needed */ const std::size_t dataSize = Implementation::imageDataSizeFor(image, rectangle.size()); Containers::Array<char> data{image.release()}; if(data.size() < dataSize) data = Containers::Array<char>{dataSize}; #ifndef MAGNUM_TARGET_GLES2 Buffer::unbindInternal(Buffer::TargetHint::PixelPack); #endif image.storage().applyPack(); (Context::current().state().framebuffer->readImplementation)(rectangle, image.format(), image.type(), data.size(), data #ifdef MAGNUM_TARGET_GLES2 + Implementation::pixelStorageSkipOffsetFor(image, rectangle.size()) #endif ); image.setData(image.storage(), image.format(), image.type(), rectangle.size(), std::move(data)); }