This commit is contained in:
John Cupitt 2010-04-29 11:49:41 +00:00
parent ae2ef9c04e
commit 936a89bf3e
3 changed files with 69 additions and 30 deletions

View File

@ -1,6 +1,10 @@
/* @(#) Pass VIPS images through CImg /* Pass VIPS images through CImg
* *
* JC, 15/10/07 * JC, 15/10/07
* 29/4/10
* - oop, should be smalltile, probably
* - tiny cleanups
* - gtkdoc
*/ */
/* /*
@ -189,6 +193,29 @@ typedef int (*generate_fn)( REGION *out, REGION **in,
IMAGE **im, Greyc *greyc ); IMAGE **im, Greyc *greyc );
// as a plain C function // as a plain C function
/**
* im_greyc_mask:
* @in: input image
* @out: output image
* @mask: input mask
* @iterations: number of iterations to perform (eg. 1)
* @amplitude: scaling factor (eg. 40)
* @sharpness: degree of sharpening to apply (eg. 0.9)
* @anisotropy: how much to blur along lines (eg. 0.15)
* @alpha: blur by this much before calculating geometry (eg. 0.6)
* @sigma: blur geometry by this much (eg. 1.1)
* @dl: spatial integration step (eg. 0.8)
* @da: angular integration step (eg. 30)
* @gauss_prec: precision (eg. 2)
* @interpolation: interpolation (eg. 0 for nearest-neighbour)
*
* This operation calls the blur_anisotropic() method of the CImag image
* processing library. It is handy for denoising images and for upscaling.
*
* See also: im_conv().
*
* Returns: 0 on success, -1 on error
*/
int int
im_greyc_mask( IMAGE *in, IMAGE *out, IMAGE *mask, im_greyc_mask( IMAGE *in, IMAGE *out, IMAGE *mask,
int iterations, int iterations,
@ -200,37 +227,24 @@ im_greyc_mask( IMAGE *in, IMAGE *out, IMAGE *mask,
IMAGE **arry; IMAGE **arry;
Greyc *greyc; Greyc *greyc;
if( im_piocheck( in, out ) ) if( im_piocheck( in, out ) ||
im_check_uncoded( "im_greyc_mask", in ) ||
im_check_u8or16orf( "im_greyc_mask", in ) )
return( -1 ); return( -1 );
if( in->Coding != IM_CODING_NONE ) {
im_error( "GREYCstoration", "%s", _( "uncoded only" ) );
return( -1 );
}
if( mask ) { if( mask ) {
if( mask->Coding != IM_CODING_NONE ) { if( im_pincheck( mask ) ||
im_error( "GREYCstoration", "%s", _( "uncoded only" ) ); im_check_uncoded( "im_greyc_mask", mask ) ||
im_check_size_same( "im_greyc_mask", in, mask ) ||
im_check_format( "im_greyc_mask",
mask, IM_BANDFMT_UCHAR ) )
return( -1 ); return( -1 );
}
if( mask->Xsize != in->Xsize ||
mask->Ysize != in->Ysize ) {
im_error( "GREYCstoration",
"%s", _( "mask size does not match input" ) );
return( -1 );
}
if( mask->BandFmt != IM_BANDFMT_UCHAR ) {
im_error( "GREYCstoration",
"%s", _( "mask must be uchar" ) );
return( -1 );
}
} }
im_cp_desc( out, in ); if( im_cp_desc( out, in ) ||
if( im_demand_hint( out, IM_FATSTRIP, in, NULL ) ) !(arry = im_allocate_input_array( out, in, mask, NULL )) ||
return( -1 ); !(greyc = IM_NEW( out, Greyc )) ||
if( !(arry = im_allocate_input_array( out, in, mask, NULL )) ) im_demand_hint( out, IM_SMALLTILE, in, NULL ) )
return( -1 ); return( -1 );
if( !(greyc = IM_NEW( out, Greyc )) )
return( -1 );
greyc->in = in; greyc->in = in;
greyc->out = out; greyc->out = out;
greyc->mask = mask; greyc->mask = mask;
@ -278,10 +292,7 @@ im_greyc_mask( IMAGE *in, IMAGE *out, IMAGE *mask,
break; break;
default: default:
im_error( "GREYCstoration", g_assert( 0 );
"%s", _( "unsupported type: "
"uchar, ushort and float only" ) );
return( -1 );
} }
return( 0 ); return( 0 );

View File

@ -62,6 +62,7 @@ int im_check_complex( const char *domain, IMAGE *im );
int im_check_format( const char *domain, IMAGE *im, VipsBandFmt fmt ); int im_check_format( const char *domain, IMAGE *im, VipsBandFmt fmt );
int im_check_u8or16( const char *domain, IMAGE *im ); int im_check_u8or16( const char *domain, IMAGE *im );
int im_check_8or16( const char *domain, IMAGE *im ); int im_check_8or16( const char *domain, IMAGE *im );
int im_check_u8or16orf( const char *domain, IMAGE *im );
int im_check_format_same( const char *domain, IMAGE *im1, IMAGE *im2 ); int im_check_format_same( const char *domain, IMAGE *im1, IMAGE *im2 );
int im_check_size_same( const char *domain, IMAGE *im1, IMAGE *im2 ); int im_check_size_same( const char *domain, IMAGE *im1, IMAGE *im2 );
int im_check_vector( const char *domain, int n, IMAGE *im ); int im_check_vector( const char *domain, int n, IMAGE *im );

View File

@ -920,6 +920,33 @@ im_check_u8or16( const char *domain, IMAGE *im )
return( 0 ); return( 0 );
} }
/**
* im_check_u8or16orf:
* @domain: the originating domain for the error message
* @im: image to check
*
* Check that the image is 8 or 16-bit unsigned integer, or float.
* Otherwise set an error message and return non-zero.
*
* See also: im_error().
*
* Returns: 0 if OK, -1 otherwise.
*/
int
im_check_u8or16orf( const char *domain, IMAGE *im )
{
if( im->BandFmt != IM_BANDFMT_UCHAR &&
im->BandFmt != IM_BANDFMT_USHORT &&
im->BandFmt != IM_BANDFMT_FLOAT ) {
im_error( domain, "%s",
_( "image must be 8- or 16-bit unsigned integer, "
"or float" ) );
return( -1 );
}
return( 0 );
}
/** /**
* im_check_size_same: * im_check_size_same:
* @domain: the originating domain for the error message * @domain: the originating domain for the error message