@thi.ng/color
Version:
Array-based color types, CSS parsing, conversions, transformations, declarative theme generation, gradients, presets
66 lines (65 loc) • 1.55 kB
JavaScript
import { defmulti } from "@thi.ng/defmulti/defmulti";
import { fit } from "@thi.ng/math/fit";
import { fract } from "@thi.ng/math/prec";
import { ONE3 } from "@thi.ng/vectors/api";
import { setC4 } from "@thi.ng/vectors/setc";
import { sub3 } from "@thi.ng/vectors/sub";
import { clamp } from "./clamp.js";
import { __dispatch1 } from "./internal/dispatch.js";
import { __ensureAlpha } from "./internal/ensure.js";
const invertRgb = (out, src) => {
out = clamp(out || src, src);
return sub3(out, ONE3, out);
};
const invertInt = (src) => src ^ 16777215;
const invert = defmulti(
__dispatch1,
{
hcy: "hsv",
hsi: "hsv",
hsl: "hsv",
labD65: "labD50",
oklab: "labD50",
srgb: "rgb"
},
{
hsv: (out, src) => setC4(
out || src,
fract(src[0] + 0.5),
src[1],
1 - src[2],
__ensureAlpha(src[3])
),
labD50: (out, src) => {
const [min, max] = src.range;
return setC4(
out || src,
1 - src[0],
__invert1(src[1], min[1], max[1]),
__invert1(src[2], min[2], max[2]),
__ensureAlpha(src[3])
);
},
lch: (out, src) => setC4(
out || src,
1 - src[0],
src[1],
fract(src[2] + 0.5),
__ensureAlpha(src[3])
),
rgb: invertRgb,
ycc: (out, src) => setC4(
out || src,
1 - src[0],
__invert1(src[1], -0.5, 0.5),
__invert1(src[2], -0.5, 0.5),
__ensureAlpha(src[3])
)
}
);
const __invert1 = (x, a, b) => fit(x, a, b, b, a);
export {
invert,
invertInt,
invertRgb
};