@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.
Files changed (111) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +1 -1
  3. package/alpha.js +6 -10
  4. package/analog.js +35 -67
  5. package/api/constants.js +128 -156
  6. package/api/gradients.js +0 -1
  7. package/api/names.js +154 -151
  8. package/api/ranges.js +0 -1
  9. package/api/system.js +21 -26
  10. package/api.js +27 -32
  11. package/clamp.js +18 -29
  12. package/closest-hue.js +6 -12
  13. package/color-range.js +159 -228
  14. package/color.js +29 -28
  15. package/contrast.js +7 -17
  16. package/convert.js +19 -40
  17. package/cosine-gradients.js +177 -229
  18. package/css/css.js +27 -53
  19. package/css/parse-css.js +94 -160
  20. package/defcolor.js +97 -108
  21. package/distance.js +96 -187
  22. package/gradients.js +29 -37
  23. package/hcy/hcy-rgb.js +20 -13
  24. package/hcy/hcy.js +9 -11
  25. package/hsi/hsi-rgb.js +32 -30
  26. package/hsi/hsi.js +9 -11
  27. package/hsl/hsl-css.js +9 -10
  28. package/hsl/hsl-hsv.js +12 -9
  29. package/hsl/hsl-rgb.js +14 -6
  30. package/hsl/hsl.js +14 -16
  31. package/hsv/hsv-css.js +4 -1
  32. package/hsv/hsv-hsl.js +11 -8
  33. package/hsv/hsv-rgb.js +14 -6
  34. package/hsv/hsv.js +14 -16
  35. package/hue.js +12 -12
  36. package/int/int-css.js +10 -6
  37. package/int/int-int.js +6 -10
  38. package/int/int-rgb.js +16 -5
  39. package/int/int-srgb.js +22 -4
  40. package/int/int.js +136 -142
  41. package/internal/css.js +16 -12
  42. package/internal/dispatch.js +6 -2
  43. package/internal/ensure.js +18 -16
  44. package/internal/matrix-ops.js +39 -41
  45. package/internal/scale.js +4 -2
  46. package/invert.js +46 -39
  47. package/is-black.js +12 -5
  48. package/is-gamut.js +8 -13
  49. package/is-gray.js +12 -5
  50. package/is-white.js +14 -7
  51. package/lab/lab-css.js +4 -9
  52. package/lab/lab-lab.js +6 -2
  53. package/lab/lab-lch.js +18 -10
  54. package/lab/lab-rgb.js +6 -14
  55. package/lab/lab-xyz.js +16 -20
  56. package/lab/lab50.js +18 -15
  57. package/lab/lab65.js +18 -15
  58. package/lch/lch-css.js +4 -9
  59. package/lch/lch.js +18 -23
  60. package/lighten.js +13 -17
  61. package/linear.js +6 -16
  62. package/luminance-rgb.js +14 -22
  63. package/luminance.js +16 -14
  64. package/max-chroma.js +1340 -227
  65. package/mix.js +34 -82
  66. package/oklab/oklab-css.js +4 -9
  67. package/oklab/oklab-rgb.js +17 -23
  68. package/oklab/oklab-xyz.js +22 -9
  69. package/oklab/oklab.js +19 -22
  70. package/oklch/oklab-oklch.js +10 -11
  71. package/oklch/oklch-css.js +4 -9
  72. package/oklch/oklch-oklab.js +9 -9
  73. package/oklch/oklch.js +14 -20
  74. package/package.json +19 -17
  75. package/rgb/hue-rgb.js +14 -11
  76. package/rgb/kelvin-rgba.js +23 -22
  77. package/rgb/rgb-css.js +4 -1
  78. package/rgb/rgb-hcv.js +14 -15
  79. package/rgb/rgb-hcy.js +10 -14
  80. package/rgb/rgb-hsi.js +13 -8
  81. package/rgb/rgb-hsl.js +8 -5
  82. package/rgb/rgb-hsv.js +7 -4
  83. package/rgb/rgb-lab.js +6 -18
  84. package/rgb/rgb-oklab.js +13 -19
  85. package/rgb/rgb-srgb.js +18 -8
  86. package/rgb/rgb-xyz.js +6 -19
  87. package/rgb/rgb-ycc.js +12 -17
  88. package/rgb/rgb.js +25 -22
  89. package/rotate.js +25 -38
  90. package/sort.js +24 -72
  91. package/srgb/srgb-css.js +9 -9
  92. package/srgb/srgb-int.js +6 -10
  93. package/srgb/srgb-rgb.js +18 -8
  94. package/srgb/srgb.js +16 -13
  95. package/strategies.js +42 -112
  96. package/swatches.js +28 -5
  97. package/tint.js +27 -53
  98. package/transform.js +274 -149
  99. package/variations.js +10 -9
  100. package/xyy/xyy-xyz.js +12 -11
  101. package/xyy/xyy.js +16 -13
  102. package/xyz/wavelength-xyz.js +14 -28
  103. package/xyz/xyz-lab.js +17 -26
  104. package/xyz/xyz-oklab.js +4 -1
  105. package/xyz/xyz-rgb.js +6 -18
  106. package/xyz/xyz-xyy.js +13 -12
  107. package/xyz/xyz-xyz.js +6 -2
  108. package/xyz/xyz50.js +20 -17
  109. package/xyz/xyz65.js +20 -17
  110. package/ycc/ycc-rgb.js +14 -19
  111. package/ycc/ycc.js +12 -9
