diff --git a/docs/changelog.md b/docs/changelog.md index b787a191..cd53f288 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,11 @@ # Changelog +## v0.28 - *circle* + +Requires libvips v8.11.0 + +### v0.29.0 - TBD + ## v0.28 - *bijou* Requires libvips v8.10.6 diff --git a/package.json b/package.json index 80835828..47a74ac1 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ }, "license": "Apache-2.0", "config": { - "libvips": "8.10.6", + "libvips": "8.11.0-rc1", "runtime": "napi", "target": 3 }, diff --git a/src/common.h b/src/common.h index d8ff0ecd..3ee047ea 100644 --- a/src/common.h +++ b/src/common.h @@ -25,9 +25,9 @@ // Verify platform and compiler compatibility #if (VIPS_MAJOR_VERSION < 8) || \ - (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION < 10) || \ - (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION == 10 && VIPS_MICRO_VERSION < 6) -#error "libvips version 8.10.6+ is required - please see https://sharp.pixelplumbing.com/install" + (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION < 11) || \ + (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION == 11 && VIPS_MICRO_VERSION < 0) +#error "libvips version 8.11.0+ is required - please see https://sharp.pixelplumbing.com/install" #endif #if ((!defined(__clang__)) && defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))) diff --git a/src/libvips/cplusplus/VConnection.cpp b/src/libvips/cplusplus/VConnection.cpp index be7afc5a..adea2e17 100644 --- a/src/libvips/cplusplus/VConnection.cpp +++ b/src/libvips/cplusplus/VConnection.cpp @@ -110,19 +110,6 @@ VSource::new_from_options( const char *options ) return( out ); } -VOption * -VOption::set( const char *name, const VSource value ) -{ - Pair *pair = new Pair( name ); - - pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_SOURCE ); - g_value_set_object( &pair->value, value.get_source() ); - options.push_back( pair ); - - return( this ); -} - VTarget VTarget::new_to_descriptor( int descriptor ) { @@ -162,17 +149,4 @@ VTarget::new_to_memory() return( out ); } -VOption * -VOption::set( const char *name, const VTarget value ) -{ - Pair *pair = new Pair( name ); - - pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_TARGET ); - g_value_set_object( &pair->value, value.get_target() ); - options.push_back( pair ); - - return( this ); -} - VIPS_NAMESPACE_END diff --git a/src/libvips/cplusplus/VImage.cpp b/src/libvips/cplusplus/VImage.cpp index 27654f22..49b006a4 100644 --- a/src/libvips/cplusplus/VImage.cpp +++ b/src/libvips/cplusplus/VImage.cpp @@ -51,6 +51,12 @@ VIPS_NAMESPACE_START +/** + * \namespace vips + * + * General docs for the vips namespace. + */ + std::vector to_vectorv( int n, ... ) { @@ -140,6 +146,20 @@ VOption::set( const char *name, int value ) return( this ); } +// input guint64 +VOption * +VOption::set( const char *name, guint64 value ) +{ + Pair *pair = new Pair( name ); + + pair->input = true; + g_value_init( &pair->value, G_TYPE_UINT64 ); + g_value_set_uint64( &pair->value, value ); + options.push_back( pair ); + + return( this ); +} + // input double VOption * VOption::set( const char *name, double value ) @@ -167,39 +187,17 @@ VOption::set( const char *name, const char *value ) return( this ); } -// input image +// input vips object (image, source, target, etc. etc.) VOption * -VOption::set( const char *name, const VImage value ) +VOption::set( const char *name, const VObject value ) { Pair *pair = new Pair( name ); + VipsObject *object = value.get_object(); + GType type = G_OBJECT_TYPE( object ); pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_IMAGE ); - g_value_set_object( &pair->value, value.get_image() ); - options.push_back( pair ); - - return( this ); -} - -// input double array -VOption * -VOption::set( const char *name, std::vector value ) -{ - Pair *pair = new Pair( name ); - - double *array; - 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 ); - - for( i = 0; i < value.size(); i++ ) - array[i] = value[i]; - + g_value_init( &pair->value, type ); + g_value_set_object( &pair->value, object ); options.push_back( pair ); return( this ); @@ -229,6 +227,30 @@ VOption::set( const char *name, std::vector value ) return( this ); } +// input double array +VOption * +VOption::set( const char *name, std::vector value ) +{ + Pair *pair = new Pair( name ); + + double *array; + 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 ); + + for( i = 0; i < value.size(); i++ ) + array[i] = value[i]; + + options.push_back( pair ); + + return( this ); +} + // input image array VOption * VOption::set( const char *name, std::vector value ) @@ -619,6 +641,22 @@ VImage::new_from_source( VSource source, const char *option_string, return( out ); } +VImage +VImage::new_from_memory_steal( void *data, size_t size, + int width, int height, int bands, VipsBandFormat format ) +{ + VipsImage *image; + + if( !(image = vips_image_new_from_memory( data, size, + width, height, bands, format )) ) + throw( VError() ); + + g_signal_connect( image, "postclose", + G_CALLBACK( vips_image_free_buffer ), data); + + return( VImage( image ) ); +} + VImage VImage::new_matrix( int width, int height ) { diff --git a/src/libvips/cplusplus/VInterpolate.cpp b/src/libvips/cplusplus/VInterpolate.cpp index cb59715c..303a9b8b 100644 --- a/src/libvips/cplusplus/VInterpolate.cpp +++ b/src/libvips/cplusplus/VInterpolate.cpp @@ -60,17 +60,4 @@ VInterpolate::new_from_name( const char *name, VOption *options ) return( out ); } -VOption * -VOption::set( const char *name, const VInterpolate value ) -{ - Pair *pair = new Pair( name ); - - pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_INTERPOLATE ); - g_value_set_object( &pair->value, value.get_interpolate() ); - options.push_back( pair ); - - return( this ); -} - VIPS_NAMESPACE_END diff --git a/src/libvips/cplusplus/vips-operators.cpp b/src/libvips/cplusplus/vips-operators.cpp index f8456a5f..7f9a94c0 100644 --- a/src/libvips/cplusplus/vips-operators.cpp +++ b/src/libvips/cplusplus/vips-operators.cpp @@ -1,5 +1,5 @@ // bodies for vips operations -// Sun 5 Jul 22:36:37 BST 2020 +// Wed May 12 11:30:00 AM CEST 2021 // this file is generated automatically, do not edit! VImage VImage::CMC2LCh( VOption *options ) const @@ -1065,6 +1065,18 @@ VImage VImage::fitsload( const char *filename, VOption *options ) return( out ); } +VImage VImage::fitsload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "fitsload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + void VImage::fitssave( const char *filename, VOption *options ) const { call( "fitssave", @@ -1656,6 +1668,70 @@ VImage VImage::join( VImage in2, VipsDirection direction, VOption *options ) con return( out ); } +VImage VImage::jp2kload( const char *filename, VOption *options ) +{ + VImage out; + + call( "jp2kload", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "filename", filename ) ); + + return( out ); +} + +VImage VImage::jp2kload_buffer( VipsBlob *buffer, VOption *options ) +{ + VImage out; + + call( "jp2kload_buffer", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "buffer", buffer ) ); + + return( out ); +} + +VImage VImage::jp2kload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "jp2kload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + +void VImage::jp2ksave( const char *filename, VOption *options ) const +{ + call( "jp2ksave", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "filename", filename ) ); +} + +VipsBlob *VImage::jp2ksave_buffer( VOption *options ) const +{ + VipsBlob *buffer; + + call( "jp2ksave_buffer", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "buffer", &buffer ) ); + + return( buffer ); +} + +void VImage::jp2ksave_target( VTarget target, VOption *options ) const +{ + call( "jp2ksave_target", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "target", target ) ); +} + VImage VImage::jpegload( const char *filename, VOption *options ) { VImage out; @@ -1727,6 +1803,70 @@ void VImage::jpegsave_target( VTarget target, VOption *options ) const set( "target", target ) ); } +VImage VImage::jxlload( const char *filename, VOption *options ) +{ + VImage out; + + call( "jxlload", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "filename", filename ) ); + + return( out ); +} + +VImage VImage::jxlload_buffer( VipsBlob *buffer, VOption *options ) +{ + VImage out; + + call( "jxlload_buffer", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "buffer", buffer ) ); + + return( out ); +} + +VImage VImage::jxlload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "jxlload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + +void VImage::jxlsave( const char *filename, VOption *options ) const +{ + call( "jxlsave", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "filename", filename ) ); +} + +VipsBlob *VImage::jxlsave_buffer( VOption *options ) const +{ + VipsBlob *buffer; + + call( "jxlsave_buffer", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "buffer", &buffer ) ); + + return( buffer ); +} + +void VImage::jxlsave_target( VTarget target, VOption *options ) const +{ + call( "jxlsave_target", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "target", target ) ); +} + VImage VImage::labelregions( VOption *options ) const { VImage mask; @@ -2284,6 +2424,18 @@ VImage VImage::niftiload( const char *filename, VOption *options ) return( out ); } +VImage VImage::niftiload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "niftiload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + void VImage::niftisave( const char *filename, VOption *options ) const { call( "niftisave", @@ -2316,6 +2468,18 @@ VImage VImage::openslideload( const char *filename, VOption *options ) return( out ); } +VImage VImage::openslideload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "openslideload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + VImage VImage::pdfload( const char *filename, VOption *options ) { VImage out; @@ -3388,6 +3552,18 @@ VImage VImage::vipsload( const char *filename, VOption *options ) return( out ); } +VImage VImage::vipsload_source( VSource source, VOption *options ) +{ + VImage out; + + call( "vipsload_source", + (options ? options : VImage::option())-> + set( "out", &out )-> + set( "source", source ) ); + + return( out ); +} + void VImage::vipssave( const char *filename, VOption *options ) const { call( "vipssave", @@ -3396,6 +3572,14 @@ void VImage::vipssave( const char *filename, VOption *options ) const set( "filename", filename ) ); } +void VImage::vipssave_target( VTarget target, VOption *options ) const +{ + call( "vipssave_target", + (options ? options : VImage::option())-> + set( "in", *this )-> + set( "target", target ) ); +} + VImage VImage::webpload( const char *filename, VOption *options ) { VImage out; diff --git a/test/unit/metadata.js b/test/unit/metadata.js index 91b40bb7..c5699b03 100644 --- a/test/unit/metadata.js +++ b/test/unit/metadata.js @@ -247,7 +247,7 @@ describe('Image metadata', function () { assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(800, metadata.width); assert.strictEqual(533, metadata.height); - assert.strictEqual(true, [3, 4].includes(metadata.channels)); // libvips 8.11.0 = 4 + assert.strictEqual(4, metadata.channels); assert.strictEqual('uchar', metadata.depth); assert.strictEqual('undefined', typeof metadata.density); assert.strictEqual('undefined', typeof metadata.chromaSubsampling); @@ -266,7 +266,7 @@ describe('Image metadata', function () { assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(2, metadata.width); assert.strictEqual(1, metadata.height); - assert.strictEqual(true, [2, 4].includes(metadata.channels)); // libvips 8.11.0 = 4 + assert.strictEqual(4, metadata.channels); assert.strictEqual('uchar', metadata.depth); assert.strictEqual('undefined', typeof metadata.density); assert.strictEqual('undefined', typeof metadata.chromaSubsampling); @@ -320,7 +320,7 @@ describe('Image metadata', function () { assert.strictEqual(isProgressive, false); assert.strictEqual(pages, 10); assert.strictEqual(pageHeight, 285); - assert.strictEqual(true, [2, 3].includes(loop)); // libvips 8.11.0 = 2 + assert.strictEqual(loop, 2); assert.deepStrictEqual(delay, [...Array(9).fill(3000), 15000]); assert.strictEqual(hasProfile, false); assert.strictEqual(hasAlpha, true); diff --git a/test/unit/stats.js b/test/unit/stats.js index 342b27dc..2a878cb2 100644 --- a/test/unit/stats.js +++ b/test/unit/stats.js @@ -423,20 +423,20 @@ describe('Image Stats', function () { assert.strictEqual(true, isInRange(stats.channels[0].maxY, 0, 1)); // alpha channel - assert.strictEqual(0, stats.channels[1].min); - assert.strictEqual(255, stats.channels[1].max); - assert.strictEqual(true, isInAcceptableRange(stats.channels[1].sum, 255)); - assert.strictEqual(true, isInAcceptableRange(stats.channels[1].squaresSum, 65025)); - assert.strictEqual(true, isInAcceptableRange(stats.channels[1].mean, 127.5)); - assert.strictEqual(true, isInAcceptableRange(stats.channels[1].stdev, 180.31222920256963)); - assert.strictEqual(true, isInteger(stats.channels[1].minX)); - assert.strictEqual(true, isInRange(stats.channels[1].minX, 0, 2)); - assert.strictEqual(true, isInteger(stats.channels[1].minY)); - assert.strictEqual(true, isInRange(stats.channels[1].minY, 0, 1)); - assert.strictEqual(true, isInteger(stats.channels[1].maxX)); - assert.strictEqual(true, isInRange(stats.channels[1].maxX, 0, 2)); - assert.strictEqual(true, isInteger(stats.channels[1].maxY)); - assert.strictEqual(true, isInRange(stats.channels[1].maxY, 0, 1)); + assert.strictEqual(0, stats.channels[3].min); + assert.strictEqual(255, stats.channels[3].max); + assert.strictEqual(true, isInAcceptableRange(stats.channels[3].sum, 255)); + assert.strictEqual(true, isInAcceptableRange(stats.channels[3].squaresSum, 65025)); + assert.strictEqual(true, isInAcceptableRange(stats.channels[3].mean, 127.5)); + assert.strictEqual(true, isInAcceptableRange(stats.channels[3].stdev, 180.31222920256963)); + assert.strictEqual(true, isInteger(stats.channels[3].minX)); + assert.strictEqual(true, isInRange(stats.channels[3].minX, 0, 2)); + assert.strictEqual(true, isInteger(stats.channels[3].minY)); + assert.strictEqual(true, isInRange(stats.channels[3].minY, 0, 1)); + assert.strictEqual(true, isInteger(stats.channels[3].maxX)); + assert.strictEqual(true, isInRange(stats.channels[3].maxX, 0, 2)); + assert.strictEqual(true, isInteger(stats.channels[3].maxY)); + assert.strictEqual(true, isInRange(stats.channels[3].maxY, 0, 1)); done(); });