智慧水务管理系统 - 精河县供水工程综合管理平台

ktx-parse.cjs 48KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041
  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. ///////////////////////////////////////////////////
  9. // Data Format Descriptor (DFD).
  10. ///////////////////////////////////////////////////
  11. const KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT = 0;
  12. const KHR_DF_VENDORID_KHRONOS = 0;
  13. const KHR_DF_VERSION = 2;
  14. const KHR_DF_MODEL_UNSPECIFIED = 0;
  15. const KHR_DF_MODEL_RGBSDA = 1;
  16. // ...
  17. const KHR_DF_MODEL_ETC1 = 160;
  18. const KHR_DF_MODEL_ETC2 = 161;
  19. const KHR_DF_MODEL_ASTC = 162;
  20. const KHR_DF_MODEL_ETC1S = 163;
  21. const KHR_DF_MODEL_UASTC = 166;
  22. const KHR_DF_FLAG_ALPHA_STRAIGHT = 0;
  23. const KHR_DF_FLAG_ALPHA_PREMULTIPLIED = 1;
  24. const KHR_DF_TRANSFER_UNSPECIFIED = 0;
  25. const KHR_DF_TRANSFER_LINEAR = 1;
  26. const KHR_DF_TRANSFER_SRGB = 2;
  27. const KHR_DF_TRANSFER_ITU = 3;
  28. const KHR_DF_TRANSFER_NTSC = 4;
  29. const KHR_DF_TRANSFER_SLOG = 5;
  30. const KHR_DF_TRANSFER_SLOG2 = 6;
  31. const KHR_DF_TRANSFER_BT1886 = 7;
  32. const KHR_DF_TRANSFER_HLG_OETF = 8;
  33. const KHR_DF_TRANSFER_HLG_EOTF = 9;
  34. const KHR_DF_TRANSFER_PQ_EOTF = 10;
  35. const KHR_DF_TRANSFER_PQ_OETF = 11;
  36. const KHR_DF_TRANSFER_DCIP3 = 12;
  37. const KHR_DF_TRANSFER_PAL_OETF = 13;
  38. const KHR_DF_TRANSFER_PAL625_EOTF = 14;
  39. const KHR_DF_TRANSFER_ST240 = 15;
  40. const KHR_DF_TRANSFER_ACESCC = 16;
  41. const KHR_DF_TRANSFER_ACESCCT = 17;
  42. const KHR_DF_TRANSFER_ADOBERGB = 18;
  43. const KHR_DF_PRIMARIES_UNSPECIFIED = 0;
  44. const KHR_DF_PRIMARIES_BT709 = 1;
  45. const KHR_DF_PRIMARIES_BT601_EBU = 2;
  46. const KHR_DF_PRIMARIES_BT601_SMPTE = 3;
  47. const KHR_DF_PRIMARIES_BT2020 = 4;
  48. const KHR_DF_PRIMARIES_CIEXYZ = 5;
  49. const KHR_DF_PRIMARIES_ACES = 6;
  50. const KHR_DF_PRIMARIES_ACESCC = 7;
  51. const KHR_DF_PRIMARIES_NTSC1953 = 8;
  52. const KHR_DF_PRIMARIES_PAL525 = 9;
  53. const KHR_DF_PRIMARIES_DISPLAYP3 = 10;
  54. const KHR_DF_PRIMARIES_ADOBERGB = 11;
  55. const KHR_DF_CHANNEL_RGBSDA_RED = 0;
  56. const KHR_DF_CHANNEL_RGBSDA_GREEN = 1;
  57. const KHR_DF_CHANNEL_RGBSDA_BLUE = 2;
  58. const KHR_DF_CHANNEL_RGBSDA_STENCIL = 13;
  59. const KHR_DF_CHANNEL_RGBSDA_DEPTH = 14;
  60. const KHR_DF_CHANNEL_RGBSDA_ALPHA = 15;
  61. const KHR_DF_SAMPLE_DATATYPE_FLOAT = 0x80;
  62. const KHR_DF_SAMPLE_DATATYPE_SIGNED = 0x40;
  63. const KHR_DF_SAMPLE_DATATYPE_EXPONENT = 0x20;
  64. const KHR_DF_SAMPLE_DATATYPE_LINEAR = 0x10;
  65. ///////////////////////////////////////////////////
  66. // VK FORMAT.
  67. ///////////////////////////////////////////////////
  68. const VK_FORMAT_UNDEFINED = 0;
  69. const VK_FORMAT_R4G4_UNORM_PACK8 = 1;
  70. const VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2;
  71. const VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3;
  72. const VK_FORMAT_R5G6B5_UNORM_PACK16 = 4;
  73. const VK_FORMAT_B5G6R5_UNORM_PACK16 = 5;
  74. const VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6;
  75. const VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7;
  76. const VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8;
  77. const VK_FORMAT_R8_UNORM = 9;
  78. const VK_FORMAT_R8_SNORM = 10;
  79. const VK_FORMAT_R8_UINT = 13;
  80. const VK_FORMAT_R8_SINT = 14;
  81. const VK_FORMAT_R8_SRGB = 15;
  82. const VK_FORMAT_R8G8_UNORM = 16;
  83. const VK_FORMAT_R8G8_SNORM = 17;
  84. const VK_FORMAT_R8G8_UINT = 20;
  85. const VK_FORMAT_R8G8_SINT = 21;
  86. const VK_FORMAT_R8G8_SRGB = 22;
  87. const VK_FORMAT_R8G8B8_UNORM = 23;
  88. const VK_FORMAT_R8G8B8_SNORM = 24;
  89. const VK_FORMAT_R8G8B8_UINT = 27;
  90. const VK_FORMAT_R8G8B8_SINT = 28;
  91. const VK_FORMAT_R8G8B8_SRGB = 29;
  92. const VK_FORMAT_B8G8R8_UNORM = 30;
  93. const VK_FORMAT_B8G8R8_SNORM = 31;
  94. const VK_FORMAT_B8G8R8_UINT = 34;
  95. const VK_FORMAT_B8G8R8_SINT = 35;
  96. const VK_FORMAT_B8G8R8_SRGB = 36;
  97. const VK_FORMAT_R8G8B8A8_UNORM = 37;
  98. const VK_FORMAT_R8G8B8A8_SNORM = 38;
  99. const VK_FORMAT_R8G8B8A8_UINT = 41;
  100. const VK_FORMAT_R8G8B8A8_SINT = 42;
  101. const VK_FORMAT_R8G8B8A8_SRGB = 43;
  102. const VK_FORMAT_B8G8R8A8_UNORM = 44;
  103. const VK_FORMAT_B8G8R8A8_SNORM = 45;
  104. const VK_FORMAT_B8G8R8A8_UINT = 48;
  105. const VK_FORMAT_B8G8R8A8_SINT = 49;
  106. const VK_FORMAT_B8G8R8A8_SRGB = 50;
  107. const VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58;
  108. const VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59;
  109. const VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62;
  110. const VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63;
  111. const VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64;
  112. const VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65;
  113. const VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68;
  114. const VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69;
  115. const VK_FORMAT_R16_UNORM = 70;
  116. const VK_FORMAT_R16_SNORM = 71;
  117. const VK_FORMAT_R16_UINT = 74;
  118. const VK_FORMAT_R16_SINT = 75;
  119. const VK_FORMAT_R16_SFLOAT = 76;
  120. const VK_FORMAT_R16G16_UNORM = 77;
  121. const VK_FORMAT_R16G16_SNORM = 78;
  122. const VK_FORMAT_R16G16_UINT = 81;
  123. const VK_FORMAT_R16G16_SINT = 82;
  124. const VK_FORMAT_R16G16_SFLOAT = 83;
  125. const VK_FORMAT_R16G16B16_UNORM = 84;
  126. const VK_FORMAT_R16G16B16_SNORM = 85;
  127. const VK_FORMAT_R16G16B16_UINT = 88;
  128. const VK_FORMAT_R16G16B16_SINT = 89;
  129. const VK_FORMAT_R16G16B16_SFLOAT = 90;
  130. const VK_FORMAT_R16G16B16A16_UNORM = 91;
  131. const VK_FORMAT_R16G16B16A16_SNORM = 92;
  132. const VK_FORMAT_R16G16B16A16_UINT = 95;
  133. const VK_FORMAT_R16G16B16A16_SINT = 96;
  134. const VK_FORMAT_R16G16B16A16_SFLOAT = 97;
  135. const VK_FORMAT_R32_UINT = 98;
  136. const VK_FORMAT_R32_SINT = 99;
  137. const VK_FORMAT_R32_SFLOAT = 100;
  138. const VK_FORMAT_R32G32_UINT = 101;
  139. const VK_FORMAT_R32G32_SINT = 102;
  140. const VK_FORMAT_R32G32_SFLOAT = 103;
  141. const VK_FORMAT_R32G32B32_UINT = 104;
  142. const VK_FORMAT_R32G32B32_SINT = 105;
  143. const VK_FORMAT_R32G32B32_SFLOAT = 106;
  144. const VK_FORMAT_R32G32B32A32_UINT = 107;
  145. const VK_FORMAT_R32G32B32A32_SINT = 108;
  146. const VK_FORMAT_R32G32B32A32_SFLOAT = 109;
  147. const VK_FORMAT_R64_UINT = 110;
  148. const VK_FORMAT_R64_SINT = 111;
  149. const VK_FORMAT_R64_SFLOAT = 112;
  150. const VK_FORMAT_R64G64_UINT = 113;
  151. const VK_FORMAT_R64G64_SINT = 114;
  152. const VK_FORMAT_R64G64_SFLOAT = 115;
  153. const VK_FORMAT_R64G64B64_UINT = 116;
  154. const VK_FORMAT_R64G64B64_SINT = 117;
  155. const VK_FORMAT_R64G64B64_SFLOAT = 118;
  156. const VK_FORMAT_R64G64B64A64_UINT = 119;
  157. const VK_FORMAT_R64G64B64A64_SINT = 120;
  158. const VK_FORMAT_R64G64B64A64_SFLOAT = 121;
  159. const VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122;
  160. const VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123;
  161. const VK_FORMAT_D16_UNORM = 124;
  162. const VK_FORMAT_X8_D24_UNORM_PACK32 = 125;
  163. const VK_FORMAT_D32_SFLOAT = 126;
  164. const VK_FORMAT_S8_UINT = 127;
  165. const VK_FORMAT_D16_UNORM_S8_UINT = 128;
  166. const VK_FORMAT_D24_UNORM_S8_UINT = 129;
  167. const VK_FORMAT_D32_SFLOAT_S8_UINT = 130;
  168. const VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131;
  169. const VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132;
  170. const VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133;
  171. const VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134;
  172. const VK_FORMAT_BC2_UNORM_BLOCK = 135;
  173. const VK_FORMAT_BC2_SRGB_BLOCK = 136;
  174. const VK_FORMAT_BC3_UNORM_BLOCK = 137;
  175. const VK_FORMAT_BC3_SRGB_BLOCK = 138;
  176. const VK_FORMAT_BC4_UNORM_BLOCK = 139;
  177. const VK_FORMAT_BC4_SNORM_BLOCK = 140;
  178. const VK_FORMAT_BC5_UNORM_BLOCK = 141;
  179. const VK_FORMAT_BC5_SNORM_BLOCK = 142;
  180. const VK_FORMAT_BC6H_UFLOAT_BLOCK = 143;
  181. const VK_FORMAT_BC6H_SFLOAT_BLOCK = 144;
  182. const VK_FORMAT_BC7_UNORM_BLOCK = 145;
  183. const VK_FORMAT_BC7_SRGB_BLOCK = 146;
  184. const VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147;
  185. const VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148;
  186. const VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149;
  187. const VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150;
  188. const VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151;
  189. const VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152;
  190. const VK_FORMAT_EAC_R11_UNORM_BLOCK = 153;
  191. const VK_FORMAT_EAC_R11_SNORM_BLOCK = 154;
  192. const VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155;
  193. const VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156;
  194. const VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157;
  195. const VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158;
  196. const VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159;
  197. const VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160;
  198. const VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161;
  199. const VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162;
  200. const VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163;
  201. const VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164;
  202. const VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165;
  203. const VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166;
  204. const VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167;
  205. const VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168;
  206. const VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169;
  207. const VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170;
  208. const VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171;
  209. const VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172;
  210. const VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173;
  211. const VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174;
  212. const VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175;
  213. const VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176;
  214. const VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177;
  215. const VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178;
  216. const VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179;
  217. const VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180;
  218. const VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181;
  219. const VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182;
  220. const VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183;
  221. const VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184;
  222. const VK_FORMAT_R10X6_UNORM_PACK16 = 1000156007;
  223. const VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = 1000156008;
  224. const VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = 1000156009;
  225. const VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = 1000156010;
  226. const VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = 1000156011;
  227. const VK_FORMAT_R12X4_UNORM_PACK16 = 1000156017;
  228. const VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = 1000156018;
  229. const VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = 1000156019;
  230. const VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = 1000156020;
  231. const VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = 1000156021;
  232. const VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000;
  233. const VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001;
  234. const VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002;
  235. const VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003;
  236. const VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004;
  237. const VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005;
  238. const VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006;
  239. const VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007;
  240. const VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = 1000066000;
  241. const VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = 1000066001;
  242. const VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = 1000066002;
  243. const VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = 1000066003;
  244. const VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = 1000066004;
  245. const VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = 1000066005;
  246. const VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = 1000066006;
  247. const VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = 1000066007;
  248. const VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = 1000066008;
  249. const VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = 1000066009;
  250. const VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = 1000066010;
  251. const VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = 1000066011;
  252. const VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = 1000066012;
  253. const VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = 1000066013;
  254. const VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = 1000340000;
  255. const VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = 1000340001;
  256. /**
  257. * Creates a 'default' {@link KTX2Container} object, initialized with common
  258. * configuration wfor BT709 primaries and sRGB transfer, without pixel data.
  259. * There's nothing particularly special about the 'default' container; creating
  260. * the KTX2Container object explicitly is also fine.
  261. */
  262. function createDefaultContainer() {
  263. return {
  264. vkFormat: VK_FORMAT_UNDEFINED,
  265. typeSize: 1,
  266. pixelWidth: 0,
  267. pixelHeight: 0,
  268. pixelDepth: 0,
  269. layerCount: 0,
  270. faceCount: 1,
  271. levelCount: 0,
  272. supercompressionScheme: KHR_SUPERCOMPRESSION_NONE,
  273. levels: [],
  274. dataFormatDescriptor: [{
  275. vendorId: KHR_DF_VENDORID_KHRONOS,
  276. descriptorType: KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,
  277. versionNumber: KHR_DF_VERSION,
  278. colorModel: KHR_DF_MODEL_UNSPECIFIED,
  279. colorPrimaries: KHR_DF_PRIMARIES_BT709,
  280. transferFunction: KHR_DF_TRANSFER_SRGB,
  281. flags: KHR_DF_FLAG_ALPHA_STRAIGHT,
  282. texelBlockDimension: [0, 0, 0, 0],
  283. bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0],
  284. samples: []
  285. }],
  286. keyValue: {},
  287. globalData: null
  288. };
  289. }
  290. class BufferReader {
  291. constructor(data, byteOffset, byteLength, littleEndian) {
  292. this._dataView = void 0;
  293. this._littleEndian = void 0;
  294. this._offset = void 0;
  295. this._dataView = new DataView(data.buffer, data.byteOffset + byteOffset, byteLength);
  296. this._littleEndian = littleEndian;
  297. this._offset = 0;
  298. }
  299. _nextUint8() {
  300. const value = this._dataView.getUint8(this._offset);
  301. this._offset += 1;
  302. return value;
  303. }
  304. _nextUint16() {
  305. const value = this._dataView.getUint16(this._offset, this._littleEndian);
  306. this._offset += 2;
  307. return value;
  308. }
  309. _nextUint32() {
  310. const value = this._dataView.getUint32(this._offset, this._littleEndian);
  311. this._offset += 4;
  312. return value;
  313. }
  314. _nextUint64() {
  315. const left = this._dataView.getUint32(this._offset, this._littleEndian);
  316. const right = this._dataView.getUint32(this._offset + 4, this._littleEndian);
  317. // TODO(cleanup): Just test this...
  318. // const value = this._littleEndian ? left + (2 ** 32 * right) : (2 ** 32 * left) + right;
  319. const value = left + 2 ** 32 * right;
  320. this._offset += 8;
  321. return value;
  322. }
  323. _nextInt32() {
  324. const value = this._dataView.getInt32(this._offset, this._littleEndian);
  325. this._offset += 4;
  326. return value;
  327. }
  328. _nextUint8Array(len) {
  329. const value = new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + this._offset, len);
  330. this._offset += len;
  331. return value;
  332. }
  333. _skip(bytes) {
  334. this._offset += bytes;
  335. return this;
  336. }
  337. _scan(maxByteLength, term = 0x00) {
  338. const byteOffset = this._offset;
  339. let byteLength = 0;
  340. while (this._dataView.getUint8(this._offset) !== term && byteLength < maxByteLength) {
  341. byteLength++;
  342. this._offset++;
  343. }
  344. if (byteLength < maxByteLength) this._offset++;
  345. return new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + byteOffset, byteLength);
  346. }
  347. }
  348. ///////////////////////////////////////////////////
  349. // Common.
  350. ///////////////////////////////////////////////////
  351. const KTX_WRITER = `KTX-Parse v${"1.1.0"}`;
  352. const NUL = new Uint8Array([0x00]);
  353. ///////////////////////////////////////////////////
  354. // KTX2 Header.
  355. ///////////////////////////////////////////////////
  356. const KTX2_ID = [
  357. // '´', 'K', 'T', 'X', '2', '0', 'ª', '\r', '\n', '\x1A', '\n'
  358. 0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a];
  359. const HEADER_BYTE_LENGTH = 68; // 13 * 4 + 2 * 8
  360. /** Encodes text to an ArrayBuffer. */
  361. function encodeText(text) {
  362. return new TextEncoder().encode(text);
  363. }
  364. /** Decodes an ArrayBuffer to text. */
  365. function decodeText(buffer) {
  366. return new TextDecoder().decode(buffer);
  367. }
  368. /** Concatenates N ArrayBuffers. */
  369. function concat(buffers) {
  370. let totalByteLength = 0;
  371. for (const buffer of buffers) {
  372. totalByteLength += buffer.byteLength;
  373. }
  374. const result = new Uint8Array(totalByteLength);
  375. let byteOffset = 0;
  376. for (const buffer of buffers) {
  377. result.set(new Uint8Array(buffer), byteOffset);
  378. byteOffset += buffer.byteLength;
  379. }
  380. return result;
  381. }
  382. /** Returns the least common multiple (LCM) for two positive integers. */
  383. function leastCommonMultiple(a, b) {
  384. const max = Math.max(a, b);
  385. const min = Math.min(a, b);
  386. let lcm = max;
  387. while (lcm % min !== 0) {
  388. lcm += max;
  389. }
  390. return lcm;
  391. }
  392. /**
  393. * Returns amount of padding, in bytes, required to pad a value V to N-byte
  394. * boundaries. Both V and N must be positive integers.
  395. */
  396. function getPadding(v, n = 4) {
  397. return Math.ceil(v / n) * n - v;
  398. }
  399. /** Returns byte length per texel block. */
  400. function getBlockByteLength(container) {
  401. return container.levels[0].levelData.byteLength / getBlockCount(container, 0);
  402. }
  403. /**
  404. * Returns total number of blocks for given level. For VK_FORMAT_UNDEFINED, DFD is required.
  405. *
  406. * References:
  407. * - https://github.khronos.org/KTX-Specification/ktxspec.v2.html#levelImages
  408. */
  409. function getBlockCount(container, levelIndex) {
  410. let blockCount = 1;
  411. const pixelDimensions = [container.pixelWidth, container.pixelHeight, container.pixelDepth];
  412. const blockDimensions = getBlockDimensions(container);
  413. for (let i = 0; i < 3; i++) {
  414. if (pixelDimensions[i] > 0) {
  415. const dimBlockCount = Math.ceil(Math.floor(pixelDimensions[i] * 2 ** -levelIndex) / blockDimensions[i]);
  416. blockCount *= Math.max(1, dimBlockCount);
  417. }
  418. }
  419. if (container.layerCount > 0) {
  420. blockCount *= container.layerCount;
  421. }
  422. if (container.faceCount > 0) {
  423. blockCount *= container.faceCount;
  424. }
  425. return blockCount;
  426. }
  427. /**
  428. * Given a KTX2 container, returns block dimensions as [width, height, depth]. Requires valid DFD.
  429. */
  430. function getBlockDimensions(container) {
  431. const [x, y, z] = container.dataFormatDescriptor[0].texelBlockDimension;
  432. return [x + 1, y + 1, z + 1];
  433. }
  434. /**
  435. * Parses a KTX 2.0 file, returning an unpacked {@link KTX2Container} instance with all associated
  436. * data. The container's mip levels and other binary data are pointers into the original file, not
  437. * copies, so the original file should not be overwritten after reading.
  438. *
  439. * @param data Bytes of KTX 2.0 file, as Uint8Array or Buffer.
  440. */
  441. function read(data) {
  442. ///////////////////////////////////////////////////
  443. // KTX 2.0 Identifier.
  444. ///////////////////////////////////////////////////
  445. const id = new Uint8Array(data.buffer, data.byteOffset, KTX2_ID.length);
  446. if (id[0] !== KTX2_ID[0] ||
  447. // '´'
  448. id[1] !== KTX2_ID[1] ||
  449. // 'K'
  450. id[2] !== KTX2_ID[2] ||
  451. // 'T'
  452. id[3] !== KTX2_ID[3] ||
  453. // 'X'
  454. id[4] !== KTX2_ID[4] ||
  455. // ' '
  456. id[5] !== KTX2_ID[5] ||
  457. // '2'
  458. id[6] !== KTX2_ID[6] ||
  459. // '0'
  460. id[7] !== KTX2_ID[7] ||
  461. // 'ª'
  462. id[8] !== KTX2_ID[8] ||
  463. // '\r'
  464. id[9] !== KTX2_ID[9] ||
  465. // '\n'
  466. id[10] !== KTX2_ID[10] ||
  467. // '\x1A'
  468. id[11] !== KTX2_ID[11] // '\n'
  469. ) {
  470. throw new Error('Missing KTX 2.0 identifier.');
  471. }
  472. const container = createDefaultContainer();
  473. ///////////////////////////////////////////////////
  474. // Header.
  475. ///////////////////////////////////////////////////
  476. const headerByteLength = 17 * Uint32Array.BYTES_PER_ELEMENT;
  477. const headerReader = new BufferReader(data, KTX2_ID.length, headerByteLength, true);
  478. container.vkFormat = headerReader._nextUint32();
  479. container.typeSize = headerReader._nextUint32();
  480. container.pixelWidth = headerReader._nextUint32();
  481. container.pixelHeight = headerReader._nextUint32();
  482. container.pixelDepth = headerReader._nextUint32();
  483. container.layerCount = headerReader._nextUint32();
  484. container.faceCount = headerReader._nextUint32();
  485. container.levelCount = headerReader._nextUint32();
  486. container.supercompressionScheme = headerReader._nextUint32();
  487. const dfdByteOffset = headerReader._nextUint32();
  488. const dfdByteLength = headerReader._nextUint32();
  489. const kvdByteOffset = headerReader._nextUint32();
  490. const kvdByteLength = headerReader._nextUint32();
  491. const sgdByteOffset = headerReader._nextUint64();
  492. const sgdByteLength = headerReader._nextUint64();
  493. ///////////////////////////////////////////////////
  494. // Level Index.
  495. ///////////////////////////////////////////////////
  496. const levelByteLength = Math.max(container.levelCount, 1) * 3 * 8;
  497. const levelReader = new BufferReader(data, KTX2_ID.length + headerByteLength, levelByteLength, true);
  498. for (let i = 0, il = Math.max(container.levelCount, 1); i < il; i++) {
  499. container.levels.push({
  500. levelData: new Uint8Array(data.buffer, data.byteOffset + levelReader._nextUint64(), levelReader._nextUint64()),
  501. uncompressedByteLength: levelReader._nextUint64()
  502. });
  503. }
  504. ///////////////////////////////////////////////////
  505. // Data Format Descriptor (DFD).
  506. ///////////////////////////////////////////////////
  507. const dfdReader = new BufferReader(data, dfdByteOffset, dfdByteLength, true);
  508. dfdReader._skip(4); // totalSize
  509. const vendorId = dfdReader._nextUint16();
  510. const descriptorType = dfdReader._nextUint16();
  511. const versionNumber = dfdReader._nextUint16();
  512. const descriptorBlockSize = dfdReader._nextUint16();
  513. const colorModel = dfdReader._nextUint8();
  514. const colorPrimaries = dfdReader._nextUint8();
  515. const transferFunction = dfdReader._nextUint8();
  516. const flags = dfdReader._nextUint8();
  517. const texelBlockDimension = [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()];
  518. const bytesPlane = [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()];
  519. const samples = [];
  520. const dfd = {
  521. vendorId,
  522. descriptorType,
  523. versionNumber,
  524. colorModel,
  525. colorPrimaries,
  526. transferFunction,
  527. flags,
  528. texelBlockDimension,
  529. bytesPlane,
  530. samples
  531. };
  532. const sampleStart = 6;
  533. const sampleWords = 4;
  534. const numSamples = (descriptorBlockSize / 4 - sampleStart) / sampleWords;
  535. for (let i = 0; i < numSamples; i++) {
  536. const sample = {
  537. bitOffset: dfdReader._nextUint16(),
  538. bitLength: dfdReader._nextUint8(),
  539. channelType: dfdReader._nextUint8(),
  540. samplePosition: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],
  541. sampleLower: Number.NEGATIVE_INFINITY,
  542. sampleUpper: Number.POSITIVE_INFINITY
  543. };
  544. if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {
  545. sample.sampleLower = dfdReader._nextInt32();
  546. sample.sampleUpper = dfdReader._nextInt32();
  547. } else {
  548. sample.sampleLower = dfdReader._nextUint32();
  549. sample.sampleUpper = dfdReader._nextUint32();
  550. }
  551. dfd.samples[i] = sample;
  552. }
  553. container.dataFormatDescriptor.length = 0;
  554. container.dataFormatDescriptor.push(dfd);
  555. ///////////////////////////////////////////////////
  556. // Key/Value Data (KVD).
  557. ///////////////////////////////////////////////////
  558. const kvdReader = new BufferReader(data, kvdByteOffset, kvdByteLength, true);
  559. while (kvdReader._offset < kvdByteLength) {
  560. const keyValueByteLength = kvdReader._nextUint32();
  561. const keyData = kvdReader._scan(keyValueByteLength);
  562. const key = decodeText(keyData);
  563. container.keyValue[key] = kvdReader._nextUint8Array(keyValueByteLength - keyData.byteLength - 1);
  564. if (key.match(/^ktx/i)) {
  565. const text = decodeText(container.keyValue[key]);
  566. container.keyValue[key] = text.substring(0, text.lastIndexOf('\x00'));
  567. }
  568. const kvPadding = keyValueByteLength % 4 ? 4 - keyValueByteLength % 4 : 0; // align(4)
  569. // 4-byte alignment.
  570. kvdReader._skip(kvPadding);
  571. }
  572. ///////////////////////////////////////////////////
  573. // Supercompression Global Data (SGD).
  574. ///////////////////////////////////////////////////
  575. if (sgdByteLength <= 0) return container;
  576. const sgdReader = new BufferReader(data, sgdByteOffset, sgdByteLength, true);
  577. const endpointCount = sgdReader._nextUint16();
  578. const selectorCount = sgdReader._nextUint16();
  579. const endpointsByteLength = sgdReader._nextUint32();
  580. const selectorsByteLength = sgdReader._nextUint32();
  581. const tablesByteLength = sgdReader._nextUint32();
  582. const extendedByteLength = sgdReader._nextUint32();
  583. const imageDescs = [];
  584. for (let i = 0, il = Math.max(container.levelCount, 1); i < il; i++) {
  585. imageDescs.push({
  586. imageFlags: sgdReader._nextUint32(),
  587. rgbSliceByteOffset: sgdReader._nextUint32(),
  588. rgbSliceByteLength: sgdReader._nextUint32(),
  589. alphaSliceByteOffset: sgdReader._nextUint32(),
  590. alphaSliceByteLength: sgdReader._nextUint32()
  591. });
  592. }
  593. const endpointsByteOffset = sgdByteOffset + sgdReader._offset;
  594. const selectorsByteOffset = endpointsByteOffset + endpointsByteLength;
  595. const tablesByteOffset = selectorsByteOffset + selectorsByteLength;
  596. const extendedByteOffset = tablesByteOffset + tablesByteLength;
  597. const endpointsData = new Uint8Array(data.buffer, data.byteOffset + endpointsByteOffset, endpointsByteLength);
  598. const selectorsData = new Uint8Array(data.buffer, data.byteOffset + selectorsByteOffset, selectorsByteLength);
  599. const tablesData = new Uint8Array(data.buffer, data.byteOffset + tablesByteOffset, tablesByteLength);
  600. const extendedData = new Uint8Array(data.buffer, data.byteOffset + extendedByteOffset, extendedByteLength);
  601. container.globalData = {
  602. endpointCount,
  603. selectorCount,
  604. imageDescs,
  605. endpointsData,
  606. selectorsData,
  607. tablesData,
  608. extendedData
  609. };
  610. return container;
  611. }
  612. const DEFAULT_OPTIONS = {
  613. keepWriter: false
  614. };
  615. /**
  616. * Serializes a {@link KTX2Container} instance to a KTX 2.0 file. Mip levels and other binary data
  617. * are copied into the resulting Uint8Array, so the original container can safely be edited or
  618. * destroyed after it is serialized.
  619. *
  620. * Options:
  621. * - keepWriter: If true, 'KTXWriter' key/value field is written as provided by the container.
  622. * Otherwise, a string for the current ktx-parse version is generated. Default: false.
  623. *
  624. * @param container
  625. * @param options
  626. */
  627. function write(container, options = {}) {
  628. // biome-ignore lint/style/noParameterAssign: Merging defaults only.
  629. options = {
  630. ...DEFAULT_OPTIONS,
  631. ...options
  632. };
  633. ///////////////////////////////////////////////////
  634. // Supercompression Global Data (SGD).
  635. ///////////////////////////////////////////////////
  636. let sgdBuffer = new ArrayBuffer(0);
  637. if (container.globalData) {
  638. const sgdHeaderBuffer = new ArrayBuffer(20 + container.globalData.imageDescs.length * 5 * 4);
  639. const sgdHeaderView = new DataView(sgdHeaderBuffer);
  640. sgdHeaderView.setUint16(0, container.globalData.endpointCount, true);
  641. sgdHeaderView.setUint16(2, container.globalData.selectorCount, true);
  642. sgdHeaderView.setUint32(4, container.globalData.endpointsData.byteLength, true);
  643. sgdHeaderView.setUint32(8, container.globalData.selectorsData.byteLength, true);
  644. sgdHeaderView.setUint32(12, container.globalData.tablesData.byteLength, true);
  645. sgdHeaderView.setUint32(16, container.globalData.extendedData.byteLength, true);
  646. for (let i = 0; i < container.globalData.imageDescs.length; i++) {
  647. const imageDesc = container.globalData.imageDescs[i];
  648. sgdHeaderView.setUint32(20 + i * 5 * 4 + 0, imageDesc.imageFlags, true);
  649. sgdHeaderView.setUint32(20 + i * 5 * 4 + 4, imageDesc.rgbSliceByteOffset, true);
  650. sgdHeaderView.setUint32(20 + i * 5 * 4 + 8, imageDesc.rgbSliceByteLength, true);
  651. sgdHeaderView.setUint32(20 + i * 5 * 4 + 12, imageDesc.alphaSliceByteOffset, true);
  652. sgdHeaderView.setUint32(20 + i * 5 * 4 + 16, imageDesc.alphaSliceByteLength, true);
  653. }
  654. sgdBuffer = concat([sgdHeaderBuffer, container.globalData.endpointsData, container.globalData.selectorsData, container.globalData.tablesData, container.globalData.extendedData]);
  655. }
  656. ///////////////////////////////////////////////////
  657. // Key/Value Data (KVD).
  658. ///////////////////////////////////////////////////
  659. const keyValueData = [];
  660. const keyValueList = Object.entries({
  661. ...container.keyValue,
  662. ...(!options.keepWriter && {
  663. KTXwriter: KTX_WRITER
  664. })
  665. });
  666. keyValueList.sort((a, b) => a[0] > b[0] ? 1 : -1);
  667. for (const [key, value] of keyValueList) {
  668. const keyData = encodeText(key);
  669. const valueData = typeof value === 'string' ? concat([encodeText(value), NUL]) : value;
  670. const kvByteLength = keyData.byteLength + 1 + valueData.byteLength;
  671. const kvPadding = getPadding(kvByteLength, 4); // align(4)
  672. keyValueData.push(concat([new Uint32Array([kvByteLength]), keyData, NUL, valueData, new Uint8Array(kvPadding).fill(0x00) // align(4)
  673. ]));
  674. }
  675. const kvdBuffer = concat(keyValueData);
  676. ///////////////////////////////////////////////////
  677. // Data Format Descriptor (DFD).
  678. ///////////////////////////////////////////////////
  679. if (container.dataFormatDescriptor.length !== 1 || container.dataFormatDescriptor[0].descriptorType !== KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT) {
  680. throw new Error('Only BASICFORMAT Data Format Descriptor output supported.');
  681. }
  682. const dfd = container.dataFormatDescriptor[0];
  683. const dfdBuffer = new ArrayBuffer(28 + dfd.samples.length * 16);
  684. const dfdView = new DataView(dfdBuffer);
  685. const descriptorBlockSize = 24 + dfd.samples.length * 16;
  686. dfdView.setUint32(0, dfdBuffer.byteLength, true);
  687. dfdView.setUint16(4, dfd.vendorId, true);
  688. dfdView.setUint16(6, dfd.descriptorType, true);
  689. dfdView.setUint16(8, dfd.versionNumber, true);
  690. dfdView.setUint16(10, descriptorBlockSize, true);
  691. dfdView.setUint8(12, dfd.colorModel);
  692. dfdView.setUint8(13, dfd.colorPrimaries);
  693. dfdView.setUint8(14, dfd.transferFunction);
  694. dfdView.setUint8(15, dfd.flags);
  695. if (!Array.isArray(dfd.texelBlockDimension)) {
  696. throw new Error('texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.');
  697. }
  698. dfdView.setUint8(16, dfd.texelBlockDimension[0]);
  699. dfdView.setUint8(17, dfd.texelBlockDimension[1]);
  700. dfdView.setUint8(18, dfd.texelBlockDimension[2]);
  701. dfdView.setUint8(19, dfd.texelBlockDimension[3]);
  702. for (let i = 0; i < 8; i++) dfdView.setUint8(20 + i, dfd.bytesPlane[i]);
  703. for (let i = 0; i < dfd.samples.length; i++) {
  704. const sample = dfd.samples[i];
  705. const sampleByteOffset = 28 + i * 16;
  706. dfdView.setUint16(sampleByteOffset + 0, sample.bitOffset, true);
  707. dfdView.setUint8(sampleByteOffset + 2, sample.bitLength);
  708. dfdView.setUint8(sampleByteOffset + 3, sample.channelType);
  709. dfdView.setUint8(sampleByteOffset + 4, sample.samplePosition[0]);
  710. dfdView.setUint8(sampleByteOffset + 5, sample.samplePosition[1]);
  711. dfdView.setUint8(sampleByteOffset + 6, sample.samplePosition[2]);
  712. dfdView.setUint8(sampleByteOffset + 7, sample.samplePosition[3]);
  713. if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {
  714. dfdView.setInt32(sampleByteOffset + 8, sample.sampleLower, true);
  715. dfdView.setInt32(sampleByteOffset + 12, sample.sampleUpper, true);
  716. } else {
  717. dfdView.setUint32(sampleByteOffset + 8, sample.sampleLower, true);
  718. dfdView.setUint32(sampleByteOffset + 12, sample.sampleUpper, true);
  719. }
  720. }
  721. ///////////////////////////////////////////////////
  722. // Data alignment.
  723. ///////////////////////////////////////////////////
  724. const dfdByteOffset = KTX2_ID.length + HEADER_BYTE_LENGTH + container.levels.length * 3 * 8;
  725. const kvdByteOffset = dfdByteOffset + dfdBuffer.byteLength;
  726. let sgdByteOffset = sgdBuffer.byteLength > 0 ? kvdByteOffset + kvdBuffer.byteLength : 0;
  727. if (sgdByteOffset % 8) sgdByteOffset += 8 - sgdByteOffset % 8; // align(8)
  728. ///////////////////////////////////////////////////
  729. // Level Index.
  730. ///////////////////////////////////////////////////
  731. const levelData = [];
  732. const levelIndex = new DataView(new ArrayBuffer(container.levels.length * 3 * 8));
  733. const levelDataByteOffsets = new Uint32Array(container.levels.length);
  734. let levelAlign = 0;
  735. if (container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE) {
  736. levelAlign = leastCommonMultiple(getBlockByteLength(container), 4);
  737. }
  738. // Level data is ordered small → large.
  739. let levelDataByteOffset = (sgdByteOffset || kvdByteOffset + kvdBuffer.byteLength) + sgdBuffer.byteLength;
  740. for (let i = container.levels.length - 1; i >= 0; i--) {
  741. // Level padding.
  742. if (levelDataByteOffset % levelAlign) {
  743. const paddingBytes = getPadding(levelDataByteOffset, levelAlign);
  744. levelData.push(new Uint8Array(paddingBytes));
  745. levelDataByteOffset += paddingBytes;
  746. }
  747. // Level data.
  748. const level = container.levels[i];
  749. levelData.push(level.levelData);
  750. levelDataByteOffsets[i] = levelDataByteOffset;
  751. levelDataByteOffset += level.levelData.byteLength;
  752. }
  753. // Level index is ordered large → small.
  754. for (let i = 0; i < container.levels.length; i++) {
  755. const level = container.levels[i];
  756. levelIndex.setBigUint64(i * 24 + 0, BigInt(levelDataByteOffsets[i]), true);
  757. levelIndex.setBigUint64(i * 24 + 8, BigInt(level.levelData.byteLength), true);
  758. levelIndex.setBigUint64(i * 24 + 16, BigInt(level.uncompressedByteLength), true);
  759. }
  760. ///////////////////////////////////////////////////
  761. // Header.
  762. ///////////////////////////////////////////////////
  763. const headerBuffer = new ArrayBuffer(HEADER_BYTE_LENGTH);
  764. const headerView = new DataView(headerBuffer);
  765. headerView.setUint32(0, container.vkFormat, true);
  766. headerView.setUint32(4, container.typeSize, true);
  767. headerView.setUint32(8, container.pixelWidth, true);
  768. headerView.setUint32(12, container.pixelHeight, true);
  769. headerView.setUint32(16, container.pixelDepth, true);
  770. headerView.setUint32(20, container.layerCount, true);
  771. headerView.setUint32(24, container.faceCount, true);
  772. headerView.setUint32(28, container.levelCount, true);
  773. headerView.setUint32(32, container.supercompressionScheme, true);
  774. headerView.setUint32(36, dfdByteOffset, true);
  775. headerView.setUint32(40, dfdBuffer.byteLength, true);
  776. headerView.setUint32(44, kvdByteOffset, true);
  777. headerView.setUint32(48, kvdBuffer.byteLength, true);
  778. headerView.setBigUint64(52, BigInt(sgdBuffer.byteLength > 0 ? sgdByteOffset : 0), true);
  779. headerView.setBigUint64(60, BigInt(sgdBuffer.byteLength), true);
  780. ///////////////////////////////////////////////////
  781. // Compose.
  782. ///////////////////////////////////////////////////
  783. return new Uint8Array(concat([new Uint8Array(KTX2_ID).buffer, headerBuffer, levelIndex.buffer, dfdBuffer, kvdBuffer, sgdByteOffset > 0 ? new ArrayBuffer(sgdByteOffset - (kvdByteOffset + kvdBuffer.byteLength)) // align(8)
  784. : new ArrayBuffer(0), sgdBuffer, ...levelData]));
  785. }
  786. exports.KHR_DF_CHANNEL_RGBSDA_ALPHA = KHR_DF_CHANNEL_RGBSDA_ALPHA;
  787. exports.KHR_DF_CHANNEL_RGBSDA_BLUE = KHR_DF_CHANNEL_RGBSDA_BLUE;
  788. exports.KHR_DF_CHANNEL_RGBSDA_DEPTH = KHR_DF_CHANNEL_RGBSDA_DEPTH;
  789. exports.KHR_DF_CHANNEL_RGBSDA_GREEN = KHR_DF_CHANNEL_RGBSDA_GREEN;
  790. exports.KHR_DF_CHANNEL_RGBSDA_RED = KHR_DF_CHANNEL_RGBSDA_RED;
  791. exports.KHR_DF_CHANNEL_RGBSDA_STENCIL = KHR_DF_CHANNEL_RGBSDA_STENCIL;
  792. exports.KHR_DF_FLAG_ALPHA_PREMULTIPLIED = KHR_DF_FLAG_ALPHA_PREMULTIPLIED;
  793. exports.KHR_DF_FLAG_ALPHA_STRAIGHT = KHR_DF_FLAG_ALPHA_STRAIGHT;
  794. exports.KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT = KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT;
  795. exports.KHR_DF_MODEL_ASTC = KHR_DF_MODEL_ASTC;
  796. exports.KHR_DF_MODEL_ETC1 = KHR_DF_MODEL_ETC1;
  797. exports.KHR_DF_MODEL_ETC1S = KHR_DF_MODEL_ETC1S;
  798. exports.KHR_DF_MODEL_ETC2 = KHR_DF_MODEL_ETC2;
  799. exports.KHR_DF_MODEL_RGBSDA = KHR_DF_MODEL_RGBSDA;
  800. exports.KHR_DF_MODEL_UASTC = KHR_DF_MODEL_UASTC;
  801. exports.KHR_DF_MODEL_UNSPECIFIED = KHR_DF_MODEL_UNSPECIFIED;
  802. exports.KHR_DF_PRIMARIES_ACES = KHR_DF_PRIMARIES_ACES;
  803. exports.KHR_DF_PRIMARIES_ACESCC = KHR_DF_PRIMARIES_ACESCC;
  804. exports.KHR_DF_PRIMARIES_ADOBERGB = KHR_DF_PRIMARIES_ADOBERGB;
  805. exports.KHR_DF_PRIMARIES_BT2020 = KHR_DF_PRIMARIES_BT2020;
  806. exports.KHR_DF_PRIMARIES_BT601_EBU = KHR_DF_PRIMARIES_BT601_EBU;
  807. exports.KHR_DF_PRIMARIES_BT601_SMPTE = KHR_DF_PRIMARIES_BT601_SMPTE;
  808. exports.KHR_DF_PRIMARIES_BT709 = KHR_DF_PRIMARIES_BT709;
  809. exports.KHR_DF_PRIMARIES_CIEXYZ = KHR_DF_PRIMARIES_CIEXYZ;
  810. exports.KHR_DF_PRIMARIES_DISPLAYP3 = KHR_DF_PRIMARIES_DISPLAYP3;
  811. exports.KHR_DF_PRIMARIES_NTSC1953 = KHR_DF_PRIMARIES_NTSC1953;
  812. exports.KHR_DF_PRIMARIES_PAL525 = KHR_DF_PRIMARIES_PAL525;
  813. exports.KHR_DF_PRIMARIES_UNSPECIFIED = KHR_DF_PRIMARIES_UNSPECIFIED;
  814. exports.KHR_DF_SAMPLE_DATATYPE_EXPONENT = KHR_DF_SAMPLE_DATATYPE_EXPONENT;
  815. exports.KHR_DF_SAMPLE_DATATYPE_FLOAT = KHR_DF_SAMPLE_DATATYPE_FLOAT;
  816. exports.KHR_DF_SAMPLE_DATATYPE_LINEAR = KHR_DF_SAMPLE_DATATYPE_LINEAR;
  817. exports.KHR_DF_SAMPLE_DATATYPE_SIGNED = KHR_DF_SAMPLE_DATATYPE_SIGNED;
  818. exports.KHR_DF_TRANSFER_ACESCC = KHR_DF_TRANSFER_ACESCC;
  819. exports.KHR_DF_TRANSFER_ACESCCT = KHR_DF_TRANSFER_ACESCCT;
  820. exports.KHR_DF_TRANSFER_ADOBERGB = KHR_DF_TRANSFER_ADOBERGB;
  821. exports.KHR_DF_TRANSFER_BT1886 = KHR_DF_TRANSFER_BT1886;
  822. exports.KHR_DF_TRANSFER_DCIP3 = KHR_DF_TRANSFER_DCIP3;
  823. exports.KHR_DF_TRANSFER_HLG_EOTF = KHR_DF_TRANSFER_HLG_EOTF;
  824. exports.KHR_DF_TRANSFER_HLG_OETF = KHR_DF_TRANSFER_HLG_OETF;
  825. exports.KHR_DF_TRANSFER_ITU = KHR_DF_TRANSFER_ITU;
  826. exports.KHR_DF_TRANSFER_LINEAR = KHR_DF_TRANSFER_LINEAR;
  827. exports.KHR_DF_TRANSFER_NTSC = KHR_DF_TRANSFER_NTSC;
  828. exports.KHR_DF_TRANSFER_PAL625_EOTF = KHR_DF_TRANSFER_PAL625_EOTF;
  829. exports.KHR_DF_TRANSFER_PAL_OETF = KHR_DF_TRANSFER_PAL_OETF;
  830. exports.KHR_DF_TRANSFER_PQ_EOTF = KHR_DF_TRANSFER_PQ_EOTF;
  831. exports.KHR_DF_TRANSFER_PQ_OETF = KHR_DF_TRANSFER_PQ_OETF;
  832. exports.KHR_DF_TRANSFER_SLOG = KHR_DF_TRANSFER_SLOG;
  833. exports.KHR_DF_TRANSFER_SLOG2 = KHR_DF_TRANSFER_SLOG2;
  834. exports.KHR_DF_TRANSFER_SRGB = KHR_DF_TRANSFER_SRGB;
  835. exports.KHR_DF_TRANSFER_ST240 = KHR_DF_TRANSFER_ST240;
  836. exports.KHR_DF_TRANSFER_UNSPECIFIED = KHR_DF_TRANSFER_UNSPECIFIED;
  837. exports.KHR_DF_VENDORID_KHRONOS = KHR_DF_VENDORID_KHRONOS;
  838. exports.KHR_DF_VERSION = KHR_DF_VERSION;
  839. exports.KHR_SUPERCOMPRESSION_BASISLZ = KHR_SUPERCOMPRESSION_BASISLZ;
  840. exports.KHR_SUPERCOMPRESSION_NONE = KHR_SUPERCOMPRESSION_NONE;
  841. exports.KHR_SUPERCOMPRESSION_ZLIB = KHR_SUPERCOMPRESSION_ZLIB;
  842. exports.KHR_SUPERCOMPRESSION_ZSTD = KHR_SUPERCOMPRESSION_ZSTD;
  843. exports.VK_FORMAT_A1R5G5B5_UNORM_PACK16 = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
  844. exports.VK_FORMAT_A2B10G10R10_SINT_PACK32 = VK_FORMAT_A2B10G10R10_SINT_PACK32;
  845. exports.VK_FORMAT_A2B10G10R10_SNORM_PACK32 = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
  846. exports.VK_FORMAT_A2B10G10R10_UINT_PACK32 = VK_FORMAT_A2B10G10R10_UINT_PACK32;
  847. exports.VK_FORMAT_A2B10G10R10_UNORM_PACK32 = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
  848. exports.VK_FORMAT_A2R10G10B10_SINT_PACK32 = VK_FORMAT_A2R10G10B10_SINT_PACK32;
  849. exports.VK_FORMAT_A2R10G10B10_SNORM_PACK32 = VK_FORMAT_A2R10G10B10_SNORM_PACK32;
  850. exports.VK_FORMAT_A2R10G10B10_UINT_PACK32 = VK_FORMAT_A2R10G10B10_UINT_PACK32;
  851. exports.VK_FORMAT_A2R10G10B10_UNORM_PACK32 = VK_FORMAT_A2R10G10B10_UNORM_PACK32;
  852. exports.VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT;
  853. exports.VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT;
  854. exports.VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT;
  855. exports.VK_FORMAT_ASTC_10x10_SRGB_BLOCK = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
  856. exports.VK_FORMAT_ASTC_10x10_UNORM_BLOCK = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
  857. exports.VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT;
  858. exports.VK_FORMAT_ASTC_10x5_SRGB_BLOCK = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
  859. exports.VK_FORMAT_ASTC_10x5_UNORM_BLOCK = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
  860. exports.VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT;
  861. exports.VK_FORMAT_ASTC_10x6_SRGB_BLOCK = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
  862. exports.VK_FORMAT_ASTC_10x6_UNORM_BLOCK = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
  863. exports.VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT;
  864. exports.VK_FORMAT_ASTC_10x8_SRGB_BLOCK = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
  865. exports.VK_FORMAT_ASTC_10x8_UNORM_BLOCK = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
  866. exports.VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT;
  867. exports.VK_FORMAT_ASTC_12x10_SRGB_BLOCK = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
  868. exports.VK_FORMAT_ASTC_12x10_UNORM_BLOCK = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
  869. exports.VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT;
  870. exports.VK_FORMAT_ASTC_12x12_SRGB_BLOCK = VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
  871. exports.VK_FORMAT_ASTC_12x12_UNORM_BLOCK = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
  872. exports.VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT;
  873. exports.VK_FORMAT_ASTC_4x4_SRGB_BLOCK = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
  874. exports.VK_FORMAT_ASTC_4x4_UNORM_BLOCK = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
  875. exports.VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT;
  876. exports.VK_FORMAT_ASTC_5x4_SRGB_BLOCK = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
  877. exports.VK_FORMAT_ASTC_5x4_UNORM_BLOCK = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
  878. exports.VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT;
  879. exports.VK_FORMAT_ASTC_5x5_SRGB_BLOCK = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
  880. exports.VK_FORMAT_ASTC_5x5_UNORM_BLOCK = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
  881. exports.VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT;
  882. exports.VK_FORMAT_ASTC_6x5_SRGB_BLOCK = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
  883. exports.VK_FORMAT_ASTC_6x5_UNORM_BLOCK = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
  884. exports.VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT;
  885. exports.VK_FORMAT_ASTC_6x6_SRGB_BLOCK = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
  886. exports.VK_FORMAT_ASTC_6x6_UNORM_BLOCK = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
  887. exports.VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT;
  888. exports.VK_FORMAT_ASTC_8x5_SRGB_BLOCK = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
  889. exports.VK_FORMAT_ASTC_8x5_UNORM_BLOCK = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
  890. exports.VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT;
  891. exports.VK_FORMAT_ASTC_8x6_SRGB_BLOCK = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
  892. exports.VK_FORMAT_ASTC_8x6_UNORM_BLOCK = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
  893. exports.VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT;
  894. exports.VK_FORMAT_ASTC_8x8_SRGB_BLOCK = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
  895. exports.VK_FORMAT_ASTC_8x8_UNORM_BLOCK = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
  896. exports.VK_FORMAT_B10G11R11_UFLOAT_PACK32 = VK_FORMAT_B10G11R11_UFLOAT_PACK32;
  897. exports.VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16;
  898. exports.VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16;
  899. exports.VK_FORMAT_B4G4R4A4_UNORM_PACK16 = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
  900. exports.VK_FORMAT_B5G5R5A1_UNORM_PACK16 = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
  901. exports.VK_FORMAT_B5G6R5_UNORM_PACK16 = VK_FORMAT_B5G6R5_UNORM_PACK16;
  902. exports.VK_FORMAT_B8G8R8A8_SINT = VK_FORMAT_B8G8R8A8_SINT;
  903. exports.VK_FORMAT_B8G8R8A8_SNORM = VK_FORMAT_B8G8R8A8_SNORM;
  904. exports.VK_FORMAT_B8G8R8A8_SRGB = VK_FORMAT_B8G8R8A8_SRGB;
  905. exports.VK_FORMAT_B8G8R8A8_UINT = VK_FORMAT_B8G8R8A8_UINT;
  906. exports.VK_FORMAT_B8G8R8A8_UNORM = VK_FORMAT_B8G8R8A8_UNORM;
  907. exports.VK_FORMAT_B8G8R8_SINT = VK_FORMAT_B8G8R8_SINT;
  908. exports.VK_FORMAT_B8G8R8_SNORM = VK_FORMAT_B8G8R8_SNORM;
  909. exports.VK_FORMAT_B8G8R8_SRGB = VK_FORMAT_B8G8R8_SRGB;
  910. exports.VK_FORMAT_B8G8R8_UINT = VK_FORMAT_B8G8R8_UINT;
  911. exports.VK_FORMAT_B8G8R8_UNORM = VK_FORMAT_B8G8R8_UNORM;
  912. exports.VK_FORMAT_BC1_RGBA_SRGB_BLOCK = VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
  913. exports.VK_FORMAT_BC1_RGBA_UNORM_BLOCK = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
  914. exports.VK_FORMAT_BC1_RGB_SRGB_BLOCK = VK_FORMAT_BC1_RGB_SRGB_BLOCK;
  915. exports.VK_FORMAT_BC1_RGB_UNORM_BLOCK = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
  916. exports.VK_FORMAT_BC2_SRGB_BLOCK = VK_FORMAT_BC2_SRGB_BLOCK;
  917. exports.VK_FORMAT_BC2_UNORM_BLOCK = VK_FORMAT_BC2_UNORM_BLOCK;
  918. exports.VK_FORMAT_BC3_SRGB_BLOCK = VK_FORMAT_BC3_SRGB_BLOCK;
  919. exports.VK_FORMAT_BC3_UNORM_BLOCK = VK_FORMAT_BC3_UNORM_BLOCK;
  920. exports.VK_FORMAT_BC4_SNORM_BLOCK = VK_FORMAT_BC4_SNORM_BLOCK;
  921. exports.VK_FORMAT_BC4_UNORM_BLOCK = VK_FORMAT_BC4_UNORM_BLOCK;
  922. exports.VK_FORMAT_BC5_SNORM_BLOCK = VK_FORMAT_BC5_SNORM_BLOCK;
  923. exports.VK_FORMAT_BC5_UNORM_BLOCK = VK_FORMAT_BC5_UNORM_BLOCK;
  924. exports.VK_FORMAT_BC6H_SFLOAT_BLOCK = VK_FORMAT_BC6H_SFLOAT_BLOCK;
  925. exports.VK_FORMAT_BC6H_UFLOAT_BLOCK = VK_FORMAT_BC6H_UFLOAT_BLOCK;
  926. exports.VK_FORMAT_BC7_SRGB_BLOCK = VK_FORMAT_BC7_SRGB_BLOCK;
  927. exports.VK_FORMAT_BC7_UNORM_BLOCK = VK_FORMAT_BC7_UNORM_BLOCK;
  928. exports.VK_FORMAT_D16_UNORM = VK_FORMAT_D16_UNORM;
  929. exports.VK_FORMAT_D16_UNORM_S8_UINT = VK_FORMAT_D16_UNORM_S8_UINT;
  930. exports.VK_FORMAT_D24_UNORM_S8_UINT = VK_FORMAT_D24_UNORM_S8_UINT;
  931. exports.VK_FORMAT_D32_SFLOAT = VK_FORMAT_D32_SFLOAT;
  932. exports.VK_FORMAT_D32_SFLOAT_S8_UINT = VK_FORMAT_D32_SFLOAT_S8_UINT;
  933. exports.VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
  934. exports.VK_FORMAT_EAC_R11G11_SNORM_BLOCK = VK_FORMAT_EAC_R11G11_SNORM_BLOCK;
  935. exports.VK_FORMAT_EAC_R11G11_UNORM_BLOCK = VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
  936. exports.VK_FORMAT_EAC_R11_SNORM_BLOCK = VK_FORMAT_EAC_R11_SNORM_BLOCK;
  937. exports.VK_FORMAT_EAC_R11_UNORM_BLOCK = VK_FORMAT_EAC_R11_UNORM_BLOCK;
  938. exports.VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;
  939. exports.VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
  940. exports.VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;
  941. exports.VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
  942. exports.VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;
  943. exports.VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
  944. exports.VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16;
  945. exports.VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16;
  946. exports.VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG;
  947. exports.VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG;
  948. exports.VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG;
  949. exports.VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG;
  950. exports.VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG;
  951. exports.VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG;
  952. exports.VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG;
  953. exports.VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG;
  954. exports.VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16;
  955. exports.VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = VK_FORMAT_R10X6G10X6_UNORM_2PACK16;
  956. exports.VK_FORMAT_R10X6_UNORM_PACK16 = VK_FORMAT_R10X6_UNORM_PACK16;
  957. exports.VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16;
  958. exports.VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = VK_FORMAT_R12X4G12X4_UNORM_2PACK16;
  959. exports.VK_FORMAT_R12X4_UNORM_PACK16 = VK_FORMAT_R12X4_UNORM_PACK16;
  960. exports.VK_FORMAT_R16G16B16A16_SFLOAT = VK_FORMAT_R16G16B16A16_SFLOAT;
  961. exports.VK_FORMAT_R16G16B16A16_SINT = VK_FORMAT_R16G16B16A16_SINT;
  962. exports.VK_FORMAT_R16G16B16A16_SNORM = VK_FORMAT_R16G16B16A16_SNORM;
  963. exports.VK_FORMAT_R16G16B16A16_UINT = VK_FORMAT_R16G16B16A16_UINT;
  964. exports.VK_FORMAT_R16G16B16A16_UNORM = VK_FORMAT_R16G16B16A16_UNORM;
  965. exports.VK_FORMAT_R16G16B16_SFLOAT = VK_FORMAT_R16G16B16_SFLOAT;
  966. exports.VK_FORMAT_R16G16B16_SINT = VK_FORMAT_R16G16B16_SINT;
  967. exports.VK_FORMAT_R16G16B16_SNORM = VK_FORMAT_R16G16B16_SNORM;
  968. exports.VK_FORMAT_R16G16B16_UINT = VK_FORMAT_R16G16B16_UINT;
  969. exports.VK_FORMAT_R16G16B16_UNORM = VK_FORMAT_R16G16B16_UNORM;
  970. exports.VK_FORMAT_R16G16_SFLOAT = VK_FORMAT_R16G16_SFLOAT;
  971. exports.VK_FORMAT_R16G16_SINT = VK_FORMAT_R16G16_SINT;
  972. exports.VK_FORMAT_R16G16_SNORM = VK_FORMAT_R16G16_SNORM;
  973. exports.VK_FORMAT_R16G16_UINT = VK_FORMAT_R16G16_UINT;
  974. exports.VK_FORMAT_R16G16_UNORM = VK_FORMAT_R16G16_UNORM;
  975. exports.VK_FORMAT_R16_SFLOAT = VK_FORMAT_R16_SFLOAT;
  976. exports.VK_FORMAT_R16_SINT = VK_FORMAT_R16_SINT;
  977. exports.VK_FORMAT_R16_SNORM = VK_FORMAT_R16_SNORM;
  978. exports.VK_FORMAT_R16_UINT = VK_FORMAT_R16_UINT;
  979. exports.VK_FORMAT_R16_UNORM = VK_FORMAT_R16_UNORM;
  980. exports.VK_FORMAT_R32G32B32A32_SFLOAT = VK_FORMAT_R32G32B32A32_SFLOAT;
  981. exports.VK_FORMAT_R32G32B32A32_SINT = VK_FORMAT_R32G32B32A32_SINT;
  982. exports.VK_FORMAT_R32G32B32A32_UINT = VK_FORMAT_R32G32B32A32_UINT;
  983. exports.VK_FORMAT_R32G32B32_SFLOAT = VK_FORMAT_R32G32B32_SFLOAT;
  984. exports.VK_FORMAT_R32G32B32_SINT = VK_FORMAT_R32G32B32_SINT;
  985. exports.VK_FORMAT_R32G32B32_UINT = VK_FORMAT_R32G32B32_UINT;
  986. exports.VK_FORMAT_R32G32_SFLOAT = VK_FORMAT_R32G32_SFLOAT;
  987. exports.VK_FORMAT_R32G32_SINT = VK_FORMAT_R32G32_SINT;
  988. exports.VK_FORMAT_R32G32_UINT = VK_FORMAT_R32G32_UINT;
  989. exports.VK_FORMAT_R32_SFLOAT = VK_FORMAT_R32_SFLOAT;
  990. exports.VK_FORMAT_R32_SINT = VK_FORMAT_R32_SINT;
  991. exports.VK_FORMAT_R32_UINT = VK_FORMAT_R32_UINT;
  992. exports.VK_FORMAT_R4G4B4A4_UNORM_PACK16 = VK_FORMAT_R4G4B4A4_UNORM_PACK16;
  993. exports.VK_FORMAT_R4G4_UNORM_PACK8 = VK_FORMAT_R4G4_UNORM_PACK8;
  994. exports.VK_FORMAT_R5G5B5A1_UNORM_PACK16 = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
  995. exports.VK_FORMAT_R5G6B5_UNORM_PACK16 = VK_FORMAT_R5G6B5_UNORM_PACK16;
  996. exports.VK_FORMAT_R64G64B64A64_SFLOAT = VK_FORMAT_R64G64B64A64_SFLOAT;
  997. exports.VK_FORMAT_R64G64B64A64_SINT = VK_FORMAT_R64G64B64A64_SINT;
  998. exports.VK_FORMAT_R64G64B64A64_UINT = VK_FORMAT_R64G64B64A64_UINT;
  999. exports.VK_FORMAT_R64G64B64_SFLOAT = VK_FORMAT_R64G64B64_SFLOAT;
  1000. exports.VK_FORMAT_R64G64B64_SINT = VK_FORMAT_R64G64B64_SINT;
  1001. exports.VK_FORMAT_R64G64B64_UINT = VK_FORMAT_R64G64B64_UINT;
  1002. exports.VK_FORMAT_R64G64_SFLOAT = VK_FORMAT_R64G64_SFLOAT;
  1003. exports.VK_FORMAT_R64G64_SINT = VK_FORMAT_R64G64_SINT;
  1004. exports.VK_FORMAT_R64G64_UINT = VK_FORMAT_R64G64_UINT;
  1005. exports.VK_FORMAT_R64_SFLOAT = VK_FORMAT_R64_SFLOAT;
  1006. exports.VK_FORMAT_R64_SINT = VK_FORMAT_R64_SINT;
  1007. exports.VK_FORMAT_R64_UINT = VK_FORMAT_R64_UINT;
  1008. exports.VK_FORMAT_R8G8B8A8_SINT = VK_FORMAT_R8G8B8A8_SINT;
  1009. exports.VK_FORMAT_R8G8B8A8_SNORM = VK_FORMAT_R8G8B8A8_SNORM;
  1010. exports.VK_FORMAT_R8G8B8A8_SRGB = VK_FORMAT_R8G8B8A8_SRGB;
  1011. exports.VK_FORMAT_R8G8B8A8_UINT = VK_FORMAT_R8G8B8A8_UINT;
  1012. exports.VK_FORMAT_R8G8B8A8_UNORM = VK_FORMAT_R8G8B8A8_UNORM;
  1013. exports.VK_FORMAT_R8G8B8_SINT = VK_FORMAT_R8G8B8_SINT;
  1014. exports.VK_FORMAT_R8G8B8_SNORM = VK_FORMAT_R8G8B8_SNORM;
  1015. exports.VK_FORMAT_R8G8B8_SRGB = VK_FORMAT_R8G8B8_SRGB;
  1016. exports.VK_FORMAT_R8G8B8_UINT = VK_FORMAT_R8G8B8_UINT;
  1017. exports.VK_FORMAT_R8G8B8_UNORM = VK_FORMAT_R8G8B8_UNORM;
  1018. exports.VK_FORMAT_R8G8_SINT = VK_FORMAT_R8G8_SINT;
  1019. exports.VK_FORMAT_R8G8_SNORM = VK_FORMAT_R8G8_SNORM;
  1020. exports.VK_FORMAT_R8G8_SRGB = VK_FORMAT_R8G8_SRGB;
  1021. exports.VK_FORMAT_R8G8_UINT = VK_FORMAT_R8G8_UINT;
  1022. exports.VK_FORMAT_R8G8_UNORM = VK_FORMAT_R8G8_UNORM;
  1023. exports.VK_FORMAT_R8_SINT = VK_FORMAT_R8_SINT;
  1024. exports.VK_FORMAT_R8_SNORM = VK_FORMAT_R8_SNORM;
  1025. exports.VK_FORMAT_R8_SRGB = VK_FORMAT_R8_SRGB;
  1026. exports.VK_FORMAT_R8_UINT = VK_FORMAT_R8_UINT;
  1027. exports.VK_FORMAT_R8_UNORM = VK_FORMAT_R8_UNORM;
  1028. exports.VK_FORMAT_S8_UINT = VK_FORMAT_S8_UINT;
  1029. exports.VK_FORMAT_UNDEFINED = VK_FORMAT_UNDEFINED;
  1030. exports.VK_FORMAT_X8_D24_UNORM_PACK32 = VK_FORMAT_X8_D24_UNORM_PACK32;
  1031. exports.createDefaultContainer = createDefaultContainer;
  1032. exports.read = read;
  1033. exports.write = write;
  1034. //# sourceMappingURL=ktx-parse.cjs.map