From 513fb40f40d0464931971ada333a36afc287fa7b Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Fri, 10 Dec 2021 21:32:04 +0100 Subject: [PATCH] Improve multi-frame image resizing (#2789) * Ports vips_thumbnail logic to sharp * Deprecates the pageHeight output option for WebP/GIF --- lib/output.js | 26 +- src/common.cc | 108 ++++- src/common.h | 26 +- src/metadata.cc | 2 - src/operations.cc | 94 ++++ src/operations.h | 12 + src/pipeline.cc | 430 +++++++++--------- src/pipeline.h | 14 +- test/fixtures/expected/clahe-11-25-14.jpg | Bin 28947 -> 28586 bytes .../expected/embed-animated-height.webp | Bin 0 -> 13246 bytes .../expected/embed-animated-width.webp | Bin 0 -> 13244 bytes .../expected/extend-equal-single.webp | Bin 0 -> 8200 bytes test/fixtures/expected/extract-lch.jpg | Bin 13411 -> 13434 bytes .../expected/gravity-center-height.webp | Bin 0 -> 6960 bytes .../expected/gravity-center-width.webp | Bin 0 -> 7782 bytes test/fixtures/expected/hilutite.jpg | Bin 433840 -> 433832 bytes test/fixtures/expected/icc-cmyk.jpg | Bin 966073 -> 966090 bytes .../fixtures/expected/resize-crop-extract.jpg | Bin 1390 -> 1429 bytes test/fixtures/expected/svg72.png | Bin 1887 -> 373 bytes test/fixtures/expected/tint-sepia.jpg | Bin 14545 -> 14556 bytes test/unit/avif.js | 7 +- test/unit/extend.js | 34 +- test/unit/extract.js | 27 +- test/unit/gif.js | 8 +- test/unit/metadata.js | 45 +- test/unit/resize-contain.js | 36 ++ test/unit/resize-cover.js | 24 + test/unit/svg.js | 21 + test/unit/webp.js | 39 +- 29 files changed, 619 insertions(+), 334 deletions(-) create mode 100644 test/fixtures/expected/embed-animated-height.webp create mode 100644 test/fixtures/expected/embed-animated-width.webp create mode 100644 test/fixtures/expected/extend-equal-single.webp create mode 100644 test/fixtures/expected/gravity-center-height.webp create mode 100644 test/fixtures/expected/gravity-center-width.webp diff --git a/lib/output.js b/lib/output.js index 0c28d195..620c61cb 100644 --- a/lib/output.js +++ b/lib/output.js @@ -458,9 +458,8 @@ function png (options) { * @param {boolean} [options.nearLossless=false] - use near_lossless compression mode * @param {boolean} [options.smartSubsample=false] - use high quality chroma subsampling * @param {number} [options.effort=4] - CPU effort, between 0 (fastest) and 6 (slowest) - * @param {number} [options.pageHeight] - page height for animated output * @param {number} [options.loop=0] - number of animation iterations, use 0 for infinite animation - * @param {number[]} [options.delay] - list of delays between animation frames (in milliseconds) + * @param {number|number[]} [options.delay] - delay(s) between animation frames (in milliseconds) * @param {boolean} [options.force=true] - force WebP output, otherwise attempt to use input format * @returns {Sharp} * @throws {Error} Invalid options @@ -527,10 +526,7 @@ function webp (options) { * width: 128, * height: 128 * pages * }) - * .gif({ - * pageHeight: 128, - * dither: 0 - * }) + * .gif({ dither: 0 }) * .toBuffer(); * * @param {Object} [options] - output options @@ -538,9 +534,8 @@ function webp (options) { * @param {number} [options.colors=256] - alternative spelling of `options.colours` * @param {number} [options.effort=7] - CPU effort, between 1 (fastest) and 10 (slowest) * @param {number} [options.dither=1.0] - level of Floyd-Steinberg error diffusion, between 0 (least) and 1 (most) - * @param {number} [options.pageHeight] - page height for animated output * @param {number} [options.loop=0] - number of animation iterations, use 0 for infinite animation - * @param {number[]} [options.delay] - list of delays between animation frames (in milliseconds) + * @param {number|number[]} [options.delay] - delay(s) between animation frames (in milliseconds) * @param {boolean} [options.force=true] - force GIF output, otherwise attempt to use input format * @returns {Sharp} * @throws {Error} Invalid options @@ -657,20 +652,12 @@ function jp2 (options) { * @private * * @param {Object} [source] - output options - * @param {number} [source.pageHeight] - page height for animated output * @param {number} [source.loop=0] - number of animation iterations, use 0 for infinite animation * @param {number[]} [source.delay] - list of delays between animation frames (in milliseconds) * @param {Object} [target] - target object for valid options * @throws {Error} Invalid options */ function trySetAnimationOptions (source, target) { - if (is.object(source) && is.defined(source.pageHeight)) { - if (is.integer(source.pageHeight) && source.pageHeight > 0) { - target.pageHeight = source.pageHeight; - } else { - throw is.invalidParameterError('pageHeight', 'integer larger than 0', source.pageHeight); - } - } if (is.object(source) && is.defined(source.loop)) { if (is.integer(source.loop) && is.inRange(source.loop, 0, 65535)) { target.loop = source.loop; @@ -679,13 +666,16 @@ function trySetAnimationOptions (source, target) { } } if (is.object(source) && is.defined(source.delay)) { - if ( + // We allow singular values as well + if (is.integer(source.delay) && is.inRange(source.delay, 0, 65535)) { + target.delay = [source.delay]; + } else if ( Array.isArray(source.delay) && source.delay.every(is.integer) && source.delay.every(v => is.inRange(v, 0, 65535))) { target.delay = source.delay; } else { - throw is.invalidParameterError('delay', 'array of integers between 0 and 65535', source.delay); + throw is.invalidParameterError('delay', 'integer or an array of integers between 0 and 65535', source.delay); } } } diff --git a/src/common.cc b/src/common.cc index b8d66ac1..e88b89bd 100644 --- a/src/common.cc +++ b/src/common.cc @@ -490,30 +490,24 @@ namespace sharp { /* Set animation properties if necessary. - Non-provided properties will be loaded from image. */ - VImage SetAnimationProperties(VImage image, int pageHeight, std::vector delay, int loop) { - bool hasDelay = delay.size() != 1 || delay.front() != -1; + VImage SetAnimationProperties(VImage image, int nPages, int pageHeight, std::vector delay, int loop) { + bool hasDelay = !delay.empty(); - if (pageHeight == 0 && image.get_typeof(VIPS_META_PAGE_HEIGHT) == G_TYPE_INT) { - pageHeight = image.get_int(VIPS_META_PAGE_HEIGHT); + // Avoid a copy if none of the animation properties are needed. + if (nPages == 1 && !hasDelay && loop == -1) return image; + + if (delay.size() == 1) { + // We have just one delay, repeat that value for all frames. + delay.insert(delay.end(), nPages - 1, delay[0]); } - if (!hasDelay && image.get_typeof("delay") == VIPS_TYPE_ARRAY_INT) { - delay = image.get_array_int("delay"); - hasDelay = true; - } - - if (loop == -1 && image.get_typeof("loop") == G_TYPE_INT) { - loop = image.get_int("loop"); - } - - if (pageHeight == 0) return image; - - // It is necessary to create the copy as otherwise, pageHeight will be ignored! + // Attaching metadata, need to copy the image. VImage copy = image.copy(); - copy.set(VIPS_META_PAGE_HEIGHT, pageHeight); + // Only set page-height if we have more than one page, or this could + // accidentally turn into an animated image later. + if (nPages > 1) copy.set(VIPS_META_PAGE_HEIGHT, pageHeight); if (hasDelay) copy.set("delay", delay); if (loop != -1) copy.set("loop", loop); @@ -556,6 +550,14 @@ namespace sharp { return copy; } + /* + Multi-page images can have a page height. Fetch it, and sanity check it. + If page-height is not set, it defaults to the image height + */ + int GetPageHeight(VImage image) { + return vips_image_get_page_height(image.get_image()); + } + /* Check the proposed format supports the current dimensions. */ @@ -882,4 +884,74 @@ namespace sharp { return image; } + std::pair ResolveShrink(int width, int height, int targetWidth, int targetHeight, + Canvas canvas, bool swap, bool withoutEnlargement) { + if (swap) { + // Swap input width and height when requested. + std::swap(width, height); + } + + double hshrink = 1.0; + double vshrink = 1.0; + + if (targetWidth > 0 && targetHeight > 0) { + // Fixed width and height + hshrink = static_cast(width) / targetWidth; + vshrink = static_cast(height) / targetHeight; + + switch (canvas) { + case Canvas::CROP: + case Canvas::MIN: + if (hshrink < vshrink) { + vshrink = hshrink; + } else { + hshrink = vshrink; + } + break; + case Canvas::EMBED: + case Canvas::MAX: + if (hshrink > vshrink) { + vshrink = hshrink; + } else { + hshrink = vshrink; + } + break; + case Canvas::IGNORE_ASPECT: + if (swap) { + std::swap(hshrink, vshrink); + } + break; + } + } else if (targetWidth > 0) { + // Fixed width + hshrink = static_cast(width) / targetWidth; + + if (canvas != Canvas::IGNORE_ASPECT) { + // Auto height + vshrink = hshrink; + } + } else if (targetHeight > 0) { + // Fixed height + vshrink = static_cast(height) / targetHeight; + + if (canvas != Canvas::IGNORE_ASPECT) { + // Auto width + hshrink = vshrink; + } + } + + // We should not enlarge (oversample) the output image, + // if withoutEnlargement is specified. + if (withoutEnlargement) { + hshrink = std::max(1.0, hshrink); + vshrink = std::max(1.0, vshrink); + } + + // We don't want to shrink so much that we send an axis to 0 + hshrink = std::min(hshrink, static_cast(width)); + vshrink = std::min(vshrink, static_cast(height)); + + return std::make_pair(hshrink, vshrink); + } + } // namespace sharp diff --git a/src/common.h b/src/common.h index 642c5048..f94bb13c 100644 --- a/src/common.h +++ b/src/common.h @@ -135,6 +135,14 @@ namespace sharp { MISSING }; + enum class Canvas { + CROP, + EMBED, + MAX, + MIN, + IGNORE_ASPECT + }; + // How many tasks are in the queue? extern volatile int counterQueue; @@ -208,9 +216,8 @@ namespace sharp { /* Set animation properties if necessary. - Non-provided properties will be loaded from image. */ - VImage SetAnimationProperties(VImage image, int pageHeight, std::vector delay, int loop); + VImage SetAnimationProperties(VImage image, int nPages, int pageHeight, std::vector delay, int loop); /* Remove animation properties from image. @@ -232,6 +239,12 @@ namespace sharp { */ VImage SetDensity(VImage image, const double density); + /* + Multi-page images can have a page height. Fetch it, and sanity check it. + If page-height is not set, it defaults to the image height + */ + int GetPageHeight(VImage image); + /* Check the proposed format supports the current dimensions. */ @@ -325,6 +338,15 @@ namespace sharp { */ VImage EnsureAlpha(VImage image, double const value); + /* + Calculate the shrink factor, taking into account auto-rotate, the canvas + mode, and so on. The hshrink/vshrink are the amount to shrink the input + image axes by in order for the output axes (ie. after rotation) to match + the required thumbnail width/height and canvas mode. + */ + std::pair ResolveShrink(int width, int height, int targetWidth, int targetHeight, + Canvas canvas, bool swap, bool withoutEnlargement); + } // namespace sharp #endif // SRC_COMMON_H_ diff --git a/src/metadata.cc b/src/metadata.cc index 219ea589..9143b594 100644 --- a/src/metadata.cc +++ b/src/metadata.cc @@ -180,8 +180,6 @@ class MetadataWorker : public Napi::AsyncWorker { } if (baton->pageHeight > 0) { info.Set("pageHeight", baton->pageHeight); - } else if (baton->pages > 0) { - info.Set("pageHeight", baton->height); } if (baton->loop >= 0) { info.Set("loop", baton->loop); diff --git a/src/operations.cc b/src/operations.cc index b58325c9..3a3566e0 100644 --- a/src/operations.cc +++ b/src/operations.cc @@ -308,4 +308,98 @@ namespace sharp { return image; } + /* + * Split and crop each frame, reassemble, and update pageHeight. + */ + VImage CropMultiPage(VImage image, int left, int top, int width, int height, + int nPages, int *pageHeight) { + if (top == 0 && height == *pageHeight) { + // Fast path; no need to adjust the height of the multi-page image + return image.extract_area(left, 0, width, image.height()); + } else { + std::vector pages; + pages.reserve(nPages); + + // Split the image into cropped frames + for (int i = 0; i < nPages; i++) { + pages.push_back( + image.extract_area(left, *pageHeight * i + top, width, height)); + } + + // Reassemble the frames into a tall, thin image + VImage assembled = VImage::arrayjoin(pages, + VImage::option()->set("across", 1)); + + // Update the page height + *pageHeight = height; + + return assembled; + } + } + + /* + * Split into frames, embed each frame, reassemble, and update pageHeight. + */ + VImage EmbedMultiPage(VImage image, int left, int top, int width, int height, + std::vector background, int nPages, int *pageHeight) { + if (top == 0 && height == *pageHeight) { + // Fast path; no need to adjust the height of the multi-page image + return image.embed(left, 0, width, image.height(), VImage::option() + ->set("extend", VIPS_EXTEND_BACKGROUND) + ->set("background", background)); + } else if (left == 0 && width == image.width()) { + // Fast path; no need to adjust the width of the multi-page image + std::vector pages; + pages.reserve(nPages); + + // Rearrange the tall image into a vertical grid + image = image.grid(*pageHeight, nPages, 1); + + // Do the embed on the wide image + image = image.embed(0, top, image.width(), height, VImage::option() + ->set("extend", VIPS_EXTEND_BACKGROUND) + ->set("background", background)); + + // Split the wide image into frames + for (int i = 0; i < nPages; i++) { + pages.push_back( + image.extract_area(width * i, 0, width, height)); + } + + // Reassemble the frames into a tall, thin image + VImage assembled = VImage::arrayjoin(pages, + VImage::option()->set("across", 1)); + + // Update the page height + *pageHeight = height; + + return assembled; + } else { + std::vector pages; + pages.reserve(nPages); + + // Split the image into frames + for (int i = 0; i < nPages; i++) { + pages.push_back( + image.extract_area(0, *pageHeight * i, image.width(), *pageHeight)); + } + + // Embed each frame in the target size + for (int i = 0; i < nPages; i++) { + pages[i] = pages[i].embed(left, top, width, height, VImage::option() + ->set("extend", VIPS_EXTEND_BACKGROUND) + ->set("background", background)); + } + + // Reassemble the frames into a tall, thin image + VImage assembled = VImage::arrayjoin(pages, + VImage::option()->set("across", 1)); + + // Update the page height + *pageHeight = height; + + return assembled; + } + } + } // namespace sharp diff --git a/src/operations.h b/src/operations.h index 13270437..6d1f1ca3 100644 --- a/src/operations.h +++ b/src/operations.h @@ -108,6 +108,18 @@ namespace sharp { */ VImage EnsureColourspace(VImage image, VipsInterpretation colourspace); + /* + * Split and crop each frame, reassemble, and update pageHeight. + */ + VImage CropMultiPage(VImage image, int left, int top, int width, int height, + int nPages, int *pageHeight); + + /* + * Split into frames, embed each frame, reassemble, and update pageHeight. + */ + VImage EmbedMultiPage(VImage image, int left, int top, int width, int height, + std::vector background, int nPages, int *pageHeight); + } // namespace sharp #endif // SRC_OPERATIONS_H_ diff --git a/src/pipeline.cc b/src/pipeline.cc index 74a8b148..a6a041a0 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -69,6 +69,15 @@ class PipelineWorker : public Napi::AsyncWorker { std::tie(image, inputImageType) = sharp::OpenInput(baton->input); image = sharp::EnsureColourspace(image, baton->colourspaceInput); + int nPages = baton->input->pages; + if (nPages == -1) { + // Resolve the number of pages if we need to render until the end of the document + nPages = image.get_typeof(VIPS_META_N_PAGES) != 0 ? image.get_int(VIPS_META_N_PAGES) : 1; + } + + // Get pre-resize page height + int pageHeight = sharp::GetPageHeight(image); + // Calculate angle of rotation VipsAngle rotation; if (baton->useExifOrientation) { @@ -104,194 +113,171 @@ class PipelineWorker : public Napi::AsyncWorker { // Pre extraction if (baton->topOffsetPre != -1) { - image = image.extract_area(baton->leftOffsetPre, baton->topOffsetPre, baton->widthPre, baton->heightPre); + image = nPages > 1 + ? sharp::CropMultiPage(image, + baton->leftOffsetPre, baton->topOffsetPre, baton->widthPre, baton->heightPre, nPages, &pageHeight) + : image.extract_area(baton->leftOffsetPre, baton->topOffsetPre, baton->widthPre, baton->heightPre); } // Get pre-resize image width and height int inputWidth = image.width(); int inputHeight = image.height(); - if (!baton->rotateBeforePreExtract && - (rotation == VIPS_ANGLE_D90 || rotation == VIPS_ANGLE_D270)) { - // Swap input output width and height when rotating by 90 or 270 degrees - std::swap(inputWidth, inputHeight); - } - // If withoutEnlargement is specified, - // Override target width and height if exceeds respective value from input file - if (baton->withoutEnlargement) { - if (baton->width > inputWidth) { - baton->width = inputWidth; - } - if (baton->height > inputHeight) { - baton->height = inputHeight; - } + // Is there just one page? Shrink to inputHeight instead + if (nPages == 1) { + pageHeight = inputHeight; } // Scaling calculations - double xfactor = 1.0; - double yfactor = 1.0; + double hshrink; + double vshrink; int targetResizeWidth = baton->width; int targetResizeHeight = baton->height; - if (baton->width > 0 && baton->height > 0) { - // Fixed width and height - xfactor = static_cast(inputWidth) / static_cast(baton->width); - yfactor = static_cast(inputHeight) / static_cast(baton->height); - switch (baton->canvas) { - case Canvas::CROP: - if (xfactor < yfactor) { - targetResizeHeight = static_cast(round(static_cast(inputHeight) / xfactor)); - yfactor = xfactor; - } else { - targetResizeWidth = static_cast(round(static_cast(inputWidth) / yfactor)); - xfactor = yfactor; - } - break; - case Canvas::EMBED: - if (xfactor > yfactor) { - targetResizeHeight = static_cast(round(static_cast(inputHeight) / xfactor)); - yfactor = xfactor; - } else { - targetResizeWidth = static_cast(round(static_cast(inputWidth) / yfactor)); - xfactor = yfactor; - } - break; - case Canvas::MAX: - if (xfactor > yfactor) { - targetResizeHeight = baton->height = static_cast(round(static_cast(inputHeight) / xfactor)); - yfactor = xfactor; - } else { - targetResizeWidth = baton->width = static_cast(round(static_cast(inputWidth) / yfactor)); - xfactor = yfactor; - } - break; - case Canvas::MIN: - if (xfactor < yfactor) { - targetResizeHeight = baton->height = static_cast(round(static_cast(inputHeight) / xfactor)); - yfactor = xfactor; - } else { - targetResizeWidth = baton->width = static_cast(round(static_cast(inputWidth) / yfactor)); - xfactor = yfactor; - } - break; - case Canvas::IGNORE_ASPECT: - if (!baton->rotateBeforePreExtract && - (rotation == VIPS_ANGLE_D90 || rotation == VIPS_ANGLE_D270)) { - std::swap(xfactor, yfactor); - } - break; - } - } else if (baton->width > 0) { - // Fixed width - xfactor = static_cast(inputWidth) / static_cast(baton->width); - if (baton->canvas == Canvas::IGNORE_ASPECT) { - targetResizeHeight = baton->height = inputHeight; - } else { - // Auto height - yfactor = xfactor; - targetResizeHeight = baton->height = static_cast(round(static_cast(inputHeight) / yfactor)); - } - } else if (baton->height > 0) { - // Fixed height - yfactor = static_cast(inputHeight) / static_cast(baton->height); - if (baton->canvas == Canvas::IGNORE_ASPECT) { - targetResizeWidth = baton->width = inputWidth; - } else { - // Auto width - xfactor = yfactor; - targetResizeWidth = baton->width = static_cast(round(static_cast(inputWidth) / xfactor)); - } - } else { - // Identity transform - baton->width = inputWidth; - baton->height = inputHeight; - } - // Calculate integral box shrink - int xshrink = std::max(1, static_cast(floor(xfactor))); - int yshrink = std::max(1, static_cast(floor(yfactor))); + // Swap input output width and height when rotating by 90 or 270 degrees + bool swap = !baton->rotateBeforePreExtract && (rotation == VIPS_ANGLE_D90 || rotation == VIPS_ANGLE_D270); - // Calculate residual float affine transformation - double xresidual = static_cast(xshrink) / xfactor; - double yresidual = static_cast(yshrink) / yfactor; + // 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); - // If integral x and y shrink are equal, try to use shrink-on-load for JPEG and WebP, - // but not when applying gamma correction, pre-resize extract, trim or input colourspace - int shrink_on_load = 1; + // The jpeg preload shrink. + int jpegShrinkOnLoad = 1; - int shrink_on_load_factor = 1; - // Leave at least a factor of two for the final resize step, when fastShrinkOnLoad: false - // for more consistent results and avoid occasional small image shifting - if (!baton->fastShrinkOnLoad) { - shrink_on_load_factor = 2; - } - if ( - xshrink == yshrink && xshrink >= 2 * shrink_on_load_factor && - (inputImageType == sharp::ImageType::JPEG || inputImageType == sharp::ImageType::WEBP) && + // WebP, PDF, SVG scale + double scale = 1.0; + + // Try to reload input using shrink-on-load for JPEG, WebP, SVG and PDF, when: + // - the width or height parameters are specified; + // - gamma correction doesn't need to be applied; + // - trimming or pre-resize extract isn't required; + // - input colourspace is not specified; + bool const shouldPreShrink = (targetResizeWidth > 0 || targetResizeHeight > 0) && baton->gamma == 0 && baton->topOffsetPre == -1 && baton->trimThreshold == 0.0 && - baton->colourspaceInput == VIPS_INTERPRETATION_LAST && - image.width() > 3 && image.height() > 3 && baton->input->pages == 1 - ) { - if (xshrink >= 8 * shrink_on_load_factor) { - xfactor = xfactor / 8; - yfactor = yfactor / 8; - shrink_on_load = 8; - } else if (xshrink >= 4 * shrink_on_load_factor) { - xfactor = xfactor / 4; - yfactor = yfactor / 4; - shrink_on_load = 4; - } else if (xshrink >= 2 * shrink_on_load_factor) { - xfactor = xfactor / 2; - yfactor = yfactor / 2; - shrink_on_load = 2; + baton->colourspaceInput == VIPS_INTERPRETATION_LAST; + + if (shouldPreShrink) { + // The common part of the shrink: the bit by which both axes must be shrunk + double shrink = std::min(hshrink, vshrink); + + if (inputImageType == sharp::ImageType::JPEG) { + // Leave at least a factor of two for the final resize step, when fastShrinkOnLoad: false + // for more consistent results and avoid occasional small image shifting + int factor = baton->fastShrinkOnLoad ? 1 : 2; + if (shrink >= 8 * factor) { + jpegShrinkOnLoad = 8; + } else if (shrink >= 4 * factor) { + jpegShrinkOnLoad = 4; + } else if (shrink >= 2 * factor) { + jpegShrinkOnLoad = 2; + } + } else if (inputImageType == sharp::ImageType::WEBP || + inputImageType == sharp::ImageType::SVG || + inputImageType == sharp::ImageType::PDF) { + scale = 1.0 / shrink; } } - // Help ensure a final kernel-based reduction to prevent shrink aliasing - if (shrink_on_load > 1 && (xresidual == 1.0 || yresidual == 1.0)) { - shrink_on_load = shrink_on_load / 2; - xfactor = xfactor * 2; - yfactor = yfactor * 2; - } - if (shrink_on_load > 1) { - // Reload input using shrink-on-load + + // Reload input using shrink-on-load, it'll be an integer shrink + // factor for jpegload*, a double scale factor for webpload*, + // pdfload* and svgload* + if (jpegShrinkOnLoad > 1) { vips::VOption *option = VImage::option() ->set("access", baton->input->access) - ->set("shrink", shrink_on_load) + ->set("shrink", jpegShrinkOnLoad) ->set("fail", baton->input->failOnError); if (baton->input->buffer != nullptr) { + // Reload JPEG buffer VipsBlob *blob = vips_blob_new(nullptr, baton->input->buffer, baton->input->bufferLength); - if (inputImageType == sharp::ImageType::JPEG) { - // Reload JPEG buffer - image = VImage::jpegload_buffer(blob, option); - } else { - // Reload WebP buffer - image = VImage::webpload_buffer(blob, option); - } + image = VImage::jpegload_buffer(blob, option); vips_area_unref(reinterpret_cast(blob)); } else { - if (inputImageType == sharp::ImageType::JPEG) { - // Reload JPEG file - image = VImage::jpegload(const_cast(baton->input->file.data()), option); + // Reload JPEG file + image = VImage::jpegload(const_cast(baton->input->file.data()), option); + } + } else if (scale != 1.0) { + vips::VOption *option = VImage::option() + ->set("access", baton->input->access) + ->set("scale", scale) + ->set("fail", baton->input->failOnError); + if (inputImageType == sharp::ImageType::WEBP) { + option->set("n", baton->input->pages); + option->set("page", baton->input->page); + + if (baton->input->buffer != nullptr) { + // Reload WebP buffer + VipsBlob *blob = vips_blob_new(nullptr, baton->input->buffer, baton->input->bufferLength); + image = VImage::webpload_buffer(blob, option); + vips_area_unref(reinterpret_cast(blob)); } else { // Reload WebP file image = VImage::webpload(const_cast(baton->input->file.data()), option); } - } - // Recalculate integral shrink and double residual - int const shrunkOnLoadWidth = image.width(); - int const shrunkOnLoadHeight = image.height(); - if (!baton->rotateBeforePreExtract && - (rotation == VIPS_ANGLE_D90 || rotation == VIPS_ANGLE_D270)) { - // Swap when rotating by 90 or 270 degrees - xfactor = static_cast(shrunkOnLoadWidth) / static_cast(targetResizeHeight); - yfactor = static_cast(shrunkOnLoadHeight) / static_cast(targetResizeWidth); - } else { - xfactor = static_cast(shrunkOnLoadWidth) / static_cast(targetResizeWidth); - yfactor = static_cast(shrunkOnLoadHeight) / static_cast(targetResizeHeight); + } else if (inputImageType == sharp::ImageType::SVG) { + option->set("unlimited", baton->input->unlimited); + option->set("dpi", baton->input->density); + + if (baton->input->buffer != nullptr) { + // Reload SVG buffer + VipsBlob *blob = vips_blob_new(nullptr, baton->input->buffer, baton->input->bufferLength); + image = VImage::svgload_buffer(blob, option); + vips_area_unref(reinterpret_cast(blob)); + } else { + // Reload SVG file + image = VImage::svgload(const_cast(baton->input->file.data()), option); + } + + sharp::SetDensity(image, baton->input->density); + } else if (inputImageType == sharp::ImageType::PDF) { + option->set("n", baton->input->pages); + option->set("page", baton->input->page); + option->set("dpi", baton->input->density); + + if (baton->input->buffer != nullptr) { + // Reload PDF buffer + VipsBlob *blob = vips_blob_new(nullptr, baton->input->buffer, baton->input->bufferLength); + image = VImage::pdfload_buffer(blob, option); + vips_area_unref(reinterpret_cast(blob)); + } else { + // Reload PDF file + image = VImage::pdfload(const_cast(baton->input->file.data()), option); + } + + sharp::SetDensity(image, baton->input->density); } } - // Remove animation properties from single page images - if (baton->input->pages == 1) { - image = sharp::RemoveAnimationProperties(image); + + // Any pre-shrinking may already have been done + int thumbWidth = image.width(); + int thumbHeight = 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); + } + + int targetHeight = static_cast(std::rint(static_cast(preshrunkPageHeight) / 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) { + targetHeight *= nPages; + vshrink = static_cast(thumbHeight) / targetHeight; } // Ensure we're using a device-independent colour space @@ -345,7 +331,7 @@ class PipelineWorker : public Napi::AsyncWorker { image = image.colourspace(VIPS_INTERPRETATION_B_W); } - bool const shouldResize = xfactor != 1.0 || yfactor != 1.0; + bool const shouldResize = hshrink != 1.0 || vshrink != 1.0; bool const shouldBlur = baton->blurSigma != 0.0; bool const shouldConv = baton->convKernelWidth * baton->convKernelHeight > 0; bool const shouldSharpen = baton->sharpenSigma != 0.0; @@ -379,21 +365,8 @@ class PipelineWorker : public Napi::AsyncWorker { ) { throw vips::VError("Unknown kernel"); } - // Ensure shortest edge is at least 1 pixel - if (image.width() / xfactor < 0.5) { - xfactor = 2 * image.width(); - if (baton->canvas != Canvas::EMBED) { - baton->width = 1; - } - } - if (image.height() / yfactor < 0.5) { - yfactor = 2 * image.height(); - if (baton->canvas != Canvas::EMBED) { - baton->height = 1; - } - } - image = image.resize(1.0 / xfactor, VImage::option() - ->set("vscale", 1.0 / yfactor) + image = image.resize(1.0 / hshrink, VImage::option() + ->set("vscale", 1.0 / vshrink) ->set("kernel", kernel)); } @@ -429,52 +402,67 @@ class PipelineWorker : public Napi::AsyncWorker { image = image.copy(VImage::option()->set("interpretation", baton->colourspace)); } + inputWidth = image.width(); + inputHeight = nPages > 1 ? targetPageHeight : image.height(); + + // Resolve dimensions + if (baton->width <= 0) { + baton->width = inputWidth; + } + if (baton->height <= 0) { + baton->height = inputHeight; + } + // Crop/embed - if (image.width() != baton->width || image.height() != baton->height) { - if (baton->canvas == Canvas::EMBED) { + if (inputWidth != baton->width || inputHeight != baton->height) { + if (baton->canvas == sharp::Canvas::EMBED) { std::vector background; std::tie(image, background) = sharp::ApplyAlpha(image, baton->resizeBackground, shouldPremultiplyAlpha); // Embed - // Calculate where to position the embeded image if gravity specified, else center. + // Calculate where to position the embedded image if gravity specified, else center. int left; int top; - left = static_cast(round((baton->width - image.width()) / 2)); - top = static_cast(round((baton->height - image.height()) / 2)); + left = static_cast(round((baton->width - inputWidth) / 2)); + top = static_cast(round((baton->height - inputHeight) / 2)); - int width = std::max(image.width(), baton->width); - int height = std::max(image.height(), baton->height); + int width = std::max(inputWidth, baton->width); + int height = std::max(inputHeight, baton->height); std::tie(left, top) = sharp::CalculateEmbedPosition( - image.width(), image.height(), baton->width, baton->height, baton->position); + inputWidth, inputHeight, baton->width, baton->height, baton->position); - image = image.embed(left, top, width, height, VImage::option() - ->set("extend", VIPS_EXTEND_BACKGROUND) - ->set("background", background)); + image = nPages > 1 + ? sharp::EmbedMultiPage(image, + left, top, width, height, background, nPages, &targetPageHeight) + : image.embed(left, top, width, height, VImage::option() + ->set("extend", VIPS_EXTEND_BACKGROUND) + ->set("background", background)); + } else if (baton->canvas == sharp::Canvas::CROP) { + if (baton->width > inputWidth) { + baton->width = inputWidth; + } + if (baton->height > inputHeight) { + baton->height = inputHeight; + } - } else if ( - baton->canvas != Canvas::IGNORE_ASPECT && - (image.width() > baton->width || image.height() > baton->height) - ) { - // Crop/max/min + // Crop if (baton->position < 9) { // Gravity-based crop int left; int top; std::tie(left, top) = sharp::CalculateCrop( - image.width(), image.height(), baton->width, baton->height, baton->position); - int width = std::min(image.width(), baton->width); - int height = std::min(image.height(), baton->height); - image = image.extract_area(left, top, width, height); - } else { + inputWidth, inputHeight, baton->width, baton->height, baton->position); + int width = std::min(inputWidth, baton->width); + int height = std::min(inputHeight, baton->height); + + image = nPages > 1 + ? sharp::CropMultiPage(image, + left, top, width, height, nPages, &targetPageHeight) + : image.extract_area(left, top, width, height); + } else if (nPages == 1) { // Skip smart crop for multi-page images // Attention-based or Entropy-based crop - if (baton->width > image.width()) { - baton->width = image.width(); - } - if (baton->height > image.height()) { - baton->height = image.height(); - } image = image.tilecache(VImage::option() ->set("access", VIPS_ACCESS_RANDOM) ->set("threaded", TRUE)); @@ -496,8 +484,17 @@ class PipelineWorker : public Napi::AsyncWorker { // Post extraction if (baton->topOffsetPost != -1) { - image = image.extract_area( - baton->leftOffsetPost, baton->topOffsetPost, baton->widthPost, baton->heightPost); + if (nPages > 1) { + image = sharp::CropMultiPage(image, + baton->leftOffsetPost, baton->topOffsetPost, baton->widthPost, baton->heightPost, + nPages, &targetPageHeight); + + // heightPost is used in the info object, so update to reflect the number of pages + baton->heightPost *= nPages; + } else { + image = image.extract_area( + baton->leftOffsetPost, baton->topOffsetPost, baton->widthPost, baton->heightPost); + } } // Affine transform @@ -519,10 +516,13 @@ class PipelineWorker : public Napi::AsyncWorker { // Embed baton->width = image.width() + baton->extendLeft + baton->extendRight; - baton->height = image.height() + baton->extendTop + baton->extendBottom; + baton->height = (nPages > 1 ? targetPageHeight : image.height()) + baton->extendTop + baton->extendBottom; - image = image.embed(baton->extendLeft, baton->extendTop, baton->width, baton->height, - VImage::option()->set("extend", VIPS_EXTEND_BACKGROUND)->set("background", background)); + image = nPages > 1 + ? sharp::EmbedMultiPage(image, + baton->extendLeft, baton->extendTop, baton->width, baton->height, background, nPages, &targetPageHeight) + : image.embed(baton->extendLeft, baton->extendTop, baton->width, baton->height, + VImage::option()->set("extend", VIPS_EXTEND_BACKGROUND)->set("background", background)); } // Median - must happen before blurring, due to the utility of blurring after thresholding if (shouldApplyMedian) { @@ -763,10 +763,7 @@ class PipelineWorker : public Napi::AsyncWorker { baton->height = image.height(); image = sharp::SetAnimationProperties( - image, - baton->pageHeight, - baton->delay, - baton->loop); + image, nPages, targetPageHeight, baton->delay, baton->loop); // Output sharp::SetTimeout(image, baton->timeoutSeconds); @@ -1317,15 +1314,15 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) { // Canvas option std::string canvas = sharp::AttrAsStr(options, "canvas"); if (canvas == "crop") { - baton->canvas = Canvas::CROP; + baton->canvas = sharp::Canvas::CROP; } else if (canvas == "embed") { - baton->canvas = Canvas::EMBED; + baton->canvas = sharp::Canvas::EMBED; } else if (canvas == "max") { - baton->canvas = Canvas::MAX; + baton->canvas = sharp::Canvas::MAX; } else if (canvas == "min") { - baton->canvas = Canvas::MIN; + baton->canvas = sharp::Canvas::MIN; } else if (canvas == "ignore_aspect") { - baton->canvas = Canvas::IGNORE_ASPECT; + baton->canvas = sharp::Canvas::IGNORE_ASPECT; } // Tint chroma baton->tintA = sharp::AttrAsDouble(options, "tintA"); @@ -1520,10 +1517,7 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) { vips_enum_from_nick(nullptr, VIPS_TYPE_BAND_FORMAT, sharp::AttrAsStr(options, "rawDepth").data())); - // Animated output - if (sharp::HasAttr(options, "pageHeight")) { - baton->pageHeight = sharp::AttrAsUint32(options, "pageHeight"); - } + // Animated output properties if (sharp::HasAttr(options, "loop")) { baton->loop = sharp::AttrAsUint32(options, "loop"); } diff --git a/src/pipeline.h b/src/pipeline.h index d461a64d..4f048ced 100644 --- a/src/pipeline.h +++ b/src/pipeline.h @@ -27,14 +27,6 @@ Napi::Value pipeline(const Napi::CallbackInfo& info); -enum class Canvas { - CROP, - EMBED, - MAX, - MIN, - IGNORE_ASPECT -}; - struct Composite { sharp::InputDescriptor *input; VipsBlendMode mode; @@ -75,7 +67,7 @@ struct PipelineBaton { int width; int height; int channels; - Canvas canvas; + sharp::Canvas canvas; int position; std::vector resizeBackground; bool hasCropOffset; @@ -200,7 +192,6 @@ struct PipelineBaton { double ensureAlpha; VipsInterpretation colourspaceInput; VipsInterpretation colourspace; - int pageHeight; std::vector delay; int loop; int tileSize; @@ -221,7 +212,7 @@ struct PipelineBaton { topOffsetPre(-1), topOffsetPost(-1), channels(0), - canvas(Canvas::CROP), + canvas(sharp::Canvas::CROP), position(0), resizeBackground{ 0.0, 0.0, 0.0, 255.0 }, hasCropOffset(false), @@ -334,7 +325,6 @@ struct PipelineBaton { ensureAlpha(-1.0), colourspaceInput(VIPS_INTERPRETATION_LAST), colourspace(VIPS_INTERPRETATION_LAST), - pageHeight(0), delay{-1}, loop(-1), tileSize(256), diff --git a/test/fixtures/expected/clahe-11-25-14.jpg b/test/fixtures/expected/clahe-11-25-14.jpg index 3ed0f51ab93b0a007cbd7f0b9449771bb84de452..067b79d8b6e8bdacd04a4edcaa3817e64138a293 100644 GIT binary patch literal 28586 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 literal 28947 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 diff --git a/test/fixtures/expected/embed-animated-height.webp b/test/fixtures/expected/embed-animated-height.webp new file mode 100644 index 0000000000000000000000000000000000000000..a546307d963ce51563690bef47ca265f3af21628 GIT binary patch literal 13246 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�bjSODYWQjwA$ydAjJp(})=5^uS_Sn9xn4TEW^Fg4jR(Uq8wL&l{ z8O`BrGjeUo0(Q3I2=L6ynMQ&7#|yn|u7KGfzmcsDvrU(m*p+rov~V^#IO=E{oVkC$ z13>hV(zjHMtIVGF6Y*mbpUE&2$SWN`Do*T1(U8yFtJC6`nA$VSJkrRq1ysa|gx9%k z;=QA57t}YBioFxcs5T>_iXH+EFqx9Qmr#55eo^0(-5KITnc5ohO+%OGMhNb|vKbUV*z> LPQTC(1Hk_Pf~n6# literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/embed-animated-width.webp b/test/fixtures/expected/embed-animated-width.webp new file mode 100644 index 0000000000000000000000000000000000000000..e11efa6868695ae00e875f2c84c34626868ace78 GIT binary patch literal 13244 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/extend-equal-single.webp b/test/fixtures/expected/extend-equal-single.webp new file mode 100644 index 0000000000000000000000000000000000000000..95fab3970c46f4706734ea593c61ad57e0e05f5a GIT binary patch literal 8200 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 O(lbwdB$N=tpZ@`Cq=qU0 literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/gravity-center-width.webp b/test/fixtures/expected/gravity-center-width.webp new file mode 100644 index 0000000000000000000000000000000000000000..e885bb415ee9c8dd9363ad69c47c43437ff4e805 GIT binary patch literal 7782 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/hilutite.jpg b/test/fixtures/expected/hilutite.jpg index ed6d06a6f2768f494cf699e30c81c3699c2bcfff..6ae6a71c5fbe0c8c96fb7e73c54ce57ecc483b0f 100644 GIT binary patch delta 1209 zcmV;q1V;O?y&9;!8i0fWgaU*Egam{Iv00II6 z0s{d700000000000RjL65g`N;F)~3SVgK3y3+?Gpjsx*q3-|0*9qtP8mZ9%e)nGr{v{} zymVkF?dL@8mWdOcNe!qooz`=T<%Jp77$pcKC#mwMejaryfRT@vx3z0rsMOUUW4MJr zoq>$sl>{#rs6zSC=;4n6q0SnXp1vkC{G4{@fbRxa$4Ftpvv5{vLn2w$ay6RTr zkyWKGlw(p4OnHu#8j7Xp)Kr#~pp`Ej0X=Bn5+?Mwm^?`V_|Li(`22#Mej<8y10t+) zc(w*2$cCvvC=@A?y0Cvissn}b5Y?C2FoK~$jOE4z1#?+x<)JQQc)&Xv1!{Fsr#TQRUYW&bu%H=LH3nlprbC#omjGl)ZWOSt$9d)Pqgbiak-n>QZr~5UH)r11lzZJax zRHzbs%^8Uyz(b6yO44;DK;WcRPq|u>?1J%`8BQzukZ8EUlReI0@(6!HI&2NL>;wl%aY_MN ziiys8)$(|H-ysEME}=)d7yb=+wLwz;6sCbl!n6RO6QhkYWsn0&aR6qIe;WK^k3Q=<&|63H*Q6$o1kDN!9o XP>CzSBMA*xT#SR#rAjZ551IejP~0Ls delta 1217 zcmV;y1U~zyy&AB+8i0fWgaU*Egam{Ivy2O~2=k+IPgBx9lQ|HJ?p0RRI50RaF2000000000000IL90RRR6!~h==00II6 z0|5a600000000000RjL65g`N;F)~46|Jncy0|5X65d#qbKL9fV`)GRHRUT+)p*}WV z%1Ay!vfee~RXT%gg0qA8%LfFL)Czy>izeT3T8mDuG?B8js|0#b)$o(akfpHZpiXk( z{{VUKP%k6_hS8qAoHuQz#8!kAZo5O16eSMF9NdA_gIezv$7=g$k2#OU(3cVGw@OT% z!dD2+Ga;bdte~Y$HhgKx?hP8@na@LG`eo58V5dBeXvU%3XVR5<>;t545OjZIRll)1 zZ1BQDS{Yd#`%qa9y6RL`wG)HX(XJ(h?6-%}j0GKI=R%Z^0*9qtP8mZ9<=zUpQ~5b! z?;RM`)6R+8EixxMk{eKGJ|&#uxnV|i#tCf%g!MjD@59ceP!ceG-=%e~RBCld815lY zxk|XmY3T*9;8#}A5KqL7%{PB=%$@wwA!)BSpcYa0Yv7Jnn@0zpD=v8)`h_L z7|q^Thj3uZj`3cUC9Y!9yltf8Vs{%+a+PzOOyXF>!wAd!Oq~))X4wWTWFrYzH6_I? z_un85{D;o8TOYFhqHwFroo`H8t&e%Ibgv(oIp}}w#b?}ie&JSvV{m`}01sUolGB+k z%{o9E_yPyleW|a7IPZyN*rfXh4*u+Q z$o~M7ayR{G)%l>SmC9UX7EAIL=7MlhlhEUAj+COeU1~=#fvjgc)*|*({hecVVf=tv zSKgyO>Qo6nW{kv;;z(O7(zKmPP&goioQin1aBmNzM!7!Go%Me@_(=IBKT}N+thQDM zA(mq{017M6l0F`ES6mqAL8g+UW-Zz-Hts5LruAtrPi+9H_|I~Sqozpn^`@ILuNHPu z7R0DAV1*TFn1w#(N$N-`{VLR1t?fznh|&_dG(Iv!j2At?J?e)0aovSYfpUp_FI}&i*Xq_U%~r70hj=7^&8UBqKq{*nah( zJ1Ju5%+y?)UWSy~m`NeEXSp57r3;m*F32w#tSQBJEuY@Ej2SW<=4T*>_!ylw2HJK4 zIi#&h0YyaTIqRCfPY+w4Nm)aPQSOER05x5z33Kq}wiJJng>uIK05RUX)czPPH2NM+ zdu_kMjI#rfVmfPcF_kgKohfe#9-01X*q13tS~R+$oNZF2P`eOV?iWqMN|WMsU$3oP ziBGtNtDLmy8NgP={0&N!n=7vBOvstQi%B$eV_l?-&87g diff --git a/test/fixtures/expected/icc-cmyk.jpg b/test/fixtures/expected/icc-cmyk.jpg index 248070c66c2e8d06c022efc0ceab1c1fe485703e..66f1f59902356a09004c32a950131b3d95a2a917 100644 GIT binary patch delta 3899 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 diff --git a/test/fixtures/expected/resize-crop-extract.jpg b/test/fixtures/expected/resize-crop-extract.jpg index 166e5e9671848197b8f898f26cc5661e96414615..e596b9a0aa489adafedbd09b1af7ee358eabb847 100644 GIT binary patch delta 1267 zcmV-+YF%SR&0|NpB1_cBI00000000310s{mQ zAq6oKK~V-1B4KfX6f#1Qu@xhd!9!Al|HJ?q0RRF60RaF2000000000000IL50R#mG z|HJ?t5di@J0|5a60RaF200000000330}&xH5(Gj2+5ij#0RRFK1Ah?!KLFIq@)~$; za;oY8zf;VsC!YbrtEhMZ#``7W)slx_s_voSk1{_11t&(P6trxP-Y=QQsVb^5@tVPQ z?2k9|S{Q|e(Y}7AeOp__m4odLtm=tOF}uPr;y(&bzp6NKLkqla+>SwJtZ#C&?b-fAal~Ar zcAyM|T_oRQMu!w||7G5}#{uh1iNu^(agW*E>Pl z5nDSfe{H7Vbt;ZsLDF0YeU*E-Is$pFfdm17#jhF3$W6WWx_pn6*k0XAja4IIjm|FF zKPN3d0bI+q;OA7B)yX&!!g9_Jql^skyVb=w zDPbSu1suje_NM$*KRF}*Xi-EFfr#7oLM}w@ZGRu7)v%jApT_Bz($q6Acqh?lsy3U19!PA71|!v_pNjqcmNz3Nc=5U$?dH3x8f$fsP_QV!b7D$F~7>P<)y@vlhrs~ za!ZZL$tRlRo{J`V{;Al`ISs;FBI$W0jtc~!3#7VsA#cGwBI^wkj<2&IZo4 zhA-7)n`@(=^Rr|SNFvFz#e5tqnd!H}fh9R;#xk8Vm6I)36k9m+DB(Q+04c|{%olLS zl2$akk|1!A#!8zE7U+m$IKq+zk;tx)FlYgUygq4CjnM>fguEdE3XoWILhC3|8rQL{ zb_U@@s*R!8#exvIQRs3*k|wy^jnq20BMm2o2u#GBW d$a#XmF2WGBGJ%w+LW*>bVF*@&$U+qf|Jl__LpJ~b delta 1200 zcmV;h1W)^w3+@UO|JeWF01!$>Nk#wx0RR9200961kpi?l0s{mE1_ucL!~io8009F7 z0|5pF0SN#A000000RRF61Q8(x5;0K|A~Hc?aRwBDk)cBsBSKPBVse6#k?z@}s-K*!Jx;hm6P)J(Y~@RID6jDb zs33{m;1`_g61uhLwIs6lvc0QUI<|6ddojT3v+S|*a&Gi?IO;35mLbC%_EHF%H~~sH zKo?3Ljo3ONS!`gn3iOYq>TR=VT+Y8Zjt4PxwM4aqn_r^hbuwyo20{&g^SR#3RshXw zM}xDcW&BR>6{;{)5I18+FrMey)M;7CJ3GWL=}JsRiBrW`3=Vra*LE()h&lrnAl9&Ix%vL zbW*}I!nlc;-tU?e%^lQ#BUax;>T-5;uXVT!lG5WcNi{?Haj?Hd)BI8Unj*pDdD<2e z9NKsq!N3+z;_hrby;YYyHLE_dq&251D!T2h#ugn_L6Do1Zi(9>L#u0dT-|b7?y5jB zu-)hIuIn|zo);VEfI5}O$nzuI_nVTF$)371985PPl5SCCmkB|C3n_&{Lga2#Bf_%- zc*3m^bB+O85JdZUN-R>P0>KIWl%L9kVS2u|uYBEDe=To>daQYCohJ_aDhFlw1vn6G zdj^gI*CwW+Ht*A%_sV?j)T(vUHVB;O8w)EF&epK^tN_VeN5neNl77j%oYBZ=x*V>e zPS97#`pL`7yS_nxS8XXL1;^;Ce$tTmVVCd{8tRw+iT?m+te1B7cT1lsZd&iEUd5xx zeZr&L)w_nqKPfL(?qq282z0qx0yh5uX!lYwFnq_*EY`pb1@ zS6`1mMt`3YrmfsG7$43n2?m4u33(nk)ix5VSIYlpzWs OLQsS&K!hPspa0pT$}7(R diff --git a/test/fixtures/expected/svg72.png b/test/fixtures/expected/svg72.png index a7833dcf2f28a39bc92fdffd403d7b04972d7534..01d0586a931602dc8fa2203ad8fec5ab400b5375 100644 GIT binary patch delta 326 zcmV-M0lEI)4)p?%IDY{rNkly%n*jZRgY8weQHX`^2zJSjV zZ%?sHm(tSO#!3V`!Nyc+d;;4vilQVs>p?0#_jdPg51fM^?zmz1V`ml+INyzjEu{dH zXMjAdwGZ7VEDA-RMnDf;ZJZL&!x4RyG;vwVCSG8WktVQhgnx?w{6!D18o*UjK-ua^ zL|oMv7YQiiqoNEH7$*<(Fjd0!QKb4)^1uN3rqJFGD>yBn!2AI&M>Rh#f$|hfzW>q%6!^N%U2r*u)^Qeq zau!>3axe70OFt)2;G6Ou3(gWy&f+26z&PU^z(5AN1~8C;t^o{WplbjF8R#0oz-I?u Y09`S7jt9~$T>t<807*qoM6N<$g5*Dr7XSbN delta 1852 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 { format: 'jpeg', hasAlpha: false, hasProfile: false, - height: 13, + height: 14, isProgressive: false, space: 'srgb', width: 32 @@ -50,7 +50,6 @@ describe('AVIF', () => { hasProfile: false, height: 26, isProgressive: false, - pageHeight: 26, pagePrimary: 0, pages: 1, space: 'srgb', @@ -71,9 +70,8 @@ describe('AVIF', () => { format: 'heif', hasAlpha: false, hasProfile: false, - height: 12, + height: 14, isProgressive: false, - pageHeight: 12, pagePrimary: 0, pages: 1, space: 'srgb', @@ -97,7 +95,6 @@ describe('AVIF', () => { hasProfile: false, height: 300, isProgressive: false, - pageHeight: 300, pagePrimary: 0, pages: 1, space: 'srgb', diff --git a/test/unit/extend.js b/test/unit/extend.js index ea491e12..9e49ce51 100644 --- a/test/unit/extend.js +++ b/test/unit/extend.js @@ -6,16 +6,30 @@ const sharp = require('../../'); const fixtures = require('../fixtures'); describe('Extend', function () { - it('extend all sides equally via a single value', function (done) { - sharp(fixtures.inputJpg) - .resize(120) - .extend(10) - .toBuffer(function (err, data, info) { - if (err) throw err; - assert.strictEqual(140, info.width); - assert.strictEqual(118, info.height); - fixtures.assertSimilar(fixtures.expected('extend-equal-single.jpg'), data, done); - }); + describe('extend all sides equally via a single value', function () { + it('JPEG', function (done) { + sharp(fixtures.inputJpg) + .resize(120) + .extend(10) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(140, info.width); + assert.strictEqual(118, info.height); + fixtures.assertSimilar(fixtures.expected('extend-equal-single.jpg'), data, done); + }); + }); + + it('Animated WebP', function (done) { + sharp(fixtures.inputWebPAnimated, { pages: -1 }) + .resize(120) + .extend(10) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(140, info.width); + assert.strictEqual(140 * 9, info.height); + fixtures.assertSimilar(fixtures.expected('extend-equal-single.webp'), data, done); + }); + }); }); it('extend all sides equally with RGB', function (done) { diff --git a/test/unit/extract.js b/test/unit/extract.js index 05d67bf1..442638dc 100644 --- a/test/unit/extract.js +++ b/test/unit/extract.js @@ -39,10 +39,35 @@ describe('Partial image extraction', function () { }); }); + describe('Animated WebP', function () { + it('Before resize', function (done) { + sharp(fixtures.inputWebPAnimated, { pages: -1 }) + .extract({ left: 0, top: 30, width: 80, height: 20 }) + .resize(320, 80) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(320, info.width); + assert.strictEqual(80 * 9, info.height); + fixtures.assertSimilar(fixtures.expected('gravity-center-height.webp'), data, done); + }); + }); + + it('After resize', function (done) { + sharp(fixtures.inputWebPAnimated, { pages: -1 }) + .resize(320, 320) + .extract({ left: 0, top: 120, width: 320, height: 80 }) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(320, info.width); + assert.strictEqual(80 * 9, info.height); + fixtures.assertSimilar(fixtures.expected('gravity-center-height.webp'), data, done); + }); + }); + }); + it('TIFF', function (done) { sharp(fixtures.inputTiff) .extract({ left: 34, top: 63, width: 341, height: 529 }) - .jpeg() .toBuffer(function (err, data, info) { if (err) throw err; assert.strictEqual(341, info.width); diff --git a/test/unit/gif.js b/test/unit/gif.js index 0cade87b..d44b54f9 100644 --- a/test/unit/gif.js +++ b/test/unit/gif.js @@ -80,12 +80,6 @@ describe('GIF input', () => { assert.strictEqual(true, reduced.length < original.length); }); - it('invalid pageHeight throws', () => { - assert.throws(() => { - sharp().gif({ pageHeight: 0 }); - }); - }); - it('invalid loop throws', () => { assert.throws(() => { sharp().gif({ loop: -1 }); @@ -97,7 +91,7 @@ describe('GIF input', () => { it('invalid delay throws', () => { assert.throws(() => { - sharp().gif({ delay: [-1] }); + sharp().gif({ delay: -1 }); }); assert.throws(() => { sharp().gif({ delay: [65536] }); diff --git a/test/unit/metadata.js b/test/unit/metadata.js index 5fcb55f2..76a842a9 100644 --- a/test/unit/metadata.js +++ b/test/unit/metadata.js @@ -194,6 +194,29 @@ describe('Image metadata', function () { it('Animated WebP', () => sharp(fixtures.inputWebPAnimated) + .metadata() + .then(({ + format, width, height, space, channels, depth, + isProgressive, pages, loop, delay, hasProfile, + hasAlpha + }) => { + assert.strictEqual(format, 'webp'); + assert.strictEqual(width, 80); + assert.strictEqual(height, 80); + assert.strictEqual(space, 'srgb'); + assert.strictEqual(channels, 4); + assert.strictEqual(depth, 'uchar'); + assert.strictEqual(isProgressive, false); + assert.strictEqual(pages, 9); + assert.strictEqual(loop, 0); + assert.deepStrictEqual(delay, [120, 120, 90, 120, 120, 90, 120, 90, 30]); + assert.strictEqual(hasProfile, false); + assert.strictEqual(hasAlpha, true); + }) + ); + + it('Animated WebP with all pages', () => + sharp(fixtures.inputWebPAnimated, { pages: -1 }) .metadata() .then(({ format, width, height, space, channels, depth, @@ -202,7 +225,7 @@ describe('Image metadata', function () { }) => { assert.strictEqual(format, 'webp'); assert.strictEqual(width, 80); - assert.strictEqual(height, 80); + assert.strictEqual(height, 720); assert.strictEqual(space, 'srgb'); assert.strictEqual(channels, 4); assert.strictEqual(depth, 'uchar'); @@ -221,8 +244,8 @@ describe('Image metadata', function () { .metadata() .then(({ format, width, height, space, channels, depth, - isProgressive, pages, pageHeight, loop, delay, - hasProfile, hasAlpha + isProgressive, pages, loop, delay, hasProfile, + hasAlpha }) => { assert.strictEqual(format, 'webp'); assert.strictEqual(width, 370); @@ -232,7 +255,6 @@ describe('Image metadata', function () { assert.strictEqual(depth, 'uchar'); assert.strictEqual(isProgressive, false); assert.strictEqual(pages, 10); - assert.strictEqual(pageHeight, 285); assert.strictEqual(loop, 3); assert.deepStrictEqual(delay, [...Array(9).fill(3000), 15000]); assert.strictEqual(hasProfile, false); @@ -285,8 +307,8 @@ describe('Image metadata', function () { .metadata() .then(({ format, width, height, space, channels, depth, - isProgressive, pages, pageHeight, loop, delay, - background, hasProfile, hasAlpha + isProgressive, pages, loop, delay, background, + hasProfile, hasAlpha }) => { assert.strictEqual(format, 'gif'); assert.strictEqual(width, 80); @@ -296,7 +318,6 @@ describe('Image metadata', function () { assert.strictEqual(depth, 'uchar'); assert.strictEqual(isProgressive, false); assert.strictEqual(pages, 30); - assert.strictEqual(pageHeight, 80); assert.strictEqual(loop, 0); assert.deepStrictEqual(delay, Array(30).fill(30)); assert.deepStrictEqual(background, { r: 0, g: 0, b: 0 }); @@ -310,8 +331,8 @@ describe('Image metadata', function () { .metadata() .then(({ format, width, height, space, channels, depth, - isProgressive, pages, pageHeight, loop, delay, - hasProfile, hasAlpha + isProgressive, pages, loop, delay, hasProfile, + hasAlpha }) => { assert.strictEqual(format, 'gif'); assert.strictEqual(width, 370); @@ -321,7 +342,6 @@ describe('Image metadata', function () { assert.strictEqual(depth, 'uchar'); assert.strictEqual(isProgressive, false); assert.strictEqual(pages, 10); - assert.strictEqual(pageHeight, 285); assert.strictEqual(loop, 2); assert.deepStrictEqual(delay, [...Array(9).fill(3000), 15000]); assert.strictEqual(hasProfile, false); @@ -522,7 +542,7 @@ describe('Image metadata', function () { assert.strictEqual('Relative', profile.intent); assert.strictEqual('Printer', profile.deviceClass); }); - fixtures.assertSimilar(output, fixtures.path('expected/icc-cmyk.jpg'), { threshold: 0 }, done); + fixtures.assertSimilar(output, fixtures.expected('icc-cmyk.jpg'), { threshold: 0 }, done); }); }); @@ -533,7 +553,7 @@ describe('Image metadata', function () { .withMetadata({ icc: fixtures.path('hilutite.icm') }) .toFile(output, function (err, info) { if (err) throw err; - fixtures.assertMaxColourDistance(output, fixtures.path('expected/hilutite.jpg'), 9); + fixtures.assertMaxColourDistance(output, fixtures.expected('hilutite.jpg'), 9); done(); }); }); @@ -737,7 +757,6 @@ describe('Image metadata', function () { depth: 'uchar', isProgressive: false, pages: 1, - pageHeight: 858, pagePrimary: 0, compression: 'av1', hasProfile: false, diff --git a/test/unit/resize-contain.js b/test/unit/resize-contain.js index d443ed2a..7a0a2e92 100644 --- a/test/unit/resize-contain.js +++ b/test/unit/resize-contain.js @@ -148,6 +148,42 @@ describe('Resize fit=contain', function () { }); }); + describe('Animated WebP', function () { + it('Width only', function (done) { + sharp(fixtures.inputWebPAnimated, { pages: -1 }) + .resize(320, 240, { + fit: 'contain', + background: { r: 255, g: 0, b: 0 } + }) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(true, data.length > 0); + assert.strictEqual('webp', info.format); + assert.strictEqual(320, info.width); + assert.strictEqual(240 * 9, info.height); + assert.strictEqual(4, info.channels); + fixtures.assertSimilar(fixtures.expected('embed-animated-width.webp'), data, done); + }); + }); + + it('Height only', function (done) { + sharp(fixtures.inputWebPAnimated, { pages: -1 }) + .resize(240, 320, { + fit: 'contain', + background: { r: 255, g: 0, b: 0 } + }) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(true, data.length > 0); + assert.strictEqual('webp', info.format); + assert.strictEqual(240, info.width); + assert.strictEqual(320 * 9, info.height); + assert.strictEqual(4, info.channels); + fixtures.assertSimilar(fixtures.expected('embed-animated-height.webp'), data, done); + }); + }); + }); + it('Invalid position values should fail', function () { [-1, 8.1, 9, 1000000, false, 'vallejo'].forEach(function (position) { assert.throws(function () { diff --git a/test/unit/resize-cover.js b/test/unit/resize-cover.js index 4d780000..75d9a73a 100644 --- a/test/unit/resize-cover.js +++ b/test/unit/resize-cover.js @@ -269,6 +269,30 @@ describe('Resize fit=cover', function () { }); }); + describe('Animated WebP', function () { + it('Width only', function (done) { + sharp(fixtures.inputWebPAnimated, { pages: -1 }) + .resize(80, 320, { fit: sharp.fit.cover }) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(80, info.width); + assert.strictEqual(320 * 9, info.height); + fixtures.assertSimilar(fixtures.expected('gravity-center-width.webp'), data, done); + }); + }); + + it('Height only', function (done) { + sharp(fixtures.inputWebPAnimated, { pages: -1 }) + .resize(320, 80, { fit: sharp.fit.cover }) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(320, info.width); + assert.strictEqual(80 * 9, info.height); + fixtures.assertSimilar(fixtures.expected('gravity-center-height.webp'), data, done); + }); + }); + }); + describe('Entropy-based strategy', function () { it('JPEG', function (done) { sharp(fixtures.inputJpg) diff --git a/test/unit/svg.js b/test/unit/svg.js index fd436e27..ee832352 100644 --- a/test/unit/svg.js +++ b/test/unit/svg.js @@ -74,6 +74,27 @@ describe('SVG input', function () { }); }); + it('Convert SVG to PNG utilizing scale-on-load', function (done) { + const size = 1024; + sharp(fixtures.inputSvgSmallViewBox) + .resize(size) + .toFormat('png') + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual('png', info.format); + assert.strictEqual(size, info.width); + assert.strictEqual(size, info.height); + fixtures.assertSimilar(fixtures.expected('circle.png'), data, function (err) { + if (err) throw err; + sharp(data).metadata(function (err, info) { + if (err) throw err; + assert.strictEqual(72, info.density); + done(); + }); + }); + }); + }); + it('Convert SVG to PNG at 14.4DPI', function (done) { sharp(fixtures.inputSvg, { density: 14.4 }) .toFormat('png') diff --git a/test/unit/webp.js b/test/unit/webp.js index 00815681..3e122e8b 100644 --- a/test/unit/webp.js +++ b/test/unit/webp.js @@ -133,12 +133,6 @@ describe('WebP', function () { }); }); - it('invalid pageHeight throws', () => { - assert.throws(() => { - sharp().webp({ pageHeight: 0 }); - }); - }); - it('invalid loop throws', () => { assert.throws(() => { sharp().webp({ loop: -1 }); @@ -151,7 +145,7 @@ describe('WebP', function () { it('invalid delay throws', () => { assert.throws(() => { - sharp().webp({ delay: [-1] }); + sharp().webp({ delay: -1 }); }); assert.throws(() => { @@ -159,16 +153,13 @@ describe('WebP', function () { }); }); - it('should double the number of frames with default delay', async () => { - const original = await sharp(fixtures.inputWebPAnimated, { pages: -1 }).metadata(); + it('should repeat a single delay for all frames', async () => { const updated = await sharp(fixtures.inputWebPAnimated, { pages: -1 }) - .webp({ pageHeight: original.pageHeight / 2 }) + .webp({ delay: 100 }) .toBuffer() .then(data => sharp(data, { pages: -1 }).metadata()); - assert.strictEqual(updated.pages, original.pages * 2); - assert.strictEqual(updated.pageHeight, original.pageHeight / 2); - assert.deepStrictEqual(updated.delay, [...original.delay, ...Array(9).fill(120)]); + assert.deepStrictEqual(updated.delay, Array(updated.pages).fill(100)); }); it('should limit animation loop', async () => { @@ -216,22 +207,14 @@ describe('WebP', function () { }); }); - it('should remove animation properties when loading single page', async () => { - const data = await sharp(fixtures.inputGifAnimatedLoop3) + it('should resize animated image to page height', async () => { + const updated = await sharp(fixtures.inputWebPAnimated, { pages: -1 }) .resize({ height: 570 }) .webp({ effort: 0 }) - .toBuffer(); - const { size, ...metadata } = await sharp(data).metadata(); - assert.deepStrictEqual(metadata, { - format: 'webp', - width: 740, - height: 570, - space: 'srgb', - channels: 3, - depth: 'uchar', - isProgressive: false, - hasProfile: false, - hasAlpha: false - }); + .toBuffer() + .then(data => sharp(data, { pages: -1 }).metadata()); + + assert.strictEqual(updated.height, 570 * 9); + assert.strictEqual(updated.pageHeight, 570); }); });