compressed-textures.mjs 67 KB

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