old load/save funcs now use stream API

new_from_file / new_from_buffer and write_to_file / write_to_buffer
use the stream API if they can.
This commit is contained in:
John Cupitt 2019-11-13 16:39:47 +00:00
parent 123c52be70
commit 7aec350f1c
2 changed files with 114 additions and 31 deletions

View File

@ -1906,21 +1906,39 @@ vips_image_new_from_file( const char *name, ... )
{ {
char filename[VIPS_PATH_MAX]; char filename[VIPS_PATH_MAX];
char option_string[VIPS_PATH_MAX]; char option_string[VIPS_PATH_MAX];
VipsStreami *streami;
const char *operation_name; const char *operation_name;
va_list ap; va_list ap;
VipsImage *out;
int result; int result;
VipsImage *out;
vips_check_init(); vips_check_init();
vips__filename_split8( name, filename, option_string ); vips__filename_split8( name, filename, option_string );
if( !(operation_name = vips_foreign_find_load( filename )) )
/* Search with the new stream API first, then fall back to the older
* mechanism in case the loader we need has not been converted yet.
*/
if( !(streami = vips_streami_new_from_filename( filename )) )
return( NULL ); return( NULL );
va_start( ap, name ); if( (operation_name = vips_foreign_find_load_stream( streami )) ) {
result = vips_call_split_option_string( operation_name, option_string, va_start( ap, name );
ap, filename, &out ); result = vips_call_split_option_string( operation_name,
va_end( ap ); option_string, ap, streami, &out );
va_end( ap );
}
else {
if( !(operation_name = vips_foreign_find_load( filename )) )
return( NULL );
va_start( ap, name );
result = vips_call_split_option_string( operation_name,
option_string, ap, filename, &out );
va_end( ap );
}
VIPS_UNREF( streami );
if( result ) if( result )
return( NULL ); return( NULL );
@ -2136,27 +2154,46 @@ VipsImage *
vips_image_new_from_buffer( const void *buf, size_t len, vips_image_new_from_buffer( const void *buf, size_t len,
const char *option_string, ... ) const char *option_string, ... )
{ {
VipsStreami *streami;
const char *operation_name; const char *operation_name;
VipsBlob *blob;
va_list ap; va_list ap;
int result; int result;
VipsImage *out; VipsImage *out;
vips_check_init(); vips_check_init();
if( !(operation_name = vips_foreign_find_load_buffer( buf, len )) ) /* Search with the new stream API first, then fall back to the older
return( NULL ); * mechanism in case the loader we need has not been converted yet.
*/
if( !(streami = vips_streami_new_from_memory( buf, len )) )
return( NULL );
/* We don't take a copy of the data or free it. if( (operation_name = vips_foreign_find_load_stream( streami )) ) {
*/ va_start( ap, option_string );
blob = vips_blob_new( NULL, buf, len ); result = vips_call_split_option_string( operation_name,
option_string, ap, streami, &out );
va_end( ap );
}
else {
VipsBlob *blob;
va_start( ap, option_string ); if( !(operation_name =
result = vips_call_split_option_string( operation_name, vips_foreign_find_load_buffer( buf, len )) )
option_string, ap, blob, &out ); return( NULL );
va_end( ap );
vips_area_unref( VIPS_AREA( blob ) ); /* We don't take a copy of the data or free it.
*/
blob = vips_blob_new( NULL, buf, len );
va_start( ap, option_string );
result = vips_call_split_option_string( operation_name,
option_string, ap, blob, &out );
va_end( ap );
vips_area_unref( VIPS_AREA( blob ) );
}
VIPS_UNREF( streami );
if( result ) if( result )
return( NULL ); return( NULL );
@ -2625,14 +2662,32 @@ vips_image_write_to_file( VipsImage *image, const char *name, ... )
va_list ap; va_list ap;
int result; int result;
/* Save with the new stream API if we can. Fall back to the older
* mechanism in case the loader we need has not been converted yet.
*/
vips__filename_split8( name, filename, option_string ); vips__filename_split8( name, filename, option_string );
if( !(operation_name = vips_foreign_find_save( filename )) )
return( -1 );
va_start( ap, name ); if( (operation_name = vips_foreign_find_save_stream( filename )) ) {
result = vips_call_split_option_string( operation_name, option_string, VipsStreamo *streamo;
ap, image, filename );
va_end( ap ); if( !(streamo = vips_streamo_new_to_filename( filename )) )
return( -1 );
va_start( ap, name );
result = vips_call_split_option_string( operation_name,
option_string, ap, image, streamo );
va_end( ap );
VIPS_UNREF( streamo );
}
else if( (operation_name = vips_foreign_find_save( filename )) ) {
va_start( ap, name );
result = vips_call_split_option_string( operation_name,
option_string, ap, image, filename );
va_end( ap );
}
else
return( -1 );
return( result ); return( result );
} }
@ -2673,20 +2728,44 @@ vips_image_write_to_buffer( VipsImage *in,
int result; int result;
vips__filename_split8( suffix, filename, option_string ); vips__filename_split8( suffix, filename, option_string );
if( !(operation_name = vips_foreign_find_save_buffer( filename )) )
return( -1 );
va_start( ap, size ); if( (operation_name = vips_foreign_find_save_stream( filename )) ) {
result = vips_call_split_option_string( operation_name, option_string, VipsStreamo *streamo;
ap, in, &blob );
va_end( ap );
if( result ) if( !(streamo = vips_streamo_new_to_memory()) )
return( -1 );
va_start( ap, size );
result = vips_call_split_option_string( operation_name,
option_string, ap, in, streamo );
va_end( ap );
if( result ) {
VIPS_UNREF( streamo );
return( -1 );
}
g_object_get( streamo, "blob", &blob, NULL );
VIPS_UNREF( streamo );
}
else if( (operation_name =
vips_foreign_find_save_buffer( filename )) ) {
va_start( ap, size );
result = vips_call_split_option_string( operation_name,
option_string, ap, in, &blob );
va_end( ap );
if( result )
return( -1 );
}
else
return( -1 ); return( -1 );
*buf = NULL; *buf = NULL;
if( size ) if( size )
*size = 0; *size = 0;
if( blob ) { if( blob ) {
if( buf ) { if( buf ) {
*buf = VIPS_AREA( blob )->data; *buf = VIPS_AREA( blob )->data;

View File

@ -545,8 +545,12 @@ vips_streami_unminimise( VipsStreami *streami )
int fd; int fd;
if( (fd = vips_tracked_open( stream->filename, if( (fd = vips_tracked_open( stream->filename,
MODE_READ )) == -1 ) MODE_READ )) == -1 ) {
vips_error_system( errno, vips_stream_nick( stream ),
_( "unable to open for read" ),
stream->filename );
return( -1 ); return( -1 );
}
stream->tracked_descriptor = fd; stream->tracked_descriptor = fd;
stream->descriptor = fd; stream->descriptor = fd;