230 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net)
 | |
| ///////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // Created : 2011-04-05
 | |
| // Updated : 2011-04-05
 | |
| // Licence : This source is under MIT License
 | |
| // File    : gli/core/image2d.inl
 | |
| ///////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| namespace gli
 | |
| {
 | |
| 	namespace detail
 | |
| 	{
 | |
| 		struct format_desc
 | |
| 		{
 | |
| 			image2D::size_type BlockSize;
 | |
| 			image2D::size_type BBP;
 | |
| 			image2D::size_type Component;
 | |
| 		};
 | |
| 
 | |
| 		inline format_desc getFormatInfo(format const & Format)
 | |
| 		{
 | |
| 			format_desc Desc[FORMAT_MAX] =
 | |
| 			{
 | |
| 				{  0,  0,  0},	//FORMAT_NULL
 | |
| 
 | |
| 				// Unsigned integer formats
 | |
| 				{  1,   8,  1},	//R8U,
 | |
| 				{  2,  16,  2},	//RG8U,
 | |
| 				{  3,  24,  3},	//RGB8U,
 | |
| 				{  4,  32,  4},	//RGBA8U,
 | |
| 
 | |
| 				{  2,  16,  1},	//R16U,
 | |
| 				{  4,  32,  2},	//RG16U,
 | |
| 				{  6,  48,  3},	//RGB16U,
 | |
| 				{  8,  64,  4},	//RGBA16U,
 | |
| 
 | |
| 				{  4,  32,  1},	//R32U,
 | |
| 				{  8,  64,  2},	//RG32U,
 | |
| 				{ 12,  96,  3},	//RGB32U,
 | |
| 				{ 16, 128,  4},	//RGBA32U,
 | |
| 
 | |
| 				//// Signed integer formats
 | |
| 				{  4,  32,  1},	//R8I,
 | |
| 				{  8,  64,  2},	//RG8I,
 | |
| 				{ 12,  96,  3},	//RGB8I,
 | |
| 				{ 16, 128,  4},	//RGBA8I,
 | |
| 
 | |
| 				{  2,  16,  1},	//R16I,
 | |
| 				{  4,  32,  2},	//RG16I,
 | |
| 				{  6,  48,  3},	//RGB16I,
 | |
| 				{  8,  64,  4},	//RGBA16I,
 | |
| 
 | |
| 				{  4,  32,  1},	//R32I,
 | |
| 				{  8,  64,  2},	//RG32I,
 | |
| 				{ 12,  96,  3},	//RGB32I,
 | |
| 				{ 16, 128,  4},	//RGBA32I,
 | |
| 
 | |
| 				//// Floating formats
 | |
| 				{  2,  16,  1},	//R16F,
 | |
| 				{  4,  32,  2},	//RG16F,
 | |
| 				{  6,  48,  3},	//RGB16F,
 | |
| 				{  8,  64,  4},	//RGBA16F,
 | |
| 
 | |
| 				{  4,  32,  1},	//R32F,
 | |
| 				{  8,  64,  2},	//RG32F,
 | |
| 				{ 12,  96,  3},	//RGB32F,
 | |
| 				{ 16, 128,  4},	//RGBA32F,
 | |
| 
 | |
| 				//// Packed formats
 | |
| 				{  4,  32,  3},	//RGBE8,
 | |
| 				{  4,  32,  3},	//RGB9E5,
 | |
| 				{  4,  32,  3},	//RG11B10F,
 | |
| 				{  2,  16,  3},	//R5G6B5,
 | |
| 				{  2,  16,  4},	//RGBA4,
 | |
| 				{  4,  32,  3},	//RGB10A2,
 | |
| 
 | |
| 				//// Depth formats
 | |
| 				{  2,  16,  1},	//D16,
 | |
| 				{  4,  32,  1},	//D24X8,
 | |
| 				{  4,  32,  2},	//D24S8,
 | |
| 				{  4,  32,  1},	//D32F,
 | |
| 				{  8,  64,  2},	//D32FS8X24,
 | |
| 
 | |
| 				//// Compressed formats
 | |
| 				{  8,   4,  4},	//DXT1,
 | |
| 				{ 16,   8,  4},	//DXT3,
 | |
| 				{ 16,   8,  4},	//DXT5,
 | |
| 				{  8,   4,  1},	//ATI1N_UNORM,
 | |
| 				{  8,   4,  1},	//ATI1N_SNORM,
 | |
| 				{ 16,   8,  2},	//ATI2N_UNORM,
 | |
| 				{ 16,   8,  2},	//ATI2N_SNORM,
 | |
| 				{ 16,   8,  3},	//BP_UF16,
 | |
| 				{ 16,   8,  3},	//BP_SF16,
 | |
| 				{ 16,   8,  4},	//BP,
 | |
| 			};
 | |
| 
 | |
| 			return Desc[Format];
 | |
| 		}
 | |
| 
 | |
| 		inline image2D::size_type sizeBlock
 | |
| 		(
 | |
| 			format const & Format
 | |
| 		)
 | |
| 		{
 | |
| 			return getFormatInfo(Format).BlockSize;
 | |
| 		}
 | |
| 
 | |
| 		inline image2D::size_type sizeBitPerPixel
 | |
| 		(
 | |
| 			format const & Format
 | |
| 		)
 | |
| 		{
 | |
| 			return getFormatInfo(Format).BBP;
 | |
| 		}
 | |
| 
 | |
| 		inline image2D::size_type sizeComponent
 | |
| 		(
 | |
| 			format const & Format
 | |
| 		)
 | |
| 		{
 | |
| 			return getFormatInfo(Format).Component;
 | |
| 		}
 | |
| 
 | |
| 		inline image2D::size_type sizeLinear
 | |
| 		(
 | |
| 			image2D const & Image
 | |
| 		)
 | |
| 		{
 | |
| 			image2D::dimensions_type Dimension = Image.dimensions();
 | |
| 			Dimension = glm::max(Dimension, image2D::dimensions_type(1));
 | |
| 
 | |
| 			image2D::size_type BlockSize = sizeBlock(Image.format());
 | |
| 			image2D::size_type BPP = sizeBitPerPixel(Image.format());
 | |
| 			image2D::size_type BlockCount = 0;
 | |
| 			if((BlockSize << 3) == BPP)
 | |
| 				BlockCount = Dimension.x * Dimension.y;
 | |
| 			else
 | |
| 				BlockCount = ((Dimension.x + 3) >> 2) * ((Dimension.y + 3) >> 2);			
 | |
| 
 | |
| 			return BlockCount * BlockSize;
 | |
| 		}
 | |
| 	}//namespace detail
 | |
| 
 | |
| 	inline image2D::image2D() :
 | |
| 		Data(0),
 | |
| 		Dimensions(0),
 | |
| 		Format(FORMAT_NULL)
 | |
| 	{}
 | |
| 
 | |
| 	inline image2D::image2D
 | |
| 	(
 | |
| 		image2D const & Image
 | |
| 	) :
 | |
| 		Data(Image.Data),
 | |
| 		Dimensions(Image.Dimensions),
 | |
| 		Format(Image.Format)
 | |
| 	{}
 | |
| 
 | |
| 	inline image2D::image2D   
 | |
| 	(
 | |
| 		dimensions_type const & Dimensions,
 | |
| 		format_type const & Format
 | |
| 	) :
 | |
| 		Data((glm::compMul(Dimensions) * detail::sizeBitPerPixel(Format)) >> 3),
 | |
| 		Dimensions(Dimensions),
 | |
| 		Format(Format)
 | |
| 	{}
 | |
| 
 | |
| 	inline image2D::image2D
 | |
| 	(
 | |
| 		dimensions_type const & Dimensions,
 | |
| 		format_type const & Format,
 | |
| 		std::vector<value_type> const & Data
 | |
| 	) :
 | |
| 		Data(Data),
 | |
| 		Dimensions(Dimensions),
 | |
| 		Format(Format)
 | |
| 	{}
 | |
| 
 | |
| 	inline image2D::~image2D()
 | |
| 	{}
 | |
| 
 | |
| 	template <typename genType>
 | |
| 	inline void image2D::setPixel
 | |
| 	(
 | |
| 		dimensions_type const & TexelCoord,
 | |
| 		genType const & TexelData
 | |
| 	)
 | |
| 	{
 | |
| 		size_type Index = this->dimensions().x * sizeof(genType) * TexelCoord.y + sizeof(genType) * TexelCoord.x;
 | |
| 		memcpy(this->data() + Index, &TexelData[0], sizeof(genType));
 | |
| 	}
 | |
| 
 | |
| 	inline image2D::size_type image2D::value_size() const
 | |
| 	{
 | |
| 		return detail::sizeBitPerPixel(this->format());
 | |
| 	}
 | |
| 
 | |
| 	inline image2D::size_type image2D::capacity() const
 | |
| 	{
 | |
| 		return detail::sizeLinear(*this);
 | |
| 	}
 | |
| 
 | |
| 	inline image2D::dimensions_type image2D::dimensions() const
 | |
| 	{
 | |
| 		return this->Dimensions;
 | |
| 	}
 | |
| 
 | |
| 	inline image2D::size_type image2D::components() const
 | |
| 	{
 | |
| 		return detail::sizeComponent(this->format());
 | |
| 	}
 | |
| 
 | |
| 	inline image2D::format_type image2D::format() const
 | |
| 	{
 | |
| 		return this->Format;
 | |
| 	}
 | |
| 
 | |
| 	inline image2D::value_type * image2D::data()
 | |
| 	{
 | |
| 		return &this->Data[0];
 | |
| 	}
 | |
| 
 | |
| 	inline image2D::value_type const * const image2D::data() const
 | |
| 	{
 | |
| 		return &this->Data[0];
 | |
| 	}
 | |
| }//namespace gli
 | 
