compressed-textures.js 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545
  1. /*!
  2. * @pixi/compressed-textures - v6.5.10
  3. * Compiled Thu, 06 Jul 2023 15:25:11 UTC
  4. *
  5. * @pixi/compressed-textures is licensed under the MIT License.
  6. * http://www.opensource.org/licenses/mit-license
  7. */
  8. this.PIXI = this.PIXI || {};
  9. var _pixi_compressed_textures = (function (exports, core, loaders, utils, settings, constants) {
  10. 'use strict';
  11. var _a$2;
  12. /**
  13. * WebGL internal formats, including compressed texture formats provided by extensions
  14. * @memberof PIXI
  15. * @static
  16. * @name INTERNAL_FORMATS
  17. * @enum {number}
  18. * @property {number} [COMPRESSED_RGB_S3TC_DXT1_EXT=0x83F0] -
  19. * @property {number} [COMPRESSED_RGBA_S3TC_DXT1_EXT=0x83F1] -
  20. * @property {number} [COMPRESSED_RGBA_S3TC_DXT3_EXT=0x83F2] -
  21. * @property {number} [COMPRESSED_RGBA_S3TC_DXT5_EXT=0x83F3] -
  22. * @property {number} [COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT=35917] -
  23. * @property {number} [COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT=35918] -
  24. * @property {number} [COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT=35919] -
  25. * @property {number} [COMPRESSED_SRGB_S3TC_DXT1_EXT=35916] -
  26. * @property {number} [COMPRESSED_R11_EAC=0x9270] -
  27. * @property {number} [COMPRESSED_SIGNED_R11_EAC=0x9271] -
  28. * @property {number} [COMPRESSED_RG11_EAC=0x9272] -
  29. * @property {number} [COMPRESSED_SIGNED_RG11_EAC=0x9273] -
  30. * @property {number} [COMPRESSED_RGB8_ETC2=0x9274] -
  31. * @property {number} [COMPRESSED_RGBA8_ETC2_EAC=0x9278] -
  32. * @property {number} [COMPRESSED_SRGB8_ETC2=0x9275] -
  33. * @property {number} [COMPRESSED_SRGB8_ALPHA8_ETC2_EAC=0x9279] -
  34. * @property {number} [COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2=0x9276] -
  35. * @property {number} [COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2=0x9277] -
  36. * @property {number} [COMPRESSED_RGB_PVRTC_4BPPV1_IMG=0x8C00] -
  37. * @property {number} [COMPRESSED_RGBA_PVRTC_4BPPV1_IMG=0x8C02] -
  38. * @property {number} [COMPRESSED_RGB_PVRTC_2BPPV1_IMG=0x8C01] -
  39. * @property {number} [COMPRESSED_RGBA_PVRTC_2BPPV1_IMG=0x8C03] -
  40. * @property {number} [COMPRESSED_RGB_ETC1_WEBGL=0x8D64] -
  41. * @property {number} [COMPRESSED_RGB_ATC_WEBGL=0x8C92] -
  42. * @property {number} [COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL=0x8C92] -
  43. * @property {number} [COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL=0x87EE] -
  44. * @property {number} [COMPRESSED_RGBA_ASTC_4x4_KHR=0x93B0] -
  45. */
  46. exports.INTERNAL_FORMATS = void 0;
  47. (function (INTERNAL_FORMATS) {
  48. // WEBGL_compressed_texture_s3tc
  49. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGB_S3TC_DXT1_EXT"] = 33776] = "COMPRESSED_RGB_S3TC_DXT1_EXT";
  50. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_S3TC_DXT1_EXT"] = 33777] = "COMPRESSED_RGBA_S3TC_DXT1_EXT";
  51. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_S3TC_DXT3_EXT"] = 33778] = "COMPRESSED_RGBA_S3TC_DXT3_EXT";
  52. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_S3TC_DXT5_EXT"] = 33779] = "COMPRESSED_RGBA_S3TC_DXT5_EXT";
  53. // WEBGL_compressed_texture_s3tc_srgb
  54. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"] = 35917] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT";
  55. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"] = 35918] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT";
  56. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"] = 35919] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT";
  57. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SRGB_S3TC_DXT1_EXT"] = 35916] = "COMPRESSED_SRGB_S3TC_DXT1_EXT";
  58. // WEBGL_compressed_texture_etc
  59. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_R11_EAC"] = 37488] = "COMPRESSED_R11_EAC";
  60. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SIGNED_R11_EAC"] = 37489] = "COMPRESSED_SIGNED_R11_EAC";
  61. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RG11_EAC"] = 37490] = "COMPRESSED_RG11_EAC";
  62. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SIGNED_RG11_EAC"] = 37491] = "COMPRESSED_SIGNED_RG11_EAC";
  63. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGB8_ETC2"] = 37492] = "COMPRESSED_RGB8_ETC2";
  64. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA8_ETC2_EAC"] = 37496] = "COMPRESSED_RGBA8_ETC2_EAC";
  65. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SRGB8_ETC2"] = 37493] = "COMPRESSED_SRGB8_ETC2";
  66. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"] = 37497] = "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC";
  67. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"] = 37494] = "COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2";
  68. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"] = 37495] = "COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2";
  69. // WEBGL_compressed_texture_pvrtc
  70. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGB_PVRTC_4BPPV1_IMG"] = 35840] = "COMPRESSED_RGB_PVRTC_4BPPV1_IMG";
  71. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"] = 35842] = "COMPRESSED_RGBA_PVRTC_4BPPV1_IMG";
  72. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGB_PVRTC_2BPPV1_IMG"] = 35841] = "COMPRESSED_RGB_PVRTC_2BPPV1_IMG";
  73. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"] = 35843] = "COMPRESSED_RGBA_PVRTC_2BPPV1_IMG";
  74. // WEBGL_compressed_texture_etc1
  75. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGB_ETC1_WEBGL"] = 36196] = "COMPRESSED_RGB_ETC1_WEBGL";
  76. // WEBGL_compressed_texture_atc
  77. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGB_ATC_WEBGL"] = 35986] = "COMPRESSED_RGB_ATC_WEBGL";
  78. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL"] = 35986] = "COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL";
  79. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL"] = 34798] = "COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL";
  80. // WEBGL_compressed_texture_astc
  81. /* eslint-disable-next-line camelcase */
  82. INTERNAL_FORMATS[INTERNAL_FORMATS["COMPRESSED_RGBA_ASTC_4x4_KHR"] = 37808] = "COMPRESSED_RGBA_ASTC_4x4_KHR";
  83. })(exports.INTERNAL_FORMATS || (exports.INTERNAL_FORMATS = {}));
  84. /**
  85. * Maps the compressed texture formats in {@link PIXI.INTERNAL_FORMATS} to the number of bytes taken by
  86. * each texel.
  87. * @memberof PIXI
  88. * @static
  89. * @ignore
  90. */
  91. var INTERNAL_FORMAT_TO_BYTES_PER_PIXEL = (_a$2 = {},
  92. // WEBGL_compressed_texture_s3tc
  93. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGB_S3TC_DXT1_EXT] = 0.5,
  94. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT] = 0.5,
  95. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT] = 1,
  96. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT] = 1,
  97. // WEBGL_compressed_texture_s3tc
  98. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SRGB_S3TC_DXT1_EXT] = 0.5,
  99. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT] = 0.5,
  100. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT] = 1,
  101. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT] = 1,
  102. // WEBGL_compressed_texture_etc
  103. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_R11_EAC] = 0.5,
  104. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SIGNED_R11_EAC] = 0.5,
  105. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RG11_EAC] = 1,
  106. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SIGNED_RG11_EAC] = 1,
  107. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGB8_ETC2] = 0.5,
  108. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA8_ETC2_EAC] = 1,
  109. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SRGB8_ETC2] = 0.5,
  110. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC] = 1,
  111. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2] = 0.5,
  112. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2] = 0.5,
  113. // WEBGL_compressed_texture_pvrtc
  114. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGB_PVRTC_4BPPV1_IMG] = 0.5,
  115. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG] = 0.5,
  116. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGB_PVRTC_2BPPV1_IMG] = 0.25,
  117. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG] = 0.25,
  118. // WEBGL_compressed_texture_etc1
  119. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGB_ETC1_WEBGL] = 0.5,
  120. // @see https://www.khronos.org/registry/OpenGL/extensions/AMD/AMD_compressed_ATC_texture.txt
  121. // WEBGL_compressed_texture_atc
  122. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGB_ATC_WEBGL] = 0.5,
  123. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL] = 1,
  124. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL] = 1,
  125. // @see https://registry.khronos.org/OpenGL/extensions/KHR/KHR_texture_compression_astc_hdr.txt
  126. // WEBGL_compressed_texture_astc
  127. /* eslint-disable-next-line camelcase */
  128. _a$2[exports.INTERNAL_FORMATS.COMPRESSED_RGBA_ASTC_4x4_KHR] = 1,
  129. _a$2);
  130. /*! *****************************************************************************
  131. Copyright (c) Microsoft Corporation.
  132. Permission to use, copy, modify, and/or distribute this software for any
  133. purpose with or without fee is hereby granted.
  134. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  135. REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  136. AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  137. INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  138. LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  139. OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  140. PERFORMANCE OF THIS SOFTWARE.
  141. ***************************************************************************** */
  142. /* global Reflect, Promise */
  143. var extendStatics = function(d, b) {
  144. extendStatics = Object.setPrototypeOf ||
  145. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  146. function (d, b) { for (var p in b) { if (b.hasOwnProperty(p)) { d[p] = b[p]; } } };
  147. return extendStatics(d, b);
  148. };
  149. function __extends(d, b) {
  150. extendStatics(d, b);
  151. function __() { this.constructor = d; }
  152. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  153. }
  154. var __assign = function() {
  155. __assign = Object.assign || function __assign(t) {
  156. var arguments$1 = arguments;
  157. for (var s, i = 1, n = arguments.length; i < n; i++) {
  158. s = arguments$1[i];
  159. for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p)) { t[p] = s[p]; } }
  160. }
  161. return t;
  162. };
  163. return __assign.apply(this, arguments);
  164. };
  165. function __rest(s, e) {
  166. var t = {};
  167. for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
  168. { t[p] = s[p]; } }
  169. if (s != null && typeof Object.getOwnPropertySymbols === "function")
  170. { for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  171. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
  172. { t[p[i]] = s[p[i]]; }
  173. } }
  174. return t;
  175. }
  176. function __decorate(decorators, target, key, desc) {
  177. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  178. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") { r = Reflect.decorate(decorators, target, key, desc); }
  179. else { for (var i = decorators.length - 1; i >= 0; i--) { if (d = decorators[i]) { r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; } } }
  180. return c > 3 && r && Object.defineProperty(target, key, r), r;
  181. }
  182. function __param(paramIndex, decorator) {
  183. return function (target, key) { decorator(target, key, paramIndex); }
  184. }
  185. function __metadata(metadataKey, metadataValue) {
  186. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") { return Reflect.metadata(metadataKey, metadataValue); }
  187. }
  188. function __awaiter(thisArg, _arguments, P, generator) {
  189. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  190. return new (P || (P = Promise))(function (resolve, reject) {
  191. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  192. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  193. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  194. step((generator = generator.apply(thisArg, _arguments || [])).next());
  195. });
  196. }
  197. function __generator(thisArg, body) {
  198. var _ = { label: 0, sent: function() { if (t[0] & 1) { throw t[1]; } return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  199. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  200. function verb(n) { return function (v) { return step([n, v]); }; }
  201. function step(op) {
  202. if (f) { throw new TypeError("Generator is already executing."); }
  203. while (_) { try {
  204. if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) { return t; }
  205. if (y = 0, t) { op = [op[0] & 2, t.value]; }
  206. switch (op[0]) {
  207. case 0: case 1: t = op; break;
  208. case 4: _.label++; return { value: op[1], done: false };
  209. case 5: _.label++; y = op[1]; op = [0]; continue;
  210. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  211. default:
  212. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  213. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  214. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  215. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  216. if (t[2]) { _.ops.pop(); }
  217. _.trys.pop(); continue;
  218. }
  219. op = body.call(thisArg, _);
  220. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } }
  221. if (op[0] & 5) { throw op[1]; } return { value: op[0] ? op[1] : void 0, done: true };
  222. }
  223. }
  224. function __createBinding(o, m, k, k2) {
  225. if (k2 === undefined) { k2 = k; }
  226. o[k2] = m[k];
  227. }
  228. function __exportStar(m, exports) {
  229. for (var p in m) { if (p !== "default" && !exports.hasOwnProperty(p)) { exports[p] = m[p]; } }
  230. }
  231. function __values(o) {
  232. var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  233. if (m) { return m.call(o); }
  234. if (o && typeof o.length === "number") { return {
  235. next: function () {
  236. if (o && i >= o.length) { o = void 0; }
  237. return { value: o && o[i++], done: !o };
  238. }
  239. }; }
  240. throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
  241. }
  242. function __read(o, n) {
  243. var m = typeof Symbol === "function" && o[Symbol.iterator];
  244. if (!m) { return o; }
  245. var i = m.call(o), r, ar = [], e;
  246. try {
  247. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) { ar.push(r.value); }
  248. }
  249. catch (error) { e = { error: error }; }
  250. finally {
  251. try {
  252. if (r && !r.done && (m = i["return"])) { m.call(i); }
  253. }
  254. finally { if (e) { throw e.error; } }
  255. }
  256. return ar;
  257. }
  258. function __spread() {
  259. var arguments$1 = arguments;
  260. for (var ar = [], i = 0; i < arguments.length; i++)
  261. { ar = ar.concat(__read(arguments$1[i])); }
  262. return ar;
  263. }
  264. function __spreadArrays() {
  265. var arguments$1 = arguments;
  266. for (var s = 0, i = 0, il = arguments.length; i < il; i++) { s += arguments$1[i].length; }
  267. for (var r = Array(s), k = 0, i = 0; i < il; i++)
  268. { for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
  269. { r[k] = a[j]; } }
  270. return r;
  271. };
  272. function __await(v) {
  273. return this instanceof __await ? (this.v = v, this) : new __await(v);
  274. }
  275. function __asyncGenerator(thisArg, _arguments, generator) {
  276. if (!Symbol.asyncIterator) { throw new TypeError("Symbol.asyncIterator is not defined."); }
  277. var g = generator.apply(thisArg, _arguments || []), i, q = [];
  278. return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
  279. function verb(n) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } }
  280. function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
  281. function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
  282. function fulfill(value) { resume("next", value); }
  283. function reject(value) { resume("throw", value); }
  284. function settle(f, v) { if (f(v), q.shift(), q.length) { resume(q[0][0], q[0][1]); } }
  285. }
  286. function __asyncDelegator(o) {
  287. var i, p;
  288. return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
  289. function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
  290. }
  291. function __asyncValues(o) {
  292. if (!Symbol.asyncIterator) { throw new TypeError("Symbol.asyncIterator is not defined."); }
  293. var m = o[Symbol.asyncIterator], i;
  294. return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
  295. function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
  296. function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
  297. }
  298. function __makeTemplateObject(cooked, raw) {
  299. if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
  300. return cooked;
  301. };
  302. function __importStar(mod) {
  303. if (mod && mod.__esModule) { return mod; }
  304. var result = {};
  305. if (mod != null) { for (var k in mod) { if (Object.hasOwnProperty.call(mod, k)) { result[k] = mod[k]; } } }
  306. result.default = mod;
  307. return result;
  308. }
  309. function __importDefault(mod) {
  310. return (mod && mod.__esModule) ? mod : { default: mod };
  311. }
  312. function __classPrivateFieldGet(receiver, privateMap) {
  313. if (!privateMap.has(receiver)) {
  314. throw new TypeError("attempted to get private field on non-instance");
  315. }
  316. return privateMap.get(receiver);
  317. }
  318. function __classPrivateFieldSet(receiver, privateMap, value) {
  319. if (!privateMap.has(receiver)) {
  320. throw new TypeError("attempted to set private field on non-instance");
  321. }
  322. privateMap.set(receiver, value);
  323. return value;
  324. }
  325. /**
  326. * Resource that fetches texture data over the network and stores it in a buffer.
  327. * @class
  328. * @extends PIXI.Resource
  329. * @memberof PIXI
  330. */
  331. var BlobResource = /** @class */ (function (_super) {
  332. __extends(BlobResource, _super);
  333. /**
  334. * @param {string} source - the URL of the texture file
  335. * @param {PIXI.IBlobOptions} options
  336. * @param {boolean}[options.autoLoad] - whether to fetch the data immediately;
  337. * you can fetch it later via {@link BlobResource#load}
  338. * @param {boolean}[options.width] - the width in pixels.
  339. * @param {boolean}[options.height] - the height in pixels.
  340. */
  341. function BlobResource(source, options) {
  342. if (options === void 0) { options = { width: 1, height: 1, autoLoad: true }; }
  343. var _this = this;
  344. var origin;
  345. var data;
  346. if (typeof source === 'string') {
  347. origin = source;
  348. data = new Uint8Array();
  349. }
  350. else {
  351. origin = null;
  352. data = source;
  353. }
  354. _this = _super.call(this, data, options) || this;
  355. /**
  356. * The URL of the texture file
  357. * @member {string}
  358. */
  359. _this.origin = origin;
  360. /**
  361. * The viewable buffer on the data
  362. * @member {ViewableBuffer}
  363. */
  364. // HINT: BlobResource allows "null" sources, assuming the child class provides an alternative
  365. _this.buffer = data ? new core.ViewableBuffer(data) : null;
  366. // Allow autoLoad = "undefined" still load the resource by default
  367. if (_this.origin && options.autoLoad !== false) {
  368. _this.load();
  369. }
  370. if (data && data.length) {
  371. _this.loaded = true;
  372. _this.onBlobLoaded(_this.buffer.rawBinaryData);
  373. }
  374. return _this;
  375. }
  376. BlobResource.prototype.onBlobLoaded = function (_data) {
  377. // TODO: Override this method
  378. };
  379. /** Loads the blob */
  380. BlobResource.prototype.load = function () {
  381. return __awaiter(this, void 0, Promise, function () {
  382. var response, blob, arrayBuffer;
  383. return __generator(this, function (_a) {
  384. switch (_a.label) {
  385. case 0: return [4 /*yield*/, fetch(this.origin)];
  386. case 1:
  387. response = _a.sent();
  388. return [4 /*yield*/, response.blob()];
  389. case 2:
  390. blob = _a.sent();
  391. return [4 /*yield*/, blob.arrayBuffer()];
  392. case 3:
  393. arrayBuffer = _a.sent();
  394. this.data = new Uint32Array(arrayBuffer);
  395. this.buffer = new core.ViewableBuffer(arrayBuffer);
  396. this.loaded = true;
  397. this.onBlobLoaded(arrayBuffer);
  398. this.update();
  399. return [2 /*return*/, this];
  400. }
  401. });
  402. });
  403. };
  404. return BlobResource;
  405. }(core.BufferResource));
  406. /**
  407. * Resource for compressed texture formats, as follows: S3TC/DXTn (& their sRGB formats), ATC, ASTC, ETC 1/2, PVRTC.
  408. *
  409. * Compressed textures improve performance when rendering is texture-bound. The texture data stays compressed in
  410. * graphics memory, increasing memory locality and speeding up texture fetches. These formats can also be used to store
  411. * more detail in the same amount of memory.
  412. *
  413. * For most developers, container file formats are a better abstraction instead of directly handling raw texture
  414. * data. PixiJS provides native support for the following texture file formats (via {@link PIXI.Loader}):
  415. *
  416. * **.dds** - the DirectDraw Surface file format stores DXTn (DXT-1,3,5) data. See {@link PIXI.DDSLoader}
  417. * **.ktx** - the Khronos Texture Container file format supports storing all the supported WebGL compression formats.
  418. * See {@link PIXI.KTXLoader}.
  419. * **.basis** - the BASIS supercompressed file format stores texture data in an internal format that is transcoded
  420. * to the compression format supported on the device at _runtime_. It also supports transcoding into a uncompressed
  421. * format as a fallback; you must install the `@pixi/basis-loader`, `@pixi/basis-transcoder` packages separately to
  422. * use these files. See {@link PIXI.BasisLoader}.
  423. *
  424. * The loaders for the aforementioned formats use `CompressedTextureResource` internally. It is strongly suggested that
  425. * they be used instead.
  426. *
  427. * ## Working directly with CompressedTextureResource
  428. *
  429. * Since `CompressedTextureResource` inherits `BlobResource`, you can provide it a URL pointing to a file containing
  430. * the raw texture data (with no file headers!):
  431. *
  432. * ```js
  433. * // The resource backing the texture data for your textures.
  434. * // NOTE: You can also provide a ArrayBufferView instead of a URL. This is used when loading data from a container file
  435. * // format such as KTX, DDS, or BASIS.
  436. * const compressedResource = new PIXI.CompressedTextureResource("bunny.dxt5", {
  437. * format: PIXI.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT,
  438. * width: 256,
  439. * height: 256
  440. * });
  441. *
  442. * // You can create a base-texture to the cache, so that future `Texture`s can be created using the `Texture.from` API.
  443. * const baseTexture = new PIXI.BaseTexture(compressedResource, { pmaMode: PIXI.ALPHA_MODES.NPM });
  444. *
  445. * // Create a Texture to add to the TextureCache
  446. * const texture = new PIXI.Texture(baseTexture);
  447. *
  448. * // Add baseTexture & texture to the global texture cache
  449. * PIXI.BaseTexture.addToCache(baseTexture, "bunny.dxt5");
  450. * PIXI.Texture.addToCache(texture, "bunny.dxt5");
  451. * ```
  452. * @memberof PIXI
  453. */
  454. var CompressedTextureResource = /** @class */ (function (_super) {
  455. __extends(CompressedTextureResource, _super);
  456. /**
  457. * @param source - the buffer/URL holding the compressed texture data
  458. * @param options
  459. * @param {PIXI.INTERNAL_FORMATS} options.format - the compression format
  460. * @param {number} options.width - the image width in pixels.
  461. * @param {number} options.height - the image height in pixels.
  462. * @param {number} [options.level=1] - the mipmap levels stored in the compressed texture, including level 0.
  463. * @param {number} [options.levelBuffers] - the buffers for each mipmap level. `CompressedTextureResource` can allows you
  464. * to pass `null` for `source`, for cases where each level is stored in non-contiguous memory.
  465. */
  466. function CompressedTextureResource(source, options) {
  467. var _this = _super.call(this, source, options) || this;
  468. _this.format = options.format;
  469. _this.levels = options.levels || 1;
  470. _this._width = options.width;
  471. _this._height = options.height;
  472. _this._extension = CompressedTextureResource._formatToExtension(_this.format);
  473. if (options.levelBuffers || _this.buffer) {
  474. // ViewableBuffer doesn't support byteOffset :-( so allow source to be Uint8Array
  475. _this._levelBuffers = options.levelBuffers
  476. || CompressedTextureResource._createLevelBuffers(source instanceof Uint8Array ? source : _this.buffer.uint8View, _this.format, _this.levels, 4, 4, // PVRTC has 8x4 blocks in 2bpp mode
  477. _this.width, _this.height);
  478. }
  479. return _this;
  480. }
  481. /**
  482. * @override
  483. * @param renderer - A reference to the current renderer
  484. * @param _texture - the texture
  485. * @param _glTexture - texture instance for this webgl context
  486. */
  487. CompressedTextureResource.prototype.upload = function (renderer, _texture, _glTexture) {
  488. var gl = renderer.gl;
  489. var extension = renderer.context.extensions[this._extension];
  490. if (!extension) {
  491. throw new Error(this._extension + " textures are not supported on the current machine");
  492. }
  493. if (!this._levelBuffers) {
  494. // Do not try to upload data before BlobResource loads, unless the levelBuffers were provided directly!
  495. return false;
  496. }
  497. for (var i = 0, j = this.levels; i < j; i++) {
  498. var _a = this._levelBuffers[i], levelID = _a.levelID, levelWidth = _a.levelWidth, levelHeight = _a.levelHeight, levelBuffer = _a.levelBuffer;
  499. gl.compressedTexImage2D(gl.TEXTURE_2D, levelID, this.format, levelWidth, levelHeight, 0, levelBuffer);
  500. }
  501. return true;
  502. };
  503. /** @protected */
  504. CompressedTextureResource.prototype.onBlobLoaded = function () {
  505. this._levelBuffers = CompressedTextureResource._createLevelBuffers(this.buffer.uint8View, this.format, this.levels, 4, 4, // PVRTC has 8x4 blocks in 2bpp mode
  506. this.width, this.height);
  507. };
  508. /**
  509. * Returns the key (to ContextSystem#extensions) for the WebGL extension supporting the compression format
  510. * @private
  511. * @param format - the compression format to get the extension for.
  512. */
  513. CompressedTextureResource._formatToExtension = function (format) {
  514. if (format >= 0x83F0 && format <= 0x83F3) {
  515. return 's3tc';
  516. }
  517. else if (format >= 0x9270 && format <= 0x9279) {
  518. return 'etc';
  519. }
  520. else if (format >= 0x8C00 && format <= 0x8C03) {
  521. return 'pvrtc';
  522. }
  523. else if (format >= 0x8D64) {
  524. return 'etc1';
  525. }
  526. else if (format >= 0x8C92 && format <= 0x87EE) {
  527. return 'atc';
  528. }
  529. throw new Error('Invalid (compressed) texture format given!');
  530. };
  531. /**
  532. * Pre-creates buffer views for each mipmap level
  533. * @private
  534. * @param buffer -
  535. * @param format - compression formats
  536. * @param levels - mipmap levels
  537. * @param blockWidth -
  538. * @param blockHeight -
  539. * @param imageWidth - width of the image in pixels
  540. * @param imageHeight - height of the image in pixels
  541. */
  542. CompressedTextureResource._createLevelBuffers = function (buffer, format, levels, blockWidth, blockHeight, imageWidth, imageHeight) {
  543. // The byte-size of the first level buffer
  544. var buffers = new Array(levels);
  545. var offset = buffer.byteOffset;
  546. var levelWidth = imageWidth;
  547. var levelHeight = imageHeight;
  548. var alignedLevelWidth = (levelWidth + blockWidth - 1) & ~(blockWidth - 1);
  549. var alignedLevelHeight = (levelHeight + blockHeight - 1) & ~(blockHeight - 1);
  550. var levelSize = alignedLevelWidth * alignedLevelHeight * INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[format];
  551. for (var i = 0; i < levels; i++) {
  552. buffers[i] = {
  553. levelID: i,
  554. levelWidth: levels > 1 ? levelWidth : alignedLevelWidth,
  555. levelHeight: levels > 1 ? levelHeight : alignedLevelHeight,
  556. levelBuffer: new Uint8Array(buffer.buffer, offset, levelSize)
  557. };
  558. offset += levelSize;
  559. // Calculate levelBuffer dimensions for next iteration
  560. levelWidth = (levelWidth >> 1) || 1;
  561. levelHeight = (levelHeight >> 1) || 1;
  562. alignedLevelWidth = (levelWidth + blockWidth - 1) & ~(blockWidth - 1);
  563. alignedLevelHeight = (levelHeight + blockHeight - 1) & ~(blockHeight - 1);
  564. levelSize = alignedLevelWidth * alignedLevelHeight * INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[format];
  565. }
  566. return buffers;
  567. };
  568. return CompressedTextureResource;
  569. }(BlobResource));
  570. /* eslint-enable camelcase */
  571. /**
  572. * Loader plugin for handling compressed textures for all platforms.
  573. * @class
  574. * @memberof PIXI
  575. * @implements {PIXI.ILoaderPlugin}
  576. */
  577. var CompressedTextureLoader = /** @class */ (function () {
  578. function CompressedTextureLoader() {
  579. }
  580. /**
  581. * Called after a compressed-textures manifest is loaded.
  582. *
  583. * This will then load the correct compression format for the device. Your manifest should adhere
  584. * to the following schema:
  585. *
  586. * ```js
  587. * import { INTERNAL_FORMATS } from '@pixi/constants';
  588. *
  589. * type CompressedTextureManifest = {
  590. * textures: Array<{ src: string, format?: keyof INTERNAL_FORMATS}>,
  591. * cacheID: string;
  592. * };
  593. * ```
  594. *
  595. * This is an example of a .json manifest file
  596. *
  597. * ```json
  598. * {
  599. * "cacheID":"asset",
  600. * "textures":[
  601. * { "src":"asset.fallback.png" },
  602. * { "format":"COMPRESSED_RGBA_S3TC_DXT5_EXT", "src":"asset.s3tc.ktx" },
  603. * { "format":"COMPRESSED_RGBA8_ETC2_EAC", "src":"asset.etc.ktx" },
  604. * { "format":"RGBA_PVRTC_4BPPV1_IMG", "src":"asset.pvrtc.ktx" }
  605. * ]
  606. * }
  607. * ```
  608. */
  609. CompressedTextureLoader.use = function (resource, next) {
  610. var data = resource.data;
  611. var loader = this;
  612. if (resource.type === loaders.LoaderResource.TYPE.JSON
  613. && data
  614. && data.cacheID
  615. && data.textures) {
  616. var textures = data.textures;
  617. var textureURL = void 0;
  618. var fallbackURL = void 0;
  619. // Search for an extension that holds one the formats
  620. for (var i = 0, j = textures.length; i < j; i++) {
  621. var texture = textures[i];
  622. var url_1 = texture.src;
  623. var format = texture.format;
  624. if (!format) {
  625. fallbackURL = url_1;
  626. }
  627. if (CompressedTextureLoader.textureFormats[format]) {
  628. textureURL = url_1;
  629. break;
  630. }
  631. }
  632. textureURL = textureURL || fallbackURL;
  633. // Make sure we have a URL
  634. if (!textureURL) {
  635. next(new Error("Cannot load compressed-textures in " + resource.url + ", make sure you provide a fallback"));
  636. return;
  637. }
  638. if (textureURL === resource.url) {
  639. // Prevent infinite loops
  640. next(new Error('URL of compressed texture cannot be the same as the manifest\'s URL'));
  641. return;
  642. }
  643. var loadOptions = {
  644. crossOrigin: resource.crossOrigin,
  645. metadata: resource.metadata.imageMetadata,
  646. parentResource: resource
  647. };
  648. var resourcePath = utils.url.resolve(resource.url.replace(loader.baseUrl, ''), textureURL);
  649. var resourceName = data.cacheID;
  650. // The appropriate loader should register the texture
  651. loader.add(resourceName, resourcePath, loadOptions, function (res) {
  652. if (res.error) {
  653. next(res.error);
  654. return;
  655. }
  656. var _a = res.texture, texture = _a === void 0 ? null : _a, _b = res.textures, textures = _b === void 0 ? {} : _b;
  657. // Make sure texture/textures is assigned to parent resource
  658. Object.assign(resource, { texture: texture, textures: textures });
  659. // Pass along any error
  660. next();
  661. });
  662. }
  663. else {
  664. next();
  665. }
  666. };
  667. Object.defineProperty(CompressedTextureLoader, "textureExtensions", {
  668. /** Map of available texture extensions. */
  669. get: function () {
  670. if (!CompressedTextureLoader._textureExtensions) {
  671. // Auto-detect WebGL compressed-texture extensions
  672. var canvas = settings.settings.ADAPTER.createCanvas();
  673. var gl = canvas.getContext('webgl');
  674. if (!gl) {
  675. console.warn('WebGL not available for compressed textures. Silently failing.');
  676. return {};
  677. }
  678. var extensions = {
  679. s3tc: gl.getExtension('WEBGL_compressed_texture_s3tc'),
  680. s3tc_sRGB: gl.getExtension('WEBGL_compressed_texture_s3tc_srgb'),
  681. etc: gl.getExtension('WEBGL_compressed_texture_etc'),
  682. etc1: gl.getExtension('WEBGL_compressed_texture_etc1'),
  683. pvrtc: gl.getExtension('WEBGL_compressed_texture_pvrtc')
  684. || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),
  685. atc: gl.getExtension('WEBGL_compressed_texture_atc'),
  686. astc: gl.getExtension('WEBGL_compressed_texture_astc')
  687. };
  688. CompressedTextureLoader._textureExtensions = extensions;
  689. }
  690. return CompressedTextureLoader._textureExtensions;
  691. },
  692. enumerable: false,
  693. configurable: true
  694. });
  695. Object.defineProperty(CompressedTextureLoader, "textureFormats", {
  696. /** Map of available texture formats. */
  697. get: function () {
  698. if (!CompressedTextureLoader._textureFormats) {
  699. var extensions = CompressedTextureLoader.textureExtensions;
  700. CompressedTextureLoader._textureFormats = {};
  701. // Assign all available compressed-texture formats
  702. for (var extensionName in extensions) {
  703. var extension = extensions[extensionName];
  704. if (!extension) {
  705. continue;
  706. }
  707. Object.assign(CompressedTextureLoader._textureFormats, Object.getPrototypeOf(extension));
  708. }
  709. }
  710. return CompressedTextureLoader._textureFormats;
  711. },
  712. enumerable: false,
  713. configurable: true
  714. });
  715. /** @ignore */
  716. CompressedTextureLoader.extension = core.ExtensionType.Loader;
  717. return CompressedTextureLoader;
  718. }());
  719. /**
  720. * Creates base-textures and textures for each compressed-texture resource and adds them into the global
  721. * texture cache. The first texture has two IDs - `${url}`, `${url}-1`; while the rest have an ID of the
  722. * form `${url}-i`.
  723. * @param url - the original address of the resources
  724. * @param resources - the resources backing texture data
  725. * @ignore
  726. */
  727. function registerCompressedTextures(url, resources, metadata) {
  728. var result = {
  729. textures: {},
  730. texture: null,
  731. };
  732. if (!resources) {
  733. return result;
  734. }
  735. var textures = resources.map(function (resource) {
  736. return (new core.Texture(new core.BaseTexture(resource, Object.assign({
  737. mipmap: constants.MIPMAP_MODES.OFF,
  738. alphaMode: constants.ALPHA_MODES.NO_PREMULTIPLIED_ALPHA
  739. }, metadata))));
  740. });
  741. textures.forEach(function (texture, i) {
  742. var baseTexture = texture.baseTexture;
  743. var cacheID = url + "-" + (i + 1);
  744. core.BaseTexture.addToCache(baseTexture, cacheID);
  745. core.Texture.addToCache(texture, cacheID);
  746. if (i === 0) {
  747. core.BaseTexture.addToCache(baseTexture, url);
  748. core.Texture.addToCache(texture, url);
  749. result.texture = texture;
  750. }
  751. result.textures[cacheID] = texture;
  752. });
  753. return result;
  754. }
  755. var _a$1, _b$1;
  756. var DDS_MAGIC_SIZE = 4;
  757. var DDS_HEADER_SIZE = 124;
  758. var DDS_HEADER_PF_SIZE = 32;
  759. var DDS_HEADER_DX10_SIZE = 20;
  760. // DDS file format magic word
  761. var DDS_MAGIC = 0x20534444;
  762. /**
  763. * DWORD offsets of the DDS file header fields (relative to file start).
  764. * @ignore
  765. */
  766. var DDS_FIELDS = {
  767. SIZE: 1,
  768. FLAGS: 2,
  769. HEIGHT: 3,
  770. WIDTH: 4,
  771. MIPMAP_COUNT: 7,
  772. PIXEL_FORMAT: 19,
  773. };
  774. /**
  775. * DWORD offsets of the DDS PIXEL_FORMAT fields.
  776. * @ignore
  777. */
  778. var DDS_PF_FIELDS = {
  779. SIZE: 0,
  780. FLAGS: 1,
  781. FOURCC: 2,
  782. RGB_BITCOUNT: 3,
  783. R_BIT_MASK: 4,
  784. G_BIT_MASK: 5,
  785. B_BIT_MASK: 6,
  786. A_BIT_MASK: 7
  787. };
  788. /**
  789. * DWORD offsets of the DDS_HEADER_DX10 fields.
  790. * @ignore
  791. */
  792. var DDS_DX10_FIELDS = {
  793. DXGI_FORMAT: 0,
  794. RESOURCE_DIMENSION: 1,
  795. MISC_FLAG: 2,
  796. ARRAY_SIZE: 3,
  797. MISC_FLAGS2: 4
  798. };
  799. /**
  800. * @see https://docs.microsoft.com/en-us/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format
  801. * @ignore
  802. */
  803. // This is way over-blown for us! Lend us a hand, and remove the ones that aren't used (but set the remaining
  804. // ones to their correct value)
  805. var DXGI_FORMAT;
  806. (function (DXGI_FORMAT) {
  807. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_UNKNOWN"] = 0] = "DXGI_FORMAT_UNKNOWN";
  808. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32A32_TYPELESS"] = 1] = "DXGI_FORMAT_R32G32B32A32_TYPELESS";
  809. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32A32_FLOAT"] = 2] = "DXGI_FORMAT_R32G32B32A32_FLOAT";
  810. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32A32_UINT"] = 3] = "DXGI_FORMAT_R32G32B32A32_UINT";
  811. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32A32_SINT"] = 4] = "DXGI_FORMAT_R32G32B32A32_SINT";
  812. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32_TYPELESS"] = 5] = "DXGI_FORMAT_R32G32B32_TYPELESS";
  813. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32_FLOAT"] = 6] = "DXGI_FORMAT_R32G32B32_FLOAT";
  814. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32_UINT"] = 7] = "DXGI_FORMAT_R32G32B32_UINT";
  815. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32B32_SINT"] = 8] = "DXGI_FORMAT_R32G32B32_SINT";
  816. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16B16A16_TYPELESS"] = 9] = "DXGI_FORMAT_R16G16B16A16_TYPELESS";
  817. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16B16A16_FLOAT"] = 10] = "DXGI_FORMAT_R16G16B16A16_FLOAT";
  818. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16B16A16_UNORM"] = 11] = "DXGI_FORMAT_R16G16B16A16_UNORM";
  819. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16B16A16_UINT"] = 12] = "DXGI_FORMAT_R16G16B16A16_UINT";
  820. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16B16A16_SNORM"] = 13] = "DXGI_FORMAT_R16G16B16A16_SNORM";
  821. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16B16A16_SINT"] = 14] = "DXGI_FORMAT_R16G16B16A16_SINT";
  822. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32_TYPELESS"] = 15] = "DXGI_FORMAT_R32G32_TYPELESS";
  823. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32_FLOAT"] = 16] = "DXGI_FORMAT_R32G32_FLOAT";
  824. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32_UINT"] = 17] = "DXGI_FORMAT_R32G32_UINT";
  825. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G32_SINT"] = 18] = "DXGI_FORMAT_R32G32_SINT";
  826. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32G8X24_TYPELESS"] = 19] = "DXGI_FORMAT_R32G8X24_TYPELESS";
  827. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_D32_FLOAT_S8X24_UINT"] = 20] = "DXGI_FORMAT_D32_FLOAT_S8X24_UINT";
  828. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS"] = 21] = "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS";
  829. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_X32_TYPELESS_G8X24_UINT"] = 22] = "DXGI_FORMAT_X32_TYPELESS_G8X24_UINT";
  830. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R10G10B10A2_TYPELESS"] = 23] = "DXGI_FORMAT_R10G10B10A2_TYPELESS";
  831. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R10G10B10A2_UNORM"] = 24] = "DXGI_FORMAT_R10G10B10A2_UNORM";
  832. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R10G10B10A2_UINT"] = 25] = "DXGI_FORMAT_R10G10B10A2_UINT";
  833. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R11G11B10_FLOAT"] = 26] = "DXGI_FORMAT_R11G11B10_FLOAT";
  834. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8B8A8_TYPELESS"] = 27] = "DXGI_FORMAT_R8G8B8A8_TYPELESS";
  835. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8B8A8_UNORM"] = 28] = "DXGI_FORMAT_R8G8B8A8_UNORM";
  836. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8B8A8_UNORM_SRGB"] = 29] = "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB";
  837. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8B8A8_UINT"] = 30] = "DXGI_FORMAT_R8G8B8A8_UINT";
  838. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8B8A8_SNORM"] = 31] = "DXGI_FORMAT_R8G8B8A8_SNORM";
  839. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8B8A8_SINT"] = 32] = "DXGI_FORMAT_R8G8B8A8_SINT";
  840. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16_TYPELESS"] = 33] = "DXGI_FORMAT_R16G16_TYPELESS";
  841. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16_FLOAT"] = 34] = "DXGI_FORMAT_R16G16_FLOAT";
  842. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16_UNORM"] = 35] = "DXGI_FORMAT_R16G16_UNORM";
  843. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16_UINT"] = 36] = "DXGI_FORMAT_R16G16_UINT";
  844. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16_SNORM"] = 37] = "DXGI_FORMAT_R16G16_SNORM";
  845. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16G16_SINT"] = 38] = "DXGI_FORMAT_R16G16_SINT";
  846. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32_TYPELESS"] = 39] = "DXGI_FORMAT_R32_TYPELESS";
  847. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_D32_FLOAT"] = 40] = "DXGI_FORMAT_D32_FLOAT";
  848. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32_FLOAT"] = 41] = "DXGI_FORMAT_R32_FLOAT";
  849. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32_UINT"] = 42] = "DXGI_FORMAT_R32_UINT";
  850. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R32_SINT"] = 43] = "DXGI_FORMAT_R32_SINT";
  851. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R24G8_TYPELESS"] = 44] = "DXGI_FORMAT_R24G8_TYPELESS";
  852. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_D24_UNORM_S8_UINT"] = 45] = "DXGI_FORMAT_D24_UNORM_S8_UINT";
  853. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R24_UNORM_X8_TYPELESS"] = 46] = "DXGI_FORMAT_R24_UNORM_X8_TYPELESS";
  854. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_X24_TYPELESS_G8_UINT"] = 47] = "DXGI_FORMAT_X24_TYPELESS_G8_UINT";
  855. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8_TYPELESS"] = 48] = "DXGI_FORMAT_R8G8_TYPELESS";
  856. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8_UNORM"] = 49] = "DXGI_FORMAT_R8G8_UNORM";
  857. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8_UINT"] = 50] = "DXGI_FORMAT_R8G8_UINT";
  858. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8_SNORM"] = 51] = "DXGI_FORMAT_R8G8_SNORM";
  859. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8_SINT"] = 52] = "DXGI_FORMAT_R8G8_SINT";
  860. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16_TYPELESS"] = 53] = "DXGI_FORMAT_R16_TYPELESS";
  861. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16_FLOAT"] = 54] = "DXGI_FORMAT_R16_FLOAT";
  862. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_D16_UNORM"] = 55] = "DXGI_FORMAT_D16_UNORM";
  863. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16_UNORM"] = 56] = "DXGI_FORMAT_R16_UNORM";
  864. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16_UINT"] = 57] = "DXGI_FORMAT_R16_UINT";
  865. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16_SNORM"] = 58] = "DXGI_FORMAT_R16_SNORM";
  866. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R16_SINT"] = 59] = "DXGI_FORMAT_R16_SINT";
  867. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8_TYPELESS"] = 60] = "DXGI_FORMAT_R8_TYPELESS";
  868. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8_UNORM"] = 61] = "DXGI_FORMAT_R8_UNORM";
  869. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8_UINT"] = 62] = "DXGI_FORMAT_R8_UINT";
  870. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8_SNORM"] = 63] = "DXGI_FORMAT_R8_SNORM";
  871. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8_SINT"] = 64] = "DXGI_FORMAT_R8_SINT";
  872. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_A8_UNORM"] = 65] = "DXGI_FORMAT_A8_UNORM";
  873. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R1_UNORM"] = 66] = "DXGI_FORMAT_R1_UNORM";
  874. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R9G9B9E5_SHAREDEXP"] = 67] = "DXGI_FORMAT_R9G9B9E5_SHAREDEXP";
  875. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R8G8_B8G8_UNORM"] = 68] = "DXGI_FORMAT_R8G8_B8G8_UNORM";
  876. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_G8R8_G8B8_UNORM"] = 69] = "DXGI_FORMAT_G8R8_G8B8_UNORM";
  877. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC1_TYPELESS"] = 70] = "DXGI_FORMAT_BC1_TYPELESS";
  878. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC1_UNORM"] = 71] = "DXGI_FORMAT_BC1_UNORM";
  879. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC1_UNORM_SRGB"] = 72] = "DXGI_FORMAT_BC1_UNORM_SRGB";
  880. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC2_TYPELESS"] = 73] = "DXGI_FORMAT_BC2_TYPELESS";
  881. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC2_UNORM"] = 74] = "DXGI_FORMAT_BC2_UNORM";
  882. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC2_UNORM_SRGB"] = 75] = "DXGI_FORMAT_BC2_UNORM_SRGB";
  883. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC3_TYPELESS"] = 76] = "DXGI_FORMAT_BC3_TYPELESS";
  884. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC3_UNORM"] = 77] = "DXGI_FORMAT_BC3_UNORM";
  885. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC3_UNORM_SRGB"] = 78] = "DXGI_FORMAT_BC3_UNORM_SRGB";
  886. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC4_TYPELESS"] = 79] = "DXGI_FORMAT_BC4_TYPELESS";
  887. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC4_UNORM"] = 80] = "DXGI_FORMAT_BC4_UNORM";
  888. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC4_SNORM"] = 81] = "DXGI_FORMAT_BC4_SNORM";
  889. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC5_TYPELESS"] = 82] = "DXGI_FORMAT_BC5_TYPELESS";
  890. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC5_UNORM"] = 83] = "DXGI_FORMAT_BC5_UNORM";
  891. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC5_SNORM"] = 84] = "DXGI_FORMAT_BC5_SNORM";
  892. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B5G6R5_UNORM"] = 85] = "DXGI_FORMAT_B5G6R5_UNORM";
  893. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B5G5R5A1_UNORM"] = 86] = "DXGI_FORMAT_B5G5R5A1_UNORM";
  894. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B8G8R8A8_UNORM"] = 87] = "DXGI_FORMAT_B8G8R8A8_UNORM";
  895. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B8G8R8X8_UNORM"] = 88] = "DXGI_FORMAT_B8G8R8X8_UNORM";
  896. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM"] = 89] = "DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM";
  897. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B8G8R8A8_TYPELESS"] = 90] = "DXGI_FORMAT_B8G8R8A8_TYPELESS";
  898. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B8G8R8A8_UNORM_SRGB"] = 91] = "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB";
  899. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B8G8R8X8_TYPELESS"] = 92] = "DXGI_FORMAT_B8G8R8X8_TYPELESS";
  900. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B8G8R8X8_UNORM_SRGB"] = 93] = "DXGI_FORMAT_B8G8R8X8_UNORM_SRGB";
  901. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC6H_TYPELESS"] = 94] = "DXGI_FORMAT_BC6H_TYPELESS";
  902. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC6H_UF16"] = 95] = "DXGI_FORMAT_BC6H_UF16";
  903. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC6H_SF16"] = 96] = "DXGI_FORMAT_BC6H_SF16";
  904. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC7_TYPELESS"] = 97] = "DXGI_FORMAT_BC7_TYPELESS";
  905. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC7_UNORM"] = 98] = "DXGI_FORMAT_BC7_UNORM";
  906. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_BC7_UNORM_SRGB"] = 99] = "DXGI_FORMAT_BC7_UNORM_SRGB";
  907. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_AYUV"] = 100] = "DXGI_FORMAT_AYUV";
  908. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_Y410"] = 101] = "DXGI_FORMAT_Y410";
  909. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_Y416"] = 102] = "DXGI_FORMAT_Y416";
  910. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_NV12"] = 103] = "DXGI_FORMAT_NV12";
  911. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_P010"] = 104] = "DXGI_FORMAT_P010";
  912. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_P016"] = 105] = "DXGI_FORMAT_P016";
  913. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_420_OPAQUE"] = 106] = "DXGI_FORMAT_420_OPAQUE";
  914. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_YUY2"] = 107] = "DXGI_FORMAT_YUY2";
  915. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_Y210"] = 108] = "DXGI_FORMAT_Y210";
  916. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_Y216"] = 109] = "DXGI_FORMAT_Y216";
  917. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_NV11"] = 110] = "DXGI_FORMAT_NV11";
  918. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_AI44"] = 111] = "DXGI_FORMAT_AI44";
  919. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_IA44"] = 112] = "DXGI_FORMAT_IA44";
  920. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_P8"] = 113] = "DXGI_FORMAT_P8";
  921. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_A8P8"] = 114] = "DXGI_FORMAT_A8P8";
  922. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_B4G4R4A4_UNORM"] = 115] = "DXGI_FORMAT_B4G4R4A4_UNORM";
  923. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_P208"] = 116] = "DXGI_FORMAT_P208";
  924. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_V208"] = 117] = "DXGI_FORMAT_V208";
  925. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_V408"] = 118] = "DXGI_FORMAT_V408";
  926. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE"] = 119] = "DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE";
  927. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE"] = 120] = "DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE";
  928. DXGI_FORMAT[DXGI_FORMAT["DXGI_FORMAT_FORCE_UINT"] = 121] = "DXGI_FORMAT_FORCE_UINT";
  929. })(DXGI_FORMAT || (DXGI_FORMAT = {}));
  930. /**
  931. * Possible values of the field {@link DDS_DX10_FIELDS.RESOURCE_DIMENSION}
  932. * @ignore
  933. */
  934. var D3D10_RESOURCE_DIMENSION;
  935. (function (D3D10_RESOURCE_DIMENSION) {
  936. D3D10_RESOURCE_DIMENSION[D3D10_RESOURCE_DIMENSION["DDS_DIMENSION_TEXTURE1D"] = 2] = "DDS_DIMENSION_TEXTURE1D";
  937. D3D10_RESOURCE_DIMENSION[D3D10_RESOURCE_DIMENSION["DDS_DIMENSION_TEXTURE2D"] = 3] = "DDS_DIMENSION_TEXTURE2D";
  938. D3D10_RESOURCE_DIMENSION[D3D10_RESOURCE_DIMENSION["DDS_DIMENSION_TEXTURE3D"] = 6] = "DDS_DIMENSION_TEXTURE3D";
  939. })(D3D10_RESOURCE_DIMENSION || (D3D10_RESOURCE_DIMENSION = {}));
  940. var PF_FLAGS = 1;
  941. // PIXEL_FORMAT flags
  942. var DDPF_ALPHA = 0x2;
  943. var DDPF_FOURCC = 0x4;
  944. var DDPF_RGB = 0x40;
  945. var DDPF_YUV = 0x200;
  946. var DDPF_LUMINANCE = 0x20000;
  947. // Four character codes for DXTn formats
  948. var FOURCC_DXT1 = 0x31545844;
  949. var FOURCC_DXT3 = 0x33545844;
  950. var FOURCC_DXT5 = 0x35545844;
  951. var FOURCC_DX10 = 0x30315844;
  952. // Cubemap texture flag (for DDS_DX10_FIELDS.MISC_FLAG)
  953. var DDS_RESOURCE_MISC_TEXTURECUBE = 0x4;
  954. /**
  955. * Maps `FOURCC_*` formats to internal formats (see {@link PIXI.INTERNAL_FORMATS}).
  956. * @ignore
  957. */
  958. var FOURCC_TO_FORMAT = (_a$1 = {},
  959. _a$1[FOURCC_DXT1] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT,
  960. _a$1[FOURCC_DXT3] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT,
  961. _a$1[FOURCC_DXT5] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT,
  962. _a$1);
  963. /**
  964. * Maps {@link DXGI_FORMAT} to types/internal-formats (see {@link PIXI.TYPES}, {@link PIXI.INTERNAL_FORMATS})
  965. * @ignore
  966. */
  967. var DXGI_TO_FORMAT = (_b$1 = {},
  968. // WEBGL_compressed_texture_s3tc
  969. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT,
  970. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT,
  971. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT,
  972. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT,
  973. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT,
  974. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM] = exports.INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT,
  975. // WEBGL_compressed_texture_s3tc_srgb
  976. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB] = exports.INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
  977. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB] = exports.INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,
  978. _b$1[DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB] = exports.INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,
  979. _b$1);
  980. /**
  981. * @class
  982. * @memberof PIXI
  983. * @implements {PIXI.ILoaderPlugin}
  984. * @see https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds-pguide
  985. */
  986. /**
  987. * Parses the DDS file header, generates base-textures, and puts them into the texture cache.
  988. * @param arrayBuffer
  989. */
  990. function parseDDS(arrayBuffer) {
  991. var data = new Uint32Array(arrayBuffer);
  992. var magicWord = data[0];
  993. if (magicWord !== DDS_MAGIC) {
  994. throw new Error('Invalid DDS file magic word');
  995. }
  996. var header = new Uint32Array(arrayBuffer, 0, DDS_HEADER_SIZE / Uint32Array.BYTES_PER_ELEMENT);
  997. // DDS header fields
  998. var height = header[DDS_FIELDS.HEIGHT];
  999. var width = header[DDS_FIELDS.WIDTH];
  1000. var mipmapCount = header[DDS_FIELDS.MIPMAP_COUNT];
  1001. // PIXEL_FORMAT fields
  1002. var pixelFormat = new Uint32Array(arrayBuffer, DDS_FIELDS.PIXEL_FORMAT * Uint32Array.BYTES_PER_ELEMENT, DDS_HEADER_PF_SIZE / Uint32Array.BYTES_PER_ELEMENT);
  1003. var formatFlags = pixelFormat[PF_FLAGS];
  1004. // File contains compressed texture(s)
  1005. if (formatFlags & DDPF_FOURCC) {
  1006. var fourCC = pixelFormat[DDS_PF_FIELDS.FOURCC];
  1007. // File contains one DXTn compressed texture
  1008. if (fourCC !== FOURCC_DX10) {
  1009. var internalFormat_1 = FOURCC_TO_FORMAT[fourCC];
  1010. var dataOffset_1 = DDS_MAGIC_SIZE + DDS_HEADER_SIZE;
  1011. var texData = new Uint8Array(arrayBuffer, dataOffset_1);
  1012. var resource = new CompressedTextureResource(texData, {
  1013. format: internalFormat_1,
  1014. width: width,
  1015. height: height,
  1016. levels: mipmapCount // CompressedTextureResource will separate the levelBuffers for us!
  1017. });
  1018. return [resource];
  1019. }
  1020. // FOURCC_DX10 indicates there is a 20-byte DDS_HEADER_DX10 after DDS_HEADER
  1021. var dx10Offset = DDS_MAGIC_SIZE + DDS_HEADER_SIZE;
  1022. var dx10Header = new Uint32Array(data.buffer, dx10Offset, DDS_HEADER_DX10_SIZE / Uint32Array.BYTES_PER_ELEMENT);
  1023. var dxgiFormat = dx10Header[DDS_DX10_FIELDS.DXGI_FORMAT];
  1024. var resourceDimension = dx10Header[DDS_DX10_FIELDS.RESOURCE_DIMENSION];
  1025. var miscFlag = dx10Header[DDS_DX10_FIELDS.MISC_FLAG];
  1026. var arraySize = dx10Header[DDS_DX10_FIELDS.ARRAY_SIZE];
  1027. // Map dxgiFormat to PIXI.INTERNAL_FORMATS
  1028. var internalFormat_2 = DXGI_TO_FORMAT[dxgiFormat];
  1029. if (internalFormat_2 === undefined) {
  1030. throw new Error("DDSParser cannot parse texture data with DXGI format " + dxgiFormat);
  1031. }
  1032. if (miscFlag === DDS_RESOURCE_MISC_TEXTURECUBE) {
  1033. // FIXME: Anybody excited about cubemap compressed textures?
  1034. throw new Error('DDSParser does not support cubemap textures');
  1035. }
  1036. if (resourceDimension === D3D10_RESOURCE_DIMENSION.DDS_DIMENSION_TEXTURE3D) {
  1037. // FIXME: Anybody excited about 3D compressed textures?
  1038. throw new Error('DDSParser does not supported 3D texture data');
  1039. }
  1040. // Uint8Array buffers of image data, including all mipmap levels in each image
  1041. var imageBuffers = new Array();
  1042. var dataOffset = DDS_MAGIC_SIZE
  1043. + DDS_HEADER_SIZE
  1044. + DDS_HEADER_DX10_SIZE;
  1045. if (arraySize === 1) {
  1046. // No need bothering with the imageSize calculation!
  1047. imageBuffers.push(new Uint8Array(arrayBuffer, dataOffset));
  1048. }
  1049. else {
  1050. // Calculate imageSize for each texture, and then locate each image's texture data
  1051. var pixelSize = INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[internalFormat_2];
  1052. var imageSize = 0;
  1053. var levelWidth = width;
  1054. var levelHeight = height;
  1055. for (var i = 0; i < mipmapCount; i++) {
  1056. var alignedLevelWidth = Math.max(1, (levelWidth + 3) & ~3);
  1057. var alignedLevelHeight = Math.max(1, (levelHeight + 3) & ~3);
  1058. var levelSize = alignedLevelWidth * alignedLevelHeight * pixelSize;
  1059. imageSize += levelSize;
  1060. levelWidth = levelWidth >>> 1;
  1061. levelHeight = levelHeight >>> 1;
  1062. }
  1063. var imageOffset = dataOffset;
  1064. // NOTE: Cubemaps have 6-images per texture (but they aren't supported so ^_^)
  1065. for (var i = 0; i < arraySize; i++) {
  1066. imageBuffers.push(new Uint8Array(arrayBuffer, imageOffset, imageSize));
  1067. imageOffset += imageSize;
  1068. }
  1069. }
  1070. // Uint8Array -> CompressedTextureResource, and we're done!
  1071. return imageBuffers.map(function (buffer) { return new CompressedTextureResource(buffer, {
  1072. format: internalFormat_2,
  1073. width: width,
  1074. height: height,
  1075. levels: mipmapCount
  1076. }); });
  1077. }
  1078. if (formatFlags & DDPF_RGB) {
  1079. // FIXME: We might want to allow uncompressed *.dds files?
  1080. throw new Error('DDSParser does not support uncompressed texture data.');
  1081. }
  1082. if (formatFlags & DDPF_YUV) {
  1083. // FIXME: Does anybody need this feature?
  1084. throw new Error('DDSParser does not supported YUV uncompressed texture data.');
  1085. }
  1086. if (formatFlags & DDPF_LUMINANCE) {
  1087. // FIXME: Microsoft says older DDS filers use this feature! Probably not worth the effort!
  1088. throw new Error('DDSParser does not support single-channel (lumninance) texture data!');
  1089. }
  1090. if (formatFlags & DDPF_ALPHA) {
  1091. // FIXME: I'm tired! See above =)
  1092. throw new Error('DDSParser does not support single-channel (alpha) texture data!');
  1093. }
  1094. throw new Error('DDSParser failed to load a texture file due to an unknown reason!');
  1095. }
  1096. var _a, _b, _c;
  1097. /**
  1098. * The 12-byte KTX file identifier
  1099. * @see https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/#2.1
  1100. * @ignore
  1101. */
  1102. var FILE_IDENTIFIER = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A];
  1103. /**
  1104. * The value stored in the "endianness" field.
  1105. * @see https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/#2.2
  1106. * @ignore
  1107. */
  1108. var ENDIANNESS = 0x04030201;
  1109. /**
  1110. * Byte offsets of the KTX file header fields
  1111. * @ignore
  1112. */
  1113. var KTX_FIELDS = {
  1114. FILE_IDENTIFIER: 0,
  1115. ENDIANNESS: 12,
  1116. GL_TYPE: 16,
  1117. GL_TYPE_SIZE: 20,
  1118. GL_FORMAT: 24,
  1119. GL_INTERNAL_FORMAT: 28,
  1120. GL_BASE_INTERNAL_FORMAT: 32,
  1121. PIXEL_WIDTH: 36,
  1122. PIXEL_HEIGHT: 40,
  1123. PIXEL_DEPTH: 44,
  1124. NUMBER_OF_ARRAY_ELEMENTS: 48,
  1125. NUMBER_OF_FACES: 52,
  1126. NUMBER_OF_MIPMAP_LEVELS: 56,
  1127. BYTES_OF_KEY_VALUE_DATA: 60
  1128. };
  1129. /**
  1130. * Byte size of the file header fields in {@code KTX_FIELDS}
  1131. * @ignore
  1132. */
  1133. var FILE_HEADER_SIZE = 64;
  1134. /**
  1135. * Maps {@link PIXI.TYPES} to the bytes taken per component, excluding those ones that are bit-fields.
  1136. * @ignore
  1137. */
  1138. var TYPES_TO_BYTES_PER_COMPONENT = (_a = {},
  1139. _a[constants.TYPES.UNSIGNED_BYTE] = 1,
  1140. _a[constants.TYPES.UNSIGNED_SHORT] = 2,
  1141. _a[constants.TYPES.INT] = 4,
  1142. _a[constants.TYPES.UNSIGNED_INT] = 4,
  1143. _a[constants.TYPES.FLOAT] = 4,
  1144. _a[constants.TYPES.HALF_FLOAT] = 8,
  1145. _a);
  1146. /**
  1147. * Number of components in each {@link PIXI.FORMATS}
  1148. * @ignore
  1149. */
  1150. var FORMATS_TO_COMPONENTS = (_b = {},
  1151. _b[constants.FORMATS.RGBA] = 4,
  1152. _b[constants.FORMATS.RGB] = 3,
  1153. _b[constants.FORMATS.RG] = 2,
  1154. _b[constants.FORMATS.RED] = 1,
  1155. _b[constants.FORMATS.LUMINANCE] = 1,
  1156. _b[constants.FORMATS.LUMINANCE_ALPHA] = 2,
  1157. _b[constants.FORMATS.ALPHA] = 1,
  1158. _b);
  1159. /**
  1160. * Number of bytes per pixel in bit-field types in {@link PIXI.TYPES}
  1161. * @ignore
  1162. */
  1163. var TYPES_TO_BYTES_PER_PIXEL = (_c = {},
  1164. _c[constants.TYPES.UNSIGNED_SHORT_4_4_4_4] = 2,
  1165. _c[constants.TYPES.UNSIGNED_SHORT_5_5_5_1] = 2,
  1166. _c[constants.TYPES.UNSIGNED_SHORT_5_6_5] = 2,
  1167. _c);
  1168. function parseKTX(url, arrayBuffer, loadKeyValueData) {
  1169. if (loadKeyValueData === void 0) { loadKeyValueData = false; }
  1170. var dataView = new DataView(arrayBuffer);
  1171. if (!validate(url, dataView)) {
  1172. return null;
  1173. }
  1174. var littleEndian = dataView.getUint32(KTX_FIELDS.ENDIANNESS, true) === ENDIANNESS;
  1175. var glType = dataView.getUint32(KTX_FIELDS.GL_TYPE, littleEndian);
  1176. // const glTypeSize = dataView.getUint32(KTX_FIELDS.GL_TYPE_SIZE, littleEndian);
  1177. var glFormat = dataView.getUint32(KTX_FIELDS.GL_FORMAT, littleEndian);
  1178. var glInternalFormat = dataView.getUint32(KTX_FIELDS.GL_INTERNAL_FORMAT, littleEndian);
  1179. var pixelWidth = dataView.getUint32(KTX_FIELDS.PIXEL_WIDTH, littleEndian);
  1180. var pixelHeight = dataView.getUint32(KTX_FIELDS.PIXEL_HEIGHT, littleEndian) || 1; // "pixelHeight = 0" -> "1"
  1181. var pixelDepth = dataView.getUint32(KTX_FIELDS.PIXEL_DEPTH, littleEndian) || 1; // ^^
  1182. var numberOfArrayElements = dataView.getUint32(KTX_FIELDS.NUMBER_OF_ARRAY_ELEMENTS, littleEndian) || 1; // ^^
  1183. var numberOfFaces = dataView.getUint32(KTX_FIELDS.NUMBER_OF_FACES, littleEndian);
  1184. var numberOfMipmapLevels = dataView.getUint32(KTX_FIELDS.NUMBER_OF_MIPMAP_LEVELS, littleEndian);
  1185. var bytesOfKeyValueData = dataView.getUint32(KTX_FIELDS.BYTES_OF_KEY_VALUE_DATA, littleEndian);
  1186. // Whether the platform architecture is little endian. If littleEndian !== platformLittleEndian, then the
  1187. // file contents must be endian-converted!
  1188. // TODO: Endianness conversion
  1189. // const platformLittleEndian = new Uint8Array((new Uint32Array([ENDIANNESS])).buffer)[0] === 0x01;
  1190. if (pixelHeight === 0 || pixelDepth !== 1) {
  1191. throw new Error('Only 2D textures are supported');
  1192. }
  1193. if (numberOfFaces !== 1) {
  1194. throw new Error('CubeTextures are not supported by KTXLoader yet!');
  1195. }
  1196. if (numberOfArrayElements !== 1) {
  1197. // TODO: Support splitting array-textures into multiple BaseTextures
  1198. throw new Error('WebGL does not support array textures');
  1199. }
  1200. // TODO: 8x4 blocks for 2bpp pvrtc
  1201. var blockWidth = 4;
  1202. var blockHeight = 4;
  1203. var alignedWidth = (pixelWidth + 3) & ~3;
  1204. var alignedHeight = (pixelHeight + 3) & ~3;
  1205. var imageBuffers = new Array(numberOfArrayElements);
  1206. var imagePixels = pixelWidth * pixelHeight;
  1207. if (glType === 0) {
  1208. // Align to 16 pixels (4x4 blocks)
  1209. imagePixels = alignedWidth * alignedHeight;
  1210. }
  1211. var imagePixelByteSize;
  1212. if (glType !== 0) {
  1213. // Uncompressed texture format
  1214. if (TYPES_TO_BYTES_PER_COMPONENT[glType]) {
  1215. imagePixelByteSize = TYPES_TO_BYTES_PER_COMPONENT[glType] * FORMATS_TO_COMPONENTS[glFormat];
  1216. }
  1217. else {
  1218. imagePixelByteSize = TYPES_TO_BYTES_PER_PIXEL[glType];
  1219. }
  1220. }
  1221. else {
  1222. imagePixelByteSize = INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[glInternalFormat];
  1223. }
  1224. if (imagePixelByteSize === undefined) {
  1225. throw new Error('Unable to resolve the pixel format stored in the *.ktx file!');
  1226. }
  1227. var kvData = loadKeyValueData
  1228. ? parseKvData(dataView, bytesOfKeyValueData, littleEndian)
  1229. : null;
  1230. var imageByteSize = imagePixels * imagePixelByteSize;
  1231. var mipByteSize = imageByteSize;
  1232. var mipWidth = pixelWidth;
  1233. var mipHeight = pixelHeight;
  1234. var alignedMipWidth = alignedWidth;
  1235. var alignedMipHeight = alignedHeight;
  1236. var imageOffset = FILE_HEADER_SIZE + bytesOfKeyValueData;
  1237. for (var mipmapLevel = 0; mipmapLevel < numberOfMipmapLevels; mipmapLevel++) {
  1238. var imageSize = dataView.getUint32(imageOffset, littleEndian);
  1239. var elementOffset = imageOffset + 4;
  1240. for (var arrayElement = 0; arrayElement < numberOfArrayElements; arrayElement++) {
  1241. // TODO: Maybe support 3D textures? :-)
  1242. // for (let zSlice = 0; zSlice < pixelDepth; zSlice)
  1243. var mips = imageBuffers[arrayElement];
  1244. if (!mips) {
  1245. mips = imageBuffers[arrayElement] = new Array(numberOfMipmapLevels);
  1246. }
  1247. mips[mipmapLevel] = {
  1248. levelID: mipmapLevel,
  1249. // don't align mipWidth when texture not compressed! (glType not zero)
  1250. levelWidth: numberOfMipmapLevels > 1 || glType !== 0 ? mipWidth : alignedMipWidth,
  1251. levelHeight: numberOfMipmapLevels > 1 || glType !== 0 ? mipHeight : alignedMipHeight,
  1252. levelBuffer: new Uint8Array(arrayBuffer, elementOffset, mipByteSize)
  1253. };
  1254. elementOffset += mipByteSize;
  1255. }
  1256. // HINT: Aligns to 4-byte boundary after jumping imageSize (in lieu of mipPadding)
  1257. imageOffset += imageSize + 4; // (+4 to jump the imageSize field itself)
  1258. imageOffset = imageOffset % 4 !== 0 ? imageOffset + 4 - (imageOffset % 4) : imageOffset;
  1259. // Calculate mipWidth, mipHeight for _next_ iteration
  1260. mipWidth = (mipWidth >> 1) || 1;
  1261. mipHeight = (mipHeight >> 1) || 1;
  1262. alignedMipWidth = (mipWidth + blockWidth - 1) & ~(blockWidth - 1);
  1263. alignedMipHeight = (mipHeight + blockHeight - 1) & ~(blockHeight - 1);
  1264. // Each mipmap level is 4-times smaller?
  1265. mipByteSize = alignedMipWidth * alignedMipHeight * imagePixelByteSize;
  1266. }
  1267. // We use the levelBuffers feature of CompressedTextureResource b/c texture data is image-major, not level-major.
  1268. if (glType !== 0) {
  1269. return {
  1270. uncompressed: imageBuffers.map(function (levelBuffers) {
  1271. var buffer = levelBuffers[0].levelBuffer;
  1272. var convertToInt = false;
  1273. if (glType === constants.TYPES.FLOAT) {
  1274. buffer = new Float32Array(levelBuffers[0].levelBuffer.buffer, levelBuffers[0].levelBuffer.byteOffset, levelBuffers[0].levelBuffer.byteLength / 4);
  1275. }
  1276. else if (glType === constants.TYPES.UNSIGNED_INT) {
  1277. convertToInt = true;
  1278. buffer = new Uint32Array(levelBuffers[0].levelBuffer.buffer, levelBuffers[0].levelBuffer.byteOffset, levelBuffers[0].levelBuffer.byteLength / 4);
  1279. }
  1280. else if (glType === constants.TYPES.INT) {
  1281. convertToInt = true;
  1282. buffer = new Int32Array(levelBuffers[0].levelBuffer.buffer, levelBuffers[0].levelBuffer.byteOffset, levelBuffers[0].levelBuffer.byteLength / 4);
  1283. }
  1284. return {
  1285. resource: new core.BufferResource(buffer, {
  1286. width: levelBuffers[0].levelWidth,
  1287. height: levelBuffers[0].levelHeight,
  1288. }),
  1289. type: glType,
  1290. format: convertToInt ? convertFormatToInteger(glFormat) : glFormat,
  1291. };
  1292. }),
  1293. kvData: kvData
  1294. };
  1295. }
  1296. return {
  1297. compressed: imageBuffers.map(function (levelBuffers) { return new CompressedTextureResource(null, {
  1298. format: glInternalFormat,
  1299. width: pixelWidth,
  1300. height: pixelHeight,
  1301. levels: numberOfMipmapLevels,
  1302. levelBuffers: levelBuffers,
  1303. }); }),
  1304. kvData: kvData
  1305. };
  1306. }
  1307. /**
  1308. * Checks whether the arrayBuffer contains a valid *.ktx file.
  1309. * @param url
  1310. * @param dataView
  1311. */
  1312. function validate(url, dataView) {
  1313. // NOTE: Do not optimize this into 3 32-bit integer comparison because the endianness
  1314. // of the data is not specified.
  1315. for (var i = 0; i < FILE_IDENTIFIER.length; i++) {
  1316. if (dataView.getUint8(i) !== FILE_IDENTIFIER[i]) {
  1317. console.error(url + " is not a valid *.ktx file!");
  1318. return false;
  1319. }
  1320. }
  1321. return true;
  1322. }
  1323. function convertFormatToInteger(format) {
  1324. switch (format) {
  1325. case constants.FORMATS.RGBA: return constants.FORMATS.RGBA_INTEGER;
  1326. case constants.FORMATS.RGB: return constants.FORMATS.RGB_INTEGER;
  1327. case constants.FORMATS.RG: return constants.FORMATS.RG_INTEGER;
  1328. case constants.FORMATS.RED: return constants.FORMATS.RED_INTEGER;
  1329. default: return format;
  1330. }
  1331. }
  1332. function parseKvData(dataView, bytesOfKeyValueData, littleEndian) {
  1333. var kvData = new Map();
  1334. var bytesIntoKeyValueData = 0;
  1335. while (bytesIntoKeyValueData < bytesOfKeyValueData) {
  1336. var keyAndValueByteSize = dataView.getUint32(FILE_HEADER_SIZE + bytesIntoKeyValueData, littleEndian);
  1337. var keyAndValueByteOffset = FILE_HEADER_SIZE + bytesIntoKeyValueData + 4;
  1338. var valuePadding = 3 - ((keyAndValueByteSize + 3) % 4);
  1339. // Bounds check
  1340. if (keyAndValueByteSize === 0 || keyAndValueByteSize > bytesOfKeyValueData - bytesIntoKeyValueData) {
  1341. console.error('KTXLoader: keyAndValueByteSize out of bounds');
  1342. break;
  1343. }
  1344. // Note: keyNulByte can't be 0 otherwise the key is an empty string.
  1345. var keyNulByte = 0;
  1346. for (; keyNulByte < keyAndValueByteSize; keyNulByte++) {
  1347. if (dataView.getUint8(keyAndValueByteOffset + keyNulByte) === 0x00) {
  1348. break;
  1349. }
  1350. }
  1351. if (keyNulByte === -1) {
  1352. console.error('KTXLoader: Failed to find null byte terminating kvData key');
  1353. break;
  1354. }
  1355. var key = new TextDecoder().decode(new Uint8Array(dataView.buffer, keyAndValueByteOffset, keyNulByte));
  1356. var value = new DataView(dataView.buffer, keyAndValueByteOffset + keyNulByte + 1, keyAndValueByteSize - keyNulByte - 1);
  1357. kvData.set(key, value);
  1358. // 4 = the keyAndValueByteSize field itself
  1359. // keyAndValueByteSize = the bytes taken by the key and value
  1360. // valuePadding = extra padding to align with 4 bytes
  1361. bytesIntoKeyValueData += 4 + keyAndValueByteSize + valuePadding;
  1362. }
  1363. return kvData;
  1364. }
  1365. // Set DDS files to be loaded as an ArrayBuffer
  1366. loaders.LoaderResource.setExtensionXhrType('dds', loaders.LoaderResource.XHR_RESPONSE_TYPE.BUFFER);
  1367. /**
  1368. * @class
  1369. * @memberof PIXI
  1370. * @implements {PIXI.ILoaderPlugin}
  1371. * @see https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds-pguide
  1372. */
  1373. var DDSLoader = /** @class */ (function () {
  1374. function DDSLoader() {
  1375. }
  1376. /**
  1377. * Registers a DDS compressed texture
  1378. * @see PIXI.Loader.loaderMiddleware
  1379. * @param resource - loader resource that is checked to see if it is a DDS file
  1380. * @param next - callback Function to call when done
  1381. */
  1382. DDSLoader.use = function (resource, next) {
  1383. if (resource.extension === 'dds' && resource.data) {
  1384. try {
  1385. Object.assign(resource, registerCompressedTextures(resource.name || resource.url, parseDDS(resource.data), resource.metadata));
  1386. }
  1387. catch (err) {
  1388. next(err);
  1389. return;
  1390. }
  1391. }
  1392. next();
  1393. };
  1394. /** @ignore */
  1395. DDSLoader.extension = core.ExtensionType.Loader;
  1396. return DDSLoader;
  1397. }());
  1398. // Set KTX files to be loaded as an ArrayBuffer
  1399. loaders.LoaderResource.setExtensionXhrType('ktx', loaders.LoaderResource.XHR_RESPONSE_TYPE.BUFFER);
  1400. /**
  1401. * Loader plugin for handling KTX texture container files.
  1402. *
  1403. * This KTX loader does not currently support the following features:
  1404. * * cube textures
  1405. * * 3D textures
  1406. * * endianness conversion for big-endian machines
  1407. * * embedded *.basis files
  1408. *
  1409. * It does supports the following features:
  1410. * * multiple textures per file
  1411. * * mipmapping (only for compressed formats)
  1412. * * vendor-specific key/value data parsing (enable {@link PIXI.KTXLoader.loadKeyValueData})
  1413. * @class
  1414. * @memberof PIXI
  1415. * @implements {PIXI.ILoaderPlugin}
  1416. */
  1417. var KTXLoader = /** @class */ (function () {
  1418. function KTXLoader() {
  1419. }
  1420. /**
  1421. * Called after a KTX file is loaded.
  1422. *
  1423. * This will parse the KTX file header and add a {@code BaseTexture} to the texture
  1424. * cache.
  1425. * @see PIXI.Loader.loaderMiddleware
  1426. * @param resource - loader resource that is checked to see if it is a KTX file
  1427. * @param next - callback Function to call when done
  1428. */
  1429. KTXLoader.use = function (resource, next) {
  1430. if (resource.extension === 'ktx' && resource.data) {
  1431. try {
  1432. var url_1 = resource.name || resource.url;
  1433. var _a = parseKTX(url_1, resource.data, this.loadKeyValueData), compressed = _a.compressed, uncompressed = _a.uncompressed, kvData_1 = _a.kvData;
  1434. if (compressed) {
  1435. var result = registerCompressedTextures(url_1, compressed, resource.metadata);
  1436. if (kvData_1 && result.textures) {
  1437. for (var textureId in result.textures) {
  1438. result.textures[textureId].baseTexture.ktxKeyValueData = kvData_1;
  1439. }
  1440. }
  1441. Object.assign(resource, result);
  1442. }
  1443. else if (uncompressed) {
  1444. var textures_1 = {};
  1445. uncompressed.forEach(function (image, i) {
  1446. var texture = new core.Texture(new core.BaseTexture(image.resource, {
  1447. mipmap: constants.MIPMAP_MODES.OFF,
  1448. alphaMode: constants.ALPHA_MODES.NO_PREMULTIPLIED_ALPHA,
  1449. type: image.type,
  1450. format: image.format,
  1451. }));
  1452. var cacheID = url_1 + "-" + (i + 1);
  1453. if (kvData_1)
  1454. { texture.baseTexture.ktxKeyValueData = kvData_1; }
  1455. core.BaseTexture.addToCache(texture.baseTexture, cacheID);
  1456. core.Texture.addToCache(texture, cacheID);
  1457. if (i === 0) {
  1458. textures_1[url_1] = texture;
  1459. core.BaseTexture.addToCache(texture.baseTexture, url_1);
  1460. core.Texture.addToCache(texture, url_1);
  1461. }
  1462. textures_1[cacheID] = texture;
  1463. });
  1464. Object.assign(resource, { textures: textures_1 });
  1465. }
  1466. }
  1467. catch (err) {
  1468. next(err);
  1469. return;
  1470. }
  1471. }
  1472. next();
  1473. };
  1474. /** @ignore */
  1475. KTXLoader.extension = core.ExtensionType.Loader;
  1476. /**
  1477. * If set to `true`, {@link PIXI.KTXLoader} will parse key-value data in KTX textures. This feature relies
  1478. * on the [Encoding Standard]{@link https://encoding.spec.whatwg.org}.
  1479. *
  1480. * The key-value data will be available on the base-textures as {@code PIXI.BaseTexture.ktxKeyValueData}. They
  1481. * will hold a reference to the texture data buffer, so make sure to delete key-value data once you are done
  1482. * using it.
  1483. */
  1484. KTXLoader.loadKeyValueData = false;
  1485. return KTXLoader;
  1486. }());
  1487. exports.BlobResource = BlobResource;
  1488. exports.CompressedTextureLoader = CompressedTextureLoader;
  1489. exports.CompressedTextureResource = CompressedTextureResource;
  1490. exports.DDSLoader = DDSLoader;
  1491. exports.FORMATS_TO_COMPONENTS = FORMATS_TO_COMPONENTS;
  1492. exports.INTERNAL_FORMAT_TO_BYTES_PER_PIXEL = INTERNAL_FORMAT_TO_BYTES_PER_PIXEL;
  1493. exports.KTXLoader = KTXLoader;
  1494. exports.TYPES_TO_BYTES_PER_COMPONENT = TYPES_TO_BYTES_PER_COMPONENT;
  1495. exports.TYPES_TO_BYTES_PER_PIXEL = TYPES_TO_BYTES_PER_PIXEL;
  1496. exports.parseDDS = parseDDS;
  1497. exports.parseKTX = parseKTX;
  1498. Object.defineProperty(exports, '__esModule', { value: true });
  1499. return exports;
  1500. })({}, PIXI, PIXI, PIXI.utils, PIXI, PIXI);
  1501. Object.assign(this.PIXI, _pixi_compressed_textures);
  1502. //# sourceMappingURL=compressed-textures.js.map