diff --git a/ChangeLog b/ChangeLog index ee71bb77..7c04c5a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,7 +4,7 @@ - fix no-pango build - add im_vips2dz(): run the deepzoom writer from vips7 - vips_magickload() has an option to read all images in a sequence -- im_make_xy() -> vips_xyz() +- redo im_make_xy(), im_*eye() as classes 12/3/13 started 7.33.0 - vipsthumbnail lets you specify the sharpening mask diff --git a/libvips/create/Makefile.am b/libvips/create/Makefile.am index d0152552..a1fa20eb 100644 --- a/libvips/create/Makefile.am +++ b/libvips/create/Makefile.am @@ -2,12 +2,12 @@ noinst_LTLIBRARIES = libcreate.la libcreate_la_SOURCES = \ create.c \ + eye.c \ xyz.c \ black.c \ text.c \ gaussnoise.c \ im_benchmark.c \ - im_eye.c \ im_grey.c \ im_sines.c \ im_zone.c \ diff --git a/libvips/create/create.c b/libvips/create/create.c index c9129aca..ae39a909 100644 --- a/libvips/create/create.c +++ b/libvips/create/create.c @@ -104,6 +104,7 @@ vips_create_operation_init( void ) extern GType vips_text_get_type( void ); #endif /*HAVE_PANGOFT2*/ extern GType vips_xyz_get_type( void ); + extern GType vips_eye_get_type( void ); vips_black_get_type(); vips_gaussnoise_get_type(); @@ -111,5 +112,6 @@ vips_create_operation_init( void ) vips_text_get_type(); #endif /*HAVE_PANGOFT2*/ vips_xyz_get_type(); + vips_eye_get_type(); } diff --git a/libvips/create/eye.c b/libvips/create/eye.c new file mode 100644 index 00000000..82c170d9 --- /dev/null +++ b/libvips/create/eye.c @@ -0,0 +1,223 @@ +/* make a test pattern to show the eye's frequency response + * + * Copyright: 1990, 1991, N.Dessipris. + * + * Author N. Dessipris + * Written on 30/05/1990 + * Updated on: 27/01/1991, 07/03/1991, + * 22/7/93 JC + * - im_outcheck() added + * 30/8/95 JC + * - modernized + * 1/2/11 + * - gtk-doc + * 13/6/13 + * - redo as a class + */ + +/* + + 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., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +/* +#define VIPS_DEBUG + */ + +#ifdef HAVE_CONFIG_H +#include +#endif /*HAVE_CONFIG_H*/ +#include + +#include +#include +#include +#include + +#include + +#include "create.h" + +typedef struct _VipsEye { + VipsCreate parent_instance; + + int width; + int height; + + double factor; + gboolean uchar; + +} VipsEye; + +typedef VipsCreateClass VipsEyeClass; + +G_DEFINE_TYPE( VipsEye, vips_eye, VIPS_TYPE_CREATE ); + +static int +vips_eye_gen( VipsRegion *or, void *seq, void *a, void *b, + gboolean *stop ) +{ + VipsEye *eye = (VipsEye *) a; + VipsRect *r = &or->valid; + int le = r->left; + int to = r->top; + int ri = VIPS_RECT_RIGHT( r ); + int bo = VIPS_RECT_BOTTOM( r ); + + double c = eye->factor * VIPS_PI / (2 * (eye->width - 1)); + double h = ((eye->height - 1) * (eye->height - 1)); + + int x, y; + + for( y = to; y < bo; y++ ) { + float *q = (float *) VIPS_REGION_ADDR( or, le, y ); + + for( x = le; x < ri; x++ ) + q[x] = y * y * cos( c * x * x ) / h; + } + + return( 0 ); +} + +static int +vips_eye_build( VipsObject *object ) +{ + VipsCreate *create = VIPS_CREATE( object ); + VipsEye *eye = (VipsEye *) object; + VipsImage **t = (VipsImage **) vips_object_local_array( object, 7 ); + VipsImage *in; + + if( VIPS_OBJECT_CLASS( vips_eye_parent_class )->build( object ) ) + return( -1 ); + + t[0] = vips_image_new(); + vips_image_init_fields( t[0], + eye->width, eye->height, 1, + VIPS_FORMAT_FLOAT, VIPS_CODING_NONE, VIPS_INTERPRETATION_B_W, + 1.0, 1.0 ); + vips_demand_hint( t[0], + VIPS_DEMAND_STYLE_ANY, NULL ); + if( vips_image_generate( t[0], + NULL, vips_eye_gen, NULL, eye, NULL ) ) + return( -1 ); + + in = t[0]; + if( eye->uchar ) { + if( vips_linear1( in, &t[1], 127.5, 127.5, NULL ) || + vips_cast( t[1], &t[2], VIPS_FORMAT_UCHAR, NULL ) ) + return( -1 ); + in = t[2]; + } + + if( vips_image_write( in, create->out ) ) + return( -1 ); + + return( 0 ); +} + +static void +vips_eye_class_init( VipsEyeClass *class ) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS( class ); + VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class ); + + gobject_class->set_property = vips_object_set_property; + gobject_class->get_property = vips_object_get_property; + + vobject_class->nickname = "eye"; + vobject_class->description = _( "make a eye image" ); + vobject_class->build = vips_eye_build; + + VIPS_ARG_INT( class, "width", 4, + _( "Width" ), + _( "Image width in pixels" ), + VIPS_ARGUMENT_REQUIRED_INPUT, + G_STRUCT_OFFSET( VipsEye, width ), + 1, 1000000, 1 ); + + VIPS_ARG_INT( class, "height", 5, + _( "Height" ), + _( "Image height in pixels" ), + VIPS_ARGUMENT_REQUIRED_INPUT, + G_STRUCT_OFFSET( VipsEye, height ), + 1, 1000000, 1 ); + + VIPS_ARG_DOUBLE( class, "factor", 6, + _( "Factor" ), + _( "Maximum spatial frequency" ), + VIPS_ARGUMENT_OPTIONAL_INPUT, + G_STRUCT_OFFSET( VipsEye, factor ), + 0.0, 1.0, 0.5 ); + + VIPS_ARG_BOOL( class, "uchar", 7, + _( "Uchar" ), + _( "Output an unsigned char image" ), + VIPS_ARGUMENT_OPTIONAL_INPUT, + G_STRUCT_OFFSET( VipsEye, uchar ), + FALSE ); + +} + +static void +vips_eye_init( VipsEye *eye ) +{ + eye->factor = 0.5; +} + + +/** + * vips_eye: + * @out: output image + * @xsize: image size + * @ysize: image size + * @...: %NULL-terminated list of optional named arguments + * + * Optional arguments: + * + * @factor: maximum spatial frequency + * @uchar: output a uchar image + * + * Create a test pattern with increasing spatial frequence in X and + * amplitude in Y. @factor should be between 0 and 1 and determines the + * maximum spatial frequency. + * + * Set @uchar to output a uchar image. + * + * See also: vips_zone(). + * + * Returns: 0 on success, -1 on error + */ +int +vips_eye( VipsImage **out, int width, int height, ... ) +{ + va_list ap; + int result; + + va_start( ap, height ); + result = vips_call_split( "eye", ap, out, width, height ); + va_end( ap ); + + return( result ); +} diff --git a/libvips/create/im_eye.c b/libvips/create/im_eye.c deleted file mode 100644 index 8e789d0b..00000000 --- a/libvips/create/im_eye.c +++ /dev/null @@ -1,149 +0,0 @@ -/* make a test pattern to show the eye's frequency response - * - * Copyright: 1990, 1991, N.Dessipris. - * - * Author N. Dessipris - * Written on 30/05/1990 - * Updated on: 27/01/1991, 07/03/1991, - * 22/7/93 JC - * - im_outcheck() added - * 30/8/95 JC - * - modernized - * 1/2/11 - * - gtk-doc - */ - -/* - - 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., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA - - */ - -/* - - These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk - - */ - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ -#include - -#include -#include -#include - -#include - -/** - * im_feye: - * @out: output image - * @xsize: image size - * @ysize: image size - * @factor: image size - * - * Create a test pattern with increasing spatial frequence in X and - * amplitude in Y. @factor should be between 0 and 1 and determines the - * maximum spatial frequency. - * - * Creates an one band float image with values in +1 to -1. - * - * See also: im_eye(). - * - * Returns: 0 on success, -1 on error - */ -int -im_feye( IMAGE *out, const int xsize, const int ysize, const double factor ) -{ - int x, y; - double constant; - double *lut; - float *line; - - /* Check input args - */ - if( im_outcheck( out ) ) - return( -1 ); - if( factor > 1.0 || factor <= 0.0 ) { - im_error( "im_feye", "%s", _( "factor should be in [1,0)" ) ); - return( -1 ); - } - - /* Set image descriptor - */ - im_initdesc( out, xsize, ysize, 1, IM_BBITS_FLOAT, IM_BANDFMT_FLOAT, - IM_CODING_NONE, IM_TYPE_B_W, 1.0, 1.0, 0, 0 ); - if( im_setupout( out ) ) - return( -1 ); - - /* Allocate space for line buffer. - */ - if( !(line = IM_ARRAY( out, xsize, float )) ) - return( -1 ); - - /* Make a lut for easy calculations. - */ - if( !(lut = IM_ARRAY( out, xsize, double )) ) - return( -1 ); - constant = factor * IM_PI / (2 * (xsize - 1)); - for( x = 0; x < xsize; x++ ) - lut[x] = cos( constant * x * x ) / ((ysize - 1) * (ysize - 1)); - - /* Make image. - */ - for( y = 0; y < ysize; y++ ) { - for( x = 0; x < xsize; x++ ) - line[x] = y * y * lut[x]; - if( im_writeline( y, out, (VipsPel *) line ) ) - return( -1 ); - } - - return( 0 ); -} - -/** - * im_eye: - * @out: output image - * @xsize: image size - * @ysize: image size - * @factor: image size - * - * Exactly as im_feye(), but make a UCHAR image with pixels in the range [0, - * 255]. - * - * See also: im_feye(). - * - * Returns: 0 on success, -1 on error - */ -int -im_eye( IMAGE *out, const int xsize, const int ysize, const double factor ) -{ - IMAGE *t[2]; - - /* Change range to [0,255]. - */ - if( im_open_local_array( out, t, 2, "im_grey", "p" ) || - im_feye( t[0], xsize, ysize, factor ) || - im_lintra( 127.5, t[0], 127.5, t[1] ) || - im_clip2fmt( t[1], out, IM_BANDFMT_UCHAR ) ) - return( -1 ); - - return( 0 ); -} - diff --git a/libvips/deprecated/vips7compat.c b/libvips/deprecated/vips7compat.c index c3137c30..4f418f45 100644 --- a/libvips/deprecated/vips7compat.c +++ b/libvips/deprecated/vips7compat.c @@ -2363,6 +2363,43 @@ im_shrink( VipsImage *in, VipsImage *out, double xshrink, double yshrink ) return( 0 ); } +int +im_eye( IMAGE *out, const int xsize, const int ysize, const double factor ) +{ + VipsImage *x; + + if( vips_eye( &x, xsize, ysize, + "factor", factor, + "uchar", TRUE, + NULL ) ) + return( -1 ); + if( im_copy( x, out ) ) { + g_object_unref( x ); + return( -1 ); + } + g_object_unref( x ); + + return( 0 ); +} + +int +im_feye( IMAGE *out, const int xsize, const int ysize, const double factor ) +{ + VipsImage *x; + + if( vips_eye( &x, xsize, ysize, + "factor", factor, + NULL ) ) + return( -1 ); + if( im_copy( x, out ) ) { + g_object_unref( x ); + return( -1 ); + } + g_object_unref( x ); + + return( 0 ); +} + int im_rightshift_size( IMAGE *in, IMAGE *out, int xshift, int yshift, int band_fmt ) diff --git a/libvips/include/vips/create.h b/libvips/include/vips/create.h index 07ee6faa..f8213138 100644 --- a/libvips/include/vips/create.h +++ b/libvips/include/vips/create.h @@ -48,6 +48,8 @@ int vips_text( VipsImage **out, const char *text, ... ) __attribute__((sentinel)); int vips_gaussnoise( VipsImage **out, int width, int height, ... ) __attribute__((sentinel)); +int vips_eye( VipsImage **out, int width, int height, ... ) + __attribute__((sentinel)); @@ -55,10 +57,6 @@ int vips_gaussnoise( VipsImage **out, int width, int height, ... ) int im_grey( VipsImage *out, const int xsize, const int ysize ); int im_fgrey( VipsImage *out, const int xsize, const int ysize ); -int im_feye( VipsImage *out, - const int xsize, const int ysize, const double factor ); -int im_eye( VipsImage *out, - const int xsize, const int ysize, const double factor ); int im_zone( VipsImage *out, int size ); int im_fzone( VipsImage *out, int size ); int im_sines( VipsImage *out, diff --git a/libvips/include/vips/vips7compat.h b/libvips/include/vips/vips7compat.h index 1c5b9df1..da4a3bbd 100644 --- a/libvips/include/vips/vips7compat.h +++ b/libvips/include/vips/vips7compat.h @@ -741,6 +741,11 @@ int im_rot270( VipsImage *in, VipsImage *out ); int im_ifthenelse( VipsImage *c, VipsImage *a, VipsImage *b, VipsImage *out ); int im_blend( VipsImage *c, VipsImage *a, VipsImage *b, VipsImage *out ); +int im_feye( VipsImage *out, + const int xsize, const int ysize, const double factor ); +int im_eye( VipsImage *out, + const int xsize, const int ysize, const double factor ); + DOUBLEMASK *im_vips2mask( VipsImage *in, const char *filename ); int im_mask2vips( DOUBLEMASK *in, VipsImage *out );