diff --git a/ChangeLog b/ChangeLog index 637f9af4..71403c88 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22,6 +22,7 @@ - "invalidate" is careful to keep images alive, so invalidate callbacks can do im_close() - flood_blob could loop if start point == ink +- added im_meta_remove() 26/11/09 started 7.20.3 - updated en_GB.po translation diff --git a/TODO b/TODO index 46cb55a4..9737b9e4 100644 --- a/TODO +++ b/TODO @@ -3,6 +3,15 @@ we'd need to have coordinate transforms broken out for this :-( +- vipsthumbnail should have an option to delete the profile from the final + jpg? handy if you want all your profiles in eg. sRGB + +- try writing docs for vipsthumbnail with gtkdoc? then try header etc. + +- rename header, edvips as vipsheader, vipsedit + + maybe have back compat links? + - should im_rwcheck() copy to disc? maybe im_rwcheck_disc() copies to im->filename and maps that diff --git a/libvips/include/vips/meta.h b/libvips/include/vips/meta.h index 5f1bac4c..74cce5dc 100644 --- a/libvips/include/vips/meta.h +++ b/libvips/include/vips/meta.h @@ -107,6 +107,7 @@ int im_blob_set( GValue *value, im_callback_fn free_fn, void *data, size_t length ); int im_meta_set( IMAGE *, const char *field, GValue * ); +gboolean im_meta_remove( IMAGE *im, const char *field ); int im_meta_get( IMAGE *, const char *field, GValue * ); GType im_meta_get_typeof( IMAGE *im, const char *field ); diff --git a/libvips/iofuncs/meta.c b/libvips/iofuncs/meta.c index fc3b6f6f..421315d8 100644 --- a/libvips/iofuncs/meta.c +++ b/libvips/iofuncs/meta.c @@ -71,8 +71,6 @@ #include #endif /*HAVE_UNISTD_H*/ -#include - #include #include @@ -245,14 +243,14 @@ void im__meta_destroy( IMAGE *im ) { IM_FREEF( g_hash_table_destroy, im->Meta ); - assert( !im->Meta_traverse ); + g_assert( !im->Meta_traverse ); } static void meta_init( IMAGE *im ) { if( !im->Meta ) { - assert( !im->Meta_traverse ); + g_assert( !im->Meta_traverse ); im->Meta = g_hash_table_new_full( g_str_hash, g_str_equal, NULL, (GDestroyNotify) meta_free ); } @@ -338,8 +336,8 @@ im_meta_set( IMAGE *im, const char *field, GValue *value ) { Meta *meta; - assert( field ); - assert( value ); + g_assert( field ); + g_assert( value ); meta_init( im ); if( !(meta = meta_new( im, field, value )) ) @@ -352,6 +350,28 @@ im_meta_set( IMAGE *im, const char *field, GValue *value ) return( 0 ); } +/** + * im_meta_remove: + * @im: image to test + * @field: the name to search for + * + * Find and remove an item of metadata. Return %FALSE if no metadata of that + * name was found. + * + * See also: im_meta_set(), im_meta_get_typeof(). + * + * Returns: %TRUE if an item of metadata of that name was found and removed + */ +gboolean +im_meta_remove( IMAGE *im, const char *field ) +{ + if( im->Meta && + g_hash_table_remove( im->Meta, field ) ) + return( TRUE ); + + return( FALSE ); +} + /** * im_meta_get: * @im: image to get the metadata from @@ -398,8 +418,8 @@ im_meta_get( IMAGE *im, const char *field, GValue *value_copy ) { Meta *meta; - assert( field ); - assert( value_copy ); + g_assert( field ); + g_assert( value_copy ); /* Defined? */ @@ -432,7 +452,7 @@ im_meta_get_typeof( IMAGE *im, const char *field ) { Meta *meta; - assert( field ); + g_assert( field ); /* Defined? */ @@ -516,7 +536,7 @@ im_save_string_get( const GValue *value ) void im_save_string_set( GValue *value, const char *str ) { - assert( G_VALUE_TYPE( value ) == IM_TYPE_SAVE_STRING ); + g_assert( G_VALUE_TYPE( value ) == IM_TYPE_SAVE_STRING ); g_value_set_boxed( value, str ); } @@ -535,7 +555,7 @@ im_save_string_setf( GValue *value, const char *fmt, ... ) va_list ap; char *str; - assert( G_VALUE_TYPE( value ) == IM_TYPE_SAVE_STRING ); + g_assert( G_VALUE_TYPE( value ) == IM_TYPE_SAVE_STRING ); va_start( ap, fmt ); str = g_strdup_vprintf( fmt, ap ); @@ -736,7 +756,7 @@ area_new_blob( im_callback_fn free_fn, void *blob, size_t blob_length ) static Area * area_copy( Area *area ) { - assert( area->count >= 0 ); + g_assert( area->count >= 0 ); area->count += 1; @@ -750,7 +770,7 @@ area_copy( Area *area ) static void area_unref( Area *area ) { - assert( area->count > 0 ); + g_assert( area->count > 0 ); area->count -= 1; @@ -941,7 +961,7 @@ im_ref_string_set( GValue *value, const char *str ) Area *area; char *str_copy; - assert( G_VALUE_TYPE( value ) == IM_TYPE_REF_STRING ); + g_assert( G_VALUE_TYPE( value ) == IM_TYPE_REF_STRING ); if( !(str_copy = im_strdup( NULL, str )) ) return( -1 ); @@ -1182,7 +1202,7 @@ im_blob_set( GValue *value, { Area *area; - assert( G_VALUE_TYPE( value ) == IM_TYPE_BLOB ); + g_assert( G_VALUE_TYPE( value ) == IM_TYPE_BLOB ); if( !(area = area_new_blob( free_fn, blob, blob_length )) ) return( -1 ); diff --git a/libvipsCC/VImage.cc b/libvipsCC/VImage.cc index dd235277..ca3fc314 100644 --- a/libvipsCC/VImage.cc +++ b/libvipsCC/VImage.cc @@ -325,13 +325,18 @@ void VImage::meta_set( const char *field, GValue *value ) throw( VError ) verror(); } +gboolean VImage::meta_remove( const char *field ) +{ + return( im_meta_remove( _ref->im, field ) ); +} + void VImage::meta_get( const char *field, GValue *value_copy ) throw( VError ) { if( im_meta_get( _ref->im, field, value_copy ) ) verror(); } -GType VImage::meta_get_typeof( const char *field ) throw( VError ) +GType VImage::meta_get_typeof( const char *field ) { return( im_meta_get_typeof( _ref->im, field ) ); } diff --git a/libvipsCC/include/vips/VImage.h b/libvipsCC/include/vips/VImage.h index 9e4f1017..35abbd51 100644 --- a/libvipsCC/include/vips/VImage.h +++ b/libvipsCC/include/vips/VImage.h @@ -255,9 +255,12 @@ public: // we don't wrap GValue, so we can't wrap these for now void meta_set( const char *field, GValue *value ) throw( VError ); void meta_get( const char *field, GValue *value_copy ) throw( VError ); - GType meta_get_typeof( const char *field ) throw( VError ); #endif /*SWIG*/ + // We can wrap these, fwiw + gboolean meta_remove( const char *field ); + GType meta_get_typeof( const char *field ); + // convenience functions int meta_get_int( const char *field ) throw( VError ); double meta_get_double( const char *field ) throw( VError ); diff --git a/tools/iofuncs/vipsthumbnail.c b/tools/iofuncs/vipsthumbnail.c index 94711bf3..27ec5e17 100644 --- a/tools/iofuncs/vipsthumbnail.c +++ b/tools/iofuncs/vipsthumbnail.c @@ -26,6 +26,7 @@ static int thumbnail_size = 128; static char *thumbnail_format = "tn_%s.jpg"; static char *export_profile = NULL; static char *import_profile = NULL; +static gboolean delete_profile = FALSE; static GOptionEntry options[] = { { "size", 's', 0, G_OPTION_ARG_INT, &thumbnail_size, @@ -38,6 +39,8 @@ static GOptionEntry options[] = { N_( "export with profile P" ), "P" }, { "iprofile", 'i', 0, G_OPTION_ARG_STRING, &import_profile, N_( "import untagged images with profile P" ), "P" }, + { "delete", 'd', 0, G_OPTION_ARG_NONE, &delete_profile, + N_( "delete profile from exported image" ), NULL }, { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, N_( "verbose output" ), NULL }, { NULL } @@ -253,6 +256,11 @@ shrink_factor( IMAGE *in, IMAGE *out ) x = t[6]; } + if( delete_profile ) { + if( im_meta_remove( x, IM_META_ICC_NAME ) && verbose ) + printf( "deleting profile from output image\n" ); + } + if( im_copy( x, out ) ) return( -1 );