added im_meta_remove
This commit is contained in:
parent
51130d2368
commit
e0d4e0c158
@ -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
|
||||
|
9
TODO
9
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
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -71,8 +71,6 @@
|
||||
#include <unistd.h>
|
||||
#endif /*HAVE_UNISTD_H*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
#include <vips/internal.h>
|
||||
|
||||
@ -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 );
|
||||
|
@ -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 ) );
|
||||
}
|
||||
|
@ -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 );
|
||||
|
@ -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 );
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user