@thi.ng/color 5.6.2 → 5.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +1 -1
- package/alpha.js +6 -10
- package/analog.js +35 -67
- package/api/constants.js +128 -156
- package/api/gradients.js +0 -1
- package/api/names.js +154 -151
- package/api/ranges.js +0 -1
- package/api/system.js +21 -26
- package/api.js +27 -32
- package/clamp.js +18 -29
- package/closest-hue.js +6 -12
- package/color-range.js +159 -228
- package/color.js +29 -28
- package/contrast.js +7 -17
- package/convert.js +19 -40
- package/cosine-gradients.js +177 -229
- package/css/css.js +27 -53
- package/css/parse-css.js +94 -160
- package/defcolor.js +97 -108
- package/distance.js +96 -187
- package/gradients.js +29 -37
- package/hcy/hcy-rgb.js +20 -13
- package/hcy/hcy.js +9 -11
- package/hsi/hsi-rgb.js +32 -30
- package/hsi/hsi.js +9 -11
- package/hsl/hsl-css.js +9 -10
- package/hsl/hsl-hsv.js +12 -9
- package/hsl/hsl-rgb.js +14 -6
- package/hsl/hsl.js +14 -16
- package/hsv/hsv-css.js +4 -1
- package/hsv/hsv-hsl.js +11 -8
- package/hsv/hsv-rgb.js +14 -6
- package/hsv/hsv.js +14 -16
- package/hue.js +12 -12
- package/int/int-css.js +10 -6
- package/int/int-int.js +6 -10
- package/int/int-rgb.js +16 -5
- package/int/int-srgb.js +22 -4
- package/int/int.js +136 -142
- package/internal/css.js +16 -12
- package/internal/dispatch.js +6 -2
- package/internal/ensure.js +18 -16
- package/internal/matrix-ops.js +39 -41
- package/internal/scale.js +4 -2
- package/invert.js +46 -39
- package/is-black.js +12 -5
- package/is-gamut.js +8 -13
- package/is-gray.js +12 -5
- package/is-white.js +14 -7
- package/lab/lab-css.js +4 -9
- package/lab/lab-lab.js +6 -2
- package/lab/lab-lch.js +18 -10
- package/lab/lab-rgb.js +6 -14
- package/lab/lab-xyz.js +16 -20
- package/lab/lab50.js +18 -15
- package/lab/lab65.js +18 -15
- package/lch/lch-css.js +4 -9
- package/lch/lch.js +18 -23
- package/lighten.js +13 -17
- package/linear.js +6 -16
- package/luminance-rgb.js +14 -22
- package/luminance.js +16 -14
- package/max-chroma.js +1340 -227
- package/mix.js +34 -82
- package/oklab/oklab-css.js +4 -9
- package/oklab/oklab-rgb.js +17 -23
- package/oklab/oklab-xyz.js +22 -9
- package/oklab/oklab.js +19 -22
- package/oklch/oklab-oklch.js +10 -11
- package/oklch/oklch-css.js +4 -9
- package/oklch/oklch-oklab.js +9 -9
- package/oklch/oklch.js +14 -20
- package/package.json +19 -17
- package/rgb/hue-rgb.js +14 -11
- package/rgb/kelvin-rgba.js +23 -22
- package/rgb/rgb-css.js +4 -1
- package/rgb/rgb-hcv.js +14 -15
- package/rgb/rgb-hcy.js +10 -14
- package/rgb/rgb-hsi.js +13 -8
- package/rgb/rgb-hsl.js +8 -5
- package/rgb/rgb-hsv.js +7 -4
- package/rgb/rgb-lab.js +6 -18
- package/rgb/rgb-oklab.js +13 -19
- package/rgb/rgb-srgb.js +18 -8
- package/rgb/rgb-xyz.js +6 -19
- package/rgb/rgb-ycc.js +12 -17
- package/rgb/rgb.js +25 -22
- package/rotate.js +25 -38
- package/sort.js +24 -72
- package/srgb/srgb-css.js +9 -9
- package/srgb/srgb-int.js +6 -10
- package/srgb/srgb-rgb.js +18 -8
- package/srgb/srgb.js +16 -13
- package/strategies.js +42 -112
- package/swatches.js +28 -5
- package/tint.js +27 -53
- package/transform.js +274 -149
- package/variations.js +10 -9
- package/xyy/xyy-xyz.js +12 -11
- package/xyy/xyy.js +16 -13
- package/xyz/wavelength-xyz.js +14 -28
- package/xyz/xyz-lab.js +17 -26
- package/xyz/xyz-oklab.js +4 -1
- package/xyz/xyz-rgb.js +6 -18
- package/xyz/xyz-xyy.js +13 -12
- package/xyz/xyz-xyz.js +6 -2
- package/xyz/xyz50.js +20 -17
- package/xyz/xyz65.js +20 -17
- package/ycc/ycc-rgb.js +14 -19
- package/ycc/ycc.js +12 -9
package/rgb/rgb-hsv.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { EPS } from "@thi.ng/math/api";
|
|
2
2
|
import { rgbHcv } from "./rgb-hcv.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
const rgbHsv = (out, src) => {
|
|
4
|
+
out = rgbHcv(out, src);
|
|
5
|
+
out[1] /= out[2] + EPS;
|
|
6
|
+
return out;
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
rgbHsv
|
|
7
10
|
};
|
package/rgb/rgb-lab.js
CHANGED
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
import { rgbXyz, rgbXyzD65 } from "./rgb-xyz.js";
|
|
2
2
|
import { xyzLab, xyzLabD65 } from "../xyz/xyz-lab.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*
|
|
10
|
-
* @param out -
|
|
11
|
-
* @param src -
|
|
12
|
-
*/
|
|
13
|
-
export const rgbLab = (out, src) => xyzLab(null, rgbXyz(out, src));
|
|
14
|
-
/**
|
|
15
|
-
* Same as {@link rgbLab}, but using {@link D65} white point.
|
|
16
|
-
*
|
|
17
|
-
* @param out -
|
|
18
|
-
* @param src -
|
|
19
|
-
*/
|
|
20
|
-
export const rgbLabD65 = (out, src) => xyzLabD65(null, rgbXyzD65(out, src));
|
|
3
|
+
const rgbLab = (out, src) => xyzLab(null, rgbXyz(out, src));
|
|
4
|
+
const rgbLabD65 = (out, src) => xyzLabD65(null, rgbXyzD65(out, src));
|
|
5
|
+
export {
|
|
6
|
+
rgbLab,
|
|
7
|
+
rgbLabD65
|
|
8
|
+
};
|
package/rgb/rgb-oklab.js
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
import { powN3 } from "@thi.ng/vectors/pown";
|
|
2
2
|
import { OKLAB_M2 } from "../api/constants.js";
|
|
3
3
|
import { __mulV33 } from "../internal/matrix-ops.js";
|
|
4
|
-
/**
|
|
5
|
-
* @remarks
|
|
6
|
-
* Reference:
|
|
7
|
-
* - https://bottosson.github.io/posts/oklab/#converting-from-linear-srgb-to-oklab
|
|
8
|
-
*
|
|
9
|
-
* @internal
|
|
10
|
-
*/
|
|
11
|
-
// prettier-ignore
|
|
12
4
|
const CONE_LMS = [
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
0.4122214708,
|
|
6
|
+
0.2119034982,
|
|
7
|
+
0.0883024619,
|
|
8
|
+
0.5363325363,
|
|
9
|
+
0.6806995451,
|
|
10
|
+
0.2817188376,
|
|
11
|
+
0.0514459929,
|
|
12
|
+
0.1073969566,
|
|
13
|
+
0.6299787005
|
|
16
14
|
];
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
* @param out -
|
|
22
|
-
* @param src -
|
|
23
|
-
*/
|
|
24
|
-
export const rgbOklab = (out, src) => __mulV33(null, OKLAB_M2, powN3(null, __mulV33(out, CONE_LMS, src), 1 / 3));
|
|
15
|
+
const rgbOklab = (out, src) => __mulV33(null, OKLAB_M2, powN3(null, __mulV33(out, CONE_LMS, src), 1 / 3));
|
|
16
|
+
export {
|
|
17
|
+
rgbOklab
|
|
18
|
+
};
|
package/rgb/rgb-srgb.js
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import { setC4 } from "@thi.ng/vectors/setc";
|
|
2
2
|
import { __ensureAlpha } from "../internal/ensure.js";
|
|
3
3
|
import { linearSrgb } from "../linear.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
const rgbSrgb = (out, src) => setC4(
|
|
5
|
+
out || src,
|
|
6
|
+
linearSrgb(src[0]),
|
|
7
|
+
linearSrgb(src[1]),
|
|
8
|
+
linearSrgb(src[2]),
|
|
9
|
+
__ensureAlpha(src[3])
|
|
10
|
+
);
|
|
11
11
|
const GAMMA = 1 / 2.2;
|
|
12
|
-
|
|
12
|
+
const rgbSrgbApprox = (out, src) => setC4(
|
|
13
|
+
out || src,
|
|
14
|
+
src[0] ** GAMMA,
|
|
15
|
+
src[1] ** GAMMA,
|
|
16
|
+
src[2] ** GAMMA,
|
|
17
|
+
__ensureAlpha(src[3])
|
|
18
|
+
);
|
|
19
|
+
export {
|
|
20
|
+
rgbSrgb,
|
|
21
|
+
rgbSrgbApprox
|
|
22
|
+
};
|
package/rgb/rgb-xyz.js
CHANGED
|
@@ -1,22 +1,9 @@
|
|
|
1
1
|
import { RGB_XYZ_D50, RGB_XYZ_D65 } from "../api/constants.js";
|
|
2
2
|
import { clamp } from "../clamp.js";
|
|
3
3
|
import { __mulV33 } from "../internal/matrix-ops.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* @param out - result
|
|
11
|
-
* @param src - source color
|
|
12
|
-
* @param mat - transform matrix
|
|
13
|
-
*/
|
|
14
|
-
export const rgbXyz = (out, src, mat = RGB_XYZ_D50) => __mulV33(null, mat, clamp(out, src));
|
|
15
|
-
/**
|
|
16
|
-
* Same as {@link rgbXyz}, but hard coded to use {@link D65} white point (via
|
|
17
|
-
* {@link RGB_XYZ_D65} matrix).
|
|
18
|
-
*
|
|
19
|
-
* @param out -
|
|
20
|
-
* @param src -
|
|
21
|
-
*/
|
|
22
|
-
export const rgbXyzD65 = (out, src) => rgbXyz(out, src, RGB_XYZ_D65);
|
|
4
|
+
const rgbXyz = (out, src, mat = RGB_XYZ_D50) => __mulV33(null, mat, clamp(out, src));
|
|
5
|
+
const rgbXyzD65 = (out, src) => rgbXyz(out, src, RGB_XYZ_D65);
|
|
6
|
+
export {
|
|
7
|
+
rgbXyz,
|
|
8
|
+
rgbXyzD65
|
|
9
|
+
};
|
package/rgb/rgb-ycc.js
CHANGED
|
@@ -2,21 +2,16 @@ import { dot3 } from "@thi.ng/vectors/dot";
|
|
|
2
2
|
import { setC4 } from "@thi.ng/vectors/setc";
|
|
3
3
|
import { RGB_LUMINANCE_REC709 } from "../api/constants.js";
|
|
4
4
|
import { __ensureAlpha } from "../internal/ensure.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
* @param luma -
|
|
18
|
-
*/
|
|
19
|
-
export const rgbYcc = (out, src, luma = RGB_LUMINANCE_REC709) => {
|
|
20
|
-
const y = dot3(src, luma);
|
|
21
|
-
return setC4(out || src, y, (0.5 * (src[2] - y)) / (1 - luma[2]), (0.5 * (src[0] - y)) / (1 - luma[0]), __ensureAlpha(src[3]));
|
|
5
|
+
const rgbYcc = (out, src, luma = RGB_LUMINANCE_REC709) => {
|
|
6
|
+
const y = dot3(src, luma);
|
|
7
|
+
return setC4(
|
|
8
|
+
out || src,
|
|
9
|
+
y,
|
|
10
|
+
0.5 * (src[2] - y) / (1 - luma[2]),
|
|
11
|
+
0.5 * (src[0] - y) / (1 - luma[0]),
|
|
12
|
+
__ensureAlpha(src[3])
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
rgbYcc
|
|
22
17
|
};
|
package/rgb/rgb.js
CHANGED
|
@@ -12,26 +12,29 @@ import { srgbRgb } from "../srgb/srgb-rgb.js";
|
|
|
12
12
|
import { xyyXyz } from "../xyy/xyy-xyz.js";
|
|
13
13
|
import { xyzRgb, xyzRgbD65 } from "../xyz/xyz-rgb.js";
|
|
14
14
|
import { yccRgb } from "../ycc/ycc-rgb.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
15
|
+
const rgb = defColor({
|
|
16
|
+
mode: "rgb",
|
|
17
|
+
order: ["r", "g", "b", "alpha"],
|
|
18
|
+
from: {
|
|
19
|
+
abgr32: (out, src) => intAbgr32Rgb(out, src[0]),
|
|
20
|
+
argb32: (out, src) => intArgb32Rgb(out, src[0]),
|
|
21
|
+
hcy: hcyRgb,
|
|
22
|
+
hsi: hsiRgb,
|
|
23
|
+
hsl: hslRgb,
|
|
24
|
+
hsv: hsvRgb,
|
|
25
|
+
lab50: labRgb,
|
|
26
|
+
lab65: labRgbD65,
|
|
27
|
+
lch: [lchLab, labRgb],
|
|
28
|
+
oklab: oklabRgb,
|
|
29
|
+
rgb: set4,
|
|
30
|
+
srgb: srgbRgb,
|
|
31
|
+
xyy: [xyyXyz, xyzRgbD65],
|
|
32
|
+
xyz50: xyzRgb,
|
|
33
|
+
xyz65: xyzRgbD65,
|
|
34
|
+
ycc: yccRgb
|
|
35
|
+
},
|
|
36
|
+
toRgb: set4
|
|
37
37
|
});
|
|
38
|
+
export {
|
|
39
|
+
rgb
|
|
40
|
+
};
|
package/rotate.js
CHANGED
|
@@ -3,41 +3,28 @@ import { fract } from "@thi.ng/math/prec";
|
|
|
3
3
|
import { setC4 } from "@thi.ng/vectors/setc";
|
|
4
4
|
import { __dispatch1 } from "./internal/dispatch.js";
|
|
5
5
|
import { __ensureAlpha } from "./internal/ensure.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
hsl: (out, src, theta) => setC4(out || src, fract(src[0] + theta), src[1], src[2], __ensureAlpha(src[3])),
|
|
32
|
-
lch: (out, src, theta) => setC4(out || src, src[0], src[1], fract(src[2] + theta), __ensureAlpha(src[3])),
|
|
33
|
-
});
|
|
34
|
-
/**
|
|
35
|
-
* Syntax sugar for {@link rotate} with 180 degree rotation.
|
|
36
|
-
*
|
|
37
|
-
* @remarks
|
|
38
|
-
* If `out` is null, the resulting color will be written back into `src`.
|
|
39
|
-
*
|
|
40
|
-
* @param out
|
|
41
|
-
* @param src
|
|
42
|
-
*/
|
|
43
|
-
export const complementary = (out, src) => rotate(out, src, 0.5);
|
|
6
|
+
const rotate = defmulti(
|
|
7
|
+
__dispatch1,
|
|
8
|
+
{ hcy: "hsl", hsi: "hsl", hsv: "hsl", oklch: "lch" },
|
|
9
|
+
{
|
|
10
|
+
hsl: (out, src, theta) => setC4(
|
|
11
|
+
out || src,
|
|
12
|
+
fract(src[0] + theta),
|
|
13
|
+
src[1],
|
|
14
|
+
src[2],
|
|
15
|
+
__ensureAlpha(src[3])
|
|
16
|
+
),
|
|
17
|
+
lch: (out, src, theta) => setC4(
|
|
18
|
+
out || src,
|
|
19
|
+
src[0],
|
|
20
|
+
src[1],
|
|
21
|
+
fract(src[2] + theta),
|
|
22
|
+
__ensureAlpha(src[3])
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
const complementary = (out, src) => rotate(out, src, 0.5);
|
|
27
|
+
export {
|
|
28
|
+
complementary,
|
|
29
|
+
rotate
|
|
30
|
+
};
|
package/sort.js
CHANGED
|
@@ -5,77 +5,29 @@ import { swap } from "@thi.ng/arrays/swap";
|
|
|
5
5
|
import { compareNumAsc, compareNumDesc } from "@thi.ng/compare/numeric";
|
|
6
6
|
import { distEucledian3 } from "./distance.js";
|
|
7
7
|
import { intAbgr32Srgb } from "./int/int-srgb.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*
|
|
15
|
-
* @param target -
|
|
16
|
-
* @param dist -
|
|
17
|
-
*/
|
|
18
|
-
export const proximity = (target, dist = distEucledian3) => (col) => dist(target, col);
|
|
19
|
-
/**
|
|
20
|
-
* Similar to {@link proximity}, but intended as syntax sugar for {@link ABGR}
|
|
21
|
-
* input colors. The proximity will still be computed using given distance
|
|
22
|
-
* function (default: {@link distEucledian3}) and will be in sRGB space. Hence
|
|
23
|
-
* given `target` color should be provided in the same space too.
|
|
24
|
-
*
|
|
25
|
-
* @param target -
|
|
26
|
-
* @param dist -
|
|
27
|
-
*/
|
|
28
|
-
export const proximityABGR32 = (target, dist = distEucledian3) => (col) => dist(target, intAbgr32Srgb([], col[0]));
|
|
29
|
-
export const sort = (colors, key, isReverse = false) => sortByCachedKey(colors, key, isReverse ? compareNumDesc : compareNumAsc);
|
|
30
|
-
/**
|
|
31
|
-
* Similar to {@link sort}, but only for memory mapped colors (e.g. mapping a
|
|
32
|
-
* pixel buffer). Does NOT change the order of elements in given `colors` array,
|
|
33
|
-
* BUT sorts the **apparent** order by swapping the contents of the backing
|
|
34
|
-
* memory.
|
|
35
|
-
*
|
|
36
|
-
* ```ts
|
|
37
|
-
* // memory buffer of 4 sRGB colors
|
|
38
|
-
* const buf = new Float32Array([0,1,0,1, 0,0.5,0,1, 0,0.25,0,1, 0,0.75,0,1]);
|
|
39
|
-
*
|
|
40
|
-
* // map buffer (creates 4 SRGB instances linked to the buffer)
|
|
41
|
-
* const pix = srgb.mapBuffer(buf);
|
|
42
|
-
*
|
|
43
|
-
* // display original order
|
|
44
|
-
* pix.map(css);
|
|
45
|
-
* // [ '#00ff00', '#008000', '#004000', '#00bf00' ]
|
|
46
|
-
*
|
|
47
|
-
* // sort colors (buffer!) by luminance
|
|
48
|
-
* sortMapped(pix, luminanceSrgb);
|
|
49
|
-
*
|
|
50
|
-
* // new order
|
|
51
|
-
* pix.map(css);
|
|
52
|
-
* // [ '#004000', '#008000', '#00bf00', '#00ff00' ]
|
|
53
|
-
*
|
|
54
|
-
* // buffer contents have been re-ordered
|
|
55
|
-
* buf
|
|
56
|
-
* // Float32Array(16) [
|
|
57
|
-
* // 0, 0.25, 0, 1, 0,
|
|
58
|
-
* // 0.5, 0, 1, 0, 0.75,
|
|
59
|
-
* // 0, 1, 0, 1, 0,
|
|
60
|
-
* // 1
|
|
61
|
-
* // ]
|
|
62
|
-
* ```
|
|
63
|
-
*
|
|
64
|
-
* @param colors -
|
|
65
|
-
* @param key -
|
|
66
|
-
* @param isReverse -
|
|
67
|
-
*/
|
|
68
|
-
export const sortMapped = (colors, key, isReverse = false) => {
|
|
69
|
-
if (!colors.length)
|
|
70
|
-
return colors;
|
|
71
|
-
const keys = colors.map(key);
|
|
72
|
-
const tmp = typedArray(typedArrayType(colors[0].buf), colors[0].length);
|
|
73
|
-
quickSort(keys, isReverse ? compareNumDesc : compareNumAsc, (_, x, y) => {
|
|
74
|
-
swap(keys, x, y);
|
|
75
|
-
tmp.set(colors[x]);
|
|
76
|
-
colors[x].set(colors[y]);
|
|
77
|
-
colors[y].set(tmp);
|
|
78
|
-
});
|
|
8
|
+
const selectChannel = (id) => (col) => col[id];
|
|
9
|
+
const proximity = (target, dist = distEucledian3) => (col) => dist(target, col);
|
|
10
|
+
const proximityABGR32 = (target, dist = distEucledian3) => (col) => dist(target, intAbgr32Srgb([], col[0]));
|
|
11
|
+
const sort = (colors, key, isReverse = false) => sortByCachedKey(colors, key, isReverse ? compareNumDesc : compareNumAsc);
|
|
12
|
+
const sortMapped = (colors, key, isReverse = false) => {
|
|
13
|
+
if (!colors.length)
|
|
79
14
|
return colors;
|
|
15
|
+
const keys = colors.map(key);
|
|
16
|
+
const tmp = typedArray(typedArrayType(colors[0].buf), colors[0].length);
|
|
17
|
+
quickSort(keys, isReverse ? compareNumDesc : compareNumAsc, (_, x, y) => {
|
|
18
|
+
swap(keys, x, y);
|
|
19
|
+
tmp.set(colors[x]);
|
|
20
|
+
colors[x].set(colors[y]);
|
|
21
|
+
colors[y].set(tmp);
|
|
22
|
+
});
|
|
23
|
+
return colors;
|
|
24
|
+
};
|
|
25
|
+
const mostSimilar = (colors, key) => sort(colors.slice(), key)[0];
|
|
26
|
+
export {
|
|
27
|
+
mostSimilar,
|
|
28
|
+
proximity,
|
|
29
|
+
proximityABGR32,
|
|
30
|
+
selectChannel,
|
|
31
|
+
sort,
|
|
32
|
+
sortMapped
|
|
80
33
|
};
|
|
81
|
-
export const mostSimilar = (colors, key) => sort(colors.slice(), key)[0];
|
package/srgb/srgb-css.js
CHANGED
|
@@ -2,13 +2,13 @@ import { U24 } from "@thi.ng/strings/radix";
|
|
|
2
2
|
import { FF } from "../api/constants.js";
|
|
3
3
|
import { __ensureAlpha } from "../internal/ensure.js";
|
|
4
4
|
import { __scale8bit } from "../internal/scale.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
const srgbCss = (src) => {
|
|
6
|
+
const r = __scale8bit(src[0]);
|
|
7
|
+
const g = __scale8bit(src[1]);
|
|
8
|
+
const b = __scale8bit(src[2]);
|
|
9
|
+
const a = __ensureAlpha(src[3]);
|
|
10
|
+
return a < 1 ? `rgba(${r},${g},${b},${FF(a)})` : `#${U24(r << 16 | g << 8 | b)}`;
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
srgbCss
|
|
14
14
|
};
|
package/srgb/srgb-int.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { clamp01 } from "@thi.ng/math/interval";
|
|
2
2
|
import { __ensureAlpha } from "../internal/ensure.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
((clamp01(src[2]) * 0xff + 0.5) << 16) |
|
|
10
|
-
((clamp01(src[1]) * 0xff + 0.5) << 8) |
|
|
11
|
-
(clamp01(src[0]) * 0xff + 0.5)) >>>
|
|
12
|
-
0;
|
|
3
|
+
const srgbIntArgb32 = (src) => (__ensureAlpha(src[3]) * 255 + 0.5 << 24 | clamp01(src[0]) * 255 + 0.5 << 16 | clamp01(src[1]) * 255 + 0.5 << 8 | clamp01(src[2]) * 255 + 0.5) >>> 0;
|
|
4
|
+
const srgbIntAbgr32 = (src) => (__ensureAlpha(src[3]) * 255 + 0.5 << 24 | clamp01(src[2]) * 255 + 0.5 << 16 | clamp01(src[1]) * 255 + 0.5 << 8 | clamp01(src[0]) * 255 + 0.5) >>> 0;
|
|
5
|
+
export {
|
|
6
|
+
srgbIntAbgr32,
|
|
7
|
+
srgbIntArgb32
|
|
8
|
+
};
|
package/srgb/srgb-rgb.js
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import { setC4 } from "@thi.ng/vectors/setc";
|
|
2
2
|
import { __ensureAlpha } from "../internal/ensure.js";
|
|
3
3
|
import { srgbLinear } from "../linear.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
const srgbRgb = (out, src) => setC4(
|
|
5
|
+
out || src,
|
|
6
|
+
srgbLinear(src[0]),
|
|
7
|
+
srgbLinear(src[1]),
|
|
8
|
+
srgbLinear(src[2]),
|
|
9
|
+
__ensureAlpha(src[3])
|
|
10
|
+
);
|
|
11
11
|
const GAMMA = 2.2;
|
|
12
|
-
|
|
12
|
+
const srgbRgbApprox = (out, src) => setC4(
|
|
13
|
+
out || src,
|
|
14
|
+
src[0] ** GAMMA,
|
|
15
|
+
src[1] ** GAMMA,
|
|
16
|
+
src[2] ** GAMMA,
|
|
17
|
+
__ensureAlpha(src[3])
|
|
18
|
+
);
|
|
19
|
+
export {
|
|
20
|
+
srgbRgb,
|
|
21
|
+
srgbRgbApprox
|
|
22
|
+
};
|
package/srgb/srgb.js
CHANGED
|
@@ -6,17 +6,20 @@ import { hsvRgb } from "../hsv/hsv-rgb.js";
|
|
|
6
6
|
import { intAbgr32Srgb, intArgb32Srgb } from "../int/int-srgb.js";
|
|
7
7
|
import { rgbSrgb } from "../rgb/rgb-srgb.js";
|
|
8
8
|
import { srgbRgb } from "./srgb-rgb.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
9
|
+
const srgb = defColor({
|
|
10
|
+
mode: "srgb",
|
|
11
|
+
order: ["r", "g", "b", "alpha"],
|
|
12
|
+
from: {
|
|
13
|
+
abgr32: (out, src) => intAbgr32Srgb(out, src[0]),
|
|
14
|
+
argb32: (out, src) => intArgb32Srgb(out, src[0]),
|
|
15
|
+
hcy: hcyRgb,
|
|
16
|
+
hsi: hsiRgb,
|
|
17
|
+
hsl: hslRgb,
|
|
18
|
+
hsv: hsvRgb,
|
|
19
|
+
rgb: rgbSrgb
|
|
20
|
+
},
|
|
21
|
+
toRgb: srgbRgb
|
|
22
22
|
});
|
|
23
|
+
export {
|
|
24
|
+
srgb
|
|
25
|
+
};
|