Browse Source

Compressed image support, part 2: renamed ImageReference to ImageView.

With pixel pack/unpack support it will be possible to create views onto
sub-images, renamed the class to reflect that.

The old Magnum/ImageReference.h and ImageReference types are now aliases
to ImageView.h and ImageView types, are marked as deprecated and will be
removed in future release.
pull/107/head
Vladimír Vondruš 11 years ago
parent
commit
a808c3c7fb
  1. 2
      src/Magnum/AbstractImage.h
  2. 24
      src/Magnum/AbstractTexture.cpp
  3. 14
      src/Magnum/AbstractTexture.h
  4. 2
      src/Magnum/BufferImage.h
  5. 7
      src/Magnum/CMakeLists.txt
  6. 4
      src/Magnum/ColorFormat.h
  7. 4
      src/Magnum/CubeMapTexture.cpp
  8. 8
      src/Magnum/CubeMapTexture.h
  9. 4
      src/Magnum/CubeMapTextureArray.h
  10. 14
      src/Magnum/Image.h
  11. 119
      src/Magnum/ImageReference.h
  12. 134
      src/Magnum/ImageView.h
  13. 19
      src/Magnum/Magnum.h
  14. 4
      src/Magnum/RectangleTexture.h
  15. 2
      src/Magnum/Test/CMakeLists.txt
  16. 14
      src/Magnum/Test/CubeMapTextureArrayGLTest.cpp
  17. 26
      src/Magnum/Test/CubeMapTextureGLTest.cpp
  18. 8
      src/Magnum/Test/ImageTest.cpp
  19. 22
      src/Magnum/Test/ImageViewTest.cpp
  20. 12
      src/Magnum/Test/RectangleTextureGLTest.cpp
  21. 28
      src/Magnum/Test/TextureArrayGLTest.cpp
  22. 42
      src/Magnum/Test/TextureGLTest.cpp
  23. 6
      src/Magnum/Text/DistanceFieldGlyphCache.cpp
  24. 4
      src/Magnum/Text/DistanceFieldGlyphCache.h
  25. 2
      src/Magnum/Text/GlyphCache.cpp
  26. 2
      src/Magnum/Text/GlyphCache.h
  27. 8
      src/Magnum/Texture.h
  28. 6
      src/Magnum/TextureArray.h
  29. 12
      src/Magnum/Trade/AbstractImageConverter.cpp
  30. 12
      src/Magnum/Trade/AbstractImageConverter.h
  31. 14
      src/Magnum/Trade/ImageData.h
  32. 6
      src/Magnum/Trade/Test/AbstractImageConverterTest.cpp
  33. 8
      src/Magnum/Trade/Test/ImageDataTest.cpp
  34. 6
      src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp
  35. 2
      src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp
  36. 2
      src/MagnumPlugins/TgaImageConverter/TgaImageConverter.h

2
src/Magnum/AbstractImage.h

