From c0c57f3f4ab6f4dc2edd0026afcc2e96e0fcedad Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Wed, 28 Jan 2015 11:37:16 +0000 Subject: [PATCH] fix up C docs intro --- doc/reference/using-C.xml | 119 ++++++++++++++++++++++++-------------- libvips/iofuncs/init.c | 4 +- 2 files changed, 76 insertions(+), 47 deletions(-) diff --git a/doc/reference/using-C.xml b/doc/reference/using-C.xml index 5e3f3af4..dee6054c 100644 --- a/doc/reference/using-C.xml +++ b/doc/reference/using-C.xml @@ -15,7 +15,7 @@ How to use the VIPS library from C - + Introduction VIPS comes with a convenient, high-level C API. You should read the API @@ -23,9 +23,12 @@ overview. The vips program is handy for getting a summary of an operation's parameters. + + + Library startup - When your program starts, use VIPS_INIT() + When your program starts, use VIPS_INIT() to start up the VIPS library. You should pass it the name of your program, usually argv[0]. Use vips_shutdown() when you exit. @@ -33,17 +36,20 @@ You can add the VIPS flags to your %GObject command-line processing - with vips_get_option_group(), see below. + with vips_add_option_entries(), see below. + + + The #VipsImage class The basic data object is the #VipsImage. You can create an image from a file on disc or from an area of memory, either as a C-style array, or as a formatted object, like JPEG. See vips_image_new_from_file() and friends. Loading an - image is fast. VIPS read just enough of the image to be able to get - the various properties, such as width in pixels. It delays reading - any pixels until they are really needed. + image is fast: VIPS read just enough of the image to be able to get + the various properties, such as width, but no decoding occurs until + pixel values are really needed. @@ -54,9 +60,12 @@ See VIPS Header to read about image properties. + + + Reference counting - VIPS is based on the %GObject library and is therefore refcounted. + VIPS is based on the %GObject library and is therefore reference counted. vips_image_new_from_file() returns an object with a count of 1. When you are done with an image, use g_object_unref() to dispose of it. If you pass an image to an operation and that operation needs to keep a @@ -66,25 +75,45 @@ - Use things like vips_invert() to manipulate your images. See VIPS Operations for information on + See #VipsOperation for more detail on VIPS + reference counting conventions. + + + + + VIPS operations + + Use things like vips_invert() to manipulate your images. See + #VipsOperation + for information on running operations on images. When you are done, you can write the final image to a disc file, to a formatted memory buffer, or to C-style memory array. See vips_image_write_to_file() and friends. + + + Getting pixels Use #VipsRegion to read pixels out of images. You can use VIPS_IMAGE_ADDR() as well, but this can need a large amount of memory to work. See extending for an introduction to writing your own operations. + + + + Error handling VIPS keeps a log of error message, see VIPS Error to find out how to get and - set the error log. + clear the error log. + + + + Example VIPS from C example @@ -100,55 +129,55 @@ int main( int argc, char **argv ) { - GOptionContext *context; - GOptionGroup *main_group; - GError *error = NULL; - VipsImage *in; - double mean; - VipsImage *out; + GOptionContext *context; + GOptionGroup *main_group; + GError *error = NULL; + VipsImage *in; + double mean; + VipsImage *out; - if( VIPS_INIT( argv[0] ) ) - vips_error_exit( NULL ); + if( VIPS_INIT( argv[0] ) ) + vips_error_exit( NULL ); - context = g_option_context_new( "hello infile outfile - VIPS demo" ); + context = g_option_context_new( "hello infile outfile - VIPS demo" ); - main_group = g_option_group_new( NULL, NULL, NULL, NULL, NULL ); - g_option_context_set_main_group( context, main_group ); - g_option_context_add_group( context, vips_get_option_group() ); + main_group = g_option_group_new( NULL, NULL, NULL, NULL, NULL ); + g_option_context_set_main_group( context, main_group ); + vips_add_option_entries( main_group ); - if( !g_option_context_parse( context, &argc, &argv, &error ) ) { - if( error ) { - fprintf( stderr, "%s\n", error->message ); - g_error_free( error ); - } + if( !g_option_context_parse( context, &argc, &argv, &error ) ) { + if( error ) { + fprintf( stderr, "%s\n", error->message ); + g_error_free( error ); + } - vips_error_exit( NULL ); - } + vips_error_exit( NULL ); + } - if( argc != 3 ) - vips_error_exit( "usage: %s infile outfile", argv[0] ); - - if( !(in = vips_image_new_from_file( argv[1], NULL )) ) - vips_error_exit( NULL ); + if( argc != 3 ) + vips_error_exit( "usage: %s infile outfile", argv[0] ); + + if( !(in = vips_image_new_from_file( argv[1], NULL )) ) + vips_error_exit( NULL ); - printf( "image width = %d\n", vips_image_get_width( in ) ); + printf( "image width = %d\n", vips_image_get_width( in ) ); - if( vips_avg( in, &mean, NULL ) ) - vips_error_exit( NULL ); + if( vips_avg( in, &mean, NULL ) ) + vips_error_exit( NULL ); - printf( "mean pixel value = %g\n", mean ); + printf( "mean pixel value = %g\n", mean ); - if( vips_invert( in, &out, NULL ) ) - vips_error_exit( NULL ); + if( vips_invert( in, &out, NULL ) ) + vips_error_exit( NULL ); - g_object_unref( in ); + g_object_unref( in ); - if( vips_image_write_to_file( out, argv[2], NULL ) ) - vips_error_exit( NULL ); + if( vips_image_write_to_file( out, argv[2], NULL ) ) + vips_error_exit( NULL ); - g_object_unref( out ); + g_object_unref( out ); - return( 0 ); + return( 0 ); } diff --git a/libvips/iofuncs/init.c b/libvips/iofuncs/init.c index c360ea5d..8da21350 100644 --- a/libvips/iofuncs/init.c +++ b/libvips/iofuncs/init.c @@ -160,7 +160,7 @@ vips_get_argv0( void ) * } * ]| * - * See also: vips_shutdown(), vips_get_option_group(), vips_version(), + * See also: vips_shutdown(), vips_add_option_entries(), vips_version(), * vips_guess_prefix(), vips_guess_libdir(). * * Returns: 0 on success, -1 otherwise @@ -1008,7 +1008,7 @@ vips_version( int flag ) * @leak: turn leak checking on or off * * Turn on or off vips leak checking. See also --vips-leak and - * vips_get_option_group(). + * vips_add_option_entries(). * * You should call this very early in your program. */