Browse Source

Use Basic[Mutable]ImageView aliases instead of nondescript raw types.

pull/362/head
Vladimír Vondruš 7 years ago
parent
commit
1b7c2d9666
  1. 6
      doc/changelog.dox
  2. 8
      src/Magnum/GL/Texture.h
  3. 8
      src/Magnum/GL/TextureArray.h
  4. 16
      src/Magnum/Image.cpp
  5. 8
      src/Magnum/Image.h
  6. 140
      src/Magnum/ImageView.h
  7. 28
      src/Magnum/Magnum.h
  8. 24
      src/Magnum/Trade/ImageData.cpp
  9. 8
      src/Magnum/Trade/ImageData.h

6
doc/changelog.dox

@ -46,9 +46,9 @@ See also:
- New @ref Image::pixels(), @ref ImageView::pixels() and - New @ref Image::pixels(), @ref ImageView::pixels() and
@ref Trade::ImageData::pixels() accessors for convenient direct access to @ref Trade::ImageData::pixels() accessors for convenient direct access to
pixel data of any image pixel data of any image
- New @ref MutableImageView2D "MutableImageView*D" and - New @ref BasicMutableImageView "MutableImageView*D" and
@ref CompressedMutableImageView2D "CompressedMutableImageView*D" types for @ref BasicMutableCompressedImageView "MutableCompressedImageView*D" types
mutable views onto image data for mutable views onto image data
@subsubsection changelog-latest-new-audio Audio library @subsubsection changelog-latest-new-audio Audio library

8
src/Magnum/GL/Texture.h

