mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-12 08:47:31 +00:00
Use oxipng raw api
This commit is contained in:
@@ -1,11 +1,18 @@
|
|||||||
#[cfg(feature = "parallel")]
|
#[cfg(feature = "parallel")]
|
||||||
pub use wasm_bindgen_rayon::init_thread_pool;
|
pub use wasm_bindgen_rayon::init_thread_pool;
|
||||||
|
|
||||||
use oxipng::Interlacing;
|
use oxipng::{BitDepth, ColorType, Interlacing};
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
|
use wasm_bindgen::Clamped;
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub fn optimise(data: &[u8], level: u8, interlace: bool) -> Vec<u8> {
|
pub fn optimise(
|
||||||
|
data: Clamped<Vec<u8>>,
|
||||||
|
width: u32,
|
||||||
|
height: u32,
|
||||||
|
level: u8,
|
||||||
|
interlace: bool,
|
||||||
|
) -> Vec<u8> {
|
||||||
let mut options = oxipng::Options::from_preset(level);
|
let mut options = oxipng::Options::from_preset(level);
|
||||||
options.optimize_alpha = true;
|
options.optimize_alpha = true;
|
||||||
options.interlace = Some(if interlace {
|
options.interlace = Some(if interlace {
|
||||||
@@ -14,5 +21,7 @@ pub fn optimise(data: &[u8], level: u8, interlace: bool) -> Vec<u8> {
|
|||||||
Interlacing::None
|
Interlacing::None
|
||||||
});
|
});
|
||||||
|
|
||||||
oxipng::optimize_from_memory(data, &options).unwrap_throw()
|
let raw = oxipng::RawImage::new(width, height, ColorType::RGBA, BitDepth::Eight, data.0)
|
||||||
|
.unwrap_throw();
|
||||||
|
raw.create_optimized_png(&options).unwrap_throw()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,7 @@ export async function encode(
|
|||||||
imageData: ImageData,
|
imageData: ImageData,
|
||||||
options: EncodeOptions,
|
options: EncodeOptions,
|
||||||
) {
|
) {
|
||||||
const pngBlob = await abortable(signal, canvasEncode(imageData, 'image/png'));
|
return workerBridge.oxipngEncode(signal, imageData, options);
|
||||||
const pngBuffer = await abortable(signal, blobToArrayBuffer(pngBlob));
|
|
||||||
return workerBridge.oxipngEncode(signal, pngBuffer, options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ async function initST() {
|
|||||||
let wasmReady: ReturnType<typeof initMT | typeof initST>;
|
let wasmReady: ReturnType<typeof initMT | typeof initST>;
|
||||||
|
|
||||||
export default async function encode(
|
export default async function encode(
|
||||||
data: ArrayBuffer,
|
data: ImageData,
|
||||||
options: EncodeOptions,
|
options: EncodeOptions,
|
||||||
): Promise<ArrayBuffer> {
|
): Promise<ArrayBuffer> {
|
||||||
if (!wasmReady) {
|
if (!wasmReady) {
|
||||||
@@ -45,6 +45,11 @@ export default async function encode(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const optimise = await wasmReady;
|
const optimise = await wasmReady;
|
||||||
return optimise(new Uint8Array(data), options.level, options.interlace)
|
return optimise(
|
||||||
.buffer;
|
data.data,
|
||||||
|
data.width,
|
||||||
|
data.height,
|
||||||
|
options.level,
|
||||||
|
options.interlace,
|
||||||
|
).buffer;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user