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);
});
});