diff --git a/docs/changelog.md b/docs/changelog.md index 29a69924..47680ad8 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,6 +2,12 @@ ### v0.13 - "*mind*" +#### v0.13.1 - TBD + +* Fix embedding onto transparent backgrounds; regression introduced in v0.13.0. + [#366](https://github.com/lovell/sharp/issues/366) + [@diegocsandrim](https://github.com/diegocsandrim) + #### v0.13.0 - 15th February 2016 * Improve vector image support by allowing control of density/DPI. diff --git a/src/pipeline.cc b/src/pipeline.cc index 336d0199..afb19299 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -585,9 +585,9 @@ class PipelineWorker : public AsyncWorker { } // Add non-transparent alpha channel, if required if (baton->background[3] < 255.0 && !HasAlpha(image)) { - VImage alpha = VImage::new_matrix(image.width(), image.height()) - .new_from_image(baton->background[3] * multiplier); - image = image.bandjoin(alpha); + image = image.bandjoin( + VImage::new_matrix(image.width(), image.height()).new_from_image(255 * multiplier) + ); } // Embed int left = static_cast(round((baton->width - image.width()) / 2)); diff --git a/test/fixtures/expected/embed-3-into-3.png b/test/fixtures/expected/embed-3-into-3.png new file mode 100644 index 00000000..057ab7d2 Binary files /dev/null and b/test/fixtures/expected/embed-3-into-3.png differ diff --git a/test/fixtures/expected/embed-3-into-4.webp b/test/fixtures/expected/embed-3-into-4.webp new file mode 100644 index 00000000..b054b9cc Binary files /dev/null and b/test/fixtures/expected/embed-3-into-4.webp differ diff --git a/test/fixtures/expected/embed-4-into-4.png b/test/fixtures/expected/embed-4-into-4.png new file mode 100644 index 00000000..79cf1802 Binary files /dev/null and b/test/fixtures/expected/embed-4-into-4.png differ diff --git a/test/unit/alpha.js b/test/unit/alpha.js index 51e65aa1..bc7114c7 100644 --- a/test/unit/alpha.js +++ b/test/unit/alpha.js @@ -60,14 +60,11 @@ describe('Alpha transparency', function() { it('Do not flatten', function(done) { sharp(fixtures.inputPngWithTransparency) .flatten(false) - .toBuffer(function(err, data) { + .toBuffer(function(err, data, info) { if (err) throw err; - sharp(data).metadata(function(err, metadata) { - if (err) throw err; - assert.strictEqual('png', metadata.format); - assert.strictEqual(4, metadata.channels); - done(); - }); + assert.strictEqual('png', info.format); + assert.strictEqual(4, info.channels); + done(); }); }); @@ -75,14 +72,11 @@ describe('Alpha transparency', function() { sharp(fixtures.inputJpg) .background('#ff0000') .flatten() - .toBuffer(function(err, data) { + .toBuffer(function(err, data, info) { if (err) throw err; - sharp(data).metadata(function(err, metadata) { - if (err) throw err; - assert.strictEqual('jpeg', metadata.format); - assert.strictEqual(3, metadata.channels); - done(); - }); + assert.strictEqual('jpeg', info.format); + assert.strictEqual(3, info.channels); + done(); }); }); diff --git a/test/unit/embed.js b/test/unit/embed.js index bc4032ea..c459eb3f 100644 --- a/test/unit/embed.js +++ b/test/unit/embed.js @@ -18,11 +18,8 @@ describe('Embed', function() { assert.strictEqual('png', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); - sharp(data).metadata(function(err, metadata) { - if (err) throw err; - assert.strictEqual(3, metadata.channels); - done(); - }); + assert.strictEqual(3, info.channels); + fixtures.assertSimilar(fixtures.expected('embed-3-into-3.png'), data, done); }); }); @@ -39,11 +36,8 @@ describe('Embed', function() { assert.strictEqual('webp', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); - sharp(data).metadata(function(err, metadata) { - if (err) throw err; - assert.strictEqual(4, metadata.channels); - done(); - }); + assert.strictEqual(4, info.channels); + fixtures.assertSimilar(fixtures.expected('embed-3-into-4.webp'), data, done); }); }); } @@ -58,11 +52,8 @@ describe('Embed', function() { assert.strictEqual('png', info.format); assert.strictEqual(50, info.width); assert.strictEqual(50, info.height); - sharp(data).metadata(function(err, metadata) { - if (err) throw err; - assert.strictEqual(4, metadata.channels); - done(); - }); + assert.strictEqual(4, info.channels); + fixtures.assertSimilar(fixtures.expected('embed-4-into-4.png'), data, done); }); }); @@ -76,6 +67,7 @@ describe('Embed', function() { assert.strictEqual('png', info.format); assert.strictEqual(32, info.width); assert.strictEqual(16, info.height); + assert.strictEqual(4, info.channels); fixtures.assertSimilar(fixtures.expected('embed-16bit.png'), data, done); }); }); @@ -91,6 +83,7 @@ describe('Embed', function() { assert.strictEqual('png', info.format); assert.strictEqual(32, info.width); assert.strictEqual(16, info.height); + assert.strictEqual(4, info.channels); fixtures.assertSimilar(fixtures.expected('embed-16bit-rgba.png'), data, done); }); }); @@ -105,6 +98,7 @@ describe('Embed', function() { assert.strictEqual('png', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); + assert.strictEqual(3, info.channels); fixtures.assertSimilar(fixtures.expected('embed-enlarge.png'), data, done); }); });