From 11352c8f1b774c106405ef80596f18fa0a461881 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Sun, 30 Nov 2008 13:01:48 +0000 Subject: [PATCH] added class print --- ChangeLog | 3 +-- TODO | 11 +++++++++- include/vips/object.h | 7 +++++- libsrc/format/format.c | 36 +++++++++++++++++++++++++++++-- libsrc/iofuncs/object.c | 33 +++++++++++++++++++++++------ src/iofuncs/vips.c | 47 +++++------------------------------------ 6 files changed, 83 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7037565b..604eb7fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18,7 +18,7 @@ - IM_FORMAT_FLAG_PARTIAL -> VIPS_FORMAT_PARTIAL - updated docs - interpolators use type introspection -- added vips --list interpolators +- added vips --list classes, does formats too 11/9/08 started 7.16.3 - oop typo in manpage for im_project() @@ -52,7 +52,6 @@ - revised po/ - released as 7.16.0! ->>>>>>> .merge-right.r488 25/5/08 fork for loadable image format branch - image load/save in non-vips format code moved to own dir - simple format searching added diff --git a/TODO b/TODO index a2b2d4e0..dbdfb062 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,13 @@ -- nip2 Interpolate needs updating to new affinei thing +- add params + + use property system + + use construtors, see docs for g_object_new(), rather than vips8 build funcs + + nickname, description etc need to be properties so nip2 can read them + + add a g_get_children( "classname" ) -> ["child1-name", ..] to nip2, see old + vips8.c cooe? diff --git a/include/vips/object.h b/include/vips/object.h index e21de826..097c7317 100644 --- a/include/vips/object.h +++ b/include/vips/object.h @@ -62,6 +62,10 @@ typedef struct _VipsObjectClass { */ void (*changed)( VipsObject * ); + /* Try to print something about the class, handy for help displays. + */ + void (*print_class)( struct _VipsObjectClass *, im_buf_t * ); + /* Try to print something about the object, handy for debugging. */ void (*print)( VipsObject *, im_buf_t * ); @@ -76,7 +80,8 @@ typedef struct _VipsObjectClass { const char *description; } VipsObjectClass; -void *vips_object_changed( VipsObject *vips_object ); +void *vips_object_changed( VipsObject *object ); +void vips_object_print_class( VipsObjectClass *klass ); void vips_object_print( VipsObject *object ); GType vips_object_get_type( void ); diff --git a/libsrc/format/format.c b/libsrc/format/format.c index 6b849d57..5941ec3a 100644 --- a/libsrc/format/format.c +++ b/libsrc/format/format.c @@ -81,9 +81,43 @@ vips_format_map( VSListMap2Fn fn, void *a, void *b ) /* Abstract base class for image formats. */ +G_DEFINE_ABSTRACT_TYPE( VipsFormat, vips_format, VIPS_TYPE_OBJECT ); + +static void +vips_format_print_class( VipsObjectClass *object_class, im_buf_t *buf ) +{ + VipsFormatClass *class = VIPS_FORMAT_CLASS( object_class ); + const char **p; + + VIPS_OBJECT_CLASS( vips_format_parent_class )-> + print_class( object_class, buf ); + + im_buf_appends( buf, ", (" ); + for( p = class->suffs; *p; p++ ) { + im_buf_appendf( buf, "%s", *p ); + if( p[1] ) + im_buf_appends( buf, ", " ); + } + im_buf_appends( buf, ") " ); + + if( class->is_a ) + im_buf_appends( buf, "is_a " ); + if( class->header ) + im_buf_appends( buf, "header " ); + if( class->load ) + im_buf_appends( buf, "load " ); + if( class->save ) + im_buf_appends( buf, "save " ); + if( class->get_flags ) + im_buf_appends( buf, "get_flags " ); +} + static void vips_format_class_init( VipsFormatClass *class ) { + VipsObjectClass *object_class = (VipsObjectClass *) class; + + object_class->print_class = vips_format_print_class; } static void @@ -91,8 +125,6 @@ vips_format_init( VipsFormat *object ) { } -G_DEFINE_ABSTRACT_TYPE( VipsFormat, vips_format, VIPS_TYPE_OBJECT ); - /* VIPS format class. */ diff --git a/libsrc/iofuncs/object.c b/libsrc/iofuncs/object.c index 383157a1..590e13a0 100644 --- a/libsrc/iofuncs/object.c +++ b/libsrc/iofuncs/object.c @@ -77,15 +77,27 @@ vips_object_changed( VipsObject *object ) } void -vips_object_print( VipsObject *object ) +vips_object_print_class( VipsObjectClass *class ) { - VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS( object ); im_buf_t buf; char str[1000]; im_buf_init_static( &buf, str, 1000 ); - object_class->print( object, &buf ); - printf( "%s (%p)\n", im_buf_all( &buf ), object ); + class->print_class( class, &buf ); + printf( "%s\n", im_buf_all( &buf ) ); +} + +void +vips_object_print( VipsObject *object ) +{ + VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object ); + im_buf_t buf; + char str[1000]; + + vips_object_print_class( class ); + im_buf_init_static( &buf, str, 1000 ); + class->print( object, &buf ); + printf( "\n%s (%p)\n", im_buf_all( &buf ), object ); } static void @@ -127,13 +139,21 @@ vips_object_real_changed( VipsObject *object ) #endif /*DEBUG*/ } +static void +vips_object_real_print_class( VipsObjectClass *class, im_buf_t *buf ) +{ + im_buf_appendf( buf, "%s", G_OBJECT_CLASS_NAME( class ) ); + if( class->nickname ) + im_buf_appendf( buf, " (%s)", class->nickname ); + if( class->description ) + im_buf_appendf( buf, ", %s", class->description ); +} + static void vips_object_real_print( VipsObject *object, im_buf_t *buf ) { - im_buf_appendf( buf, "%s(", G_OBJECT_TYPE_NAME( object ) ); if( object->name ) im_buf_appendf( buf, "\"%s\"", object->name ); - im_buf_appendf( buf, ")" ); } static void @@ -145,6 +165,7 @@ vips_object_class_init( VipsObjectClass *class ) gobject_class->finalize = vips_object_finalize; class->changed = vips_object_real_changed; + class->print_class = vips_object_real_print_class; class->print = vips_object_real_print; class->nickname = "object"; class->description = _( "VIPS base class" ); diff --git a/src/iofuncs/vips.c b/src/iofuncs/vips.c index e3c68c9e..27a4ebd4 100644 --- a/src/iofuncs/vips.c +++ b/src/iofuncs/vips.c @@ -166,42 +166,9 @@ list_function( im_function *func ) } static void * -list_format( VipsFormatClass *class ) +list_class( VipsObjectClass *class ) { - const char **p; - - printf( "%-20s - ", - VIPS_OBJECT_CLASS( class )->description ); - - printf( "(" ); - for( p = class->suffs; *p; p++ ) { - printf( "%s", *p ); - if( p[1] ) - printf( ", " ); - } - printf( ") " ); - - if( class->is_a ) - printf( "is_a " ); - if( class->header ) - printf( "header " ); - if( class->load ) - printf( "load " ); - if( class->save ) - printf( "save " ); - if( class->get_flags ) - printf( "get_flags " ); - printf( "\n" ); - - return( NULL ); -} - -static void * -list_interpolate( VipsInterpolateClass *class ) -{ - printf( "%-20s - %s\n", - VIPS_OBJECT_CLASS( class )->nickname, - VIPS_OBJECT_CLASS( class )->description ); + vips_object_print_class( class ); return( NULL ); } @@ -211,13 +178,9 @@ print_list( const char *name ) { if( strcmp( name, "packages" ) == 0 ) im_map_packages( (VSListMap2Fn) list_package, NULL ); - else if( strcmp( name, "formats" ) == 0 ) - vips_format_map( (VSListMap2Fn) list_format, NULL, NULL ); - else if( strcmp( name, "interpolators" ) == 0 ) { - vips_class_map_concrete_all( - g_type_from_name( "VipsInterpolate" ), - (VipsClassMap) list_interpolate, NULL ); - } + else if( strcmp( name, "classes" ) == 0 ) + vips_class_map_concrete_all( g_type_from_name( "VipsObject" ), + (VipsClassMap) list_class, NULL ); else { if( map_name( name, list_function ) ) error_exit( "unknown package \"%s\"", name );