Browse Source

Added *Image::dataSize().

Will be used to compute size of data array needed to store image of
given size.
pull/51/head
Vladimír Vondruš 13 years ago
parent
commit
73cb557291
  1. 15
      src/AbstractImage.cpp
  2. 2
      src/AbstractImage.h
  3. 5
      src/BufferImage.h
  4. 11
      src/Image.h
  5. 5
      src/ImageReference.h
  6. 14
      src/Test/AbstractImageTest.cpp
  7. 5
      src/Trade/ImageData.h

15
src/AbstractImage.cpp

@ -26,6 +26,7 @@
#include <Utility/Assert.h>
#include "Math/Vector.h"
#include "ColorFormat.h"
namespace Magnum {
@ -135,4 +136,18 @@ std::size_t AbstractImage::pixelSize(ColorFormat format, ColorType type) {
CORRADE_ASSERT_UNREACHABLE();
}
template<UnsignedInt dimensions> std::size_t AbstractImage::dataSize(Math::Vector<dimensions, Int> size) const {
/** @todo Code this properly when all @fn_gl{PixelStore} parameters are implemented */
/* Row size, rounded to multiple of 4 bytes */
const std::size_t rowSize = ((size[0]*pixelSize() + 3)/4)*4;
/** @todo Can't this be done somewhat nicer? */
size[0] = 1;
return rowSize*size.product();
}
template std::size_t AbstractImage::dataSize<1>(Math::Vector<1, Int>) const;
template std::size_t AbstractImage::dataSize<2>(Math::Vector<2, Int>) const;
template std::size_t AbstractImage::dataSize<3>(Math::Vector<3, Int>) const;
}

2
src/AbstractImage.h

@ -79,6 +79,8 @@ class MAGNUM_EXPORT AbstractImage {
~AbstractImage() = default;
template<UnsignedInt dimensions> std::size_t dataSize(Math::Vector<dimensions, Int> size) const;
#ifdef DOXYGEN_GENERATING_OUTPUT
private:
#else

5
src/BufferImage.h

@ -88,6 +88,11 @@ template<UnsignedInt dimensions> class MAGNUM_EXPORT BufferImage: public Abstrac
/** @brief %Image size */
typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; }
/** @copydoc Image::dataSize() */
std::size_t dataSize(const typename DimensionTraits<Dimensions, Int>::VectorType& size) const {
return AbstractImage::dataSize<dimensions>(size);
}
/** @brief %Image buffer */
Buffer& buffer() { return _buffer; }

11
src/Image.h

@ -96,6 +96,17 @@ template<UnsignedInt dimensions> class Image: public AbstractImage {
/** @brief %Image size */
typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; }
/**
* @brief Size of data required to store image of given size
*
* Takes color format, type and row alignment of this image into
* account.
* @see @ref pixelSize()
*/
std::size_t dataSize(const typename DimensionTraits<Dimensions, Int>::VectorType& size) const {
return AbstractImage::dataSize<dimensions>(size);
}
/**
* @brief Pointer to raw data
*

5
src/ImageReference.h

@ -76,6 +76,11 @@ template<UnsignedInt dimensions> class ImageReference: public AbstractImage {
/** @brief %Image size */
constexpr typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; }
/** @copydoc Image::dataSize() */
std::size_t dataSize(const typename DimensionTraits<Dimensions, Int>::VectorType& size) const {
return AbstractImage::dataSize<dimensions>(size);
}
/** @brief Pointer to raw data */
constexpr const unsigned char* data() const { return _data; }

14
src/Test/AbstractImageTest.cpp

@ -26,6 +26,7 @@
#include <TestSuite/Tester.h>
#include "AbstractImage.h"
#include "Image.h"
#include "ColorFormat.h"
namespace Magnum { namespace Test {
@ -35,6 +36,7 @@ class AbstractImageTest: public TestSuite::Tester {
explicit AbstractImageTest();
void pixelSize();
void dataSize();
void debugFormat();
void debugType();
@ -42,6 +44,7 @@ class AbstractImageTest: public TestSuite::Tester {
AbstractImageTest::AbstractImageTest() {
addTests({&AbstractImageTest::pixelSize,
&AbstractImageTest::dataSize,
&AbstractImageTest::debugFormat,
&AbstractImageTest::debugType});
@ -54,6 +57,17 @@ void AbstractImageTest::pixelSize() {
CORRADE_COMPARE(AbstractImage::pixelSize(ColorFormat::DepthStencil, ColorType::UnsignedInt248), 4);
}
void AbstractImageTest::dataSize() {
/* Verify that row size is properly rounded */
CORRADE_COMPARE(Image2D(ColorFormat::RGBA, ColorType::UnsignedByte).dataSize({}), 0);
CORRADE_COMPARE(Image2D(ColorFormat::Red, ColorType::UnsignedByte).dataSize({4, 2}), 8);
CORRADE_COMPARE(Image2D(ColorFormat::Red, ColorType::UnsignedByte).dataSize({2, 4}), 16);
CORRADE_COMPARE(Image2D(ColorFormat::RGBA, ColorType::UnsignedByte).dataSize(Vector2i(1)), 4);
CORRADE_COMPARE(Image2D(ColorFormat::RGBA, ColorType::UnsignedShort).dataSize({16, 8}),
4*2*16*8);
}
void AbstractImageTest::debugFormat() {
std::ostringstream o;
Debug(&o) << ColorFormat::RGBA;

5
src/Trade/ImageData.h

@ -86,6 +86,11 @@ template<UnsignedInt dimensions> class ImageData: public AbstractImage {
/** @brief %Image size */
typename DimensionTraits<Dimensions, Int>::VectorType size() const { return _size; }
/** @copydoc Image::dataSize() */
std::size_t dataSize(const typename DimensionTraits<Dimensions, Int>::VectorType& size) const {
return AbstractImage::dataSize<dimensions>(size);
}
/**
* @brief Pointer to raw data
*

Loading…
Cancel
Save