Use oxipng raw api

This commit is contained in:
Andrew
2024-03-16 19:05:50 +13:00
parent df7b622413
commit 42ef430cee
3 changed files with 21 additions and 9 deletions

View File

@@ -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()
} }

View File

@@ -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 = {

View File

@@ -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;
} }