sort out header.c

clean up meta/header mess
This commit is contained in:
John Cupitt 2011-03-27 22:03:38 +01:00
parent c95aa263dd
commit 517cd679d3
15 changed files with 1476 additions and 1716 deletions

View File

@ -23,7 +23,6 @@ pkginclude_HEADERS = \
intl.h \
mask.h \
memory.h \
meta.h \
morphology.h \
mosaicing.h \
other.h \

View File

@ -37,6 +37,39 @@
extern "C" {
#endif /*__cplusplus*/
/**
* VIPS_META_EXIF_NAME:
*
* The name that JPEG read and write operations use for the image's EXIF data.
*/
#define VIPS_META_EXIF_NAME "exif-data"
/**
* VIPS_META_ICC_NAME:
*
* The name we use to attach an ICC profile. The file read and write
* operations for TIFF, JPEG, PNG and others use this item of metadata to
* attach and save ICC profiles. The profile is updated by the
* vips_icc_transform() operations.
*/
#define VIPS_META_ICC_NAME "icc-profile-data"
/**
* VIPS_META_XML:
*
* The original XML that was used to code the metadata after reading a VIPS
* format file.
*/
#define VIPS_META_XML "xml-header"
/**
* VIPS_META_RESOLUTION_UNIT:
*
* The JPEG and TIFF read and write operations use this to record the
* file's preferred unit for resolution.
*/
#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
int vips_format_sizeof( VipsBandFormat format );
int vips_image_get_width( VipsImage *image );
@ -63,17 +96,82 @@ int vips_image_copy_fieldsv( VipsImage *out, VipsImage *in1, ... )
__attribute__((sentinel));
int vips_image_copy_fields( VipsImage *out, VipsImage *in );
int vips_image_get_int( VipsImage *im, const char *field, int *out );
int vips_image_get_double( VipsImage *im, const char *field, double *out );
int vips_image_get_string( VipsImage *im, const char *field, char **out );
int vips_image_get_as_string( VipsImage *im, const char *field, char **out );
GType vips_image_get_typeof( VipsImage *im, const char *field );
int vips_image_get( VipsImage *im, const char *field, GValue *value_copy );
int vips_image_set( VipsImage *image, const char *field, GValue *value );
int vips_image_get( VipsImage *image, const char *field, GValue *value_copy );
GType vips_image_get_typeof( VipsImage *image, const char *field );
gboolean vips_image_remove( VipsImage *image, const char *field );
typedef void *(*VipsImageMapFn)( VipsImage *image,
const char *field, GValue *value, void *a );
void *vips_image_map( VipsImage *im, VipsImageMapFn fn, void *a );
/**
* VIPS_TYPE_SAVE_STRING:
*
* The #GType for an "vips_save_string".
*/
#define VIPS_TYPE_SAVE_STRING (vips_save_string_get_type())
GType vips_save_string_get_type( void );
const char *vips_save_string_get( const GValue *value );
void vips_save_string_set( GValue *value, const char *str );
void vips_save_string_setf( GValue *value, const char *fmt, ... )
__attribute__((format(printf, 2, 3)));
/**
* VIPS_TYPE_AREA:
*
* The #GType for an #vips_area.
*/
#define VIPS_TYPE_AREA (vips_area_get_type())
GType vips_area_get_type( void );
/**
* VIPS_TYPE_REF_STRING:
*
* The #GType for an #vips_refstring.
*/
#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
GType vips_ref_string_get_type( void );
int vips_ref_string_set( GValue *value, const char *str );
const char *vips_ref_string_get( const GValue *value );
size_t vips_ref_string_get_length( const GValue *value );
/**
* VIPS_TYPE_BLOB:
*
* The #GType for an #vips_blob.
*/
/* Also used for eg. vips_local() and friends.
*/
typedef int (*VipsCallbackFn)( void *a, void *b );
#define VIPS_TYPE_BLOB (vips_blob_get_type())
GType vips_blob_get_type( void );
void *vips_blob_get( const GValue *value, size_t *length );
int vips_blob_set( GValue *value, VipsCallbackFn free_fn,
void *data, size_t length );
int vips_image_set_area( VipsImage *image,
const char *field, VipsCallbackFn free_fn, void *data );
int vips_image_get_area( VipsImage *image, const char *field, void **data );
int vips_image_set_string( VipsImage *image,
const char *field, const char *str );
int vips_image_get_string( VipsImage *image, const char *field, char **str );
int vips_image_set_blob( VipsImage *image, const char *field,
VipsCallbackFn free_fn, void *data, size_t length );
int vips_image_get_blob( VipsImage *image, const char *field,
void **data, size_t *length );
int vips_image_get_int( VipsImage *image, const char *field, int *out );
int vips_image_set_int( VipsImage *image, const char *field, int i );
int vips_image_get_double( VipsImage *image, const char *field, double *out );
int vips_image_set_double( VipsImage *image, const char *field, double d );
int vips_image_get_string( VipsImage *image, const char *field, char **out );
int vips_image_set_string( VipsImage *image,
const char *field, const char *str );
int vips_image_get_as_string( VipsImage *image, const char *field, char **out );
GType vips_image_get_typeof( VipsImage *image, const char *field );
int vips_image_history_printf( VipsImage *image, const char *format, ... )
__attribute__((format(printf, 2, 3)));
int vips_image_history_args( VipsImage *image,

View File

@ -211,8 +211,8 @@ typedef struct _VipsImage {
/* Extra user-defined fields ... see im_meta_get_int() etc.
*/
GHashTable *Meta; /* GhashTable of GValue */
GSList *Meta_traverse; /* traverse order for Meta */
GHashTable *meta; /* GhashTable of GValue */
GSList *meta_traverse; /* traverse order for Meta */
/* Part of mmap() read ... the sizeof() the header we skip from the
* file start. Usually VIPS_SIZEOF_HEADER, but can be something else

View File

@ -44,16 +44,16 @@ extern "C" {
* We don't refcount at this level ... large meta values are refcounted by
* their GValue implementation, see eg. MetaArea.
*/
typedef struct _Meta {
typedef struct _VipsMeta {
VipsImage *im;
char *field; /* strdup() of field name */
GValue value; /* copy of value */
} Meta;
} VipsMeta;
void im__meta_init_types( void );
void im__meta_destroy( VipsImage *im );
int im__meta_cp( VipsImage *, const VipsImage * );
void vips__meta_init_types( void );
void vips__meta_destroy( VipsImage *im );
int vips__meta_cp( VipsImage *, const VipsImage * );
/* Default tile geometry.
*/

View File

@ -1,140 +0,0 @@
/* Metadata API.
*/
/*
Copyright (C) 1991-2005 The National Gallery
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
*/
#ifndef IM_META_H
#define IM_META_H
#ifdef __cplusplus
extern "C" {
#endif /*__cplusplus*/
/**
* IM_META_EXIF_NAME:
*
* The name that JPEG read and write operations use for the image's EXIF data.
*/
#define IM_META_EXIF_NAME "exif-data"
/**
* IM_META_ICC_NAME:
*
* The name we use to attach an ICC profile. The file read and write
* operations for TIFF, JPEG, PNG and others use this item of metadata to
* attach and save ICC profiles. The profile is updated by the
* im_icc_transform() operations.
*/
#define IM_META_ICC_NAME "icc-profile-data"
/**
* IM_META_XML:
*
* The original XML that was used to code the metadata after reading a VIPS
* format file.
*/
#define IM_META_XML "xml-header"
/**
* IM_META_RESOLUTION_UNIT:
*
* The JPEG and TIFF read and write operations use this to record the
* file's preferred unit for resolution.
*/
#define IM_META_RESOLUTION_UNIT "resolution-unit"
/**
* IM_TYPE_SAVE_STRING:
*
* The #GType for an "im_save_string".
*/
#define IM_TYPE_SAVE_STRING (im_save_string_get_type())
GType im_save_string_get_type( void );
const char *im_save_string_get( const GValue *value );
void im_save_string_set( GValue *value, const char *str );
void im_save_string_setf( GValue *value, const char *fmt, ... )
__attribute__((format(printf, 2, 3)));
/**
* IM_TYPE_AREA:
*
* The #GType for an #im_area.
*/
#define IM_TYPE_AREA (im_area_get_type())
GType im_area_get_type( void );
/**
* IM_TYPE_REF_STRING:
*
* The #GType for an #im_refstring.
*/
#define IM_TYPE_REF_STRING (im_ref_string_get_type())
GType im_ref_string_get_type( void );
int im_ref_string_set( GValue *value, const char *str );
const char *im_ref_string_get( const GValue *value );
size_t im_ref_string_get_length( const GValue *value );
/**
* IM_TYPE_BLOB:
*
* The #GType for an #im_blob.
*/
/* Also used for eg. im_local() and friends.
*/
typedef int (*im_callback_fn)( void *a, void *b );
#define IM_TYPE_BLOB (im_blob_get_type())
GType im_blob_get_type( void );
void *im_blob_get( const GValue *value, size_t *length );
int im_blob_set( GValue *value, im_callback_fn free_fn,
void *data, size_t length );
int im_meta_set( VipsImage *im, const char *field, GValue *value );
gboolean im_meta_remove( VipsImage *im, const char *field );
int im_meta_get( VipsImage *im, const char *field, GValue *value_copy );
GType im_meta_get_typeof( VipsImage *im, const char *field );
int im_meta_set_int( VipsImage *im, const char *field, int i );
int im_meta_get_int( VipsImage *im, const char *field, int *i );
int im_meta_set_double( VipsImage *im, const char *field, double d );
int im_meta_get_double( VipsImage *im, const char *field, double *d );
int im_meta_set_area( VipsImage *im,
const char *field, im_callback_fn free_fn, void *data );
int im_meta_get_area( VipsImage *im, const char *field, void **data );
int im_meta_set_string( VipsImage *im, const char *field, const char *str );
int im_meta_get_string( VipsImage *im, const char *field, char **str );
int im_meta_set_blob( VipsImage *im, const char *field,
im_callback_fn free_fn, void *data, size_t length );
int im_meta_get_blob( VipsImage *im, const char *field,
void **data, size_t *length );
#ifdef __cplusplus
}
#endif /*__cplusplus*/
#endif /*!IM_META_H*/

View File

@ -114,7 +114,6 @@ extern "C" {
#include <vips/semaphore.h>
#include <vips/threadpool.h>
#include <vips/meta.h>
#include <vips/header.h>
#include <vips/enumtypes.h>

View File

@ -203,9 +203,7 @@ VipsImage *im_open_local( VipsImage *parent,
int im_open_local_array( VipsImage *parent,
VipsImage **images, int n, const char *filename, const char *mode );
/* uncomment this when we remove the im_callback_fn from meta.h
typedef int (*im_callback_fn)( void *a, void *b );
*/
#define im_callback_fn VipsCallbackFn
int im_add_callback( VipsImage *im,
const char *callback, im_callback_fn fn, void *a, void *b );
@ -267,20 +265,6 @@ VipsDemandStyle im_char2dhint( const char *str );
#define im_rect_dup vips_rect_dup
#define im_rect_normalise vips_rect_normalise
#define im_header_map_fn VipsImageMapFn
#define im_header_map vips_image_map
#define im_header_int vips_image_get_int
#define im_header_double vips_image_get_double
#define im_header_string vips_image_get_string
#define im_header_as_string vips_image_get_as_string
#define im_header_get_typeof vips_image_get_typeof
#define im_header_get vips_image_get
#define im_histlin vips_image_history_printf
#define im_updatehist vips_image_history_args
#define im_history_get vips_image_get_history
#define im_demand_hint vips_demand_hint
#define im_demand_hint_array vips_demand_hint_array
@ -369,6 +353,56 @@ typedef void (*im_wrapmany_fn)( void **in, void *out, int width,
int im_wrapmany( VipsImage **in, VipsImage *out,
im_wrapmany_fn fn, void *a, void *b );
#define IM_META_EXIF_NAME VIPS_META_EXIF_NAME
#define IM_META_ICC_NAME VIPS_META_ICC_NAME
#define IM_META_XML VIPS_META_XML
#define IM_META_RESOLUTION_UNIT VIPS_META_RESOLUTION_UNIT
#define IM_TYPE_SAVE_STRING VIPS_TYPE_SAVE_STRING
#define IM_TYPE_BLOB VIPS_TYPE_BLOB
#define IM_TYPE_AREA VIPS_TYPE_AREA
#define IM_TYPE_REF_STRING VIPS_TYPE_REF_STRING
#define im_header_map_fn VipsImageMapFn
#define im_header_map vips_image_map
#define im_header_int vips_image_get_int
#define im_header_double vips_image_get_double
#define im_header_string vips_image_get_string
#define im_header_as_string vips_image_get_as_string
#define im_header_get_typeof vips_image_get_typeof
#define im_header_get vips_image_get
#define im_histlin vips_image_history_printf
#define im_updatehist vips_image_history_args
#define im_history_get vips_image_get_history
#define im_save_string_get vips_save_string_get
#define im_save_string_set vips_save_string_set
#define im_save_string_setf vips_save_string_setf
#define im_ref_string_set vips_ref_string_set
#define im_ref_string_get vips_ref_string_get
#define im_ref_string_get_length vips_ref_string_get_length
#define im_blob_get vips_blob_get
#define im_blob_set vips_blob_set
#define im_meta_set vips_image_set
#define im_meta_remove vips_image_remove
#define im_meta_get vips_image_get
#define im_meta_get_typeof vips_image_get_typeof
#define im_meta_set_int vips_image_set_int
#define im_meta_get_int vips_image_get_int
#define im_meta_set_double vips_image_set_double
#define im_meta_get_double vips_image_get_double
#define im_meta_set_area vips_image_set_area
#define im_meta_get_area vips_image_get_area
#define im_meta_set_string vips_image_set_string
#define im_meta_get_string vips_image_get_string
#define im_meta_set_blob vips_image_set_blob
#define im_meta_get_blob vips_image_get_blob
#ifdef __cplusplus
}
#endif /*__cplusplus*/

View File

@ -3,7 +3,6 @@ noinst_LTLIBRARIES = libiofuncs.la
libiofuncs_la_SOURCES = \
enumtypes.c \
object.c \
meta.c \
base64.h \
base64.c \
dispatch_types.c \

View File

@ -42,6 +42,10 @@
*/
/*
#define VIPS_DEBUG
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
@ -56,6 +60,7 @@
#include <vips/internal.h>
#include <vips/buf.h>
#include <vips/thread.h>
#include <vips/debug.h>
#ifdef OS_WIN32
#include <windows.h>
@ -152,6 +157,8 @@ vips_verror( const char *domain, const char *fmt, va_list ap )
vips_buf_vappendf( &vips_error_buf, fmt, ap );
vips_buf_appends( &vips_error_buf, "\n" );
g_mutex_unlock( vips__global_lock );
VIPS_DEBUG_MSG( "vips_verror: %s\n", fmt );
}
/**

File diff suppressed because it is too large Load Diff

View File

@ -416,7 +416,7 @@ vips_image_finalize( GObject *gobject )
VIPS_FREE( image->Hist );
VIPS_FREEF( im__gslist_gvalue_free, image->history_list );
im__meta_destroy( image );
vips__meta_destroy( image );
G_OBJECT_CLASS( vips_image_parent_class )->finalize( gobject );
}
@ -442,13 +442,13 @@ print_field_fn( VipsImage *image, const char *field, GValue *value, void *a )
/* Look for known enums and decode them.
*/
extra = NULL;
if( strcmp( field, "Coding" ) == 0 )
if( strcmp( field, "coding" ) == 0 )
extra = VIPS_ENUM_NICK(
VIPS_TYPE_CODING, g_value_get_int( value ) );
else if( strcmp( field, "BandFmt" ) == 0 )
else if( strcmp( field, "format" ) == 0 )
extra = VIPS_ENUM_NICK(
VIPS_TYPE_BAND_FORMAT, g_value_get_int( value ) );
else if( strcmp( field, "Type" ) == 0 )
else if( strcmp( field, "interpretation" ) == 0 )
extra = VIPS_ENUM_NICK(
VIPS_TYPE_INTERPRETATION, g_value_get_int( value ) );
@ -486,7 +486,7 @@ vips_image_print( VipsObject *object, VipsBuf *buf )
(void) vips_image_map( image, print_field_fn, (void *) buf );
vips_buf_appendf( buf, "Hist: %s", im_history_get( image ) );
vips_buf_appendf( buf, "Hist: %s", vips_image_get_history( image ) );
}
static void *

View File

@ -213,9 +213,9 @@ vips_init( const char *argv0 )
/* Register base vips types.
*/
im__meta_init_types();
im__format_init();
vips__meta_init_types();
vips__interpolate_init();
im__format_init();
/* Load up any plugins in the vips libdir. We don't error on failure,
* it's too annoying to have VIPS refuse to start because of a broken

File diff suppressed because it is too large Load Diff

View File

@ -53,8 +53,6 @@
#include <windows.h>
#endif /*OS_WIN32*/
#include <assert.h>
#include <vips/vips.h>
#include <vips/internal.h>
@ -250,7 +248,7 @@ im_strncpy( char *dest, const char *src, int n )
{
int i;
assert( n > 0 );
g_assert( n > 0 );
for( i = 0; i < n - 1; i++ )
if( !(dest[i] = src[i]) )
@ -849,8 +847,8 @@ im__gvalue_ref_string_new( const char *text )
{
GValue *value;
value = im__gvalue_new( IM_TYPE_REF_STRING );
im_ref_string_set( value, text );
value = im__gvalue_new( VIPS_TYPE_REF_STRING );
vips_ref_string_set( value, text );
return( value );
}
@ -898,18 +896,19 @@ im__gslist_gvalue_merge( GSList *a, const GSList *b )
for( i = b; i; i = i->next ) {
GValue *value = (GValue *) i->data;
assert( G_VALUE_TYPE( value ) == IM_TYPE_REF_STRING );
g_assert( G_VALUE_TYPE( value ) == VIPS_TYPE_REF_STRING );
for( j = a; j; j = j->next ) {
GValue *value2 = (GValue *) j->data;
assert( G_VALUE_TYPE( value2 ) == IM_TYPE_REF_STRING );
g_assert( G_VALUE_TYPE( value2 ) ==
VIPS_TYPE_REF_STRING );
/* Just do a pointer compare ... good enough 99.9% of
* the time.
*/
if( im_ref_string_get( value ) ==
im_ref_string_get( value2 ) )
if( vips_ref_string_get( value ) ==
vips_ref_string_get( value2 ) )
break;
}
@ -940,11 +939,11 @@ im__gslist_gvalue_get( const GSList *list )
for( p = list; p; p = p->next ) {
GValue *value = (GValue *) p->data;
assert( G_VALUE_TYPE( value ) == IM_TYPE_REF_STRING );
g_assert( G_VALUE_TYPE( value ) == VIPS_TYPE_REF_STRING );
/* +1 for the newline we will add for each item.
*/
length += im_ref_string_get_length( value ) + 1;
length += vips_ref_string_get_length( value ) + 1;
}
if( length == 0 )
@ -952,7 +951,7 @@ im__gslist_gvalue_get( const GSList *list )
/* More than 10MB of history? Madness!
*/
assert( length < 10 * 1024 * 1024 );
g_assert( length < 10 * 1024 * 1024 );
/* +1 for '\0'.
*/
@ -963,8 +962,8 @@ im__gslist_gvalue_get( const GSList *list )
for( p = list; p; p = p->next ) {
GValue *value = (GValue *) p->data;
strcpy( q, im_ref_string_get( value ) );
q += im_ref_string_get_length( value );
strcpy( q, vips_ref_string_get( value ) );
q += vips_ref_string_get_length( value );
strcpy( q, "\n" );
q += 1;
}

View File

@ -513,18 +513,18 @@ rebuild_header_meta( IMAGE *im, xmlNode *i )
get_sprop( i, "type", type, 256 ) ) {
GType gtype = g_type_from_name( type );
/* Can we convert from IM_SAVE_STRING to type?
/* Can we convert from VIPS_SAVE_STRING to type?
*/
if( gtype &&
g_value_type_transformable(
IM_TYPE_SAVE_STRING, gtype ) ) {
VIPS_TYPE_SAVE_STRING, gtype ) ) {
char *content;
GValue save_value = { 0 };
GValue value = { 0 };
content = (char *) xmlNodeGetContent( i );
g_value_init( &save_value, IM_TYPE_SAVE_STRING );
im_save_string_set( &save_value, content );
g_value_init( &save_value, VIPS_TYPE_SAVE_STRING );
vips_save_string_set( &save_value, content );
xmlFree( content );
g_value_init( &value, gtype );
@ -535,7 +535,7 @@ rebuild_header_meta( IMAGE *im, xmlNode *i )
"save format" ) );
return( -1 );
}
if( im_meta_set( im, name, &value ) ) {
if( vips_image_set( im, name, &value ) ) {
g_value_unset( &save_value );
g_value_unset( &value );
return( -1 );
@ -551,10 +551,10 @@ rebuild_header_meta( IMAGE *im, xmlNode *i )
static xmlDoc *
get_xml( IMAGE *im )
{
if( vips_image_get_typeof( im, IM_META_XML ) ) {
if( vips_image_get_typeof( im, VIPS_META_XML ) ) {
xmlDoc *doc;
if( im_meta_get_area( im, IM_META_XML, (void *) &doc ) )
if( vips_image_get_area( im, VIPS_META_XML, (void *) &doc ) )
return( NULL );
return( doc );
@ -605,15 +605,15 @@ im__readhist( IMAGE *im )
{
/* Junk any old xml meta.
*/
if( vips_image_get_typeof( im, IM_META_XML ) )
im_meta_set_area( im, IM_META_XML, NULL, NULL );
if( vips_image_get_typeof( im, VIPS_META_XML ) )
vips_image_set_area( im, VIPS_META_XML, NULL, NULL );
if( im__has_extension_block( im ) ) {
xmlDoc *doc;
if( !(doc = read_xml( im )) )
return( -1 );
if( im_meta_set_area( im, IM_META_XML,
if( vips_image_set_area( im, VIPS_META_XML,
(im_callback_fn) xmlFreeDoc, doc ) ) {
xmlFreeDoc( doc );
return( -1 );
@ -673,25 +673,25 @@ set_field( xmlNode *node,
}
static void *
save_fields_meta( Meta *meta, xmlNode *node )
save_fields_meta( VipsMeta *meta, xmlNode *node )
{
GType type = G_VALUE_TYPE( &meta->value );
/* If we can transform to IM_TYPE_SAVE_STRING and back, we can save and
* restore.
/* If we can transform to VIPS_TYPE_SAVE_STRING and back, we can save
* and restore.
*/
if( g_value_type_transformable( type, IM_TYPE_SAVE_STRING ) &&
g_value_type_transformable( IM_TYPE_SAVE_STRING, type ) ) {
if( g_value_type_transformable( type, VIPS_TYPE_SAVE_STRING ) &&
g_value_type_transformable( VIPS_TYPE_SAVE_STRING, type ) ) {
GValue save_value = { 0 };
g_value_init( &save_value, IM_TYPE_SAVE_STRING );
g_value_init( &save_value, VIPS_TYPE_SAVE_STRING );
if( !g_value_transform( &meta->value, &save_value ) ) {
vips_error( "VipsImage", "%s",
_( "error transforming to save format" ) );
return( node );
}
if( set_field( node, meta->field, g_type_name( type ),
im_save_string_get( &save_value ) ) ) {
vips_save_string_get( &save_value ) ) ) {
g_value_unset( &save_value );
return( node );
}
@ -711,13 +711,14 @@ save_fields( IMAGE *im, xmlNode *node )
if( !(this = xmlNewChild( node, NULL, (xmlChar *) "header", NULL )) )
return( -1 );
if( set_field( this, "Hist",
g_type_name( IM_TYPE_REF_STRING ), im_history_get( im ) ) )
g_type_name( VIPS_TYPE_REF_STRING ),
vips_image_get_history( im ) ) )
return( -1 );
if( !(this = xmlNewChild( node, NULL, (xmlChar *) "meta", NULL )) )
return( -1 );
if( im->Meta_traverse &&
im_slist_map2( im->Meta_traverse,
if( im->meta_traverse &&
im_slist_map2( im->meta_traverse,
(VSListMap2Fn) save_fields_meta, this, NULL ) )
return( -1 );
@ -761,7 +762,7 @@ rpt( char ch, int n )
int i;
static char buf[200];
n = IM_MIN( 190, n );
n = VIPS_MIN( 190, n );
for( i = 0; i < n; i++ )
buf[i] = ch;