reduce.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_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 1.5.6 |