diff --git a/codecs/oxipng/Cargo.toml b/codecs/oxipng/Cargo.toml index b0b9a191..32b6ca1c 100644 --- a/codecs/oxipng/Cargo.toml +++ b/codecs/oxipng/Cargo.toml @@ -12,7 +12,7 @@ wasm-opt = ["-O", "--no-validation"] crate-type = ["cdylib"] [dependencies] -oxipng = { version = "4.0.1", default-features = false, features = ["libdeflater"] } +oxipng = { version = "4.0.3", default-features = false, features = ["libdeflater"] } libdeflater = { version = "0.7.1", features = ["freestanding"] } wasm-bindgen = "0.2.73" log = { version = "0.4.11", features = ["release_max_level_off"] } diff --git a/codecs/oxipng/pkg-parallel/squoosh_oxipng.d.ts b/codecs/oxipng/pkg-parallel/squoosh_oxipng.d.ts index 8ca403de..82b533ec 100644 --- a/codecs/oxipng/pkg-parallel/squoosh_oxipng.d.ts +++ b/codecs/oxipng/pkg-parallel/squoosh_oxipng.d.ts @@ -3,9 +3,10 @@ /** * @param {Uint8Array} data * @param {number} level +* @param {boolean} interlace * @returns {Uint8Array} */ -export function optimise(data: Uint8Array, level: number): Uint8Array; +export function optimise(data: Uint8Array, level: number, interlace: boolean): Uint8Array; /** * @param {number} num_threads * @returns {Promise} @@ -35,7 +36,7 @@ export class wbg_rayon_PoolBuilder { export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { - readonly optimise: (a: number, b: number, c: number, d: number) => void; + readonly optimise: (a: number, b: number, c: number, d: number, e: number) => void; readonly __wbg_wbg_rayon_poolbuilder_free: (a: number) => void; readonly wbg_rayon_poolbuilder_numThreads: (a: number) => number; readonly wbg_rayon_poolbuilder_receiver: (a: number) => number; diff --git a/codecs/oxipng/pkg-parallel/squoosh_oxipng.js b/codecs/oxipng/pkg-parallel/squoosh_oxipng.js index a1689a5f..c3c8163a 100644 --- a/codecs/oxipng/pkg-parallel/squoosh_oxipng.js +++ b/codecs/oxipng/pkg-parallel/squoosh_oxipng.js @@ -56,14 +56,15 @@ function getArrayU8FromWasm0(ptr, len) { /** * @param {Uint8Array} data * @param {number} level +* @param {boolean} interlace * @returns {Uint8Array} */ -export function optimise(data, level) { +export function optimise(data, level, interlace) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); var ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc); var len0 = WASM_VECTOR_LEN; - wasm.optimise(retptr, ptr0, len0, level); + wasm.optimise(retptr, ptr0, len0, level, interlace); var r0 = getInt32Memory0()[retptr / 4 + 0]; var r1 = getInt32Memory0()[retptr / 4 + 1]; var v1 = getArrayU8FromWasm0(r0, r1).slice(); diff --git a/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm b/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm index 6c030492..8e6bc852 100644 Binary files a/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm and b/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm differ diff --git a/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm.d.ts b/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm.d.ts index 760b49d9..5226f54a 100644 --- a/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm.d.ts +++ b/codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm.d.ts @@ -1,6 +1,6 @@ /* tslint:disable */ /* eslint-disable */ -export function optimise(a: number, b: number, c: number, d: number): void; +export function optimise(a: number, b: number, c: number, d: number, e: number): void; export function __wbg_wbg_rayon_poolbuilder_free(a: number): void; export function wbg_rayon_poolbuilder_numThreads(a: number): number; export function wbg_rayon_poolbuilder_receiver(a: number): number; diff --git a/codecs/oxipng/pkg/squoosh_oxipng.d.ts b/codecs/oxipng/pkg/squoosh_oxipng.d.ts index 759bf922..7158f196 100644 --- a/codecs/oxipng/pkg/squoosh_oxipng.d.ts +++ b/codecs/oxipng/pkg/squoosh_oxipng.d.ts @@ -3,15 +3,16 @@ /** * @param {Uint8Array} data * @param {number} level +* @param {boolean} interlace * @returns {Uint8Array} */ -export function optimise(data: Uint8Array, level: number): Uint8Array; +export function optimise(data: Uint8Array, level: number, interlace: boolean): Uint8Array; export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { readonly memory: WebAssembly.Memory; - readonly optimise: (a: number, b: number, c: number, d: number) => void; + readonly optimise: (a: number, b: number, c: number, d: number, e: number) => void; readonly __wbindgen_add_to_stack_pointer: (a: number) => number; readonly __wbindgen_malloc: (a: number) => number; readonly __wbindgen_free: (a: number, b: number) => void; diff --git a/codecs/oxipng/pkg/squoosh_oxipng.js b/codecs/oxipng/pkg/squoosh_oxipng.js index ee7a699f..03aa0bb3 100644 --- a/codecs/oxipng/pkg/squoosh_oxipng.js +++ b/codecs/oxipng/pkg/squoosh_oxipng.js @@ -40,14 +40,15 @@ function getArrayU8FromWasm0(ptr, len) { /** * @param {Uint8Array} data * @param {number} level +* @param {boolean} interlace * @returns {Uint8Array} */ -export function optimise(data, level) { +export function optimise(data, level, interlace) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); var ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc); var len0 = WASM_VECTOR_LEN; - wasm.optimise(retptr, ptr0, len0, level); + wasm.optimise(retptr, ptr0, len0, level, interlace); var r0 = getInt32Memory0()[retptr / 4 + 0]; var r1 = getInt32Memory0()[retptr / 4 + 1]; var v1 = getArrayU8FromWasm0(r0, r1).slice(); diff --git a/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm b/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm index 97356d37..aaabc2b8 100644 Binary files a/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm and b/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm differ diff --git a/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm.d.ts b/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm.d.ts index b7c19ac5..cc6f7d39 100644 --- a/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm.d.ts +++ b/codecs/oxipng/pkg/squoosh_oxipng_bg.wasm.d.ts @@ -1,7 +1,7 @@ /* tslint:disable */ /* eslint-disable */ export const memory: WebAssembly.Memory; -export function optimise(a: number, b: number, c: number, d: number): void; +export function optimise(a: number, b: number, c: number, d: number, e: number): void; export function __wbindgen_add_to_stack_pointer(a: number): number; export function __wbindgen_malloc(a: number): number; export function __wbindgen_free(a: number, b: number): void; diff --git a/codecs/oxipng/src/lib.rs b/codecs/oxipng/src/lib.rs index 202621b1..fa825d7a 100644 --- a/codecs/oxipng/src/lib.rs +++ b/codecs/oxipng/src/lib.rs @@ -5,7 +5,7 @@ use oxipng::AlphaOptim; use wasm_bindgen::prelude::*; #[wasm_bindgen] -pub fn optimise(data: &[u8], level: u8) -> Vec { +pub fn optimise(data: &[u8], level: u8, interlace: bool) -> Vec { let mut options = oxipng::Options::from_preset(level); options.alphas.insert(AlphaOptim::Black); options.alphas.insert(AlphaOptim::White); @@ -13,6 +13,7 @@ pub fn optimise(data: &[u8], level: u8) -> Vec { options.alphas.insert(AlphaOptim::Down); options.alphas.insert(AlphaOptim::Left); options.alphas.insert(AlphaOptim::Right); + options.interlace = Some(if interlace { 1 } else { 0 }); options.deflate = oxipng::Deflaters::Libdeflater; oxipng::optimize_from_memory(data, &options).unwrap_throw() diff --git a/src/features/encoders/oxiPNG/client/index.tsx b/src/features/encoders/oxiPNG/client/index.tsx index 155b3b0c..51fc5885 100644 --- a/src/features/encoders/oxiPNG/client/index.tsx +++ b/src/features/encoders/oxiPNG/client/index.tsx @@ -2,6 +2,7 @@ import { canvasEncode, abortable, blobToArrayBuffer, + inputFieldChecked, } from 'client/lazy-app/util'; import { EncodeOptions } from '../shared/meta'; import type WorkerBridge from 'client/lazy-app/worker-bridge'; @@ -9,6 +10,7 @@ import { h, Component } from 'preact'; import { inputFieldValueAsNumber, preventDefault } from 'client/lazy-app/util'; import * as style from 'client/lazy-app/Compress/Options/style.css'; import Range from 'client/lazy-app/Compress/Options/Range'; +import Checkbox from 'client/lazy-app/Compress/Options/Checkbox'; export async function encode( signal: AbortSignal, @@ -34,6 +36,7 @@ export class Options extends Component { const options: EncodeOptions = { level: inputFieldValueAsNumber(form.level), + interlace: inputFieldChecked(form.interlace), }; this.props.onChange(options); }; @@ -41,6 +44,14 @@ export class Options extends Component { render({ options }: Props) { return (
+
{ if (!wasmReady) { - wasmReady = threads().then((hasThreads: boolean) => hasThreads ? initMT() : initST()); + wasmReady = threads().then((hasThreads: boolean) => + hasThreads ? initMT() : initST(), + ); } const optimise = await wasmReady; - return optimise(new Uint8Array(data), options.level).buffer; + return optimise(new Uint8Array(data), options.level, options.interlace) + .buffer; }