-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpSBC.js
More file actions
105 lines (103 loc) · 2.48 KB
/
pSBC.js
File metadata and controls
105 lines (103 loc) · 2.48 KB
1
2
3
4
5
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Shade/Blend/Convert
// From: <https://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or-rgb-and-blend-colors>
// See wiki too: <https://github.com/PimpTrizkit/PJs/wiki/12.-Shade,-Blend-and-Convert-a-Web-Color-(pSBC.js)>
const pSBC = (p, c0, c1, l) => {
let r,
g,
b,
P,
f,
t,
h,
m = Math.round,
a = typeof c1 == "string";
if (
typeof p != "number" ||
p < -1 ||
p > 1 ||
typeof c0 != "string" ||
(c0[0] != "r" && c0[0] != "#") ||
(c1 && !a)
) {
return null;
}
(h = c0.length > 9),
(h = a ? (c1.length > 9 ? true : c1 == "c" ? !h : false) : h),
(f = pSBC.pSBCr(c0)),
(P = p < 0),
(t =
c1 && c1 != "c"
? pSBC.pSBCr(c1)
: P
? { r: 0, g: 0, b: 0, a: -1 }
: { r: 255, g: 255, b: 255, a: -1 }),
(p = P ? p * -1 : p),
(P = 1 - p);
if (!f || !t) return null;
if (l)
(r = m(P * f.r + p * t.r)),
(g = m(P * f.g + p * t.g)),
(b = m(P * f.b + p * t.b));
else
(r = m((P * f.r ** 2 + p * t.r ** 2) ** 0.5)),
(g = m((P * f.g ** 2 + p * t.g ** 2) ** 0.5)),
(b = m((P * f.b ** 2 + p * t.b ** 2) ** 0.5));
(a = f.a),
(t = t.a),
(f = a >= 0 || t >= 0),
(a = f ? (a < 0 ? t : t < 0 ? a : a * P + t * p) : 0);
if (h)
return (
"rgb" +
(f ? "a(" : "(") +
r +
"," +
g +
"," +
b +
(f ? "," + m(a * 1000) / 1000 : "") +
")"
);
else
return (
"#" +
(4294967296 + r * 16777216 + g * 65536 + b * 256 + (f ? m(a * 255) : 0))
.toString(16)
.slice(1, f ? undefined : -2)
);
};
pSBC.pSBCr = (d) => {
const i = parseInt;
let n = d.length,
x = {};
if (n > 9) {
const [r, g, b, a] = (d = d.split(","));
n = d.length;
if (n < 3 || n > 4) return null;
(x.r = i(r[3] == "a" ? r.slice(5) : r.slice(4))),
(x.g = i(g)),
(x.b = i(b)),
(x.a = a ? parseFloat(a) : -1);
} else {
if (n == 8 || n == 6 || n < 4) return null;
if (n < 6)
d =
"#" +
d[1] +
d[1] +
d[2] +
d[2] +
d[3] +
d[3] +
(n > 4 ? d[4] + d[4] : "");
d = i(d.slice(1), 16);
if (n == 9 || n == 5)
(x.r = (d >> 24) & 255),
(x.g = (d >> 16) & 255),
(x.b = (d >> 8) & 255),
(x.a = Math.round((d & 255) / 0.255) / 1000);
else (x.r = d >> 16), (x.g = (d >> 8) & 255), (x.b = d & 255), (x.a = -1);
}
return x;
};
module.exports = pSBC;