Ensure correct ordering of rotate-then-trim ops #2087

This commit is contained in:
Lovell Fuller 2020-02-23 16:59:22 +00:00
parent 409e5174bb
commit e9b21f2211
3 changed files with 40 additions and 1 deletions

View File

@ -14,6 +14,9 @@ Requires libvips v8.9.1
* Add support for 32-bit Windows. * Add support for 32-bit Windows.
[#2088](https://github.com/lovell/sharp/issues/2088) [#2088](https://github.com/lovell/sharp/issues/2088)
* Ensure correct ordering of rotate-then-trim operations.
[#2087](https://github.com/lovell/sharp/issues/2087)
## v0.24 - "*wit*" ## v0.24 - "*wit*"
Requires libvips v8.9.0. Requires libvips v8.9.0.

View File

@ -85,6 +85,13 @@ const mapFitToCanvas = {
outside: 'min' outside: 'min'
}; };
/**
* @private
*/
function isRotationExpected (options) {
return (options.angle % 360) !== 0 || options.useExifOrientation === true || options.rotationAngle !== 0;
}
/** /**
* Resize image to `width`, `height` or `width x height`. * Resize image to `width`, `height` or `width x height`.
* *
@ -367,7 +374,7 @@ function extract (options) {
} }
}, this); }, this);
// Ensure existing rotation occurs before pre-resize extraction // Ensure existing rotation occurs before pre-resize extraction
if (suffix === 'Pre' && ((this.options.angle % 360) !== 0 || this.options.useExifOrientation === true || this.options.rotationAngle !== 0)) { if (suffix === 'Pre' && isRotationExpected(this.options)) {
this.options.rotateBeforePreExtract = true; this.options.rotateBeforePreExtract = true;
} }
return this; return this;
@ -391,6 +398,9 @@ function trim (threshold) {
} else { } else {
throw is.invalidParameterError('threshold', 'number greater than zero', threshold); throw is.invalidParameterError('threshold', 'number greater than zero', threshold);
} }
if (this.options.trimThreshold && isRotationExpected(this.options)) {
this.options.rotateBeforePreExtract = true;
}
return this; return this;
} }

View File

@ -94,6 +94,32 @@ describe('Trim borders', function () {
.catch(done); .catch(done);
}); });
it('should rotate before trim', () =>
sharp({
create: {
width: 20,
height: 30,
channels: 3,
background: 'white'
}
})
.rotate(30)
.png()
.toBuffer()
.then(rotated30 =>
sharp(rotated30)
.rotate(-30)
.trim(128)
.toBuffer({ resolveWithObject: true })
.then(({ info }) => {
assert.strictEqual(20, info.width);
assert.strictEqual(31, info.height);
assert.strictEqual(-8, info.trimOffsetTop);
assert.strictEqual(-13, info.trimOffsetLeft);
})
)
);
describe('Invalid thresholds', function () { describe('Invalid thresholds', function () {
[-1, 'fail', {}].forEach(function (threshold) { [-1, 'fail', {}].forEach(function (threshold) {
it(JSON.stringify(threshold), function () { it(JSON.stringify(threshold), function () {