From 4e5bb64565308dce87061fda8c5b1d4e3a34ed95 Mon Sep 17 00:00:00 2001 From: Surma Date: Sat, 5 Dec 2020 20:50:09 +0000 Subject: [PATCH] Reenable rotate --- cli/src/codecs.js | 61 +++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/cli/src/codecs.js b/cli/src/codecs.js index 4d821877..1fab7dc2 100644 --- a/cli/src/codecs.js +++ b/cli/src/codecs.js @@ -154,35 +154,38 @@ export const preprocessors = { 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 - // } - // } + rotate: { + name: 'Rotate', + description: 'Rotate image', + instantiate: async () => { + return async (buffer, width, height, { numRotations }) => { + const degrees = (numRotations * 90) % 360; + 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 additionalPagesNeeded = Math.ceil( + (size * 2 - memory.buffer.byteLength + 8) / (64 * 1024), + ); + if (additionalPagesNeeded > 0) { + memory.grow(additionalPagesNeeded); + } + 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, + }, + }, }; export const codecs = {