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 AbstractFramebuffer::read(const Range2Di& rectangle, BufferImage2D& image, BufferUsage usage) { bindInternal(FramebufferTarget::Read); /* If the buffer doesn't have sufficient size, resize it */ /** @todo Explicitly reset also when buffer usage changes */ if(image.size() != rectangle.size()) image.setData(image.format(), image.type(), rectangle.size(), nullptr, usage); image.buffer().bindInternal(Buffer::TargetHint::PixelPack); (Context::current()->state().framebuffer->readImplementation)(rectangle, image.format(), image.type(), image.dataSize(rectangle.size()), nullptr); }
void AbstractFramebuffer::read(const Range2Di& rectangle, BufferImage2D& image, BufferUsage usage) { bindInternal(FramebufferTarget::Read); /* Reallocate only if needed */ const std::size_t dataSize = Implementation::imageDataSizeFor(image, rectangle.size()); if(image.dataSize() < dataSize) image.setData(image.storage(), image.format(), image.type(), rectangle.size(), {nullptr, dataSize}, usage); else image.setData(image.storage(), image.format(), image.type(), rectangle.size(), nullptr, usage); image.buffer().bindInternal(Buffer::TargetHint::PixelPack); image.storage().applyPack(); (Context::current().state().framebuffer->readImplementation)(rectangle, image.format(), image.type(), dataSize, nullptr); }
void AbstractFramebuffer::blitImplementationNV(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, const FramebufferBlitMask mask, const FramebufferBlitFilter filter) { #ifndef CORRADE_TARGET_NACL source.bindInternal(FramebufferTarget::Read); destination.bindInternal(FramebufferTarget::Draw); glBlitFramebufferNV(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter)); #else static_cast<void>(source); static_cast<void>(destination); static_cast<void>(sourceRectangle); static_cast<void>(destinationRectangle); static_cast<void>(mask); static_cast<void>(filter); CORRADE_ASSERT_UNREACHABLE(); #endif }
void RangeTest::center() { const Range1Di line(34, 47); const Range2Di rect({34, 23}, {47, 30}); const Range3Di cube({34, 23, -17}, {47, 30, 12}); CORRADE_COMPARE(line.center(), 40); CORRADE_COMPARE(rect.center(), Vector2i(40, 26)); CORRADE_COMPARE(cube.center(), Vector3i(40, 26, -2)); CORRADE_COMPARE(rect.centerX(), 40); CORRADE_COMPARE(rect.centerY(), 26); CORRADE_COMPARE(cube.centerX(), 40); CORRADE_COMPARE(cube.centerY(), 26); CORRADE_COMPARE(cube.centerZ(), -2); }
void RangeTest::size() { const Range1Di line(34, 47); const Range2Di rect({34, 23}, {47, 30}); const Range3Di cube({34, 23, -17}, {47, 30, 12}); CORRADE_COMPARE(line.size(), 13); CORRADE_COMPARE(rect.size(), Vector2i(13, 7)); CORRADE_COMPARE(cube.size(), Vector3i(13, 7, 29)); CORRADE_COMPARE(rect.sizeX(), 13); CORRADE_COMPARE(rect.sizeY(), 7); CORRADE_COMPARE(cube.sizeX(), 13); CORRADE_COMPARE(cube.sizeY(), 7); CORRADE_COMPARE(cube.sizeZ(), 29); }
void GlyphCache::insert(const UnsignedInt glyph, const Vector2i& position, const Range2Di& rectangle) { const std::pair<Vector2i, Range2Di> glyphData = {position-_padding, rectangle.padded(_padding)}; /* Overwriting "Not Found" glyph */ if(glyph == 0) glyphs[0] = glyphData; /* Inserting new glyph */ else CORRADE_INTERNAL_ASSERT_OUTPUT(glyphs.insert({glyph, glyphData}).second); }
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)); }
void AbstractFramebuffer::readImplementationRobustness(const Range2Di& rectangle, const ColorFormat format, const ColorType type, const std::size_t dataSize, GLvoid* const data) { #ifndef MAGNUM_TARGET_GLES glReadnPixelsARB(rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY(), GLenum(format), GLenum(type), dataSize, data); #elif !defined(CORRADE_TARGET_NACL) glReadnPixelsEXT(rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY(), GLenum(format), GLenum(type), dataSize, data); #else static_cast<void>(rectangle); static_cast<void>(format); static_cast<void>(type); static_cast<void>(dataSize); static_cast<void>(data); CORRADE_ASSERT_UNREACHABLE(); #endif }
void AbstractFramebuffer::readImplementationDefault(const Range2Di& rectangle, const ColorFormat format, const ColorType type, const std::size_t, GLvoid* const data) { glReadPixels(rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY(), GLenum(format), GLenum(type), data); }
void AbstractFramebuffer::invalidateImplementationDSA(const GLsizei count, const GLenum* const attachments, const Range2Di& rectangle) { glInvalidateNamedFramebufferSubData(_id, count, attachments, rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY()); }
void AbstractFramebuffer::invalidateImplementationDefault(const GLsizei count, const GLenum* const attachments, const Range2Di& rectangle) { glInvalidateSubFramebuffer(GLenum(bindInternal()), count, attachments, rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY()); }
void AbstractFramebuffer::blitImplementationDSA(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, const FramebufferBlitMask mask, const FramebufferBlitFilter filter) { glBlitNamedFramebuffer(source._id, destination._id, sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter)); }
void AbstractFramebuffer::blitImplementationDefault(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, const FramebufferBlitMask mask, const FramebufferBlitFilter filter) { source.bindInternal(FramebufferTarget::Read); destination.bindInternal(FramebufferTarget::Draw); glBlitFramebuffer(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter)); }