2011-03-22 22:52:43 +00:00
|
|
|
|
// This code is in the public domain -- Ignacio Casta<74>o <castano@gmail.com>
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
#ifndef NV_IMAGE_KTXFILE_H
|
|
|
|
|
#define NV_IMAGE_KTXFILE_H
|
|
|
|
|
|
|
|
|
|
#include "nvimage.h"
|
|
|
|
|
#include "nvcore/StrLib.h"
|
2018-02-06 02:55:07 +00:00
|
|
|
|
#include "nvcore/Array.h"
|
2011-03-22 22:52:43 +00:00
|
|
|
|
|
|
|
|
|
// KTX File format specification:
|
|
|
|
|
// http://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/#key
|
|
|
|
|
|
|
|
|
|
namespace nv
|
|
|
|
|
{
|
|
|
|
|
class Stream;
|
|
|
|
|
|
2018-02-06 02:55:07 +00:00
|
|
|
|
// GL types
|
|
|
|
|
const uint KTX_UNSIGNED_BYTE = 0x1401;
|
|
|
|
|
const uint KTX_BYTE = 0x1400;
|
|
|
|
|
const uint KTX_UNSIGNED_SHORT = 0x1403;
|
|
|
|
|
const uint KTX_SHORT = 0x1402;
|
|
|
|
|
const uint KTX_UNSIGNED_INT = 0x1405;
|
|
|
|
|
const uint KTX_INT = 0x1404;
|
|
|
|
|
const uint KTX_FLOAT = 0x1406;
|
|
|
|
|
const uint KTX_UNSIGNED_BYTE_3_3_2 = 0x8032;
|
|
|
|
|
const uint KTX_UNSIGNED_BYTE_2_3_3_REV = 0x8362;
|
|
|
|
|
const uint KTX_UNSIGNED_SHORT_5_6_5 = 0x8363;
|
|
|
|
|
const uint KTX_UNSIGNED_SHORT_5_6_5_REV = 0x8364;
|
|
|
|
|
const uint KTX_UNSIGNED_SHORT_4_4_4_4 = 0x8033;
|
|
|
|
|
const uint KTX_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365;
|
|
|
|
|
const uint KTX_UNSIGNED_SHORT_5_5_5_1 = 0x8034;
|
|
|
|
|
const uint KTX_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366;
|
|
|
|
|
const uint KTX_UNSIGNED_INT_8_8_8_8 = 0x8035;
|
|
|
|
|
const uint KTX_UNSIGNED_INT_8_8_8_8_REV = 0x8367;
|
|
|
|
|
const uint KTX_UNSIGNED_INT_10_10_10_2 = 0x8036;
|
|
|
|
|
const uint KTX_UNSIGNED_INT_2_10_10_10_REV = 0x8368;
|
|
|
|
|
|
|
|
|
|
// GL formats
|
|
|
|
|
const uint KTX_FORMAT_RED = 0x1903;
|
|
|
|
|
const uint KTX_FORMAT_RG = 0x8227;
|
|
|
|
|
const uint KTX_FORMAT_RGB = 0x1907;
|
|
|
|
|
const uint KTX_FORMAT_BGR = 0x80E0;
|
|
|
|
|
const uint KTX_FORMAT_RGBA = 0x1908;
|
|
|
|
|
const uint KTX_FORMAT_BGRA = 0x80E1;
|
|
|
|
|
const uint KTX_FORMAT_RED_INTEGER = 0x8D94;
|
|
|
|
|
const uint KTX_FORMAT_RG_INTEGER = 0x8228;
|
|
|
|
|
const uint KTX_FORMAT_RGB_INTEGER = 0x8D98;
|
|
|
|
|
const uint KTX_FORMAT_BGR_INTEGER = 0x8D9A;
|
|
|
|
|
const uint KTX_FORMAT_RGBA_INTEGER = 0x8D99;
|
|
|
|
|
const uint KTX_FORMAT_BGRA_INTEGER = 0x8D9B;
|
|
|
|
|
const uint KTX_FORMAT_STENCIL_INDEX = 0x1901;
|
|
|
|
|
const uint KTX_FORMAT_DEPTH_COMPONENT = 0x1902;
|
|
|
|
|
const uint KTX_FORMAT_DEPTH_STENCIL = 0x84F9;
|
|
|
|
|
|
|
|
|
|
// GL internal formats
|
|
|
|
|
// BC1
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGB_S3TC_DXT1 = 0x83F0;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_S3TC_DXT1 = 0x8C4C;
|
|
|
|
|
// BC1a
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGBA_S3TC_DXT1 = 0x83F1;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1 = 0x8C4D;
|
|
|
|
|
// BC2
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGBA_S3TC_DXT3 = 0x83F2;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3 = 0x8C4E;
|
|
|
|
|
// BC3
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGBA_S3TC_DXT5 = 0x83F3;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5 = 0x8C4F;
|
|
|
|
|
// BC4
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RED_RGTC1 = 0x8DBB;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC;
|
|
|
|
|
// BC5
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RG_RGTC2 = 0x8DBD;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE;
|
|
|
|
|
// BC6
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E;
|
|
|
|
|
// BC7
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D;
|
|
|
|
|
|
|
|
|
|
// ETC
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGB_ETC1 = 0x8D64;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_ETC1 = 0x8D64; // ???
|
|
|
|
|
|
|
|
|
|
// ETC2
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RED_EAC = 0x9270;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SIGNED_RED_EAC = 0x9271;
|
|
|
|
|
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RG_EAC = 0x9272;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SIGNED_RG_EAC = 0x9273;
|
|
|
|
|
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGB_ETC2 = 0x9274;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_ETC2 = 0x9275;
|
|
|
|
|
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGB_PUNCHTHROUGH_ALPHA_ETC2 = 0x9276;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_PUNCHTHROUGH_ALPHA_ETC2 = 0x9277;
|
|
|
|
|
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_RGBA_ETC2_EAC = 0x9278;
|
|
|
|
|
const uint KTX_INTERNAL_COMPRESSED_SRGB_ALPHA_ETC2_EAC = 0x9279;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// GL base internal formats
|
|
|
|
|
const uint KTX_BASE_INTERNAL_DEPTH_COMPONENT = 0x1902;
|
|
|
|
|
const uint KTX_BASE_INTERNAL_DEPTH_STENCIL = 0x84F9;
|
|
|
|
|
const uint KTX_BASE_INTERNAL_RED = 0x1903;
|
|
|
|
|
const uint KTX_BASE_INTERNAL_RG = 0x8227;
|
|
|
|
|
const uint KTX_BASE_INTERNAL_RGB = 0x1907;
|
|
|
|
|
const uint KTX_BASE_INTERNAL_RGBA = 0x1908;
|
|
|
|
|
const uint KTX_BASE_INTERNAL_STENCIL_INDEX = 0x1901;
|
2011-03-22 22:52:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct KtxHeader {
|
|
|
|
|
uint8 identifier[12];
|
|
|
|
|
uint32 endianness;
|
|
|
|
|
uint32 glType;
|
|
|
|
|
uint32 glTypeSize;
|
|
|
|
|
uint32 glFormat;
|
|
|
|
|
uint32 glInternalFormat;
|
|
|
|
|
uint32 glBaseInternalFormat;
|
|
|
|
|
uint32 pixelWidth;
|
|
|
|
|
uint32 pixelHeight;
|
|
|
|
|
uint32 pixelDepth;
|
|
|
|
|
uint32 numberOfArrayElements;
|
|
|
|
|
uint32 numberOfFaces;
|
|
|
|
|
uint32 numberOfMipmapLevels;
|
|
|
|
|
uint32 bytesOfKeyValueData;
|
|
|
|
|
|
|
|
|
|
KtxHeader();
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
2018-02-06 02:55:07 +00:00
|
|
|
|
NVIMAGE_API Stream & operator<< (Stream & s, KtxHeader & header);
|
2011-03-22 22:52:43 +00:00
|
|
|
|
|
|
|
|
|
|
2018-02-06 02:55:07 +00:00
|
|
|
|
/* struct KtxFile {
|
2011-03-22 22:52:43 +00:00
|
|
|
|
KtxFile();
|
|
|
|
|
~KtxFile();
|
|
|
|
|
|
|
|
|
|
void addKeyValue(const char * key, const char * value);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
KtxHeader header;
|
|
|
|
|
|
|
|
|
|
Array<String> keyArray;
|
|
|
|
|
Array<String> valueArray;
|
|
|
|
|
};
|
|
|
|
|
|
2018-02-06 02:55:07 +00:00
|
|
|
|
NVIMAGE_API Stream & operator<< (Stream & s, KtxFile & file);*/
|
2011-03-22 22:52:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
for each keyValuePair that fits in bytesOfKeyValueData
|
|
|
|
|
UInt32 keyAndValueByteSize
|
|
|
|
|
Byte keyAndValue[keyAndValueByteSize]
|
|
|
|
|
Byte valuePadding[3 - ((keyAndValueByteSize + 3) % 4)]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for each mipmap_level in numberOfMipmapLevels*
|
|
|
|
|
UInt32 imageSize;
|
|
|
|
|
for each array_element in numberOfArrayElements*
|
|
|
|
|
for each face in numberOfFaces
|
|
|
|
|
for each z_slice in pixelDepth*
|
|
|
|
|
for each row or row_of_blocks in pixelHeight*
|
|
|
|
|
for each pixel or block_of_pixels in pixelWidth
|
|
|
|
|
Byte data[format-specific-number-of-bytes]**
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
Byte cubePadding[0-3]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
Byte mipPadding[3 - ((imageSize + 3) % 4)]
|
|
|
|
|
end
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
} // nv namespace
|
|
|
|
|
|
|
|
|
|
#endif // NV_IMAGE_KTXFILE_H
|