27 #ifndef MLN_FUN_V2V_RGB_TO_HSL_HH
28 # define MLN_FUN_V2V_RGB_TO_HSL_HH
32 # include <mln/math/round.hh>
33 # include <mln/math/max.hh>
34 # include <mln/math/min.hh>
36 # include <mln/trait/value_.hh>
44 template <
typename H,
typename S,
typename L>
class hsl_;
54 template <
typename T_hsl>
61 template <
typename T_rgb>
71 # ifndef MLN_INCLUDE_ONLY
73 # ifndef MLN_WO_GLOBAL_VARS
80 # endif // ! MLN_WO_GLOBAL_VARS
82 template <
typename T_hsl>
87 template <
typename T_hsl>
88 template <
typename T_rgb>
102 if (rmax == rgb.red())
104 hsl.hue() = (60. * (rgb.green() - rgb.blue()) / (rmax - rmin));
109 if (rmax == rgb.green())
110 hsl.hue() = (60. * (rgb.blue() - rgb.red()) / (rmax - rmin)) + 120.;
112 hsl.hue() = (60. * (rgb.red() - rgb.green()) / (rmax - rmin)) + 240;
115 rmax -= mln_min(
typename T_rgb::red_t);
116 rmin -= mln_min(
typename T_rgb::red_t);
117 double nmax = (
double) rmax / (mln_max(
typename T_rgb::red_t) - mln_min(
typename T_rgb::red_t));
118 double nmin = (
double) rmin / (mln_max(
typename T_rgb::red_t) - mln_min(
typename T_rgb::red_t));
120 hsl.lum() = (nmax + nmin) / 2;
125 if (hsl.lum() <= 0.5)
126 hsl.sat() = (nmax - nmin) / (nmax + nmin);
128 hsl.sat() = (nmax - nmin) / (2 - nmax - nmin);
134 # endif // !MLN_INCLUDE_ONLY
142 #endif // ! MLN_FUN_V2V_RGB_TO_HSL_HH