/*!****************************************************************************

 @file         OGLES3/PVRTTextureAPI.h
 @ingroup      API_OGLES3
 @copyright    Copyright (c) Imagination Technologies Limited.
 @brief        OGLES3 texture loading.

******************************************************************************/
#ifndef _PVRTTEXTUREAPI_H_
#define _PVRTTEXTUREAPI_H_

/*!
 @addtogroup      API_OGLES3
 @{
*/

#include "../PVRTError.h"

/****************************************************************************
** Functions
****************************************************************************/
template <typename KeyType, typename DataType>
class CPVRTMap;

/*!***************************************************************************
 @brief      	Allows textures to be stored in C header files and loaded in. Can load parts of a
				mipmaped texture (ie skipping the highest detailed levels).
				Sets the texture MIN/MAG filter to GL_LINEAR_MIPMAP_NEAREST/GL_LINEAR
				if mipmaps are present, GL_LINEAR/GL_LINEAR otherwise.
 @param[in]		pointer				Pointer to header-texture's structure
 @param[in,out]	texName				the OpenGL ES texture name as returned by glBindTexture
 @param[in,out]	psTextureHeader		Pointer to a PVRTextureHeaderV3 struct. Modified to
									contain the header data of the returned texture Ignored if NULL.
 @param[in]		bAllowDecompress	Allow decompression if PVRTC is not supported in hardware.
 @param[in]		nLoadFromLevel		Which mipmap level to start loading from (0=all)
 @param[in]		texPtr				If null, texture follows header, else texture is here.
 @param[in,out]	pMetaData			If a valid map is supplied, this will return any and all 
									MetaDataBlocks stored in the texture, organised by DevFourCC
									then identifier. Supplying NULL will ignore all MetaData.
 @return		PVR_SUCCESS on success
*****************************************************************************/
EPVRTError PVRTTextureLoadFromPointer(	const void* pointer,
										GLuint *const texName,
										const void *psTextureHeader=NULL,
										bool bAllowDecompress = true,
										const unsigned int nLoadFromLevel=0,
										const void * const texPtr=0,
										CPVRTMap<unsigned int, CPVRTMap<unsigned int, struct MetaDataBlock> > *pMetaData=NULL);

/*!***************************************************************************
 @brief      	Allows textures to be stored in binary PVR files and loaded in. Can load parts of a
				mipmaped texture (ie skipping the highest detailed levels).
				Sets the texture MIN/MAG filter to GL_LINEAR_MIPMAP_NEAREST/GL_LINEAR
				if mipmaps are present, GL_LINEAR/GL_LINEAR otherwise.
 @param[in]		filename			Filename of the .PVR file to load the texture from
 @param[in,out]	texName				the OpenGL ES texture name as returned by glBindTexture
 @param[in,out]	psTextureHeader		Pointer to a PVRTextureHeaderV3 struct. Modified to
									contain the header data of the returned texture Ignored if NULL.
 @param[in]		bAllowDecompress	Allow decompression if PVRTC is not supported in hardware.
 @param[in]		nLoadFromLevel		Which mipmap level to start loading from (0=all)
 @param[in,out]	pMetaData			If a valid map is supplied, this will return any and all 
									MetaDataBlocks stored in the texture, organised by DevFourCC
									then identifier. Supplying NULL will ignore all MetaData.
 @return		PVR_SUCCESS on success
*****************************************************************************/
EPVRTError PVRTTextureLoadFromPVR(	const char * const filename,
									GLuint * const texName,
									const void *psTextureHeader=NULL,
									bool bAllowDecompress = true,
									const unsigned int nLoadFromLevel=0,
									CPVRTMap<unsigned int, CPVRTMap<unsigned int, struct MetaDataBlock> > *pMetaData=NULL);

/*! @} */

#endif /* _PVRTTEXTUREAPI_H_ */

/*****************************************************************************
 End of file (PVRTTextureAPI.h)
*****************************************************************************/

