Add encode() and decode() types

This commit is contained in:
Steven
2021-07-26 23:22:28 -04:00
parent 16a53caa48
commit de4eb9c8f7
3 changed files with 44 additions and 15 deletions

View File

@@ -9,6 +9,23 @@ import { cpus } from 'os';
hardwareConcurrency: cpus().length,
};
interface DecodeModule extends EmscriptenWasm.Module {
decode: (data: Uint8Array) => any;
}
interface EncodeModule extends EmscriptenWasm.Module {
encode: (
data: Uint8ClampedArray | ArrayBuffer,
width: number,
height: number,
opts: any,
) => Uint8Array;
}
type DecodeModuleFactory = EmscriptenWasm.ModuleFactory<DecodeModule>;
type EncodeModuleFactory = EmscriptenWasm.ModuleFactory<EncodeModule>;
interface RotateModuleInstance {
exports: {
memory: WebAssembly.Memory;
@@ -264,8 +281,10 @@ export const codecs = {
name: 'MozJPEG',
extension: 'jpg',
detectors: [/^\xFF\xD8\xFF/],
dec: () => instantiateEmscriptenWasm(mozDec, mozDecWasm),
enc: () => instantiateEmscriptenWasm(mozEnc, mozEncWasm),
dec: () =>
instantiateEmscriptenWasm(mozDec as DecodeModuleFactory, mozDecWasm),
enc: () =>
instantiateEmscriptenWasm(mozEnc as EncodeModuleFactory, mozEncWasm),
defaultEncoderOptions: {
quality: 75,
baseline: false,
@@ -294,8 +313,10 @@ export const codecs = {
name: 'WebP',
extension: 'webp',
detectors: [/^RIFF....WEBPVP8[LX ]/s],
dec: () => instantiateEmscriptenWasm(webpDec, webpDecWasm),
enc: () => instantiateEmscriptenWasm(webpEnc, webpEncWasm),
dec: () =>
instantiateEmscriptenWasm(webpDec as DecodeModuleFactory, webpDecWasm),
enc: () =>
instantiateEmscriptenWasm(webpEnc as EncodeModuleFactory, webpEncWasm),
defaultEncoderOptions: {
quality: 75,
target_size: 0,
@@ -335,16 +356,20 @@ export const codecs = {
name: 'AVIF',
extension: 'avif',
detectors: [/^\x00\x00\x00 ftypavif\x00\x00\x00\x00/],
dec: () => instantiateEmscriptenWasm(avifDec, avifDecWasm),
dec: () =>
instantiateEmscriptenWasm(avifDec as DecodeModuleFactory, avifDecWasm),
enc: async () => {
if (await threads()) {
return instantiateEmscriptenWasm(
avifEncMt,
avifEncMt as EncodeModuleFactory,
avifEncMtWasm,
avifEncMtWorker,
);
}
return instantiateEmscriptenWasm(avifEnc, avifEncWasm);
return instantiateEmscriptenWasm(
avifEnc as EncodeModuleFactory,
avifEncWasm,
);
},
defaultEncoderOptions: {
cqLevel: 33,
@@ -368,8 +393,10 @@ export const codecs = {
name: 'JPEG-XL',
extension: 'jxl',
detectors: [/^\xff\x0a/],
dec: () => instantiateEmscriptenWasm(jxlDec, jxlDecWasm),
enc: () => instantiateEmscriptenWasm(jxlEnc, jxlEncWasm),
dec: () =>
instantiateEmscriptenWasm(jxlDec as DecodeModuleFactory, jxlDecWasm),
enc: () =>
instantiateEmscriptenWasm(jxlEnc as EncodeModuleFactory, jxlEncWasm),
defaultEncoderOptions: {
speed: 4,
quality: 75,
@@ -389,8 +416,10 @@ export const codecs = {
name: 'WebP2',
extension: 'wp2',
detectors: [/^\xF4\xFF\x6F/],
dec: () => instantiateEmscriptenWasm(wp2Dec, wp2DecWasm),
enc: () => instantiateEmscriptenWasm(wp2Enc, wp2EncWasm),
dec: () =>
instantiateEmscriptenWasm(wp2Dec as DecodeModuleFactory, wp2DecWasm),
enc: () =>
instantiateEmscriptenWasm(wp2Enc as EncodeModuleFactory, wp2EncWasm),
defaultEncoderOptions: {
quality: 75,
alpha_quality: 75,
@@ -421,7 +450,7 @@ export const codecs = {
await oxipngPromise;
return {
encode: (
buffer: Uint8Array,
buffer: Uint8ClampedArray | ArrayBuffer,
width: number,
height: number,
opts: { level: number },

View File

@@ -11,7 +11,7 @@ export function instantiateEmscriptenWasm<T extends EmscriptenWasm.Module>(
factory: EmscriptenWasm.ModuleFactory<T>,
path: string,
workerJS: string = '',
): Promise<any> {
): Promise<T> {
return factory({
locateFile(requestPath) {
// The glue code generated by emscripten uses the original

View File

@@ -79,7 +79,7 @@ async function encodeImage({
}: {
bitmap: ImageData;
encName: EncoderKey;
encConfig: string | { [key: string]: any };
encConfig: any;
optimizerButteraugliTarget: number;
maxOptimizerRounds: number;
}) {
@@ -94,7 +94,7 @@ async function encodeImage({
bitmapIn.data,
bitmapIn.width,
bitmapIn.height,
Object.assign({}, encoders[encName].defaultEncoderOptions, {
Object.assign({}, encoders[encName].defaultEncoderOptions as any, {
[optionToOptimize]: quality,
}),
);