typedef void (*VipsInterpolateMethod)( VipsInterpolate *,
PEL *out, REGION *in, double x, double y );
typedef struct _VipsInterpolateClass {
VipsObjectClass parent_class;
VipsInterpolateMethod interpolate;
int (*get_window_size)( VipsInterpolate * );
int window_size;
} VipsInterpolateClass;
void vips_interpolate( VipsInterpolate *interpolate,
PEL *out, REGION *in, double x, double y );
VipsInterpolateMethod vips_interpolate_get_method( VipsInterpolate * );
int vips_interpolate_get_window_size( VipsInterpolate *interpolate );
VipsInterpolate *vips_interpolate_nearest_static( void );
VipsInterpolate *vips_interpolate_bilinear_static( void );
VipsInterpolate *vips_interpolate_bicubic_static( void );
VipsInterpolate *vips_interpolate_new( const char *nickname );
vips_interpolate(3) looks up the interpolate method for the object and calls it for you.
vips_interpolate_get_method(3) just does the lookup and returns a pointer to the interpolate function. You can use this to take the lookup out of an inner loop.
vips_interpolate_get_window_size(3) either calls get_window_size() or if it is NULL, returns window_size.
vips_interpolate_nearest_static(3), vips_interpolate_bilinear_static(3) and vips_interpolate_bicubic_static(3) are convenience functions which return a pointer to a static instance of a nearest-neighbour, bilinear and bicubic interpolator. You can pass these to any function which needs a VipsInterpolator as an argument. No need to free the result.
vips_interpolate_new(3) is a convenience function which makes an interpolator from a nickname. Free the result with g_object_unref(3) when you're done with it.
You can list the supported interpolators with
$ vips --list classes
look for subclasses of VipsInterpolate.