@pixerate/editor 0.92.0 → 0.94.0

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 (37) hide show
  1. package/THIRD_PARTY_NOTICES.md +2 -0
  2. package/dist/{chunk-PDCITYBT.cjs → chunk-4F3YDIWW.cjs} +367 -2
  3. package/dist/chunk-4F3YDIWW.cjs.map +1 -0
  4. package/dist/chunk-73L6TROJ.cjs +3685 -0
  5. package/dist/chunk-73L6TROJ.cjs.map +1 -0
  6. package/dist/chunk-747CGOT2.js +3685 -0
  7. package/dist/chunk-747CGOT2.js.map +1 -0
  8. package/dist/{chunk-YLB2WVNA.js → chunk-ISDCJHTO.js} +367 -2
  9. package/dist/chunk-ISDCJHTO.js.map +1 -0
  10. package/dist/image-editor/index.cjs +787 -302
  11. package/dist/image-editor/index.cjs.map +1 -1
  12. package/dist/image-editor/index.d.cts +84 -18
  13. package/dist/image-editor/index.d.ts +84 -18
  14. package/dist/image-editor/index.js +560 -75
  15. package/dist/image-editor/index.js.map +1 -1
  16. package/dist/paint/index.cjs +26 -2
  17. package/dist/paint/index.cjs.map +1 -1
  18. package/dist/paint/index.d.cts +96 -2
  19. package/dist/paint/index.d.ts +96 -2
  20. package/dist/paint/index.js +25 -1
  21. package/dist/raster/index.cjs +78 -2
  22. package/dist/raster/index.cjs.map +1 -1
  23. package/dist/raster/index.d.cts +99 -348
  24. package/dist/raster/index.d.ts +99 -348
  25. package/dist/raster/index.js +78 -2
  26. package/dist/{surface-fJhkmNQn.d.cts → surface-CuBg2c6k.d.cts} +1 -1
  27. package/dist/{surface-fJhkmNQn.d.ts → surface-CuBg2c6k.d.ts} +1 -1
  28. package/dist/zlib-BJ6U7LuB.d.cts +795 -0
  29. package/dist/zlib-BjQkpMFi.d.ts +795 -0
  30. package/package.json +3 -3
  31. package/skills/pixerate-image-editor/SKILL.md +63 -4
  32. package/dist/chunk-H543GD6T.cjs +0 -1696
  33. package/dist/chunk-H543GD6T.cjs.map +0 -1
  34. package/dist/chunk-P5TPUNBZ.js +0 -1696
  35. package/dist/chunk-P5TPUNBZ.js.map +0 -1
  36. package/dist/chunk-PDCITYBT.cjs.map +0 -1
  37. package/dist/chunk-YLB2WVNA.js.map +0 -1
@@ -188,6 +188,8 @@ GridCraft. Apache POI is © The Apache Software Foundation, licensed under the A
188
188
  - `crates/io/src/adjust_map.rs` (`parse` / `write` for Levels, Curves including pencil maps, Hue/Saturation with `canonical_bounds`, Vibrance, Color Balance, Black & White with its tint descriptor, Photo Filter v2 and v3 XYZ, Invert, Posterize and Threshold; the adjustment key list and labels) and `crates/io/src/channel_map.rs` (`decode_known_color`: RGB, HSB, CMYK stored inverted, Lab, Grayscale) → `packages/core/src/image-editor/psd/adjust.ts`; parameters stay in our units, and a pencil curve becomes points every 15 levels
189
189
  - `crates/io/src/psd_import.rs` (layer records to layers: missing colour channels as 0, missing alpha as opaque, a channel that is in the file but unreadable leaving the layer empty, the `-3` real mask when present, mask density / feather / disabled, groups from the dividers, warnings per problem) and `crates/io/src/pixels.rs` (planar samples at 1 / 8 / 16 / 32 bits to interleaved, CMYK inversion) → `packages/core/src/image-editor/psd/import.ts` and `pixels.ts`; colour modes other than RGB are converted with plain formulas (no CMYK profile), and 32-bit samples are encoded from linear light
190
190
  - `crates/io/src/psd_export.rs` and `crates/psd/src/builder.rs` (layer records with RLE channels, group divider and folder records, adjustment blocks, user masks with parameters, `luni` / `lyid` / `iOpa` / `lspf`, the resolution and version-info resources, PSB above 30 000 px) → `packages/core/src/image-editor/psd/export.ts`; 8-bit RGB only, with the merged image from our compositor
