From ef61da3051182d73742526675affdd5ba2d2c10c Mon Sep 17 00:00:00 2001 From: Samy Al Zahrani Date: Fri, 8 Apr 2016 10:58:51 +0300 Subject: [PATCH] Ensure dimensions of final output image are provided (#399) Add a failing test for vips::VError exception * fix buffer size mismatch * Loosen error message assertion * Update image --- src/pipeline.cc | 22 ++++++++++++++-------- test/fixtures/flowers.jpeg | Bin 0 -> 85267 bytes test/fixtures/index.js | 2 ++ test/unit/io.js | 28 ++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 test/fixtures/flowers.jpeg diff --git a/src/pipeline.cc b/src/pipeline.cc index 63aef9d9..79905bdc 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -103,14 +103,19 @@ class PipelineWorker : public AsyncWorker { // From buffer if (baton->rawWidth > 0 && baton->rawHeight > 0 && baton->rawChannels > 0) { // Raw, uncompressed pixel data - image = VImage::new_from_memory(baton->bufferIn, baton->bufferInLength, - baton->rawWidth, baton->rawHeight, baton->rawChannels, VIPS_FORMAT_UCHAR); - if (baton->rawChannels < 3) { - image.get_image()->Type = VIPS_INTERPRETATION_B_W; - } else { - image.get_image()->Type = VIPS_INTERPRETATION_sRGB; + try { + image = VImage::new_from_memory(baton->bufferIn, baton->bufferInLength, + baton->rawWidth, baton->rawHeight, baton->rawChannels, VIPS_FORMAT_UCHAR); + if (baton->rawChannels < 3) { + image.get_image()->Type = VIPS_INTERPRETATION_B_W; + } else { + image.get_image()->Type = VIPS_INTERPRETATION_sRGB; + } + inputImageType = ImageType::RAW; + } catch(VError const &err) { + (baton->err).append(err.what()); + inputImageType = ImageType::UNKNOWN; } - inputImageType = ImageType::RAW; } else { // Compressed data inputImageType = DetermineImageType(baton->bufferIn, baton->bufferInLength); @@ -656,7 +661,8 @@ class PipelineWorker : public AsyncWorker { // Number of channels used in output image baton->channels = image.bands(); - + baton->width = image.width(); + baton->height = image.height(); // Output if (baton->fileOut == "") { // Buffer output diff --git a/test/fixtures/flowers.jpeg b/test/fixtures/flowers.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1ab920aff9ba4e064bfc064be5c1887080ee8b7a GIT binary patch literal 85267 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/index.js b/test/fixtures/index.js index 6d80af16..04839b7a 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -90,6 +90,8 @@ module.exports = { inputSvs: getPath('CMU-1-Small-Region.svs'), // http://openslide.cs.cmu.edu/download/openslide-testdata/Aperio/CMU-1-Small-Region.svs + inputJPGBig: getPath('flowers.jpeg'), + outputJpg: getPath('output.jpg'), outputPng: getPath('output.png'), outputWebP: getPath('output.webp'), diff --git a/test/unit/io.js b/test/unit/io.js index a6083208..e94f98c8 100644 --- a/test/unit/io.js +++ b/test/unit/io.js @@ -1031,4 +1031,32 @@ describe('Input/output', function() { }); }); + it('Info event data', function(done) { + var readable = fs.createReadStream(fixtures.inputJPGBig); + var inPipeline = sharp() + .resize(840) + .raw() + .on('info', function(info) { + assert.strictEqual(840, info.width); + assert.strictEqual(472, info.height); + assert.strictEqual(3, info.channels); + }); + var badPipeline = sharp(null, {raw: {width: 840, height: 473, channels: 3}}) + .toFormat('jpeg') + .toBuffer(function(err, data, info) { + assert.strictEqual(err.message.indexOf('memory area too small') > 0, true); + readable = fs.createReadStream(fixtures.inputJPGBig); + var goodPipeline = sharp(null, {raw: {width: 840, height: 472, channels: 3}}) + .toFormat('jpeg') + .toBuffer(function(err, data, info) { + if (err) throw err; + done(); + }); + inPipeline = sharp() + .resize(840) + .raw(); + readable.pipe(inPipeline).pipe(goodPipeline); + }); + readable.pipe(inPipeline).pipe(badPipeline); + }); });