You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					60 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					60 lines
				
				1.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								// @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
							 |