1 #ifndef color_lab_get_chroma 2 #define color_lab_get_chroma 3 4 // ::color::get::chroma( c ) 5 6 #include "../category.hpp" 7 #include "../place/place.hpp" 8 9 10 11 12 namespace color 13 { 14 namespace get 15 { 16 17 namespace _internal 18 { 19 namespace lab 20 { 21 22 template< typename unsigned_name, ::color::constant::lab::reference_enum reference_number > 23 inline 24 typename ::color::model< ::color::category::lab< unsigned_name, reference_number > >::component_const_type chroma(::color::model<::color::category::lab<unsigned_name,reference_number>> const & c)25 chroma( ::color::model< ::color::category::lab< unsigned_name, reference_number > > const& c ) 26 { 27 typedef unsigned_name unsigned_type; 28 29 typedef ::color::category::lab< unsigned_type, reference_number > category_type; 30 31 typedef typename ::color::trait::scalar<category_type>::instance_type scalar_type; 32 typedef typename ::color::trait::component<category_type>::instance_type component_type; 33 34 scalar_type const A = static_cast<scalar_type>( c.template get< 1 >() ) - std::numeric_limits<unsigned_type>::max()/2; 35 scalar_type const B = static_cast<scalar_type>( c.template get< 2 >() ) - std::numeric_limits<unsigned_type>::max()/2; 36 37 return component_type( sqrt(A*A + B*B) ); 38 } 39 40 } 41 } 42 43 template<::color::constant::lab::reference_enum reference_number > 44 inline 45 typename ::color::model< ::color::category::lab< std::uint8_t, reference_number > >::component_const_type chroma(::color::model<::color::category::lab<std::uint8_t,reference_number>> const & c)46 chroma( ::color::model< ::color::category::lab< std::uint8_t, reference_number > > const& c ) 47 { 48 return ::color::get::_internal::lab::chroma( c ); 49 } 50 51 template<::color::constant::lab::reference_enum reference_number > 52 inline 53 typename ::color::model< ::color::category::lab< std::uint16_t, reference_number > >::component_const_type chroma(::color::model<::color::category::lab<std::uint16_t,reference_number>> const & c)54 chroma( ::color::model< ::color::category::lab< std::uint16_t, reference_number > > const& c ) 55 { 56 return ::color::get::_internal::lab::chroma( c ); 57 } 58 59 template<::color::constant::lab::reference_enum reference_number > 60 inline 61 typename ::color::model< ::color::category::lab< std::uint32_t, reference_number > >::component_const_type chroma(::color::model<::color::category::lab<std::uint32_t,reference_number>> const & c)62 chroma( ::color::model< ::color::category::lab< std::uint32_t, reference_number > > const& c ) 63 { 64 return ::color::get::_internal::lab::chroma( c ); 65 } 66 67 template<::color::constant::lab::reference_enum reference_number > 68 inline 69 typename ::color::model< ::color::category::lab< std::uint64_t, reference_number > >::component_const_type chroma(::color::model<::color::category::lab<std::uint64_t,reference_number>> const & c)70 chroma( ::color::model< ::color::category::lab< std::uint64_t, reference_number > > const& c ) 71 { 72 return ::color::get::_internal::lab::chroma( c ); 73 } 74 75 template< typename tag_name, ::color::constant::lab::reference_enum reference_number > 76 inline 77 typename ::color::model< ::color::category::lab< tag_name, reference_number > >::component_const_type chroma(::color::model<::color::category::lab<tag_name,reference_number>> const & c)78 chroma( ::color::model< ::color::category::lab< tag_name, reference_number > > const& c ) 79 { 80 typedef ::color::category::lab< tag_name, reference_number > category_type; 81 82 typedef typename ::color::trait::scalar<category_type>::instance_type scalar_type; 83 84 typedef typename ::color::trait::component<category_type>::instance_type component_type; 85 86 //typedef ::color::_internal::normalize< category_type > normalize_type; 87 88 scalar_type const A = static_cast<scalar_type>( c.template get< 1 >() ); 89 scalar_type const B = static_cast<scalar_type>( c.template get< 2 >() ); 90 91 return component_type( sqrt(A*A + B*B) ); 92 } 93 94 95 96 97 98 /* 99 template< ::color::constant::lab::reference_enum reference_number > 100 inline 101 typename ::color::model< ::color::category::lab< std::uint8_t, reference_number > >::component_const_type 102 chroma( ::color::model< ::color::category::lab< std::uint8_t, reference_number > > const& c ) 103 { 104 typedef ::color::category::lab< std::uint8_t, reference_number > category_type; 105 106 typedef typename ::color::trait::scalar<category_type> scalar_trait_type; 107 typedef typename ::color::trait::scalar<category_type>::instance_type scalar_type; 108 109 typedef typename ::color::trait::component<category_type>::instance_type component_type; 110 111 scalar_type const A = static_cast<scalar_type>( c.template get< 1 >() - scalar_type(128) ); 112 scalar_type const B = static_cast<scalar_type>( c.template get< 2 >() - scalar_type(128) ); 113 114 return component_type( sqrt(A*A + B*B) ); 115 } 116 117 template< ::color::constant::lab::reference_enum reference_number > 118 inline 119 typename ::color::model< ::color::category::lab< std::uint16_t, reference_number > >::component_const_type 120 chroma( ::color::model< ::color::category::lab< std::uint16_t, reference_number > > const& c ) 121 { 122 typedef ::color::category::lab< std::uint16_t, reference_number > category_type; 123 124 typedef typename ::color::trait::scalar<category_type> scalar_trait_type; 125 typedef typename ::color::trait::scalar<category_type>::instance_type scalar_type; 126 127 typedef typename ::color::trait::component<category_type>::instance_type component_type; 128 129 scalar_type const A = static_cast<scalar_type>( c.template get< 1 >() - scalar_type(65536) ); 130 scalar_type const B = static_cast<scalar_type>( c.template get< 2 >() - scalar_type(128) ); 131 132 return component_type( sqrt(A*A + B*B) ); 133 } 134 135 template< ::color::constant::lab::reference_enum reference_number > 136 inline 137 typename ::color::model< ::color::category::lab< std::uint32_t, reference_number > >::component_const_type 138 chroma( ::color::model< ::color::category::lab< std::uint32_t, reference_number > > const& c ) 139 { 140 typedef ::color::category::lab< std::uint32_t, reference_number > category_type; 141 142 typedef typename ::color::trait::scalar<category_type> scalar_trait_type; 143 typedef typename ::color::trait::scalar<category_type>::instance_type scalar_type; 144 145 typedef typename ::color::trait::component<category_type>::instance_type component_type; 146 147 scalar_type const A = static_cast<scalar_type>( c.template get< 1 >() - scalar_type(128) ); 148 scalar_type const B = static_cast<scalar_type>( c.template get< 2 >() - scalar_type(128) ); 149 150 return component_type( sqrt(A*A + B*B) ); 151 } 152 */ 153 } 154 } 155 156 #endif