easier array arg creation
added stdarg array double creator, used the _new as well, small other fixes
This commit is contained in:
parent
777d1ea554
commit
3216fddc92
@ -280,19 +280,10 @@ vips_linearv( VipsImage *in, VipsImage **out,
|
||||
{
|
||||
VipsArea *area_a;
|
||||
VipsArea *area_b;
|
||||
double *array;
|
||||
int result;
|
||||
int i;
|
||||
|
||||
area_a = vips_area_new_array( G_TYPE_DOUBLE, sizeof( double ), n );
|
||||
array = (double *) area_a->data;
|
||||
for( i = 0; i < n; i++ )
|
||||
array[i] = a[i];
|
||||
|
||||
area_b = vips_area_new_array( G_TYPE_DOUBLE, sizeof( double ), n );
|
||||
array = (double *) area_b->data;
|
||||
for( i = 0; i < n; i++ )
|
||||
array[i] = b[i];
|
||||
area_a = (VipsArea *) vips_array_double_new( a, n );
|
||||
area_b = (VipsArea *) vips_array_double_new( b, n );
|
||||
|
||||
result = vips_call_split( "linear", ap, in, out, area_a, area_b );
|
||||
|
||||
@ -306,8 +297,8 @@ vips_linearv( VipsImage *in, VipsImage **out,
|
||||
* vips_linear:
|
||||
* @in: image to transform
|
||||
* @out: output image
|
||||
* @a: array of constants for multiplication
|
||||
* @b: array of constants for addition
|
||||
* @a: (array length=n): array of constants for multiplication
|
||||
* @b: (array length=n): array of constants for addition
|
||||
* @n: length of constant arrays
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
|
@ -2147,14 +2147,10 @@ im_rightshift_size( IMAGE *in, IMAGE *out,
|
||||
int
|
||||
im_Lab2XYZ_temp( IMAGE *in, IMAGE *out, double X0, double Y0, double Z0 )
|
||||
{
|
||||
double ary[3];
|
||||
VipsArea *temp;
|
||||
VipsImage *x;
|
||||
|
||||
ary[0] = X0;
|
||||
ary[1] = Y0;
|
||||
ary[2] = Z0;
|
||||
temp = (VipsArea *) vips_array_double_new( ary, 3 );
|
||||
temp = (VipsArea *) vips_array_double_newv( 3, X0, Y0, Z0 );
|
||||
if( vips_Lab2XYZ( in, &x, "temp", temp, NULL ) ) {
|
||||
vips_area_unref( temp );
|
||||
return( -1 );
|
||||
|
@ -569,6 +569,10 @@ strip_allocate( VipsThreadState *state, void *a, gboolean *stop )
|
||||
|
||||
VipsRect image;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf( "strip_allocate\n" );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
image.left = 0;
|
||||
image.top = 0;
|
||||
image.width = layer->width;
|
||||
@ -589,6 +593,10 @@ strip_allocate( VipsThreadState *state, void *a, gboolean *stop )
|
||||
|
||||
if( vips_rect_isempty( &state->pos ) ) {
|
||||
*stop = TRUE;
|
||||
#ifdef DEBUG
|
||||
printf( "strip_allocate: done\n" );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
@ -703,6 +711,10 @@ strip_work( VipsThreadState *state, void *a )
|
||||
VipsImage *x;
|
||||
char buf[PATH_MAX];
|
||||
|
||||
#ifdef DEBUG
|
||||
printf( "strip_work\n" );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
if( tile_name( layer, buf,
|
||||
state->x / dz->tile_size, state->y / dz->tile_size ) )
|
||||
return( -1 );
|
||||
@ -732,12 +744,20 @@ strip_work( VipsThreadState *state, void *a )
|
||||
x = z;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
printf( "strip_work: writing to %s\n", buf );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
if( vips_image_write_to_file( x, buf ) ) {
|
||||
g_object_unref( x );
|
||||
return( -1 );
|
||||
}
|
||||
g_object_unref( x );
|
||||
|
||||
#ifdef DEBUG
|
||||
printf( "strip_work: success\n" );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
@ -339,6 +339,28 @@ int vips_object_get_argument_priority( VipsObject *object, const char *name );
|
||||
#define VIPS_ARGUMENT_FOR_ALL_END } }
|
||||
|
||||
/* And some macros to collect args from a va list.
|
||||
*
|
||||
* Use something like this:
|
||||
|
||||
GParamSpec *pspec;
|
||||
VipsArgumentClass *argument_class;
|
||||
VipsArgumentInstance *argument_instance;
|
||||
|
||||
if( vips_object_get_argument( VIPS_OBJECT( operation ), name,
|
||||
&pspec, &argument_class, &argument_instance ) )
|
||||
return( -1 );
|
||||
|
||||
VIPS_ARGUMENT_COLLECT_SET( pspec, argument_class, ap );
|
||||
|
||||
GValue value holds the value of an input argument, do
|
||||
something with it
|
||||
|
||||
VIPS_ARGUMENT_COLLECT_GET( pspec, argument_class, ap );
|
||||
|
||||
void **arg points to where to write an output argument
|
||||
|
||||
VIPS_ARGUMENT_COLLECT_END
|
||||
|
||||
*/
|
||||
#define VIPS_ARGUMENT_COLLECT_SET( PSPEC, ARG_CLASS, AP ) \
|
||||
if( (ARG_CLASS->flags & VIPS_ARGUMENT_INPUT) ) { \
|
||||
|
@ -137,6 +137,7 @@ GType vips_blob_get_type( void );
|
||||
#define VIPS_TYPE_ARRAY_DOUBLE (vips_array_double_get_type())
|
||||
typedef VipsArea VipsArrayDouble;
|
||||
VipsArrayDouble *vips_array_double_new( const double *array, int n );
|
||||
VipsArrayDouble *vips_array_double_newv( int n, ... );
|
||||
GType vips_array_double_get_type( void );
|
||||
|
||||
/**
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
#include <vips/internal.h>
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
#include <vips/internal.h>
|
||||
@ -135,7 +136,7 @@ vips_thing_get_type( void )
|
||||
* function. It also keeps a count and a GType, so the area can be an array.
|
||||
*
|
||||
* This type is used for things like passing an array of double or an array of
|
||||
* VipsObject pointers to operations, and for reference-countred immutable
|
||||
* VipsObject pointers to operations, and for reference-counted immutable
|
||||
* strings.
|
||||
*/
|
||||
|
||||
@ -939,6 +940,37 @@ vips_array_double_new( const double *array, int n )
|
||||
return( area );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_array_double_newv:
|
||||
* @n: number of doubles
|
||||
* @...: list of double arguments
|
||||
*
|
||||
* Allocate a new array of @n doubles and copy @... into it. Free with
|
||||
* vips_area_unref().
|
||||
*
|
||||
* See also: vips_array_double_new()
|
||||
*
|
||||
* Returns: (transfer full): A new #VipsArrayDouble.
|
||||
*/
|
||||
VipsArrayDouble *
|
||||
vips_array_double_newv( int n, ... )
|
||||
{
|
||||
va_list ap;
|
||||
VipsArea *area;
|
||||
double *array;
|
||||
int i;
|
||||
|
||||
area = vips_area_new_array( G_TYPE_DOUBLE, sizeof( double ), n );
|
||||
array = vips_area_get_data( area, NULL, NULL, NULL, NULL );
|
||||
|
||||
va_start( ap, n );
|
||||
for( i = 0; i < n; i++ )
|
||||
array[i] = va_arg( ap, double );
|
||||
va_end( ap );
|
||||
|
||||
return( area );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_value_get_array_double:
|
||||
* @value: %GValue to get from
|
||||
|
Loading…
Reference in New Issue
Block a user