efront 4.35.5 → 4.35.6
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/apps/_index.html +41 -41
- package/apps/blank/index.html +20 -20
- package/apps/noice/index.html +42 -42
- package/apps/pay/paypal.jsp +0 -0
- package/apps/pay/wxpay.jsp +32 -0
- package/apps/pivot/dht/rent.html +14 -0
- package/apps/pivot/dht/rent.js +148 -0
- package/apps/pivot/dht/rent.less +46 -0
- package/apps/pivot/home/desktop.xht +0 -0
- package/apps/pivot/menu.yml +6 -1
- package/apps/pivot/shop/goods/list.xht +183 -0
- package/apps/pivot/shop/home.xht +20 -0
- package/apps/pivot/shop/mind/list.xht +1 -0
- package/apps/pivot/shop/order/create.xht +49 -0
- package/apps/pivot/shop/order/list.xht +1 -0
- package/apps/pivot/shop/paypal.jsp +23 -0
- package/apps/pivot/soft/list.html +0 -0
- package/apps/pivot/soft/list.js +9 -0
- package/apps/pivot/soft/list.less +0 -0
- package/apps/pivot//344/270/273/351/241/265.html +42 -42
- package/coms/7z_temp/Java.js +93 -0
- package/coms/7z_temp/LzmaBench.java +392 -0
- package/coms/7z_temp/read-from-java-code.js +28 -0
- package/coms/7z_temp//350/257/264/346/230/216.md +1 -0
- package/coms/basic/JSAM.js +259 -259
- package/coms/basic/JSAM_test.js +3 -5
- package/coms/basic/check.js +42 -42
- package/coms/basic/color.js +696 -696
- package/coms/basic/crc.js +39 -39
- package/coms/basic/getIndexFromOrderedArray.js +39 -39
- package/coms/basic/isObject.js +3 -3
- package/coms/basic/keys.js +4 -4
- package/coms/basic/lazy.js +78 -78
- package/coms/basic/refilm.js +96 -96
- package/coms/basic/saveToOrderedArray.js +11 -11
- package/coms/basic/strings.js +0 -1
- package/coms/basic_/&pget.js +1 -0
- package/coms/basic_/&pset.js +1 -0
- package/coms/basic_/Proxy.js +6 -0
- package/coms/basic_/Reflect.js +55 -0
- package/coms/compile/autoeval.js +24 -5
- package/coms/compile/autoeval_test.js +5 -1
- package/coms/compile/bracket.js +51 -0
- package/coms/compile/bracket_test.js +9 -0
- package/coms/compile/createvm.js +35 -0
- package/coms/compile/createvm_test.js +7 -0
- package/coms/compile/scanner.js +653 -653
- package/coms/compile/scanner2.js +23 -0
- package/coms/docs/getMimeData_test.js +19 -19
- package/coms/docs/md5.js +173 -173
- package/coms/frame/top.less +190 -190
- package/coms/pivot/DB.js +9 -0
- package/coms/pivot/paypal-var.js +1 -0
- package/coms/pivot//345/225/206/345/223/201.js +1 -0
- package/coms/zimoli/AudioContext_test.html +5 -5
- package/coms/zimoli/AudioContext_test.js +92 -92
- package/coms/zimoli/AudioContext_test.less +114 -114
- package/coms/zimoli/alert_test.js +11 -11
- package/coms/zimoli/dispatch.js +50 -50
- package/coms/zimoli/extendTouchEvent.js +8 -8
- package/coms/zimoli/fullscreen.js +52 -52
- package/coms/zimoli/gallery.less +13 -13
- package/coms/zimoli/gallery_test.html +2 -2
- package/coms/zimoli/gallery_test.js +14 -14
- package/coms/zimoli/gallery_test.less +17 -17
- package/coms/zimoli/getChanged.js +7 -7
- package/coms/zimoli/getChanges.js +13 -13
- package/coms/zimoli/lattice.js +109 -109
- package/coms/zimoli/lattice_test.less +23 -23
- package/coms/zimoli/picture.less +71 -71
- package/coms/zimoli/refilm_test.html +41 -41
- package/coms/zimoli/refilm_test.less +102 -102
- package/coms/zimoli/xml.js +131 -131
- package/data/keystore/cross-cert.pem +21 -21
- package/data/keystore/cross-key.pem +27 -27
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/public//346/226/207/344/273/266/347/263/273/347/273/237//344/270/273/351/241/265.jsp +2 -2
- /package/apps/pivot/{tick → ticket}/list.js +0 -0
package/coms/basic/color.js
CHANGED
|
@@ -1,697 +1,697 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Created by jams on 2016/5/13.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
var { min, max, sin, cos, tan, atan, round, sqrt, acos, atan2, asin, random, PI, abs = a => a < 0 ? -a : a } = Math;
|
|
6
|
-
var [r_v, g_v, b_v] = [.299, .587, .114];
|
|
7
|
-
var r_u = r_v / sqrt(r_v * r_v + g_v * g_v + b_v * b_v);
|
|
8
|
-
var g_u = g_v / sqrt(r_v * r_v + g_v * g_v + b_v * b_v);
|
|
9
|
-
var b_u = b_v / sqrt(r_v * r_v + g_v * g_v + b_v * b_v);
|
|
10
|
-
var rgb4v = function (r, g, b, v) {
|
|
11
|
-
var d = v - rgb2v(r, g, b);
|
|
12
|
-
return [r + d, g + d, b + d];
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var number_sort = (a, b) => a - b;
|
|
17
|
-
|
|
18
|
-
var rgb4h = function (r, g, b, h) {
|
|
19
|
-
var [p, _, s] = [r, g, b].sort(number_sort);
|
|
20
|
-
var m = s - p;
|
|
21
|
-
h = (h % 360 + 360) % 360;
|
|
22
|
-
if (h < 60) {
|
|
23
|
-
r = s;
|
|
24
|
-
g = p + m * h / 60;
|
|
25
|
-
b = p;
|
|
26
|
-
}
|
|
27
|
-
else if (h < 120) {
|
|
28
|
-
r = p + m * (120 - h) / 60;
|
|
29
|
-
g = s;
|
|
30
|
-
b = p;
|
|
31
|
-
}
|
|
32
|
-
else if (h < 180) {
|
|
33
|
-
r = p;
|
|
34
|
-
g = s;
|
|
35
|
-
b = p + m * (h - 120) / 60
|
|
36
|
-
}
|
|
37
|
-
else if (h < 240) {
|
|
38
|
-
r = p;
|
|
39
|
-
g = p + m * (240 - h) / 60;
|
|
40
|
-
b = s;
|
|
41
|
-
}
|
|
42
|
-
else if (h < 300) {
|
|
43
|
-
r = p + m * (h - 240) / 60;
|
|
44
|
-
g = p;
|
|
45
|
-
b = s;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
r = s;
|
|
49
|
-
g = p;
|
|
50
|
-
b = p + m * (360 - h) / 60;
|
|
51
|
-
}
|
|
52
|
-
return [r, g, b];
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
var rgb2h = function (r, g, b) {
|
|
57
|
-
var m = max(r, g, b);
|
|
58
|
-
var n = min(r, g, b);
|
|
59
|
-
var h;
|
|
60
|
-
if (m === n) h = 0;
|
|
61
|
-
else if (m === r) {
|
|
62
|
-
if (g >= b) {
|
|
63
|
-
h = 60 * (g - b) / (m - n);
|
|
64
|
-
} else {
|
|
65
|
-
h = 360 + 60 * (g - b) / (m - n);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
else if (m === g) {
|
|
69
|
-
h = 120 + 60 * (b - r) / (m - n);
|
|
70
|
-
}
|
|
71
|
-
else if (m === b) {
|
|
72
|
-
h = 240 + 60 * (r - g) / (m - n);
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
return h;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
var rgb2s = function (r, g, b) {
|
|
79
|
-
var m = min(r, g, b);
|
|
80
|
-
if (m) {
|
|
81
|
-
r -= m;
|
|
82
|
-
g -= m;
|
|
83
|
-
b -= m;
|
|
84
|
-
}
|
|
85
|
-
return max(r, g, b) / 255;
|
|
86
|
-
};
|
|
87
|
-
var rgb4s = function (r, g, b, s) {
|
|
88
|
-
var m = min(r, g, b);
|
|
89
|
-
if (m) {
|
|
90
|
-
r -= m;
|
|
91
|
-
g -= m;
|
|
92
|
-
b -= m;
|
|
93
|
-
}
|
|
94
|
-
s = s * 255 / (max(r, g, b) || 1);
|
|
95
|
-
if (s) {
|
|
96
|
-
r *= s;
|
|
97
|
-
g *= s;
|
|
98
|
-
b *= s;
|
|
99
|
-
}
|
|
100
|
-
return [r, g, b];
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
// 色相
|
|
104
|
-
function rotate_rgb(RGBA, theta) {
|
|
105
|
-
var [r, g, b, a] = RGBA;
|
|
106
|
-
if (isNaN(theta)) return [r, g, b, a];
|
|
107
|
-
var h = rgb2h(r, g, b);
|
|
108
|
-
var s = rgb2s(r, g, b);
|
|
109
|
-
var v = rgb2v(r, g, b);
|
|
110
|
-
h += theta * 180 / Math.PI;
|
|
111
|
-
[r, g, b] = rgb4h(r, g, b, h);
|
|
112
|
-
[r, g, b] = rgb4s(r, g, b, s);
|
|
113
|
-
[r, g, b] = rgb4v(r, g, b, v);
|
|
114
|
-
return [r, g, b, a];
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// function rotate_phi(x, y, z, alpha) {
|
|
118
|
-
// // 转轴为过原点的向量(-1,0,1)
|
|
119
|
-
// // 顺时针转动后中性值偏向紫色方向,与纯红纯蓝的夹角均为45度
|
|
120
|
-
// // 用于适配初始饱和度
|
|
121
|
-
// // 此向量是过三点的平面的法向量,三点为(0,0,0),(1,1,1),(1,0,1)
|
|
122
|
-
// var u = sqrt(1 / 2);
|
|
123
|
-
// var cosi = cos(alpha);
|
|
124
|
-
// var sini = sin(alpha);
|
|
125
|
-
// var veri = 1 - cosi;
|
|
126
|
-
// return [
|
|
127
|
-
// x * (cosi + veri / 2) + sini * u * y - veri * z / 2,
|
|
128
|
-
// -u * sini * x + y * cosi + -u * sini * z,
|
|
129
|
-
// -veri * x / 2 + sini * u * y + (cosi + veri / 2) * z
|
|
130
|
-
// ];
|
|
131
|
-
// }
|
|
132
|
-
|
|
133
|
-
// function rotate_3d(x, y, z, theta) {
|
|
134
|
-
// // 转轴为过原点的(1,1,1)向量
|
|
135
|
-
// // 用于调整色相
|
|
136
|
-
// // theta取正值时为逆时针转动
|
|
137
|
-
// // 在右手坐标系中,红绿蓝分别对应母指、食指、中指的指向
|
|
138
|
-
// var u = sqrt(3) / 3;
|
|
139
|
-
// var pu = 1 / 3;
|
|
140
|
-
// var cosa = cos(theta);
|
|
141
|
-
// var sina = sin(theta);
|
|
142
|
-
// var vera = 1 - cosa;
|
|
143
|
-
// var a = (cosa + pu * vera) * x + (pu * vera - u * sina) * y + (pu * vera + u * sina) * z;
|
|
144
|
-
// var b = (pu * vera + u * sina) * x + (cosa + pu * vera) * y + (pu * vera - u * sina) * z;
|
|
145
|
-
// var c = (pu * vera - u * sina) * x + (pu * vera + u * sina) * y + (cosa + pu * vera) * z;
|
|
146
|
-
// return [a, b, c];
|
|
147
|
-
// }
|
|
148
|
-
|
|
149
|
-
function rotate_(a, b, c, x, y, z, theta) {
|
|
150
|
-
var cosa = cos(theta);
|
|
151
|
-
var sina = sin(theta);
|
|
152
|
-
var vera = 1 - cosa;
|
|
153
|
-
return [
|
|
154
|
-
(vera * a * a + cosa) * x + (vera * a * b - sina * c) * y + (sina * b + vera * a * c) * z,
|
|
155
|
-
(sina * c + vera * a * b) * x + (vera * b * b + cosa) * y + (vera * b * c - sina * a) * z,
|
|
156
|
-
(vera * a * c - sina * b) * x + (sina * a + vera * b * c) * y + (vera * c * c + cosa) * z
|
|
157
|
-
];
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function rotate_3d(r_l, g_l, b_l, theta) {
|
|
161
|
-
// (.299,.587,.114)
|
|
162
|
-
return rotate_(r_u, g_u, b_u, r_l, g_l, b_l, theta);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function rotate_phi(r_l, g_l, b_l, phi) {
|
|
166
|
-
// (-.114,0,.299);
|
|
167
|
-
var b_u = b_v / sqrt(b_v * b_v + r_v * r_v);
|
|
168
|
-
var r_u = r_v / sqrt(b_v * b_v + r_v * r_v);
|
|
169
|
-
return rotate_(-b_u, 0, r_u, r_l, g_l, b_l, phi);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
// 对比度
|
|
174
|
-
function contrast_rgb(RGBA, ratio) {
|
|
175
|
-
var [r, g, b, a] = RGBA;
|
|
176
|
-
var middle = 127.5 * 3;
|
|
177
|
-
var total = r + g + b;
|
|
178
|
-
var ratio = ((total - middle) * ratio + middle) / total;
|
|
179
|
-
var red = ratio * r;
|
|
180
|
-
var green = ratio * g;
|
|
181
|
-
var blue = ratio * b;
|
|
182
|
-
return [red, green, blue, a];
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
var trim16 = a => max(min(round(a), 15), 0);
|
|
186
|
-
var trim256 = a => max(min(round(a), 255), 0);
|
|
187
|
-
var hex256 = function (num) {
|
|
188
|
-
num = trim256(num);
|
|
189
|
-
if (num < 16) return "0" + num.toString(16);
|
|
190
|
-
return num.toString(16);
|
|
191
|
-
}
|
|
192
|
-
var hex16 = function (num) {
|
|
193
|
-
num = trim16(num / 17);
|
|
194
|
-
return num.toString(16);
|
|
195
|
-
}
|
|
196
|
-
function color(rgba) {
|
|
197
|
-
return parse(rgba);
|
|
198
|
-
}
|
|
199
|
-
function rgb2hsl([r, g, b]) {
|
|
200
|
-
r /= 255;
|
|
201
|
-
g /= 255;
|
|
202
|
-
b /= 255;
|
|
203
|
-
var _max = max(r, g, b), _min = min(r, g, b);
|
|
204
|
-
var h, s, l;
|
|
205
|
-
if (_max === _min) {
|
|
206
|
-
h = NaN;
|
|
207
|
-
} else if (_max === r) {
|
|
208
|
-
if (g >= b) {
|
|
209
|
-
h = 60 * (g - b) / (_max - _min);
|
|
210
|
-
} else {
|
|
211
|
-
h = 360 + 60 * (g - b) / (_max - _min);
|
|
212
|
-
}
|
|
213
|
-
} else if (_max === g) {
|
|
214
|
-
h = 120 + 60 * (b - r) / (_max - _min);
|
|
215
|
-
} else if (_max === b) {
|
|
216
|
-
h = 240 + 60 * (r - g) / (_max - _min);
|
|
217
|
-
}
|
|
218
|
-
l = (_max + _min) / 2;
|
|
219
|
-
if (_max === _min) {
|
|
220
|
-
s = NaN;
|
|
221
|
-
} else {
|
|
222
|
-
if (l < .5) {
|
|
223
|
-
s = (_max - _min) / (_max + _min);
|
|
224
|
-
} else {
|
|
225
|
-
s = (_max - _min) / (2 - (_max + _min))
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return [h || 0, s || 0, l];
|
|
229
|
-
}
|
|
230
|
-
function t2rgb(t, p, q) {
|
|
231
|
-
if (t < 0) t += 1;
|
|
232
|
-
if (t > 1) t -= 1;
|
|
233
|
-
if (t < 1 / 6) return p + (q - p) * 6 * t;
|
|
234
|
-
if (t < .5) return q;
|
|
235
|
-
if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);
|
|
236
|
-
return p;
|
|
237
|
-
}
|
|
238
|
-
function rgb4hsl(h, s, l, a) {
|
|
239
|
-
var q = l < .5 ? l * (1 + s) : l + s - l * s;
|
|
240
|
-
var p = 2 * l - q;
|
|
241
|
-
h /= 360;
|
|
242
|
-
var r = t2rgb(h + 1 / 3, p, q) * 255;
|
|
243
|
-
var g = t2rgb(h, p, q) * 255;
|
|
244
|
-
var b = t2rgb(h - 1 / 3, p, q) * 255;
|
|
245
|
-
return [r, g, b, a];
|
|
246
|
-
}
|
|
247
|
-
function hsl2rgb([h, s, l]) {
|
|
248
|
-
return rgb4hsl(h, s, l, 1);
|
|
249
|
-
}
|
|
250
|
-
function percent(a, total = 1) {
|
|
251
|
-
if (/%$/.test(a)) {
|
|
252
|
-
a = a.replace(/%$/, '') / 100 * total;
|
|
253
|
-
}
|
|
254
|
-
return +a;
|
|
255
|
-
}
|
|
256
|
-
function prgb(a) {
|
|
257
|
-
return percent(a, 255);
|
|
258
|
-
}
|
|
259
|
-
function pab(a) {
|
|
260
|
-
return percent(a, 125);
|
|
261
|
-
}
|
|
262
|
-
function pc(a) {
|
|
263
|
-
return percent(a, 150);
|
|
264
|
-
}
|
|
265
|
-
function pl(a) {
|
|
266
|
-
return percent(a, 100);
|
|
267
|
-
}
|
|
268
|
-
function pkl(a) {
|
|
269
|
-
return percent(a) * 100;
|
|
270
|
-
}
|
|
271
|
-
function pkc(a) {
|
|
272
|
-
return percent(a) * 150 / 0.4;
|
|
273
|
-
}
|
|
274
|
-
function pkab(a) {
|
|
275
|
-
return percent(a) * 125 / 0.4;
|
|
276
|
-
}
|
|
277
|
-
function ph(hue) {
|
|
278
|
-
if (/deg$/i.test(hue)) {
|
|
279
|
-
return +hue.replace(/deg$/i, '');
|
|
280
|
-
}
|
|
281
|
-
if (/turn$/i.test(hue)) {
|
|
282
|
-
return hue.replace(/turn$/i, '') * 360;
|
|
283
|
-
}
|
|
284
|
-
if (/grad$/i.test(hue)) {
|
|
285
|
-
return hue.replace(/grad$/i, '') * 360 / 400;
|
|
286
|
-
}
|
|
287
|
-
if (/rad$/i.test(hue)) {
|
|
288
|
-
return hue.replace(/rad$/i, '') * 180 / PI;
|
|
289
|
-
}
|
|
290
|
-
return percent(hue, 360);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
const hdelta = -60;// lch的零点色相与纯红色相的差值
|
|
294
|
-
const cangle = acos(g_u);// 灰度轴与纯绿轴的夹角
|
|
295
|
-
// const cangle = acos(sqrt(2 / 3));// 灰度轴与纯黄向量的夹角
|
|
296
|
-
// const cratio = acos(sqrt(2 / 3));// lch的纯红色与rgb纯红色的饱合度比值
|
|
297
|
-
function rgb4lch(L, c, h, a) {
|
|
298
|
-
h = (h - hdelta) / 180 * PI;
|
|
299
|
-
L = L / 100 * 255;
|
|
300
|
-
var phi = c / 150 * cangle;
|
|
301
|
-
var s = L * tan(phi);
|
|
302
|
-
var A = cos(h) * s;
|
|
303
|
-
var B = sin(h) * s;
|
|
304
|
-
var [r, g, b] = rotate_phi(B, L, A, -cangle);
|
|
305
|
-
r /= r_u;
|
|
306
|
-
g /= g_u;
|
|
307
|
-
b /= b_u;
|
|
308
|
-
return [r + .5 | 0, g + .5 | 0, b + .5 | 0, a];
|
|
309
|
-
}
|
|
310
|
-
function lch4rgb(r, g, b, a) {
|
|
311
|
-
r *= r_u;
|
|
312
|
-
g *= g_u;
|
|
313
|
-
b *= b_u;
|
|
314
|
-
var [B, L, A] = rotate_phi(r, g, b, cangle);
|
|
315
|
-
var theta = atan2(B, A) / PI * 180 + hdelta;
|
|
316
|
-
if (theta < 0) theta += 360;
|
|
317
|
-
var c = sqrt(B * B + A * A) / (L || 1);
|
|
318
|
-
c = atan(c) / cangle * 150;
|
|
319
|
-
return [
|
|
320
|
-
L / 255 * 100,
|
|
321
|
-
c,
|
|
322
|
-
theta,
|
|
323
|
-
a
|
|
324
|
-
];
|
|
325
|
-
}
|
|
326
|
-
function rgb2lch([r, g, b, a]) {
|
|
327
|
-
return lch4rgb(r, g, b, a);
|
|
328
|
-
}
|
|
329
|
-
function rgb4lab(L, A, B, a) {
|
|
330
|
-
var [L, c, h] = lch4lab(L, A, B, a);
|
|
331
|
-
return rgb4lch(L, c, h);
|
|
332
|
-
}
|
|
333
|
-
function lch4lab(L, A, B, a) {
|
|
334
|
-
var c = sqrt(A * A + B * B) / 125 * 150;
|
|
335
|
-
var h = atan2(B, A) * 180 / PI;
|
|
336
|
-
return [L, c, h, a];
|
|
337
|
-
}
|
|
338
|
-
function lab4lch(L, c, h, a) {
|
|
339
|
-
c = c / 150 * 125;
|
|
340
|
-
h = h * PI / 180;
|
|
341
|
-
var A = c * cos(h);
|
|
342
|
-
var B = c * sin(h);
|
|
343
|
-
return [L, A, B, a];
|
|
344
|
-
}
|
|
345
|
-
function lab4rgb(r, g, b, a) {
|
|
346
|
-
var [l, c, h] = lch4rgb(r, g, b);
|
|
347
|
-
return lab4lch(l, c, h, a);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
function hwb4hsv(h, s, v, a) {
|
|
351
|
-
var w = (1 - s) * v;
|
|
352
|
-
var b = 1 - v;
|
|
353
|
-
return [h, w, b, a];
|
|
354
|
-
}
|
|
355
|
-
function hsv4hwb(h, w, b, a) {
|
|
356
|
-
if (w + b > 1) {
|
|
357
|
-
var s = w + b;
|
|
358
|
-
w /= s;
|
|
359
|
-
b /= s;
|
|
360
|
-
}
|
|
361
|
-
var s = 1 - w / (1 - b);
|
|
362
|
-
var v = 1 - b;
|
|
363
|
-
return [h, s, v, a];
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
function hwb4rgb(r, g, b, a) {
|
|
367
|
-
var h = rgb2h(r, g, b);
|
|
368
|
-
var w = min(r, g, b);
|
|
369
|
-
var b = 255 - max(r, g, b);
|
|
370
|
-
return [h, w / 255, b / 255, a];
|
|
371
|
-
}
|
|
372
|
-
function rgb4hwb(h, w, b, a) {
|
|
373
|
-
if (w + b > 1) {
|
|
374
|
-
var s = w + b;
|
|
375
|
-
w /= s;
|
|
376
|
-
b /= s;
|
|
377
|
-
}
|
|
378
|
-
w *= 255;
|
|
379
|
-
b *= 255;
|
|
380
|
-
var [r, g, b] = rgb4h(w, 255 - b, w, h);
|
|
381
|
-
return [r, g, b, a];
|
|
382
|
-
}
|
|
383
|
-
function parse4(namespace, b, c, d, a) {
|
|
384
|
-
a = a ? percent(a) : 1;
|
|
385
|
-
switch (namespace.toLowerCase()) {
|
|
386
|
-
case "rgb": return [prgb(b), prgb(c), prgb(d), a];
|
|
387
|
-
case "hsl": return rgb4hsl(ph(b), percent(c), percent(d), a);
|
|
388
|
-
case "hwb": return rgb4hwb(ph(b), percent(c), percent(d), a);
|
|
389
|
-
case "lab": return rgb4lab(pl(b), pab(c), pab(d), a);
|
|
390
|
-
case "lch": return rgb4lch(pl(b), pc(c), ph(d), a);
|
|
391
|
-
case "oklch": return rgb4lch(pkl(b), pkc(c), ph(d), a);
|
|
392
|
-
case "oklab": return rgb4lab(pkl(b), pkab(c), pkab(d), a);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
function parse(color) {
|
|
396
|
-
var m = null;
|
|
397
|
-
if (m = rgbHex.exec(color)) {
|
|
398
|
-
var [_, R, G, B, A] = m.map(a => parseInt(a + a, 16));
|
|
399
|
-
return [R, G, B, A >= 0 ? A / 0xff : 1];
|
|
400
|
-
}
|
|
401
|
-
else if (m = rgbHex2.exec(color)) {
|
|
402
|
-
var [_, R, G, B, A] = m.map(a => parseInt(a, 16));
|
|
403
|
-
return [R, G, B, A >= 0 ? A / 0xff : 1];
|
|
404
|
-
}
|
|
405
|
-
else if (m = rgbReg.exec(color)) {
|
|
406
|
-
var [_, R, G, B, a] = m;
|
|
407
|
-
return [R > 255 ? 255 : +R, G > 255 ? 255 : +G, B > 255 ? 255 : +B, a ? percent(a) : 1];
|
|
408
|
-
}
|
|
409
|
-
else if (m = hslReg.exec(color)) {
|
|
410
|
-
var [_, H, S, L, a] = m;
|
|
411
|
-
S = percent(S);
|
|
412
|
-
L = percent(L);
|
|
413
|
-
a = a ? percent(a) : 1;
|
|
414
|
-
[R, G, B] = rgb4hsl(ph(H), S, L, a);
|
|
415
|
-
return [R, G, B, a];
|
|
416
|
-
}
|
|
417
|
-
else if (m = lablch.exec(color)) {
|
|
418
|
-
var [_, f, b, c, d, a] = m;
|
|
419
|
-
return parse4(f, b, c, d, a);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
var maybe16 = function (n) {
|
|
423
|
-
return (n >> 4) === (n & 0xf);
|
|
424
|
-
}
|
|
425
|
-
function stringify(color) {
|
|
426
|
-
var [R, G, B, a] = color;
|
|
427
|
-
if (a >= 0 && a < 1) {
|
|
428
|
-
R = R.toFixed();
|
|
429
|
-
G = G.toFixed();
|
|
430
|
-
B = B.toFixed();
|
|
431
|
-
a = +a.toFixed(3);
|
|
432
|
-
return `rgba(${R},${G},${B},${a})`;
|
|
433
|
-
}
|
|
434
|
-
if (maybe16(R) && maybe16(G) && maybe16(B)) {
|
|
435
|
-
return "#" + [R, G, B].map(hex16).join("");
|
|
436
|
-
}
|
|
437
|
-
return "#" + [R, G, B].map(hex256).join("");
|
|
438
|
-
}
|
|
439
|
-
function doWith(manager, color, ...args) {
|
|
440
|
-
var isparsed = color instanceof Array,
|
|
441
|
-
c = isparsed ? color : parse(color);
|
|
442
|
-
if (!c) {
|
|
443
|
-
console.warn(i18n`颜色数据不正确:${color}`);
|
|
444
|
-
return color;
|
|
445
|
-
}
|
|
446
|
-
c = manager(c, ...args);
|
|
447
|
-
if (!isparsed) c = stringify(c);
|
|
448
|
-
return c;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
function normal([r, g, b]) {
|
|
452
|
-
return [g - b, b - r, r - g];
|
|
453
|
-
}
|
|
454
|
-
function norm([r, g, b]) {
|
|
455
|
-
return sqrt(r * r + g * g + b * b);
|
|
456
|
-
}
|
|
457
|
-
function unit(c, u) {
|
|
458
|
-
if (!u) var u = 1 / norm(c);
|
|
459
|
-
if (!u) {
|
|
460
|
-
u = Math.sqrt(3) / 3;
|
|
461
|
-
return [u, u, u];
|
|
462
|
-
}
|
|
463
|
-
var [r, g, b] = c;
|
|
464
|
-
return [r * u, g * u, b * u];
|
|
465
|
-
}
|
|
466
|
-
function angle(c1, c2) {
|
|
467
|
-
c1 = parse(c1);
|
|
468
|
-
c2 = parse(c2);
|
|
469
|
-
c1 = normal(c1);
|
|
470
|
-
c2 = normal(c2);
|
|
471
|
-
var theta = rgb2h(c2[0], c2[1], c2[2]) - rgb2h(c1[0], c1[1], c1[2]);
|
|
472
|
-
if (theta < 0) theta += 360;
|
|
473
|
-
return theta;
|
|
474
|
-
}
|
|
475
|
-
function equal(c1, c2) {
|
|
476
|
-
if (!isColor(c1) || !isColor(c2)) return false;
|
|
477
|
-
var [r1, g1, b1, a1] = parse(c1);
|
|
478
|
-
var [r2, g2, b2, a2] = parse(c2);
|
|
479
|
-
return abs(r1 - r2) < 1 && abs(g1 - g2) < 1 && abs(b1 - b2) < 1 && abs(a1 - a2) < .01;
|
|
480
|
-
}
|
|
481
|
-
var hslReg = /^hsla?\s*\(\s*([\d\.]+(?:deg|turn|g?rad)?)\s*[,\s]\s*([\d\.]+%?)\s*[,\s]\s*([\d\.]+%?)(?:[,\/\s]\s*([\d\.]+%?))?\)$/i;
|
|
482
|
-
var rgbReg = /^rgba?\s*\(\s*([\d\.]+)\s*[,\s]\s*([\d\.]+)\s*[,\s]\s*([\d\.]+)(?:[,\s]\s*([\d\.]+))?\)$/i;
|
|
483
|
-
var rgbHex = /^#([\da-f])([\da-f])([\da-f])([\da-f])?$/i;
|
|
484
|
-
var rgbHex2 = /^#([\da-f]{2})([\da-f]{2})([\da-f]{2})([\da-f]{2})?$/i;
|
|
485
|
-
var rotated_base_color = "#d16969";
|
|
486
|
-
var colorReg = /(?:(?:rgb|hsl)a?|hwb|(?:ok)?(?:lab|lch))\s*\([\-\,\.\w\s%]+\)|#[\da-f]{3,8}/ig;
|
|
487
|
-
var num = /(\-?(?:\d+(?:\.\d*)?|\.\d+)(?:%|deg|turn|g?rad)?)/;
|
|
488
|
-
var lablch = new RegExp(`${/^((?:ok)?(?:lab|lch)|hwb|rgb|hsl)\s*\(/.source}${num.source}\\s+${num.source}\\s+${num.source}\\s*(?:/\\s*${num.source})?\\)`, 'i');
|
|
489
|
-
function isColor(text) {
|
|
490
|
-
return rgbReg.test(text)
|
|
491
|
-
|| rgbHex.test(text)
|
|
492
|
-
|| rgbHex2.test(text)
|
|
493
|
-
|| hslReg.test(text)
|
|
494
|
-
|| lablch.test(text);
|
|
495
|
-
}
|
|
496
|
-
function format(color) {
|
|
497
|
-
var c = parse(color);
|
|
498
|
-
if (!c) return color;
|
|
499
|
-
return stringify(c);
|
|
500
|
-
}
|
|
501
|
-
var replacer = function (match) {
|
|
502
|
-
if (!isColor(match)) return match;
|
|
503
|
-
if (colorDesigner.rotate !== 0) {
|
|
504
|
-
match = color.rotate(match, colorDesigner.rotate);
|
|
505
|
-
}
|
|
506
|
-
if (colorDesigner.contrast !== 1) {
|
|
507
|
-
match = color.contrast(match, colorDesigner.contrast);
|
|
508
|
-
}
|
|
509
|
-
return format(match);
|
|
510
|
-
};
|
|
511
|
-
var colorDesigner = {
|
|
512
|
-
rotate: 0,
|
|
513
|
-
contrast: 1
|
|
514
|
-
};
|
|
515
|
-
var rgb2v = function (r, g, b) {
|
|
516
|
-
r *= r_v;
|
|
517
|
-
g *= g_v;
|
|
518
|
-
b *= b_v;
|
|
519
|
-
return r + g + b;
|
|
520
|
-
};
|
|
521
|
-
var v2rgb = function (v, r, g, b) {
|
|
522
|
-
var t = r + g + b || 1;
|
|
523
|
-
v = v / t;
|
|
524
|
-
r *= v;
|
|
525
|
-
g *= v;
|
|
526
|
-
b *= v;
|
|
527
|
-
return [r, g, b];
|
|
528
|
-
};
|
|
529
|
-
|
|
530
|
-
var gray4 = function (RGBA, A) {
|
|
531
|
-
var [r, g, b, a] = RGBA;
|
|
532
|
-
var v = rgb2v(r, g, b);
|
|
533
|
-
var s = rgb2s(r, g, b);
|
|
534
|
-
var p = .587 * 255;
|
|
535
|
-
if (v < .114 * 255) {
|
|
536
|
-
v = v - .3 * p + 255;
|
|
537
|
-
s = .2;
|
|
538
|
-
}
|
|
539
|
-
else if (v > .6 * 255) {
|
|
540
|
-
v = v - p * s - p;
|
|
541
|
-
s = 1;
|
|
542
|
-
if (v < 0) v = - v;
|
|
543
|
-
}
|
|
544
|
-
else {
|
|
545
|
-
v = 255;
|
|
546
|
-
}
|
|
547
|
-
if (s > .8) {
|
|
548
|
-
r = 255 + r >> 1, g = 255 + g >> 1, b = 255 + b >> 1;
|
|
549
|
-
s = .3;
|
|
550
|
-
}
|
|
551
|
-
[r, g, b] = rgb4s(r, g, b, s);
|
|
552
|
-
[r, g, b] = rgb4v(r, g, b, v);
|
|
553
|
-
return [r, g, b, A || a];
|
|
554
|
-
};
|
|
555
|
-
|
|
556
|
-
var saturate_rgb = function (RGBA, delta) {
|
|
557
|
-
var [r, g, b, a] = RGBA;
|
|
558
|
-
var h = rgb2h(r, g, b);
|
|
559
|
-
delta = percent(delta);
|
|
560
|
-
h += delta * 100;
|
|
561
|
-
[r, g, b] = rgb4h(r, g, b, h);
|
|
562
|
-
return [r, g, b, a];
|
|
563
|
-
};
|
|
564
|
-
|
|
565
|
-
var desaturate_rgb = function (RGBA, delta) {
|
|
566
|
-
delta = percent(delta);
|
|
567
|
-
return saturate_rgb(RGBA, -delta);
|
|
568
|
-
};
|
|
569
|
-
|
|
570
|
-
var lighten_rgb = function (RGBA, delta) {
|
|
571
|
-
var [r, g, b, a] = RGBA;
|
|
572
|
-
delta = percent(delta)
|
|
573
|
-
var l = rgb2v(r, g, b);
|
|
574
|
-
l += delta * 100;
|
|
575
|
-
[r, g, b] = rgb4v(r, g, b, l);
|
|
576
|
-
return [r, g, b, a];
|
|
577
|
-
};
|
|
578
|
-
|
|
579
|
-
var darken_rgb = function (RGBA, delta) {
|
|
580
|
-
delta = percent(delta);
|
|
581
|
-
return lighten_rgb(RGBA, -delta);
|
|
582
|
-
};
|
|
583
|
-
|
|
584
|
-
var fadein_rgb = function (RGBA, delta) {
|
|
585
|
-
delta = percent(delta);
|
|
586
|
-
var [r, g, b, a] = RGBA;
|
|
587
|
-
a += delta;
|
|
588
|
-
return [r, g, b, a];
|
|
589
|
-
};
|
|
590
|
-
|
|
591
|
-
var fadeout_rgb = function (RGBA, delta) {
|
|
592
|
-
delta = percent(delta);
|
|
593
|
-
return fadein_rgb(RGBA, -delta);
|
|
594
|
-
};
|
|
595
|
-
|
|
596
|
-
var fade_rgb = function (RGBA, alpha) {
|
|
597
|
-
var [r, g, b] = RGBA;
|
|
598
|
-
return [r, g, b, alpha];
|
|
599
|
-
};
|
|
600
|
-
|
|
601
|
-
var spin_rgb = function (RGBA, delta) {
|
|
602
|
-
var [r, g, b, a] = RGBA;
|
|
603
|
-
var s = rgb2s(r, g, b);
|
|
604
|
-
s += delta;
|
|
605
|
-
var [r, g, b] = rgb4s(r, g, b, s);
|
|
606
|
-
return [r, g, b, s];
|
|
607
|
-
};
|
|
608
|
-
|
|
609
|
-
var grayscale_rgb = function (RGBA) {
|
|
610
|
-
var [r, g, b, a] = RGBA;
|
|
611
|
-
[r, g, b] = rgb4s(r, g, b, 0);
|
|
612
|
-
return [r, g, b, a];
|
|
613
|
-
};
|
|
614
|
-
var grayluma_rgb = function (RGBA) {
|
|
615
|
-
var [r, g, b, a] = RGBA;
|
|
616
|
-
var v = rgb2v(r, g, b);
|
|
617
|
-
return [v, v, v, a];
|
|
618
|
-
};
|
|
619
|
-
var mix_rgb = function (RGBA, c2, power) {
|
|
620
|
-
var c1 = rgb2hsl(RGBA);
|
|
621
|
-
c1.push(RGBA[3]);
|
|
622
|
-
var rgba2 = parse(c2);
|
|
623
|
-
var c2 = rgb2hsl(rgba2);
|
|
624
|
-
c2.push(rgba2[3]);
|
|
625
|
-
return [0, 1, 2, 3].map(a => c1[a] * (1 - power) + c2[a] * power);
|
|
626
|
-
};
|
|
627
|
-
var tint_rgb = function (RGBA, power) {
|
|
628
|
-
return mix_rgb([255, 255, 255, RGBA[3]], RGBA, power);
|
|
629
|
-
};
|
|
630
|
-
var shade_rgb = function (RGBA, power) {
|
|
631
|
-
return mix_rgb([0, 0, 0, RGBA[3]], RGBA, power);
|
|
632
|
-
};
|
|
633
|
-
|
|
634
|
-
var wrap = function (f) {
|
|
635
|
-
return function () {
|
|
636
|
-
return doWith(f, ...arguments);
|
|
637
|
-
}
|
|
638
|
-
};
|
|
639
|
-
var random_base = Math.PI * Math.random() * 2;
|
|
640
|
-
extend(color, {
|
|
641
|
-
setTransformer(transformer) {
|
|
642
|
-
extend(colorDesigner, transformer);
|
|
643
|
-
},
|
|
644
|
-
rotate(color, theta) {
|
|
645
|
-
return doWith(rotate_rgb, color, theta);
|
|
646
|
-
},
|
|
647
|
-
contrast(color, ratio) {
|
|
648
|
-
return doWith(contrast_rgb, color, ratio);
|
|
649
|
-
},
|
|
650
|
-
saturate: wrap(saturate_rgb),
|
|
651
|
-
desaturate: wrap(desaturate_rgb),
|
|
652
|
-
lighten: wrap(lighten_rgb),
|
|
653
|
-
darken: wrap(darken_rgb),
|
|
654
|
-
fadein: wrap(mix_rgb),
|
|
655
|
-
fadeout: wrap(fadeout_rgb),
|
|
656
|
-
fade: wrap(fade_rgb),
|
|
657
|
-
spin: wrap(spin_rgb),
|
|
658
|
-
mix: wrap(mix_rgb),
|
|
659
|
-
tint: wrap(tint_rgb),
|
|
660
|
-
shade: wrap(shade_rgb),
|
|
661
|
-
grayscale: wrap(grayscale_rgb),
|
|
662
|
-
grayluma: wrap(grayluma_rgb),
|
|
663
|
-
rgb2h,
|
|
664
|
-
rgb4h,
|
|
665
|
-
rgb2v,
|
|
666
|
-
rgb4v,
|
|
667
|
-
rgb2s,
|
|
668
|
-
rgb4s,
|
|
669
|
-
rgb2hsl,
|
|
670
|
-
rgb4lch,
|
|
671
|
-
lch4rgb,
|
|
672
|
-
rgb4lab,
|
|
673
|
-
lab4rgb,
|
|
674
|
-
lab4lch,
|
|
675
|
-
lch4lab,
|
|
676
|
-
hsl2rgb,
|
|
677
|
-
rgb4hwb,
|
|
678
|
-
hwb4rgb,
|
|
679
|
-
angle,
|
|
680
|
-
parse,
|
|
681
|
-
parse4,
|
|
682
|
-
equal,
|
|
683
|
-
format,
|
|
684
|
-
stringify,
|
|
685
|
-
pair(c, alpha) {
|
|
686
|
-
return doWith(gray4, c, alpha);
|
|
687
|
-
},
|
|
688
|
-
isColor,
|
|
689
|
-
transform(text) {
|
|
690
|
-
return text.replace(colorReg, replacer);
|
|
691
|
-
},
|
|
692
|
-
random(base = rotated_base_color) {
|
|
693
|
-
random_base += (random() * .4 + .4) * PI;
|
|
694
|
-
if (random_base > 2 * PI) random_base -= 2 * PI;
|
|
695
|
-
return doWith(rotate_rgb, base, random_base);
|
|
696
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Created by jams on 2016/5/13.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
var { min, max, sin, cos, tan, atan, round, sqrt, acos, atan2, asin, random, PI, abs = a => a < 0 ? -a : a } = Math;
|
|
6
|
+
var [r_v, g_v, b_v] = [.299, .587, .114];
|
|
7
|
+
var r_u = r_v / sqrt(r_v * r_v + g_v * g_v + b_v * b_v);
|
|
8
|
+
var g_u = g_v / sqrt(r_v * r_v + g_v * g_v + b_v * b_v);
|
|
9
|
+
var b_u = b_v / sqrt(r_v * r_v + g_v * g_v + b_v * b_v);
|
|
10
|
+
var rgb4v = function (r, g, b, v) {
|
|
11
|
+
var d = v - rgb2v(r, g, b);
|
|
12
|
+
return [r + d, g + d, b + d];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
var number_sort = (a, b) => a - b;
|
|
17
|
+
|
|
18
|
+
var rgb4h = function (r, g, b, h) {
|
|
19
|
+
var [p, _, s] = [r, g, b].sort(number_sort);
|
|
20
|
+
var m = s - p;
|
|
21
|
+
h = (h % 360 + 360) % 360;
|
|
22
|
+
if (h < 60) {
|
|
23
|
+
r = s;
|
|
24
|
+
g = p + m * h / 60;
|
|
25
|
+
b = p;
|
|
26
|
+
}
|
|
27
|
+
else if (h < 120) {
|
|
28
|
+
r = p + m * (120 - h) / 60;
|
|
29
|
+
g = s;
|
|
30
|
+
b = p;
|
|
31
|
+
}
|
|
32
|
+
else if (h < 180) {
|
|
33
|
+
r = p;
|
|
34
|
+
g = s;
|
|
35
|
+
b = p + m * (h - 120) / 60
|
|
36
|
+
}
|
|
37
|
+
else if (h < 240) {
|
|
38
|
+
r = p;
|
|
39
|
+
g = p + m * (240 - h) / 60;
|
|
40
|
+
b = s;
|
|
41
|
+
}
|
|
42
|
+
else if (h < 300) {
|
|
43
|
+
r = p + m * (h - 240) / 60;
|
|
44
|
+
g = p;
|
|
45
|
+
b = s;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
r = s;
|
|
49
|
+
g = p;
|
|
50
|
+
b = p + m * (360 - h) / 60;
|
|
51
|
+
}
|
|
52
|
+
return [r, g, b];
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
var rgb2h = function (r, g, b) {
|
|
57
|
+
var m = max(r, g, b);
|
|
58
|
+
var n = min(r, g, b);
|
|
59
|
+
var h;
|
|
60
|
+
if (m === n) h = 0;
|
|
61
|
+
else if (m === r) {
|
|
62
|
+
if (g >= b) {
|
|
63
|
+
h = 60 * (g - b) / (m - n);
|
|
64
|
+
} else {
|
|
65
|
+
h = 360 + 60 * (g - b) / (m - n);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (m === g) {
|
|
69
|
+
h = 120 + 60 * (b - r) / (m - n);
|
|
70
|
+
}
|
|
71
|
+
else if (m === b) {
|
|
72
|
+
h = 240 + 60 * (r - g) / (m - n);
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
return h;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
var rgb2s = function (r, g, b) {
|
|
79
|
+
var m = min(r, g, b);
|
|
80
|
+
if (m) {
|
|
81
|
+
r -= m;
|
|
82
|
+
g -= m;
|
|
83
|
+
b -= m;
|
|
84
|
+
}
|
|
85
|
+
return max(r, g, b) / 255;
|
|
86
|
+
};
|
|
87
|
+
var rgb4s = function (r, g, b, s) {
|
|
88
|
+
var m = min(r, g, b);
|
|
89
|
+
if (m) {
|
|
90
|
+
r -= m;
|
|
91
|
+
g -= m;
|
|
92
|
+
b -= m;
|
|
93
|
+
}
|
|
94
|
+
s = s * 255 / (max(r, g, b) || 1);
|
|
95
|
+
if (s) {
|
|
96
|
+
r *= s;
|
|
97
|
+
g *= s;
|
|
98
|
+
b *= s;
|
|
99
|
+
}
|
|
100
|
+
return [r, g, b];
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// 色相
|
|
104
|
+
function rotate_rgb(RGBA, theta) {
|
|
105
|
+
var [r, g, b, a] = RGBA;
|
|
106
|
+
if (isNaN(theta)) return [r, g, b, a];
|
|
107
|
+
var h = rgb2h(r, g, b);
|
|
108
|
+
var s = rgb2s(r, g, b);
|
|
109
|
+
var v = rgb2v(r, g, b);
|
|
110
|
+
h += theta * 180 / Math.PI;
|
|
111
|
+
[r, g, b] = rgb4h(r, g, b, h);
|
|
112
|
+
[r, g, b] = rgb4s(r, g, b, s);
|
|
113
|
+
[r, g, b] = rgb4v(r, g, b, v);
|
|
114
|
+
return [r, g, b, a];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// function rotate_phi(x, y, z, alpha) {
|
|
118
|
+
// // 转轴为过原点的向量(-1,0,1)
|
|
119
|
+
// // 顺时针转动后中性值偏向紫色方向,与纯红纯蓝的夹角均为45度
|
|
120
|
+
// // 用于适配初始饱和度
|
|
121
|
+
// // 此向量是过三点的平面的法向量,三点为(0,0,0),(1,1,1),(1,0,1)
|
|
122
|
+
// var u = sqrt(1 / 2);
|
|
123
|
+
// var cosi = cos(alpha);
|
|
124
|
+
// var sini = sin(alpha);
|
|
125
|
+
// var veri = 1 - cosi;
|
|
126
|
+
// return [
|
|
127
|
+
// x * (cosi + veri / 2) + sini * u * y - veri * z / 2,
|
|
128
|
+
// -u * sini * x + y * cosi + -u * sini * z,
|
|
129
|
+
// -veri * x / 2 + sini * u * y + (cosi + veri / 2) * z
|
|
130
|
+
// ];
|
|
131
|
+
// }
|
|
132
|
+
|
|
133
|
+
// function rotate_3d(x, y, z, theta) {
|
|
134
|
+
// // 转轴为过原点的(1,1,1)向量
|
|
135
|
+
// // 用于调整色相
|
|
136
|
+
// // theta取正值时为逆时针转动
|
|
137
|
+
// // 在右手坐标系中,红绿蓝分别对应母指、食指、中指的指向
|
|
138
|
+
// var u = sqrt(3) / 3;
|
|
139
|
+
// var pu = 1 / 3;
|
|
140
|
+
// var cosa = cos(theta);
|
|
141
|
+
// var sina = sin(theta);
|
|
142
|
+
// var vera = 1 - cosa;
|
|
143
|
+
// var a = (cosa + pu * vera) * x + (pu * vera - u * sina) * y + (pu * vera + u * sina) * z;
|
|
144
|
+
// var b = (pu * vera + u * sina) * x + (cosa + pu * vera) * y + (pu * vera - u * sina) * z;
|
|
145
|
+
// var c = (pu * vera - u * sina) * x + (pu * vera + u * sina) * y + (cosa + pu * vera) * z;
|
|
146
|
+
// return [a, b, c];
|
|
147
|
+
// }
|
|
148
|
+
|
|
149
|
+
function rotate_(a, b, c, x, y, z, theta) {
|
|
150
|
+
var cosa = cos(theta);
|
|
151
|
+
var sina = sin(theta);
|
|
152
|
+
var vera = 1 - cosa;
|
|
153
|
+
return [
|
|
154
|
+
(vera * a * a + cosa) * x + (vera * a * b - sina * c) * y + (sina * b + vera * a * c) * z,
|
|
155
|
+
(sina * c + vera * a * b) * x + (vera * b * b + cosa) * y + (vera * b * c - sina * a) * z,
|
|
156
|
+
(vera * a * c - sina * b) * x + (sina * a + vera * b * c) * y + (vera * c * c + cosa) * z
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function rotate_3d(r_l, g_l, b_l, theta) {
|
|
161
|
+
// (.299,.587,.114)
|
|
162
|
+
return rotate_(r_u, g_u, b_u, r_l, g_l, b_l, theta);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function rotate_phi(r_l, g_l, b_l, phi) {
|
|
166
|
+
// (-.114,0,.299);
|
|
167
|
+
var b_u = b_v / sqrt(b_v * b_v + r_v * r_v);
|
|
168
|
+
var r_u = r_v / sqrt(b_v * b_v + r_v * r_v);
|
|
169
|
+
return rotate_(-b_u, 0, r_u, r_l, g_l, b_l, phi);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
// 对比度
|
|
174
|
+
function contrast_rgb(RGBA, ratio) {
|
|
175
|
+
var [r, g, b, a] = RGBA;
|
|
176
|
+
var middle = 127.5 * 3;
|
|
177
|
+
var total = r + g + b;
|
|
178
|
+
var ratio = ((total - middle) * ratio + middle) / total;
|
|
179
|
+
var red = ratio * r;
|
|
180
|
+
var green = ratio * g;
|
|
181
|
+
var blue = ratio * b;
|
|
182
|
+
return [red, green, blue, a];
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
var trim16 = a => max(min(round(a), 15), 0);
|
|
186
|
+
var trim256 = a => max(min(round(a), 255), 0);
|
|
187
|
+
var hex256 = function (num) {
|
|
188
|
+
num = trim256(num);
|
|
189
|
+
if (num < 16) return "0" + num.toString(16);
|
|
190
|
+
return num.toString(16);
|
|
191
|
+
}
|
|
192
|
+
var hex16 = function (num) {
|
|
193
|
+
num = trim16(num / 17);
|
|
194
|
+
return num.toString(16);
|
|
195
|
+
}
|
|
196
|
+
function color(rgba) {
|
|
197
|
+
return parse(rgba);
|
|
198
|
+
}
|
|
199
|
+
function rgb2hsl([r, g, b]) {
|
|
200
|
+
r /= 255;
|
|
201
|
+
g /= 255;
|
|
202
|
+
b /= 255;
|
|
203
|
+
var _max = max(r, g, b), _min = min(r, g, b);
|
|
204
|
+
var h, s, l;
|
|
205
|
+
if (_max === _min) {
|
|
206
|
+
h = NaN;
|
|
207
|
+
} else if (_max === r) {
|
|
208
|
+
if (g >= b) {
|
|
209
|
+
h = 60 * (g - b) / (_max - _min);
|
|
210
|
+
} else {
|
|
211
|
+
h = 360 + 60 * (g - b) / (_max - _min);
|
|
212
|
+
}
|
|
213
|
+
} else if (_max === g) {
|
|
214
|
+
h = 120 + 60 * (b - r) / (_max - _min);
|
|
215
|
+
} else if (_max === b) {
|
|
216
|
+
h = 240 + 60 * (r - g) / (_max - _min);
|
|
217
|
+
}
|
|
218
|
+
l = (_max + _min) / 2;
|
|
219
|
+
if (_max === _min) {
|
|
220
|
+
s = NaN;
|
|
221
|
+
} else {
|
|
222
|
+
if (l < .5) {
|
|
223
|
+
s = (_max - _min) / (_max + _min);
|
|
224
|
+
} else {
|
|
225
|
+
s = (_max - _min) / (2 - (_max + _min))
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return [h || 0, s || 0, l];
|
|
229
|
+
}
|
|
230
|
+
function t2rgb(t, p, q) {
|
|
231
|
+
if (t < 0) t += 1;
|
|
232
|
+
if (t > 1) t -= 1;
|
|
233
|
+
if (t < 1 / 6) return p + (q - p) * 6 * t;
|
|
234
|
+
if (t < .5) return q;
|
|
235
|
+
if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);
|
|
236
|
+
return p;
|
|
237
|
+
}
|
|
238
|
+
function rgb4hsl(h, s, l, a) {
|
|
239
|
+
var q = l < .5 ? l * (1 + s) : l + s - l * s;
|
|
240
|
+
var p = 2 * l - q;
|
|
241
|
+
h /= 360;
|
|
242
|
+
var r = t2rgb(h + 1 / 3, p, q) * 255;
|
|
243
|
+
var g = t2rgb(h, p, q) * 255;
|
|
244
|
+
var b = t2rgb(h - 1 / 3, p, q) * 255;
|
|
245
|
+
return [r, g, b, a];
|
|
246
|
+
}
|
|
247
|
+
function hsl2rgb([h, s, l]) {
|
|
248
|
+
return rgb4hsl(h, s, l, 1);
|
|
249
|
+
}
|
|
250
|
+
function percent(a, total = 1) {
|
|
251
|
+
if (/%$/.test(a)) {
|
|
252
|
+
a = a.replace(/%$/, '') / 100 * total;
|
|
253
|
+
}
|
|
254
|
+
return +a;
|
|
255
|
+
}
|
|
256
|
+
function prgb(a) {
|
|
257
|
+
return percent(a, 255);
|
|
258
|
+
}
|
|
259
|
+
function pab(a) {
|
|
260
|
+
return percent(a, 125);
|
|
261
|
+
}
|
|
262
|
+
function pc(a) {
|
|
263
|
+
return percent(a, 150);
|
|
264
|
+
}
|
|
265
|
+
function pl(a) {
|
|
266
|
+
return percent(a, 100);
|
|
267
|
+
}
|
|
268
|
+
function pkl(a) {
|
|
269
|
+
return percent(a) * 100;
|
|
270
|
+
}
|
|
271
|
+
function pkc(a) {
|
|
272
|
+
return percent(a) * 150 / 0.4;
|
|
273
|
+
}
|
|
274
|
+
function pkab(a) {
|
|
275
|
+
return percent(a) * 125 / 0.4;
|
|
276
|
+
}
|
|
277
|
+
function ph(hue) {
|
|
278
|
+
if (/deg$/i.test(hue)) {
|
|
279
|
+
return +hue.replace(/deg$/i, '');
|
|
280
|
+
}
|
|
281
|
+
if (/turn$/i.test(hue)) {
|
|
282
|
+
return hue.replace(/turn$/i, '') * 360;
|
|
283
|
+
}
|
|
284
|
+
if (/grad$/i.test(hue)) {
|
|
285
|
+
return hue.replace(/grad$/i, '') * 360 / 400;
|
|
286
|
+
}
|
|
287
|
+
if (/rad$/i.test(hue)) {
|
|
288
|
+
return hue.replace(/rad$/i, '') * 180 / PI;
|
|
289
|
+
}
|
|
290
|
+
return percent(hue, 360);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const hdelta = -60;// lch的零点色相与纯红色相的差值
|
|
294
|
+
const cangle = acos(g_u);// 灰度轴与纯绿轴的夹角
|
|
295
|
+
// const cangle = acos(sqrt(2 / 3));// 灰度轴与纯黄向量的夹角
|
|
296
|
+
// const cratio = acos(sqrt(2 / 3));// lch的纯红色与rgb纯红色的饱合度比值
|
|
297
|
+
function rgb4lch(L, c, h, a) {
|
|
298
|
+
h = (h - hdelta) / 180 * PI;
|
|
299
|
+
L = L / 100 * 255;
|
|
300
|
+
var phi = c / 150 * cangle;
|
|
301
|
+
var s = L * tan(phi);
|
|
302
|
+
var A = cos(h) * s;
|
|
303
|
+
var B = sin(h) * s;
|
|
304
|
+
var [r, g, b] = rotate_phi(B, L, A, -cangle);
|
|
305
|
+
r /= r_u;
|
|
306
|
+
g /= g_u;
|
|
307
|
+
b /= b_u;
|
|
308
|
+
return [r + .5 | 0, g + .5 | 0, b + .5 | 0, a];
|
|
309
|
+
}
|
|
310
|
+
function lch4rgb(r, g, b, a) {
|
|
311
|
+
r *= r_u;
|
|
312
|
+
g *= g_u;
|
|
313
|
+
b *= b_u;
|
|
314
|
+
var [B, L, A] = rotate_phi(r, g, b, cangle);
|
|
315
|
+
var theta = atan2(B, A) / PI * 180 + hdelta;
|
|
316
|
+
if (theta < 0) theta += 360;
|
|
317
|
+
var c = sqrt(B * B + A * A) / (L || 1);
|
|
318
|
+
c = atan(c) / cangle * 150;
|
|
319
|
+
return [
|
|
320
|
+
L / 255 * 100,
|
|
321
|
+
c,
|
|
322
|
+
theta,
|
|
323
|
+
a
|
|
324
|
+
];
|
|
325
|
+
}
|
|
326
|
+
function rgb2lch([r, g, b, a]) {
|
|
327
|
+
return lch4rgb(r, g, b, a);
|
|
328
|
+
}
|
|
329
|
+
function rgb4lab(L, A, B, a) {
|
|
330
|
+
var [L, c, h] = lch4lab(L, A, B, a);
|
|
331
|
+
return rgb4lch(L, c, h);
|
|
332
|
+
}
|
|
333
|
+
function lch4lab(L, A, B, a) {
|
|
334
|
+
var c = sqrt(A * A + B * B) / 125 * 150;
|
|
335
|
+
var h = atan2(B, A) * 180 / PI;
|
|
336
|
+
return [L, c, h, a];
|
|
337
|
+
}
|
|
338
|
+
function lab4lch(L, c, h, a) {
|
|
339
|
+
c = c / 150 * 125;
|
|
340
|
+
h = h * PI / 180;
|
|
341
|
+
var A = c * cos(h);
|
|
342
|
+
var B = c * sin(h);
|
|
343
|
+
return [L, A, B, a];
|
|
344
|
+
}
|
|
345
|
+
function lab4rgb(r, g, b, a) {
|
|
346
|
+
var [l, c, h] = lch4rgb(r, g, b);
|
|
347
|
+
return lab4lch(l, c, h, a);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function hwb4hsv(h, s, v, a) {
|
|
351
|
+
var w = (1 - s) * v;
|
|
352
|
+
var b = 1 - v;
|
|
353
|
+
return [h, w, b, a];
|
|
354
|
+
}
|
|
355
|
+
function hsv4hwb(h, w, b, a) {
|
|
356
|
+
if (w + b > 1) {
|
|
357
|
+
var s = w + b;
|
|
358
|
+
w /= s;
|
|
359
|
+
b /= s;
|
|
360
|
+
}
|
|
361
|
+
var s = 1 - w / (1 - b);
|
|
362
|
+
var v = 1 - b;
|
|
363
|
+
return [h, s, v, a];
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function hwb4rgb(r, g, b, a) {
|
|
367
|
+
var h = rgb2h(r, g, b);
|
|
368
|
+
var w = min(r, g, b);
|
|
369
|
+
var b = 255 - max(r, g, b);
|
|
370
|
+
return [h, w / 255, b / 255, a];
|
|
371
|
+
}
|
|
372
|
+
function rgb4hwb(h, w, b, a) {
|
|
373
|
+
if (w + b > 1) {
|
|
374
|
+
var s = w + b;
|
|
375
|
+
w /= s;
|
|
376
|
+
b /= s;
|
|
377
|
+
}
|
|
378
|
+
w *= 255;
|
|
379
|
+
b *= 255;
|
|
380
|
+
var [r, g, b] = rgb4h(w, 255 - b, w, h);
|
|
381
|
+
return [r, g, b, a];
|
|
382
|
+
}
|
|
383
|
+
function parse4(namespace, b, c, d, a) {
|
|
384
|
+
a = a ? percent(a) : 1;
|
|
385
|
+
switch (namespace.toLowerCase()) {
|
|
386
|
+
case "rgb": return [prgb(b), prgb(c), prgb(d), a];
|
|
387
|
+
case "hsl": return rgb4hsl(ph(b), percent(c), percent(d), a);
|
|
388
|
+
case "hwb": return rgb4hwb(ph(b), percent(c), percent(d), a);
|
|
389
|
+
case "lab": return rgb4lab(pl(b), pab(c), pab(d), a);
|
|
390
|
+
case "lch": return rgb4lch(pl(b), pc(c), ph(d), a);
|
|
391
|
+
case "oklch": return rgb4lch(pkl(b), pkc(c), ph(d), a);
|
|
392
|
+
case "oklab": return rgb4lab(pkl(b), pkab(c), pkab(d), a);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function parse(color) {
|
|
396
|
+
var m = null;
|
|
397
|
+
if (m = rgbHex.exec(color)) {
|
|
398
|
+
var [_, R, G, B, A] = m.map(a => parseInt(a + a, 16));
|
|
399
|
+
return [R, G, B, A >= 0 ? A / 0xff : 1];
|
|
400
|
+
}
|
|
401
|
+
else if (m = rgbHex2.exec(color)) {
|
|
402
|
+
var [_, R, G, B, A] = m.map(a => parseInt(a, 16));
|
|
403
|
+
return [R, G, B, A >= 0 ? A / 0xff : 1];
|
|
404
|
+
}
|
|
405
|
+
else if (m = rgbReg.exec(color)) {
|
|
406
|
+
var [_, R, G, B, a] = m;
|
|
407
|
+
return [R > 255 ? 255 : +R, G > 255 ? 255 : +G, B > 255 ? 255 : +B, a ? percent(a) : 1];
|
|
408
|
+
}
|
|
409
|
+
else if (m = hslReg.exec(color)) {
|
|
410
|
+
var [_, H, S, L, a] = m;
|
|
411
|
+
S = percent(S);
|
|
412
|
+
L = percent(L);
|
|
413
|
+
a = a ? percent(a) : 1;
|
|
414
|
+
[R, G, B] = rgb4hsl(ph(H), S, L, a);
|
|
415
|
+
return [R, G, B, a];
|
|
416
|
+
}
|
|
417
|
+
else if (m = lablch.exec(color)) {
|
|
418
|
+
var [_, f, b, c, d, a] = m;
|
|
419
|
+
return parse4(f, b, c, d, a);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
var maybe16 = function (n) {
|
|
423
|
+
return (n >> 4) === (n & 0xf);
|
|
424
|
+
}
|
|
425
|
+
function stringify(color) {
|
|
426
|
+
var [R, G, B, a] = color;
|
|
427
|
+
if (a >= 0 && a < 1) {
|
|
428
|
+
R = R.toFixed();
|
|
429
|
+
G = G.toFixed();
|
|
430
|
+
B = B.toFixed();
|
|
431
|
+
a = +a.toFixed(3);
|
|
432
|
+
return `rgba(${R},${G},${B},${a})`;
|
|
433
|
+
}
|
|
434
|
+
if (maybe16(R) && maybe16(G) && maybe16(B)) {
|
|
435
|
+
return "#" + [R, G, B].map(hex16).join("");
|
|
436
|
+
}
|
|
437
|
+
return "#" + [R, G, B].map(hex256).join("");
|
|
438
|
+
}
|
|
439
|
+
function doWith(manager, color, ...args) {
|
|
440
|
+
var isparsed = color instanceof Array,
|
|
441
|
+
c = isparsed ? color : parse(color);
|
|
442
|
+
if (!c) {
|
|
443
|
+
console.warn(i18n`颜色数据不正确:${color}`);
|
|
444
|
+
return color;
|
|
445
|
+
}
|
|
446
|
+
c = manager(c, ...args);
|
|
447
|
+
if (!isparsed) c = stringify(c);
|
|
448
|
+
return c;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function normal([r, g, b]) {
|
|
452
|
+
return [g - b, b - r, r - g];
|
|
453
|
+
}
|
|
454
|
+
function norm([r, g, b]) {
|
|
455
|
+
return sqrt(r * r + g * g + b * b);
|
|
456
|
+
}
|
|
457
|
+
function unit(c, u) {
|
|
458
|
+
if (!u) var u = 1 / norm(c);
|
|
459
|
+
if (!u) {
|
|
460
|
+
u = Math.sqrt(3) / 3;
|
|
461
|
+
return [u, u, u];
|
|
462
|
+
}
|
|
463
|
+
var [r, g, b] = c;
|
|
464
|
+
return [r * u, g * u, b * u];
|
|
465
|
+
}
|
|
466
|
+
function angle(c1, c2) {
|
|
467
|
+
c1 = parse(c1);
|
|
468
|
+
c2 = parse(c2);
|
|
469
|
+
c1 = normal(c1);
|
|
470
|
+
c2 = normal(c2);
|
|
471
|
+
var theta = rgb2h(c2[0], c2[1], c2[2]) - rgb2h(c1[0], c1[1], c1[2]);
|
|
472
|
+
if (theta < 0) theta += 360;
|
|
473
|
+
return theta;
|
|
474
|
+
}
|
|
475
|
+
function equal(c1, c2) {
|
|
476
|
+
if (!isColor(c1) || !isColor(c2)) return false;
|
|
477
|
+
var [r1, g1, b1, a1] = parse(c1);
|
|
478
|
+
var [r2, g2, b2, a2] = parse(c2);
|
|
479
|
+
return abs(r1 - r2) < 1 && abs(g1 - g2) < 1 && abs(b1 - b2) < 1 && abs(a1 - a2) < .01;
|
|
480
|
+
}
|
|
481
|
+
var hslReg = /^hsla?\s*\(\s*([\d\.]+(?:deg|turn|g?rad)?)\s*[,\s]\s*([\d\.]+%?)\s*[,\s]\s*([\d\.]+%?)(?:[,\/\s]\s*([\d\.]+%?))?\)$/i;
|
|
482
|
+
var rgbReg = /^rgba?\s*\(\s*([\d\.]+)\s*[,\s]\s*([\d\.]+)\s*[,\s]\s*([\d\.]+)(?:[,\s]\s*([\d\.]+))?\)$/i;
|
|
483
|
+
var rgbHex = /^#([\da-f])([\da-f])([\da-f])([\da-f])?$/i;
|
|
484
|
+
var rgbHex2 = /^#([\da-f]{2})([\da-f]{2})([\da-f]{2})([\da-f]{2})?$/i;
|
|
485
|
+
var rotated_base_color = "#d16969";
|
|
486
|
+
var colorReg = /(?:(?:rgb|hsl)a?|hwb|(?:ok)?(?:lab|lch))\s*\([\-\,\.\w\s%]+\)|#[\da-f]{3,8}/ig;
|
|
487
|
+
var num = /(\-?(?:\d+(?:\.\d*)?|\.\d+)(?:%|deg|turn|g?rad)?)/;
|
|
488
|
+
var lablch = new RegExp(`${/^((?:ok)?(?:lab|lch)|hwb|rgb|hsl)\s*\(/.source}${num.source}\\s+${num.source}\\s+${num.source}\\s*(?:/\\s*${num.source})?\\)`, 'i');
|
|
489
|
+
function isColor(text) {
|
|
490
|
+
return rgbReg.test(text)
|
|
491
|
+
|| rgbHex.test(text)
|
|
492
|
+
|| rgbHex2.test(text)
|
|
493
|
+
|| hslReg.test(text)
|
|
494
|
+
|| lablch.test(text);
|
|
495
|
+
}
|
|
496
|
+
function format(color) {
|
|
497
|
+
var c = parse(color);
|
|
498
|
+
if (!c) return color;
|
|
499
|
+
return stringify(c);
|
|
500
|
+
}
|
|
501
|
+
var replacer = function (match) {
|
|
502
|
+
if (!isColor(match)) return match;
|
|
503
|
+
if (colorDesigner.rotate !== 0) {
|
|
504
|
+
match = color.rotate(match, colorDesigner.rotate);
|
|
505
|
+
}
|
|
506
|
+
if (colorDesigner.contrast !== 1) {
|
|
507
|
+
match = color.contrast(match, colorDesigner.contrast);
|
|
508
|
+
}
|
|
509
|
+
return format(match);
|
|
510
|
+
};
|
|
511
|
+
var colorDesigner = {
|
|
512
|
+
rotate: 0,
|
|
513
|
+
contrast: 1
|
|
514
|
+
};
|
|
515
|
+
var rgb2v = function (r, g, b) {
|
|
516
|
+
r *= r_v;
|
|
517
|
+
g *= g_v;
|
|
518
|
+
b *= b_v;
|
|
519
|
+
return r + g + b;
|
|
520
|
+
};
|
|
521
|
+
var v2rgb = function (v, r, g, b) {
|
|
522
|
+
var t = r + g + b || 1;
|
|
523
|
+
v = v / t;
|
|
524
|
+
r *= v;
|
|
525
|
+
g *= v;
|
|
526
|
+
b *= v;
|
|
527
|
+
return [r, g, b];
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
var gray4 = function (RGBA, A) {
|
|
531
|
+
var [r, g, b, a] = RGBA;
|
|
532
|
+
var v = rgb2v(r, g, b);
|
|
533
|
+
var s = rgb2s(r, g, b);
|
|
534
|
+
var p = .587 * 255;
|
|
535
|
+
if (v < .114 * 255) {
|
|
536
|
+
v = v - .3 * p + 255;
|
|
537
|
+
s = .2;
|
|
538
|
+
}
|
|
539
|
+
else if (v > .6 * 255) {
|
|
540
|
+
v = v - p * s - p;
|
|
541
|
+
s = 1;
|
|
542
|
+
if (v < 0) v = - v;
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
v = 255;
|
|
546
|
+
}
|
|
547
|
+
if (s > .8) {
|
|
548
|
+
r = 255 + r >> 1, g = 255 + g >> 1, b = 255 + b >> 1;
|
|
549
|
+
s = .3;
|
|
550
|
+
}
|
|
551
|
+
[r, g, b] = rgb4s(r, g, b, s);
|
|
552
|
+
[r, g, b] = rgb4v(r, g, b, v);
|
|
553
|
+
return [r, g, b, A || a];
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
var saturate_rgb = function (RGBA, delta) {
|
|
557
|
+
var [r, g, b, a] = RGBA;
|
|
558
|
+
var h = rgb2h(r, g, b);
|
|
559
|
+
delta = percent(delta);
|
|
560
|
+
h += delta * 100;
|
|
561
|
+
[r, g, b] = rgb4h(r, g, b, h);
|
|
562
|
+
return [r, g, b, a];
|
|
563
|
+
};
|
|
564
|
+
|
|
565
|
+
var desaturate_rgb = function (RGBA, delta) {
|
|
566
|
+
delta = percent(delta);
|
|
567
|
+
return saturate_rgb(RGBA, -delta);
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
var lighten_rgb = function (RGBA, delta) {
|
|
571
|
+
var [r, g, b, a] = RGBA;
|
|
572
|
+
delta = percent(delta)
|
|
573
|
+
var l = rgb2v(r, g, b);
|
|
574
|
+
l += delta * 100;
|
|
575
|
+
[r, g, b] = rgb4v(r, g, b, l);
|
|
576
|
+
return [r, g, b, a];
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
var darken_rgb = function (RGBA, delta) {
|
|
580
|
+
delta = percent(delta);
|
|
581
|
+
return lighten_rgb(RGBA, -delta);
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
var fadein_rgb = function (RGBA, delta) {
|
|
585
|
+
delta = percent(delta);
|
|
586
|
+
var [r, g, b, a] = RGBA;
|
|
587
|
+
a += delta;
|
|
588
|
+
return [r, g, b, a];
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
var fadeout_rgb = function (RGBA, delta) {
|
|
592
|
+
delta = percent(delta);
|
|
593
|
+
return fadein_rgb(RGBA, -delta);
|
|
594
|
+
};
|
|
595
|
+
|
|
596
|
+
var fade_rgb = function (RGBA, alpha) {
|
|
597
|
+
var [r, g, b] = RGBA;
|
|
598
|
+
return [r, g, b, alpha];
|
|
599
|
+
};
|
|
600
|
+
|
|
601
|
+
var spin_rgb = function (RGBA, delta) {
|
|
602
|
+
var [r, g, b, a] = RGBA;
|
|
603
|
+
var s = rgb2s(r, g, b);
|
|
604
|
+
s += delta;
|
|
605
|
+
var [r, g, b] = rgb4s(r, g, b, s);
|
|
606
|
+
return [r, g, b, s];
|
|
607
|
+
};
|
|
608
|
+
|
|
609
|
+
var grayscale_rgb = function (RGBA) {
|
|
610
|
+
var [r, g, b, a] = RGBA;
|
|
611
|
+
[r, g, b] = rgb4s(r, g, b, 0);
|
|
612
|
+
return [r, g, b, a];
|
|
613
|
+
};
|
|
614
|
+
var grayluma_rgb = function (RGBA) {
|
|
615
|
+
var [r, g, b, a] = RGBA;
|
|
616
|
+
var v = rgb2v(r, g, b);
|
|
617
|
+
return [v, v, v, a];
|
|
618
|
+
};
|
|
619
|
+
var mix_rgb = function (RGBA, c2, power) {
|
|
620
|
+
var c1 = rgb2hsl(RGBA);
|
|
621
|
+
c1.push(RGBA[3]);
|
|
622
|
+
var rgba2 = parse(c2);
|
|
623
|
+
var c2 = rgb2hsl(rgba2);
|
|
624
|
+
c2.push(rgba2[3]);
|
|
625
|
+
return [0, 1, 2, 3].map(a => c1[a] * (1 - power) + c2[a] * power);
|
|
626
|
+
};
|
|
627
|
+
var tint_rgb = function (RGBA, power) {
|
|
628
|
+
return mix_rgb([255, 255, 255, RGBA[3]], RGBA, power);
|
|
629
|
+
};
|
|
630
|
+
var shade_rgb = function (RGBA, power) {
|
|
631
|
+
return mix_rgb([0, 0, 0, RGBA[3]], RGBA, power);
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
var wrap = function (f) {
|
|
635
|
+
return function () {
|
|
636
|
+
return doWith(f, ...arguments);
|
|
637
|
+
}
|
|
638
|
+
};
|
|
639
|
+
var random_base = Math.PI * Math.random() * 2;
|
|
640
|
+
extend(color, {
|
|
641
|
+
setTransformer(transformer) {
|
|
642
|
+
extend(colorDesigner, transformer);
|
|
643
|
+
},
|
|
644
|
+
rotate(color, theta) {
|
|
645
|
+
return doWith(rotate_rgb, color, theta);
|
|
646
|
+
},
|
|
647
|
+
contrast(color, ratio) {
|
|
648
|
+
return doWith(contrast_rgb, color, ratio);
|
|
649
|
+
},
|
|
650
|
+
saturate: wrap(saturate_rgb),
|
|
651
|
+
desaturate: wrap(desaturate_rgb),
|
|
652
|
+
lighten: wrap(lighten_rgb),
|
|
653
|
+
darken: wrap(darken_rgb),
|
|
654
|
+
fadein: wrap(mix_rgb),
|
|
655
|
+
fadeout: wrap(fadeout_rgb),
|
|
656
|
+
fade: wrap(fade_rgb),
|
|
657
|
+
spin: wrap(spin_rgb),
|
|
658
|
+
mix: wrap(mix_rgb),
|
|
659
|
+
tint: wrap(tint_rgb),
|
|
660
|
+
shade: wrap(shade_rgb),
|
|
661
|
+
grayscale: wrap(grayscale_rgb),
|
|
662
|
+
grayluma: wrap(grayluma_rgb),
|
|
663
|
+
rgb2h,
|
|
664
|
+
rgb4h,
|
|
665
|
+
rgb2v,
|
|
666
|
+
rgb4v,
|
|
667
|
+
rgb2s,
|
|
668
|
+
rgb4s,
|
|
669
|
+
rgb2hsl,
|
|
670
|
+
rgb4lch,
|
|
671
|
+
lch4rgb,
|
|
672
|
+
rgb4lab,
|
|
673
|
+
lab4rgb,
|
|
674
|
+
lab4lch,
|
|
675
|
+
lch4lab,
|
|
676
|
+
hsl2rgb,
|
|
677
|
+
rgb4hwb,
|
|
678
|
+
hwb4rgb,
|
|
679
|
+
angle,
|
|
680
|
+
parse,
|
|
681
|
+
parse4,
|
|
682
|
+
equal,
|
|
683
|
+
format,
|
|
684
|
+
stringify,
|
|
685
|
+
pair(c, alpha) {
|
|
686
|
+
return doWith(gray4, c, alpha);
|
|
687
|
+
},
|
|
688
|
+
isColor,
|
|
689
|
+
transform(text) {
|
|
690
|
+
return text.replace(colorReg, replacer);
|
|
691
|
+
},
|
|
692
|
+
random(base = rotated_base_color) {
|
|
693
|
+
random_base += (random() * .4 + .4) * PI;
|
|
694
|
+
if (random_base > 2 * PI) random_base -= 2 * PI;
|
|
695
|
+
return doWith(rotate_rgb, base, random_base);
|
|
696
|
+
}
|
|
697
697
|
});
|