neiam
/lambent_ex
Lambent Aether 5
public · Issues · Pulls 1 · Labels · Forks · Compare · Actions success · Badges · Packages
⭐
Log in to mark this repository.
colorsys port wewlad
9f986ce · gmorell · 2022-11-23 05:32
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