more array->matrix renaming

This commit is contained in:
John Cupitt 2013-07-03 09:22:04 +01:00
parent 7490da07a6
commit 7312fd4ed4
11 changed files with 72 additions and 55 deletions

View File

@ -85,10 +85,6 @@ typedef VipsOperationClass VipsMeasureClass;
G_DEFINE_TYPE( VipsMeasure, vips_measure, VIPS_TYPE_OPERATION ); G_DEFINE_TYPE( VipsMeasure, vips_measure, VIPS_TYPE_OPERATION );
/* Address a double in our array image.
*/
#define ARY( im, x, y ) ((double *) VIPS_IMAGE_ADDR( im, x, y ))
static int static int
vips_measure_build( VipsObject *object ) vips_measure_build( VipsObject *object )
{ {
@ -166,8 +162,8 @@ vips_measure_build( VipsObject *object )
"avg = %g, sdev = %g" ), "avg = %g, sdev = %g" ),
i, j, b, avg, dev ); i, j, b, avg, dev );
*ARY( measure->out, b, i + j * measure->h ) = *VIPS_MATRIX( measure->out,
avg; b, i + j * measure->h ) = avg;
} }
} }
} }

View File

@ -102,10 +102,6 @@ enum {
COL_LAST = 10 COL_LAST = 10
}; };
/* Address a double in our array image.
*/
#define ARY( im, x, y ) ((double *) VIPS_IMAGE_ADDR( im, x, y ))
static int static int
vips_stats_build( VipsObject *object ) vips_stats_build( VipsObject *object )
{ {
@ -135,13 +131,13 @@ vips_stats_build( VipsObject *object )
vips_image_get_height( statistic->in ); vips_image_get_height( statistic->in );
vals = pels * vips_image_get_bands( statistic->in ); vals = pels * vips_image_get_bands( statistic->in );
row0 = ARY( stats->out, 0, 0 ); row0 = VIPS_MATRIX( stats->out, 0, 0 );
row = ARY( stats->out, 0, 1 ); row = VIPS_MATRIX( stats->out, 0, 1 );
for( i = 0; i < COL_LAST; i++ ) for( i = 0; i < COL_LAST; i++ )
row0[i] = row[i]; row0[i] = row[i];
for( b = 1; b < vips_image_get_bands( statistic->in ); b++ ) { for( b = 1; b < vips_image_get_bands( statistic->in ); b++ ) {
row = ARY( stats->out, 0, b + 1 ); row = VIPS_MATRIX( stats->out, 0, b + 1 );
if( row[COL_MIN] < row0[COL_MIN] ) { if( row[COL_MIN] < row0[COL_MIN] ) {
row0[COL_MIN] = row[COL_MIN]; row0[COL_MIN] = row[COL_MIN];
@ -160,7 +156,7 @@ vips_stats_build( VipsObject *object )
} }
for( y = 1; y < vips_image_get_height( stats->out ); y++ ) { for( y = 1; y < vips_image_get_height( stats->out ); y++ ) {
double *row = ARY( stats->out, 0, y ); double *row = VIPS_MATRIX( stats->out, 0, y );
row[COL_AVG] = row[COL_SUM] / pels; row[COL_AVG] = row[COL_SUM] / pels;
row[COL_SD] = sqrt( fabs( row[COL_SUM2] - row[COL_SD] = sqrt( fabs( row[COL_SUM2] -
@ -187,8 +183,8 @@ vips_stats_stop( VipsStatistic *statistic, void *seq )
if( local->set && !global->set ) { if( local->set && !global->set ) {
for( b = 0; b < bands; b++ ) { for( b = 0; b < bands; b++ ) {
double *p = ARY( local->out, 0, b + 1 ); double *p = VIPS_MATRIX( local->out, 0, b + 1 );
double *q = ARY( global->out, 0, b + 1 ); double *q = VIPS_MATRIX( global->out, 0, b + 1 );
int i; int i;
@ -200,8 +196,8 @@ vips_stats_stop( VipsStatistic *statistic, void *seq )
} }
else if( local->set && global->set ) { else if( local->set && global->set ) {
for( b = 0; b < bands; b++ ) { for( b = 0; b < bands; b++ ) {
double *p = ARY( local->out, 0, b + 1 ); double *p = VIPS_MATRIX( local->out, 0, b + 1 );
double *q = ARY( global->out, 0, b + 1 ); double *q = VIPS_MATRIX( global->out, 0, b + 1 );
if( p[COL_MIN] < q[COL_MIN] ) { if( p[COL_MIN] < q[COL_MIN] ) {
q[COL_MIN] = p[COL_MIN]; q[COL_MIN] = p[COL_MIN];
@ -251,7 +247,7 @@ vips_stats_start( VipsStatistic *statistic )
#define LOOP( TYPE ) { \ #define LOOP( TYPE ) { \
for( b = 0; b < bands; b++ ) { \ for( b = 0; b < bands; b++ ) { \
TYPE *p = ((TYPE *) in) + b; \ TYPE *p = ((TYPE *) in) + b; \
double *q = ARY( local->out, 0, b + 1 ); \ double *q = VIPS_MATRIX( local->out, 0, b + 1 ); \
TYPE small, big; \ TYPE small, big; \
double sum, sum2; \ double sum, sum2; \
int xmin, ymin; \ int xmin, ymin; \
@ -315,7 +311,7 @@ vips_stats_start( VipsStatistic *statistic )
#define LOOPF( TYPE ) { \ #define LOOPF( TYPE ) { \
for( b = 0; b < bands; b++ ) { \ for( b = 0; b < bands; b++ ) { \
TYPE *p = ((TYPE *) in) + b; \ TYPE *p = ((TYPE *) in) + b; \
double *q = ARY( local->out, 0, b + 1 ); \ double *q = VIPS_MATRIX( local->out, 0, b + 1 ); \
TYPE small, big; \ TYPE small, big; \
double sum, sum2; \ double sum, sum2; \
int xmin, ymin; \ int xmin, ymin; \

View File

@ -60,9 +60,9 @@ typedef struct _VipsRecomb {
VipsImage *in; VipsImage *in;
VipsImage *m; VipsImage *m;
/* m converted to a one-band double. /* Our input matrix as a one-band double.
*/ */
double *coeff; VipsImage *coeff;
} VipsRecomb; } VipsRecomb;
@ -77,9 +77,7 @@ G_DEFINE_TYPE( VipsRecomb, vips_recomb, VIPS_TYPE_CONVERSION );
OUT *q = (OUT *) out; \ OUT *q = (OUT *) out; \
\ \
for( x = 0; x < or->valid.width; x++ ) { \ for( x = 0; x < or->valid.width; x++ ) { \
double *m; \ double *m = VIPS_MATRIX( recomb->coeff, 0, 0 ); \
\
m = recomb->coeff; \
\ \
for( v = 0; v < mheight; v++ ) { \ for( v = 0; v < mheight; v++ ) { \
double t; \ double t; \
@ -163,10 +161,9 @@ vips_recomb_build( VipsObject *object )
return( -1 ); return( -1 );
} }
if( vips_cast( recomb->m, &t[0], VIPS_FORMAT_DOUBLE, NULL ) || if( vips_check_matrix( class->nickname, recomb->m, &t[0] ) )
vips_image_wio_input( t[0] ) )
return( -1 ); return( -1 );
recomb->coeff = (double *) VIPS_IMAGE_ADDR( t[0], 0, 0 ); recomb->coeff = t[0];
if( vips_image_copy_fields( conversion->out, recomb->in ) ) if( vips_image_copy_fields( conversion->out, recomb->in ) )
return( -1 ); return( -1 );

View File

@ -74,8 +74,6 @@ typedef VipsConversionClass VipsScaleClass;
G_DEFINE_TYPE( VipsScale, vips_scale, VIPS_TYPE_CONVERSION ); G_DEFINE_TYPE( VipsScale, vips_scale, VIPS_TYPE_CONVERSION );
#define ARY( im, x, y ) *((double *) VIPS_IMAGE_ADDR( im, x, y ))
static int static int
vips_scale_build( VipsObject *object ) vips_scale_build( VipsObject *object )
{ {
@ -91,8 +89,8 @@ vips_scale_build( VipsObject *object )
if( vips_stats( scale->in, &t[0], NULL ) ) if( vips_stats( scale->in, &t[0], NULL ) )
return( -1 ); return( -1 );
mn = ARY( t[0], 0, 0 ); mn = *VIPS_MATRIX( t[0], 0, 0 );
mx = ARY( t[0], 1, 0 ); mx = *VIPS_MATRIX( t[0], 1, 0 );
if( mn == mx ) { if( mn == mx ) {
/* Range of zero: just return black. /* Range of zero: just return black.

View File

@ -26,7 +26,7 @@
* 23/2/12 * 23/2/12
* - report positions for EOF/EOL errors * - report positions for EOF/EOL errors
* 2/7/13 * 2/7/13
* - add array read/write * - add matrix read/write
*/ */
/* /*
@ -500,7 +500,7 @@ read_ascii_double( FILE *fp, const char whitemap[256], double *out )
* numbers for scale and offset. * numbers for scale and offset.
*/ */
static int static int
vips__array_header( char *whitemap, FILE *fp, vips__matrix_header( char *whitemap, FILE *fp,
int *width, int *height, double *scale, double *offset ) int *width, int *height, double *scale, double *offset )
{ {
double header[4]; double header[4];
@ -548,13 +548,13 @@ vips__array_header( char *whitemap, FILE *fp,
#define WHITESPACE " \"\t\n;," #define WHITESPACE " \"\t\n;,"
/* Get the header from an array file. /* Get the header from an matrix file.
* *
* Also read the first line and make sure there are the right number of * Also read the first line and make sure there are the right number of
* entries. * entries.
*/ */
int int
vips__array_read_header( const char *filename, vips__matrix_read_header( const char *filename,
int *width, int *height, double *scale, double *offset ) int *width, int *height, double *scale, double *offset )
{ {
char whitemap[256]; char whitemap[256];
@ -571,7 +571,7 @@ vips__array_read_header( const char *filename,
if( !(fp = vips__file_open_read( filename, NULL, TRUE )) ) if( !(fp = vips__file_open_read( filename, NULL, TRUE )) )
return( -1 ); return( -1 );
if( vips__array_header( whitemap, fp, if( vips__matrix_header( whitemap, fp,
width, height, scale, offset ) ) { width, height, scale, offset ) ) {
fclose( fp ); fclose( fp );
return( -1 ); return( -1 );
@ -596,7 +596,7 @@ vips__array_read_header( const char *filename,
} }
static int static int
vips__array_body( char *whitemap, VipsImage *out, FILE *fp ) vips__matrix_body( char *whitemap, VipsImage *out, FILE *fp )
{ {
int x, y; int x, y;
@ -612,7 +612,7 @@ vips__array_body( char *whitemap, VipsImage *out, FILE *fp )
_( "line %d too short" ), y + 1 ); _( "line %d too short" ), y + 1 );
return( -1 ); return( -1 );
} }
*((double *) VIPS_IMAGE_ADDR( out, x, y )) = d; *VIPS_MATRIX( out, x, y ) = d;
/* Deliberately don't check for line too long. /* Deliberately don't check for line too long.
*/ */
@ -625,7 +625,7 @@ vips__array_body( char *whitemap, VipsImage *out, FILE *fp )
} }
VipsImage * VipsImage *
vips__array_read( const char *filename ) vips__matrix_read( const char *filename )
{ {
char whitemap[256]; char whitemap[256];
int i; int i;
@ -644,7 +644,7 @@ vips__array_read( const char *filename )
if( !(fp = vips__file_open_read( filename, NULL, TRUE )) ) if( !(fp = vips__file_open_read( filename, NULL, TRUE )) )
return( NULL ); return( NULL );
if( vips__array_header( whitemap, fp, if( vips__matrix_header( whitemap, fp,
&width, &height, &scale, &offset ) ) { &width, &height, &scale, &offset ) ) {
fclose( fp ); fclose( fp );
return( NULL ); return( NULL );
@ -655,7 +655,7 @@ vips__array_read( const char *filename )
vips_image_set_double( out, "scale", scale ); vips_image_set_double( out, "scale", scale );
vips_image_set_double( out, "offset", offset ); vips_image_set_double( out, "offset", offset );
if( vips__array_body( whitemap, out, fp ) ) { if( vips__matrix_body( whitemap, out, fp ) ) {
g_object_unref( out ); g_object_unref( out );
fclose( fp ); fclose( fp );
return( NULL ); return( NULL );
@ -666,7 +666,7 @@ vips__array_read( const char *filename )
} }
int int
vips__array_write( VipsImage *in, const char *filename ) vips__matrix_write( VipsImage *in, const char *filename )
{ {
VipsImage *mask; VipsImage *mask;
FILE *fp; FILE *fp;
@ -689,8 +689,7 @@ vips__array_write( VipsImage *in, const char *filename )
for( y = 0; y < mask->Ysize; y++ ) { for( y = 0; y < mask->Ysize; y++ ) {
for( x = 0; x < mask->Xsize; x++ ) for( x = 0; x < mask->Xsize; x++ )
fprintf( fp, "%g ", fprintf( fp, "%g ", *VIPS_MATRIX( mask, x, y ) );
*((double *) VIPS_IMAGE_ADDR( mask, x, y )) );
fprintf( fp, "\n" ); fprintf( fp, "\n" );
} }

View File

@ -45,10 +45,10 @@ int vips__csv_read_header( const char *filename, VipsImage *out,
int vips__csv_write( VipsImage *in, const char *filename, int vips__csv_write( VipsImage *in, const char *filename,
const char *separator ); const char *separator );
int vips__array_read_header( const char *filename, int vips__matrix_read_header( const char *filename,
int *width, int *height, double *scale, double *offset ); int *width, int *height, double *scale, double *offset );
VipsImage *vips__array_read( const char *filename ); VipsImage *vips__matrix_read( const char *filename );
int vips__array_write( VipsImage *in, const char *filename ); int vips__matrix_write( VipsImage *in, const char *filename );
extern const char *vips__foreign_matrix_suffs[]; extern const char *vips__foreign_matrix_suffs[];

View File

@ -88,7 +88,7 @@ vips_foreign_load_matrix_header( VipsForeignLoad *load )
double scale; double scale;
double offset; double offset;
if( vips__array_read_header( matrix->filename, if( vips__matrix_read_header( matrix->filename,
&width, &height, &scale, &offset ) ) &width, &height, &scale, &offset ) )
return( -1 ); return( -1 );
@ -109,7 +109,7 @@ vips_foreign_load_matrix_load( VipsForeignLoad *load )
VipsImage *out; VipsImage *out;
if( !(out = vips__array_read( matrix->filename )) ) if( !(out = vips__matrix_read( matrix->filename )) )
return( -1 ); return( -1 );
if( vips_image_write( out, load->real ) ) { if( vips_image_write( out, load->real ) ) {
g_object_unref( out ); g_object_unref( out );

View File

@ -73,7 +73,7 @@ vips_foreign_save_matrix_build( VipsObject *object )
build( object ) ) build( object ) )
return( -1 ); return( -1 );
if( vips__array_write( save->ready, matrix->filename ) ) if( vips__matrix_write( save->ready, matrix->filename ) )
return( -1 ); return( -1 );
return( 0 ); return( 0 );

View File

@ -484,6 +484,17 @@ extern const guint64 vips__image_sizeof_bandformat[];
(X) * VIPS_IMAGE_SIZEOF_PEL( I )) (X) * VIPS_IMAGE_SIZEOF_PEL( I ))
#endif /*VIPS_DEBUG*/ #endif /*VIPS_DEBUG*/
#ifdef VIPS_DEBUG
#define VIPS_MATRIX( I, X, Y ) \
(((I)->BandFmt == VIPS_FORMAT_DOUBLE && (I)->Bands == 1) ? \
((double *) VIPS_IMAGE_ADDR( I, X, Y )) : \
(fprintf( stderr, "VIPS_MATRIX: not a matrix image\n" ), \
(VipsPel *) NULL))
#else /*!VIPS_DEBUG*/
#define VIPS_MATRIX( I, X, Y ) \
((double *) VIPS_IMAGE_ADDR( I, X, Y ))
#endif /*VIPS_DEBUG*/
int vips_image_written( VipsImage *image ); int vips_image_written( VipsImage *image );
void vips_image_invalidate_all( VipsImage *image ); void vips_image_invalidate_all( VipsImage *image );

View File

@ -142,7 +142,8 @@
* @X: x coordinate * @X: x coordinate
* @Y: y coordinate * @Y: y coordinate
* *
* This macro returns a pointer to a pixel in an image. It only works for * This macro returns a pointer to a pixel in an image, cast to a #VipsPel *.
* It only works for
* images which are fully available in memory, so memory buffers and small * images which are fully available in memory, so memory buffers and small
* mapped images only. * mapped images only.
* *
@ -153,6 +154,25 @@
* Returns: The address of pixel (x,y) in the image. * Returns: The address of pixel (x,y) in the image.
*/ */
/**
* VIPS_MATRIX:
* @I: a #VipsImage
* @X: x coordinate
* @Y: y coordinate
*
* This macro returns a pointer to a pixel in an image, cast to a double*. The
* image must have a single band, be #VIPS_FORMAT_DOUBLE and be
* fully available in memory, so memory buffers and small
* mapped images only.
*
* If VIPS_DEBUG is defined, you get a version that checks bounds and image
* type for you.
*
* See also: VIPS_IMAGE_ADDR().
*
* Returns: The address of pixel (x,y) in the image.
*/
/* Our signals. /* Our signals.
*/ */
enum { enum {
@ -1623,7 +1643,7 @@ vips_image_new_from_memory( void *buffer,
* This convenience function makes an image which is a matrix: a one-band * This convenience function makes an image which is a matrix: a one-band
* VIPS_FORMAT_DOUBLE image held in memory. * VIPS_FORMAT_DOUBLE image held in memory.
* *
* Use VIPS_IMAGE_ADDR() to address pixels in the image. * Use VIPS_IMAGE_ADDR(), or VIPS_MATRIX() to address pixels in the image.
* *
* Returns: the new #VipsImage, or %NULL on error. * Returns: the new #VipsImage, or %NULL on error.
*/ */

View File

@ -131,7 +131,7 @@ vips_quadratic_gen( VipsRegion *or, void *vseq,
const int ps = VIPS_IMAGE_SIZEOF_PEL( in ); const int ps = VIPS_IMAGE_SIZEOF_PEL( in );
double *vec = (double *) VIPS_IMAGE_ADDR( quadratic->mat, 0, 0 ); double *vec = VIPS_MATRIX( quadratic->mat, 0, 0 );
int clip_width = resample->in->Xsize; int clip_width = resample->in->Xsize;
int clip_height = resample->in->Ysize; int clip_height = resample->in->Ysize;