From 876573fc6ce6926b0cccaa3e6225a807fb383cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 16 Feb 2017 20:45:53 +0100 Subject: [PATCH] Added {Compressed,}BufferImage::release(). To mirror the API in other Image classes. --- src/Magnum/BufferImage.cpp | 12 +++++++++++ src/Magnum/BufferImage.h | 30 +++++++++++++++++++++++++-- src/Magnum/Test/BufferImageGLTest.cpp | 28 ++++++++++++++++++++++++- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/Magnum/BufferImage.cpp b/src/Magnum/BufferImage.cpp index 24f801863..69a2266cb 100644 --- a/src/Magnum/BufferImage.cpp +++ b/src/Magnum/BufferImage.cpp @@ -89,6 +89,18 @@ template void CompressedBufferImage::setData _dataSize = data.size(); } +template Buffer BufferImage::release() { + _size = {}; + _dataSize = {}; + return std::move(_buffer); +} + +template Buffer CompressedBufferImage::release() { + _size = {}; + _dataSize = {}; + return std::move(_buffer); +} + #ifndef DOXYGEN_GENERATING_OUTPUT template class MAGNUM_EXPORT BufferImage<1>; template class MAGNUM_EXPORT BufferImage<2>; diff --git a/src/Magnum/BufferImage.h b/src/Magnum/BufferImage.h index 8d63773be..f292b6f8e 100644 --- a/src/Magnum/BufferImage.h +++ b/src/Magnum/BufferImage.h @@ -152,7 +152,11 @@ template class BufferImage { /** @brief Currently allocated data size */ std::size_t dataSize() const { return _dataSize; } - /** @brief Image buffer */ + /** + * @brief Image buffer + * + * @see @ref release() + */ Buffer& buffer() { return _buffer; } /** @@ -202,6 +206,15 @@ template class BufferImage { #endif #endif + /** + * @brief Release the image buffer + * + * Releases the ownership of the image buffer and resets internal state + * to default. + * @see @ref buffer() + */ + Buffer release(); + private: PixelStorage _storage; PixelFormat _format; @@ -338,7 +351,11 @@ template class CompressedBufferImage { } #endif - /** @brief Image buffer */ + /** + * @brief Image buffer + * + * @see @ref release() + */ Buffer& buffer() { return _buffer; } /** @brief Raw data size */ @@ -377,6 +394,15 @@ template class CompressedBufferImage { */ void setData(CompressedPixelFormat format, const VectorTypeFor& size, Containers::ArrayView data, BufferUsage usage); + /** + * @brief Release the image buffer + * + * Releases the ownership of the image buffer and resets internal state + * to default. + * @see @ref buffer() + */ + Buffer release(); + private: #ifndef MAGNUM_TARGET_GLES CompressedPixelStorage _storage; diff --git a/src/Magnum/Test/BufferImageGLTest.cpp b/src/Magnum/Test/BufferImageGLTest.cpp index 8052ce834..c7644ac40 100644 --- a/src/Magnum/Test/BufferImageGLTest.cpp +++ b/src/Magnum/Test/BufferImageGLTest.cpp @@ -43,6 +43,9 @@ struct BufferImageGLTest: OpenGLTester { void setData(); void setDataCompressed(); + + void release(); + void releaseCompressed(); }; BufferImageGLTest::BufferImageGLTest() { @@ -54,7 +57,10 @@ BufferImageGLTest::BufferImageGLTest() { &BufferImageGLTest::constructMoveCompressed, &BufferImageGLTest::setData, - &BufferImageGLTest::setDataCompressed}); + &BufferImageGLTest::setDataCompressed, + + &BufferImageGLTest::release, + &BufferImageGLTest::releaseCompressed}); } void BufferImageGLTest::construct() { @@ -261,6 +267,26 @@ void BufferImageGLTest::setDataCompressed() { #endif } +void BufferImageGLTest::release() { + BufferImage2D a{PixelFormat::RGBA, PixelType::UnsignedByte}; + const UnsignedInt id = a.buffer().id(); + + CORRADE_VERIFY(a.buffer().id()); + Buffer b = a.release(); + CORRADE_VERIFY(!a.buffer().id()); + CORRADE_COMPARE(b.id(), id); +} + +void BufferImageGLTest::releaseCompressed() { + CompressedBufferImage2D a; + const UnsignedInt id = a.buffer().id(); + + CORRADE_VERIFY(a.buffer().id()); + Buffer b = a.release(); + CORRADE_VERIFY(!a.buffer().id()); + CORRADE_COMPARE(b.id(), id); +} + }} CORRADE_TEST_MAIN(Magnum::Test::BufferImageGLTest)