Browse Source

Remove lvalue restrictions when converting images to image views.

It is a valid usecase, e.g. when saving a screenshot in an oneliner:

    pngImageConverter->exportToFile(defaultFramebuffer.read(
        defaultFramebuffer.viewport(), {PixelFormat::RGB,
        PixelType::UnsignedByte}), "screenshot.png");
pull/122/merge
Vladimír Vondruš 11 years ago
parent
commit
d2454ba6f3
  1. 40
      src/Magnum/Image.h
  2. 24
      src/Magnum/Test/ImageTest.cpp
  3. 14
      src/Magnum/Trade/ImageData.cpp
  4. 28
      src/Magnum/Trade/ImageData.h
  5. 24
      src/Magnum/Trade/Test/ImageDataTest.cpp

40
src/Magnum/Image.h

@ -107,17 +107,9 @@ template<UnsignedInt dimensions> class Image {
Image<dimensions>& operator=(Image<dimensions>&& other) noexcept;
/** @brief Conversion to view */
/*implicit*/ operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &;
#else
const;
#endif
#ifndef CORRADE_GCC47_COMPATIBILITY
/** @overload */
/*implicit*/ operator ImageView<dimensions>() const && = delete;
#endif
/* Not restricted to const&, because we might want to pass the view to
another function in an oneliner (e.g. saving screenshot) */
/*implicit*/ operator ImageView<dimensions>() const;
/** @brief Storage of pixel data */
PixelStorage storage() const { return _storage; }
@ -304,17 +296,7 @@ template<UnsignedInt dimensions> class CompressedImage {
CompressedImage<dimensions>& operator=(CompressedImage<dimensions>&& other) noexcept;
/** @brief Conversion to view */
/*implicit*/ operator CompressedImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &;
#else
const;
#endif
#ifndef CORRADE_GCC47_COMPATIBILITY
/** @overload */
/*implicit*/ operator CompressedImageView<dimensions>() const && = delete;
#endif
/*implicit*/ operator CompressedImageView<dimensions>() const;
#ifndef MAGNUM_TARGET_GLES
/**
@ -458,22 +440,12 @@ template<UnsignedInt dimensions> inline CompressedImage<dimensions>& CompressedI
return *this;
}
template<UnsignedInt dimensions> inline Image<dimensions>::operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &
#else
const
#endif
template<UnsignedInt dimensions> inline Image<dimensions>::operator ImageView<dimensions>() const
{
return ImageView<dimensions>{_storage, _format, _type, _size, _data};
}
template<UnsignedInt dimensions> inline CompressedImage<dimensions>::operator CompressedImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &
#else
const
#endif
template<UnsignedInt dimensions> inline CompressedImage<dimensions>::operator CompressedImageView<dimensions>() const
{
return CompressedImageView<dimensions>{
#ifndef MAGNUM_TARGET_GLES

24
src/Magnum/Test/ImageTest.cpp

@ -213,18 +213,6 @@ void ImageTest::toView() {
CORRADE_COMPARE(b.type(), PixelType::UnsignedByte);
CORRADE_COMPARE(b.size(), Vector2i(1, 3));
CORRADE_COMPARE(b.data(), data);
CORRADE_VERIFY((std::is_convertible<const Image2D&, ImageView2D>::value));
{
#ifdef CORRADE_GCC47_COMPATIBILITY
CORRADE_EXPECT_FAIL("Rvalue references for *this are not supported in GCC < 4.8.1.");
#endif
#ifdef CORRADE_MSVC2015_COMPATIBILITY
CORRADE_EXPECT_FAIL("std::is_convertible is still buggy in MSVC 2015.");
#endif
CORRADE_VERIFY(!(std::is_convertible<const Image2D, ImageView2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Image2D&&, ImageView2D>::value));
}
}
void ImageTest::toViewCompressed() {
@ -243,18 +231,6 @@ void ImageTest::toViewCompressed() {
CORRADE_COMPARE(b.size(), Vector2i(4, 4));
CORRADE_COMPARE(b.data(), data);
CORRADE_COMPARE(b.data().size(), 8);
CORRADE_VERIFY((std::is_convertible<const CompressedImage2D&, CompressedImageView2D>::value));
{
#ifdef CORRADE_GCC47_COMPATIBILITY
CORRADE_EXPECT_FAIL("Rvalue references for *this are not supported in GCC < 4.8.1.");
#endif
#ifdef CORRADE_MSVC2015_COMPATIBILITY
CORRADE_EXPECT_FAIL("std::is_convertible is still buggy in MSVC 2015.");
#endif
CORRADE_VERIFY(!(std::is_convertible<const CompressedImage2D, CompressedImageView2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const CompressedImage2D&&, CompressedImageView2D>::value));
}
}
void ImageTest::release() {

14
src/Magnum/Trade/ImageData.cpp

@ -68,23 +68,13 @@ template<UnsignedInt dimensions> std::tuple<std::size_t, VectorTypeFor<dimension
return Implementation::imageDataProperties<dimensions>(*this);
}
template<UnsignedInt dimensions> ImageData<dimensions>::operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &
#else
const
#endif
template<UnsignedInt dimensions> ImageData<dimensions>::operator ImageView<dimensions>() const
{
CORRADE_ASSERT(!_compressed, "Trade::ImageData::type(): the image is compressed", (ImageView<dimensions>{_storage, _format, _type, _size}));
return ImageView<dimensions>{_storage, _format, _type, _size, _data};
}
template<UnsignedInt dimensions> ImageData<dimensions>::operator CompressedImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &
#else
const
#endif
template<UnsignedInt dimensions> ImageData<dimensions>::operator CompressedImageView<dimensions>() const
{
#ifndef MAGNUM_TARGET_GLES
CORRADE_ASSERT(_compressed, "Trade::ImageData::type(): the image is not compressed", (CompressedImageView<dimensions>{_compressedStorage, _compressedFormat, _size}));

28
src/Magnum/Trade/ImageData.h

@ -130,17 +130,9 @@ template<UnsignedInt dimensions> class ImageData {
* The image is expected to be uncompressed.
* @see @ref isCompressed()
*/
/*implicit*/ operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &;
#else
const;
#endif
#ifndef CORRADE_GCC47_COMPATIBILITY
/** @overload */
/*implicit*/ operator ImageView<dimensions>() const && = delete;
#endif
/* Not restricted to const&, because we might want to pass the view to
another function in an oneliner (e.g. saving screenshot) */
/*implicit*/ operator ImageView<dimensions>() const;
/**
* @brief Conversion to compressed view
@ -148,17 +140,9 @@ template<UnsignedInt dimensions> class ImageData {
* The image is expected to be compressed.
* @see @ref isCompressed()
*/
/*implicit*/ operator CompressedImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &;
#else
const;
#endif
#ifndef CORRADE_GCC47_COMPATIBILITY
/** @overload */
/*implicit*/ operator CompressedImageView<dimensions>() const && = delete;
#endif
/* Not restricted to const&, because we might want to pass the view to
another function in an oneliner (e.g. saving screenshot) */
/*implicit*/ operator CompressedImageView<dimensions>() const;
/**
* @brief Storage of pixel data

24
src/Magnum/Trade/Test/ImageDataTest.cpp

@ -174,18 +174,6 @@ void ImageDataTest::toView() {
CORRADE_COMPARE(b.type(), PixelType::UnsignedByte);
CORRADE_COMPARE(b.size(), Vector2i(4, 1));
CORRADE_COMPARE(b.data(), data);
CORRADE_VERIFY((std::is_convertible<const Trade::ImageData2D&, ImageView2D>::value));
{
#ifdef CORRADE_GCC47_COMPATIBILITY
CORRADE_EXPECT_FAIL("Rvalue references for *this are not supported in GCC < 4.8.1.");
#endif
#ifdef CORRADE_MSVC2015_COMPATIBILITY
CORRADE_EXPECT_FAIL("std::is_convertible is still buggy in MSVC 2015.");
#endif
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D, ImageView2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D&&, ImageView2D>::value));
}
}
void ImageDataTest::toViewCompressed() {
@ -197,18 +185,6 @@ void ImageDataTest::toViewCompressed() {
CORRADE_COMPARE(b.size(), Vector2i(4, 4));
CORRADE_COMPARE(b.data(), data);
CORRADE_COMPARE(b.data().size(), 8);
CORRADE_VERIFY((std::is_convertible<const Trade::ImageData2D&, CompressedImageView2D>::value));
{
#ifdef CORRADE_GCC47_COMPATIBILITY
CORRADE_EXPECT_FAIL("Rvalue references for *this are not supported in GCC < 4.8.1.");
#endif
#ifdef CORRADE_MSVC2015_COMPATIBILITY
CORRADE_EXPECT_FAIL("std::is_convertible is still buggy in MSVC 2015.");
#endif
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D, CompressedImageView2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D&&, CompressedImageView2D>::value));
}
}
void ImageDataTest::release() {

Loading…
Cancel
Save