From ad9b91c6507f9e9270ab7624da3c043a7c86db40 Mon Sep 17 00:00:00 2001 From: Sjoerd Date: Sun, 23 Apr 2023 19:06:02 +0200 Subject: [PATCH] Fix: rotate resize param on multiples of 90 --- packages/plugin-rotate/src/index.js | 8 +++- packages/plugin-rotate/test/rotation.test.js | 41 ++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/packages/plugin-rotate/src/index.js b/packages/plugin-rotate/src/index.js index c638fce29..7f430bae1 100644 --- a/packages/plugin-rotate/src/index.js +++ b/packages/plugin-rotate/src/index.js @@ -231,8 +231,12 @@ export default () => ({ return throwError.call(this, "mode must be a boolean or a string", cb); } - if (Math.abs(deg % 90) === 0) { - // apply matrixRotate if the angle is a multiple of 90 degrees (eg: 180 or -90) + // use matrixRotate if the angle is a multiple of 90 degrees (eg: 180 or -90) and resize is allowed or not needed. + const matrixRotateAllowed = + deg % 90 === 0 && + (mode || this.bitmap.width === this.bitmap.height || deg % 180 === 0); + + if (matrixRotateAllowed) { matrixRotate.call(this, deg); } else { advancedRotate.call(this, deg, mode, cb); diff --git a/packages/plugin-rotate/test/rotation.test.js b/packages/plugin-rotate/test/rotation.test.js index c5f23527e..45ee8d2b9 100644 --- a/packages/plugin-rotate/test/rotation.test.js +++ b/packages/plugin-rotate/test/rotation.test.js @@ -567,3 +567,44 @@ describe("Rotate a non-square image", () => { ); }); }); + +describe("Rotate a non-square image without resizing", () => { + let imgSrc = null; + before((done) => { + jimp + .read(mkJGD("□□□□□□□□", "▹▹▹▹▹▹▹▹", "▿▿▿▿▿▿▿▿", "□□□□□□□□")) + .then((imgJimp) => { + imgSrc = imgJimp; + done(); + }) + .catch(done); + }); + + it("90 degrees", () => { + expectToBeJGD( + imgSrc.clone().rotate(90, false).getJGDSync(), + mkJGD(" □▹▿□ ", " □▹▿□ ", " □▹▿□ ", " □▹▿□ ") + ); + }); + + it("180 degrees", () => { + expectToBeJGD( + imgSrc.clone().rotate(180, false).getJGDSync(), + mkJGD("□□□□□□□□", "▿▿▿▿▿▿▿▿", "▹▹▹▹▹▹▹▹", "□□□□□□□□") + ); + }); + + it("270 degrees", () => { + expectToBeJGD( + imgSrc.clone().rotate(270, false).getJGDSync(), + mkJGD(" □▿▹□ ", " □▿▹□ ", " □▿▹□ ", " □▿▹□ ") + ); + }); + + it("45 degrees", () => { + expectToBeJGD( + imgSrc.clone().rotate(45, false).getJGDSync(), + mkJGD(" □▹▹▿□□ ", "□▹▹▿□□ ", "▹▹▿□□ ", "▹▿□□ ") + ); + }); +});