reduce.hpp

Go 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_REDUCE_HPP
00013 #define GIL_REDUCE_HPP
00014 
00015 #include <boost/mpl/insert_range.hpp>
00016 #include <boost/mpl/range_c.hpp>
00017 #include <boost/mpl/vector_c.hpp>
00018 #include <boost/mpl/back.hpp>
00019 #include <boost/mpl/vector.hpp>
00020 #include <boost/mpl/long.hpp>
00021 #include <boost/mpl/logical.hpp>
00022 #include <boost/mpl/transform.hpp>
00023 #include <boost/mpl/insert.hpp>
00024 #include <boost/mpl/transform.hpp>
00025 
00026 #include "../../metafunctions.hpp"
00027 #include "../../typedefs.hpp"
00028 #include "dynamic_at_c.hpp"
00029 
00038 
00039 
00040 #ifdef GIL_REDUCE_CODE_BLOAT
00041 
00042 
00043 // Max number of cases in the cross-expension of binary operation for it to be reduced as unary
00044 #define GIL_BINARY_REDUCE_LIMIT 226
00045 
00046 namespace boost { namespace mpl {
00047 
00056 
00057 template <typename SrcTypes, typename DstTypes>
00058 struct mapping_vector {};
00059 
00060 template <typename SrcTypes, typename DstTypes, long K>
00061 struct at_c<mapping_vector<SrcTypes,DstTypes>, K> {
00062     static const std::size_t value=size<DstTypes>::value - order<DstTypes, typename at_c<SrcTypes,K>::type>::type::value +1;
00063     typedef size_t<value> type;
00064 };
00065 
00066 template <typename SrcTypes, typename DstTypes>
00067 struct size<mapping_vector<SrcTypes,DstTypes> > {
00068     typedef typename size<SrcTypes>::type type;
00069     static const std::size_t value=type::value;
00070 };
00071 
00080 
00081 namespace detail {
00082     template <typename SFirst, std::size_t NLeft>
00083     struct copy_to_vector_impl {
00084     private:
00085         typedef typename deref<SFirst>::type T;
00086         typedef typename next<SFirst>::type next;
00087         typedef typename copy_to_vector_impl<next, NLeft-1>::type rest;
00088     public:
00089         typedef typename push_front<rest, T>::type type;
00090     };
00091 
00092     template <typename SFirst> 
00093     struct copy_to_vector_impl<SFirst,1> {
00094         typedef vector<typename deref<SFirst>::type> type;
00095     };
00096 }
00097 
00098 template <typename Src>
00099 struct copy_to_vector {
00100     typedef typename detail::copy_to_vector_impl<typename begin<Src>::type, size<Src>::value>::type type;
00101 };
00102 
00103 template <>
00104 struct copy_to_vector<set<> > {
00105     typedef vector0<> type;
00106 };
00107 
00108 } } // boost::mpl
00109 
00110 namespace boost { namespace gil {
00111 
00112 
00120 
00121 
00122 
00123 
00133 
00134 template <typename Types, typename Op>
00135 struct unary_reduce_impl {
00136     typedef typename mpl::transform<Types, detail::reduce<Op, mpl::_1> >::type reduced_t;
00137     typedef typename mpl::copy<reduced_t, mpl::inserter<mpl::set<>, mpl::insert<mpl::_1,mpl::_2> > >::type unique_t;
00138     static const bool is_single=mpl::size<unique_t>::value==1;
00139 };
00140 
00141 template <typename Types, typename Op, bool IsSingle=unary_reduce_impl<Types,Op>::is_single>
00142 struct unary_reduce : public unary_reduce_impl<Types,Op> {
00143     typedef typename unary_reduce_impl<Types,Op>::reduced_t reduced_t;
00144     typedef typename unary_reduce_impl<Types,Op>::unique_t unique_t;
00145 
00146     static unsigned short inline map_index(std::size_t index) {
00147         typedef typename mpl::mapping_vector<reduced_t, unique_t> indices_t;
00148         return gil::at_c<indices_t, unsigned short>(index);
00149     }
00150     template <typename Bits> GIL_FORCEINLINE static typename Op::result_type applyc(const Bits& bits, std::size_t index, Op op) {
00151         return apply_operation_basec<unique_t>(bits,map_index(index),op);
00152     }
00153 
00154     template <typename Bits> GIL_FORCEINLINE static typename Op::result_type apply(Bits& bits, std::size_t index, Op op) {
00155         return apply_operation_base<unique_t>(bits,map_index(index),op);
00156     }
00157 };
00158 
00159 template <typename Types, typename Op>
00160 struct unary_reduce<Types,Op,true> : public unary_reduce_impl<Types,Op> {
00161     typedef typename unary_reduce_impl<Types,Op>::unique_t unique_t;
00162     static unsigned short inline map_index(std::size_t index) { return 0; }
00163 
00164     template <typename Bits> GIL_FORCEINLINE static typename Op::result_type applyc(const Bits& bits, std::size_t index, Op op) {
00165         return op(*gil_reinterpret_cast_c<const typename mpl::front<unique_t>::type*>(&bits));
00166     }
00167 
00168     template <typename Bits> GIL_FORCEINLINE static typename Op::result_type apply(Bits& bits, std::size_t index, Op op) {
00169         return op(*gil_reinterpret_cast<typename       mpl::front<unique_t>::type*>(&bits));
00170     }
00171 };
00172 
00173 
00186 
00187 namespace detail {
00188     struct pair_generator {
00189         template <typename Vec2> struct apply {
00190             typedef std::pair<const typename mpl::at_c<Vec2,0>::type*, const typename mpl::at_c<Vec2,1>::type*> type;
00191         };
00192     };
00193 
00194     // When the types are not too large, applies reduce on their cross product
00195     template <typename Unary1, typename Unary2, typename Op, bool IsComplex>
00196     struct binary_reduce_impl {
00197     //private:
00198         typedef typename mpl::copy_to_vector<typename Unary1::unique_t>::type vec1_types;
00199         typedef typename mpl::copy_to_vector<typename Unary2::unique_t>::type vec2_types;
00200 
00201         typedef mpl::cross_vector<mpl::vector2<vec1_types, vec2_types>, pair_generator> BIN_TYPES;
00202         typedef unary_reduce<BIN_TYPES,Op> bin_reduced_t;
00203         
00204         static unsigned short inline map_index(std::size_t index1, std::size_t index2) {
00205             unsigned short r1=Unary1::map_index(index1);
00206             unsigned short r2=Unary2::map_index(index2);
00207             return bin_reduced_t::map_index(r2*mpl::size<vec1_types>::value + r1);
00208         }
00209     public:
00210         typedef typename bin_reduced_t::unique_t unique_t;
00211 
00212         template <typename Bits1, typename Bits2>
00213         static typename Op::result_type inline apply(const Bits1& bits1, std::size_t index1, const Bits2& bits2, std::size_t index2, Op op) {
00214             std::pair<const void*,const void*> pr(&bits1, &bits2);
00215             return apply_operation_basec<unique_t>(pr, map_index(index1,index2),op);
00216         }
00217     };
00218 
00219     // When the types are large performs a double-dispatch. Binary reduction is not done.
00220     template <typename Unary1, typename Unary2, typename Op>
00221     struct binary_reduce_impl<Unary1,Unary2,Op,true> {
00222         template <typename Bits1, typename Bits2>
00223         static typename Op::result_type inline apply(const Bits1& bits1, std::size_t index1, const Bits2& bits2, std::size_t index2, Op op) {
00224             return apply_operation_base<Unary1::unique_t,Unary2::unique_t>(bits1, index1, bits2, index2, op);
00225         }
00226     };
00227 }
00228 
00229 
00230 template <typename Types1, typename Types2, typename Op>
00231 struct binary_reduce {
00232 //private:
00233     typedef unary_reduce<Types1,Op> unary1_t;
00234     typedef unary_reduce<Types2,Op> unary2_t;
00235 
00236     static const std::size_t CROSS_SIZE = mpl::size<typename unary1_t::unique_t>::value * 
00237                                           mpl::size<typename unary2_t::unique_t>::value;
00238 
00239     typedef detail::binary_reduce_impl<unary1_t,unary2_t,Op, (CROSS_SIZE>GIL_BINARY_REDUCE_LIMIT)> impl;
00240 public:
00241     template <typename Bits1, typename Bits2>
00242     static typename Op::result_type inline apply(const Bits1& bits1, std::size_t index1, const Bits2& bits2, std::size_t index2, Op op) {
00243         return impl::apply(bits1,index1,bits2,index2,op);
00244     }
00245 };
00246 
00247 template <typename Types, typename UnaryOp>
00248 GIL_FORCEINLINE typename UnaryOp::result_type apply_operation(variant<Types>& arg, UnaryOp op) {
00249     return unary_reduce<Types,UnaryOp>::template apply(arg._bits, arg._index ,op);
00250 }
00251 
00252 template <typename Types, typename UnaryOp>
00253 GIL_FORCEINLINE typename UnaryOp::result_type apply_operation(const variant<Types>& arg, UnaryOp op) {
00254     return unary_reduce<Types,UnaryOp>::template applyc(arg._bits, arg._index ,op);
00255 }
00256 
00257 template <typename Types1, typename Types2, typename BinaryOp>
00258 GIL_FORCEINLINE typename BinaryOp::result_type apply_operation(const variant<Types1>& arg1, const variant<Types2>& arg2, BinaryOp op) {    
00259     return binary_reduce<Types1,Types2,BinaryOp>::template apply(arg1._bits, arg1._index, arg2._bits, arg2._index, op);
00260 }
00261 
00262 #undef GIL_BINARY_REDUCE_LIMIT
00263 
00264 } }  // namespace gil
00265 
00266 
00267 namespace boost { namespace mpl {
00286 
00287 template <typename VecOfVecs, typename TypeGen>
00288 struct cross_vector {};
00289 
00292 template <typename VecOfVecs, typename TypeGen, std::size_t K>
00293 struct cross_iterator {
00294     typedef mpl::random_access_iterator_tag category;
00295 };
00296 
00300 
00306 template <typename VecOfVecs, typename TypeGen, std::size_t K>
00307 struct deref<cross_iterator<VecOfVecs,TypeGen,K> > {
00308 private:
00309     typedef typename detail::select_subvector_c<VecOfVecs, K>::type DerefTypes;
00310 public:
00311     typedef typename TypeGen::template apply<DerefTypes>::type type;
00312 };
00313 
00316 template <typename VecOfVecs, typename TypeGen, std::size_t K>
00317 struct next<cross_iterator<VecOfVecs,TypeGen,K> > {
00318     typedef cross_iterator<VecOfVecs,TypeGen,K+1> type;
00319 };
00320 
00323 template <typename VecOfVecs, typename TypeGen, std::size_t K>
00324 struct prior<cross_iterator<VecOfVecs,TypeGen,K> > {
00325     typedef cross_iterator<VecOfVecs,TypeGen,K-1> type;
00326 };
00327 
00330 template <typename VecOfVecs, typename TypeGen, std::size_t K, typename Distance>
00331 struct advance<cross_iterator<VecOfVecs,TypeGen,K>, Distance > {
00332     typedef cross_iterator<VecOfVecs,TypeGen,K+Distance::value> type;
00333 };
00334 
00337 // (shortened the names of the template arguments - otherwise doxygen cannot parse this...)
00338 template <typename VecOfVecs, typename TypeGen, std::size_t K1, std::size_t K2>
00339 struct distance<cross_iterator<VecOfVecs,TypeGen,K1>, cross_iterator<VecOfVecs,TypeGen,K2> > {
00340     typedef size_t<K2-K1> type;
00341 };
00342 
00348 template <typename VecOfVecs, typename TypeGen>
00349 struct size<cross_vector<VecOfVecs,TypeGen> > {
00350     typedef typename fold<VecOfVecs, size_t<1>, times<_1, size<_2> > >::type type;
00351     static const std::size_t value=type::value;
00352 };
00353 
00356 template <typename VecOfVecs, typename TypeGen>
00357 struct empty<cross_vector<VecOfVecs,TypeGen> > {
00358     typedef typename empty<VecOfVecs>::type type;
00359 };
00360 
00363 template <typename VecOfVecs, typename TypeGen, typename K>
00364 struct at<cross_vector<VecOfVecs,TypeGen>, K> {
00365 private:
00366     typedef cross_iterator<VecOfVecs,TypeGen,K::value> KthIterator;
00367 public:
00368     typedef typename deref<KthIterator>::type type;
00369 };
00370 
00373 template <typename VecOfVecs, typename TypeGen>
00374 struct begin<cross_vector<VecOfVecs,TypeGen> > {
00375     typedef cross_iterator<VecOfVecs,TypeGen,0> type;
00376 };
00377 
00380 template <typename VecOfVecs, typename TypeGen>
00381 struct end<cross_vector<VecOfVecs,TypeGen> > {
00382 private:
00383     typedef cross_vector<VecOfVecs,TypeGen> this_t;
00384 public:
00385     typedef cross_iterator<VecOfVecs,TypeGen,size<this_t>::value> type;
00386 };
00387 
00390 template <typename VecOfVecs, typename TypeGen>
00391 struct front<cross_vector<VecOfVecs,TypeGen> > {
00392 private:
00393     typedef cross_vector<VecOfVecs,TypeGen> this_t;
00394 public:
00395     typedef typename deref<typename begin<this_t>::type>::type type;
00396 };
00397 
00400 template <typename VecOfVecs, typename TypeGen>
00401 struct back<cross_vector<VecOfVecs,TypeGen> > {
00402 private:
00403     typedef cross_vector<VecOfVecs,TypeGen> this_t;
00404     typedef typename size<this_t>::type            size;
00405     typedef typename minus<size, size_t<1> >::type last_index;
00406 public:
00407     typedef typename at<this_t, last_index>::type type;
00408 };
00409 
00412 template <typename VecOfVecs, typename TypeGen, typename OPP>
00413 struct transform<cross_vector<VecOfVecs,TypeGen>, OPP > {
00414     typedef typename lambda<OPP>::type Op;
00415     struct adapter {
00416         template <typename Elements> 
00417         struct apply {
00418             typedef typename TypeGen::template apply<Elements>::type orig_t;
00419             typedef typename Op::template apply<orig_t>::type type;
00420         };
00421     };
00422     typedef cross_vector<VecOfVecs, adapter > type; 
00423 };
00424 
00425 } } // boost::mpl
00426 
00427 namespace boost { namespace gil {
00428 
00429 template <typename Types, typename T> struct type_to_index;
00430 template <typename V> struct view_is_basic;
00431 struct rgb_t;
00432 struct lab_t;
00433 struct hsb_t;
00434 struct cmyk_t;
00435 struct rgba_t;
00436 struct error_t;
00437 
00438 
00439 namespace detail {
00445     template <typename Op, typename T>
00446     struct reduce {
00447         typedef T type;
00448     };
00449 
00456 
00457     template <typename Op, typename View, bool IsBasic>
00458     struct reduce_view_basic {
00459         typedef View type;
00460     };
00461 
00462     template <typename Op, typename Loc>
00463     struct reduce<Op, image_view<Loc> > 
00464         : public reduce_view_basic<Op,image_view<Loc>,view_is_basic<image_view<Loc> >::value> {};
00465  
00472 
00473     template <typename Op, typename Img, bool IsBasic>
00474     struct reduce_image_basic {
00475         typedef Img type;
00476     };
00477 
00478     template <typename Op, typename V, typename Alloc>
00479     struct reduce<Op, image<V,Alloc> > : public reduce_image_basic<Op,image<V,Alloc>,image_is_basic<image<V,Alloc> >::value > {};
00480 
00487 
00488     template <typename Op, typename V1, typename V2, bool AreBasic>
00489     struct reduce_views_basic {
00490         typedef std::pair<const V1*, const V2*> type;
00491     };
00492 
00493     template <typename Op, typename L1, typename L2>
00494     struct reduce<Op, std::pair<const image_view<L1>*, const image_view<L2>*> > 
00495         : public reduce_views_basic<Op,image_view<L1>,image_view<L2>,
00496                  mpl::and_<view_is_basic<image_view<L1> >, view_is_basic<image_view<L2> > >::value >
00497     {};
00498 
00499 
00505 
00506     template <typename Cs>
00507     struct reduce_color_space {
00508         typedef Cs type;
00509     };
00510 
00511     template <> struct reduce_color_space<lab_t> { typedef rgb_t type; };
00512     template <> struct reduce_color_space<hsb_t> { typedef rgb_t type; };
00513     template <> struct reduce_color_space<cmyk_t> { typedef rgba_t type; };
00514 
00515     /*
00523 
00524     template <typename Vec, int Basis, int VecSize> 
00525     struct type_vec_to_integer_impl {
00526         typedef typename mpl::back<Vec>::type     last;
00527         typedef typename mpl::pop_back<Vec>::type rest;
00528         static const int value = type_vec_to_integer_impl<rest, Basis, VecSize-1>::value * Basis + last::value;
00529     };
00530 
00531     template <typename Vec, int Basis> 
00532     struct type_vec_to_integer_impl<Vec,Basis,0> {
00533         static const int value=0;
00534     };
00535 
00536     template <typename Vec, int Basis=10>
00537     struct type_vec_to_integer {
00538         static const int value = type_vec_to_integer_impl<Vec,Basis, mpl::size<Vec>::value>::value;
00539     };
00540 
00541     // Given two color spaces and the mapping of the channels between them, returns the reduced pair of color spaces
00542     // The default version performs no reduction
00543     template <typename SrcColorSpace, typename DstColorSpace, int Mapping>
00544     struct reduce_color_spaces_impl {
00545         typedef SrcColorSpace first_t;
00546         typedef DstColorSpace second_t;
00547     };
00548 
00549     // 012: RGB-RGB, bgr-bgr, lab-lab, hsb-hsb
00550     template <typename SrcColorSpace, typename DstColorSpace>
00551     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,12> {
00552         typedef rgb_t first_t;
00553         typedef rgb_t second_t;
00554     };
00555 
00556     // 210: RGB-bgr, bgr-RGB
00557     template <typename SrcColorSpace, typename DstColorSpace>
00558     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,210> {
00559         typedef rgb_t first_t;
00560         typedef bgr_t second_t;
00561     };
00562 
00563     // 0123: RGBA-RGBA, bgra-bgra, argb-argb, abgr-abgr cmyk-cmyk
00564     template <typename SrcColorSpace, typename DstColorSpace>
00565     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,123> {
00566         typedef rgba_t first_t;
00567         typedef rgba_t second_t;
00568     };
00569 
00570     // 3210: RGBA-abgr, bgra-argb, argb-bgra, abgr-RGBA
00571     template <typename SrcColorSpace, typename DstColorSpace>
00572     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,3210> {
00573         typedef rgba_t first_t;
00574         typedef abgr_t second_t;
00575     };
00576 
00577     // 1230: RGBA-argb, bgra-abgr
00578     template <typename SrcColorSpace, typename DstColorSpace>
00579     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,1230> {
00580         typedef rgba_t first_t;
00581         typedef argb_t second_t;
00582     };
00583 
00584     // 2103: RGBA-bgra, bgra-RGBA (uses subclass to ensure that base color space is not reduced to derived)
00585     template <typename SrcColorSpace, typename DstColorSpace>
00586     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,2103> {
00587         typedef rgba_t first_t;
00588         typedef bgra_t second_t;
00589     };
00590 
00591     // 3012: argb-RGBA, abgr-bgra
00592     template <typename SrcColorSpace, typename DstColorSpace>
00593     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,3012> {
00594         typedef argb_t first_t;
00595         typedef rgba_t second_t;
00596     };
00597 
00598     // 0321: argb-abgr, abgr-argb
00599     template <typename SrcColorSpace, typename DstColorSpace>
00600     struct reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,321> {
00601         typedef argb_t first_t;
00602         typedef abgr_t second_t;
00603     };
00604 
00605     template <typename SrcColorSpace, typename DstColorSpace>
00606     struct reduce_color_spaces {
00607         typedef typename channel_order<SrcColorSpace>::type src_order_t;
00608         typedef typename channel_order<DstColorSpace>::type dst_order_t;
00609         typedef typename mpl::transform<src_order_t, type_to_index<dst_order_t,mpl::_1> >::type mapping;
00610         static const int mapping_val = type_vec_to_integer<mapping>::value;
00611         
00612         typedef typename reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,mapping_val>::first_t  _first_t;
00613         typedef typename reduce_color_spaces_impl<SrcColorSpace,DstColorSpace,mapping_val>::second_t _second_t;
00614         typedef typename mpl::and_<color_space_is_base<DstColorSpace>, mpl::not_< color_space_is_base<_second_t> > > swap_t;
00615     public:
00616         typedef typename mpl::if_<swap_t, _second_t, _first_t>::type first_t;
00617         typedef typename mpl::if_<swap_t, _first_t, _second_t>::type second_t;
00618     };
00619 */
00620 // TODO: Use the old code for reduce_color_spaces above to do color layout reduction
00621     template <typename SrcLayout, typename DstLayout>
00622     struct reduce_color_layouts {
00623         typedef SrcLayout first_t;
00624         typedef DstLayout second_t;
00625     };
00626 
00632 
00633     struct copy_pixels_fn;
00634 
00635     /*
00636     // 1D reduce for copy_pixels reduces the channel to mutable and the color space to its base with same dimensions
00637     template <typename View>
00638     struct reduce_view_basic<copy_pixels_fn,View,true> {
00639     private:
00640         typedef typename reduce_color_space<typename View::color_space_t>::type Cs;    // reduce the color space
00641         typedef layout<Cs, typename View::channel_mapping_t> layout_t;
00642     public:
00643         typedef typename derived_view_type<View, use_default, layout_t, use_default, use_default, mpl::true_>::type type;
00644     };
00645 */
00646     // Incompatible views cannot be used in copy_pixels - will throw std::bad_cast
00647     template <typename V1, typename V2, bool Compatible> 
00648     struct reduce_copy_pixop_compat {
00649         typedef error_t type;
00650     };
00651     
00652     // For compatible basic views, reduce their color spaces based on their channel mapping. 
00653     // Make the source immutable and the destination mutable (they should already be that way)
00654     template <typename V1, typename V2>
00655     struct reduce_copy_pixop_compat<V1,V2,true> {
00656         typedef layout<typename V1::color_space_t, typename V1::channel_mapping_t> layout1;
00657         typedef layout<typename V2::color_space_t, typename V2::channel_mapping_t> layout2;
00658 
00659         typedef typename reduce_color_layouts<layout1,layout2>::first_t L1;
00660         typedef typename reduce_color_layouts<layout1,layout2>::second_t L2;
00661 
00662         typedef typename derived_view_type<V1, use_default, L1, use_default, use_default, use_default, mpl::false_>::type DV1;
00663         typedef typename derived_view_type<V2, use_default, L2, use_default, use_default, use_default, mpl::true_ >::type DV2;
00664         
00665         typedef std::pair<const DV1*, const DV2*> type;
00666     };
00667     
00668     // The general 2D version branches into compatible and incompatible views
00669     template <typename V1, typename V2>
00670     struct reduce_views_basic<copy_pixels_fn, V1, V2, true>
00671         : public reduce_copy_pixop_compat<V1, V2, mpl::and_<views_are_compatible<V1,V2>, view_is_mutable<V2> >::value > {
00672     };
00673 
00679 
00680     struct destructor_op;
00681     template <typename View> struct reduce_view_basic<destructor_op,View,true> { typedef gray8_view_t type; };
00682 
00688     
00689     struct any_type_get_dimensions;
00690     template <typename View> struct reduce_view_basic<any_type_get_dimensions,View,true> { typedef gray8_view_t type; };
00691     template <typename Img>  struct reduce_image_basic<any_type_get_dimensions,Img,true> { typedef gray8_image_t type; };
00692 
00698     
00699     struct any_type_get_num_channels;
00700     template <typename View> struct reduce_view_basic<any_type_get_num_channels,View,true> { 
00701         typedef typename View::color_space_t::base Cs;
00702         typedef typename view_type<bits8,typename reduce_color_space<Cs>::type>::type type; 
00703     };
00704     template <typename Img>  struct reduce_image_basic<any_type_get_num_channels,Img,true> { 
00705         typedef typename Img::color_space_t::base Cs;
00706         typedef typename image_type<bits8,typename reduce_color_space<Cs>::type>::type type; 
00707     };
00708 
00714     
00715     template <typename Sampler, typename MapFn> struct resample_pixels_fn;
00716 
00717     template <typename S, typename M, typename V, bool IsBasic> 
00718     struct reduce_view_basic<resample_pixels_fn<S,M>, V, IsBasic> : public reduce_view_basic<copy_pixels_fn, V, IsBasic> {};
00719 
00720     template <typename S, typename M, typename V1, typename V2, bool IsBasic> 
00721     struct reduce_views_basic<resample_pixels_fn<S,M>, V1, V2, IsBasic> : public reduce_views_basic<copy_pixels_fn, V1, V2, IsBasic> {};
00722 
00729 
00730     
00731     template <typename CC> class copy_and_convert_pixels_fn;
00732 
00733     // the only thing for 1D reduce is making them all mutable...
00734     template <typename CC, typename View, bool IsBasic> 
00735     struct reduce_view_basic<copy_and_convert_pixels_fn<CC>, View, IsBasic> 
00736         : public derived_view_type<View, use_default, use_default, use_default, use_default, mpl::true_> {
00737     };
00738 
00739     // For 2D reduce, if they have the same channels and color spaces (i.e. the same pixels) then copy_and_convert is just copy.
00740     // In this case, reduce their common color space. In general make the first immutable and the second mutable
00741     template <typename CC, typename V1, typename V2, bool AreBasic> 
00742     struct reduce_views_basic<copy_and_convert_pixels_fn<CC>, V1, V2, AreBasic> {
00743         typedef is_same<typename V1::pixel_t, typename V2::pixel_t> Same;
00744 
00745         typedef reduce_color_space<typename V1::color_space_t::base> CsR;
00746         typedef typename mpl::if_<Same, typename CsR::type, typename V1::color_space_t>::type Cs1;
00747         typedef typename mpl::if_<Same, typename CsR::type, typename V2::color_space_t>::type Cs2;
00748 
00749         typedef typename derived_view_type<V1, use_default, layout<Cs1, typename V1::channel_mapping_t>, use_default, use_default, mpl::false_>::type DV1;
00750         typedef typename derived_view_type<V2, use_default, layout<Cs2, typename V2::channel_mapping_t>, use_default, use_default, mpl::true_ >::type DV2;
00751         
00752         typedef std::pair<const DV1*, const DV2*> type;
00753     };
00754 
00755 
00756     //integral_image_generator
00757     //resize_clobber_image_fnobj
00758     //image_default_construct_fnobj
00759     //fill_converted_pixels_fn
00760     //bind(gil::detail::copy_pixels_fn(), _1, dst)
00761     //bind(gil::detail::copy_pixels_fn(), src,_1)
00762     
00763     //bind(detail::copy_and_convert_pixels_fn(), _1, dst)
00764     //bind(detail::copy_and_convert_pixels_fn(), src, _1)
00765     //gil::detail::fill_pixels_fn<Value>(val)
00766     
00767     //detail::copy_construct_in_place_fn<base_t>
00768     //detail::equal_to_fn<typename variant<Types>::base_t>
00769 
00770     //detail::any_image_get_view<typename any_image<Types>::view_t>
00771     //detail::any_image_get_const_view<typename any_image<Types>::view_t>
00772     //detail::flipped_up_down_view_fn<any_image_view<ViewTypes> >
00773     //detail::flipped_left_right_view_fn<typename any_image_view<ViewTypes>::dynamic_step_t>
00774     //detail::tranposed_view_fn<typename any_image_view<ViewTypes>::dynamic_step_t>
00775     //detail::rotated90cw_view_fn<typename any_image_view<ViewTypes>::dynamic_step_t>
00776     //detail::rotated90ccw_view_fn<typename any_image_view<ViewTypes>::dynamic_step_t>
00777     //detail::rotated180_view_fn<typename any_image_view<ViewTypes>::dynamic_step_t>
00778     //detail::subimage_view_fn<any_image_view<ViewTypes> >
00779     //detail::subsampled_view_fn<typename any_image_view<ViewTypes>::dynamic_step_t>
00780     //detail::nth_channel_view_fn<typename nth_channel_view_type<any_image_view<ViewTypes> >
00781     //detail::color_converted_view_fn<DstP,typename color_convert_view_type<any_image_view<ViewTypes>, DstP>::type >
00782 }
00783 
00784 } }  // namespace boost::gil
00785 
00786 #endif // GIL_REDUCE_CODE_BLOAT
00787 
00788 
00789 #endif

Generated on Sat May 2 13:50:15 2009 for Generic Image Library by  doxygen 1.5.6