vsqbs tweaks

This commit is contained in:
Nicolas Robidoux 2010-05-29 19:32:27 +00:00
parent 07b0775ae3
commit 4ebdb94c7f
1 changed files with 63 additions and 47 deletions

View File

@ -1,7 +1,8 @@
/* vertex split subdivision followed by quadratic b-spline smoothing /* vertex split subdivision followed by quadratic b-spline smoothing
* *
* C. Racette 23-28/05/2010 * C. Racette 23-28/05/2010 based on code by N. Robidoux and J. Cupitt
* *
* N. Robidoux 29/05/2010
*/ */
/* /*
@ -35,8 +36,8 @@
* 2010 (c) Chantal Racette, Nicolas Robidoux, John Cupitt. * 2010 (c) Chantal Racette, Nicolas Robidoux, John Cupitt.
* *
* Nicolas Robidoux thanks Adam Turcotte, Geert Jordaens, Ralf Meyer, * Nicolas Robidoux thanks Adam Turcotte, Geert Jordaens, Ralf Meyer,
* Øyvind Kolås, Minglun Gong, Eric Daoust and Sven Neumann for useful * Øyvind Kolås, Minglun Gong and Eric Daoust for useful comments and
* comments and code. * code.
* *
* Chantal Racette's image resampling research and programming funded * Chantal Racette's image resampling research and programming funded
* in part by a NSERC Discovery Grant awarded to Julien Dompierre * in part by a NSERC Discovery Grant awarded to Julien Dompierre
@ -91,7 +92,7 @@ typedef struct _VipsInterpolateVsqbsClass {
* sampling point is to the bottom right of dos_two. * sampling point is to the bottom right of dos_two.
* *
* The following code and picture assumes that the stencil reflexion * The following code and picture assumes that the stencil reflexion
* has already been performed. * has already been performed. (X is the sampling location.)
* *
* *
* (ix,iy-1) (ix+1,iy-1) * (ix,iy-1) (ix+1,iy-1)
@ -108,10 +109,9 @@ typedef struct _VipsInterpolateVsqbsClass {
* = tre_one = tre_two = tre_thr * = tre_one = tre_two = tre_thr
* *
* *
* (X is the sampling location.) * The above input pixel values are the ones needed in order to
* * IMPLICITLY make available the following values, needed by quadratic
* The above input pixel values are the ones needed in order to make * B-Splines, which is performed on (shifted) double density data:
* available the following values, needed by quadratic B-Splines:
* *
* *
* uno_one_1 = uno_two_1 = uno_thr_1 = * uno_one_1 = uno_two_1 = uno_thr_1 =
@ -218,46 +218,62 @@ vsqbs( const double fou_coef_uno_two,
const double twiceysq = twicey * y; \ const double twiceysq = twicey * y; \
const double fourysq = twiceysq + twiceysq; \ const double fourysq = twiceysq + twiceysq; \
\ \
const double spline_end_x = twicexsq - twicex + .5; \ const double spl_end_x = twicexsq - twicex + .5; \
const double spline_mid_x = -fourxsq + twicex + .5; \ const double spl_mid_x = -fourxsq + twicex + .5; \
const double spline_beg_x = twicexsq; \ const double spl_beg_x = twicexsq; \
\ \
const double spline_end_y = twiceysq - twicey + .5; \ const double spl_end_y = twiceysq - twicey + .5; \
const double spline_mid_y = -fourysq + twicey + .5; \ const double spl_mid_y = -fourysq + twicey + .5; \
const double spline_beg_y = twiceysq; \ const double spl_beg_y = twiceysq; \
\ \
const double spline_end_x_end_y = spline_end_x * spline_end_y; \ const double spl_end_x_end_y = spl_end_x * spl_end_y; \
const double spline_end_x_mid_y = spline_end_x * spline_mid_y; \ const double spl_end_x_mid_y = spl_end_x * spl_mid_y; \
const double spline_end_x_beg_y = spline_end_x * spline_beg_y; \ const double spl_end_x_beg_y = spl_end_x * spl_beg_y; \
\ \
const double spline_mid_x_end_y = spline_mid_x * spline_end_y; \ const double spl_mid_x_end_y = spl_mid_x * spl_end_y; \
const double spline_mid_x_mid_y = spline_mid_x * spline_mid_y; \ const double spl_mid_x_mid_y = spl_mid_x * spl_mid_y; \
const double spline_mid_x_beg_y = spline_mid_x * spline_beg_y; \ const double spl_mid_x_beg_y = spl_mid_x * spl_beg_y; \
\ \
const double spline_beg_x_end_y = spline_beg_x * spline_end_y; \ const double spl_beg_x_end_y = spl_beg_x * spl_end_y; \
const double spline_beg_x_mid_y = spline_beg_x * spline_mid_y; \ const double spl_beg_x_mid_y = spl_beg_x * spl_mid_y; \
const double spline_beg_x_beg_y = spline_beg_x * spline_beg_y; \ const double spl_beg_x_beg_y = spl_beg_x * spl_beg_y; \
\ \
\ \
const double fou_coef_uno_two = spline_end_x_end_y + spline_mid_x_end_y; \ const double fou_coef_uno_two = spl_end_x_end_y + spl_mid_x_end_y; \
const double fou_coef_uno_thr = spline_beg_x_end_y; \ const double fou_coef_uno_thr = spl_beg_x_end_y; \
const double fou_coef_dos_one = spline_end_x_end_y + spline_end_x_mid_y; \ const double fou_coef_dos_one = spl_end_x_end_y + spl_end_x_mid_y; \
const double fou_coef_tre_one = spline_end_x_beg_y; \ const double fou_coef_tre_one = spl_end_x_beg_y; \
\ \
const double spline_beg_x_mid_y_p_mid_x_beg_y = spline_beg_x_mid_y + spline_mid_x_beg_y; \ const double spl_beg_x_mid_y_p_mid_x_beg_y = \
const double spline_end_x_mid_y_p_mid_x_mid_y = spline_end_x_mid_y + spline_mid_x_mid_y; \ spl_beg_x_mid_y + spl_mid_x_beg_y; \
const double spline_end_x_beg_y_p_mid_x_beg_y = spline_end_x_beg_y + spline_mid_x_beg_y; \ const double spl_end_x_mid_y_p_mid_x_mid_y = \
const double spline_beg_x_end_y_p_beg_x_mid_y = spline_beg_x_end_y + spline_beg_x_mid_y; \ spl_end_x_mid_y + spl_mid_x_mid_y; \
const double spl_end_x_beg_y_p_mid_x_beg_y = \
spl_end_x_beg_y + spl_mid_x_beg_y; \
const double spl_beg_x_end_y_p_beg_x_mid_y = \
spl_beg_x_end_y + spl_beg_x_mid_y; \
\ \
const double fou_coef_tre_thr = spline_beg_x_mid_y_p_mid_x_beg_y + \ const double fou_coef_tre_thr = \
spline_beg_x_beg_y + spline_beg_x_beg_y; \ spl_beg_x_mid_y_p_mid_x_beg_y + \
const double fou_coef_tre_two = spline_end_x_mid_y_p_mid_x_mid_y + \ spl_beg_x_beg_y + spl_beg_x_beg_y; \
spline_end_x_beg_y_p_mid_x_beg_y + spline_end_x_beg_y_p_mid_x_beg_y + spline_beg_x_beg_y; \ const double fou_coef_tre_two = \
const double fou_coef_dos_thr = spline_beg_x_end_y_p_beg_x_mid_y + \ spl_end_x_mid_y_p_mid_x_mid_y + \
spline_beg_x_end_y_p_beg_x_mid_y + spline_mid_x_end_y + spline_mid_x_mid_y + spline_beg_x_beg_y; \ spl_end_x_beg_y_p_mid_x_beg_y + \
const double fou_coef_dos_two = fou_coef_uno_two + fou_coef_uno_two + \ spl_end_x_beg_y_p_mid_x_beg_y + \
spline_beg_x_end_y_p_beg_x_mid_y + spline_end_x_mid_y_p_mid_x_mid_y + \ spl_beg_x_beg_y; \
spline_end_x_mid_y_p_mid_x_mid_y + spline_end_x_beg_y_p_mid_x_beg_y; \ const double fou_coef_dos_thr = \
spl_beg_x_end_y_p_beg_x_mid_y + \
spl_beg_x_end_y_p_beg_x_mid_y + \
spl_mid_x_end_y + \
spl_mid_x_mid_y + \
spl_beg_x_beg_y; \
const double fou_coef_dos_two = \
fou_coef_uno_two + \
fou_coef_uno_two + \
spl_beg_x_end_y_p_beg_x_mid_y + \
spl_end_x_mid_y_p_mid_x_mid_y + \
spl_end_x_mid_y_p_mid_x_mid_y + \
spl_end_x_beg_y_p_mid_x_beg_y; \
\ \
int band = bands; \ int band = bands; \
\ \
@ -298,7 +314,7 @@ VSQBS_CONVERSION( nosign )
#define CALL( T, conversion ) \ #define CALL( T, conversion ) \
vsqbs_ ## conversion<T>( out, \ vsqbs_ ## conversion<T>( out, \
p, \ p, \
bands, \ bands, \
lskip, \ lskip, \
@ -317,10 +333,10 @@ extern "C" {
static void static void
vips_interpolate_vsqbs_interpolate( VipsInterpolate* restrict interpolate, vips_interpolate_vsqbs_interpolate( VipsInterpolate* restrict interpolate,
PEL* restrict out, PEL* restrict out,
REGION* restrict in, REGION* restrict in,
double absolute_x, double absolute_x,
double absolute_y ) double absolute_y )
{ {
/* /*
* Floor's surrogate FAST_PSEUDO_FLOOR is used to make sure that the * Floor's surrogate FAST_PSEUDO_FLOOR is used to make sure that the
@ -407,8 +423,8 @@ vips_interpolate_vsqbs_interpolate( VipsInterpolate* restrict interpolate,
static void static void
vips_interpolate_vsqbs_class_init( VipsInterpolateVsqbsClass *klass ) vips_interpolate_vsqbs_class_init( VipsInterpolateVsqbsClass *klass )
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS( klass ); GObjectClass *gobject_class = G_OBJECT_CLASS( klass );
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( klass ); VipsObjectClass *object_class = VIPS_OBJECT_CLASS( klass );
VipsInterpolateClass *interpolate_class = VIPS_INTERPOLATE_CLASS( klass ); VipsInterpolateClass *interpolate_class = VIPS_INTERPOLATE_CLASS( klass );
gobject_class->set_property = vips_object_set_property; gobject_class->set_property = vips_object_set_property;