1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | Object.defineProperty(exports, "__esModule", { value: true });
|
7 | exports.interpolateColors = void 0;
|
8 |
|
9 | const interpolate_1 = require("./interpolate");
|
10 |
|
11 | const NUMBER = '[-+]?\\d*\\.?\\d+';
|
12 | const PERCENTAGE = NUMBER + '%';
|
13 | function call(...args) {
|
14 | return '\\(\\s*(' + args.join(')\\s*,\\s*(') + ')\\s*\\)';
|
15 | }
|
16 | function getMatchers() {
|
17 | const cachedMatchers = {
|
18 | rgb: undefined,
|
19 | rgba: undefined,
|
20 | hsl: undefined,
|
21 | hsla: undefined,
|
22 | hex3: undefined,
|
23 | hex4: undefined,
|
24 | hex5: undefined,
|
25 | hex6: undefined,
|
26 | hex8: undefined,
|
27 | };
|
28 | if (cachedMatchers.rgb === undefined) {
|
29 | cachedMatchers.rgb = new RegExp('rgb' + call(NUMBER, NUMBER, NUMBER));
|
30 | cachedMatchers.rgba = new RegExp('rgba' + call(NUMBER, NUMBER, NUMBER, NUMBER));
|
31 | cachedMatchers.hsl = new RegExp('hsl' + call(NUMBER, PERCENTAGE, PERCENTAGE));
|
32 | cachedMatchers.hsla = new RegExp('hsla' + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER));
|
33 | cachedMatchers.hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;
|
34 | cachedMatchers.hex4 =
|
35 | /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;
|
36 | cachedMatchers.hex6 = /^#([0-9a-fA-F]{6})$/;
|
37 | cachedMatchers.hex8 = /^#([0-9a-fA-F]{8})$/;
|
38 | }
|
39 | return cachedMatchers;
|
40 | }
|
41 | function hue2rgb(p, q, t) {
|
42 | if (t < 0) {
|
43 | t += 1;
|
44 | }
|
45 | if (t > 1) {
|
46 | t -= 1;
|
47 | }
|
48 | if (t < 1 / 6) {
|
49 | return p + (q - p) * 6 * t;
|
50 | }
|
51 | if (t < 1 / 2) {
|
52 | return q;
|
53 | }
|
54 | if (t < 2 / 3) {
|
55 | return p + (q - p) * (2 / 3 - t) * 6;
|
56 | }
|
57 | return p;
|
58 | }
|
59 | function hslToRgb(h, s, l) {
|
60 | const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
61 | const p = 2 * l - q;
|
62 | const r = hue2rgb(p, q, h + 1 / 3);
|
63 | const g = hue2rgb(p, q, h);
|
64 | const b = hue2rgb(p, q, h - 1 / 3);
|
65 | return ((Math.round(r * 255) << 24) |
|
66 | (Math.round(g * 255) << 16) |
|
67 | (Math.round(b * 255) << 8));
|
68 | }
|
69 | function parse255(str) {
|
70 | const int = Number.parseInt(str, 10);
|
71 | if (int < 0) {
|
72 | return 0;
|
73 | }
|
74 | if (int > 255) {
|
75 | return 255;
|
76 | }
|
77 | return int;
|
78 | }
|
79 | function parse360(str) {
|
80 | const int = Number.parseFloat(str);
|
81 | return (((int % 360) + 360) % 360) / 360;
|
82 | }
|
83 | function parse1(str) {
|
84 | const num = Number.parseFloat(str);
|
85 | if (num < 0) {
|
86 | return 0;
|
87 | }
|
88 | if (num > 1) {
|
89 | return 255;
|
90 | }
|
91 | return Math.round(num * 255);
|
92 | }
|
93 | function parsePercentage(str) {
|
94 |
|
95 | const int = Number.parseFloat(str);
|
96 | if (int < 0) {
|
97 | return 0;
|
98 | }
|
99 | if (int > 100) {
|
100 | return 1;
|
101 | }
|
102 | return int / 100;
|
103 | }
|
104 | const names = {
|
105 | transparent: 0x00000000,
|
106 |
|
107 | aliceblue: 0xf0f8ffff,
|
108 | antiquewhite: 0xfaebd7ff,
|
109 | aqua: 0x00ffffff,
|
110 | aquamarine: 0x7fffd4ff,
|
111 | azure: 0xf0ffffff,
|
112 | beige: 0xf5f5dcff,
|
113 | bisque: 0xffe4c4ff,
|
114 | black: 0x000000ff,
|
115 | blanchedalmond: 0xffebcdff,
|
116 | blue: 0x0000ffff,
|
117 | blueviolet: 0x8a2be2ff,
|
118 | brown: 0xa52a2aff,
|
119 | burlywood: 0xdeb887ff,
|
120 | burntsienna: 0xea7e5dff,
|
121 | cadetblue: 0x5f9ea0ff,
|
122 | chartreuse: 0x7fff00ff,
|
123 | chocolate: 0xd2691eff,
|
124 | coral: 0xff7f50ff,
|
125 | cornflowerblue: 0x6495edff,
|
126 | cornsilk: 0xfff8dcff,
|
127 | crimson: 0xdc143cff,
|
128 | cyan: 0x00ffffff,
|
129 | darkblue: 0x00008bff,
|
130 | darkcyan: 0x008b8bff,
|
131 | darkgoldenrod: 0xb8860bff,
|
132 | darkgray: 0xa9a9a9ff,
|
133 | darkgreen: 0x006400ff,
|
134 | darkgrey: 0xa9a9a9ff,
|
135 | darkkhaki: 0xbdb76bff,
|
136 | darkmagenta: 0x8b008bff,
|
137 | darkolivegreen: 0x556b2fff,
|
138 | darkorange: 0xff8c00ff,
|
139 | darkorchid: 0x9932ccff,
|
140 | darkred: 0x8b0000ff,
|
141 | darksalmon: 0xe9967aff,
|
142 | darkseagreen: 0x8fbc8fff,
|
143 | darkslateblue: 0x483d8bff,
|
144 | darkslategray: 0x2f4f4fff,
|
145 | darkslategrey: 0x2f4f4fff,
|
146 | darkturquoise: 0x00ced1ff,
|
147 | darkviolet: 0x9400d3ff,
|
148 | deeppink: 0xff1493ff,
|
149 | deepskyblue: 0x00bfffff,
|
150 | dimgray: 0x696969ff,
|
151 | dimgrey: 0x696969ff,
|
152 | dodgerblue: 0x1e90ffff,
|
153 | firebrick: 0xb22222ff,
|
154 | floralwhite: 0xfffaf0ff,
|
155 | forestgreen: 0x228b22ff,
|
156 | fuchsia: 0xff00ffff,
|
157 | gainsboro: 0xdcdcdcff,
|
158 | ghostwhite: 0xf8f8ffff,
|
159 | gold: 0xffd700ff,
|
160 | goldenrod: 0xdaa520ff,
|
161 | gray: 0x808080ff,
|
162 | green: 0x008000ff,
|
163 | greenyellow: 0xadff2fff,
|
164 | grey: 0x808080ff,
|
165 | honeydew: 0xf0fff0ff,
|
166 | hotpink: 0xff69b4ff,
|
167 | indianred: 0xcd5c5cff,
|
168 | indigo: 0x4b0082ff,
|
169 | ivory: 0xfffff0ff,
|
170 | khaki: 0xf0e68cff,
|
171 | lavender: 0xe6e6faff,
|
172 | lavenderblush: 0xfff0f5ff,
|
173 | lawngreen: 0x7cfc00ff,
|
174 | lemonchiffon: 0xfffacdff,
|
175 | lightblue: 0xadd8e6ff,
|
176 | lightcoral: 0xf08080ff,
|
177 | lightcyan: 0xe0ffffff,
|
178 | lightgoldenrodyellow: 0xfafad2ff,
|
179 | lightgray: 0xd3d3d3ff,
|
180 | lightgreen: 0x90ee90ff,
|
181 | lightgrey: 0xd3d3d3ff,
|
182 | lightpink: 0xffb6c1ff,
|
183 | lightsalmon: 0xffa07aff,
|
184 | lightseagreen: 0x20b2aaff,
|
185 | lightskyblue: 0x87cefaff,
|
186 | lightslategray: 0x778899ff,
|
187 | lightslategrey: 0x778899ff,
|
188 | lightsteelblue: 0xb0c4deff,
|
189 | lightyellow: 0xffffe0ff,
|
190 | lime: 0x00ff00ff,
|
191 | limegreen: 0x32cd32ff,
|
192 | linen: 0xfaf0e6ff,
|
193 | magenta: 0xff00ffff,
|
194 | maroon: 0x800000ff,
|
195 | mediumaquamarine: 0x66cdaaff,
|
196 | mediumblue: 0x0000cdff,
|
197 | mediumorchid: 0xba55d3ff,
|
198 | mediumpurple: 0x9370dbff,
|
199 | mediumseagreen: 0x3cb371ff,
|
200 | mediumslateblue: 0x7b68eeff,
|
201 | mediumspringgreen: 0x00fa9aff,
|
202 | mediumturquoise: 0x48d1ccff,
|
203 | mediumvioletred: 0xc71585ff,
|
204 | midnightblue: 0x191970ff,
|
205 | mintcream: 0xf5fffaff,
|
206 | mistyrose: 0xffe4e1ff,
|
207 | moccasin: 0xffe4b5ff,
|
208 | navajowhite: 0xffdeadff,
|
209 | navy: 0x000080ff,
|
210 | oldlace: 0xfdf5e6ff,
|
211 | olive: 0x808000ff,
|
212 | olivedrab: 0x6b8e23ff,
|
213 | orange: 0xffa500ff,
|
214 | orangered: 0xff4500ff,
|
215 | orchid: 0xda70d6ff,
|
216 | palegoldenrod: 0xeee8aaff,
|
217 | palegreen: 0x98fb98ff,
|
218 | paleturquoise: 0xafeeeeff,
|
219 | palevioletred: 0xdb7093ff,
|
220 | papayawhip: 0xffefd5ff,
|
221 | peachpuff: 0xffdab9ff,
|
222 | peru: 0xcd853fff,
|
223 | pink: 0xffc0cbff,
|
224 | plum: 0xdda0ddff,
|
225 | powderblue: 0xb0e0e6ff,
|
226 | purple: 0x800080ff,
|
227 | rebeccapurple: 0x663399ff,
|
228 | red: 0xff0000ff,
|
229 | rosybrown: 0xbc8f8fff,
|
230 | royalblue: 0x4169e1ff,
|
231 | saddlebrown: 0x8b4513ff,
|
232 | salmon: 0xfa8072ff,
|
233 | sandybrown: 0xf4a460ff,
|
234 | seagreen: 0x2e8b57ff,
|
235 | seashell: 0xfff5eeff,
|
236 | sienna: 0xa0522dff,
|
237 | silver: 0xc0c0c0ff,
|
238 | skyblue: 0x87ceebff,
|
239 | slateblue: 0x6a5acdff,
|
240 | slategray: 0x708090ff,
|
241 | slategrey: 0x708090ff,
|
242 | snow: 0xfffafaff,
|
243 | springgreen: 0x00ff7fff,
|
244 | steelblue: 0x4682b4ff,
|
245 | tan: 0xd2b48cff,
|
246 | teal: 0x008080ff,
|
247 | thistle: 0xd8bfd8ff,
|
248 | tomato: 0xff6347ff,
|
249 | turquoise: 0x40e0d0ff,
|
250 | violet: 0xee82eeff,
|
251 | wheat: 0xf5deb3ff,
|
252 | white: 0xffffffff,
|
253 | whitesmoke: 0xf5f5f5ff,
|
254 | yellow: 0xffff00ff,
|
255 | yellowgreen: 0x9acd32ff,
|
256 | };
|
257 | function normalizeColor(color) {
|
258 | const matchers = getMatchers();
|
259 | let match;
|
260 |
|
261 | if (matchers.hex6) {
|
262 | if ((match = matchers.hex6.exec(color))) {
|
263 | return Number.parseInt(match[1] + 'ff', 16) >>> 0;
|
264 | }
|
265 | }
|
266 | if (names[color] !== undefined) {
|
267 | return names[color];
|
268 | }
|
269 | if (matchers.rgb) {
|
270 | if ((match = matchers.rgb.exec(color))) {
|
271 | return (
|
272 |
|
273 | ((parse255(match[1]) << 24) |
|
274 | (parse255(match[2]) << 16) |
|
275 | (parse255(match[3]) << 8) |
|
276 | 0x000000ff) >>>
|
277 | 0);
|
278 | }
|
279 | }
|
280 | if (matchers.rgba) {
|
281 | if ((match = matchers.rgba.exec(color))) {
|
282 | return (
|
283 |
|
284 | ((parse255(match[1]) << 24) |
|
285 | (parse255(match[2]) << 16) |
|
286 | (parse255(match[3]) << 8) |
|
287 | parse1(match[4])) >>>
|
288 | 0);
|
289 | }
|
290 | }
|
291 | if (matchers.hex3) {
|
292 | if ((match = matchers.hex3.exec(color))) {
|
293 | return (Number.parseInt(match[1] +
|
294 | match[1] +
|
295 | match[2] +
|
296 | match[2] +
|
297 | match[3] +
|
298 | match[3] +
|
299 | 'ff',
|
300 | 16) >>> 0);
|
301 | }
|
302 | }
|
303 |
|
304 | if (matchers.hex8) {
|
305 | if ((match = matchers.hex8.exec(color))) {
|
306 | return Number.parseInt(match[1], 16) >>> 0;
|
307 | }
|
308 | }
|
309 | if (matchers.hex4) {
|
310 | if ((match = matchers.hex4.exec(color))) {
|
311 | return (Number.parseInt(match[1] +
|
312 | match[1] +
|
313 | match[2] +
|
314 | match[2] +
|
315 | match[3] +
|
316 | match[3] +
|
317 | match[4] +
|
318 | match[4],
|
319 | 16) >>> 0);
|
320 | }
|
321 | }
|
322 | if (matchers.hsl) {
|
323 | if ((match = matchers.hsl.exec(color))) {
|
324 | return ((hslToRgb(parse360(match[1]),
|
325 | parsePercentage(match[2]),
|
326 | parsePercentage(match[3])
|
327 | ) |
|
328 | 0x000000ff) >>>
|
329 | 0);
|
330 | }
|
331 | }
|
332 | if (matchers.hsla) {
|
333 | if ((match = matchers.hsla.exec(color))) {
|
334 | return ((hslToRgb(parse360(match[1]),
|
335 | parsePercentage(match[2]),
|
336 | parsePercentage(match[3])
|
337 | ) |
|
338 | parse1(match[4])) >>>
|
339 | 0);
|
340 | }
|
341 | }
|
342 | throw new Error(`invalid color string ${color} provided`);
|
343 | }
|
344 | const opacity = (c) => {
|
345 | return ((c >> 24) & 255) / 255;
|
346 | };
|
347 | const red = (c) => {
|
348 | return (c >> 16) & 255;
|
349 | };
|
350 | const green = (c) => {
|
351 | return (c >> 8) & 255;
|
352 | };
|
353 | const blue = (c) => {
|
354 | return c & 255;
|
355 | };
|
356 | const rgbaColor = (r, g, b, alpha) => {
|
357 | return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
358 | };
|
359 | function processColorInitially(color) {
|
360 | let normalizedColor = normalizeColor(color);
|
361 | normalizedColor = ((normalizedColor << 24) | (normalizedColor >>> 8)) >>> 0;
|
362 | return normalizedColor;
|
363 | }
|
364 | function processColor(color) {
|
365 | const normalizedColor = processColorInitially(color);
|
366 | return normalizedColor;
|
367 | }
|
368 | const interpolateColorsRGB = (value, inputRange, colors) => {
|
369 | const [r, g, b, a] = [red, green, blue, opacity].map((f) => {
|
370 | const unrounded = (0, interpolate_1.interpolate)(value, inputRange, colors.map((c) => f(c)), {
|
371 | extrapolateLeft: 'clamp',
|
372 | extrapolateRight: 'clamp',
|
373 | });
|
374 | if (f === opacity) {
|
375 | return Number(unrounded.toFixed(3));
|
376 | }
|
377 | return Math.round(unrounded);
|
378 | });
|
379 | return rgbaColor(r, g, b, a);
|
380 | };
|
381 | const interpolateColors = (input, inputRange, outputRange) => {
|
382 | if (typeof input === 'undefined') {
|
383 | throw new TypeError('input can not be undefined');
|
384 | }
|
385 | if (typeof inputRange === 'undefined') {
|
386 | throw new TypeError('inputRange can not be undefined');
|
387 | }
|
388 | if (typeof outputRange === 'undefined') {
|
389 | throw new TypeError('outputRange can not be undefined');
|
390 | }
|
391 | if (inputRange.length !== outputRange.length) {
|
392 | throw new TypeError('inputRange (' +
|
393 | inputRange.length +
|
394 | ' values provided) and outputRange (' +
|
395 | outputRange.length +
|
396 | ' values provided) must have the same length');
|
397 | }
|
398 | const processedOutputRange = outputRange.map((c) => processColor(c));
|
399 | return interpolateColorsRGB(input, inputRange, processedOutputRange);
|
400 | };
|
401 | exports.interpolateColors = interpolateColors;
|