diff --git a/ChangeLog b/ChangeLog index 6535460f..3494b24b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ - fix regression in tiff pyramid thumbnailing [tand826] - stop 0-length buffer being passed to imagemagick [lovell] - convert no-profile CMYK to RGB on save [augustocdias] +- ensure SVG loader skips input with chars outside x09-x7F range [lovell] 24/1/20 started 8.10.0 - more conformat IIIF output from dzsave [regisrob] diff --git a/libvips/conversion/arrayjoin.c b/libvips/conversion/arrayjoin.c index 5f140408..40720fc3 100644 --- a/libvips/conversion/arrayjoin.c +++ b/libvips/conversion/arrayjoin.c @@ -424,7 +424,10 @@ vips_arrayjoinv( VipsImage **in, VipsImage **out, int n, va_list ap ) * Smallest common format in * arithmetic). * - * See also: vips_join(), vips_insert(). + * vips_colourspace() can be useful for moving the images to a common + * colourspace for compositing. + * + * See also: vips_join(), vips_insert(), vips_colourspace(). * * Returns: 0 on success, -1 on error */ diff --git a/libvips/include/vips/internal.h b/libvips/include/vips/internal.h index 84030580..d549c321 100644 --- a/libvips/include/vips/internal.h +++ b/libvips/include/vips/internal.h @@ -114,7 +114,6 @@ void vips__threadpool_init( void ); void vips__cache_init( void ); -void vips__sink_screen_init( void ); void vips__print_renders( void ); void vips__type_leak( void ); diff --git a/libvips/iofuncs/init.c b/libvips/iofuncs/init.c index 7c9cd5d9..aa1b5901 100644 --- a/libvips/iofuncs/init.c +++ b/libvips/iofuncs/init.c @@ -413,7 +413,6 @@ vips_init( const char *argv0 ) #endif /*HAVE_THREAD_NEW*/ vips__threadpool_init(); - vips__sink_screen_init(); vips__buffer_init(); vips__meta_init(); diff --git a/libvips/iofuncs/sinkscreen.c b/libvips/iofuncs/sinkscreen.c index a2dfaee5..03001d2f 100644 --- a/libvips/iofuncs/sinkscreen.c +++ b/libvips/iofuncs/sinkscreen.c @@ -450,6 +450,9 @@ vips__render_shutdown( void ) } else g_mutex_unlock( render_dirty_lock ); + + VIPS_FREEF( vips_g_mutex_free, render_dirty_lock ); + vips_semaphore_destroy( &n_render_dirty_sem ); } VIPS_FREEF( vips_g_mutex_free, render_dirty_lock ); @@ -1030,8 +1033,8 @@ render_thread_main( void *client ) return( NULL ); } -void -vips__sink_screen_init( void ) +static void * +vips__sink_screen_init( void *data ) { g_assert( !render_thread ); g_assert( !render_dirty_lock ); @@ -1040,6 +1043,8 @@ vips__sink_screen_init( void ) vips_semaphore_init( &n_render_dirty_sem, 0, "n_render_dirty" ); render_thread = vips_g_thread_new( "sink_screen", render_thread_main, NULL ); + + return( NULL ); } /** @@ -1099,8 +1104,12 @@ vips_sink_screen( VipsImage *in, VipsImage *out, VipsImage *mask, int priority, VipsSinkNotify notify_fn, void *a ) { + static GOnce once = G_ONCE_INIT; + Render *render; + VIPS_ONCE( &once, vips__sink_screen_init, NULL ); + if( tile_width <= 0 || tile_height <= 0 || max_tiles < -1 ) { vips_error( "vips_sink_screen", "%s", _( "bad parameters" ) );