@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
package/css/parse-css.js CHANGED
@@ -12,174 +12,108 @@ import { INV8BIT } from "../api/constants.js";
12
12
  import { CSS_NAMES } from "../api/names.js";
13
13
  import { CSS_SYSTEM_COLORS } from "../api/system.js";
14
14
  import { intArgb32Srgb } from "../int/int-srgb.js";
15
- /**
16
- * Attempts to parse given CSS color into an interim {@link ParsedColor} type
17
- * with {@link srgb}, {@link hsl}, {@link labD50} or {@link lch} color modes.
18
- * Throws an error if any of the validations during parsing failed.
19
- *
20
- * @remarks
21
- * The following syntax versions are supported:
22
- *
23
- * - CSS named colors
24
- * - CSS system colors @see {@link CSS_SYSTEM_COLORS}
25
- * - hex3/4/6/8
26
- * - `rgb(r% g% b% / a%?)`
27
- * - `rgb(r g b / a?)`
28
- * - `rgb(r,g,b)`
29
- * - `rgba(r,g,b,a)`
30
- * - `hsl(h s% l% / a%?)`
31
- * - `hsl(h,s%,l%)`
32
- * - `hsla(h,s%,l%,a)`
33
- * - `lab(l a b / alpha?)`
34
- * - `lab(l% a% b% / alpha?)`
35
- * - `lch(l c h / alpha?)`
36
- * - `lch(l% c% h / alpha?)`
37
- * - `oklab(l a b / alpha?)`
38
- * - `oklab(l% a% b% / alpha?)`
39
- * - `oklch(l c h / alpha?)`
40
- * - `oklch(l% c% h / alpha?)`
41
- *
42
- * Hue values can be given according to CSS Color L4 spec (raw, deg, rad, grad,
43
- * turn): https://www.w3.org/TR/css-color-4/#typedef-hue
44
- *
45
- * For (ok)lab/(ok)lch color channel values given as percentages, the scale
46
- * ranges defined in the spec are used:
47
- * https://www.w3.org/TR/css-color-4/#specifying-lab-lch
48
- *
49
- * If no alpha channel is given, it will default to 1.0 (fully opaque).
50
- *
51
- * Note that any named or system CSS colors, hex colors and any RGB colors will
52
- * be returned as sRGB instance. In former versions of this library (pre 3.0.0),
53
- * there was only a single RGB type with undefined behaviour re: linear or
54
- * gamma-encoded versions. Since v3.0.0, {@link rgb} is only used for _linear_
55
- * and {@link srgb} for non-linear (gamma encoded) RGB colors (CSS uses sRGB by
56
- * default).
57
- *
58
- * @param src -
59
- */
60
- export const parseCss = (src) => {
61
- src = (isString(src) ? src : src.deref()).toLowerCase();
62
- const named = CSS_NAMES[src] || CSS_SYSTEM_COLORS[src];
63
- if (named || src[0] === "#")
64
- return new ParsedColor("srgb", intArgb32Srgb([], parseHex(named || src)));
65
- const parts = src.split(/[(),/ ]+/);
66
- const [mode, a, b, c, d] = parts;
67
- assert(parts.length === 5 || parts.length === 6, `invalid color: ${src}`);
68
- switch (mode) {
69
- case "rgb":
70
- case "rgba":
71
- return new ParsedColor("srgb", [
72
- __numOrPercent(a, 1, INV8BIT, true),
73
- __numOrPercent(b, 1, INV8BIT, true),
74
- __numOrPercent(c, 1, INV8BIT, true),
75
- __alpha(d),
76
- ]);
77
- case "hsl":
78
- case "hsla":
79
- return new ParsedColor("hsl", [
80
- __hue(a),
81
- __percent(b),
82
- __percent(c),
83
- __alpha(d),
84
- ]);
85
- case "lab":
86
- return new ParsedColor("lab50", [
87
- __numOrPercent(a),
88
- __numOrPercent(b, 1.25),
89
- __numOrPercent(c, 1.25),
90
- __alpha(d),
91
- ]);
92
- case "lch":
93
- return new ParsedColor(mode, [
94
- __numOrPercent(a),
95
- __numOrPercent(b, 1.5),
96
- __hue(c),
97
- __alpha(d),
98
- ]);
99
- case "oklab":
100
- return new ParsedColor(mode, [
101
- __numOrPercent(a, 1, 1),
102
- __numOrPercent(b, 0.4, 1),
103
- __numOrPercent(c, 0.4, 1),
104
- __alpha(d),
105
- ]);
106
- case "oklch":
107
- return new ParsedColor(mode, [
108
- __numOrPercent(a, 1, 1),
109
- __numOrPercent(b, 0.4, 1),
110
- __hue(c),
111
- __alpha(d),
112
- ]);
113
- default:
114
- unsupported(`color mode: ${mode}`);
115
- }
15
+ const parseCss = (src) => {
16
+ src = (isString(src) ? src : src.deref()).toLowerCase();
17
+ const named = CSS_NAMES[src] || CSS_SYSTEM_COLORS[src];
18
+ if (named || src[0] === "#")
19
+ return new ParsedColor(
20
+ "srgb",
21
+ intArgb32Srgb([], parseHex(named || src))
22
+ );
23
+ const parts = src.split(/[(),/ ]+/);
24
+ const [mode, a, b, c, d] = parts;
25
+ assert(parts.length === 5 || parts.length === 6, `invalid color: ${src}`);
26
+ switch (mode) {
27
+ case "rgb":
28
+ case "rgba":
29
+ return new ParsedColor("srgb", [
30
+ __numOrPercent(a, 1, INV8BIT, true),
31
+ __numOrPercent(b, 1, INV8BIT, true),
32
+ __numOrPercent(c, 1, INV8BIT, true),
33
+ __alpha(d)
34
+ ]);
35
+ case "hsl":
36
+ case "hsla":
37
+ return new ParsedColor("hsl", [
38
+ __hue(a),
39
+ __percent(b),
40
+ __percent(c),
41
+ __alpha(d)
42
+ ]);
43
+ case "lab":
44
+ return new ParsedColor("lab50", [
45
+ __numOrPercent(a),
46
+ __numOrPercent(b, 1.25),
47
+ __numOrPercent(c, 1.25),
48
+ __alpha(d)
49
+ ]);
50
+ case "lch":
51
+ return new ParsedColor(mode, [
52
+ __numOrPercent(a),
53
+ __numOrPercent(b, 1.5),
54
+ __hue(c),
55
+ __alpha(d)
56
+ ]);
57
+ case "oklab":
58
+ return new ParsedColor(mode, [
59
+ __numOrPercent(a, 1, 1),
60
+ __numOrPercent(b, 0.4, 1),
61
+ __numOrPercent(c, 0.4, 1),
62
+ __alpha(d)
63
+ ]);
64
+ case "oklch":
65
+ return new ParsedColor(mode, [
66
+ __numOrPercent(a, 1, 1),
67
+ __numOrPercent(b, 0.4, 1),
68
+ __hue(c),
69
+ __alpha(d)
70
+ ]);
71
+ default:
72
+ unsupported(`color mode: ${mode}`);
73
+ }
116
74
  };
117
- /**
118
- * Scale factors for various CSS angle units
119
- *
120
- * @remarks
121
- * Reference:
122
- * - https://www.w3.org/TR/css-values-4/#angle-value
123
- *
124
- * @internal
125
- */
126
75
  const HUE_NORMS = {
127
- rad: TAU,
128
- grad: 400,
129
- turn: 1,
130
- deg: 360,
76
+ rad: TAU,
77
+ grad: 400,
78
+ turn: 1,
79
+ deg: 360
131
80
  };
132
- /** @internal */
133
81
  const __hue = (x) => {
134
- const match = /^(-?[0-9.]+)(deg|rad|grad|turn)?$/.exec(x);
135
- assert(!!match, `expected hue, got: ${x}`);
136
- return fract(parseFloat(match[1]) / (HUE_NORMS[match[2]] || 360));
82
+ const match = /^(-?[0-9.]+)(deg|rad|grad|turn)?$/.exec(x);
83
+ assert(!!match, `expected hue, got: ${x}`);
84
+ return fract(parseFloat(match[1]) / (HUE_NORMS[match[2]] || 360));
137
85
  };
138
- /** @internal */
139
- const __alpha = (x) => (x ? __numOrPercent(x, 1, 1, true) : 1);
140
- /** @internal */
86
+ const __alpha = (x) => x ? __numOrPercent(x, 1, 1, true) : 1;
141
87
  const __percent = (x, clamp = true) => {
142
- assert(/^([0-9.]+)%$/.test(x), `expected percentage, got: ${x}`);
143
- const res = parseFloat(x) / 100;
144
- return clamp ? clamp01(res) : res;
88
+ assert(/^([0-9.]+)%$/.test(x), `expected percentage, got: ${x}`);
89
+ const res = parseFloat(x) / 100;
90
+ return clamp ? clamp01(res) : res;
145
91
  };
146
- /** @internal */
147
92
  const __numOrPercent = (x, scalePerc = 1, scale = 0.01, clamp = false) => {
148
- assert(/^-?[0-9.]+%?$/.test(x), `expected number or percentage, got: ${x}`);
149
- const res = parseFloat(x) * (x.endsWith("%") ? 0.01 * scalePerc : scale);
150
- return clamp ? clamp01(res) : res;
93
+ assert(/^-?[0-9.]+%?$/.test(x), `expected number or percentage, got: ${x}`);
94
+ const res = parseFloat(x) * (x.endsWith("%") ? 0.01 * scalePerc : scale);
95
+ return clamp ? clamp01(res) : res;
151
96
  };
152
- /**
153
- * Parses a CSS hex color string into an uint32. Throws an error if given string
154
- * doesn't conform to any of the supported formats.
155
- *
156
- * @remarks
157
- * Supports the following input formats (`#` always optional and each letter a
158
- * hex digit):
159
- *
160
- * - `#rgb`
161
- * - `#rgba`
162
- * - `#rrggbb`
163
- * - `#rrggbbaa`
164
- *
165
- * @param src
166
- */
167
- export const parseHex = (src) => {
168
- const match = /^#?([0-9a-f]{3,8})$/i.exec(src);
169
- if (match) {
170
- const hex = match[1];
171
- const val = parseInt(hex, 16);
172
- switch (hex.length) {
173
- case 3:
174
- return (interleave4_12_24(val) | 0xff000000) >>> 0;
175
- case 4:
176
- return rotateRight(interleave4_16_32(val), 8);
177
- case 6:
178
- return (val | 0xff000000) >>> 0;
179
- case 8:
180
- return rotateRight(val, 8);
181
- default:
182
- }
97
+ const parseHex = (src) => {
98
+ const match = /^#?([0-9a-f]{3,8})$/i.exec(src);
99
+ if (match) {
100
+ const hex = match[1];
101
+ const val = parseInt(hex, 16);
102
+ switch (hex.length) {
103
+ case 3:
104
+ return (interleave4_12_24(val) | 4278190080) >>> 0;
105
+ case 4:
106
+ return rotateRight(interleave4_16_32(val), 8);
107
+ case 6:
108
+ return (val | 4278190080) >>> 0;
109
+ case 8:
110
+ return rotateRight(val, 8);
111
+ default:
183
112
  }
184
- return illegalArgs(`invalid hex color: "${src}"`);
113
+ }
114
+ return illegalArgs(`invalid hex color: "${src}"`);
115
+ };
116
+ export {
117
+ parseCss,
118
+ parseHex
185
119
  };
package/defcolor.js CHANGED
@@ -17,113 +17,102 @@ import { convert, defConversions } from "./convert.js";
17
17
  import { parseCss } from "./css/parse-css.js";
18
18
  import { intArgb32Rgb } from "./int/int-rgb.js";
19
19
  import { __ensureArgs } from "./internal/ensure.js";
20
- export const defColor = (spec) => {
21
- const channels = spec.channels || {};
22
- const order = spec.order;
23
- const numChannels = order.length;
24
- order.reduce((acc, id) => {
25
- acc[id] = {
26
- range: [0, 1],
27
- ...channels[id],
28
- };
29
- return acc;
30
- }, channels);
31
- const min = Object.freeze(order.map((id) => channels[id].range[0]));
32
- const max = Object.freeze(order.map((id) => channels[id].range[1]));
33
- // fix alpha channel for randomize()
34
- const minR = set4([], min);
35
- const maxR = set4([], max);
36
- minR[numChannels - 1] = 1;
37
- const hueChanID = order.findIndex((id) => !!channels[id].hue);
38
- const $Color = class {
39
- offset;
40
- stride;
41
- buf;
42
- constructor(buf, offset = 0, stride = 1) {
43
- this.offset = offset;
44
- this.stride = stride;
45
- this.buf = buf || [0, 0, 0, 0];
46
- this.offset = offset;
47
- this.stride = stride;
48
- }
49
- get mode() {
50
- return spec.mode;
51
- }
52
- get length() {
53
- return numChannels;
54
- }
55
- get range() {
56
- return [min, max];
57
- }
58
- get [Symbol.toStringTag]() {
59
- return spec.mode;
60
- }
61
- get xyz() {
62
- return [this[0], this[1], this[2]];
63
- }
64
- [Symbol.iterator]() {
65
- return stridedValues(this.buf, this.length, this.offset, this.stride);
66
- }
67
- copy() {
68
- return new $Color(this.deref());
69
- }
70
- copyView() {
71
- return new $Color(this.buf, this.offset, this.stride);
72
- }
73
- empty() {
74
- return new $Color();
75
- }
76
- deref() {
77
- return [this[0], this[1], this[2], this[3]];
78
- }
79
- set(src) {
80
- return set4(this, src);
81
- }
82
- clamp() {
83
- hueChanID >= 0 && (this[hueChanID] = fract(this[hueChanID]));
84
- clamp4(null, this, min, max);
85
- return this;
86
- }
87
- eqDelta(o, eps = EPS) {
88
- return eqDelta4(this, o, eps);
89
- }
90
- randomize(rnd) {
91
- return randMinMax(this, minR, maxR, rnd);
92
- }
93
- toJSON() {
94
- return this.deref();
95
- }
96
- toString() {
97
- return vector(4, 4)(this);
98
- }
20
+ const defColor = (spec) => {
21
+ const channels = spec.channels || {};
22
+ const order = spec.order;
23
+ const numChannels = order.length;
24
+ order.reduce((acc, id) => {
25
+ acc[id] = {
26
+ range: [0, 1],
27
+ ...channels[id]
99
28
  };
100
- declareIndices($Color.prototype, order);
101
- defConversions(spec.mode, spec.from);
102
- defConversions("rgb", { [spec.mode]: spec.toRgb });
103
- const fromColor = (src, mode, xs) => {
104
- const res = new $Color(...xs);
105
- return mode !== spec.mode
106
- ? convert(res, src, spec.mode, mode)
107
- : res.set(src);
108
- };
109
- const factory = (src, ...xs) => src == null
110
- ? new $Color()
111
- : isString(src)
112
- ? factory(parseCss(src), ...xs)
113
- : isArrayLike(src)
114
- ? isString(src.mode)
115
- ? fromColor(src, src.mode, xs)
116
- : new $Color(src, ...xs)
117
- : implementsFunction(src, "deref")
118
- ? fromColor(src.deref(), src.mode, xs)
119
- : isNumber(src)
120
- ? xs.length && xs.every(isNumber)
121
- ? new $Color(...__ensureArgs([src, ...xs]))
122
- : fromColor(intArgb32Rgb([], src), "rgb", xs)
123
- : illegalArgs(`can't create a ${spec.mode} color from: ${src}`);
124
- factory.class = $Color;
125
- factory.range = [min, max];
126
- factory.random = (rnd, buf, idx, stride) => new $Color(buf, idx, stride).randomize(rnd);
127
- factory.mapBuffer = (buf, num = (buf.length / numChannels) | 0, start = 0, cstride = 1, estride = numChannels) => mapStridedBuffer($Color, buf, num, start, cstride, estride);
128
- return factory;
29
+ return acc;
30
+ }, channels);
31
+ const min = Object.freeze(order.map((id) => channels[id].range[0]));
32
+ const max = Object.freeze(order.map((id) => channels[id].range[1]));
33
+ const minR = set4([], min);
34
+ const maxR = set4([], max);
35
+ minR[numChannels - 1] = 1;
36
+ const hueChanID = order.findIndex((id) => !!channels[id].hue);
37
+ const $Color = class {
38
+ constructor(buf, offset = 0, stride = 1) {
39
+ this.offset = offset;
40
+ this.stride = stride;
41
+ this.buf = buf || [0, 0, 0, 0];
42
+ this.offset = offset;
43
+ this.stride = stride;
44
+ }
45
+ buf;
46
+ get mode() {
47
+ return spec.mode;
48
+ }
49
+ get length() {
50
+ return numChannels;
51
+ }
52
+ get range() {
53
+ return [min, max];
54
+ }
55
+ get [Symbol.toStringTag]() {
56
+ return spec.mode;
57
+ }
58
+ get xyz() {
59
+ return [this[0], this[1], this[2]];
60
+ }
61
+ [Symbol.iterator]() {
62
+ return stridedValues(
63
+ this.buf,
64
+ this.length,
65
+ this.offset,
66
+ this.stride
67
+ );
68
+ }
69
+ copy() {
70
+ return new $Color(this.deref());
71
+ }
72
+ copyView() {
73
+ return new $Color(this.buf, this.offset, this.stride);
74
+ }
75
+ empty() {
76
+ return new $Color();
77
+ }
78
+ deref() {
79
+ return [this[0], this[1], this[2], this[3]];
80
+ }
81
+ set(src) {
82
+ return set4(this, src);
83
+ }
84
+ clamp() {
85
+ hueChanID >= 0 && (this[hueChanID] = fract(this[hueChanID]));
86
+ clamp4(null, this, min, max);
87
+ return this;
88
+ }
89
+ eqDelta(o, eps = EPS) {
90
+ return eqDelta4(this, o, eps);
91
+ }
92
+ randomize(rnd) {
93
+ return randMinMax(this, minR, maxR, rnd);
94
+ }
95
+ toJSON() {
96
+ return this.deref();
97
+ }
98
+ toString() {
99
+ return vector(4, 4)(this);
100
+ }
101
+ };
102
+ declareIndices($Color.prototype, order);
103
+ defConversions(spec.mode, spec.from);
104
+ defConversions("rgb", { [spec.mode]: spec.toRgb });
105
+ const fromColor = (src, mode, xs) => {
106
+ const res = new $Color(...xs);
107
+ return mode !== spec.mode ? convert(res, src, spec.mode, mode) : res.set(src);
108
+ };
109
+ const factory = (src, ...xs) => src == null ? new $Color() : isString(src) ? factory(parseCss(src), ...xs) : isArrayLike(src) ? isString(src.mode) ? fromColor(src, src.mode, xs) : new $Color(src, ...xs) : implementsFunction(src, "deref") ? fromColor(src.deref(), src.mode, xs) : isNumber(src) ? xs.length && xs.every(isNumber) ? new $Color(...__ensureArgs([src, ...xs])) : fromColor(intArgb32Rgb([], src), "rgb", xs) : illegalArgs(`can't create a ${spec.mode} color from: ${src}`);
110
+ factory.class = $Color;
111
+ factory.range = [min, max];
112
+ factory.random = (rnd, buf, idx, stride) => new $Color(buf, idx, stride).randomize(rnd);
113
+ factory.mapBuffer = (buf, num = buf.length / numChannels | 0, start = 0, cstride = 1, estride = numChannels) => mapStridedBuffer($Color, buf, num, start, cstride, estride);
114
+ return factory;
115
+ };
116
+ export {
117
+ defColor
129
118
  };