[gil] Indexed Images

Hi there, I'm playing around with indexed images in GIL. My starting point was an email from Lubomir during the review. Here is what I have: struct indexed_pixel_deref_fn { typedef pixel_traits<rgb8_pixel_t>::reference reference; typedef pixel_traits<rgb8_pixel_t>::const_reference const_reference; typedef const_reference const_t; typedef reference result_type; typedef rgb8_pixel_t value_type; static const bool is_mutable = false; indexed_pixel_deref_fn( rgb8_pixel_t* table ) : _table( table ) {} rgb8_pixel_t operator()( const gray8_pixel_t& index ) const { return _table[index[0]]; } rgb8_pixel_t* _table; }; typedef gray8_view_t::add_deref<indexed_pixel_deref_fn> indexed_factory_t; typedef indexed_factory_t::type rgb8_indexed_view_t; int _tmain(int argc, _TCHAR* argv[]) { // create color lookup table rgb8_pixel_t rgb_black( 0, 0, 0 ); rgb8_pixel_t rgb_red( 255, 0, 0 ); rgb8_pixel_t my_index_table[2]; my_index_table[0] = rgb_red; my_index_table[1] = rgb_black; // create indexed image gray8_image_t indexed_img( 10,10 ); fill_pixels( view( indexed_img ), unsigned char( 0 ) ); rgb8_indexed_view_t indexed_view= indexed_factory_t::make( view( indexed_img ) , indexed_pixel_deref_fn( &my_index_table[0] )); // color convert the indexed image into an rgb8 image rgb8_image_t rgb_img( indexed_img.dimensions() ); copy_pixels( color_converted_view<rgb8_pixel_t>( view( indexed_img )) , view( rgb_img ) ); // save image - it should be all red jpeg_write_view( "test.jpg", const_view( rgb_img )); return 0; } I'm not sure if all these typedefs in the deref functor class are correct. Esspecially, I don't know what the const_t is for. So, my problem is the operator() in my deref isn't called at all. That shows me there is something wrong. Anyone, any idea why? Thanks, Christian

Christian, I see two problems with this code. The obvious one is that you are not using indexed_view - this is why its operator() is not called :-) Use: copy_pixels( indexed_view, view( rgb_img )); The other problem is that your dereference adaptor returns pixels by value, so you must not define its reference type to be a pixel reference. The correct typedefs are: struct indexed_pixel_deref_fn { typedef indexed_pixel_deref_fn const_t; typedef rgb8_pixel_t value_type; typedef value_type reference; // returns by value! typedef value_type const_reference; typedef reference result_type; ... }; "const_t" is the type of the immutable equivalent of this type. Since your adaptor is immutable, it returns its own type. Lubomir
-----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] On Behalf Of Christian Henning Sent: Friday, November 10, 2006 7:05 AM To: boost@lists.boost.org; Christian Henning Subject: [boost] [gil] Indexed Images
Hi there, I'm playing around with indexed images in GIL. My starting point was an email from Lubomir during the review.
Here is what I have:
struct indexed_pixel_deref_fn { typedef pixel_traits<rgb8_pixel_t>::reference reference; typedef pixel_traits<rgb8_pixel_t>::const_reference const_reference;
typedef const_reference const_t; typedef reference result_type;
typedef rgb8_pixel_t value_type; static const bool is_mutable = false;
indexed_pixel_deref_fn( rgb8_pixel_t* table ) : _table( table ) {}
rgb8_pixel_t operator()( const gray8_pixel_t& index ) const { return _table[index[0]]; }
rgb8_pixel_t* _table; };
typedef gray8_view_t::add_deref<indexed_pixel_deref_fn> indexed_factory_t; typedef indexed_factory_t::type rgb8_indexed_view_t;
int _tmain(int argc, _TCHAR* argv[]) { // create color lookup table rgb8_pixel_t rgb_black( 0, 0, 0 ); rgb8_pixel_t rgb_red( 255, 0, 0 );
rgb8_pixel_t my_index_table[2]; my_index_table[0] = rgb_red; my_index_table[1] = rgb_black;
// create indexed image gray8_image_t indexed_img( 10,10 ); fill_pixels( view( indexed_img ), unsigned char( 0 ) );
rgb8_indexed_view_t indexed_view= indexed_factory_t::make( view( indexed_img ) , indexed_pixel_deref_fn( &my_index_table[0] ));
// color convert the indexed image into an rgb8 image rgb8_image_t rgb_img( indexed_img.dimensions() ); copy_pixels( color_converted_view<rgb8_pixel_t>( view( indexed_img )) , view( rgb_img ) );
// save image - it should be all red jpeg_write_view( "test.jpg", const_view( rgb_img ));
return 0; }
I'm not sure if all these typedefs in the deref functor class are correct. Esspecially, I don't know what the const_t is for.
So, my problem is the operator() in my deref isn't called at all. That shows me there is something wrong.
Anyone, any idea why?
Thanks, Christian _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
participants (2)
-
Christian Henning
-
Lubomir Bourdev