@@ -2,47 +2,45 @@ import { clamp01 } from "@thi.ng/math/interval";
2
2
  import { dotS3, dotS4 } from "@thi.ng/vectors/dots";
3
3
  import { setC4 } from "@thi.ng/vectors/setc";
4
4
  import { __ensureAlpha } from "./ensure.js";
5
- /** @internal */
6
- export const __mulV33 = (out, mat, src, clampOut = false) => {
7
- const x = dotS3(mat, src, 0, 0, 3);
8
- const y = dotS3(mat, src, 1, 0, 3);
9
- const z = dotS3(mat, src, 2, 0, 3);
10
- const a = __ensureAlpha(src[3]);
11
- return clampOut
12
- ? setC4(out || src, clamp01(x), clamp01(y), clamp01(z), a)
13
- : setC4(out || src, x, y, z, a);
5
+ const __mulV33 = (out, mat, src, clampOut = false) => {
6
+ const x = dotS3(mat, src, 0, 0, 3);
7
+ const y = dotS3(mat, src, 1, 0, 3);
8
+ const z = dotS3(mat, src, 2, 0, 3);
9
+ const a = __ensureAlpha(src[3]);
10
+ return clampOut ? setC4(out || src, clamp01(x), clamp01(y), clamp01(z), a) : setC4(out || src, x, y, z, a);
14
11
  };
15
- /** @internal */
16
- export const __mulV45 = (out, mat, src, clampOut = true) => {
17
- out = setC4(out || src, src[0], src[1], src[2], __ensureAlpha(src[3]));
18
- const x = dotS4(out, mat, 0, 0) + mat[4];
19
- const y = dotS4(out, mat, 0, 5) + mat[9];
20
- const z = dotS4(out, mat, 0, 10) + mat[14];
21
- const w = dotS4(out, mat, 0, 15) + mat[19];
22
- return clampOut
23
- ? setC4(out, clamp01(x), clamp01(y), clamp01(z), clamp01(w))
24
- : setC4(out, x, y, z, w);
12
+ const __mulV45 = (out, mat, src, clampOut = true) => {
13
+ out = setC4(out || src, src[0], src[1], src[2], __ensureAlpha(src[3]));
14
+ const x = dotS4(out, mat, 0, 0) + mat[4];
15
+ const y = dotS4(out, mat, 0, 5) + mat[9];
16
+ const z = dotS4(out, mat, 0, 10) + mat[14];
17
+ const w = dotS4(out, mat, 0, 15) + mat[19];
18
+ return clampOut ? setC4(out, clamp01(x), clamp01(y), clamp01(z), clamp01(w)) : setC4(out, x, y, z, w);
25
19
  };
26
- /** @internal */
27
- export const __mulM45 = (a, b) => [
28
- dotS4(b, a, 0, 0, 1, 5),
29
- dotS4(b, a, 0, 1, 1, 5),
30
- dotS4(b, a, 0, 2, 1, 5),
31
- dotS4(b, a, 0, 3, 1, 5),
32
- dotS4(b, a, 0, 4, 1, 5) + b[4],
33
- dotS4(b, a, 5, 0, 1, 5),
34
- dotS4(b, a, 5, 1, 1, 5),
35
- dotS4(b, a, 5, 2, 1, 5),
36
- dotS4(b, a, 5, 3, 1, 5),
37
- dotS4(b, a, 5, 4, 1, 5) + b[9],
38
- dotS4(b, a, 10, 0, 1, 5),
39
- dotS4(b, a, 10, 1, 1, 5),
40
- dotS4(b, a, 10, 2, 1, 5),
41
- dotS4(b, a, 10, 3, 1, 5),
42
- dotS4(b, a, 10, 4, 1, 5) + b[14],
43
- dotS4(b, a, 15, 0, 1, 5),
44
- dotS4(b, a, 15, 1, 1, 5),
45
- dotS4(b, a, 15, 2, 1, 5),
46
- dotS4(b, a, 15, 3, 1, 5),
47
- dotS4(b, a, 15, 4, 1, 5) + b[19],
20
+ const __mulM45 = (a, b) => [
21
+ dotS4(b, a, 0, 0, 1, 5),
22
+ dotS4(b, a, 0, 1, 1, 5),
23
+ dotS4(b, a, 0, 2, 1, 5),
24
+ dotS4(b, a, 0, 3, 1, 5),
25
+ dotS4(b, a, 0, 4, 1, 5) + b[4],
26
+ dotS4(b, a, 5, 0, 1, 5),
27
+ dotS4(b, a, 5, 1, 1, 5),
28
+ dotS4(b, a, 5, 2, 1, 5),
29
+ dotS4(b, a, 5, 3, 1, 5),
30
+ dotS4(b, a, 5, 4, 1, 5) + b[9],
31
+ dotS4(b, a, 10, 0, 1, 5),
32
+ dotS4(b, a, 10, 1, 1, 5),
33
+ dotS4(b, a, 10, 2, 1, 5),
34
+ dotS4(b, a, 10, 3, 1, 5),
35
+ dotS4(b, a, 10, 4, 1, 5) + b[14],
36
+ dotS4(b, a, 15, 0, 1, 5),
37
+ dotS4(b, a, 15, 1, 1, 5),
38
+ dotS4(b, a, 15, 2, 1, 5),
39
+ dotS4(b, a, 15, 3, 1, 5),
40
+ dotS4(b, a, 15, 4, 1, 5) + b[19]
48
41
  ];
42
+ export {
43
+ __mulM45,
44
+ __mulV33,
45
+ __mulV45
46
+ };
package/internal/scale.js CHANGED
@@ -1,2 +1,4 @@
1
- /** @internal */
2
- export const __scale8bit = (x, shift = 0) => ((x < 0 ? 0 : x > 1 ? 1 : x) * 0xff + 0.5) << shift;
1
+ const __scale8bit = (x, shift = 0) => (x < 0 ? 0 : x > 1 ? 1 : x) * 255 + 0.5 << shift;
2
+ export {
3
+ __scale8bit
4
+ };
package/invert.js CHANGED
@@ -7,52 +7,59 @@ import { sub3 } from "@thi.ng/vectors/sub";
7
7
  import { clamp } from "./clamp.js";
8
8
  import { __dispatch1 } from "./internal/dispatch.js";
9
9
  import { __ensureAlpha } from "./internal/ensure.js";
10
- /**
11
- * Inverts the RGB channels of an RGBA color.
12
- *
13
- * @remarks
14
- * If `out` is null, the resulting color will be written back into `src`.
15
- *
16
- * Also see {@link TypedColor.invert}.
17
- *
18
- * @param out - result
19
- * @param src - source color
20
- */
21
- export const invertRgb = (out, src) => {
22
- out = clamp(out || src, src);
23
- return sub3(out, ONE3, out);
10
+ const invertRgb = (out, src) => {
11
+ out = clamp(out || src, src);
12
+ return sub3(out, ONE3, out);
24
13
  };
25
- /**
26
- * Inverts the lowest 24 bits of an ARGB int. Does not modify alpha.
27
- *
28
- * @remarks
29
- * Also see {@link TypedColor.invert}.
30
- *
31
- * @param src - packed RGB int
32
- */
33
- export const invertInt = (src) => src ^ 0xffffff;
34
- /**
35
- * Inverts given color and writes result into `out` (or if null, mutates `src`
36
- * in place).
37
- *
38
- * @param out
39
- * @param src
40
- */
41
- export const invert = defmulti(__dispatch1, {
14
+ const invertInt = (src) => src ^ 16777215;
15
+ const invert = defmulti(
16
+ __dispatch1,
17
+ {
42
18
  hcy: "hsv",
43
19
  hsi: "hsv",
44
20
  hsl: "hsv",
45
21
  labD65: "labD50",
46
22
  oklab: "labD50",
47
- srgb: "rgb",
48
- }, {
49
- hsv: (out, src) => setC4(out || src, fract(src[0] + 0.5), src[1], 1 - src[2], __ensureAlpha(src[3])),
23
+ srgb: "rgb"
24
+ },
25
+ {
26
+ hsv: (out, src) => setC4(
27
+ out || src,
28
+ fract(src[0] + 0.5),
29
+ src[1],
30
+ 1 - src[2],
31
+ __ensureAlpha(src[3])
32
+ ),
50
33
  labD50: (out, src) => {
51
- const [min, max] = src.range;
52
- return setC4(out || src, 1 - src[0], __invert1(src[1], min[1], max[1]), __invert1(src[2], min[2], max[2]), __ensureAlpha(src[3]));
34
+ const [min, max] = src.range;
35
+ return setC4(
36
+ out || src,
37
+ 1 - src[0],
38
+ __invert1(src[1], min[1], max[1]),
39
+ __invert1(src[2], min[2], max[2]),
40
+ __ensureAlpha(src[3])
41
+ );
53
42
  },
54
- lch: (out, src) => setC4(out || src, 1 - src[0], src[1], fract(src[2] + 0.5), __ensureAlpha(src[3])),
43
+ lch: (out, src) => setC4(
44
+ out || src,
45
+ 1 - src[0],
46
+ src[1],
47
+ fract(src[2] + 0.5),
48
+ __ensureAlpha(src[3])
49
+ ),
55
50
  rgb: invertRgb,
56
- 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])),
57
- });
51
+ ycc: (out, src) => setC4(
52
+ out || src,
53
+ 1 - src[0],
54
+ __invert1(src[1], -0.5, 0.5),
55
+ __invert1(src[2], -0.5, 0.5),
56
+ __ensureAlpha(src[3])
57
+ )
58
+ }
59
+ );
58
60
  const __invert1 = (x, a, b) => fit(x, a, b, b, a);
61
+ export {
62
+ invert,
63
+ invertInt,
64
+ invertRgb
65
+ };
package/is-black.js CHANGED
@@ -5,17 +5,24 @@ import { rgb } from "./rgb/rgb.js";
5
5
  const isBlackHsv = (x, eps = EPS) => x[2] <= eps;
6
6
  const isBlackRgb = (x, eps = EPS) => x[0] <= eps && x[1] <= eps && x[2] <= eps;
7
7
  const isBlackLch = (x, eps = EPS) => x[0] <= eps;
8
- export const isBlack = defmulti(__dispatch0, {
8
+ const isBlack = defmulti(
9
+ __dispatch0,
10
+ {
9
11
  hcy: "hsv",
10
12
  hsi: "hsv",
11
13
  hsl: "hsv",
12
14
  labD50: "lch",
13
15
  labD65: "lch",
14
16
  srgb: "rgb",
15
- ycc: "rgb",
16
- }, {
17
+ ycc: "rgb"
18
+ },
19
+ {
17
20
  hsv: isBlackHsv,
18
21
  lch: isBlackLch,
19
22
  rgb: isBlackRgb,
20
- [DEFAULT]: (x) => isBlackRgb(rgb(x)),
21
- });
23
+ [DEFAULT]: (x) => isBlackRgb(rgb(x))
24
+ }
25
+ );
26
+ export {
27
+ isBlack
28
+ };
package/is-gamut.js CHANGED
@@ -1,16 +1,11 @@
1
1
  import { inRange } from "@thi.ng/math/interval";
2
2
  import { rgb } from "./rgb/rgb.js";
3
- /**
4
- * Returns true, if given color is within the RGB gamut (without clipping).
5
- *
6
- * @param src -
7
- * @param eps -
8
- */
9
- export const isRgbGamut = (src, eps = 1e-3) => {
10
- const min = -eps;
11
- const max = 1 + eps;
12
- const col = src.mode === "rgb" || src.mode === "srgb" ? src : rgb(src);
13
- return (inRange(col[0], min, max) &&
14
- inRange(col[1], min, max) &&
15
- inRange(col[2], min, max));
3
+ const isRgbGamut = (src, eps = 1e-3) => {
4
+ const min = -eps;
5
+ const max = 1 + eps;
6
+ const col = src.mode === "rgb" || src.mode === "srgb" ? src : rgb(src);
7
+ return inRange(col[0], min, max) && inRange(col[1], min, max) && inRange(col[2], min, max);
8
+ };
9
+ export {
10
+ isRgbGamut
16
11
  };
package/is-gray.js CHANGED
@@ -6,17 +6,24 @@ import { rgb } from "./rgb/rgb.js";
6
6
  const isGrayHsv = (x, eps = EPS) => x[1] <= eps;
7
7
  const isGrayRgb = (x, eps = EPS) => eqDelta(x[0], x[1], eps) && eqDelta(x[0], x[2], eps);
8
8
  const isGrayLab = (x, eps = EPS) => eqDelta(x[1], 0, eps) && eqDelta(x[2], 0, eps);
9
- export const isGray = defmulti(__dispatch0, {
9
+ const isGray = defmulti(
10
+ __dispatch0,
11
+ {
10
12
  hcy: "hsv",
11
13
  hsi: "hsv",
12
14
  hsl: "hsv",
13
15
  lch: "hsv",
14
16
  labD65: "labD50",
15
17
  srgb: "rgb",
16
- ycc: "labD50",
17
- }, {
18
+ ycc: "labD50"
19
+ },
20
+ {
18
21
  hsv: isGrayHsv,
19
22
  labD50: isGrayLab,
20
23
  rgb: isGrayRgb,
21
- [DEFAULT]: (x) => isGrayRgb(rgb(x)),
22
- });
24
+ [DEFAULT]: (x) => isGrayRgb(rgb(x))
25
+ }
26
+ );
27
+ export {
28
+ isGray
29
+ };
package/is-white.js CHANGED
@@ -4,21 +4,28 @@ import { __dispatch0 } from "./internal/dispatch.js";
4
4
  import { rgb } from "./rgb/rgb.js";
5
5
  const isWhiteHsv = (x, eps = EPS) => x[1] <= eps && x[2] >= 1 - eps;
6
6
  const isWhiteRgb = (x, eps = EPS) => {
7
- eps = 1 - eps;
8
- return x[0] >= eps && x[1] >= eps && x[2] >= eps;
7
+ eps = 1 - eps;
8
+ return x[0] >= eps && x[1] >= eps && x[2] >= eps;
9
9
  };
10
10
  const isWhiteLch = (x, eps = EPS) => x[1] <= eps && x[0] >= 1 - eps;
11
- export const isWhite = defmulti(__dispatch0, {
11
+ const isWhite = defmulti(
12
+ __dispatch0,
13
+ {
12
14
  hsl: "hsv",
13
15
  hsi: "hsv",
14
16
  labD50: "lch",
15
17
  labD65: "lch",
16
18
  srgb: "rgb",
17
- ycc: "lch",
18
- }, {
19
+ ycc: "lch"
20
+ },
21
+ {
19
22
  hcy: (x, eps = EPS) => x[1] <= eps && x[2] >= 1 - eps,
20
23
  hsv: isWhiteHsv,
21
24
  lch: isWhiteLch,
22
25
  rgb: isWhiteRgb,
23
- [DEFAULT]: (x) => isWhiteRgb(rgb(x)),
24
- });
26
+ [DEFAULT]: (x) => isWhiteRgb(rgb(x))
27
+ }
28
+ );
29
+ export {
30
+ isWhite
31
+ };
package/lab/lab-css.js CHANGED
@@ -1,10 +1,5 @@
1
1
  import { __labCss } from "../internal/css.js";
2
- /**
3
- * @remarks
4
- * Only supported in CSS Color Level 4 onwards
5
- * https://www.w3.org/TR/css-color-4/#specifying-lab-lch
6
- * https://test.csswg.org/harness/results/css-color-4_dev/grouped/ (test reports)
7
- *
8
- * @param src -
9
- */
10
- export const labCss = (src) => __labCss("lab", src, 100);
2
+ const labCss = (src) => __labCss("lab", src, 100);
3
+ export {
4
+ labCss
5
+ };
package/lab/lab-lab.js CHANGED
@@ -1,5 +1,9 @@
1
1
  import { xyzLab, xyzLabD65 } from "../xyz/xyz-lab.js";
2
2
  import { xyzXyzD50_65, xyzXyzD65_50 } from "../xyz/xyz-xyz.js";
3
3
  import { labXyz, labXyzD65 } from "./lab-xyz.js";
4
- export const labLabD50_65 = (out, src) => xyzLabD65(out, xyzXyzD50_65(out, labXyz(out, src)));
5
- export const labLabD65_50 = (out, src) => xyzLab(out, xyzXyzD65_50(out, labXyzD65(out, src)));
4
+ const labLabD50_65 = (out, src) => xyzLabD65(out, xyzXyzD50_65(out, labXyz(out, src)));
5
+ const labLabD65_50 = (out, src) => xyzLab(out, xyzXyzD65_50(out, labXyzD65(out, src)));
6
+ export {
7
+ labLabD50_65,
8
+ labLabD65_50
9
+ };
package/lab/lab-lch.js CHANGED
@@ -2,15 +2,23 @@ import { atan2Abs } from "@thi.ng/math/angle";
2
2
  import { INV_TAU, TAU } from "@thi.ng/math/api";
3
3
  import { setC4 } from "@thi.ng/vectors/setc";
4
4
  import { __ensureAlpha } from "../internal/ensure.js";
5
- export const labLch = (out, src) => {
6
- const { 1: a, 2: b } = src;
7
- return setC4(out || src, src[0], Math.hypot(a, b), a === 0 && b === 0 ? 0 : atan2Abs(b, a) * INV_TAU, __ensureAlpha(src[3]));
5
+ const labLch = (out, src) => {
6
+ const { 1: a, 2: b } = src;
7
+ return setC4(
8
+ out || src,
9
+ src[0],
10
+ Math.hypot(a, b),
11
+ a === 0 && b === 0 ? 0 : atan2Abs(b, a) * INV_TAU,
12
+ __ensureAlpha(src[3])
13
+ );
8
14
  };
9
- export const lchLab = (out, src) => {
10
- let { 1: c, 2: h } = src;
11
- h *= TAU;
12
- const a = __ensureAlpha(src[3]);
13
- return c > 0
14
- ? setC4(out || src, src[0], Math.cos(h) * c, Math.sin(h) * c, a)
15
- : setC4(out || src, src[0], 0, 0, a);
15
+ const lchLab = (out, src) => {
16
+ let { 1: c, 2: h } = src;
17
+ h *= TAU;
18
+ const a = __ensureAlpha(src[3]);
19
+ return c > 0 ? setC4(out || src, src[0], Math.cos(h) * c, Math.sin(h) * c, a) : setC4(out || src, src[0], 0, 0, a);
20
+ };
21
+ export {
22
+ labLch,
23
+ lchLab
16
24
  };
package/lab/lab-rgb.js CHANGED
@@ -1,16 +1,8 @@
1
1
  import { labXyz, labXyzD65 } from "./lab-xyz.js";
2
2
  import { xyzRgb, xyzRgbD65 } from "../xyz/xyz-rgb.js";
3
- /**
4
- * Converts Lab to linear RGB (via XYZ) using {@link D50} white point.
5
- *
6
- * @param out -
7
- * @param src -
8
- */
9
- export const labRgb = (out, src) => xyzRgb(null, labXyz(out, src));
10
- /**
11
- * Same as {@link labRgb}, but using {@link D65} white point.
12
- *
13
- * @param out -
14
- * @param src -
15
- */
16
- export const labRgbD65 = (out, src) => xyzRgbD65(null, labXyzD65(out, src));
3
+ const labRgb = (out, src) => xyzRgb(null, labXyz(out, src));
4
+ const labRgbD65 = (out, src) => xyzRgbD65(null, labXyzD65(out, src));
5
+ export {
6
+ labRgb,
7
+ labRgbD65
8
+ };
package/lab/lab-xyz.js CHANGED
@@ -2,25 +2,21 @@ import { setC4 } from "@thi.ng/vectors/setc";
2
2
  import { D50, D65 } from "../api/constants.js";
3
3
  import { __ensureAlpha } from "../internal/ensure.js";
4
4
  const transform = (x) => {
5
- const y = x ** 3;
6
- return y > 0.008856 ? y : (x - 16 / 116) / 7.787;
5
+ const y = x ** 3;
6
+ return y > 8856e-6 ? y : (x - 16 / 116) / 7.787;
7
7
  };
8
- /**
9
- * Converts Lab to XYZ using provided white point (default: {@link D50}). Also
10
- * see {@link labXyzD65}.
11
- *
12
- * @param out -
13
- * @param src -
14
- * @param white -
15
- */
16
- export const labXyz = (out, src, white = D50) => {
17
- const y = (src[0] + 0.16) / 1.16;
18
- return setC4(out || src, transform(src[1] / 5.0 + y) * white[0], transform(y) * white[1], transform(y - src[2] / 2.0) * white[2], __ensureAlpha(src[3]));
8
+ const labXyz = (out, src, white = D50) => {
9
+ const y = (src[0] + 0.16) / 1.16;
10
+ return setC4(
11
+ out || src,
12
+ transform(src[1] / 5 + y) * white[0],
13
+ transform(y) * white[1],
14
+ transform(y - src[2] / 2) * white[2],
15
+ __ensureAlpha(src[3])
16
+ );
17
+ };
18
+ const labXyzD65 = (out, src) => labXyz(out, src, D65);
19
+ export {
20
+ labXyz,
21
+ labXyzD65
19
22
  };
20
- /**
21
- * Same as {@link labXyz}, but using hardcoded {@link D65} white point.
22
- *
23
- * @param out -
24
- * @param src -
25
- */
26
- export const labXyzD65 = (out, src) => labXyz(out, src, D65);
package/lab/lab50.js CHANGED
@@ -5,19 +5,22 @@ import { xyzXyzD65_50 } from "../xyz/xyz-xyz.js";
5
5
  import { labLabD65_50 } from "./lab-lab.js";
6
6
  import { lchLab } from "./lab-lch.js";
7
7
  import { labRgb } from "./lab-rgb.js";
8
- export const labD50 = defColor({
9
- mode: "lab50",
10
- channels: {
11
- a: { range: [-0.7929, 0.9355] },
12
- b: { range: [-1.1203, 0.9339] },
13
- },
14
- order: ["l", "a", "b", "alpha"],
15
- from: {
16
- rgb: rgbLab,
17
- lch: lchLab,
18
- lab65: labLabD65_50,
19
- xyz50: xyzLab,
20
- xyz65: [xyzXyzD65_50, xyzLab],
21
- },
22
- toRgb: labRgb,
8
+ const labD50 = defColor({
9
+ mode: "lab50",
10
+ channels: {
11
+ a: { range: [-0.7929, 0.9355] },
12
+ b: { range: [-1.1203, 0.9339] }
13
+ },
14
+ order: ["l", "a", "b", "alpha"],
15
+ from: {
16
+ rgb: rgbLab,
17
+ lch: lchLab,
18
+ lab65: labLabD65_50,
19
+ xyz50: xyzLab,
20
+ xyz65: [xyzXyzD65_50, xyzLab]
21
+ },
22
+ toRgb: labRgb
23
23
  });
24
+ export {
25
+ labD50
26
+ };
package/lab/lab65.js CHANGED
@@ -5,19 +5,22 @@ import { xyzXyzD50_65 } from "../xyz/xyz-xyz.js";
5
5
  import { labLabD50_65 } from "./lab-lab.js";
6
6
  import { lchLab } from "./lab-lch.js";
7
7
  import { labRgbD65 } from "./lab-rgb.js";
8
- export const labD65 = defColor({
9
- mode: "lab65",
10
- channels: {
11
- a: { range: [-0.8618, 0.9823] },
12
- b: { range: [-1.0786, 0.9448] },
13
- },
14
- order: ["l", "a", "b", "alpha"],
15
- from: {
16
- rgb: rgbLabD65,
17
- lch: [lchLab, labLabD50_65],
18
- lab50: labLabD50_65,
19
- xyz50: [xyzXyzD50_65, xyzLabD65],
20
- xyz65: xyzLabD65,
21
- },
22
- toRgb: labRgbD65,
8
+ const labD65 = defColor({
9
+ mode: "lab65",
10
+ channels: {
11
+ a: { range: [-0.8618, 0.9823] },
12
+ b: { range: [-1.0786, 0.9448] }
13
+ },
14
+ order: ["l", "a", "b", "alpha"],
15
+ from: {
16
+ rgb: rgbLabD65,
17
+ lch: [lchLab, labLabD50_65],
18
+ lab50: labLabD50_65,
19
+ xyz50: [xyzXyzD50_65, xyzLabD65],
20
+ xyz65: xyzLabD65
21
+ },
22
+ toRgb: labRgbD65
23
23
  });
24
+ export {
25
+ labD65
26
+ };
package/lch/lch-css.js CHANGED
@@ -1,10 +1,5 @@
1
1
  import { __lchCss } from "../internal/css.js";
2
- /**
3
- * @remarks
4
- * Only supported in CSS Color Level 4 onwards
5
- * https://www.w3.org/TR/css-color-4/#specifying-lab-lch
6
- * https://test.csswg.org/harness/results/css-color-4_dev/grouped/ (test reports)
7
- *
8
- * @param src -
9
- */
10
- export const lchCss = (src) => __lchCss("lch", src, 100);
2
+ const lchCss = (src) => __lchCss("lch", src, 100);
3
+ export {
4
+ lchCss
5
+ };
package/lch/lch.js CHANGED
@@ -5,27 +5,22 @@ import { labRgb } from "../lab/lab-rgb.js";
5
5
  import { rgbLab } from "../rgb/rgb-lab.js";
6
6
  import { xyzLab } from "../xyz/xyz-lab.js";
7
7
  import { xyzXyzD65_50 } from "../xyz/xyz-xyz.js";
8
- /**
9
- * Luminance Chroma Hue (conversions assume {@link D50} white point, as per CSS
10
- * spec). Polar version of {@link labD50}.
11
- *
12
- * @remarks
13
- * Note: As with other hue-based color modes in this package, the hue is stored
14
- * normalized (in [0..1] interval) and NOT as degrees.
15
- */
16
- export const lch = defColor({
17
- mode: "lch",
18
- channels: {
19
- c: { range: [0, 1.312] },
20
- h: { hue: true },
21
- },
22
- order: ["l", "c", "h", "alpha"],
23
- from: {
24
- rgb: (out, src) => labLch(null, rgbLab(out, src)),
25
- lab50: labLch,
26
- lab65: [labLabD65_50, labLch],
27
- xyz50: [xyzLab, labLch],
28
- xyz65: [xyzXyzD65_50, xyzLab, labLch],
29
- },
30
- toRgb: [lchLab, labRgb],
8
+ const lch = defColor({
9
+ mode: "lch",
10
+ channels: {
11
+ c: { range: [0, 1.312] },
12
+ h: { hue: true }
13
+ },
14
+ order: ["l", "c", "h", "alpha"],
15
+ from: {
16
+ rgb: (out, src) => labLch(null, rgbLab(out, src)),
17
+ lab50: labLch,
18
+ lab65: [labLabD65_50, labLch],
19
+ xyz50: [xyzLab, labLch],
20
+ xyz65: [xyzXyzD65_50, xyzLab, labLch]
21
+ },
22
+ toRgb: [lchLab, labRgb]
31
23
  });
24
+ export {
25
+ lch
26
+ };
package/lighten.js CHANGED
@@ -3,22 +3,18 @@ import { clamp01 } from "@thi.ng/math/interval";
3
3
  import { set4 } from "@thi.ng/vectors/set";
4
4
  import { __dispatch1 } from "./internal/dispatch.js";
5
5
  const $ = (id) => (out, src, n) => {
6
- out = set4(out || src, src);
7
- out[id] = clamp01(out[id] + n);
8
- return out;
6
+ out = set4(out || src, src);
7
+ out[id] = clamp01(out[id] + n);
8
+ return out;
9
9
  };
10
- /**
11
- * Adjust the "lightness" (luma, brightness etc.) channel of given `src` color
12
- * and `delta` offset. Writes result into `out` (or if null, back into `src`).
13
- *
14
- * @remarks
15
- * If `offset` is negative, then color will be darkened.
16
- *
17
- * @param out -
18
- * @param src -
19
- * @param delta -
20
- */
21
- export const lighten = defmulti(__dispatch1, { hsv: "hsl", hsi: "hsl", hcy: "hsl" }, {
10
+ const lighten = defmulti(
11
+ __dispatch1,
12
+ { hsv: "hsl", hsi: "hsl", hcy: "hsl" },
13
+ {
22
14
  hsl: $(2),
23
- lch: $(0),
24
- });
15
+ lch: $(0)
16
+ }
17
+ );
18
+ export {
19
+ lighten
20
+ };
package/linear.js CHANGED
@@ -1,16 +1,6 @@
1
- /**
2
- * Maps a single linear RGB channel value to sRGB.
3
- *
4
- * https://en.wikipedia.org/wiki/SRGB
5
- *
6
- * @param x - channel value
7
- */
8
- export const linearSrgb = (x) => x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055;
9
- /**
10
- * Maps a single linear sRGB channel value to linear RGB.
11
- *
12
- * https://en.wikipedia.org/wiki/SRGB
13
- *
14
- * @param x - channel value
15
- */
16
- export const srgbLinear = (x) => x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
1
+ const linearSrgb = (x) => x <= 31308e-7 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055;
2
+ const srgbLinear = (x) => x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
3
+ export {
4
+ linearSrgb,
5
+ srgbLinear
6
+ };