@ -45,7 +45,7 @@ namespace Implementation {
/**
@brief Non-templated base for one-, two- or three-dimensional images
See @ref Image, @ref ImageReference, @ref BufferImage and @ref Trade::ImageData
See @ref Image, @ref ImageView, @ref BufferImage and @ref Trade::ImageData
documentation for more information.
@todo Where to put glClampColor() and glPixelStore() encapsulation? It is
needed in AbstractFramebuffer::read(), Texture::setImage() etc (i.e. all

24
src/Magnum/AbstractTexture.cpp

@ -1015,7 +1015,7 @@ void AbstractTexture::storageImplementationFallback(const GLsizei levels, const
for(GLsizei level = 0; level != levels; ++level)
DataHelper<1>::setImage(*this, level, internalFormat,
ImageReference1D{format, type, Math::max(Math::Vector<1, GLsizei>(1), size >> level)});
ImageView1D{format, type, Math::max(Math::Vector<1, GLsizei>(1), size >> level)});
}
void AbstractTexture::storageImplementationDefault(GLsizei levels, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size) {
@ -1047,7 +1047,7 @@ void AbstractTexture::storageImplementationFallback(const GLsizei levels, const
{
for(GLsizei level = 0; level != levels; ++level)
DataHelper<2>::setImage(*this, level, internalFormat,
ImageReference2D{format, type, Math::max(Vector2i(1), size >> level)});
ImageView2D{format, type, Math::max(Vector2i(1), size >> level)});
/* Cube map additionally needs to specify all faces */
} else if(_target == GL_TEXTURE_CUBE_MAP) {
@ -1059,7 +1059,7 @@ void AbstractTexture::storageImplementationFallback(const GLsizei levels, const
GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z})
DataHelper<2>::setImage(*this, face, level, internalFormat,
ImageReference2D{format, type, Math::max(Vector2i(1), size >> level)});
ImageView2D{format, type, Math::max(Vector2i(1), size >> level)});
}
#ifndef MAGNUM_TARGET_GLES
@ -1067,7 +1067,7 @@ void AbstractTexture::storageImplementationFallback(const GLsizei levels, const
} else if(_target == GL_TEXTURE_1D_ARRAY) {
for(GLsizei level = 0; level != levels; ++level)
DataHelper<2>::setImage(*this, level, internalFormat,
ImageReference2D{format, type, Vector2i{Math::max(1, size.x() >> level), size.y()}});
ImageView2D{format, type, Vector2i{Math::max(1, size.x() >> level), size.y()}});
#endif
/* No other targets are available */
@ -1115,7 +1115,7 @@ void AbstractTexture::storageImplementationFallback(GLsizei levels, TextureForma
#endif
for(GLsizei level = 0; level != levels; ++level)
DataHelper<3>::setImage(*this, level, internalFormat,
ImageReference3D{format, type, Math::max(Vector3i(1), size >> level)});
ImageView3D{format, type, Math::max(Vector3i(1), size >> level)});
#ifndef MAGNUM_TARGET_GLES2
/* Array texture is not scaled in "layer" dimension */
@ -1126,7 +1126,7 @@ void AbstractTexture::storageImplementationFallback(GLsizei levels, TextureForma
#endif
for(GLsizei level = 0; level != levels; ++level)
DataHelper<3>::setImage(*this, level, internalFormat,
ImageReference3D{format, type, Vector3i{Math::max(Vector2i{1}, size.xy() >> level), size.z()}});
ImageView3D{format, type, Vector3i{Math::max(Vector2i{1}, size.xy() >> level), size.z()}});
#endif
/* No other targets are available */
@ -1439,7 +1439,7 @@ void AbstractTexture::DataHelper<3>::setStorageMultisample(AbstractTexture& text
#endif
#ifndef MAGNUM_TARGET_GLES
void AbstractTexture::DataHelper<1>::setImage(AbstractTexture& texture, const GLint level, const TextureFormat internalFormat, const ImageReference1D& image) {
void AbstractTexture::DataHelper<1>::setImage(AbstractTexture& texture, const GLint level, const TextureFormat internalFormat, const ImageView1D& image) {
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
texture.bindInternal();
glTexImage1D(texture._target, level, GLint(internalFormat), image.size()[0], 0, GLenum(image.format()), GLenum(image.type()), image.data());
@ -1451,7 +1451,7 @@ void AbstractTexture::DataHelper<1>::setImage(AbstractTexture& texture, const GL
glTexImage1D(texture._target, level, GLint(internalFormat), image.size()[0], 0, GLenum(image.format()), GLenum(image.type()), nullptr);
}
void AbstractTexture::DataHelper<1>::setSubImage(AbstractTexture& texture, const GLint level, const Math::Vector<1, GLint>& offset, const ImageReference1D& image) {
void AbstractTexture::DataHelper<1>::setSubImage(AbstractTexture& texture, const GLint level, const Math::Vector<1, GLint>& offset, const ImageView1D& image) {
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
(texture.*Context::current()->state().texture->subImage1DImplementation)(level, offset, image.size(), image.format(), image.type(), image.data());
}
@ -1462,7 +1462,7 @@ void AbstractTexture::DataHelper<1>::setSubImage(AbstractTexture& texture, const
}
#endif
void AbstractTexture::DataHelper<2>::setImage(AbstractTexture& texture, const GLenum target, const GLint level, const TextureFormat internalFormat, const ImageReference2D& image) {
void AbstractTexture::DataHelper<2>::setImage(AbstractTexture& texture, const GLenum target, const GLint level, const TextureFormat internalFormat, const ImageView2D& image) {
#ifndef MAGNUM_TARGET_GLES2
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
#endif
@ -1478,7 +1478,7 @@ void AbstractTexture::DataHelper<2>::setImage(AbstractTexture& texture, const GL
}
#endif
void AbstractTexture::DataHelper<2>::setSubImage(AbstractTexture& texture, const GLint level, const Vector2i& offset, const ImageReference2D& image) {
void AbstractTexture::DataHelper<2>::setSubImage(AbstractTexture& texture, const GLint level, const Vector2i& offset, const ImageView2D& image) {
#ifndef MAGNUM_TARGET_GLES2
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
#endif
@ -1493,7 +1493,7 @@ void AbstractTexture::DataHelper<2>::setSubImage(AbstractTexture& texture, const
#endif
#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2))
void AbstractTexture::DataHelper<3>::setImage(AbstractTexture& texture, const GLint level, const TextureFormat internalFormat, const ImageReference3D& image) {
void AbstractTexture::DataHelper<3>::setImage(AbstractTexture& texture, const GLint level, const TextureFormat internalFormat, const ImageView3D& image) {
#ifndef MAGNUM_TARGET_GLES2
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
#endif
@ -1520,7 +1520,7 @@ void AbstractTexture::DataHelper<3>::setImage(AbstractTexture& texture, const GL
#endif
#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2))
void AbstractTexture::DataHelper<3>::setSubImage(AbstractTexture& texture, const GLint level, const Vector3i& offset, const ImageReference3D& image) {
void AbstractTexture::DataHelper<3>::setSubImage(AbstractTexture& texture, const GLint level, const Vector3i& offset, const ImageView3D& image) {
#ifndef MAGNUM_TARGET_GLES2
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
#endif

14
src/Magnum/AbstractTexture.h

@ -575,10 +575,10 @@ template<> struct MAGNUM_EXPORT AbstractTexture::DataHelper<1> {
static void setStorage(AbstractTexture& texture, GLsizei levels, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size);
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, const ImageReference1D& image);
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, const ImageView1D& image);
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, BufferImage1D& image);
static void setSubImage(AbstractTexture& texture, GLint level, const Math::Vector<1, GLint>& offset, const ImageReference1D& image);
static void setSubImage(AbstractTexture& texture, GLint level, const Math::Vector<1, GLint>& offset, const ImageView1D& image);
static void setSubImage(AbstractTexture& texture, GLint level, const Math::Vector<1, GLint>& offset, BufferImage1D& image);
static void invalidateSubImage(AbstractTexture& texture, GLint level, const Math::Vector<1, GLint>& offset, const Math::Vector<1, GLint>& size);
@ -597,10 +597,10 @@ template<> struct MAGNUM_EXPORT AbstractTexture::DataHelper<2> {
static void setStorageMultisample(AbstractTexture& texture, GLsizei samples, TextureFormat internalFormat, const Vector2i& size, GLboolean fixedSampleLocations);
#endif
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, const ImageReference2D& image) {
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, const ImageView2D& image) {
setImage(texture, texture._target, level, internalFormat, image);
}
static void setImage(AbstractTexture& texture, GLenum target, GLint level, TextureFormat internalFormat, const ImageReference2D& image);
static void setImage(AbstractTexture& texture, GLenum target, GLint level, TextureFormat internalFormat, const ImageView2D& image);
#ifndef MAGNUM_TARGET_GLES2
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, BufferImage2D& image) {
setImage(texture, texture._target, level, internalFormat, image);
@ -608,7 +608,7 @@ template<> struct MAGNUM_EXPORT AbstractTexture::DataHelper<2> {
static void setImage(AbstractTexture& texture, GLenum target, GLint level, TextureFormat internalFormat, BufferImage2D& image);
#endif
static void setSubImage(AbstractTexture& texture, GLint level, const Vector2i& offset, const ImageReference2D& image);
static void setSubImage(AbstractTexture& texture, GLint level, const Vector2i& offset, const ImageView2D& image);
#ifndef MAGNUM_TARGET_GLES2
static void setSubImage(AbstractTexture& texture, GLint level, const Vector2i& offset, BufferImage2D& image);
#endif
@ -629,12 +629,12 @@ template<> struct MAGNUM_EXPORT AbstractTexture::DataHelper<3> {
static void setStorageMultisample(AbstractTexture& texture, GLsizei samples, TextureFormat internalFormat, const Vector3i& size, GLboolean fixedSampleLocations);
#endif
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, const ImageReference3D& image);
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, const ImageView3D& image);
#ifndef MAGNUM_TARGET_GLES2
static void setImage(AbstractTexture& texture, GLint level, TextureFormat internalFormat, BufferImage3D& image);
#endif
static void setSubImage(AbstractTexture& texture, GLint level, const Vector3i& offset, const ImageReference3D& image);
static void setSubImage(AbstractTexture& texture, GLint level, const Vector3i& offset, const ImageView3D& image);
#ifndef MAGNUM_TARGET_GLES2
static void setSubImage(AbstractTexture& texture, GLint level, const Vector3i& offset, BufferImage3D& image);
#endif

2
src/Magnum/BufferImage.h

@ -43,7 +43,7 @@ namespace Magnum {
@brief Buffer image
Stores image data in GPU memory. Interchangeable with @ref Image,
@ref ImageReference or @ref Trade::ImageData.
@ref ImageView or @ref Trade::ImageData.
@see @ref BufferImage1D, @ref BufferImage2D, @ref BufferImage3D, @ref Buffer
@requires_gles30 Pixel buffer objects are not available in OpenGL ES 2.0.
@requires_webgl20 Pixel buffer objects are not available in WebGL 1.0.

7
src/Magnum/CMakeLists.txt

@ -95,7 +95,7 @@ set(Magnum_HEADERS
Extensions.h
Framebuffer.h
Image.h
ImageReference.h
ImageView.h
Magnum.h
Mesh.h
MeshView.h
@ -129,6 +129,11 @@ set(Magnum_PRIVATE_HEADERS
Implementation/State.h
Implementation/TextureState.h)
# Deprecated stuff
if(BUILD_DEPRECATED)
list(APPEND Magnum_HEADERS ImageReference.h)
endif()
# Desktop-only stuff
if(NOT TARGET_GLES)
list(APPEND Magnum_SRCS RectangleTexture.cpp)

4
src/Magnum/ColorFormat.h

@ -50,7 +50,7 @@ In most cases you may want to use @ref ColorFormat::Red (for grayscale images),
See documentation of these values for possible limitations when using OpenGL ES
2.0 or WebGL.
@see @ref Image, @ref ImageReference, @ref BufferImage, @ref Trade::ImageData
@see @ref Image, @ref ImageView, @ref BufferImage, @ref Trade::ImageData
*/
enum class ColorFormat: GLenum {
#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2))
@ -310,7 +310,7 @@ In most cases you may want to use @ref ColorType::UnsignedByte along with
See documentation of these values for possible limitations when using OpenGL ES
2.0 or WebGL.
@see @ref Image, @ref ImageReference, @ref BufferImage, @ref Trade::ImageData
@see @ref Image, @ref ImageView, @ref BufferImage, @ref Trade::ImageData
*/
enum class ColorType: GLenum {
/** Each component unsigned byte. */

4
src/Magnum/CubeMapTexture.cpp

@ -124,7 +124,7 @@ BufferImage3D CubeMapTexture::subImage(const Int level, const Range3Di& range, B
return std::move(image);
}
CubeMapTexture& CubeMapTexture::setSubImage(const Int level, const Vector3i& offset, const ImageReference3D& image) {
CubeMapTexture& CubeMapTexture::setSubImage(const Int level, const Vector3i& offset, const ImageView3D& image) {
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
glTextureSubImage3D(_id, level, offset.x(), offset.y(), offset.z(), image.size().x(), image.size().y(), image.size().z(), GLenum(image.format()), GLenum(image.type()), image.data());
return *this;
@ -137,7 +137,7 @@ CubeMapTexture& CubeMapTexture::setSubImage(const Int level, const Vector3i& off
}
#endif
CubeMapTexture& CubeMapTexture::setSubImage(const Coordinate coordinate, const Int level, const Vector2i& offset, const ImageReference2D& image) {
CubeMapTexture& CubeMapTexture::setSubImage(const Coordinate coordinate, const Int level, const Vector2i& offset, const ImageView2D& image) {
#ifndef MAGNUM_TARGET_GLES2
Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack);
#endif

8
src/Magnum/CubeMapTexture.h

@ -588,7 +588,7 @@ class MAGNUM_EXPORT CubeMapTexture: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage()
* instead.
*/
CubeMapTexture& setImage(Coordinate coordinate, Int level, TextureFormat internalFormat, const ImageReference2D& image) {
CubeMapTexture& setImage(Coordinate coordinate, Int level, TextureFormat internalFormat, const ImageView2D& image) {
DataHelper<2>::setImage(*this, GLenum(coordinate), level, internalFormat, image);
return *this;
}
@ -625,7 +625,7 @@ class MAGNUM_EXPORT CubeMapTexture: public AbstractTexture {
* @brief Set image subdata
* @param level Mip level
* @param offset Offset where to put data in the texture
* @param image @ref Image3D, @ref ImageReference3D or
* @param image @ref Image3D, @ref ImageView3D or
* @ref Trade::ImageData3D
* @return Reference to self (for method chaining)
*
@ -634,7 +634,7 @@ class MAGNUM_EXPORT CubeMapTexture: public AbstractTexture {
* @requires_gl In OpenGL ES and WebGL you need to set image for each
* face separately.
*/
CubeMapTexture& setSubImage(Int level, const Vector3i& offset, const ImageReference3D& image);
CubeMapTexture& setSubImage(Int level, const Vector3i& offset, const ImageView3D& image);
/** @overload
* @requires_gl45 Extension @extension{ARB,direct_state_access}
@ -659,7 +659,7 @@ class MAGNUM_EXPORT CubeMapTexture: public AbstractTexture {
*
* See @ref Texture::setSubImage() for more information.
*/
CubeMapTexture& setSubImage(Coordinate coordinate, Int level, const Vector2i& offset, const ImageReference2D& image);
CubeMapTexture& setSubImage(Coordinate coordinate, Int level, const Vector2i& offset, const ImageView2D& image);
#ifndef MAGNUM_TARGET_GLES2
/** @overload

4
src/Magnum/CubeMapTextureArray.h

@ -472,7 +472,7 @@ class MAGNUM_EXPORT CubeMapTextureArray: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage()
* instead.
*/
CubeMapTextureArray& setImage(Int level, TextureFormat internalFormat, const ImageReference3D& image) {
CubeMapTextureArray& setImage(Int level, TextureFormat internalFormat, const ImageView3D& image) {
DataHelper<3>::setImage(*this, level, internalFormat, image);
return *this;
}
@ -503,7 +503,7 @@ class MAGNUM_EXPORT CubeMapTextureArray: public AbstractTexture {
*
* See @ref Texture::setSubImage() for more information.
*/
CubeMapTextureArray& setSubImage(Int level, const Vector3i& offset, const ImageReference3D& image) {
CubeMapTextureArray& setSubImage(Int level, const Vector3i& offset, const ImageView3D& image) {
DataHelper<3>::setSubImage(*this, level, offset, image);
return *this;
}

14
src/Magnum/Image.h

@ -29,14 +29,14 @@
* @brief Class @ref Magnum::Image, typedef @ref Magnum::Image1D, @ref Magnum::Image2D, @ref Magnum::Image3D
*/
#include "Magnum/ImageReference.h"
#include "Magnum/ImageView.h"
namespace Magnum {
/**
@brief Image
Stores image data on client memory. Interchangeable with @ref ImageReference,
Stores image data on client memory. Interchangeable with @ref ImageView,
@ref BufferImage or @ref Trade::ImageData.
@see @ref Image1D, @ref Image2D, @ref Image3D
*/
@ -83,8 +83,8 @@ template<UnsignedInt dimensions> class Image: public AbstractImage {
/** @brief Destructor */
~Image() { delete[] _data; }
/** @brief Conversion to reference */
/*implicit*/ operator ImageReference<dimensions>()
/** @brief Conversion to view */
/*implicit*/ operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &;
#else
@ -93,7 +93,7 @@ template<UnsignedInt dimensions> class Image: public AbstractImage {
#ifndef CORRADE_GCC47_COMPATIBILITY
/** @overload */
/*implicit*/ operator ImageReference<dimensions>() const && = delete;
/*implicit*/ operator ImageView<dimensions>() const && = delete;
#endif
/** @brief Format of pixel data */
@ -186,14 +186,14 @@ template<UnsignedInt dimensions> inline Image<dimensions>& Image<dimensions>::op
return *this;
}
template<UnsignedInt dimensions> inline Image<dimensions>::operator ImageReference<dimensions>()
template<UnsignedInt dimensions> inline Image<dimensions>::operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &
#else
const
#endif
{
return ImageReference<dimensions>{_format, _type, _size, _data};
return ImageView<dimensions>{_format, _type, _size, _data};
}
template<UnsignedInt dimensions> inline char* Image<dimensions>::release() {

119
src/Magnum/ImageReference.h

@ -26,109 +26,40 @@
*/
/** @file
* @brief Class @ref Magnum::ImageReference, typedef @ref Magnum::ImageReference1D, @ref Magnum::ImageReference2D, @ref Magnum::ImageReference3D
* @deprecated Use @ref Magnum/ImageView.h instead.
*/
#include "Magnum/Math/Vector3.h"
#include "Magnum/AbstractImage.h"
#include "Magnum/DimensionTraits.h"
#include "Magnum/configure.h"
namespace Magnum {
/**
@brief Image reference
Adds information about dimensions, color components and component type to some
data in memory.
Unlike @ref Image, this class doesn't delete the data on destruction, so it is
targeted for wrapping data which are either stored in stack/constant memory
(and shouldn't be deleted) or they are managed by someone else and have the
same properties for each frame, such as video stream. Thus it is not possible
to change image properties, only data pointer.
Interchangeable with @ref Image, @ref BufferImage or @ref Trade::ImageData.
@see @ref ImageReference1D, @ref ImageReference2D, @ref ImageReference3D
*/
template<UnsignedInt dimensions> class ImageReference: public AbstractImage {
public:
enum: UnsignedInt {
Dimensions = dimensions /**< Image dimension count */
};
/**
* @brief Constructor
* @param format Format of pixel data
* @param type Data type of pixel data
* @param size Image size
* @param data Image data
*/
constexpr explicit ImageReference(ColorFormat format, ColorType type, const VectorTypeFor<dimensions, Int>& size, const void* data): _format{format}, _type{type}, _size{size}, _data{reinterpret_cast<const char*>(data)} {}
/**
* @brief Constructor
* @param format Format of pixel data
* @param type Data type of pixel data
* @param size Image size
*
* Data pointer is set to `nullptr`, call @ref setData() to fill the
* image with data.
*/
constexpr explicit ImageReference(ColorFormat format, ColorType type, const VectorTypeFor<dimensions, Int>& size): _format{format}, _type{type}, _size{size}, _data{nullptr} {}
/** @brief Format of pixel data */
ColorFormat format() const { return _format; }
/** @brief Data type of pixel data */
ColorType type() const { return _type; }
/** @brief Pixel size (in bytes) */
std::size_t pixelSize() const { return Implementation::imagePixelSize(_format, _type); }
#ifdef MAGNUM_BUILD_DEPRECATED
#include "Magnum/ImageView.h"
CORRADE_DEPRECATED_FILE("use Magnum/ImageView.h instead")
/** @brief Image size */
constexpr VectorTypeFor<dimensions, Int> size() const { return _size; }
/** @copydoc Image::dataSize() */
std::size_t dataSize(const VectorTypeFor<dimensions, Int>& size) const {
return Implementation::imageDataSize<dimensions>(*this, _format, _type, size);
}
/** @brief Pointer to raw data */
constexpr const char* data() const { return _data; }
/** @overload */
template<class T = char> const T* data() const {
return reinterpret_cast<const T*>(_data);
}
/**
* @brief Set image data
* @param data Image data
*
* Dimensions, color compnents and data type remains the same as
* passed in constructor. The data are not copied nor deleted on
* destruction.
*/
void setData(const void* data) {
_data = reinterpret_cast<const char*>(data);
}
namespace Magnum {
private:
ColorFormat _format;
ColorType _type;
Math::Vector<Dimensions, Int> _size;
const char* _data;
};
/** @copybrief ImageView
* @deprecated Use @ref ImageView instead.
*/
template<UnsignedInt dimensions> using CORRADE_DEPRECATED("use ImageView instead") ImageReference = ImageView<dimensions>;
/** @brief One-dimensional image wrapper */
typedef ImageReference<1> ImageReference1D;
/** @copybrief ImageView1D
* @deprecated Use @ref ImageView1D instead.
*/
typedef CORRADE_DEPRECATED("use ImageView1D instead") ImageView1D ImageReference1D;
/** @brief Two-dimensional image wrapper */
typedef ImageReference<2> ImageReference2D;
/** @copybrief ImageView2D
* @deprecated Use @ref ImageView2D instead.
*/
typedef CORRADE_DEPRECATED("use ImageView2D instead") ImageView2D ImageReference2D;
/** @brief Three-dimensional image wrapper */
typedef ImageReference<3> ImageReference3D;
/** @copybrief ImageView3D
* @deprecated Use @ref ImageView3D instead.
*/
typedef CORRADE_DEPRECATED("use ImageView3D instead") ImageView3D ImageReference3D;
}
#else
#error use Magnum/ImageView.h instead
#endif
#endif

134
src/Magnum/ImageView.h

@ -0,0 +1,134 @@
#ifndef Magnum_ImageView_h
#define Magnum_ImageView_h
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015
Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
/** @file
* @brief Class @ref Magnum::ImageView, typedef @ref Magnum::ImageView1D, @ref Magnum::ImageView2D, @ref Magnum::ImageView3D
*/
#include "Magnum/Math/Vector3.h"
#include "Magnum/AbstractImage.h"
#include "Magnum/DimensionTraits.h"
namespace Magnum {
/**
@brief Image view
Adds information about dimensions, color components and component type to some
data in memory.
Unlike @ref Image, this class doesn't delete the data on destruction, so it is
targeted for wrapping data which are either stored in stack/constant memory
(and shouldn't be deleted) or they are managed by someone else and have the
same properties for each frame, such as video stream. Thus it is not possible
to change image properties, only data pointer.
Interchangeable with @ref Image, @ref BufferImage or @ref Trade::ImageData.
@see @ref ImageView1D, @ref ImageView2D, @ref ImageView3D
*/
template<UnsignedInt dimensions> class ImageView: public AbstractImage {
public:
enum: UnsignedInt {
Dimensions = dimensions /**< Image dimension count */
};
/**
* @brief Constructor
* @param format Format of pixel data
* @param type Data type of pixel data
* @param size Image size
* @param data Image data
*/
constexpr explicit ImageView(ColorFormat format, ColorType type, const VectorTypeFor<dimensions, Int>& size, const void* data): _format{format}, _type{type}, _size{size}, _data{reinterpret_cast<const char*>(data)} {}
/**
* @brief Constructor
* @param format Format of pixel data
* @param type Data type of pixel data
* @param size Image size
*
* Data pointer is set to `nullptr`, call @ref setData() to fill the
* image with data.
*/
constexpr explicit ImageView(ColorFormat format, ColorType type, const VectorTypeFor<dimensions, Int>& size): _format{format}, _type{type}, _size{size}, _data{nullptr} {}
/** @brief Format of pixel data */
ColorFormat format() const { return _format; }
/** @brief Data type of pixel data */
ColorType type() const { return _type; }
/** @brief Pixel size (in bytes) */
std::size_t pixelSize() const { return Implementation::imagePixelSize(_format, _type); }
/** @brief Image size */
constexpr VectorTypeFor<dimensions, Int> size() const { return _size; }
/** @copydoc Image::dataSize() */
std::size_t dataSize(const VectorTypeFor<dimensions, Int>& size) const {
return Implementation::imageDataSize<dimensions>(*this, _format, _type, size);
}
/** @brief Pointer to raw data */
constexpr const char* data() const { return _data; }
/** @overload */
template<class T = char> const T* data() const {
return reinterpret_cast<const T*>(_data);
}
/**
* @brief Set image data
* @param data Image data
*
* Dimensions, color compnents and data type remains the same as
* passed in constructor. The data are not copied nor deleted on
* destruction.
*/
void setData(const void* data) {
_data = reinterpret_cast<const char*>(data);
}
private:
ColorFormat _format;
ColorType _type;
Math::Vector<Dimensions, Int> _size;
const char* _data;
};
/** @brief One-dimensional image view */
typedef ImageView<1> ImageView1D;
/** @brief Two-dimensional image view */
typedef ImageView<2> ImageView2D;
/** @brief Three-dimensional image view */
typedef ImageView<3> ImageView3D;
}
#endif

19
src/Magnum/Magnum.h

@ -34,6 +34,10 @@
#include "Magnum/Types.h"
#include "Magnum/Math/Math.h"
#ifdef MAGNUM_BUILD_DEPRECATED
#include <Corrade/Utility/Macros.h>
#endif
#ifndef DOXYGEN_GENERATING_OUTPUT
typedef unsigned int GLenum; /* Needed for *Format and *Type enums */
#endif
@ -475,10 +479,17 @@ typedef Image<1> Image1D;
typedef Image<2> Image2D;
typedef Image<3> Image3D;
template<UnsignedInt> class ImageReference;
typedef ImageReference<1> ImageReference1D;
typedef ImageReference<2> ImageReference2D;
typedef ImageReference<3> ImageReference3D;
template<UnsignedInt> class ImageView;
typedef ImageView<1> ImageView1D;
typedef ImageView<2> ImageView2D;
typedef ImageView<3> ImageView3D;
#ifdef MAGNUM_BUILD_DEPRECATED
template<UnsignedInt dimensions> using CORRADE_DEPRECATED("use ImageView instead") ImageReference = ImageView<dimensions>;
typedef CORRADE_DEPRECATED("use ImageView1D instead") ImageView1D ImageReference1D;
typedef CORRADE_DEPRECATED("use ImageView2D instead") ImageView2D ImageReference2D;
typedef CORRADE_DEPRECATED("use ImageView3D instead") ImageView3D ImageReference3D;
#endif
enum class MeshPrimitive: GLenum;

4
src/Magnum/RectangleTexture.h

@ -363,7 +363,7 @@ class MAGNUM_EXPORT RectangleTexture: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage()
* instead.
*/
RectangleTexture& setImage(TextureFormat internalFormat, const ImageReference2D& image) {
RectangleTexture& setImage(TextureFormat internalFormat, const ImageView2D& image) {
DataHelper<2>::setImage(*this, 0, internalFormat, image);
return *this;
}
@ -391,7 +391,7 @@ class MAGNUM_EXPORT RectangleTexture: public AbstractTexture {
*
* See @ref Texture::setSubImage() for more information.
*/
RectangleTexture& setSubImage(const Vector2i& offset, const ImageReference2D& image) {
RectangleTexture& setSubImage(const Vector2i& offset, const ImageView2D& image) {
DataHelper<2>::setSubImage(*this, 0, offset, image);
return *this;
}

2
src/Magnum/Test/CMakeLists.txt

@ -33,7 +33,7 @@ corrade_add_test(DebugOutputTest DebugOutputTest.cpp LIBRARIES Magnum)
corrade_add_test(DefaultFramebufferTest DefaultFramebufferTest.cpp LIBRARIES Magnum)
corrade_add_test(FramebufferTest FramebufferTest.cpp LIBRARIES Magnum)
corrade_add_test(ImageTest ImageTest.cpp LIBRARIES Magnum)
corrade_add_test(ImageReferenceTest ImageReferenceTest.cpp LIBRARIES Magnum)
corrade_add_test(ImageViewTest ImageViewTest.cpp LIBRARIES Magnum)
corrade_add_test(MeshTest MeshTest.cpp LIBRARIES Magnum)
corrade_add_test(RendererTest RendererTest.cpp LIBRARIES Magnum)
corrade_add_test(ResourceManagerTest ResourceManagerTest.cpp LIBRARIES Magnum)

14
src/Magnum/Test/CubeMapTextureArrayGLTest.cpp

@ -362,7 +362,7 @@ void CubeMapTextureArrayGLTest::image() {
CubeMapTextureArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, {2, 2, 6}, Data));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, {2, 2, 6}, Data));
MAGNUM_VERIFY_NO_ERROR();
@ -467,9 +467,9 @@ void CubeMapTextureArrayGLTest::subImage() {
CubeMapTextureArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, Zero));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, Zero));
texture.setSubImage(0, Vector3i(1),
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, {2, 2, 4}, SubData));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, {2, 2, 4}, SubData));
MAGNUM_VERIFY_NO_ERROR();
@ -497,7 +497,7 @@ void CubeMapTextureArrayGLTest::subImageBuffer() {
CubeMapTextureArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, Zero));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, Zero));
texture.setSubImage(0, Vector3i(1),
BufferImage3D(ColorFormat::RGBA, ColorType::UnsignedByte, {2, 2, 4}, SubData, BufferUsage::StaticDraw));
@ -524,7 +524,7 @@ void CubeMapTextureArrayGLTest::subImageQuery() {
CubeMapTextureArray texture;
texture.setStorage(1, TextureFormat::RGBA8, {4, 4, 6})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, SubDataComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, SubDataComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -546,7 +546,7 @@ void CubeMapTextureArrayGLTest::subImageQueryBuffer() {
CubeMapTextureArray texture;
texture.setStorage(1, TextureFormat::RGBA8, {4, 4, 6})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, SubDataComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 6}, SubDataComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -573,7 +573,7 @@ void CubeMapTextureArrayGLTest::generateMipmap() {
CubeMapTextureArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, {32, 32, 24}));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, {32, 32, 24}));
CORRADE_COMPARE(texture.imageSize(0), Vector3i(32, 32, 24));
CORRADE_COMPARE(texture.imageSize(1), Vector3i(0));

26
src/Magnum/Test/CubeMapTextureGLTest.cpp

@ -393,7 +393,7 @@ void CubeMapTextureGLTest::imageFull() {
CubeMapTexture texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector2i{2, 2})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{2, 2, 6}, DataFull});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{2, 2, 6}, DataFull});
MAGNUM_VERIFY_NO_ERROR();
@ -437,7 +437,7 @@ namespace {
void CubeMapTextureGLTest::image() {
CubeMapTexture texture;
texture.setImage(CubeMapTexture::Coordinate::PositiveX, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
MAGNUM_VERIFY_NO_ERROR();
@ -488,9 +488,9 @@ namespace {
void CubeMapTextureGLTest::subImage() {
CubeMapTexture texture;
texture.setImage(CubeMapTexture::Coordinate::PositiveX, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
texture.setSubImage(CubeMapTexture::Coordinate::PositiveX, 0, Vector2i(1),
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
MAGNUM_VERIFY_NO_ERROR();
@ -511,7 +511,7 @@ void CubeMapTextureGLTest::subImage() {
void CubeMapTextureGLTest::subImageBuffer() {
CubeMapTexture texture;
texture.setImage(CubeMapTexture::Coordinate::PositiveX, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
texture.setSubImage(CubeMapTexture::Coordinate::PositiveX, 0, Vector2i(1),
BufferImage2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data, BufferUsage::StaticDraw));
@ -540,7 +540,7 @@ void CubeMapTextureGLTest::subImageQuery() {
CubeMapTexture texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector2i{4})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 1}, SubDataComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 1}, SubDataComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -563,7 +563,7 @@ void CubeMapTextureGLTest::subImageQueryBuffer() {
CubeMapTexture texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector2i{4})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 1}, SubDataComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, {4, 4, 1}, SubDataComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -580,17 +580,17 @@ void CubeMapTextureGLTest::subImageQueryBuffer() {
void CubeMapTextureGLTest::generateMipmap() {
CubeMapTexture texture;
texture.setImage(CubeMapTexture::Coordinate::PositiveX, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
texture.setImage(CubeMapTexture::Coordinate::PositiveY, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
texture.setImage(CubeMapTexture::Coordinate::PositiveZ, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
texture.setImage(CubeMapTexture::Coordinate::NegativeX, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
texture.setImage(CubeMapTexture::Coordinate::NegativeY, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
texture.setImage(CubeMapTexture::Coordinate::NegativeZ, 0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
/** @todo How to test this on ES? */
#ifndef MAGNUM_TARGET_GLES

8
src/Magnum/Test/ImageTest.cpp

@ -108,20 +108,20 @@ void ImageTest::setData() {
void ImageTest::toReference() {
auto data = new char[3];
const Image2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data);
ImageReference2D b = a;
ImageView2D b = a;
CORRADE_COMPARE(b.format(), ColorFormat::Red);
CORRADE_COMPARE(b.type(), ColorType::UnsignedByte);
CORRADE_COMPARE(b.size(), Vector2i(1, 3));
CORRADE_COMPARE(b.data(), data);
CORRADE_VERIFY((std::is_convertible<const Image2D&, ImageReference2D>::value));
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
CORRADE_VERIFY(!(std::is_convertible<const Image2D, ImageReference2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Image2D&&, ImageReference2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Image2D, ImageView2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Image2D&&, ImageView2D>::value));
}
}

22
src/Magnum/Test/ImageReferenceTest.cpp → src/Magnum/Test/ImageViewTest.cpp

@ -26,25 +26,25 @@
#include <Corrade/TestSuite/Tester.h>
#include "Magnum/ColorFormat.h"
#include "Magnum/ImageReference.h"
#include "Magnum/ImageView.h"
namespace Magnum { namespace Test {
struct ImageReferenceTest: TestSuite::Tester {
explicit ImageReferenceTest();
struct ImageViewTest: TestSuite::Tester {
explicit ImageViewTest();
void construct();
void setData();
};
ImageReferenceTest::ImageReferenceTest() {
addTests({&ImageReferenceTest::construct,
&ImageReferenceTest::setData});
ImageViewTest::ImageViewTest() {
addTests({&ImageViewTest::construct,
&ImageViewTest::setData});
}
void ImageReferenceTest::construct() {
void ImageViewTest::construct() {
const char data[3] = {};
ImageReference2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data);
ImageView2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data);
CORRADE_COMPARE(a.format(), ColorFormat::Red);
CORRADE_COMPARE(a.type(), ColorType::UnsignedByte);
@ -52,9 +52,9 @@ void ImageReferenceTest::construct() {
CORRADE_COMPARE(a.data(), data);
}
void ImageReferenceTest::setData() {
void ImageViewTest::setData() {
const char data[3] = {};
ImageReference2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data);
ImageView2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data);
const char data2[8] = {};
a.setData(data2);
@ -66,4 +66,4 @@ void ImageReferenceTest::setData() {
}}
CORRADE_TEST_MAIN(Magnum::Test::ImageReferenceTest)
CORRADE_TEST_MAIN(Magnum::Test::ImageViewTest)

12
src/Magnum/Test/RectangleTextureGLTest.cpp

@ -253,7 +253,7 @@ void RectangleTextureGLTest::image() {
RectangleTexture texture;
texture.setImage(TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
MAGNUM_VERIFY_NO_ERROR();
@ -303,9 +303,9 @@ void RectangleTextureGLTest::subImage() {
RectangleTexture texture;
texture.setImage(TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
texture.setSubImage(Vector2i(1),
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data));
MAGNUM_VERIFY_NO_ERROR();
@ -325,7 +325,7 @@ void RectangleTextureGLTest::subImageBuffer() {
RectangleTexture texture;
texture.setImage(TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero));
texture.setSubImage(Vector2i(1),
BufferImage2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data, BufferUsage::StaticDraw));
@ -348,7 +348,7 @@ void RectangleTextureGLTest::subImageQuery() {
RectangleTexture texture;
texture.setStorage(TextureFormat::RGBA8, Vector2i{4})
.setSubImage({}, ImageReference2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubDataComplete});
.setSubImage({}, ImageView2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubDataComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -370,7 +370,7 @@ void RectangleTextureGLTest::subImageQueryBuffer() {
RectangleTexture texture;
texture.setStorage(TextureFormat::RGBA8, Vector2i{4})
.setSubImage({}, ImageReference2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubDataComplete});
.setSubImage({}, ImageView2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubDataComplete});
MAGNUM_VERIFY_NO_ERROR();

28
src/Magnum/Test/TextureArrayGLTest.cpp

@ -651,7 +651,7 @@ void TextureArrayGLTest::image1D() {
Texture1DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data1D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data1D));
MAGNUM_VERIFY_NO_ERROR();
@ -704,7 +704,7 @@ void TextureArrayGLTest::image2D() {
Texture2DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), Data2D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), Data2D));
MAGNUM_VERIFY_NO_ERROR();
@ -766,9 +766,9 @@ void TextureArrayGLTest::subImage1D() {
Texture1DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero1D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero1D));
texture.setSubImage(0, Vector2i(1),
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), SubData1D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), SubData1D));
MAGNUM_VERIFY_NO_ERROR();
@ -788,7 +788,7 @@ void TextureArrayGLTest::subImage1DBuffer() {
Texture1DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero1D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero1D));
texture.setSubImage(0, Vector2i(1),
BufferImage2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), SubData1D, BufferUsage::StaticDraw));
@ -811,7 +811,7 @@ void TextureArrayGLTest::subImage1DQuery() {
Texture1DArray texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector2i{4})
.setSubImage(0, {}, ImageReference2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData1DComplete});
.setSubImage(0, {}, ImageView2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData1DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -832,7 +832,7 @@ void TextureArrayGLTest::subImage1DQueryBuffer() {
Texture1DArray texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector2i{4})
.setSubImage(0, {}, ImageReference2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData1DComplete});
.setSubImage(0, {}, ImageView2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData1DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -887,9 +887,9 @@ void TextureArrayGLTest::subImage2D() {
Texture2DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero2D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero2D));
texture.setSubImage(0, Vector3i(1),
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), SubData2D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), SubData2D));
MAGNUM_VERIFY_NO_ERROR();
@ -913,7 +913,7 @@ void TextureArrayGLTest::subImage2DBuffer() {
Texture2DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero2D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero2D));
texture.setSubImage(0, Vector3i(1),
BufferImage3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), SubData2D, BufferUsage::StaticDraw));
@ -940,7 +940,7 @@ void TextureArrayGLTest::subImage2DQuery() {
Texture2DArray texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector3i{4})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData2DComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData2DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -961,7 +961,7 @@ void TextureArrayGLTest::subImage2DQueryBuffer() {
Texture2DArray texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector3i{4})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData2DComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData2DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -982,7 +982,7 @@ void TextureArrayGLTest::generateMipmap1D() {
Texture1DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
CORRADE_COMPARE(texture.imageSize(0), Vector2i(32));
CORRADE_COMPARE(texture.imageSize(1), Vector2i( 0));
@ -1012,7 +1012,7 @@ void TextureArrayGLTest::generateMipmap2D() {
Texture2DArray texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(32)));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(32)));
/** @todo How to test this on ES? */
#ifndef MAGNUM_TARGET_GLES

42
src/Magnum/Test/TextureGLTest.cpp

@ -883,7 +883,7 @@ namespace {
void TextureGLTest::image1D() {
Texture1D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference1D(ColorFormat::RGBA, ColorType::UnsignedByte, 2, Data1D));
ImageView1D(ColorFormat::RGBA, ColorType::UnsignedByte, 2, Data1D));
MAGNUM_VERIFY_NO_ERROR();
@ -924,7 +924,7 @@ namespace {
void TextureGLTest::image2D() {
Texture2D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data2D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data2D));
MAGNUM_VERIFY_NO_ERROR();
@ -981,7 +981,7 @@ void TextureGLTest::image3D() {
Texture3D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), Data3D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), Data3D));
MAGNUM_VERIFY_NO_ERROR();
@ -1030,9 +1030,9 @@ namespace {
void TextureGLTest::subImage1D() {
Texture1D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference1D(ColorFormat::RGBA, ColorType::UnsignedByte, 4, Zero1D));
ImageView1D(ColorFormat::RGBA, ColorType::UnsignedByte, 4, Zero1D));
texture.setSubImage(0, 1,
ImageReference1D(ColorFormat::RGBA, ColorType::UnsignedByte, 2, Data1D));
ImageView1D(ColorFormat::RGBA, ColorType::UnsignedByte, 2, Data1D));
MAGNUM_VERIFY_NO_ERROR();
@ -1049,7 +1049,7 @@ void TextureGLTest::subImage1D() {
void TextureGLTest::subImage1DBuffer() {
Texture1D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference1D(ColorFormat::RGBA, ColorType::UnsignedByte, 4, Zero1D));
ImageView1D(ColorFormat::RGBA, ColorType::UnsignedByte, 4, Zero1D));
texture.setSubImage(0, 1,
BufferImage1D(ColorFormat::RGBA, ColorType::UnsignedByte, 2, Data1D, BufferUsage::StaticDraw));
@ -1070,7 +1070,7 @@ void TextureGLTest::subImage1DQuery() {
Texture1D texture;
texture.setStorage(1, TextureFormat::RGBA8, 4)
.setSubImage(0, {}, ImageReference1D{ColorFormat::RGBA, ColorType::UnsignedByte, 4, SubData1DComplete});
.setSubImage(0, {}, ImageView1D{ColorFormat::RGBA, ColorType::UnsignedByte, 4, SubData1DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -1089,7 +1089,7 @@ void TextureGLTest::subImage1DQueryBuffer() {
Texture1D texture;
texture.setStorage(1, TextureFormat::RGBA8, 4)
.setSubImage(0, {}, ImageReference1D{ColorFormat::RGBA, ColorType::UnsignedByte, 4, SubData1DComplete});
.setSubImage(0, {}, ImageView1D{ColorFormat::RGBA, ColorType::UnsignedByte, 4, SubData1DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -1116,9 +1116,9 @@ namespace {
void TextureGLTest::subImage2D() {
Texture2D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero2D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero2D));
texture.setSubImage(0, Vector2i(1),
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data2D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data2D));
MAGNUM_VERIFY_NO_ERROR();
@ -1139,7 +1139,7 @@ void TextureGLTest::subImage2D() {
void TextureGLTest::subImage2DBuffer() {
Texture2D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero2D));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(4), Zero2D));
texture.setSubImage(0, Vector2i(1),
BufferImage2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(2), Data2D, BufferUsage::StaticDraw));
@ -1165,7 +1165,7 @@ void TextureGLTest::subImage2DQuery() {
Texture2D texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector2i{4})
.setSubImage(0, {}, ImageReference2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData2DComplete});
.setSubImage(0, {}, ImageView2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData2DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -1184,7 +1184,7 @@ void TextureGLTest::subImage2DQueryBuffer() {
Texture2D texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector2i{4})
.setSubImage(0, {}, ImageReference2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData2DComplete});
.setSubImage(0, {}, ImageView2D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i{4}, SubData2DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -1231,9 +1231,9 @@ void TextureGLTest::subImage3D() {
Texture3D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero3D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero3D));
texture.setSubImage(0, Vector3i(1),
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), Data3D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), Data3D));
MAGNUM_VERIFY_NO_ERROR();
@ -1254,7 +1254,7 @@ void TextureGLTest::subImage3D() {
void TextureGLTest::subImage3DBuffer() {
Texture3D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero3D));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(4), Zero3D));
texture.setSubImage(0, Vector3i(1),
BufferImage3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(2), Data3D, BufferUsage::StaticDraw));
@ -1280,7 +1280,7 @@ void TextureGLTest::subImage3DQuery() {
Texture3D texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector3i{4})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData3DComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData3DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -1299,7 +1299,7 @@ void TextureGLTest::subImage3DQueryBuffer() {
Texture3D texture;
texture.setStorage(1, TextureFormat::RGBA8, Vector3i{4})
.setSubImage(0, {}, ImageReference3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData3DComplete});
.setSubImage(0, {}, ImageView3D{ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i{4}, SubData3DComplete});
MAGNUM_VERIFY_NO_ERROR();
@ -1318,7 +1318,7 @@ void TextureGLTest::generateMipmap1D() {
Texture1D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference1D(ColorFormat::RGBA, ColorType::UnsignedByte, 32));
ImageView1D(ColorFormat::RGBA, ColorType::UnsignedByte, 32));
CORRADE_COMPARE(texture.imageSize(0), 32);
CORRADE_COMPARE(texture.imageSize(1), 0);
@ -1346,7 +1346,7 @@ void TextureGLTest::generateMipmap2D() {
Texture2D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
ImageView2D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector2i(32)));
/** @todo How to test this on ES? */
#ifndef MAGNUM_TARGET_GLES
@ -1382,7 +1382,7 @@ void TextureGLTest::generateMipmap3D() {
Texture3D texture;
texture.setImage(0, TextureFormat::RGBA8,
ImageReference3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(32)));
ImageView3D(ColorFormat::RGBA, ColorType::UnsignedByte, Vector3i(32)));
/** @todo How to test this on ES? */
#ifndef MAGNUM_TARGET_GLES

