From 322aa6089127681a336e25cd049096562ab1bede Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Wed, 3 Feb 2016 19:33:34 +0000 Subject: [PATCH] Ensure 16-bit input images can be normalised --- docs/changelog.md | 3 +- test/unit/normalize.js | 175 +++++++++++++++++++++-------------------- 2 files changed, 90 insertions(+), 88 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 0cb57a2d6..cbf21df3b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -20,7 +20,8 @@ [#315](https://github.com/lovell/sharp/issues/315) [@impomezia](https://github.com/impomezia) -* Ensure 16-bit input images can be embedded onto a transparent background. +* Ensure 16-bit input images can be normalised and embedded onto transparent backgrounds. + [#339](https://github.com/lovell/sharp/issues/339) [#340](https://github.com/lovell/sharp/issues/340) [@janaz](https://github.com/janaz) diff --git a/test/unit/normalize.js b/test/unit/normalize.js index 8f469976e..0539b78b6 100644 --- a/test/unit/normalize.js +++ b/test/unit/normalize.js @@ -5,107 +5,108 @@ var assert = require('assert'); var sharp = require('../../index'); var fixtures = require('../fixtures'); +var assertNormalized = function(data) { + var min = 255; + var max = 0; + for (var i = 0; i < data.length; i++) { + min = Math.min(min, data[i]); + max = Math.max(max, data[i]); + } + assert.strictEqual(0, min); + assert.strictEqual(255, max); +}; + describe('Normalization', function () { - it('uses the same prototype for both spellings', function () { + it('uses the same prototype for both spellings', function() { assert.strictEqual(sharp.prototype.normalize, sharp.prototype.normalise); }); - // Normalize is currently unavailable on Windows - if (process.platform !== 'win32') { + it('spreads rgb image values between 0 and 255', function(done) { + sharp(fixtures.inputJpgWithLowContrast) + .normalize() + .raw() + .toBuffer(function (err, data, info) { + if (err) throw err; + assertNormalized(data); + done(); + }); + }); - it('spreads rgb image values between 0 and 255', function(done) { - sharp(fixtures.inputJpgWithLowContrast) - .normalize() - .raw() - .toBuffer(function (err, data, info) { - if (err) throw err; - var min = 255, max = 0, i; - for (i = 0; i < data.length; i += 3) { - min = Math.min(min, data[i], data[i + 1], data[i + 2]); - max = Math.max(max, data[i], data[i + 1], data[i + 2]); - } - assert.strictEqual(0, min); - assert.strictEqual(255, max); - done(); - }); - }); + it('spreads grayscaled image values between 0 and 255', function(done) { + sharp(fixtures.inputJpgWithLowContrast) + .gamma() + .greyscale() + .normalize(true) + .raw() + .toBuffer(function (err, data, info) { + if (err) throw err; + assertNormalized(data); + done(); + }); + }); - it('spreads grayscaled image values between 0 and 255', function(done) { - sharp(fixtures.inputJpgWithLowContrast) - .gamma() - .greyscale() - .normalize(true) - .raw() - .toBuffer(function (err, data, info) { - if (err) throw err; - var min = 255, max = 0, i; - for (i = 0; i < data.length; i++) { - min = Math.min(min, data[i]); - max = Math.max(max, data[i]); - } - assert.strictEqual(0, min); - assert.strictEqual(255, max); - done(); - }); - }); + it('stretches greyscale images with alpha channel', function(done) { + sharp(fixtures.inputPngWithGreyAlpha) + .normalize() + .raw() + .toBuffer(function (err, data, info) { + if (err) throw err; + assertNormalized(data); + done(); + }); + }); - it('stretches greyscale images with alpha channel', function (done) { - sharp(fixtures.inputPngWithGreyAlpha) - .normalize() - .raw() - .toBuffer(function (err, data, info) { - var min = 255, max = 0, i; - for (i = 0; i < data.length; i++) { - min = Math.min(min, data[i]); - max = Math.max(max, data[i]); - } - assert.strictEqual(0, min); - assert.strictEqual(255, max); + it('keeps an existing alpha channel', function(done) { + sharp(fixtures.inputPngWithTransparency) + .normalize() + .toBuffer(function (err, data) { + if (err) throw err; + sharp(data).metadata(function(err, metadata) { + if (err) return done(err); + assert.strictEqual(4, metadata.channels); + assert.strictEqual(true, metadata.hasAlpha); + assert.strictEqual('srgb', metadata.space); done(); }); - }); + }); + }); - it('keeps an existing alpha channel', function (done) { - sharp(fixtures.inputPngWithTransparency) - .normalize() - .toBuffer(function (err, data) { + it('keeps the alpha channel of greyscale images intact', function(done) { + sharp(fixtures.inputPngWithGreyAlpha) + .normalize() + .toBuffer(function (err, data) { + if (err) throw err; + sharp(data).metadata(function(err, metadata) { if (err) return done(err); - sharp(data).metadata(function(err, metadata) { - if (err) return done(err); - assert.strictEqual(4, metadata.channels); - assert.strictEqual(true, metadata.hasAlpha); - assert.strictEqual('srgb', metadata.space); - done(); - }); + assert.strictEqual(true, metadata.hasAlpha); + assert.strictEqual(4, metadata.channels); + assert.strictEqual('srgb', metadata.space); + done(); }); - }); + }); + }); - it('keeps the alpha channel of greyscale images intact', function (done) { - sharp(fixtures.inputPngWithGreyAlpha) - .normalize() - .toBuffer(function (err, data) { - if (err) return done(err); - sharp(data).metadata(function(err, metadata) { - if (err) return done(err); - assert.strictEqual(true, metadata.hasAlpha); - assert.strictEqual(4, metadata.channels); - assert.strictEqual('srgb', metadata.space); - done(); - }); - }); - }); + it('does not alter images with only one color', function(done) { + var output = fixtures.path('output.unmodified-png-with-one-color.png'); + sharp(fixtures.inputPngWithOneColor) + .normalize() + .toFile(output, function(err, info) { + if (err) done(err); + fixtures.assertMaxColourDistance(output, fixtures.inputPngWithOneColor, 0); + done(); + }); + }); - it('does not alter images with only one color', function (done) { - var output = fixtures.path('output.unmodified-png-with-one-color.png'); - sharp(fixtures.inputPngWithOneColor) - .normalize() - .toFile(output, function(err, info) { - if (err) done(err); - fixtures.assertMaxColourDistance(output, fixtures.inputPngWithOneColor, 0); - done(); - }); - }); + it('works with 16-bit RGBA images', function(done) { + sharp(fixtures.inputPngWithTransparency16bit) + .normalize() + .raw() + .toBuffer(function (err, data, info) { + if (err) throw err; + assertNormalized(data); + done(); + }); + }); - } });