@csstools/convert-colors 1.4.0 → 2.0.1

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/lib/hsl-hsv.js DELETED
@@ -1,30 +0,0 @@
1
- /* Convert between HSL and HSV
2
- /* ========================================================================== */
3
-
4
- export function hsl2hsv(hslH, hslS, hslL) {
5
- const hsv1 = hslS * (hslL < 50 ? hslL : 100 - hslL) / 100;
6
- const hsvS = hsv1 === 0 ? 0 : 2 * hsv1 / (hslL + hsv1) * 100;
7
- const hsvV = hslL + hsv1;
8
-
9
- return [ hslH, hsvS, hsvV ];
10
- }
11
-
12
- export function hsv2hsl(hsvH, hsvS, hsvV) {
13
- const hslL = (200 - hsvS) * hsvV / 100;
14
-
15
- const [ hslS, hslV ] = [
16
- hslL === 0 || hslL === 200 ? 0 : hsvS * hsvV / 100 / (hslL <= 100 ? hslL : 200 - hslL) * 100,
17
- hslL * 5 / 10
18
- ];
19
-
20
- return [ hsvH, hslS, hslV ];
21
- }
22
-
23
- /*
24
-
25
- References
26
- ----------
27
-
28
- - https://gist.github.com/defims/0ca2ef8832833186ed396a2f8a204117
29
-
30
- /* ========================================================================== */
package/lib/hwb-hsv.js DELETED
@@ -1,31 +0,0 @@
1
- /* Convert between HWB and HSV
2
- /* ========================================================================== */
3
-
4
- export function hwb2hsv(hwbH, hwbW, hwbB) {
5
- const [ hsvH, hsvS, hsvV ] = [
6
- hwbH,
7
- hwbB === 100 ? 0 : 100 - hwbW / (100 - hwbB) * 100,
8
- 100 - hwbB
9
- ];
10
-
11
- return [ hsvH, hsvS, hsvV ];
12
- }
13
-
14
- export function hsv2hwb(hsvH, hsvS, hsvV) {
15
- const [ hwbH, hwbW, hwbB ] = [
16
- hsvH,
17
- (100 - hsvS) * hsvV / 100,
18
- 100 - hsvV
19
- ];
20
-
21
- return [ hwbH, hwbW, hwbB ];
22
- }
23
-
24
- /*
25
-
26
- References
27
- ----------
28
-
29
- - https://en.wikipedia.org/wiki/HWB_color_model#Converting_to_and_from_HSV
30
-
31
- /* ========================================================================== */
package/lib/lab-lch.js DELETED
@@ -1,31 +0,0 @@
1
- /* Convert between Lab and XYZ
2
- /* ========================================================================== */
3
-
4
- export function lab2lch(labL, labA, labB) {
5
- const [ lchC, lchH ] = [
6
- Math.sqrt(Math.pow(labA, 2) + Math.pow(labB, 2)), // convert to chroma
7
- Math.atan2(labB, labA) * 180 / Math.PI // convert to hue, in degrees
8
- ];
9
-
10
- return [ labL, lchC, lchH ];
11
- }
12
-
13
- export function lch2lab(lchL, lchC, lchH) {
14
- // convert to Lab a and b from the polar form
15
- const [ labA, labB ] = [
16
- lchC * Math.cos(lchH * Math.PI / 180),
17
- lchC * Math.sin(lchH * Math.PI / 180)
18
- ];
19
-
20
- return [ lchL, labA, labB ];
21
- }
22
-
23
- /*
24
-
25
- References
26
- ----------
27
-
28
- - https://www.w3.org/TR/css-color-4/#lch-to-lab
29
- - https://www.w3.org/TR/css-color-4/#color-conversion-code
30
-
31
- /* ========================================================================== */
package/lib/lab-xyz.js DELETED
@@ -1,68 +0,0 @@
1
- import { epsilon, kappa, wd50X, wd50Y, wd50Z, matrix } from './util';
2
-
3
- /* Convert between Lab and XYZ
4
- /* ========================================================================== */
5
-
6
- export function lab2xyz(labL, labA, labB) {
7
- // compute f, starting with the luminance-related term
8
- const f2 = (labL + 16) / 116;
9
- const f1 = labA / 500 + f2;
10
- const f3 = f2 - labB / 200;
11
-
12
- // compute pre-scaled XYZ
13
- const [ initX, initY, initZ ] = [
14
- Math.pow(f1, 3) > epsilon ? Math.pow(f1, 3) : (116 * f1 - 16) / kappa,
15
- labL > kappa * epsilon ? Math.pow((labL + 16) / 116, 3) : labL / kappa,
16
- Math.pow(f3, 3) > epsilon ? Math.pow(f3, 3) : (116 * f3 - 16) / kappa
17
- ];
18
-
19
- const [ xyzX, xyzY, xyzZ ] = matrix(
20
- // compute XYZ by scaling pre-scaled XYZ by reference white
21
- [ initX * wd50X, initY * wd50Y, initZ * wd50Z ],
22
- // calculate D65 XYZ from D50 XYZ
23
- [
24
- [ 0.9555766, -0.0230393, 0.0631636],
25
- [-0.0282895, 1.0099416, 0.0210077],
26
- [ 0.0122982, -0.0204830, 1.3299098]
27
- ]
28
- );
29
-
30
- return [ xyzX, xyzY, xyzZ ];
31
- }
32
-
33
- export function xyz2lab(xyzX, xyzY, xyzZ) {
34
- // calculate D50 XYZ from D65 XYZ
35
- const [ d50X, d50Y, d50Z ] = matrix([ xyzX, xyzY, xyzZ ], [
36
- [ 1.0478112, 0.0228866, -0.0501270],
37
- [ 0.0295424, 0.9904844, -0.0170491],
38
- [-0.0092345, 0.0150436, 0.7521316]
39
- ]);
40
-
41
- // calculate f
42
- const [ f1, f2, f3 ] = [
43
- d50X / wd50X,
44
- d50Y / wd50Y,
45
- d50Z / wd50Z
46
- ].map(
47
- value => value > epsilon ? Math.cbrt(value) : (kappa * value + 16) / 116
48
- );
49
-
50
- const [ labL, labA, labB ] = [
51
- 116 * f2 - 16,
52
- 500 * (f1 - f2),
53
- 200 * (f2 - f3)
54
- ];
55
-
56
- return [ labL, labA, labB ];
57
- }
58
-
59
- /*
60
-
61
- References
62
- ----------
63
-
64
- - https://www.w3.org/TR/css-color-4/#rgb-to-lab
65
- - https://www.w3.org/TR/css-color-4/#color-conversion-code
66
- - https://www.easyrgb.com/en/math.php
67
-
68
- /* ========================================================================== */
package/lib/rgb-hsl.js DELETED
@@ -1,50 +0,0 @@
1
- import { rgb2hue, rgb2value, rgb2whiteness, hue2rgb } from './util';
2
-
3
- /* Convert between RGB and HSL
4
- /* ========================================================================== */
5
-
6
- export function rgb2hsl(rgbR, rgbG, rgbB, fallbackhue) {
7
- const hslH = rgb2hue(rgbR, rgbG, rgbB, fallbackhue);
8
- const hslV = rgb2value(rgbR, rgbG, rgbB);
9
- const hslW = rgb2whiteness(rgbR, rgbG, rgbB);
10
-
11
- // calculate value/whiteness delta
12
- const hslD = hslV - hslW;
13
-
14
- // calculate lightness
15
- const hslL = (hslV + hslW) / 2;
16
-
17
- // calculate saturation
18
- const hslS = hslD === 0 ? 0 : hslD / (100 - Math.abs(2 * hslL - 100)) * 100;
19
-
20
- return [ hslH, hslS, hslL ];
21
- }
22
-
23
- export function hsl2rgb(hslH, hslS, hslL) {
24
- // calcuate t2
25
- const t2 = hslL <= 50 ? hslL * (hslS + 100) / 100 : hslL + hslS - hslL * hslS / 100;
26
-
27
- // calcuate t1
28
- const t1 = hslL * 2 - t2;
29
-
30
- // calculate rgb
31
- const [ rgbR, rgbG, rgbB ] = [
32
- hue2rgb(t1, t2, hslH + 120),
33
- hue2rgb(t1, t2, hslH),
34
- hue2rgb(t1, t2, hslH - 120)
35
- ];
36
-
37
- return [ rgbR, rgbG, rgbB ];
38
- }
39
-
40
- /*
41
-
42
- References
43
- ----------
44
-
45
- - https://www.w3.org/TR/css-color-3/#hsl-color
46
- - https://www.w3.org/TR/css-color-4/#hsl-to-rgb
47
- - https://www.rapidtables.com/convert/color/rgb-to-hsl.html
48
- - https://www.rapidtables.com/convert/color/hsl-to-rgb.html
49
-
50
- /* ========================================================================== */
package/lib/rgb-hsv.js DELETED
@@ -1,47 +0,0 @@
1
- import { rgb2value, rgb2whiteness, rgb2hue } from './util';
2
-
3
- /* Convert between RGB and HSV
4
- /* ========================================================================== */
5
-
6
- export function rgb2hsv(rgbR, rgbG, rgbB, fallbackhue) {
7
- const hsvV = rgb2value(rgbR, rgbG, rgbB);
8
- const hsvW = rgb2whiteness(rgbR, rgbG, rgbB);
9
- const hsvH = rgb2hue(rgbR, rgbG, rgbB, fallbackhue);
10
-
11
- // calculate saturation
12
- const hsvS = hsvV === hsvW ? 0 : (hsvV - hsvW) / hsvV * 100;
13
-
14
- return [ hsvH, hsvS, hsvV ];
15
- }
16
-
17
- export function hsv2rgb(hsvH, hsvS, hsvV) {
18
- const rgbI = Math.floor(hsvH / 60);
19
-
20
- // calculate rgb parts
21
- const rgbF = hsvH / 60 - rgbI & 1 ? hsvH / 60 - rgbI : 1 - hsvH / 60 - rgbI;
22
- const rgbM = hsvV * (100 - hsvS) / 100;
23
- const rgbN = hsvV * (100 - hsvS * rgbF) / 100;
24
-
25
- const [ rgbR, rgbG, rgbB ] = rgbI === 5
26
- ? [ hsvV, rgbM, rgbN ]
27
- : rgbI === 4
28
- ? [ rgbN, rgbM, hsvV ]
29
- : rgbI === 3
30
- ? [ rgbM, rgbN, hsvV ]
31
- : rgbI === 2
32
- ? [ rgbM, hsvV, rgbN ]
33
- : rgbI === 1
34
- ? [ rgbN, hsvV, rgbM ]
35
- : [ hsvV, rgbN, rgbM ];
36
-
37
- return [ rgbR, rgbG, rgbB ];
38
- }
39
-
40
- /*
41
-
42
- References
43
- ----------
44
-
45
- - http://alvyray.com/Papers/CG/hsv2rgb.htm
46
-
47
- /* ========================================================================== */
package/lib/rgb-hwb.js DELETED
@@ -1,32 +0,0 @@
1
- import { rgb2hue, rgb2whiteness, rgb2value } from './util';
2
- import { hsl2rgb } from './rgb-hsl';
3
-
4
- /* Convert between RGB and HWB
5
- /* ========================================================================== */
6
-
7
- export function rgb2hwb(rgbR, rgbG, rgbB, fallbackhue) {
8
- const hwbH = rgb2hue(rgbR, rgbG, rgbB, fallbackhue);
9
- const hwbW = rgb2whiteness(rgbR, rgbG, rgbB);
10
- const hwbV = rgb2value(rgbR, rgbG, rgbB);
11
- const hwbB = 100 - hwbV;
12
-
13
- return [hwbH, hwbW, hwbB];
14
- }
15
-
16
- export function hwb2rgb(hwbH, hwbW, hwbB, fallbackhue) {
17
- const [ rgbR, rgbG, rgbB ] = hsl2rgb(hwbH, 100, 50, fallbackhue).map(
18
- v => v * (100 - hwbW - hwbB) / 100 + hwbW
19
- );
20
-
21
- return [ rgbR, rgbG, rgbB ];
22
- }
23
-
24
- /*
25
-
26
- References
27
- ----------
28
-
29
- - https://www.w3.org/TR/css-color-4/#hwb-to-rgb
30
- - http://alvyray.com/Papers/CG/hwb2rgb.htm
31
-
32
- /* ========================================================================== */
package/lib/rgb-xyz.js DELETED
@@ -1,42 +0,0 @@
1
- import { matrix } from './util';
2
-
3
- /* Convert between RGB and XYZ
4
- /* ========================================================================== */
5
-
6
- export function rgb2xyz(rgbR, rgbG, rgbB) {
7
- const [ lrgbR, lrgbB, lrgbG ] = [ rgbR, rgbG, rgbB ].map(
8
- v => v > 4.045 ? Math.pow((v + 5.5) / 105.5, 2.4) * 100 : v / 12.92
9
- );
10
-
11
- const [ xyzX, xyzY, xyzZ ] = matrix([ lrgbR, lrgbB, lrgbG ], [
12
- [0.4124564, 0.3575761, 0.1804375],
13
- [0.2126729, 0.7151522, 0.0721750],
14
- [0.0193339, 0.1191920, 0.9503041]
15
- ]);
16
-
17
- return [ xyzX, xyzY, xyzZ ];
18
- }
19
-
20
- export function xyz2rgb(xyzX, xyzY, xyzZ) {
21
- const [ lrgbR, lrgbB, lrgbG ] = matrix([ xyzX, xyzY, xyzZ ], [
22
- [ 3.2404542, -1.5371385, -0.4985314],
23
- [-0.9692660, 1.8760108, 0.0415560],
24
- [ 0.0556434, -0.2040259, 1.0572252]
25
- ]);
26
-
27
- const [ rgbR, rgbG, rgbB ] = [ lrgbR, lrgbB, lrgbG ].map(
28
- v => v > 0.31308 ? 1.055 * Math.pow(v / 100, 1 / 2.4) * 100 - 5.5 : 12.92 * v
29
- );
30
-
31
- return [ rgbR, rgbG, rgbB ];
32
- }
33
-
34
- /*
35
-
36
- References
37
- ----------
38
-
39
- - https://www.w3.org/TR/css-color-4/#rgb-to-lab
40
- - https://www.w3.org/TR/css-color-4/#color-conversion-code
41
-
42
- /* ========================================================================== */
package/lib/util.js DELETED
@@ -1,87 +0,0 @@
1
- /* Convert between RGB and Hue
2
- /* ========================================================================== */
3
-
4
- export function rgb2hue(rgbR, rgbG, rgbB, fallbackhue = 0) {
5
- const value = rgb2value(rgbR, rgbG, rgbB);
6
- const whiteness = rgb2whiteness(rgbR, rgbG, rgbB);
7
- const delta = value - whiteness;
8
-
9
- if (delta) {
10
- // calculate segment
11
- const segment = value === rgbR
12
- ? (rgbG - rgbB) / delta
13
- : value === rgbG
14
- ? (rgbB - rgbR) / delta
15
- : (rgbR - rgbG) / delta;
16
-
17
- // calculate shift
18
- const shift = value === rgbR
19
- ? segment < 0
20
- ? 360 / 60
21
- : 0 / 60
22
- : value === rgbG
23
- ? 120 / 60
24
- : 240 / 60;
25
-
26
- // calculate hue
27
- const hue = (segment + shift) * 60;
28
-
29
- return hue;
30
- } else {
31
- // otherwise return the fallback hue
32
- return fallbackhue;
33
- }
34
- }
35
-
36
- export function hue2rgb(t1, t2, hue) {
37
- // calculate the ranged hue
38
- const rhue = hue < 0 ? hue + 360 : hue > 360 ? hue - 360 : hue;
39
-
40
- // calculate the rgb value
41
- const rgb = rhue * 6 < 360
42
- ? t1 + (t2 - t1) * rhue / 60
43
- : rhue * 2 < 360
44
- ? t2
45
- : rhue * 3 < 720
46
- ? t1 + (t2 - t1) * (240 - rhue) / 60
47
- : t1;
48
-
49
- return rgb;
50
- }
51
-
52
- /* RGB tooling
53
- /* ========================================================================== */
54
-
55
- export function rgb2value(rgbR, rgbG, rgbB) {
56
- const value = Math.max(rgbR, rgbG, rgbB);
57
-
58
- return value;
59
- }
60
-
61
- export function rgb2whiteness(rgbR, rgbG, rgbB) {
62
- const whiteness = Math.min(rgbR, rgbG, rgbB);
63
-
64
- return whiteness;
65
- }
66
-
67
- /* Math matrix
68
- /* ========================================================================== */
69
-
70
- export function matrix(params, mats) {
71
- return mats.map(mat => mat.reduce((acc, value, index) => acc + params[index] * value, 0));
72
- }
73
-
74
- /* D50 reference white
75
- /* ========================================================================== */
76
-
77
- export const [ wd50X, wd50Y, wd50Z ] = [ 96.42, 100, 82.49 ];
78
-
79
- /* Epsilon
80
- /* ========================================================================== */
81
-
82
- export const epsilon = Math.pow(6, 3) / Math.pow(29, 3);
83
-
84
- /* Kappa
85
- /* ========================================================================== */
86
-
87
- export const kappa = Math.pow(29, 3) / Math.pow(3, 3);