diff --git a/doc/changelog.dox b/doc/changelog.dox index a37c97322..7323b0e58 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -46,9 +46,9 @@ See also: - New @ref Image::pixels(), @ref ImageView::pixels() and @ref Trade::ImageData::pixels() accessors for convenient direct access to pixel data of any image -- New @ref MutableImageView2D "MutableImageView*D" and - @ref CompressedMutableImageView2D "CompressedMutableImageView*D" types for - mutable views onto image data +- New @ref BasicMutableImageView "MutableImageView*D" and + @ref BasicMutableCompressedImageView "MutableCompressedImageView*D" types + for mutable views onto image data @subsubsection changelog-latest-new-audio Audio library diff --git a/src/Magnum/GL/Texture.h b/src/Magnum/GL/Texture.h index aaa04f80e..a69266290 100644 --- a/src/Magnum/GL/Texture.h +++ b/src/Magnum/GL/Texture.h @@ -1037,7 +1037,7 @@ template class Texture: public AbstractTexture { * @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage() * instead. */ - Texture& setImage(Int level, TextureFormat internalFormat, const ImageView& image) { + Texture& setImage(Int level, TextureFormat internalFormat, const BasicImageView& image) { DataHelper::setImage(*this, level, internalFormat, image); return *this; } @@ -1093,7 +1093,7 @@ template class Texture: public AbstractTexture { * @deprecated_gl Prefer to use @ref setStorage() and * @ref setCompressedSubImage() instead. */ - Texture& setCompressedImage(Int level, const CompressedImageView& image) { + Texture& setCompressedImage(Int level, const BasicCompressedImageView& image) { DataHelper::setCompressedImage(*this, level, image); return *this; } @@ -1167,7 +1167,7 @@ template class Texture: public AbstractTexture { * able to use @ref setStorage() as it uses implicit @ref PixelType * value. */ - Texture& setSubImage(Int level, const VectorTypeFor& offset, const ImageView& image) { + Texture& setSubImage(Int level, const VectorTypeFor& offset, const BasicImageView& image) { DataHelper::setSubImage(*this, level, offset, image); return *this; } @@ -1219,7 +1219,7 @@ template class Texture: public AbstractTexture { * @requires_gl Non-default @ref CompressedPixelStorage is not * available in OpenGL ES and WebGL. */ - Texture& setCompressedSubImage(Int level, const VectorTypeFor& offset, const CompressedImageView& image) { + Texture& setCompressedSubImage(Int level, const VectorTypeFor& offset, const BasicCompressedImageView& image) { DataHelper::setCompressedSubImage(*this, level, offset, image); return *this; } diff --git a/src/Magnum/GL/TextureArray.h b/src/Magnum/GL/TextureArray.h index dae031470..4a778853d 100644 --- a/src/Magnum/GL/TextureArray.h +++ b/src/Magnum/GL/TextureArray.h @@ -699,7 +699,7 @@ template class TextureArray: public AbstractTexture { * @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage() * instead. */ - TextureArray& setImage(Int level, TextureFormat internalFormat, const ImageView& image) { + TextureArray& setImage(Int level, TextureFormat internalFormat, const BasicImageView& image) { DataHelper::setImage(*this, level, internalFormat, image); return *this; } @@ -734,7 +734,7 @@ template class TextureArray: public AbstractTexture { * @deprecated_gl Prefer to use @ref setStorage() and * @ref setCompressedSubImage() instead. */ - TextureArray& setCompressedImage(Int level, const CompressedImageView& image) { + TextureArray& setCompressedImage(Int level, const BasicCompressedImageView& image) { DataHelper::setCompressedImage(*this, level, image); return *this; } @@ -781,7 +781,7 @@ template class TextureArray: public AbstractTexture { * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and * @fn_gl_keyword{TexSubImage2D} / @fn_gl_keyword{TexSubImage3D} */ - TextureArray& setSubImage(Int level, const VectorTypeFor& offset, const ImageView& image) { + TextureArray& setSubImage(Int level, const VectorTypeFor& offset, const BasicImageView& image) { DataHelper::setSubImage(*this, level, offset, image); return *this; } @@ -818,7 +818,7 @@ template class TextureArray: public AbstractTexture { * @requires_gl Non-default @ref CompressedPixelStorage is not * available in OpenGL ES and WebGL. */ - TextureArray& setCompressedSubImage(Int level, const VectorTypeFor& offset, const CompressedImageView& image) { + TextureArray& setCompressedSubImage(Int level, const VectorTypeFor& offset, const BasicCompressedImageView& image) { DataHelper::setCompressedSubImage(*this, level, offset, image); return *this; } diff --git a/src/Magnum/Image.cpp b/src/Magnum/Image.cpp index 4d2af5fb4..4b18e3ab9 100644 --- a/src/Magnum/Image.cpp +++ b/src/Magnum/Image.cpp @@ -60,12 +60,12 @@ template Image& Image::operator= return *this; } -template Image::operator ImageView() { - return ImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; +template Image::operator BasicMutableImageView() { + return BasicMutableImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; } -template Image::operator ImageView() const { - return ImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; +template Image::operator BasicImageView() const { + return BasicImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; } template std::pair, VectorTypeFor> Image::dataProperties() const { @@ -106,12 +106,12 @@ template CompressedImage& CompressedImage CompressedImage::operator CompressedImageView() { - return CompressedImageView{_storage, _format, _size, _data}; +template CompressedImage::operator BasicMutableCompressedImageView() { + return BasicMutableCompressedImageView{_storage, _format, _size, _data}; } -template CompressedImage::operator CompressedImageView() const { - return CompressedImageView{_storage, _format, _size, _data}; +template CompressedImage::operator BasicCompressedImageView() const { + return BasicCompressedImageView{_storage, _format, _size, _data}; } template std::pair, VectorTypeFor> CompressedImage::dataProperties() const { diff --git a/src/Magnum/Image.h b/src/Magnum/Image.h index 7426b0a28..a2b491c7a 100644 --- a/src/Magnum/Image.h +++ b/src/Magnum/Image.h @@ -313,9 +313,9 @@ template class Image { /** @brief Conversion to view */ /* Not restricted to const&, because we might want to pass the view to another function in an oneliner (e.g. saving screenshot) */ - /*implicit*/ operator ImageView(); + /*implicit*/ operator BasicMutableImageView(); /** @overload */ - /*implicit*/ operator ImageView() const; + /*implicit*/ operator BasicImageView() const; /** @brief Storage of pixel data */ PixelStorage storage() const { return _storage; } @@ -574,9 +574,9 @@ template class CompressedImage { /** @brief Conversion to view */ /* Not restricted to const&, because we might want to pass the view to another function in an oneliner (e.g. saving screenshot) */ - /*implicit*/ operator CompressedImageView(); + /*implicit*/ operator BasicMutableCompressedImageView(); /** @overload */ - /*implicit*/ operator CompressedImageView() const; + /*implicit*/ operator BasicCompressedImageView() const; /** @brief Storage of compressed pixel data */ CompressedPixelStorage storage() const { return _storage; } diff --git a/src/Magnum/ImageView.h b/src/Magnum/ImageView.h index cc92bfaad..d3f226ce2 100644 --- a/src/Magnum/ImageView.h +++ b/src/Magnum/ImageView.h @@ -26,7 +26,7 @@ */ /** @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 @@ -80,11 +80,12 @@ sub-rectangle of a 75x75 8-bit RGB image , with rows aligned to four bytes: @section ImageView-mutable Data mutability -When using e.g. the @ref ImageView2D typedef, the viewed data are immutable. -This is the most common use case, in order to be able to mutate the underlying -data (for example in order to read into a pre-allocated memory), use -@ref MutableImageView2D and friends instead. @ref Image and -@ref Trade::ImageData are convertible to either of these. Similarly to +When using types derived from @ref BasicImageView (e.g. @ref ImageView2D), the +viewed data are immutable. This is the most common use case. In order to be +able to mutate the underlying data (for example in order to read into a +pre-allocated memory), use @ref BasicMutableImageView +(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 convertible to a const one. @@ -123,9 +124,9 @@ Metal-specific format identifier: @snippet Magnum.cpp ImageView-usage-metal -@see @ref ImageView1D, @ref ImageView2D, @ref ImageView3D, - @ref MutableImageView1D, @ref MutableImageView2D, @ref MutableImageView3D, - @ref Image-pixel-views +@see @ref BasicImageView, @ref ImageView1D, @ref ImageView2D, @ref ImageView3D, + @ref BasicMutableImageView, @ref MutableImageView1D, + @ref MutableImageView2D, @ref MutableImageView3D, @ref Image-pixel-views */ template class ImageView { public: @@ -136,20 +137,16 @@ template class ImageView { /** * @brief Raw data type * - * @cpp const char @ce for @ref ImageView1D / @ref ImageView2D / - * @ref ImageView3D and @cpp char @ce for @ref MutableImageView1D / - * @ref MutableImageView2D / @ref MutableImageView3D. See also - * @ref ErasedType. + * @cpp const char @ce for @ref BasicImageView and @cpp char @ce for + * @ref BasicMutableImageView. See also @ref ErasedType. */ typedef T Type; /** * @brief Erased data type * - * @cpp const void @ce for @ref ImageView1D / @ref ImageView2D / - * @ref ImageView3D and @cpp const void @ce for @ref MutableImageView1D - * / @ref MutableImageView2D / @ref MutableImageView3D. See also - * @ref Type. + * @cpp const void @ce for @ref BasicImageView and @cpp const void @ce + * for @ref BasicMutableImageView. See also @ref Type. */ typedef typename std::conditional::value, const void, void>::type ErasedType; @@ -463,47 +460,67 @@ template class ImageView { Containers::ArrayView _data; }; +/** +@brief Const image view + +@see @ref ImageView1D, @ref ImageView2D, @ref ImageView3D, + @ref BasicMutableImageView +*/ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ +template using BasicImageView = ImageView; +#endif + /** @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 -@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 -@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 using BasicMutableImageView = ImageView; +#endif /** @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 -@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 -@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 @@ -543,13 +560,14 @@ as first parameter. In the following snippet, the view is the bottom-right @section CompressedImageView-mutable Data mutability -When using e.g. the @ref CompressedImageView2D typedef, the viewed data are -immutable. This is the most common use case, in order to be able to mutate the -underlying data (for example in order to read into a pre-allocated memory), use -@ref MutableCompressedImageView2D and friends instead. @ref CompressedImage and -@ref Trade::ImageData are convertible to either of those. Similarly to -@ref Corrade::Containers::ArrayView etc., a mutable view is also implicitly -convertible to a const one. +When using types derived from @ref BasicCompressedImageView (e.g. +@ref CompressedImageView2D), the viewed data are immutable. This is the most +common use case. In order to be able to mutate the underlying data (for example +in order to read into a pre-allocated memory), use +@ref BasicMutableCompressedImageView (e.g. @ref MutableCompressedImageView2D) +instead. @ref CompressedImage and @ref Trade::ImageData are convertible to +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 @@ -766,47 +784,73 @@ template class CompressedImageView { Containers::ArrayView _data; }; +/** +@brief Const compressed image view + +@see @ref CompressedImageView1D, @ref CompressedImageView2D, + @ref CompressedImageView3D, @ref BasicMutableImageView +*/ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ +template using BasicCompressedImageView = CompressedImageView; +#endif + /** @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 -@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 -@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 using BasicMutableCompressedImageView = CompressedImageView; +#endif /** @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 -@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 -@see @ref CompressedImageView3D, @ref MutableImageView3D +@see @ref CompressedImageView3D, @ref MutableImageView3D, + @ref CompressedImageView */ -typedef CompressedImageView<3, char> MutableCompressedImageView3D; +typedef BasicMutableCompressedImageView<3> MutableCompressedImageView3D; template template inline ImageView::ImageView(const PixelStorage storage, const U format, const V formatExtra, const VectorTypeFor& size, const Containers::ArrayView data) noexcept: ImageView{storage, UnsignedInt(format), UnsignedInt(formatExtra), Implementation::pixelSizeAdl(format, formatExtra), size, data} { static_assert(sizeof(T) <= 4 && sizeof(U) <= 4, diff --git a/src/Magnum/Magnum.h b/src/Magnum/Magnum.h index aabca4cdb..6646ffd61 100644 --- a/src/Magnum/Magnum.h +++ b/src/Magnum/Magnum.h @@ -728,20 +728,24 @@ typedef CompressedImage<2> CompressedImage2D; typedef CompressedImage<3> CompressedImage3D; template class ImageView; -typedef ImageView<1, const char> ImageView1D; -typedef ImageView<2, const char> ImageView2D; -typedef ImageView<3, const char> ImageView3D; -typedef ImageView<1, char> MutableImageView1D; -typedef ImageView<2, char> MutableImageView2D; -typedef ImageView<3, char> MutableImageView3D; +template using BasicImageView = ImageView; +typedef BasicImageView<1> ImageView1D; +typedef BasicImageView<2> ImageView2D; +typedef BasicImageView<3> ImageView3D; +template using BasicMutableImageView = ImageView; +typedef BasicMutableImageView<1> MutableImageView1D; +typedef BasicMutableImageView<2> MutableImageView2D; +typedef BasicMutableImageView<3> MutableImageView3D; template class CompressedImageView; -typedef CompressedImageView<1, const char> CompressedImageView1D; -typedef CompressedImageView<2, const char> CompressedImageView2D; -typedef CompressedImageView<3, const char> CompressedImageView3D; -typedef CompressedImageView<1, char> MutableCompressedImageView1D; -typedef CompressedImageView<2, char> MutableCompressedImageView2D; -typedef CompressedImageView<3, char> MutableCompressedImageView3D; +template using BasicCompressedImageView = CompressedImageView; +typedef BasicCompressedImageView<1> CompressedImageView1D; +typedef BasicCompressedImageView<2> CompressedImageView2D; +typedef BasicCompressedImageView<3> CompressedImageView3D; +template using BasicMutableCompressedImageView = CompressedImageView; +typedef BasicMutableCompressedImageView<1> MutableCompressedImageView1D; +typedef BasicMutableCompressedImageView<2> MutableCompressedImageView2D; +typedef BasicMutableCompressedImageView<3> MutableCompressedImageView3D; enum class MeshPrimitive: UnsignedInt; enum class MeshIndexType: UnsignedInt; diff --git a/src/Magnum/Trade/ImageData.cpp b/src/Magnum/Trade/ImageData.cpp index fdaf4c652..d06969324 100644 --- a/src/Magnum/Trade/ImageData.cpp +++ b/src/Magnum/Trade/ImageData.cpp @@ -128,26 +128,26 @@ template Containers::StridedArrayView(*this); } -template ImageData::operator ImageView() { - CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (ImageView{_storage, _format, _formatExtra, _pixelSize, _size})); - return ImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; +template ImageData::operator BasicMutableImageView() { + CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (BasicMutableImageView{_storage, _format, _formatExtra, _pixelSize, _size})); + return BasicMutableImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; } -template ImageData::operator ImageView() const { - CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (ImageView{_storage, _format, _formatExtra, _pixelSize, _size})); - return ImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; +template ImageData::operator BasicImageView() const { + CORRADE_ASSERT(!_compressed, "Trade::ImageData: the image is compressed", (BasicImageView{_storage, _format, _formatExtra, _pixelSize, _size})); + return BasicImageView{_storage, _format, _formatExtra, _pixelSize, _size, _data}; } -template ImageData::operator CompressedImageView() { - CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (CompressedImageView{_compressedStorage, _compressedFormat, _size})); - return CompressedImageView{ +template ImageData::operator BasicMutableCompressedImageView() { + CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (BasicMutableCompressedImageView{_compressedStorage, _compressedFormat, _size})); + return BasicMutableCompressedImageView{ _compressedStorage, _compressedFormat, _size, _data}; } -template ImageData::operator CompressedImageView() const { - CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (CompressedImageView{_compressedStorage, _compressedFormat, _size})); - return CompressedImageView{ +template ImageData::operator BasicCompressedImageView() const { + CORRADE_ASSERT(_compressed, "Trade::ImageData: the image is not compressed", (BasicCompressedImageView{_compressedStorage, _compressedFormat, _size})); + return BasicCompressedImageView{ _compressedStorage, _compressedFormat, _size, _data}; } diff --git a/src/Magnum/Trade/ImageData.h b/src/Magnum/Trade/ImageData.h index f70e623cf..c945ac2a7 100644 --- a/src/Magnum/Trade/ImageData.h +++ b/src/Magnum/Trade/ImageData.h @@ -236,9 +236,9 @@ template class ImageData { */ /* Not restricted to const&, because we might want to pass the view to another function in an oneliner (e.g. saving screenshot) */ - /*implicit*/ operator ImageView(); + /*implicit*/ operator BasicMutableImageView(); /** @overload */ - /*implicit*/ operator ImageView() const; + /*implicit*/ operator BasicImageView() const; /** * @brief Conversion to compressed view @@ -248,9 +248,9 @@ template class ImageData { */ /* Not restricted to const&, because we might want to pass the view to another function in an oneliner (e.g. saving screenshot) */ - /*implicit*/ operator CompressedImageView(); + /*implicit*/ operator BasicMutableCompressedImageView(); /** @overload */ - /*implicit*/ operator CompressedImageView() const; + /*implicit*/ operator BasicCompressedImageView() const; /** * @brief Storage of pixel data