Skip to content

Instantly share code, notes, and snippets.

@jimstudt
Created November 15, 2015 20:47
Show Gist options
  • Save jimstudt/c5069349f305dd5bb6b2 to your computer and use it in GitHub Desktop.
Save jimstudt/c5069349f305dd5bb6b2 to your computer and use it in GitHub Desktop.
An iOS extension to UIColor to get a white point corresponding to a temperature.
extension UIColor {
// based on http://www.zombieprototypes.com/?p=210 who looked at some data and did a bunch of curve fitting
static func colorWithKelvin( kelvin: CGFloat) -> UIColor {
let k = kelvin < 1000 ? 1000 : ( kelvin > 40000 ? 40000 : kelvin)
func interpolate( value: CGFloat, a: CGFloat, b:CGFloat, c:CGFloat) -> CGFloat {
return a + b*value + c*log(value)
}
var red,green,blue: CGFloat
if k < 6600 {
red = 255
green = interpolate(k/100-2, a: -155.25485562709179, b: -0.44596950469579133, c: 104.49216199393888)
if k < 2000 {
blue = 0
} else {
blue = interpolate(k/100-10, a: -254.76935184120902, b: 0.8274096064007395, c: 115.67994401066147)
}
} else {
red = interpolate( k/100-55, a: 351.97690566805693, b: 0.114206453784165, c: -40.25366309332127)
green = interpolate(k/100-50, a: 325.4494125711974, b: 0.07943456536662342, c: -28.0852963507957)
blue = 255
}
return UIColor(red: red/255, green: green/255, blue: blue/255, alpha: 1.0)
}
static func colorByMultiplying( a: UIColor, _ b: UIColor) -> UIColor {
var ar = CGFloat(0)
var ab = CGFloat(0)
var ag = CGFloat(0)
var aa = CGFloat(0)
var br = CGFloat(0)
var bb = CGFloat(0)
var bg = CGFloat(0)
var ba = CGFloat(0)
if a.getRed(&ar, green: &ag, blue: &ab, alpha: &aa) &&
b.getRed(&br, green: &bg, blue: &bb, alpha: &ba) {
return UIColor(red: ar*br, green: ag*bg, blue: ab*bb, alpha: aa*ba)
} else {
// Couldn't work.
return a
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment