27 #ifndef MLN_VALUE_HSL_HH
28 # define MLN_VALUE_HSL_HH
30 #include <mln/value/ops.hh>
32 #include <mln/value/concept/vectorial.hh>
33 #include <mln/algebra/vec.hh>
44 template <
unsigned n>
struct int_u;
45 template <
typename H,
typename S,
typename L>
class hsl_;
57 template <
typename H,
typename S,
typename L>
63 template <
typename H,
typename S,
typename L>
69 template <
typename H,
typename S,
typename L,
typename S2>
75 template <
typename H,
typename S,
typename L,
typename S2>
88 template <
typename H,
typename S,
typename L,
unsigned m>
94 template <
typename H,
typename S,
typename L,
unsigned m>
100 template <
typename H,
typename S,
typename L>
101 struct value_< mln::value::hsl_<H,S,L> >
105 nbits = (
sizeof (H) +
sizeof (S) +
sizeof (L)) * 8,
106 card = mln_value_card_from_(nbits)
109 typedef trait::value::nature::vectorial
nature;
110 typedef trait::value::kind::color
kind;
111 typedef mln_value_quant_from_(card) quant;
118 template <typename V> static comp_0 get_comp_0(const V& v) {
return v.hue(); }
119 template <
typename V>
static comp_1 get_comp_1(
const V& v) {
return v.sat(); }
120 template <
typename V>
static comp_2 get_comp_2(
const V& v) {
return v.lum(); }
132 template <
typename E>
137 template <
typename H,
typename S,
typename L>
167 const H&
hue()
const;
168 const S&
sat()
const;
169 const L&
lum()
const;
216 template <
typename H,
typename S,
typename L>
217 std::ostream& operator<<(std::ostream& ostr, const hsl_<H,S,L>& c);
222 template <
typename H,
typename S,
typename L>
229 template <
typename H,
typename S,
typename L>
236 template <
typename H,
typename S,
typename L,
typename S2>
243 template <
typename H,
typename S,
typename L,
typename S2>
250 template <
typename H,
typename S,
typename L>
260 template <
typename H,
typename S,
typename L>
264 template <
typename H,
typename S,
typename L>
278 template <
typename T_rgb>
279 struct f_hsl_to_rgb_;
295 # include <mln/value/rgb.hh>
296 # include <mln/value/qt/rgb32.hh>
297 # include <mln/fun/v2v/hsl_to_rgb.hh>
300 # ifndef MLN_INCLUDE_ONLY
308 template <
typename H,
typename S,
typename L>
315 template <
typename H,
typename S,
typename L>
322 template <
typename H,
typename S,
typename L>
329 template <
typename H,
typename S,
typename L>
336 template <
typename H,
typename S,
typename L>
343 template <
typename H,
typename S,
typename L>
351 template <
typename H,
typename S,
typename L>
353 std::ostream& operator<<(std::ostream& ostr, const hsl_<H,S,L>& v)
362 template <
typename H,
typename S,
typename L>
364 operator+(
const hsl_<H,S,L>& lhs,
const hsl_<H,S,L>&
rhs)
366 return hsl_<H,S,L>(lhs.hue() + rhs.hue(),
367 lhs.sat() + rhs.sat(),
368 lhs.lum() + rhs.lum());
372 template <
typename H,
typename S,
typename L>
374 operator-(
const hsl_<H,S,L>& lhs,
const hsl_<H,S,L>& rhs)
376 return hsl_<H,S,L>(lhs.hue() - rhs.hue(),
377 lhs.sat() - rhs.sat(),
378 lhs.lum() - rhs.lum());
382 template <
typename H,
typename S,
typename L,
typename S2>
386 return hsl_<H,S,L>(lhs.hue() * s,
392 template <
typename H,
typename S,
typename L,
typename S2>
396 return hsl_<H,S,L>(lhs.hue() / s,
401 template <
typename H,
typename S,
typename L>
403 operator==(
const hsl_<H,S,L>& lhs,
const hsl_<H,S,L>& rhs)
405 return lhs.hue() == rhs.hue()
406 && lhs.sat() == rhs.sat()
407 && lhs.lum() == rhs.lum();
413 template <
typename H,
typename S,
typename L>
414 void from_to_(
const hsl_<H,S,L>& from, qt::rgb32& to)
420 template <
typename H,
typename S,
typename L>
422 from_to_(
const hsl_<H,S,L>& from, rgb<8>& to)
431 # endif // ! MLN_INCLUDE_ONLY
433 #endif // ! MLN_VALUE_HSL_HH