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