Current section
Files
Jump to
Current section
Files
lib/lights/colors.ex
defmodule Exhue.Colors do
@moduledoc """
Color conversion utilities
"""
@doc """
Convert XY color values to RGB
"""
def xy_to_color(x,y, bri) do
z = 1.0 - x - y
yval = bri
xval = (yval / y) * x
zval = (yval / y) * z
r = (xval * 1.656492) - (yval * 0.354851) - (zval * 0.255038)
g = (-xval * 0.707196) + (yval * 1.655397) + (zval * 0.036152)
b = (xval * 0.051713) - (yval * 0.121364) + (zval * 1.011530)
rval = if (r <= 0.0031308), do: 12.92 * r, else: (1.0 + 0.055) * :math.pow(r, (1.0 / 2.4)) - 0.055
gval = if (g <= 0.0031308), do: 12.92 * g, else: (1.0 + 0.055) * :math.pow(g, (1.0 / 2.4)) - 0.055
bval = if (b <= 0.0031308), do: 12.92 * b, else: (1.0 + 0.055) * :math.pow(b, (1.0 / 2.4)) - 0.055
maxvalue = Enum.max([rval, gval, bval])
new_r = rval / maxvalue
new_g = gval / maxvalue
new_b = bval / maxvalue
final_r = if (new_r * 255) < 0, do: 255, else: new_r * 255
final_g = if (new_g * 255) < 0, do: 255, else: new_g * 255
final_b = if (new_b * 255) < 0, do: 255, else: new_b * 255
output_r = if (final_r < 0), do: 255, else: final_r
output_g = if (final_g < 0), do: 255, else: final_g
output_b = if (final_b < 0), do: 255, else: final_b
%{r: round(output_r), g: round(output_g), b: round(output_b)}
end
end