@ -1037,7 +1037,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage() * @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage()
* instead. * instead.
*/ */
Texture<dimensions>& setImage(Int level, TextureFormat internalFormat, const ImageView<dimensions, const char>& image) { Texture<dimensions>& setImage(Int level, TextureFormat internalFormat, const BasicImageView<dimensions>& image) {
DataHelper<dimensions>::setImage(*this, level, internalFormat, image); DataHelper<dimensions>::setImage(*this, level, internalFormat, image);
return *this; return *this;
} }
@ -1093,7 +1093,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and * @deprecated_gl Prefer to use @ref setStorage() and
* @ref setCompressedSubImage() instead. * @ref setCompressedSubImage() instead.
*/ */
Texture<dimensions>& setCompressedImage(Int level, const CompressedImageView<dimensions, const char>& image) { Texture<dimensions>& setCompressedImage(Int level, const BasicCompressedImageView<dimensions>& image) {
DataHelper<dimensions>::setCompressedImage(*this, level, image); DataHelper<dimensions>::setCompressedImage(*this, level, image);
return *this; return *this;
} }
@ -1167,7 +1167,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* able to use @ref setStorage() as it uses implicit @ref PixelType * able to use @ref setStorage() as it uses implicit @ref PixelType
* value. * value.
*/ */
Texture<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions, Int>& offset, const ImageView<dimensions, const char>& image) { Texture<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions, Int>& offset, const BasicImageView<dimensions>& image) {
DataHelper<Dimensions>::setSubImage(*this, level, offset, image); DataHelper<Dimensions>::setSubImage(*this, level, offset, image);
return *this; return *this;
} }
@ -1219,7 +1219,7 @@ template<UnsignedInt dimensions> class Texture: public AbstractTexture {
* @requires_gl Non-default @ref CompressedPixelStorage is not * @requires_gl Non-default @ref CompressedPixelStorage is not
* available in OpenGL ES and WebGL. * available in OpenGL ES and WebGL.
*/ */
Texture<dimensions>& setCompressedSubImage(Int level, const VectorTypeFor<dimensions, Int>& offset, const CompressedImageView<dimensions, const char>& image) { Texture<dimensions>& setCompressedSubImage(Int level, const VectorTypeFor<dimensions, Int>& offset, const BasicCompressedImageView<dimensions>& image) {
DataHelper<Dimensions>::setCompressedSubImage(*this, level, offset, image); DataHelper<Dimensions>::setCompressedSubImage(*this, level, offset, image);
return *this; return *this;
} }

8
src/Magnum/GL/TextureArray.h

@ -699,7 +699,7 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage() * @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage()
* instead. * instead.
*/ */
TextureArray<dimensions>& setImage(Int level, TextureFormat internalFormat, const ImageView<dimensions+1, const char>& image) { TextureArray<dimensions>& setImage(Int level, TextureFormat internalFormat, const BasicImageView<dimensions+1>& image) {
DataHelper<dimensions+1>::setImage(*this, level, internalFormat, image); DataHelper<dimensions+1>::setImage(*this, level, internalFormat, image);
return *this; return *this;
} }
@ -734,7 +734,7 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
* @deprecated_gl Prefer to use @ref setStorage() and * @deprecated_gl Prefer to use @ref setStorage() and
* @ref setCompressedSubImage() instead. * @ref setCompressedSubImage() instead.
*/ */
TextureArray<dimensions>& setCompressedImage(Int level, const CompressedImageView<dimensions+1, const char>& image) { TextureArray<dimensions>& setCompressedImage(Int level, const BasicCompressedImageView<dimensions+1>& image) {
DataHelper<dimensions+1>::setCompressedImage(*this, level, image); DataHelper<dimensions+1>::setCompressedImage(*this, level, image);
return *this; return *this;
} }
@ -781,7 +781,7 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
* eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and
* @fn_gl_keyword{TexSubImage2D} / @fn_gl_keyword{TexSubImage3D} * @fn_gl_keyword{TexSubImage2D} / @fn_gl_keyword{TexSubImage3D}
*/ */
TextureArray<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions+1, Int>& offset, const ImageView<dimensions+1, const char>& image) { TextureArray<dimensions>& setSubImage(Int level, const VectorTypeFor<dimensions+1, Int>& offset, const BasicImageView<dimensions+1>& image) {
DataHelper<dimensions+1>::setSubImage(*this, level, offset, image); DataHelper<dimensions+1>::setSubImage(*this, level, offset, image);
return *this; return *this;
} }
@ -818,7 +818,7 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
* @requires_gl Non-default @ref CompressedPixelStorage is not * @requires_gl Non-default @ref CompressedPixelStorage is not
* available in OpenGL ES and WebGL. * available in OpenGL ES and WebGL.
*/ */
TextureArray<dimensions>& setCompressedSubImage(Int level, const VectorTypeFor<dimensions+1, Int>& offset, const CompressedImageView<dimensions+1, const char>& image) { TextureArray<dimensions>& setCompressedSubImage(Int level, const VectorTypeFor<dimensions+1, Int>& offset, const BasicCompressedImageView<dimensions+1>& image) {
DataHelper<dimensions+1>::setCompressedSubImage(*this, level, offset, image); DataHelper<dimensions+1>::setCompressedSubImage(*this, level, offset, image);
return *this; return *this;
} }

16
src/Magnum/Image.cpp

@ -60,12 +60,12 @@ template<UnsignedInt dimensions> Image<dimensions>& Image<dimensions>::operator=
return *this; return *this;
} }
template<UnsignedInt dimensions> Image<dimensions>::operator ImageView<dimensions, char>() { template<UnsignedInt dimensions> Image<dimensions>::operator BasicMutableImageView<dimensions>() {
return ImageView<dimensions, char>{_storage, _format, _formatExtra, _pixelSize, _size, _data}; return BasicMutableImageView<dimensions>{_storage, _format, _formatExtra, _pixelSize, _size, _data};
} }
template<UnsignedInt dimensions> Image<dimensions>::operator ImageView<dimensions, const char>() const { template<UnsignedInt dimensions> Image<dimensions>::operator BasicImageView<dimensions>() const {
return ImageView<dimensions, const char>{_storage, _format, _formatExtra, _pixelSize, _size, _data}; return BasicImageView<dimensions>{_storage, _format, _formatExtra, _pixelSize, _size, _data};
} }
template<UnsignedInt dimensions> std::pair<VectorTypeFor<dimensions, std::size_t>, VectorTypeFor<dimensions, std::size_t>> Image<dimensions>::dataProperties() const { template<UnsignedInt dimensions> std::pair<VectorTypeFor<dimensions, std::size_t>, VectorTypeFor<dimensions, std::size_t>> Image<dimensions>::dataProperties() const {
@ -106,12 +106,12 @@ template<UnsignedInt dimensions> CompressedImage<dimensions>& CompressedImage<di
return *this; return *this;
} }
template<UnsignedInt dimensions> CompressedImage<dimensions>::operator CompressedImageView<dimensions, char>() { template<UnsignedInt dimensions> CompressedImage<dimensions>::operator BasicMutableCompressedImageView<dimensions>() {
return CompressedImageView<dimensions, char>{_storage, _format, _size, _data}; return BasicMutableCompressedImageView<dimensions>{_storage, _format, _size, _data};
} }
template<UnsignedInt dimensions> CompressedImage<dimensions>::operator CompressedImageView<dimensions, const char>() const { template<UnsignedInt dimensions> CompressedImage<dimensions>::operator BasicCompressedImageView<dimensions>() const {
return CompressedImageView<dimensions, const char>{_storage, _format, _size, _data}; return BasicCompressedImageView<dimensions>{_storage, _format, _size, _data};
} }
template<UnsignedInt dimensions> std::pair<VectorTypeFor<dimensions, std::size_t>, VectorTypeFor<dimensions, std::size_t>> CompressedImage<dimensions>::dataProperties() const { template<UnsignedInt dimensions> std::pair<VectorTypeFor<dimensions, std::size_t>, VectorTypeFor<dimensions, std::size_t>> CompressedImage<dimensions>::dataProperties() const {

8
src/Magnum/Image.h

@ -313,9 +313,9 @@ template<UnsignedInt dimensions> class Image {
/** @brief Conversion to view */ /** @brief Conversion to view */
/* Not restricted to const&, because we might want to pass the view to /* Not restricted to const&, because we might want to pass the view to
another function in an oneliner (e.g. saving screenshot) */ another function in an oneliner (e.g. saving screenshot) */
/*implicit*/ operator ImageView<dimensions, char>(); /*implicit*/ operator BasicMutableImageView<dimensions>();
/** @overload */ /** @overload */
/*implicit*/ operator ImageView<dimensions, const char>() const; /*implicit*/ operator BasicImageView<dimensions>() const;
/** @brief Storage of pixel data */ /** @brief Storage of pixel data */
PixelStorage storage() const { return _storage; } PixelStorage storage() const { return _storage; }
@ -574,9 +574,9 @@ template<UnsignedInt dimensions> class CompressedImage {
/** @brief Conversion to view */ /** @brief Conversion to view */
/* Not restricted to const&, because we might want to pass the view to /* Not restricted to const&, because we might want to pass the view to
another function in an oneliner (e.g. saving screenshot) */ another function in an oneliner (e.g. saving screenshot) */
/*implicit*/ operator CompressedImageView<dimensions, char>(); /*implicit*/ operator BasicMutableCompressedImageView<dimensions>();
/** @overload */ /** @overload */
/*implicit*/ operator CompressedImageView<dimensions, const char>() const; /*implicit*/ operator BasicCompressedImageView<dimensions>() const;
/** @brief Storage of compressed pixel data */ /** @brief Storage of compressed pixel data */
CompressedPixelStorage storage() const { return _storage; } CompressedPixelStorage storage() const { return _storage; }

140
src/Magnum/ImageView.h

@ -26,7 +26,7 @@
*/ */
/** @file /** @file
* @brief Class @ref Magnum::ImageView, @ref Magnum::CompressedImageView, typedef @ref Magnum::ImageView1D, @ref Magnum::ImageView2D, @ref Magnum::ImageView3D, @ref Magnum::MutableImageView1D, @ref Magnum::MutableImageView2D, @ref Magnum::MutableImageView3D, @ref Magnum::CompressedImageView1D, @ref Magnum::CompressedImageView2D, @ref Magnum::CompressedImageView3D, @ref Magnum::MutableCompressedImageView1D, @ref Magnum::MutableCompressedImageView2D, @ref Magnum::MutableCompressedImageView3D * @brief Class @ref Magnum::ImageView, @ref Magnum::CompressedImageView, alias @ref Magnum::BasicImageView, @ref Magnum::BasicCompressedImageView, typedef @ref Magnum::ImageView1D, @ref Magnum::ImageView2D, @ref Magnum::ImageView3D, @ref Magnum::MutableImageView1D, @ref Magnum::MutableImageView2D, @ref Magnum::MutableImageView3D, @ref Magnum::CompressedImageView1D, @ref Magnum::CompressedImageView2D, @ref Magnum::CompressedImageView3D, @ref Magnum::MutableCompressedImageView1D, @ref Magnum::MutableCompressedImageView2D, @ref Magnum::MutableCompressedImageView3D
*/ */
#include <Corrade/Containers/ArrayView.h> #include <Corrade/Containers/ArrayView.h>
@ -80,11 +80,12 @@ sub-rectangle of a 75x75 8-bit RGB image , with rows aligned to four bytes:
@section ImageView-mutable Data mutability @section ImageView-mutable Data mutability
When using e.g. the @ref ImageView2D typedef, the viewed data are immutable. When using types derived from @ref BasicImageView (e.g. @ref ImageView2D), the
This is the most common use case, in order to be able to mutate the underlying viewed data are immutable. This is the most common use case. In order to be
data (for example in order to read into a pre-allocated memory), use able to mutate the underlying data (for example in order to read into a
@ref MutableImageView2D and friends instead. @ref Image and pre-allocated memory), use @ref BasicMutableImageView
@ref Trade::ImageData are convertible to either of these. Similarly to (e.g. @ref MutableImageView2D) instead. @ref Image and @ref Trade::ImageData
are convertible to either of these. Similarly to
@ref Corrade::Containers::ArrayView etc., a mutable view is also implicitly @ref Corrade::Containers::ArrayView etc., a mutable view is also implicitly
convertible to a const one. convertible to a const one.
@ -123,9 +124,9 @@ Metal-specific format identifier:
@snippet Magnum.cpp ImageView-usage-metal @snippet Magnum.cpp ImageView-usage-metal
@see @ref ImageView1D, @ref ImageView2D, @ref ImageView3D, @see @ref BasicImageView, @ref ImageView1D, @ref ImageView2D, @ref ImageView3D,
@ref MutableImageView1D, @ref MutableImageView2D, @ref MutableImageView3D, @ref BasicMutableImageView, @ref MutableImageView1D,
@ref Image-pixel-views @ref MutableImageView2D, @ref MutableImageView3D, @ref Image-pixel-views
*/ */
template<UnsignedInt dimensions, class T> class ImageView { template<UnsignedInt dimensions, class T> class ImageView {
public: public:
@ -136,20 +137,16 @@ template<UnsignedInt dimensions, class T> class ImageView {
/** /**
* @brief Raw data type * @brief Raw data type
* *
* @cpp const char @ce for @ref ImageView1D / @ref ImageView2D / * @cpp const char @ce for @ref BasicImageView and @cpp char @ce for
* @ref ImageView3D and @cpp char @ce for @ref MutableImageView1D / * @ref BasicMutableImageView. See also @ref ErasedType.
* @ref MutableImageView2D / @ref MutableImageView3D. See also
* @ref ErasedType.
*/ */
typedef T Type; typedef T Type;
/** /**
* @brief Erased data type * @brief Erased data type
* *
* @cpp const void @ce for @ref ImageView1D / @ref ImageView2D / * @cpp const void @ce for @ref BasicImageView and @cpp const void @ce
* @ref ImageView3D and @cpp const void @ce for @ref MutableImageView1D * for @ref BasicMutableImageView. See also @ref Type.
* / @ref MutableImageView2D / @ref MutableImageView3D. See also
* @ref Type.
*/ */
typedef typename std::conditional<std::is_const<T>::value, const void, void>::type ErasedType; typedef typename std::conditional<std::is_const<T>::value, const void, void>::type ErasedType;
@ -463,47 +460,67 @@ template<UnsignedInt dimensions, class T> class ImageView {
Containers::ArrayView<Type> _data; Containers::ArrayView<Type> _data;
}; };
/**
@brief Const image view
@see @ref ImageView1D, @ref ImageView2D, @ref ImageView3D,
@ref BasicMutableImageView
*/
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */
template<UnsignedInt dimensions> using BasicImageView = ImageView<dimensions, const char>;
#endif
/** /**
@brief One-dimensional image view @brief One-dimensional image view
@see @ref MutableImageView1D, @ref CompressedImageView1D @see @ref MutableImageView1D, @ref CompressedImageView1D, @ref ImageView
*/ */
typedef ImageView<1, const char> ImageView1D; typedef BasicImageView<1> ImageView1D;
/** /**
@brief Two-dimensional image view @brief Two-dimensional image view
@see @ref MutableImageView2D, @ref CompressedImageView2D @see @ref MutableImageView2D, @ref CompressedImageView2D, @ref ImageView
*/ */
typedef ImageView<2, const char> ImageView2D; typedef BasicImageView<2> ImageView2D;
/** /**
@brief Three-dimensional image view @brief Three-dimensional image view
@see @ref MutableImageView3D, @ref CompressedImageView3D @see @ref MutableImageView3D, @ref CompressedImageView3D, @ref ImageView
*/ */
typedef ImageView<3, const char> ImageView3D; typedef BasicImageView<3> ImageView3D;
/**
@brief Mutable image view
@see @ref MutableImageView1D, @ref MutableImageView2D, @ref MutableImageView3D,
@ref BasicImageView
*/
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */
template<UnsignedInt dimensions> using BasicMutableImageView = ImageView<dimensions, char>;
#endif
/** /**
@brief One-dimensional mutable image view @brief One-dimensional mutable image view
@see @ref ImageView1D, @ref MutableCompressedImageView1D @see @ref ImageView1D, @ref MutableCompressedImageView1D, @ref ImageView
*/ */
typedef ImageView<1, char> MutableImageView1D; typedef BasicMutableImageView<1> MutableImageView1D;
/** /**
@brief Two-dimensional mutable image view @brief Two-dimensional mutable image view
@see @ref ImageView2D, @ref MutableCompressedImageView2D @see @ref ImageView2D, @ref MutableCompressedImageView2D, @ref ImageView
*/ */
typedef ImageView<2, char> MutableImageView2D; typedef BasicMutableImageView<2> MutableImageView2D;
/** /**
@brief Three-dimensional mutable image view @brief Three-dimensional mutable image view
@see @ref ImageView3D, @ref MutableCompressedImageView3D @see @ref ImageView3D, @ref MutableCompressedImageView3D, @ref ImageView
*/ */
typedef ImageView<3, char> MutableImageView3D; typedef BasicMutableImageView<3> MutableImageView3D;
/** /**
@brief Compressed image view @brief Compressed image view
@ -543,13 +560,14 @@ as first parameter. In the following snippet, the view is the bottom-right
@section CompressedImageView-mutable Data mutability @section CompressedImageView-mutable Data mutability
When using e.g. the @ref CompressedImageView2D typedef, the viewed data are When using types derived from @ref BasicCompressedImageView (e.g.
immutable. This is the most common use case, in order to be able to mutate the @ref CompressedImageView2D), the viewed data are immutable. This is the most
underlying data (for example in order to read into a pre-allocated memory), use common use case. In order to be able to mutate the underlying data (for example
@ref MutableCompressedImageView2D and friends instead. @ref CompressedImage and in order to read into a pre-allocated memory), use
@ref Trade::ImageData are convertible to either of those. Similarly to @ref BasicMutableCompressedImageView (e.g. @ref MutableCompressedImageView2D)
@ref Corrade::Containers::ArrayView etc., a mutable view is also implicitly instead. @ref CompressedImage and @ref Trade::ImageData are convertible to
convertible to a const one. either of these. Similarly to @ref Corrade::Containers::ArrayView etc., a
mutable view is also implicitly convertible to a const one.
@subsection CompressedImageView-usage-implementation-specific Implementation-specific formats @subsection CompressedImageView-usage-implementation-specific Implementation-specific formats
@ -766,47 +784,73 @@ template<UnsignedInt dimensions, class T> class CompressedImageView {
Containers::ArrayView<Type> _data; Containers::ArrayView<Type> _data;
}; };
/**
@brief Const compressed image view
@see @ref CompressedImageView1D, @ref CompressedImageView2D,
@ref CompressedImageView3D, @ref BasicMutableImageView
*/
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */
template<UnsignedInt dimensions> using BasicCompressedImageView = CompressedImageView<dimensions, const char>;
#endif
/** /**
@brief One-dimensional compressed image view @brief One-dimensional compressed image view
@see @ref MutableCompressedImageView1D, @ref ImageView1D @see @ref MutableCompressedImageView1D, @ref ImageView1D,
@ref CompressedImageView
*/ */
typedef CompressedImageView<1, const char> CompressedImageView1D; typedef BasicCompressedImageView<1> CompressedImageView1D;
/** /**
@brief Two-dimensional compressed image view @brief Two-dimensional compressed image view
@see @ref MutableCompressedImageView2D, @ref ImageView2D @see @ref MutableCompressedImageView2D, @ref ImageView2D,
@ref CompressedImageView
*/ */
typedef CompressedImageView<2, const char> CompressedImageView2D; typedef BasicCompressedImageView<2> CompressedImageView2D;
/** /**
@brief Three-dimensional compressed image view @brief Three-dimensional compressed image view
@see @ref MutableCompressedImageView3D, @ref ImageView3D @see @ref MutableCompressedImageView3D, @ref ImageView3D,
@ref CompressedImageView
*/
typedef BasicCompressedImageView<3> CompressedImageView3D;
/**
@brief Mutable compressed image view
@see @ref MutableCompressedImageView1D, @ref MutableCompressedImageView2D,
@ref MutableCompressedImageView3D, @ref BasicCompressedImageView
*/ */
typedef CompressedImageView<3, const char> CompressedImageView3D; #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */
template<UnsignedInt dimensions> using BasicMutableCompressedImageView = CompressedImageView<dimensions, char>;
#endif
/** /**
@brief One-dimensional mutable compressed image view @brief One-dimensional mutable compressed image view
@see @ref CompressedImageView1D, @ref MutableImageView1D @see @ref CompressedImageView1D, @ref MutableImageView1D,
@ref CompressedImageView
*/ */
typedef CompressedImageView<1, char> MutableCompressedImageView1D; typedef BasicMutableCompressedImageView<1> MutableCompressedImageView1D;
/** /**
@brief Two-dimensional mutable compressed image view @brief Two-dimensional mutable compressed image view
@see @ref CompressedImageView2D, @ref MutableImageView2D @see @ref CompressedImageView2D, @ref MutableImageView2D,
@ref CompressedImageView
*/ */
typedef CompressedImageView<2, char> MutableCompressedImageView2D; typedef BasicMutableCompressedImageView<2> MutableCompressedImageView2D;
/** /**
@brief Three-dimensional mutable compressed image view @brief Three-dimensional mutable compressed image view
@see @ref CompressedImageView3D, @ref MutableImageView3D @see @ref CompressedImageView3D, @ref MutableImageView3D,
@ref CompressedImageView
*/ */
typedef CompressedImageView<3, char> MutableCompressedImageView3D; typedef BasicMutableCompressedImageView<3> MutableCompressedImageView3D;
template<UnsignedInt dimensions, class T> template<class U, class V> inline ImageView<dimensions, T>::ImageView(const PixelStorage storage, const U format, const V formatExtra, const VectorTypeFor<dimensions, Int>& size, const Containers::ArrayView<ErasedType> data) noexcept: ImageView{storage, UnsignedInt(format), UnsignedInt(formatExtra), Implementation::pixelSizeAdl(format, formatExtra), size, data} { template<UnsignedInt dimensions, class T> template<class U, class V> inline ImageView<dimensions, T>::ImageView(const PixelStorage storage, const U format, const V formatExtra, const VectorTypeFor<dimensions, Int>& size, const Containers::ArrayView<ErasedType> data) noexcept: ImageView{storage, UnsignedInt(format), UnsignedInt(formatExtra), Implementation::pixelSizeAdl(format, formatExtra), size, data} {
static_assert(sizeof(T) <= 4 && sizeof(U) <= 4, static_assert(sizeof(T) <= 4 && sizeof(U) <= 4,

28
src/Magnum/Magnum.h

@ -728,20 +728,24 @@ typedef CompressedImage<2> CompressedImage2D;
typedef CompressedImage<3> CompressedImage3D; typedef CompressedImage<3> CompressedImage3D;
template<UnsignedInt, class> class ImageView; template<UnsignedInt, class> class ImageView;
typedef ImageView<1, const char> ImageView1D; template<UnsignedInt dimensions> using BasicImageView = ImageView<dimensions, const char>;
typedef ImageView<2, const char> ImageView2D; typedef BasicImageView<1> ImageView1D;
typedef ImageView<3, const char> ImageView3D; typedef BasicImageView<2> ImageView2D;
typedef ImageView<1, char> MutableImageView1D; typedef BasicImageView<3> ImageView3D;
typedef ImageView<2, char> MutableImageView2D; template<UnsignedInt dimensions> using BasicMutableImageView = ImageView<dimensions, char>;
typedef ImageView<3, char> MutableImageView3D; typedef BasicMutableImageView<1> MutableImageView1D;
typedef BasicMutableImageView<2> MutableImageView2D;
typedef BasicMutableImageView<3> MutableImageView3D;
template<UnsignedInt, class> class CompressedImageView; template<UnsignedInt, class> class CompressedImageView;
typedef CompressedImageView<1, const char> CompressedImageView1D; template<UnsignedInt dimensions> using BasicCompressedImageView = CompressedImageView<dimensions, const char>;
typedef CompressedImageView<2, const char> CompressedImageView2D; typedef BasicCompressedImageView<1> CompressedImageView1D;
typedef CompressedImageView<3, const char> CompressedImageView3D; typedef BasicCompressedImageView<2> CompressedImageView2D;
typedef CompressedImageView<1, char> MutableCompressedImageView1D; typedef BasicCompressedImageView<3> CompressedImageView3D;
typedef CompressedImageView<2, char> MutableCompressedImageView2D; template<UnsignedInt dimensions> using BasicMutableCompressedImageView = CompressedImageView<dimensions, char>;
typedef CompressedImageView<3, char> MutableCompressedImageView3D; typedef BasicMutableCompressedImageView<1> MutableCompressedImageView1D;
typedef BasicMutableCompressedImageView<2> MutableCompressedImageView2D;
typedef BasicMutableCompressedImageView<3> MutableCompressedImageView3D;
enum class MeshPrimitive: UnsignedInt; enum class MeshPrimitive: UnsignedInt;
enum class MeshIndexType: UnsignedInt; enum class MeshIndexType: UnsignedInt;

24
src/Magnum/Trade/ImageData.cpp

@ -128,26 +128,26 @@ template<UnsignedInt dimensions> Containers::StridedArrayView<dimensions + 1, co
return Implementation::imagePixelView<dimensions, const char>(*this); return Implementation::imagePixelView<dimensions, const char>(*this);
} }
template<UnsignedInt dimensions> ImageData<dimensions>::operator ImageView<dimensions, char>() { template<UnsignedInt dimensions> ImageData<dimensions>::operator BasicMutableImageView<dimensions>() {
CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (ImageView<dimensions, char>{_storage, _format, _formatExtra, _pixelSize, _size})); CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (BasicMutableImageView<dimensions>{_storage, _format, _formatExtra, _pixelSize, _size}));
return ImageView<dimensions, char>{_storage, _format, _formatExtra, _pixelSize, _size, _data}; return BasicMutableImageView<dimensions>{_storage, _format, _formatExtra, _pixelSize, _size, _data};
} }
template<UnsignedInt dimensions> ImageData<dimensions>::operator ImageView<dimensions, const char>() const { template<UnsignedInt dimensions> ImageData<dimensions>::operator BasicImageView<dimensions>() const {
CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (ImageView<dimensions, const char>{_storage, _format, _formatExtra, _pixelSize, _size})); CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (BasicImageView<dimensions>{_storage, _format, _formatExtra, _pixelSize, _size}));
return ImageView<dimensions, const char>{_storage, _format, _formatExtra, _pixelSize, _size, _data}; return BasicImageView<dimensions>{_storage, _format, _formatExtra, _pixelSize, _size, _data};
} }
template<UnsignedInt dimensions> ImageData<dimensions>::operator CompressedImageView<dimensions, char>() { template<UnsignedInt dimensions> ImageData<dimensions>::operator BasicMutableCompressedImageView<dimensions>() {
CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (CompressedImageView<dimensions, char>{_compressedStorage, _compressedFormat, _size})); CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (BasicMutableCompressedImageView<dimensions>{_compressedStorage, _compressedFormat, _size}));
return CompressedImageView<dimensions, char>{ return BasicMutableCompressedImageView<dimensions>{
_compressedStorage, _compressedStorage,
_compressedFormat, _size, _data}; _compressedFormat, _size, _data};
} }
template<UnsignedInt dimensions> ImageData<dimensions>::operator CompressedImageView<dimensions, const char>() const { template<UnsignedInt dimensions> ImageData<dimensions>::operator BasicCompressedImageView<dimensions>() const {
CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (CompressedImageView<dimensions, const char>{_compressedStorage, _compressedFormat, _size})); CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (BasicCompressedImageView<dimensions>{_compressedStorage, _compressedFormat, _size}));
return CompressedImageView<dimensions, const char>{ return BasicCompressedImageView<dimensions>{
_compressedStorage, _compressedStorage,
_compressedFormat, _size, _data}; _compressedFormat, _size, _data};
} }

