|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r84079 - in trunk: boost/gil/extension/toolbox/image_types libs/gil/toolbox/test
From: chhenning_at_[hidden]
Date: 2013-04-28 20:13:25
Author: chhenning
Date: 2013-04-28 20:13:24 EDT (Sun, 28 Apr 2013)
New Revision: 84079
URL: http://svn.boost.org/trac/boost/changeset/84079
Log:
Added support for different kinds of subchroma image types.
Text files modified:
trunk/boost/gil/extension/toolbox/image_types/subchroma_image.hpp | 117 ++++++++++++++++++++++++++++++---------
trunk/libs/gil/toolbox/test/subchroma_image.cpp | 99 ++++++++++++++++++++++++++-------
2 files changed, 166 insertions(+), 50 deletions(-)
Modified: trunk/boost/gil/extension/toolbox/image_types/subchroma_image.hpp
==============================================================================
--- trunk/boost/gil/extension/toolbox/image_types/subchroma_image.hpp (original)
+++ trunk/boost/gil/extension/toolbox/image_types/subchroma_image.hpp 2013-04-28 20:13:24 EDT (Sun, 28 Apr 2013)
@@ -19,6 +19,11 @@
///
////////////////////////////////////////////////////////////////////////////////////////
+#include <boost/mpl/divides.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/gil/image.hpp>
@@ -65,13 +70,18 @@
/// operator()
typename result_type operator()( const point_t& p ) const
{
+ typedef Scaling_Factors< mpl::at_c< Factors, 0 >::type::value
+ , mpl::at_c< Factors, 0 >::type::value
+ , mpl::at_c< Factors, 0 >::type::value
+ > scaling_factors_t;
+
plane_locator_t y = _y_locator.xy_at( p );
- plane_locator_t v = _v_locator.xy_at( p.x / mpl::at_c<Factors, 0>::type::value, p.y / mpl::at_c<Factors, 1>::type::value);
- plane_locator_t u = _u_locator.xy_at( p.x / mpl::at_c<Factors, 2>::type::value, p.y / mpl::at_c<Factors, 3>::type::value);
+ plane_locator_t v = _v_locator.xy_at( p.x / scaling_factors_t::ss_X, p.y / scaling_factors_t::ss_X );
+ plane_locator_t u = _u_locator.xy_at( p.x / scaling_factors_t::ss_X, p.y / scaling_factors_t::ss_X );
- return value_type( at_c<0>( *y )
- , at_c<0>( *v )
- , at_c<0>( *u )
+ return value_type( at_c< 0 >( *y )
+ , at_c< 0 >( *v )
+ , at_c< 0 >( *u )
);
}
@@ -114,15 +124,17 @@
///
////////////////////////////////////////////////////////////////////////////////////////
template< typename Locator
- , typename Factors = mpl::vector_c< int, 2, 2, 2, 2 >
+ , typename Factors = mpl::vector_c< int, 4, 4, 4 >
>
class subchroma_image_view : public image_view< Locator >
{
public:
- typedef typename Locator::deref_fn_t deref_fn_t;
+ typedef typename Locator locator_t;
+ typedef typename locator_t::deref_fn_t deref_fn_t;
typedef typename deref_fn_t::plane_locator_t plane_locator_t;
+
typedef subchroma_image_view const_t;
typedef image_view< plane_locator_t > plane_view_t;
@@ -134,10 +146,10 @@
/// constructor
subchroma_image_view( const point_t& y_dimensions
- , const point_t& v_dimensions
- , const point_t& u_dimensions
- , const Locator& locator
- )
+ , const point_t& v_dimensions
+ , const point_t& u_dimensions
+ , const Locator& locator
+ )
: image_view< Locator >( y_dimensions, locator )
, _y_dimensions( y_dimensions )
, _v_dimensions( v_dimensions )
@@ -179,6 +191,46 @@
point_t _u_dimensions;
};
+template< int J
+ , int a
+ , int b
+ >
+struct Scaling_Factors
+{
+ BOOST_STATIC_ASSERT(( mpl::equal_to< mpl::int_< J >, mpl::int_< 4 > >::type::value ));
+
+ BOOST_STATIC_ASSERT(( mpl::or_< mpl::equal_to< mpl::int_< a >, mpl::int_< 4 > >
+ , mpl::or_< mpl::equal_to< mpl::int_< a >, mpl::int_< 2 > >
+ , mpl::equal_to< mpl::int_< a >, mpl::int_< 1 > >
+ >
+ >::type::value
+ ));
+
+ BOOST_STATIC_ASSERT(( mpl::or_< mpl::equal_to< mpl::int_< b >, mpl::int_< 4 > >
+ , mpl::or_< mpl::equal_to< mpl::int_< b >, mpl::int_< 2 > >
+ , mpl::or_< mpl::equal_to< mpl::int_< b >, mpl::int_< 1 > >
+ , mpl::equal_to< mpl::int_< b >, mpl::int_< 0 > >
+ >
+ >
+ >::type::value
+ ));
+
+ BOOST_STATIC_CONSTANT( int, ss_X = ( mpl::divides< mpl::int_< J >
+ , mpl::int_< a >
+ >::type::value )
+ );
+
+ BOOST_STATIC_CONSTANT( int, ss_Y = ( mpl::if_< mpl::equal_to< mpl::int_< b >, mpl::int_< 0 > >
+ , mpl::int_< 2 >
+ , mpl::if_< mpl::equal_to< mpl::int_< a >, mpl::int_< b > >
+ , mpl::int_< 1 >
+ , mpl::int_< 4 >
+ >::type
+ >::type::value )
+ );
+};
+
+
////////////////////////////////////////////////////////////////////////////////////////
/// \ingroup ImageModel PixelBasedModel
@@ -188,11 +240,15 @@
///
////////////////////////////////////////////////////////////////////////////////////////
template< typename Pixel
- , typename Factors = mpl::vector_c< int, 2, 2, 2, 2 >
+ , typename Factors = mpl::vector_c< int, 4, 4, 4 >
, typename Allocator = std::allocator< unsigned char >
>
-class subchroma_image
+class subchroma_image : public Scaling_Factors< mpl::at_c< Factors, 0 >::type::value
+ , mpl::at_c< Factors, 1 >::type::value
+ , mpl::at_c< Factors, 2 >::type::value
+ >
{
+
public:
typedef typename channel_type< Pixel >::type channel_t;
@@ -222,9 +278,9 @@
subchroma_image( const x_coord_t y_width
, const y_coord_t y_height
)
- : _y_plane( y_width, y_height, 0, Allocator() )
- , _v_plane( y_width / mpl::at_c<Factors, 0>::type::value, y_height / mpl::at_c<Factors, 1>::type::value, 0, Allocator() )
- , _u_plane( y_width / mpl::at_c<Factors, 2>::type::value, y_height / mpl::at_c<Factors, 3>::type::value, 0, Allocator() )
+ : _y_plane( y_width, y_height, 0, Allocator() )
+ , _v_plane( y_width / ss_X, y_height / ss_Y, 0, Allocator() )
+ , _u_plane( y_width / ss_X, y_height / ss_Y, 0, Allocator() )
{
init( point_t( y_width, y_height ) );
}
@@ -305,9 +361,9 @@
{
typedef typename subchroma_image< Pixel, Factors >::plane_view_t::value_type channel_t;
- fill_pixels( view.y_plane_view(), channel_t( at_c<0>( value )));
- fill_pixels( view.v_plane_view(), channel_t( at_c<1>( value )));
- fill_pixels( view.u_plane_view(), channel_t( at_c<2>( value )));
+ fill_pixels( view.y_plane_view(), channel_t( at_c< 0 >( value )));
+ fill_pixels( view.v_plane_view(), channel_t( at_c< 1 >( value )));
+ fill_pixels( view.u_plane_view(), channel_t( at_c< 2 >( value )));
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -324,12 +380,17 @@
, unsigned char* y_base
)
{
+ typedef Scaling_Factors< mpl::at_c< Factors, 0 >::type::value
+ , mpl::at_c< Factors, 0 >::type::value
+ , mpl::at_c< Factors, 0 >::type::value
+ > scaling_factors_t;
+
std::size_t y_channel_size = 1;
std::size_t u_channel_size = 1;
unsigned char* u_base = y_base + ( y_width * y_height * y_channel_size );
- unsigned char* v_base = u_base + ( y_width / mpl::at_c<Factors, 2>::type::value )
- * ( y_height / mpl::at_c<Factors, 3>::type::value )
+ unsigned char* v_base = u_base + ( y_width / scaling_factors_t::ss_X )
+ * ( y_height / scaling_factors_t::ss_Y )
* u_channel_size;
typedef subchroma_image< Pixel, Factors >::plane_view_t plane_view_t;
@@ -340,14 +401,14 @@
, y_width // rowsize_in_bytes
);
- plane_view_t v_plane = interleaved_view( y_width / mpl::at_c<Factors, 0>::type::value
- , y_height / mpl::at_c<Factors, 1>::type::value
+ plane_view_t v_plane = interleaved_view( y_width / scaling_factors_t::ss_X
+ , y_height / scaling_factors_t::ss_Y
, (plane_view_t::value_type*) v_base // pixels
, y_width // rowsize_in_bytes
);
- plane_view_t u_plane = interleaved_view( y_width / mpl::at_c<Factors, 2>::type::value
- , y_height / mpl::at_c<Factors, 3>::type::value
+ plane_view_t u_plane = interleaved_view( y_width / scaling_factors_t::ss_X
+ , y_height / scaling_factors_t::ss_Y
, (plane_view_t::value_type*) u_base // pixels
, y_width // rowsize_in_bytes
);
@@ -377,9 +438,9 @@
, Factors
>::view_t view_t;
- return view_t( point_t( y_width, y_height )
- , point_t( y_width / mpl::at_c<Factors, 0>::type::value, y_height / mpl::at_c<Factors, 1>::type::value )
- , point_t( y_width / mpl::at_c<Factors, 2>::type::value, y_height / mpl::at_c<Factors, 3>::type::value )
+ return view_t( point_t( y_width, y_height )
+ , point_t( y_width / scaling_factors_t::ss_X, y_height / scaling_factors_t::ss_Y )
+ , point_t( y_width / scaling_factors_t::ss_X, y_height / scaling_factors_t::ss_Y )
, locator
);
}
Modified: trunk/libs/gil/toolbox/test/subchroma_image.cpp
==============================================================================
--- trunk/libs/gil/toolbox/test/subchroma_image.cpp (original)
+++ trunk/libs/gil/toolbox/test/subchroma_image.cpp 2013-04-28 20:13:24 EDT (Sun, 28 Apr 2013)
@@ -12,26 +12,74 @@
#include <boost/gil/extension/toolbox/color_spaces/ycbcr.hpp>
#include <boost/gil/extension/toolbox/image_types/subchroma_image.hpp>
-
using namespace std;
using namespace boost;
using namespace gil;
-BOOST_AUTO_TEST_SUITE( subchroma_image_test_suite )
+BOOST_AUTO_TEST_SUITE( toolbox_tests )
+
+template< int J, int a, int b >
+struct foo
+{
+ BOOST_STATIC_ASSERT(( mpl::equal_to< mpl::int_< J >, mpl::int_< 4 > >::type::value ));
+
+ BOOST_STATIC_ASSERT(( mpl::or_< mpl::equal_to< mpl::int_< a >, mpl::int_< 4 > >
+ , mpl::or_< mpl::equal_to< mpl::int_< a >, mpl::int_< 2 > >
+ , mpl::equal_to< mpl::int_< a >, mpl::int_< 1 > >
+ >
+ >::type::value
+ ));
+
+ BOOST_STATIC_ASSERT(( mpl::or_< mpl::equal_to< mpl::int_< b >, mpl::int_< 4 > >
+ , mpl::or_< mpl::equal_to< mpl::int_< b >, mpl::int_< 2 > >
+ , mpl::or_< mpl::equal_to< mpl::int_< b >, mpl::int_< 1 > >
+ , mpl::equal_to< mpl::int_< b >, mpl::int_< 0 > >
+ >
+ >
+ >::type::value
+ ));
+
+ BOOST_STATIC_CONSTANT( int, ss_X = ( mpl::divides< mpl::int_< J >
+ , mpl::int_< a >
+ >::type::value )
+ );
+
+ BOOST_STATIC_CONSTANT( int, ss_Y = ( mpl::if_< mpl::equal_to< mpl::int_< b >, mpl::int_< 0 > >
+ , mpl::int_< 2 >
+ , mpl::if_< mpl::equal_to< mpl::int_< a >, mpl::int_< b > >
+ , mpl::int_< 1 >
+ , mpl::int_< 4 >
+ >::type
+ >::type::value )
+ );
+};
+
BOOST_AUTO_TEST_CASE( subchroma_image_test )
{
- {
- ycbcr_601_8_pixel_t a( 10, 20, 30 );
- rgb8_pixel_t b;
- bgr8_pixel_t c;
-
- color_convert( a, b );
- color_convert( a, c );
- BOOST_ASSERT( static_equal( b, c ));
+ //{
+ // ycbcr_601_8_pixel_t a( 10, 20, 30 );
+ // rgb8_pixel_t b;
+ // bgr8_pixel_t c;
+
+ // color_convert( a, b );
+ // color_convert( a, c );
+ // BOOST_ASSERT( static_equal( b, c ));
+
+ // color_convert( b, a );
+ //}
+
+ //{
+ // ycbcr_709_8_pixel_t a( 10, 20, 30 );
+ // rgb8_pixel_t b;
+ // bgr8_pixel_t c;
+
+ // color_convert( a, b );
+ // color_convert( a, c );
+ // BOOST_ASSERT( static_equal( b, c ));
- color_convert( b, a );
- }
+ // color_convert( b, a );
+ //}
{
typedef rgb8_pixel_t pixel_t;
@@ -46,27 +94,34 @@
{
typedef rgb8_pixel_t pixel_t;
- typedef mpl::vector_c< int, 1, 1, 1, 1 > factors_t;
- typedef subchroma_image< pixel_t, factors_t > image_t;
- image_t img( 640, 480 );
+ subchroma_image< pixel_t, mpl::vector_c< int, 4, 4, 4 > > a( 640, 480 ); BOOST_STATIC_ASSERT(( a.ss_X == 1 && a.ss_Y == 1 ));
+ subchroma_image< pixel_t, mpl::vector_c< int, 4, 4, 0 > > b( 640, 480 ); BOOST_STATIC_ASSERT(( b.ss_X == 1 && b.ss_Y == 2 ));
+ subchroma_image< pixel_t, mpl::vector_c< int, 4, 2, 2 > > c( 640, 480 ); BOOST_STATIC_ASSERT(( c.ss_X == 2 && c.ss_Y == 1 ));
+ subchroma_image< pixel_t, mpl::vector_c< int, 4, 2, 0 > > d( 640, 480 ); BOOST_STATIC_ASSERT(( d.ss_X == 2 && d.ss_Y == 2 ));
+ subchroma_image< pixel_t, mpl::vector_c< int, 4, 1, 1 > > e( 640, 480 ); BOOST_STATIC_ASSERT(( e.ss_X == 4 && e.ss_Y == 1 ));
+ subchroma_image< pixel_t, mpl::vector_c< int, 4, 1, 0 > > f( 640, 480 ); BOOST_STATIC_ASSERT(( f.ss_X == 4 && f.ss_Y == 2 ));
+
+ fill_pixels( view( a ), pixel_t( 10, 20, 30 ) );
+ fill_pixels( view( b ), pixel_t( 10, 20, 30 ) );
+ fill_pixels( view( c ), pixel_t( 10, 20, 30 ) );
+ fill_pixels( view( d ), pixel_t( 10, 20, 30 ) );
+ fill_pixels( view( e ), pixel_t( 10, 20, 30 ) );
+ fill_pixels( view( f ), pixel_t( 10, 20, 30 ) );
- fill_pixels( view( img )
- , pixel_t( 10, 20, 30 )
- );
}
{
typedef ycbcr_601_8_pixel_t pixel_t;
- typedef mpl::vector_c< int, 2, 2, 2, 2 > factors_t;
- typedef subchroma_image< pixel_t > image_t;
+ typedef mpl::vector_c< int, 4, 2, 2 > factors_t;
+ typedef subchroma_image< pixel_t, factors_t > image_t;
std::size_t y_width = 640;
std::size_t y_height = 480;
std::size_t image_size = ( y_width * y_height )
- + ( y_width / mpl::at_c<factors_t, 0>::type::value ) * ( y_height / mpl::at_c<factors_t, 1>::type::value )
- + ( y_width / mpl::at_c<factors_t, 2>::type::value ) * ( y_height / mpl::at_c<factors_t, 3>::type::value );
+ + ( y_width / image_t::ss_X ) * ( y_height / image_t::ss_Y )
+ + ( y_width / image_t::ss_X ) * ( y_height / image_t::ss_Y );
vector< unsigned char > data( image_size );
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk