From 27f103fee5ccd5e35de792b49ccd486880630cbf Mon Sep 17 00:00:00 2001 From: ergunsh Date: Fri, 3 Sep 2021 11:53:52 +0300 Subject: [PATCH 1/3] Improve preprocess parameter type --- libsquoosh/src/codecs.ts | 25 ++++++++++++++----------- libsquoosh/src/index.ts | 18 +++++++++++++++--- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/libsquoosh/src/codecs.ts b/libsquoosh/src/codecs.ts index 98052cd6..c0410221 100644 --- a/libsquoosh/src/codecs.ts +++ b/libsquoosh/src/codecs.ts @@ -29,14 +29,23 @@ interface ResizeWithAspectParams { target_height: number; } -interface ResizeInstantiateOptions { +export interface ResizeOptions { width: number; height: number; - method: string; + method: 'triange' | 'catrom' | 'mitchell' | 'lanczos3'; premultiply: boolean; linearRGB: boolean; } +export interface QuantOptions { + numColors: number; + dither: number; +} + +export interface RotateOptions { + numRotations: number; +} + declare global { // Needed for being able to use ImageData as type in codec types type ImageData = import('./image_data.js').default; @@ -171,13 +180,7 @@ export const preprocessors = { buffer: Uint8Array, input_width: number, input_height: number, - { - width, - height, - method, - premultiply, - linearRGB, - }: ResizeInstantiateOptions, + { width, height, method, premultiply, linearRGB }: ResizeOptions, ) => { ({ width, height } = resizeWithAspect({ input_width, @@ -218,7 +221,7 @@ export const preprocessors = { buffer: Uint8Array, width: number, height: number, - { numColors, dither }: { numColors: number; dither: number }, + { numColors, dither }: QuantOptions, ) => new ImageData( imageQuant.quantize(buffer, width, height, numColors, dither), @@ -239,7 +242,7 @@ export const preprocessors = { buffer: Uint8Array, width: number, height: number, - { numRotations }: { numRotations: number }, + { numRotations }: RotateOptions, ) => { const degrees = (numRotations * 90) % 360; const sameDimensions = degrees == 0 || degrees == 180; diff --git a/libsquoosh/src/index.ts b/libsquoosh/src/index.ts index 48c15091..8a8880e8 100644 --- a/libsquoosh/src/index.ts +++ b/libsquoosh/src/index.ts @@ -2,7 +2,13 @@ import { isMainThread } from 'worker_threads'; import { cpus } from 'os'; import { promises as fsp } from 'fs'; -import { codecs as encoders, preprocessors } from './codecs.js'; +import { + codecs as encoders, + preprocessors, + QuantOptions, + ResizeOptions, + RotateOptions, +} from './codecs.js'; import WorkerPool from './worker_pool.js'; import { autoOptimize } from './auto-optimizer.js'; import type ImageData from './image_data'; @@ -12,6 +18,12 @@ type EncoderKey = keyof typeof encoders; type PreprocessorKey = keyof typeof preprocessors; type FileLike = Buffer | ArrayBuffer | string | ArrayBufferView; +type PreprocessOptions = { + resize?: ResizeOptions; + quant?: QuantOptions; + rotate?: RotateOptions; +}; + async function decodeFile({ file, }: { @@ -183,10 +195,10 @@ class Image { /** * Define one or several preprocessors to use on the image. - * @param {object} preprocessOptions - An object with preprocessors to use, and their settings. + * @param {PreprocessOptions} preprocessOptions - An object with preprocessors to use, and their settings. * @returns {Promise} - A promise that resolves when all preprocessors have completed their work. */ - async preprocess(preprocessOptions = {}) { + async preprocess(preprocessOptions: PreprocessOptions = {}) { for (const [name, options] of Object.entries(preprocessOptions)) { if (!Object.keys(preprocessors).includes(name)) { throw Error(`Invalid preprocessor "${name}"`); From 68ce8f420d1a0b475ff235ec300bd9b8128884e3 Mon Sep 17 00:00:00 2001 From: ergunsh Date: Fri, 3 Sep 2021 14:54:08 +0300 Subject: [PATCH 2/3] Improve encode parameter typing --- libsquoosh/src/codecs.ts | 21 +++++++++++++++++++-- libsquoosh/src/index.ts | 13 ++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/libsquoosh/src/codecs.ts b/libsquoosh/src/codecs.ts index c0410221..ca905f9b 100644 --- a/libsquoosh/src/codecs.ts +++ b/libsquoosh/src/codecs.ts @@ -61,6 +61,7 @@ import mozEnc from '../../codecs/mozjpeg/enc/mozjpeg_node_enc.js'; import mozEncWasm from 'asset-url:../../codecs/mozjpeg/enc/mozjpeg_node_enc.wasm'; import mozDec from '../../codecs/mozjpeg/dec/mozjpeg_node_dec.js'; import mozDecWasm from 'asset-url:../../codecs/mozjpeg/dec/mozjpeg_node_dec.wasm'; +import type { EncodeOptions as MozJPEGEncodeOptions } from '../../codecs/mozjpeg/enc/mozjpeg_enc'; // WebP import type { WebPModule as WebPEncodeModule } from '../../codecs/webp/enc/webp_enc'; @@ -68,6 +69,7 @@ import webpEnc from '../../codecs/webp/enc/webp_node_enc.js'; import webpEncWasm from 'asset-url:../../codecs/webp/enc/webp_node_enc.wasm'; import webpDec from '../../codecs/webp/dec/webp_node_dec.js'; import webpDecWasm from 'asset-url:../../codecs/webp/dec/webp_node_dec.wasm'; +import type { EncodeOptions as WebPEncodeOptions } from '../../codecs/webp/enc/webp_enc.js'; // AVIF import type { AVIFModule as AVIFEncodeModule } from '../../codecs/avif/enc/avif_enc'; @@ -78,6 +80,7 @@ import avifEncMtWorker from 'chunk-url:../../codecs/avif/enc/avif_node_enc_mt.wo import avifEncMtWasm from 'asset-url:../../codecs/avif/enc/avif_node_enc_mt.wasm'; import avifDec from '../../codecs/avif/dec/avif_node_dec.js'; import avifDecWasm from 'asset-url:../../codecs/avif/dec/avif_node_dec.wasm'; +import type { EncodeOptions as AvifEncodeOptions } from '../../codecs/avif/enc/avif_enc.js'; // JXL import type { JXLModule as JXLEncodeModule } from '../../codecs/jxl/enc/jxl_enc'; @@ -85,6 +88,7 @@ import jxlEnc from '../../codecs/jxl/enc/jxl_node_enc.js'; import jxlEncWasm from 'asset-url:../../codecs/jxl/enc/jxl_node_enc.wasm'; import jxlDec from '../../codecs/jxl/dec/jxl_node_dec.js'; import jxlDecWasm from 'asset-url:../../codecs/jxl/dec/jxl_node_dec.wasm'; +import type { EncodeOptions as JxlEncodeOptions } from '../../codecs/jxl/enc/jxl_enc.js'; // WP2 import type { WP2Module as WP2EncodeModule } from '../../codecs/wp2/enc/wp2_enc'; @@ -92,6 +96,7 @@ import wp2Enc from '../../codecs/wp2/enc/wp2_node_enc.js'; import wp2EncWasm from 'asset-url:../../codecs/wp2/enc/wp2_node_enc.wasm'; import wp2Dec from '../../codecs/wp2/dec/wp2_node_dec.js'; import wp2DecWasm from 'asset-url:../../codecs/wp2/dec/wp2_node_dec.wasm'; +import type { EncodeOptions as WP2EncodeOptions } from '../../codecs/wp2/enc/wp2_enc.js'; // PNG import * as pngEncDec from '../../codecs/png/pkg/squoosh_png.js'; @@ -104,6 +109,9 @@ const pngEncDecPromise = pngEncDec.default( import * as oxipng from '../../codecs/oxipng/pkg/squoosh_oxipng.js'; import oxipngWasm from 'asset-url:../../codecs/oxipng/pkg/squoosh_oxipng_bg.wasm'; const oxipngPromise = oxipng.default(fsp.readFile(pathify(oxipngWasm))); +interface OxiPngEncodeOptions { + level: number; +} // Resize import * as resize from '../../codecs/resize/pkg/squoosh_resize.js'; @@ -404,13 +412,13 @@ export const codecs = { jxlEncWasm, ), defaultEncoderOptions: { - speed: 4, + effort: 1, quality: 75, progressive: false, epf: -1, - nearLossless: 0, lossyPalette: false, decodingSpeedTier: 0, + photonNoiseIso: 0, }, autoOptimize: { option: 'quality', @@ -483,3 +491,12 @@ export const codecs = { }, }, } as const; + +export { + MozJPEGEncodeOptions, + WebPEncodeOptions, + AvifEncodeOptions, + JxlEncodeOptions, + WP2EncodeOptions, + OxiPngEncodeOptions, +}; diff --git a/libsquoosh/src/index.ts b/libsquoosh/src/index.ts index 8a8880e8..65c9bec8 100644 --- a/libsquoosh/src/index.ts +++ b/libsquoosh/src/index.ts @@ -3,11 +3,17 @@ import { cpus } from 'os'; import { promises as fsp } from 'fs'; import { + AvifEncodeOptions, codecs as encoders, + JxlEncodeOptions, + MozJPEGEncodeOptions, + OxiPngEncodeOptions, preprocessors, QuantOptions, ResizeOptions, RotateOptions, + WebPEncodeOptions, + WP2EncodeOptions, } from './codecs.js'; import WorkerPool from './worker_pool.js'; import { autoOptimize } from './auto-optimizer.js'; @@ -229,7 +235,12 @@ class Image { optimizerButteraugliTarget?: number; maxOptimizerRounds?: number; } & { - [key in EncoderKey]?: any; // any is okay for now + mozjpeg?: Partial; + webp?: Partial; + avif?: Partial; + jxl?: Partial; + wp2?: Partial; + oxipng?: Partial; } = {}, ): Promise { const { bitmap } = await this.decoded; From c4bc369c6b6479667b1b75f32ec6b4347df62c12 Mon Sep 17 00:00:00 2001 From: ergunsh Date: Fri, 3 Sep 2021 15:03:28 +0300 Subject: [PATCH 3/3] Fix typo in `triangle` --- libsquoosh/src/codecs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsquoosh/src/codecs.ts b/libsquoosh/src/codecs.ts index ca905f9b..0517f217 100644 --- a/libsquoosh/src/codecs.ts +++ b/libsquoosh/src/codecs.ts @@ -32,7 +32,7 @@ interface ResizeWithAspectParams { export interface ResizeOptions { width: number; height: number; - method: 'triange' | 'catrom' | 'mitchell' | 'lanczos3'; + method: 'triangle' | 'catrom' | 'mitchell' | 'lanczos3'; premultiply: boolean; linearRGB: boolean; }