import when from "../ThirdParty/when.js"; import CompressedTextureBuffer from "./CompressedTextureBuffer.js"; import defined from "./defined.js"; import DeveloperError from "./DeveloperError.js"; import Resource from "./Resource.js"; import TaskProcessor from "./TaskProcessor.js"; var transcodeTaskProcessor = new TaskProcessor( "transcodeCRNToDXT", Number.POSITIVE_INFINITY ); /** * Asynchronously loads and parses the given URL to a CRN file or parses the raw binary data of a CRN file. * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, * or reject if the URL failed to load or failed to parse the data. The data is loaded * using XMLHttpRequest, which means that in order to make requests to another origin, * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. * * @function loadCRN * * @param {Resource|String|ArrayBuffer} resourceOrUrlOrBuffer The URL of the binary data or an ArrayBuffer. * @returns {Promise.|undefined} A promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. * * @exception {RuntimeError} Unsupported compressed format. * * @example * // load a single URL asynchronously * Cesium.loadCRN('some/url').then(function(textureData) { * var width = textureData.width; * var height = textureData.height; * var format = textureData.internalFormat; * var arrayBufferView = textureData.bufferView; * // use the data to create a texture * }).otherwise(function(error) { * // an error occurred * }); * * @see {@link https://github.com/BinomialLLC/crunch|crunch DXTc texture compression and transcoding library} * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A} */ function loadCRN(resourceOrUrlOrBuffer) { //>>includeStart('debug', pragmas.debug); if (!defined(resourceOrUrlOrBuffer)) { throw new DeveloperError("resourceOrUrlOrBuffer is required."); } //>>includeEnd('debug'); var loadPromise; if ( resourceOrUrlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(resourceOrUrlOrBuffer) ) { loadPromise = when.resolve(resourceOrUrlOrBuffer); } else { var resource = Resource.createIfNeeded(resourceOrUrlOrBuffer); loadPromise = resource.fetchArrayBuffer(); } if (!defined(loadPromise)) { return undefined; } return loadPromise .then(function (data) { if (!defined(data)) { return; } var transferrableObjects = []; if (data instanceof ArrayBuffer) { transferrableObjects.push(data); } else if ( data.byteOffset === 0 && data.byteLength === data.buffer.byteLength ) { transferrableObjects.push(data.buffer); } else { // data is a view of an array buffer. need to copy so it is transferrable to web worker data = data.slice(0, data.length); transferrableObjects.push(data.buffer); } return transcodeTaskProcessor.scheduleTask(data, transferrableObjects); }) .then(function (compressedTextureBuffer) { return CompressedTextureBuffer.clone(compressedTextureBuffer); }); } export default loadCRN;