mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-12 00:37:19 +00:00
Add rotate support
This commit is contained in:
@@ -3,8 +3,8 @@ import cjs from "@rollup/plugin-commonjs";
|
|||||||
import asset from "./lib/asset-plugin.js";
|
import asset from "./lib/asset-plugin.js";
|
||||||
import json from "./lib/json-plugin.js";
|
import json from "./lib/json-plugin.js";
|
||||||
import autojson from "./lib/autojson-plugin.js";
|
import autojson from "./lib/autojson-plugin.js";
|
||||||
import { getBabelOutputPlugin } from '@rollup/plugin-babel';
|
import { getBabelOutputPlugin } from "@rollup/plugin-babel";
|
||||||
import { builtinModules } from 'module';
|
import { builtinModules } from "module";
|
||||||
|
|
||||||
/** @type {import('rollup').RollupOptions} */
|
/** @type {import('rollup').RollupOptions} */
|
||||||
export default ({
|
export default ({
|
||||||
@@ -29,12 +29,15 @@ export default ({
|
|||||||
minified: true,
|
minified: true,
|
||||||
comments: false,
|
comments: false,
|
||||||
presets: [
|
presets: [
|
||||||
['@babel/preset-env', {
|
[
|
||||||
targets: {
|
"@babel/preset-env",
|
||||||
node: 12
|
{
|
||||||
},
|
targets: {
|
||||||
loose: true
|
node: 12
|
||||||
}]
|
},
|
||||||
|
loose: true
|
||||||
|
}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ import * as resize from "../../codecs/resize/pkg/squoosh_resize.js";
|
|||||||
import resizeWasm from "asset-url:../../codecs/resize/pkg/squoosh_resize_bg.wasm";
|
import resizeWasm from "asset-url:../../codecs/resize/pkg/squoosh_resize_bg.wasm";
|
||||||
const resizePromise = resize.default(fsp.readFile(pathify(resizeWasm)));
|
const resizePromise = resize.default(fsp.readFile(pathify(resizeWasm)));
|
||||||
|
|
||||||
|
// rotate
|
||||||
|
import rotateWasm from "asset-url:../../codecs/rotate/rotate.wasm";
|
||||||
|
|
||||||
// ImageQuant
|
// ImageQuant
|
||||||
import imageQuant from "../../codecs/imagequant/imagequant.js";
|
import imageQuant from "../../codecs/imagequant/imagequant.js";
|
||||||
import imageQuantWasm from "asset-url:../../codecs/imagequant/imagequant.wasm";
|
import imageQuantWasm from "asset-url:../../codecs/imagequant/imagequant.wasm";
|
||||||
@@ -127,6 +130,7 @@ export const preprocessors = {
|
|||||||
linearRGB: true
|
linearRGB: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// TODO: Need to handle SVGs and HQX
|
||||||
quant: {
|
quant: {
|
||||||
name: "ImageQuant",
|
name: "ImageQuant",
|
||||||
description: "Reduce the number of colors used (aka. paletting)",
|
description: "Reduce the number of colors used (aka. paletting)",
|
||||||
@@ -143,6 +147,35 @@ export const preprocessors = {
|
|||||||
numColors: 255,
|
numColors: 255,
|
||||||
dither: 1.0
|
dither: 1.0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
rotate: {
|
||||||
|
name: "Rotate",
|
||||||
|
description: "Rotate image",
|
||||||
|
instantiate: async () => {
|
||||||
|
return async (buffer, width, height, { degrees }) => {
|
||||||
|
const sameDimensions = degrees == 0 || degrees == 180;
|
||||||
|
const size = width * height * 4;
|
||||||
|
const { instance } = await WebAssembly.instantiate(
|
||||||
|
await fsp.readFile(pathify(rotateWasm))
|
||||||
|
);
|
||||||
|
const { memory } = instance.exports;
|
||||||
|
const pagesNeeded = Math.ceil(
|
||||||
|
(size * 2 - memory.buffer.byteLength) / (64 * 1024)
|
||||||
|
);
|
||||||
|
memory.grow(pagesNeeded);
|
||||||
|
const view = new Uint8ClampedArray(memory.buffer);
|
||||||
|
view.set(buffer, 8);
|
||||||
|
instance.exports.rotate(width, height, degrees);
|
||||||
|
return new ImageData(
|
||||||
|
new Uint8ClampedArray(view.slice(size + 8, size * 2 + 8)),
|
||||||
|
sameDimensions ? width : height,
|
||||||
|
sameDimensions ? height : width
|
||||||
|
);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
defaultOptions: {
|
||||||
|
numRotations: 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user