8 #ifndef BOOST_GIL_IO_ROW_BUFFER_HELPER_HPP 9 #define BOOST_GIL_IO_ROW_BUFFER_HELPER_HPP 12 #include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp> 13 #include <boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp> 14 #include <boost/gil/extension/toolbox/metafunctions/pixel_bit_size.hpp> 16 #include <boost/gil/io/typedefs.hpp> 18 #include <boost/mpl/and.hpp> 21 #include <type_traits> 24 namespace boost {
namespace gil {
namespace detail {
26 template<
typename Pixel
27 ,
typename DummyT =
void 29 struct row_buffer_helper
31 using element_t = Pixel;
32 using buffer_t = std::vector<element_t>;
33 using iterator_t =
typename buffer_t::iterator;
35 row_buffer_helper( std::size_t width
38 : _row_buffer( width )
41 element_t* data() {
return &_row_buffer[0]; }
43 iterator_t begin() {
return _row_buffer.begin(); }
44 iterator_t end() {
return _row_buffer.end(); }
46 buffer_t& buffer() {
return _row_buffer; }
53 template <
typename Pixel>
54 struct row_buffer_helper
57 typename
std::enable_if
59 is_bit_aligned<Pixel>::value
63 using element_t = byte_t;
64 using buffer_t = std::vector<element_t>;
65 using pixel_type = Pixel;
66 using iterator_t = bit_aligned_pixel_iterator<pixel_type>;
68 row_buffer_helper(std::size_t width,
bool in_bytes)
69 : _c{( width * pixel_bit_size< pixel_type >::value) >> 3}
70 , _r{width * pixel_bit_size< pixel_type >::value - (_c << 3)}
74 _row_buffer.resize(width);
79 _row_buffer.resize(_c + (_r != 0));
83 element_t* data() {
return &_row_buffer[0]; }
85 iterator_t begin() {
return iterator_t( &_row_buffer.front(),0 ); }
86 iterator_t end() {
return _r == 0 ? iterator_t( &_row_buffer.back() + 1, 0 )
87 : iterator_t( &_row_buffer.back() , (int) _r );
90 buffer_t& buffer() {
return _row_buffer; }
102 buffer_t _row_buffer;
105 template<
typename Pixel>
106 struct row_buffer_helper
109 typename
std::enable_if
113 typename is_bit_aligned<Pixel>::type,
114 typename is_homogeneous<Pixel>::type
119 using element_t = byte_t;
120 using buffer_t = std::vector<element_t>;
121 using pixel_type = Pixel;
122 using iterator_t = bit_aligned_pixel_iterator<pixel_type>;
124 row_buffer_helper( std::size_t width
128 * num_channels< pixel_type >::value
129 * channel_type< pixel_type >::type::num_bits
135 * num_channels< pixel_type >::value
136 * channel_type< pixel_type >::type::num_bits
142 _row_buffer.resize( width );
147 _row_buffer.resize( _c + ( _r!=0 ));
151 element_t* data() {
return &_row_buffer[0]; }
153 iterator_t begin() {
return iterator_t( &_row_buffer.front(),0 ); }
154 iterator_t end() {
return _r == 0 ? iterator_t( &_row_buffer.back() + 1, 0 )
155 : iterator_t( &_row_buffer.back() , (int) _r );
158 buffer_t& buffer() {
return _row_buffer; }
170 buffer_t _row_buffer;
173 template <
typename View,
typename D =
void>
174 struct row_buffer_helper_view : row_buffer_helper<typename View::value_type>
176 row_buffer_helper_view(std::size_t width,
bool in_bytes)
177 : row_buffer_helper<typename View::value_type>(width, in_bytes)
181 template <
typename View>
182 struct row_buffer_helper_view
185 typename
std::enable_if
187 is_bit_aligned<typename View::value_type>::value
189 > : row_buffer_helper<typename View::reference>
191 row_buffer_helper_view(std::size_t width,
bool in_bytes)
192 : row_buffer_helper<typename View::reference>(width, in_bytes)
Definition: algorithm.hpp:30
Definition: algorithm.hpp:127