colorsys port wewlad

9f986ce · gmorell · 2022-11-23 05:32

4 files +87 -0

Files changed

added lib/lambent_ex/util/color.ex
+87 −0
@@ -0,0 +1,87 @@
1 +defmodule LambentEx.Utils.Color do
2 +
3 + # floating point modulo 💍💍💍
4 + @spec _fmod(float, float) :: float
5 + defp _fmod(mod, b) when mod >= b do
6 + mod = mod - b
7 + _fmod(mod ,b)
8 + end
9 +
10 + defp _fmod(mod, _b) do
11 + mod
12 + end
13 +
14 + @spec fmod(float, float) :: float
15 + defp fmod(a, b) do
16 + a = abs(a)
17 + b = abs(b)
18 + mod = a
19 + _fmod(mod, b) |> abs
20 + end
21 +
22 + @spec sys_255_to_1([number]) :: [float]
23 + defp sys_255_to_1(values), do: values |> Enum.map(&(&1 / 255.0))
24 + @spec sys_1_to_255([number]) :: [number]
25 + defp sys_1_to_255(values), do: values |> Enum.map(&(&1 * 255))
26 +
27 + @spec _rgb_to_hsv([float]) :: [float]
28 + defp _rgb_to_hsv([r, g, b]) do
29 + maxc = Enum.max([r,g,b])
30 + minc = Enum.min([r,g,b])
31 +
32 + v = maxc
33 + if minc == maxc do
34 + [0.0, 0.0, v]
35 + else
36 + mami = maxc-minc
37 + s = (mami) / maxc
38 + rc = (maxc-r) / mami
39 + gc = (maxc-g) / mami
40 + bc = (maxc-b) / maxc-minc
41 + h = cond do
42 + r == maxc -> bc-gc
43 + g == maxc -> 2.0 + rc - bc
44 + true -> 4.0 + gc - rc
45 + end
46 + h = (h/6.0) |> fmod(1.0)
47 + [h, s, v]
48 + end
49 + end
50 +
51 + @spec _hsv_to_rgb([float]) :: [float]
52 + defp _hsv_to_rgb([_h, s, v]) when s == 0.0, do: [v, v, v]
53 +
54 + defp _hsv_to_rgb([h, s, v]) do
55 + i = (h * 6.0) |> trunc
56 + f = h * 6.0 - i
57 + p = v * (1.0 - s)
58 + q = v * (1.0 - s * f)
59 + t = v * (1.0 - s * (1.0 - f))
60 + i = i |> fmod(6.0)
61 +
62 + case i do
63 + 0 -> [v, t, p]
64 + 1 -> [q, v, p]
65 + 2 -> [p, v, t]
66 + 3 -> [p, q, v]
67 + 4 -> [t, p, v]
68 + 5 -> [v, p, q]
69 + end
70 + end
71 +
72 + @spec rgb_to_hsv([float]) :: [float]
73 + def rgb_to_hsv(rgb) do
74 + rgb
75 + |> sys_255_to_1
76 + |> _rgb_to_hsv
77 + |> sys_1_to_255
78 + end
79 +
80 + @spec hsv_to_rgb([float]) :: [float]
81 + def hsv_to_rgb(hsv) do
82 + hsv
83 + |> sys_255_to_1
84 + |> _hsv_to_rgb
85 + |> sys_1_to_255
86 + end
87 +end

Parents: 280b96e