Improve error for unsupported multi-page rotation #3940

This commit is contained in:
Lovell Fuller 2024-01-11 11:59:01 +00:00
parent 45e8071599
commit cbf68c1395
5 changed files with 34 additions and 0 deletions

View File

@ -18,6 +18,8 @@ The use of `rotate` without an angle will remove the EXIF `Orientation` tag, if
Only one rotation can occur per pipeline. Only one rotation can occur per pipeline.
Previous calls to `rotate` in the same pipeline will be ignored. Previous calls to `rotate` in the same pipeline will be ignored.
Multi-page images can only be rotated by 180 degrees.
Method order is important when rotating, resizing and/or extracting regions, Method order is important when rotating, resizing and/or extracting regions,
for example `.rotate(x).extract(y)` will produce a different result to `.extract(y).rotate(x)`. for example `.rotate(x).extract(y)` will produce a different result to `.extract(y).rotate(x)`.

View File

@ -13,6 +13,9 @@ Requires libvips v8.15.0
* Ensure `extend` operation stays sequential when copying (regression in 0.32.0). * Ensure `extend` operation stays sequential when copying (regression in 0.32.0).
[#3928](https://github.com/lovell/sharp/issues/3928) [#3928](https://github.com/lovell/sharp/issues/3928)
* Improve error handling for unsupported multi-page rotation.
[#3940](https://github.com/lovell/sharp/issues/3940)
### v0.33.1 - 17th December 2023 ### v0.33.1 - 17th December 2023
* Add support for Yarn Plug'n'Play filesystem layout. * Add support for Yarn Plug'n'Play filesystem layout.

View File

@ -24,6 +24,8 @@ const is = require('./is');
* Only one rotation can occur per pipeline. * Only one rotation can occur per pipeline.
* Previous calls to `rotate` in the same pipeline will be ignored. * Previous calls to `rotate` in the same pipeline will be ignored.
* *
* Multi-page images can only be rotated by 180 degrees.
*
* Method order is important when rotating, resizing and/or extracting regions, * Method order is important when rotating, resizing and/or extracting regions,
* for example `.rotate(x).extract(y)` will produce a different result to `.extract(y).rotate(x)`. * for example `.rotate(x).extract(y)` will produce a different result to `.extract(y).rotate(x)`.
* *

View File

@ -96,6 +96,9 @@ class PipelineWorker : public Napi::AsyncWorker {
baton->rotationAngle != 0.0); baton->rotationAngle != 0.0);
if (autoRotation != VIPS_ANGLE_D0) { if (autoRotation != VIPS_ANGLE_D0) {
if (autoRotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(autoRotation); image = image.rot(autoRotation);
autoRotation = VIPS_ANGLE_D0; autoRotation = VIPS_ANGLE_D0;
} }
@ -114,6 +117,9 @@ class PipelineWorker : public Napi::AsyncWorker {
baton->flop = FALSE; baton->flop = FALSE;
} }
if (rotation != VIPS_ANGLE_D0) { if (rotation != VIPS_ANGLE_D0) {
if (rotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(rotation); image = image.rot(rotation);
rotation = VIPS_ANGLE_D0; rotation = VIPS_ANGLE_D0;
} }
@ -397,6 +403,9 @@ class PipelineWorker : public Napi::AsyncWorker {
rotation != VIPS_ANGLE_D0); rotation != VIPS_ANGLE_D0);
// Auto-rotate post-extract // Auto-rotate post-extract
if (autoRotation != VIPS_ANGLE_D0) { if (autoRotation != VIPS_ANGLE_D0) {
if (autoRotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(autoRotation); image = image.rot(autoRotation);
} }
// Mirror vertically (up-down) about the x-axis // Mirror vertically (up-down) about the x-axis
@ -409,6 +418,9 @@ class PipelineWorker : public Napi::AsyncWorker {
} }
// Rotate post-extract 90-angle // Rotate post-extract 90-angle
if (rotation != VIPS_ANGLE_D0) { if (rotation != VIPS_ANGLE_D0) {
if (rotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(rotation); image = image.rot(rotation);
} }

View File

@ -353,6 +353,21 @@ describe('Rotation', function () {
) )
); );
it('Animated image rotate 180', () =>
assert.doesNotReject(() => sharp(fixtures.inputGifAnimated, { animated: true })
.rotate(180)
.toBuffer()
)
);
it('Animated image rotate non-180 rejects', () =>
assert.rejects(() => sharp(fixtures.inputGifAnimated, { animated: true })
.rotate(90)
.toBuffer(),
/Rotate is not supported for multi-page images/
)
);
it('Multiple rotate emits warning', () => { it('Multiple rotate emits warning', () => {
let warningMessage = ''; let warningMessage = '';
const s = sharp(); const s = sharp();