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}"`);