diff --git a/ChangeLog b/ChangeLog index dcbb3d37..dd42ad18 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,7 +16,7 @@ - rewritten im_circle as im_draw_circle, im_circle moved to almostdeprecated - added IM_TYPE_RW args for inplace ops --- nip2 uses this to wrap inplace ops automatically -- special-case 3x3 makss in im_conv() for a 20% speedup +- special-case 3x3 masks in im_conv() for a 20% speedup - add IM_TYPE_RW flag for im__rw_image, helps nip2 auto-wrap inplace ops - im_insertplace() casts and bandalikes - copy iconv.m4 and friends in bootstrap, thanks Mike @@ -36,6 +36,7 @@ - im_affine() has a larger safety margin - fix gtk-doc warnings - small mask load/save improvements +- mask gtk-doc done 12/5/10 started 7.22.2 - the conditional image of ifthenelse can be any format, a (!=0) is added if diff --git a/TODO b/TODO index 6394f2a7..fa908e26 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,3 @@ -- started gtk-doc-ing libvips/mask - - check for maths in gtk-doc ... see im_gauss_dmask() - maybe im_draw_smudge() is too slow :-( also, we had a sanity failure with diff --git a/doc/reference/libvips-docs.sgml.in b/doc/reference/libvips-docs.sgml.in index 6220d6c8..d0c2048c 100644 --- a/doc/reference/libvips-docs.sgml.in +++ b/doc/reference/libvips-docs.sgml.in @@ -42,13 +42,13 @@ + VIPS operation API by section (no gtkdoc comments yet) - diff --git a/libvips/convolution/im_conv.c b/libvips/convolution/im_conv.c index 592a911f..f9c2003d 100644 --- a/libvips/convolution/im_conv.c +++ b/libvips/convolution/im_conv.c @@ -428,13 +428,13 @@ conv_gen( REGION *or, void *vseq, void *a, void *b ) sum = 0; \ sum += m[0] * p0[0]; \ sum += m[1] * p0[bands]; \ - sum += m[2] * p0[bands * 2]; \ + sum += m[2] * p0[bands << 1]; \ sum += m[3] * p1[0]; \ sum += m[4] * p1[bands]; \ - sum += m[5] * p1[bands * 2]; \ + sum += m[5] * p1[bands << 1]; \ sum += m[6] * p2[0]; \ sum += m[7] * p2[bands]; \ - sum += m[8] * p2[bands * 2]; \ + sum += m[8] * p2[bands << 1]; \ \ p0 += 1; \ p1 += 1; \ @@ -462,13 +462,13 @@ conv_gen( REGION *or, void *vseq, void *a, void *b ) sum = 0; \ sum += m[0] * p0[0]; \ sum += m[1] * p0[bands]; \ - sum += m[2] * p0[bands * 2]; \ + sum += m[2] * p0[bands << 1]; \ sum += m[3] * p1[0]; \ sum += m[4] * p1[bands]; \ - sum += m[5] * p1[bands * 2]; \ + sum += m[5] * p1[bands << 1]; \ sum += m[6] * p2[0]; \ sum += m[7] * p2[bands]; \ - sum += m[8] * p2[bands * 2]; \ + sum += m[8] * p2[bands << 1]; \ \ p0 += 1; \ p1 += 1; \ diff --git a/libvips/include/vips/internal.h b/libvips/include/vips/internal.h index a01ba446..63084901 100644 --- a/libvips/include/vips/internal.h +++ b/libvips/include/vips/internal.h @@ -269,6 +269,9 @@ void im_free_dmat(); int im_invmat( double **, int ); +int *im_offsets45( int size ); +int *im_offsets90( int size ); + int im_conv_f_raw( IMAGE *in, IMAGE *out, DOUBLEMASK *mask ); int im_convsep_f_raw( IMAGE *in, IMAGE *out, DOUBLEMASK *mask ); diff --git a/libvips/include/vips/mask.h b/libvips/include/vips/mask.h index abf33588..c7c8e663 100644 --- a/libvips/include/vips/mask.h +++ b/libvips/include/vips/mask.h @@ -63,16 +63,16 @@ DOUBLEMASK *im_create_dmaskv( const char *filename, int xsize, int ysize, ... ); INTMASK *im_read_imask( const char *filename ); DOUBLEMASK *im_read_dmask( const char *filename ); -void im_print_imask( INTMASK *m ); -void im_print_dmask( DOUBLEMASK *m ); +void im_print_imask( INTMASK *in ); +void im_print_dmask( DOUBLEMASK *in ); -int im_write_imask( INTMASK *m ); -int im_write_dmask( DOUBLEMASK *m ); -int im_write_imask_name( INTMASK *m, const char *filename ); -int im_write_dmask_name( DOUBLEMASK *m, const char *filename ); +int im_write_imask( INTMASK *in ); +int im_write_dmask( DOUBLEMASK *in ); +int im_write_imask_name( INTMASK *in, const char *filename ); +int im_write_dmask_name( DOUBLEMASK *in, const char *filename ); -int im_free_imask( INTMASK *m ); -int im_free_dmask( DOUBLEMASK *m ); +int im_free_imask( INTMASK *in ); +int im_free_dmask( DOUBLEMASK *in ); INTMASK *im_log_imask( const char *filename, double sigma, double min_ampl ); DOUBLEMASK *im_log_dmask( const char *filename, double sigma, double min_ampl ); @@ -83,20 +83,19 @@ INTMASK *im_gauss_imask_sep( const char *filename, DOUBLEMASK *im_gauss_dmask( const char *filename, double sigma, double min_ampl ); -INTMASK *im_dup_imask( INTMASK *m, const char *filename ); -DOUBLEMASK *im_dup_dmask( DOUBLEMASK *m, const char *filename ); +INTMASK *im_dup_imask( INTMASK *in, const char *filename ); +DOUBLEMASK *im_dup_dmask( DOUBLEMASK *in, const char *filename ); -INTMASK *im_scale_dmask( DOUBLEMASK *m, const char *filename ); +INTMASK *im_scale_dmask( DOUBLEMASK *in, const char *filename ); void im_norm_dmask( DOUBLEMASK *mask ); -int *im_offsets45( int size ); -int *im_offsets90( int size ); -INTMASK *im_rotate_imask90( INTMASK *m, const char *filename ); -INTMASK *im_rotate_imask45( INTMASK *m, const char *filename ); -DOUBLEMASK *im_rotate_dmask90( DOUBLEMASK *m, const char *filename ); -DOUBLEMASK *im_rotate_dmask45( DOUBLEMASK *m, const char *filename ); +INTMASK *im_rotate_imask90( INTMASK *in, const char *filename ); +INTMASK *im_rotate_imask45( INTMASK *in, const char *filename ); +DOUBLEMASK *im_rotate_dmask90( DOUBLEMASK *in, const char *filename ); +DOUBLEMASK *im_rotate_dmask45( DOUBLEMASK *in, const char *filename ); DOUBLEMASK *im_mattrn( DOUBLEMASK *in, const char *filename ); -DOUBLEMASK *im_matcat( DOUBLEMASK *in1, DOUBLEMASK *in2, const char *filename ); +DOUBLEMASK *im_matcat( DOUBLEMASK *top, DOUBLEMASK *bottom, + const char *filename ); DOUBLEMASK *im_matmul( DOUBLEMASK *in1, DOUBLEMASK *in2, const char *filename ); DOUBLEMASK *im_lu_decomp( const DOUBLEMASK *mat, const char *filename ); diff --git a/libvips/mask/im_gaussmasks.c b/libvips/mask/im_gaussmasks.c index 4a75e306..1b297715 100644 --- a/libvips/mask/im_gaussmasks.c +++ b/libvips/mask/im_gaussmasks.c @@ -1,7 +1,6 @@ /* generate gaussian masks - */ - -/* Written on: 30/11/1989 by Nicos + * + * Written on: 30/11/1989 by Nicos * Updated on: 6/12/1991 * 7/8/96 JC * - ansified, mem leaks plugged diff --git a/libvips/mask/im_logmasks.c b/libvips/mask/im_logmasks.c index 339ead96..daf84692 100644 --- a/libvips/mask/im_logmasks.c +++ b/libvips/mask/im_logmasks.c @@ -1,27 +1,6 @@ -/* @(#) Returns a circularly symmetric difference of Gaussian mask - * @(#) min_amplitude should be greater than 0.0 and less than 1.0 - * @(#) min_amplitude determines the size of the mask; if for instance - * @(#) the value .1 is entered this means that the produced mask is clipped - * @(#) at values less than 10 percent of the minimum negative amplitude. - * @(#) If the value of min_amplitude is too small, then the filter coefficients - * @(#) are calculated for masksize equal to the min of 8 * sigma or 256. - * @(#) The mask can be directly used with the vasari convolution programs, - * @(#) the default offset set is 0 - * @(#) - * @(#) DOUBLEMASK *im_log_dmask( filename, sigma, min_amplitude ) - * @(#) char *filename; - * @(#) double sigma, min_amplitude; - * @(#) - * @(#) Returns a laplacian of Gaussian square double mask or NULL on error - * @(#) - * @(#) DOUBLEMASK *im_log_imask( filename, sigma, min_amplitude ) - * @(#) char *filename; - * @(#) double sigma, min_amplitude; - * @(#) - * @(#) Returns a laplacian of Gaussian square int mask or NULL on error - */ - -/* Written on: 30/11/1989 +/* laplacian of gaussian + * + * Written on: 30/11/1989 * Updated on: 6/12/1991 * 7/8/96 JC * - ansified, mem leaks plugged @@ -31,6 +10,8 @@ * - ahem, was broken since '96, thanks matt * 16/7/03 JC * - makes mask out to zero, not out to minimum, thanks again matt + * 22/10/10 + * - gtkdoc */ /* @@ -80,6 +61,34 @@ #define IM_MAXMASK 256 +/** + * im_log_dmask: + * @filename: the returned mask has this set as the filename + * @sigma: standard deviation of mask + * @min_ampl: minimum amplitude + * + * im_log_dmask() creates a circularly symmetric Laplacian of Gaussian mask + * of radius + * @sigma. The size of the mask is determined by the variable @min_ampl; + * if for instance the value .1 is entered this means that the produced mask + * is clipped at values within 10 persent of zero, and where the change + * between mask elements is less than 10%. + * + * The program uses the following equation: (from Handbook of Pattern + * Recognition and image processing by Young and Fu, AP 1986 pages 220-221): + * + * H(r) = (1 / (2 * M_PI * s4)) * + * (2 - (r2 / s2)) * + * exp(-r2 / (2 * s2)) + * + * where s2 = sigma * sigma, s4 = s2 * s2, r2 = r * r. + * + * The generated mask has odd size and its maximum value is normalised to 1.0. + * + * See also: im_log_imask(), im_gauss_dmask(), im_conv(). + * + * Returns: the calculated mask on success, or NULL on error. + */ DOUBLEMASK * im_log_dmask( const char *filename, double sigma, double min_ampl ) { @@ -135,8 +144,10 @@ im_log_dmask( const char *filename, double sigma, double min_ampl ) return( NULL ); } - xm2 = x; ym2 = x; - xm = xm2 * 2 + 1; ym = ym2 * 2 + 1; + xm2 = x; + ym2 = x; + xm = xm2 * 2 + 1; + ym = ym2 * 2 + 1; if( !(cfs = IM_ARRAY( NULL, (xm2 + 1) * (ym2 + 1), double )) ) return( NULL ); @@ -201,6 +212,19 @@ im_log_dmask( const char *filename, double sigma, double min_ampl ) return( m ); } +/** + * im_log_imask: + * @filename: the returned mask has this set as the filename + * @sigma: standard deviation of mask + * @min_ampl: minimum amplitude + * + * im_log_imask() works exactly as im_log_dmask(), but the returned mask + * is scaled so that it's maximum value it set to 100. + * + * See also: im_log_dmask(), im_gauss_imask(), im_conv(). + * + * Returns: the calculated mask on success, or NULL on error. + */ INTMASK * im_log_imask( const char *filename, double sigma, double min_ampl ) { diff --git a/libvips/mask/im_matcat.c b/libvips/mask/im_matcat.c index ea335824..b92ff398 100644 --- a/libvips/mask/im_matcat.c +++ b/libvips/mask/im_matcat.c @@ -1,13 +1,9 @@ -/* @(#) combine two masks. Result mask is made and returned. - * @(#) Pass in the name to set in the creation of the mask. - * @(#) DOUBLEMASK * - * @(#) im_matcat( in1, in2, name ); - * @(#) DOUBLEMASK *in1, *in2; - * @(#) char *name; - * @(#) - * @(#) return NULL for error. +/* matrix catenate * * 1994, K. Martinez + * + * 22/10/10 + * - gtk-doc */ /* @@ -50,39 +46,49 @@ #include #endif /*WITH_DMALLOC*/ -/* MATRIX concatenate (join columns ie add mask to bottom of another) +/** + * im_matcat: + * @top: input matrix + * @bottom: input matrix + * @filename: filename for output + * + * Matrix catenations. Returns a new matrix which is the two source matrices + * joined together top-bottom. They must be the same width. + * + * See also: im_mattrn(), im_matmul(), im_matinv(). + * + * Returns: the joined mask on success, or NULL on error. */ DOUBLEMASK * -im_matcat( DOUBLEMASK *in1, DOUBLEMASK *in2, const char *name ) +im_matcat( DOUBLEMASK *top, DOUBLEMASK *bottom, const char *filename ) { int newxsize, newysize; DOUBLEMASK *mat; double *out; - + /* matrices must be same width */ - if( in1->xsize != in2->xsize ) { - im_error( "im_matcat", "%s", _( "matrices must be same width" ) ); + if( top->xsize != bottom->xsize ) { + im_error( "im_matcat", "%s", + _( "matrices must be same width" ) ); return( NULL ); } - newxsize = in1->xsize; - newysize = in1->ysize + in2->ysize; + newxsize = top->xsize; + newysize = top->ysize + bottom->ysize; /* Allocate output matrix. */ - if( !(mat = im_create_dmask( name, newxsize, newysize )) ) { - im_error( "im_matcat", "%s", _( "unable to allocate output matrix" ) ); + if( !(mat = im_create_dmask( filename, newxsize, newysize )) ) return( NULL ); - } /* copy first matrix then add second on the end */ - memcpy( mat->coeff, in1->coeff, - in1->xsize * in1->ysize * sizeof( double ) ); - out = mat->coeff + in1->xsize * in1->ysize; - memcpy( out, in2->coeff, - in2->xsize * in2->ysize * sizeof( double ) ); + memcpy( mat->coeff, top->coeff, + top->xsize * top->ysize * sizeof( double ) ); + out = mat->coeff + top->xsize * top->ysize; + memcpy( out, bottom->coeff, + bottom->xsize * bottom->ysize * sizeof( double ) ); return( mat ); } diff --git a/libvips/mask/im_matinv.c b/libvips/mask/im_matinv.c index cded8686..db87cd60 100644 --- a/libvips/mask/im_matinv.c +++ b/libvips/mask/im_matinv.c @@ -1,26 +1,4 @@ -/* @(#) Allocate, and return a pointer to, a DOUBLEMASK representing the LU - * @(#) decomposition of the matrix in DOUBLEMASK *mat. Give it the filename - * @(#) member *name. Returns NULL on error. Scale and offset are ignored. - * @(#) - * @(#) DOUBLEMASK *im_lu_decomp( const DOUBLEMASK *mat, const char *name ); - * @(#) - * @(#) Solve the system of linear equations Ax=b, where matrix A has already - * @(#) been decomposed into LU form in DOUBLEMASK *lu. Input vector b is in - * @(#) vec and is overwritten with vector x. - * @(#) - * @(#) int im_lu_solve( const DOUBLEMASK *lu, double *vec ); - * @(#) - * @(#) Allocate, and return a pointer to, a DOUBLEMASK representing the - * @(#) inverse of the matrix represented in mat. Give it the filename - * @(#) member *name. Returns NULL on error. Scale and offset are ignored. - * @(#) - * @(#) DOUBLEMASK *im_matinv( const DOUBLEMASK *mat, const char *name ); - * @(#) - * @(#) Invert the matrix represented by the DOUBLEMASK *mat, and store - * @(#) it in the place of *mat. Returns -1 on error. Scale and offset - * @(#) are ignored. - * @(#) - * @(#) int im_matinv_inplace( DOUBLEMASK *mat ); +/* solve and invert matrices * * Author: Tom Vajzovic * Copyright: 2006, Tom Vajzovic @@ -31,6 +9,9 @@ * * 2006-09-08 tcv: * - complete rewrite; algorithm unchanged + * + * 22/10/10 + * - gtkdoc */ /* @@ -108,29 +89,41 @@ mat_inv_direct( /** EXPORTED FUNCTION DEFINITIONS **/ -DOUBLEMASK * -im_lu_decomp( - const DOUBLEMASK *mat, - const char *name -){ -#define FUNCTION_NAME "im_lu_decomp" -/* This function takes any square NxN DOUBLEMASK treats it as a matrix. - * It allocates a DOUBLEMASK which is (N+1)xN. +/** + * im_lu_decomp: + * @mat: matrix to decompose + * @filename: name for output matrix + * + * This function takes any square NxN #DOUBLEMASK. + * It returns a #DOUBLEMASK which is (N+1)xN. * * It calculates the PLU decomposition, storing the upper and diagonal parts * of U, together with the lower parts of L, as an NxN matrix in the first * N rows of the new matrix. The diagonal parts of L are all set to unity * and are not stored. * - * The final row of the new DOUBLEMASK has only integer entries, which + * The final row of the new #DOUBLEMASK has only integer entries, which * represent the row-wise permutations made by the permuatation matrix P. * - * The scale and offset members of the input DOUBLEMASK are ignored. + * The scale and offset members of the input #DOUBLEMASK are ignored. * * See: - * PRESS, W. et al, 1992. Numerical Recipies in C; The Art of Scientific - * Computing, 2nd ed. Cambridge: Cambridge University Press, pp. 43-50. + * + * PRESS, W. et al, 1992. Numerical Recipies in C; The Art of Scientific + * Computing, 2nd ed. Cambridge: Cambridge University Press, pp. 43-50. + * + * See also: im_mattrn(), im_matinv(). + * + * Returns: the decomposed matrix on success, or NULL on error. */ + +DOUBLEMASK * +im_lu_decomp( + const DOUBLEMASK *mat, + const char *name +){ +#define FUNCTION_NAME "im_lu_decomp" + int i, j, k; double *row_scale; DOUBLEMASK *lu; @@ -244,6 +237,25 @@ im_lu_decomp( #undef FUNCTION_NAME } +/** + * im_lu_solve: + * @lu: matrix to solve + * @vec: name for output matrix + * + * Solve the system of linear equations Ax=b, where matrix A has already + * been decomposed into LU form in DOUBLEMASK *lu. Input vector b is in + * vec and is overwritten with vector x. + * + * See: + * + * PRESS, W. et al, 1992. Numerical Recipies in C; The Art of Scientific + * Computing, 2nd ed. Cambridge: Cambridge University Press, pp. 43-50. + * + * See also: im_mattrn(), im_matinv(). + * + * Returns: the decomposed matrix on success, or NULL on error. + */ + int im_lu_solve( const DOUBLEMASK *lu, @@ -287,10 +299,23 @@ im_lu_solve( #undef FUNCTION_NAME } +/** + * im_matinv: + * @mat: matrix to invert + * @filename: name for output matrix + * + * Allocate, and return a pointer to, a DOUBLEMASK representing the + * inverse of the matrix represented in @mat. Give it the filename + * member @filename. Returns NULL on error. Scale and offset are ignored. + * + * See also: im_mattrn(). + * + * Returns: the inverted matrix on success, or %NULL on error. + */ DOUBLEMASK * im_matinv( const DOUBLEMASK *mat, - const char *name + const char *filename ){ #define FUNCTION_NAME "im_matinv" @@ -301,7 +326,7 @@ im_matinv( return NULL; } #define N ( mat -> xsize ) - inv= im_create_dmask( name, N, N ); + inv= im_create_dmask( filename, N, N ); if( ! inv ) return NULL; @@ -328,6 +353,18 @@ im_matinv( #undef FUNCTION_NAME } +/** + * im_matinv_inplace: + * @mat: matrix to invert + * + * Invert the matrix represented by the DOUBLEMASK @mat, and store + * it in the place of @mat. Scale and offset + * are ignored. + * + * See also: im_mattrn(). + * + * Returns: 0 on success, or -1 on error. + */ int im_matinv_inplace( DOUBLEMASK *mat diff --git a/libvips/mask/im_matmul.c b/libvips/mask/im_matmul.c index 4de9195f..607409c4 100644 --- a/libvips/mask/im_matmul.c +++ b/libvips/mask/im_matmul.c @@ -1,15 +1,9 @@ -/* @(#) Multiplies two DOUBLEMASKs. Result matrix is made and returned. - * @(#) Pass the filename to set for the output. - * @(#) - * @(#) DOUBLEMASK * - * @(#) im_matmul( in1, in2, name ) - * @(#) DOUBLEMASK *in1, *in2; - * @(#) char *name; - * @(#) - * @(#) NULL for error. +/* Multiply two matrices. * * Copyright: 1990, K. Martinez and J. Cupitt * + * 23/10/10 + * - gtk-doc */ /* @@ -51,7 +45,20 @@ #include #endif /*WITH_DMALLOC*/ -/* MATRIX MULTIPLY? +/** + * im_matmul: + * @in1: input matrix + * @in2: input matrix + * @filename: name for output matrix + * + * Multiplies two DOUBLEMASKs. Result matrix is made and returned. + * Pass the filename to set for the output. + * + * The scale and offset members of @in1 and @in2 are ignored. + * + * See also: im_mattrn(), im_matinv(). + * + * Returns: the result matrix on success, or %NULL on error. */ DOUBLEMASK * im_matmul( DOUBLEMASK *in1, DOUBLEMASK *in2, const char *name ) @@ -71,10 +78,8 @@ im_matmul( DOUBLEMASK *in1, DOUBLEMASK *in2, const char *name ) /* Allocate output matrix. */ - if( !(mat = im_create_dmask( name, in2->xsize, in1->ysize )) ) { - im_error( "im_matmul", "%s", _( "unable to allocate output mask" ) ); + if( !(mat = im_create_dmask( name, in2->xsize, in1->ysize )) ) return( NULL ); - } /* Multiply. */ diff --git a/libvips/mask/im_mattrn.c b/libvips/mask/im_mattrn.c index 82fbd862..ba6fb4be 100644 --- a/libvips/mask/im_mattrn.c +++ b/libvips/mask/im_mattrn.c @@ -1,12 +1,4 @@ -/* @(#) Transpose a mask. Result mask is made and returned. Pass in the name - * @(#) to set for the output mask. - * @(#) - * @(#) DOUBLEMASK * - * @(#) im_mattrn( in, name ); - * @(#) DOUBLEMASK *in; - * @(#) char *name; - * @(#) - * @(#) NULL for error. +/* matrix transpose * * Copyright: 1990, K. Martinez and J. Cupitt * @@ -51,7 +43,17 @@ #include #endif /*WITH_DMALLOC*/ -/* MATRIX TRANSPOSE?? +/** + * im_mattrn: + * @in: input matrix + * @filename: name for output matrix + * + * Transposes the input matrix. + * Pass the filename to set for the output. + * + * See also: im_matmul(), im_matinv(). + * + * Returns: the result matrix on success, or %NULL on error. */ DOUBLEMASK * im_mattrn( DOUBLEMASK *in, const char *name ) @@ -62,10 +64,10 @@ im_mattrn( DOUBLEMASK *in, const char *name ) /* Allocate output matrix. */ - if( !(mat = im_create_dmask( name, in->ysize, in->xsize )) ) { - im_error( "im_mattrn", "%s", _( "unable to allocate output matrix" ) ); + if( !(mat = im_create_dmask( name, in->ysize, in->xsize )) ) return( NULL ); - } + mat->scale = in->scale; + mat->offset = in->offset; /* Transpose. */ diff --git a/libvips/mask/rotmask.c b/libvips/mask/rotmask.c index 6db413e9..a7d6a207 100644 --- a/libvips/mask/rotmask.c +++ b/libvips/mask/rotmask.c @@ -182,7 +182,6 @@ im_offsets45( int size ) return( pnt ); } - /* Creates the offsets to rotate any mask by 90 degrees. */ int * @@ -275,38 +274,74 @@ rotimask( offset_fn fn, INTMASK *m, const char *name ) return( out ); } -/* Returns a mask which is the argument mask rotated by 90 degrees. Filename - * of the returned mask is name. +/** + * im_rotate_dmask90: + * @in: input matrix + * @filename: name for output matrix + * + * Returns a mask which is the argument mask rotated by 90 degrees. + * Pass the filename to set for the output. + * + * See also: im_rotate_dmask45(). + * + * Returns: the result matrix on success, or %NULL on error. */ DOUBLEMASK * -im_rotate_dmask90( DOUBLEMASK *m, const char *name ) +im_rotate_dmask90( DOUBLEMASK *in, const char *filename ) { - return( rotdmask( im_offsets90, m, name ) ); + return( rotdmask( im_offsets90, in, filename ) ); } -/* Returns a mask which is the argument mask rotated by 45 degrees. Filename - * of the returned mask is name. +/** + * im_rotate_dmask45: + * @in: input matrix + * @filename: name for output matrix + * + * Returns a mask which is the argument mask rotated by 45 degrees. + * Pass the filename to set for the output. + * + * See also: im_rotate_dmask90(). + * + * Returns: the result matrix on success, or %NULL on error. */ DOUBLEMASK * -im_rotate_dmask45( DOUBLEMASK *m, const char *name ) +im_rotate_dmask45( DOUBLEMASK *in, const char *filename ) { - return( rotdmask( im_offsets45, m, name ) ); + return( rotdmask( im_offsets45, in, filename ) ); } -/* Returns a mask which is the argument mask rotated by 90 degrees. Filename - * of the returned mask is name. +/** + * im_rotate_imask90: + * @in: input matrix + * @filename: name for output matrix + * + * Returns a mask which is the argument mask rotated by 90 degrees. + * Pass the filename to set for the output. + * + * See also: im_rotate_imask45(). + * + * Returns: the result matrix on success, or %NULL on error. */ INTMASK * -im_rotate_imask90( INTMASK *m, const char *name ) +im_rotate_imask90( INTMASK *in, const char *filename ) { - return( rotimask( im_offsets90, m, name ) ); + return( rotimask( im_offsets90, in, filename ) ); } -/* Returns a mask which is the argument mask rotated by 45 degrees. Filename - * of the returned mask is name. +/** + * im_rotate_imask45: + * @in: input matrix + * @filename: name for output matrix + * + * Returns a mask which is the argument mask rotated by 45 degrees. + * Pass the filename to set for the output. + * + * See also: im_rotate_imask90(). + * + * Returns: the result matrix on success, or %NULL on error. */ INTMASK * -im_rotate_imask45( INTMASK *m, const char *name ) +im_rotate_imask45( INTMASK *in, const char *filename ) { - return( rotimask( im_offsets45, m, name ) ); + return( rotimask( im_offsets45, in, filename ) ); } diff --git a/libvips/mask/rw_mask.c b/libvips/mask/rw_mask.c index 9b386e69..9d65a75a 100644 --- a/libvips/mask/rw_mask.c +++ b/libvips/mask/rw_mask.c @@ -156,7 +156,7 @@ /** * im_free_imask: - * @m: mask to free + * @in: mask to free * * Free mask structure and any attached arrays. Return zero, so we can use * these functions as close callbacks. @@ -166,23 +166,21 @@ * Returns: zero. */ int -im_free_imask( INTMASK *m ) +im_free_imask( INTMASK *in ) { - if( ! m ) - return 0; + if( !in ) + return( 0 ); - if( m->coeff ) - im_free( m->coeff ); - if( m->filename ) - im_free( m->filename ); - im_free( m ); + IM_FREE( in->coeff ); + IM_FREE( in->filename ); + IM_FREE( in ); return( 0 ); } /** * im_free_dmask: - * @m: mask to free + * @in: mask to free * * Free mask structure and any attached arrays. Return zero, so we can use * these functions as close callbacks. @@ -192,16 +190,14 @@ im_free_imask( INTMASK *m ) * Returns: zero. */ int -im_free_dmask( DOUBLEMASK *m ) -{ - if( ! m ) - return 0; +im_free_dmask( DOUBLEMASK *in ) +{ + if( !in ) + return( 0 ); - if( m->coeff ) - im_free( m->coeff ); - if( m->filename ) - im_free( m->filename ); - im_free( m ); + IM_FREE( in->coeff ); + IM_FREE( in->filename ); + IM_FREE( in ); return( 0 ); } @@ -221,7 +217,7 @@ im_free_dmask( DOUBLEMASK *m ) INTMASK * im_create_imask( const char *filename, int xsize, int ysize ) { - INTMASK *m; + INTMASK *out; int size = xsize * ysize; /* Check args. @@ -233,28 +229,28 @@ im_create_imask( const char *filename, int xsize, int ysize ) /* Allocate and initialise structure. */ - if( !(m = IM_NEW( NULL, INTMASK )) ) + if( !(out = IM_NEW( NULL, INTMASK )) ) return( NULL ); - m->coeff = NULL; - m->filename = NULL; - m->scale = 1; - m->offset = 0; - m->xsize = 0; - m->ysize = 0; + out->coeff = NULL; + out->filename = NULL; + out->scale = 1; + out->offset = 0; + out->xsize = 0; + out->ysize = 0; - if( !(m->coeff = IM_ARRAY( NULL, size, int )) ) { - im_free_imask( m ); + if( !(out->coeff = IM_ARRAY( NULL, size, int )) ) { + im_free_imask( out ); return( NULL ); } - (void) memset( (char *) m->coeff, 0, size * sizeof( int ) ); - if( !(m->filename = im_strdup( NULL, filename )) ) { - im_free_imask( m ); + (void) memset( (char *) out->coeff, 0, size * sizeof( int ) ); + if( !(out->filename = im_strdup( NULL, filename )) ) { + im_free_imask( out ); return( NULL ); } - m->xsize = xsize; - m->ysize = ysize; + out->xsize = xsize; + out->ysize = ysize; - return( m ); + return( out ); } /** @@ -275,18 +271,18 @@ im_create_imaskv( const char *filename, int xsize, int ysize, ... ) { va_list ap; - INTMASK *m; + INTMASK *out; int i; - if( !(m = im_create_imask( filename, xsize, ysize )) ) + if( !(out = im_create_imask( filename, xsize, ysize )) ) return( NULL ); va_start( ap, ysize ); for( i = 0; i < xsize * ysize; i++ ) - m->coeff[i] = va_arg( ap, int ); + out->coeff[i] = va_arg( ap, int ); va_end( ap ); - return( m ); + return( out ); } /** @@ -304,7 +300,7 @@ im_create_imaskv( const char *filename, int xsize, int ysize, ... ) DOUBLEMASK * im_create_dmask( const char *filename, int xsize, int ysize ) { - DOUBLEMASK *m; + DOUBLEMASK *out; int size = xsize * ysize; /* Check args. @@ -316,28 +312,28 @@ im_create_dmask( const char *filename, int xsize, int ysize ) /* Allocate and initialise structure. */ - if( !(m = IM_NEW( NULL, DOUBLEMASK )) ) + if( !(out = IM_NEW( NULL, DOUBLEMASK )) ) return( NULL ); - m->coeff = NULL; - m->filename = NULL; - m->scale = 1.0; - m->offset = 0.0; - m->xsize = 0; - m->ysize = 0; + out->coeff = NULL; + out->filename = NULL; + out->scale = 1.0; + out->offset = 0.0; + out->xsize = 0; + out->ysize = 0; - if( !(m->coeff = IM_ARRAY( NULL, size, double )) ) { - im_free_dmask( m ); + if( !(out->coeff = IM_ARRAY( NULL, size, double )) ) { + im_free_dmask( out ); return( NULL ); } - (void) memset( (char *) m->coeff, 0, size * sizeof( double ) ); - if( !(m->filename = im_strdup( NULL, filename )) ) { - im_free_dmask( m ); + (void) memset( (char *) out->coeff, 0, size * sizeof( double ) ); + if( !(out->filename = im_strdup( NULL, filename )) ) { + im_free_dmask( out ); return( NULL ); } - m->xsize = xsize; - m->ysize = ysize; + out->xsize = xsize; + out->ysize = ysize; - return( m ); + return( out ); } /** @@ -358,18 +354,18 @@ im_create_dmaskv( const char *filename, int xsize, int ysize, ... ) { va_list ap; - DOUBLEMASK *m; + DOUBLEMASK *out; int i; - if( !(m = im_create_dmask( filename, xsize, ysize )) ) + if( !(out = im_create_dmask( filename, xsize, ysize )) ) return( NULL ); va_start( ap, ysize ); for( i = 0; i < xsize * ysize; i++ ) - m->coeff[i] = va_arg( ap, double ); + out->coeff[i] = va_arg( ap, double ); va_end( ap ); - return( m ); + return( out ); } /* Read a line from a file! @@ -476,7 +472,7 @@ im_read_dmask( const char *filename ) FILE *fp; double sc, off; int xs, ys; - DOUBLEMASK *m; + DOUBLEMASK *out; int x, y, i, size; char buf[IM_MAX_LINE]; @@ -488,30 +484,30 @@ im_read_dmask( const char *filename ) return( NULL ); } - if( !(m = im_create_dmask( filename, xs, ys )) ) { + if( !(out = im_create_dmask( filename, xs, ys )) ) { fclose( fp ); return( NULL ); } - m->scale = sc; - m->offset = off; + out->scale = sc; + out->offset = off; size = xs * ys; for( i = 0, y = 0; y < ys; y++ ) { char *p; if( get_line( fp, buf ) ) { - im_free_dmask( m ); + im_free_dmask( out ); fclose( fp ); return( NULL ); } for( p = buf, x = 0; p && x < xs; x++, i++, p = im_break_token( p, " \t,\";" ) ) - m->coeff[i] = g_ascii_strtod( p, NULL ); + out->coeff[i] = g_ascii_strtod( p, NULL ); } fclose( fp ); - return( m ); + return( out ); } /** @@ -575,7 +571,7 @@ im_read_imask( const char *filename ) /** * im_scale_dmask: - * @m: mask to scale + * @in: mask to scale * @filename: filename for returned mask * * Scale the dmask to make an imask with a maximum value of 100. @@ -585,34 +581,34 @@ im_read_imask( const char *filename ) * Returns: the converted mask, or NULL on error. */ INTMASK * -im_scale_dmask( DOUBLEMASK *m, const char *filename ) +im_scale_dmask( DOUBLEMASK *in, const char *filename ) { - const int size = m->xsize * m->ysize; + const int size = in->xsize * in->ysize; INTMASK *out; double maxval, dsum; int i; int isum; - if( !filename || m->xsize <= 0 || m->ysize <= 0 ) { + if( !filename || in->xsize <= 0 || in->ysize <= 0 ) { im_error( "im_scale_dmask", "%s", _( "bad arguments" ) ); return( NULL ); } - if( !(out = im_create_imask( filename, m->xsize, m->ysize )) ) + if( !(out = im_create_imask( filename, in->xsize, in->ysize )) ) return( NULL ); /* Find mask max. */ - maxval = m->coeff[0]; + maxval = in->coeff[0]; for( i = 0; i < size; i++ ) - if( m->coeff[i] > maxval ) - maxval = m->coeff[i]; + if( in->coeff[i] > maxval ) + maxval = in->coeff[i]; /* Copy and scale, setting max to 100. */ for( i = 0; i < size; i++ ) - out->coeff[i] = IM_RINT( m->coeff[i] * 100.0 / maxval ); - out->offset = m->offset; + out->coeff[i] = IM_RINT( in->coeff[i] * 100.0 / maxval ); + out->offset = in->offset; /* Set the scale to match the adjustment to max. */ @@ -620,15 +616,15 @@ im_scale_dmask( DOUBLEMASK *m, const char *filename ) dsum = 0.0; for( i = 0; i < size; i++ ) { isum += out->coeff[i]; - dsum += m->coeff[i]; + dsum += in->coeff[i]; } - if( dsum == m->scale ) + if( dsum == in->scale ) out->scale = isum; else if( dsum == 0.0 ) out->scale = 1.0; else - out->scale = IM_RINT( m->scale * isum / dsum ); + out->scale = IM_RINT( in->scale * isum / dsum ); return( out ); } @@ -664,7 +660,7 @@ im_norm_dmask( DOUBLEMASK *mask ) /** * im_dup_imask: - * @m: mask to duplicate + * @in: mask to duplicate * @filename: filename to set for the new mask * * Duplicate an imask. @@ -674,26 +670,26 @@ im_norm_dmask( DOUBLEMASK *mask ) * Returns: the mask copy, or NULL on error. */ INTMASK * -im_dup_imask( INTMASK *m, const char *filename ) +im_dup_imask( INTMASK *in, const char *filename ) { - INTMASK *new; + INTMASK *out; int i; - if( !(new = im_create_imask( filename, m->xsize, m->ysize )) ) + if( !(out = im_create_imask( filename, in->xsize, in->ysize )) ) return( NULL ); - new->offset = m->offset; - new->scale = m->scale; + out->offset = in->offset; + out->scale = in->scale; - for( i = 0; i < m->xsize * m->ysize; i++ ) - new->coeff[i] = m->coeff[i]; + for( i = 0; i < in->xsize * in->ysize; i++ ) + out->coeff[i] = in->coeff[i]; - return( new ); + return( out ); } /** * im_dup_dmask: - * @m: mask to duplicate + * @in: mask to duplicate * @filename: filename to set for the new mask * * Duplicate a dmask. @@ -703,21 +699,21 @@ im_dup_imask( INTMASK *m, const char *filename ) * Returns: the mask copy, or NULL on error. */ DOUBLEMASK * -im_dup_dmask( DOUBLEMASK *m, const char *filename ) +im_dup_dmask( DOUBLEMASK *in, const char *filename ) { - DOUBLEMASK *new; + DOUBLEMASK *out; int i; - if( !(new = im_create_dmask( filename, m->xsize, m->ysize )) ) + if( !(out = im_create_dmask( filename, in->xsize, in->ysize )) ) return( NULL ); - new->offset = m->offset; - new->scale = m->scale; + out->offset = in->offset; + out->scale = in->scale; - for( i = 0; i < m->xsize * m->ysize; i++ ) - new->coeff[i] = m->coeff[i]; + for( i = 0; i < in->xsize * in->ysize; i++ ) + out->coeff[i] = in->coeff[i]; - return( new ); + return( out ); } /* Open for write. We can't use im__open_write(), we don't want binary mode. @@ -765,7 +761,7 @@ write_double( FILE *fp, double d ) /** * im_write_imask_name: - * @m: mask to write + * @in: mask to write * @filename: filename to write to * * Write an imask to a file. See im_read_dmask() for a description of the mask @@ -776,7 +772,7 @@ write_double( FILE *fp, double d ) * Returns: 0 on success, or -1 on error. */ int -im_write_imask_name( INTMASK *m, const char *filename ) +im_write_imask_name( INTMASK *in, const char *filename ) { FILE *fp; int x, y, i; @@ -784,17 +780,17 @@ im_write_imask_name( INTMASK *m, const char *filename ) if( !(fp = open_write( filename )) ) return( -1 ); - if( write_line( fp, "%d %d", m->xsize, m->ysize ) ) { + if( write_line( fp, "%d %d", in->xsize, in->ysize ) ) { fclose( fp ); return( -1 ); } - if( m->scale != 1 || m->offset != 0 ) - write_line( fp, " %d %d", m->scale, m->offset ); + if( in->scale != 1 || in->offset != 0 ) + write_line( fp, " %d %d", in->scale, in->offset ); write_line( fp, "\n" ); - for( i = 0, y = 0; y < m->ysize; y++ ) { - for( x = 0; x < m->xsize; x++, i++ ) - write_line( fp, "%d ", m->coeff[i] ); + for( i = 0, y = 0; y < in->ysize; y++ ) { + for( x = 0; x < in->xsize; x++, i++ ) + write_line( fp, "%d ", in->coeff[i] ); if( write_line( fp, "\n" ) ) { fclose( fp ); @@ -808,7 +804,7 @@ im_write_imask_name( INTMASK *m, const char *filename ) /** * im_write_imask: - * @m: mask to write + * @in: mask to write * * Write an imask to a file. * @@ -817,19 +813,19 @@ im_write_imask_name( INTMASK *m, const char *filename ) * Returns: 0 on success, or -1 on error. */ int -im_write_imask( INTMASK *m ) +im_write_imask( INTMASK *in ) { - if( !m->filename ) { + if( !in->filename ) { im_error( "im_write_imask", "%s", _( "filename not set" ) ); return( -1 ); } - return( im_write_imask_name( m, m->filename ) ); + return( im_write_imask_name( in, in->filename ) ); } /** * im_write_dmask_name: - * @m: mask to write + * @in: mask to write * @filename: filename to write to * * Write a dmask to a file. See im_read_dmask() for a description of the mask @@ -840,7 +836,7 @@ im_write_imask( INTMASK *m ) * Returns: 0 on success, or -1 on error. */ int -im_write_dmask_name( DOUBLEMASK *m, const char *filename ) +im_write_dmask_name( DOUBLEMASK *in, const char *filename ) { FILE *fp; int x, y, i; @@ -848,21 +844,21 @@ im_write_dmask_name( DOUBLEMASK *m, const char *filename ) if( !(fp = open_write( filename )) ) return( -1 ); - if( write_line( fp, "%d %d", m->xsize, m->ysize ) ) { + if( write_line( fp, "%d %d", in->xsize, in->ysize ) ) { fclose( fp ); return( -1 ); } - if( m->scale != 1.0 || m->offset != 0.0 ) { + if( in->scale != 1.0 || in->offset != 0.0 ) { write_line( fp, " " ); - write_double( fp, m->scale ); + write_double( fp, in->scale ); write_line( fp, " " ); - write_double( fp, m->offset ); + write_double( fp, in->offset ); } write_line( fp, "\n" ); - for( i = 0, y = 0; y < m->ysize; y++ ) { - for( x = 0; x < m->xsize; x++, i++ ) - write_double( fp, m->coeff[i] ); + for( i = 0, y = 0; y < in->ysize; y++ ) { + for( x = 0; x < in->xsize; x++, i++ ) + write_double( fp, in->coeff[i] ); write_line( fp, " " ); if( write_line( fp, "\n" ) ) { @@ -877,7 +873,7 @@ im_write_dmask_name( DOUBLEMASK *m, const char *filename ) /** * im_write_dmask: - * @m: mask to write + * @in: mask to write * * Write a dmask to a file. See im_read_dmask() for a description of the mask * file format. @@ -887,14 +883,14 @@ im_write_dmask_name( DOUBLEMASK *m, const char *filename ) * Returns: 0 on success, or -1 on error. */ int -im_write_dmask( DOUBLEMASK *m ) +im_write_dmask( DOUBLEMASK *in ) { - if( !m->filename ) { + if( !in->filename ) { im_error( "im_write_dmask", "%s", _( "filename not set" ) ); return( -1 ); } - return( im_write_dmask_name( m, m->filename ) ); + return( im_write_dmask_name( in, in->filename ) ); } /* Copy an imask into a matrix. Only used internally by matrix package for @@ -953,24 +949,23 @@ im_copy_matrix_dmask( double **matrix, DOUBLEMASK *mask ) /** * im_print_imask: - * @m: mask to print + * @in: mask to print * * Print an imask to stdout. * * See also: im_print_dmask(). */ void -im_print_imask( INTMASK *m ) +im_print_imask( INTMASK *in ) { int i, j, k; - int *pm = m->coeff; printf( "%s: %d %d %d %d\n", - m->filename, m->xsize, m->ysize, m->scale, m->offset ); + in->filename, in->xsize, in->ysize, in->scale, in->offset ); - for( k = 0, j = 0; j < m->ysize; j++ ) { - for( i = 0; i < m->xsize; i++, k++ ) - printf( "%d\t", pm[k] ); + for( k = 0, j = 0; j < in->ysize; j++ ) { + for( i = 0; i < in->xsize; i++, k++ ) + printf( "%d\t", in->coeff[k] ); printf( "\n" ); } @@ -978,24 +973,23 @@ im_print_imask( INTMASK *m ) /** * im_print_dmask: - * @m: mask to print + * @in: mask to print * * Print a dmask to stdout. * * See also: im_print_imask(). */ void -im_print_dmask( DOUBLEMASK *m ) +im_print_dmask( DOUBLEMASK *in ) { int i, j, k; - double *pm = m->coeff; printf( "%s: %d %d %f %f\n", - m->filename, m->xsize, m->ysize, m->scale, m->offset ); + in->filename, in->xsize, in->ysize, in->scale, in->offset ); - for( k = 0, j = 0; j < m->ysize; j++ ) { - for( i = 0; i < m->xsize; i++, k++ ) - printf( "%f\t", pm[k] ); + for( k = 0, j = 0; j < in->ysize; j++ ) { + for( i = 0; i < in->xsize; i++, k++ ) + printf( "%f\t", in->coeff[k] ); printf( "\n" ); } @@ -1011,7 +1005,7 @@ im_print_dmask( DOUBLEMASK *m ) * * See also: im_local_imask(). * - * Returns: 0 on success, or -1 on error. + * Returns: the mask, or NULL on error. */ DOUBLEMASK * im_local_dmask( VipsImage *out, DOUBLEMASK *mask ) @@ -1038,7 +1032,7 @@ im_local_dmask( VipsImage *out, DOUBLEMASK *mask ) * * See also: im_local_dmask(). * - * Returns: 0 on success, or -1 on error. + * Returns: the mask, or NULL on error. */ INTMASK * im_local_imask( VipsImage *out, INTMASK *mask )