// // Copyright 2013 Krzysztof Czainski // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // #include #include #include #include #include #define BOOST_TEST_MODULE test_ext_numeric_numeric #include "unit_test.hpp" using namespace boost; using namespace gil; template < class F, class I > struct TestMapFn { using point_t = point; using result_type = point_t; result_type operator()(point const& src) const { F x = static_cast( src.x ) - 0.5; F y = static_cast( src.y ) - 0.5; return { x, y }; } }; namespace boost { namespace gil { // NOTE: I suggest this could be the default behavior: template struct mapping_traits; template < class F, class I > struct mapping_traits> { using result_type = typename TestMapFn::result_type; }; template inline point transform(TestMapFn const& mf, point const& src) { return mf(src); } }} // boost::gil BOOST_AUTO_TEST_SUITE(Numeric_Tests) BOOST_AUTO_TEST_CASE( pixel_numeric_operations_plus ) { rgb8_pixel_t a( 10, 20, 30 ); bgr8_pixel_t b( 30, 20, 10 ); pixel_plus_t< rgb8_pixel_t , bgr8_pixel_t , rgb8_pixel_t > op; rgb8_pixel_t c = op( a, b ); BOOST_ASSERT( get_color( c, red_t() ) == 20 ); BOOST_ASSERT( get_color( c, green_t() ) == 40 ); BOOST_ASSERT( get_color( c, blue_t() ) == 60 ); pixel_plus_t< rgb8_pixel_t , bgr8_pixel_t , bgr8_pixel_t > op2; bgr8_pixel_t d = op2( a, b ); BOOST_ASSERT( get_color( d, red_t() ) == 20 ); BOOST_ASSERT( get_color( d, green_t() ) == 40 ); BOOST_ASSERT( get_color( d, blue_t() ) == 60 ); } BOOST_AUTO_TEST_CASE( pixel_numeric_operations_multiply ) { rgb32f_pixel_t a( 1.f, 2.f, 3.f ); bgr32f_pixel_t b( 2.f, 2.f, 2.f ); pixel_multiply_t< rgb32f_pixel_t , bgr32f_pixel_t , rgb32f_pixel_t > op; rgb32f_pixel_t c = op( a, b ); float epsilon = 1e-6f; BOOST_CHECK_CLOSE( static_cast( get_color( c, red_t() )), 2.f, epsilon ); BOOST_CHECK_CLOSE( static_cast( get_color( c, green_t() )), 4.f, epsilon ); BOOST_CHECK_CLOSE( static_cast( get_color( c, blue_t() )), 6.f, epsilon ); } BOOST_AUTO_TEST_CASE( pixel_numeric_operations_divide ) { // integer { rgb8_pixel_t a( 10, 20, 30 ); bgr8_pixel_t b( 2, 2, 2 ); pixel_divide_t< rgb8_pixel_t , bgr8_pixel_t , rgb8_pixel_t > op; rgb32f_pixel_t c = op( a, b ); BOOST_ASSERT( get_color( c, red_t() ) == 5 ); BOOST_ASSERT( get_color( c, green_t() ) == 10 ); BOOST_ASSERT( get_color( c, blue_t() ) == 15 ); } // float { rgb32f_pixel_t a( 1.f, 2.f, 3.f ); bgr32f_pixel_t b( 2.f, 2.f, 2.f ); pixel_divide_t< rgb32f_pixel_t , bgr32f_pixel_t , rgb32f_pixel_t > op; rgb32f_pixel_t c = op( a, b ); float epsilon = 1e-6f; BOOST_CHECK_CLOSE( static_cast< float >( get_color( c, red_t() )), 0.5f, epsilon ); BOOST_CHECK_CLOSE( static_cast< float >( get_color( c, green_t() )), 1.f, epsilon ); BOOST_CHECK_CLOSE( static_cast< float >( get_color( c, blue_t() )), 1.5f, epsilon ); } } BOOST_AUTO_TEST_CASE(bilinear_sampler_test) { // R G B // G W R // B R G rgb8_image_t img(3,3); rgb8_view_t v = view(img); v(0,0) = v(1,2) = v(2,1) = rgb8_pixel_t(128,0,0); v(0,1) = v(1,0) = v(2,2) = rgb8_pixel_t(0,128,0); v(0,2) = v(2,0) = rgb8_pixel_t(0,0,128); v(1,1) = rgb8_pixel_t(128,128,128); rgb8_image_t dimg(4,4); rgb8c_view_t dv = const_view(dimg); TestMapFn mf; resample_pixels(const_view(img), view(dimg), mf, bilinear_sampler()); BOOST_ASSERT(rgb8_pixel_t(128,0,0) == dv(0,0)); BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(0,1)); BOOST_ASSERT(rgb8_pixel_t(0,64,64) == dv(0,2)); BOOST_ASSERT(rgb8_pixel_t(0,0,128) == dv(0,3)); BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(1,0)); BOOST_ASSERT(rgb8_pixel_t(64,96,32) == dv(1,1)); BOOST_ASSERT(rgb8_pixel_t(64,64,64) == dv(1,2)); BOOST_ASSERT(rgb8_pixel_t(64,0,64) == dv(1,3)); BOOST_ASSERT(rgb8_pixel_t(0,64,64) == dv(2,0)); BOOST_ASSERT(rgb8_pixel_t(64,64,64) == dv(2,1)); BOOST_ASSERT(rgb8_pixel_t(96,64,32) == dv(2,2)); BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(2,3)); BOOST_ASSERT(rgb8_pixel_t(0,0,128) == dv(3,0)); BOOST_ASSERT(rgb8_pixel_t(64,0,64) == dv(3,1)); BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(3,2)); BOOST_ASSERT(rgb8_pixel_t(0,128,0) == dv(3,3)); } BOOST_AUTO_TEST_SUITE_END()