bandjoin done and dusted
This commit is contained in:
parent
c1f1957e88
commit
2da5560992
@ -3,7 +3,7 @@
|
|||||||
- im_subtract(), im_avg(), im_min(), im_minpos(), im_copy(), im_embed(),
|
- im_subtract(), im_avg(), im_min(), im_minpos(), im_copy(), im_embed(),
|
||||||
im_flophor(), im_flipver(), im_insert(), im_insert_noexpand(), im_lrjoin(),
|
im_flophor(), im_flipver(), im_insert(), im_insert_noexpand(), im_lrjoin(),
|
||||||
im_tbjoin(), im_extract_area(), im_extract_bands(), im_extract_areabands(),
|
im_tbjoin(), im_extract_area(), im_extract_bands(), im_extract_areabands(),
|
||||||
im_replicate(), im_clip2fmt()
|
im_replicate(), im_clip2fmt(), im_gbandjoin(), im_bandjoin()
|
||||||
redone as classes
|
redone as classes
|
||||||
- added argument priorites to help control arg ordering
|
- added argument priorites to help control arg ordering
|
||||||
- generate has a 'stop' param to signal successful early termination
|
- generate has a 'stop' param to signal successful early termination
|
||||||
|
8
TODO
8
TODO
@ -1,11 +1,3 @@
|
|||||||
- started factoring VipsArea out into area.[hc]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- bandjoin needs testing
|
|
||||||
|
|
||||||
see vips_bandjoin() .. ugly!
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- does transform_array_g_string() work? it seems to use
|
- does transform_array_g_string() work? it seems to use
|
||||||
|
@ -20,7 +20,6 @@ libconversion_la_SOURCES = \
|
|||||||
im_c2real.c \
|
im_c2real.c \
|
||||||
im_copy_file.c \
|
im_copy_file.c \
|
||||||
im_falsecolour.c \
|
im_falsecolour.c \
|
||||||
im_gbandjoin.c \
|
|
||||||
im_mask2vips.c \
|
im_mask2vips.c \
|
||||||
im_msb.c \
|
im_msb.c \
|
||||||
im_grid.c \
|
im_grid.c \
|
||||||
|
@ -257,9 +257,9 @@ vips_bandjoin_build( VipsObject *object )
|
|||||||
{
|
{
|
||||||
VipsConversion *conversion = VIPS_CONVERSION( object );
|
VipsConversion *conversion = VIPS_CONVERSION( object );
|
||||||
VipsBandjoin *bandjoin = (VipsBandjoin *) object;
|
VipsBandjoin *bandjoin = (VipsBandjoin *) object;
|
||||||
int n = bandjoin->in->n;
|
|
||||||
|
|
||||||
VipsImage **in;
|
VipsImage **in;
|
||||||
|
int n;
|
||||||
int i;
|
int i;
|
||||||
VipsImage **format;
|
VipsImage **format;
|
||||||
VipsImage **size;
|
VipsImage **size;
|
||||||
@ -268,6 +268,7 @@ vips_bandjoin_build( VipsObject *object )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
in = bandjoin->in->data;
|
in = bandjoin->in->data;
|
||||||
|
n = bandjoin->in->n;
|
||||||
if( n == 1 )
|
if( n == 1 )
|
||||||
return( vips_image_write( in[0], conversion->out ) );
|
return( vips_image_write( in[0], conversion->out ) );
|
||||||
|
|
||||||
@ -286,9 +287,19 @@ vips_bandjoin_build( VipsObject *object )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
in = size;
|
in = size;
|
||||||
|
|
||||||
|
bandjoin->is = VIPS_ARRAY( object, n, int );
|
||||||
for( i = 0; i < n; i++ )
|
for( i = 0; i < n; i++ )
|
||||||
bandjoin->is[i] = VIPS_IMAGE_SIZEOF_PEL( in[i] );
|
bandjoin->is[i] = VIPS_IMAGE_SIZEOF_PEL( in[i] );
|
||||||
|
|
||||||
|
if( vips_image_copy_fields_array( conversion->out, in ) )
|
||||||
|
return( -1 );
|
||||||
|
vips_demand_hint_array( conversion->out,
|
||||||
|
VIPS_DEMAND_STYLE_THINSTRIP, in );
|
||||||
|
|
||||||
|
conversion->out->Bands = 0;
|
||||||
|
for( i = 0; i < n; i++ )
|
||||||
|
conversion->out->Bands += in[i]->Bands;
|
||||||
|
|
||||||
if( vips_image_generate( conversion->out,
|
if( vips_image_generate( conversion->out,
|
||||||
vips_start_many, vips_bandjoin_gen, vips_stop_many,
|
vips_start_many, vips_bandjoin_gen, vips_stop_many,
|
||||||
in, bandjoin ) )
|
in, bandjoin ) )
|
||||||
@ -352,3 +363,27 @@ vips_bandjoin( VipsImage **in, VipsImage **out, int n, ... )
|
|||||||
|
|
||||||
return( result );
|
return( result );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vips_bandjoin2( VipsImage *in1, VipsImage *in2, VipsImage **out, ... )
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
VipsArea *area;
|
||||||
|
VipsImage **array;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
area = vips_area_new_array_object( 2 );
|
||||||
|
array = (VipsImage **) area->data;
|
||||||
|
array[0] = in1;
|
||||||
|
array[1] = in2;
|
||||||
|
g_object_ref( array[0] );
|
||||||
|
g_object_ref( array[1] );
|
||||||
|
|
||||||
|
va_start( ap, out );
|
||||||
|
result = vips_call_split( "bandjoin", ap, area, out );
|
||||||
|
va_end( ap );
|
||||||
|
|
||||||
|
vips_area_unref( area );
|
||||||
|
|
||||||
|
return( result );
|
||||||
|
}
|
||||||
|
@ -451,13 +451,12 @@ vips_embed_build( VipsObject *object )
|
|||||||
case VIPS_EXTEND_COPY:
|
case VIPS_EXTEND_COPY:
|
||||||
if( vips_image_copy_fields( conversion->out, embed->in ) )
|
if( vips_image_copy_fields( conversion->out, embed->in ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
vips_demand_hint( conversion->out,
|
||||||
|
VIPS_DEMAND_STYLE_SMALLTILE, embed->in, NULL );
|
||||||
|
|
||||||
conversion->out->Xsize = embed->width;
|
conversion->out->Xsize = embed->width;
|
||||||
conversion->out->Ysize = embed->height;
|
conversion->out->Ysize = embed->height;
|
||||||
|
|
||||||
vips_demand_hint( conversion->out,
|
|
||||||
VIPS_DEMAND_STYLE_SMALLTILE, embed->in, NULL );
|
|
||||||
|
|
||||||
/* Whole output area.
|
/* Whole output area.
|
||||||
*/
|
*/
|
||||||
embed->rout.left = 0;
|
embed->rout.left = 0;
|
||||||
|
@ -1,261 +0,0 @@
|
|||||||
/* im_gbandjoin -- bandwise join of a set of images
|
|
||||||
*
|
|
||||||
* Copyright: 1991, N. Dessipris, modification of im_bandjoin()
|
|
||||||
*
|
|
||||||
* Author: N. Dessipris
|
|
||||||
* Written on: 17/04/1991
|
|
||||||
* Modified on :
|
|
||||||
* 16/3/94 JC
|
|
||||||
* - rewritten for partials
|
|
||||||
* - now in ANSI C
|
|
||||||
* - now works for any number of input images, except zero
|
|
||||||
* 7/10/94 JC
|
|
||||||
* - new IM_NEW()
|
|
||||||
* 16/4/07
|
|
||||||
* - fall back to im_copy() for 1 input image
|
|
||||||
* 17/1/09
|
|
||||||
* - cleanups
|
|
||||||
* - gtk-doc
|
|
||||||
* - im_bandjoin() just calls this
|
|
||||||
* - works for RAD coding too
|
|
||||||
* 27/1/10
|
|
||||||
* - formatalike inputs
|
|
||||||
* 17/5/11
|
|
||||||
* - sizealike inputs
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
This file is part of VIPS.
|
|
||||||
|
|
||||||
VIPS is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif /*HAVE_CONFIG_H*/
|
|
||||||
#include <vips/intl.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <vips/vips.h>
|
|
||||||
#include <vips/internal.h>
|
|
||||||
|
|
||||||
/* Struct we carry stuff around in.
|
|
||||||
*/
|
|
||||||
typedef struct joins {
|
|
||||||
int n; /* Number of input images */
|
|
||||||
IMAGE **t; /* Array of temp images */
|
|
||||||
IMAGE **in; /* Array of input images, NULL-terminated */
|
|
||||||
int *is; /* An int for SIZEOF_PEL() for each image */
|
|
||||||
} Join;
|
|
||||||
|
|
||||||
/* Make a Join struct.
|
|
||||||
*/
|
|
||||||
static Join *
|
|
||||||
join_new( IMAGE *out, IMAGE **in, int n )
|
|
||||||
{
|
|
||||||
Join *join;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if( !(join = IM_NEW( out, Join )) )
|
|
||||||
return( NULL );
|
|
||||||
join->n = n;
|
|
||||||
if( !(join->t = IM_ARRAY( out, n, IMAGE * )) ||
|
|
||||||
!(join->in = IM_ARRAY( out, n + 1, IMAGE * )) ||
|
|
||||||
!(join->is = IM_ARRAY( out, n, int )) )
|
|
||||||
return( NULL );
|
|
||||||
|
|
||||||
/* Cast inputs up to a common format.
|
|
||||||
*/
|
|
||||||
if( im_open_local_array( out, join->t, n, "im_gbandjoin", "p" ) ||
|
|
||||||
im_open_local_array( out, join->in, n, "im_gbandjoin", "p" ) ||
|
|
||||||
im__formatalike_vec( in, join->t, n ) ||
|
|
||||||
im__sizealike_vec( join->t, join->in, n ) )
|
|
||||||
return( NULL );
|
|
||||||
|
|
||||||
for( i = 0; i < n; i++ )
|
|
||||||
join->is[i] = IM_IMAGE_SIZEOF_PEL( join->in[i] );
|
|
||||||
|
|
||||||
/* Remember to NULL-terminate. We pass ->in[] to
|
|
||||||
* im_demand_hint_array() and friends later.
|
|
||||||
*/
|
|
||||||
join->in[n] = NULL;
|
|
||||||
|
|
||||||
return( join );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform join.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
join_bands( REGION *or, void *seq, void *a, void *b )
|
|
||||||
{
|
|
||||||
REGION **ir = (REGION **) seq;
|
|
||||||
Join *join = (Join *) b;
|
|
||||||
Rect *r = &or->valid;
|
|
||||||
const int ps = IM_IMAGE_SIZEOF_PEL( or->im );
|
|
||||||
|
|
||||||
int x, y, z, i;
|
|
||||||
|
|
||||||
for( i = 0; i < join->n; i++ )
|
|
||||||
if( im_prepare( ir[i], r ) )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
/* Loop over output!
|
|
||||||
*/
|
|
||||||
for( y = 0; y < r->height; y++ ) {
|
|
||||||
PEL *qb;
|
|
||||||
|
|
||||||
qb = (PEL *) IM_REGION_ADDR( or, r->left, r->top + y );
|
|
||||||
|
|
||||||
/* Loop for each input image. Scattered write is faster than
|
|
||||||
* scattered read.
|
|
||||||
*/
|
|
||||||
for( i = 0; i < join->n; i++ ) {
|
|
||||||
int k = join->is[i];
|
|
||||||
|
|
||||||
PEL *p;
|
|
||||||
PEL *q;
|
|
||||||
|
|
||||||
p = (PEL *) IM_REGION_ADDR( ir[i],
|
|
||||||
r->left, r->top + y );
|
|
||||||
q = qb;
|
|
||||||
|
|
||||||
for( x = 0; x < r->width; x++ ) {
|
|
||||||
for( z = 0; z < k; z++ )
|
|
||||||
q[z] = p[z];
|
|
||||||
|
|
||||||
p += z;
|
|
||||||
q += ps;
|
|
||||||
}
|
|
||||||
|
|
||||||
qb += k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* im_gbandjoin:
|
|
||||||
* @in: vector of input images
|
|
||||||
* @out: output image
|
|
||||||
* @n: number of input images
|
|
||||||
*
|
|
||||||
* Join a set of images together, bandwise.
|
|
||||||
* If the images
|
|
||||||
* have n and m bands, then the output image will have n + m
|
|
||||||
* bands, with the first n coming from the first image and the last m
|
|
||||||
* from the second.
|
|
||||||
*
|
|
||||||
* If the images differ in size, the smaller images are enlarged to match the
|
|
||||||
* larger by adding zero pixels along the bottom and right.
|
|
||||||
*
|
|
||||||
* The input images are cast up to the smallest common type (see table
|
|
||||||
* Smallest common format in
|
|
||||||
* <link linkend="VIPS-arithmetic">arithmetic</link>).
|
|
||||||
*
|
|
||||||
* See also: im_bandjoin(), im_insert().
|
|
||||||
*
|
|
||||||
* Returns: 0 on success, -1 on error
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
im_gbandjoin( IMAGE **in, IMAGE *out, int n )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
Join *join;
|
|
||||||
|
|
||||||
/* Check it out!
|
|
||||||
*/
|
|
||||||
if( n < 1 ) {
|
|
||||||
im_error( "im_gbandjoin", "%s", _( "zero input images!" ) );
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
else if( n == 1 )
|
|
||||||
return( im_copy( in[0], out ) );
|
|
||||||
|
|
||||||
/* Check our args.
|
|
||||||
*/
|
|
||||||
if( im_poutcheck( out ) ||
|
|
||||||
im_check_coding_known( "im_gbandjoin", in[0] ) )
|
|
||||||
return( -1 );
|
|
||||||
for( i = 0; i < n; i++ )
|
|
||||||
if( im_pincheck( in[i] ) ||
|
|
||||||
im_check_coding_same( "im_gbandjoin", in[i], in[0] ) )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
/* Build a data area.
|
|
||||||
*/
|
|
||||||
if( !(join = join_new( out, in, n )) )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
/* Prepare the output header.
|
|
||||||
*/
|
|
||||||
if( im_cp_desc_array( out, join->in ) )
|
|
||||||
return( -1 );
|
|
||||||
out->Bands = 0;
|
|
||||||
for( i = 0; i < n; i++ )
|
|
||||||
out->Bands += join->in[i]->Bands;
|
|
||||||
if( im_demand_hint_array( out, IM_THINSTRIP, join->in ) )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
if( im_generate( out,
|
|
||||||
im_start_many, join_bands, im_stop_many, join->in, join ) )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
return( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* im_bandjoin:
|
|
||||||
* @in1: first input image
|
|
||||||
* @in2: second input image
|
|
||||||
* @out: output image
|
|
||||||
*
|
|
||||||
* Join two images bandwise.
|
|
||||||
* If the two images
|
|
||||||
* have n and m bands respectively, then the output image will have n + m
|
|
||||||
* bands, with the first n coming from the first image and the last m
|
|
||||||
* from the second.
|
|
||||||
*
|
|
||||||
* If the images differ in size, the smaller image is enlarged to match the
|
|
||||||
* larger by adding zero pixels along the bottom and right.
|
|
||||||
*
|
|
||||||
* The two input images are cast up to the smallest common type (see table
|
|
||||||
* Smallest common format in
|
|
||||||
* <link linkend="VIPS-arithmetic">arithmetic</link>).
|
|
||||||
*
|
|
||||||
* See also: im_gbandjoin(), im_insert().
|
|
||||||
*
|
|
||||||
* Returns: 0 on success, -1 on error
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
im_bandjoin( IMAGE *in1, IMAGE *in2, IMAGE *out )
|
|
||||||
{
|
|
||||||
IMAGE *t[2];
|
|
||||||
|
|
||||||
t[0] = in1;
|
|
||||||
t[1] = in2;
|
|
||||||
|
|
||||||
return( im_gbandjoin( t, out, 2 ) );
|
|
||||||
}
|
|
@ -1292,3 +1292,38 @@ im_ref_string_get_length( const GValue *value )
|
|||||||
|
|
||||||
return( length );
|
return( length );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
im_bandjoin( VipsImage *in1, VipsImage *in2, VipsImage *out )
|
||||||
|
{
|
||||||
|
VipsImage *t;
|
||||||
|
|
||||||
|
if( vips_bandjoin2( in1, in2, &t,
|
||||||
|
NULL ) )
|
||||||
|
return( -1 );
|
||||||
|
if( vips_image_write( t, out ) ) {
|
||||||
|
g_object_unref( t );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
g_object_unref( t );
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
im_gbandjoin( VipsImage **in, VipsImage *out, int n )
|
||||||
|
{
|
||||||
|
VipsImage *t;
|
||||||
|
|
||||||
|
if( vips_bandjoin( in, &t, n,
|
||||||
|
NULL ) )
|
||||||
|
return( -1 );
|
||||||
|
if( vips_image_write( t, out ) ) {
|
||||||
|
g_object_unref( t );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
g_object_unref( t );
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -136,6 +136,10 @@ int vips_replicate( VipsImage *in, VipsImage **out, int across, int down, ... )
|
|||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
int vips_cast( VipsImage *in, VipsImage **out, VipsBandFormat format, ... )
|
int vips_cast( VipsImage *in, VipsImage **out, VipsBandFormat format, ... )
|
||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
|
int vips_bandjoin( VipsImage **in, VipsImage **out, int n, ... )
|
||||||
|
__attribute__((sentinel));
|
||||||
|
int vips_bandjoin2( VipsImage *in1, VipsImage *in2, VipsImage **out, ... )
|
||||||
|
__attribute__((sentinel));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -163,8 +167,6 @@ int im_black( VipsImage *out, int x, int y, int bands );
|
|||||||
int im_text( VipsImage *out, const char *text, const char *font,
|
int im_text( VipsImage *out, const char *text, const char *font,
|
||||||
int width, int alignment, int dpi );
|
int width, int alignment, int dpi );
|
||||||
|
|
||||||
int im_bandjoin( VipsImage *in1, VipsImage *in2, VipsImage *out );
|
|
||||||
int im_gbandjoin( VipsImage **in, VipsImage *out, int n );
|
|
||||||
int im_insertset( VipsImage *main, VipsImage *sub, VipsImage *out, int n, int *x, int *y );
|
int im_insertset( VipsImage *main, VipsImage *sub, VipsImage *out, int n, int *x, int *y );
|
||||||
int im_grid( VipsImage *in, VipsImage *out, int tile_height, int across, int down );
|
int im_grid( VipsImage *in, VipsImage *out, int tile_height, int across, int down );
|
||||||
int im_wrap( VipsImage *in, VipsImage *out, int x, int y );
|
int im_wrap( VipsImage *in, VipsImage *out, int x, int y );
|
||||||
|
@ -560,6 +560,9 @@ int im_replicate( VipsImage *in, VipsImage *out, int across, int down );
|
|||||||
|
|
||||||
int im_clip2fmt( VipsImage *in, VipsImage *out, VipsBandFormat fmt );
|
int im_clip2fmt( VipsImage *in, VipsImage *out, VipsBandFormat fmt );
|
||||||
|
|
||||||
|
int im_bandjoin( VipsImage *in1, VipsImage *in2, VipsImage *out );
|
||||||
|
int im_gbandjoin( VipsImage **in, VipsImage *out, int n );
|
||||||
|
|
||||||
|
|
||||||
/* ruby-vips uses this
|
/* ruby-vips uses this
|
||||||
*/
|
*/
|
||||||
|
@ -1814,6 +1814,7 @@ vips_object_print_all_cb( VipsObject *object, int *n )
|
|||||||
printf( "%d) ", *n );
|
printf( "%d) ", *n );
|
||||||
vips_object_print_name( object );
|
vips_object_print_name( object );
|
||||||
printf( "\n" );
|
printf( "\n" );
|
||||||
|
vips_object_print( object );
|
||||||
|
|
||||||
*n += 1;
|
*n += 1;
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ vips_area_unref( VipsArea *area )
|
|||||||
|
|
||||||
if( area->count == 0 ) {
|
if( area->count == 0 ) {
|
||||||
if( area->free_fn && area->data ) {
|
if( area->free_fn && area->data ) {
|
||||||
area->free_fn( area->data, NULL );
|
area->free_fn( area->data, area );
|
||||||
area->data = NULL;
|
area->data = NULL;
|
||||||
area->free_fn = NULL;
|
area->free_fn = NULL;
|
||||||
}
|
}
|
||||||
@ -171,16 +171,14 @@ vips_area_new_array( GType type, size_t sizeof_type, int n )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vips_area_free_array_object( VipsArea *area )
|
vips_area_free_array_object( GObject **array, VipsArea *area )
|
||||||
{
|
{
|
||||||
GObject **array = (GObject **) area->data;
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for( i = 0; i < area->n; i++ )
|
for( i = 0; i < area->n; i++ )
|
||||||
VIPS_FREEF( g_object_unref, array[i] );
|
VIPS_FREEF( g_object_unref, array[i] );
|
||||||
|
|
||||||
g_free( area );
|
area->n = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* An area which holds an array of GObjects.
|
/* An area which holds an array of GObjects.
|
||||||
@ -251,7 +249,7 @@ vips_area_get_type( void )
|
|||||||
static GType type = 0;
|
static GType type = 0;
|
||||||
|
|
||||||
if( !type ) {
|
if( !type ) {
|
||||||
type = g_boxed_type_register_static( "vips_area",
|
type = g_boxed_type_register_static( "VipsArea",
|
||||||
(GBoxedCopyFunc) vips_area_copy,
|
(GBoxedCopyFunc) vips_area_copy,
|
||||||
(GBoxedFreeFunc) vips_area_unref );
|
(GBoxedFreeFunc) vips_area_unref );
|
||||||
g_value_register_transform_func( type, G_TYPE_STRING,
|
g_value_register_transform_func( type, G_TYPE_STRING,
|
||||||
@ -359,7 +357,7 @@ vips_save_string_get_type( void )
|
|||||||
static GType type = 0;
|
static GType type = 0;
|
||||||
|
|
||||||
if( !type ) {
|
if( !type ) {
|
||||||
type = g_boxed_type_register_static( "vips_save_string",
|
type = g_boxed_type_register_static( "VipsSaveString",
|
||||||
(GBoxedCopyFunc) g_strdup,
|
(GBoxedCopyFunc) g_strdup,
|
||||||
(GBoxedFreeFunc) g_free );
|
(GBoxedFreeFunc) g_free );
|
||||||
}
|
}
|
||||||
@ -454,7 +452,7 @@ vips_ref_string_get_type( void )
|
|||||||
static GType type = 0;
|
static GType type = 0;
|
||||||
|
|
||||||
if( !type ) {
|
if( !type ) {
|
||||||
type = g_boxed_type_register_static( "vips_ref_string",
|
type = g_boxed_type_register_static( "VipsRefString",
|
||||||
(GBoxedCopyFunc) vips_area_copy,
|
(GBoxedCopyFunc) vips_area_copy,
|
||||||
(GBoxedFreeFunc) vips_area_unref );
|
(GBoxedFreeFunc) vips_area_unref );
|
||||||
g_value_register_transform_func( type, G_TYPE_STRING,
|
g_value_register_transform_func( type, G_TYPE_STRING,
|
||||||
@ -575,7 +573,7 @@ vips_blob_get_type( void )
|
|||||||
static GType type = 0;
|
static GType type = 0;
|
||||||
|
|
||||||
if( !type ) {
|
if( !type ) {
|
||||||
type = g_boxed_type_register_static( "vips_blob",
|
type = g_boxed_type_register_static( "VipsBlob",
|
||||||
(GBoxedCopyFunc) vips_area_copy,
|
(GBoxedCopyFunc) vips_area_copy,
|
||||||
(GBoxedFreeFunc) vips_area_unref );
|
(GBoxedFreeFunc) vips_area_unref );
|
||||||
g_value_register_transform_func( type, G_TYPE_STRING,
|
g_value_register_transform_func( type, G_TYPE_STRING,
|
||||||
@ -710,32 +708,33 @@ transform_array_g_string( const GValue *src_value, GValue *dest_value )
|
|||||||
static void
|
static void
|
||||||
transform_g_string_array_double( const GValue *src_value, GValue *dest_value )
|
transform_g_string_array_double( const GValue *src_value, GValue *dest_value )
|
||||||
{
|
{
|
||||||
const char *str = g_value_get_string( src_value );
|
char *str;
|
||||||
|
|
||||||
int n;
|
int n;
|
||||||
const char *p;
|
char *p, *q;
|
||||||
int i;
|
int i;
|
||||||
double *array;
|
double *array;
|
||||||
|
|
||||||
/* Walk the string to get the number of elements. Empty string is zero
|
/* Walk the string to get the number of elements.
|
||||||
* elements.
|
* We need a copy of the string, since we insert \0 during
|
||||||
|
* scan.
|
||||||
|
*
|
||||||
|
* We can't allow ',' as a separator, since some locales use it as a
|
||||||
|
* decimal point.
|
||||||
*/
|
*/
|
||||||
for( n = 0, p = str; p && *p; n += 1 ) {
|
str = g_value_dup_string( src_value );
|
||||||
p = strchr( p, ',' );
|
n = 0;
|
||||||
if( p )
|
for( p = str; (q = vips_break_token( p, "\t; " )); p = q )
|
||||||
p += 1;
|
n += 1;
|
||||||
}
|
g_free( str );
|
||||||
|
|
||||||
vips_value_set_array( dest_value, G_TYPE_DOUBLE, sizeof( double ), n );
|
vips_value_set_array( dest_value, G_TYPE_DOUBLE, sizeof( double ), n );
|
||||||
array = (double *) vips_value_get_array( dest_value, NULL, NULL, NULL );
|
array = (double *) vips_value_get_array( dest_value, NULL, NULL, NULL );
|
||||||
|
|
||||||
p = str;
|
str = g_value_dup_string( src_value );
|
||||||
for( i = 0; i < n; i++ ) {
|
i = 0;
|
||||||
array[i] = atof( p );
|
for( p = str; (q = vips_break_token( p, "\t; " )); p = q )
|
||||||
p = strchr( p, ',' );
|
array[i++] = atof( p );
|
||||||
if( p )
|
g_free( str );
|
||||||
p += 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GType
|
GType
|
||||||
@ -744,7 +743,7 @@ vips_array_double_get_type( void )
|
|||||||
static GType type = 0;
|
static GType type = 0;
|
||||||
|
|
||||||
if( !type ) {
|
if( !type ) {
|
||||||
type = g_boxed_type_register_static( "vips_array_double",
|
type = g_boxed_type_register_static( "VipsArrayDouble",
|
||||||
(GBoxedCopyFunc) vips_area_copy,
|
(GBoxedCopyFunc) vips_area_copy,
|
||||||
(GBoxedFreeFunc) vips_area_unref );
|
(GBoxedFreeFunc) vips_area_unref );
|
||||||
g_value_register_transform_func( type, G_TYPE_STRING,
|
g_value_register_transform_func( type, G_TYPE_STRING,
|
||||||
@ -810,16 +809,17 @@ transform_g_string_array_image( const GValue *src_value, GValue *dest_value )
|
|||||||
/* We need a copy of the string, since we insert \0 during
|
/* We need a copy of the string, since we insert \0 during
|
||||||
* scan.
|
* scan.
|
||||||
*/
|
*/
|
||||||
str = g_strdup_value_contents( src_value );
|
str = g_value_dup_string( src_value );
|
||||||
for( n = 0; (q = vips_break_token( p, " " )); n++, p = q )
|
n = 0;
|
||||||
;
|
for( p = str; (q = vips_break_token( p, " " )); p = q )
|
||||||
|
n += 1;
|
||||||
g_free( str );
|
g_free( str );
|
||||||
|
|
||||||
vips_value_set_array_object( dest_value, n );
|
vips_value_set_array_object( dest_value, n );
|
||||||
array = vips_value_get_array_object( dest_value, NULL );
|
array = vips_value_get_array_object( dest_value, NULL );
|
||||||
|
|
||||||
str = g_strdup_value_contents( src_value );
|
str = g_value_dup_string( src_value );
|
||||||
for( i = 0; (q = vips_break_token( p, " " )); i++, p = q )
|
for( i = 0, p = str; (q = vips_break_token( p, " " )); i++, p = q )
|
||||||
/* Sadly there's no error return possible here.
|
/* Sadly there's no error return possible here.
|
||||||
*/
|
*/
|
||||||
array[i] = G_OBJECT( vips_image_new_from_file( p ) );
|
array[i] = G_OBJECT( vips_image_new_from_file( p ) );
|
||||||
@ -832,7 +832,7 @@ vips_array_image_get_type( void )
|
|||||||
static GType type = 0;
|
static GType type = 0;
|
||||||
|
|
||||||
if( !type ) {
|
if( !type ) {
|
||||||
type = g_boxed_type_register_static( "vips_array_image",
|
type = g_boxed_type_register_static( "VipsArrayImage",
|
||||||
(GBoxedCopyFunc) vips_area_copy,
|
(GBoxedCopyFunc) vips_area_copy,
|
||||||
(GBoxedFreeFunc) vips_area_unref );
|
(GBoxedFreeFunc) vips_area_unref );
|
||||||
g_value_register_transform_func( G_TYPE_STRING, type,
|
g_value_register_transform_func( G_TYPE_STRING, type,
|
||||||
|
Loading…
Reference in New Issue
Block a user