// @flow
import type {
HslColor,
HslaColor,
RgbColor,
RgbaColor,
} from '../types/color'
function rgbToHsl(color: RgbColor | RgbaColor): HslColor | HslaColor {
// make sure rgb are contained in a set of [0, 255]
const red = color.red / 255
const green = color.green / 255
const blue = color.blue / 255
const max = Math.max(red, green, blue)
const min = Math.min(red, green, blue)
const lightness = (max + min) / 2
if (max === min) {
// achromatic
if (color.alpha !== undefined) {
return { hue: 0, saturation: 0, lightness, alpha: color.alpha }
} else {
return { hue: 0, saturation: 0, lightness }
}
}
let hue
const delta = max - min
const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min)
switch (max) {
case red:
hue = ((green - blue) / delta) + (green < blue ? 6 : 0)
break
case green:
hue = ((blue - red) / delta) + 2
break
default: // blue case
hue = ((red - green) / delta) + 4
break
}
hue *= 60
if (color.alpha !== undefined) {
return { hue, saturation, lightness, alpha: color.alpha }
}
return { hue, saturation, lightness }
}
export default rgbToHsl
|