112 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /// @brief Include to use images, a representation of a single texture level.
 | |
| /// @file gli/image.hpp
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include "./core/storage_linear.hpp"
 | |
| 
 | |
| namespace gli
 | |
| {
 | |
| 	/// Image, representation for a single texture level
 | |
| 	class image
 | |
| 	{
 | |
| 	private:
 | |
| 		friend class texture1d;
 | |
| 		friend class texture2d;
 | |
| 		friend class texture3d;
 | |
| 
 | |
| 	public:
 | |
| 		typedef size_t size_type;
 | |
| 		typedef gli::format format_type;
 | |
| 		typedef storage_linear::extent_type extent_type;
 | |
| 		typedef storage_linear::data_type data_type;
 | |
| 
 | |
| 		/// Create an empty image instance
 | |
| 		image();
 | |
| 
 | |
| 		/// Create an image object and allocate an image storoge for it.
 | |
| 		explicit image(format_type Format, extent_type const& Extent);
 | |
| 
 | |
| 		/// Create an image object by sharing an existing image storage_linear from another image instance.
 | |
| 		/// This image object is effectively an image view where format can be reinterpreted
 | |
| 		/// with a different compatible image format.
 | |
| 		/// For formats to be compatible, the block size of source and destination must match.
 | |
| 		explicit image(image const& Image, format_type Format);
 | |
| 
 | |
| 		/// Return whether the image instance is empty, no storage_linear or description have been assigned to the instance.
 | |
| 		bool empty() const;
 | |
| 
 | |
| 		/// Return the image instance format.
 | |
| 		format_type format() const;
 | |
| 
 | |
| 		/// Return the dimensions of an image instance: width, height and depth.
 | |
| 		extent_type extent() const;
 | |
| 
 | |
| 		/// Return the memory size of an image instance storage_linear in bytes.
 | |
| 		size_type size() const;
 | |
| 
 | |
| 		/// Return the number of blocks contained in an image instance storage_linear.
 | |
| 		/// genType size must match the block size conresponding to the image format. 
 | |
| 		template <typename genType>
 | |
| 		size_type size() const;
 | |
| 
 | |
| 		/// Return a pointer to the beginning of the image instance data.
 | |
| 		void* data();
 | |
| 
 | |
| 		/// Return a pointer to the beginning of the image instance data.
 | |
| 		void const* data() const;
 | |
| 
 | |
| 		/// Return a pointer of type genType which size must match the image format block size.
 | |
| 		template <typename genType>
 | |
| 		genType* data();
 | |
| 
 | |
| 		/// Return a pointer of type genType which size must match the image format block size.
 | |
| 		template <typename genType>
 | |
| 		genType const* data() const;
 | |
| 
 | |
| 		/// Clear the entire image storage_linear with zeros
 | |
| 		void clear();
 | |
| 
 | |
| 		/// Clear the entire image storage_linear with Texel which type must match the image storage_linear format block size
 | |
| 		/// If the type of genType doesn't match the type of the image format, no conversion is performed and the data will be reinterpreted as if is was of the image format. 
 | |
| 		template <typename genType>
 | |
| 		void clear(genType const& Texel);
 | |
| 
 | |
| 		/// Load the texel located at TexelCoord coordinates.
 | |
| 		/// It's an error to call this function if the format is compressed.
 | |
| 		/// It's an error if TexelCoord values aren't between [0, dimensions].
 | |
| 		template <typename genType>
 | |
| 		genType load(extent_type const& TexelCoord);
 | |
| 
 | |
| 		/// Store the texel located at TexelCoord coordinates.
 | |
| 		/// It's an error to call this function if the format is compressed.
 | |
| 		/// It's an error if TexelCoord values aren't between [0, dimensions].
 | |
| 		template <typename genType>
 | |
| 		void store(extent_type const& TexelCoord, genType const& Data);
 | |
| 
 | |
| 	private:
 | |
| 		/// Create an image object by sharing an existing image storage_linear from another image instance.
 | |
| 		/// This image object is effectively an image view where the layer, the face and the level allows identifying
 | |
| 		/// a specific subset of the image storage_linear source. 
 | |
| 		/// This image object is effectively a image view where the format can be reinterpreted
 | |
| 		/// with a different compatible image format.
 | |
| 		explicit image(
 | |
| 			std::shared_ptr<storage_linear> Storage,
 | |
| 			format_type Format,
 | |
| 			size_type BaseLayer,
 | |
| 			size_type BaseFace,
 | |
| 			size_type BaseLevel);
 | |
| 
 | |
| 		std::shared_ptr<storage_linear> Storage;
 | |
| 		format_type const Format;
 | |
| 		size_type const BaseLevel;
 | |
| 		data_type* Data;
 | |
| 		size_type const Size;
 | |
| 
 | |
| 		data_type* compute_data(size_type BaseLayer, size_type BaseFace, size_type BaseLevel);
 | |
| 		size_type compute_size(size_type Level) const;
 | |
| 	};
 | |
| }//namespace gli
 | |
| 
 | |
| #include "./core/image.inl"
 | 
