00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_DATA_SPLIT_HH
00027 # define MLN_DATA_SPLIT_HH
00028
00029 # include <mln/core/concept/image.hh>
00030 # include <mln/value/rgb8.hh>
00031
00037
00038 namespace mln
00039 {
00040
00041 namespace data
00042 {
00043
00044 template <typename I, typename J>
00045 void
00046 split(const Image<I>& input_, Image<J>& r_, Image<J>& g_, Image<J>& b_);
00047
00048
00049 # ifndef MLN_INCLUDE_ONLY
00050
00051
00052 template <typename I, typename J>
00053 void
00054 split(const Image<I>& input_, Image<J>& r_, Image<J>& g_, Image<J>& b_)
00055 {
00056 trace::entering("mln::data::split");
00057
00058 const I& input = exact(input_);
00059 J& r = exact(r_);
00060 J& g = exact(g_);
00061 J& b = exact(b_);
00062
00063 mln_assertion(input.is_valid());
00064 mlc_is(mln_value(I), value::rgb8)::check();
00065
00066 mlc_is(mln_trait_image_value_storage(I),
00067 trait::image::value_storage::one_block)::check();
00068
00069 initialize(r, input);
00070 initialize(g, input);
00071 initialize(b, input);
00072
00073 typedef const mln_value(I)* in_ptr_t;
00074 typedef mln_value(J)* out_ptr_t;
00075
00076 in_ptr_t in_ptr = input.buffer();
00077 out_ptr_t
00078 r_ptr = r.buffer(),
00079 g_ptr = g.buffer(),
00080 b_ptr = b.buffer();
00081
00082 for (unsigned n = 0; n < input.nelements(); ++n, ++in_ptr)
00083 {
00084 *r_ptr++ = in_ptr->red();
00085 *g_ptr++ = in_ptr->green();
00086 *b_ptr++ = in_ptr->blue();
00087 }
00088
00089 trace::exiting("mln::data::split");
00090 }
00091
00092
00093 # endif // ! MLN_INCLUDE_ONLY
00094
00095 }
00096
00097 }
00098
00099 #endif // ! MLN_DATA_SPLIT_HH