1 #ifndef color_yuv_get_green
2 #define color_yuv_get_green
3 
4 // ::color::get::green( c )
5 
6 #include "../../rgb/place/place.hpp"
7 #include "../../rgb/akin/yuv.hpp"
8 #include "../../rgb/trait/component.hpp"
9 
10 #include "../category.hpp"
11 #include "../constant.hpp"
12 
13 #include "../../_internal/normalize.hpp"
14 #include "../../_internal/diverse.hpp"
15 #include "../../generic/trait/scalar.hpp"
16 
17 
18  namespace color
19   {
20    namespace get
21     {
22 
23      template< typename tag_name, ::color::constant::yuv::reference_enum reference_number >
24       inline
25       typename ::color::trait::component< typename ::color::akin::rgb< ::color::category::yuv<tag_name,reference_number> >::akin_type >::return_type
green(::color::model<::color::category::yuv<tag_name,reference_number>> const & color_parameter)26       green( ::color::model< ::color::category::yuv<tag_name, reference_number> > const& color_parameter )
27        {
28         typedef ::color::category::yuv<tag_name, reference_number>  category_type;
29 
30         typedef typename ::color::trait::scalar<category_type>::instance_type   scalar_type;
31 
32         typedef typename ::color::akin::rgb<category_type>::akin_type     akin_type;
33         enum { green_p  = ::color::place::_internal::green<akin_type>::position_enum };
34 
35         typedef ::color::_internal::diverse< akin_type >       diverse_type;
36         typedef ::color::_internal::normalize<category_type>   normalize_type;
37 
38         typedef ::color::constant::yuv::parameter< tag_name, reference_number >  yuv_parameter_type;
39 
40         static scalar_type const Wr   = yuv_parameter_type::Wr();
41         static scalar_type const Wb   = yuv_parameter_type::Wb();
42         static scalar_type const Wg   = yuv_parameter_type::Wg();
43         static scalar_type const Umax = yuv_parameter_type::Umax();
44         static scalar_type const Vmax = yuv_parameter_type::Vmax();
45 
46         static scalar_type const b21 = 1, b22 = - Wb*(1 - Wb) / Umax / Wg,  b23 = -Wr*(1 - Wr) / Vmax / Wg;
47 
48         scalar_type y = normalize_type::template process<0>( color_parameter.template get<0>() );
49         scalar_type u = normalize_type::template process<1>( color_parameter.template get<1>() );
50         scalar_type v = normalize_type::template process<2>( color_parameter.template get<2>() );
51 
52         u = ( u - scalar_type(0.5) ) * scalar_type(2) * Umax;
53         v = ( v - scalar_type(0.5) ) * scalar_type(2) * Vmax;
54 
55         scalar_type g = y + u * b22 + v * b23;
56 
57         return diverse_type::template process<green_p>( g );
58        }
59 
60     }
61   }
62 
63 #endif
64