From 3150fad9099fb7a7f1bb82230c7dd3b154fbfb71 Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Tue, 14 Jul 2020 11:10:20 +0100 Subject: [PATCH] Upgrade to libvips 8.10.0-beta2 --- binding.gyp | 2 +- docs/api-output.md | 6 +- docs/changelog.md | 6 +- docs/search-index.json | 2 +- install/libvips.js | 2 +- lib/constructor.js | 2 +- lib/output.js | 14 +- package.json | 10 +- src/common.cc | 2 +- src/libvips/cplusplus/VImage.cpp | 925 +++++++++--------- src/libvips/cplusplus/vips-operators.cpp | 118 ++- src/pipeline.cc | 16 +- src/pipeline.h | 4 +- .../expected/conv-sobel-horizontal.jpg | Bin 19066 -> 18964 bytes test/fixtures/expected/extract.webp | Bin 4862 -> 4872 bytes test/fixtures/expected/tint-cmyk.jpg | Bin 26317 -> 26307 bytes test/unit/failOnError.js | 4 +- test/unit/tiff.js | 12 +- 18 files changed, 627 insertions(+), 498 deletions(-) diff --git a/binding.gyp b/binding.gyp index 07cd4865..326dcb60 100644 --- a/binding.gyp +++ b/binding.gyp @@ -95,7 +95,7 @@ 'src/sharp.cc' ], 'include_dirs': [ - '= 90 chroma is never subsampled (optional, default `'4:2:0'`) + - `options.chromaSubsampling` **[string][2]** set to '4:4:4' to prevent chroma subsampling otherwise defaults to '4:2:0' chroma subsampling (optional, default `'4:2:0'`) - `options.optimiseCoding` **[boolean][7]** optimise Huffman coding tables (optional, default `true`) - `options.optimizeCoding` **[boolean][7]** alternative spelling of optimiseCoding (optional, default `true`) - `options.trellisQuantisation` **[boolean][7]** apply trellis quantisation, requires libvips compiled with support for mozjpeg (optional, default `false`) @@ -254,7 +254,7 @@ Use these TIFF options for output image. - `options.tileHeight` **[boolean][7]** vertical tile size (optional, default `256`) - `options.xres` **[number][9]** horizontal resolution in pixels/mm (optional, default `1.0`) - `options.yres` **[number][9]** vertical resolution in pixels/mm (optional, default `1.0`) - - `options.squash` **[boolean][7]** squash 8-bit images down to 1 bit (optional, default `false`) + - `options.bitdepth` **[boolean][7]** reduce bitdepth to 1, 2 or 4 bit (optional, default `8`) ### Examples @@ -263,7 +263,7 @@ Use these TIFF options for output image. sharp('input.svg') .tiff({ compression: 'lzw', - squash: true + bitdepth: 1 }) .toFile('1-bpp-output.tiff') .then(info => { ... }); diff --git a/docs/changelog.md b/docs/changelog.md index c7ef02fd..37503ab3 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,12 +2,16 @@ ## v0.26 - *zoom* -Requires libvips v8.9.2 +Requires libvips v8.10.0 ### v0.26.0 - TBD * Prebuilt libvips binaries are now statically-linked and Brotli-compressed, requiring Node.js 10.16.0+. +* TIFF output `squash` is replaced by `bitdepth` to reduce to 1, 2 or 4 bit. + +* JPEG output `quality` >= 90 no longer automatically sets `chromaSubsampling` to `4:4:4`. + ## v0.25 - *yield* Requires libvips v8.9.1 diff --git a/docs/search-index.json b/docs/search-index.json index d256cdbb..3c9dd339 100644 --- a/docs/search-index.json +++ b/docs/search-index.json @@ -1 +1 @@ -[{"t":"Prerequisites","d":"Node.js v10","k":"prerequisites node","l":"/install#prerequisites"},{"t":"Prebuilt binaries","d":"Ready-compiled sharp and libvips binaries are provided for use with Node.js v10 on the most common platforms macOS x64 10.13 Linux x64 glibc","k":"prebuilt binaries ready compiled sharp libvips binaries provided node most common platforms macos linux glibc","l":"/install#prebuilt-binaries"},{"t":"Common problems","d":"The architecture and platform of Node.js used for npm install must be the same as the architecture and platform of Node.js used at runtime.","k":"common problems architecture platform node used npm install must same architecture platform node used runtime","l":"/install#common-problems"},{"t":"Custom libvips","d":"To use a custom, globally-installed version of libvips instead of the provided binaries, make sure it is at least the version listed under c","k":"custom libvips custom globally installed version libvips instead provided binaries make sure least version listed under","l":"/install#custom-libvips"},{"t":"Building from source","d":"This module will be compiled from source at npm install time when a globally-installed libvips is detected set the SHARP_IGNORE_GLOBAL_LIBVI","k":"building source module compiled source npm install time globally installed libvips detected sharpignoregloballibvi","l":"/install#building-from-source"},{"t":"Custom prebuilt binaries","d":"This is an advanced approach that most people will not require. To install the prebuilt sharp binaries from a custom URL, set the sharp_bina","k":"custom prebuilt binaries advanced approach most people require install prebuilt sharp binaries custom url sharpbina","l":"/install#custom-prebuilt-binaries"},{"t":"Chinese mirror","d":"Alibaba provide a mirror site based in China containing binaries for both sharp and libvips. To use this either set the following configurat","k":"chinese mirror alibaba provide mirror site based china containing binaries both sharp libvips following configurat","l":"/install#chinese-mirror"},{"t":"FreeBSD","d":"The vips package must be installed before npm install is run. sh pkg install -y pkgconf vips sh cd /usr/ports/graphics/vips/ make install cl","k":"freebsd vips package must installed before npm install run pkg install pkgconf vips usr ports graphics vips make install","l":"/install#freebsd"},{"t":"Heroku","d":"Add the jemalloc buildpack to reduce the effects of memory fragmentation. Set NODE_MODULES_CACHE","k":"heroku add jemalloc buildpack reduce effects memory fragmentation nodemodulescache","l":"/install#heroku"},{"t":"AWS Lambda","d":"Set the Lambda runtime to nodejs12.x. The binaries in the node_modules directory of the deployment package must be for the Linux x64 platfor","k":"aws lambda lambda runtime nodejs binaries nodemodules directory deployment package must linux platfor","l":"/install#aws-lambda"},{"t":"Electron","d":"Electron provides versions of the V8 JavaScript engine that are incompatible with Node.js. To ensure the correct binaries are used, run the","k":"electron electron provides versions javascript engine incompatible node ensure correct binaries used run","l":"/install#electron"},{"t":"Sharp","d":"Constructor factory to create an instance of sharp, to which further methods are chained.","k":"sharp constructor factory create instance sharp further methods chained","l":"/api-constructor#sharp"},{"t":"clone","d":"Take a snapshot of the Sharp instance, returning a new instance. Cloned instances inherit the input of their parent instance. This allows mu","k":"clone take snapshot sharp instance returning new instance cloned instances inherit input parent instance allows","l":"/api-constructor#clone"},{"t":"metadata","d":"Fast access to uncached image metadata without decoding any compressed image data. A Promise is returned when callback is not provided.","k":"metadata fast access uncached image metadata without decoding compressed image data promise returned callback provided","l":"/api-input#metadata"},{"t":"stats","d":"Access to pixel-derived image statistics for every channel in the image. A Promise is returned when callback is not provided.","k":"stats access pixel derived image statistics every channel image promise returned callback provided","l":"/api-input#stats"},{"t":"toFile","d":"Write output image data to a file.","k":"tofile write output image data file","l":"/api-output#tofile"},{"t":"toBuffer","d":"Write output to a Buffer. JPEG, PNG, WebP, TIFF and RAW output are supported.","k":"tobuffer write output buffer jpeg png webp tiff raw output supported","l":"/api-output#tobuffer"},{"t":"withMetadata","d":"Include all metadata EXIF, XMP, IPTC from the input image in the output image. This will also convert to and add a web-friendly sRGB ICC pro","k":"withmetadata include metadata exif xmp iptc input image output image also convert add web friendly srgb icc pro","l":"/api-output#withmetadata"},{"t":"toFormat","d":"Force output to a given format.","k":"toformat force output given format","l":"/api-output#toformat"},{"t":"jpeg","d":"Use these JPEG options for output image.","k":"jpeg jpeg options output image","l":"/api-output#jpeg"},{"t":"png","d":"Use these PNG options for output image.","k":"png png options output image","l":"/api-output#png"},{"t":"webp","d":"Use these WebP options for output image.","k":"webp webp options output image","l":"/api-output#webp"},{"t":"tiff","d":"Use these TIFF options for output image.","k":"tiff tiff options output image","l":"/api-output#tiff"},{"t":"heif","d":"Use these HEIF options for output image.","k":"heif heif options output image","l":"/api-output#heif"},{"t":"raw","d":"Force output to be raw, uncompressed, 8-bit unsigned integer unit8 pixel data. Pixel ordering is left-to-right, top-to-bottom, without paddi","k":"raw force output raw uncompressed bit unsigned integer unit pixel data pixel ordering left right top bottom without paddi","l":"/api-output#raw"},{"t":"tile","d":"Use tile-based deep zoom image pyramid output. Set the format and options for tile images via the toFormat, jpeg, png or webp functions. Use","k":"tile tile based deep zoom image pyramid output format options tile images via toformat jpeg png webp functions","l":"/api-output#tile"},{"t":"resize","d":"Resize image to width, height or width x height.","k":"resize resize image width height width height","l":"/api-resize#resize"},{"t":"extend","d":"Extends/pads the edges of the image with the provided background colour. This operation will always occur after resizing and extraction, if","k":"extend extends pads edges image provided background colour operation occur after resizing extraction","l":"/api-resize#extend"},{"t":"extract","d":"Extract/crop a region of the image.","k":"extract extract crop region image","l":"/api-resize#extract"},{"t":"trim","d":"Trim boring pixels from all edges that contain values similar to the top-left pixel. Images consisting entirely of a single colour will calc","k":"trim trim boring pixels edges contain values similar top left pixel images consisting entirely single colour calc","l":"/api-resize#trim"},{"t":"composite","d":"Composite images over the processed resized, extracted etc. image.","k":"composite composite images processed resized extracted image","l":"/api-composite#composite"},{"t":"rotate","d":"Rotate the output image by either an explicit angle or auto-orient based on the EXIF Orientation tag.","k":"rotate rotate output image explicit angle auto orient based exif orientation tag","l":"/api-operation#rotate"},{"t":"flip","d":"Flip the image about the vertical Y axis. This always occurs after rotation, if any. The use of flip implies the removal of the EXIF Orienta","k":"flip flip image vertical axis occurs after rotation flip implies removal exif orienta","l":"/api-operation#flip"},{"t":"flop","d":"Flop the image about the horizontal X axis. This always occurs after rotation, if any. The use of flop implies the removal of the EXIF Orien","k":"flop flop image horizontal axis occurs after rotation flop implies removal exif orien","l":"/api-operation#flop"},{"t":"sharpen","d":"Sharpen the image. When used without parameters, performs a fast, mild sharpen of the output image. When a sigma is provided, performs a slo","k":"sharpen sharpen image used without parameters performs fast mild sharpen output image sigma provided performs slo","l":"/api-operation#sharpen"},{"t":"median","d":"Apply median filter. When used without parameters the default window is 3x3.","k":"median apply median filter used without parameters default window","l":"/api-operation#median"},{"t":"blur","d":"Blur the image. When used without parameters, performs a fast, mild blur of the output image. When a sigma is provided, performs a slower, m","k":"blur blur image used without parameters performs fast mild blur output image sigma provided performs slower","l":"/api-operation#blur"},{"t":"flatten","d":"Merge alpha transparency channel, if any, with a background.","k":"flatten merge alpha transparency channel background","l":"/api-operation#flatten"},{"t":"gamma","d":"Apply a gamma correction by reducing the encoding darken pre-resize at a factor of 1/gamma then increasing the encoding brighten post-resize","k":"gamma apply gamma correction reducing encoding darken pre resize factor gamma then increasing encoding brighten post resize","l":"/api-operation#gamma"},{"t":"negate","d":"Produce the negative of the image.","k":"negate produce negative image","l":"/api-operation#negate"},{"t":"normalise","d":"Enhance output image contrast by stretching its luminance to cover the full dynamic range.","k":"normalise enhance output image contrast stretching luminance cover full dynamic range","l":"/api-operation#normalise"},{"t":"normalize","d":"Alternative spelling of normalise.","k":"normalize alternative spelling normalise","l":"/api-operation#normalize"},{"t":"convolve","d":"Convolve the image with the specified kernel.","k":"convolve convolve image specified kernel","l":"/api-operation#convolve"},{"t":"threshold","d":"Any pixel value greather than or equal to the threshold value will be set to 255, otherwise it will be set to 0.","k":"threshold pixel value greather than equal threshold value otherwise","l":"/api-operation#threshold"},{"t":"boolean","d":"Perform a bitwise boolean operation with operand image.","k":"boolean perform bitwise boolean operation operand image","l":"/api-operation#boolean"},{"t":"linear","d":"Apply the linear formula a input b to the image levels adjustment","k":"linear apply linear formula input image levels adjustment","l":"/api-operation#linear"},{"t":"recomb","d":"Recomb the image with the specified matrix.","k":"recomb recomb image specified matrix","l":"/api-operation#recomb"},{"t":"modulate","d":"Transforms the image using brightness, saturation and hue rotation.","k":"modulate transforms image brightness saturation hue rotation","l":"/api-operation#modulate"},{"t":"removeAlpha","d":"Remove alpha channel, if any. This is a no-op if the image does not have an alpha channel.","k":"removealpha remove alpha channel image alpha channel","l":"/api-channel#removealpha"},{"t":"ensureAlpha","d":"Ensure alpha channel, if missing. The added alpha channel will be fully opaque. This is a no-op if the image already has an alpha channel.","k":"ensurealpha ensure alpha channel missing added alpha channel fully opaque image alpha channel","l":"/api-channel#ensurealpha"},{"t":"extractChannel","d":"Extract a single channel from a multi-channel image.","k":"extractchannel extract single channel multi channel image","l":"/api-channel#extractchannel"},{"t":"joinChannel","d":"Join one or more channels to the image. The meaning of the added channels depends on the output colourspace, set with toColourspace. By defa","k":"joinchannel join one channels image meaning added channels depends output colourspace tocolourspace defa","l":"/api-channel#joinchannel"},{"t":"bandbool","d":"Perform a bitwise boolean operation on all input image channels bands to produce a single channel output image.","k":"bandbool perform bitwise boolean operation input image channels bands produce single channel output image","l":"/api-channel#bandbool"},{"t":"tint","d":"Tint the image using the provided chroma while preserving the image luminance. An alpha channel may be present and will be unchanged by the","k":"tint tint image provided chroma while preserving image luminance alpha channel present unchanged","l":"/api-colour#tint"},{"t":"greyscale","d":"Convert to 8-bit greyscale 256 shades of grey. This is a linear operation. If the input image is in a non-linear colour space such as sRGB,","k":"greyscale convert bit greyscale shades grey linear operation input image non linear colour space such srgb","l":"/api-colour#greyscale"},{"t":"grayscale","d":"Alternative spelling of greyscale.","k":"grayscale alternative spelling greyscale","l":"/api-colour#grayscale"},{"t":"toColourspace","d":"Set the output colourspace. By default output image will be web-friendly sRGB, with additional channels interpreted as alpha channels.","k":"tocolourspace output colourspace default output image web friendly srgb additional channels interpreted alpha channels","l":"/api-colour#tocolourspace"},{"t":"toColorspace","d":"Alternative spelling of toColourspace.","k":"tocolorspace alternative spelling tocolourspace","l":"/api-colour#tocolorspace"},{"t":"format","d":"An Object containing nested boolean values representing the available input and output formats/methods.","k":"format object containing nested boolean values representing available input output formats methods","l":"/api-utility#format"},{"t":"versions","d":"An Object containing the version numbers of libvips and its dependencies.","k":"versions object containing version numbers libvips dependencies","l":"/api-utility#versions"},{"t":"cache","d":"Gets or, when options are provided, sets the limits of _libvips_ operation cache. Existing entries in the cache will be trimmed after any ch","k":"cache options provided limits libvips operation cache existing entries cache trimmed after","l":"/api-utility#cache"},{"t":"concurrency","d":"Gets or, when a concurrency is provided, sets the number of threads _libvips_ should create to process each image. The default value is the","k":"concurrency concurrency provided number threads libvips create process image default value","l":"/api-utility#concurrency"},{"t":"queue","d":"An EventEmitter that emits a change event when a task is either","k":"queue eventemitter emits change event task","l":"/api-utility#queue"},{"t":"counters","d":"Provides access to internal task counters.","k":"counters provides access internal task counters","l":"/api-utility#counters"},{"t":"simd","d":"Get and set use of SIMD vector unit instructions. Requires libvips to have been compiled with liborc support.","k":"simd simd vector unit instructions requires libvips compiled liborc support","l":"/api-utility#simd"}] \ No newline at end of file +[{"t":"Prerequisites","d":"Node.js v10.16.0","k":"prerequisites node","l":"/install#prerequisites"},{"t":"Prebuilt binaries","d":"Ready-compiled sharp and libvips binaries are provided for use with Node.js v10.16.0 on the most common platforms macOS x64 10.13 Linux x64","k":"prebuilt binaries ready compiled sharp libvips binaries provided node most common platforms macos linux","l":"/install#prebuilt-binaries"},{"t":"Common problems","d":"The architecture and platform of Node.js used for npm install must be the same as the architecture and platform of Node.js used at runtime.","k":"common problems architecture platform node used npm install must same architecture platform node used runtime","l":"/install#common-problems"},{"t":"Custom libvips","d":"To use a custom, globally-installed version of libvips instead of the provided binaries, make sure it is at least the version listed under c","k":"custom libvips custom globally installed version libvips instead provided binaries make sure least version listed under","l":"/install#custom-libvips"},{"t":"Building from source","d":"This module will be compiled from source at npm install time when a globally-installed libvips is detected set the SHARP_IGNORE_GLOBAL_LIBVI","k":"building source module compiled source npm install time globally installed libvips detected sharpignoregloballibvi","l":"/install#building-from-source"},{"t":"Custom prebuilt binaries","d":"This is an advanced approach that most people will not require. To install the prebuilt sharp binaries from a custom URL, set the sharp_bina","k":"custom prebuilt binaries advanced approach most people require install prebuilt sharp binaries custom url sharpbina","l":"/install#custom-prebuilt-binaries"},{"t":"Chinese mirror","d":"Alibaba provide a mirror site based in China containing binaries for both sharp and libvips. To use this either set the following configurat","k":"chinese mirror alibaba provide mirror site based china containing binaries both sharp libvips following configurat","l":"/install#chinese-mirror"},{"t":"FreeBSD","d":"The vips package must be installed before npm install is run. sh pkg install -y pkgconf vips sh cd /usr/ports/graphics/vips/ make install cl","k":"freebsd vips package must installed before npm install run pkg install pkgconf vips usr ports graphics vips make install","l":"/install#freebsd"},{"t":"Heroku","d":"Add the jemalloc buildpack to reduce the effects of memory fragmentation. Set NODE_MODULES_CACHE","k":"heroku add jemalloc buildpack reduce effects memory fragmentation nodemodulescache","l":"/install#heroku"},{"t":"AWS Lambda","d":"Set the Lambda runtime to nodejs12.x. The binaries in the node_modules directory of the deployment package must be for the Linux x64 platfor","k":"aws lambda lambda runtime nodejs binaries nodemodules directory deployment package must linux platfor","l":"/install#aws-lambda"},{"t":"Electron","d":"Electron provides versions of the V8 JavaScript engine that are incompatible with Node.js. To ensure the correct binaries are used, run the","k":"electron electron provides versions javascript engine incompatible node ensure correct binaries used run","l":"/install#electron"},{"t":"Worker threads","d":"The main thread must call requiresharp before worker threads are created to ensure shared libraries remain loaded in memory until after all","k":"worker threads main thread must call requiresharp before worker threads created ensure shared libraries remain loaded memory until after","l":"/install#worker-threads"},{"t":"Sharp","d":"Constructor factory to create an instance of sharp, to which further methods are chained.","k":"sharp constructor factory create instance sharp further methods chained","l":"/api-constructor#sharp"},{"t":"clone","d":"Take a snapshot of the Sharp instance, returning a new instance. Cloned instances inherit the input of their parent instance. This allows mu","k":"clone take snapshot sharp instance returning new instance cloned instances inherit input parent instance allows","l":"/api-constructor#clone"},{"t":"metadata","d":"Fast access to uncached image metadata without decoding any compressed image data. A Promise is returned when callback is not provided.","k":"metadata fast access uncached image metadata without decoding compressed image data promise returned callback provided","l":"/api-input#metadata"},{"t":"stats","d":"Access to pixel-derived image statistics for every channel in the image. A Promise is returned when callback is not provided.","k":"stats access pixel derived image statistics every channel image promise returned callback provided","l":"/api-input#stats"},{"t":"toFile","d":"Write output image data to a file.","k":"tofile write output image data file","l":"/api-output#tofile"},{"t":"toBuffer","d":"Write output to a Buffer. JPEG, PNG, WebP, TIFF and RAW output are supported.","k":"tobuffer write output buffer jpeg png webp tiff raw output supported","l":"/api-output#tobuffer"},{"t":"withMetadata","d":"Include all metadata EXIF, XMP, IPTC from the input image in the output image. This will also convert to and add a web-friendly sRGB ICC pro","k":"withmetadata include metadata exif xmp iptc input image output image also convert add web friendly srgb icc pro","l":"/api-output#withmetadata"},{"t":"toFormat","d":"Force output to a given format.","k":"toformat force output given format","l":"/api-output#toformat"},{"t":"jpeg","d":"Use these JPEG options for output image.","k":"jpeg jpeg options output image","l":"/api-output#jpeg"},{"t":"png","d":"Use these PNG options for output image.","k":"png png options output image","l":"/api-output#png"},{"t":"webp","d":"Use these WebP options for output image.","k":"webp webp options output image","l":"/api-output#webp"},{"t":"tiff","d":"Use these TIFF options for output image.","k":"tiff tiff options output image","l":"/api-output#tiff"},{"t":"heif","d":"Use these HEIF options for output image.","k":"heif heif options output image","l":"/api-output#heif"},{"t":"raw","d":"Force output to be raw, uncompressed, 8-bit unsigned integer unit8 pixel data. Pixel ordering is left-to-right, top-to-bottom, without paddi","k":"raw force output raw uncompressed bit unsigned integer unit pixel data pixel ordering left right top bottom without paddi","l":"/api-output#raw"},{"t":"tile","d":"Use tile-based deep zoom image pyramid output. Set the format and options for tile images via the toFormat, jpeg, png or webp functions. Use","k":"tile tile based deep zoom image pyramid output format options tile images via toformat jpeg png webp functions","l":"/api-output#tile"},{"t":"resize","d":"Resize image to width, height or width x height.","k":"resize resize image width height width height","l":"/api-resize#resize"},{"t":"extend","d":"Extends/pads the edges of the image with the provided background colour. This operation will always occur after resizing and extraction, if","k":"extend extends pads edges image provided background colour operation occur after resizing extraction","l":"/api-resize#extend"},{"t":"extract","d":"Extract/crop a region of the image.","k":"extract extract crop region image","l":"/api-resize#extract"},{"t":"trim","d":"Trim boring pixels from all edges that contain values similar to the top-left pixel. Images consisting entirely of a single colour will calc","k":"trim trim boring pixels edges contain values similar top left pixel images consisting entirely single colour calc","l":"/api-resize#trim"},{"t":"composite","d":"Composite images over the processed resized, extracted etc. image.","k":"composite composite images processed resized extracted image","l":"/api-composite#composite"},{"t":"rotate","d":"Rotate the output image by either an explicit angle or auto-orient based on the EXIF Orientation tag.","k":"rotate rotate output image explicit angle auto orient based exif orientation tag","l":"/api-operation#rotate"},{"t":"flip","d":"Flip the image about the vertical Y axis. This always occurs after rotation, if any. The use of flip implies the removal of the EXIF Orienta","k":"flip flip image vertical axis occurs after rotation flip implies removal exif orienta","l":"/api-operation#flip"},{"t":"flop","d":"Flop the image about the horizontal X axis. This always occurs after rotation, if any. The use of flop implies the removal of the EXIF Orien","k":"flop flop image horizontal axis occurs after rotation flop implies removal exif orien","l":"/api-operation#flop"},{"t":"sharpen","d":"Sharpen the image. When used without parameters, performs a fast, mild sharpen of the output image. When a sigma is provided, performs a slo","k":"sharpen sharpen image used without parameters performs fast mild sharpen output image sigma provided performs slo","l":"/api-operation#sharpen"},{"t":"median","d":"Apply median filter. When used without parameters the default window is 3x3.","k":"median apply median filter used without parameters default window","l":"/api-operation#median"},{"t":"blur","d":"Blur the image. When used without parameters, performs a fast, mild blur of the output image. When a sigma is provided, performs a slower, m","k":"blur blur image used without parameters performs fast mild blur output image sigma provided performs slower","l":"/api-operation#blur"},{"t":"flatten","d":"Merge alpha transparency channel, if any, with a background.","k":"flatten merge alpha transparency channel background","l":"/api-operation#flatten"},{"t":"gamma","d":"Apply a gamma correction by reducing the encoding darken pre-resize at a factor of 1/gamma then increasing the encoding brighten post-resize","k":"gamma apply gamma correction reducing encoding darken pre resize factor gamma then increasing encoding brighten post resize","l":"/api-operation#gamma"},{"t":"negate","d":"Produce the negative of the image.","k":"negate produce negative image","l":"/api-operation#negate"},{"t":"normalise","d":"Enhance output image contrast by stretching its luminance to cover the full dynamic range.","k":"normalise enhance output image contrast stretching luminance cover full dynamic range","l":"/api-operation#normalise"},{"t":"normalize","d":"Alternative spelling of normalise.","k":"normalize alternative spelling normalise","l":"/api-operation#normalize"},{"t":"convolve","d":"Convolve the image with the specified kernel.","k":"convolve convolve image specified kernel","l":"/api-operation#convolve"},{"t":"threshold","d":"Any pixel value greather than or equal to the threshold value will be set to 255, otherwise it will be set to 0.","k":"threshold pixel value greather than equal threshold value otherwise","l":"/api-operation#threshold"},{"t":"boolean","d":"Perform a bitwise boolean operation with operand image.","k":"boolean perform bitwise boolean operation operand image","l":"/api-operation#boolean"},{"t":"linear","d":"Apply the linear formula a input b to the image levels adjustment","k":"linear apply linear formula input image levels adjustment","l":"/api-operation#linear"},{"t":"recomb","d":"Recomb the image with the specified matrix.","k":"recomb recomb image specified matrix","l":"/api-operation#recomb"},{"t":"modulate","d":"Transforms the image using brightness, saturation and hue rotation.","k":"modulate transforms image brightness saturation hue rotation","l":"/api-operation#modulate"},{"t":"removeAlpha","d":"Remove alpha channel, if any. This is a no-op if the image does not have an alpha channel.","k":"removealpha remove alpha channel image alpha channel","l":"/api-channel#removealpha"},{"t":"ensureAlpha","d":"Ensure alpha channel, if missing. The added alpha channel will be fully opaque. This is a no-op if the image already has an alpha channel.","k":"ensurealpha ensure alpha channel missing added alpha channel fully opaque image alpha channel","l":"/api-channel#ensurealpha"},{"t":"extractChannel","d":"Extract a single channel from a multi-channel image.","k":"extractchannel extract single channel multi channel image","l":"/api-channel#extractchannel"},{"t":"joinChannel","d":"Join one or more channels to the image. The meaning of the added channels depends on the output colourspace, set with toColourspace. By defa","k":"joinchannel join one channels image meaning added channels depends output colourspace tocolourspace defa","l":"/api-channel#joinchannel"},{"t":"bandbool","d":"Perform a bitwise boolean operation on all input image channels bands to produce a single channel output image.","k":"bandbool perform bitwise boolean operation input image channels bands produce single channel output image","l":"/api-channel#bandbool"},{"t":"tint","d":"Tint the image using the provided chroma while preserving the image luminance. An alpha channel may be present and will be unchanged by the","k":"tint tint image provided chroma while preserving image luminance alpha channel present unchanged","l":"/api-colour#tint"},{"t":"greyscale","d":"Convert to 8-bit greyscale 256 shades of grey. This is a linear operation. If the input image is in a non-linear colour space such as sRGB,","k":"greyscale convert bit greyscale shades grey linear operation input image non linear colour space such srgb","l":"/api-colour#greyscale"},{"t":"grayscale","d":"Alternative spelling of greyscale.","k":"grayscale alternative spelling greyscale","l":"/api-colour#grayscale"},{"t":"toColourspace","d":"Set the output colourspace. By default output image will be web-friendly sRGB, with additional channels interpreted as alpha channels.","k":"tocolourspace output colourspace default output image web friendly srgb additional channels interpreted alpha channels","l":"/api-colour#tocolourspace"},{"t":"toColorspace","d":"Alternative spelling of toColourspace.","k":"tocolorspace alternative spelling tocolourspace","l":"/api-colour#tocolorspace"},{"t":"format","d":"An Object containing nested boolean values representing the available input and output formats/methods.","k":"format object containing nested boolean values representing available input output formats methods","l":"/api-utility#format"},{"t":"versions","d":"An Object containing the version numbers of libvips and its dependencies.","k":"versions object containing version numbers libvips dependencies","l":"/api-utility#versions"},{"t":"cache","d":"Gets or, when options are provided, sets the limits of _libvips_ operation cache. Existing entries in the cache will be trimmed after any ch","k":"cache options provided limits libvips operation cache existing entries cache trimmed after","l":"/api-utility#cache"},{"t":"concurrency","d":"Gets or, when a concurrency is provided, sets the number of threads _libvips_ should create to process each image. The default value is the","k":"concurrency concurrency provided number threads libvips create process image default value","l":"/api-utility#concurrency"},{"t":"queue","d":"An EventEmitter that emits a change event when a task is either","k":"queue eventemitter emits change event task","l":"/api-utility#queue"},{"t":"counters","d":"Provides access to internal task counters.","k":"counters provides access internal task counters","l":"/api-utility#counters"},{"t":"simd","d":"Get and set use of SIMD vector unit instructions. Requires libvips to have been compiled with liborc support.","k":"simd simd vector unit instructions requires libvips compiled liborc support","l":"/api-utility#simd"}] \ No newline at end of file diff --git a/install/libvips.js b/install/libvips.js index 84eb9955..4bde9879 100644 --- a/install/libvips.js +++ b/install/libvips.js @@ -81,7 +81,7 @@ try { } } // Download to per-process temporary file - const tarFilename = ['libvips', minimumLibvipsVersion, platformAndArch].join('-') + '.tar.br'; + const tarFilename = ['libvips', minimumLibvipsVersionLabelled, platformAndArch].join('-') + '.tar.br'; const tarPathCache = path.join(libvips.cachePath(), tarFilename); if (fs.existsSync(tarPathCache)) { npmLog.info('sharp', `Using cached ${tarPathCache}`); diff --git a/lib/constructor.js b/lib/constructor.js index 0cb2e6df..d9cb63ec 100644 --- a/lib/constructor.js +++ b/lib/constructor.js @@ -214,7 +214,7 @@ const Sharp = function (input, options) { tiffCompression: 'jpeg', tiffPredictor: 'horizontal', tiffPyramid: false, - tiffSquash: false, + tiffBitdepth: 8, tiffTile: false, tiffTileHeight: 256, tiffTileWidth: 256, diff --git a/lib/output.js b/lib/output.js index fc37adb6..7e36a35c 100644 --- a/lib/output.js +++ b/lib/output.js @@ -187,7 +187,7 @@ function toFormat (format, options) { * @param {Object} [options] - output options * @param {number} [options.quality=80] - quality, integer 1-100 * @param {boolean} [options.progressive=false] - use progressive (interlace) scan - * @param {string} [options.chromaSubsampling='4:2:0'] - for quality < 90, set to '4:4:4' to prevent chroma subsampling otherwise defaults to '4:2:0' (use chroma subsampling); for quality >= 90 chroma is never subsampled + * @param {string} [options.chromaSubsampling='4:2:0'] - set to '4:4:4' to prevent chroma subsampling otherwise defaults to '4:2:0' chroma subsampling * @param {boolean} [options.optimiseCoding=true] - optimise Huffman coding tables * @param {boolean} [options.optimizeCoding=true] - alternative spelling of optimiseCoding * @param {boolean} [options.trellisQuantisation=false] - apply trellis quantisation, requires libvips compiled with support for mozjpeg @@ -386,7 +386,7 @@ function webp (options) { * sharp('input.svg') * .tiff({ * compression: 'lzw', - * squash: true + * bitdepth: 1 * }) * .toFile('1-bpp-output.tiff') * .then(info => { ... }); @@ -402,7 +402,7 @@ function webp (options) { * @param {boolean} [options.tileHeight=256] - vertical tile size * @param {number} [options.xres=1.0] - horizontal resolution in pixels/mm * @param {number} [options.yres=1.0] - vertical resolution in pixels/mm - * @param {boolean} [options.squash=false] - squash 8-bit images down to 1 bit + * @param {boolean} [options.bitdepth=8] - reduce bitdepth to 1, 2 or 4 bit * @returns {Sharp} * @throws {Error} Invalid options */ @@ -415,8 +415,12 @@ function tiff (options) { throw is.invalidParameterError('quality', 'integer between 1 and 100', options.quality); } } - if (is.defined(options.squash)) { - this._setBooleanOption('tiffSquash', options.squash); + if (is.defined(options.bitdepth)) { + if (is.integer(options.bitdepth) && is.inArray(options.bitdepth, [1, 2, 4, 8])) { + this.options.tiffBitdepth = options.bitdepth; + } else { + throw is.invalidParameterError('bitdepth', '1, 2, 4 or 8', options.bitdepth); + } } // tiling if (is.defined(options.tile)) { diff --git a/package.json b/package.json index 8a98caff..c234ed0d 100644 --- a/package.json +++ b/package.json @@ -111,9 +111,9 @@ "dependencies": { "color": "^3.1.2", "detect-libc": "^1.0.3", - "node-addon-api": "^3.0.0", + "node-addon-api": "^3.0.1", "npmlog": "^4.1.2", - "prebuild-install": "^5.3.4", + "prebuild-install": "^5.3.5", "semver": "^7.3.2", "simple-get": "^4.0.0", "tar-fs": "^2.1.0", @@ -123,9 +123,9 @@ "async": "^3.2.0", "cc": "^2.0.1", "decompress-zip": "^0.3.2", - "documentation": "^13.0.1", + "documentation": "^13.0.2", "exif-reader": "^1.0.3", - "icc": "^1.0.0", + "icc": "^2.0.0", "license-checker": "^25.0.1", "mocha": "^8.0.1", "mock-fs": "^4.12.0", @@ -137,7 +137,7 @@ }, "license": "Apache-2.0", "config": { - "libvips": "8.9.2-alpha5" + "libvips": "8.10.0-beta2" }, "engines": { "node": ">=10.16.0" diff --git a/src/common.cc b/src/common.cc index 0a6ddbd7..0f6043a4 100644 --- a/src/common.cc +++ b/src/common.cc @@ -243,7 +243,7 @@ namespace sharp { imageType = ImageType::MAGICK; } } else { - if (EndsWith(vips::VError().what(), " not found\n")) { + if (EndsWith(vips::VError().what(), " does not exist\n")) { imageType = ImageType::MISSING; } } diff --git a/src/libvips/cplusplus/VImage.cpp b/src/libvips/cplusplus/VImage.cpp index 5abe632c..27654f22 100644 --- a/src/libvips/cplusplus/VImage.cpp +++ b/src/libvips/cplusplus/VImage.cpp @@ -5,7 +5,7 @@ * 10/6/16 * - missing implementation of VImage::write() * 11/6/16 - * - added arithmetic assignment overloads, += etc. + * - added arithmetic assignment overloads, += etc. */ /* @@ -51,7 +51,7 @@ VIPS_NAMESPACE_START -std::vector +std::vector to_vectorv( int n, ... ) { std::vector vector( n ); @@ -65,13 +65,13 @@ to_vectorv( int n, ... ) return( vector ); } -std::vector +std::vector to_vector( double value ) { return( to_vectorv( 1, value ) ); } -std::vector +std::vector to_vector( int n, double array[] ) { std::vector vector( n ); @@ -82,10 +82,10 @@ to_vector( int n, double array[] ) return( vector ); } -std::vector +std::vector negate( std::vector vector ) { - std::vector new_vector( vector.size() ); + std::vector new_vector( vector.size() ); for( unsigned int i = 0; i < vector.size(); i++ ) new_vector[i] = vector[i] * -1; @@ -93,7 +93,7 @@ negate( std::vector vector ) return( new_vector ); } -std::vector +std::vector invert( std::vector vector ) { std::vector new_vector( vector.size() ); @@ -108,7 +108,7 @@ VOption::~VOption() { std::list::iterator i; - for( i = options.begin(); i != options.end(); ++i ) + for( i = options.begin(); i != options.end(); ++i ) delete *i; } @@ -140,7 +140,7 @@ VOption::set( const char *name, int value ) return( this ); } -// input double +// input double VOption * VOption::set( const char *name, double value ) { @@ -188,17 +188,17 @@ VOption::set( const char *name, std::vector value ) Pair *pair = new Pair( name ); double *array; - unsigned int i; + unsigned int i; pair->input = true; g_value_init( &pair->value, VIPS_TYPE_ARRAY_DOUBLE ); vips_value_set_array_double( &pair->value, NULL, static_cast< int >( value.size() ) ); - array = vips_value_get_array_double( &pair->value, NULL ); + array = vips_value_get_array_double( &pair->value, NULL ); - for( i = 0; i < value.size(); i++ ) - array[i] = value[i]; + for( i = 0; i < value.size(); i++ ) + array[i] = value[i]; options.push_back( pair ); @@ -212,17 +212,17 @@ VOption::set( const char *name, std::vector value ) Pair *pair = new Pair( name ); int *array; - unsigned int i; + unsigned int i; pair->input = true; g_value_init( &pair->value, VIPS_TYPE_ARRAY_INT ); vips_value_set_array_int( &pair->value, NULL, static_cast< int >( value.size() ) ); - array = vips_value_get_array_int( &pair->value, NULL ); + array = vips_value_get_array_int( &pair->value, NULL ); - for( i = 0; i < value.size(); i++ ) - array[i] = value[i]; + for( i = 0; i < value.size(); i++ ) + array[i] = value[i]; options.push_back( pair ); @@ -236,7 +236,7 @@ VOption::set( const char *name, std::vector value ) Pair *pair = new Pair( name ); VipsImage **array; - unsigned int i; + unsigned int i; pair->input = true; @@ -245,11 +245,11 @@ VOption::set( const char *name, std::vector value ) static_cast< int >( value.size() ) ); array = vips_value_get_array_image( &pair->value, NULL ); - for( i = 0; i < value.size(); i++ ) { + for( i = 0; i < value.size(); i++ ) { VipsImage *vips_image = value[i].get_image(); - array[i] = vips_image; - g_object_ref( vips_image ); + array[i] = vips_image; + g_object_ref( vips_image ); } options.push_back( pair ); @@ -279,7 +279,7 @@ VOption::set( const char *name, bool *value ) pair->input = false; pair->vbool = value; - g_value_init( &pair->value, G_TYPE_BOOLEAN ); + g_value_init( &pair->value, G_TYPE_BOOLEAN ); options.push_back( pair ); @@ -294,7 +294,7 @@ VOption::set( const char *name, int *value ) pair->input = false; pair->vint = value; - g_value_init( &pair->value, G_TYPE_INT ); + g_value_init( &pair->value, G_TYPE_INT ); options.push_back( pair ); @@ -309,7 +309,7 @@ VOption::set( const char *name, double *value ) pair->input = false; pair->vdouble = value; - g_value_init( &pair->value, G_TYPE_DOUBLE ); + g_value_init( &pair->value, G_TYPE_DOUBLE ); options.push_back( pair ); @@ -339,7 +339,7 @@ VOption::set( const char *name, std::vector *value ) pair->input = false; pair->vvector = value; - g_value_init( &pair->value, VIPS_TYPE_ARRAY_DOUBLE ); + g_value_init( &pair->value, VIPS_TYPE_ARRAY_DOUBLE ); options.push_back( pair ); @@ -354,7 +354,7 @@ VOption::set( const char *name, VipsBlob **value ) pair->input = false; pair->vblob = value; - g_value_init( &pair->value, VIPS_TYPE_BLOB ); + g_value_init( &pair->value, VIPS_TYPE_BLOB ); options.push_back( pair ); @@ -362,7 +362,7 @@ VOption::set( const char *name, VipsBlob **value ) } // just g_object_set_property(), except we allow set enum from string -static void +static void set_property( VipsObject *object, const char *name, const GValue *value ) { VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS( object ); @@ -372,7 +372,7 @@ set_property( VipsObject *object, const char *name, const GValue *value ) VipsArgumentClass *argument_class; VipsArgumentInstance *argument_instance; - if( vips_object_get_argument( object, name, + if( vips_object_get_argument( object, name, &pspec, &argument_class, &argument_instance ) ) { g_warning( "%s", vips_error_buffer() ); vips_error_clear(); @@ -384,17 +384,17 @@ set_property( VipsObject *object, const char *name, const GValue *value ) GType pspec_type = G_PARAM_SPEC_VALUE_TYPE( pspec ); int enum_value; - GValue value2 = { 0 }; + GValue value2 = { 0 }; - if( (enum_value = vips_enum_from_nick( object_class->nickname, + if( (enum_value = vips_enum_from_nick( object_class->nickname, pspec_type, g_value_get_string( value ) )) < 0 ) { g_warning( "%s", vips_error_buffer() ); vips_error_clear(); return; } - g_value_init( &value2, pspec_type ); - g_value_set_enum( &value2, enum_value ); + g_value_init( &value2, pspec_type ); + g_value_set_enum( &value2, enum_value ); g_object_set_property( G_OBJECT( object ), name, &value2 ); g_value_unset( &value2 ); } @@ -402,18 +402,19 @@ set_property( VipsObject *object, const char *name, const GValue *value ) g_object_set_property( G_OBJECT( object ), name, value ); } -// walk the options and set props on the operation -void +// walk the options and set props on the operation +void VOption::set_operation( VipsOperation *operation ) { std::list::iterator i; - for( i = options.begin(); i != options.end(); ++i ) + for( i = options.begin(); i != options.end(); ++i ) if( (*i)->input ) { #ifdef VIPS_DEBUG_VERBOSE printf( "set_operation: " ); vips_object_print_name( VIPS_OBJECT( operation ) ); - char *str_value = g_strdup_value_contents( &(*i)->value ); + char *str_value = + g_strdup_value_contents( &(*i)->value ); printf( ".%s = %s\n", (*i)->name, str_value ); g_free( str_value ); #endif /*VIPS_DEBUG_VERBOSE*/ @@ -424,12 +425,12 @@ VOption::set_operation( VipsOperation *operation ) } // walk the options and fetch any requested outputs -void +void VOption::get_operation( VipsOperation *operation ) { std::list::iterator i; - for( i = options.begin(); i != options.end(); ++i ) + for( i = options.begin(); i != options.end(); ++i ) if( ! (*i)->input ) { const char *name = (*i)->name; @@ -439,7 +440,7 @@ VOption::get_operation( VipsOperation *operation ) #ifdef VIPS_DEBUG_VERBOSE printf( "get_operation: " ); vips_object_print_name( VIPS_OBJECT( operation ) ); - char *str_value = g_strdup_value_contents( + char *str_value = g_strdup_value_contents( &(*i)->value ); printf( ".%s = %s\n", name, str_value ); g_free( str_value ); @@ -450,59 +451,59 @@ VOption::get_operation( VipsOperation *operation ) if( type == VIPS_TYPE_IMAGE ) { // rebox object - VipsImage *image = VIPS_IMAGE( - g_value_get_object( value ) ); - *((*i)->vimage) = VImage( image ); + VipsImage *image = VIPS_IMAGE( + g_value_get_object( value ) ); + *((*i)->vimage) = VImage( image ); } - else if( type == G_TYPE_INT ) - *((*i)->vint) = g_value_get_int( value ); - else if( type == G_TYPE_BOOLEAN ) - *((*i)->vbool) = g_value_get_boolean( value ); - else if( type == G_TYPE_DOUBLE ) - *((*i)->vdouble) = g_value_get_double( value ); + else if( type == G_TYPE_INT ) + *((*i)->vint) = g_value_get_int( value ); + else if( type == G_TYPE_BOOLEAN ) + *((*i)->vbool) = g_value_get_boolean( value ); + else if( type == G_TYPE_DOUBLE ) + *((*i)->vdouble) = g_value_get_double( value ); else if( type == VIPS_TYPE_ARRAY_DOUBLE ) { int length; - double *array = - vips_value_get_array_double( value, + double *array = + vips_value_get_array_double( value, &length ); int j; - ((*i)->vvector)->resize( length ); + ((*i)->vvector)->resize( length ); for( j = 0; j < length; j++ ) (*((*i)->vvector))[j] = array[j]; } else if( type == VIPS_TYPE_BLOB ) { // our caller gets a reference - *((*i)->vblob) = + *((*i)->vblob) = (VipsBlob *) g_value_dup_boxed( value ); } } } -void -VImage::call_option_string( const char *operation_name, - const char *option_string, VOption *options ) +void +VImage::call_option_string( const char *operation_name, + const char *option_string, VOption *options ) { VipsOperation *operation; - VIPS_DEBUG_MSG( "call_option_string: starting for %s ...\n", + VIPS_DEBUG_MSG( "call_option_string: starting for %s ...\n", operation_name ); if( !(operation = vips_operation_new( operation_name )) ) { delete options; - throw( VError() ); + throw( VError() ); } - /* Set str options before vargs options, so the user can't + /* Set str options before vargs options, so the user can't * override things we set deliberately. */ if( option_string && - vips_object_set_from_string( VIPS_OBJECT( operation ), + vips_object_set_from_string( VIPS_OBJECT( operation ), option_string ) ) { vips_object_unref_outputs( VIPS_OBJECT( operation ) ); - g_object_unref( operation ); - delete options; - throw( VError() ); + g_object_unref( operation ); + delete options; + throw( VError() ); } if( options ) @@ -512,9 +513,9 @@ VImage::call_option_string( const char *operation_name, */ if( vips_cache_operation_buildp( &operation ) ) { vips_object_unref_outputs( VIPS_OBJECT( operation ) ); - g_object_unref( operation ); - delete options; - throw( VError() ); + g_object_unref( operation ); + delete options; + throw( VError() ); } /* Walk args again, writing output. @@ -524,46 +525,46 @@ VImage::call_option_string( const char *operation_name, /* We're done with options! */ - delete options; + delete options; - /* The operation we have built should now have been reffed by - * one of its arguments or have finished its work. Either + /* The operation we have built should now have been reffed by + * one of its arguments or have finished its work. Either * way, we can unref. */ g_object_unref( operation ); } -void -VImage::call( const char *operation_name, VOption *options ) +void +VImage::call( const char *operation_name, VOption *options ) { - call_option_string( operation_name, NULL, options ); + call_option_string( operation_name, NULL, options ); } -VImage +VImage VImage::new_from_file( const char *name, VOption *options ) { char filename[VIPS_PATH_MAX]; char option_string[VIPS_PATH_MAX]; const char *operation_name; - VImage out; + VImage out; vips__filename_split8( name, filename, option_string ); if( !(operation_name = vips_foreign_find_load( filename )) ) { - delete options; - throw VError(); + delete options; + throw VError(); } call_option_string( operation_name, option_string, - (options ? options : VImage::option())-> + (options ? options : VImage::option())-> set( "filename", filename )-> set( "out", &out ) ); - return( out ); + return( out ); } -VImage -VImage::new_from_buffer( const void *buf, size_t len, const char *option_string, +VImage +VImage::new_from_buffer( const void *buf, size_t len, const char *option_string, VOption *options ) { const char *operation_name; @@ -571,87 +572,87 @@ VImage::new_from_buffer( const void *buf, size_t len, const char *option_string, VImage out; if( !(operation_name = vips_foreign_find_load_buffer( buf, len )) ) { - delete options; - throw( VError() ); + delete options; + throw( VError() ); } /* We don't take a copy of the data or free it. */ blob = vips_blob_new( NULL, buf, len ); - options = (options ? options : VImage::option())-> + options = (options ? options : VImage::option())-> set( "buffer", blob )-> set( "out", &out ); vips_area_unref( VIPS_AREA( blob ) ); - call_option_string( operation_name, option_string, options ); + call_option_string( operation_name, option_string, options ); return( out ); } -VImage -VImage::new_from_buffer( const std::string &buf, const char *option_string, +VImage +VImage::new_from_buffer( const std::string &buf, const char *option_string, VOption *options ) { - return( new_from_buffer( buf.c_str(), buf.size(), + return( new_from_buffer( buf.c_str(), buf.size(), option_string, options ) ); } -VImage -VImage::new_from_source( VSource source, const char *option_string, +VImage +VImage::new_from_source( VSource source, const char *option_string, VOption *options ) { const char *operation_name; VImage out; - if( !(operation_name = vips_foreign_find_load_source( + if( !(operation_name = vips_foreign_find_load_source( source.get_source() )) ) { - delete options; - throw( VError() ); + delete options; + throw( VError() ); } - options = (options ? options : VImage::option())-> + options = (options ? options : VImage::option())-> set( "source", source )-> set( "out", &out ); - call_option_string( operation_name, option_string, options ); + call_option_string( operation_name, option_string, options ); return( out ); } -VImage -VImage::new_matrix( int width, int height ) +VImage +VImage::new_matrix( int width, int height ) { - return( VImage( vips_image_new_matrix( width, height ) ) ); + return( VImage( vips_image_new_matrix( width, height ) ) ); } -VImage +VImage VImage::new_matrixv( int width, int height, ... ) { VImage matrix = new_matrix( width, height ); - VipsImage *vips_matrix = matrix.get_image(); + VipsImage *vips_matrix = matrix.get_image(); va_list ap; va_start( ap, height ); for( int y = 0; y < height; y++ ) for( int x = 0; x < width; x++ ) - *VIPS_MATRIX( vips_matrix, x, y ) = + *VIPS_MATRIX( vips_matrix, x, y ) = va_arg( ap, double ); va_end( ap ); - return( matrix ); + return( matrix ); } VImage VImage::write( VImage out ) const { if( vips_image_write( this->get_image(), out.get_image() ) ) - throw VError(); + throw VError(); - return( out ); + return( out ); } -void +void VImage::write_to_file( const char *name, VOption *options ) const { char filename[VIPS_PATH_MAX]; @@ -660,18 +661,18 @@ VImage::write_to_file( const char *name, VOption *options ) const vips__filename_split8( name, filename, option_string ); if( !(operation_name = vips_foreign_find_save( filename )) ) { - delete options; - throw VError(); + delete options; + throw VError(); } - call_option_string( operation_name, option_string, - (options ? options : VImage::option())-> + call_option_string( operation_name, option_string, + (options ? options : VImage::option())-> set( "in", *this )-> set( "filename", filename ) ); } -void -VImage::write_to_buffer( const char *suffix, void **buf, size_t *size, +void +VImage::write_to_buffer( const char *suffix, void **buf, size_t *size, VOption *options ) const { char filename[VIPS_PATH_MAX]; @@ -681,16 +682,16 @@ VImage::write_to_buffer( const char *suffix, void **buf, size_t *size, vips__filename_split8( suffix, filename, option_string ); if( !(operation_name = vips_foreign_find_save_buffer( filename )) ) { - delete options; - throw VError(); + delete options; + throw VError(); } - call_option_string( operation_name, option_string, - (options ? options : VImage::option())-> + call_option_string( operation_name, option_string, + (options ? options : VImage::option())-> set( "in", *this )-> set( "buffer", &blob ) ); - if( blob ) { + if( blob ) { if( buf ) { *buf = VIPS_AREA( blob )->data; VIPS_AREA( blob )->free_fn = NULL; @@ -702,8 +703,8 @@ VImage::write_to_buffer( const char *suffix, void **buf, size_t *size, } } -void -VImage::write_to_target( const char *suffix, VTarget target, +void +VImage::write_to_target( const char *suffix, VTarget target, VOption *options ) const { char filename[VIPS_PATH_MAX]; @@ -712,755 +713,755 @@ VImage::write_to_target( const char *suffix, VTarget target, vips__filename_split8( suffix, filename, option_string ); if( !(operation_name = vips_foreign_find_save_target( filename )) ) { - delete options; - throw VError(); + delete options; + throw VError(); } - call_option_string( operation_name, option_string, - (options ? options : VImage::option())-> + call_option_string( operation_name, option_string, + (options ? options : VImage::option())-> set( "in", *this )-> set( "target", target ) ); } #include "vips-operators.cpp" -std::vector +std::vector VImage::bandsplit( VOption *options ) const { - std::vector b; + std::vector b; for( int i = 0; i < bands(); i++ ) - b.push_back( extract_band( i ) ); + b.push_back( extract_band( i ) ); - return( b ); + return( b ); } -VImage +VImage VImage::bandjoin( VImage other, VOption *options ) const { - VImage v[2] = { *this, other }; + VImage v[2] = { *this, other }; std::vector vec( v, v + VIPS_NUMBER( v ) ); - return( bandjoin( vec, options ) ); + return( bandjoin( vec, options ) ); } -VImage +VImage VImage::composite( VImage other, VipsBlendMode mode, VOption *options ) const { - VImage v[2] = { *this, other }; + VImage v[2] = { *this, other }; std::vector ivec( v, v + VIPS_NUMBER( v ) ); - int m[1] = { static_cast( mode ) }; + int m[1] = { static_cast( mode ) }; std::vector mvec( m, m + VIPS_NUMBER( m ) ); - return( composite( ivec, mvec, options ) ); + return( composite( ivec, mvec, options ) ); } -std::complex +std::complex VImage::minpos( VOption *options ) const { double x, y; - (void) min( + (void) min( (options ? options : VImage::option()) -> set( "x", &x ) -> set( "y", &y ) ); - return( std::complex( x, y ) ); + return( std::complex( x, y ) ); } -std::complex +std::complex VImage::maxpos( VOption *options ) const { double x, y; - (void) max( + (void) max( (options ? options : VImage::option()) -> set( "x", &x ) -> set( "y", &y ) ); - return( std::complex( x, y ) ); + return( std::complex( x, y ) ); } // Operator overloads -VImage +VImage VImage::operator[]( int index ) const { - return( this->extract_band( index ) ); + return( this->extract_band( index ) ); } -std::vector +std::vector VImage::operator()( int x, int y ) const { - return( this->getpoint( x, y ) ); + return( this->getpoint( x, y ) ); } -VImage +VImage operator+( const VImage a, const VImage b ) { return( a.add( b ) ); } -VImage -operator+( double a, const VImage b ) +VImage +operator+( double a, const VImage b ) { - return( b.linear( 1.0, a ) ); + return( b.linear( 1.0, a ) ); } -VImage -operator+( const VImage a, double b ) -{ - return( a.linear( 1.0, b ) ); -} - -VImage -operator+( const std::vector a, const VImage b ) +VImage +operator+( const VImage a, double b ) { - return( b.linear( 1.0, a ) ); + return( a.linear( 1.0, b ) ); } -VImage -operator+( const VImage a, const std::vector b ) -{ - return( a.linear( 1.0, b ) ); +VImage +operator+( const std::vector a, const VImage b ) +{ + return( b.linear( 1.0, a ) ); } -VImage & +VImage +operator+( const VImage a, const std::vector b ) +{ + return( a.linear( 1.0, b ) ); +} + +VImage & operator+=( VImage &a, const VImage b ) { - return( a = a + b ); + return( a = a + b ); } -VImage & +VImage & operator+=( VImage &a, const double b ) { - return( a = a + b ); + return( a = a + b ); } -VImage & +VImage & operator+=( VImage &a, const std::vector b ) { - return( a = a + b ); + return( a = a + b ); } -VImage -operator-( const VImage a, const VImage b ) +VImage +operator-( const VImage a, const VImage b ) { return( a.subtract( b ) ); } -VImage -operator-( double a, const VImage b ) +VImage +operator-( double a, const VImage b ) { - return( b.linear( -1.0, a ) ); + return( b.linear( -1.0, a ) ); } -VImage -operator-( const VImage a, double b ) -{ - return( a.linear( 1.0, -b ) ); -} - -VImage -operator-( const std::vector a, const VImage b ) +VImage +operator-( const VImage a, double b ) { - return( b.linear( -1.0, a ) ); + return( a.linear( 1.0, -b ) ); } -VImage -operator-( const VImage a, const std::vector b ) -{ - return( a.linear( 1.0, vips::negate( b ) ) ); +VImage +operator-( const std::vector a, const VImage b ) +{ + return( b.linear( -1.0, a ) ); } -VImage & +VImage +operator-( const VImage a, const std::vector b ) +{ + return( a.linear( 1.0, vips::negate( b ) ) ); +} + +VImage & operator-=( VImage &a, const VImage b ) { - return( a = a - b ); + return( a = a - b ); } -VImage & +VImage & operator-=( VImage &a, const double b ) { - return( a = a - b ); + return( a = a - b ); } -VImage & +VImage & operator-=( VImage &a, const std::vector b ) { - return( a = a - b ); + return( a = a - b ); } -VImage -operator-( const VImage a ) -{ +VImage +operator-( const VImage a ) +{ return( a * -1 ); } -VImage -operator*( const VImage a, const VImage b ) +VImage +operator*( const VImage a, const VImage b ) { return( a.multiply( b ) ); } -VImage -operator*( double a, const VImage b ) +VImage +operator*( double a, const VImage b ) { - return( b.linear( a, 0.0 ) ); + return( b.linear( a, 0.0 ) ); } -VImage -operator*( const VImage a, double b ) -{ - return( a.linear( b, 0.0 ) ); -} - -VImage -operator*( const std::vector a, const VImage b ) +VImage +operator*( const VImage a, double b ) { - return( b.linear( a, 0.0 ) ); + return( a.linear( b, 0.0 ) ); } -VImage -operator*( const VImage a, const std::vector b ) -{ - return( a.linear( b, 0.0 ) ); +VImage +operator*( const std::vector a, const VImage b ) +{ + return( b.linear( a, 0.0 ) ); } -VImage & +VImage +operator*( const VImage a, const std::vector b ) +{ + return( a.linear( b, 0.0 ) ); +} + +VImage & operator*=( VImage &a, const VImage b ) { - return( a = a * b ); + return( a = a * b ); } -VImage & +VImage & operator*=( VImage &a, const double b ) { - return( a = a * b ); + return( a = a * b ); } -VImage & +VImage & operator*=( VImage &a, const std::vector b ) { - return( a = a * b ); + return( a = a * b ); } -VImage -operator/( const VImage a, const VImage b ) +VImage +operator/( const VImage a, const VImage b ) { return( a.divide( b ) ); } -VImage -operator/( double a, const VImage b ) +VImage +operator/( double a, const VImage b ) { - return( b.pow( -1.0 ).linear( a, 0.0 ) ); + return( b.pow( -1.0 ).linear( a, 0.0 ) ); } -VImage -operator/( const VImage a, double b ) -{ - return( a.linear( 1.0 / b, 0.0 ) ); -} - -VImage -operator/( const std::vector a, const VImage b ) +VImage +operator/( const VImage a, double b ) { - return( b.pow( -1.0 ).linear( a, 0.0 ) ); + return( a.linear( 1.0 / b, 0.0 ) ); } -VImage -operator/( const VImage a, const std::vector b ) -{ - return( a.linear( vips::invert( b ), 0.0 ) ); +VImage +operator/( const std::vector a, const VImage b ) +{ + return( b.pow( -1.0 ).linear( a, 0.0 ) ); } -VImage & +VImage +operator/( const VImage a, const std::vector b ) +{ + return( a.linear( vips::invert( b ), 0.0 ) ); +} + +VImage & operator/=( VImage &a, const VImage b ) { - return( a = a / b ); + return( a = a / b ); } -VImage & +VImage & operator/=( VImage &a, const double b ) { - return( a = a / b ); + return( a = a / b ); } -VImage & +VImage & operator/=( VImage &a, const std::vector b ) { - return( a = a / b ); + return( a = a / b ); } -VImage -operator%( const VImage a, const VImage b ) +VImage +operator%( const VImage a, const VImage b ) { return( a.remainder( b ) ); } -VImage -operator%( const VImage a, const double b ) -{ - return( a.remainder_const( to_vector( b ) ) ); +VImage +operator%( const VImage a, const double b ) +{ + return( a.remainder_const( to_vector( b ) ) ); } -VImage -operator%( const VImage a, const std::vector b ) -{ - return( a.remainder_const( b ) ); +VImage +operator%( const VImage a, const std::vector b ) +{ + return( a.remainder_const( b ) ); } -VImage & +VImage & operator%=( VImage &a, const VImage b ) { - return( a = a % b ); + return( a = a % b ); } -VImage & +VImage & operator%=( VImage &a, const double b ) { - return( a = a % b ); + return( a = a % b ); } -VImage & +VImage & operator%=( VImage &a, const std::vector b ) { - return( a = a % b ); + return( a = a % b ); } -VImage -operator<( const VImage a, const VImage b ) +VImage +operator<( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_LESS ) ); } -VImage -operator<( const double a, const VImage b ) +VImage +operator<( const double a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_MORE, - to_vector( a ) ) ); + return( b.relational_const( VIPS_OPERATION_RELATIONAL_MORE, + to_vector( a ) ) ); } -VImage -operator<( const VImage a, const double b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESS, - to_vector( b ) ) ); -} - -VImage -operator<( const std::vector a, const VImage b ) +VImage +operator<( const VImage a, const double b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_MORE, - a ) ); + return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESS, + to_vector( b ) ) ); } -VImage -operator<( const VImage a, const std::vector b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESS, - b ) ); +VImage +operator<( const std::vector a, const VImage b ) +{ + return( b.relational_const( VIPS_OPERATION_RELATIONAL_MORE, + a ) ); } -VImage -operator<=( const VImage a, const VImage b ) +VImage +operator<( const VImage a, const std::vector b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESS, + b ) ); +} + +VImage +operator<=( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_LESSEQ ) ); } -VImage -operator<=( const double a, const VImage b ) +VImage +operator<=( const double a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, - to_vector( a ) ) ); + return( b.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, + to_vector( a ) ) ); } -VImage -operator<=( const VImage a, const double b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, - to_vector( b ) ) ); +VImage +operator<=( const VImage a, const double b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, + to_vector( b ) ) ); } -VImage -operator<=( const std::vector a, const VImage b ) +VImage +operator<=( const std::vector a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, + return( b.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, a ) ); } -VImage -operator<=( const VImage a, const std::vector b ) -{ +VImage +operator<=( const VImage a, const std::vector b ) +{ return( a.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, b ) ); } -VImage -operator>( const VImage a, const VImage b ) +VImage +operator>( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_MORE ) ); } -VImage -operator>( const double a, const VImage b ) +VImage +operator>( const double a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESS, - to_vector( a ) ) ); + return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESS, + to_vector( a ) ) ); } -VImage -operator>( const VImage a, const double b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_MORE, +VImage +operator>( const VImage a, const double b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_MORE, to_vector( b ) ) ); } -VImage -operator>( const std::vector a, const VImage b ) +VImage +operator>( const std::vector a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESS, + return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESS, a ) ); } -VImage -operator>( const VImage a, const std::vector b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_MORE, +VImage +operator>( const VImage a, const std::vector b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_MORE, b ) ); } -VImage -operator>=( const VImage a, const VImage b ) +VImage +operator>=( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_MOREEQ ) ); } -VImage -operator>=( const double a, const VImage b ) +VImage +operator>=( const double a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, - to_vector( a ) ) ); + return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, + to_vector( a ) ) ); } -VImage -operator>=( const VImage a, const double b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, - to_vector( b ) ) ); +VImage +operator>=( const VImage a, const double b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, + to_vector( b ) ) ); } -VImage -operator>=( const std::vector a, const VImage b ) +VImage +operator>=( const std::vector a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, + return( b.relational_const( VIPS_OPERATION_RELATIONAL_LESSEQ, a ) ); } -VImage -operator>=( const VImage a, const std::vector b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, +VImage +operator>=( const VImage a, const std::vector b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_MOREEQ, b ) ); } -VImage -operator==( const VImage a, const VImage b ) +VImage +operator==( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_EQUAL ) ); } -VImage -operator==( const double a, const VImage b ) +VImage +operator==( const double a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, + return( b.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, to_vector( a ) ) ); } -VImage -operator==( const VImage a, const double b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, +VImage +operator==( const VImage a, const double b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, to_vector( b ) ) ); } -VImage -operator==( const std::vector a, const VImage b ) +VImage +operator==( const std::vector a, const VImage b ) { - return( b.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, + return( b.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, a ) ); } -VImage -operator==( const VImage a, const std::vector b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, +VImage +operator==( const VImage a, const std::vector b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_EQUAL, b ) ); } -VImage -operator!=( const VImage a, const VImage b ) +VImage +operator!=( const VImage a, const VImage b ) { return( a.relational( b, VIPS_OPERATION_RELATIONAL_NOTEQ ) ); } -VImage -operator!=( const double a, const VImage b ) +VImage +operator!=( const double a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, - to_vector( a ) ) ); + to_vector( a ) ) ); } -VImage -operator!=( const VImage a, const double b ) -{ - return( a.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, +VImage +operator!=( const VImage a, const double b ) +{ + return( a.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, to_vector( b ) ) ); } -VImage -operator!=( const std::vector a, const VImage b ) +VImage +operator!=( const std::vector a, const VImage b ) { return( b.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, a ) ); } -VImage -operator!=( const VImage a, const std::vector b ) -{ +VImage +operator!=( const VImage a, const std::vector b ) +{ return( a.relational_const( VIPS_OPERATION_RELATIONAL_NOTEQ, b ) ); } -VImage -operator&( const VImage a, const VImage b ) +VImage +operator&( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_AND ) ); } -VImage -operator&( const double a, const VImage b ) +VImage +operator&( const double a, const VImage b ) { - return( b.boolean_const( VIPS_OPERATION_BOOLEAN_AND, - to_vector( a ) ) ); + return( b.boolean_const( VIPS_OPERATION_BOOLEAN_AND, + to_vector( a ) ) ); } -VImage -operator&( const VImage a, const double b ) -{ - return( a.boolean_const( VIPS_OPERATION_BOOLEAN_AND, +VImage +operator&( const VImage a, const double b ) +{ + return( a.boolean_const( VIPS_OPERATION_BOOLEAN_AND, to_vector( b ) ) ); } -VImage -operator&( const std::vector a, const VImage b ) +VImage +operator&( const std::vector a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_AND, a ) ); } -VImage -operator&( const VImage a, const std::vector b ) -{ +VImage +operator&( const VImage a, const std::vector b ) +{ return( a.boolean_const( VIPS_OPERATION_BOOLEAN_AND, b ) ); } -VImage & +VImage & operator&=( VImage &a, const VImage b ) { - return( a = a & b ); + return( a = a & b ); } -VImage & +VImage & operator&=( VImage &a, const double b ) { - return( a = a & b ); + return( a = a & b ); } -VImage & +VImage & operator&=( VImage &a, const std::vector b ) { - return( a = a & b ); + return( a = a & b ); } -VImage -operator|( const VImage a, const VImage b ) +VImage +operator|( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_OR ) ); } -VImage -operator|( const double a, const VImage b ) +VImage +operator|( const double a, const VImage b ) { - return( b.boolean_const( VIPS_OPERATION_BOOLEAN_OR, - to_vector( a ) ) ); + return( b.boolean_const( VIPS_OPERATION_BOOLEAN_OR, + to_vector( a ) ) ); } -VImage -operator|( const VImage a, const double b ) -{ - return( a.boolean_const( VIPS_OPERATION_BOOLEAN_OR, +VImage +operator|( const VImage a, const double b ) +{ + return( a.boolean_const( VIPS_OPERATION_BOOLEAN_OR, to_vector( b ) ) ); } -VImage -operator|( const std::vector a, const VImage b ) +VImage +operator|( const std::vector a, const VImage b ) { - return( b.boolean_const( VIPS_OPERATION_BOOLEAN_OR, + return( b.boolean_const( VIPS_OPERATION_BOOLEAN_OR, a ) ); } -VImage -operator|( const VImage a, const std::vector b ) -{ - return( a.boolean_const( VIPS_OPERATION_BOOLEAN_OR, +VImage +operator|( const VImage a, const std::vector b ) +{ + return( a.boolean_const( VIPS_OPERATION_BOOLEAN_OR, b ) ); } -VImage & +VImage & operator|=( VImage &a, const VImage b ) { - return( a = a | b ); + return( a = a | b ); } -VImage & +VImage & operator|=( VImage &a, const double b ) { - return( a = a | b ); + return( a = a | b ); } -VImage & +VImage & operator|=( VImage &a, const std::vector b ) { - return( a = a | b ); + return( a = a | b ); } -VImage -operator^( const VImage a, const VImage b ) +VImage +operator^( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_EOR ) ); } -VImage -operator^( const double a, const VImage b ) +VImage +operator^( const double a, const VImage b ) { - return( b.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, - to_vector( a ) ) ); + return( b.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, + to_vector( a ) ) ); } -VImage -operator^( const VImage a, const double b ) -{ - return( a.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, - to_vector( b ) ) ); +VImage +operator^( const VImage a, const double b ) +{ + return( a.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, + to_vector( b ) ) ); } -VImage -operator^( const std::vector a, const VImage b ) +VImage +operator^( const std::vector a, const VImage b ) { return( b.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, a ) ); } -VImage -operator^( const VImage a, const std::vector b ) -{ +VImage +operator^( const VImage a, const std::vector b ) +{ return( a.boolean_const( VIPS_OPERATION_BOOLEAN_EOR, b ) ); } -VImage & +VImage & operator^=( VImage &a, const VImage b ) { - return( a = a ^ b ); + return( a = a ^ b ); } -VImage & +VImage & operator^=( VImage &a, const double b ) { - return( a = a ^ b ); + return( a = a ^ b ); } -VImage & +VImage & operator^=( VImage &a, const std::vector b ) { - return( a = a ^ b ); + return( a = a ^ b ); } -VImage -operator<<( const VImage a, const VImage b ) +VImage +operator<<( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_LSHIFT ) ); } -VImage -operator<<( const VImage a, const double b ) -{ - return( a.boolean_const( VIPS_OPERATION_BOOLEAN_LSHIFT, - to_vector( b ) ) ); +VImage +operator<<( const VImage a, const double b ) +{ + return( a.boolean_const( VIPS_OPERATION_BOOLEAN_LSHIFT, + to_vector( b ) ) ); } -VImage -operator<<( const VImage a, const std::vector b ) -{ - return( a.boolean_const( VIPS_OPERATION_BOOLEAN_LSHIFT, - b ) ); +VImage +operator<<( const VImage a, const std::vector b ) +{ + return( a.boolean_const( VIPS_OPERATION_BOOLEAN_LSHIFT, + b ) ); } -VImage & +VImage & operator<<=( VImage &a, const VImage b ) { - return( a = a << b ); + return( a = a << b ); } -VImage & +VImage & operator<<=( VImage &a, const double b ) { - return( a = a << b ); + return( a = a << b ); } -VImage & +VImage & operator<<=( VImage &a, const std::vector b ) { - return( a = a << b ); + return( a = a << b ); } -VImage -operator>>( const VImage a, const VImage b ) +VImage +operator>>( const VImage a, const VImage b ) { return( a.boolean( b, VIPS_OPERATION_BOOLEAN_RSHIFT ) ); } -VImage -operator>>( const VImage a, const double b ) -{ - return( a.boolean_const( VIPS_OPERATION_BOOLEAN_RSHIFT, - to_vector( b ) ) ); -} - -VImage -operator>>( const VImage a, const std::vector b ) -{ +VImage +operator>>( const VImage a, const double b ) +{ return( a.boolean_const( VIPS_OPERATION_BOOLEAN_RSHIFT, - b ) ); + to_vector( b ) ) ); } -VImage & +VImage +operator>>( const VImage a, const std::vector b ) +{ + return( a.boolean_const( VIPS_OPERATION_BOOLEAN_RSHIFT, + b ) ); +} + +VImage & operator>>=( VImage &a, const VImage b ) { - return( a = a << b ); + return( a = a << b ); } -VImage & +VImage & operator>>=( VImage &a, const double b ) { - return( a = a << b ); + return( a = a << b ); } -VImage & +VImage & operator>>=( VImage &a, const std::vector b ) { - return( a = a << b ); + return( a = a << b ); } VIPS_NAMESPACE_END diff --git a/src/libvips/cplusplus/vips-operators.cpp b/src/libvips/cplusplus/vips-operators.cpp index 12694762..f8456a5f 100644 --- a/src/libvips/cplusplus/vips-operators.cpp +++ b/src/libvips/cplusplus/vips-operators.cpp @@ -1,5 +1,5 @@ // bodies for vips operations -// Wed 01 Jan 2020 12:22:12 PM CET +// Sun 5 Jul 22:36:37 BST 2020 // this file is generated automatically, do not edit! VImage VImage::CMC2LCh( VOption *options ) const @@ -754,6 +754,18 @@ VImage VImage::csvload( const char *filename, VOption *options ) return( out ); } +VImage VImage::csvload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "csvload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + void VImage::csvsave( const char *filename, VOption *options ) const { call( "csvsave", @@ -762,6 +774,14 @@ void VImage::csvsave( const char *filename, VOption *options ) const set( "filename", filename ) ); } +void VImage::csvsave_target( VTarget target, VOption *options ) const +{ + call( "csvsave_target", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "target", target ) ); +} + VImage VImage::dE00( VImage right, VOption *options ) const { VImage out; @@ -1218,6 +1238,18 @@ VImage VImage::gifload_buffer( VipsBlob *buffer, VOption *options ) return( out ); } +VImage VImage::gifload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "gifload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + VImage VImage::globalbalance( VOption *options ) const { VImage out; @@ -1297,6 +1329,18 @@ VImage VImage::heifload_buffer( VipsBlob *buffer, VOption *options ) return( out ); } +VImage VImage::heifload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "heifload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + void VImage::heifsave( const char *filename, VOption *options ) const { call( "heifsave", @@ -1317,6 +1361,14 @@ VipsBlob *VImage::heifsave_buffer( VOption *options ) const return( buffer ); } +void VImage::heifsave_target( VTarget target, VOption *options ) const +{ + call( "heifsave_target", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "target", target ) ); +} + VImage VImage::hist_cum( VOption *options ) const { VImage out; @@ -2028,6 +2080,18 @@ VImage VImage::matload( const char *filename, VOption *options ) return( out ); } +VImage VImage::matrixinvert( VOption *options ) const +{ + VImage out; + + call( "matrixinvert", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "out", &out ) ); + + return( out ); +} + VImage VImage::matrixload( const char *filename, VOption *options ) { VImage out; @@ -2040,6 +2104,18 @@ VImage VImage::matrixload( const char *filename, VOption *options ) return( out ); } +VImage VImage::matrixload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "matrixload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + void VImage::matrixprint( VOption *options ) const { call( "matrixprint", @@ -2055,6 +2131,14 @@ void VImage::matrixsave( const char *filename, VOption *options ) const set( "filename", filename ) ); } +void VImage::matrixsave_target( VTarget target, VOption *options ) const +{ + call( "matrixsave_target", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "target", target ) ); +} + double VImage::max( VOption *options ) const { double out; @@ -2256,6 +2340,18 @@ VImage VImage::pdfload_buffer( VipsBlob *buffer, VOption *options ) return( out ); } +VImage VImage::pdfload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "pdfload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + int VImage::percent( double percent, VOption *options ) const { int threshold; @@ -2371,6 +2467,18 @@ VImage VImage::ppmload( const char *filename, VOption *options ) return( out ); } +VImage VImage::ppmload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "ppmload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + void VImage::ppmsave( const char *filename, VOption *options ) const { call( "ppmsave", @@ -2379,6 +2487,14 @@ void VImage::ppmsave( const char *filename, VOption *options ) const set( "filename", filename ) ); } +void VImage::ppmsave_target( VTarget target, VOption *options ) const +{ + call( "ppmsave_target", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "target", target ) ); +} + VImage VImage::premultiply( VOption *options ) const { VImage out; diff --git a/src/pipeline.cc b/src/pipeline.cc index 7830d6b0..8c1cb9bc 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -703,7 +703,9 @@ class PipelineWorker : public Napi::AsyncWorker { ->set("strip", !baton->withMetadata) ->set("Q", baton->jpegQuality) ->set("interlace", baton->jpegProgressive) - ->set("no_subsample", baton->jpegChromaSubsampling == "4:4:4") + ->set("subsample_mode", baton->jpegChromaSubsampling == "4:4:4" + ? VIPS_FOREIGN_JPEG_SUBSAMPLE_OFF + : VIPS_FOREIGN_JPEG_SUBSAMPLE_ON) ->set("trellis_quant", baton->jpegTrellisQuantisation) ->set("quant_table", baton->jpegQuantisationTable) ->set("overshoot_deringing", baton->jpegOvershootDeringing) @@ -769,7 +771,7 @@ class PipelineWorker : public Napi::AsyncWorker { VipsArea *area = VIPS_AREA(image.tiffsave_buffer(VImage::option() ->set("strip", !baton->withMetadata) ->set("Q", baton->tiffQuality) - ->set("squash", baton->tiffSquash) + ->set("bitdepth", baton->tiffBitdepth) ->set("compression", baton->tiffCompression) ->set("predictor", baton->tiffPredictor) ->set("pyramid", baton->tiffPyramid) @@ -845,7 +847,9 @@ class PipelineWorker : public Napi::AsyncWorker { ->set("strip", !baton->withMetadata) ->set("Q", baton->jpegQuality) ->set("interlace", baton->jpegProgressive) - ->set("no_subsample", baton->jpegChromaSubsampling == "4:4:4") + ->set("subsample_mode", baton->jpegChromaSubsampling == "4:4:4" + ? VIPS_FOREIGN_JPEG_SUBSAMPLE_OFF + : VIPS_FOREIGN_JPEG_SUBSAMPLE_ON) ->set("trellis_quant", baton->jpegTrellisQuantisation) ->set("quant_table", baton->jpegQuantisationTable) ->set("overshoot_deringing", baton->jpegOvershootDeringing) @@ -891,7 +895,7 @@ class PipelineWorker : public Napi::AsyncWorker { image.tiffsave(const_cast(baton->fileOut.data()), VImage::option() ->set("strip", !baton->withMetadata) ->set("Q", baton->tiffQuality) - ->set("squash", baton->tiffSquash) + ->set("bitdepth", baton->tiffBitdepth) ->set("compression", baton->tiffCompression) ->set("predictor", baton->tiffPredictor) ->set("pyramid", baton->tiffPyramid) @@ -940,7 +944,7 @@ class PipelineWorker : public Napi::AsyncWorker { std::vector> options { {"Q", std::to_string(baton->jpegQuality)}, {"interlace", baton->jpegProgressive ? "TRUE" : "FALSE"}, - {"no_subsample", baton->jpegChromaSubsampling == "4:4:4" ? "TRUE": "FALSE"}, + {"subsample_mode", baton->jpegChromaSubsampling == "4:4:4" ? "off" : "on"}, {"trellis_quant", baton->jpegTrellisQuantisation ? "TRUE" : "FALSE"}, {"quant_table", std::to_string(baton->jpegQuantisationTable)}, {"overshoot_deringing", baton->jpegOvershootDeringing ? "TRUE": "FALSE"}, @@ -1306,7 +1310,7 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) { baton->webpReductionEffort = sharp::AttrAsUint32(options, "webpReductionEffort"); baton->tiffQuality = sharp::AttrAsUint32(options, "tiffQuality"); baton->tiffPyramid = sharp::AttrAsBool(options, "tiffPyramid"); - baton->tiffSquash = sharp::AttrAsBool(options, "tiffSquash"); + baton->tiffBitdepth = sharp::AttrAsUint32(options, "tiffBitdepth"); baton->tiffTile = sharp::AttrAsBool(options, "tiffTile"); baton->tiffTileWidth = sharp::AttrAsUint32(options, "tiffTileWidth"); baton->tiffTileHeight = sharp::AttrAsUint32(options, "tiffTileHeight"); diff --git a/src/pipeline.h b/src/pipeline.h index 1ec5afba..722f7cf7 100644 --- a/src/pipeline.h +++ b/src/pipeline.h @@ -143,7 +143,7 @@ struct PipelineBaton { VipsForeignTiffCompression tiffCompression; VipsForeignTiffPredictor tiffPredictor; bool tiffPyramid; - bool tiffSquash; + int tiffBitdepth; bool tiffTile; int tiffTileHeight; int tiffTileWidth; @@ -251,7 +251,7 @@ struct PipelineBaton { tiffCompression(VIPS_FOREIGN_TIFF_COMPRESSION_JPEG), tiffPredictor(VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL), tiffPyramid(false), - tiffSquash(false), + tiffBitdepth(8), tiffTile(false), tiffTileHeight(256), tiffTileWidth(256), diff --git a/test/fixtures/expected/conv-sobel-horizontal.jpg b/test/fixtures/expected/conv-sobel-horizontal.jpg index f886a6073d6615f905ce02a7295a7e8c9ef865e5..4a9e2423d35ce151a9c6523ce9d3c793f0cea288 100644 GIT binary patch delta 18904 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 delta 19006 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 pGMSa#2*L2~82Z$zS{=f7-ZGS!gAOFMr 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 diff --git a/test/unit/failOnError.js b/test/unit/failOnError.js index b2f5837e..df0147bd 100644 --- a/test/unit/failOnError.js +++ b/test/unit/failOnError.js @@ -23,7 +23,7 @@ describe('failOnError', function () { let isWarningEmitted = false; sharp(fixtures.inputPngTruncated, { failOnError: false }) .on('warning', function (warning) { - assert.strictEqual('not enough data', warning); + assert.ok(warning.includes('not enough data') || warning.includes('end of stream')); isWarningEmitted = true; }) .resize(320, 240) @@ -62,7 +62,7 @@ describe('failOnError', function () { it('returns errors to callback for truncated PNG', function (done) { sharp(fixtures.inputPngTruncated).toBuffer(function (err, data, info) { - assert.ok(err.message.includes('vipspng: libpng read error'), err); + assert.ok(err.message.includes('read error'), err); assert.strictEqual(data, undefined); assert.strictEqual(info, undefined); done(); diff --git a/test/unit/tiff.js b/test/unit/tiff.js index 5c11eb6a..ec94db7c 100644 --- a/test/unit/tiff.js +++ b/test/unit/tiff.js @@ -116,7 +116,7 @@ describe('TIFF', function () { sharp(fixtures.inputTiff8BitDepth) .toColourspace('b-w') // can only squash 1 band uchar images .tiff({ - squash: false, + bitdepth: 8, compression: 'none', predictor: 'none' }) @@ -133,7 +133,7 @@ describe('TIFF', function () { sharp(fixtures.inputTiff8BitDepth) .toColourspace('b-w') // can only squash 1 band uchar images .tiff({ - squash: true, + bitdepth: 1, compression: 'none', predictor: 'none' }) @@ -145,10 +145,10 @@ describe('TIFF', function () { }); }); - it('Invalid TIFF squash value throws error', function () { + it('Invalid TIFF bitdepth value throws error', function () { assert.throws(function () { - sharp().tiff({ squash: 'true' }); - }); + sharp().tiff({ bitdepth: 3 }); + }, /Error: Expected 1, 2, 4 or 8 for bitdepth but received 3 of type number/); }); it('TIFF setting xres and yres on file', () => @@ -255,7 +255,7 @@ describe('TIFF', function () { sharp(fixtures.inputTiff) .toColourspace('b-w') .tiff({ - squash: true, + bitdepth: 1, compression: 'ccittfax4' }) .toFile(fixtures.outputTiff, (err, info) => {