const flatten = require('../utils/flatten')
/**
* Converts an RGB color value to HSL.
*
* @see http://en.wikipedia.org/wiki/HSL_color_space.
* @see http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
* @param {...Number|Array} values - RGB or RGBA color values
* @return {Array} HSL or HSLA color values
* @alias module:modeling/colors.rgbToHsl
*/
const rgbToHsl = (...values) => {
values = flatten(values)
if (values.length < 3) throw new Error('values must contain R, G and B values')
const r = values[0]
const g = values[1]
const b = values[2]
const max = Math.max(r, g, b)
const min = Math.min(r, g, b)
let h
let s
const l = (max + min) / 2
if (max === min) {
h = s = 0 // achromatic
} else {
const d = max - min
s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0)
break
case g:
h = (b - r) / d + 2
break
case b:
h = (r - g) / d + 4
break
}
h /= 6
}
if (values.length > 3) {
// add alpha value if provided
const a = values[3]
return [h, s, l, a]
}
return [h, s, l]
}
module.exports = rgbToHsl