Skip to content

Commit

Permalink
Ensure extend op is sequential for multi-page TIFF #4069
Browse files Browse the repository at this point in the history
  • Loading branch information
lovell committed Apr 18, 2024
1 parent 52b9dc0 commit 397ee49
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 14 deletions.
3 changes: 3 additions & 0 deletions docs/changelog.md
Expand Up @@ -18,6 +18,9 @@ Requires libvips v8.15.2
* Expose `bilinear` resizing kernel (and interpolator).
[#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

* Upgrade to libvips v8.15.2 for upstream bug fixes.
Expand Down
1 change: 1 addition & 0 deletions src/pipeline.cc
Expand Up @@ -566,6 +566,7 @@ class PipelineWorker : public Napi::AsyncWorker {
std::vector<double> background;
std::tie(image, background) = sharp::ApplyAlpha(image, baton->extendBackground, shouldPremultiplyAlpha);

image = sharp::StaySequential(image, baton->input->access, nPages > 1);
image = nPages > 1
? sharp::EmbedMultiPage(image,
baton->extendLeft, baton->extendTop, baton->width, baton->height,
Expand Down
47 changes: 33 additions & 14 deletions test/unit/extend.js
Expand Up @@ -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) {
sharp(fixtures.inputPngWithTransparency16bit)
.resize(120)
Expand Down Expand Up @@ -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 () {
assert.throws(function () {
sharp().extend();
Expand Down

0 comments on commit 397ee49

Please sign in to comment.