Skip to content

Instantly share code, notes, and snippets.

@xsellier
Last active March 19, 2018 14:50
Show Gist options
  • Save xsellier/4be07fab9cf8d0d114bf753612422a24 to your computer and use it in GitHub Desktop.
Save xsellier/4be07fab9cf8d0d114bf753612422a24 to your computer and use it in GitHub Desktop.
RGB to HSL
extends Node
const S_FOREGROUND = 100 / 255.0
const L_FOREGROUND = 217 / 255.0
const PRELOADED_COLORS = {
red = Color('f44336'),
pink = Color('e91e63'),
purple = Color('9c27b0'),
deep_purple = Color('673ab7'),
indigo = Color('3f51b5'),
blue = Color('2196f3'),
light_blue = Color('03a9f4'),
cyan = Color('00bcd4'),
teal =Color('009688'),
green = Color('4caf50'),
light_green = Color('8bc34a'),
lime = Color('cddc39'),
yellow = Color('ffeb3b'),
amber = Color('ffc107'),
orange = Color('ff9800'),
deep_orange = Color('ff5722'),
brown = Color('795548'),
grey = Color('9e9e9e'),
blue_grey = Color('607d8b')
}
static func to_hsl(r, g, b):
var max_value = max(max(r, g), b)
var min_value = min(min(r, g), b)
var h = (max_value + min_value) / 2.0
var s = (max_value + min_value) / 2.0
var l = (max_value + min_value) / 2.0
if max_value == min_value:
h = 0
s = 0
else:
var d = max_value - min_value * 1.0
if l > 0.5:
s = d / (2.0 - max_value - min_value)
else:
s = d / (max_value + min_value)
if max_value == r:
h = (g - b) / d
if g < b:
h += 6.0
elif max_value == g:
h = (b - r) / d + 2
else:
h = (r - g) / d + 4
h /= 6.0
return [h, s, l]
static func hue2rgb(p, q, t):
if t < 0:
t += 1
if t > 1:
t -= 1
if t < 1 / 6.0:
return p + (q - p) * 6.0 * t
if t < 1 / 2.0:
return q
if t < 2 / 3.0:
return p + (q - p) * (2 / 3.0 - t) * 6.0
return p
static func to_rgb(h, s, l):
var r
var g
var b
if s == 0:
r = 1
g = 1
b = 1
else:
var q = l + s - l * s
if l < 0.5:
q = l * (1 + s)
var p = 2 * l - q
r = hue2rgb(p, q, h + 1 / 3.0)
g = hue2rgb(p, q, h)
b = hue2rgb(p, q, h - 1 / 3.0)
return Color(r, g, b)
static func get_color_from_name(name):
return PRELOADED_COLORS[name]
static func compute_foreground_color(colors):
var melted_color = Color(0.0, 0.0, 0.0)
for raw_color in colors:
var color_item = get_color_from_name(raw_color)
melted_color.r += color_item.r
melted_color.g += color_item.g
melted_color.b += color_item.b
melted_color.r = melted_color.r / colors.size()
melted_color.g = melted_color.g / colors.size()
melted_color.b = melted_color.b / colors.size()
var hsl = to_hsl(melted_color.r, melted_color.g, melted_color.b)
return to_rgb(hsl[0], S_FOREGROUND, L_FOREGROUND)
@xsellier
Copy link
Author

I used a stackoverflow question to create this script:
https://stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment