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 );