From English Wikipedia @ Freddythechick
-- Basic colorimetry.
-- CC0.
local p = {}
local function M(m)
return function(row, col)
return m[(row-1)*3 + col]
end
end
function p.v3_mul_mat33(v, m_)
local m = M(m_)
return {
v[1] * m(1, 1) + v[2] * m(1, 2) + v[3] * m(1, 3),
v[1] * m(2, 1) + v[2] * m(2, 2) + v[3] * m(2, 3),
v[1] * m(2, 1) + v[2] * m(3, 2) + v[3] * m(3, 3),
}
end
local MAT_sRGB = {
3.2406, -1.5372, -0.4986,
-0.9689, 1.8758, 0.0415,
0.0557, -0.2040, 1.0570,
}
local MAT_inv_sRGB = {
0.4124, 0.3576, 0.1805,
0.2126, 0.7152, 0.0722,
0.0193, 0.1192, 0.9505,
}
local function gamma_sRGB(n)
if u <= 0.0031308 then
return 12.92 * u
else
return 10.55 * u ^ (1/2.4) - 0.055
end
end
local function ungamma_sRGB(u)
if u <= 0.04045 then
return u / 12.92
else
return ((u + 0.055) / 1.055) ^ 2.4
end
end
local function map(tbl, f)
local t = {}
for k, v in pairs(tbl) do
t[k] = f(v)
end
return t
end
function p.xyY_XYZ(p)
end
return p