1 /*!**************************************************************************** 2 3 @file PVRTTexture.h 4 @copyright Copyright (c) Imagination Technologies Limited. 5 @brief Texture loading. 6 7 ******************************************************************************/ 8 #ifndef _PVRTTEXTURE_H_ 9 #define _PVRTTEXTURE_H_ 10 11 #include "PVRTGlobal.h" 12 13 /***************************************************************************** 14 * Texture related constants and enumerations. 15 *****************************************************************************/ 16 // V3 Header Identifiers. 17 const PVRTuint32 PVRTEX3_IDENT = 0x03525650; // 'P''V''R'3 18 const PVRTuint32 PVRTEX3_IDENT_REV = 0x50565203; 19 // If endianness is backwards then PVR3 will read as 3RVP, hence why it is written as an int. 20 21 //Current version texture identifiers 22 const PVRTuint32 PVRTEX_CURR_IDENT = PVRTEX3_IDENT; 23 const PVRTuint32 PVRTEX_CURR_IDENT_REV = PVRTEX3_IDENT_REV; 24 25 // PVR Header file flags. Condition if true. If false, opposite is true unless specified. 26 const PVRTuint32 PVRTEX3_FILE_COMPRESSED = (1<<0); // Texture has been file compressed using PVRTexLib (currently unused) 27 const PVRTuint32 PVRTEX3_PREMULTIPLIED = (1<<1); // Texture has been premultiplied by alpha value. 28 29 // Mip Map level specifier constants. Other levels are specified by 1,2...n 30 const PVRTint32 PVRTEX_TOPMIPLEVEL = 0; 31 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. 32 33 //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. 34 //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. 35 enum EPVRTMetaData 36 { 37 ePVRTMetaDataTextureAtlasCoords=0, 38 ePVRTMetaDataBumpData, 39 ePVRTMetaDataCubeMapOrder, 40 ePVRTMetaDataTextureOrientation, 41 ePVRTMetaDataBorderData, 42 ePVRTMetaDataPadding, 43 ePVRTMetaDataNumMetaDataTypes 44 }; 45 46 enum EPVRTAxis 47 { 48 ePVRTAxisX = 0, 49 ePVRTAxisY = 1, 50 ePVRTAxisZ = 2 51 }; 52 53 enum EPVRTOrientation 54 { 55 ePVRTOrientLeft = 1<<ePVRTAxisX, 56 ePVRTOrientRight= 0, 57 ePVRTOrientUp = 1<<ePVRTAxisY, 58 ePVRTOrientDown = 0, 59 ePVRTOrientOut = 1<<ePVRTAxisZ, 60 ePVRTOrientIn = 0 61 }; 62 63 enum EPVRTColourSpace 64 { 65 ePVRTCSpacelRGB, 66 ePVRTCSpacesRGB, 67 ePVRTCSpaceNumSpaces 68 }; 69 70 //Compressed pixel formats 71 enum EPVRTPixelFormat 72 { 73 ePVRTPF_PVRTCI_2bpp_RGB, 74 ePVRTPF_PVRTCI_2bpp_RGBA, 75 ePVRTPF_PVRTCI_4bpp_RGB, 76 ePVRTPF_PVRTCI_4bpp_RGBA, 77 ePVRTPF_PVRTCII_2bpp, 78 ePVRTPF_PVRTCII_4bpp, 79 ePVRTPF_ETC1, 80 ePVRTPF_DXT1, 81 ePVRTPF_DXT2, 82 ePVRTPF_DXT3, 83 ePVRTPF_DXT4, 84 ePVRTPF_DXT5, 85 86 //These formats are identical to some DXT formats. 87 ePVRTPF_BC1 = ePVRTPF_DXT1, 88 ePVRTPF_BC2 = ePVRTPF_DXT3, 89 ePVRTPF_BC3 = ePVRTPF_DXT5, 90 91 //These are currently unsupported: 92 ePVRTPF_BC4, 93 ePVRTPF_BC5, 94 ePVRTPF_BC6, 95 ePVRTPF_BC7, 96 97 //These are supported 98 ePVRTPF_UYVY, 99 ePVRTPF_YUY2, 100 ePVRTPF_BW1bpp, 101 ePVRTPF_SharedExponentR9G9B9E5, 102 ePVRTPF_RGBG8888, 103 ePVRTPF_GRGB8888, 104 ePVRTPF_ETC2_RGB, 105 ePVRTPF_ETC2_RGBA, 106 ePVRTPF_ETC2_RGB_A1, 107 ePVRTPF_EAC_R11, 108 ePVRTPF_EAC_RG11, 109 110 //Invalid value 111 ePVRTPF_NumCompressedPFs 112 }; 113 114 //Variable Type Names 115 enum EPVRTVariableType 116 { 117 ePVRTVarTypeUnsignedByteNorm, 118 ePVRTVarTypeSignedByteNorm, 119 ePVRTVarTypeUnsignedByte, 120 ePVRTVarTypeSignedByte, 121 ePVRTVarTypeUnsignedShortNorm, 122 ePVRTVarTypeSignedShortNorm, 123 ePVRTVarTypeUnsignedShort, 124 ePVRTVarTypeSignedShort, 125 ePVRTVarTypeUnsignedIntegerNorm, 126 ePVRTVarTypeSignedIntegerNorm, 127 ePVRTVarTypeUnsignedInteger, 128 ePVRTVarTypeSignedInteger, 129 ePVRTVarTypeSignedFloat, ePVRTVarTypeFloat=ePVRTVarTypeSignedFloat, //the name ePVRTVarTypeFloat is now deprecated. 130 ePVRTVarTypeUnsignedFloat, 131 ePVRTVarTypeNumVarTypes 132 }; 133 134 //A 64 bit pixel format ID & this will give you the high bits of a pixel format to check for a compressed format. 135 static const PVRTuint64 PVRTEX_PFHIGHMASK=0xffffffff00000000ull; 136 137 /***************************************************************************** 138 * Texture header structures. 139 *****************************************************************************/ 140 141 /*!*********************************************************************** 142 @struct MetaDataBlock 143 @brief A struct containing a block of extraneous meta data for a texture. 144 *************************************************************************/ 145 struct MetaDataBlock 146 { 147 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. 148 PVRTuint32 u32Key; ///< A DWORD (enum value) identifying the data type, and thus how to read it. 149 PVRTuint32 u32DataSize; ///< Size of the Data member. 150 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. 151 152 /*!*********************************************************************** 153 @fn MetaDataBlock 154 @brief Meta Data Block Constructor 155 *************************************************************************/ MetaDataBlockMetaDataBlock156 MetaDataBlock() : DevFOURCC(0), u32Key(0), u32DataSize(0), Data(NULL) 157 {} 158 159 /*!*********************************************************************** 160 @fn MetaDataBlock 161 @brief Meta Data Block Copy Constructor 162 *************************************************************************/ MetaDataBlockMetaDataBlock163 MetaDataBlock(const MetaDataBlock& rhs) : DevFOURCC(rhs.DevFOURCC), u32Key(rhs.u32Key), u32DataSize(rhs.u32DataSize) 164 { 165 //Copy the data across. 166 Data = new PVRTuint8[u32DataSize]; 167 for (PVRTuint32 uiDataAmt=0; uiDataAmt<u32DataSize; ++uiDataAmt) 168 { 169 Data[uiDataAmt]=rhs.Data[uiDataAmt]; 170 } 171 } 172 173 /*!*********************************************************************** 174 @fn ~MetaDataBlock 175 @brief Meta Data Block Destructor 176 *************************************************************************/ ~MetaDataBlockMetaDataBlock177 ~MetaDataBlock() 178 { 179 if (Data) 180 delete [] Data; 181 Data = NULL; 182 } 183 184 /*!*********************************************************************** 185 @fn SizeOfBlock 186 @return size_t Size (in a file) of the block. 187 @brief Returns the number of extra bytes this will add to any output files. 188 *************************************************************************/ SizeOfBlockMetaDataBlock189 size_t SizeOfBlock() const 190 { 191 return sizeof(DevFOURCC)+sizeof(u32Key)+sizeof(u32DataSize)+u32DataSize; 192 } 193 194 /*!*********************************************************************** 195 @brief Assigns one MetaDataBlock to the other. 196 @return MetaDataBlock This MetaDataBlock after the operation. 197 *************************************************************************/ 198 MetaDataBlock& operator=(const MetaDataBlock& rhs) 199 { 200 if (&rhs==this) 201 return *this; 202 203 //Remove pre-existing data. 204 if (Data) 205 delete [] Data; 206 Data=NULL; 207 208 //Copy the basic parameters 209 DevFOURCC=rhs.DevFOURCC; 210 u32Key=rhs.u32Key; 211 u32DataSize=rhs.u32DataSize; 212 213 //Copy the data across. 214 if (rhs.Data) 215 { 216 Data = new PVRTuint8[u32DataSize]; 217 for (PVRTuint32 uiDataAmt=0; uiDataAmt<u32DataSize; ++uiDataAmt) 218 { 219 Data[uiDataAmt]=rhs.Data[uiDataAmt]; 220 } 221 } 222 223 return *this; 224 } 225 226 /*!*************************************************************************** 227 @fn ReadFromPtr 228 @param[in] pDataCursor The data to read 229 @brief Reads from a pointer of memory in to the meta data block. 230 *****************************************************************************/ 231 bool ReadFromPtr(const unsigned char** pDataCursor); 232 }; 233 234 #pragma pack(push,4) 235 236 /*!*************************************************************************** 237 @struct PVRTextureHeaderV3 238 @brief A header for a PVR texture. 239 @details Contains everything required to read a texture accurately, and nothing more. Extraneous data is stored in a MetaDataBlock. 240 Correct use of the texture may rely on MetaDataBlock, but accurate data loading can be done through the standard header alone. 241 *****************************************************************************/ 242 struct PVRTextureHeaderV3{ 243 PVRTuint32 u32Version; ///< Version of the file header, used to identify it. 244 PVRTuint32 u32Flags; ///< Various format flags. 245 PVRTuint64 u64PixelFormat; ///< The pixel format, 8cc value storing the 4 channel identifiers and their respective sizes. 246 PVRTuint32 u32ColourSpace; ///< The Colour Space of the texture, currently either linear RGB or sRGB. 247 PVRTuint32 u32ChannelType; ///< Variable type that the channel is stored in. Supports signed/unsigned int/short/byte or float for now. 248 PVRTuint32 u32Height; ///< Height of the texture. 249 PVRTuint32 u32Width; ///< Width of the texture. 250 PVRTuint32 u32Depth; ///< Depth of the texture. (Z-slices) 251 PVRTuint32 u32NumSurfaces; ///< Number of members in a Texture Array. 252 PVRTuint32 u32NumFaces; ///< Number of faces in a Cube Map. Maybe be a value other than 6. 253 PVRTuint32 u32MIPMapCount; ///< Number of MIP Maps in the texture - NB: Includes top level. 254 PVRTuint32 u32MetaDataSize; ///< Size of the accompanying meta data. 255 256 /*!*************************************************************************** 257 @brief Constructor for the header - used to make sure that the header is initialised usefully. 258 The initial pixel format is an invalid one and must be set. 259 *****************************************************************************/ PVRTextureHeaderV3PVRTextureHeaderV3260 PVRTextureHeaderV3() : 261 u32Version(PVRTEX3_IDENT), ///< Version of the file header. 262 u32Flags(0), ///< Format flags. 263 u64PixelFormat(ePVRTPF_NumCompressedPFs), ///< The pixel format. 264 u32ColourSpace(0), ///< The Colour Space of the texture. 265 u32ChannelType(0), ///< Variable type that the channel is stored in. 266 u32Height(1), ///< Height of the texture. 267 u32Width(1), ///< Width of the texture. 268 u32Depth(1), ///< Depth of the texture. (Z-slices) 269 u32NumSurfaces(1), ///< Number of members in a Texture Array. 270 u32NumFaces(1), ///< Number of faces in a Cube Map. Maybe be a value other than 6. 271 u32MIPMapCount(1), ///< Number of MIP Maps in the texture - NB: Includes top level. 272 u32MetaDataSize(0) ///< Size of the accompanying meta data. 273 {} 274 }; 275 #pragma pack(pop) 276 #define PVRTEX3_HEADERSIZE 52 277 278 /*!*************************************************************************** 279 @brief Describes the Version 2 header of a PVR texture header. 280 *****************************************************************************/ 281 struct PVR_Texture_Header 282 { 283 PVRTuint32 dwHeaderSize; /*!< size of the structure */ 284 PVRTuint32 dwHeight; /*!< height of surface to be created */ 285 PVRTuint32 dwWidth; /*!< width of input surface */ 286 PVRTuint32 dwMipMapCount; /*!< number of mip-map levels requested */ 287 PVRTuint32 dwpfFlags; /*!< pixel format flags */ 288 PVRTuint32 dwTextureDataSize; /*!< Total size in bytes */ 289 PVRTuint32 dwBitCount; /*!< number of bits per pixel */ 290 PVRTuint32 dwRBitMask; /*!< mask for red bit */ 291 PVRTuint32 dwGBitMask; /*!< mask for green bits */ 292 PVRTuint32 dwBBitMask; /*!< mask for blue bits */ 293 PVRTuint32 dwAlphaBitMask; /*!< mask for alpha channel */ 294 PVRTuint32 dwPVR; /*!< magic number identifying pvr file */ 295 PVRTuint32 dwNumSurfs; /*!< the number of surfaces present in the pvr */ 296 } ; 297 298 /***************************************************************************** 299 * Legacy (V2 and V1) ENUMS 300 *****************************************************************************/ 301 302 /*!*************************************************************************** 303 @brief Legacy pixel type. DEPRECATED. 304 *****************************************************************************/ 305 enum PVRTPixelType 306 { 307 MGLPT_ARGB_4444 = 0x00, 308 MGLPT_ARGB_1555, 309 MGLPT_RGB_565, 310 MGLPT_RGB_555, 311 MGLPT_RGB_888, 312 MGLPT_ARGB_8888, 313 MGLPT_ARGB_8332, 314 MGLPT_I_8, 315 MGLPT_AI_88, 316 MGLPT_1_BPP, 317 MGLPT_VY1UY0, 318 MGLPT_Y1VY0U, 319 MGLPT_PVRTC2, 320 MGLPT_PVRTC4, 321 322 // OpenGL version of pixel types 323 OGL_RGBA_4444= 0x10, 324 OGL_RGBA_5551, 325 OGL_RGBA_8888, 326 OGL_RGB_565, 327 OGL_RGB_555, 328 OGL_RGB_888, 329 OGL_I_8, 330 OGL_AI_88, 331 OGL_PVRTC2, 332 OGL_PVRTC4, 333 OGL_BGRA_8888, 334 OGL_A_8, 335 OGL_PVRTCII4, ///< Not in use 336 OGL_PVRTCII2, ///< Not in use 337 338 // S3TC Encoding 339 D3D_DXT1 = 0x20, 340 D3D_DXT2, 341 D3D_DXT3, 342 D3D_DXT4, 343 D3D_DXT5, 344 345 //RGB Formats 346 D3D_RGB_332, 347 D3D_AL_44, 348 D3D_LVU_655, 349 D3D_XLVU_8888, 350 D3D_QWVU_8888, 351 352 //10 bit integer - 2 bit alpha 353 D3D_ABGR_2101010, 354 D3D_ARGB_2101010, 355 D3D_AWVU_2101010, 356 357 //16 bit integers 358 D3D_GR_1616, 359 D3D_VU_1616, 360 D3D_ABGR_16161616, 361 362 //Float Formats 363 D3D_R16F, 364 D3D_GR_1616F, 365 D3D_ABGR_16161616F, 366 367 //32 bits per channel 368 D3D_R32F, 369 D3D_GR_3232F, 370 D3D_ABGR_32323232F, 371 372 // Ericsson 373 ETC_RGB_4BPP, 374 ETC_RGBA_EXPLICIT, ///< Unimplemented 375 ETC_RGBA_INTERPOLATED, ///< Unimplemented 376 377 D3D_A8 = 0x40, 378 D3D_V8U8, 379 D3D_L16, 380 381 D3D_L8, 382 D3D_AL_88, 383 384 //Y'UV Colourspace 385 D3D_UYVY, 386 D3D_YUY2, 387 388 // DX10 389 DX10_R32G32B32A32_FLOAT= 0x50, 390 DX10_R32G32B32A32_UINT , 391 DX10_R32G32B32A32_SINT, 392 393 DX10_R32G32B32_FLOAT, 394 DX10_R32G32B32_UINT, 395 DX10_R32G32B32_SINT, 396 397 DX10_R16G16B16A16_FLOAT , 398 DX10_R16G16B16A16_UNORM, 399 DX10_R16G16B16A16_UINT , 400 DX10_R16G16B16A16_SNORM , 401 DX10_R16G16B16A16_SINT , 402 403 DX10_R32G32_FLOAT , 404 DX10_R32G32_UINT , 405 DX10_R32G32_SINT , 406 407 DX10_R10G10B10A2_UNORM , 408 DX10_R10G10B10A2_UINT , 409 410 DX10_R11G11B10_FLOAT , ///< Unimplemented 411 412 DX10_R8G8B8A8_UNORM , 413 DX10_R8G8B8A8_UNORM_SRGB , 414 DX10_R8G8B8A8_UINT , 415 DX10_R8G8B8A8_SNORM , 416 DX10_R8G8B8A8_SINT , 417 418 DX10_R16G16_FLOAT , 419 DX10_R16G16_UNORM , 420 DX10_R16G16_UINT , 421 DX10_R16G16_SNORM , 422 DX10_R16G16_SINT , 423 424 DX10_R32_FLOAT , 425 DX10_R32_UINT , 426 DX10_R32_SINT , 427 428 DX10_R8G8_UNORM , 429 DX10_R8G8_UINT , 430 DX10_R8G8_SNORM , 431 DX10_R8G8_SINT , 432 433 DX10_R16_FLOAT , 434 DX10_R16_UNORM , 435 DX10_R16_UINT , 436 DX10_R16_SNORM , 437 DX10_R16_SINT , 438 439 DX10_R8_UNORM, 440 DX10_R8_UINT, 441 DX10_R8_SNORM, 442 DX10_R8_SINT, 443 444 DX10_A8_UNORM, 445 DX10_R1_UNORM, 446 DX10_R9G9B9E5_SHAREDEXP, ///< Unimplemented 447 DX10_R8G8_B8G8_UNORM, ///< Unimplemented 448 DX10_G8R8_G8B8_UNORM, ///< Unimplemented 449 450 DX10_BC1_UNORM, 451 DX10_BC1_UNORM_SRGB, 452 453 DX10_BC2_UNORM, 454 DX10_BC2_UNORM_SRGB, 455 456 DX10_BC3_UNORM, 457 DX10_BC3_UNORM_SRGB, 458 459 DX10_BC4_UNORM, ///< Unimplemented 460 DX10_BC4_SNORM, ///< Unimplemented 461 462 DX10_BC5_UNORM, ///< Unimplemented 463 DX10_BC5_SNORM, ///< Unimplemented 464 465 // OpenVG 466 467 /* RGB{A,X} channel ordering */ 468 ePT_VG_sRGBX_8888 = 0x90, 469 ePT_VG_sRGBA_8888, 470 ePT_VG_sRGBA_8888_PRE, 471 ePT_VG_sRGB_565, 472 ePT_VG_sRGBA_5551, 473 ePT_VG_sRGBA_4444, 474 ePT_VG_sL_8, 475 ePT_VG_lRGBX_8888, 476 ePT_VG_lRGBA_8888, 477 ePT_VG_lRGBA_8888_PRE, 478 ePT_VG_lL_8, 479 ePT_VG_A_8, 480 ePT_VG_BW_1, 481 482 /* {A,X}RGB channel ordering */ 483 ePT_VG_sXRGB_8888, 484 ePT_VG_sARGB_8888, 485 ePT_VG_sARGB_8888_PRE, 486 ePT_VG_sARGB_1555, 487 ePT_VG_sARGB_4444, 488 ePT_VG_lXRGB_8888, 489 ePT_VG_lARGB_8888, 490 ePT_VG_lARGB_8888_PRE, 491 492 /* BGR{A,X} channel ordering */ 493 ePT_VG_sBGRX_8888, 494 ePT_VG_sBGRA_8888, 495 ePT_VG_sBGRA_8888_PRE, 496 ePT_VG_sBGR_565, 497 ePT_VG_sBGRA_5551, 498 ePT_VG_sBGRA_4444, 499 ePT_VG_lBGRX_8888, 500 ePT_VG_lBGRA_8888, 501 ePT_VG_lBGRA_8888_PRE, 502 503 /* {A,X}BGR channel ordering */ 504 ePT_VG_sXBGR_8888, 505 ePT_VG_sABGR_8888 , 506 ePT_VG_sABGR_8888_PRE, 507 ePT_VG_sABGR_1555, 508 ePT_VG_sABGR_4444, 509 ePT_VG_lXBGR_8888, 510 ePT_VG_lABGR_8888, 511 ePT_VG_lABGR_8888_PRE, 512 513 // max cap for iterating 514 END_OF_PIXEL_TYPES, 515 516 MGLPT_NOTYPE = 0xffffffff 517 518 }; 519 520 /***************************************************************************** 521 * Legacy constants (V1/V2) 522 *****************************************************************************/ 523 524 const PVRTuint32 PVRTEX_MIPMAP = (1<<8); ///< Has mip map levels. DEPRECATED. 525 const PVRTuint32 PVRTEX_TWIDDLE = (1<<9); ///< Is twiddled. DEPRECATED. 526 const PVRTuint32 PVRTEX_BUMPMAP = (1<<10); ///< Has normals encoded for a bump map. DEPRECATED. 527 const PVRTuint32 PVRTEX_TILING = (1<<11); ///< Is bordered for tiled pvr. DEPRECATED. 528 const PVRTuint32 PVRTEX_CUBEMAP = (1<<12); ///< Is a cubemap/skybox. DEPRECATED. 529 const PVRTuint32 PVRTEX_FALSEMIPCOL = (1<<13); ///< Are there false coloured MIP levels. DEPRECATED. 530 const PVRTuint32 PVRTEX_VOLUME = (1<<14); ///< Is this a volume texture. DEPRECATED. 531 const PVRTuint32 PVRTEX_ALPHA = (1<<15); ///< v2.1. Is there transparency info in the texture. DEPRECATED. 532 const PVRTuint32 PVRTEX_VERTICAL_FLIP = (1<<16); ///< v2.1. Is the texture vertically flipped. DEPRECATED. 533 534 const PVRTuint32 PVRTEX_PIXELTYPE = 0xff; ///< Pixel type is always in the last 16bits of the flags. DEPRECATED. 535 const PVRTuint32 PVRTEX_IDENTIFIER = 0x21525650; ///< The pvr identifier is the characters 'P','V','R'. DEPRECATED. 536 537 const PVRTuint32 PVRTEX_V1_HEADER_SIZE = 44; ///< Old header size was 44 for identification purposes. DEPRECATED. 538 539 const PVRTuint32 PVRTC2_MIN_TEXWIDTH = 16; ///< DEPRECATED. 540 const PVRTuint32 PVRTC2_MIN_TEXHEIGHT = 8; ///< DEPRECATED. 541 const PVRTuint32 PVRTC4_MIN_TEXWIDTH = 8; ///< DEPRECATED. 542 const PVRTuint32 PVRTC4_MIN_TEXHEIGHT = 8; ///< DEPRECATED. 543 const PVRTuint32 ETC_MIN_TEXWIDTH = 4; ///< DEPRECATED. 544 const PVRTuint32 ETC_MIN_TEXHEIGHT = 4; ///< DEPRECATED. 545 const PVRTuint32 DXT_MIN_TEXWIDTH = 4; ///< DEPRECATED. 546 const PVRTuint32 DXT_MIN_TEXHEIGHT = 4; ///< DEPRECATED. 547 548 /**************************************************************************** 549 ** Functions 550 ****************************************************************************/ 551 552 /*!*************************************************************************** 553 @fn PVRTTextureCreate 554 @param[in] w Size of the texture 555 @param[in] h Size of the texture 556 @param[in] wMin Minimum size of a texture level 557 @param[in] hMin Minimum size of a texture level 558 @param[in] nBPP Bits per pixel of the format 559 @param[in] bMIPMap Create memory for MIP-map levels also? 560 @return Allocated texture memory (must be free()d) 561 @brief Creates a PVRTextureHeaderV3 structure, including room for 562 the specified texture, in memory. 563 *****************************************************************************/ 564 PVRTextureHeaderV3 *PVRTTextureCreate( 565 unsigned int w, 566 unsigned int h, 567 const unsigned int wMin, 568 const unsigned int hMin, 569 const unsigned int nBPP, 570 const bool bMIPMap); 571 572 /*!*************************************************************************** 573 @fn PVRTTextureTile 574 @param[in,out] pOut The tiled texture in system memory 575 @param[in] pIn The source texture 576 @param[in] nRepeatCnt Number of times to repeat the source texture 577 @brief Allocates and fills, in system memory, a texture large enough 578 to repeat the source texture specified number of times. 579 *****************************************************************************/ 580 void PVRTTextureTile( 581 PVRTextureHeaderV3 **pOut, 582 const PVRTextureHeaderV3 * const pIn, 583 const int nRepeatCnt); 584 585 /**************************************************************************** 586 ** Internal Functions 587 ****************************************************************************/ 588 //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. 589 590 //Generate a 4 channel PixelID. 591 #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) ) 592 593 //Generate a 1 channel PixelID. 594 #define PVRTGENPIXELID3(C1Name, C2Name, C3Name, C1Bits, C2Bits, C3Bits)( PVRTGENPIXELID4(C1Name, C2Name, C3Name, 0, C1Bits, C2Bits, C3Bits, 0) ) 595 596 //Generate a 2 channel PixelID. 597 #define PVRTGENPIXELID2(C1Name, C2Name, C1Bits, C2Bits) ( PVRTGENPIXELID4(C1Name, C2Name, 0, 0, C1Bits, C2Bits, 0, 0) ) 598 599 //Generate a 3 channel PixelID. 600 #define PVRTGENPIXELID1(C1Name, C1Bits) ( PVRTGENPIXELID4(C1Name, 0, 0, 0, C1Bits, 0, 0, 0)) 601 602 //Forward declaration of CPVRTMap. 603 template <typename KeyType, typename DataType> 604 class CPVRTMap; 605 606 607 /*!*********************************************************************** 608 @fn PVRTGetBitsPerPixel 609 @param[in] u64PixelFormat A PVR Pixel Format ID. 610 @return const PVRTuint32 Number of bits per pixel. 611 @brief Returns the number of bits per pixel in a PVR Pixel Format 612 identifier. 613 *************************************************************************/ 614 PVRTuint32 PVRTGetBitsPerPixel(PVRTuint64 u64PixelFormat); 615 616 /*!*********************************************************************** 617 @fn PVRTGetFormatMinDims 618 @param[in] u64PixelFormat A PVR Pixel Format ID. 619 @param[in,out] minX Returns the minimum width. 620 @param[in,out] minY Returns the minimum height. 621 @param[in,out] minZ Returns the minimum depth. 622 @brief Gets the minimum dimensions (x,y,z) for a given pixel format. 623 *************************************************************************/ 624 void PVRTGetFormatMinDims(PVRTuint64 u64PixelFormat, PVRTuint32 &minX, PVRTuint32 &minY, PVRTuint32 &minZ); 625 626 /*!*********************************************************************** 627 @fn PVRTConvertOldTextureHeaderToV3 628 @param[in] LegacyHeader Legacy header for conversion. 629 @param[in,out] NewHeader New header to output into. 630 @param[in,out] pMetaData MetaData Map to output into. 631 @brief Converts a legacy texture header (V1 or V2) to a current 632 generation header (V3) 633 *************************************************************************/ 634 void PVRTConvertOldTextureHeaderToV3(const PVR_Texture_Header* LegacyHeader, PVRTextureHeaderV3& NewHeader, CPVRTMap<PVRTuint32, CPVRTMap<PVRTuint32,MetaDataBlock> >* pMetaData); 635 636 /*!*********************************************************************** 637 @fn PVRTMapLegacyTextureEnumToNewFormat 638 @param[in] OldFormat Legacy Enumeration Value 639 @param[in,out] newType New PixelType identifier. 640 @param[in,out] newCSpace New ColourSpace 641 @param[in,out] newChanType New Channel Type 642 @param[in,out] isPreMult Whether format is pre-multiplied 643 @brief Maps a legacy enumeration value to the new PVR3 style format. 644 *************************************************************************/ 645 void PVRTMapLegacyTextureEnumToNewFormat(PVRTPixelType OldFormat, PVRTuint64& newType, EPVRTColourSpace& newCSpace, EPVRTVariableType& newChanType, bool& isPreMult); 646 647 /*!*************************************************************************** 648 @fn PVRTTextureLoadTiled 649 @param[in,out] pDst Texture to place the tiled data 650 @param[in] nWidthDst Width of destination texture 651 @param[in] nHeightDst Height of destination texture 652 @param[in] pSrc Texture to tile 653 @param[in] nWidthSrc Width of source texture 654 @param[in] nHeightSrc Height of source texture 655 @param[in] nElementSize Bytes per pixel 656 @param[in] bTwiddled True if the data is twiddled 657 @brief Needed by PVRTTextureTile() in the various PVRTTextureAPIs 658 *****************************************************************************/ 659 void PVRTTextureLoadTiled( 660 PVRTuint8 * const pDst, 661 const unsigned int nWidthDst, 662 const unsigned int nHeightDst, 663 const PVRTuint8 * const pSrc, 664 const unsigned int nWidthSrc, 665 const unsigned int nHeightSrc, 666 const unsigned int nElementSize, 667 const bool bTwiddled); 668 669 670 /*!*************************************************************************** 671 @fn PVRTTextureTwiddle 672 @param[out] a Twiddled value 673 @param[in] u Coordinate axis 0 674 @param[in] v Coordinate axis 1 675 @brief Combine a 2D coordinate into a twiddled value 676 *****************************************************************************/ 677 void PVRTTextureTwiddle(unsigned int &a, const unsigned int u, const unsigned int v); 678 679 /*!*************************************************************************** 680 @fn PVRTTextureDeTwiddle 681 @param[out] u Coordinate axis 0 682 @param[out] v Coordinate axis 1 683 @param[in] a Twiddled value 684 @brief Extract 2D coordinates from a twiddled value. 685 *****************************************************************************/ 686 void PVRTTextureDeTwiddle(unsigned int &u, unsigned int &v, const unsigned int a); 687 688 /*!*********************************************************************** 689 @fn PVRTGetTextureDataSize 690 @param[in] sTextureHeader Specifies the texture header. 691 @param[in] iMipLevel Specifies a mip level to check, 'PVRTEX_ALLMIPLEVELS' 692 can be passed to get the size of all MIP levels. 693 @param[in] bAllSurfaces Size of all surfaces is calculated if true, 694 only a single surface if false. 695 @param[in] bAllFaces Size of all faces is calculated if true, 696 only a single face if false. 697 @return PVRTuint32 Size in BYTES of the specified texture area. 698 @brief Gets the size in BYTES of the texture, given various input 699 parameters. User can retrieve the size of either all 700 surfaces or a single surface, all faces or a single face and 701 all MIP-Maps or a single specified MIP level. 702 *************************************************************************/ 703 PVRTuint32 PVRTGetTextureDataSize(PVRTextureHeaderV3 sTextureHeader, PVRTint32 iMipLevel=PVRTEX_ALLMIPLEVELS, bool bAllSurfaces = true, bool bAllFaces = true); 704 705 #endif /* _PVRTTEXTURE_H_ */ 706 707 /***************************************************************************** 708 End of file (PVRTTexture.h) 709 *****************************************************************************/ 710 711