Ensure extend op is sequential for multi-page TIFF #4069

This commit is contained in:
Lovell Fuller 2024-04-18 11:05:04 +01:00
parent 52b9dc0f63
commit 397ee492d9
3 changed files with 37 additions and 14 deletions

View File

@ -18,6 +18,9 @@ Requires libvips v8.15.2
* Expose `bilinear` resizing kernel (and interpolator). * Expose `bilinear` resizing kernel (and interpolator).
[#4061](https://github.com/lovell/sharp/issues/4061) [#4061](https://github.com/lovell/sharp/issues/4061)
* Ensure `extend` operation stays sequential for multi-page TIFF (regression in 0.32.0).
[#4069](https://github.com/lovell/sharp/issues/4069)
### v0.33.3 - 23rd March 2024 ### v0.33.3 - 23rd March 2024
* Upgrade to libvips v8.15.2 for upstream bug fixes. * Upgrade to libvips v8.15.2 for upstream bug fixes.

View File

@ -566,6 +566,7 @@ class PipelineWorker : public Napi::AsyncWorker {
std::vector<double> background; std::vector<double> background;
std::tie(image, background) = sharp::ApplyAlpha(image, baton->extendBackground, shouldPremultiplyAlpha); std::tie(image, background) = sharp::ApplyAlpha(image, baton->extendBackground, shouldPremultiplyAlpha);
image = sharp::StaySequential(image, baton->input->access, nPages > 1);
image = nPages > 1 image = nPages > 1
? sharp::EmbedMultiPage(image, ? sharp::EmbedMultiPage(image,
baton->extendLeft, baton->extendTop, baton->width, baton->height, baton->extendLeft, baton->extendTop, baton->width, baton->height,

View File

@ -73,20 +73,6 @@ describe('Extend', function () {
}); });
}); });
it('extend top with mirroring uses ordered read', async () => {
const data = await sharp(fixtures.inputJpg)
.extend({
extendWith: 'mirror',
top: 1
})
.png({ compressionLevel: 0 })
.toBuffer();
const { width, height } = await sharp(data).metadata();
assert.strictEqual(2725, width);
assert.strictEqual(2226, height);
});
it(`extend sides unequally with RGBA (${extendWith})`, function (done) { it(`extend sides unequally with RGBA (${extendWith})`, function (done) {
sharp(fixtures.inputPngWithTransparency16bit) sharp(fixtures.inputPngWithTransparency16bit)
.resize(120) .resize(120)
@ -127,6 +113,39 @@ describe('Extend', function () {
}); });
}); });
it('extend top with mirroring uses ordered read', async () => {
const data = await sharp(fixtures.inputJpg)
.extend({
extendWith: 'mirror',
top: 1
})
.png({ compressionLevel: 0 })
.toBuffer();
const { width, height } = await sharp(data).metadata();
assert.strictEqual(2725, width);
assert.strictEqual(2226, height);
});
it('multi-page extend uses ordered read', async () => {
const multiPageTiff = await sharp(fixtures.inputGifAnimated, { animated: true })
.resize({ width: 8, height: 48 })
.tiff()
.toBuffer();
const data = await sharp(multiPageTiff, { pages: -1 })
.extend({
background: 'red',
top: 1
})
.png({ compressionLevel: 0 })
.toBuffer();
const { width, height } = await sharp(data).metadata();
assert.strictEqual(8, width);
assert.strictEqual(1470, height);
});
it('missing parameter fails', function () { it('missing parameter fails', function () {
assert.throws(function () { assert.throws(function () {
sharp().extend(); sharp().extend();