ktx2-encoder
Version:
KTX2(.ktx2) encoder for browser applications
39 lines (38 loc) • 1.61 kB
JavaScript
import { HDRSourceType, SourceType } from "../enum.js";
import { applyInputOptions } from "../applyInputOptions.js";
import BASIS from "../basis/basis_encoder.js";
let promise = null;
class NodeBasisEncoder {
async init() {
if (!promise) {
promise = BASIS().then((basis) => {
basis.initializeBasis();
return basis;
});
}
return promise;
}
async encode(bufferOrBufferArray, options = {}) {
const basis = await this.init();
const encoder = new basis.BasisEncoder();
const bufferArray = Array.isArray(bufferOrBufferArray) ? bufferOrBufferArray : [bufferOrBufferArray];
applyInputOptions(options, encoder);
for (let i = 0; i < bufferArray.length; i++) {
const buffer = bufferArray[i];
if (options.isHDR) {
encoder.setSliceSourceImageHDR(i, buffer, 0, 0, options.imageType === "hdr" ? HDRSourceType.HDR : HDRSourceType.EXR, true);
}
else {
const imageData = await options.imageDecoder(buffer);
encoder.setSliceSourceImage(i, new Uint8Array(imageData.data), imageData.width, imageData.height, SourceType.RAW);
}
}
const resultData = new Uint8Array(1024 * 1024 * (options.isHDR ? 24 : 10));
const resultSize = encoder.encode(resultData);
if (resultSize === 0) {
throw new Error("Encode failed");
}
return Buffer.from(resultData.subarray(0, resultSize));
}
}
export const nodeEncoder = new NodeBasisEncoder();