| 1 | /* -*- tab-width: 4; -*- */ |
| 2 | /* vi: set sw=2 ts=4 expandtab: */ |
| 3 | |
| 4 | /* $Id: e36ad79b5eac8ea237d6a05602c71aadab575519 $ */ |
| 5 | |
| 6 | /* |
| 7 | * Copyright 2010-2020 The Khronos Group Inc. |
| 8 | * SPDX-License-Identifier: Apache-2.0 |
| 9 | */ |
| 10 | |
| 11 | |
| 12 | /* |
| 13 | * Author: Mark Callow from original code by Georg Kolling |
| 14 | */ |
| 15 | |
| 16 | #ifndef KTXINT_H |
| 17 | #define KTXINT_H |
| 18 | |
| 19 | #include <math.h> |
| 20 | |
| 21 | /* Define this to include the ETC unpack software in the library. */ |
| 22 | #ifndef SUPPORT_SOFTWARE_ETC_UNPACK |
| 23 | /* Include for all GL versions because have seen OpenGL ES 3 |
| 24 | * implementaions that do not support ETC1 (ARM Mali emulator v1.0)! |
| 25 | */ |
| 26 | #define SUPPORT_SOFTWARE_ETC_UNPACK 1 |
| 27 | #endif |
| 28 | |
| 29 | #ifndef MAX |
| 30 | #define MAX(x, y) (((x) > (y)) ? (x) : (y)) |
| 31 | #endif |
| 32 | |
| 33 | #define QUOTE(x) #x |
| 34 | #define STR(x) QUOTE(x) |
| 35 | |
| 36 | #define KTX2_IDENTIFIER_REF { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x32, 0x30, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A } |
| 37 | #define (80) |
| 38 | |
| 39 | #ifdef __cplusplus |
| 40 | extern "C" { |
| 41 | #endif |
| 42 | |
| 43 | /** |
| 44 | * @internal |
| 45 | * @brief used to pass GL context capabilites to subroutines. |
| 46 | */ |
| 47 | #define _KTX_NO_R16_FORMATS 0x0 |
| 48 | #define _KTX_R16_FORMATS_NORM 0x1 |
| 49 | #define _KTX_R16_FORMATS_SNORM 0x2 |
| 50 | #define _KTX_ALL_R16_FORMATS (_KTX_R16_FORMATS_NORM | _KTX_R16_FORMATS_SNORM) |
| 51 | extern GLint _ktxR16Formats; |
| 52 | extern GLboolean _ktxSupportsSRGB; |
| 53 | |
| 54 | /** |
| 55 | * @internal |
| 56 | * @~English |
| 57 | * @brief KTX file header. |
| 58 | * |
| 59 | * See the KTX specification for descriptions. |
| 60 | */ |
| 61 | typedef struct { |
| 62 | ktx_uint8_t [12]; |
| 63 | ktx_uint32_t ; |
| 64 | ktx_uint32_t ; |
| 65 | ktx_uint32_t ; |
| 66 | ktx_uint32_t ; |
| 67 | ktx_uint32_t ; |
| 68 | ktx_uint32_t ; |
| 69 | ktx_uint32_t ; |
| 70 | ktx_uint32_t ; |
| 71 | ktx_uint32_t ; |
| 72 | ktx_uint32_t ; |
| 73 | ktx_uint32_t ; |
| 74 | ktx_uint32_t ; |
| 75 | ktx_uint32_t ; |
| 76 | } ; |
| 77 | |
| 78 | /* This will cause compilation to fail if the struct size doesn't match */ |
| 79 | typedef int [sizeof(KTX_header) == KTX_HEADER_SIZE]; |
| 80 | |
| 81 | /** |
| 82 | * @internal |
| 83 | * @~English |
| 84 | * @brief 32-bit KTX 2 index entry. |
| 85 | */ |
| 86 | typedef struct ktxIndexEntry32 { |
| 87 | ktx_uint32_t byteOffset; /*!< Offset of item from start of file. */ |
| 88 | ktx_uint32_t byteLength; /*!< Number of bytes of data in the item. */ |
| 89 | } ktxIndexEntry32; |
| 90 | /** |
| 91 | * @internal |
| 92 | * @~English |
| 93 | * @brief 64-bit KTX 2 index entry. |
| 94 | */ |
| 95 | typedef struct ktxIndexEntry64 { |
| 96 | ktx_uint64_t byteOffset; /*!< Offset of item from start of file. */ |
| 97 | ktx_uint64_t byteLength; /*!< Number of bytes of data in the item. */ |
| 98 | } ktxIndexEntry64; |
| 99 | |
| 100 | /** |
| 101 | * @internal |
| 102 | * @~English |
| 103 | * @brief KTX 2 file header. |
| 104 | * |
| 105 | * See the KTX 2 specification for descriptions. |
| 106 | */ |
| 107 | typedef struct { |
| 108 | ktx_uint8_t [12]; |
| 109 | ktx_uint32_t ; |
| 110 | ktx_uint32_t ; |
| 111 | ktx_uint32_t ; |
| 112 | ktx_uint32_t ; |
| 113 | ktx_uint32_t ; |
| 114 | ktx_uint32_t ; |
| 115 | ktx_uint32_t ; |
| 116 | ktx_uint32_t ; |
| 117 | ktx_uint32_t ; |
| 118 | ktxIndexEntry32 ; |
| 119 | ktxIndexEntry32 ; |
| 120 | ktxIndexEntry64 ; |
| 121 | } ; |
| 122 | |
| 123 | /* This will cause compilation to fail if the struct size doesn't match */ |
| 124 | typedef int [sizeof(KTX_header2) == KTX2_HEADER_SIZE]; |
| 125 | |
| 126 | /** |
| 127 | * @internal |
| 128 | * @~English |
| 129 | * @brief KTX 2 level index entry. |
| 130 | */ |
| 131 | typedef struct ktxLevelIndexEntry { |
| 132 | ktx_uint64_t byteOffset; /*!< Offset of level from start of file. */ |
| 133 | ktx_uint64_t byteLength; |
| 134 | /*!< Number of bytes of compressed image data in the level. */ |
| 135 | ktx_uint64_t uncompressedByteLength; |
| 136 | /*!< Number of bytes of uncompressed image data in the level. */ |
| 137 | } ktxLevelIndexEntry; |
| 138 | |
| 139 | /** |
| 140 | * @internal |
| 141 | * @~English |
| 142 | * @brief Structure for supplemental information about the texture. |
| 143 | * |
| 144 | * _ktxCheckHeader returns supplemental information about the texture in this |
| 145 | * structure that is derived during checking of the file header. |
| 146 | */ |
| 147 | typedef struct KTX_supplemental_info |
| 148 | { |
| 149 | ktx_uint8_t compressed; |
| 150 | ktx_uint8_t generateMipmaps; |
| 151 | ktx_uint16_t textureDimension; |
| 152 | } KTX_supplemental_info; |
| 153 | /** |
| 154 | * @internal |
| 155 | * @var ktx_uint8_t KTX_supplemental_info::compressed |
| 156 | * @~English |
| 157 | * @brief KTX_TRUE, if this a compressed texture, KTX_FALSE otherwise? |
| 158 | */ |
| 159 | /** |
| 160 | * @internal |
| 161 | * @var ktx_uint8_t KTX_supplemental_info::generateMipmaps |
| 162 | * @~English |
| 163 | * @brief KTX_TRUE, if mipmap generation is required, KTX_FALSE otherwise. |
| 164 | */ |
| 165 | /** |
| 166 | * @internal |
| 167 | * @var ktx_uint16_t KTX_supplemental_info::textureDimension |
| 168 | * @~English |
| 169 | * @brief The number of dimensions, 1, 2 or 3, of data in the texture image. |
| 170 | */ |
| 171 | |
| 172 | /* |
| 173 | * @internal |
| 174 | * CheckHeader1 |
| 175 | * |
| 176 | * Reads the KTX file header and performs some sanity checking on the values |
| 177 | */ |
| 178 | KTX_error_code (KTX_header* , |
| 179 | KTX_supplemental_info* pSuppInfo); |
| 180 | |
| 181 | /* |
| 182 | * @internal |
| 183 | * CheckHeader2 |
| 184 | * |
| 185 | * Reads the KTX 2 file header and performs some sanity checking on the values |
| 186 | */ |
| 187 | KTX_error_code (KTX_header2* , |
| 188 | KTX_supplemental_info* pSuppInfo); |
| 189 | |
| 190 | /* |
| 191 | * SwapEndian16: Swaps endianness in an array of 16-bit values |
| 192 | */ |
| 193 | void _ktxSwapEndian16(ktx_uint16_t* pData16, ktx_size_t count); |
| 194 | |
| 195 | /* |
| 196 | * SwapEndian32: Swaps endianness in an array of 32-bit values |
| 197 | */ |
| 198 | void _ktxSwapEndian32(ktx_uint32_t* pData32, ktx_size_t count); |
| 199 | |
| 200 | /* |
| 201 | * SwapEndian32: Swaps endianness in an array of 64-bit values |
| 202 | */ |
| 203 | void _ktxSwapEndian64(ktx_uint64_t* pData64, ktx_size_t count); |
| 204 | |
| 205 | /* |
| 206 | * UnpackETC: uncompresses an ETC compressed texture image |
| 207 | */ |
| 208 | KTX_error_code _ktxUnpackETC(const GLubyte* srcETC, const GLenum srcFormat, |
| 209 | ktx_uint32_t active_width, ktx_uint32_t active_height, |
| 210 | GLubyte** dstImage, |
| 211 | GLenum* format, GLenum* internalFormat, GLenum* type, |
| 212 | GLint R16Formats, GLboolean supportsSRGB); |
| 213 | |
| 214 | /* |
| 215 | * Pad nbytes to next multiple of n |
| 216 | */ |
| 217 | #define _KTX_PADN(n, nbytes) (ktx_uint32_t)(n * ceilf((float)(nbytes) / n)) |
| 218 | /* |
| 219 | * Calculate bytes of of padding needed to reach next multiple of n. |
| 220 | */ |
| 221 | /* Equivalent to (n * ceil(nbytes / n)) - nbytes */ |
| 222 | #define _KTX_PADN_LEN(n, nbytes) \ |
| 223 | (ktx_uint32_t)((n * ceilf((float)(nbytes) / n)) - (nbytes)) |
| 224 | |
| 225 | /* |
| 226 | * Pad nbytes to next multiple of 4 |
| 227 | */ |
| 228 | #define _KTX_PAD4(nbytes) _KTX_PADN(4, nbytes) |
| 229 | /* |
| 230 | * Calculate bytes of of padding needed to reach next multiple of 4. |
| 231 | */ |
| 232 | #define _KTX_PAD4_LEN(nbytes) _KTX_PADN_LEN(4, nbytes) |
| 233 | |
| 234 | /* |
| 235 | * Pad nbytes to next multiple of 8 |
| 236 | */ |
| 237 | #define _KTX_PAD8(nbytes) _KTX_PADN(8, nbytes) |
| 238 | /* |
| 239 | * Calculate bytes of of padding needed to reach next multiple of 8. |
| 240 | */ |
| 241 | #define _KTX_PAD8_LEN(nbytes) _KTX_PADN_LEN(8, nbytes) |
| 242 | |
| 243 | /* |
| 244 | * Pad nbytes to KTX_GL_UNPACK_ALIGNMENT |
| 245 | */ |
| 246 | #define _KTX_PAD_UNPACK_ALIGN(nbytes) \ |
| 247 | _KTX_PADN(KTX_GL_UNPACK_ALIGNMENT, nbytes) |
| 248 | /* |
| 249 | * Calculate bytes of of padding needed to reach KTX_GL_UNPACK_ALIGNMENT. |
| 250 | */ |
| 251 | #define _KTX_PAD_UNPACK_ALIGN_LEN(nbytes) \ |
| 252 | _KTX_PADN_LEN(KTX_GL_UNPACK_ALIGNMENT, nbytes) |
| 253 | |
| 254 | /* |
| 255 | ====================================== |
| 256 | Internal utility functions |
| 257 | ====================================== |
| 258 | */ |
| 259 | |
| 260 | void printKTX2Info2(ktxStream* src, KTX_header2* ); |
| 261 | |
| 262 | #ifdef __cplusplus |
| 263 | } |
| 264 | #endif |
| 265 | |
| 266 | #endif /* KTXINT_H */ |
| 267 | |