@kibeo/loaders.gl-textures
Version:
Framework-independent loaders for compressed and super compressed (basis) textures
125 lines (102 loc) • 4.12 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parseCrunch = parseCrunch;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _crunchModuleLoader = require("./crunch-module-loader");
var _glConstants = require("../gl-constants");
var _loaders = require("@kibeo/loaders.gl-loader-utils");
var _parseDds = require("./parse-dds");
var _extractMipmapImages = require("../utils/extract-mipmap-images");
var CRN_FORMAT = {
cCRNFmtInvalid: -1,
cCRNFmtDXT1: 0,
cCRNFmtDXT3: 1,
cCRNFmtDXT5: 2
};
var DXT_FORMAT_MAP = {};
DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = {
pixelFormat: _glConstants.GL.COMPRESSED_RGB_S3TC_DXT1_EXT,
sizeFunction: _parseDds.getDxt1LevelSize
};
DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = {
pixelFormat: _glConstants.GL.COMPRESSED_RGBA_S3TC_DXT3_EXT,
sizeFunction: _parseDds.getDxtXLevelSize
};
DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = {
pixelFormat: _glConstants.GL.COMPRESSED_RGBA_S3TC_DXT5_EXT,
sizeFunction: _parseDds.getDxtXLevelSize
};
var cachedDstSize = 0;
var dst;
function parseCrunch(_x, _x2) {
return _parseCrunch.apply(this, arguments);
}
function _parseCrunch() {
_parseCrunch = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(data, options) {
var crunchModule, srcSize, bytes, src, format, mipMapLevels, width, height, sizeFunction, dstSize, i, image;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _crunchModuleLoader.loadCrunchModule)(options);
case 2:
crunchModule = _context.sent;
srcSize = data.byteLength;
bytes = new Uint8Array(data);
src = crunchModule._malloc(srcSize);
arrayBufferCopy(bytes, crunchModule.HEAPU8, src, srcSize);
format = crunchModule._crn_get_dxt_format(src, srcSize);
(0, _loaders.assert)(Boolean(DXT_FORMAT_MAP[format]), 'Unsupported format');
mipMapLevels = crunchModule._crn_get_levels(src, srcSize);
width = crunchModule._crn_get_width(src, srcSize);
height = crunchModule._crn_get_height(src, srcSize);
sizeFunction = DXT_FORMAT_MAP[format].sizeFunction;
dstSize = 0;
for (i = 0; i < mipMapLevels; ++i) {
dstSize += sizeFunction(width >> i, height >> i);
}
if (cachedDstSize < dstSize) {
if (dst) {
crunchModule._free(dst);
}
dst = crunchModule._malloc(dstSize);
cachedDstSize = dstSize;
}
crunchModule._crn_decompress(src, srcSize, dst, dstSize, 0, mipMapLevels);
crunchModule._free(src);
image = new Uint8Array(crunchModule.HEAPU8.buffer, dst, dstSize).slice();
return _context.abrupt("return", (0, _extractMipmapImages.extractMipmapImages)(image, {
mipMapLevels: mipMapLevels,
width: width,
height: height,
sizeFunction: sizeFunction,
internalFormat: DXT_FORMAT_MAP[format].pixelFormat
}));
case 20:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return _parseCrunch.apply(this, arguments);
}
function arrayBufferCopy(srcData, dstData, dstByteOffset, numBytes) {
var i;
var dst32Offset = dstByteOffset / 4;
var tail = numBytes % 4;
var src32 = new Uint32Array(srcData.buffer, 0, (numBytes - tail) / 4);
var dst32 = new Uint32Array(dstData.buffer);
for (i = 0; i < src32.length; i++) {
dst32[dst32Offset + i] = src32[i];
}
for (i = numBytes - tail; i < numBytes; i++) {
dstData[dstByteOffset + i] = srcData[i];
}
}
//# sourceMappingURL=parse-crunch.js.map