191
+ - `crates/doc/src/effects.rs` (the layer-style model: shadows, glows, strokes, satin, bevel & emboss with its Contour and Texture elements, colour / gradient / pattern overlays, the shared enabled / blend / opacity, Photoshop's defaults, the global light) → `packages/core/src/raster/effects/model.ts`; colours are `#rrggbb`, effects carry ids, and validation, merging and Scale Effects are our own
192
+ - `crates/compose/src/effects.rs` (render order and the per-kind maps: `margin`, `maps_are_local`, the Felzenszwalb–Huttenlocher `dt1` / `edt_nearest`, the 5 × 5 `chamfer_from`, `dist_outside` / `dist_inside` with coverage-placed edges, `local_coverage`, `dilate`, `spread_split`, the fractional `box_geom` / `box_line` / `tent_line` blur, `contour_lut` with corners, `ranged_lut`, `satin_lut`, `hash_noise` / `noise`, `shadow_map`, `glow_map`, `satin_map`, `bevel_geom`, `bevel_chisel_h`, `bevel_height`, `bevel_maps`, `gradient_units`, `gradient_t`, `paint_glow`, `stroke_widths`, the stroke frame and the outside-stroke shares, `knock_out_exterior`, `premerges_layer` and `composite_with_effects`), `crates/compose/src/fill_layout.rs` (`gradient_layout`) and `crates/compose/src/pattern.rs` (`Tile::sample`, `Placement`) → `packages/core/src/raster/effects/render.ts` and `patterns.ts`; single-threaded, without vector-shape outlines, text gamma, Transparency Shapes Layer or Blend Interior Effects as Group, with chiselled bevel edges measured to the coverage-gradient edge line instead of photocraft's sharp-edge refinement, and the maps built once per layer region and cropped per tile by our compositor; the built-in patterns are our own; test cases re-expressed → `packages/core/tests/raster-effects.test.ts`
191
193
 
192
194
  ## soundcraft
193
195
 
@@ -395,6 +395,371 @@ function coverageTileCoord(key) {
395
395
  return _chunkZOOEX3WTcjs.tileCoord.call(void 0, key);
396
396
  }
397
397
 
398
+ // src/paint/pigment.ts
399
+ var PIGMENT_BANDS = 36;
400
+ var PIGMENT_LAMBDA_MIN = 380;
401
+ var PIGMENT_LAMBDA_STEP = 10;
402
+ var PIGMENT_WAVELENGTHS = Float32Array.from({ length: PIGMENT_BANDS }, (_, i) => PIGMENT_LAMBDA_MIN + i * PIGMENT_LAMBDA_STEP);
403
+ var N = PIGMENT_BANDS;
404
+ var LUT_NODES = 17;
405
+ var R_MIN = 1e-4;
406
+ var SCATTER_MIN = 0.01;
407
+ function toLinear(v) {
408
+ return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
409
+ }
410
+ function toEncoded(v) {
411
+ if (!(v > 0)) return 0;
412
+ if (v >= 1) return 1;
413
+ return v <= 31308e-7 ? 12.92 * v : 1.055 * Math.pow(v, 1 / 2.4) - 0.055;
414
+ }
415
+ function clamp01(v) {
416
+ return v > 0 ? v < 1 ? v : 1 : 0;
417
+ }
418
+ function lobe(l, mu, s1, s2) {
419
+ const t = (l - mu) / (l < mu ? s1 : s2);
420
+ return Math.exp(-0.5 * t * t);
421
+ }
422
+ function planck(nm, kelvin) {
423
+ const m = nm * 1e-9;
424
+ return 1 / (m ** 5 * (Math.exp(0.01438776877 / (m * kelvin)) - 1));
425
+ }
426
+ var weights = null;
427
+ function rgbWeights() {
428
+ if (weights) return weights;
429
+ const w = new Float64Array(3 * N);
430
+ const m = [3.2404542, -1.5371385, -0.4985314, -0.969266, 1.8760108, 0.041556, 0.0556434, -0.2040259, 1.0572252];
431
+ for (let b = 0; b < N; b++) {
432
+ const l = PIGMENT_LAMBDA_MIN + b * PIGMENT_LAMBDA_STEP;
433
+ const e = planck(l, 6504);
434
+ const x = e * (1.056 * lobe(l, 599.8, 37.9, 31) + 0.362 * lobe(l, 442, 16, 26.7) - 0.065 * lobe(l, 501.1, 20.4, 26.2));
435
+ const y = e * (0.821 * lobe(l, 568.8, 46.9, 40.5) + 0.286 * lobe(l, 530.9, 16.3, 31.1));
436
+ const z = e * (1.217 * lobe(l, 437, 11.8, 36) + 0.681 * lobe(l, 459, 26, 13.8));
437
+ for (let c = 0; c < 3; c++) w[c * N + b] = m[c * 3] * x + m[c * 3 + 1] * y + m[c * 3 + 2] * z;
438
+ }
439
+ for (let c = 0; c < 3; c++) {
440
+ let sum = 0;
441
+ for (let b = 0; b < N; b++) sum += w[c * N + b];
442
+ for (let b = 0; b < N; b++) w[c * N + b] /= sum;
443
+ }
444
+ return weights = w;
445
+ }
446
+ function fitCoefficients(r, g, b, coeffs) {
447
+ const w = rgbWeights();
448
+ const target = [r, g, b];
449
+ const res = new Float64Array(3);
450
+ const jac = new Float64Array(9);
451
+ const trial = new Float64Array(3);
452
+ let err = residual(coeffs, target, w, res, jac);
453
+ for (let it = 0; it < 60 && err > 1e-10; it++) {
454
+ const step = solve3(jac, res);
455
+ if (!step) break;
456
+ let scale = 1;
457
+ let next = Infinity;
458
+ for (let k = 0; k < 12; k++) {
459
+ for (let i = 0; i < 3; i++) trial[i] = coeffs[i] - scale * step[i];
460
+ next = residual(trial, target, w, null, null);
461
+ if (next < err) break;
462
+ scale *= 0.5;
463
+ }
464
+ if (!(next < err)) break;
465
+ coeffs.set(trial);
466
+ err = residual(coeffs, target, w, res, jac);
467
+ }
468
+ return err;
469
+ }
470
+ function residual(c, target, w, res, jac) {
471
+ let r0 = -target[0];
472
+ let r1 = -target[1];
473
+ let r2 = -target[2];
474
+ if (jac) jac.fill(0);
475
+ for (let b = 0; b < N; b++) {
476
+ const x = b / (N - 1);
477
+ const z = (c[0] * x + c[1]) * x + c[2];
478
+ const q = 1 + z * z;
479
+ const sq = Math.sqrt(q);
480
+ const s = 0.5 + z / (2 * sq);
481
+ r0 += w[b] * s;
482
+ r1 += w[N + b] * s;
483
+ r2 += w[2 * N + b] * s;
484
+ if (jac) {
485
+ const ds = 1 / (2 * q * sq);
486
+ for (let k = 0; k < 3; k++) {
487
+ const wd = w[k * N + b] * ds;
488
+ jac[k * 3] += wd * x * x;
489
+ jac[k * 3 + 1] += wd * x;
490
+ jac[k * 3 + 2] += wd;
491
+ }
492
+ }
493
+ }
494
+ if (res) {
495
+ res[0] = r0;
496
+ res[1] = r1;
497
+ res[2] = r2;
498
+ }
499
+ return r0 * r0 + r1 * r1 + r2 * r2;
500
+ }
501
+ function solve3(a, v) {
502
+ const [a0, a1, a2, a3, a4, a5, a6, a7, a8] = a;
503
+ const c0 = a4 * a8 - a5 * a7;
504
+ const c1 = a5 * a6 - a3 * a8;
505
+ const c2 = a3 * a7 - a4 * a6;
506
+ const det = a0 * c0 + a1 * c1 + a2 * c2;
507
+ if (!(Math.abs(det) > 1e-300)) return null;
508
+ const [v0, v1, v2] = v;
509
+ return [
510
+ (v0 * c0 + a1 * (a5 * v2 - v1 * a8) + a2 * (v1 * a7 - a4 * v2)) / det,
511
+ (a0 * (v1 * a8 - a5 * v2) + v0 * c1 + a2 * (a3 * v2 - v1 * a6)) / det,
512
+ (a0 * (a4 * v2 - v1 * a7) + a1 * (v1 * a6 - a3 * v2) + v0 * c2) / det
513
+ ];
514
+ }
515
+ var candidate = new Float64Array(3);
516
+ function fitNode(r, g, b, coeffs) {
517
+ let best = fitCoefficients(r, g, b, coeffs);
518
+ if (best <= 1e-12) return;
519
+ candidate.fill(0);
520
+ let err = fitCoefficients(r, g, b, candidate);
521
+ if (err < best) {
522
+ best = err;
523
+ coeffs.set(candidate);
524
+ }
525
+ if (best <= 1e-12) return;
526
+ const max = Math.max(r, g, b);
527
+ if (!(max > 0) || max >= 0.5) return;
528
+ candidate.fill(0);
529
+ const steps = 32;
530
+ for (let i = 0; i <= steps; i++) {
531
+ const scale = 0.5 * Math.pow(max / 0.5, i / steps) / max;
532
+ err = fitCoefficients(r * scale, g * scale, b * scale, candidate);
533
+ }
534
+ if (err < best) coeffs.set(candidate);
535
+ }
536
+ function sigmoidSpectrum(c, out, offset) {
537
+ for (let b = 0; b < N; b++) {
538
+ const x = b / (N - 1);
539
+ const z = (c[0] * x + c[1]) * x + c[2];
540
+ out[offset + b] = 0.5 + z / (2 * Math.sqrt(1 + z * z));
541
+ }
542
+ }
543
+ var NODES = Float64Array.from({ length: LUT_NODES }, (_, i) => toLinear(i / (LUT_NODES - 1)));
544
+ var table = null;
545
+ function spectrumTable() {
546
+ if (table) return table;
547
+ const n = LUT_NODES;
548
+ const t = new Float32Array(n * n * n * N);
549
+ const row = new Float64Array(3);
550
+ const coeffs = new Float64Array(3);
551
+ for (let r = 0; r < n; r++) {
552
+ for (let g = 0; g < n; g++) {
553
+ coeffs.set(row);
554
+ for (let b = 0; b < n; b++) {
555
+ fitNode(NODES[r], NODES[g], NODES[b], coeffs);
556
+ if (b === 0) row.set(coeffs);
557
+ sigmoidSpectrum(coeffs, t, ((r * n + g) * n + b) * N);
558
+ }
559
+ }
560
+ }
561
+ return table = t;
562
+ }
563
+ var cell = new Int32Array(3);
564
+ var frac = new Float64Array(3);
565
+ var linear = new Float64Array(3);
566
+ function locate(channel, encoded) {
567
+ const v = clamp01(encoded);
568
+ const i = Math.min(LUT_NODES - 2, Math.floor(v * (LUT_NODES - 1)));
569
+ const lo = NODES[i];
570
+ const lin = toLinear(v);
571
+ const f = (lin - lo) / (NODES[i + 1] - lo);
572
+ cell[channel] = i;
573
+ frac[channel] = f < 0 ? 0 : f > 1 ? 1 : f;
574
+ linear[channel] = lin;
575
+ }
576
+ function rgbToReflectance(r, g, b, out = new Float32Array(N)) {
577
+ const t = spectrumTable();
578
+ const n = LUT_NODES;
579
+ locate(0, r);
580
+ locate(1, g);
581
+ locate(2, b);
582
+ const [ri, gi, bi] = cell;
583
+ const [rf, gf, bf] = frac;
584
+ out.fill(0);
585
+ for (let corner = 0; corner < 8; corner++) {
586
+ const dr = corner >> 2;
587
+ const dg = corner >> 1 & 1;
588
+ const db = corner & 1;
589
+ const weight = (dr ? rf : 1 - rf) * (dg ? gf : 1 - gf) * (db ? bf : 1 - bf);
590
+ if (weight === 0) continue;
591
+ const base = (((ri + dr) * n + gi + dg) * n + bi + db) * N;
592
+ for (let k = 0; k < N; k++) out[k] += weight * t[base + k];
593
+ }
594
+ return out;
595
+ }
596
+ function reflectanceToRgb(reflectance, out = [0, 0, 0]) {
597
+ const w = rgbWeights();
598
+ let r = 0;
599
+ let g = 0;
600
+ let b = 0;
601
+ for (let k = 0; k < N; k++) {
602
+ const v = reflectance[k];
603
+ r += w[k] * v;
604
+ g += w[N + k] * v;
605
+ b += w[2 * N + k] * v;
606
+ }
607
+ out[0] = toEncoded(r);
608
+ out[1] = toEncoded(g);
609
+ out[2] = toEncoded(b);
610
+ return out;
611
+ }
612
+ var spectrumScratch = new Float32Array(N);
613
+ function createPigment(color, options = {}) {
614
+ const pigment = { rgb: [0, 0, 0], strength: 1, ks: new Float32Array(N), scatter: 1 };
615
+ return setPigmentColor(pigment, color[0], color[1], color[2], options.strength);
616
+ }
617
+ function setPigmentColor(pigment, r, g, b, strength = pigment.strength) {
618
+ const R = rgbToReflectance(r, g, b, spectrumScratch);
619
+ const ks = pigment.ks;
620
+ for (let k = 0; k < N; k++) {
621
+ const v = R[k] > R_MIN ? R[k] : R_MIN;
622
+ ks[k] = (1 - v) * (1 - v) / (2 * v);
623
+ }
624
+ pigment.rgb[0] = clamp01(r);
625
+ pigment.rgb[1] = clamp01(g);
626
+ pigment.rgb[2] = clamp01(b);
627
+ pigment.strength = Number.isFinite(strength) && strength > 0 ? strength : 1;
628
+ const y = 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2];
629
+ pigment.scatter = y > SCATTER_MIN ? y : SCATTER_MIN;
630
+ return pigment;
631
+ }
632
+ function ksToRgb(ks, out, offset) {
633
+ const w = rgbWeights();
634
+ let r = 0;
635
+ let g = 0;
636
+ let b = 0;
637
+ for (let k = 0; k < N; k++) {
638
+ const q = ks[k];
639
+ const v = 1 + q - Math.sqrt(q * q + 2 * q);
640
+ r += w[k] * v;
641
+ g += w[N + k] * v;
642
+ b += w[2 * N + k] * v;
643
+ }
644
+ out[offset] = toEncoded(r);
645
+ out[offset + 1] = toEncoded(g);
646
+ out[offset + 2] = toEncoded(b);
647
+ }
648
+ var mixScratch = new Float64Array(N);
649
+ function mixPigments(colors, weights2) {
650
+ if (colors.length === 0) throw new Error("mixPigments needs at least one colour.");
651
+ if (weights2.length !== colors.length) throw new Error(`mixPigments got ${colors.length} colours but ${weights2.length} weights; pass one weight per colour.`);
652
+ const pigments = colors.map((c) => "ks" in c ? c : createPigment(c));
653
+ let total = 0;
654
+ for (let i = 0; i < pigments.length; i++) {
655
+ const w = weights2[i];
656
+ if (!(Number.isFinite(w) && w >= 0)) throw new Error(`Weight ${i} is ${w}; weights must be finite and \u2265 0.`);
657
+ total += w * pigments[i].strength * pigments[i].scatter;
658
+ }
659
+ if (!(total > 0)) throw new Error("mixPigments needs at least one positive weight.");
660
+ mixScratch.fill(0);
661
+ for (let i = 0; i < pigments.length; i++) {
662
+ const p = pigments[i];
663
+ const c = weights2[i] * p.strength * p.scatter / total;
664
+ if (c === 0) continue;
665
+ for (let k = 0; k < N; k++) mixScratch[k] += c * p.ks[k];
666
+ }
667
+ const out = [0, 0, 0];
668
+ ksToRgb(mixScratch, out, 0);
669
+ return out;
670
+ }
671
+ function lerpPigment(a, b, t) {
672
+ const u = clamp01(t);
673
+ return mixPigments([a, b], [1 - u, u]);
674
+ }
675
+ function lerpPigmentInto(a, b, t, out, offset = 0) {
676
+ const u = t > 0 ? t < 1 ? t : 1 : 0;
677
+ const wa = (1 - u) * a.strength * a.scatter;
678
+ const wb = u * b.strength * b.scatter;
679
+ const ca = wa / (wa + wb);
680
+ const cb = 1 - ca;
681
+ const ka = a.ks;
682
+ const kb = b.ks;
683
+ for (let k = 0; k < N; k++) mixScratch[k] = ca * ka[k] + cb * kb[k];
684
+ ksToRgb(mixScratch, out, offset);
685
+ }
686
+
687
+ // src/paint/pigment-tools.ts
688
+ var HEX = /^#?([0-9a-f]{6})$/i;
689
+ function parseHex(value, index) {
690
+ const m = typeof value === "string" ? HEX.exec(value.trim()) : null;
691
+ if (!m) throw new Error(`colors[${index}].color is ${JSON.stringify(value)}; use #rrggbb, e.g. "#1e40af".`);
692
+ const n = parseInt(m[1], 16);
693
+ return [(n >> 16 & 255) / 255, (n >> 8 & 255) / 255, (n & 255) / 255];
694
+ }
695
+ function toHex(rgb) {
696
+ return "#" + rgb.map((v) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, "0")).join("");
697
+ }
698
+ function createPigmentTools() {
699
+ const mixColors = {
700
+ name: "mix_colors",
701
+ title: "Mix colours like paint",
702
+ description: "Mixes colours as paint would (Kubelka-Munk pigment mixing over reflectance spectra), so blue and yellow make green and white lightens a colour into a tint instead of greying it. Changes nothing. Returns the mixed colour as #rrggbb, the plain RGB average (rgbLerp) for comparison, and the normalised weights.",
703
+ inputSchema: {
704
+ type: "object",
705
+ properties: {
706
+ colors: {
707
+ type: "array",
708
+ minItems: 1,
709
+ maxItems: 16,
710
+ description: "The paints to mix (1 to 16).",
711
+ items: {
712
+ type: "object",
713
+ properties: {
714
+ color: { type: "string", description: "Paint colour #rrggbb." },
715
+ weight: { type: "number", minimum: 0, description: "Parts of this paint, any scale (e.g. 1 and 3 for a 1:3 mix). At least one weight must be above 0." },
716
+ strength: {
717
+ type: "number",
718
+ exclusiveMinimum: 0,
719
+ maximum: 100,
720
+ description: "Tinting strength (default 1): each part counts as this many, so a strong dark paint (e.g. 4) tints a lot of white."
721
+ }
722
+ },
723
+ required: ["color", "weight"],
724
+ additionalProperties: false
725
+ }
726
+ }
727
+ },
728
+ required: ["colors"],
729
+ additionalProperties: false
730
+ },
731
+ annotations: { title: "Mix colours like paint", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
732
+ handler: (args) => {
733
+ const items = args.colors;
734
+ const rgbs = items.map((item, i) => parseHex(item.color, i));
735
+ const total = items.reduce((sum, item) => sum + item.weight, 0);
736
+ if (!(total > 0)) throw new Error("Every weight is 0; give at least one colour a weight above 0.");
737
+ const pigments = rgbs.map((rgb, i) => createPigment(rgb, { strength: items[i].strength }));
738
+ const mixed = mixPigments(pigments, items.map((item) => item.weight));
739
+ const lerp = [0, 1, 2].map((c) => rgbs.reduce((sum, rgb, i) => sum + rgb[c] * items[i].weight, 0) / total);
740
+ return {
741
+ mixed: toHex(mixed),
742
+ rgbLerp: toHex(lerp),
743
+ weights: items.map((item) => item.weight / total),
744
+ model: "kubelka-munk"
745
+ };
746
+ }
747
+ };
748
+ return [mixColors];
749
+ }
750
+
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+
762
+
398
763
 
399
764
 
400
765
 
@@ -412,5 +777,5 @@ function coverageTileCoord(key) {
412
777
 
413
778
 
414
779
 
415
- exports.DEFAULT_BRUSH = DEFAULT_BRUSH; exports.MAX_BRUSH_SIZE = MAX_BRUSH_SIZE; exports.normalizeBrush = normalizeBrush; exports.tipShape = tipShape; exports.tipFalloff = tipFalloff; exports.tipReach = tipReach; exports.dabCoverage = dabCoverage; exports.smoothPoints = smoothPoints; exports.DabWalker = DabWalker; exports.walkDabs = walkDabs; exports.dabRect = dabRect; exports.rasterizeDab = rasterizeDab; exports.CoverageMap = CoverageMap; exports.StrokeCoverage = StrokeCoverage; exports.applyStrokeToTile = applyStrokeToTile; exports.coverageTileCoord = coverageTileCoord;
416
- //# sourceMappingURL=chunk-PDCITYBT.cjs.map
780
+ exports.DEFAULT_BRUSH = DEFAULT_BRUSH; exports.MAX_BRUSH_SIZE = MAX_BRUSH_SIZE; exports.normalizeBrush = normalizeBrush; exports.tipShape = tipShape; exports.tipFalloff = tipFalloff; exports.tipReach = tipReach; exports.dabCoverage = dabCoverage; exports.smoothPoints = smoothPoints; exports.DabWalker = DabWalker; exports.walkDabs = walkDabs; exports.dabRect = dabRect; exports.rasterizeDab = rasterizeDab; exports.CoverageMap = CoverageMap; exports.StrokeCoverage = StrokeCoverage; exports.applyStrokeToTile = applyStrokeToTile; exports.coverageTileCoord = coverageTileCoord; exports.PIGMENT_BANDS = PIGMENT_BANDS; exports.PIGMENT_LAMBDA_MIN = PIGMENT_LAMBDA_MIN; exports.PIGMENT_LAMBDA_STEP = PIGMENT_LAMBDA_STEP; exports.PIGMENT_WAVELENGTHS = PIGMENT_WAVELENGTHS; exports.rgbToReflectance = rgbToReflectance; exports.reflectanceToRgb = reflectanceToRgb; exports.createPigment = createPigment; exports.setPigmentColor = setPigmentColor; exports.mixPigments = mixPigments; exports.lerpPigment = lerpPigment; exports.lerpPigmentInto = lerpPigmentInto; exports.createPigmentTools = createPigmentTools;
781
+ //# sourceMappingURL=chunk-4F3YDIWW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-4F3YDIWW.cjs","../src/paint/brush.ts","../src/paint/pigment.ts","../src/paint/pigment-tools.ts"],"names":["weights"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-4F3YDIWW.cjs","sourcesContent":[null,"// Portions ported from photocraft/crates/paint/src/lib.rs, dynamics.rs and render.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * The brush engine (a subset of photocraft's `crates/paint`): a computed round tip with size,\n * hardness, angle, roundness and spacing; pressure to size and opacity; smoothing; and Photoshop's\n * opacity-versus-flow build-up. Strokes are data, so one replays the same way for undo, agents\n * and tests.\n *\n * - Points are walked into dabs at `spacing × diameter` (`walkDabs`).\n * - Each dab's coverage (`dabCoverage`, photocraft's measured Photoshop profile) builds up in a\n * stroke coverage map with flow towards the dab's opacity ceiling: `c ← c + v·(ceil − c)`.\n * - The stroke composites once at the stroke opacity over the layer as it was before the stroke,\n * so overlapping dabs never exceed the opacity.\n */\n\nimport { blendPixel, type BlendMode } from '../raster/blend';\nimport type { RasterRect as CropBox } from '../raster/surface';\nimport { TILE, tileKey, tileCoord, type TileKey } from '../raster/surface';\n\n/** One input sample. Missing pressure is a mouse (1). */\nexport interface StrokePoint {\n x: number;\n y: number;\n /** 0..1 (default 1). */\n pressure?: number;\n /** Milliseconds (optional; kept for replays). */\n t?: number;\n}\n\nexport interface BrushSettings {\n /** Diameter in pixels (1..2500, default 20). */\n size: number;\n /** 0 (soft) .. 1 (hard, default). */\n hardness: number;\n /** Dab spacing as a fraction of the diameter (0.01..10, default 0.1). */\n spacing: number;\n /** Tip angle in degrees (default 0). */\n angle: number;\n /** Tip roundness 0.01..1 (default 1). */\n roundness: number;\n /** Stroke opacity ceiling 0..1 (default 1). */\n opacity: number;\n /** Build-up per dab 0..1 (default 1). */\n flow: number;\n /** Input smoothing 0..0.95 (default 0). */\n smoothing: number;\n /** Pressure controls size (default true). */\n pressureSize: boolean;\n /** Pressure controls opacity (default false). */\n pressureOpacity: boolean;\n /** How the stroke paints onto the layer (default normal). */\n blend: BlendMode;\n}\n\nexport const DEFAULT_BRUSH: Readonly<BrushSettings> = {\n size: 20,\n hardness: 1,\n spacing: 0.1,\n angle: 0,\n roundness: 1,\n opacity: 1,\n flow: 1,\n smoothing: 0,\n pressureSize: true,\n pressureOpacity: false,\n blend: 'normal',\n};\n\nexport const MAX_BRUSH_SIZE = 2500;\n\n/** A brush with every field in range (missing fields from `DEFAULT_BRUSH`). */\nexport function normalizeBrush(raw: Partial<BrushSettings> = {}): BrushSettings {\n const num = (v: unknown, lo: number, hi: number, d: number) => (typeof v === 'number' && Number.isFinite(v) ? Math.min(hi, Math.max(lo, v)) : d);\n return {\n size: num(raw.size, 1, MAX_BRUSH_SIZE, DEFAULT_BRUSH.size),\n hardness: num(raw.hardness, 0, 1, DEFAULT_BRUSH.hardness),\n spacing: num(raw.spacing, 0.01, 10, DEFAULT_BRUSH.spacing),\n angle: num(raw.angle, -360, 360, DEFAULT_BRUSH.angle),\n roundness: num(raw.roundness, 0.01, 1, DEFAULT_BRUSH.roundness),\n opacity: num(raw.opacity, 0, 1, DEFAULT_BRUSH.opacity),\n flow: num(raw.flow, 0, 1, DEFAULT_BRUSH.flow),\n smoothing: num(raw.smoothing, 0, 0.95, DEFAULT_BRUSH.smoothing),\n pressureSize: typeof raw.pressureSize === 'boolean' ? raw.pressureSize : DEFAULT_BRUSH.pressureSize,\n pressureOpacity: typeof raw.pressureOpacity === 'boolean' ? raw.pressureOpacity : DEFAULT_BRUSH.pressureOpacity,\n blend: raw.blend ?? 'normal',\n };\n}\n\n// ---------------------------------------------------------------------------\n// The round tip (photocraft's measured Photoshop profile)\n// ---------------------------------------------------------------------------\n\n/**\n * Photoshop's round tip, measured by photocraft: a solid core of radius `r0 · R`, then a Gaussian\n * shoulder `exp(-((d − r0) / s)²)` of width `s · R`, both by hardness (0, 0.1, … 1).\n */\nconst TIP_SHAPE: ReadonlyArray<[number, number]> = [\n [0.0, 0.664], [0.14, 0.58], [0.28, 0.5], [0.4, 0.44], [0.52, 0.36], [0.63, 0.29],\n [0.7, 0.24], [0.78, 0.19], [0.84, 0.15], [0.89, 0.11], [1.0, 0.0],\n];\n/** The anti-aliased edge: the shoulder never narrows below this many pixels. */\nconst TIP_EDGE_PX = 1.2;\nconst SMALL_TIP_RADIUS = 3;\nconst SUBPIXEL = [-0.375, -0.125, 0.125, 0.375];\n\n/** The core radius and shoulder width (pixels) of a round tip of `radius` and `hardness`. */\nexport function tipShape(radius: number, hardness: number): [number, number] {\n const h = (Number.isNaN(hardness) ? 0 : Math.min(1, Math.max(0, hardness))) * 10;\n const i = Math.min(9, Math.floor(h));\n const t = h - i;\n const a = TIP_SHAPE[i];\n const b = TIP_SHAPE[i + 1];\n const r0 = a[0] + (b[0] - a[0]) * t;\n const s = a[1] + (b[1] - a[1]) * t;\n const r = Number.isFinite(radius) ? Math.max(0, radius) : 0;\n const edge = Math.max(0.25, Math.min(TIP_EDGE_PX, 0.3 * r));\n return [Math.max(0, Math.min(r0 * r, r - edge)), Math.max(1e-3, s * r, edge)];\n}\n\n/** `exp(-u)` as `(1 − u/64)^64` by six squarings: exactly 0 from u = 64. */\nfunction softExp(u: number): number {\n let g = Math.min(1, Math.max(0, 1 - u / 64));\n for (let k = 0; k < 6; k++) g *= g;\n return g;\n}\n\n/** Opacity of a round tip at distance `d` from its centre. */\nexport function tipFalloff(d: number, radius: number, hardness: number): number {\n const [r0, s] = tipShape(radius, hardness);\n if (d <= r0) return 1;\n const x = (d - r0) / s;\n return softExp(x * x);\n}\n\n/** How far from its centre a round tip still paints. */\nexport function tipReach(radius: number, hardness: number): number {\n const [r0, s] = tipShape(radius, hardness);\n return r0 + 2.6 * s;\n}\n\n/** Coverage of a round dab at distance `d` from its centre. */\nexport function dabCoverage(d: number, radius: number, hardness: number): number {\n if (Number.isNaN(d) || d >= tipReach(radius, hardness) + 0.5) return 0;\n return tipFalloff(d, radius, hardness);\n}\n\n// ---------------------------------------------------------------------------\n// Points → dabs\n// ---------------------------------------------------------------------------\n\nexport interface Dab {\n x: number;\n y: number;\n radius: number;\n /** Flow (per-dab build-up). */\n alpha: number;\n /** Opacity ceiling this dab builds up to. */\n opacity: number;\n /** Radians. */\n angle: number;\n roundness: number;\n}\n\n/** Exponential smoothing of input points; the first and last point are kept. */\nexport function smoothPoints(points: readonly StrokePoint[], amount: number): StrokePoint[] {\n const a = 1 - Math.min(0.95, Math.max(0, amount));\n if (a >= 1 || points.length < 3) return points.slice();\n const out: StrokePoint[] = [];\n let cur: StrokePoint | null = null;\n for (const p of points) {\n const n: StrokePoint = cur ? { ...p, x: cur.x + (p.x - cur.x) * a, y: cur.y + (p.y - cur.y) * a } : p;\n out.push(n);\n cur = n;\n }\n out[out.length - 1] = points[points.length - 1];\n return out;\n}\n\nconst pressureOf = (p: StrokePoint) => (typeof p.pressure === 'number' && Number.isFinite(p.pressure) ? Math.min(1, Math.max(0, p.pressure)) : 1);\n\n/**\n * Walks points into dabs (incrementally: feed points in any chunks and get the same dabs). The\n * first point is a dab; then one every `spacing × diameter` along the path.\n */\nexport class DabWalker {\n private last: StrokePoint | null = null;\n private nextAt = 0;\n private pendingFirst: StrokePoint | null = null;\n\n constructor(readonly brush: BrushSettings) {}\n\n private diameter(p: StrokePoint): number {\n return this.brush.pressureSize ? this.brush.size * pressureOf(p) : this.brush.size;\n }\n\n private stepLen(p: StrokePoint): number {\n return Math.max(0.5, Math.max(1, this.diameter(p)) * Math.max(0.01, this.brush.spacing));\n }\n\n private dab(p: StrokePoint): Dab {\n const b = this.brush;\n return {\n x: p.x,\n y: p.y,\n radius: Math.max(0.5, this.diameter(p) / 2),\n alpha: Math.min(1, Math.max(0, b.flow)),\n opacity: b.pressureOpacity ? pressureOf(p) : 1,\n angle: (b.angle * Math.PI) / 180,\n roundness: Math.min(1, Math.max(0.01, b.roundness)),\n };\n }\n\n push(p: StrokePoint, out: Dab[]): void {\n const a = this.last;\n if (!a) {\n this.last = p;\n this.pendingFirst = p;\n this.nextAt = this.stepLen(p);\n return;\n }\n if (this.pendingFirst) {\n out.push(this.dab(this.pendingFirst));\n this.pendingFirst = null;\n }\n const dx = p.x - a.x;\n const dy = p.y - a.y;\n const len = Math.hypot(dx, dy);\n if (len > 1e-9) {\n while (this.nextAt <= len + 1e-9) {\n const f = Math.min(1, this.nextAt / len);\n const q: StrokePoint = {\n x: a.x + dx * f,\n y: a.y + dy * f,\n pressure: pressureOf(a) + (pressureOf(p) - pressureOf(a)) * f,\n };\n out.push(this.dab(q));\n this.nextAt += this.stepLen(q);\n }\n this.nextAt -= len;\n }\n this.last = p;\n }\n\n finish(out: Dab[]): void {\n if (this.pendingFirst) {\n out.push(this.dab(this.pendingFirst));\n this.pendingFirst = null;\n }\n }\n}\n\n/** All dabs of a point list (smoothing applied). */\nexport function walkDabs(points: readonly StrokePoint[], brush: BrushSettings): Dab[] {\n const w = new DabWalker(brush);\n const out: Dab[] = [];\n for (const p of smoothPoints(points, brush.smoothing)) w.push(p, out);\n w.finish(out);\n return out;\n}\n\n/** The pixel rectangle a dab can touch. */\nexport function dabRect(d: Dab, hardness: number): CropBox {\n // As `rasterizeDab`: the tip reaches `reach` across its minor axis and `reach / roundness` along it.\n const ro = Math.min(1, Math.max(0.5 / d.radius, d.roundness));\n const rm = Math.max(0.5, d.radius * ro);\n const r = Math.max(rm, tipReach(rm, hardness)) / ro + 1.5;\n const x0 = Math.floor(d.x - r);\n const y0 = Math.floor(d.y - r);\n return { x: x0, y: y0, width: Math.ceil(d.x + r) - x0, height: Math.ceil(d.y + r) - y0 };\n}\n\n/**\n * Rasterizes one dab over `rect` into `out` (rect.width × rect.height values, coverage × flow).\n * Small tips (radius below 3 px) take each pixel's covered area from a 4×4 grid.\n */\nexport function rasterizeDab(d: Dab, hardness: number, rect: CropBox, out: Float32Array): void {\n const w = rect.width;\n const h = rect.height;\n out.fill(0, 0, w * h);\n const r = d.radius;\n const ro = Math.min(1, Math.max(0.5 / r, d.roundness));\n const rm = Math.max(0.5, r * ro);\n const reach = Math.max(rm, tipReach(rm, hardness));\n const sn = Math.sin(d.angle);\n const cs = Math.cos(d.angle);\n const toTip = (dx: number, dy: number): [number, number] => {\n const ux = dx;\n const uy = -dy;\n return [ux * cs + uy * sn, -ux * sn + uy * cs];\n };\n const small = rm < SMALL_TIP_RADIUS;\n const reach2 = (reach + (small ? 0.75 : 0.5)) ** 2;\n for (let yy = 0; yy < h; yy++) {\n const dy = rect.y + yy + 0.5 - d.y;\n for (let xx = 0; xx < w; xx++) {\n const dx = rect.x + xx + 0.5 - d.x;\n const [u, v] = toTip(dx, dy);\n const d2 = (u * ro) ** 2 + v * v;\n if (d2 >= reach2) continue;\n let val: number;\n if (small) {\n let sum = 0;\n for (const sy of SUBPIXEL) {\n for (const sx of SUBPIXEL) {\n const [su, sv] = toTip(dx + sx, dy + sy);\n sum += tipFalloff(Math.sqrt((su * ro) ** 2 + sv * sv), rm, hardness);\n }\n }\n val = sum / 16;\n } else {\n val = dabCoverage(Math.sqrt(d2), rm, hardness);\n }\n if (val > 0) out[yy * w + xx] = val * d.alpha;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stroke coverage\n// ---------------------------------------------------------------------------\n\nconst TILE_PIXELS = TILE * TILE;\n\n/** A stroke's accumulated coverage, in 256 px tiles over document space. */\nexport class CoverageMap {\n readonly tiles = new Map<TileKey, Float32Array>();\n bounds: CropBox | null = null;\n private dirty = new Set<TileKey>();\n\n get(x: number, y: number): number {\n const tx = Math.floor(x / TILE);\n const ty = Math.floor(y / TILE);\n const t = this.tiles.get(tileKey(tx, ty));\n return t ? t[(y - ty * TILE) * TILE + (x - tx * TILE)] : 0;\n }\n\n /** Builds up `vals` (over `rect`) with flow towards `ceil`: `c ← c + v·(ceil − c)`. */\n accumulate(rect: CropBox, vals: Float32Array, ceil: number): void {\n if (rect.width <= 0 || rect.height <= 0) return;\n const w = rect.width;\n const tx0 = Math.floor(rect.x / TILE);\n const ty0 = Math.floor(rect.y / TILE);\n const tx1 = Math.floor((rect.x + rect.width - 1) / TILE);\n const ty1 = Math.floor((rect.y + rect.height - 1) / TILE);\n let touched = false;\n for (let ty = ty0; ty <= ty1; ty++) {\n for (let tx = tx0; tx <= tx1; tx++) {\n const x0 = Math.max(rect.x, tx * TILE);\n const y0 = Math.max(rect.y, ty * TILE);\n const x1 = Math.min(rect.x + rect.width, tx * TILE + TILE);\n const y1 = Math.min(rect.y + rect.height, ty * TILE + TILE);\n let tile: Float32Array | undefined;\n for (let y = y0; y < y1; y++) {\n const row = (y - rect.y) * w;\n const trow = (y - ty * TILE) * TILE;\n for (let x = x0; x < x1; x++) {\n const v = vals[row + (x - rect.x)];\n if (v <= 0) continue;\n if (!tile) {\n const key = tileKey(tx, ty);\n tile = this.tiles.get(key);\n if (!tile) {\n tile = new Float32Array(TILE_PIXELS);\n this.tiles.set(key, tile);\n }\n this.dirty.add(key);\n touched = true;\n }\n const ti = trow + (x - tx * TILE);\n const c = tile[ti];\n if (ceil > c) tile[ti] = c + v * (ceil - c);\n }\n }\n }\n }\n if (touched) this.bounds = unionRect(this.bounds, rect);\n }\n\n /** Tiles changed since the last call. */\n takeDirty(): TileKey[] {\n const out = [...this.dirty];\n this.dirty.clear();\n return out;\n }\n}\n\nfunction unionRect(a: CropBox | null, b: CropBox): CropBox {\n if (!a) return { ...b };\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.max(a.x + a.width, b.x + b.width) - x, height: Math.max(a.y + a.height, b.y + b.height) - y };\n}\n\n/** Paints a stroke's dabs into a coverage map, incrementally. */\nexport class StrokeCoverage {\n readonly coverage = new CoverageMap();\n private walker: DabWalker;\n private smoothing: number;\n private smoothPos: StrokePoint | null = null;\n private buf = new Float32Array(0);\n dabCount = 0;\n\n constructor(readonly brush: BrushSettings) {\n this.walker = new DabWalker(brush);\n this.smoothing = brush.smoothing;\n }\n\n /** Feeds input points; returns the document rectangles the new dabs touched. */\n push(points: readonly StrokePoint[]): CropBox[] {\n const dabs: Dab[] = [];\n for (const p of points) this.walker.push(this.smooth(p), dabs);\n return this.paint(dabs);\n }\n\n /** Ends the stroke (a single click still paints one dab). */\n finish(last?: StrokePoint): CropBox[] {\n const dabs: Dab[] = [];\n if (last && this.smoothPos && (this.smoothPos.x !== last.x || this.smoothPos.y !== last.y)) this.walker.push(last, dabs);\n this.walker.finish(dabs);\n return this.paint(dabs);\n }\n\n private smooth(p: StrokePoint): StrokePoint {\n const a = 1 - Math.min(0.95, Math.max(0, this.smoothing));\n const cur = this.smoothPos;\n const n = cur && a < 1 ? { ...p, x: cur.x + (p.x - cur.x) * a, y: cur.y + (p.y - cur.y) * a } : p;\n this.smoothPos = n;\n return n;\n }\n\n private paint(dabs: Dab[]): CropBox[] {\n const rects: CropBox[] = [];\n for (const d of dabs) {\n const rect = dabRect(d, this.brush.hardness);\n const n = rect.width * rect.height;\n if (this.buf.length < n) this.buf = new Float32Array(n);\n const vals = this.buf.subarray(0, n);\n rasterizeDab(d, this.brush.hardness, rect, vals);\n this.coverage.accumulate(rect, vals, d.opacity);\n rects.push(rect);\n this.dabCount++;\n }\n return rects;\n }\n}\n\n/** How a stroke changes pixels. */\nexport interface StrokeApply {\n /** `paint` puts colour down; `erase` removes alpha (or, with transparency locked, paints `background`). */\n mode: 'paint' | 'erase';\n /** RGBA 0..255 (paint colour, or the mask grey in `r`). */\n color: readonly [number, number, number, number];\n /** RGBA 0..255 the eraser paints on a transparency-locked layer (and on masks). */\n background: readonly [number, number, number, number];\n opacity: number;\n blend: BlendMode;\n lockTransparency: boolean;\n /** Selection coverage (document space, canvas-sized), or `null`. */\n selection: { width: number; height: number; data: ArrayLike<number> } | null;\n /** Layer offset (target pixels are in layer space). */\n offset: { x: number; y: number };\n}\n\n/**\n * Composites the stroke's coverage over `tileData` (the target's tile (tx, ty) as it was before\n * the stroke, in layer space; RGBA or one byte for masks) and returns the new tile data. With\n * `into` (the tile's previous result) and `region` (document space), only `region` is recomputed\n * and the rest of `into` is kept.\n */\nexport function applyStrokeToTile(\n coverage: CoverageMap,\n tileData: Uint8ClampedArray,\n channels: 1 | 4,\n tx: number,\n ty: number,\n s: StrokeApply,\n options: { into?: Uint8ClampedArray; region?: CropBox } = {}\n): Uint8ClampedArray {\n const out = options.into ? new Uint8ClampedArray(options.into) : new Uint8ClampedArray(tileData);\n const ox = tx * TILE + s.offset.x;\n const oy = ty * TILE + s.offset.y;\n let x0 = 0;\n let y0 = 0;\n let x1 = TILE;\n let y1 = TILE;\n if (options.region) {\n const r = options.region;\n x0 = Math.max(0, Math.floor(r.x) - ox);\n y0 = Math.max(0, Math.floor(r.y) - oy);\n x1 = Math.min(TILE, Math.ceil(r.x + r.width) - ox);\n y1 = Math.min(TILE, Math.ceil(r.y + r.height) - oy);\n if (x1 <= x0 || y1 <= y0) return out;\n // Start the region from the pre-stroke pixels: coverage is cumulative.\n if (options.into) {\n for (let y = y0; y < y1; y++) out.set(tileData.subarray((y * TILE + x0) * channels, (y * TILE + x1) * channels), (y * TILE + x0) * channels);\n }\n }\n const sel = s.selection;\n const cb = [0, 0, 0, 0];\n const cs = [s.color[0] / 255, s.color[1] / 255, s.color[2] / 255, s.color[3] / 255];\n const bg = [s.background[0] / 255, s.background[1] / 255, s.background[2] / 255, s.background[3] / 255];\n // With a tile-aligned offset the layer tile is one coverage tile: read it directly.\n const aligned = s.offset.x % TILE === 0 && s.offset.y % TILE === 0;\n const covTile = aligned ? coverage.tiles.get(tileKey(Math.floor(ox / TILE), Math.floor(oy / TILE))) : undefined;\n if (aligned && !covTile) return out;\n for (let y = y0; y < y1; y++) {\n const dy = oy + y;\n for (let x = x0; x < x1; x++) {\n const dx = ox + x;\n const c = covTile ? covTile[y * TILE + x] : coverage.get(dx, dy);\n if (c <= 0) continue;\n let k = c * s.opacity;\n if (sel) {\n if (dx < 0 || dy < 0 || dx >= sel.width || dy >= sel.height) continue;\n k *= sel.data[dy * sel.width + dx] / 255;\n }\n if (k > 1) k = 1;\n if (k <= 0) continue;\n const p = y * TILE + x;\n if (channels === 1) {\n const target = s.mode === 'erase' ? s.background[0] : s.color[0];\n out[p] = Math.round(out[p] + (target - out[p]) * k);\n continue;\n }\n const i = p * 4;\n if (s.mode === 'erase' && !s.lockTransparency) {\n out[i + 3] = Math.round(out[i + 3] * (1 - k));\n continue;\n }\n if (s.lockTransparency && out[i + 3] === 0) continue;\n const src = s.mode === 'erase' ? bg : cs;\n for (let ch = 0; ch < 4; ch++) cb[ch] = out[i + ch] / 255;\n const o = blendPixel(s.blend, cb, src, k);\n out[i] = Math.round(o[0] * 255);\n out[i + 1] = Math.round(o[1] * 255);\n out[i + 2] = Math.round(o[2] * 255);\n if (!s.lockTransparency) out[i + 3] = Math.round(o[3] * 255);\n }\n }\n return out;\n}\n\n/** Tile coordinates of coverage tile keys (for callers that track dirty tiles). */\nexport function coverageTileCoord(key: TileKey): { tx: number; ty: number } {\n return tileCoord(key);\n}\n","/**\n * Pigment-like colour mixing: blue and yellow make green, red and white make pink, as paint does.\n *\n * Each sRGB colour is lifted to a smooth reflectance spectrum, the spectra are mixed with the\n * Kubelka-Munk two-flux model, and the mixed spectrum is turned back into sRGB. Written from the\n * published literature; no third-party code or data:\n *\n * 1. **Spectral uplift.** A colour's reflectance is a sigmoid of a quadratic in wavelength,\n * `R(λ) = s(c₀λ² + c₁λ + c₂)` with `s(z) = ½ + z / 2√(1 + z²)` (Jakob & Hanika, \"A\n * Low-Dimensional Function Space for Efficient Spectral Upsampling\", Eurographics 2019). The\n * three coefficients are solved per colour with Newton's method so the spectrum reproduces the\n * colour. Spectra are precomputed lazily on a 17³ lattice over sRGB and interpolated\n * trilinearly in *linear* RGB: colour is linear in reflectance, so an interpolated spectrum\n * still reproduces its colour exactly while staying smooth and inside 0..1.\n * 2. **Mixing.** Each spectrum becomes `K/S = (1 − R)² / 2R` per band. Colours mix with the\n * two-constant form `K/S = Σ cᵢSᵢ(K/S)ᵢ / Σ cᵢSᵢ`, where `cᵢ` is the weight times the colour's\n * tinting strength and `Sᵢ` its scattering, taken from its luminance (light paints such as\n * titanium white scatter strongly, dark ones barely). Back to reflectance with\n * `R = 1 + K/S − √((K/S)² + 2·K/S)`.\n * 3. **Back to sRGB.** The spectrum is weighted by the CIE 1931 2° colour-matching functions\n * (the analytic multi-lobe fit of Wyman, Sloan & Shirley, JCGT 2013) under a 6504 K Planckian\n * illuminant, converted to linear sRGB and normalised so a perfect white reflector is exactly\n * white. Analytic curves keep the CIE's own (CC BY-SA) tables out of the package.\n *\n * Everything is plain TypeScript on typed arrays with no DOM: it runs in Node and Workers and is\n * deterministic. Colours are straight sRGB triples in 0..1, as in `@pixerate/editor/raster`.\n */\n\n/** An sRGB colour, each channel 0..1 (gamma-encoded, as in CSS). */\nexport type PigmentRgb = readonly [number, number, number];\n\n/** Number of spectral bands. */\nexport const PIGMENT_BANDS = 36;\n/** First band's wavelength in nm; bands are 10 nm apart (380..730 nm). */\nexport const PIGMENT_LAMBDA_MIN = 380;\nexport const PIGMENT_LAMBDA_STEP = 10;\n\n/** Band centre wavelengths in nm. */\nexport const PIGMENT_WAVELENGTHS: Float32Array = Float32Array.from({ length: PIGMENT_BANDS }, (_, i) => PIGMENT_LAMBDA_MIN + i * PIGMENT_LAMBDA_STEP);\n\nconst N = PIGMENT_BANDS;\n/** Lattice nodes per axis of the spectrum table. */\nconst LUT_NODES = 17;\n/** Reflectance floor for K/S, so a black's K/S stays finite (≈ 5000). */\nconst R_MIN = 1e-4;\n/** Scattering floor, so a black still counts in a mix. */\nconst SCATTER_MIN = 0.01;\n\n// ---------------------------------------------------------------------------\n// sRGB\n// ---------------------------------------------------------------------------\n\nfunction toLinear(v: number): number {\n return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n}\n\nfunction toEncoded(v: number): number {\n if (!(v > 0)) return 0;\n if (v >= 1) return 1;\n return v <= 0.0031308 ? 12.92 * v : 1.055 * Math.pow(v, 1 / 2.4) - 0.055;\n}\n\nfunction clamp01(v: number): number {\n return v > 0 ? (v < 1 ? v : 1) : 0;\n}\n\n// ---------------------------------------------------------------------------\n// Reflectance → linear sRGB weights\n// ---------------------------------------------------------------------------\n\n/** Asymmetric Gaussian lobe of the Wyman et al. fit. */\nfunction lobe(l: number, mu: number, s1: number, s2: number): number {\n const t = (l - mu) / (l < mu ? s1 : s2);\n return Math.exp(-0.5 * t * t);\n}\n\n/** Relative spectral power of a black body (Planck's law; the constant factor cancels). */\nfunction planck(nm: number, kelvin: number): number {\n const m = nm * 1e-9;\n return 1 / (m ** 5 * (Math.exp(1.438776877e-2 / (m * kelvin)) - 1));\n}\n\nlet weights: Float64Array | null = null;\n\n/**\n * Row-major 3 × N matrix taking a reflectance spectrum to linear sRGB. Each row sums to 1, so a\n * flat reflectance `r` gives the grey `(r, r, r)`.\n */\nfunction rgbWeights(): Float64Array {\n if (weights) return weights;\n const w = new Float64Array(3 * N);\n // XYZ (D65 white) → linear sRGB, IEC 61966-2-1.\n const m = [3.2404542, -1.5371385, -0.4985314, -0.969266, 1.8760108, 0.041556, 0.0556434, -0.2040259, 1.0572252];\n for (let b = 0; b < N; b++) {\n const l = PIGMENT_LAMBDA_MIN + b * PIGMENT_LAMBDA_STEP;\n const e = planck(l, 6504);\n const x = e * (1.056 * lobe(l, 599.8, 37.9, 31.0) + 0.362 * lobe(l, 442.0, 16.0, 26.7) - 0.065 * lobe(l, 501.1, 20.4, 26.2));\n const y = e * (0.821 * lobe(l, 568.8, 46.9, 40.5) + 0.286 * lobe(l, 530.9, 16.3, 31.1));\n const z = e * (1.217 * lobe(l, 437.0, 11.8, 36.0) + 0.681 * lobe(l, 459.0, 26.0, 13.8));\n for (let c = 0; c < 3; c++) w[c * N + b] = m[c * 3] * x + m[c * 3 + 1] * y + m[c * 3 + 2] * z;\n }\n for (let c = 0; c < 3; c++) {\n let sum = 0;\n for (let b = 0; b < N; b++) sum += w[c * N + b];\n for (let b = 0; b < N; b++) w[c * N + b] /= sum;\n }\n return (weights = w);\n}\n\n// ---------------------------------------------------------------------------\n// Sigmoid-polynomial uplift\n// ---------------------------------------------------------------------------\n\n/**\n * Solves the sigmoid-polynomial coefficients whose spectrum has the linear sRGB colour\n * `(r, g, b)`, starting from `coeffs` (updated in place). Wavelength is normalised to 0..1 over\n * the bands. Damped Newton: a step is halved until the residual drops.\n */\nfunction fitCoefficients(r: number, g: number, b: number, coeffs: Float64Array): number {\n const w = rgbWeights();\n const target = [r, g, b];\n const res = new Float64Array(3);\n const jac = new Float64Array(9);\n const trial = new Float64Array(3);\n let err = residual(coeffs, target, w, res, jac);\n for (let it = 0; it < 60 && err > 1e-10; it++) {\n const step = solve3(jac, res);\n if (!step) break;\n let scale = 1;\n let next = Infinity;\n for (let k = 0; k < 12; k++) {\n for (let i = 0; i < 3; i++) trial[i] = coeffs[i] - scale * step[i];\n next = residual(trial, target, w, null, null);\n if (next < err) break;\n scale *= 0.5;\n }\n if (!(next < err)) break;\n coeffs.set(trial);\n err = residual(coeffs, target, w, res, jac);\n }\n return err;\n}\n\n/** Squared colour error of a coefficient set; fills the residual and Jacobian when asked. */\nfunction residual(c: Float64Array, target: number[], w: Float64Array, res: Float64Array | null, jac: Float64Array | null): number {\n let r0 = -target[0];\n let r1 = -target[1];\n let r2 = -target[2];\n if (jac) jac.fill(0);\n for (let b = 0; b < N; b++) {\n const x = b / (N - 1);\n const z = (c[0] * x + c[1]) * x + c[2];\n const q = 1 + z * z;\n const sq = Math.sqrt(q);\n const s = 0.5 + z / (2 * sq);\n r0 += w[b] * s;\n r1 += w[N + b] * s;\n r2 += w[2 * N + b] * s;\n if (jac) {\n const ds = 1 / (2 * q * sq);\n for (let k = 0; k < 3; k++) {\n const wd = w[k * N + b] * ds;\n jac[k * 3] += wd * x * x;\n jac[k * 3 + 1] += wd * x;\n jac[k * 3 + 2] += wd;\n }\n }\n }\n if (res) {\n res[0] = r0;\n res[1] = r1;\n res[2] = r2;\n }\n return r0 * r0 + r1 * r1 + r2 * r2;\n}\n\n/** Solves the 3 × 3 system `a·x = v` (Cramer's rule), or null when singular. */\nfunction solve3(a: Float64Array, v: Float64Array): number[] | null {\n const [a0, a1, a2, a3, a4, a5, a6, a7, a8] = a;\n const c0 = a4 * a8 - a5 * a7;\n const c1 = a5 * a6 - a3 * a8;\n const c2 = a3 * a7 - a4 * a6;\n const det = a0 * c0 + a1 * c1 + a2 * c2;\n if (!(Math.abs(det) > 1e-300)) return null;\n const [v0, v1, v2] = v;\n return [\n (v0 * c0 + a1 * (a5 * v2 - v1 * a8) + a2 * (v1 * a7 - a4 * v2)) / det,\n (a0 * (v1 * a8 - a5 * v2) + v0 * c1 + a2 * (a3 * v2 - v1 * a6)) / det,\n (a0 * (a4 * v2 - v1 * a7) + a1 * (v1 * a6 - a3 * v2) + v0 * c2) / det,\n ];\n}\n\nconst candidate = new Float64Array(3);\n\n/**\n * Fits a lattice node, starting from `coeffs` (its neighbour's solution). Where that stalls, as it\n * can next to very saturated or very dark nodes, it also tries a flat grey start and a dimming\n * continuation (solve the colour brighter, then dim it in small steps, each starting from the last,\n * as Jakob & Hanika do along their brightness axis), and keeps the closest fit.\n */\nfunction fitNode(r: number, g: number, b: number, coeffs: Float64Array): void {\n let best = fitCoefficients(r, g, b, coeffs);\n if (best <= 1e-12) return;\n candidate.fill(0);\n let err = fitCoefficients(r, g, b, candidate);\n if (err < best) {\n best = err;\n coeffs.set(candidate);\n }\n if (best <= 1e-12) return;\n const max = Math.max(r, g, b);\n if (!(max > 0) || max >= 0.5) return;\n candidate.fill(0);\n const steps = 32;\n for (let i = 0; i <= steps; i++) {\n const scale = (0.5 * Math.pow(max / 0.5, i / steps)) / max;\n err = fitCoefficients(r * scale, g * scale, b * scale, candidate);\n }\n if (err < best) coeffs.set(candidate);\n}\n\nfunction sigmoidSpectrum(c: Float64Array, out: Float32Array, offset: number): void {\n for (let b = 0; b < N; b++) {\n const x = b / (N - 1);\n const z = (c[0] * x + c[1]) * x + c[2];\n out[offset + b] = 0.5 + z / (2 * Math.sqrt(1 + z * z));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Spectrum table\n// ---------------------------------------------------------------------------\n\n/** Linear value of each lattice node: evenly spaced in encoded sRGB, so darks get more nodes. */\nconst NODES: Float64Array = Float64Array.from({ length: LUT_NODES }, (_, i) => toLinear(i / (LUT_NODES - 1)));\nlet table: Float32Array | null = null;\n\n/**\n * The spectrum of every lattice node, `[(r·n + g)·n + b]·N`, solved on first use (a few tens of\n * milliseconds). Each node starts from its neighbour's solution, so Newton converges in a few\n * steps.\n */\nfunction spectrumTable(): Float32Array {\n if (table) return table;\n const n = LUT_NODES;\n const t = new Float32Array(n * n * n * N);\n const row = new Float64Array(3);\n const coeffs = new Float64Array(3);\n for (let r = 0; r < n; r++) {\n for (let g = 0; g < n; g++) {\n // Warm start each row from the first node of the previous row.\n coeffs.set(row);\n for (let b = 0; b < n; b++) {\n fitNode(NODES[r], NODES[g], NODES[b], coeffs);\n if (b === 0) row.set(coeffs);\n sigmoidSpectrum(coeffs, t, ((r * n + g) * n + b) * N);\n }\n }\n }\n return (table = t);\n}\n\n/** Lattice cell, fraction and linear value per channel from the last `locate` calls. */\nconst cell = new Int32Array(3);\nconst frac = new Float64Array(3);\nconst linear = new Float64Array(3);\n\n/** Finds an encoded channel's lattice cell; the fraction is linear in linear RGB. */\nfunction locate(channel: number, encoded: number): void {\n const v = clamp01(encoded);\n const i = Math.min(LUT_NODES - 2, Math.floor(v * (LUT_NODES - 1)));\n const lo = NODES[i];\n const lin = toLinear(v);\n const f = (lin - lo) / (NODES[i + 1] - lo);\n cell[channel] = i;\n frac[channel] = f < 0 ? 0 : f > 1 ? 1 : f;\n linear[channel] = lin;\n}\n\n/**\n * The smooth reflectance spectrum (0..1 per band, `PIGMENT_BANDS` bands from 380 nm in 10 nm\n * steps) of an sRGB colour. `reflectanceToRgb` of the result gives the colour back.\n */\nexport function rgbToReflectance(r: number, g: number, b: number, out: Float32Array = new Float32Array(N)): Float32Array {\n const t = spectrumTable();\n const n = LUT_NODES;\n locate(0, r);\n locate(1, g);\n locate(2, b);\n const [ri, gi, bi] = cell;\n const [rf, gf, bf] = frac;\n out.fill(0);\n for (let corner = 0; corner < 8; corner++) {\n const dr = corner >> 2;\n const dg = (corner >> 1) & 1;\n const db = corner & 1;\n const weight = (dr ? rf : 1 - rf) * (dg ? gf : 1 - gf) * (db ? bf : 1 - bf);\n if (weight === 0) continue;\n const base = (((ri + dr) * n + gi + dg) * n + bi + db) * N;\n for (let k = 0; k < N; k++) out[k] += weight * t[base + k];\n }\n return out;\n}\n\n/** The sRGB colour (0..1, clipped to the gamut) of a reflectance spectrum. */\nexport function reflectanceToRgb(reflectance: ArrayLike<number>, out: number[] = [0, 0, 0]): number[] {\n const w = rgbWeights();\n let r = 0;\n let g = 0;\n let b = 0;\n for (let k = 0; k < N; k++) {\n const v = reflectance[k];\n r += w[k] * v;\n g += w[N + k] * v;\n b += w[2 * N + k] * v;\n }\n out[0] = toEncoded(r);\n out[1] = toEncoded(g);\n out[2] = toEncoded(b);\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Pigments and mixing\n// ---------------------------------------------------------------------------\n\n/**\n * A colour prepared for mixing: its K/S spectrum and its weight in a mix. Make one per brush or\n * palette colour with `createPigment` and reuse it (`setPigmentColor`) on hot paths.\n */\nexport interface Pigment {\n /** The sRGB colour it was made from (0..1). */\n readonly rgb: [number, number, number];\n /** Tinting strength (default 1): how strongly it colours a mix, relative to its weight. */\n strength: number;\n /** K/S per band. */\n readonly ks: Float32Array;\n /** Scattering from the colour's luminance (floored), before strength. */\n scatter: number;\n}\n\nexport interface PigmentOptions {\n /**\n * Tinting strength, > 0 (default 1). A strength of 4 counts each part as four, so a little of\n * a strong dark pigment tints a lot of white. A colour mixed only with itself is unchanged\n * whatever its strength.\n */\n strength?: number;\n}\n\nconst spectrumScratch = new Float32Array(N);\n\n/** Prepares a colour for mixing. */\nexport function createPigment(color: PigmentRgb, options: PigmentOptions = {}): Pigment {\n const pigment: Pigment = { rgb: [0, 0, 0], strength: 1, ks: new Float32Array(N), scatter: 1 };\n return setPigmentColor(pigment, color[0], color[1], color[2], options.strength);\n}\n\n/** Re-targets a pigment to another colour without allocating (the per-pixel fast path). */\nexport function setPigmentColor(pigment: Pigment, r: number, g: number, b: number, strength = pigment.strength): Pigment {\n const R = rgbToReflectance(r, g, b, spectrumScratch);\n const ks = pigment.ks;\n for (let k = 0; k < N; k++) {\n const v = R[k] > R_MIN ? R[k] : R_MIN;\n ks[k] = ((1 - v) * (1 - v)) / (2 * v);\n }\n pigment.rgb[0] = clamp01(r);\n pigment.rgb[1] = clamp01(g);\n pigment.rgb[2] = clamp01(b);\n pigment.strength = Number.isFinite(strength) && strength > 0 ? strength : 1;\n // `rgbToReflectance` left each channel's linear value in `linear`.\n const y = 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2];\n pigment.scatter = y > SCATTER_MIN ? y : SCATTER_MIN;\n return pigment;\n}\n\n/** Mixed K/S → reflectance → sRGB, written to `out[offset..offset + 2]`. */\nfunction ksToRgb(ks: Float32Array | Float64Array, out: { [i: number]: number }, offset: number): void {\n const w = rgbWeights();\n let r = 0;\n let g = 0;\n let b = 0;\n for (let k = 0; k < N; k++) {\n const q = ks[k];\n const v = 1 + q - Math.sqrt(q * q + 2 * q);\n r += w[k] * v;\n g += w[N + k] * v;\n b += w[2 * N + k] * v;\n }\n out[offset] = toEncoded(r);\n out[offset + 1] = toEncoded(g);\n out[offset + 2] = toEncoded(b);\n}\n\nconst mixScratch = new Float64Array(N);\n\n/**\n * Mixes colours like paint. `weights` are parts by amount (any non-negative scale; at least one\n * positive). Colours may be sRGB triples (0..1) or prepared pigments (which carry a tinting\n * strength). Returns the mixed sRGB colour (0..1).\n */\nexport function mixPigments(colors: readonly (PigmentRgb | Pigment)[], weights: readonly number[]): [number, number, number] {\n if (colors.length === 0) throw new Error('mixPigments needs at least one colour.');\n if (weights.length !== colors.length) throw new Error(`mixPigments got ${colors.length} colours but ${weights.length} weights; pass one weight per colour.`);\n const pigments = colors.map((c) => ('ks' in c ? c : createPigment(c)));\n let total = 0;\n for (let i = 0; i < pigments.length; i++) {\n const w = weights[i];\n if (!(Number.isFinite(w) && w >= 0)) throw new Error(`Weight ${i} is ${w}; weights must be finite and ≥ 0.`);\n total += w * pigments[i].strength * pigments[i].scatter;\n }\n if (!(total > 0)) throw new Error('mixPigments needs at least one positive weight.');\n mixScratch.fill(0);\n for (let i = 0; i < pigments.length; i++) {\n const p = pigments[i];\n const c = (weights[i] * p.strength * p.scatter) / total;\n if (c === 0) continue;\n for (let k = 0; k < N; k++) mixScratch[k] += c * p.ks[k];\n }\n const out: [number, number, number] = [0, 0, 0];\n ksToRgb(mixScratch, out, 0);\n return out;\n}\n\n/** Mixes `a` towards `b` like paint: `t = 0` is `a`, `t = 1` is `b`. */\nexport function lerpPigment(a: PigmentRgb | Pigment, b: PigmentRgb | Pigment, t: number): [number, number, number] {\n const u = clamp01(t);\n return mixPigments([a, b], [1 - u, u]);\n}\n\n/**\n * The per-dab fast path: mixes two prepared pigments (`t` of `b` into `a`) and writes the sRGB\n * result to `out[offset..offset + 2]`, without allocating. Pair it with `setPigmentColor` for the\n * colour under the brush.\n */\nexport function lerpPigmentInto(a: Pigment, b: Pigment, t: number, out: { [i: number]: number }, offset = 0): void {\n const u = t > 0 ? (t < 1 ? t : 1) : 0;\n const wa = (1 - u) * a.strength * a.scatter;\n const wb = u * b.strength * b.scatter;\n const ca = wa / (wa + wb);\n const cb = 1 - ca;\n const ka = a.ks;\n const kb = b.ks;\n for (let k = 0; k < N; k++) mixScratch[k] = ca * ka[k] + cb * kb[k];\n ksToRgb(mixScratch, out, offset);\n}\n","import type { AgentTool } from '../tools/registry.js';\nimport { createPigment, mixPigments, type Pigment } from './pigment';\n\nconst HEX = /^#?([0-9a-f]{6})$/i;\n\nfunction parseHex(value: unknown, index: number): [number, number, number] {\n const m = typeof value === 'string' ? HEX.exec(value.trim()) : null;\n if (!m) throw new Error(`colors[${index}].color is ${JSON.stringify(value)}; use #rrggbb, e.g. \"#1e40af\".`);\n const n = parseInt(m[1], 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];\n}\n\nfunction toHex(rgb: readonly number[]): string {\n return '#' + rgb.map((v) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Agent tools for pigment mixing (`@pixerate/editor/paint`). `mix_colors` is read-only: it\n * predicts what paints mixed in given amounts look like, for choosing a brush or fill colour.\n */\nexport function createPigmentTools(): AgentTool[] {\n const mixColors: AgentTool = {\n name: 'mix_colors',\n title: 'Mix colours like paint',\n description:\n 'Mixes colours as paint would (Kubelka-Munk pigment mixing over reflectance spectra), so blue and yellow make green and white lightens a colour into a tint instead of greying it. Changes nothing. Returns the mixed colour as #rrggbb, the plain RGB average (rgbLerp) for comparison, and the normalised weights.',\n inputSchema: {\n type: 'object',\n properties: {\n colors: {\n type: 'array',\n minItems: 1,\n maxItems: 16,\n description: 'The paints to mix (1 to 16).',\n items: {\n type: 'object',\n properties: {\n color: { type: 'string', description: 'Paint colour #rrggbb.' },\n weight: { type: 'number', minimum: 0, description: 'Parts of this paint, any scale (e.g. 1 and 3 for a 1:3 mix). At least one weight must be above 0.' },\n strength: {\n type: 'number',\n exclusiveMinimum: 0,\n maximum: 100,\n description: 'Tinting strength (default 1): each part counts as this many, so a strong dark paint (e.g. 4) tints a lot of white.',\n },\n },\n required: ['color', 'weight'],\n additionalProperties: false,\n },\n },\n },\n required: ['colors'],\n additionalProperties: false,\n },\n annotations: { title: 'Mix colours like paint', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n handler: (args) => {\n const items = args.colors as { color: string; weight: number; strength?: number }[];\n const rgbs = items.map((item, i) => parseHex(item.color, i));\n const total = items.reduce((sum, item) => sum + item.weight, 0);\n if (!(total > 0)) throw new Error('Every weight is 0; give at least one colour a weight above 0.');\n const pigments: Pigment[] = rgbs.map((rgb, i) => createPigment(rgb, { strength: items[i].strength }));\n const mixed = mixPigments(pigments, items.map((item) => item.weight));\n const lerp = [0, 1, 2].map((c) => rgbs.reduce((sum, rgb, i) => sum + rgb[c] * items[i].weight, 0) / total);\n return {\n mixed: toHex(mixed),\n rgbLerp: toHex(lerp),\n weights: items.map((item) => item.weight / total),\n model: 'kubelka-munk',\n };\n },\n };\n return [mixColors];\n}\n"]}