You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							229 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
	
	
							229 lines
						
					
					
						
							5.1 KiB
						
					
					
				| /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| // 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
 | |
| 
 |