From c3a0d5f5d0eb7e15644ac6fd17a840a14df75229 Mon Sep 17 00:00:00 2001 From: codepage949 Date: Mon, 28 Mar 2022 04:18:58 +0900 Subject: [PATCH] Add support for TypedArray input with byteOffset and length --- lib/input.js | 2 +- test/unit/io.js | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/input.js b/lib/input.js index 1469bbae..de5cea60 100644 --- a/lib/input.js +++ b/lib/input.js @@ -39,7 +39,7 @@ function _createInputDescriptor (input, inputOptions, containerOptions) { if (input.length === 0) { throw Error('Input Bit Array is empty'); } - inputDescriptor.buffer = Buffer.from(input.buffer); + inputDescriptor.buffer = Buffer.from(input.buffer, input.byteOffset, input.byteLength); } else if (is.plainObject(input) && !is.defined(inputOptions)) { // Plain Object descriptor, e.g. create inputOptions = input; diff --git a/test/unit/io.js b/test/unit/io.js index 67c0f246..c264644d 100644 --- a/test/unit/io.js +++ b/test/unit/io.js @@ -182,6 +182,24 @@ describe('Input/output', function () { assert.strictEqual(info.height, 1); }); + it('Read from Uint8ClampedArray with byteOffset and output to Buffer', async () => { + // since a Uint8ClampedArray is the same as Uint8Array but clamps the values + // between 0-255 it seemed good to add this also + const uint8array = Uint8ClampedArray.from([0, 0, 0, 255, 255, 255, 0, 0, 0, 255, 255, 255]); + const uint8ArrayWithByteOffset = new Uint8ClampedArray(uint8array.buffer, 3, 6); + const { data, info } = await sharp(uint8ArrayWithByteOffset, { + raw: { + width: 2, + height: 1, + channels: 3 + } + }).toBuffer({ resolveWithObject: true }); + + assert.deepStrictEqual(Uint8ClampedArray.from([255, 255, 255, 0, 0, 0]), new Uint8ClampedArray(data)); + assert.strictEqual(info.width, 2); + assert.strictEqual(info.height, 1); + }); + it('Stream should emit info event', function (done) { const readable = fs.createReadStream(fixtures.inputJpg); const writable = fs.createWriteStream(outputJpg);