diff --git a/src/AbstractTexture.h b/src/AbstractTexture.h index 88d8ef220..eb63cb338 100644 --- a/src/AbstractTexture.h +++ b/src/AbstractTexture.h @@ -21,6 +21,7 @@ #include "Magnum.h" #include "TypeTraits.h" +#include "Image.h" namespace Magnum { @@ -104,16 +105,6 @@ class AbstractTexture { CompressedRGBA = GL_COMPRESSED_RGBA }; - /** @brief Color format */ - enum class ColorFormat: GLenum { - Red = GL_RED, - RedGreen = GL_RG, - RGB = GL_RGB, - RGBA = GL_RGBA, - BGR = GL_BGR, - BGRA = GL_BGRA - }; - /** * @brief Constructor * @param layer Texture layer (number between 0 and 31) diff --git a/src/Image.h b/src/Image.h new file mode 100644 index 000000000..d948c0723 --- /dev/null +++ b/src/Image.h @@ -0,0 +1,95 @@ +#ifndef Magnum_Image_h +#define Magnum_Image_h +/* + Copyright © 2010, 2011 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Image + */ + +#include "Magnum.h" +#include "TypeTraits.h" + +namespace Magnum { + +/** @brief Color format */ +enum class ColorFormat: GLenum { + Red = GL_RED, + RedGreen = GL_RG, + RGB = GL_RGB, + RGBA = GL_RGBA, + BGR = GL_BGR, + BGRA = GL_BGRA +}; + +/** +@brief Image + +Class for storing data, which are later fed to textures. It is just a +transparent envelope around the data, which holds additional information about +data type and dimensions. +*/ +template class Image { + DISABLE_COPY(Image) + + public: + const static size_t Dimensions = imageDimensions; /**< @brief Image dimension count */ + + /** + * @brief Constructor + * @param dimensions %Image dimensions + * @param colorFormat Color format of passed data. Data size + * per color channel is detected from format of passed data array. + * @param data %Image data + * + * @attention Note that the image data are not copied on construction, + * but they are deleted on class destruction. + */ + template Image(const Math::Vector& dimensions, ColorFormat colorFormat, const T* data): _dimensions(dimensions), _colorFormat(colorFormat), _type(TypeTraits::TextureType>::glType()), _data(reinterpret_cast(data)) {} + + /** @brief Destructor */ + virtual ~Image() { delete[] _data; } + + /** @brief %Image dimensions */ + inline const Math::Vector& dimensions() const { return _dimensions; } + + /** @brief Color format */ + inline ColorFormat colorFormat() const { return _colorFormat; } + + /** @brief Data type */ + GLenum type() const { return _type; } + + /** @brief Pointer to raw data */ + inline const void* data() const { return _data; } + + private: + Math::Vector _dimensions; + ColorFormat _colorFormat; + GLenum _type; + const char* _data; +}; + +/** @brief One-dimensional image */ +typedef Image<1> Image1D; + +/** @brief Two-dimensional image */ +typedef Image<2> Image2D; + +/** @brief Three-dimensional image */ +typedef Image<3> Image3D; + +} + +#endif