From fbdd132b71e580e63714050044cb8058cec368a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 30 Jun 2013 19:44:28 +0200 Subject: [PATCH] Allow conversion of Image and Trade::ImageData to ImageReference. --- src/Image.h | 15 ++++++++++++--- src/Test/ImageTest.cpp | 15 ++++++++++++++- src/Trade/ImageData.h | 15 ++++++++++++--- src/Trade/Test/ImageDataTest.cpp | 15 ++++++++++++++- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/Image.h b/src/Image.h index 42efbb6ee..cc06f228e 100644 --- a/src/Image.h +++ b/src/Image.h @@ -28,9 +28,7 @@ * @brief Class Magnum::Image, typedef Magnum::Image1D, Magnum::Image2D, Magnum::Image3D */ -#include "Math/Vector3.h" -#include "AbstractImage.h" -#include "DimensionTraits.h" +#include "ImageReference.h" namespace Magnum { @@ -82,6 +80,13 @@ template class Image: public AbstractImage { /** @brief Destructor */ ~Image() { delete[] _data; } + /** + * @brief Conversion to reference + * + * @todo GCC 4.8: don't allow this on rvalue-ref + */ + /*implicit*/ operator ImageReference() const; + /** @brief %Image size */ typename DimensionTraits::VectorType size() const { return _size; } @@ -127,6 +132,10 @@ template inline Image& Image::op return *this; } +template inline Image::operator ImageReference() const { + return ImageReference(_size, this->format(), this->type(), _data); +} + } #endif diff --git a/src/Test/ImageTest.cpp b/src/Test/ImageTest.cpp index 70097e1f3..fbf690f7c 100644 --- a/src/Test/ImageTest.cpp +++ b/src/Test/ImageTest.cpp @@ -35,11 +35,13 @@ class ImageTest: public TestSuite::Tester { void moveConstructor(); void moveAssignment(); + void toReference(); }; ImageTest::ImageTest() { addTests({&ImageTest::moveConstructor, - &ImageTest::moveAssignment}); + &ImageTest::moveAssignment, + &ImageTest::toReference}); } void ImageTest::moveConstructor() { @@ -67,6 +69,17 @@ void ImageTest::moveAssignment() { CORRADE_VERIFY(b.data() == data); } +void ImageTest::toReference() { + unsigned char* data = new unsigned char[3]; + Image2D a({1, 3}, ImageFormat::Red, ImageType::UnsignedByte, data); + + ImageReference2D b = a; + CORRADE_COMPARE(b.format(), ImageFormat::Red); + CORRADE_COMPARE(b.type(), ImageType::UnsignedByte); + CORRADE_COMPARE(b.size(), Vector2i(1, 3)); + CORRADE_VERIFY(b.data() == data); +} + }} CORRADE_TEST_MAIN(Magnum::Test::ImageTest) diff --git a/src/Trade/ImageData.h b/src/Trade/ImageData.h index f0eec7c30..dd1e2f2a3 100644 --- a/src/Trade/ImageData.h +++ b/src/Trade/ImageData.h @@ -28,9 +28,7 @@ * @brief Class Magnum::Trade::ImageData */ -#include "Math/Vector3.h" -#include "AbstractImage.h" -#include "DimensionTraits.h" +#include "ImageReference.h" namespace Magnum { namespace Trade { @@ -72,6 +70,13 @@ template class ImageData: public AbstractImage { /** @brief Destructor */ ~ImageData() { delete[] _data; } + /** + * @brief Conversion to reference + * + * @todo GCC 4.8: don't allow this on rvalue-ref + */ + /*implicit*/ operator ImageReference() const; + /** @brief %Image size */ typename DimensionTraits::VectorType size() const { return _size; } @@ -105,6 +110,10 @@ template inline ImageData& ImageData inline ImageData::operator ImageReference() const { + return ImageReference(_size, this->format(), this->type(), _data); +} + }} #endif diff --git a/src/Trade/Test/ImageDataTest.cpp b/src/Trade/Test/ImageDataTest.cpp index 6a5c300dc..b2d428a9e 100644 --- a/src/Trade/Test/ImageDataTest.cpp +++ b/src/Trade/Test/ImageDataTest.cpp @@ -35,11 +35,13 @@ class ImageDataTest: public TestSuite::Tester { void moveConstructor(); void moveAssignment(); + void toReference(); }; ImageDataTest::ImageDataTest() { addTests({&ImageDataTest::moveConstructor, - &ImageDataTest::moveAssignment}); + &ImageDataTest::moveAssignment, + &ImageDataTest::toReference}); } void ImageDataTest::moveConstructor() { @@ -67,6 +69,17 @@ void ImageDataTest::moveAssignment() { CORRADE_VERIFY(b.data() == data); } +void ImageDataTest::toReference() { + unsigned char* data = new unsigned char[3]; + Trade::ImageData2D a({1, 3}, ImageFormat::Red, ImageType::UnsignedByte, data); + + ImageReference2D b = a; + CORRADE_COMPARE(b.format(), ImageFormat::Red); + CORRADE_COMPARE(b.type(), ImageType::UnsignedByte); + CORRADE_COMPARE(b.size(), Vector2i(1, 3)); + CORRADE_COMPARE(b.data(), data); +} + }}} CORRADE_TEST_MAIN(Magnum::Trade::Test::ImageDataTest)