8
src/Magnum/Trade/ImageData.h

@ -236,9 +236,9 @@ template<UnsignedInt dimensions> class ImageData {
*/ */
/* Not restricted to const&, because we might want to pass the view to /* Not restricted to const&, because we might want to pass the view to
another function in an oneliner (e.g. saving screenshot) */ another function in an oneliner (e.g. saving screenshot) */
/*implicit*/ operator ImageView<dimensions, char>(); /*implicit*/ operator BasicMutableImageView<dimensions>();
/** @overload */ /** @overload */
/*implicit*/ operator ImageView<dimensions, const char>() const; /*implicit*/ operator BasicImageView<dimensions>() const;
/** /**
* @brief Conversion to compressed view * @brief Conversion to compressed view
@ -248,9 +248,9 @@ template<UnsignedInt dimensions> class ImageData {
*/ */
/* Not restricted to const&, because we might want to pass the view to /* Not restricted to const&, because we might want to pass the view to
another function in an oneliner (e.g. saving screenshot) */ another function in an oneliner (e.g. saving screenshot) */
/*implicit*/ operator CompressedImageView<dimensions, char>(); /*implicit*/ operator BasicMutableCompressedImageView<dimensions>();
/** @overload */ /** @overload */
/*implicit*/ operator CompressedImageView<dimensions, const char>() const; /*implicit*/ operator BasicCompressedImageView<dimensions>() const;
/** /**
* @brief Storage of pixel data * @brief Storage of pixel data

Loading…
Cancel
Save