From c8ff7e11a9627fc7d82f0b639dabee2d3ad4390d Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Wed, 19 Sep 2018 21:38:09 +0100 Subject: [PATCH] Upgrade to libvips v8.7.0 Drop Node 4 support Add experimental musl prebuild for Node 8 and 10 --- .travis.yml | 65 ++- README.md | 4 +- appveyor.yml | 1 - binding.gyp | 5 + docs/changelog.md | 12 + docs/index.md | 4 +- docs/install.md | 56 +-- install/libvips.js | 3 - lib/libvips.js | 8 +- lib/platform.js | 5 +- package.json | 16 +- src/common.cc | 4 - src/libvips/cplusplus/VImage.cpp | 190 ++++---- src/libvips/cplusplus/vips-operators.cpp | 453 +++++++++++------- src/pipeline.cc | 4 - src/utilities.cc | 2 +- test/fixtures/expected/extract-lch.jpg | Bin 13010 -> 13057 bytes .../expected/fast-shrink-on-load-false.png | Bin 258 -> 270 bytes .../expected/fast-shrink-on-load-true.png | Bin 263 -> 265 bytes test/fixtures/expected/tint-blue.jpg | Bin 15025 -> 15018 bytes test/fixtures/expected/tint-green.jpg | Bin 12630 -> 12640 bytes test/fixtures/expected/tint-red.jpg | Bin 12253 -> 12304 bytes test/fixtures/expected/tint-sepia.jpg | Bin 14079 -> 14151 bytes test/unit/cache.js | 5 +- test/unit/io.js | 74 ++- 25 files changed, 500 insertions(+), 411 deletions(-) diff --git a/.travis.yml b/.travis.yml index 84863043..8224666d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,34 +1,59 @@ -language: node_js matrix: include: - - os: linux - dist: trusty - sudo: false - node_js: "4" - - os: linux + - name: "Linux (glibc) - Node 6" + os: linux dist: trusty sudo: false + language: node_js node_js: "6" - - os: linux + - name: "Linux (glibc) - Node 8" + os: linux dist: trusty sudo: false + language: node_js node_js: "8" - - os: linux + - name: "Linux (glibc) - Node 10" + os: linux dist: trusty sudo: false + language: node_js node_js: "10" - - os: osx - osx_image: xcode8.3 - node_js: "4" - - os: osx - osx_image: xcode8.3 + after_success: + - npm install coveralls + - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + - name: "Linux (musl) - Node 8" + os: linux + dist: trusty + sudo: true + language: minimal + before_install: + - sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:8-alpine + - sudo docker exec sharp apk add build-base git python2 --update-cache + install: sudo docker exec sharp sh -c "npm install --unsafe-perm" + script: sudo docker exec sharp sh -c "npm test" + - name: "Linux (musl) - Node 10" + os: linux + dist: trusty + sudo: true + language: minimal + before_install: + - sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:10-alpine + - sudo docker exec sharp apk add build-base git python2 --update-cache + install: sudo docker exec sharp sh -c "npm install --unsafe-perm" + script: sudo docker exec sharp sh -c "npm test" + allow_failures: + - name: "OS X - Node 6" + os: osx + osx_image: xcode9.2 + language: node_js node_js: "6" - - os: osx - osx_image: xcode8.3 + - name: "OS X - Node 8" + os: osx + osx_image: xcode9.2 + language: node_js node_js: "8" - - os: osx - osx_image: xcode8.3 + - name: "OS X - Node 10" + os: osx + osx_image: xcode9.2 + language: node_js node_js: "10" -after_success: - - npm install coveralls - - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js diff --git a/README.md b/README.md index c55099f6..d549868d 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ Lanczos resampling ensures quality is not sacrificed for speed. As well as image resizing, operations such as rotation, extraction, compositing and gamma correction are available. -Most modern 64-bit OS X, Windows and Linux (glibc) systems running -Node versions 4, 6, 8 and 10 +Most modern 64-bit OS X, Windows and Linux systems running +Node versions 6, 8 and 10 do not require any additional install or runtime dependencies. ## Examples diff --git a/appveyor.yml b/appveyor.yml index 2e0f1662..5350bba1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,7 +4,6 @@ build: off platform: x64 environment: matrix: - - nodejs_version: "4" - nodejs_version: "6" - nodejs_version: "8" - nodejs_version: "10" diff --git a/binding.gyp b/binding.gyp index 1115b1cd..bf2e5ad8 100644 --- a/binding.gyp +++ b/binding.gyp @@ -128,9 +128,11 @@ '../vendor/lib/libcairo.so', '../vendor/lib/libcroco-0.6.so', '../vendor/lib/libexif.so', + '../vendor/lib/libexpat.so', '../vendor/lib/libffi.so', '../vendor/lib/libfontconfig.so', '../vendor/lib/libfreetype.so', + '../vendor/lib/libfribidi.so', '../vendor/lib/libgdk_pixbuf-2.0.so', '../vendor/lib/libgif.so', '../vendor/lib/libgio-2.0.so', @@ -138,6 +140,7 @@ '../vendor/lib/libgsf-1.so', '../vendor/lib/libgthread-2.0.so', '../vendor/lib/libharfbuzz.so', + '../vendor/lib/libharfbuzz-subset.so.0', '../vendor/lib/libjpeg.so', '../vendor/lib/liblcms2.so', '../vendor/lib/liborc-0.4.so', @@ -149,6 +152,8 @@ '../vendor/lib/librsvg-2.so', '../vendor/lib/libtiff.so', '../vendor/lib/libwebp.so', + '../vendor/lib/libwebpdemux.so', + '../vendor/lib/libwebpmux.so', '../vendor/lib/libxml2.so', '../vendor/lib/libz.so', # Ensure runtime linking is relative to sharp.node diff --git a/docs/changelog.md b/docs/changelog.md index 397997d0..53b9c83f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,17 @@ # Changelog +### v0.21 - "*teeth*" + +Requires libvips v8.7.0. + +#### v0.21.0 - TBD + +* Drop Node 4 support. + [#1212](https://github.com/lovell/sharp/issues/1212) + +* Add experimental prebuilt binaries for musl-based Linux. + [#1379](https://github.com/lovell/sharp/issues/1379) + ### v0.20 - "*prebuild*" Requires libvips v8.6.1. diff --git a/docs/index.md b/docs/index.md index 2af321c7..236ef3fd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,8 +13,8 @@ Lanczos resampling ensures quality is not sacrificed for speed. As well as image resizing, operations such as rotation, extraction, compositing and gamma correction are available. -Most 64-bit OS X, Windows and Linux (glibc) systems running -Node versions 4, 6, 8 and 10 +Most modern 64-bit OS X, Windows and Linux systems running +Node versions 6, 8 and 10 do not require any additional install or runtime dependencies. [![Test Coverage](https://coveralls.io/repos/lovell/sharp/badge.png?branch=master)](https://coveralls.io/r/lovell/sharp?branch=master) diff --git a/docs/install.md b/docs/install.md index 15314074..eedfdb67 100644 --- a/docs/install.md +++ b/docs/install.md @@ -15,7 +15,7 @@ yarn add sharp ### Building from source Pre-compiled binaries for sharp are provided for use with -Node versions 4, 6, 8 and 10 on +Node versions 6, 8 and 10 on 64-bit Windows, OS X and Linux platforms. Sharp will be built from source at install time when: @@ -27,7 +27,7 @@ Sharp will be built from source at install time when: Building from source requires: * C++11 compatible compiler such as gcc 4.8+, clang 3.0+ or MSVC 2013+ -* [node-gyp](https://github.com/TooTallNate/node-gyp#installation) and its dependencies (includes Python) +* [node-gyp](https://github.com/nodejs/node-gyp#installation) and its dependencies (includes Python 2.7) ## libvips @@ -36,13 +36,14 @@ Building from source requires: [![Ubuntu 16.04 Build Status](https://travis-ci.org/lovell/sharp.png?branch=master)](https://travis-ci.org/lovell/sharp) libvips and its dependencies are fetched and stored within `node_modules/sharp/vendor` during `npm install`. -This involves an automated HTTPS download of approximately 7MB. +This involves an automated HTTPS download of approximately 8MB. -Most recent Linux-based operating systems with glibc running on x64 and ARMv6+ CPUs should "just work", e.g.: +Most Linux-based (glibc, musl) operating systems running on x64 and ARMv6+ CPUs should "just work", e.g.: * Debian 7+ * Ubuntu 14.04+ * Centos 7+ +* Alpine 3.8+ (Node 8 and 10) * Fedora * openSUSE 13.2+ * Archlinux @@ -61,9 +62,9 @@ and `LD_LIBRARY_PATH` at runtime. This allows the use of newer versions of libvips with older versions of sharp. For 32-bit Intel CPUs and older Linux-based operating systems such as Centos 6, -it is recommended to install a system-wide installation of libvips from source: +compiling libvips from source is recommended. -https://jcupitt.github.io/libvips/install.html#building-libvips-from-a-source-tarball +[https://jcupitt.github.io/libvips/install.html#building-libvips-from-a-source-tarball](https://jcupitt.github.io/libvips/install.html#building-libvips-from-a-source-tarball) #### Alpine Linux @@ -71,7 +72,7 @@ libvips is available in the [testing repository](https://pkgs.alpinelinux.org/packages?name=vips-dev): ```sh -apk add vips-dev fftw-dev --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/ +apk add vips-dev fftw-dev build-base --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/ ``` The smaller stack size of musl libc means @@ -94,7 +95,7 @@ that it can be located using `pkg-config --modversion vips-cpp`. [![Windows x64 Build Status](https://ci.appveyor.com/api/projects/status/pgtul704nkhhg6sg)](https://ci.appveyor.com/project/lovell/sharp) libvips and its dependencies are fetched and stored within `node_modules\sharp\vendor` during `npm install`. -This involves an automated HTTPS download of approximately 12MB. +This involves an automated HTTPS download of approximately 13MB. Only 64-bit (x64) `node.exe` is supported. @@ -117,9 +118,6 @@ https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=193528 ### Heroku -libvips and its dependencies are fetched and stored within `node_modules\sharp\vendor` during `npm install`. -This involves an automated HTTPS download of approximately 7MB. - Set [NODE_MODULES_CACHE](https://devcenter.heroku.com/articles/nodejs-support#cache-behavior) to `false` when using the `yarn` package manager. @@ -154,12 +152,13 @@ can be built using Docker. ```sh rm -rf node_modules/sharp -docker run -v "$PWD":/var/task lambci/lambda:build-nodejs6.10 npm install +docker run -v "$PWD":/var/task lambci/lambda:build-nodejs8.10 npm install ``` -Set the Lambda runtime to Node.js 6.10. +Set the Lambda runtime to Node.js 8.10. -To get the best performance select the largest memory available. A 1536 MB function provides ~12x more CPU time than a 128 MB function. +To get the best performance select the largest memory available. +A 1536 MB function provides ~12x more CPU time than a 128 MB function. ### NW.js @@ -171,7 +170,7 @@ nw-gyp rebuild --arch=x64 --target=[your nw version] node node_modules/sharp/install/dll-copy ``` -See also http://docs.nwjs.io/en/latest/For%20Users/Advanced/Use%20Native%20Node%20Modules/ +[http://docs.nwjs.io/en/latest/For%20Users/Advanced/Use%20Native%20Node%20Modules/](http://docs.nwjs.io/en/latest/For%20Users/Advanced/Use%20Native%20Node%20Modules/) ### Build tools @@ -199,28 +198,6 @@ and [Valgrind](http://valgrind.org/) have been used to test the most popular web-based formats, as well as libvips itself, you are advised to perform your own testing and sandboxing. -ImageMagick in particular has a relatively large attack surface, -which can be partially mitigated with a -[policy.xml](http://www.imagemagick.org/script/resources.php) -configuration file to prevent the use of coders known to be vulnerable. - -```xml - - - - - - - - - - - -``` - -Set the `MAGICK_CONFIGURE_PATH` environment variable -to the directory containing the `policy.xml` file. - ### Pre-compiled libvips binaries This module will attempt to download a pre-compiled bundle of libvips @@ -236,7 +213,8 @@ SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install sharp ``` Should you need to manually download and inspect these files, -you can do so via https://github.com/lovell/sharp-libvips/releases +you can do so via +[https://github.com/lovell/sharp-libvips/releases](https://github.com/lovell/sharp-libvips/releases) Should you wish to install these from your own location, set the `SHARP_DIST_BASE_URL` environment variable, e.g. @@ -265,6 +243,8 @@ Use of libraries under the terms of the LGPLv3 is via the | expat | MIT Licence | | fontconfig | [fontconfig Licence](https://cgit.freedesktop.org/fontconfig/tree/COPYING) (BSD-like) | | freetype | [freetype Licence](http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT) (BSD-like) | +| fribidi | LGPLv3 | +| gettext | LGPLv3 | | giflib | MIT Licence | | glib | LGPLv3 | | harfbuzz | MIT Licence | diff --git a/install/libvips.js b/install/libvips.js index 5562a861..315a9812 100644 --- a/install/libvips.js +++ b/install/libvips.js @@ -54,9 +54,6 @@ try { if (platformAndArch === 'freebsd-x64') { throw new Error(`FreeBSD systems require manual installation of libvips >= ${minimumLibvipsVersion}`); } - if (detectLibc.isNonGlibcLinux) { - throw new Error(`Use with ${detectLibc.family} libc requires manual installation of libvips >= ${minimumLibvipsVersion}`); - } if (detectLibc.family === detectLibc.GLIBC && detectLibc.version && semver.lt(`${detectLibc.version}.0`, '2.13.0')) { throw new Error(`Use with glibc version ${detectLibc.version} requires manual installation of libvips >= ${minimumLibvipsVersion}`); } diff --git a/lib/libvips.js b/lib/libvips.js index eaafe431..4f5fed1c 100644 --- a/lib/libvips.js +++ b/lib/libvips.js @@ -44,10 +44,16 @@ const globalLibvipsVersion = function () { const hasVendoredLibvips = function () { const currentPlatformId = platform(); + const vendorPath = path.join(__dirname, '..', 'vendor'); + let vendorVersionId; let vendorPlatformId; try { - vendorPlatformId = require(path.join(__dirname, '..', 'vendor', 'platform.json')); + vendorVersionId = require(path.join(vendorPath, 'versions.json')).vips; + vendorPlatformId = require(path.join(vendorPath, 'platform.json')); } catch (err) {} + if (vendorVersionId && vendorVersionId !== minimumLibvipsVersion) { + throw new Error(`Found vendored libvips v${vendorVersionId} but require v${minimumLibvipsVersion}. Please remove the 'node_modules/sharp/vendor' directory and run 'npm install'.`); + } if (vendorPlatformId) { if (currentPlatformId === vendorPlatformId) { return true; diff --git a/lib/platform.js b/lib/platform.js index 0d0722ba..4bddd0ab 100644 --- a/lib/platform.js +++ b/lib/platform.js @@ -1,10 +1,13 @@ 'use strict'; +const detectLibc = require('detect-libc'); + module.exports = function () { const arch = process.env.npm_config_arch || process.arch; const platform = process.env.npm_config_platform || process.platform; + const libc = (platform === 'linux' && detectLibc.isNonGlibcLinux) ? detectLibc.family : ''; - const platformId = [platform]; + const platformId = [`${platform}${libc}`]; if (arch === 'arm' || arch === 'armhf' || arch === 'arm64') { const armVersion = (arch === 'arm64') ? '8' : process.env.npm_config_armv || process.config.variables.arm_version || '6'; platformId.push(`armv${armVersion}`); diff --git a/package.json b/package.json index dba40ab3..520c0cbc 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ ], "scripts": { "install": "(node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)", - "clean": "rm -rf node_modules/ build/ vendor/ coverage/ test/fixtures/output.*", + "clean": "rm -rf node_modules/ build/ vendor/ .nyc_output/ coverage/ test/fixtures/output.*", "test": "semistandard && cc && nyc --reporter=lcov --branches=99 mocha --slow=5000 --timeout=60000 ./test/unit/*.js && prebuild-ci", "coverage": "./test/coverage/report.sh", "test-leak": "./test/leak/leak.sh", @@ -91,9 +91,9 @@ "nan": "^2.11.0", "fs-copy-file-sync": "^1.1.1", "npmlog": "^4.1.2", - "prebuild-install": "^4.0.0", + "prebuild-install": "^5.0.0", "semver": "^5.5.1", - "simple-get": "^2.8.1", + "simple-get": "^3.0.3", "tar": "^4.4.6", "tunnel-agent": "^0.6.0" }, @@ -105,19 +105,19 @@ "exif-reader": "^1.0.2", "icc": "^1.0.0", "mocha": "^5.2.0", - "mock-fs": "^4.6.0", - "nyc": "^12.0.1", - "prebuild": "^7.6.2", + "mock-fs": "^4.7.0", + "nyc": "^13.1.0", + "prebuild": "^8.0.1", "prebuild-ci": "^2.2.3", "rimraf": "^2.6.2", "semistandard": "^12.0.1" }, "license": "Apache-2.0", "config": { - "libvips": "8.6.1" + "libvips": "8.7.0" }, "engines": { - "node": ">=4.5.0" + "node": ">=6" }, "semistandard": { "env": [ diff --git a/src/common.cc b/src/common.cc index 6d82d04d..ee9519d2 100644 --- a/src/common.cc +++ b/src/common.cc @@ -370,10 +370,6 @@ namespace sharp { if (image.width() > 65535 || image.height() > 65535) { throw vips::VError("Processed image is too large for the JPEG format"); } - } else if (imageType == ImageType::PNG) { - if (image.width() > 2147483647 || image.height() > 2147483647) { - throw vips::VError("Processed image is too large for the PNG format"); - } } else if (imageType == ImageType::WEBP) { if (image.width() > 16383 || image.height() > 16383) { throw vips::VError("Processed image is too large for the WebP format"); diff --git a/src/libvips/cplusplus/VImage.cpp b/src/libvips/cplusplus/VImage.cpp index da1eef17..3c1acd98 100644 --- a/src/libvips/cplusplus/VImage.cpp +++ b/src/libvips/cplusplus/VImage.cpp @@ -613,7 +613,7 @@ VImage::new_matrixv( int width, int height, ... ) } VImage -VImage::write( VImage out ) +VImage::write( VImage out ) const { if( vips_image_write( this->get_image(), out.get_image() ) ) throw VError(); @@ -622,7 +622,7 @@ VImage::write( VImage out ) } void -VImage::write_to_file( const char *name, VOption *options ) +VImage::write_to_file( const char *name, VOption *options ) const { char filename[VIPS_PATH_MAX]; char option_string[VIPS_PATH_MAX]; @@ -642,7 +642,7 @@ VImage::write_to_file( const char *name, VOption *options ) void VImage::write_to_buffer( const char *suffix, void **buf, size_t *size, - VOption *options ) + VOption *options ) const { char filename[VIPS_PATH_MAX]; char option_string[VIPS_PATH_MAX]; @@ -675,7 +675,7 @@ VImage::write_to_buffer( const char *suffix, void **buf, size_t *size, #include "vips-operators.cpp" std::vector -VImage::bandsplit( VOption *options ) +VImage::bandsplit( VOption *options ) const { std::vector b; @@ -686,7 +686,7 @@ VImage::bandsplit( VOption *options ) } VImage -VImage::bandjoin( VImage other, VOption *options ) +VImage::bandjoin( VImage other, VOption *options ) const { VImage v[2] = { *this, other }; std::vector vec( v, v + VIPS_NUMBER( v ) ); @@ -695,7 +695,7 @@ VImage::bandjoin( VImage other, VOption *options ) } VImage -VImage::composite( VImage other, VipsBlendMode mode, VOption *options ) +VImage::composite( VImage other, VipsBlendMode mode, VOption *options ) const { VImage v[2] = { *this, other }; std::vector ivec( v, v + VIPS_NUMBER( v ) ); @@ -706,7 +706,7 @@ VImage::composite( VImage other, VipsBlendMode mode, VOption *options ) } std::complex -VImage::minpos( VOption *options ) +VImage::minpos( VOption *options ) const { double x, y; @@ -719,7 +719,7 @@ VImage::minpos( VOption *options ) } std::complex -VImage::maxpos( VOption *options ) +VImage::maxpos( VOption *options ) const { double x, y; @@ -734,43 +734,43 @@ VImage::maxpos( VOption *options ) // Operator overloads VImage -VImage::operator[]( int index ) +VImage::operator[]( int index ) const { return( this->extract_band( index ) ); } std::vector -VImage::operator()( int x, int y ) +VImage::operator()( int x, int y ) const { return( this->getpoint( x, y ) ); } VImage -operator+( VImage a, VImage b ) +operator+( const VImage a, const VImage b ) { return( a.add( b ) ); } VImage -operator+( double a, VImage b ) +operator+( double a, const VImage b ) { return( b.linear( 1.0, a ) ); } VImage -operator+( VImage a, double b ) +operator+( const VImage a, double b ) { return( a.linear( 1.0, b ) ); } VImage -operator+( std::vector a, VImage b ) +operator+( const std::vector a, const VImage b ) { return( b.linear( 1.0, a ) ); } VImage -operator+( VImage a, std::vector b ) +operator+( const VImage a, const std::vector b ) { return( a.linear( 1.0, b ) ); } @@ -788,37 +788,37 @@ operator+=( VImage &a, const double b ) } VImage & -operator+=( VImage &a, std::vector b ) +operator+=( VImage &a, const std::vector b ) { return( a = a + b ); } VImage -operator-( VImage a, VImage b ) +operator-( const VImage a, const VImage b ) { return( a.subtract( b ) ); } VImage -operator-( double a, VImage b ) +operator-( double a, const VImage b ) { return( b.linear( -1.0, a ) ); } VImage -operator-( VImage a, double b ) +operator-( const VImage a, double b ) { return( a.linear( 1.0, -b ) ); } VImage -operator-( std::vector a, VImage b ) +operator-( const std::vector a, const VImage b ) { return( b.linear( -1.0, a ) ); } VImage -operator-( VImage a, std::vector b ) +operator-( const VImage a, const std::vector b ) { return( a.linear( 1.0, vips::negate( b ) ) ); } @@ -836,43 +836,43 @@ operator-=( VImage &a, const double b ) } VImage & -operator-=( VImage &a, std::vector b ) +operator-=( VImage &a, const std::vector b ) { return( a = a - b ); } VImage -operator-( VImage a ) +operator-( const VImage a ) { return( a * -1 ); } VImage -operator*( VImage a, VImage b ) +operator*( const VImage a, const VImage b ) { return( a.multiply( b ) ); } VImage -operator*( double a, VImage b ) +operator*( double a, const VImage b ) { return( b.linear( a, 0.0 ) ); } VImage -operator*( VImage a, double b ) +operator*( const VImage a, double b ) { return( a.linear( b, 0.0 ) ); } VImage -operator*( std::vector a, VImage b ) +operator*( const std::vector a, const VImage b ) { return( b.linear( a, 0.0 ) ); } VImage -operator*( VImage a, std::vector b ) +operator*( const VImage a, const std::vector b ) { return( a.linear( b, 0.0 ) ); } @@ -890,37 +890,37 @@ operator*=( VImage &a, const double b ) } VImage & -operator*=( VImage &a, std::vector b ) +operator*=( VImage &a, const std::vector b ) { return( a = a * b ); } VImage -operator/( VImage a, VImage b ) +operator/( const VImage a, const VImage b ) { return( a.divide( b ) ); } VImage -operator/( double a, VImage b ) +operator/( double a, const VImage b ) { return( b.pow( -1.0 ).linear( a, 0.0 ) ); } VImage -operator/( VImage a, double b ) +operator/( const VImage a, double b ) { return( a.linear( 1.0 / b, 0.0 ) ); } VImage -operator/( std::vector a, VImage b ) +operator/( const std::vector a, const VImage b ) { return( b.pow( -1.0 ).linear( a, 0.0 ) ); } VImage -operator/( VImage a, std::vector b ) +operator/( const VImage a, const std::vector b ) { return( a.linear( vips::invert( b ), 0.0 ) ); } @@ -938,25 +938,25 @@ operator/=( VImage &a, const double b ) } VImage & -operator/=( VImage &a, std::vector b ) +operator/=( VImage &a, const std::vector b ) { return( a = a / b ); } VImage -operator%( VImage a, VImage b ) +operator%( const VImage a, const VImage b ) { return( a.remainder( b ) ); } VImage -operator%( VImage a, double b ) +operator%( const VImage a, const double b ) { return( a.remainder_const( to_vector( b ) ) ); } VImage -operator%( VImage a, std::vector b ) +operator%( const VImage a, const std::vector b ) { return( a.remainder_const( b ) ); } @@ -974,243 +974,243 @@ operator%=( VImage &a, const double b ) } VImage & -operator%=( VImage &a, std::vector b ) +operator%=( VImage &a, const std::vector b ) { return( a = a % b ); } VImage -operator<( VImage a, VImage b ) +operator<( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_LESS ) ); } VImage -operator<( double a, VImage b ) +operator<( const double a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_MORE, to_vector( a ) ) ); } VImage -operator<( VImage a, double b ) +operator<( const VImage a, const double b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESS, to_vector( b ) ) ); } VImage -operator<( std::vector a, VImage b ) +operator<( const std::vector a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_MORE, a ) ); } VImage -operator<( VImage a, std::vector b ) +operator<( const VImage a, const std::vector b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESS, b ) ); } VImage -operator<=( VImage a, VImage b ) +operator<=( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_LESSEQ ) ); } VImage -operator<=( double a, VImage b ) +operator<=( const double a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, to_vector( a ) ) ); } VImage -operator<=( VImage a, double b ) +operator<=( const VImage a, const double b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, to_vector( b ) ) ); } VImage -operator<=( std::vector a, VImage b ) +operator<=( const std::vector a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, a ) ); } VImage -operator<=( VImage a, std::vector b ) +operator<=( const VImage a, const std::vector b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, b ) ); } VImage -operator>( VImage a, VImage b ) +operator>( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_MORE ) ); } VImage -operator>( double a, VImage b ) +operator>( const double a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESS, to_vector( a ) ) ); } VImage -operator>( VImage a, double b ) +operator>( const VImage a, const double b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_MORE, to_vector( b ) ) ); } VImage -operator>( std::vector a, VImage b ) +operator>( const std::vector a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESS, a ) ); } VImage -operator>( VImage a, std::vector b ) +operator>( const VImage a, const std::vector b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_MORE, b ) ); } VImage -operator>=( VImage a, VImage b ) +operator>=( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_MOREEQ ) ); } VImage -operator>=( double a, VImage b ) +operator>=( const double a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, to_vector( a ) ) ); } VImage -operator>=( VImage a, double b ) +operator>=( const VImage a, const double b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, to_vector( b ) ) ); } VImage -operator>=( std::vector a, VImage b ) +operator>=( const std::vector a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, a ) ); } VImage -operator>=( VImage a, std::vector b ) +operator>=( const VImage a, const std::vector b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, b ) ); } VImage -operator==( VImage a, VImage b ) +operator==( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_EQUAL ) ); } VImage -operator==( double a, VImage b ) +operator==( const double a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, to_vector( a ) ) ); } VImage -operator==( VImage a, double b ) +operator==( const VImage a, const double b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, to_vector( b ) ) ); } VImage -operator==( std::vector a, VImage b ) +operator==( const std::vector a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, a ) ); } VImage -operator==( VImage a, std::vector b ) +operator==( const VImage a, const std::vector b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, b ) ); } VImage -operator!=( VImage a, VImage b ) +operator!=( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_NOTEQ ) ); } VImage -operator!=( double a, VImage b ) +operator!=( const double a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, to_vector( a ) ) ); } VImage -operator!=( VImage a, double b ) +operator!=( const VImage a, const double b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, to_vector( b ) ) ); } VImage -operator!=( std::vector a, VImage b ) +operator!=( const std::vector a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, a ) ); } VImage -operator!=( VImage a, std::vector b ) +operator!=( const VImage a, const std::vector b ) { return( a.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, b ) ); } VImage -operator&( VImage a, VImage b ) +operator&( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_AND ) ); } VImage -operator&( double a, VImage b ) +operator&( const double a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_AND, to_vector( a ) ) ); } VImage -operator&( VImage a, double b ) +operator&( const VImage a, const double b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_AND, to_vector( b ) ) ); } VImage -operator&( std::vector a, VImage b ) +operator&( const std::vector a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_AND, a ) ); } VImage -operator&( VImage a, std::vector b ) +operator&( const VImage a, const std::vector b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_AND, b ) ); } @@ -1228,40 +1228,40 @@ operator&=( VImage &a, const double b ) } VImage & -operator&=( VImage &a, std::vector b ) +operator&=( VImage &a, const std::vector b ) { return( a = a & b ); } VImage -operator|( VImage a, VImage b ) +operator|( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_OR ) ); } VImage -operator|( double a, VImage b ) +operator|( const double a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_OR, to_vector( a ) ) ); } VImage -operator|( VImage a, double b ) +operator|( const VImage a, const double b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_OR, to_vector( b ) ) ); } VImage -operator|( std::vector a, VImage b ) +operator|( const std::vector a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_OR, a ) ); } VImage -operator|( VImage a, std::vector b ) +operator|( const VImage a, const std::vector b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_OR, b ) ); @@ -1280,40 +1280,40 @@ operator|=( VImage &a, const double b ) } VImage & -operator|=( VImage &a, std::vector b ) +operator|=( VImage &a, const std::vector b ) { return( a = a | b ); } VImage -operator^( VImage a, VImage b ) +operator^( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_EOR ) ); } VImage -operator^( double a, VImage b ) +operator^( const double a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, to_vector( a ) ) ); } VImage -operator^( VImage a, double b ) +operator^( const VImage a, const double b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, to_vector( b ) ) ); } VImage -operator^( std::vector a, VImage b ) +operator^( const std::vector a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, a ) ); } VImage -operator^( VImage a, std::vector b ) +operator^( const VImage a, const std::vector b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, b ) ); @@ -1332,26 +1332,26 @@ operator^=( VImage &a, const double b ) } VImage & -operator^=( VImage &a, std::vector b ) +operator^=( VImage &a, const std::vector b ) { return( a = a ^ b ); } VImage -operator<<( VImage a, VImage b ) +operator<<( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_LSHIFT ) ); } VImage -operator<<( VImage a, double b ) +operator<<( const VImage a, const double b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_LSHIFT, to_vector( b ) ) ); } VImage -operator<<( VImage a, std::vector b ) +operator<<( const VImage a, const std::vector b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_LSHIFT, b ) ); @@ -1370,26 +1370,26 @@ operator<<=( VImage &a, const double b ) } VImage & -operator<<=( VImage &a, std::vector b ) +operator<<=( VImage &a, const std::vector b ) { return( a = a << b ); } VImage -operator>>( VImage a, VImage b ) +operator>>( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_RSHIFT ) ); } VImage -operator>>( VImage a, double b ) +operator>>( const VImage a, const double b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_RSHIFT, to_vector( b ) ) ); } VImage -operator>>( VImage a, std::vector b ) +operator>>( const VImage a, const std::vector b ) { return( a.boolean_const( VIPS_OPERATION_BOOLEAN_RSHIFT, b ) ); @@ -1408,7 +1408,7 @@ operator>>=( VImage &a, const double b ) } VImage & -operator>>=( VImage &a, std::vector b ) +operator>>=( VImage &a, const std::vector b ) { return( a = a << b ); } diff --git a/src/libvips/cplusplus/vips-operators.cpp b/src/libvips/cplusplus/vips-operators.cpp index 02097139..9f22ffe4 100644 --- a/src/libvips/cplusplus/vips-operators.cpp +++ b/src/libvips/cplusplus/vips-operators.cpp @@ -1,5 +1,5 @@ // bodies for vips operations -// Sun 26 Nov 17:44:23 GMT 2017 +// Mon 11 Jun 14:28:56 BST 2018 // this file is generated automatically, do not edit! void VImage::system( char * cmd_format , VOption *options ) @@ -9,7 +9,7 @@ void VImage::system( char * cmd_format , VOption *options ) set( "cmd-format", cmd_format ) ); } -VImage VImage::add( VImage right , VOption *options ) +VImage VImage::add( VImage right , VOption *options ) const { VImage out; @@ -22,7 +22,7 @@ VImage VImage::add( VImage right , VOption *options ) return( out ); } -VImage VImage::subtract( VImage right , VOption *options ) +VImage VImage::subtract( VImage right , VOption *options ) const { VImage out; @@ -35,7 +35,7 @@ VImage VImage::subtract( VImage right , VOption *options ) return( out ); } -VImage VImage::multiply( VImage right , VOption *options ) +VImage VImage::multiply( VImage right , VOption *options ) const { VImage out; @@ -48,7 +48,7 @@ VImage VImage::multiply( VImage right , VOption *options ) return( out ); } -VImage VImage::divide( VImage right , VOption *options ) +VImage VImage::divide( VImage right , VOption *options ) const { VImage out; @@ -61,7 +61,7 @@ VImage VImage::divide( VImage right , VOption *options ) return( out ); } -VImage VImage::relational( VImage right , VipsOperationRelational relational , VOption *options ) +VImage VImage::relational( VImage right , VipsOperationRelational relational , VOption *options ) const { VImage out; @@ -75,7 +75,7 @@ VImage VImage::relational( VImage right , VipsOperationRelational relational , V return( out ); } -VImage VImage::remainder( VImage right , VOption *options ) +VImage VImage::remainder( VImage right , VOption *options ) const { VImage out; @@ -88,7 +88,7 @@ VImage VImage::remainder( VImage right , VOption *options ) return( out ); } -VImage VImage::boolean( VImage right , VipsOperationBoolean boolean , VOption *options ) +VImage VImage::boolean( VImage right , VipsOperationBoolean boolean , VOption *options ) const { VImage out; @@ -102,7 +102,7 @@ VImage VImage::boolean( VImage right , VipsOperationBoolean boolean , VOption *o return( out ); } -VImage VImage::math2( VImage right , VipsOperationMath2 math2 , VOption *options ) +VImage VImage::math2( VImage right , VipsOperationMath2 math2 , VOption *options ) const { VImage out; @@ -116,7 +116,7 @@ VImage VImage::math2( VImage right , VipsOperationMath2 math2 , VOption *options return( out ); } -VImage VImage::complex2( VImage right , VipsOperationComplex2 cmplx , VOption *options ) +VImage VImage::complex2( VImage right , VipsOperationComplex2 cmplx , VOption *options ) const { VImage out; @@ -130,7 +130,7 @@ VImage VImage::complex2( VImage right , VipsOperationComplex2 cmplx , VOption *o return( out ); } -VImage VImage::complexform( VImage right , VOption *options ) +VImage VImage::complexform( VImage right , VOption *options ) const { VImage out; @@ -155,7 +155,7 @@ VImage VImage::sum( std::vector in , VOption *options ) return( out ); } -VImage VImage::invert( VOption *options ) +VImage VImage::invert( VOption *options ) const { VImage out; @@ -167,7 +167,7 @@ VImage VImage::invert( VOption *options ) return( out ); } -VImage VImage::linear( std::vector a , std::vector b , VOption *options ) +VImage VImage::linear( std::vector a , std::vector b , VOption *options ) const { VImage out; @@ -181,7 +181,7 @@ VImage VImage::linear( std::vector a , std::vector b , VOption * return( out ); } -VImage VImage::math( VipsOperationMath math , VOption *options ) +VImage VImage::math( VipsOperationMath math , VOption *options ) const { VImage out; @@ -194,7 +194,7 @@ VImage VImage::math( VipsOperationMath math , VOption *options ) return( out ); } -VImage VImage::abs( VOption *options ) +VImage VImage::abs( VOption *options ) const { VImage out; @@ -206,7 +206,7 @@ VImage VImage::abs( VOption *options ) return( out ); } -VImage VImage::sign( VOption *options ) +VImage VImage::sign( VOption *options ) const { VImage out; @@ -218,7 +218,7 @@ VImage VImage::sign( VOption *options ) return( out ); } -VImage VImage::round( VipsOperationRound round , VOption *options ) +VImage VImage::round( VipsOperationRound round , VOption *options ) const { VImage out; @@ -231,7 +231,7 @@ VImage VImage::round( VipsOperationRound round , VOption *options ) return( out ); } -VImage VImage::relational_const( VipsOperationRelational relational , std::vector c , VOption *options ) +VImage VImage::relational_const( VipsOperationRelational relational , std::vector c , VOption *options ) const { VImage out; @@ -245,7 +245,7 @@ VImage VImage::relational_const( VipsOperationRelational relational , std::vecto return( out ); } -VImage VImage::remainder_const( std::vector c , VOption *options ) +VImage VImage::remainder_const( std::vector c , VOption *options ) const { VImage out; @@ -258,7 +258,7 @@ VImage VImage::remainder_const( std::vector c , VOption *options ) return( out ); } -VImage VImage::boolean_const( VipsOperationBoolean boolean , std::vector c , VOption *options ) +VImage VImage::boolean_const( VipsOperationBoolean boolean , std::vector c , VOption *options ) const { VImage out; @@ -272,7 +272,7 @@ VImage VImage::boolean_const( VipsOperationBoolean boolean , std::vector return( out ); } -VImage VImage::math2_const( VipsOperationMath2 math2 , std::vector c , VOption *options ) +VImage VImage::math2_const( VipsOperationMath2 math2 , std::vector c , VOption *options ) const { VImage out; @@ -286,7 +286,7 @@ VImage VImage::math2_const( VipsOperationMath2 math2 , std::vector c , V return( out ); } -VImage VImage::complex( VipsOperationComplex cmplx , VOption *options ) +VImage VImage::complex( VipsOperationComplex cmplx , VOption *options ) const { VImage out; @@ -299,7 +299,7 @@ VImage VImage::complex( VipsOperationComplex cmplx , VOption *options ) return( out ); } -VImage VImage::complexget( VipsOperationComplexget get , VOption *options ) +VImage VImage::complexget( VipsOperationComplexget get , VOption *options ) const { VImage out; @@ -312,7 +312,7 @@ VImage VImage::complexget( VipsOperationComplexget get , VOption *options ) return( out ); } -double VImage::avg( VOption *options ) +double VImage::avg( VOption *options ) const { double out; @@ -324,7 +324,7 @@ double VImage::avg( VOption *options ) return( out ); } -double VImage::min( VOption *options ) +double VImage::min( VOption *options ) const { double out; @@ -336,7 +336,7 @@ double VImage::min( VOption *options ) return( out ); } -double VImage::max( VOption *options ) +double VImage::max( VOption *options ) const { double out; @@ -348,7 +348,7 @@ double VImage::max( VOption *options ) return( out ); } -double VImage::deviate( VOption *options ) +double VImage::deviate( VOption *options ) const { double out; @@ -360,7 +360,7 @@ double VImage::deviate( VOption *options ) return( out ); } -VImage VImage::stats( VOption *options ) +VImage VImage::stats( VOption *options ) const { VImage out; @@ -372,7 +372,7 @@ VImage VImage::stats( VOption *options ) return( out ); } -VImage VImage::hist_find( VOption *options ) +VImage VImage::hist_find( VOption *options ) const { VImage out; @@ -384,7 +384,7 @@ VImage VImage::hist_find( VOption *options ) return( out ); } -VImage VImage::hist_find_ndim( VOption *options ) +VImage VImage::hist_find_ndim( VOption *options ) const { VImage out; @@ -396,7 +396,7 @@ VImage VImage::hist_find_ndim( VOption *options ) return( out ); } -VImage VImage::hist_find_indexed( VImage index , VOption *options ) +VImage VImage::hist_find_indexed( VImage index , VOption *options ) const { VImage out; @@ -409,7 +409,7 @@ VImage VImage::hist_find_indexed( VImage index , VOption *options ) return( out ); } -VImage VImage::hough_line( VOption *options ) +VImage VImage::hough_line( VOption *options ) const { VImage out; @@ -421,7 +421,7 @@ VImage VImage::hough_line( VOption *options ) return( out ); } -VImage VImage::hough_circle( VOption *options ) +VImage VImage::hough_circle( VOption *options ) const { VImage out; @@ -433,7 +433,7 @@ VImage VImage::hough_circle( VOption *options ) return( out ); } -VImage VImage::project( VImage * rows , VOption *options ) +VImage VImage::project( VImage * rows , VOption *options ) const { VImage columns; @@ -446,7 +446,7 @@ VImage VImage::project( VImage * rows , VOption *options ) return( columns ); } -VImage VImage::profile( VImage * rows , VOption *options ) +VImage VImage::profile( VImage * rows , VOption *options ) const { VImage columns; @@ -459,7 +459,7 @@ VImage VImage::profile( VImage * rows , VOption *options ) return( columns ); } -VImage VImage::measure( int h , int v , VOption *options ) +VImage VImage::measure( int h , int v , VOption *options ) const { VImage out; @@ -473,7 +473,7 @@ VImage VImage::measure( int h , int v , VOption *options ) return( out ); } -std::vector VImage::getpoint( int x , int y , VOption *options ) +std::vector VImage::getpoint( int x , int y , VOption *options ) const { std::vector out_array; @@ -487,7 +487,7 @@ std::vector VImage::getpoint( int x , int y , VOption *options ) return( out_array ); } -int VImage::find_trim( int * top , int * width , int * height , VOption *options ) +int VImage::find_trim( int * top , int * width , int * height , VOption *options ) const { int left; @@ -502,7 +502,7 @@ int VImage::find_trim( int * top , int * width , int * height , VOption *options return( left ); } -VImage VImage::copy( VOption *options ) +VImage VImage::copy( VOption *options ) const { VImage out; @@ -514,7 +514,7 @@ VImage VImage::copy( VOption *options ) return( out ); } -VImage VImage::tilecache( VOption *options ) +VImage VImage::tilecache( VOption *options ) const { VImage out; @@ -526,7 +526,7 @@ VImage VImage::tilecache( VOption *options ) return( out ); } -VImage VImage::linecache( VOption *options ) +VImage VImage::linecache( VOption *options ) const { VImage out; @@ -538,7 +538,7 @@ VImage VImage::linecache( VOption *options ) return( out ); } -VImage VImage::sequential( VOption *options ) +VImage VImage::sequential( VOption *options ) const { VImage out; @@ -550,7 +550,7 @@ VImage VImage::sequential( VOption *options ) return( out ); } -VImage VImage::cache( VOption *options ) +VImage VImage::cache( VOption *options ) const { VImage out; @@ -562,7 +562,7 @@ VImage VImage::cache( VOption *options ) return( out ); } -VImage VImage::embed( int x , int y , int width , int height , VOption *options ) +VImage VImage::embed( int x , int y , int width , int height , VOption *options ) const { VImage out; @@ -578,7 +578,7 @@ VImage VImage::embed( int x , int y , int width , int height , VOption *options return( out ); } -VImage VImage::gravity( VipsCompassDirection direction , int width , int height , VOption *options ) +VImage VImage::gravity( VipsCompassDirection direction , int width , int height , VOption *options ) const { VImage out; @@ -593,7 +593,7 @@ VImage VImage::gravity( VipsCompassDirection direction , int width , int height return( out ); } -VImage VImage::flip( VipsDirection direction , VOption *options ) +VImage VImage::flip( VipsDirection direction , VOption *options ) const { VImage out; @@ -606,7 +606,7 @@ VImage VImage::flip( VipsDirection direction , VOption *options ) return( out ); } -VImage VImage::insert( VImage sub , int x , int y , VOption *options ) +VImage VImage::insert( VImage sub , int x , int y , VOption *options ) const { VImage out; @@ -621,7 +621,7 @@ VImage VImage::insert( VImage sub , int x , int y , VOption *options ) return( out ); } -VImage VImage::join( VImage in2 , VipsDirection direction , VOption *options ) +VImage VImage::join( VImage in2 , VipsDirection direction , VOption *options ) const { VImage out; @@ -647,7 +647,7 @@ VImage VImage::arrayjoin( std::vector in , VOption *options ) return( out ); } -VImage VImage::extract_area( int left , int top , int width , int height , VOption *options ) +VImage VImage::extract_area( int left , int top , int width , int height , VOption *options ) const { VImage out; @@ -663,7 +663,7 @@ VImage VImage::extract_area( int left , int top , int width , int height , VOpti return( out ); } -VImage VImage::smartcrop( int width , int height , VOption *options ) +VImage VImage::smartcrop( int width , int height , VOption *options ) const { VImage out; @@ -677,7 +677,7 @@ VImage VImage::smartcrop( int width , int height , VOption *options ) return( out ); } -VImage VImage::extract_band( int band , VOption *options ) +VImage VImage::extract_band( int band , VOption *options ) const { VImage out; @@ -702,7 +702,7 @@ VImage VImage::bandjoin( std::vector in , VOption *options ) return( out ); } -VImage VImage::bandjoin_const( std::vector c , VOption *options ) +VImage VImage::bandjoin_const( std::vector c , VOption *options ) const { VImage out; @@ -727,7 +727,7 @@ VImage VImage::bandrank( std::vector in , VOption *options ) return( out ); } -VImage VImage::bandmean( VOption *options ) +VImage VImage::bandmean( VOption *options ) const { VImage out; @@ -739,7 +739,7 @@ VImage VImage::bandmean( VOption *options ) return( out ); } -VImage VImage::bandbool( VipsOperationBoolean boolean , VOption *options ) +VImage VImage::bandbool( VipsOperationBoolean boolean , VOption *options ) const { VImage out; @@ -752,7 +752,7 @@ VImage VImage::bandbool( VipsOperationBoolean boolean , VOption *options ) return( out ); } -VImage VImage::replicate( int across , int down , VOption *options ) +VImage VImage::replicate( int across , int down , VOption *options ) const { VImage out; @@ -766,7 +766,7 @@ VImage VImage::replicate( int across , int down , VOption *options ) return( out ); } -VImage VImage::cast( VipsBandFormat format , VOption *options ) +VImage VImage::cast( VipsBandFormat format , VOption *options ) const { VImage out; @@ -779,7 +779,7 @@ VImage VImage::cast( VipsBandFormat format , VOption *options ) return( out ); } -VImage VImage::rot( VipsAngle angle , VOption *options ) +VImage VImage::rot( VipsAngle angle , VOption *options ) const { VImage out; @@ -792,7 +792,7 @@ VImage VImage::rot( VipsAngle angle , VOption *options ) return( out ); } -VImage VImage::rot45( VOption *options ) +VImage VImage::rot45( VOption *options ) const { VImage out; @@ -804,7 +804,7 @@ VImage VImage::rot45( VOption *options ) return( out ); } -VImage VImage::autorot( VOption *options ) +VImage VImage::autorot( VOption *options ) const { VImage out; @@ -816,7 +816,7 @@ VImage VImage::autorot( VOption *options ) return( out ); } -VImage VImage::ifthenelse( VImage in1 , VImage in2 , VOption *options ) +VImage VImage::ifthenelse( VImage in1 , VImage in2 , VOption *options ) const { VImage out; @@ -830,7 +830,7 @@ VImage VImage::ifthenelse( VImage in1 , VImage in2 , VOption *options ) return( out ); } -VImage VImage::recomb( VImage m , VOption *options ) +VImage VImage::recomb( VImage m , VOption *options ) const { VImage out; @@ -843,7 +843,7 @@ VImage VImage::recomb( VImage m , VOption *options ) return( out ); } -VImage VImage::bandfold( VOption *options ) +VImage VImage::bandfold( VOption *options ) const { VImage out; @@ -855,7 +855,7 @@ VImage VImage::bandfold( VOption *options ) return( out ); } -VImage VImage::bandunfold( VOption *options ) +VImage VImage::bandunfold( VOption *options ) const { VImage out; @@ -867,7 +867,7 @@ VImage VImage::bandunfold( VOption *options ) return( out ); } -VImage VImage::flatten( VOption *options ) +VImage VImage::flatten( VOption *options ) const { VImage out; @@ -879,7 +879,7 @@ VImage VImage::flatten( VOption *options ) return( out ); } -VImage VImage::premultiply( VOption *options ) +VImage VImage::premultiply( VOption *options ) const { VImage out; @@ -891,7 +891,7 @@ VImage VImage::premultiply( VOption *options ) return( out ); } -VImage VImage::unpremultiply( VOption *options ) +VImage VImage::unpremultiply( VOption *options ) const { VImage out; @@ -903,7 +903,7 @@ VImage VImage::unpremultiply( VOption *options ) return( out ); } -VImage VImage::grid( int tile_height , int across , int down , VOption *options ) +VImage VImage::grid( int tile_height , int across , int down , VOption *options ) const { VImage out; @@ -918,7 +918,19 @@ VImage VImage::grid( int tile_height , int across , int down , VOption *options return( out ); } -VImage VImage::scale( VOption *options ) +VImage VImage::transpose3d( VOption *options ) const +{ + VImage out; + + call( "transpose3d" , + (options ? options : VImage::option()) -> + set( "in", *this ) -> + set( "out", &out ) ); + + return( out ); +} + +VImage VImage::scale( VOption *options ) const { VImage out; @@ -930,7 +942,7 @@ VImage VImage::scale( VOption *options ) return( out ); } -VImage VImage::wrap( VOption *options ) +VImage VImage::wrap( VOption *options ) const { VImage out; @@ -942,7 +954,7 @@ VImage VImage::wrap( VOption *options ) return( out ); } -VImage VImage::zoom( int xfac , int yfac , VOption *options ) +VImage VImage::zoom( int xfac , int yfac , VOption *options ) const { VImage out; @@ -956,7 +968,7 @@ VImage VImage::zoom( int xfac , int yfac , VOption *options ) return( out ); } -VImage VImage::subsample( int xfac , int yfac , VOption *options ) +VImage VImage::subsample( int xfac , int yfac , VOption *options ) const { VImage out; @@ -970,7 +982,7 @@ VImage VImage::subsample( int xfac , int yfac , VOption *options ) return( out ); } -VImage VImage::msb( VOption *options ) +VImage VImage::msb( VOption *options ) const { VImage out; @@ -982,7 +994,7 @@ VImage VImage::msb( VOption *options ) return( out ); } -VImage VImage::byteswap( VOption *options ) +VImage VImage::byteswap( VOption *options ) const { VImage out; @@ -994,7 +1006,7 @@ VImage VImage::byteswap( VOption *options ) return( out ); } -VImage VImage::falsecolour( VOption *options ) +VImage VImage::falsecolour( VOption *options ) const { VImage out; @@ -1006,7 +1018,7 @@ VImage VImage::falsecolour( VOption *options ) return( out ); } -VImage VImage::gamma( VOption *options ) +VImage VImage::gamma( VOption *options ) const { VImage out; @@ -1031,6 +1043,20 @@ VImage VImage::composite( std::vector in , std::vector mode , VOpti return( out ); } +VImage VImage::composite2( VImage overlay , VipsBlendMode mode , VOption *options ) const +{ + VImage out; + + call( "composite2" , + (options ? options : VImage::option()) -> + set( "base", *this ) -> + set( "overlay", overlay ) -> + set( "out", &out ) -> + set( "mode", mode ) ); + + return( out ); +} + VImage VImage::black( int width , int height , VOption *options ) { VImage out; @@ -1318,7 +1344,7 @@ VImage VImage::mask_fractal( int width , int height , double fractal_dimension , return( out ); } -VImage VImage::buildlut( VOption *options ) +VImage VImage::buildlut( VOption *options ) const { VImage out; @@ -1330,7 +1356,7 @@ VImage VImage::buildlut( VOption *options ) return( out ); } -VImage VImage::invertlut( VOption *options ) +VImage VImage::invertlut( VOption *options ) const { VImage out; @@ -1731,7 +1757,7 @@ VImage VImage::openexrload( char * filename , VOption *options ) return( out ); } -void VImage::csvsave( char * filename , VOption *options ) +void VImage::csvsave( char * filename , VOption *options ) const { call( "csvsave" , (options ? options : VImage::option()) -> @@ -1739,7 +1765,7 @@ void VImage::csvsave( char * filename , VOption *options ) set( "filename", filename ) ); } -void VImage::matrixsave( char * filename , VOption *options ) +void VImage::matrixsave( char * filename , VOption *options ) const { call( "matrixsave" , (options ? options : VImage::option()) -> @@ -1747,14 +1773,14 @@ void VImage::matrixsave( char * filename , VOption *options ) set( "filename", filename ) ); } -void VImage::matrixprint( VOption *options ) +void VImage::matrixprint( VOption *options ) const { call( "matrixprint" , (options ? options : VImage::option()) -> set( "in", *this ) ); } -void VImage::rawsave( char * filename , VOption *options ) +void VImage::rawsave( char * filename , VOption *options ) const { call( "rawsave" , (options ? options : VImage::option()) -> @@ -1762,7 +1788,7 @@ void VImage::rawsave( char * filename , VOption *options ) set( "filename", filename ) ); } -void VImage::rawsave_fd( int fd , VOption *options ) +void VImage::rawsave_fd( int fd , VOption *options ) const { call( "rawsave_fd" , (options ? options : VImage::option()) -> @@ -1770,7 +1796,7 @@ void VImage::rawsave_fd( int fd , VOption *options ) set( "fd", fd ) ); } -void VImage::vipssave( char * filename , VOption *options ) +void VImage::vipssave( char * filename , VOption *options ) const { call( "vipssave" , (options ? options : VImage::option()) -> @@ -1778,7 +1804,7 @@ void VImage::vipssave( char * filename , VOption *options ) set( "filename", filename ) ); } -void VImage::ppmsave( char * filename , VOption *options ) +void VImage::ppmsave( char * filename , VOption *options ) const { call( "ppmsave" , (options ? options : VImage::option()) -> @@ -1786,7 +1812,7 @@ void VImage::ppmsave( char * filename , VOption *options ) set( "filename", filename ) ); } -void VImage::radsave( char * filename , VOption *options ) +void VImage::radsave( char * filename , VOption *options ) const { call( "radsave" , (options ? options : VImage::option()) -> @@ -1794,7 +1820,7 @@ void VImage::radsave( char * filename , VOption *options ) set( "filename", filename ) ); } -VipsBlob * VImage::radsave_buffer( VOption *options ) +VipsBlob * VImage::radsave_buffer( VOption *options ) const { VipsBlob * buffer; @@ -1806,7 +1832,7 @@ VipsBlob * VImage::radsave_buffer( VOption *options ) return( buffer ); } -void VImage::dzsave( char * filename , VOption *options ) +void VImage::dzsave( char * filename , VOption *options ) const { call( "dzsave" , (options ? options : VImage::option()) -> @@ -1814,7 +1840,7 @@ void VImage::dzsave( char * filename , VOption *options ) set( "filename", filename ) ); } -VipsBlob * VImage::dzsave_buffer( VOption *options ) +VipsBlob * VImage::dzsave_buffer( VOption *options ) const { VipsBlob * buffer; @@ -1826,7 +1852,7 @@ VipsBlob * VImage::dzsave_buffer( VOption *options ) return( buffer ); } -void VImage::pngsave( char * filename , VOption *options ) +void VImage::pngsave( char * filename , VOption *options ) const { call( "pngsave" , (options ? options : VImage::option()) -> @@ -1834,7 +1860,7 @@ void VImage::pngsave( char * filename , VOption *options ) set( "filename", filename ) ); } -VipsBlob * VImage::pngsave_buffer( VOption *options ) +VipsBlob * VImage::pngsave_buffer( VOption *options ) const { VipsBlob * buffer; @@ -1846,7 +1872,7 @@ VipsBlob * VImage::pngsave_buffer( VOption *options ) return( buffer ); } -void VImage::jpegsave( char * filename , VOption *options ) +void VImage::jpegsave( char * filename , VOption *options ) const { call( "jpegsave" , (options ? options : VImage::option()) -> @@ -1854,7 +1880,7 @@ void VImage::jpegsave( char * filename , VOption *options ) set( "filename", filename ) ); } -VipsBlob * VImage::jpegsave_buffer( VOption *options ) +VipsBlob * VImage::jpegsave_buffer( VOption *options ) const { VipsBlob * buffer; @@ -1866,14 +1892,14 @@ VipsBlob * VImage::jpegsave_buffer( VOption *options ) return( buffer ); } -void VImage::jpegsave_mime( VOption *options ) +void VImage::jpegsave_mime( VOption *options ) const { call( "jpegsave_mime" , (options ? options : VImage::option()) -> set( "in", *this ) ); } -void VImage::webpsave( char * filename , VOption *options ) +void VImage::webpsave( char * filename , VOption *options ) const { call( "webpsave" , (options ? options : VImage::option()) -> @@ -1881,7 +1907,7 @@ void VImage::webpsave( char * filename , VOption *options ) set( "filename", filename ) ); } -VipsBlob * VImage::webpsave_buffer( VOption *options ) +VipsBlob * VImage::webpsave_buffer( VOption *options ) const { VipsBlob * buffer; @@ -1893,7 +1919,7 @@ VipsBlob * VImage::webpsave_buffer( VOption *options ) return( buffer ); } -void VImage::tiffsave( char * filename , VOption *options ) +void VImage::tiffsave( char * filename , VOption *options ) const { call( "tiffsave" , (options ? options : VImage::option()) -> @@ -1901,7 +1927,7 @@ void VImage::tiffsave( char * filename , VOption *options ) set( "filename", filename ) ); } -VipsBlob * VImage::tiffsave_buffer( VOption *options ) +VipsBlob * VImage::tiffsave_buffer( VOption *options ) const { VipsBlob * buffer; @@ -1913,7 +1939,27 @@ VipsBlob * VImage::tiffsave_buffer( VOption *options ) return( buffer ); } -void VImage::fitssave( char * filename , VOption *options ) +void VImage::magicksave( char * filename , VOption *options ) const +{ + call( "magicksave" , + (options ? options : VImage::option()) -> + set( "in", *this ) -> + set( "filename", filename ) ); +} + +VipsBlob * VImage::magicksave_buffer( VOption *options ) const +{ + VipsBlob * buffer; + + call( "magicksave_buffer" , + (options ? options : VImage::option()) -> + set( "in", *this ) -> + set( "buffer", &buffer ) ); + + return( buffer ); +} + +void VImage::fitssave( char * filename , VOption *options ) const { call( "fitssave" , (options ? options : VImage::option()) -> @@ -1947,7 +1993,7 @@ VImage VImage::thumbnail_buffer( VipsBlob * buffer , int width , VOption *option return( out ); } -VImage VImage::thumbnail_image( int width , VOption *options ) +VImage VImage::thumbnail_image( int width , VOption *options ) const { VImage out; @@ -1960,7 +2006,7 @@ VImage VImage::thumbnail_image( int width , VOption *options ) return( out ); } -VImage VImage::mapim( VImage index , VOption *options ) +VImage VImage::mapim( VImage index , VOption *options ) const { VImage out; @@ -1973,7 +2019,7 @@ VImage VImage::mapim( VImage index , VOption *options ) return( out ); } -VImage VImage::shrink( double hshrink , double vshrink , VOption *options ) +VImage VImage::shrink( double hshrink , double vshrink , VOption *options ) const { VImage out; @@ -1987,7 +2033,7 @@ VImage VImage::shrink( double hshrink , double vshrink , VOption *options ) return( out ); } -VImage VImage::shrinkh( int hshrink , VOption *options ) +VImage VImage::shrinkh( int hshrink , VOption *options ) const { VImage out; @@ -2000,7 +2046,7 @@ VImage VImage::shrinkh( int hshrink , VOption *options ) return( out ); } -VImage VImage::shrinkv( int vshrink , VOption *options ) +VImage VImage::shrinkv( int vshrink , VOption *options ) const { VImage out; @@ -2013,7 +2059,7 @@ VImage VImage::shrinkv( int vshrink , VOption *options ) return( out ); } -VImage VImage::reduceh( double hshrink , VOption *options ) +VImage VImage::reduceh( double hshrink , VOption *options ) const { VImage out; @@ -2026,7 +2072,7 @@ VImage VImage::reduceh( double hshrink , VOption *options ) return( out ); } -VImage VImage::reducev( double vshrink , VOption *options ) +VImage VImage::reducev( double vshrink , VOption *options ) const { VImage out; @@ -2039,7 +2085,7 @@ VImage VImage::reducev( double vshrink , VOption *options ) return( out ); } -VImage VImage::reduce( double hshrink , double vshrink , VOption *options ) +VImage VImage::reduce( double hshrink , double vshrink , VOption *options ) const { VImage out; @@ -2053,7 +2099,7 @@ VImage VImage::reduce( double hshrink , double vshrink , VOption *options ) return( out ); } -VImage VImage::quadratic( VImage coeff , VOption *options ) +VImage VImage::quadratic( VImage coeff , VOption *options ) const { VImage out; @@ -2066,7 +2112,7 @@ VImage VImage::quadratic( VImage coeff , VOption *options ) return( out ); } -VImage VImage::affine( std::vector matrix , VOption *options ) +VImage VImage::affine( std::vector matrix , VOption *options ) const { VImage out; @@ -2079,7 +2125,7 @@ VImage VImage::affine( std::vector matrix , VOption *options ) return( out ); } -VImage VImage::similarity( VOption *options ) +VImage VImage::similarity( VOption *options ) const { VImage out; @@ -2091,7 +2137,20 @@ VImage VImage::similarity( VOption *options ) return( out ); } -VImage VImage::resize( double scale , VOption *options ) +VImage VImage::rotate( double angle , VOption *options ) const +{ + VImage out; + + call( "rotate" , + (options ? options : VImage::option()) -> + set( "in", *this ) -> + set( "out", &out ) -> + set( "angle", angle ) ); + + return( out ); +} + +VImage VImage::resize( double scale , VOption *options ) const { VImage out; @@ -2104,7 +2163,7 @@ VImage VImage::resize( double scale , VOption *options ) return( out ); } -VImage VImage::colourspace( VipsInterpretation space , VOption *options ) +VImage VImage::colourspace( VipsInterpretation space , VOption *options ) const { VImage out; @@ -2117,7 +2176,7 @@ VImage VImage::colourspace( VipsInterpretation space , VOption *options ) return( out ); } -VImage VImage::Lab2XYZ( VOption *options ) +VImage VImage::Lab2XYZ( VOption *options ) const { VImage out; @@ -2129,7 +2188,7 @@ VImage VImage::Lab2XYZ( VOption *options ) return( out ); } -VImage VImage::XYZ2Lab( VOption *options ) +VImage VImage::XYZ2Lab( VOption *options ) const { VImage out; @@ -2141,7 +2200,7 @@ VImage VImage::XYZ2Lab( VOption *options ) return( out ); } -VImage VImage::Lab2LCh( VOption *options ) +VImage VImage::Lab2LCh( VOption *options ) const { VImage out; @@ -2153,7 +2212,7 @@ VImage VImage::Lab2LCh( VOption *options ) return( out ); } -VImage VImage::LCh2Lab( VOption *options ) +VImage VImage::LCh2Lab( VOption *options ) const { VImage out; @@ -2165,7 +2224,7 @@ VImage VImage::LCh2Lab( VOption *options ) return( out ); } -VImage VImage::LCh2CMC( VOption *options ) +VImage VImage::LCh2CMC( VOption *options ) const { VImage out; @@ -2177,7 +2236,7 @@ VImage VImage::LCh2CMC( VOption *options ) return( out ); } -VImage VImage::CMC2LCh( VOption *options ) +VImage VImage::CMC2LCh( VOption *options ) const { VImage out; @@ -2189,7 +2248,7 @@ VImage VImage::CMC2LCh( VOption *options ) return( out ); } -VImage VImage::XYZ2Yxy( VOption *options ) +VImage VImage::XYZ2Yxy( VOption *options ) const { VImage out; @@ -2201,7 +2260,7 @@ VImage VImage::XYZ2Yxy( VOption *options ) return( out ); } -VImage VImage::Yxy2XYZ( VOption *options ) +VImage VImage::Yxy2XYZ( VOption *options ) const { VImage out; @@ -2213,7 +2272,7 @@ VImage VImage::Yxy2XYZ( VOption *options ) return( out ); } -VImage VImage::scRGB2XYZ( VOption *options ) +VImage VImage::scRGB2XYZ( VOption *options ) const { VImage out; @@ -2225,7 +2284,7 @@ VImage VImage::scRGB2XYZ( VOption *options ) return( out ); } -VImage VImage::XYZ2scRGB( VOption *options ) +VImage VImage::XYZ2scRGB( VOption *options ) const { VImage out; @@ -2237,7 +2296,7 @@ VImage VImage::XYZ2scRGB( VOption *options ) return( out ); } -VImage VImage::LabQ2Lab( VOption *options ) +VImage VImage::LabQ2Lab( VOption *options ) const { VImage out; @@ -2249,7 +2308,7 @@ VImage VImage::LabQ2Lab( VOption *options ) return( out ); } -VImage VImage::Lab2LabQ( VOption *options ) +VImage VImage::Lab2LabQ( VOption *options ) const { VImage out; @@ -2261,7 +2320,7 @@ VImage VImage::Lab2LabQ( VOption *options ) return( out ); } -VImage VImage::LabQ2LabS( VOption *options ) +VImage VImage::LabQ2LabS( VOption *options ) const { VImage out; @@ -2273,7 +2332,7 @@ VImage VImage::LabQ2LabS( VOption *options ) return( out ); } -VImage VImage::LabS2LabQ( VOption *options ) +VImage VImage::LabS2LabQ( VOption *options ) const { VImage out; @@ -2285,7 +2344,7 @@ VImage VImage::LabS2LabQ( VOption *options ) return( out ); } -VImage VImage::LabS2Lab( VOption *options ) +VImage VImage::LabS2Lab( VOption *options ) const { VImage out; @@ -2297,7 +2356,7 @@ VImage VImage::LabS2Lab( VOption *options ) return( out ); } -VImage VImage::Lab2LabS( VOption *options ) +VImage VImage::Lab2LabS( VOption *options ) const { VImage out; @@ -2309,7 +2368,7 @@ VImage VImage::Lab2LabS( VOption *options ) return( out ); } -VImage VImage::rad2float( VOption *options ) +VImage VImage::rad2float( VOption *options ) const { VImage out; @@ -2321,7 +2380,7 @@ VImage VImage::rad2float( VOption *options ) return( out ); } -VImage VImage::float2rad( VOption *options ) +VImage VImage::float2rad( VOption *options ) const { VImage out; @@ -2333,7 +2392,7 @@ VImage VImage::float2rad( VOption *options ) return( out ); } -VImage VImage::LabQ2sRGB( VOption *options ) +VImage VImage::LabQ2sRGB( VOption *options ) const { VImage out; @@ -2345,7 +2404,7 @@ VImage VImage::LabQ2sRGB( VOption *options ) return( out ); } -VImage VImage::sRGB2HSV( VOption *options ) +VImage VImage::sRGB2HSV( VOption *options ) const { VImage out; @@ -2357,7 +2416,7 @@ VImage VImage::sRGB2HSV( VOption *options ) return( out ); } -VImage VImage::HSV2sRGB( VOption *options ) +VImage VImage::HSV2sRGB( VOption *options ) const { VImage out; @@ -2369,7 +2428,7 @@ VImage VImage::HSV2sRGB( VOption *options ) return( out ); } -VImage VImage::icc_import( VOption *options ) +VImage VImage::icc_import( VOption *options ) const { VImage out; @@ -2381,7 +2440,7 @@ VImage VImage::icc_import( VOption *options ) return( out ); } -VImage VImage::icc_export( VOption *options ) +VImage VImage::icc_export( VOption *options ) const { VImage out; @@ -2393,7 +2452,7 @@ VImage VImage::icc_export( VOption *options ) return( out ); } -VImage VImage::icc_transform( char * output_profile , VOption *options ) +VImage VImage::icc_transform( char * output_profile , VOption *options ) const { VImage out; @@ -2406,7 +2465,7 @@ VImage VImage::icc_transform( char * output_profile , VOption *options ) return( out ); } -VImage VImage::dE76( VImage right , VOption *options ) +VImage VImage::dE76( VImage right , VOption *options ) const { VImage out; @@ -2419,7 +2478,7 @@ VImage VImage::dE76( VImage right , VOption *options ) return( out ); } -VImage VImage::dE00( VImage right , VOption *options ) +VImage VImage::dE00( VImage right , VOption *options ) const { VImage out; @@ -2432,7 +2491,7 @@ VImage VImage::dE00( VImage right , VOption *options ) return( out ); } -VImage VImage::dECMC( VImage right , VOption *options ) +VImage VImage::dECMC( VImage right , VOption *options ) const { VImage out; @@ -2445,7 +2504,7 @@ VImage VImage::dECMC( VImage right , VOption *options ) return( out ); } -VImage VImage::sRGB2scRGB( VOption *options ) +VImage VImage::sRGB2scRGB( VOption *options ) const { VImage out; @@ -2457,7 +2516,7 @@ VImage VImage::sRGB2scRGB( VOption *options ) return( out ); } -VImage VImage::scRGB2BW( VOption *options ) +VImage VImage::scRGB2BW( VOption *options ) const { VImage out; @@ -2469,7 +2528,7 @@ VImage VImage::scRGB2BW( VOption *options ) return( out ); } -VImage VImage::scRGB2sRGB( VOption *options ) +VImage VImage::scRGB2sRGB( VOption *options ) const { VImage out; @@ -2481,7 +2540,7 @@ VImage VImage::scRGB2sRGB( VOption *options ) return( out ); } -VImage VImage::maplut( VImage lut , VOption *options ) +VImage VImage::maplut( VImage lut , VOption *options ) const { VImage out; @@ -2494,7 +2553,7 @@ VImage VImage::maplut( VImage lut , VOption *options ) return( out ); } -int VImage::percent( double percent , VOption *options ) +int VImage::percent( double percent , VOption *options ) const { int threshold; @@ -2507,7 +2566,7 @@ int VImage::percent( double percent , VOption *options ) return( threshold ); } -VImage VImage::stdif( int width , int height , VOption *options ) +VImage VImage::stdif( int width , int height , VOption *options ) const { VImage out; @@ -2521,7 +2580,7 @@ VImage VImage::stdif( int width , int height , VOption *options ) return( out ); } -VImage VImage::hist_cum( VOption *options ) +VImage VImage::hist_cum( VOption *options ) const { VImage out; @@ -2533,7 +2592,7 @@ VImage VImage::hist_cum( VOption *options ) return( out ); } -VImage VImage::hist_match( VImage ref , VOption *options ) +VImage VImage::hist_match( VImage ref , VOption *options ) const { VImage out; @@ -2546,7 +2605,7 @@ VImage VImage::hist_match( VImage ref , VOption *options ) return( out ); } -VImage VImage::hist_norm( VOption *options ) +VImage VImage::hist_norm( VOption *options ) const { VImage out; @@ -2558,7 +2617,7 @@ VImage VImage::hist_norm( VOption *options ) return( out ); } -VImage VImage::hist_equal( VOption *options ) +VImage VImage::hist_equal( VOption *options ) const { VImage out; @@ -2570,7 +2629,7 @@ VImage VImage::hist_equal( VOption *options ) return( out ); } -VImage VImage::hist_plot( VOption *options ) +VImage VImage::hist_plot( VOption *options ) const { VImage out; @@ -2582,7 +2641,7 @@ VImage VImage::hist_plot( VOption *options ) return( out ); } -VImage VImage::hist_local( int width , int height , VOption *options ) +VImage VImage::hist_local( int width , int height , VOption *options ) const { VImage out; @@ -2596,7 +2655,7 @@ VImage VImage::hist_local( int width , int height , VOption *options ) return( out ); } -bool VImage::hist_ismonotonic( VOption *options ) +bool VImage::hist_ismonotonic( VOption *options ) const { bool monotonic; @@ -2608,7 +2667,7 @@ bool VImage::hist_ismonotonic( VOption *options ) return( monotonic ); } -double VImage::hist_entropy( VOption *options ) +double VImage::hist_entropy( VOption *options ) const { double out; @@ -2620,7 +2679,7 @@ double VImage::hist_entropy( VOption *options ) return( out ); } -VImage VImage::conv( VImage mask , VOption *options ) +VImage VImage::conv( VImage mask , VOption *options ) const { VImage out; @@ -2633,7 +2692,7 @@ VImage VImage::conv( VImage mask , VOption *options ) return( out ); } -VImage VImage::conva( VImage mask , VOption *options ) +VImage VImage::conva( VImage mask , VOption *options ) const { VImage out; @@ -2646,7 +2705,7 @@ VImage VImage::conva( VImage mask , VOption *options ) return( out ); } -VImage VImage::convf( VImage mask , VOption *options ) +VImage VImage::convf( VImage mask , VOption *options ) const { VImage out; @@ -2659,7 +2718,7 @@ VImage VImage::convf( VImage mask , VOption *options ) return( out ); } -VImage VImage::convi( VImage mask , VOption *options ) +VImage VImage::convi( VImage mask , VOption *options ) const { VImage out; @@ -2672,7 +2731,7 @@ VImage VImage::convi( VImage mask , VOption *options ) return( out ); } -VImage VImage::compass( VImage mask , VOption *options ) +VImage VImage::compass( VImage mask , VOption *options ) const { VImage out; @@ -2685,7 +2744,7 @@ VImage VImage::compass( VImage mask , VOption *options ) return( out ); } -VImage VImage::convsep( VImage mask , VOption *options ) +VImage VImage::convsep( VImage mask , VOption *options ) const { VImage out; @@ -2698,7 +2757,7 @@ VImage VImage::convsep( VImage mask , VOption *options ) return( out ); } -VImage VImage::convasep( VImage mask , VOption *options ) +VImage VImage::convasep( VImage mask , VOption *options ) const { VImage out; @@ -2711,7 +2770,7 @@ VImage VImage::convasep( VImage mask , VOption *options ) return( out ); } -VImage VImage::fastcor( VImage ref , VOption *options ) +VImage VImage::fastcor( VImage ref , VOption *options ) const { VImage out; @@ -2724,7 +2783,7 @@ VImage VImage::fastcor( VImage ref , VOption *options ) return( out ); } -VImage VImage::spcor( VImage ref , VOption *options ) +VImage VImage::spcor( VImage ref , VOption *options ) const { VImage out; @@ -2737,7 +2796,7 @@ VImage VImage::spcor( VImage ref , VOption *options ) return( out ); } -VImage VImage::sharpen( VOption *options ) +VImage VImage::sharpen( VOption *options ) const { VImage out; @@ -2749,7 +2808,7 @@ VImage VImage::sharpen( VOption *options ) return( out ); } -VImage VImage::gaussblur( double sigma , VOption *options ) +VImage VImage::gaussblur( double sigma , VOption *options ) const { VImage out; @@ -2762,7 +2821,31 @@ VImage VImage::gaussblur( double sigma , VOption *options ) return( out ); } -VImage VImage::fwfft( VOption *options ) +VImage VImage::canny( VOption *options ) const +{ + VImage out; + + call( "canny" , + (options ? options : VImage::option()) -> + set( "in", *this ) -> + set( "out", &out ) ); + + return( out ); +} + +VImage VImage::sobel( VOption *options ) const +{ + VImage out; + + call( "sobel" , + (options ? options : VImage::option()) -> + set( "in", *this ) -> + set( "out", &out ) ); + + return( out ); +} + +VImage VImage::fwfft( VOption *options ) const { VImage out; @@ -2774,7 +2857,7 @@ VImage VImage::fwfft( VOption *options ) return( out ); } -VImage VImage::invfft( VOption *options ) +VImage VImage::invfft( VOption *options ) const { VImage out; @@ -2786,7 +2869,7 @@ VImage VImage::invfft( VOption *options ) return( out ); } -VImage VImage::freqmult( VImage mask , VOption *options ) +VImage VImage::freqmult( VImage mask , VOption *options ) const { VImage out; @@ -2799,7 +2882,7 @@ VImage VImage::freqmult( VImage mask , VOption *options ) return( out ); } -VImage VImage::spectrum( VOption *options ) +VImage VImage::spectrum( VOption *options ) const { VImage out; @@ -2811,7 +2894,7 @@ VImage VImage::spectrum( VOption *options ) return( out ); } -VImage VImage::phasecor( VImage in2 , VOption *options ) +VImage VImage::phasecor( VImage in2 , VOption *options ) const { VImage out; @@ -2824,7 +2907,7 @@ VImage VImage::phasecor( VImage in2 , VOption *options ) return( out ); } -VImage VImage::morph( VImage mask , VipsOperationMorphology morph , VOption *options ) +VImage VImage::morph( VImage mask , VipsOperationMorphology morph , VOption *options ) const { VImage out; @@ -2838,7 +2921,7 @@ VImage VImage::morph( VImage mask , VipsOperationMorphology morph , VOption *opt return( out ); } -VImage VImage::rank( int width , int height , int index , VOption *options ) +VImage VImage::rank( int width , int height , int index , VOption *options ) const { VImage out; @@ -2853,7 +2936,7 @@ VImage VImage::rank( int width , int height , int index , VOption *options ) return( out ); } -double VImage::countlines( VipsDirection direction , VOption *options ) +double VImage::countlines( VipsDirection direction , VOption *options ) const { double nolines; @@ -2866,7 +2949,7 @@ double VImage::countlines( VipsDirection direction , VOption *options ) return( nolines ); } -VImage VImage::labelregions( VOption *options ) +VImage VImage::labelregions( VOption *options ) const { VImage mask; @@ -2878,7 +2961,7 @@ VImage VImage::labelregions( VOption *options ) return( mask ); } -VImage VImage::fill_nearest( VOption *options ) +VImage VImage::fill_nearest( VOption *options ) const { VImage out; @@ -2890,7 +2973,7 @@ VImage VImage::fill_nearest( VOption *options ) return( out ); } -void VImage::draw_rect( std::vector ink , int left , int top , int width , int height , VOption *options ) +void VImage::draw_rect( std::vector ink , int left , int top , int width , int height , VOption *options ) const { call( "draw_rect" , (options ? options : VImage::option()) -> @@ -2902,7 +2985,7 @@ void VImage::draw_rect( std::vector ink , int left , int top , int width set( "height", height ) ); } -void VImage::draw_mask( std::vector ink , VImage mask , int x , int y , VOption *options ) +void VImage::draw_mask( std::vector ink , VImage mask , int x , int y , VOption *options ) const { call( "draw_mask" , (options ? options : VImage::option()) -> @@ -2913,7 +2996,7 @@ void VImage::draw_mask( std::vector ink , VImage mask , int x , int y , set( "y", y ) ); } -void VImage::draw_line( std::vector ink , int x1 , int y1 , int x2 , int y2 , VOption *options ) +void VImage::draw_line( std::vector ink , int x1 , int y1 , int x2 , int y2 , VOption *options ) const { call( "draw_line" , (options ? options : VImage::option()) -> @@ -2925,7 +3008,7 @@ void VImage::draw_line( std::vector ink , int x1 , int y1 , int x2 , int set( "y2", y2 ) ); } -void VImage::draw_circle( std::vector ink , int cx , int cy , int radius , VOption *options ) +void VImage::draw_circle( std::vector ink , int cx , int cy , int radius , VOption *options ) const { call( "draw_circle" , (options ? options : VImage::option()) -> @@ -2936,7 +3019,7 @@ void VImage::draw_circle( std::vector ink , int cx , int cy , int radius set( "radius", radius ) ); } -void VImage::draw_flood( std::vector ink , int x , int y , VOption *options ) +void VImage::draw_flood( std::vector ink , int x , int y , VOption *options ) const { call( "draw_flood" , (options ? options : VImage::option()) -> @@ -2946,7 +3029,7 @@ void VImage::draw_flood( std::vector ink , int x , int y , VOption *opti set( "y", y ) ); } -void VImage::draw_image( VImage sub , int x , int y , VOption *options ) +void VImage::draw_image( VImage sub , int x , int y , VOption *options ) const { call( "draw_image" , (options ? options : VImage::option()) -> @@ -2956,7 +3039,7 @@ void VImage::draw_image( VImage sub , int x , int y , VOption *options ) set( "y", y ) ); } -void VImage::draw_smudge( int left , int top , int width , int height , VOption *options ) +void VImage::draw_smudge( int left , int top , int width , int height , VOption *options ) const { call( "draw_smudge" , (options ? options : VImage::option()) -> @@ -2967,7 +3050,7 @@ void VImage::draw_smudge( int left , int top , int width , int height , VOption set( "height", height ) ); } -VImage VImage::merge( VImage sec , VipsDirection direction , int dx , int dy , VOption *options ) +VImage VImage::merge( VImage sec , VipsDirection direction , int dx , int dy , VOption *options ) const { VImage out; @@ -2983,7 +3066,7 @@ VImage VImage::merge( VImage sec , VipsDirection direction , int dx , int dy , V return( out ); } -VImage VImage::mosaic( VImage sec , VipsDirection direction , int xref , int yref , int xsec , int ysec , VOption *options ) +VImage VImage::mosaic( VImage sec , VipsDirection direction , int xref , int yref , int xsec , int ysec , VOption *options ) const { VImage out; @@ -3001,7 +3084,7 @@ VImage VImage::mosaic( VImage sec , VipsDirection direction , int xref , int yre return( out ); } -VImage VImage::mosaic1( VImage sec , VipsDirection direction , int xr1 , int yr1 , int xs1 , int ys1 , int xr2 , int yr2 , int xs2 , int ys2 , VOption *options ) +VImage VImage::mosaic1( VImage sec , VipsDirection direction , int xr1 , int yr1 , int xs1 , int ys1 , int xr2 , int yr2 , int xs2 , int ys2 , VOption *options ) const { VImage out; @@ -3023,7 +3106,7 @@ VImage VImage::mosaic1( VImage sec , VipsDirection direction , int xr1 , int yr1 return( out ); } -VImage VImage::match( VImage sec , int xr1 , int yr1 , int xs1 , int ys1 , int xr2 , int yr2 , int xs2 , int ys2 , VOption *options ) +VImage VImage::match( VImage sec , int xr1 , int yr1 , int xs1 , int ys1 , int xr2 , int yr2 , int xs2 , int ys2 , VOption *options ) const { VImage out; @@ -3044,7 +3127,7 @@ VImage VImage::match( VImage sec , int xr1 , int yr1 , int xs1 , int ys1 , int x return( out ); } -VImage VImage::globalbalance( VOption *options ) +VImage VImage::globalbalance( VOption *options ) const { VImage out; diff --git a/src/pipeline.cc b/src/pipeline.cc index dedb376f..a1e414fc 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -894,10 +894,6 @@ class PipelineWorker : public Nan::AsyncWorker { if (baton->tiffCompression == VIPS_FOREIGN_TIFF_COMPRESSION_JPEG) { sharp::AssertImageTypeDimensions(image, ImageType::JPEG); } - // Cast pixel values to float, if required - if (baton->tiffPredictor == VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT) { - image = image.cast(VIPS_FORMAT_FLOAT); - } image.tiffsave(const_cast(baton->fileOut.data()), VImage::option() ->set("strip", !baton->withMetadata) ->set("Q", baton->tiffQuality) diff --git a/src/utilities.cc b/src/utilities.cc index 02347429..3dcad391 100644 --- a/src/utilities.cc +++ b/src/utilities.cc @@ -259,7 +259,7 @@ NAN_METHOD(_maxColourDistance) { } // Calculate colour distance maxColourDistance = image1.dE00(image2).max(); - } catch (VError err) { + } catch (VError const &err) { return ThrowError(err.what()); } diff --git a/test/fixtures/expected/extract-lch.jpg b/test/fixtures/expected/extract-lch.jpg index 6840777a418b181b1a072cf9ac53246fca0e3ee9..8de27d15fda7e5b4d4d7704eba6f20947943fcb7 100644 GIT binary patch delta 12882 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 delta 12833 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 diff --git a/test/fixtures/expected/fast-shrink-on-load-false.png b/test/fixtures/expected/fast-shrink-on-load-false.png index 8fab8a42b49ec144cab0990e25563debdade1f5b..a4c7241d50357b68e7f4a623d684bc8c5f02bdd7 100644 GIT binary patch delta 221 zcmV<303!c_0*(TZIe)-OL_t&t*CmbF4uUWcMf=m*2W^o>_ENS|qEY-E9w07>{R;vK z#6CJoax=-?JLe8smc_CxDMgaRr&GO7&pRrm&@@fATN6bAW07GH$FW@3iR19`xTDWU z`@T=<9$bjQ4MQK}ZQHhJ7zWsiA`>D{)1<0OAqvLguIrH2x>l}h&RLf6vdjT8O#|c2 z>-9wAI7%t=JOy!{{0ld>ZT5YS=6NQBfCYj=pf8v6;Xr@?AZwZ{r6dSELUur}M@qfF X&-sPX-~WGJ00000NkvXXu0mjfCr@Xn delta 209 zcmV;?051QI0)hgNIe)ZCL_t&t*Cmh14udcZMDxv6PZerenovkWSwo(ZFdd7fn3He(E9&pdwx!Hv=+j>EoJ);hB9d*Ulf zQ`)w*5P6oRLU89Cndezb*>w#B1Zu5{LSXcowRRjwDS1`Bn@Xk%!~6AmQK~zRgDlI! zIfoG%C~y_|QVPEZjZz9b?)_1fYJM!%XKJls2SOA*z=^$SGWg*Onh=Ukk&T{u00000 LNkvXXu0mjf^x0oX diff --git a/test/fixtures/expected/fast-shrink-on-load-true.png b/test/fixtures/expected/fast-shrink-on-load-true.png index e1d28756d70edff028406613aac9b3ab7d142f1a..5033da3a5b9ddbf0fc3a9dcfe391d731af81dad1 100644 GIT binary patch delta 216 zcmV;}04M*40*L~UIe)uJL_t&t*CmeI3W7isMdynvDNI3{G%u4QhNXE+ne<}>-$Wn% z5HBxn35LUA)~v;lbzK=_d7c`^Rftm8X=QSyCHRnJu=+O{R| zD5bV-DvF$@vEx|pcX&ALx~|(i&UqLpyUXmn81yR8xjw8lw?C|=&-#q*U z9Wc*xF(qja+%yeYmPOMvJjZPmyM zDY^`M1!1^cI5W)Lgb;N;rb*Kt2pK`(c^+eoSe7ZJyqIlU zX_|zgUleajowltnCd8Lgk|a@H7@#K4Gf&8Y6y?r&ye!Mf#&J|t zC5~SpU|`}rxpMP7BV@unU4OzBc&e(D@^`Yn@1y7}Ynqx6?7EaOy6-!%KV9ODxmLSf Q$p8QV07*qoM6N<$f(h1TG5`Po diff --git a/test/fixtures/expected/tint-blue.jpg b/test/fixtures/expected/tint-blue.jpg index f6b3a33e406d1b7b80519d4daca03265ee67e011..e3f4cc36e5f832fc8dee454cdd5fbc56e36aa2b4 100644 GIT binary patch delta 14914 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 A$N&HU delta 14922 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 ID6jtk*`p)u2><{9 diff --git a/test/fixtures/expected/tint-green.jpg b/test/fixtures/expected/tint-green.jpg index bff7df280666b610fcc850aa8474aad633dd4e1b..b5e58c42aea123b873f61ed93e317a3b1544fd31 100644 GIT binary patch delta 12536 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 delta 12526 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

>3<&jw4Axd0OeIQ=W!@#Cv~6y E*`~~!nE(I) diff --git a/test/fixtures/expected/tint-red.jpg b/test/fixtures/expected/tint-red.jpg index f4167bea516eb60793d87731d54ba8926a42ce37..f81a01c46af35df58f1d64a65c156b804a9bcc60 100644 GIT binary patch delta 12165 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 H;iv!E?7Ib| delta 12114 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

_(@I>e7RO&DW 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 diff --git a/test/fixtures/expected/tint-sepia.jpg b/test/fixtures/expected/tint-sepia.jpg index e6c5dadebf89b2a942e5686bd9f41c7f476af05e..db2b8bb79545d884964c7022d568f52be952727e 100644 GIT binary patch delta 14046 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 diff --git a/test/unit/cache.js b/test/unit/cache.js index 093b91c0..888bf886 100644 --- a/test/unit/cache.js +++ b/test/unit/cache.js @@ -1,9 +1,10 @@ 'use strict'; +const detectLibc = require('detect-libc'); const sharp = require('../../'); -// Define SHARP_TEST_WITHOUT_CACHE environment variable to prevent use of libvips' cache +const usingCache = detectLibc.family !== detectLibc.MUSL; beforeEach(function () { - sharp.cache(!process.env.SHARP_TEST_WITHOUT_CACHE); + sharp.cache(usingCache); }); diff --git a/test/unit/io.js b/test/unit/io.js index 8c5f0fb3..34b4b433 100644 --- a/test/unit/io.js +++ b/test/unit/io.js @@ -2,6 +2,7 @@ const fs = require('fs'); const assert = require('assert'); +const rimraf = require('rimraf'); const sharp = require('../../'); const fixtures = require('../fixtures'); @@ -16,7 +17,7 @@ describe('Input/output', function () { it('Read from File and write to Stream', function (done) { const writable = fs.createWriteStream(fixtures.outputJpg); - writable.on('finish', function () { + writable.on('close', function () { sharp(fixtures.outputJpg).toBuffer(function (err, data, info) { if (err) throw err; assert.strictEqual(true, data.length > 0); @@ -24,8 +25,7 @@ describe('Input/output', function () { assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); }); sharp(fixtures.inputJpg).resize(320, 240).pipe(writable); @@ -34,7 +34,7 @@ describe('Input/output', function () { it('Read from Buffer and write to Stream', function (done) { const inputJpgBuffer = fs.readFileSync(fixtures.inputJpg); const writable = fs.createWriteStream(fixtures.outputJpg); - writable.on('finish', function () { + writable.on('close', function () { sharp(fixtures.outputJpg).toBuffer(function (err, data, info) { if (err) throw err; assert.strictEqual(true, data.length > 0); @@ -42,8 +42,7 @@ describe('Input/output', function () { assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); }); sharp(inputJpgBuffer).resize(320, 240).pipe(writable); @@ -57,8 +56,7 @@ describe('Input/output', function () { assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); readable.pipe(pipeline); }); @@ -134,7 +132,7 @@ describe('Input/output', function () { it('Read from Stream and write to Stream', function (done) { const readable = fs.createReadStream(fixtures.inputJpg); const writable = fs.createWriteStream(fixtures.outputJpg); - writable.on('finish', function () { + writable.on('close', function () { sharp(fixtures.outputJpg).toBuffer(function (err, data, info) { if (err) throw err; assert.strictEqual(true, data.length > 0); @@ -142,8 +140,7 @@ describe('Input/output', function () { assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); }); const pipeline = sharp().resize(320, 240); @@ -162,10 +159,9 @@ describe('Input/output', function () { assert.strictEqual(3, info.channels); infoEventEmitted = true; }); - writable.on('finish', function () { + writable.on('close', function () { assert.strictEqual(true, infoEventEmitted); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); readable.pipe(pipeline).pipe(writable); }); @@ -177,8 +173,7 @@ describe('Input/output', function () { anErrorWasEmitted = !!err; }).on('end', function () { assert(anErrorWasEmitted); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); const readableButNotAnImage = fs.createReadStream(__filename); const writable = fs.createWriteStream(fixtures.outputJpg); @@ -192,8 +187,7 @@ describe('Input/output', function () { anErrorWasEmitted = !!err; }).on('end', function () { assert(anErrorWasEmitted); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); const writable = fs.createWriteStream(fixtures.outputJpg); readableButNotAnImage.pipe(writable); @@ -202,7 +196,7 @@ describe('Input/output', function () { it('Readable side of Stream can start flowing after Writable side has finished', function (done) { const readable = fs.createReadStream(fixtures.inputJpg); const writable = fs.createWriteStream(fixtures.outputJpg); - writable.on('finish', function () { + writable.on('close', function () { sharp(fixtures.outputJpg).toBuffer(function (err, data, info) { if (err) throw err; assert.strictEqual(true, data.length > 0); @@ -210,8 +204,7 @@ describe('Input/output', function () { assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); assert.strictEqual(240, info.height); - fs.unlinkSync(fixtures.outputJpg); - done(); + rimraf(fixtures.outputJpg, done); }); }); const pipeline = sharp().resize(320, 240); @@ -564,8 +557,7 @@ describe('Input/output', function () { assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); assert.strictEqual(80, info.height); - fs.unlinkSync(fixtures.outputZoinks); - done(); + rimraf(fixtures.outputZoinks, done); }); }); @@ -578,8 +570,7 @@ describe('Input/output', function () { assert.strictEqual('png', info.format); assert.strictEqual(320, info.width); assert.strictEqual(80, info.height); - fs.unlinkSync(fixtures.outputZoinks); - done(); + rimraf(fixtures.outputZoinks, done); }); }); @@ -592,8 +583,7 @@ describe('Input/output', function () { assert.strictEqual('webp', info.format); assert.strictEqual(320, info.width); assert.strictEqual(80, info.height); - fs.unlinkSync(fixtures.outputZoinks); - done(); + rimraf(fixtures.outputZoinks, done); }); }); @@ -606,8 +596,7 @@ describe('Input/output', function () { assert.strictEqual('tiff', info.format); assert.strictEqual(320, info.width); assert.strictEqual(80, info.height); - fs.unlinkSync(fixtures.outputZoinks); - done(); + rimraf(fixtures.outputZoinks, done); }); }); @@ -620,8 +609,7 @@ describe('Input/output', function () { assert.strictEqual('png', info.format); assert.strictEqual(320, info.width); assert.strictEqual(80, info.height); - fs.unlinkSync(fixtures.outputZoinks); - done(); + rimraf(fixtures.outputZoinks, done); }); }); @@ -635,8 +623,7 @@ describe('Input/output', function () { assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); assert.strictEqual(80, info.height); - fs.unlinkSync(fixtures.outputZoinks); - done(); + rimraf(fixtures.outputZoinks, done); }); }); }); @@ -1080,7 +1067,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size === startSize); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1097,7 +1084,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size < (startSize / 2)); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1120,7 +1107,7 @@ describe('Input/output', function () { sharp(fixtures.outputTiff).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual(metadata.density, res * 2.54); // convert to dpi - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); }); @@ -1165,7 +1152,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size < startSize); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1181,7 +1168,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size < startSize); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1196,7 +1183,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size < startSize); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1211,7 +1198,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size < startSize); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1226,7 +1213,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size < startSize); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1240,7 +1227,7 @@ describe('Input/output', function () { if (err) throw err; assert.strictEqual('tiff', info.format); assert(info.size < startSize); - fs.unlink(fixtures.outputTiff, done); + rimraf(fixtures.outputTiff, done); }); }); @@ -1384,8 +1371,7 @@ describe('Input/output', function () { assert.strictEqual('v', info.format); assert.strictEqual(70, info.width); assert.strictEqual(60, info.height); - fs.unlinkSync(fixtures.outputV); - done(); + rimraf(fixtures.outputV, done); }); });