 d37d3539ed
			
		
	
	
		d37d3539ed
		
	
	
	
	
		
			
			- Increased assert coverage - Increased static_assert coverage - Replaced GLM traits by STL traits when possible - Allowed including individual core feature
		
			
				
	
	
		
			160 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // 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
 |