fix delayed write to foreign via "w"
also added vips_foreign_find_save_options()/ vips_foreign_find_load_options()
This commit is contained in:
parent
2fed2f3490
commit
d38e7bea57
@ -1,5 +1,7 @@
|
|||||||
30/1/12 started 7.28.0
|
30/1/12 started 7.28.0
|
||||||
- version bump
|
- version bump
|
||||||
|
- added vips_foreign_find_save_options()/vips_foreign_find_load_options()
|
||||||
|
- delayed write to foreign via a "w" image was not working
|
||||||
|
|
||||||
20/8/11 started 7.27.0
|
20/8/11 started 7.27.0
|
||||||
- version bump for new dev cycle
|
- version bump for new dev cycle
|
||||||
|
16
TODO
16
TODO
@ -1,22 +1,6 @@
|
|||||||
- swig is not wrapping ops which return more than one arg by reference
|
- swig is not wrapping ops which return more than one arg by reference
|
||||||
correctly .. eg. im_correl()
|
correctly .. eg. im_correl()
|
||||||
|
|
||||||
- try/bench/vips.py is broken
|
|
||||||
|
|
||||||
|
|
||||||
(gdb) run vips.py wtc_tiled_small.tif x.tif
|
|
||||||
Starting program: /usr/bin/python vips.py wtc_tiled_small.tif x.tif
|
|
||||||
[Thread debugging using libthread_db enabled]
|
|
||||||
|
|
||||||
(vips.py:28339): GLib-GObject-CRITICAL **: g_object_ref: assertion
|
|
||||||
`G_IS_OBJECT (object)' failed
|
|
||||||
|
|
||||||
Program received signal SIGSEGV, Segmentation fault.
|
|
||||||
vips_foreign_convert_saveable (save=0xeac800) at foreign.c:899
|
|
||||||
899 if( in->Coding != VIPS_CODING_NONE &&
|
|
||||||
(gdb) p in
|
|
||||||
$1 = (VipsImage *) 0x0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -482,13 +482,13 @@ vips_foreign_load_new_from_foreign_sub( VipsForeignLoadClass *load_class,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* vips_foreign_find_load:
|
* vips_foreign_find_load:
|
||||||
* @filename: file to find a file for
|
* @filename: file to find a loader for
|
||||||
*
|
*
|
||||||
* Searches for an operation you could use to load a file.
|
* Searches for an operation you could use to load @filename.
|
||||||
*
|
*
|
||||||
* See also: vips_foreign_read().
|
* See also: vips_foreign_read().
|
||||||
*
|
*
|
||||||
* Returns: the nmae of an operation on success, %NULL on error
|
* Returns: the name of an operation on success, %NULL on error
|
||||||
*/
|
*/
|
||||||
const char *
|
const char *
|
||||||
vips_foreign_find_load( const char *filename )
|
vips_foreign_find_load( const char *filename )
|
||||||
@ -513,6 +513,40 @@ vips_foreign_find_load( const char *filename )
|
|||||||
return( G_OBJECT_CLASS_NAME( load_class ) );
|
return( G_OBJECT_CLASS_NAME( load_class ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vips_foreign_find_load_options:
|
||||||
|
* @filename: file to find a loader for
|
||||||
|
*
|
||||||
|
* Searches for an operation you could use to load @filename.
|
||||||
|
*
|
||||||
|
* Arguments to the loader may be embedded in the filename using the usual
|
||||||
|
* syntax.
|
||||||
|
*
|
||||||
|
* See also: vips_foreign_load().
|
||||||
|
*
|
||||||
|
* Returns: 0 on success, -1 on error
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
vips_foreign_find_load_options( const char *filename )
|
||||||
|
{
|
||||||
|
VipsObjectClass *oclass = g_type_class_ref( VIPS_TYPE_FOREIGN_LOAD );
|
||||||
|
VipsObject *object;
|
||||||
|
const char *type_name;
|
||||||
|
|
||||||
|
/* This will use vips_foreign_load_new_from_string() to pick a loader,
|
||||||
|
* then set options from the tail of the filename. This is rather slow
|
||||||
|
* :-(
|
||||||
|
*/
|
||||||
|
if( !(object = vips_object_new_from_string( oclass, filename )) )
|
||||||
|
return( NULL );
|
||||||
|
|
||||||
|
type_name = G_OBJECT_TYPE_NAME( object );
|
||||||
|
|
||||||
|
g_object_unref( object );
|
||||||
|
|
||||||
|
return( type_name );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vips_foreign_is_a:
|
* vips_foreign_is_a:
|
||||||
* @loader: name of loader to use for test
|
* @loader: name of loader to use for test
|
||||||
@ -834,9 +868,12 @@ vips_foreign_find_save_sub( VipsForeignSaveClass *save_class,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* vips_foreign_find_save:
|
* vips_foreign_find_save:
|
||||||
* @filename: name to find a file for
|
* @filename: name to find a saver for
|
||||||
*
|
*
|
||||||
* Searches for an operation you could use to save a file.
|
* Searches for an operation you could use to write to @filename.
|
||||||
|
*
|
||||||
|
* @filename may not contain embedded options. See
|
||||||
|
* vips_foreign_find_save_options() if your filename may have options in.
|
||||||
*
|
*
|
||||||
* See also: vips_foreign_write().
|
* See also: vips_foreign_write().
|
||||||
*
|
*
|
||||||
@ -860,6 +897,40 @@ vips_foreign_find_save( const char *filename )
|
|||||||
return( G_OBJECT_CLASS_NAME( save_class ) );
|
return( G_OBJECT_CLASS_NAME( save_class ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vips_foreign_find_save_options:
|
||||||
|
* @filename: name to find a saver for
|
||||||
|
*
|
||||||
|
* Searches for an operation you could use to write to @filename.
|
||||||
|
*
|
||||||
|
* @filename may contain embedded options. See
|
||||||
|
* vips_foreign_find_save() if your filename does not options in.
|
||||||
|
*
|
||||||
|
* See also: vips_foreign_write().
|
||||||
|
*
|
||||||
|
* Returns: 0 on success, -1 on error
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
vips_foreign_find_save_options( const char *filename )
|
||||||
|
{
|
||||||
|
VipsObjectClass *oclass = g_type_class_ref( VIPS_TYPE_FOREIGN_SAVE );
|
||||||
|
VipsObject *object;
|
||||||
|
const char *type_name;
|
||||||
|
|
||||||
|
/* This will use vips_foreign_save_new_from_string() to pick a saver,
|
||||||
|
* then set options from the tail of the filename. This is rather slow
|
||||||
|
* :-(
|
||||||
|
*/
|
||||||
|
if( !(object = vips_object_new_from_string( oclass, filename )) )
|
||||||
|
return( NULL );
|
||||||
|
|
||||||
|
type_name = G_OBJECT_TYPE_NAME( object );
|
||||||
|
|
||||||
|
g_object_unref( object );
|
||||||
|
|
||||||
|
return( type_name );
|
||||||
|
}
|
||||||
|
|
||||||
static VipsObject *
|
static VipsObject *
|
||||||
vips_foreign_save_new_from_string( const char *string )
|
vips_foreign_save_new_from_string( const char *string )
|
||||||
{
|
{
|
||||||
@ -1139,7 +1210,8 @@ vips_foreign_save_build( VipsObject *object )
|
|||||||
{
|
{
|
||||||
VipsForeignSave *save = VIPS_FOREIGN_SAVE( object );
|
VipsForeignSave *save = VIPS_FOREIGN_SAVE( object );
|
||||||
|
|
||||||
if( vips_foreign_convert_saveable( save ) )
|
if( save->in &&
|
||||||
|
vips_foreign_convert_saveable( save ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_parent_class )->
|
if( VIPS_OBJECT_CLASS( vips_foreign_save_parent_class )->
|
||||||
@ -1222,7 +1294,8 @@ vips_foreign_load( const char *filename, VipsImage **out, ... )
|
|||||||
* @...: %NULL-terminated list of optional named arguments
|
* @...: %NULL-terminated list of optional named arguments
|
||||||
*
|
*
|
||||||
* Saves @in to @filename using the saver recommended by
|
* Saves @in to @filename using the saver recommended by
|
||||||
* vips_foreign_find_save().
|
* vips_foreign_find_save(). Options are not in @filename but must be given
|
||||||
|
* as a NULL-terminated list of name-value pairs.
|
||||||
*
|
*
|
||||||
* See also: vips_foreign_load().
|
* See also: vips_foreign_load().
|
||||||
*
|
*
|
||||||
@ -1304,6 +1377,9 @@ vips_foreign_load_options( const char *filename, VipsImage **out )
|
|||||||
* Saves @in to @filename using the saver recommended by
|
* Saves @in to @filename using the saver recommended by
|
||||||
* vips_foreign_find_save().
|
* vips_foreign_find_save().
|
||||||
*
|
*
|
||||||
|
* Arguments to the saver may be embedded in the filename using the usual
|
||||||
|
* syntax.
|
||||||
|
*
|
||||||
* See also: vips_foreign_save().
|
* See also: vips_foreign_save().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error
|
* Returns: 0 on success, -1 on error
|
||||||
|
@ -189,6 +189,7 @@ typedef struct _VipsForeignLoadClass {
|
|||||||
GType vips_foreign_load_get_type( void );
|
GType vips_foreign_load_get_type( void );
|
||||||
|
|
||||||
const char *vips_foreign_find_load( const char *filename );
|
const char *vips_foreign_find_load( const char *filename );
|
||||||
|
const char *vips_foreign_find_load_options( const char *filename );
|
||||||
|
|
||||||
VipsForeignFlags vips_foreign_flags( const char *loader, const char *filename );
|
VipsForeignFlags vips_foreign_flags( const char *loader, const char *filename );
|
||||||
gboolean vips_foreign_is_a( const char *loader, const char *filename );
|
gboolean vips_foreign_is_a( const char *loader, const char *filename );
|
||||||
@ -277,6 +278,7 @@ typedef struct _VipsForeignSaveClass {
|
|||||||
GType vips_foreign_save_get_type( void );
|
GType vips_foreign_save_get_type( void );
|
||||||
|
|
||||||
const char *vips_foreign_find_save( const char *filename );
|
const char *vips_foreign_find_save( const char *filename );
|
||||||
|
const char *vips_foreign_find_save_options( const char *filename );
|
||||||
|
|
||||||
/* Read/write an image convenience functions.
|
/* Read/write an image convenience functions.
|
||||||
*/
|
*/
|
||||||
|
@ -503,12 +503,12 @@ vips_image_rewind( VipsObject *object )
|
|||||||
* to a "p" and on "written" do im_vips2tiff() or whatever.
|
* to a "p" and on "written" do im_vips2tiff() or whatever.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* From "written" callback: invoke a delayed save by building the write object..
|
/* From "written" callback: save to image->filename using VipsForeign.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
vips_image_save_cb( VipsImage *image, int *result, VipsObject *write )
|
vips_image_save_cb( VipsImage *image, int *result )
|
||||||
{
|
{
|
||||||
if( vips_object_build( write ) )
|
if( vips_foreign_save_options( image, image->filename ) )
|
||||||
*result = -1;
|
*result = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -669,36 +669,27 @@ vips_image_build( VipsObject *object )
|
|||||||
|
|
||||||
case 'w':
|
case 'w':
|
||||||
{
|
{
|
||||||
VipsObjectClass *oclass =
|
const char *file_op;
|
||||||
g_type_class_ref( VIPS_TYPE_FOREIGN_SAVE );
|
|
||||||
VipsObject *object;
|
|
||||||
|
|
||||||
/* This will use vips_foreign_save_new_from_string() to pick a
|
|
||||||
* saver, then set options from the tail of the filename.
|
|
||||||
*/
|
|
||||||
if( !(object = vips_object_new_from_string( oclass,
|
|
||||||
filename )) )
|
|
||||||
return( -1 );
|
|
||||||
vips_object_local( image, object );
|
|
||||||
|
|
||||||
/* Make sure the vips saver is there ... strange things will
|
/* Make sure the vips saver is there ... strange things will
|
||||||
* happen if that type is renamed or removed.
|
* happen if this type is renamed or removed.
|
||||||
*/
|
*/
|
||||||
g_assert( g_type_from_name( "VipsForeignSaveVips" ) );
|
g_assert( g_type_from_name( "VipsForeignSaveVips" ) );
|
||||||
|
|
||||||
/* If this ia the vips saver, just save directly ourselves.
|
if( !(file_op = vips_foreign_find_save_options( filename )) )
|
||||||
* Otherwise trigger a _build() and save when the image has
|
return( -1 );
|
||||||
* been written to.
|
|
||||||
|
/* If this is the vips saver, just save directly ourselves.
|
||||||
|
* Otherwise save with VipsForeign when the image has been
|
||||||
|
* written to.
|
||||||
*/
|
*/
|
||||||
if( G_TYPE_CHECK_INSTANCE_TYPE( object,
|
if( strcmp( file_op, "VipsForeignSaveVips" ) == 0 )
|
||||||
g_type_from_name( "VipsForeignSaveVips" ) ) ) {
|
|
||||||
image->dtype = VIPS_IMAGE_OPENOUT;
|
image->dtype = VIPS_IMAGE_OPENOUT;
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
image->dtype = VIPS_IMAGE_PARTIAL;
|
image->dtype = VIPS_IMAGE_PARTIAL;
|
||||||
g_signal_connect( image, "written",
|
g_signal_connect( image, "written",
|
||||||
G_CALLBACK( vips_image_save_cb ),
|
G_CALLBACK( vips_image_save_cb ),
|
||||||
object );
|
NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user