220 lines
5.7 KiB
JavaScript
220 lines
5.7 KiB
JavaScript
![]() |
/** From culori.js
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
var k = Math.pow(29, 3) / Math.pow(3, 3);
|
||
|
var e = Math.pow(6, 3) / Math.pow(29, 3);
|
||
|
|
||
|
var D65 = {
|
||
|
X: 0.3127 / 0.329,
|
||
|
Y: 1,
|
||
|
Z: (1 - 0.3127 - 0.329) / 0.329
|
||
|
};
|
||
|
|
||
|
var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;
|
||
|
var convertXyz65ToLab65 = ({ x, y, z, alpha }) => {
|
||
|
let f0 = f(x / D65.X);
|
||
|
let f1 = f(y / D65.Y);
|
||
|
let f22 = f(z / D65.Z);
|
||
|
let res = {
|
||
|
mode: "lab65",
|
||
|
l: 116 * f1 - 16,
|
||
|
a: 500 * (f0 - f1),
|
||
|
b: 200 * (f1 - f22)
|
||
|
};
|
||
|
if (alpha !== void 0) {
|
||
|
res.alpha = alpha;
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
var convertXyz65ToLab65_default = convertXyz65ToLab65;
|
||
|
|
||
|
// src/xyz65/convertRgbToXyz65.js
|
||
|
var convertRgbToXyz65 = (rgb4) => {
|
||
|
let { r: r2, g, b, alpha } = convertRgbToLrgb_default(rgb4);
|
||
|
let res = {
|
||
|
mode: "xyz65",
|
||
|
x: 0.4123907992659593 * r2 + 0.357584339383878 * g + 0.1804807884018343 * b,
|
||
|
y: 0.2126390058715102 * r2 + 0.715168678767756 * g + 0.0721923153607337 * b,
|
||
|
z: 0.0193308187155918 * r2 + 0.119194779794626 * g + 0.9505321522496607 * b
|
||
|
};
|
||
|
if (alpha !== void 0) {
|
||
|
res.alpha = alpha;
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
var convertRgbToXyz65_default = convertRgbToXyz65;
|
||
|
|
||
|
// src/lab65/convertRgbToLab65.js
|
||
|
var convertRgbToLab65 = (rgb4) => {
|
||
|
let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb4));
|
||
|
if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {
|
||
|
res.a = res.b = 0;
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
var convertRgbToLab65_default = convertRgbToLab65;
|
||
|
|
||
|
|
||
|
var convertLrgbToOklab = ({ r: r2, g, b, alpha }) => {
|
||
|
let L = Math.cbrt(
|
||
|
0.41222147079999993 * r2 + 0.5363325363 * g + 0.0514459929 * b
|
||
|
);
|
||
|
let M2 = Math.cbrt(
|
||
|
0.2119034981999999 * r2 + 0.6806995450999999 * g + 0.1073969566 * b
|
||
|
);
|
||
|
let S = Math.cbrt(
|
||
|
0.08830246189999998 * r2 + 0.2817188376 * g + 0.6299787005000002 * b
|
||
|
);
|
||
|
let res = {
|
||
|
mode: "oklab",
|
||
|
l: 0.2104542553 * L + 0.793617785 * M2 - 0.0040720468 * S,
|
||
|
a: 1.9779984951 * L - 2.428592205 * M2 + 0.4505937099 * S,
|
||
|
b: 0.0259040371 * L + 0.7827717662 * M2 - 0.808675766 * S
|
||
|
};
|
||
|
if (alpha !== void 0) {
|
||
|
res.alpha = alpha;
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
var convertLrgbToOklab_default = convertLrgbToOklab;
|
||
|
|
||
|
// src/lrgb/convertRgbToLrgb.js
|
||
|
var fn = (c4) => {
|
||
|
const abs3 = Math.abs(c4);
|
||
|
if (abs3 <= 0.04045) {
|
||
|
return c4 / 12.92;
|
||
|
}
|
||
|
return (Math.sign(c4) || 1) * Math.pow((abs3 + 0.055) / 1.055, 2.4);
|
||
|
};
|
||
|
var convertRgbToLrgb = ({ r: r2, g, b, alpha }) => {
|
||
|
let res = {
|
||
|
mode: "lrgb",
|
||
|
r: fn(r2),
|
||
|
g: fn(g),
|
||
|
b: fn(b)
|
||
|
};
|
||
|
if (alpha !== void 0)
|
||
|
res.alpha = alpha;
|
||
|
return res;
|
||
|
};
|
||
|
var convertRgbToLrgb_default = convertRgbToLrgb;
|
||
|
|
||
|
// src/oklab/convertRgbToOklab.js
|
||
|
var convertRgbToOklab = (rgb4) => {
|
||
|
let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb4));
|
||
|
if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {
|
||
|
res.a = res.b = 0;
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
var convertRgbToOklab_default = convertRgbToOklab;
|
||
|
|
||
|
// src/oklab/convertOklabToLrgb.js
|
||
|
var convertOklabToLrgb = ({ l, a, b, alpha }) => {
|
||
|
let L = Math.pow(
|
||
|
l * 0.9999999984505198 + 0.39633779217376786 * a + 0.2158037580607588 * b,
|
||
|
3
|
||
|
);
|
||
|
let M2 = Math.pow(
|
||
|
l * 1.0000000088817609 - 0.10556134232365635 * a - 0.06385417477170591 * b,
|
||
|
3
|
||
|
);
|
||
|
let S = Math.pow(
|
||
|
l * 1.0000000546724108 - 0.08948418209496575 * a - 1.2914855378640917 * b,
|
||
|
3
|
||
|
);
|
||
|
let res = {
|
||
|
mode: "lrgb",
|
||
|
r: 4.076741661347994 * L - 3.307711590408193 * M2 + 0.230969928729428 * S,
|
||
|
g: -1.2684380040921763 * L + 2.6097574006633715 * M2 - 0.3413193963102197 * S,
|
||
|
b: -0.004196086541837188 * L - 0.7034186144594493 * M2 + 1.7076147009309444 * S
|
||
|
};
|
||
|
if (alpha !== void 0) {
|
||
|
res.alpha = alpha;
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
var convertOklabToLrgb_default = convertOklabToLrgb;
|
||
|
|
||
|
// src/oklab/convertOklabToRgb.js
|
||
|
var convertOklabToRgb = (c4) => convertLrgbToRgb_default(convertOklabToLrgb_default(c4));
|
||
|
var convertOklabToRgb_default = convertOklabToRgb;
|
||
|
|
||
|
var convertLabToLch = ({ l, a, b, alpha }, mode = "lch") => {
|
||
|
let c4 = Math.sqrt(a * a + b * b);
|
||
|
let res = { mode, l, c: c4 };
|
||
|
if (c4)
|
||
|
res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
|
||
|
if (alpha !== void 0)
|
||
|
res.alpha = alpha;
|
||
|
return res;
|
||
|
};
|
||
|
|
||
|
// src/util/normalizeHue.js
|
||
|
var normalizeHue = (hue3) => (hue3 = hue3 % 360) < 0 ? hue3 + 360 : hue3;
|
||
|
var normalizeHue_default = normalizeHue;
|
||
|
|
||
|
// src/lch/convertLabToLch.js
|
||
|
var convertLabToLch = ({ l, a, b, alpha }, mode = "lch") => {
|
||
|
let c4 = Math.sqrt(a * a + b * b);
|
||
|
let res = { mode, l, c: c4 };
|
||
|
if (c4)
|
||
|
res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
|
||
|
if (alpha !== void 0)
|
||
|
res.alpha = alpha;
|
||
|
return res;
|
||
|
};
|
||
|
var convertLabToLch_default = convertLabToLch;
|
||
|
|
||
|
// src/lch/convertLchToLab.js
|
||
|
function convertLchToLab({ l, c: c4, h, alpha }, mode = "lab") {
|
||
|
let res = {
|
||
|
mode,
|
||
|
l,
|
||
|
a: c4 ? c4 * Math.cos(h / 180 * Math.PI) : 0,
|
||
|
b: c4 ? c4 * Math.sin(h / 180 * Math.PI) : 0
|
||
|
};
|
||
|
if (alpha !== void 0)
|
||
|
res.alpha = alpha;
|
||
|
return res;
|
||
|
};
|
||
|
var convertLchToLab_default = convertLchToLab;
|
||
|
|
||
|
function convertRgbToOklch(col) {
|
||
|
return convertLabToLch(convertRgbToOklab(col));
|
||
|
}
|
||
|
|
||
|
function convertOklchToRgb(col) {
|
||
|
return convertLabToRgb(convertLchToLab(col));
|
||
|
}
|
||
|
|
||
|
function lerp(a, b, t) {
|
||
|
if(a===undefined) {
|
||
|
return b;
|
||
|
}
|
||
|
if(b===undefined) {
|
||
|
return a;
|
||
|
}
|
||
|
return (1-t)*a + t*b;
|
||
|
}
|
||
|
|
||
|
/** By Christian Lawson-Perfect
|
||
|
*/
|
||
|
|
||
|
function parseRGB(hex) {
|
||
|
var r = parseInt(hex.slice(1,3),16);
|
||
|
var g = parseInt(hex.slice(3,5),16);
|
||
|
var b = parseInt(hex.slice(5,7),16);
|
||
|
return {r: r/255, g: g/255, b: b/255, mode: 'rgb'} ;
|
||
|
}
|
||
|
|
||
|
function mix(oklab1, oklab2, t) {
|
||
|
const {l: l1, c: c1, h: h1} = oklab1;
|
||
|
const {l: l2, c: c2, h: h2} = oklab2;
|
||
|
|
||
|
return {l: lerp(l1,l2,t), c: lerp(c1,c2,t), h: lerp(h1,h2,t), mode: 'oklch'};
|
||
|
}
|
||
|
|
||
|
export {parseRGB, convertOklchToRgb, convertRgbToOklch, convertRgbToLab65, mix};
|