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