|  | /*!**************************************************************************** | 
|  |  | 
|  | @file         PVRTTexture.h | 
|  | @copyright    Copyright (c) Imagination Technologies Limited. | 
|  | @brief        Texture loading. | 
|  |  | 
|  | ******************************************************************************/ | 
|  | #ifndef _PVRTTEXTURE_H_ | 
|  | #define _PVRTTEXTURE_H_ | 
|  |  | 
|  | #include "PVRTGlobal.h" | 
|  |  | 
|  | /***************************************************************************** | 
|  | * Texture related constants and enumerations. | 
|  | *****************************************************************************/ | 
|  | // V3 Header Identifiers. | 
|  | const PVRTuint32 PVRTEX3_IDENT			= 0x03525650;	// 'P''V''R'3 | 
|  | const PVRTuint32 PVRTEX3_IDENT_REV		= 0x50565203; | 
|  | // If endianness is backwards then PVR3 will read as 3RVP, hence why it is written as an int. | 
|  |  | 
|  | //Current version texture identifiers | 
|  | const PVRTuint32 PVRTEX_CURR_IDENT		= PVRTEX3_IDENT; | 
|  | const PVRTuint32 PVRTEX_CURR_IDENT_REV	= PVRTEX3_IDENT_REV; | 
|  |  | 
|  | // PVR Header file flags.										Condition if true. If false, opposite is true unless specified. | 
|  | const PVRTuint32 PVRTEX3_FILE_COMPRESSED	= (1<<0);		//	Texture has been file compressed using PVRTexLib (currently unused) | 
|  | const PVRTuint32 PVRTEX3_PREMULTIPLIED		= (1<<1);		//	Texture has been premultiplied by alpha value. | 
|  |  | 
|  | // Mip Map level specifier constants. Other levels are specified by 1,2...n | 
|  | const PVRTint32 PVRTEX_TOPMIPLEVEL			= 0; | 
|  | const PVRTint32 PVRTEX_ALLMIPLEVELS			= -1; //This is a special number used simply to return a total of all MIP levels when dealing with data sizes. | 
|  |  | 
|  | //values for each meta data type that we know about. Texture arrays hinge on each surface being identical in all but content, including meta data. | 
|  | //If the meta data varies even slightly then a new texture should be used. It is possible to write your own extension to get around this however. | 
|  | enum EPVRTMetaData | 
|  | { | 
|  | ePVRTMetaDataTextureAtlasCoords=0, | 
|  | ePVRTMetaDataBumpData, | 
|  | ePVRTMetaDataCubeMapOrder, | 
|  | ePVRTMetaDataTextureOrientation, | 
|  | ePVRTMetaDataBorderData, | 
|  | ePVRTMetaDataPadding, | 
|  | ePVRTMetaDataNumMetaDataTypes | 
|  | }; | 
|  |  | 
|  | enum EPVRTAxis | 
|  | { | 
|  | ePVRTAxisX = 0, | 
|  | ePVRTAxisY = 1, | 
|  | ePVRTAxisZ = 2 | 
|  | }; | 
|  |  | 
|  | enum EPVRTOrientation | 
|  | { | 
|  | ePVRTOrientLeft	= 1<<ePVRTAxisX, | 
|  | ePVRTOrientRight= 0, | 
|  | ePVRTOrientUp	= 1<<ePVRTAxisY, | 
|  | ePVRTOrientDown	= 0, | 
|  | ePVRTOrientOut	= 1<<ePVRTAxisZ, | 
|  | ePVRTOrientIn	= 0 | 
|  | }; | 
|  |  | 
|  | enum EPVRTColourSpace | 
|  | { | 
|  | ePVRTCSpacelRGB, | 
|  | ePVRTCSpacesRGB, | 
|  | ePVRTCSpaceNumSpaces | 
|  | }; | 
|  |  | 
|  | //Compressed pixel formats | 
|  | enum EPVRTPixelFormat | 
|  | { | 
|  | ePVRTPF_PVRTCI_2bpp_RGB, | 
|  | ePVRTPF_PVRTCI_2bpp_RGBA, | 
|  | ePVRTPF_PVRTCI_4bpp_RGB, | 
|  | ePVRTPF_PVRTCI_4bpp_RGBA, | 
|  | ePVRTPF_PVRTCII_2bpp, | 
|  | ePVRTPF_PVRTCII_4bpp, | 
|  | ePVRTPF_ETC1, | 
|  | ePVRTPF_DXT1, | 
|  | ePVRTPF_DXT2, | 
|  | ePVRTPF_DXT3, | 
|  | ePVRTPF_DXT4, | 
|  | ePVRTPF_DXT5, | 
|  |  | 
|  | //These formats are identical to some DXT formats. | 
|  | ePVRTPF_BC1 = ePVRTPF_DXT1, | 
|  | ePVRTPF_BC2 = ePVRTPF_DXT3, | 
|  | ePVRTPF_BC3 = ePVRTPF_DXT5, | 
|  |  | 
|  | //These are currently unsupported: | 
|  | ePVRTPF_BC4, | 
|  | ePVRTPF_BC5, | 
|  | ePVRTPF_BC6, | 
|  | ePVRTPF_BC7, | 
|  |  | 
|  | //These are supported | 
|  | ePVRTPF_UYVY, | 
|  | ePVRTPF_YUY2, | 
|  | ePVRTPF_BW1bpp, | 
|  | ePVRTPF_SharedExponentR9G9B9E5, | 
|  | ePVRTPF_RGBG8888, | 
|  | ePVRTPF_GRGB8888, | 
|  | ePVRTPF_ETC2_RGB, | 
|  | ePVRTPF_ETC2_RGBA, | 
|  | ePVRTPF_ETC2_RGB_A1, | 
|  | ePVRTPF_EAC_R11, | 
|  | ePVRTPF_EAC_RG11, | 
|  |  | 
|  | //Invalid value | 
|  | ePVRTPF_NumCompressedPFs | 
|  | }; | 
|  |  | 
|  | //Variable Type Names | 
|  | enum EPVRTVariableType | 
|  | { | 
|  | ePVRTVarTypeUnsignedByteNorm, | 
|  | ePVRTVarTypeSignedByteNorm, | 
|  | ePVRTVarTypeUnsignedByte, | 
|  | ePVRTVarTypeSignedByte, | 
|  | ePVRTVarTypeUnsignedShortNorm, | 
|  | ePVRTVarTypeSignedShortNorm, | 
|  | ePVRTVarTypeUnsignedShort, | 
|  | ePVRTVarTypeSignedShort, | 
|  | ePVRTVarTypeUnsignedIntegerNorm, | 
|  | ePVRTVarTypeSignedIntegerNorm, | 
|  | ePVRTVarTypeUnsignedInteger, | 
|  | ePVRTVarTypeSignedInteger, | 
|  | ePVRTVarTypeSignedFloat,	ePVRTVarTypeFloat=ePVRTVarTypeSignedFloat, //the name ePVRTVarTypeFloat is now deprecated. | 
|  | ePVRTVarTypeUnsignedFloat, | 
|  | ePVRTVarTypeNumVarTypes | 
|  | }; | 
|  |  | 
|  | //A 64 bit pixel format ID & this will give you the high bits of a pixel format to check for a compressed format. | 
|  | static const PVRTuint64 PVRTEX_PFHIGHMASK=0xffffffff00000000ull; | 
|  |  | 
|  | /***************************************************************************** | 
|  | * Texture header structures. | 
|  | *****************************************************************************/ | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @struct       	MetaDataBlock | 
|  | @brief      	A struct containing a block of extraneous meta data for a texture. | 
|  | *************************************************************************/ | 
|  | struct MetaDataBlock | 
|  | { | 
|  | PVRTuint32	DevFOURCC;		///< A 4cc descriptor of the data type's creator. Values equating to values between 'P' 'V' 'R' 0 and 'P' 'V' 'R' 255 will be used by our headers. | 
|  | PVRTuint32	u32Key;			///< A DWORD (enum value) identifying the data type, and thus how to read it. | 
|  | PVRTuint32	u32DataSize;	///< Size of the Data member. | 
|  | PVRTuint8*	Data;			///< Data array, can be absolutely anything, the loader needs to know how to handle it based on DevFOURCC and Key. Use new operator to assign to it. | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		MetaDataBlock | 
|  | @brief      	Meta Data Block Constructor | 
|  | *************************************************************************/ | 
|  | MetaDataBlock() : DevFOURCC(0), u32Key(0), u32DataSize(0), Data(NULL) | 
|  | {} | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		MetaDataBlock | 
|  | @brief      	Meta Data Block Copy Constructor | 
|  | *************************************************************************/ | 
|  | MetaDataBlock(const MetaDataBlock& rhs)  : DevFOURCC(rhs.DevFOURCC), u32Key(rhs.u32Key), u32DataSize(rhs.u32DataSize) | 
|  | { | 
|  | //Copy the data across. | 
|  | Data = new PVRTuint8[u32DataSize]; | 
|  | for (PVRTuint32 uiDataAmt=0; uiDataAmt<u32DataSize; ++uiDataAmt) | 
|  | { | 
|  | Data[uiDataAmt]=rhs.Data[uiDataAmt]; | 
|  | } | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		~MetaDataBlock | 
|  | @brief      	Meta Data Block Destructor | 
|  | *************************************************************************/ | 
|  | ~MetaDataBlock() | 
|  | { | 
|  | if (Data) | 
|  | delete [] Data; | 
|  | Data = NULL; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		SizeOfBlock | 
|  | @return			size_t Size (in a file) of the block. | 
|  | @brief      	Returns the number of extra bytes this will add to any output files. | 
|  | *************************************************************************/ | 
|  | size_t SizeOfBlock() const | 
|  | { | 
|  | return sizeof(DevFOURCC)+sizeof(u32Key)+sizeof(u32DataSize)+u32DataSize; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Assigns one MetaDataBlock to the other. | 
|  | @return			MetaDataBlock This MetaDataBlock after the operation. | 
|  | *************************************************************************/ | 
|  | MetaDataBlock& operator=(const MetaDataBlock& rhs) | 
|  | { | 
|  | if (&rhs==this) | 
|  | return *this; | 
|  |  | 
|  | //Remove pre-existing data. | 
|  | if (Data) | 
|  | delete [] Data; | 
|  | Data=NULL; | 
|  |  | 
|  | //Copy the basic parameters | 
|  | DevFOURCC=rhs.DevFOURCC; | 
|  | u32Key=rhs.u32Key; | 
|  | u32DataSize=rhs.u32DataSize; | 
|  |  | 
|  | //Copy the data across. | 
|  | if (rhs.Data) | 
|  | { | 
|  | Data = new PVRTuint8[u32DataSize]; | 
|  | for (PVRTuint32 uiDataAmt=0; uiDataAmt<u32DataSize; ++uiDataAmt) | 
|  | { | 
|  | Data[uiDataAmt]=rhs.Data[uiDataAmt]; | 
|  | } | 
|  | } | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @fn       		ReadFromPtr | 
|  | @param[in]		pDataCursor		The data to read | 
|  | @brief      	Reads from a pointer of memory in to the meta data block. | 
|  | *****************************************************************************/ | 
|  | bool ReadFromPtr(const unsigned char** pDataCursor); | 
|  | }; | 
|  |  | 
|  | #pragma pack(push,4) | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @struct        PVRTextureHeaderV3 | 
|  | @brief      	A header for a PVR texture. | 
|  | @details       Contains everything required to read a texture accurately, and nothing more. Extraneous data is stored in a MetaDataBlock. | 
|  | Correct use of the texture may rely on MetaDataBlock, but accurate data loading can be done through the standard header alone. | 
|  | *****************************************************************************/ | 
|  | struct PVRTextureHeaderV3{ | 
|  | PVRTuint32	u32Version;			///< Version of the file header, used to identify it. | 
|  | PVRTuint32	u32Flags;			///< Various format flags. | 
|  | PVRTuint64	u64PixelFormat;		///< The pixel format, 8cc value storing the 4 channel identifiers and their respective sizes. | 
|  | PVRTuint32	u32ColourSpace;		///< The Colour Space of the texture, currently either linear RGB or sRGB. | 
|  | PVRTuint32	u32ChannelType;		///< Variable type that the channel is stored in. Supports signed/unsigned int/short/byte or float for now. | 
|  | PVRTuint32	u32Height;			///< Height of the texture. | 
|  | PVRTuint32	u32Width;			///< Width of the texture. | 
|  | PVRTuint32	u32Depth;			///< Depth of the texture. (Z-slices) | 
|  | PVRTuint32	u32NumSurfaces;		///< Number of members in a Texture Array. | 
|  | PVRTuint32	u32NumFaces;		///< Number of faces in a Cube Map. Maybe be a value other than 6. | 
|  | PVRTuint32	u32MIPMapCount;		///< Number of MIP Maps in the texture - NB: Includes top level. | 
|  | PVRTuint32	u32MetaDataSize;	///< Size of the accompanying meta data. | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @brief      	Constructor for the header - used to make sure that the header is initialised usefully. | 
|  | The initial pixel format is an invalid one and must be set. | 
|  | *****************************************************************************/ | 
|  | PVRTextureHeaderV3() : | 
|  | u32Version(PVRTEX3_IDENT),			        ///< Version of the file header. | 
|  | u32Flags(0),			                    ///< Format flags. | 
|  | u64PixelFormat(ePVRTPF_NumCompressedPFs),   ///< The pixel format. | 
|  | u32ColourSpace(0),		                    ///< The Colour Space of the texture. | 
|  | u32ChannelType(0),              		    ///< Variable type that the channel is stored in. | 
|  | u32Height(1),                           	///< Height of the texture. | 
|  | u32Width(1),    			                ///< Width of the texture. | 
|  | u32Depth(1),                		    	///< Depth of the texture. (Z-slices) | 
|  | u32NumSurfaces(1),                  		///< Number of members in a Texture Array. | 
|  | u32NumFaces(1),                        		///< Number of faces in a Cube Map. Maybe be a value other than 6. | 
|  | u32MIPMapCount(1),          		        ///< Number of MIP Maps in the texture - NB: Includes top level. | 
|  | u32MetaDataSize(0)                         	///< Size of the accompanying meta data. | 
|  | {} | 
|  | }; | 
|  | #pragma pack(pop) | 
|  | #define PVRTEX3_HEADERSIZE 52 | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @brief     Describes the Version 2 header of a PVR texture header. | 
|  | *****************************************************************************/ | 
|  | struct PVR_Texture_Header | 
|  | { | 
|  | PVRTuint32 dwHeaderSize;		/*!< size of the structure */ | 
|  | PVRTuint32 dwHeight;			/*!< height of surface to be created */ | 
|  | PVRTuint32 dwWidth;				/*!< width of input surface */ | 
|  | PVRTuint32 dwMipMapCount;		/*!< number of mip-map levels requested */ | 
|  | PVRTuint32 dwpfFlags;			/*!< pixel format flags */ | 
|  | PVRTuint32 dwTextureDataSize;	/*!< Total size in bytes */ | 
|  | PVRTuint32 dwBitCount;			/*!< number of bits per pixel  */ | 
|  | PVRTuint32 dwRBitMask;			/*!< mask for red bit */ | 
|  | PVRTuint32 dwGBitMask;			/*!< mask for green bits */ | 
|  | PVRTuint32 dwBBitMask;			/*!< mask for blue bits */ | 
|  | PVRTuint32 dwAlphaBitMask;		/*!< mask for alpha channel */ | 
|  | PVRTuint32 dwPVR;				/*!< magic number identifying pvr file */ | 
|  | PVRTuint32 dwNumSurfs;			/*!< the number of surfaces present in the pvr */ | 
|  | } ; | 
|  |  | 
|  | /***************************************************************************** | 
|  | * Legacy (V2 and V1) ENUMS | 
|  | *****************************************************************************/ | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @brief     Legacy pixel type. DEPRECATED. | 
|  | *****************************************************************************/ | 
|  | enum PVRTPixelType | 
|  | { | 
|  | MGLPT_ARGB_4444 = 0x00, | 
|  | MGLPT_ARGB_1555, | 
|  | MGLPT_RGB_565, | 
|  | MGLPT_RGB_555, | 
|  | MGLPT_RGB_888, | 
|  | MGLPT_ARGB_8888, | 
|  | MGLPT_ARGB_8332, | 
|  | MGLPT_I_8, | 
|  | MGLPT_AI_88, | 
|  | MGLPT_1_BPP, | 
|  | MGLPT_VY1UY0, | 
|  | MGLPT_Y1VY0U, | 
|  | MGLPT_PVRTC2, | 
|  | MGLPT_PVRTC4, | 
|  |  | 
|  | // OpenGL version of pixel types | 
|  | OGL_RGBA_4444= 0x10, | 
|  | OGL_RGBA_5551, | 
|  | OGL_RGBA_8888, | 
|  | OGL_RGB_565, | 
|  | OGL_RGB_555, | 
|  | OGL_RGB_888, | 
|  | OGL_I_8, | 
|  | OGL_AI_88, | 
|  | OGL_PVRTC2, | 
|  | OGL_PVRTC4, | 
|  | OGL_BGRA_8888, | 
|  | OGL_A_8, | 
|  | OGL_PVRTCII4,	///< Not in use | 
|  | OGL_PVRTCII2,	///< Not in use | 
|  |  | 
|  | // S3TC Encoding | 
|  | D3D_DXT1 = 0x20, | 
|  | D3D_DXT2, | 
|  | D3D_DXT3, | 
|  | D3D_DXT4, | 
|  | D3D_DXT5, | 
|  |  | 
|  | //RGB Formats | 
|  | D3D_RGB_332, | 
|  | D3D_AL_44, | 
|  | D3D_LVU_655, | 
|  | D3D_XLVU_8888, | 
|  | D3D_QWVU_8888, | 
|  |  | 
|  | //10 bit integer - 2 bit alpha | 
|  | D3D_ABGR_2101010, | 
|  | D3D_ARGB_2101010, | 
|  | D3D_AWVU_2101010, | 
|  |  | 
|  | //16 bit integers | 
|  | D3D_GR_1616, | 
|  | D3D_VU_1616, | 
|  | D3D_ABGR_16161616, | 
|  |  | 
|  | //Float Formats | 
|  | D3D_R16F, | 
|  | D3D_GR_1616F, | 
|  | D3D_ABGR_16161616F, | 
|  |  | 
|  | //32 bits per channel | 
|  | D3D_R32F, | 
|  | D3D_GR_3232F, | 
|  | D3D_ABGR_32323232F, | 
|  |  | 
|  | // Ericsson | 
|  | ETC_RGB_4BPP, | 
|  | ETC_RGBA_EXPLICIT,				///< Unimplemented | 
|  | ETC_RGBA_INTERPOLATED,			///< Unimplemented | 
|  |  | 
|  | D3D_A8 = 0x40, | 
|  | D3D_V8U8, | 
|  | D3D_L16, | 
|  |  | 
|  | D3D_L8, | 
|  | D3D_AL_88, | 
|  |  | 
|  | //Y'UV Colourspace | 
|  | D3D_UYVY, | 
|  | D3D_YUY2, | 
|  |  | 
|  | // DX10 | 
|  | DX10_R32G32B32A32_FLOAT= 0x50, | 
|  | DX10_R32G32B32A32_UINT , | 
|  | DX10_R32G32B32A32_SINT, | 
|  |  | 
|  | DX10_R32G32B32_FLOAT, | 
|  | DX10_R32G32B32_UINT, | 
|  | DX10_R32G32B32_SINT, | 
|  |  | 
|  | DX10_R16G16B16A16_FLOAT , | 
|  | DX10_R16G16B16A16_UNORM, | 
|  | DX10_R16G16B16A16_UINT , | 
|  | DX10_R16G16B16A16_SNORM , | 
|  | DX10_R16G16B16A16_SINT , | 
|  |  | 
|  | DX10_R32G32_FLOAT , | 
|  | DX10_R32G32_UINT , | 
|  | DX10_R32G32_SINT , | 
|  |  | 
|  | DX10_R10G10B10A2_UNORM , | 
|  | DX10_R10G10B10A2_UINT , | 
|  |  | 
|  | DX10_R11G11B10_FLOAT ,				///< Unimplemented | 
|  |  | 
|  | DX10_R8G8B8A8_UNORM , | 
|  | DX10_R8G8B8A8_UNORM_SRGB , | 
|  | DX10_R8G8B8A8_UINT , | 
|  | DX10_R8G8B8A8_SNORM , | 
|  | DX10_R8G8B8A8_SINT , | 
|  |  | 
|  | DX10_R16G16_FLOAT , | 
|  | DX10_R16G16_UNORM , | 
|  | DX10_R16G16_UINT , | 
|  | DX10_R16G16_SNORM , | 
|  | DX10_R16G16_SINT , | 
|  |  | 
|  | DX10_R32_FLOAT , | 
|  | DX10_R32_UINT , | 
|  | DX10_R32_SINT , | 
|  |  | 
|  | DX10_R8G8_UNORM , | 
|  | DX10_R8G8_UINT , | 
|  | DX10_R8G8_SNORM , | 
|  | DX10_R8G8_SINT , | 
|  |  | 
|  | DX10_R16_FLOAT , | 
|  | DX10_R16_UNORM , | 
|  | DX10_R16_UINT , | 
|  | DX10_R16_SNORM , | 
|  | DX10_R16_SINT , | 
|  |  | 
|  | DX10_R8_UNORM, | 
|  | DX10_R8_UINT, | 
|  | DX10_R8_SNORM, | 
|  | DX10_R8_SINT, | 
|  |  | 
|  | DX10_A8_UNORM, | 
|  | DX10_R1_UNORM, | 
|  | DX10_R9G9B9E5_SHAREDEXP,	///< Unimplemented | 
|  | DX10_R8G8_B8G8_UNORM,		///< Unimplemented | 
|  | DX10_G8R8_G8B8_UNORM,		///< Unimplemented | 
|  |  | 
|  | DX10_BC1_UNORM, | 
|  | DX10_BC1_UNORM_SRGB, | 
|  |  | 
|  | DX10_BC2_UNORM, | 
|  | DX10_BC2_UNORM_SRGB, | 
|  |  | 
|  | DX10_BC3_UNORM, | 
|  | DX10_BC3_UNORM_SRGB, | 
|  |  | 
|  | DX10_BC4_UNORM,				///< Unimplemented | 
|  | DX10_BC4_SNORM,				///< Unimplemented | 
|  |  | 
|  | DX10_BC5_UNORM,				///< Unimplemented | 
|  | DX10_BC5_SNORM,				///< Unimplemented | 
|  |  | 
|  | // OpenVG | 
|  |  | 
|  | /* RGB{A,X} channel ordering */ | 
|  | ePT_VG_sRGBX_8888  = 0x90, | 
|  | ePT_VG_sRGBA_8888, | 
|  | ePT_VG_sRGBA_8888_PRE, | 
|  | ePT_VG_sRGB_565, | 
|  | ePT_VG_sRGBA_5551, | 
|  | ePT_VG_sRGBA_4444, | 
|  | ePT_VG_sL_8, | 
|  | ePT_VG_lRGBX_8888, | 
|  | ePT_VG_lRGBA_8888, | 
|  | ePT_VG_lRGBA_8888_PRE, | 
|  | ePT_VG_lL_8, | 
|  | ePT_VG_A_8, | 
|  | ePT_VG_BW_1, | 
|  |  | 
|  | /* {A,X}RGB channel ordering */ | 
|  | ePT_VG_sXRGB_8888, | 
|  | ePT_VG_sARGB_8888, | 
|  | ePT_VG_sARGB_8888_PRE, | 
|  | ePT_VG_sARGB_1555, | 
|  | ePT_VG_sARGB_4444, | 
|  | ePT_VG_lXRGB_8888, | 
|  | ePT_VG_lARGB_8888, | 
|  | ePT_VG_lARGB_8888_PRE, | 
|  |  | 
|  | /* BGR{A,X} channel ordering */ | 
|  | ePT_VG_sBGRX_8888, | 
|  | ePT_VG_sBGRA_8888, | 
|  | ePT_VG_sBGRA_8888_PRE, | 
|  | ePT_VG_sBGR_565, | 
|  | ePT_VG_sBGRA_5551, | 
|  | ePT_VG_sBGRA_4444, | 
|  | ePT_VG_lBGRX_8888, | 
|  | ePT_VG_lBGRA_8888, | 
|  | ePT_VG_lBGRA_8888_PRE, | 
|  |  | 
|  | /* {A,X}BGR channel ordering */ | 
|  | ePT_VG_sXBGR_8888, | 
|  | ePT_VG_sABGR_8888 , | 
|  | ePT_VG_sABGR_8888_PRE, | 
|  | ePT_VG_sABGR_1555, | 
|  | ePT_VG_sABGR_4444, | 
|  | ePT_VG_lXBGR_8888, | 
|  | ePT_VG_lABGR_8888, | 
|  | ePT_VG_lABGR_8888_PRE, | 
|  |  | 
|  | // max cap for iterating | 
|  | END_OF_PIXEL_TYPES, | 
|  |  | 
|  | MGLPT_NOTYPE = 0xffffffff | 
|  |  | 
|  | }; | 
|  |  | 
|  | /***************************************************************************** | 
|  | * Legacy constants (V1/V2) | 
|  | *****************************************************************************/ | 
|  |  | 
|  | const PVRTuint32 PVRTEX_MIPMAP			= (1<<8);		///< Has mip map levels. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_TWIDDLE			= (1<<9);		///< Is twiddled. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_BUMPMAP			= (1<<10);		///< Has normals encoded for a bump map. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_TILING			= (1<<11);		///< Is bordered for tiled pvr. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_CUBEMAP			= (1<<12);		///< Is a cubemap/skybox. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_FALSEMIPCOL		= (1<<13);		///< Are there false coloured MIP levels. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_VOLUME			= (1<<14);		///< Is this a volume texture. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_ALPHA			= (1<<15);		///< v2.1. Is there transparency info in the texture. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_VERTICAL_FLIP	= (1<<16);		///< v2.1. Is the texture vertically flipped. DEPRECATED. | 
|  |  | 
|  | const PVRTuint32 PVRTEX_PIXELTYPE		= 0xff;			///< Pixel type is always in the last 16bits of the flags. DEPRECATED. | 
|  | const PVRTuint32 PVRTEX_IDENTIFIER		= 0x21525650;	///< The pvr identifier is the characters 'P','V','R'. DEPRECATED. | 
|  |  | 
|  | const PVRTuint32 PVRTEX_V1_HEADER_SIZE	= 44;			///< Old header size was 44 for identification purposes. DEPRECATED. | 
|  |  | 
|  | const PVRTuint32 PVRTC2_MIN_TEXWIDTH	= 16;			///< DEPRECATED. | 
|  | const PVRTuint32 PVRTC2_MIN_TEXHEIGHT	= 8; 			///< DEPRECATED. | 
|  | const PVRTuint32 PVRTC4_MIN_TEXWIDTH	= 8; 			///< DEPRECATED. | 
|  | const PVRTuint32 PVRTC4_MIN_TEXHEIGHT	= 8; 			///< DEPRECATED. | 
|  | const PVRTuint32 ETC_MIN_TEXWIDTH		= 4; 			///< DEPRECATED. | 
|  | const PVRTuint32 ETC_MIN_TEXHEIGHT		= 4; 			///< DEPRECATED. | 
|  | const PVRTuint32 DXT_MIN_TEXWIDTH		= 4; 			///< DEPRECATED. | 
|  | const PVRTuint32 DXT_MIN_TEXHEIGHT		= 4; 			///< DEPRECATED. | 
|  |  | 
|  | /**************************************************************************** | 
|  | ** Functions | 
|  | ****************************************************************************/ | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @fn       		PVRTTextureCreate | 
|  | @param[in]		w			Size of the texture | 
|  | @param[in]		h			Size of the texture | 
|  | @param[in]		wMin		Minimum size of a texture level | 
|  | @param[in]		hMin		Minimum size of a texture level | 
|  | @param[in]		nBPP		Bits per pixel of the format | 
|  | @param[in]		bMIPMap		Create memory for MIP-map levels also? | 
|  | @return		Allocated texture memory (must be free()d) | 
|  | @brief      	Creates a PVRTextureHeaderV3 structure, including room for | 
|  | the specified texture, in memory. | 
|  | *****************************************************************************/ | 
|  | PVRTextureHeaderV3 *PVRTTextureCreate( | 
|  | unsigned int		w, | 
|  | unsigned int		h, | 
|  | const unsigned int	wMin, | 
|  | const unsigned int	hMin, | 
|  | const unsigned int	nBPP, | 
|  | const bool			bMIPMap); | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @fn       		PVRTTextureTile | 
|  | @param[in,out]	pOut		The tiled texture in system memory | 
|  | @param[in]		pIn			The source texture | 
|  | @param[in]		nRepeatCnt	Number of times to repeat the source texture | 
|  | @brief      	Allocates and fills, in system memory, a texture large enough | 
|  | to repeat the source texture specified number of times. | 
|  | *****************************************************************************/ | 
|  | void PVRTTextureTile( | 
|  | PVRTextureHeaderV3			**pOut, | 
|  | const PVRTextureHeaderV3	* const pIn, | 
|  | const int					nRepeatCnt); | 
|  |  | 
|  | /**************************************************************************** | 
|  | ** Internal Functions | 
|  | ****************************************************************************/ | 
|  | //Preprocessor definitions to generate a pixelID for use when consts are needed. For example - switch statements. These should be evaluated by the compiler rather than at run time - assuming that arguments are all constant. | 
|  |  | 
|  | //Generate a 4 channel PixelID. | 
|  | #define PVRTGENPIXELID4(C1Name, C2Name, C3Name, C4Name, C1Bits, C2Bits, C3Bits, C4Bits) ( ( (PVRTuint64)C1Name) + ( (PVRTuint64)C2Name<<8) + ( (PVRTuint64)C3Name<<16) + ( (PVRTuint64)C4Name<<24) + ( (PVRTuint64)C1Bits<<32) + ( (PVRTuint64)C2Bits<<40) + ( (PVRTuint64)C3Bits<<48) + ( (PVRTuint64)C4Bits<<56) ) | 
|  |  | 
|  | //Generate a 1 channel PixelID. | 
|  | #define PVRTGENPIXELID3(C1Name, C2Name, C3Name, C1Bits, C2Bits, C3Bits)( PVRTGENPIXELID4(C1Name, C2Name, C3Name, 0, C1Bits, C2Bits, C3Bits, 0) ) | 
|  |  | 
|  | //Generate a 2 channel PixelID. | 
|  | #define PVRTGENPIXELID2(C1Name, C2Name, C1Bits, C2Bits) ( PVRTGENPIXELID4(C1Name, C2Name, 0, 0, C1Bits, C2Bits, 0, 0) ) | 
|  |  | 
|  | //Generate a 3 channel PixelID. | 
|  | #define PVRTGENPIXELID1(C1Name, C1Bits) ( PVRTGENPIXELID4(C1Name, 0, 0, 0, C1Bits, 0, 0, 0)) | 
|  |  | 
|  | //Forward declaration of CPVRTMap. | 
|  | template <typename KeyType, typename DataType> | 
|  | class CPVRTMap; | 
|  |  | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		PVRTGetBitsPerPixel | 
|  | @param[in]		u64PixelFormat		A PVR Pixel Format ID. | 
|  | @return		const PVRTuint32	Number of bits per pixel. | 
|  | @brief      	Returns the number of bits per pixel in a PVR Pixel Format | 
|  | identifier. | 
|  | *************************************************************************/ | 
|  | PVRTuint32 PVRTGetBitsPerPixel(PVRTuint64 u64PixelFormat); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		PVRTGetFormatMinDims | 
|  | @param[in]		u64PixelFormat	A PVR Pixel Format ID. | 
|  | @param[in,out]	minX			Returns the minimum width. | 
|  | @param[in,out]	minY			Returns the minimum height. | 
|  | @param[in,out]	minZ			Returns the minimum depth. | 
|  | @brief      	Gets the minimum dimensions (x,y,z) for a given pixel format. | 
|  | *************************************************************************/ | 
|  | void PVRTGetFormatMinDims(PVRTuint64 u64PixelFormat, PVRTuint32 &minX, PVRTuint32 &minY, PVRTuint32 &minZ); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		PVRTConvertOldTextureHeaderToV3 | 
|  | @param[in]		LegacyHeader	Legacy header for conversion. | 
|  | @param[in,out]	NewHeader		New header to output into. | 
|  | @param[in,out]	pMetaData		MetaData Map to output into. | 
|  | @brief      	Converts a legacy texture header (V1 or V2) to a current | 
|  | generation header (V3) | 
|  | *************************************************************************/ | 
|  | void PVRTConvertOldTextureHeaderToV3(const PVR_Texture_Header* LegacyHeader, PVRTextureHeaderV3& NewHeader, CPVRTMap<PVRTuint32, CPVRTMap<PVRTuint32,MetaDataBlock> >* pMetaData); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		PVRTMapLegacyTextureEnumToNewFormat | 
|  | @param[in]		OldFormat		Legacy Enumeration Value | 
|  | @param[in,out]	newType			New PixelType identifier. | 
|  | @param[in,out]	newCSpace		New ColourSpace | 
|  | @param[in,out]	newChanType		New Channel Type | 
|  | @param[in,out]	isPreMult		Whether format is pre-multiplied | 
|  | @brief      	Maps a legacy enumeration value to the new PVR3 style format. | 
|  | *************************************************************************/ | 
|  | void PVRTMapLegacyTextureEnumToNewFormat(PVRTPixelType OldFormat, PVRTuint64& newType, EPVRTColourSpace& newCSpace, EPVRTVariableType& newChanType, bool& isPreMult); | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @fn       		PVRTTextureLoadTiled | 
|  | @param[in,out]	pDst			Texture to place the tiled data | 
|  | @param[in]		nWidthDst		Width of destination texture | 
|  | @param[in]		nHeightDst		Height of destination texture | 
|  | @param[in]		pSrc			Texture to tile | 
|  | @param[in]		nWidthSrc		Width of source texture | 
|  | @param[in]		nHeightSrc		Height of source texture | 
|  | @param[in] 	nElementSize	Bytes per pixel | 
|  | @param[in]		bTwiddled		True if the data is twiddled | 
|  | @brief      	Needed by PVRTTextureTile() in the various PVRTTextureAPIs | 
|  | *****************************************************************************/ | 
|  | void PVRTTextureLoadTiled( | 
|  | PVRTuint8		* const pDst, | 
|  | const unsigned int	nWidthDst, | 
|  | const unsigned int	nHeightDst, | 
|  | const PVRTuint8	* const pSrc, | 
|  | const unsigned int	nWidthSrc, | 
|  | const unsigned int	nHeightSrc, | 
|  | const unsigned int	nElementSize, | 
|  | const bool			bTwiddled); | 
|  |  | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @fn       		PVRTTextureTwiddle | 
|  | @param[out]	a	Twiddled value | 
|  | @param[in]		u	Coordinate axis 0 | 
|  | @param[in]		v	Coordinate axis 1 | 
|  | @brief      	Combine a 2D coordinate into a twiddled value | 
|  | *****************************************************************************/ | 
|  | void PVRTTextureTwiddle(unsigned int &a, const unsigned int u, const unsigned int v); | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @fn       		PVRTTextureDeTwiddle | 
|  | @param[out]	u	Coordinate axis 0 | 
|  | @param[out]	v	Coordinate axis 1 | 
|  | @param[in]		a	Twiddled value | 
|  | @brief      	Extract 2D coordinates from a twiddled value. | 
|  | *****************************************************************************/ | 
|  | void PVRTTextureDeTwiddle(unsigned int &u, unsigned int &v, const unsigned int a); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @fn       		PVRTGetTextureDataSize | 
|  | @param[in]		sTextureHeader	Specifies the texture header. | 
|  | @param[in]		iMipLevel	Specifies a mip level to check, 'PVRTEX_ALLMIPLEVELS' | 
|  | can be passed to get the size of all MIP levels. | 
|  | @param[in]		bAllSurfaces	Size of all surfaces is calculated if true, | 
|  | only a single surface if false. | 
|  | @param[in]		bAllFaces	Size of all faces is calculated if true, | 
|  | only a single face if false. | 
|  | @return		PVRTuint32		Size in BYTES of the specified texture area. | 
|  | @brief      	Gets the size in BYTES of the texture, given various input | 
|  | parameters.	User can retrieve the size of either all | 
|  | surfaces or a single surface, all faces or a single face and | 
|  | all MIP-Maps or a single specified MIP level. | 
|  | *************************************************************************/ | 
|  | PVRTuint32 PVRTGetTextureDataSize(PVRTextureHeaderV3 sTextureHeader, PVRTint32 iMipLevel=PVRTEX_ALLMIPLEVELS, bool bAllSurfaces = true, bool bAllFaces = true); | 
|  |  | 
|  | #endif /* _PVRTTEXTURE_H_ */ | 
|  |  | 
|  | /***************************************************************************** | 
|  | End of file (PVRTTexture.h) | 
|  | *****************************************************************************/ | 
|  |  |