6
src/Magnum/Text/DistanceFieldGlyphCache.cpp

@ -30,7 +30,7 @@
#endif
#include "Magnum/Context.h"
#include "Magnum/Extensions.h"
#include "Magnum/ImageReference.h"
#include "Magnum/ImageView.h"
#include "Magnum/TextureFormat.h"
#include "Magnum/TextureTools/DistanceField.h"
@ -59,7 +59,7 @@ DistanceFieldGlyphCache::DistanceFieldGlyphCache(const Vector2i& originalSize, c
#endif
}
void DistanceFieldGlyphCache::setImage(const Vector2i& offset, const ImageReference2D& image) {
void DistanceFieldGlyphCache::setImage(const Vector2i& offset, const ImageView2D& image) {
#if !(defined(MAGNUM_TARGET_GLES) && defined(MAGNUM_TARGET_GLES2))
const TextureFormat internalFormat = TextureFormat::R8;
CORRADE_ASSERT(image.format() == ColorFormat::Red,
@ -90,7 +90,7 @@ void DistanceFieldGlyphCache::setImage(const Vector2i& offset, const ImageRefere
TextureTools::distanceField(input, texture(), Range2Di::fromSize(offset*scale, image.size()*scale), radius, image.size());
}
void DistanceFieldGlyphCache::setDistanceFieldImage(const Vector2i& offset, const ImageReference2D& image) {
void DistanceFieldGlyphCache::setDistanceFieldImage(const Vector2i& offset, const ImageView2D& image) {
#if !(defined(MAGNUM_TARGET_GLES) && defined(MAGNUM_TARGET_GLES2))
CORRADE_ASSERT(image.format() == ColorFormat::Red,
"Text::DistanceFieldGlyphCache::setDistanceFieldImage(): expected" << ColorFormat::Red << "but got" << image.format(), );

4
src/Magnum/Text/DistanceFieldGlyphCache.h

@ -79,7 +79,7 @@ class MAGNUM_TEXT_EXPORT DistanceFieldGlyphCache: public GlyphCache {
* Uploads image for one or more glyphs to given offset in original
* cache texture. The texture is then converted to distance field.
*/
void setImage(const Vector2i& offset, const ImageReference2D& image) override;
void setImage(const Vector2i& offset, const ImageView2D& image) override;
/**
* @brief Set distance field cache image
@ -87,7 +87,7 @@ class MAGNUM_TEXT_EXPORT DistanceFieldGlyphCache: public GlyphCache {
* Uploads already computed distance field image to given offset in
* distance field texture.
*/
void setDistanceFieldImage(const Vector2i& offset, const ImageReference2D& image);
void setDistanceFieldImage(const Vector2i& offset, const ImageView2D& image);
private:
const Vector2 scale;

2
src/Magnum/Text/GlyphCache.cpp

@ -92,7 +92,7 @@ void GlyphCache::insert(const UnsignedInt glyph, const Vector2i& position, const
else CORRADE_INTERNAL_ASSERT_OUTPUT(glyphs.insert({glyph, glyphData}).second);
}
void GlyphCache::setImage(const Vector2i& offset, const ImageReference2D& image) {
void GlyphCache::setImage(const Vector2i& offset, const ImageView2D& image) {
/** @todo some internalformat/format checking also here (if querying internal format is not slow) */
_texture.setSubImage(0, offset, image);
}

2
src/Magnum/Text/GlyphCache.h

@ -185,7 +185,7 @@ class MAGNUM_TEXT_EXPORT GlyphCache {
* Uploads image for one or more glyphs to given offset in cache
* texture.
*/
virtual void setImage(const Vector2i& offset, const ImageReference2D& image);
virtual void setImage(const Vector2i& offset, const ImageView2D& image);
private:
void MAGNUM_LOCAL initialize(TextureFormat internalFormat, const Vector2i& size);

8
src/Magnum/Texture.h

@ -754,7 +754,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* @brief Set image data
* @param level Mip level
* @param internalFormat Internal format
* @param image @ref Image, @ref ImageReference or
* @param image @ref Image, @ref ImageView or
* @ref Trade::ImageData of the same dimension count
* @return Reference to self (for method chaining)
*
@ -768,7 +768,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage()
* instead.
*/
Texture<dimensions>& setImage(Int level, TextureFormat internalFormat, const ImageReference<dimensions>& image) {
Texture<dimensions>& setImage(Int level, TextureFormat internalFormat, const ImageView<dimensions>& image) {
DataHelper<dimensions>::setImage(*this, level, internalFormat, image);
return *this;
}
@ -804,7 +804,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* @brief Set image subdata
* @param level Mip level
* @param offset Offset where to put data in the texture
* @param image @ref Image, @ref ImageReference or
* @param image @ref Image, @ref ImageView or
* @ref Trade::ImageData of the same dimension count
* @return Reference to self (for method chaining)
*
@ -825,7 +825,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* able to use @ref setStorage() as it uses implicit @ref ColorType
* value.
*/
Texture<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions, Int>& offset, const ImageReference<dimensions>& image) {
Texture<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions, Int>& offset, const ImageView<dimensions>& image) {
DataHelper<Dimensions>::setSubImage(*this, level, offset, image);
return *this;
}

6
src/Magnum/TextureArray.h

@ -490,7 +490,7 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage()
* instead.
*/
TextureArray<dimensions>& setImage(Int level, TextureFormat internalFormat, const ImageReference<dimensions+1>& image) {
TextureArray<dimensions>& setImage(Int level, TextureFormat internalFormat, const ImageView<dimensions+1>& image) {
DataHelper<dimensions+1>::setImage(*this, level, internalFormat, image);
return *this;
}
@ -516,7 +516,7 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
* @brief Set image subdata
* @param level Mip level
* @param offset Offset where to put data in the texture
* @param image @ref Image, @ref ImageReference or
* @param image @ref Image, @ref ImageView or
* @ref Trade::ImageData of the same dimension count
* @return Reference to self (for method chaining)
*
@ -531,7 +531,7 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
* eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and
* @fn_gl{TexSubImage2D}/@fn_gl{TexSubImage3D}
*/
TextureArray<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions+1, Int>& offset, const ImageReference<dimensions+1>& image) {
TextureArray<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions+1, Int>& offset, const ImageView<dimensions+1>& image) {
DataHelper<dimensions+1>::setSubImage(*this, level, offset, image);
return *this;
}

12
src/Magnum/Trade/AbstractImageConverter.cpp

@ -37,35 +37,35 @@ AbstractImageConverter::AbstractImageConverter() = default;
AbstractImageConverter::AbstractImageConverter(PluginManager::AbstractManager& manager, std::string plugin): AbstractPlugin(manager, std::move(plugin)) {}
std::optional<Image2D> AbstractImageConverter::exportToImage(const ImageReference2D& image) const {
std::optional<Image2D> AbstractImageConverter::exportToImage(const ImageView2D& image) const {
CORRADE_ASSERT(features() & Feature::ConvertImage,
"Trade::AbstractImageConverter::exportToImage(): feature not supported", {});
return doExportToImage(image);
}
std::optional<Image2D> AbstractImageConverter::doExportToImage(const ImageReference2D&) const {
std::optional<Image2D> AbstractImageConverter::doExportToImage(const ImageView2D&) const {
CORRADE_ASSERT(false, "Trade::AbstractImageConverter::exportToImage(): feature advertised but not implemented", {});
return std::nullopt;
}
Containers::Array<char> AbstractImageConverter::exportToData(const ImageReference2D& image) const {
Containers::Array<char> AbstractImageConverter::exportToData(const ImageView2D& image) const {
CORRADE_ASSERT(features() & Feature::ConvertData,
"Trade::AbstractImageConverter::exportToData(): feature not supported", nullptr);
return doExportToData(image);
}
Containers::Array<char> AbstractImageConverter::doExportToData(const ImageReference2D&) const {
Containers::Array<char> AbstractImageConverter::doExportToData(const ImageView2D&) const {
CORRADE_ASSERT(false, "Trade::AbstractImageConverter::exportToData(): feature advertised but not implemented", nullptr);
return nullptr;
}
bool AbstractImageConverter::exportToFile(const ImageReference2D& image, const std::string& filename) const {
bool AbstractImageConverter::exportToFile(const ImageView2D& image, const std::string& filename) const {
return doExportToFile(image, filename);
}
bool AbstractImageConverter::doExportToFile(const ImageReference2D& image, const std::string& filename) const {
bool AbstractImageConverter::doExportToFile(const ImageView2D& image, const std::string& filename) const {
CORRADE_ASSERT(features() & Feature::ConvertData, "Trade::AbstractImageConverter::exportToFile(): not implemented", false);
const auto data = doExportToData(image);

12
src/Magnum/Trade/AbstractImageConverter.h

@ -98,7 +98,7 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractPlugin
* converted image on success, `std::nullopt` otherwise.
* @see @ref features(), @ref exportToData(), @ref exportToFile()
*/
std::optional<Image2D> exportToImage(const ImageReference2D& image) const;
std::optional<Image2D> exportToImage(const ImageView2D& image) const;
/**
* @brief Export image to raw data
@ -107,7 +107,7 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractPlugin
* data on success, zero-sized array otherwise.
* @see @ref features(), @ref exportToImage(), @ref exportToFile()
*/
Containers::Array<char> exportToData(const ImageReference2D& image) const;
Containers::Array<char> exportToData(const ImageView2D& image) const;
/**
* @brief Export image to file
@ -115,7 +115,7 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractPlugin
* Returns `true` on success, `false` otherwise.
* @see @ref features(), @ref exportToImage(), @ref exportToData()
*/
bool exportToFile(const ImageReference2D& image, const std::string& filename) const;
bool exportToFile(const ImageView2D& image, const std::string& filename) const;
#ifndef DOXYGEN_GENERATING_OUTPUT
private:
@ -126,10 +126,10 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractPlugin
virtual Features doFeatures() const = 0;
/** @brief Implementation of @ref exportToImage() */
virtual std::optional<Image2D> doExportToImage(const ImageReference2D& image) const;
virtual std::optional<Image2D> doExportToImage(const ImageView2D& image) const;
/** @brief Implementation of @ref exportToData() */
virtual Containers::Array<char> doExportToData(const ImageReference2D& image) const;
virtual Containers::Array<char> doExportToData(const ImageView2D& image) const;
/**
* @brief Implementation of @ref exportToFile()
@ -137,7 +137,7 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractPlugin
* If @ref Feature::ConvertData is supported, default implementation
* calls @ref doExportToData() and saves the result to given file.
*/
virtual bool doExportToFile(const ImageReference2D& image, const std::string& filename) const;
virtual bool doExportToFile(const ImageView2D& image, const std::string& filename) const;
};
CORRADE_ENUMSET_OPERATORS(AbstractImageConverter::Features)

14
src/Magnum/Trade/ImageData.h

@ -29,7 +29,7 @@
* @brief Class @ref Magnum::Trade::ImageData, typedef @ref Magnum::Trade::ImageData1D, @ref Magnum::Trade::ImageData2D, @ref Magnum::Trade::ImageData3D
*/
#include "Magnum/ImageReference.h"
#include "Magnum/ImageView.h"
namespace Magnum { namespace Trade {
@ -37,7 +37,7 @@ namespace Magnum { namespace Trade {
@brief Image data
Access to image data provided by @ref AbstractImporter subclasses.
Interchangeable with @ref Image, @ref ImageReference or @ref BufferImage.
Interchangeable with @ref Image, @ref ImageView or @ref BufferImage.
@see @ref ImageData1D, @ref ImageData2D, @ref ImageData3D
*/
template<UnsignedInt dimensions> class ImageData: public AbstractImage {
@ -73,8 +73,8 @@ template<UnsignedInt dimensions> class ImageData: public AbstractImage {
/** @brief Destructor */
~ImageData() { delete[] _data; }
/** @brief Conversion to reference */
/*implicit*/ operator ImageReference<dimensions>()
/** @brief Conversion to view */
/*implicit*/ operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &;
#else
@ -83,7 +83,7 @@ template<UnsignedInt dimensions> class ImageData: public AbstractImage {
#ifndef CORRADE_GCC47_COMPATIBILITY
/** @overload */
/*implicit*/ operator ImageReference<dimensions>() const && = delete;
/*implicit*/ operator ImageView<dimensions>() const && = delete;
#endif
/** @brief Format of pixel data */
@ -157,14 +157,14 @@ template<UnsignedInt dimensions> inline ImageData<dimensions>& ImageData<dimensi
return *this;
}
template<UnsignedInt dimensions> inline ImageData<dimensions>::operator ImageReference<dimensions>()
template<UnsignedInt dimensions> inline ImageData<dimensions>::operator ImageView<dimensions>()
#ifndef CORRADE_GCC47_COMPATIBILITY
const &
#else
const
#endif
{
return ImageReference<dimensions>(_format, _type, _size, _data);
return ImageView<dimensions>(_format, _type, _size, _data);
}
template<UnsignedInt dimensions> inline char* ImageData<dimensions>::release() {

6
src/Magnum/Trade/Test/AbstractImageConverterTest.cpp

@ -29,7 +29,7 @@
#include <Corrade/Utility/Directory.h>
#include "Magnum/ColorFormat.h"
#include "Magnum/ImageReference.h"
#include "Magnum/ImageView.h"
#include "Magnum/Trade/AbstractImageConverter.h"
#include "configure.h"
@ -52,7 +52,7 @@ void AbstractImageConverterTest::exportToFile() {
private:
Features doFeatures() const override { return Feature::ConvertData; }
Containers::Array<char> doExportToData(const ImageReference2D& image) const override {
Containers::Array<char> doExportToData(const ImageView2D& image) const override {
return Containers::Array<char>::from(char(image.size().x()), char(image.size().y()));
};
};
@ -62,7 +62,7 @@ void AbstractImageConverterTest::exportToFile() {
/* doExportToFile() should call doExportToData() */
DataExporter exporter;
ImageReference2D image(ColorFormat::RGBA, ColorType::UnsignedByte, {0xfe, 0xed}, nullptr);
ImageView2D image(ColorFormat::RGBA, ColorType::UnsignedByte, {0xfe, 0xed}, nullptr);
CORRADE_VERIFY(exporter.exportToFile(image, Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out")));
CORRADE_COMPARE_AS(Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"),
"\xFE\xED", TestSuite::Compare::FileToString);

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

@ -95,20 +95,20 @@ void ImageDataTest::constructMove() {
void ImageDataTest::toReference() {
auto data = new char[3];
const Trade::ImageData2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data);
ImageReference2D b = a;
ImageView2D b = a;
CORRADE_COMPARE(b.format(), ColorFormat::Red);
CORRADE_COMPARE(b.type(), ColorType::UnsignedByte);
CORRADE_COMPARE(b.size(), Vector2i(1, 3));
CORRADE_COMPARE(b.data(), data);
CORRADE_VERIFY((std::is_convertible<const Trade::ImageData2D&, ImageReference2D>::value));
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
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D, ImageReference2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D&&, ImageReference2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D, ImageView2D>::value));
CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D&&, ImageView2D>::value));
}
}

6
src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp

@ -56,7 +56,7 @@ namespace {
5, 6, 7, 6, 7, 8
};
const ImageReference2D original(ColorFormat::RGB, ColorType::UnsignedByte, {2, 3}, originalData);
const ImageView2D original(ColorFormat::RGB, ColorType::UnsignedByte, {2, 3}, originalData);
}
TgaImageConverterTest::TgaImageConverterTest() {
@ -67,7 +67,7 @@ TgaImageConverterTest::TgaImageConverterTest() {
}
void TgaImageConverterTest::wrongFormat() {
ImageReference2D image(ColorFormat::RG, ColorType::UnsignedByte, {}, nullptr);
ImageView2D image(ColorFormat::RG, ColorType::UnsignedByte, {}, nullptr);
std::ostringstream out;
Error::setOutput(&out);
@ -78,7 +78,7 @@ void TgaImageConverterTest::wrongFormat() {
}
void TgaImageConverterTest::wrongType() {
ImageReference2D image(ColorFormat::Red, ColorType::Float, {}, nullptr);
ImageView2D image(ColorFormat::Red, ColorType::Float, {}, nullptr);
std::ostringstream out;
Error::setOutput(&out);

2
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp

@ -45,7 +45,7 @@ TgaImageConverter::TgaImageConverter(PluginManager::AbstractManager& manager, st
auto TgaImageConverter::doFeatures() const -> Features { return Feature::ConvertData; }
Containers::Array<char> TgaImageConverter::doExportToData(const ImageReference2D& image) const {
Containers::Array<char> TgaImageConverter::doExportToData(const ImageView2D& image) const {
if(image.format() != ColorFormat::RGB &&
image.format() != ColorFormat::RGBA
#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2))

2
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.h

@ -73,7 +73,7 @@ class MAGNUM_TGAIMAGECONVERTER_EXPORT TgaImageConverter: public AbstractImageCon
private:
Features MAGNUM_TGAIMAGECONVERTER_LOCAL doFeatures() const override;
Containers::Array<char> MAGNUM_TGAIMAGECONVERTER_LOCAL doExportToData(const ImageReference2D& image) const override;
Containers::Array<char> MAGNUM_TGAIMAGECONVERTER_LOCAL doExportToData(const ImageView2D& image) const override;
};
}}

Loading…
Cancel
Save