diff --git a/src/pipeline.cc b/src/pipeline.cc index 7acbd967..679c8329 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -669,7 +669,6 @@ class PipelineWorker : public Napi::AsyncWorker { sharp::ImageType compositeImageType = sharp::ImageType::UNKNOWN; composite->input->access = access; std::tie(compositeImage, compositeImageType) = sharp::OpenInput(composite->input); - compositeImage = sharp::EnsureColourspace(compositeImage, baton->colourspacePipeline); if (composite->input->autoOrient) { // Respect EXIF Orientation @@ -734,8 +733,7 @@ class PipelineWorker : public Napi::AsyncWorker { // gravity was used for extract_area, set it back to its default value of 0 composite->gravity = 0; } - // Ensure image to composite is sRGB with unpremultiplied alpha - compositeImage = compositeImage.colourspace(VIPS_INTERPRETATION_sRGB); + // Ensure image to composite is with unpremultiplied alpha compositeImage = sharp::EnsureAlpha(compositeImage, 1); if (composite->premultiplied) compositeImage = compositeImage.unpremultiply(); // Calculate position @@ -760,7 +758,12 @@ class PipelineWorker : public Napi::AsyncWorker { xs.push_back(left); ys.push_back(top); } - image = VImage::composite(images, modes, VImage::option()->set("x", xs)->set("y", ys)); + image = VImage::composite(images, modes, VImage::option() + ->set("compositing_space", baton->colourspacePipeline == VIPS_INTERPRETATION_LAST + ? VIPS_INTERPRETATION_sRGB + : baton->colourspacePipeline) + ->set("x", xs) + ->set("y", ys)); image = sharp::RemoveGifPalette(image); } diff --git a/test/fixtures/expected/composite-red-scrgb.png b/test/fixtures/expected/composite-red-scrgb.png new file mode 100644 index 00000000..fd2bdf94 Binary files /dev/null and b/test/fixtures/expected/composite-red-scrgb.png differ diff --git a/test/unit/composite.js b/test/unit/composite.js index 865ac598..d748d8f7 100644 --- a/test/unit/composite.js +++ b/test/unit/composite.js @@ -122,6 +122,26 @@ describe('composite', () => { }); }); + it('scrgb pipeline', () => { + const filename = 'composite-red-scrgb.png'; + const actual = fixtures.path(`output.${filename}`); + const expected = fixtures.expected(filename); + return sharp({ + create: { + width: 32, height: 32, channels: 4, background: red + } + }) + .pipelineColourspace('scrgb') + .composite([{ + input: fixtures.inputPngWithTransparency16bit, + blend: 'color-burn' + }]) + .toFile(actual) + .then(() => { + fixtures.assertMaxColourDistance(actual, expected); + }); + }); + it('multiple', async () => { const filename = 'composite-multiple.png'; const actual = fixtures.path(`output.${filename}`);