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.
		
		
		
		
		
			
		
			
				
					
					
						
							159 lines
						
					
					
						
							5.0 KiB
						
					
					
				
			
		
		
	
	
							159 lines
						
					
					
						
							5.0 KiB
						
					
					
				/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
// Created : 2010-09-08 | 
						|
// Updated : 2010-09-27 | 
						|
// Licence : This source is under MIT License | 
						|
// File    : gli/gtx/loader_tga.inl | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
 | 
						|
namespace gli{ | 
						|
namespace gtx{ | 
						|
namespace loader_tga | 
						|
{ | 
						|
	inline texture2D loadTGA | 
						|
	( | 
						|
		std::string const & Filename | 
						|
	) | 
						|
	{ | 
						|
		std::ifstream FileIn(Filename.c_str(), std::ios::in | std::ios::binary); | 
						|
		if(!FileIn) | 
						|
			return texture2D(); | 
						|
 | 
						|
		unsigned char IdentificationFieldSize; | 
						|
		unsigned char ColorMapType; | 
						|
		unsigned char ImageType; | 
						|
		unsigned short ColorMapOrigin; | 
						|
		unsigned short ColorMapLength; | 
						|
		unsigned char ColorMapEntrySize; | 
						|
		unsigned short OriginX; | 
						|
		unsigned short OriginY; | 
						|
		unsigned short Width; | 
						|
		unsigned short Height; | 
						|
		unsigned char TexelSize; | 
						|
		unsigned char Descriptor; | 
						|
 | 
						|
		FileIn.read((char*)&IdentificationFieldSize, sizeof(IdentificationFieldSize)); | 
						|
		FileIn.read((char*)&ColorMapType, sizeof(ColorMapType)); | 
						|
		FileIn.read((char*)&ImageType, sizeof(ImageType)); | 
						|
		FileIn.read((char*)&ColorMapOrigin, sizeof(ColorMapOrigin)); | 
						|
		FileIn.read((char*)&ColorMapLength, sizeof(ColorMapLength)); | 
						|
		FileIn.read((char*)&ColorMapEntrySize, sizeof(ColorMapEntrySize)); | 
						|
		FileIn.read((char*)&OriginX, sizeof(OriginX)); | 
						|
		FileIn.read((char*)&OriginY, sizeof(OriginY)); | 
						|
		FileIn.read((char*)&Width, sizeof(Width)); | 
						|
		FileIn.read((char*)&Height, sizeof(Height)); | 
						|
		FileIn.read((char*)&TexelSize, sizeof(TexelSize)); | 
						|
		FileIn.read((char*)&Descriptor, sizeof(Descriptor)); | 
						|
 | 
						|
		gli::format Format = gli::FORMAT_NULL; | 
						|
		if(TexelSize == 24) | 
						|
			Format = gli::RGB8U; | 
						|
		else if(TexelSize == 32) | 
						|
			Format = gli::RGBA8U; | 
						|
		else | 
						|
			assert(0); | 
						|
 | 
						|
		image2D Mipmap(texture2D::dimensions_type(Width, Height), Format); | 
						|
 | 
						|
		if (FileIn.fail() || FileIn.bad()) | 
						|
		{ | 
						|
			assert(0); | 
						|
			return texture2D(); | 
						|
		} | 
						|
 | 
						|
		switch(ImageType) | 
						|
		{ | 
						|
		default: | 
						|
			assert(0); | 
						|
			return texture2D(); | 
						|
 | 
						|
		case 2: | 
						|
			FileIn.seekg(18 + ColorMapLength, std::ios::beg); | 
						|
 | 
						|
			char* IdentificationField = new char[IdentificationFieldSize + 1]; | 
						|
			FileIn.read(IdentificationField, IdentificationFieldSize); | 
						|
			IdentificationField[IdentificationFieldSize] = '\0'; | 
						|
			delete[] IdentificationField; | 
						|
 | 
						|
			std::size_t DataSize = Width * Height * (TexelSize >> 3); | 
						|
			FileIn.read((char*)Mipmap.data(), std::streamsize(DataSize)); | 
						|
 | 
						|
			if(FileIn.fail() || FileIn.bad()) | 
						|
				return texture2D(); | 
						|
			break; | 
						|
		} | 
						|
 | 
						|
		FileIn.close(); | 
						|
 | 
						|
		texture2D Image(1); | 
						|
		Image[0] = Mipmap; | 
						|
 | 
						|
		// TGA images are saved in BGR or BGRA format. | 
						|
		if(TexelSize == 24) | 
						|
			Image.swizzle<glm::u8vec3>(gli::B, gli::G, gli::R, gli::A); | 
						|
		if(TexelSize == 32) | 
						|
			Image.swizzle<glm::u8vec4>(gli::B, gli::G, gli::R, gli::A); | 
						|
 | 
						|
		return Image; | 
						|
	} | 
						|
 | 
						|
	inline void saveTGA | 
						|
	( | 
						|
		gli::texture2D const & ImageIn,  | 
						|
		std::string const & Filename | 
						|
	) | 
						|
	{ | 
						|
		std::ofstream FileOut(Filename.c_str(), std::ios::out | std::ios::binary); | 
						|
		if (!FileOut) | 
						|
			return; | 
						|
 | 
						|
		gli::texture2D Image = duplicate(ImageIn); | 
						|
 | 
						|
		unsigned char IdentificationFieldSize = 1; | 
						|
		unsigned char ColorMapType = 0; | 
						|
		unsigned char ImageType = 2; | 
						|
		unsigned short ColorMapOrigin = 0; | 
						|
		unsigned short ColorMapLength = 0; | 
						|
		unsigned char ColorMapEntrySize = 0; | 
						|
		unsigned short OriginX = 0; | 
						|
		unsigned short OriginY = 0; | 
						|
		unsigned short Width = Image[0].dimensions().x; | 
						|
		unsigned short Height = Image[0].dimensions().y; | 
						|
		unsigned char TexelSize = (unsigned char)(Image[0].value_size()); | 
						|
		unsigned char Descriptor = 0; | 
						|
 | 
						|
		if(TexelSize == 24) | 
						|
			Image.swizzle<glm::u8vec3>(gli::B, gli::G, gli::R, gli::A); | 
						|
		if(TexelSize == 32) | 
						|
			Image.swizzle<glm::u8vec4>(gli::B, gli::G, gli::R, gli::A); | 
						|
 | 
						|
		FileOut.write((char*)&IdentificationFieldSize, sizeof(IdentificationFieldSize)); | 
						|
		FileOut.write((char*)&ColorMapType, sizeof(ColorMapType)); | 
						|
		FileOut.write((char*)&ImageType, sizeof(ImageType)); | 
						|
		FileOut.write((char*)&ColorMapOrigin, sizeof(ColorMapOrigin)); | 
						|
		FileOut.write((char*)&ColorMapLength, sizeof(ColorMapLength)); | 
						|
		FileOut.write((char*)&ColorMapEntrySize, sizeof(ColorMapEntrySize)); | 
						|
		FileOut.write((char*)&OriginX, sizeof(OriginX)); | 
						|
		FileOut.write((char*)&OriginY, sizeof(OriginY)); | 
						|
		FileOut.write((char*)&Width, sizeof(Width)); | 
						|
		FileOut.write((char*)&Height, sizeof(Height)); | 
						|
		FileOut.write((char*)&TexelSize, sizeof(TexelSize)); | 
						|
		FileOut.write((char*)&Descriptor, sizeof(Descriptor)); | 
						|
 | 
						|
		if (FileOut.fail () || FileOut.bad ()) | 
						|
			return; | 
						|
 | 
						|
		FileOut.seekp(18 + ColorMapLength, std::ios::beg); | 
						|
		char* IdentificationField = new char[IdentificationFieldSize + 1]; | 
						|
		FileOut.write(IdentificationField, std::streamsize(IdentificationFieldSize)); | 
						|
		delete[] IdentificationField; | 
						|
		FileOut.write((char*)Image[0].data(), std::streamsize(Image[0].capacity())); | 
						|
		if(FileOut.fail() || FileOut.bad()) | 
						|
			return; | 
						|
 | 
						|
		FileOut.close (); | 
						|
	} | 
						|
}//namespace loader_tga | 
						|
}//namespace gtx | 
						|
}//namespace gli
 | 
						|
 |