ktx-parse.modern.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. ///////////////////////////////////////////////////
  2. // KTX2 Header.
  3. ///////////////////////////////////////////////////
  4. const KHR_SUPERCOMPRESSION_NONE = 0;
  5. const KHR_SUPERCOMPRESSION_BASISLZ = 1;
  6. const KHR_SUPERCOMPRESSION_ZSTD = 2;
  7. const KHR_SUPERCOMPRESSION_ZLIB = 3; ///////////////////////////////////////////////////
  8. // Data Format Descriptor (DFD).
  9. ///////////////////////////////////////////////////
  10. const KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT = 0;
  11. const KHR_DF_VENDORID_KHRONOS = 0;
  12. const KHR_DF_VERSION = 2;
  13. const KHR_DF_MODEL_UNSPECIFIED = 0;
  14. const KHR_DF_MODEL_RGBSDA = 1; // ...
  15. const KHR_DF_MODEL_ETC1 = 160;
  16. const KHR_DF_MODEL_ETC2 = 161;
  17. const KHR_DF_MODEL_ASTC = 162;
  18. const KHR_DF_MODEL_ETC1S = 163;
  19. const KHR_DF_MODEL_UASTC = 166;
  20. const KHR_DF_FLAG_ALPHA_STRAIGHT = 0;
  21. const KHR_DF_FLAG_ALPHA_PREMULTIPLIED = 1;
  22. const KHR_DF_TRANSFER_UNSPECIFIED = 0;
  23. const KHR_DF_TRANSFER_LINEAR = 1;
  24. const KHR_DF_TRANSFER_SRGB = 2;
  25. const KHR_DF_TRANSFER_ITU = 3;
  26. const KHR_DF_TRANSFER_NTSC = 4;
  27. const KHR_DF_TRANSFER_SLOG = 5;
  28. const KHR_DF_TRANSFER_SLOG2 = 6;
  29. const KHR_DF_TRANSFER_BT1886 = 7;
  30. const KHR_DF_TRANSFER_HLG_OETF = 8;
  31. const KHR_DF_TRANSFER_HLG_EOTF = 9;
  32. const KHR_DF_TRANSFER_PQ_EOTF = 10;
  33. const KHR_DF_TRANSFER_PQ_OETF = 11;
  34. const KHR_DF_TRANSFER_DCIP3 = 12;
  35. const KHR_DF_TRANSFER_PAL_OETF = 13;
  36. const KHR_DF_TRANSFER_PAL625_EOTF = 14;
  37. const KHR_DF_TRANSFER_ST240 = 15;
  38. const KHR_DF_TRANSFER_ACESCC = 16;
  39. const KHR_DF_TRANSFER_ACESCCT = 17;
  40. const KHR_DF_TRANSFER_ADOBERGB = 18;
  41. const KHR_DF_PRIMARIES_UNSPECIFIED = 0;
  42. const KHR_DF_PRIMARIES_BT709 = 1;
  43. const KHR_DF_PRIMARIES_BT601_EBU = 2;
  44. const KHR_DF_PRIMARIES_BT601_SMPTE = 3;
  45. const KHR_DF_PRIMARIES_BT2020 = 4;
  46. const KHR_DF_PRIMARIES_CIEXYZ = 5;
  47. const KHR_DF_PRIMARIES_ACES = 6;
  48. const KHR_DF_PRIMARIES_ACESCC = 7;
  49. const KHR_DF_PRIMARIES_NTSC1953 = 8;
  50. const KHR_DF_PRIMARIES_PAL525 = 9;
  51. const KHR_DF_PRIMARIES_DISPLAYP3 = 10;
  52. const KHR_DF_PRIMARIES_ADOBERGB = 11;
  53. const KHR_DF_CHANNEL_RGBSDA_RED = 0;
  54. const KHR_DF_CHANNEL_RGBSDA_GREEN = 1;
  55. const KHR_DF_CHANNEL_RGBSDA_BLUE = 2;
  56. const KHR_DF_CHANNEL_RGBSDA_STENCIL = 13;
  57. const KHR_DF_CHANNEL_RGBSDA_DEPTH = 14;
  58. const KHR_DF_CHANNEL_RGBSDA_ALPHA = 15;
  59. const KHR_DF_SAMPLE_DATATYPE_FLOAT = 0x80;
  60. const KHR_DF_SAMPLE_DATATYPE_SIGNED = 0x40;
  61. const KHR_DF_SAMPLE_DATATYPE_EXPONENT = 0x20;
  62. const KHR_DF_SAMPLE_DATATYPE_LINEAR = 0x10; ///////////////////////////////////////////////////
  63. // VK FORMAT.
  64. ///////////////////////////////////////////////////
  65. const VK_FORMAT_UNDEFINED = 0;
  66. const VK_FORMAT_R4G4_UNORM_PACK8 = 1;
  67. const VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2;
  68. const VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3;
  69. const VK_FORMAT_R5G6B5_UNORM_PACK16 = 4;
  70. const VK_FORMAT_B5G6R5_UNORM_PACK16 = 5;
  71. const VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6;
  72. const VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7;
  73. const VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8;
  74. const VK_FORMAT_R8_UNORM = 9;
  75. const VK_FORMAT_R8_SNORM = 10;
  76. const VK_FORMAT_R8_UINT = 13;
  77. const VK_FORMAT_R8_SINT = 14;
  78. const VK_FORMAT_R8_SRGB = 15;
  79. const VK_FORMAT_R8G8_UNORM = 16;
  80. const VK_FORMAT_R8G8_SNORM = 17;
  81. const VK_FORMAT_R8G8_UINT = 20;
  82. const VK_FORMAT_R8G8_SINT = 21;
  83. const VK_FORMAT_R8G8_SRGB = 22;
  84. const VK_FORMAT_R8G8B8_UNORM = 23;
  85. const VK_FORMAT_R8G8B8_SNORM = 24;
  86. const VK_FORMAT_R8G8B8_UINT = 27;
  87. const VK_FORMAT_R8G8B8_SINT = 28;
  88. const VK_FORMAT_R8G8B8_SRGB = 29;
  89. const VK_FORMAT_B8G8R8_UNORM = 30;
  90. const VK_FORMAT_B8G8R8_SNORM = 31;
  91. const VK_FORMAT_B8G8R8_UINT = 34;
  92. const VK_FORMAT_B8G8R8_SINT = 35;
  93. const VK_FORMAT_B8G8R8_SRGB = 36;
  94. const VK_FORMAT_R8G8B8A8_UNORM = 37;
  95. const VK_FORMAT_R8G8B8A8_SNORM = 38;
  96. const VK_FORMAT_R8G8B8A8_UINT = 41;
  97. const VK_FORMAT_R8G8B8A8_SINT = 42;
  98. const VK_FORMAT_R8G8B8A8_SRGB = 43;
  99. const VK_FORMAT_B8G8R8A8_UNORM = 44;
  100. const VK_FORMAT_B8G8R8A8_SNORM = 45;
  101. const VK_FORMAT_B8G8R8A8_UINT = 48;
  102. const VK_FORMAT_B8G8R8A8_SINT = 49;
  103. const VK_FORMAT_B8G8R8A8_SRGB = 50;
  104. const VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58;
  105. const VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59;
  106. const VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62;
  107. const VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63;
  108. const VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64;
  109. const VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65;
  110. const VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68;
  111. const VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69;
  112. const VK_FORMAT_R16_UNORM = 70;
  113. const VK_FORMAT_R16_SNORM = 71;
  114. const VK_FORMAT_R16_UINT = 74;
  115. const VK_FORMAT_R16_SINT = 75;
  116. const VK_FORMAT_R16_SFLOAT = 76;
  117. const VK_FORMAT_R16G16_UNORM = 77;
  118. const VK_FORMAT_R16G16_SNORM = 78;
  119. const VK_FORMAT_R16G16_UINT = 81;
  120. const VK_FORMAT_R16G16_SINT = 82;
  121. const VK_FORMAT_R16G16_SFLOAT = 83;
  122. const VK_FORMAT_R16G16B16_UNORM = 84;
  123. const VK_FORMAT_R16G16B16_SNORM = 85;
  124. const VK_FORMAT_R16G16B16_UINT = 88;
  125. const VK_FORMAT_R16G16B16_SINT = 89;
  126. const VK_FORMAT_R16G16B16_SFLOAT = 90;
  127. const VK_FORMAT_R16G16B16A16_UNORM = 91;
  128. const VK_FORMAT_R16G16B16A16_SNORM = 92;
  129. const VK_FORMAT_R16G16B16A16_UINT = 95;
  130. const VK_FORMAT_R16G16B16A16_SINT = 96;
  131. const VK_FORMAT_R16G16B16A16_SFLOAT = 97;
  132. const VK_FORMAT_R32_UINT = 98;
  133. const VK_FORMAT_R32_SINT = 99;
  134. const VK_FORMAT_R32_SFLOAT = 100;
  135. const VK_FORMAT_R32G32_UINT = 101;
  136. const VK_FORMAT_R32G32_SINT = 102;
  137. const VK_FORMAT_R32G32_SFLOAT = 103;
  138. const VK_FORMAT_R32G32B32_UINT = 104;
  139. const VK_FORMAT_R32G32B32_SINT = 105;
  140. const VK_FORMAT_R32G32B32_SFLOAT = 106;
  141. const VK_FORMAT_R32G32B32A32_UINT = 107;
  142. const VK_FORMAT_R32G32B32A32_SINT = 108;
  143. const VK_FORMAT_R32G32B32A32_SFLOAT = 109;
  144. const VK_FORMAT_R64_UINT = 110;
  145. const VK_FORMAT_R64_SINT = 111;
  146. const VK_FORMAT_R64_SFLOAT = 112;
  147. const VK_FORMAT_R64G64_UINT = 113;
  148. const VK_FORMAT_R64G64_SINT = 114;
  149. const VK_FORMAT_R64G64_SFLOAT = 115;
  150. const VK_FORMAT_R64G64B64_UINT = 116;
  151. const VK_FORMAT_R64G64B64_SINT = 117;
  152. const VK_FORMAT_R64G64B64_SFLOAT = 118;
  153. const VK_FORMAT_R64G64B64A64_UINT = 119;
  154. const VK_FORMAT_R64G64B64A64_SINT = 120;
  155. const VK_FORMAT_R64G64B64A64_SFLOAT = 121;
  156. const VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122;
  157. const VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123;
  158. const VK_FORMAT_D16_UNORM = 124;
  159. const VK_FORMAT_X8_D24_UNORM_PACK32 = 125;
  160. const VK_FORMAT_D32_SFLOAT = 126;
  161. const VK_FORMAT_S8_UINT = 127;
  162. const VK_FORMAT_D16_UNORM_S8_UINT = 128;
  163. const VK_FORMAT_D24_UNORM_S8_UINT = 129;
  164. const VK_FORMAT_D32_SFLOAT_S8_UINT = 130;
  165. const VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131;
  166. const VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132;
  167. const VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133;
  168. const VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134;
  169. const VK_FORMAT_BC2_UNORM_BLOCK = 135;
  170. const VK_FORMAT_BC2_SRGB_BLOCK = 136;
  171. const VK_FORMAT_BC3_UNORM_BLOCK = 137;
  172. const VK_FORMAT_BC3_SRGB_BLOCK = 138;
  173. const VK_FORMAT_BC4_UNORM_BLOCK = 139;
  174. const VK_FORMAT_BC4_SNORM_BLOCK = 140;
  175. const VK_FORMAT_BC5_UNORM_BLOCK = 141;
  176. const VK_FORMAT_BC5_SNORM_BLOCK = 142;
  177. const VK_FORMAT_BC6H_UFLOAT_BLOCK = 143;
  178. const VK_FORMAT_BC6H_SFLOAT_BLOCK = 144;
  179. const VK_FORMAT_BC7_UNORM_BLOCK = 145;
  180. const VK_FORMAT_BC7_SRGB_BLOCK = 146;
  181. const VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147;
  182. const VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148;
  183. const VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149;
  184. const VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150;
  185. const VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151;
  186. const VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152;
  187. const VK_FORMAT_EAC_R11_UNORM_BLOCK = 153;
  188. const VK_FORMAT_EAC_R11_SNORM_BLOCK = 154;
  189. const VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155;
  190. const VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156;
  191. const VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157;
  192. const VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158;
  193. const VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159;
  194. const VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160;
  195. const VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161;
  196. const VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162;
  197. const VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163;
  198. const VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164;
  199. const VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165;
  200. const VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166;
  201. const VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167;
  202. const VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168;
  203. const VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169;
  204. const VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170;
  205. const VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171;
  206. const VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172;
  207. const VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173;
  208. const VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174;
  209. const VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175;
  210. const VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176;
  211. const VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177;
  212. const VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178;
  213. const VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179;
  214. const VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180;
  215. const VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181;
  216. const VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182;
  217. const VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183;
  218. const VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184;
  219. const VK_FORMAT_R10X6_UNORM_PACK16 = 1000156007;
  220. const VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = 1000156008;
  221. const VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = 1000156009;
  222. const VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = 1000156010;
  223. const VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = 1000156011;
  224. const VK_FORMAT_R12X4_UNORM_PACK16 = 1000156017;
  225. const VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = 1000156018;
  226. const VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = 1000156019;
  227. const VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = 1000156020;
  228. const VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = 1000156021;
  229. const VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000;
  230. const VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001;
  231. const VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002;
  232. const VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003;
  233. const VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004;
  234. const VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005;
  235. const VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006;
  236. const VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007;
  237. const VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = 1000066000;
  238. const VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = 1000066001;
  239. const VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = 1000066002;
  240. const VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = 1000066003;
  241. const VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = 1000066004;
  242. const VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = 1000066005;
  243. const VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = 1000066006;
  244. const VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = 1000066007;
  245. const VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = 1000066008;
  246. const VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = 1000066009;
  247. const VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = 1000066010;
  248. const VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = 1000066011;
  249. const VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = 1000066012;
  250. const VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = 1000066013;
  251. const VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = 1000340000;
  252. const VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = 1000340001;
  253. /**
  254. * Represents an unpacked KTX 2.0 texture container. Data for individual mip levels are stored in
  255. * the `.levels` array, typically compressed in Basis Universal formats. Additional properties
  256. * provide metadata required to process, transcode, and upload these textures.
  257. */
  258. class KTX2Container {
  259. constructor() {
  260. this.vkFormat = VK_FORMAT_UNDEFINED;
  261. this.typeSize = 1;
  262. this.pixelWidth = 0;
  263. this.pixelHeight = 0;
  264. this.pixelDepth = 0;
  265. this.layerCount = 0;
  266. this.faceCount = 1;
  267. this.supercompressionScheme = KHR_SUPERCOMPRESSION_NONE;
  268. this.levels = [];
  269. this.dataFormatDescriptor = [{
  270. vendorId: KHR_DF_VENDORID_KHRONOS,
  271. descriptorType: KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,
  272. descriptorBlockSize: 0,
  273. versionNumber: KHR_DF_VERSION,
  274. colorModel: KHR_DF_MODEL_UNSPECIFIED,
  275. colorPrimaries: KHR_DF_PRIMARIES_BT709,
  276. transferFunction: KHR_DF_TRANSFER_SRGB,
  277. flags: KHR_DF_FLAG_ALPHA_STRAIGHT,
  278. texelBlockDimension: [0, 0, 0, 0],
  279. bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0],
  280. samples: []
  281. }];
  282. this.keyValue = {};
  283. this.globalData = null;
  284. }
  285. }
  286. class BufferReader {
  287. constructor(data, byteOffset, byteLength, littleEndian) {
  288. this._dataView = void 0;
  289. this._littleEndian = void 0;
  290. this._offset = void 0;
  291. this._dataView = new DataView(data.buffer, data.byteOffset + byteOffset, byteLength);
  292. this._littleEndian = littleEndian;
  293. this._offset = 0;
  294. }
  295. _nextUint8() {
  296. const value = this._dataView.getUint8(this._offset);
  297. this._offset += 1;
  298. return value;
  299. }
  300. _nextUint16() {
  301. const value = this._dataView.getUint16(this._offset, this._littleEndian);
  302. this._offset += 2;
  303. return value;
  304. }
  305. _nextUint32() {
  306. const value = this._dataView.getUint32(this._offset, this._littleEndian);
  307. this._offset += 4;
  308. return value;
  309. }
  310. _nextUint64() {
  311. const left = this._dataView.getUint32(this._offset, this._littleEndian);
  312. const right = this._dataView.getUint32(this._offset + 4, this._littleEndian); // TODO(cleanup): Just test this...
  313. // const value = this._littleEndian ? left + (2 ** 32 * right) : (2 ** 32 * left) + right;
  314. const value = left + 2 ** 32 * right;
  315. this._offset += 8;
  316. return value;
  317. }
  318. _nextInt32() {
  319. const value = this._dataView.getInt32(this._offset, this._littleEndian);
  320. this._offset += 4;
  321. return value;
  322. }
  323. _skip(bytes) {
  324. this._offset += bytes;
  325. return this;
  326. }
  327. _scan(maxByteLength, term = 0x00) {
  328. const byteOffset = this._offset;
  329. let byteLength = 0;
  330. while (this._dataView.getUint8(this._offset) !== term && byteLength < maxByteLength) {
  331. byteLength++;
  332. this._offset++;
  333. }
  334. if (byteLength < maxByteLength) this._offset++;
  335. return new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + byteOffset, byteLength);
  336. }
  337. }
  338. ///////////////////////////////////////////////////
  339. // Common.
  340. ///////////////////////////////////////////////////
  341. const KTX_WRITER = `KTX-Parse v${"0.5.0"}`;
  342. const NUL = new Uint8Array([0x00]); ///////////////////////////////////////////////////
  343. // KTX2 Header.
  344. ///////////////////////////////////////////////////
  345. const KTX2_ID = [// '´', 'K', 'T', 'X', '2', '0', 'ª', '\r', '\n', '\x1A', '\n'
  346. 0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a];
  347. const HEADER_BYTE_LENGTH = 68; // 13 * 4 + 2 * 8
  348. /** Encodes text to an ArrayBuffer. */
  349. function encodeText(text) {
  350. if (typeof TextEncoder !== 'undefined') {
  351. return new TextEncoder().encode(text);
  352. }
  353. return Buffer.from(text);
  354. }
  355. /** Decodes an ArrayBuffer to text. */
  356. function decodeText(buffer) {
  357. if (typeof TextDecoder !== 'undefined') {
  358. return new TextDecoder().decode(buffer);
  359. }
  360. return Buffer.from(buffer).toString('utf8');
  361. }
  362. /** Concatenates N ArrayBuffers. */
  363. function concat(buffers) {
  364. let totalByteLength = 0;
  365. for (const buffer of buffers) {
  366. totalByteLength += buffer.byteLength;
  367. }
  368. const result = new Uint8Array(totalByteLength);
  369. let byteOffset = 0;
  370. for (const buffer of buffers) {
  371. result.set(new Uint8Array(buffer), byteOffset);
  372. byteOffset += buffer.byteLength;
  373. }
  374. return result;
  375. }
  376. /**
  377. * Parses a KTX 2.0 file, returning an unpacked {@link KTX2Container} instance with all associated
  378. * data. The container's mip levels and other binary data are pointers into the original file, not
  379. * copies, so the original file should not be overwritten after reading.
  380. *
  381. * @param data Bytes of KTX 2.0 file, as Uint8Array or Buffer.
  382. */
  383. function read(data) {
  384. ///////////////////////////////////////////////////
  385. // KTX 2.0 Identifier.
  386. ///////////////////////////////////////////////////
  387. const id = new Uint8Array(data.buffer, data.byteOffset, KTX2_ID.length);
  388. if (id[0] !== KTX2_ID[0] || // '´'
  389. id[1] !== KTX2_ID[1] || // 'K'
  390. id[2] !== KTX2_ID[2] || // 'T'
  391. id[3] !== KTX2_ID[3] || // 'X'
  392. id[4] !== KTX2_ID[4] || // ' '
  393. id[5] !== KTX2_ID[5] || // '2'
  394. id[6] !== KTX2_ID[6] || // '0'
  395. id[7] !== KTX2_ID[7] || // 'ª'
  396. id[8] !== KTX2_ID[8] || // '\r'
  397. id[9] !== KTX2_ID[9] || // '\n'
  398. id[10] !== KTX2_ID[10] || // '\x1A'
  399. id[11] !== KTX2_ID[11] // '\n'
  400. ) {
  401. throw new Error('Missing KTX 2.0 identifier.');
  402. }
  403. const container = new KTX2Container(); ///////////////////////////////////////////////////
  404. // Header.
  405. ///////////////////////////////////////////////////
  406. const headerByteLength = 17 * Uint32Array.BYTES_PER_ELEMENT;
  407. const headerReader = new BufferReader(data, KTX2_ID.length, headerByteLength, true);
  408. container.vkFormat = headerReader._nextUint32();
  409. container.typeSize = headerReader._nextUint32();
  410. container.pixelWidth = headerReader._nextUint32();
  411. container.pixelHeight = headerReader._nextUint32();
  412. container.pixelDepth = headerReader._nextUint32();
  413. container.layerCount = headerReader._nextUint32();
  414. container.faceCount = headerReader._nextUint32();
  415. const levelCount = headerReader._nextUint32();
  416. container.supercompressionScheme = headerReader._nextUint32();
  417. const dfdByteOffset = headerReader._nextUint32();
  418. const dfdByteLength = headerReader._nextUint32();
  419. const kvdByteOffset = headerReader._nextUint32();
  420. const kvdByteLength = headerReader._nextUint32();
  421. const sgdByteOffset = headerReader._nextUint64();
  422. const sgdByteLength = headerReader._nextUint64(); ///////////////////////////////////////////////////
  423. // Level Index.
  424. ///////////////////////////////////////////////////
  425. const levelByteLength = levelCount * 3 * 8;
  426. const levelReader = new BufferReader(data, KTX2_ID.length + headerByteLength, levelByteLength, true);
  427. for (let i = 0; i < levelCount; i++) {
  428. container.levels.push({
  429. levelData: new Uint8Array(data.buffer, data.byteOffset + levelReader._nextUint64(), levelReader._nextUint64()),
  430. uncompressedByteLength: levelReader._nextUint64()
  431. });
  432. } ///////////////////////////////////////////////////
  433. // Data Format Descriptor (DFD).
  434. ///////////////////////////////////////////////////
  435. const dfdReader = new BufferReader(data, dfdByteOffset, dfdByteLength, true);
  436. const dfd = {
  437. vendorId: dfdReader._skip(4
  438. /* totalSize */
  439. )._nextUint16(),
  440. descriptorType: dfdReader._nextUint16(),
  441. versionNumber: dfdReader._nextUint16(),
  442. descriptorBlockSize: dfdReader._nextUint16(),
  443. colorModel: dfdReader._nextUint8(),
  444. colorPrimaries: dfdReader._nextUint8(),
  445. transferFunction: dfdReader._nextUint8(),
  446. flags: dfdReader._nextUint8(),
  447. texelBlockDimension: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],
  448. bytesPlane: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],
  449. samples: []
  450. };
  451. const sampleStart = 6;
  452. const sampleWords = 4;
  453. const numSamples = (dfd.descriptorBlockSize / 4 - sampleStart) / sampleWords;
  454. for (let i = 0; i < numSamples; i++) {
  455. const sample = {
  456. bitOffset: dfdReader._nextUint16(),
  457. bitLength: dfdReader._nextUint8(),
  458. channelType: dfdReader._nextUint8(),
  459. samplePosition: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],
  460. sampleLower: -Infinity,
  461. sampleUpper: Infinity
  462. };
  463. if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {
  464. sample.sampleLower = dfdReader._nextInt32();
  465. sample.sampleUpper = dfdReader._nextInt32();
  466. } else {
  467. sample.sampleLower = dfdReader._nextUint32();
  468. sample.sampleUpper = dfdReader._nextUint32();
  469. }
  470. dfd.samples[i] = sample;
  471. }
  472. container.dataFormatDescriptor.length = 0;
  473. container.dataFormatDescriptor.push(dfd); ///////////////////////////////////////////////////
  474. // Key/Value Data (KVD).
  475. ///////////////////////////////////////////////////
  476. const kvdReader = new BufferReader(data, kvdByteOffset, kvdByteLength, true);
  477. while (kvdReader._offset < kvdByteLength) {
  478. const keyValueByteLength = kvdReader._nextUint32();
  479. const keyData = kvdReader._scan(keyValueByteLength);
  480. const key = decodeText(keyData);
  481. const valueData = kvdReader._scan(keyValueByteLength - keyData.byteLength);
  482. container.keyValue[key] = key.match(/^ktx/i) ? decodeText(valueData) : valueData; // 4-byte alignment.
  483. if (kvdReader._offset % 4) kvdReader._skip(4 - kvdReader._offset % 4);
  484. } ///////////////////////////////////////////////////
  485. // Supercompression Global Data (SGD).
  486. ///////////////////////////////////////////////////
  487. if (sgdByteLength <= 0) return container;
  488. const sgdReader = new BufferReader(data, sgdByteOffset, sgdByteLength, true);
  489. const endpointCount = sgdReader._nextUint16();
  490. const selectorCount = sgdReader._nextUint16();
  491. const endpointsByteLength = sgdReader._nextUint32();
  492. const selectorsByteLength = sgdReader._nextUint32();
  493. const tablesByteLength = sgdReader._nextUint32();
  494. const extendedByteLength = sgdReader._nextUint32();
  495. const imageDescs = [];
  496. for (let i = 0; i < levelCount; i++) {
  497. imageDescs.push({
  498. imageFlags: sgdReader._nextUint32(),
  499. rgbSliceByteOffset: sgdReader._nextUint32(),
  500. rgbSliceByteLength: sgdReader._nextUint32(),
  501. alphaSliceByteOffset: sgdReader._nextUint32(),
  502. alphaSliceByteLength: sgdReader._nextUint32()
  503. });
  504. }
  505. const endpointsByteOffset = sgdByteOffset + sgdReader._offset;
  506. const selectorsByteOffset = endpointsByteOffset + endpointsByteLength;
  507. const tablesByteOffset = selectorsByteOffset + selectorsByteLength;
  508. const extendedByteOffset = tablesByteOffset + tablesByteLength;
  509. const endpointsData = new Uint8Array(data.buffer, data.byteOffset + endpointsByteOffset, endpointsByteLength);
  510. const selectorsData = new Uint8Array(data.buffer, data.byteOffset + selectorsByteOffset, selectorsByteLength);
  511. const tablesData = new Uint8Array(data.buffer, data.byteOffset + tablesByteOffset, tablesByteLength);
  512. const extendedData = new Uint8Array(data.buffer, data.byteOffset + extendedByteOffset, extendedByteLength);
  513. container.globalData = {
  514. endpointCount,
  515. selectorCount,
  516. imageDescs,
  517. endpointsData,
  518. selectorsData,
  519. tablesData,
  520. extendedData
  521. };
  522. return container;
  523. }
  524. function _extends() {
  525. _extends = Object.assign ? Object.assign.bind() : function (target) {
  526. for (var i = 1; i < arguments.length; i++) {
  527. var source = arguments[i];
  528. for (var key in source) {
  529. if (Object.prototype.hasOwnProperty.call(source, key)) {
  530. target[key] = source[key];
  531. }
  532. }
  533. }
  534. return target;
  535. };
  536. return _extends.apply(this, arguments);
  537. }
  538. const DEFAULT_OPTIONS = {
  539. keepWriter: false
  540. };
  541. /**
  542. * Serializes a {@link KTX2Container} instance to a KTX 2.0 file. Mip levels and other binary data
  543. * are copied into the resulting Uint8Array, so the original container can safely be edited or
  544. * destroyed after it is serialized.
  545. *
  546. * Options:
  547. * - keepWriter: If true, 'KTXWriter' key/value field is written as provided by the container.
  548. * Otherwise, a string for the current ktx-parse version is generated. Default: false.
  549. *
  550. * @param container
  551. * @param options
  552. */
  553. function write(container, options = {}) {
  554. options = _extends({}, DEFAULT_OPTIONS, options); ///////////////////////////////////////////////////
  555. // Supercompression Global Data (SGD).
  556. ///////////////////////////////////////////////////
  557. let sgdBuffer = new ArrayBuffer(0);
  558. if (container.globalData) {
  559. const sgdHeaderBuffer = new ArrayBuffer(20 + container.globalData.imageDescs.length * 5 * 4);
  560. const sgdHeaderView = new DataView(sgdHeaderBuffer);
  561. sgdHeaderView.setUint16(0, container.globalData.endpointCount, true);
  562. sgdHeaderView.setUint16(2, container.globalData.selectorCount, true);
  563. sgdHeaderView.setUint32(4, container.globalData.endpointsData.byteLength, true);
  564. sgdHeaderView.setUint32(8, container.globalData.selectorsData.byteLength, true);
  565. sgdHeaderView.setUint32(12, container.globalData.tablesData.byteLength, true);
  566. sgdHeaderView.setUint32(16, container.globalData.extendedData.byteLength, true);
  567. for (let i = 0; i < container.globalData.imageDescs.length; i++) {
  568. const imageDesc = container.globalData.imageDescs[i];
  569. sgdHeaderView.setUint32(20 + i * 5 * 4 + 0, imageDesc.imageFlags, true);
  570. sgdHeaderView.setUint32(20 + i * 5 * 4 + 4, imageDesc.rgbSliceByteOffset, true);
  571. sgdHeaderView.setUint32(20 + i * 5 * 4 + 8, imageDesc.rgbSliceByteLength, true);
  572. sgdHeaderView.setUint32(20 + i * 5 * 4 + 12, imageDesc.alphaSliceByteOffset, true);
  573. sgdHeaderView.setUint32(20 + i * 5 * 4 + 16, imageDesc.alphaSliceByteLength, true);
  574. }
  575. sgdBuffer = concat([sgdHeaderBuffer, container.globalData.endpointsData, container.globalData.selectorsData, container.globalData.tablesData, container.globalData.extendedData]);
  576. } ///////////////////////////////////////////////////
  577. // Key/Value Data (KVD).
  578. ///////////////////////////////////////////////////
  579. const keyValueData = [];
  580. let keyValue = container.keyValue;
  581. if (!options.keepWriter) {
  582. keyValue = _extends({}, container.keyValue, {
  583. KTXwriter: KTX_WRITER
  584. });
  585. }
  586. for (const key in keyValue) {
  587. const value = keyValue[key];
  588. const keyData = encodeText(key);
  589. const valueData = typeof value === 'string' ? encodeText(value) : value;
  590. const kvByteLength = keyData.byteLength + 1 + valueData.byteLength + 1;
  591. const kvPadding = kvByteLength % 4 ? 4 - kvByteLength % 4 : 0; // align(4)
  592. keyValueData.push(concat([new Uint32Array([kvByteLength]), keyData, NUL, valueData, NUL, new Uint8Array(kvPadding).fill(0x00) // align(4)
  593. ]));
  594. }
  595. const kvdBuffer = concat(keyValueData); ///////////////////////////////////////////////////
  596. // Data Format Descriptor (DFD).
  597. ///////////////////////////////////////////////////
  598. if (container.dataFormatDescriptor.length !== 1 || container.dataFormatDescriptor[0].descriptorType !== KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT) {
  599. throw new Error('Only BASICFORMAT Data Format Descriptor output supported.');
  600. }
  601. const dfd = container.dataFormatDescriptor[0];
  602. const dfdBuffer = new ArrayBuffer(28 + dfd.samples.length * 16);
  603. const dfdView = new DataView(dfdBuffer);
  604. const descriptorBlockSize = 24 + dfd.samples.length * 16;
  605. dfdView.setUint32(0, dfdBuffer.byteLength, true);
  606. dfdView.setUint16(4, dfd.vendorId, true);
  607. dfdView.setUint16(6, dfd.descriptorType, true);
  608. dfdView.setUint16(8, dfd.versionNumber, true);
  609. dfdView.setUint16(10, descriptorBlockSize, true);
  610. dfdView.setUint8(12, dfd.colorModel);
  611. dfdView.setUint8(13, dfd.colorPrimaries);
  612. dfdView.setUint8(14, dfd.transferFunction);
  613. dfdView.setUint8(15, dfd.flags);
  614. if (!Array.isArray(dfd.texelBlockDimension)) {
  615. throw new Error('texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.');
  616. }
  617. dfdView.setUint8(16, dfd.texelBlockDimension[0]);
  618. dfdView.setUint8(17, dfd.texelBlockDimension[1]);
  619. dfdView.setUint8(18, dfd.texelBlockDimension[2]);
  620. dfdView.setUint8(19, dfd.texelBlockDimension[3]);
  621. for (let i = 0; i < 8; i++) dfdView.setUint8(20 + i, dfd.bytesPlane[i]);
  622. for (let i = 0; i < dfd.samples.length; i++) {
  623. const sample = dfd.samples[i];
  624. const sampleByteOffset = 28 + i * 16;
  625. if (sample.channelID) {
  626. throw new Error('channelID has been renamed to channelType.');
  627. }
  628. dfdView.setUint16(sampleByteOffset + 0, sample.bitOffset, true);
  629. dfdView.setUint8(sampleByteOffset + 2, sample.bitLength);
  630. dfdView.setUint8(sampleByteOffset + 3, sample.channelType);
  631. dfdView.setUint8(sampleByteOffset + 4, sample.samplePosition[0]);
  632. dfdView.setUint8(sampleByteOffset + 5, sample.samplePosition[1]);
  633. dfdView.setUint8(sampleByteOffset + 6, sample.samplePosition[2]);
  634. dfdView.setUint8(sampleByteOffset + 7, sample.samplePosition[3]);
  635. if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {
  636. dfdView.setInt32(sampleByteOffset + 8, sample.sampleLower, true);
  637. dfdView.setInt32(sampleByteOffset + 12, sample.sampleUpper, true);
  638. } else {
  639. dfdView.setUint32(sampleByteOffset + 8, sample.sampleLower, true);
  640. dfdView.setUint32(sampleByteOffset + 12, sample.sampleUpper, true);
  641. }
  642. } ///////////////////////////////////////////////////
  643. // Data alignment.
  644. ///////////////////////////////////////////////////
  645. const dfdByteOffset = KTX2_ID.length + HEADER_BYTE_LENGTH + container.levels.length * 3 * 8;
  646. const kvdByteOffset = dfdByteOffset + dfdBuffer.byteLength;
  647. let sgdByteOffset = sgdBuffer.byteLength > 0 ? kvdByteOffset + kvdBuffer.byteLength : 0;
  648. if (sgdByteOffset % 8) sgdByteOffset += 8 - sgdByteOffset % 8; // align(8)
  649. ///////////////////////////////////////////////////
  650. // Level Index.
  651. ///////////////////////////////////////////////////
  652. const levelData = [];
  653. const levelIndex = new DataView(new ArrayBuffer(container.levels.length * 3 * 8));
  654. let levelDataByteOffset = (sgdByteOffset || kvdByteOffset + kvdBuffer.byteLength) + sgdBuffer.byteLength;
  655. for (let i = 0; i < container.levels.length; i++) {
  656. const level = container.levels[i];
  657. levelData.push(level.levelData);
  658. levelIndex.setBigUint64(i * 24 + 0, BigInt(levelDataByteOffset), true);
  659. levelIndex.setBigUint64(i * 24 + 8, BigInt(level.levelData.byteLength), true);
  660. levelIndex.setBigUint64(i * 24 + 16, BigInt(level.uncompressedByteLength), true);
  661. levelDataByteOffset += level.levelData.byteLength;
  662. } ///////////////////////////////////////////////////
  663. // Header.
  664. ///////////////////////////////////////////////////
  665. const headerBuffer = new ArrayBuffer(HEADER_BYTE_LENGTH);
  666. const headerView = new DataView(headerBuffer);
  667. headerView.setUint32(0, container.vkFormat, true);
  668. headerView.setUint32(4, container.typeSize, true);
  669. headerView.setUint32(8, container.pixelWidth, true);
  670. headerView.setUint32(12, container.pixelHeight, true);
  671. headerView.setUint32(16, container.pixelDepth, true);
  672. headerView.setUint32(20, container.layerCount, true);
  673. headerView.setUint32(24, container.faceCount, true);
  674. headerView.setUint32(28, container.levels.length, true);
  675. headerView.setUint32(32, container.supercompressionScheme, true);
  676. headerView.setUint32(36, dfdByteOffset, true);
  677. headerView.setUint32(40, dfdBuffer.byteLength, true);
  678. headerView.setUint32(44, kvdByteOffset, true);
  679. headerView.setUint32(48, kvdBuffer.byteLength, true);
  680. headerView.setBigUint64(52, BigInt(sgdBuffer.byteLength > 0 ? sgdByteOffset : 0), true);
  681. headerView.setBigUint64(60, BigInt(sgdBuffer.byteLength), true); ///////////////////////////////////////////////////
  682. // Compose.
  683. ///////////////////////////////////////////////////
  684. return new Uint8Array(concat([new Uint8Array(KTX2_ID).buffer, headerBuffer, levelIndex.buffer, dfdBuffer, kvdBuffer, sgdByteOffset > 0 ? new ArrayBuffer(sgdByteOffset - (kvdByteOffset + kvdBuffer.byteLength)) // align(8)
  685. : new ArrayBuffer(0), sgdBuffer, ...levelData]));
  686. }
  687. export { KHR_DF_CHANNEL_RGBSDA_ALPHA, KHR_DF_CHANNEL_RGBSDA_BLUE, KHR_DF_CHANNEL_RGBSDA_DEPTH, KHR_DF_CHANNEL_RGBSDA_GREEN, KHR_DF_CHANNEL_RGBSDA_RED, KHR_DF_CHANNEL_RGBSDA_STENCIL, KHR_DF_FLAG_ALPHA_PREMULTIPLIED, KHR_DF_FLAG_ALPHA_STRAIGHT, KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT, KHR_DF_MODEL_ASTC, KHR_DF_MODEL_ETC1, KHR_DF_MODEL_ETC1S, KHR_DF_MODEL_ETC2, KHR_DF_MODEL_RGBSDA, KHR_DF_MODEL_UASTC, KHR_DF_MODEL_UNSPECIFIED, KHR_DF_PRIMARIES_ACES, KHR_DF_PRIMARIES_ACESCC, KHR_DF_PRIMARIES_ADOBERGB, KHR_DF_PRIMARIES_BT2020, KHR_DF_PRIMARIES_BT601_EBU, KHR_DF_PRIMARIES_BT601_SMPTE, KHR_DF_PRIMARIES_BT709, KHR_DF_PRIMARIES_CIEXYZ, KHR_DF_PRIMARIES_DISPLAYP3, KHR_DF_PRIMARIES_NTSC1953, KHR_DF_PRIMARIES_PAL525, KHR_DF_PRIMARIES_UNSPECIFIED, KHR_DF_SAMPLE_DATATYPE_EXPONENT, KHR_DF_SAMPLE_DATATYPE_FLOAT, KHR_DF_SAMPLE_DATATYPE_LINEAR, KHR_DF_SAMPLE_DATATYPE_SIGNED, KHR_DF_TRANSFER_ACESCC, KHR_DF_TRANSFER_ACESCCT, KHR_DF_TRANSFER_ADOBERGB, KHR_DF_TRANSFER_BT1886, KHR_DF_TRANSFER_DCIP3, KHR_DF_TRANSFER_HLG_EOTF, KHR_DF_TRANSFER_HLG_OETF, KHR_DF_TRANSFER_ITU, KHR_DF_TRANSFER_LINEAR, KHR_DF_TRANSFER_NTSC, KHR_DF_TRANSFER_PAL625_EOTF, KHR_DF_TRANSFER_PAL_OETF, KHR_DF_TRANSFER_PQ_EOTF, KHR_DF_TRANSFER_PQ_OETF, KHR_DF_TRANSFER_SLOG, KHR_DF_TRANSFER_SLOG2, KHR_DF_TRANSFER_SRGB, KHR_DF_TRANSFER_ST240, KHR_DF_TRANSFER_UNSPECIFIED, KHR_DF_VENDORID_KHRONOS, KHR_DF_VERSION, KHR_SUPERCOMPRESSION_BASISLZ, KHR_SUPERCOMPRESSION_NONE, KHR_SUPERCOMPRESSION_ZLIB, KHR_SUPERCOMPRESSION_ZSTD, KTX2Container, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_A2B10G10R10_SINT_PACK32, VK_FORMAT_A2B10G10R10_SNORM_PACK32, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_SINT_PACK32, VK_FORMAT_A2R10G10B10_SNORM_PACK32, VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT, VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x10_SRGB_BLOCK, VK_FORMAT_ASTC_10x10_UNORM_BLOCK, VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x5_SRGB_BLOCK, VK_FORMAT_ASTC_10x5_UNORM_BLOCK, VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x6_SRGB_BLOCK, VK_FORMAT_ASTC_10x6_UNORM_BLOCK, VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x8_UNORM_BLOCK, VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x10_UNORM_BLOCK, VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x12_SRGB_BLOCK, VK_FORMAT_ASTC_12x12_UNORM_BLOCK, VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_4x4_SRGB_BLOCK, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x5_SRGB_BLOCK, VK_FORMAT_ASTC_5x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x6_SRGB_BLOCK, VK_FORMAT_ASTC_6x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x5_SRGB_BLOCK, VK_FORMAT_ASTC_8x5_UNORM_BLOCK, VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x8_SRGB_BLOCK, VK_FORMAT_ASTC_8x8_UNORM_BLOCK, VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_B5G5R5A1_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16, VK_FORMAT_B8G8R8A8_SINT, VK_FORMAT_B8G8R8A8_SNORM, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_UINT, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8_SINT, VK_FORMAT_B8G8R8_SNORM, VK_FORMAT_B8G8R8_SRGB, VK_FORMAT_B8G8R8_UINT, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_BC1_RGBA_SRGB_BLOCK, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, VK_FORMAT_BC1_RGB_SRGB_BLOCK, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC2_SRGB_BLOCK, VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_BC3_SRGB_BLOCK, VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_BC4_SNORM_BLOCK, VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_BC5_SNORM_BLOCK, VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_BC6H_SFLOAT_BLOCK, VK_FORMAT_BC6H_UFLOAT_BLOCK, VK_FORMAT_BC7_SRGB_BLOCK, VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_D16_UNORM, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_EAC_R11G11_SNORM_BLOCK, VK_FORMAT_EAC_R11G11_UNORM_BLOCK, VK_FORMAT_EAC_R11_SNORM_BLOCK, VK_FORMAT_EAC_R11_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, VK_FORMAT_R10X6G10X6_UNORM_2PACK16, VK_FORMAT_R10X6_UNORM_PACK16, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, VK_FORMAT_R12X4G12X4_UNORM_2PACK16, VK_FORMAT_R12X4_UNORM_PACK16, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16_SFLOAT, VK_FORMAT_R16G16B16_SINT, VK_FORMAT_R16G16B16_SNORM, VK_FORMAT_R16G16B16_UINT, VK_FORMAT_R16G16B16_UNORM, VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16_SINT, VK_FORMAT_R16G16_SNORM, VK_FORMAT_R16G16_UINT, VK_FORMAT_R16G16_UNORM, VK_FORMAT_R16_SFLOAT, VK_FORMAT_R16_SINT, VK_FORMAT_R16_SNORM, VK_FORMAT_R16_UINT, VK_FORMAT_R16_UNORM, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32_SINT, VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32_UINT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R4G4B4A4_UNORM_PACK16, VK_FORMAT_R4G4_UNORM_PACK8, VK_FORMAT_R5G5B5A1_UNORM_PACK16, VK_FORMAT_R5G6B5_UNORM_PACK16, VK_FORMAT_R64G64B64A64_SFLOAT, VK_FORMAT_R64G64B64A64_SINT, VK_FORMAT_R64G64B64A64_UINT, VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64_SINT, VK_FORMAT_R64G64B64_UINT, VK_FORMAT_R64G64_SFLOAT, VK_FORMAT_R64G64_SINT, VK_FORMAT_R64G64_UINT, VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64_SINT, VK_FORMAT_R64_UINT, VK_FORMAT_R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8_SINT, VK_FORMAT_R8G8B8_SNORM, VK_FORMAT_R8G8B8_SRGB, VK_FORMAT_R8G8B8_UINT, VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8_SINT, VK_FORMAT_R8G8_SNORM, VK_FORMAT_R8G8_SRGB, VK_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8_SINT, VK_FORMAT_R8_SNORM, VK_FORMAT_R8_SRGB, VK_FORMAT_R8_UINT, VK_FORMAT_R8_UNORM, VK_FORMAT_S8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, read, write };
  688. //# sourceMappingURL=ktx-parse.modern.js.map