Browse Source

Allow conversion of Image and Trade::ImageData to ImageReference.

pull/278/head
Vladimír Vondruš 13 years ago
parent
commit
fbdd132b71
  1. 15
      src/Image.h
  2. 15
      src/Test/ImageTest.cpp
  3. 15
      src/Trade/ImageData.h
  4. 15
      src/Trade/Test/ImageDataTest.cpp

15
src/Image.h

@ -28,9 +28,7 @@
* @brief Class Magnum::Image, typedef Magnum::Image1D, Magnum::Image2D, Magnum::Image3D * @brief Class Magnum::Image, typedef Magnum::Image1D, Magnum::Image2D, Magnum::Image3D
*/ */
#include "Math/Vector3.h" #include "ImageReference.h"
#include "AbstractImage.h"
#include "DimensionTraits.h"
namespace Magnum { namespace Magnum {
@ -82,6 +80,13 @@ template<UnsignedInt dimensions> class Image: public AbstractImage {
/** @brief Destructor */ /** @brief Destructor */
~Image() { delete[] _data; } ~Image() { delete[] _data; }
/**
* @brief Conversion to reference
*
* @todo GCC 4.8: don't allow this on rvalue-ref
*/
/*implicit*/ operator ImageReference<dimensions>() const;
/** @brief %Image size */ /** @brief %Image size */
typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; } typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; }
@ -127,6 +132,10 @@ template<UnsignedInt dimensions> inline Image<dimensions>& Image<dimensions>::op
return *this; return *this;
} }
template<UnsignedInt dimensions> inline Image<dimensions>::operator ImageReference<dimensions>() const {
return ImageReference<dimensions>(_size, this->format(), this->type(), _data);
}
} }
#endif #endif

15
src/Test/ImageTest.cpp

@ -35,11 +35,13 @@ class ImageTest: public TestSuite::Tester {
void moveConstructor(); void moveConstructor();
void moveAssignment(); void moveAssignment();
void toReference();
}; };
ImageTest::ImageTest() { ImageTest::ImageTest() {
addTests({&ImageTest::moveConstructor, addTests({&ImageTest::moveConstructor,
&ImageTest::moveAssignment}); &ImageTest::moveAssignment,
&ImageTest::toReference});
} }
void ImageTest::moveConstructor() { void ImageTest::moveConstructor() {
@ -67,6 +69,17 @@ void ImageTest::moveAssignment() {
CORRADE_VERIFY(b.data() == data); 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) CORRADE_TEST_MAIN(Magnum::Test::ImageTest)

15
src/Trade/ImageData.h

@ -28,9 +28,7 @@
* @brief Class Magnum::Trade::ImageData * @brief Class Magnum::Trade::ImageData
*/ */
#include "Math/Vector3.h" #include "ImageReference.h"
#include "AbstractImage.h"
#include "DimensionTraits.h"
namespace Magnum { namespace Trade { namespace Magnum { namespace Trade {
@ -72,6 +70,13 @@ template<UnsignedInt dimensions> class ImageData: public AbstractImage {
/** @brief Destructor */ /** @brief Destructor */
~ImageData() { delete[] _data; } ~ImageData() { delete[] _data; }
/**
* @brief Conversion to reference
*
* @todo GCC 4.8: don't allow this on rvalue-ref
*/
/*implicit*/ operator ImageReference<dimensions>() const;
/** @brief %Image size */ /** @brief %Image size */
typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; } typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; }
@ -105,6 +110,10 @@ template<UnsignedInt dimensions> inline ImageData<dimensions>& ImageData<dimensi
return *this; return *this;
} }
template<UnsignedInt dimensions> inline ImageData<dimensions>::operator ImageReference<dimensions>() const {
return ImageReference<dimensions>(_size, this->format(), this->type(), _data);
}
}} }}
#endif #endif

15
src/Trade/Test/ImageDataTest.cpp

@ -35,11 +35,13 @@ class ImageDataTest: public TestSuite::Tester {
void moveConstructor(); void moveConstructor();
void moveAssignment(); void moveAssignment();
void toReference();
}; };
ImageDataTest::ImageDataTest() { ImageDataTest::ImageDataTest() {
addTests({&ImageDataTest::moveConstructor, addTests({&ImageDataTest::moveConstructor,
&ImageDataTest::moveAssignment}); &ImageDataTest::moveAssignment,
&ImageDataTest::toReference});
} }
void ImageDataTest::moveConstructor() { void ImageDataTest::moveConstructor() {
@ -67,6 +69,17 @@ void ImageDataTest::moveAssignment() {
CORRADE_VERIFY(b.data() == data); 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) CORRADE_TEST_MAIN(Magnum::Trade::Test::ImageDataTest)

Loading…
Cancel
Save