From d044802d1ee7d86d20107c8a6eb03aad29cdaafe Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Tue, 27 Jan 2009 15:03:08 +0000 Subject: [PATCH] stuff --- libsrc/mosaicing/nohalo.cpp | 390 +++++++++++++++++++++++++++++------- 1 file changed, 313 insertions(+), 77 deletions(-) diff --git a/libsrc/mosaicing/nohalo.cpp b/libsrc/mosaicing/nohalo.cpp index 28c2e17a..8503e508 100644 --- a/libsrc/mosaicing/nohalo.cpp +++ b/libsrc/mosaicing/nohalo.cpp @@ -547,11 +547,17 @@ nohalo_sharp_level_1( *r3 = four_times_trequa_thrfou; } -/* Float/double version. +/* Call nohalo1, with an interpolator as a param. */ -template static void inline -nohalo_sharp_level_1_float( PEL *pout, const PEL *pin, - const int bands, const int lskip, +template +static void inline +nohalo_sharp_level_1_interpolate( PEL *pout, const PEL *pin, const int bands, + const int pskip, const int lskip, const double w_times_z, const double x_times_z_over_2, const double w_times_y_over_2, @@ -560,7 +566,7 @@ nohalo_sharp_level_1_float( PEL *pout, const PEL *pin, T* restrict out = (T *) pout; const T* restrict in = (T *) pin; - const int b1 = bands; + const int b1 = pskip; const int b2 = 2 * b1; const int b3 = 3 * b1; const int b4 = 4 * b1; @@ -571,7 +577,75 @@ nohalo_sharp_level_1_float( PEL *pout, const PEL *pin, const int l4 = 4 * l1; for( int z = 0; z < bands; z++ ) { + const T dos_thr = in[b2 + l1]; + const T dos_fou = in[b3 + l1]; + const T tre_two = in[b1 + l2]; + const T tre_thr = in[b2 + l2]; + const T tre_fou = in[b3 + l2]; + const T tre_fiv = in[b4 + l2]; + + const T qua_two = in[b1 + l3]; + const T qua_thr = in[b2 + l3]; + const T qua_fou = in[b3 + l3]; + const T qua_fiv = in[b4 + l3]; + + const T cin_thr = in[b2 + l4]; + const T cin_fou = in[b3 + l4]; + + double two_times_tre_thrfou; + double two_times_trequa_thr; + double four_times_trequa_thrfou; + + nohalo_sharp_level_1( + dos_thr, dos_fou, + tre_two, tre_thr, tre_fou, tre_fiv, + qua_two, qua_thr, qua_fou, qua_fiv, + cin_thr, cin_fou, + &two_times_tre_thrfou, + &two_times_trequa_thr, + &four_times_trequa_thrfou ); + + const T result = interpolate( + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4, + tre_thr, + two_times_tre_thrfou, + two_times_trequa_thr, + four_times_trequa_thrfou ); + + out[z] = result; + + in += 1; + } +} + +/* Float/double version. + */ +template static void inline +nohalo_sharp_level_1_float( PEL *pout, const PEL *pin, const int bands, + const int pskip, const int lskip, + const double w_times_z, + const double x_times_z_over_2, + const double w_times_y_over_2, + const double x_times_y_over_4 ) +{ + T* restrict out = (T *) pout; + const T* restrict in = (T *) pin; + + const int b1 = pskip; + const int b2 = 2 * b1; + const int b3 = 3 * b1; + const int b4 = 4 * b1; + + const int l1 = lskip; + const int l2 = 2 * l1; + const int l3 = 3 * l1; + const int l4 = 4 * l1; + + for( int z = 0; z < bands; z++ ) { const T dos_thr = in[b2 + l1]; const T dos_fou = in[b3 + l1]; @@ -611,10 +685,147 @@ nohalo_sharp_level_1_float( PEL *pout, const PEL *pin, two_times_trequa_thr, four_times_trequa_thrfou ); - *out = result; + out[z] = result; + + in += 1; + } +} + +/* Signed int version. + */ +template static void inline +nohalo_sharp_level_1_signed( PEL *pout, const PEL *pin, const int bands, + const int pskip, const int lskip, + const double w_times_z, + const double x_times_z_over_2, + const double w_times_y_over_2, + const double x_times_y_over_4 ) +{ + T* restrict out = (T *) pout; + const T* restrict in = (T *) pin; + + const int b1 = pskip; + const int b2 = 2 * b1; + const int b3 = 3 * b1; + const int b4 = 4 * b1; + + const int l1 = lskip; + const int l2 = 2 * l1; + const int l3 = 3 * l1; + const int l4 = 4 * l1; + + for( int z = 0; z < bands; z++ ) { + const T dos_thr = in[b2 + l1]; + const T dos_fou = in[b3 + l1]; + + const T tre_two = in[b1 + l2]; + const T tre_thr = in[b2 + l2]; + const T tre_fou = in[b3 + l2]; + const T tre_fiv = in[b4 + l2]; + + const T qua_two = in[b1 + l3]; + const T qua_thr = in[b2 + l3]; + const T qua_fou = in[b3 + l3]; + const T qua_fiv = in[b4 + l3]; + + const T cin_thr = in[b2 + l4]; + const T cin_fou = in[b3 + l4]; + + double two_times_tre_thrfou; + double two_times_trequa_thr; + double four_times_trequa_thrfou; + + nohalo_sharp_level_1( + dos_thr, dos_fou, + tre_two, tre_thr, tre_fou, tre_fiv, + qua_two, qua_thr, qua_fou, qua_fiv, + cin_thr, cin_fou, + &two_times_tre_thrfou, + &two_times_trequa_thr, + &four_times_trequa_thrfou ); + + const T result = bilinear_signed( + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4, + tre_thr, + two_times_tre_thrfou, + two_times_trequa_thr, + four_times_trequa_thrfou ); + + out[z] = result; + + in += 1; + } +} + +/* Unsigned int version. + */ +template static void inline +nohalo_sharp_level_1_unsigned( PEL *pout, const PEL *pin, const int bands, + const int pskip, const int lskip, + const double w_times_z, + const double x_times_z_over_2, + const double w_times_y_over_2, + const double x_times_y_over_4 ) +{ + T* restrict out = (T *) pout; + const T* restrict in = (T *) pin; + + const int b1 = pskip; + const int b2 = 2 * b1; + const int b3 = 3 * b1; + const int b4 = 4 * b1; + + const int l1 = lskip; + const int l2 = 2 * l1; + const int l3 = 3 * l1; + const int l4 = 4 * l1; + + for( int z = 0; z < bands; z++ ) { + const T dos_thr = in[b2 + l1]; + const T dos_fou = in[b3 + l1]; + + const T tre_two = in[b1 + l2]; + const T tre_thr = in[b2 + l2]; + const T tre_fou = in[b3 + l2]; + const T tre_fiv = in[b4 + l2]; + + const T qua_two = in[b1 + l3]; + const T qua_thr = in[b2 + l3]; + const T qua_fou = in[b3 + l3]; + const T qua_fiv = in[b4 + l3]; + + const T cin_thr = in[b2 + l4]; + const T cin_fou = in[b3 + l4]; + + double two_times_tre_thrfou; + double two_times_trequa_thr; + double four_times_trequa_thrfou; + + nohalo_sharp_level_1( + dos_thr, dos_fou, + tre_two, tre_thr, tre_fou, tre_fiv, + qua_two, qua_thr, qua_fou, qua_fiv, + cin_thr, cin_fou, + &two_times_tre_thrfou, + &two_times_trequa_thr, + &four_times_trequa_thrfou ); + + const T result = bilinear_unsigned( + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4, + tre_thr, + two_times_tre_thrfou, + two_times_trequa_thr, + four_times_trequa_thrfou ); + + out[z] = result; in += 1; - out += 1; } } @@ -729,26 +940,6 @@ vips_interpolate_nohalo_interpolate( VipsInterpolate *interpolate, #ifdef DEBUG - /* And test that all of the bytes we look at are within the window. - */ - const int other_x = target_x + 4 * sign_of_relative_x; - const int other_y = target_y + 4 * sign_of_relative_y; - - const PEL * restrict q = - (PEL *) IM_REGION_ADDR( in, other_x, other_y ); - - printf( "vips_interpolate_nohalo_interpolate:\n" ); - printf( "\tabsolute_x = %g, absolute_y = %g\n", - absolute_x, absolute_y ); - printf( "\ttarget_x = %d, target_y = %d\n", - target_x, target_y ); - printf( "\tother_x = %d, other_y = %d\n", - other_x, other_y ); - printf( "\tp = %p, q = %p\n", p, q ); - printf( "\tshift_1_pixel = %s, shift_1_row = %s\n", - shift_1_pixel, shift_1_row ); -#endif /*DEBUG*/ - { /* Top-left corner of our window. */ @@ -762,82 +953,124 @@ vips_interpolate_nohalo_interpolate( VipsInterpolate *interpolate, /* Last pixel we address. */ - const PEL * restrict last = p + 4 * shift_1_pixel + 4 * shift_1_row; + const PEL * restrict last = p + + IM_IMAGE_SIZEOF_ELEMENT( in->im ) * ( + 4 * shift_1_pixel + + 4 * shift_1_row + ); g_assert( last >= tl ); g_assert( last <= br ); } +#endif /*DEBUG*/ + +#define CALL( T, inter ) \ + nohalo_sharp_level_1_interpolate>( \ + out, p, \ + channels_per_pixel, shift_1_pixel, shift_1_row, \ + w_times_z, \ + x_times_z_over_2, \ + w_times_y_over_2, \ + x_times_y_over_4 ); switch( in->im->BandFmt ) { - /* case IM_BANDFMT_UCHAR: - nohalo_unsigned( out, p, - shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); + //CALL( unsigned char, bilinear_unsigned ); + + nohalo_sharp_level_1_interpolate >( + out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); + break; case IM_BANDFMT_CHAR: - nohalo_signed( out, p, - shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); - break; - - case IM_BANDFMT_USHORT: - nohalo_unsigned( out, p, - shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); - break; - - case IM_BANDFMT_SHORT: - nohalo_signed( out, p, - shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); - break; - - case IM_BANDFMT_UINT: - nohalo_unsigned( out, p, - shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); - break; - - case IM_BANDFMT_INT: - nohalo_signed( out, p, - shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); - break; - */ - - case IM_BANDFMT_FLOAT: - nohalo_sharp_level_1_float( out, p, - shift_1_pixel, shift_1_row, + nohalo_sharp_level_1_signed( out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); + break; + + case IM_BANDFMT_USHORT: + nohalo_sharp_level_1_signed( out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); + break; + + case IM_BANDFMT_SHORT: + nohalo_sharp_level_1_signed( out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); + break; + + case IM_BANDFMT_UINT: + nohalo_sharp_level_1_signed( out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); + break; + + case IM_BANDFMT_INT: + nohalo_sharp_level_1_signed( out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); + break; + + case IM_BANDFMT_FLOAT: + nohalo_sharp_level_1_float( out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, w_times_z, x_times_z_over_2, w_times_y_over_2, x_times_y_over_4 ); break; - /* case IM_BANDFMT_DOUBLE: - nohalo_float( out, p, - shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); + nohalo_sharp_level_1_float( out, p, + channels_per_pixel, shift_1_pixel, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); break; case IM_BANDFMT_COMPLEX: - nohalo_float( out, p, - 2 * shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); + nohalo_sharp_level_1_float( out, p, + channels_per_pixel * 2, shift_1_pixel * 2, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); break; case IM_BANDFMT_DPCOMPLEX: - nohalo_float( out, p, - 2 * shift_1_pixel, shift_1_row, - w_times_z, x_times_z, w_times_y, x_times_y ); + nohalo_sharp_level_1_float( out, p, + channels_per_pixel * 2, shift_1_pixel * 2, shift_1_row, + w_times_z, + x_times_z_over_2, + w_times_y_over_2, + x_times_y_over_4 ); break; - */ default: + g_assert( 0 ); break; } } @@ -854,7 +1087,10 @@ vips_interpolate_nohalo_class_init( VipsInterpolateNohaloClass *klass ) interpolate_class->interpolate = vips_interpolate_nohalo_interpolate; - interpolate_class->window_size = 5; + + /* Should be 5, but round-to-nearest FIXME above makes this 7. + */ + interpolate_class->window_size = 7; } static void