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.
		
		
		
		
		
			
		
			
				
					
					
						
							80 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
	
	
							80 lines
						
					
					
						
							2.5 KiB
						
					
					
				#include <cstdio> | 
						|
#include <glm/gtc/round.hpp> | 
						|
#include "../load_kmg.hpp" | 
						|
#include "filter.hpp" | 
						|
#include "file.hpp" | 
						|
 | 
						|
namespace gli | 
						|
{ | 
						|
	inline bool save_kmg(texture const & Texture, std::vector<char> & Memory) | 
						|
	{ | 
						|
		if(Texture.empty()) | 
						|
			return false; | 
						|
 | 
						|
		Memory.resize(sizeof(detail::FOURCC_KMG100) + sizeof(detail::kmgHeader10) + Texture.size()); | 
						|
 | 
						|
		std::memcpy(&Memory[0], detail::FOURCC_KMG100, sizeof(detail::FOURCC_KMG100)); | 
						|
 | 
						|
		std::size_t Offset = sizeof(detail::FOURCC_KMG100); | 
						|
 | 
						|
		texture::swizzles_type Swizzle = Texture.swizzles(); | 
						|
 | 
						|
		detail::kmgHeader10 & Header = *reinterpret_cast<detail::kmgHeader10*>(&Memory[0] + Offset); | 
						|
		Header.Endianness = 0x04030201; | 
						|
		Header.Format = Texture.format(); | 
						|
		Header.Target = Texture.target(); | 
						|
		Header.SwizzleRed = Swizzle[0]; | 
						|
		Header.SwizzleGreen = Swizzle[1]; | 
						|
		Header.SwizzleBlue = Swizzle[2]; | 
						|
		Header.SwizzleAlpha = Swizzle[3]; | 
						|
		Header.PixelWidth = static_cast<std::uint32_t>(Texture.extent().x); | 
						|
		Header.PixelHeight = static_cast<std::uint32_t>(Texture.extent().y); | 
						|
		Header.PixelDepth = static_cast<std::uint32_t>(Texture.extent().z); | 
						|
		Header.Layers = static_cast<std::uint32_t>(Texture.layers()); | 
						|
		Header.Levels = static_cast<std::uint32_t>(Texture.levels()); | 
						|
		Header.Faces = static_cast<std::uint32_t>(Texture.faces()); | 
						|
		Header.GenerateMipmaps = FILTER_NONE; | 
						|
		Header.BaseLevel = static_cast<std::uint32_t>(Texture.base_level()); | 
						|
		Header.MaxLevel = static_cast<std::uint32_t>(Texture.max_level()); | 
						|
 | 
						|
		Offset += sizeof(detail::kmgHeader10); | 
						|
 | 
						|
		for(texture::size_type Layer = 0, Layers = Texture.layers(); Layer < Layers; ++Layer) | 
						|
		for(texture::size_type Level = 0, Levels = Texture.levels(); Level < Levels; ++Level) | 
						|
		{ | 
						|
			texture::size_type const FaceSize = Texture.size(Level); | 
						|
			for(texture::size_type Face = 0, Faces = Texture.faces(); Face < Faces; ++Face) | 
						|
			{ | 
						|
				std::memcpy(&Memory[0] + Offset, Texture.data(Layer, Face, Level), FaceSize); | 
						|
 | 
						|
				Offset += FaceSize; | 
						|
				GLI_ASSERT(Offset <= Memory.size()); | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		return true; | 
						|
	} | 
						|
 | 
						|
	inline bool save_kmg(texture const & Texture, char const * Filename) | 
						|
	{ | 
						|
		if(Texture.empty()) | 
						|
			return false; | 
						|
 | 
						|
		FILE* File = detail::open_file(Filename, "wb"); | 
						|
		if(!File) | 
						|
			return false; | 
						|
 | 
						|
		std::vector<char> Memory; | 
						|
		bool const Result = save_kmg(Texture, Memory); | 
						|
 | 
						|
		std::fwrite(&Memory[0], 1, Memory.size(), File); | 
						|
		std::fclose(File); | 
						|
 | 
						|
		return Result; | 
						|
	} | 
						|
 | 
						|
	inline bool save_kmg(texture const & Texture, std::string const & Filename) | 
						|
	{ | 
						|
		return save_kmg(Texture, Filename.c_str()); | 
						|
	} | 
						|
}//namespace gli
 | 
						|
 |