diff --git a/libvips/foreign/dzsave.c b/libvips/foreign/dzsave.c index a10fb8b8..db817130 100644 --- a/libvips/foreign/dzsave.c +++ b/libvips/foreign/dzsave.c @@ -706,19 +706,49 @@ write_blank( VipsForeignSaveDz *dz ) return( 0 ); } +static void +print_escape( GsfOutput *out, const char *str ) +{ + const char *p; + + for( p = str; *p; p++ ) + switch( *p ) { + case '<': + gsf_output_printf( out, "<" ); + break; + case '>': + gsf_output_printf( out, ">" ); + break; + default: + gsf_output_printf( out, "%c", *p ); + break; + } +} + static void * write_vips_property( VipsImage *image, const char *field, GValue *value, void *a ) { GsfOutput *out = (GsfOutput *) a; - char *str_value; + GType type = G_VALUE_TYPE( value ); - str_value = g_strdup_value_contents( value ); - gsf_output_printf( out, " \n" ); - gsf_output_printf( out, " %s\n", field ); - gsf_output_printf( out, " %s\n", str_value ); - gsf_output_printf( out, " \n" ); - g_free( str_value ); + if( g_value_type_transformable( type, VIPS_TYPE_SAVE_STRING ) ) { + GValue save_value = { 0 }; + + g_value_init( &save_value, VIPS_TYPE_SAVE_STRING ); + g_value_transform( value, &save_value ); + + gsf_output_printf( out, " \n" ); + gsf_output_printf( out, " " ); + print_escape( out, field ); + gsf_output_printf( out, "\n" ); + gsf_output_printf( out, " ", + g_type_name( type ) ); + print_escape( out, vips_value_get_save_string( &save_value ) ); + gsf_output_printf( out, "\n" ); + gsf_output_printf( out, " \n" ); + g_value_unset( &save_value ); + } return( NULL ); } @@ -742,11 +772,10 @@ write_vips_properties( VipsForeignSaveDz *dz ) gsf_output_printf( out, "\n" ); gsf_output_printf( out, "\n" ); gsf_output_printf( out, " \n" ); (void) vips_image_map( save->ready, write_vips_property, out );