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

View File

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

View File

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