package main import "image/color" type HSL struct { H, S, L float64 } func hueToRGB(v1, v2, h float64) float64 { if h < 0 { h += 1 } if h > 1 { h -= 1 } switch { case 6*h < 1: return (v1 + (v2-v1)*6*h) case 2*h < 1: return v2 case 3*h < 2: return v1 + (v2-v1)*((2.0/3.0)-h)*6 } return v1 } func (c HSL) ToRGB() color.RGBA { h := c.H s := c.S l := c.L if s == 0 { // it's gray return color.RGBA{R: uint8(l), G: uint8(l), B: uint8(l)} } var v1, v2 float64 if l < 0.5 { v2 = l * (1 + s) } else { v2 = (l + s) - (s * l) } v1 = 2*l - v2 r := hueToRGB(v1, v2, h+(1.0/3.0)) g := hueToRGB(v1, v2, h) b := hueToRGB(v1, v2, h-(1.0/3.0)) return color.RGBA{R: uint8(r * 256), G: uint8(g * 256), B: uint8(b * 256)} }