Skip to content

Instantly share code, notes, and snippets.

@lucaswkuipers
Last active January 10, 2024 04:49
Show Gist options
  • Save lucaswkuipers/343f1b47ab0e73a6fb42290f79d6ef94 to your computer and use it in GitHub Desktop.
Save lucaswkuipers/343f1b47ab0e73a6fb42290f79d6ef94 to your computer and use it in GitHub Desktop.
Color Helpers iOS
extension Double {
func interpolated(to b: Double, at t: Double) -> Double {
self + (b - self) * (t * t)
}
}
extension [Color] {
func rgbaLerp(at t: Double) -> Color {
let position = t * Double(count - 1)
let i = Int(position)
let t = CGFloat(position - Double(i))
return self[i].rgbaLerp(to: self[i + 1], t)
}
}
extension [Color] {
func hsbaLerp(at t: Double) -> Color {
let position = t * Double(count - 1)
let i = Int(position)
let t = CGFloat(position - Double(i))
return self[i].hsbaLerp(to: self[i + 1], t)
}
}
extension Color {
func rgbaLerp(to endColor: Color, _ t: CGFloat) -> Color {
let a = rgba
let b = endColor.rgba
let red = a.r.interpolated(to: b.r, at: t)
let green = a.g.interpolated(to: b.g, at: t)
let blue = a.b.interpolated(to: b.b, at: t)
let alpha = a.a.interpolated(to: b.a, at: t)
return Color(red: Double(red), green: Double(green), blue: Double(blue), opacity: Double(alpha))
}
}
extension Color {
func hsbaLerp(to endColor: Color, _ t: CGFloat) -> Color {
let a = hsba
let b = endColor.hsba
let hue = a.h.interpolated(to: b.h, at: t)
let saturation = a.s.interpolated(to: b.s, at: t)
let brightness = a.b.interpolated(to: b.b, at: t)
let alpha = a.a.interpolated(to: b.a, at: t)
return Color(hue: hue, saturation: saturation, brightness: brightness, opacity: alpha)
}
}
#if canImport(UIKit)
import UIKit
typealias PlatformColor = UIColor
#endif
#if canImport(AppKit)
import AppKit
typealias PlatformColor = NSColor
#endif
extension Color {
var rgba: (r: Double, g: Double, b: Double, a: Double) {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0
var platformColor = PlatformColor(self)
#if canImport(AppKit)
platformColor = platformColor.usingColorSpace(.deviceRGB) ?? PlatformColor(self)
#endif
platformColor.getRed(
&red,
green: &green,
blue: &blue,
alpha: &alpha
)
return (
r: Double(red),
g: Double(green),
b: Double(blue),
a: Double(alpha)
)
}
var rgb: (r: Double, g: Double, b: Double) {
(
r: rgba.r,
g: rgba.g,
b: rgba.b
)
}
}
extension Color {
var hsba: (h: Double, s: Double, b: Double, a: Double) {
var hue: CGFloat = 0
var saturation: CGFloat = 0
var brightness: CGFloat = 0
var alpha: CGFloat = 0
var platformColor = PlatformColor(self)
#if canImport(AppKit)
platformColor = platformColor.usingColorSpace(.deviceRGB) ?? PlatformColor(self)
#endif
platformColor.getHue(
&hue,
saturation: &saturation,
brightness: &brightness,
alpha: &alpha
)
return (
h: Double(hue),
s: Double(saturation),
b: Double(brightness),
a: Double(alpha)
)
}
var hsb: (h: Double, s: Double, b: Double) {
(
h: hsba.h,
s: hsba.s,
b: hsba.b
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment