UNPKG

@kibeo/loaders.gl-textures

Version:

Framework-independent loaders for compressed and super compressed (basis) textures

85 lines (71 loc) 2.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseNPY = parseNPY; function systemIsLittleEndian() { var a = new Uint32Array([0x12345678]); var b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength); return !(b[0] === 0x12); } var LITTLE_ENDIAN_OS = systemIsLittleEndian(); var DTYPES = { u1: Uint8Array, i1: Int8Array, u2: Uint16Array, i2: Int16Array, u4: Uint32Array, i4: Int32Array, f4: Float32Array, f8: Float64Array }; function parseNPY(arrayBuffer, options) { if (!arrayBuffer) { return null; } var view = new DataView(arrayBuffer); var _parseHeader = parseHeader(view), header = _parseHeader.header, headerEndOffset = _parseHeader.headerEndOffset; var numpyType = header.descr; var ArrayType = DTYPES[numpyType.slice(1, 3)]; if (!ArrayType) { console.warn("Decoding of npy dtype not implemented: ".concat(numpyType)); return null; } var nArrayElements = header.shape.reduce(function (a, b) { return a * b; }); var arrayByteLength = nArrayElements * ArrayType.BYTES_PER_ELEMENT; var data = new ArrayType(arrayBuffer.slice(headerEndOffset, headerEndOffset + arrayByteLength)); if (numpyType[0] === '>' && LITTLE_ENDIAN_OS || numpyType[0] === '<' && !LITTLE_ENDIAN_OS) { console.warn('Data is wrong endianness, byte swapping not yet implemented.'); } return { data: data, header: header }; } function parseHeader(view) { var majorVersion = view.getUint8(6); var offset = 8; var headerLength; if (majorVersion >= 2) { headerLength = view.getUint32(8, true); offset += 4; } else { headerLength = view.getUint16(8, true); offset += 2; } var encoding = majorVersion <= 2 ? 'latin1' : 'utf-8'; var decoder = new TextDecoder(encoding); var headerArray = new Uint8Array(view.buffer, offset, headerLength); var headerText = decoder.decode(headerArray); offset += headerLength; var header = JSON.parse(headerText.replace(/'/g, '"').replace('False', 'false').replace('(', '[').replace(/,*\),*/g, ']')); return { header: header, headerEndOffset: offset }; } //# sourceMappingURL=parse-npy.js.map