diff --git a/src/pipeline.cc b/src/pipeline.cc index 4c35876d..a591f8c4 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -194,7 +194,7 @@ class PipelineWorker : public Napi::AsyncWorker { jpegShrinkOnLoad = 2; } // Skip shrink-on-load for known libjpeg rounding errors - if (jpegShrinkOnLoad > 1 && shrink == jpegShrinkOnLoad) { + if (jpegShrinkOnLoad > 1 && static_cast(shrink) == jpegShrinkOnLoad) { jpegShrinkOnLoad /= 2; } } else if (inputImageType == sharp::ImageType::WEBP || @@ -274,35 +274,28 @@ class PipelineWorker : public Napi::AsyncWorker { } // Any pre-shrinking may already have been done - int thumbWidth = image.width(); - int thumbHeight = image.height(); + inputWidth = image.width(); + inputHeight = image.height(); // After pre-shrink, but before the main shrink stage // Reuse the initial pageHeight if we didn't pre-shrink - int preshrunkPageHeight = shouldPreShrink ? sharp::GetPageHeight(image) : pageHeight; - - if (baton->fastShrinkOnLoad && jpegShrinkOnLoad > 1) { - // JPEG shrink-on-load rounds the output dimensions down, which - // may cause incorrect dimensions when fastShrinkOnLoad is enabled - // Just recalculate vshrink / hshrink on the main image instead of - // the pre-shrunk image when this is the case - hshrink = static_cast(thumbWidth) / (static_cast(inputWidth) / hshrink); - vshrink = static_cast(preshrunkPageHeight) / (static_cast(pageHeight) / vshrink); - } else { - // Shrink to preshrunkPageHeight, so we work for multi-page images - std::tie(hshrink, vshrink) = sharp::ResolveShrink( - thumbWidth, preshrunkPageHeight, targetResizeWidth, targetResizeHeight, - baton->canvas, swap, baton->withoutEnlargement); + if (shouldPreShrink) { + pageHeight = sharp::GetPageHeight(image); } - int targetHeight = static_cast(std::rint(static_cast(preshrunkPageHeight) / vshrink)); + // Shrink to pageHeight, so we work for multi-page images + std::tie(hshrink, vshrink) = sharp::ResolveShrink( + inputWidth, pageHeight, targetResizeWidth, targetResizeHeight, + baton->canvas, swap, baton->withoutEnlargement); + + int targetHeight = static_cast(std::rint(static_cast(pageHeight) / vshrink)); int targetPageHeight = targetHeight; // In toilet-roll mode, we must adjust vshrink so that we exactly hit - // preshrunkPageHeight or we'll have pixels straddling pixel boundaries - if (thumbHeight > preshrunkPageHeight) { + // pageHeight or we'll have pixels straddling pixel boundaries + if (inputHeight > pageHeight) { targetHeight *= nPages; - vshrink = static_cast(thumbHeight) / targetHeight; + vshrink = static_cast(inputHeight) / targetHeight; } // Ensure we're using a device-independent colour space diff --git a/test/fixtures/expected/fast-shrink-on-load-true.png b/test/fixtures/expected/fast-shrink-on-load-true.png index 5033da3a..feeb8e8b 100644 Binary files a/test/fixtures/expected/fast-shrink-on-load-true.png and b/test/fixtures/expected/fast-shrink-on-load-true.png differ diff --git a/test/fixtures/expected/icc-cmyk.jpg b/test/fixtures/expected/icc-cmyk.jpg index 66f1f599..4b7cf7d4 100644 Binary files a/test/fixtures/expected/icc-cmyk.jpg and b/test/fixtures/expected/icc-cmyk.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-center.jpg b/test/fixtures/expected/overlay-gravity-center.jpg index 8b65ebcf..709403e7 100644 Binary files a/test/fixtures/expected/overlay-gravity-center.jpg and b/test/fixtures/expected/overlay-gravity-center.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-centre.jpg b/test/fixtures/expected/overlay-gravity-centre.jpg index 8b65ebcf..709403e7 100644 Binary files a/test/fixtures/expected/overlay-gravity-centre.jpg and b/test/fixtures/expected/overlay-gravity-centre.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-east.jpg b/test/fixtures/expected/overlay-gravity-east.jpg index 756a82c1..81cb9a7f 100644 Binary files a/test/fixtures/expected/overlay-gravity-east.jpg and b/test/fixtures/expected/overlay-gravity-east.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-north.jpg b/test/fixtures/expected/overlay-gravity-north.jpg index b61fc837..fa5a9639 100644 Binary files a/test/fixtures/expected/overlay-gravity-north.jpg and b/test/fixtures/expected/overlay-gravity-north.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-northeast.jpg b/test/fixtures/expected/overlay-gravity-northeast.jpg index 9523792b..1be5a194 100644 Binary files a/test/fixtures/expected/overlay-gravity-northeast.jpg and b/test/fixtures/expected/overlay-gravity-northeast.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-northwest.jpg b/test/fixtures/expected/overlay-gravity-northwest.jpg index 030e0b12..acf26998 100644 Binary files a/test/fixtures/expected/overlay-gravity-northwest.jpg and b/test/fixtures/expected/overlay-gravity-northwest.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-south.jpg b/test/fixtures/expected/overlay-gravity-south.jpg index 96cd451d..bd885641 100644 Binary files a/test/fixtures/expected/overlay-gravity-south.jpg and b/test/fixtures/expected/overlay-gravity-south.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-southeast.jpg b/test/fixtures/expected/overlay-gravity-southeast.jpg index 852292d8..d46da3a0 100644 Binary files a/test/fixtures/expected/overlay-gravity-southeast.jpg and b/test/fixtures/expected/overlay-gravity-southeast.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-southwest.jpg b/test/fixtures/expected/overlay-gravity-southwest.jpg index 8876c9fd..755c128a 100644 Binary files a/test/fixtures/expected/overlay-gravity-southwest.jpg and b/test/fixtures/expected/overlay-gravity-southwest.jpg differ diff --git a/test/fixtures/expected/overlay-gravity-west.jpg b/test/fixtures/expected/overlay-gravity-west.jpg index 1495500c..4c422361 100644 Binary files a/test/fixtures/expected/overlay-gravity-west.jpg and b/test/fixtures/expected/overlay-gravity-west.jpg differ