pixel.hppGo to the documentation of this file.00001 /* 00002 Copyright 2005-2007 Adobe Systems Incorporated 00003 00004 Use, modification and distribution are subject to the Boost Software License, 00005 Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 00006 http://www.boost.org/LICENSE_1_0.txt). 00007 00008 See http://opensource.adobe.com/gil for most recent version including documentation. 00009 */ 00010 /*************************************************************************************************/ 00011 00012 #ifndef GIL_PIXEL_H 00013 #define GIL_PIXEL_H 00014 00023 00024 #include <functional> 00025 #include <boost/utility/enable_if.hpp> 00026 #include <boost/mpl/bool.hpp> 00027 #include <boost/mpl/front.hpp> 00028 #include <boost/type_traits.hpp> 00029 #include "gil_config.hpp" 00030 #include "color_base.hpp" 00031 #include "gil_concept.hpp" 00032 #include "channel.hpp" 00033 #include "metafunctions.hpp" 00034 #include "utilities.hpp" 00035 #include "color_base_algorithm.hpp" 00036 00037 namespace boost { namespace gil { 00038 00039 // Forward-declare gray_t 00040 struct gray_color_t; 00041 typedef mpl::vector1<gray_color_t> gray_t; 00042 template <typename PixelBased> struct color_space_type; 00043 template <typename PixelBased> struct channel_mapping_type; 00044 template <typename PixelBased> struct channel_type; 00045 template <typename PixelBased> struct is_planar; 00046 00047 template <typename PixelBased> struct color_space_type<const PixelBased> : public color_space_type<PixelBased> {}; 00048 template <typename PixelBased> struct channel_mapping_type<const PixelBased> : public channel_mapping_type<PixelBased> {}; 00049 template <typename PixelBased> struct channel_type<const PixelBased> : public channel_type<PixelBased> {}; 00050 template <typename PixelBased> struct is_planar<const PixelBased> : public is_planar<PixelBased> {}; 00051 00052 00053 template <typename T> struct is_pixel : public mpl::false_{}; 00054 template <typename T> struct is_pixel<const T> : public is_pixel<T> {}; 00055 00058 template <typename PixelBased> 00059 struct num_channels : public mpl::size<typename color_space_type<PixelBased>::type> {}; 00060 00077 00078 00079 00080 00084 00100 00101 template <typename ChannelValue, typename Layout> // = mpl::range_c<int,0,ColorSpace::size> > 00102 struct pixel : public detail::homogeneous_color_base<ChannelValue,Layout,mpl::size<typename Layout::color_space_t>::value> { 00103 private: 00104 typedef ChannelValue channel_t; 00105 typedef detail::homogeneous_color_base<ChannelValue,Layout,mpl::size<typename Layout::color_space_t>::value> parent_t; 00106 public: 00107 typedef pixel value_type; 00108 typedef value_type& reference; 00109 typedef const value_type& const_reference; 00110 BOOST_STATIC_CONSTANT(bool, is_mutable = channel_traits<channel_t>::is_mutable); 00111 00112 pixel(){} 00113 explicit pixel(channel_t v) : parent_t(v) {} // sets all channels to v 00114 pixel(channel_t v0, channel_t v1) : parent_t(v0,v1) {} 00115 pixel(channel_t v0, channel_t v1, channel_t v2) : parent_t(v0,v1,v2) {} 00116 pixel(channel_t v0, channel_t v1, channel_t v2, channel_t v3) : parent_t(v0,v1,v2,v3) {} 00117 pixel(channel_t v0, channel_t v1, channel_t v2, channel_t v3, channel_t v4) : parent_t(v0,v1,v2,v3,v4) {} 00118 pixel(channel_t v0, channel_t v1, channel_t v2, channel_t v3, channel_t v4, channel_t v5) : parent_t(v0,v1,v2,v3,v4,v5) {} 00119 00120 pixel(const pixel& p) : parent_t(p) {} 00121 pixel& operator=(const pixel& p) { static_copy(p,*this); return *this; } 00122 00123 // Construct from another compatible pixel type 00124 template <typename Pixel> pixel(const Pixel& p, typename enable_if_c<is_pixel<Pixel>::value>::type* dummy = 0) : parent_t(p) { 00125 check_compatible<Pixel>(); 00126 } 00127 00128 template <typename P> pixel& operator=(const P& p) { assign(p, mpl::bool_<is_pixel<P>::value>()); return *this; } 00129 template <typename P> bool operator==(const P& p) const { return equal(p, mpl::bool_<is_pixel<P>::value>()); } 00130 00131 template <typename P> bool operator!=(const P& p) const { return !(*this==p); } 00132 00133 // homogeneous pixels have operator[] 00134 typename channel_traits<channel_t>::reference operator[](std::size_t i) { return dynamic_at_c(*this,i); } 00135 typename channel_traits<channel_t>::const_reference operator[](std::size_t i) const { return dynamic_at_c(*this,i); } 00136 private: 00137 template <typename Pixel> void assign(const Pixel& p, mpl::true_) { check_compatible<Pixel>(); static_copy(p,*this); } 00138 template <typename Pixel> bool equal(const Pixel& p, mpl::true_) const { check_compatible<Pixel>(); return static_equal(*this,p); } 00139 00140 template <typename Pixel> void check_compatible() const { gil_function_requires<PixelsCompatibleConcept<Pixel,pixel> >(); } 00141 00142 // Support for assignment/equality comparison of a channel with a grayscale pixel 00143 00144 private: 00145 static void check_gray() { BOOST_STATIC_ASSERT((is_same<typename Layout::color_space_t, gray_t>::value)); } 00146 template <typename Channel> void assign(const Channel& chan, mpl::false_) { check_gray(); at_c<0>(*this)=chan; } 00147 template <typename Channel> bool equal (const Channel& chan, mpl::false_) const { check_gray(); return at_c<0>(*this)==chan; } 00148 public: 00149 pixel& operator= (channel_t chan) { check_gray(); at_c<0>(*this)=chan; return *this; } 00150 bool operator==(channel_t chan) const { check_gray(); return at_c<0>(*this)==chan; } 00151 }; 00152 00154 // ColorBasedConcept 00156 00157 template <typename ChannelValue, typename Layout, int K> 00158 struct kth_element_type<pixel<ChannelValue,Layout>, K> { 00159 typedef ChannelValue type; 00160 }; 00161 00162 template <typename ChannelValue, typename Layout, int K> 00163 struct kth_element_reference_type<pixel<ChannelValue,Layout>, K> { 00164 typedef typename channel_traits<ChannelValue>::reference type; 00165 }; 00166 00167 template <typename ChannelValue, typename Layout, int K> 00168 struct kth_element_reference_type<const pixel<ChannelValue,Layout>, K> { 00169 typedef typename channel_traits<ChannelValue>::const_reference type; 00170 }; 00171 00172 template <typename ChannelValue, typename Layout, int K> 00173 struct kth_element_const_reference_type<pixel<ChannelValue,Layout>, K> { 00174 typedef typename channel_traits<ChannelValue>::const_reference type; 00175 }; 00176 00178 // PixelConcept 00180 00181 template <typename ChannelValue, typename Layout> 00182 struct is_pixel<pixel<ChannelValue,Layout> > : public mpl::true_{}; 00183 00185 // HomogeneousPixelBasedConcept 00187 00188 template <typename ChannelValue, typename Layout> 00189 struct color_space_type<pixel<ChannelValue,Layout> > { 00190 typedef typename Layout::color_space_t type; 00191 }; 00192 00193 template <typename ChannelValue, typename Layout> 00194 struct channel_mapping_type<pixel<ChannelValue,Layout> > { 00195 typedef typename Layout::channel_mapping_t type; 00196 }; 00197 00198 template <typename ChannelValue, typename Layout> 00199 struct is_planar<pixel<ChannelValue,Layout> > : public mpl::false_ {}; 00200 00201 template <typename ChannelValue, typename Layout> 00202 struct channel_type<pixel<ChannelValue,Layout> > { 00203 typedef ChannelValue type; 00204 }; 00205 00206 } } // namespace boost::gil 00207 00208 namespace boost { 00209 template <typename ChannelValue, typename Layout> 00210 struct has_trivial_constructor<gil::pixel<ChannelValue,Layout> > : public has_trivial_constructor<ChannelValue> {}; 00211 } 00212 #endif Generated on Sat May 2 13:50:14 2009 for Generic Image Library by 1.5.6 |