compressed-textures.js 68 KB

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