@pixerate/editor 0.113.0 → 0.114.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 (124) hide show
  1. package/THIRD_PARTY_NOTICES.md +5 -0
  2. package/dist/animation-editor/index.cjs +60 -54
  3. package/dist/animation-editor/index.cjs.map +1 -1
  4. package/dist/animation-editor/index.d.cts +3 -3
  5. package/dist/animation-editor/index.d.ts +3 -3
  6. package/dist/animation-editor/index.js +14 -8
  7. package/dist/animation-editor/index.js.map +1 -1
  8. package/dist/builtin-CY97ppKM.d.cts +354 -0
  9. package/dist/builtin-CY97ppKM.d.ts +354 -0
  10. package/dist/canvas/index.cjs +3 -3
  11. package/dist/canvas/index.cjs.map +1 -1
  12. package/dist/canvas/index.js +9 -9
  13. package/dist/chunk-26PGXHY7.cjs +753 -0
  14. package/dist/chunk-26PGXHY7.cjs.map +1 -0
  15. package/dist/chunk-2OJACTPR.cjs +929 -0
  16. package/dist/chunk-2OJACTPR.cjs.map +1 -0
  17. package/dist/chunk-3UFGNHSP.js +929 -0
  18. package/dist/chunk-3UFGNHSP.js.map +1 -0
  19. package/dist/{chunk-YGIMK4NX.cjs → chunk-5OVJHMZQ.cjs} +757 -825
  20. package/dist/chunk-5OVJHMZQ.cjs.map +1 -0
  21. package/dist/chunk-643B2HKC.cjs +534 -0
  22. package/dist/chunk-643B2HKC.cjs.map +1 -0
  23. package/dist/chunk-6FCKOS2B.js +534 -0
  24. package/dist/chunk-6FCKOS2B.js.map +1 -0
  25. package/dist/chunk-BRLYOPLT.js +2574 -0
  26. package/dist/chunk-BRLYOPLT.js.map +1 -0
  27. package/dist/{chunk-LQEEDHOP.js → chunk-C6C5PDKU.js} +759 -761
  28. package/dist/chunk-C6C5PDKU.js.map +1 -0
  29. package/dist/{chunk-4KLT7ZYS.cjs → chunk-DFQEX3AM.cjs} +29 -29
  30. package/dist/{chunk-4KLT7ZYS.cjs.map → chunk-DFQEX3AM.cjs.map} +1 -1
  31. package/dist/{chunk-CZOXTEMN.js → chunk-EUVSQ25B.js} +336 -404
  32. package/dist/chunk-EUVSQ25B.js.map +1 -0
  33. package/dist/chunk-G5NMLUVF.cjs +2574 -0
  34. package/dist/chunk-G5NMLUVF.cjs.map +1 -0
  35. package/dist/{chunk-LPYOIVLA.js → chunk-LKCYANMW.js} +3 -3
  36. package/dist/{chunk-W3GXSUSQ.cjs → chunk-LPLCWZTM.cjs} +5087 -1283
  37. package/dist/chunk-LPLCWZTM.cjs.map +1 -0
  38. package/dist/chunk-MMVHBKMM.js +753 -0
  39. package/dist/chunk-MMVHBKMM.js.map +1 -0
  40. package/dist/{chunk-POGBUYWE.cjs → chunk-ST7E3NEE.cjs} +857 -859
  41. package/dist/chunk-ST7E3NEE.cjs.map +1 -0
  42. package/dist/{chunk-7VOHOPLW.cjs → chunk-TCKIXI46.cjs} +59 -59
  43. package/dist/{chunk-7VOHOPLW.cjs.map → chunk-TCKIXI46.cjs.map} +1 -1
  44. package/dist/{chunk-XIOMMGPD.cjs → chunk-TFOPHZ3U.cjs} +1 -1
  45. package/dist/chunk-TFOPHZ3U.cjs.map +1 -0
  46. package/dist/{chunk-Z4BC6M74.js → chunk-UBIXVXPR.js} +2 -2
  47. package/dist/{chunk-BLWCAQCW.js → chunk-VXR7XWMF.js} +4574 -770
  48. package/dist/chunk-VXR7XWMF.js.map +1 -0
  49. package/dist/{chunk-HNS7UHCM.js → chunk-XK5LZKBD.js} +1 -1
  50. package/dist/chunk-XK5LZKBD.js.map +1 -0
  51. package/dist/cms/index.cjs +146 -0
  52. package/dist/cms/index.cjs.map +1 -0
  53. package/dist/cms/index.d.cts +51 -0
  54. package/dist/cms/index.d.ts +51 -0
  55. package/dist/cms/index.js +146 -0
  56. package/dist/cms/index.js.map +1 -0
  57. package/dist/{export-DIkoK8-r.d.ts → export-_1dUKwpF.d.ts} +217 -191
  58. package/dist/{export-CEXEzqBf.d.cts → export-b6NjCZ5-.d.cts} +217 -191
  59. package/dist/image-editor/index.cjs +1779 -1280
  60. package/dist/image-editor/index.cjs.map +1 -1
  61. package/dist/image-editor/index.d.cts +77 -93
  62. package/dist/image-editor/index.d.ts +77 -93
  63. package/dist/image-editor/index.js +740 -241
  64. package/dist/image-editor/index.js.map +1 -1
  65. package/dist/opentype-BZEOSOX3.d.ts +188 -0
  66. package/dist/opentype-Dpe75vL5.d.cts +188 -0
  67. package/dist/paint/index.cjs +4 -4
  68. package/dist/paint/index.d.cts +2 -2
  69. package/dist/paint/index.d.ts +2 -2
  70. package/dist/paint/index.js +3 -3
  71. package/dist/paint-editor/index.cjs +146 -145
  72. package/dist/paint-editor/index.cjs.map +1 -1
  73. package/dist/paint-editor/index.d.cts +9 -8
  74. package/dist/paint-editor/index.d.ts +9 -8
  75. package/dist/paint-editor/index.js +6 -5
  76. package/dist/paint-editor/index.js.map +1 -1
  77. package/dist/raster/index.cjs +53 -3
  78. package/dist/raster/index.cjs.map +1 -1
  79. package/dist/raster/index.d.cts +62 -91
  80. package/dist/raster/index.d.ts +62 -91
  81. package/dist/raster/index.js +59 -9
  82. package/dist/{render-BEriFuqK.d.cts → render-B1K_OoLy.d.cts} +87 -2
  83. package/dist/{render-tjzKaik-.d.ts → render-CrmHOgpo.d.ts} +87 -2
  84. package/dist/{retouch-CEIKR22W.d.cts → retouch-Bxkuc0KH.d.cts} +1 -1
  85. package/dist/{retouch-BXmeSCaB.d.ts → retouch-Do6tBs2H.d.ts} +1 -1
  86. package/dist/{surface-C8RRg_Bh.d.cts → surface-Cn30xIV6.d.cts} +6 -1
  87. package/dist/{surface-C8RRg_Bh.d.ts → surface-Cn30xIV6.d.ts} +6 -1
  88. package/dist/{svg-D_cfkhlB.d.cts → svg-BnRj0q8i.d.cts} +16 -4
  89. package/dist/{svg-wIaKLrU0.d.ts → svg-CmmBFfGT.d.ts} +16 -4
  90. package/dist/{types-DtL_qLFz.d.ts → types-1SUQKDAw.d.ts} +273 -4
  91. package/dist/{types-DyQq-WPY.d.cts → types-yINF17Ta.d.cts} +273 -4
  92. package/dist/vector/index.cjs +12170 -7343
  93. package/dist/vector/index.cjs.map +1 -1
  94. package/dist/vector/index.d.cts +1579 -16
  95. package/dist/vector/index.d.ts +1579 -16
  96. package/dist/vector/index.js +6303 -1476
  97. package/dist/vector/index.js.map +1 -1
  98. package/dist/warp-B39VsOtd.d.cts +348 -0
  99. package/dist/warp-DMN30aY6.d.ts +348 -0
  100. package/dist/zlib-dxQdgHyN.d.cts +95 -0
  101. package/dist/zlib-dxQdgHyN.d.ts +95 -0
  102. package/package.json +6 -1
  103. package/skills/pixerate-image-editor/SKILL.md +12 -36
  104. package/skills/pixerate-image-editor/references/color-management.md +37 -0
  105. package/skills/pixerate-image-editor/references/photoshop-files.md +39 -0
  106. package/skills/pixerate-vector/SKILL.md +54 -2
  107. package/dist/chunk-BLWCAQCW.js.map +0 -1
  108. package/dist/chunk-CZOXTEMN.js.map +0 -1
  109. package/dist/chunk-HNS7UHCM.js.map +0 -1
  110. package/dist/chunk-JLYX4V57.cjs +0 -2001
  111. package/dist/chunk-JLYX4V57.cjs.map +0 -1
  112. package/dist/chunk-KB2YBCVS.js +0 -2001
  113. package/dist/chunk-KB2YBCVS.js.map +0 -1
  114. package/dist/chunk-LQEEDHOP.js.map +0 -1
  115. package/dist/chunk-POGBUYWE.cjs.map +0 -1
  116. package/dist/chunk-W3GXSUSQ.cjs.map +0 -1
  117. package/dist/chunk-XIOMMGPD.cjs.map +0 -1
  118. package/dist/chunk-YGIMK4NX.cjs.map +0 -1
  119. package/dist/homography-CZ-tFjay.d.cts +0 -50
  120. package/dist/homography-Ctfjoc1b.d.ts +0 -50
  121. package/dist/warp-CWHZzE3x.d.ts +0 -118
  122. package/dist/warp-D5jz_tN7.d.cts +0 -118
  123. /package/dist/{chunk-LPYOIVLA.js.map → chunk-LKCYANMW.js.map} +0 -0
  124. /package/dist/{chunk-Z4BC6M74.js.map → chunk-UBIXVXPR.js.map} +0 -0
@@ -4,12 +4,12 @@
4
4
 
5
5
 
6
6
 
7
- var _chunk7VOHOPLWcjs = require('./chunk-7VOHOPLW.cjs');
7
+ var _chunkTCKIXI46cjs = require('./chunk-TCKIXI46.cjs');
8
8
 
9
9
 
10
10
 
11
11
 
12
- var _chunkXIOMMGPDcjs = require('./chunk-XIOMMGPD.cjs');
12
+ var _chunkTFOPHZ3Ucjs = require('./chunk-TFOPHZ3U.cjs');
13
13
 
14
14
  // src/paint/heal.ts
15
15
  var TOL = 2e-3;
@@ -369,9 +369,9 @@ var TilePixelSource = (_class = class {
369
369
  sample(x, y, out) {
370
370
  const lx = x - this.offset.x;
371
371
  const ly = y - this.offset.y;
372
- const tx = Math.floor(lx / _chunkXIOMMGPDcjs.TILE);
373
- const ty = Math.floor(ly / _chunkXIOMMGPDcjs.TILE);
374
- const key = _chunkXIOMMGPDcjs.tileKey.call(void 0, tx, ty);
372
+ const tx = Math.floor(lx / _chunkTFOPHZ3Ucjs.TILE);
373
+ const ty = Math.floor(ly / _chunkTFOPHZ3Ucjs.TILE);
374
+ const key = _chunkTFOPHZ3Ucjs.tileKey.call(void 0, tx, ty);
375
375
  if (key !== this.lastKey) {
376
376
  let t2 = this.cache.get(key);
377
377
  if (t2 === void 0) {
@@ -386,7 +386,7 @@ var TilePixelSource = (_class = class {
386
386
  out[0] = out[1] = out[2] = out[3] = 0;
387
387
  return false;
388
388
  }
389
- const p = (ly - ty * _chunkXIOMMGPDcjs.TILE) * _chunkXIOMMGPDcjs.TILE + (lx - tx * _chunkXIOMMGPDcjs.TILE);
389
+ const p = (ly - ty * _chunkTFOPHZ3Ucjs.TILE) * _chunkTFOPHZ3Ucjs.TILE + (lx - tx * _chunkTFOPHZ3Ucjs.TILE);
390
390
  if (this.channels === 1) {
391
391
  out[0] = out[1] = out[2] = t[p];
392
392
  out[3] = 255;
@@ -440,21 +440,21 @@ function readSourceRegion(source, rect, dx = 0, dy = 0) {
440
440
  }
441
441
  function applyRetouchToTile(coverage, tileData, channels, tx, ty, paint, s, options = {}) {
442
442
  const out = options.into ? new Uint8ClampedArray(options.into) : new Uint8ClampedArray(tileData);
443
- const ox = tx * _chunkXIOMMGPDcjs.TILE + s.offset.x;
444
- const oy = ty * _chunkXIOMMGPDcjs.TILE + s.offset.y;
443
+ const ox = tx * _chunkTFOPHZ3Ucjs.TILE + s.offset.x;
444
+ const oy = ty * _chunkTFOPHZ3Ucjs.TILE + s.offset.y;
445
445
  let x0 = 0;
446
446
  let y0 = 0;
447
- let x1 = _chunkXIOMMGPDcjs.TILE;
448
- let y1 = _chunkXIOMMGPDcjs.TILE;
447
+ let x1 = _chunkTFOPHZ3Ucjs.TILE;
448
+ let y1 = _chunkTFOPHZ3Ucjs.TILE;
449
449
  if (options.region) {
450
450
  const r = options.region;
451
451
  x0 = Math.max(0, Math.floor(r.x) - ox);
452
452
  y0 = Math.max(0, Math.floor(r.y) - oy);
453
- x1 = Math.min(_chunkXIOMMGPDcjs.TILE, Math.ceil(r.x + r.width) - ox);
454
- y1 = Math.min(_chunkXIOMMGPDcjs.TILE, Math.ceil(r.y + r.height) - oy);
453
+ x1 = Math.min(_chunkTFOPHZ3Ucjs.TILE, Math.ceil(r.x + r.width) - ox);
454
+ y1 = Math.min(_chunkTFOPHZ3Ucjs.TILE, Math.ceil(r.y + r.height) - oy);
455
455
  if (x1 <= x0 || y1 <= y0) return out;
456
456
  if (options.into) {
457
- for (let y = y0; y < y1; y++) out.set(tileData.subarray((y * _chunkXIOMMGPDcjs.TILE + x0) * channels, (y * _chunkXIOMMGPDcjs.TILE + x1) * channels), (y * _chunkXIOMMGPDcjs.TILE + x0) * channels);
457
+ for (let y = y0; y < y1; y++) out.set(tileData.subarray((y * _chunkTFOPHZ3Ucjs.TILE + x0) * channels, (y * _chunkTFOPHZ3Ucjs.TILE + x1) * channels), (y * _chunkTFOPHZ3Ucjs.TILE + x0) * channels);
458
458
  }
459
459
  }
460
460
  const sel = s.selection;
@@ -467,17 +467,17 @@ function applyRetouchToTile(coverage, tileData, channels, tx, ty, paint, s, opti
467
467
  let covTile;
468
468
  for (let y = y0; y < y1; y++) {
469
469
  const dy = oy + y;
470
- const cty = Math.floor(dy / _chunkXIOMMGPDcjs.TILE);
470
+ const cty = Math.floor(dy / _chunkTFOPHZ3Ucjs.TILE);
471
471
  for (let x = x0; x < x1; x++) {
472
472
  const dx = ox + x;
473
- const ctx = Math.floor(dx / _chunkXIOMMGPDcjs.TILE);
474
- const key = _chunkXIOMMGPDcjs.tileKey.call(void 0, ctx, cty);
473
+ const ctx = Math.floor(dx / _chunkTFOPHZ3Ucjs.TILE);
474
+ const key = _chunkTFOPHZ3Ucjs.tileKey.call(void 0, ctx, cty);
475
475
  if (key !== covKey) {
476
476
  covKey = key;
477
477
  covTile = coverage.tiles.get(key);
478
478
  }
479
479
  if (!covTile) continue;
480
- const c = covTile[(dy - cty * _chunkXIOMMGPDcjs.TILE) * _chunkXIOMMGPDcjs.TILE + (dx - ctx * _chunkXIOMMGPDcjs.TILE)];
480
+ const c = covTile[(dy - cty * _chunkTFOPHZ3Ucjs.TILE) * _chunkTFOPHZ3Ucjs.TILE + (dx - ctx * _chunkTFOPHZ3Ucjs.TILE)];
481
481
  if (c <= 0) continue;
482
482
  let k = c * s.opacity;
483
483
  if (sel) {
@@ -486,7 +486,7 @@ function applyRetouchToTile(coverage, tileData, channels, tx, ty, paint, s, opti
486
486
  }
487
487
  if (k > 1) k = 1;
488
488
  if (k <= 0) continue;
489
- const p = y * _chunkXIOMMGPDcjs.TILE + x;
489
+ const p = y * _chunkTFOPHZ3Ucjs.TILE + x;
490
490
  if (channels === 1) {
491
491
  const g = out[p];
492
492
  let t;
@@ -530,7 +530,7 @@ function applyRetouchToTile(coverage, tileData, channels, tx, ty, paint, s, opti
530
530
  cb[ch] = out[i + ch] / 255;
531
531
  cs[ch] = src[ch] / 255;
532
532
  }
533
- const o = _chunkXIOMMGPDcjs.blendPixel.call(void 0, blend, cb, cs, k);
533
+ const o = _chunkTFOPHZ3Ucjs.blendPixel.call(void 0, blend, cb, cs, k);
534
534
  out[i] = Math.round(o[0] * 255);
535
535
  out[i + 1] = Math.round(o[1] * 255);
536
536
  out[i + 2] = Math.round(o[2] * 255);
@@ -616,8 +616,8 @@ var RetouchDabStroke = (_class2 = class {
616
616
  constructor(brush, target, effect) {;_class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);_class2.prototype.__init7.call(this);
617
617
  this.brush = brush;
618
618
  this.effect = effect;
619
- this.walker = new (0, _chunk7VOHOPLWcjs.DabWalker)(brush);
620
- this.medium = new (0, _chunk7VOHOPLWcjs.TileMedium)(target);
619
+ this.walker = new (0, _chunkTCKIXI46cjs.DabWalker)(brush);
620
+ this.medium = new (0, _chunkTCKIXI46cjs.TileMedium)(target);
621
621
  }
622
622
 
623
623
 
@@ -648,11 +648,11 @@ var RetouchDabStroke = (_class2 = class {
648
648
  paint(dabs) {
649
649
  const rects = [];
650
650
  for (const d of dabs) {
651
- const rect = _chunk7VOHOPLWcjs.dabRect.call(void 0, d, this.brush.hardness);
651
+ const rect = _chunkTCKIXI46cjs.dabRect.call(void 0, d, this.brush.hardness);
652
652
  const n = rect.width * rect.height;
653
653
  if (this.buf.length < n) this.buf = new Float32Array(n);
654
654
  const cov = this.buf.subarray(0, n);
655
- _chunk7VOHOPLWcjs.rasterizeDab.call(void 0, { ...d, alpha: 1 }, this.brush.hardness, rect, cov);
655
+ _chunkTCKIXI46cjs.rasterizeDab.call(void 0, { ...d, alpha: 1 }, this.brush.hardness, rect, cov);
656
656
  this.medium.reset();
657
657
  this.effect(this.medium, d, rect, cov);
658
658
  rects.push(rect);
@@ -664,7 +664,7 @@ var RetouchDabStroke = (_class2 = class {
664
664
  }, _class2);
665
665
  function smudgeEffect(brush, strength, mixing = "rgb") {
666
666
  const s = Math.min(1, Math.max(0, strength));
667
- const tip = new (0, _chunk7VOHOPLWcjs.SmudgeTip)({ strength: s, length: s, mixing }, brush.size);
667
+ const tip = new (0, _chunkTCKIXI46cjs.SmudgeTip)({ strength: s, length: s, mixing }, brush.size);
668
668
  return (medium, d, rect, cov) => tip.dab(medium, { x: d.x, y: d.y, radius: d.radius, opacity: d.opacity * d.alpha }, rect, cov);
669
669
  }
670
670
  function spongeEffect(brush, saturate, vibrance) {
@@ -710,19 +710,19 @@ function rgbaViewOfGrey(target) {
710
710
  lockTransparency: true,
711
711
  selection: target.selection,
712
712
  readTile: (tx, ty) => {
713
- const key = _chunkXIOMMGPDcjs.tileKey.call(void 0, tx, ty);
713
+ const key = _chunkTFOPHZ3Ucjs.tileKey.call(void 0, tx, ty);
714
714
  let v = views.get(key);
715
715
  if (!v) {
716
- v = expand(_nullishCoalesce(target.readTile(tx, ty), () => ( new Uint8ClampedArray(_chunkXIOMMGPDcjs.TILE * _chunkXIOMMGPDcjs.TILE))));
716
+ v = expand(_nullishCoalesce(target.readTile(tx, ty), () => ( new Uint8ClampedArray(_chunkTFOPHZ3Ucjs.TILE * _chunkTFOPHZ3Ucjs.TILE))));
717
717
  views.set(key, v);
718
718
  }
719
719
  return v;
720
720
  },
721
721
  writeTile: (tx, ty) => {
722
- const key = _chunkXIOMMGPDcjs.tileKey.call(void 0, tx, ty);
722
+ const key = _chunkTFOPHZ3Ucjs.tileKey.call(void 0, tx, ty);
723
723
  let v = views.get(key);
724
724
  if (!v) {
725
- v = expand(_nullishCoalesce(target.readTile(tx, ty), () => ( new Uint8ClampedArray(_chunkXIOMMGPDcjs.TILE * _chunkXIOMMGPDcjs.TILE))));
725
+ v = expand(_nullishCoalesce(target.readTile(tx, ty), () => ( new Uint8ClampedArray(_chunkTFOPHZ3Ucjs.TILE * _chunkTFOPHZ3Ucjs.TILE))));
726
726
  views.set(key, v);
727
727
  }
728
728
  dirty.set(key, { tx, ty, data: v });
@@ -778,4 +778,4 @@ function unionRect(a, b) {
778
778
 
779
779
 
780
780
  exports.solveMembrane = solveMembrane; exports.seamlessClone = seamlessClone; exports.membraneFill = membraneFill; exports.dilateMask = dilateMask; exports.maskBounds = maskBounds; exports.bestOffset = bestOffset; exports.TONE_RANGES = TONE_RANGES; exports.luma = luma; exports.dodgeBurnCurve = dodgeBurnCurve; exports.dodgeBurn = dodgeBurn; exports.saturationOf = saturationOf; exports.sponge = sponge; exports.perDabStrength = perDabStrength; exports.RETOUCH_SAMPLES = RETOUCH_SAMPLES; exports.SPOT_HEAL_TYPES = SPOT_HEAL_TYPES; exports.DEFAULT_RETOUCH = DEFAULT_RETOUCH; exports.normalizeRetouch = normalizeRetouch; exports.TilePixelSource = TilePixelSource; exports.RegionPixelSource = RegionPixelSource; exports.readSourceRegion = readSourceRegion; exports.applyRetouchToTile = applyRetouchToTile; exports.toneOf = toneOf; exports.healPixels = healPixels; exports.spotHealPixels = spotHealPixels; exports.spotHealWindow = spotHealWindow; exports.RetouchDabStroke = RetouchDabStroke; exports.smudgeEffect = smudgeEffect; exports.spongeEffect = spongeEffect; exports.rgbaViewOfGrey = rgbaViewOfGrey;
781
- //# sourceMappingURL=chunk-4KLT7ZYS.cjs.map
781
+ //# sourceMappingURL=chunk-DFQEX3AM.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-4KLT7ZYS.cjs","../src/paint/heal.ts","../src/paint/retouch.ts"],"names":["w","t"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-4KLT7ZYS.cjs","sourcesContent":[null,"// Portions ported from photocraft/crates/algo/src/poisson.rs and inpaint.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Gradient-domain (\"Poisson\") blending for the Healing Brush and the Spot Healing Brush.\n *\n * Method: P. Pérez, M. Gangnet, A. Blake, *Poisson Image Editing*, SIGGRAPH 2003. Seamless cloning\n * looks for `f` over a region Ω with `f = f*` (the destination) on its boundary and `∇f` as close\n * as possible to the source's `∇g`. The answer is `f = g + h`, where `h` is the membrane: the\n * harmonic function (`Δh = 0`) that equals `f* − g` on the boundary. So healed pixels keep the\n * source's texture while their colour and lighting are pulled to the pixels around the stroke.\n *\n * The Laplace equation is solved on the 4-connected grid by successive over-relaxation, started\n * from a recursively solved half-resolution grid (cascadic multigrid). Harmonic functions are\n * smooth, so the coarse guess is close and a few sweeps per level remove the rest.\n *\n * Buffers are interleaved `w × h × ch` floats in any units (the callers use 0..255). Pure maths:\n * no DOM, no framework.\n */\n\n/** Largest per-sweep update below which a solve has converged. */\nconst TOL = 2e-3;\n/** Sweeps (cap) and relaxation on every level above the coarsest. */\nconst FINE_ITERS = 30;\nconst FINE_OMEGA = 1.7;\n\n/**\n * Solves `Δv = 0` on the `unknown` pixels, with the known pixels of `v` as Dirichlet values\n * (neighbours off the grid are ignored: a free boundary). `v` holds the known values on entry and\n * the solution on exit.\n */\nexport function solveMembrane(w: number, h: number, unknown: ArrayLike<boolean | number>, v: Float32Array): void {\n if (unknown.length !== w * h || v.length !== w * h) throw new RangeError(`solveMembrane: expected ${w * h} cells, got ${unknown.length} and ${v.length}.`);\n const u = new Uint8Array(w * h);\n for (let i = 0; i < u.length; i++) u[i] = unknown[i] ? 1 : 0;\n solveLevel(w, h, u, v, 0);\n}\n\nfunction solveLevel(w: number, h: number, unknown: Uint8Array, v: Float32Array, depth: number): void {\n let nUnknown = 0;\n let knownSum = 0;\n let nKnown = 0;\n for (let i = 0; i < unknown.length; i++) {\n if (unknown[i]) nUnknown++;\n else {\n knownSum += v[i];\n nKnown++;\n }\n }\n if (nUnknown === 0 || nKnown === 0) return;\n if (w >= 8 && h >= 8 && nUnknown > 64 && depth < 16) {\n // Restrict: a coarse cell is known when any of its children is (the mean of those).\n const cw = Math.ceil(w / 2);\n const chh = Math.ceil(h / 2);\n const cu = new Uint8Array(cw * chh).fill(1);\n const cv = new Float32Array(cw * chh);\n for (let cy = 0; cy < chh; cy++) {\n for (let cx = 0; cx < cw; cx++) {\n let s = 0;\n let n = 0;\n for (let k = 0; k < 4; k++) {\n const x = cx * 2 + (k & 1);\n const y = cy * 2 + (k >> 1);\n if (x < w && y < h && !unknown[y * w + x]) {\n s += v[y * w + x];\n n++;\n }\n }\n if (n > 0) {\n cu[cy * cw + cx] = 0;\n cv[cy * cw + cx] = s / n;\n }\n }\n }\n solveLevel(cw, chh, cu, cv, depth + 1);\n // Prolong: a bilinear sample of the coarse solution is the starting guess.\n for (let y = 0; y < h; y++) {\n const fy = Math.min(chh - 1, Math.max(0, (y + 0.5) / 2 - 0.5));\n const y0 = Math.floor(fy);\n const y1 = Math.min(chh - 1, y0 + 1);\n const ty = fy - y0;\n for (let x = 0; x < w; x++) {\n if (!unknown[y * w + x]) continue;\n const fx = Math.min(cw - 1, Math.max(0, (x + 0.5) / 2 - 0.5));\n const x0 = Math.floor(fx);\n const x1 = Math.min(cw - 1, x0 + 1);\n const tx = fx - x0;\n const a = cv[y0 * cw + x0] + (cv[y0 * cw + x1] - cv[y0 * cw + x0]) * tx;\n const b = cv[y1 * cw + x0] + (cv[y1 * cw + x1] - cv[y1 * cw + x0]) * tx;\n v[y * w + x] = a + (b - a) * ty;\n }\n }\n sor(w, h, unknown, v, FINE_ITERS, FINE_OMEGA);\n } else {\n const mean = knownSum / nKnown;\n for (let i = 0; i < v.length; i++) if (unknown[i]) v[i] = mean;\n sor(w, h, unknown, v, 2000, 1.85);\n }\n}\n\n/** Over-relaxed Gauss-Seidel sweeps over the unknown cells until the largest update is below `TOL`. */\nfunction sor(w: number, h: number, unknown: Uint8Array, v: Float32Array, maxIter: number, omega: number): void {\n let n = 0;\n for (let i = 0; i < unknown.length; i++) if (unknown[i]) n++;\n const cells = new Uint32Array(n);\n const masks = new Uint8Array(n);\n for (let i = 0, k = 0; i < unknown.length; i++) {\n if (!unknown[i]) continue;\n const x = i % w;\n const y = (i - x) / w;\n cells[k] = i;\n masks[k++] = (x > 0 ? 1 : 0) | (x + 1 < w ? 2 : 0) | (y > 0 ? 4 : 0) | (y + 1 < h ? 8 : 0);\n }\n for (let it = 0; it < maxIter; it++) {\n let maxD = 0;\n for (let k = 0; k < n; k++) {\n const i = cells[k];\n const m = masks[k];\n let s: number;\n let c: number;\n if (m === 15) {\n s = v[i - 1] + v[i + 1] + v[i - w] + v[i + w];\n c = 4;\n } else {\n s = 0;\n c = 0;\n if (m & 1) (s += v[i - 1]), c++;\n if (m & 2) (s += v[i + 1]), c++;\n if (m & 4) (s += v[i - w]), c++;\n if (m & 8) (s += v[i + w]), c++;\n if (c === 0) continue;\n }\n const d = omega * (s / c - v[i]);\n v[i] += d;\n const ad = d < 0 ? -d : d;\n if (ad > maxD) maxD = ad;\n }\n if (maxD < TOL) break;\n }\n}\n\n/**\n * Seamless cloning: `dst` outside `mask`; inside, `src` plus the membrane that removes the\n * mismatch at the mask's edge. So the result keeps the source's texture and takes the\n * destination's colour and light. `src` and `dst` are interleaved `w × h × ch`; leave a one-pixel\n * unmasked margin for a fully fixed boundary.\n */\nexport function seamlessClone(w: number, h: number, ch: number, src: ArrayLike<number>, dst: ArrayLike<number>, mask: ArrayLike<boolean | number>): Float32Array {\n const n = w * h;\n if (src.length !== n * ch || dst.length !== n * ch || mask.length !== n) throw new RangeError('seamlessClone: src, dst and mask must cover w × h pixels.');\n const out = new Float32Array(n * ch);\n const hv = new Float32Array(n);\n for (let c = 0; c < ch; c++) {\n for (let i = 0; i < n; i++) hv[i] = mask[i] ? 0 : dst[i * ch + c] - src[i * ch + c];\n solveMembrane(w, h, mask, hv);\n for (let i = 0; i < n; i++) out[i * ch + c] = mask[i] ? src[i * ch + c] + hv[i] : dst[i * ch + c];\n }\n return out;\n}\n\n/** Membrane fill (no source texture): the known pixels interpolated smoothly into `hole`. */\nexport function membraneFill(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>): Float32Array {\n const n = w * h;\n const out = new Float32Array(n * ch);\n const v = new Float32Array(n);\n for (let c = 0; c < ch; c++) {\n for (let i = 0; i < n; i++) v[i] = hole[i] ? 0 : img[i * ch + c];\n solveMembrane(w, h, hole, v);\n for (let i = 0; i < n; i++) out[i * ch + c] = v[i];\n }\n return out;\n}\n\n/** A mask grown by `r` pixels (square structuring element). */\nexport function dilateMask(w: number, h: number, mask: ArrayLike<boolean | number>, r: number): Uint8Array {\n const tmp = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!mask[y * w + x]) continue;\n for (let xx = Math.max(0, x - r); xx <= Math.min(w - 1, x + r); xx++) tmp[y * w + xx] = 1;\n }\n }\n const out = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!tmp[y * w + x]) continue;\n for (let yy = Math.max(0, y - r); yy <= Math.min(h - 1, y + r); yy++) out[yy * w + x] = 1;\n }\n }\n return out;\n}\n\n/** A summed-area table over a mask, for \"how many masked cells in this window\". */\nclass MaskIntegral {\n private readonly s: Uint32Array;\n constructor(\n private readonly w: number,\n private readonly h: number,\n mask: ArrayLike<boolean | number>\n ) {\n const W = w + 1;\n this.s = new Uint32Array(W * (h + 1));\n for (let y = 0; y < h; y++) {\n let row = 0;\n for (let x = 0; x < w; x++) {\n row += mask[y * w + x] ? 1 : 0;\n this.s[(y + 1) * W + x + 1] = this.s[y * W + x + 1] + row;\n }\n }\n }\n /** Masked cells in [x0, x1) × [y0, y1) (clipped to the grid). */\n count(x0: number, y0: number, x1: number, y1: number): number {\n const W = this.w + 1;\n const a = Math.max(0, Math.min(this.w, x0));\n const b = Math.max(0, Math.min(this.h, y0));\n const c = Math.max(0, Math.min(this.w, x1));\n const d = Math.max(0, Math.min(this.h, y1));\n if (c <= a || d <= b) return 0;\n return this.s[d * W + c] - this.s[b * W + c] - this.s[d * W + a] + this.s[b * W + a];\n }\n}\n\n/** Bounding box [x0, y0, x1, y1) of the set cells, or null. */\nexport function maskBounds(w: number, h: number, mask: ArrayLike<boolean | number>): [number, number, number, number] | null {\n let x0 = w;\n let y0 = h;\n let x1 = -1;\n let y1 = -1;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!mask[y * w + x]) continue;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n }\n return x1 < 0 ? null : [x0, y0, x1 + 1, y1 + 1];\n}\n\n/**\n * Proximity match: the translation `(dx, dy)` (within `maxRadius`) whose pixels best match the\n * ring of `ring` pixels around the hole (sum of squared differences), so `img[p + (dx, dy)]` can\n * fill `p` in the hole. The source window must lie on the grid and hold no hole pixels. Nearer\n * sources win ties. Returns null when no translation fits.\n */\nexport function bestOffset(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>, ring: number, maxRadius: number): [number, number] | null {\n const bb = maskBounds(w, h, hole);\n if (!bb) return null;\n const extent = Math.max(w, h);\n const R = Math.max(0, Math.min(extent, Math.floor(maxRadius)));\n if (R === 0) return null;\n const rg = Math.max(1, Math.min(extent, Math.floor(ring)));\n const hs = new MaskIntegral(w, h, hole);\n const x0 = bb[0] - rg;\n const y0 = bb[1] - rg;\n const x1 = bb[2] + rg;\n const y1 = bb[3] + rg;\n // Sample points: the ring around the hole, subsampled to about 2000.\n const pts: number[] = [];\n for (let y = Math.max(0, y0); y < Math.min(h, y1); y++) {\n for (let x = Math.max(0, x0); x < Math.min(w, x1); x++) {\n if (hole[y * w + x]) continue;\n if (hs.count(x - rg, y - rg, x + rg + 1, y + rg + 1) > 0) pts.push(x, y);\n }\n }\n const stride = Math.max(1, Math.floor(pts.length / 2 / 2000));\n const sx: number[] = [];\n const sy: number[] = [];\n for (let i = 0; i < pts.length; i += 2 * stride) {\n sx.push(pts[i]);\n sy.push(pts[i + 1]);\n }\n const n = Math.max(1, sx.length);\n const evalAt = (dx: number, dy: number, cutoff: number): number | null => {\n if (dx === 0 && dy === 0) return null;\n const hx0 = x0 + dx;\n const hy0 = y0 + dy;\n const hx1 = x1 + dx;\n const hy1 = y1 + dy;\n if (hx0 < 0 || hy0 < 0 || hx1 > w || hy1 > h) return null;\n if (hs.count(hx0, hy0, hx1, hy1) !== 0) return null;\n const penalty = 1 + 1e-3 * (Math.hypot(dx, dy) / R);\n let e = 0;\n for (let i = 0; i < sx.length; i++) {\n const a = (sy[i] * w + sx[i]) * ch;\n const b = ((sy[i] + dy) * w + sx[i] + dx) * ch;\n for (let c = 0; c < ch; c++) {\n const d = img[a + c] - img[b + c];\n e += d * d;\n }\n if ((i & 31) === 31 && (e / n) * penalty >= cutoff) return null;\n }\n return (e / n) * penalty;\n };\n const found: { best: [number, number] | null; e: number } = { best: null, e: Infinity };\n const consider = (dx: number, dy: number) => {\n const e = evalAt(dx, dy, found.e);\n if (e !== null && e < found.e) {\n found.e = e;\n found.best = [dx, dy];\n }\n };\n // A coarse grid over the search window, then every offset around the winner.\n const step = Math.max(1, Math.floor(R / 24));\n for (let dy = -R; dy <= R; dy += step) for (let dx = -R; dx <= R; dx += step) consider(dx, dy);\n if (step > 1 && found.best) {\n const [bx, by] = found.best;\n for (let dy = by - step; dy <= by + step; dy++) for (let dx = bx - step; dx <= bx + step; dx++) consider(dx, dy);\n }\n return found.best;\n}\n","// Portions ported from photocraft/crates/paint/src/retouch.rs, crates/algo/src/retouch.rs and crates/engine/src/retouch_cmds.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * The retouching tools on the shared brush engine: Clone Stamp, Healing Brush, Spot Healing\n * Brush, Smudge, Dodge, Burn and Sponge. Two stroke shapes cover them all:\n *\n * - **Accumulate, then composite** (Clone Stamp, Dodge, Burn; the Healing tools' result): the\n * stroke's dabs build up one `CoverageMap` (flow builds towards the dab's opacity ceiling), and\n * per-pixel paint taken from the pre-stroke state (a cloned source, a toned copy of the pixel,\n * a healed patch) is composited through it with `applyRetouchToTile`. Pixels painted earlier in\n * the stroke are never sampled again, and overlapping dabs never exceed the stroke's opacity.\n * - **Sequential dabs** (Smudge, Sponge): `RetouchDabStroke` runs each dab in order over live\n * tiles, so dab n sees what dab n − 1 did.\n *\n * The Healing Brush clones while it is drawn and, when the stroke ends, replaces the clone with a\n * seamless clone (`healPixels`, Poisson blending): the source's texture with the colour and light\n * of the pixels around the stroke. The Spot Healing Brush finds its own source (`spotHealPixels`).\n *\n * Tone curves (`dodgeBurnCurve`, `dodgeBurn`, `sponge`) are photocraft's, made to behave like\n * Photoshop's tools: the chosen range moves most, black and white stay put for midtones, and\n * Protect Tones works on luma so hue and saturation are kept. Data in, pixels out; no DOM.\n */\n\nimport { blendPixel, type BlendMode } from '../raster/blend';\nimport type { RasterRect } from '../raster/surface';\nimport { TILE, tileKey } from '../raster/surface';\nimport { DabWalker, dabRect, rasterizeDab, type BrushSettings, type CoverageMap, type Dab, type StrokePoint } from './brush';\nimport { SmudgeTip, type SmudgeSettings } from './blending';\nimport { TileMedium, type PaintTileTarget } from './exchange';\nimport { bestOffset, dilateMask, maskBounds, membraneFill, seamlessClone } from './heal';\n\n// ---------------------------------------------------------------------------\n// Tone kernels\n// ---------------------------------------------------------------------------\n\n/** The tonal range Dodge and Burn work on most. */\nexport type ToneRange = 'shadows' | 'midtones' | 'highlights';\n\nexport const TONE_RANGES: readonly ToneRange[] = ['shadows', 'midtones', 'highlights'];\n\n/** Rec. 601 luma of straight RGB (0..1). */\nexport function luma(r: number, g: number, b: number): number {\n return 0.299 * r + 0.587 * g + 0.114 * b;\n}\n\n/** The dodge (or burn) transfer of one value `v` (0..1) at exposure `e` (0..1). */\nexport function dodgeBurnCurve(v: number, e: number, range: ToneRange, burn: boolean): number {\n const x = Math.max(0, v);\n const k = Math.min(1, Math.max(0, e));\n const c = Math.min(1, x);\n if (range === 'midtones') {\n // A gamma bend weighted to peak at mid-grey: 0 and 1 stay where they are.\n const w = Math.min(1, Math.max(0, 4 * x * (1 - x)));\n return x + w * (Math.pow(c, burn ? 1 + k : 1 / (1 + k)) - x);\n }\n // Shadows / highlights: `v + e·w·(target − v)`, weighted (1 − v)² or v², so that end moves most.\n const w = range === 'shadows' ? (1 - c) * (1 - c) : c * c;\n return burn ? x - k * w * x : x + k * w * (1 - c);\n}\n\n/** Brings RGB back into 0..1 keeping its luma (mixing towards grey) rather than clipping each channel. */\nfunction compressGamut(c: number[], l: number): void {\n const L = Math.min(1, Math.max(0, l));\n const lo = Math.min(c[0], c[1], c[2]);\n const hi = Math.max(c[0], c[1], c[2]);\n let t = 1;\n if (hi > 1 && hi - L > 1e-9) t = Math.min(t, (1 - L) / (hi - L));\n if (lo < 0 && L - lo > 1e-9) t = Math.min(t, L / (L - lo));\n for (let i = 0; i < 3; i++) c[i] = L + (c[i] - L) * t;\n}\n\n/**\n * Dodge (or burn) straight RGB `c` (0..1, written in place) at exposure `e`. With `protectTones`\n * the curve moves luma and the colour is scaled to it (hue and saturation kept); otherwise each\n * channel goes through the curve.\n */\nexport function dodgeBurn(c: number[], e: number, range: ToneRange, burn: boolean, protectTones: boolean): number[] {\n if (!(e > 0)) return c;\n if (protectTones) {\n const l = luma(c[0], c[1], c[2]);\n const nl = dodgeBurnCurve(l, e, range, burn);\n if (l > 1e-6) for (let i = 0; i < 3; i++) c[i] *= nl / l;\n else c[0] = c[1] = c[2] = nl;\n compressGamut(c, nl);\n } else for (let i = 0; i < 3; i++) c[i] = dodgeBurnCurve(c[i], e, range, burn);\n return c;\n}\n\n/** HSV saturation (chroma / max) of straight RGB. */\nexport function saturationOf(r: number, g: number, b: number): number {\n const lo = Math.min(r, g, b);\n const hi = Math.max(r, g, b);\n return hi <= 1e-6 ? 0 : Math.min(1, Math.max(0, (hi - lo) / hi));\n}\n\n/**\n * Sponge: moves straight RGB `c` (written in place) away from (`saturate`) or towards its luma\n * grey by `amount` (0..1). `vibrance` damps it where it would clip: saturating touches already\n * saturated colours less, desaturating touches near-greys less. Gamut-compressed, never clipped.\n */\nexport function sponge(c: number[], amount: number, saturate: boolean, vibrance: boolean): number[] {\n let a = Math.min(1, Math.max(0, amount));\n if (!(a > 0)) return c;\n if (vibrance) {\n const s = saturationOf(c[0], c[1], c[2]);\n a *= saturate ? 1 - s : 0.25 + 0.75 * s;\n }\n const l = luma(c[0], c[1], c[2]);\n const k = saturate ? 1 + a : 1 - a;\n for (let i = 0; i < 3; i++) c[i] = l + (c[i] - l) * k;\n compressGamut(c, l);\n return c;\n}\n\n/** Per-dab strength so that one pass over a point totals about `e`, whatever the spacing. */\nexport function perDabStrength(e: number, spacing: number): number {\n return 1 - Math.pow(1 - Math.min(1, Math.max(0, e)), Math.min(1, Math.max(0.01, spacing)));\n}\n\n// ---------------------------------------------------------------------------\n// Settings\n// ---------------------------------------------------------------------------\n\n/** Which pixels the Clone Stamp and the Healing tools sample. */\nexport type RetouchSample = 'current' | 'current-below' | 'all';\n\nexport const RETOUCH_SAMPLES: readonly RetouchSample[] = ['current', 'current-below', 'all'];\n\n/** How the Spot Healing Brush finds its source. */\nexport type SpotHealType = 'proximity-match' | 'smooth';\n\nexport const SPOT_HEAL_TYPES: readonly SpotHealType[] = ['proximity-match', 'smooth'];\n\n/** The retouching tools' options. */\nexport interface RetouchSettings {\n /** Clone / heal: keep the source offset from stroke to stroke (default true); off, every stroke starts at the source point. */\n aligned: boolean;\n /** Clone / heal / spot heal: what is sampled (default `current`: the target layer). */\n sample: RetouchSample;\n /** Spot heal: `proximity-match` (default: the best matching patch nearby) or `smooth` (a smooth fill from the edges). */\n spotType: SpotHealType;\n /** Dodge / burn: the tonal range (default `midtones`). */\n range: ToneRange;\n /** Dodge / burn: exposure 0..1 (default 0.5). */\n exposure: number;\n /** Dodge / burn: tone luma only, keeping hue and saturation (default true). */\n protectTones: boolean;\n /** Sponge: `desaturate` (default) or `saturate`. */\n spongeMode: 'desaturate' | 'saturate';\n /** Sponge: damp the change where colours would clip (default true). */\n vibrance: boolean;\n /** Smudge: how strongly the finger carries and lays paint, 0..1 (default 0.5). */\n strength: number;\n}\n\nexport const DEFAULT_RETOUCH: Readonly<RetouchSettings> = {\n aligned: true,\n sample: 'current',\n spotType: 'proximity-match',\n range: 'midtones',\n exposure: 0.5,\n protectTones: true,\n spongeMode: 'desaturate',\n vibrance: true,\n strength: 0.5,\n};\n\n/** Retouch settings with every field valid (missing or invalid fields from `base`). */\nexport function normalizeRetouch(raw: Partial<RetouchSettings> = {}, base: RetouchSettings = DEFAULT_RETOUCH): RetouchSettings {\n const unit = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(0, v)) : d);\n const bool = (v: unknown, d: boolean) => (typeof v === 'boolean' ? v : d);\n const pick = <T extends string>(v: unknown, all: readonly T[], d: T): T => (all.includes(v as T) ? (v as T) : d);\n return {\n aligned: bool(raw.aligned, base.aligned),\n sample: pick(raw.sample, RETOUCH_SAMPLES, base.sample),\n spotType: pick(raw.spotType, SPOT_HEAL_TYPES, base.spotType),\n range: pick(raw.range, TONE_RANGES, base.range),\n exposure: unit(raw.exposure, base.exposure),\n protectTones: bool(raw.protectTones, base.protectTones),\n spongeMode: pick(raw.spongeMode, ['desaturate', 'saturate'] as const, base.spongeMode),\n vibrance: bool(raw.vibrance, base.vibrance),\n strength: unit(raw.strength, base.strength),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pixel sources\n// ---------------------------------------------------------------------------\n\n/** Pixels a retouching stroke samples, by document pixel. */\nexport interface PixelSource {\n /** Straight RGBA 0..255 of document pixel (x, y) into `out`; false (and `out` zeroed) where there is nothing. */\n sample(x: number, y: number, out: number[]): boolean;\n}\n\n/**\n * A source over raster tiles (layer pixels, a mask, or composite tiles): `readTile` gives tile\n * (tx, ty) in source space or `null` when it is empty; source pixel = document pixel − `offset`.\n * One-channel tiles read as grey (alpha 255). Tiles are cached, so make one per stroke.\n */\nexport class TilePixelSource implements PixelSource {\n private readonly cache = new Map<number, Uint8ClampedArray | null>();\n private lastKey = NaN;\n private last: Uint8ClampedArray | null = null;\n\n constructor(\n private readonly readTile: (tx: number, ty: number) => Uint8ClampedArray | null,\n readonly channels: 1 | 4,\n readonly offset: { x: number; y: number } = { x: 0, y: 0 }\n ) {}\n\n sample(x: number, y: number, out: number[]): boolean {\n const lx = x - this.offset.x;\n const ly = y - this.offset.y;\n const tx = Math.floor(lx / TILE);\n const ty = Math.floor(ly / TILE);\n const key = tileKey(tx, ty);\n if (key !== this.lastKey) {\n let t = this.cache.get(key);\n if (t === undefined) {\n t = this.readTile(tx, ty);\n this.cache.set(key, t);\n }\n this.last = t;\n this.lastKey = key;\n }\n const t = this.last;\n if (!t) {\n out[0] = out[1] = out[2] = out[3] = 0;\n return false;\n }\n const p = (ly - ty * TILE) * TILE + (lx - tx * TILE);\n if (this.channels === 1) {\n out[0] = out[1] = out[2] = t[p];\n out[3] = 255;\n return true;\n }\n const i = p * 4;\n out[0] = t[i];\n out[1] = t[i + 1];\n out[2] = t[i + 2];\n out[3] = t[i + 3];\n return out[3] > 0;\n }\n}\n\n/** A source over a region of float RGBA pixels (0..255), e.g. a healed patch. */\nexport class RegionPixelSource implements PixelSource {\n constructor(\n readonly rect: RasterRect,\n readonly data: Float32Array\n ) {}\n\n sample(x: number, y: number, out: number[]): boolean {\n const r = this.rect;\n const lx = x - r.x;\n const ly = y - r.y;\n if (lx < 0 || ly < 0 || lx >= r.width || ly >= r.height) {\n out[0] = out[1] = out[2] = out[3] = 0;\n return false;\n }\n const i = (ly * r.width + lx) * 4;\n out[0] = this.data[i];\n out[1] = this.data[i + 1];\n out[2] = this.data[i + 2];\n out[3] = this.data[i + 3];\n return out[3] > 0;\n }\n}\n\n/** `rect` of a source, shifted by (dx, dy), as float RGBA 0..255 (`rect.width × rect.height × 4`). */\nexport function readSourceRegion(source: PixelSource, rect: RasterRect, dx = 0, dy = 0): Float32Array {\n const out = new Float32Array(rect.width * rect.height * 4);\n const px = [0, 0, 0, 0];\n for (let y = 0; y < rect.height; y++) {\n for (let x = 0; x < rect.width; x++) {\n source.sample(rect.x + x + dx, rect.y + y + dy, px);\n const i = (y * rect.width + x) * 4;\n out[i] = px[0];\n out[i + 1] = px[1];\n out[i + 2] = px[2];\n out[i + 3] = px[3];\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Accumulate, then composite\n// ---------------------------------------------------------------------------\n\n/** What a coverage-based retouching stroke lays through its coverage. */\nexport type RetouchPaint =\n /** Source pixels at document pixel + (dx, dy) (Clone Stamp, a healed patch). */\n | { kind: 'source'; source: PixelSource; dx: number; dy: number }\n /** The target pixel itself, toned (Dodge, Burn): `tone` edits straight RGB 0..1 in place. */\n | { kind: 'tone'; tone: (rgb: number[]) => void }\n /** A flat colour (the Spot Healing Brush's trail while it is drawn), RGBA 0..255. */\n | { kind: 'color'; color: readonly [number, number, number, number] };\n\n/** How a coverage-based retouching stroke composites. */\nexport interface RetouchApply {\n /** Stroke opacity 0..1. */\n opacity: number;\n /** Blend mode for source paint (default normal). */\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 `paint` through the stroke's coverage over `tileData` (target tile (tx, ty) as it was\n * before the stroke, layer space; RGBA, or one byte per pixel for masks) and returns the new tile.\n * With `into` (the previous result) and `region` (document space), only `region` is recomputed.\n * Tone paint keeps alpha; source and colour paint composite with `blend` (source-over by\n * default), keeping alpha on a locked layer.\n */\nexport function applyRetouchToTile(\n coverage: CoverageMap,\n tileData: Uint8ClampedArray,\n channels: 1 | 4,\n tx: number,\n ty: number,\n paint: RetouchPaint,\n s: RetouchApply,\n options: { into?: Uint8ClampedArray; region?: RasterRect } = {}\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 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 blend = s.blend ?? 'normal';\n const src = [0, 0, 0, 0];\n const rgb = [0, 0, 0];\n const cb = [0, 0, 0, 0];\n const cs = [0, 0, 0, 0];\n // The coverage tile under the pixel, looked up once per tile it crosses.\n let covKey = NaN;\n let covTile: Float32Array | undefined;\n for (let y = y0; y < y1; y++) {\n const dy = oy + y;\n const cty = Math.floor(dy / TILE);\n for (let x = x0; x < x1; x++) {\n const dx = ox + x;\n const ctx = Math.floor(dx / TILE);\n const key = tileKey(ctx, cty);\n if (key !== covKey) {\n covKey = key;\n covTile = coverage.tiles.get(key);\n }\n if (!covTile) continue;\n const c = covTile[(dy - cty * TILE) * TILE + (dx - ctx * TILE)];\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 // Masks: grey values; the source's grey is its red channel.\n const g = out[p];\n let t: number;\n if (paint.kind === 'tone') {\n rgb[0] = rgb[1] = rgb[2] = g / 255;\n paint.tone(rgb);\n t = luma(rgb[0], rgb[1], rgb[2]) * 255;\n } else if (paint.kind === 'color') t = paint.color[0];\n else {\n if (!paint.source.sample(dx + paint.dx, dy + paint.dy, src)) continue;\n t = src[0];\n k *= src[3] / 255;\n }\n out[p] = Math.round(g + (t - g) * k);\n continue;\n }\n const i = p * 4;\n const a = out[i + 3];\n if (paint.kind === 'tone') {\n if (a === 0) continue;\n rgb[0] = out[i] / 255;\n rgb[1] = out[i + 1] / 255;\n rgb[2] = out[i + 2] / 255;\n const r0 = rgb[0];\n const g0 = rgb[1];\n const b0 = rgb[2];\n paint.tone(rgb);\n out[i] = Math.round((r0 + (rgb[0] - r0) * k) * 255);\n out[i + 1] = Math.round((g0 + (rgb[1] - g0) * k) * 255);\n out[i + 2] = Math.round((b0 + (rgb[2] - b0) * k) * 255);\n continue;\n }\n if (s.lockTransparency && a === 0) continue;\n if (paint.kind === 'color') {\n src[0] = paint.color[0];\n src[1] = paint.color[1];\n src[2] = paint.color[2];\n src[3] = paint.color[3];\n } else if (!paint.source.sample(dx + paint.dx, dy + paint.dy, src)) continue;\n for (let ch = 0; ch < 4; ch++) {\n cb[ch] = out[i + ch] / 255;\n cs[ch] = src[ch] / 255;\n }\n // Source-over, as a brush lays paint: cloning transparency paints nothing.\n const o = blendPixel(blend, cb, cs, 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/** The tone function of a Dodge or Burn stroke. */\nexport function toneOf(tool: 'dodge' | 'burn', settings: Pick<RetouchSettings, 'exposure' | 'range' | 'protectTones'>): (rgb: number[]) => void {\n const burn = tool === 'burn';\n return (rgb) => {\n dodgeBurn(rgb, settings.exposure, settings.range, burn, settings.protectTones);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Healing\n// ---------------------------------------------------------------------------\n\n/**\n * Heals `src` into `dst` over `mask` (all `w × h`, RGBA floats 0..255): a seamless clone solved\n * only over the mask's bounds plus a one-pixel fixed ring; elsewhere the result is `dst`.\n */\nexport function healPixels(w: number, h: number, src: Float32Array, dst: Float32Array, mask: ArrayLike<boolean | number>): Float32Array {\n const out = new Float32Array(dst);\n const bb = maskBounds(w, h, mask);\n if (!bb) return out;\n const x0 = Math.max(0, bb[0] - 1);\n const y0 = Math.max(0, bb[1] - 1);\n const x1 = Math.min(w, bb[2] + 1);\n const y1 = Math.min(h, bb[3] + 1);\n const rw = x1 - x0;\n const rh = y1 - y0;\n const s = new Float32Array(rw * rh * 4);\n const d = new Float32Array(rw * rh * 4);\n const m = new Uint8Array(rw * rh);\n for (let y = 0; y < rh; y++) {\n for (let x = 0; x < rw; x++) {\n const gi = (y + y0) * w + x + x0;\n const li = y * rw + x;\n m[li] = mask[gi] ? 1 : 0;\n for (let c = 0; c < 4; c++) {\n s[li * 4 + c] = src[gi * 4 + c];\n d[li * 4 + c] = dst[gi * 4 + c];\n }\n }\n }\n const healed = seamlessClone(rw, rh, 4, s, d, m);\n for (let y = 0; y < rh; y++) {\n for (let x = 0; x < rw; x++) {\n const gi = ((y + y0) * w + x + x0) * 4;\n const li = (y * rw + x) * 4;\n for (let c = 0; c < 4; c++) out[gi + c] = Math.min(255, Math.max(0, healed[li + c]));\n }\n }\n return out;\n}\n\n/**\n * Spot healing: fills `hole` (`w × h`) of `img` (RGBA floats 0..255) with no given source, then\n * heals the fill into its surroundings. `proximity-match` copies the best matching nearby patch\n * (falling back to `smooth` when none fits); `smooth` interpolates the edges inwards. `size` is\n * the brush diameter in pixels. Returns the healed pixels over the whole grid.\n */\nexport function spotHealPixels(\n w: number,\n h: number,\n img: Float32Array,\n hole: ArrayLike<boolean | number>,\n size: number,\n type: SpotHealType,\n /** Told the patch offset it copied (`null`: a smooth fill). */\n onOffset?: (offset: [number, number] | null) => void\n): Float32Array {\n // Fill a slightly larger domain than the healed area, so the solve's boundary sees filled values\n // that differ from the untouched pixels: that mismatch is what the membrane corrects.\n const domain = dilateMask(w, h, hole, 2);\n const healMask = dilateMask(w, h, hole, 1);\n let filled: Float32Array | null = null;\n let bestFound: [number, number] | null = null;\n if (type === 'proximity-match') {\n const ring = Math.min(16, Math.max(3, Math.floor(size / 8)));\n const off = bestOffset(w, h, 4, img, domain, ring, Math.floor(Math.max(w, h) / 2));\n if (off) {\n bestFound = off;\n // Copy from the pre-healing pixels, never from what this loop already wrote.\n filled = new Float32Array(img);\n const [ddx, ddy] = off;\n for (let i = 0; i < w * h; i++) {\n if (!domain[i]) continue;\n const x = (i % w) + ddx;\n const y = Math.floor(i / w) + ddy;\n const j = (y * w + x) * 4;\n for (let c = 0; c < 4; c++) filled[i * 4 + c] = img[j + c];\n }\n }\n }\n onOffset?.(filled ? (bestFound as [number, number]) : null);\n if (!filled) filled = membraneFill(w, h, 4, img, domain);\n return healPixels(w, h, filled, img, healMask);\n}\n\n/** The window a Spot Healing stroke over `bounds` looks for texture in: the bounds grown by their size, on the canvas. */\nexport function spotHealWindow(bounds: RasterRect, canvas: { width: number; height: number }): RasterRect {\n const g = Math.max(8, Math.ceil(Math.max(bounds.width, bounds.height)));\n const x0 = Math.max(0, bounds.x - g);\n const y0 = Math.max(0, bounds.y - g);\n const x1 = Math.min(canvas.width, bounds.x + bounds.width + g);\n const y1 = Math.min(canvas.height, bounds.y + bounds.height + g);\n return { x: x0, y: y0, width: Math.max(0, x1 - x0), height: Math.max(0, y1 - y0) };\n}\n\n// ---------------------------------------------------------------------------\n// Sequential dabs\n// ---------------------------------------------------------------------------\n\n/**\n * One dab of a sequential retouching stroke: `cov` is the tip's pure coverage over `rect`\n * (document space, 0..1); `d.alpha` is the flow and `d.opacity` the pressure opacity.\n */\nexport type RetouchDabEffect = (medium: TileMedium, d: Dab, rect: RasterRect, cov: Float32Array) => void;\n\n/**\n * A stroke whose dabs edit live tiles in order (Smudge, Sponge). Feed points with `push` (any\n * chunks give the same dabs), end with `finish`; each returns the document rectangles it touched.\n */\nexport class RetouchDabStroke {\n dabCount = 0;\n bounds: RasterRect | null = null;\n private readonly walker: DabWalker;\n private readonly medium: TileMedium;\n private smoothPos: StrokePoint | null = null;\n private buf = new Float32Array(0);\n\n constructor(\n readonly brush: BrushSettings,\n target: PaintTileTarget,\n private readonly effect: RetouchDabEffect\n ) {\n this.walker = new DabWalker(brush);\n this.medium = new TileMedium(target);\n }\n\n push(points: readonly StrokePoint[]): RasterRect[] {\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 finish(last?: StrokePoint): RasterRect[] {\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.brush.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[]): RasterRect[] {\n const rects: RasterRect[] = [];\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 cov = this.buf.subarray(0, n);\n rasterizeDab({ ...d, alpha: 1 }, this.brush.hardness, rect, cov);\n this.medium.reset();\n this.effect(this.medium, d, rect, cov);\n rects.push(rect);\n this.bounds = unionRect(this.bounds, rect);\n this.dabCount++;\n }\n return rects;\n }\n}\n\n/** The Smudge's per-dab effect: a `SmudgeTip` whose strength carries and lays the paint. */\nexport function smudgeEffect(brush: BrushSettings, strength: number, mixing: SmudgeSettings['mixing'] = 'rgb'): RetouchDabEffect {\n const s = Math.min(1, Math.max(0, strength));\n const tip = new SmudgeTip({ strength: s, length: s, mixing }, brush.size);\n return (medium, d, rect, cov) => tip.dab(medium, { x: d.x, y: d.y, radius: d.radius, opacity: d.opacity * d.alpha }, rect, cov);\n}\n\n/** The Sponge's per-dab effect: each dab moves saturation by about half its flow, compounding over passes. */\nexport function spongeEffect(brush: BrushSettings, saturate: boolean, vibrance: boolean): RetouchDabEffect {\n const rgb = [0, 0, 0];\n return (medium, d, rect, cov) => {\n const w = rect.width;\n for (let yy = 0; yy < rect.height; yy++) {\n for (let xx = 0; xx < w; xx++) {\n const cv = cov[yy * w + xx];\n if (cv <= 0) continue;\n const dx = rect.x + xx;\n const dy = rect.y + yy;\n const k = perDabStrength(cv * d.alpha * d.opacity * 0.5, brush.spacing) * medium.selectionAt(dx, dy);\n if (k <= 0) continue;\n const ri = medium.locate(dx, dy, false);\n if (ri < 0 || medium.pixels[ri + 3] === 0) continue;\n const i = medium.locate(dx, dy, true);\n const px = medium.pixels;\n rgb[0] = px[i] / 255;\n rgb[1] = px[i + 1] / 255;\n rgb[2] = px[i + 2] / 255;\n sponge(rgb, k, saturate, vibrance);\n px[i] = Math.round(rgb[0] * 255);\n px[i + 1] = Math.round(rgb[1] * 255);\n px[i + 2] = Math.round(rgb[2] * 255);\n }\n }\n };\n}\n\n/**\n * An RGBA view of one-channel tiles (masks), for the sequential-dab tools: reads expand grey to\n * opaque RGB, writes land in RGBA copies, and `flush` writes their red channel back through\n * `target.writeTile`. Alpha is locked, so a mask's values are all a dab changes.\n */\nexport function rgbaViewOfGrey(target: PaintTileTarget): { target: PaintTileTarget; flush(): void } {\n const views = new Map<number, Uint8ClampedArray>();\n const dirty = new Map<number, { tx: number; ty: number; data: Uint8ClampedArray }>();\n const expand = (g: Uint8ClampedArray) => {\n const out = new Uint8ClampedArray(g.length * 4);\n for (let i = 0; i < g.length; i++) {\n out[i * 4] = out[i * 4 + 1] = out[i * 4 + 2] = g[i];\n out[i * 4 + 3] = 255;\n }\n return out;\n };\n const view: PaintTileTarget = {\n offset: target.offset,\n lockTransparency: true,\n selection: target.selection,\n readTile: (tx, ty) => {\n const key = tileKey(tx, ty);\n let v = views.get(key);\n if (!v) {\n // An empty mask tile is still values (0), not transparency: always give a tile.\n v = expand(target.readTile(tx, ty) ?? new Uint8ClampedArray(TILE * TILE));\n views.set(key, v);\n }\n return v;\n },\n writeTile: (tx, ty) => {\n const key = tileKey(tx, ty);\n let v = views.get(key);\n if (!v) {\n v = expand(target.readTile(tx, ty) ?? new Uint8ClampedArray(TILE * TILE));\n views.set(key, v);\n }\n dirty.set(key, { tx, ty, data: v });\n return v;\n },\n };\n return {\n target: view,\n flush: () => {\n for (const { tx, ty, data } of dirty.values()) {\n const g = target.writeTile(tx, ty);\n for (let i = 0; i < g.length; i++) g[i] = data[i * 4];\n }\n dirty.clear();\n },\n };\n}\n\nfunction unionRect(a: RasterRect | null, b: RasterRect): RasterRect {\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"]}
1
+ {"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-DFQEX3AM.cjs","../src/paint/heal.ts","../src/paint/retouch.ts"],"names":["w","t"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-DFQEX3AM.cjs","sourcesContent":[null,"// Portions ported from photocraft/crates/algo/src/poisson.rs and inpaint.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Gradient-domain (\"Poisson\") blending for the Healing Brush and the Spot Healing Brush.\n *\n * Method: P. Pérez, M. Gangnet, A. Blake, *Poisson Image Editing*, SIGGRAPH 2003. Seamless cloning\n * looks for `f` over a region Ω with `f = f*` (the destination) on its boundary and `∇f` as close\n * as possible to the source's `∇g`. The answer is `f = g + h`, where `h` is the membrane: the\n * harmonic function (`Δh = 0`) that equals `f* − g` on the boundary. So healed pixels keep the\n * source's texture while their colour and lighting are pulled to the pixels around the stroke.\n *\n * The Laplace equation is solved on the 4-connected grid by successive over-relaxation, started\n * from a recursively solved half-resolution grid (cascadic multigrid). Harmonic functions are\n * smooth, so the coarse guess is close and a few sweeps per level remove the rest.\n *\n * Buffers are interleaved `w × h × ch` floats in any units (the callers use 0..255). Pure maths:\n * no DOM, no framework.\n */\n\n/** Largest per-sweep update below which a solve has converged. */\nconst TOL = 2e-3;\n/** Sweeps (cap) and relaxation on every level above the coarsest. */\nconst FINE_ITERS = 30;\nconst FINE_OMEGA = 1.7;\n\n/**\n * Solves `Δv = 0` on the `unknown` pixels, with the known pixels of `v` as Dirichlet values\n * (neighbours off the grid are ignored: a free boundary). `v` holds the known values on entry and\n * the solution on exit.\n */\nexport function solveMembrane(w: number, h: number, unknown: ArrayLike<boolean | number>, v: Float32Array): void {\n if (unknown.length !== w * h || v.length !== w * h) throw new RangeError(`solveMembrane: expected ${w * h} cells, got ${unknown.length} and ${v.length}.`);\n const u = new Uint8Array(w * h);\n for (let i = 0; i < u.length; i++) u[i] = unknown[i] ? 1 : 0;\n solveLevel(w, h, u, v, 0);\n}\n\nfunction solveLevel(w: number, h: number, unknown: Uint8Array, v: Float32Array, depth: number): void {\n let nUnknown = 0;\n let knownSum = 0;\n let nKnown = 0;\n for (let i = 0; i < unknown.length; i++) {\n if (unknown[i]) nUnknown++;\n else {\n knownSum += v[i];\n nKnown++;\n }\n }\n if (nUnknown === 0 || nKnown === 0) return;\n if (w >= 8 && h >= 8 && nUnknown > 64 && depth < 16) {\n // Restrict: a coarse cell is known when any of its children is (the mean of those).\n const cw = Math.ceil(w / 2);\n const chh = Math.ceil(h / 2);\n const cu = new Uint8Array(cw * chh).fill(1);\n const cv = new Float32Array(cw * chh);\n for (let cy = 0; cy < chh; cy++) {\n for (let cx = 0; cx < cw; cx++) {\n let s = 0;\n let n = 0;\n for (let k = 0; k < 4; k++) {\n const x = cx * 2 + (k & 1);\n const y = cy * 2 + (k >> 1);\n if (x < w && y < h && !unknown[y * w + x]) {\n s += v[y * w + x];\n n++;\n }\n }\n if (n > 0) {\n cu[cy * cw + cx] = 0;\n cv[cy * cw + cx] = s / n;\n }\n }\n }\n solveLevel(cw, chh, cu, cv, depth + 1);\n // Prolong: a bilinear sample of the coarse solution is the starting guess.\n for (let y = 0; y < h; y++) {\n const fy = Math.min(chh - 1, Math.max(0, (y + 0.5) / 2 - 0.5));\n const y0 = Math.floor(fy);\n const y1 = Math.min(chh - 1, y0 + 1);\n const ty = fy - y0;\n for (let x = 0; x < w; x++) {\n if (!unknown[y * w + x]) continue;\n const fx = Math.min(cw - 1, Math.max(0, (x + 0.5) / 2 - 0.5));\n const x0 = Math.floor(fx);\n const x1 = Math.min(cw - 1, x0 + 1);\n const tx = fx - x0;\n const a = cv[y0 * cw + x0] + (cv[y0 * cw + x1] - cv[y0 * cw + x0]) * tx;\n const b = cv[y1 * cw + x0] + (cv[y1 * cw + x1] - cv[y1 * cw + x0]) * tx;\n v[y * w + x] = a + (b - a) * ty;\n }\n }\n sor(w, h, unknown, v, FINE_ITERS, FINE_OMEGA);\n } else {\n const mean = knownSum / nKnown;\n for (let i = 0; i < v.length; i++) if (unknown[i]) v[i] = mean;\n sor(w, h, unknown, v, 2000, 1.85);\n }\n}\n\n/** Over-relaxed Gauss-Seidel sweeps over the unknown cells until the largest update is below `TOL`. */\nfunction sor(w: number, h: number, unknown: Uint8Array, v: Float32Array, maxIter: number, omega: number): void {\n let n = 0;\n for (let i = 0; i < unknown.length; i++) if (unknown[i]) n++;\n const cells = new Uint32Array(n);\n const masks = new Uint8Array(n);\n for (let i = 0, k = 0; i < unknown.length; i++) {\n if (!unknown[i]) continue;\n const x = i % w;\n const y = (i - x) / w;\n cells[k] = i;\n masks[k++] = (x > 0 ? 1 : 0) | (x + 1 < w ? 2 : 0) | (y > 0 ? 4 : 0) | (y + 1 < h ? 8 : 0);\n }\n for (let it = 0; it < maxIter; it++) {\n let maxD = 0;\n for (let k = 0; k < n; k++) {\n const i = cells[k];\n const m = masks[k];\n let s: number;\n let c: number;\n if (m === 15) {\n s = v[i - 1] + v[i + 1] + v[i - w] + v[i + w];\n c = 4;\n } else {\n s = 0;\n c = 0;\n if (m & 1) (s += v[i - 1]), c++;\n if (m & 2) (s += v[i + 1]), c++;\n if (m & 4) (s += v[i - w]), c++;\n if (m & 8) (s += v[i + w]), c++;\n if (c === 0) continue;\n }\n const d = omega * (s / c - v[i]);\n v[i] += d;\n const ad = d < 0 ? -d : d;\n if (ad > maxD) maxD = ad;\n }\n if (maxD < TOL) break;\n }\n}\n\n/**\n * Seamless cloning: `dst` outside `mask`; inside, `src` plus the membrane that removes the\n * mismatch at the mask's edge. So the result keeps the source's texture and takes the\n * destination's colour and light. `src` and `dst` are interleaved `w × h × ch`; leave a one-pixel\n * unmasked margin for a fully fixed boundary.\n */\nexport function seamlessClone(w: number, h: number, ch: number, src: ArrayLike<number>, dst: ArrayLike<number>, mask: ArrayLike<boolean | number>): Float32Array {\n const n = w * h;\n if (src.length !== n * ch || dst.length !== n * ch || mask.length !== n) throw new RangeError('seamlessClone: src, dst and mask must cover w × h pixels.');\n const out = new Float32Array(n * ch);\n const hv = new Float32Array(n);\n for (let c = 0; c < ch; c++) {\n for (let i = 0; i < n; i++) hv[i] = mask[i] ? 0 : dst[i * ch + c] - src[i * ch + c];\n solveMembrane(w, h, mask, hv);\n for (let i = 0; i < n; i++) out[i * ch + c] = mask[i] ? src[i * ch + c] + hv[i] : dst[i * ch + c];\n }\n return out;\n}\n\n/** Membrane fill (no source texture): the known pixels interpolated smoothly into `hole`. */\nexport function membraneFill(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>): Float32Array {\n const n = w * h;\n const out = new Float32Array(n * ch);\n const v = new Float32Array(n);\n for (let c = 0; c < ch; c++) {\n for (let i = 0; i < n; i++) v[i] = hole[i] ? 0 : img[i * ch + c];\n solveMembrane(w, h, hole, v);\n for (let i = 0; i < n; i++) out[i * ch + c] = v[i];\n }\n return out;\n}\n\n/** A mask grown by `r` pixels (square structuring element). */\nexport function dilateMask(w: number, h: number, mask: ArrayLike<boolean | number>, r: number): Uint8Array {\n const tmp = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!mask[y * w + x]) continue;\n for (let xx = Math.max(0, x - r); xx <= Math.min(w - 1, x + r); xx++) tmp[y * w + xx] = 1;\n }\n }\n const out = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!tmp[y * w + x]) continue;\n for (let yy = Math.max(0, y - r); yy <= Math.min(h - 1, y + r); yy++) out[yy * w + x] = 1;\n }\n }\n return out;\n}\n\n/** A summed-area table over a mask, for \"how many masked cells in this window\". */\nclass MaskIntegral {\n private readonly s: Uint32Array;\n constructor(\n private readonly w: number,\n private readonly h: number,\n mask: ArrayLike<boolean | number>\n ) {\n const W = w + 1;\n this.s = new Uint32Array(W * (h + 1));\n for (let y = 0; y < h; y++) {\n let row = 0;\n for (let x = 0; x < w; x++) {\n row += mask[y * w + x] ? 1 : 0;\n this.s[(y + 1) * W + x + 1] = this.s[y * W + x + 1] + row;\n }\n }\n }\n /** Masked cells in [x0, x1) × [y0, y1) (clipped to the grid). */\n count(x0: number, y0: number, x1: number, y1: number): number {\n const W = this.w + 1;\n const a = Math.max(0, Math.min(this.w, x0));\n const b = Math.max(0, Math.min(this.h, y0));\n const c = Math.max(0, Math.min(this.w, x1));\n const d = Math.max(0, Math.min(this.h, y1));\n if (c <= a || d <= b) return 0;\n return this.s[d * W + c] - this.s[b * W + c] - this.s[d * W + a] + this.s[b * W + a];\n }\n}\n\n/** Bounding box [x0, y0, x1, y1) of the set cells, or null. */\nexport function maskBounds(w: number, h: number, mask: ArrayLike<boolean | number>): [number, number, number, number] | null {\n let x0 = w;\n let y0 = h;\n let x1 = -1;\n let y1 = -1;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!mask[y * w + x]) continue;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n }\n return x1 < 0 ? null : [x0, y0, x1 + 1, y1 + 1];\n}\n\n/**\n * Proximity match: the translation `(dx, dy)` (within `maxRadius`) whose pixels best match the\n * ring of `ring` pixels around the hole (sum of squared differences), so `img[p + (dx, dy)]` can\n * fill `p` in the hole. The source window must lie on the grid and hold no hole pixels. Nearer\n * sources win ties. Returns null when no translation fits.\n */\nexport function bestOffset(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>, ring: number, maxRadius: number): [number, number] | null {\n const bb = maskBounds(w, h, hole);\n if (!bb) return null;\n const extent = Math.max(w, h);\n const R = Math.max(0, Math.min(extent, Math.floor(maxRadius)));\n if (R === 0) return null;\n const rg = Math.max(1, Math.min(extent, Math.floor(ring)));\n const hs = new MaskIntegral(w, h, hole);\n const x0 = bb[0] - rg;\n const y0 = bb[1] - rg;\n const x1 = bb[2] + rg;\n const y1 = bb[3] + rg;\n // Sample points: the ring around the hole, subsampled to about 2000.\n const pts: number[] = [];\n for (let y = Math.max(0, y0); y < Math.min(h, y1); y++) {\n for (let x = Math.max(0, x0); x < Math.min(w, x1); x++) {\n if (hole[y * w + x]) continue;\n if (hs.count(x - rg, y - rg, x + rg + 1, y + rg + 1) > 0) pts.push(x, y);\n }\n }\n const stride = Math.max(1, Math.floor(pts.length / 2 / 2000));\n const sx: number[] = [];\n const sy: number[] = [];\n for (let i = 0; i < pts.length; i += 2 * stride) {\n sx.push(pts[i]);\n sy.push(pts[i + 1]);\n }\n const n = Math.max(1, sx.length);\n const evalAt = (dx: number, dy: number, cutoff: number): number | null => {\n if (dx === 0 && dy === 0) return null;\n const hx0 = x0 + dx;\n const hy0 = y0 + dy;\n const hx1 = x1 + dx;\n const hy1 = y1 + dy;\n if (hx0 < 0 || hy0 < 0 || hx1 > w || hy1 > h) return null;\n if (hs.count(hx0, hy0, hx1, hy1) !== 0) return null;\n const penalty = 1 + 1e-3 * (Math.hypot(dx, dy) / R);\n let e = 0;\n for (let i = 0; i < sx.length; i++) {\n const a = (sy[i] * w + sx[i]) * ch;\n const b = ((sy[i] + dy) * w + sx[i] + dx) * ch;\n for (let c = 0; c < ch; c++) {\n const d = img[a + c] - img[b + c];\n e += d * d;\n }\n if ((i & 31) === 31 && (e / n) * penalty >= cutoff) return null;\n }\n return (e / n) * penalty;\n };\n const found: { best: [number, number] | null; e: number } = { best: null, e: Infinity };\n const consider = (dx: number, dy: number) => {\n const e = evalAt(dx, dy, found.e);\n if (e !== null && e < found.e) {\n found.e = e;\n found.best = [dx, dy];\n }\n };\n // A coarse grid over the search window, then every offset around the winner.\n const step = Math.max(1, Math.floor(R / 24));\n for (let dy = -R; dy <= R; dy += step) for (let dx = -R; dx <= R; dx += step) consider(dx, dy);\n if (step > 1 && found.best) {\n const [bx, by] = found.best;\n for (let dy = by - step; dy <= by + step; dy++) for (let dx = bx - step; dx <= bx + step; dx++) consider(dx, dy);\n }\n return found.best;\n}\n","// Portions ported from photocraft/crates/paint/src/retouch.rs, crates/algo/src/retouch.rs and crates/engine/src/retouch_cmds.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * The retouching tools on the shared brush engine: Clone Stamp, Healing Brush, Spot Healing\n * Brush, Smudge, Dodge, Burn and Sponge. Two stroke shapes cover them all:\n *\n * - **Accumulate, then composite** (Clone Stamp, Dodge, Burn; the Healing tools' result): the\n * stroke's dabs build up one `CoverageMap` (flow builds towards the dab's opacity ceiling), and\n * per-pixel paint taken from the pre-stroke state (a cloned source, a toned copy of the pixel,\n * a healed patch) is composited through it with `applyRetouchToTile`. Pixels painted earlier in\n * the stroke are never sampled again, and overlapping dabs never exceed the stroke's opacity.\n * - **Sequential dabs** (Smudge, Sponge): `RetouchDabStroke` runs each dab in order over live\n * tiles, so dab n sees what dab n − 1 did.\n *\n * The Healing Brush clones while it is drawn and, when the stroke ends, replaces the clone with a\n * seamless clone (`healPixels`, Poisson blending): the source's texture with the colour and light\n * of the pixels around the stroke. The Spot Healing Brush finds its own source (`spotHealPixels`).\n *\n * Tone curves (`dodgeBurnCurve`, `dodgeBurn`, `sponge`) are photocraft's, made to behave like\n * Photoshop's tools: the chosen range moves most, black and white stay put for midtones, and\n * Protect Tones works on luma so hue and saturation are kept. Data in, pixels out; no DOM.\n */\n\nimport { blendPixel, type BlendMode } from '../raster/blend';\nimport type { RasterRect } from '../raster/surface';\nimport { TILE, tileKey } from '../raster/surface';\nimport { DabWalker, dabRect, rasterizeDab, type BrushSettings, type CoverageMap, type Dab, type StrokePoint } from './brush';\nimport { SmudgeTip, type SmudgeSettings } from './blending';\nimport { TileMedium, type PaintTileTarget } from './exchange';\nimport { bestOffset, dilateMask, maskBounds, membraneFill, seamlessClone } from './heal';\n\n// ---------------------------------------------------------------------------\n// Tone kernels\n// ---------------------------------------------------------------------------\n\n/** The tonal range Dodge and Burn work on most. */\nexport type ToneRange = 'shadows' | 'midtones' | 'highlights';\n\nexport const TONE_RANGES: readonly ToneRange[] = ['shadows', 'midtones', 'highlights'];\n\n/** Rec. 601 luma of straight RGB (0..1). */\nexport function luma(r: number, g: number, b: number): number {\n return 0.299 * r + 0.587 * g + 0.114 * b;\n}\n\n/** The dodge (or burn) transfer of one value `v` (0..1) at exposure `e` (0..1). */\nexport function dodgeBurnCurve(v: number, e: number, range: ToneRange, burn: boolean): number {\n const x = Math.max(0, v);\n const k = Math.min(1, Math.max(0, e));\n const c = Math.min(1, x);\n if (range === 'midtones') {\n // A gamma bend weighted to peak at mid-grey: 0 and 1 stay where they are.\n const w = Math.min(1, Math.max(0, 4 * x * (1 - x)));\n return x + w * (Math.pow(c, burn ? 1 + k : 1 / (1 + k)) - x);\n }\n // Shadows / highlights: `v + e·w·(target − v)`, weighted (1 − v)² or v², so that end moves most.\n const w = range === 'shadows' ? (1 - c) * (1 - c) : c * c;\n return burn ? x - k * w * x : x + k * w * (1 - c);\n}\n\n/** Brings RGB back into 0..1 keeping its luma (mixing towards grey) rather than clipping each channel. */\nfunction compressGamut(c: number[], l: number): void {\n const L = Math.min(1, Math.max(0, l));\n const lo = Math.min(c[0], c[1], c[2]);\n const hi = Math.max(c[0], c[1], c[2]);\n let t = 1;\n if (hi > 1 && hi - L > 1e-9) t = Math.min(t, (1 - L) / (hi - L));\n if (lo < 0 && L - lo > 1e-9) t = Math.min(t, L / (L - lo));\n for (let i = 0; i < 3; i++) c[i] = L + (c[i] - L) * t;\n}\n\n/**\n * Dodge (or burn) straight RGB `c` (0..1, written in place) at exposure `e`. With `protectTones`\n * the curve moves luma and the colour is scaled to it (hue and saturation kept); otherwise each\n * channel goes through the curve.\n */\nexport function dodgeBurn(c: number[], e: number, range: ToneRange, burn: boolean, protectTones: boolean): number[] {\n if (!(e > 0)) return c;\n if (protectTones) {\n const l = luma(c[0], c[1], c[2]);\n const nl = dodgeBurnCurve(l, e, range, burn);\n if (l > 1e-6) for (let i = 0; i < 3; i++) c[i] *= nl / l;\n else c[0] = c[1] = c[2] = nl;\n compressGamut(c, nl);\n } else for (let i = 0; i < 3; i++) c[i] = dodgeBurnCurve(c[i], e, range, burn);\n return c;\n}\n\n/** HSV saturation (chroma / max) of straight RGB. */\nexport function saturationOf(r: number, g: number, b: number): number {\n const lo = Math.min(r, g, b);\n const hi = Math.max(r, g, b);\n return hi <= 1e-6 ? 0 : Math.min(1, Math.max(0, (hi - lo) / hi));\n}\n\n/**\n * Sponge: moves straight RGB `c` (written in place) away from (`saturate`) or towards its luma\n * grey by `amount` (0..1). `vibrance` damps it where it would clip: saturating touches already\n * saturated colours less, desaturating touches near-greys less. Gamut-compressed, never clipped.\n */\nexport function sponge(c: number[], amount: number, saturate: boolean, vibrance: boolean): number[] {\n let a = Math.min(1, Math.max(0, amount));\n if (!(a > 0)) return c;\n if (vibrance) {\n const s = saturationOf(c[0], c[1], c[2]);\n a *= saturate ? 1 - s : 0.25 + 0.75 * s;\n }\n const l = luma(c[0], c[1], c[2]);\n const k = saturate ? 1 + a : 1 - a;\n for (let i = 0; i < 3; i++) c[i] = l + (c[i] - l) * k;\n compressGamut(c, l);\n return c;\n}\n\n/** Per-dab strength so that one pass over a point totals about `e`, whatever the spacing. */\nexport function perDabStrength(e: number, spacing: number): number {\n return 1 - Math.pow(1 - Math.min(1, Math.max(0, e)), Math.min(1, Math.max(0.01, spacing)));\n}\n\n// ---------------------------------------------------------------------------\n// Settings\n// ---------------------------------------------------------------------------\n\n/** Which pixels the Clone Stamp and the Healing tools sample. */\nexport type RetouchSample = 'current' | 'current-below' | 'all';\n\nexport const RETOUCH_SAMPLES: readonly RetouchSample[] = ['current', 'current-below', 'all'];\n\n/** How the Spot Healing Brush finds its source. */\nexport type SpotHealType = 'proximity-match' | 'smooth';\n\nexport const SPOT_HEAL_TYPES: readonly SpotHealType[] = ['proximity-match', 'smooth'];\n\n/** The retouching tools' options. */\nexport interface RetouchSettings {\n /** Clone / heal: keep the source offset from stroke to stroke (default true); off, every stroke starts at the source point. */\n aligned: boolean;\n /** Clone / heal / spot heal: what is sampled (default `current`: the target layer). */\n sample: RetouchSample;\n /** Spot heal: `proximity-match` (default: the best matching patch nearby) or `smooth` (a smooth fill from the edges). */\n spotType: SpotHealType;\n /** Dodge / burn: the tonal range (default `midtones`). */\n range: ToneRange;\n /** Dodge / burn: exposure 0..1 (default 0.5). */\n exposure: number;\n /** Dodge / burn: tone luma only, keeping hue and saturation (default true). */\n protectTones: boolean;\n /** Sponge: `desaturate` (default) or `saturate`. */\n spongeMode: 'desaturate' | 'saturate';\n /** Sponge: damp the change where colours would clip (default true). */\n vibrance: boolean;\n /** Smudge: how strongly the finger carries and lays paint, 0..1 (default 0.5). */\n strength: number;\n}\n\nexport const DEFAULT_RETOUCH: Readonly<RetouchSettings> = {\n aligned: true,\n sample: 'current',\n spotType: 'proximity-match',\n range: 'midtones',\n exposure: 0.5,\n protectTones: true,\n spongeMode: 'desaturate',\n vibrance: true,\n strength: 0.5,\n};\n\n/** Retouch settings with every field valid (missing or invalid fields from `base`). */\nexport function normalizeRetouch(raw: Partial<RetouchSettings> = {}, base: RetouchSettings = DEFAULT_RETOUCH): RetouchSettings {\n const unit = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(0, v)) : d);\n const bool = (v: unknown, d: boolean) => (typeof v === 'boolean' ? v : d);\n const pick = <T extends string>(v: unknown, all: readonly T[], d: T): T => (all.includes(v as T) ? (v as T) : d);\n return {\n aligned: bool(raw.aligned, base.aligned),\n sample: pick(raw.sample, RETOUCH_SAMPLES, base.sample),\n spotType: pick(raw.spotType, SPOT_HEAL_TYPES, base.spotType),\n range: pick(raw.range, TONE_RANGES, base.range),\n exposure: unit(raw.exposure, base.exposure),\n protectTones: bool(raw.protectTones, base.protectTones),\n spongeMode: pick(raw.spongeMode, ['desaturate', 'saturate'] as const, base.spongeMode),\n vibrance: bool(raw.vibrance, base.vibrance),\n strength: unit(raw.strength, base.strength),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pixel sources\n// ---------------------------------------------------------------------------\n\n/** Pixels a retouching stroke samples, by document pixel. */\nexport interface PixelSource {\n /** Straight RGBA 0..255 of document pixel (x, y) into `out`; false (and `out` zeroed) where there is nothing. */\n sample(x: number, y: number, out: number[]): boolean;\n}\n\n/**\n * A source over raster tiles (layer pixels, a mask, or composite tiles): `readTile` gives tile\n * (tx, ty) in source space or `null` when it is empty; source pixel = document pixel − `offset`.\n * One-channel tiles read as grey (alpha 255). Tiles are cached, so make one per stroke.\n */\nexport class TilePixelSource implements PixelSource {\n private readonly cache = new Map<number, Uint8ClampedArray | null>();\n private lastKey = NaN;\n private last: Uint8ClampedArray | null = null;\n\n constructor(\n private readonly readTile: (tx: number, ty: number) => Uint8ClampedArray | null,\n readonly channels: 1 | 4,\n readonly offset: { x: number; y: number } = { x: 0, y: 0 }\n ) {}\n\n sample(x: number, y: number, out: number[]): boolean {\n const lx = x - this.offset.x;\n const ly = y - this.offset.y;\n const tx = Math.floor(lx / TILE);\n const ty = Math.floor(ly / TILE);\n const key = tileKey(tx, ty);\n if (key !== this.lastKey) {\n let t = this.cache.get(key);\n if (t === undefined) {\n t = this.readTile(tx, ty);\n this.cache.set(key, t);\n }\n this.last = t;\n this.lastKey = key;\n }\n const t = this.last;\n if (!t) {\n out[0] = out[1] = out[2] = out[3] = 0;\n return false;\n }\n const p = (ly - ty * TILE) * TILE + (lx - tx * TILE);\n if (this.channels === 1) {\n out[0] = out[1] = out[2] = t[p];\n out[3] = 255;\n return true;\n }\n const i = p * 4;\n out[0] = t[i];\n out[1] = t[i + 1];\n out[2] = t[i + 2];\n out[3] = t[i + 3];\n return out[3] > 0;\n }\n}\n\n/** A source over a region of float RGBA pixels (0..255), e.g. a healed patch. */\nexport class RegionPixelSource implements PixelSource {\n constructor(\n readonly rect: RasterRect,\n readonly data: Float32Array\n ) {}\n\n sample(x: number, y: number, out: number[]): boolean {\n const r = this.rect;\n const lx = x - r.x;\n const ly = y - r.y;\n if (lx < 0 || ly < 0 || lx >= r.width || ly >= r.height) {\n out[0] = out[1] = out[2] = out[3] = 0;\n return false;\n }\n const i = (ly * r.width + lx) * 4;\n out[0] = this.data[i];\n out[1] = this.data[i + 1];\n out[2] = this.data[i + 2];\n out[3] = this.data[i + 3];\n return out[3] > 0;\n }\n}\n\n/** `rect` of a source, shifted by (dx, dy), as float RGBA 0..255 (`rect.width × rect.height × 4`). */\nexport function readSourceRegion(source: PixelSource, rect: RasterRect, dx = 0, dy = 0): Float32Array {\n const out = new Float32Array(rect.width * rect.height * 4);\n const px = [0, 0, 0, 0];\n for (let y = 0; y < rect.height; y++) {\n for (let x = 0; x < rect.width; x++) {\n source.sample(rect.x + x + dx, rect.y + y + dy, px);\n const i = (y * rect.width + x) * 4;\n out[i] = px[0];\n out[i + 1] = px[1];\n out[i + 2] = px[2];\n out[i + 3] = px[3];\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Accumulate, then composite\n// ---------------------------------------------------------------------------\n\n/** What a coverage-based retouching stroke lays through its coverage. */\nexport type RetouchPaint =\n /** Source pixels at document pixel + (dx, dy) (Clone Stamp, a healed patch). */\n | { kind: 'source'; source: PixelSource; dx: number; dy: number }\n /** The target pixel itself, toned (Dodge, Burn): `tone` edits straight RGB 0..1 in place. */\n | { kind: 'tone'; tone: (rgb: number[]) => void }\n /** A flat colour (the Spot Healing Brush's trail while it is drawn), RGBA 0..255. */\n | { kind: 'color'; color: readonly [number, number, number, number] };\n\n/** How a coverage-based retouching stroke composites. */\nexport interface RetouchApply {\n /** Stroke opacity 0..1. */\n opacity: number;\n /** Blend mode for source paint (default normal). */\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 `paint` through the stroke's coverage over `tileData` (target tile (tx, ty) as it was\n * before the stroke, layer space; RGBA, or one byte per pixel for masks) and returns the new tile.\n * With `into` (the previous result) and `region` (document space), only `region` is recomputed.\n * Tone paint keeps alpha; source and colour paint composite with `blend` (source-over by\n * default), keeping alpha on a locked layer.\n */\nexport function applyRetouchToTile(\n coverage: CoverageMap,\n tileData: Uint8ClampedArray,\n channels: 1 | 4,\n tx: number,\n ty: number,\n paint: RetouchPaint,\n s: RetouchApply,\n options: { into?: Uint8ClampedArray; region?: RasterRect } = {}\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 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 blend = s.blend ?? 'normal';\n const src = [0, 0, 0, 0];\n const rgb = [0, 0, 0];\n const cb = [0, 0, 0, 0];\n const cs = [0, 0, 0, 0];\n // The coverage tile under the pixel, looked up once per tile it crosses.\n let covKey = NaN;\n let covTile: Float32Array | undefined;\n for (let y = y0; y < y1; y++) {\n const dy = oy + y;\n const cty = Math.floor(dy / TILE);\n for (let x = x0; x < x1; x++) {\n const dx = ox + x;\n const ctx = Math.floor(dx / TILE);\n const key = tileKey(ctx, cty);\n if (key !== covKey) {\n covKey = key;\n covTile = coverage.tiles.get(key);\n }\n if (!covTile) continue;\n const c = covTile[(dy - cty * TILE) * TILE + (dx - ctx * TILE)];\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 // Masks: grey values; the source's grey is its red channel.\n const g = out[p];\n let t: number;\n if (paint.kind === 'tone') {\n rgb[0] = rgb[1] = rgb[2] = g / 255;\n paint.tone(rgb);\n t = luma(rgb[0], rgb[1], rgb[2]) * 255;\n } else if (paint.kind === 'color') t = paint.color[0];\n else {\n if (!paint.source.sample(dx + paint.dx, dy + paint.dy, src)) continue;\n t = src[0];\n k *= src[3] / 255;\n }\n out[p] = Math.round(g + (t - g) * k);\n continue;\n }\n const i = p * 4;\n const a = out[i + 3];\n if (paint.kind === 'tone') {\n if (a === 0) continue;\n rgb[0] = out[i] / 255;\n rgb[1] = out[i + 1] / 255;\n rgb[2] = out[i + 2] / 255;\n const r0 = rgb[0];\n const g0 = rgb[1];\n const b0 = rgb[2];\n paint.tone(rgb);\n out[i] = Math.round((r0 + (rgb[0] - r0) * k) * 255);\n out[i + 1] = Math.round((g0 + (rgb[1] - g0) * k) * 255);\n out[i + 2] = Math.round((b0 + (rgb[2] - b0) * k) * 255);\n continue;\n }\n if (s.lockTransparency && a === 0) continue;\n if (paint.kind === 'color') {\n src[0] = paint.color[0];\n src[1] = paint.color[1];\n src[2] = paint.color[2];\n src[3] = paint.color[3];\n } else if (!paint.source.sample(dx + paint.dx, dy + paint.dy, src)) continue;\n for (let ch = 0; ch < 4; ch++) {\n cb[ch] = out[i + ch] / 255;\n cs[ch] = src[ch] / 255;\n }\n // Source-over, as a brush lays paint: cloning transparency paints nothing.\n const o = blendPixel(blend, cb, cs, 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/** The tone function of a Dodge or Burn stroke. */\nexport function toneOf(tool: 'dodge' | 'burn', settings: Pick<RetouchSettings, 'exposure' | 'range' | 'protectTones'>): (rgb: number[]) => void {\n const burn = tool === 'burn';\n return (rgb) => {\n dodgeBurn(rgb, settings.exposure, settings.range, burn, settings.protectTones);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Healing\n// ---------------------------------------------------------------------------\n\n/**\n * Heals `src` into `dst` over `mask` (all `w × h`, RGBA floats 0..255): a seamless clone solved\n * only over the mask's bounds plus a one-pixel fixed ring; elsewhere the result is `dst`.\n */\nexport function healPixels(w: number, h: number, src: Float32Array, dst: Float32Array, mask: ArrayLike<boolean | number>): Float32Array {\n const out = new Float32Array(dst);\n const bb = maskBounds(w, h, mask);\n if (!bb) return out;\n const x0 = Math.max(0, bb[0] - 1);\n const y0 = Math.max(0, bb[1] - 1);\n const x1 = Math.min(w, bb[2] + 1);\n const y1 = Math.min(h, bb[3] + 1);\n const rw = x1 - x0;\n const rh = y1 - y0;\n const s = new Float32Array(rw * rh * 4);\n const d = new Float32Array(rw * rh * 4);\n const m = new Uint8Array(rw * rh);\n for (let y = 0; y < rh; y++) {\n for (let x = 0; x < rw; x++) {\n const gi = (y + y0) * w + x + x0;\n const li = y * rw + x;\n m[li] = mask[gi] ? 1 : 0;\n for (let c = 0; c < 4; c++) {\n s[li * 4 + c] = src[gi * 4 + c];\n d[li * 4 + c] = dst[gi * 4 + c];\n }\n }\n }\n const healed = seamlessClone(rw, rh, 4, s, d, m);\n for (let y = 0; y < rh; y++) {\n for (let x = 0; x < rw; x++) {\n const gi = ((y + y0) * w + x + x0) * 4;\n const li = (y * rw + x) * 4;\n for (let c = 0; c < 4; c++) out[gi + c] = Math.min(255, Math.max(0, healed[li + c]));\n }\n }\n return out;\n}\n\n/**\n * Spot healing: fills `hole` (`w × h`) of `img` (RGBA floats 0..255) with no given source, then\n * heals the fill into its surroundings. `proximity-match` copies the best matching nearby patch\n * (falling back to `smooth` when none fits); `smooth` interpolates the edges inwards. `size` is\n * the brush diameter in pixels. Returns the healed pixels over the whole grid.\n */\nexport function spotHealPixels(\n w: number,\n h: number,\n img: Float32Array,\n hole: ArrayLike<boolean | number>,\n size: number,\n type: SpotHealType,\n /** Told the patch offset it copied (`null`: a smooth fill). */\n onOffset?: (offset: [number, number] | null) => void\n): Float32Array {\n // Fill a slightly larger domain than the healed area, so the solve's boundary sees filled values\n // that differ from the untouched pixels: that mismatch is what the membrane corrects.\n const domain = dilateMask(w, h, hole, 2);\n const healMask = dilateMask(w, h, hole, 1);\n let filled: Float32Array | null = null;\n let bestFound: [number, number] | null = null;\n if (type === 'proximity-match') {\n const ring = Math.min(16, Math.max(3, Math.floor(size / 8)));\n const off = bestOffset(w, h, 4, img, domain, ring, Math.floor(Math.max(w, h) / 2));\n if (off) {\n bestFound = off;\n // Copy from the pre-healing pixels, never from what this loop already wrote.\n filled = new Float32Array(img);\n const [ddx, ddy] = off;\n for (let i = 0; i < w * h; i++) {\n if (!domain[i]) continue;\n const x = (i % w) + ddx;\n const y = Math.floor(i / w) + ddy;\n const j = (y * w + x) * 4;\n for (let c = 0; c < 4; c++) filled[i * 4 + c] = img[j + c];\n }\n }\n }\n onOffset?.(filled ? (bestFound as [number, number]) : null);\n if (!filled) filled = membraneFill(w, h, 4, img, domain);\n return healPixels(w, h, filled, img, healMask);\n}\n\n/** The window a Spot Healing stroke over `bounds` looks for texture in: the bounds grown by their size, on the canvas. */\nexport function spotHealWindow(bounds: RasterRect, canvas: { width: number; height: number }): RasterRect {\n const g = Math.max(8, Math.ceil(Math.max(bounds.width, bounds.height)));\n const x0 = Math.max(0, bounds.x - g);\n const y0 = Math.max(0, bounds.y - g);\n const x1 = Math.min(canvas.width, bounds.x + bounds.width + g);\n const y1 = Math.min(canvas.height, bounds.y + bounds.height + g);\n return { x: x0, y: y0, width: Math.max(0, x1 - x0), height: Math.max(0, y1 - y0) };\n}\n\n// ---------------------------------------------------------------------------\n// Sequential dabs\n// ---------------------------------------------------------------------------\n\n/**\n * One dab of a sequential retouching stroke: `cov` is the tip's pure coverage over `rect`\n * (document space, 0..1); `d.alpha` is the flow and `d.opacity` the pressure opacity.\n */\nexport type RetouchDabEffect = (medium: TileMedium, d: Dab, rect: RasterRect, cov: Float32Array) => void;\n\n/**\n * A stroke whose dabs edit live tiles in order (Smudge, Sponge). Feed points with `push` (any\n * chunks give the same dabs), end with `finish`; each returns the document rectangles it touched.\n */\nexport class RetouchDabStroke {\n dabCount = 0;\n bounds: RasterRect | null = null;\n private readonly walker: DabWalker;\n private readonly medium: TileMedium;\n private smoothPos: StrokePoint | null = null;\n private buf = new Float32Array(0);\n\n constructor(\n readonly brush: BrushSettings,\n target: PaintTileTarget,\n private readonly effect: RetouchDabEffect\n ) {\n this.walker = new DabWalker(brush);\n this.medium = new TileMedium(target);\n }\n\n push(points: readonly StrokePoint[]): RasterRect[] {\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 finish(last?: StrokePoint): RasterRect[] {\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.brush.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[]): RasterRect[] {\n const rects: RasterRect[] = [];\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 cov = this.buf.subarray(0, n);\n rasterizeDab({ ...d, alpha: 1 }, this.brush.hardness, rect, cov);\n this.medium.reset();\n this.effect(this.medium, d, rect, cov);\n rects.push(rect);\n this.bounds = unionRect(this.bounds, rect);\n this.dabCount++;\n }\n return rects;\n }\n}\n\n/** The Smudge's per-dab effect: a `SmudgeTip` whose strength carries and lays the paint. */\nexport function smudgeEffect(brush: BrushSettings, strength: number, mixing: SmudgeSettings['mixing'] = 'rgb'): RetouchDabEffect {\n const s = Math.min(1, Math.max(0, strength));\n const tip = new SmudgeTip({ strength: s, length: s, mixing }, brush.size);\n return (medium, d, rect, cov) => tip.dab(medium, { x: d.x, y: d.y, radius: d.radius, opacity: d.opacity * d.alpha }, rect, cov);\n}\n\n/** The Sponge's per-dab effect: each dab moves saturation by about half its flow, compounding over passes. */\nexport function spongeEffect(brush: BrushSettings, saturate: boolean, vibrance: boolean): RetouchDabEffect {\n const rgb = [0, 0, 0];\n return (medium, d, rect, cov) => {\n const w = rect.width;\n for (let yy = 0; yy < rect.height; yy++) {\n for (let xx = 0; xx < w; xx++) {\n const cv = cov[yy * w + xx];\n if (cv <= 0) continue;\n const dx = rect.x + xx;\n const dy = rect.y + yy;\n const k = perDabStrength(cv * d.alpha * d.opacity * 0.5, brush.spacing) * medium.selectionAt(dx, dy);\n if (k <= 0) continue;\n const ri = medium.locate(dx, dy, false);\n if (ri < 0 || medium.pixels[ri + 3] === 0) continue;\n const i = medium.locate(dx, dy, true);\n const px = medium.pixels;\n rgb[0] = px[i] / 255;\n rgb[1] = px[i + 1] / 255;\n rgb[2] = px[i + 2] / 255;\n sponge(rgb, k, saturate, vibrance);\n px[i] = Math.round(rgb[0] * 255);\n px[i + 1] = Math.round(rgb[1] * 255);\n px[i + 2] = Math.round(rgb[2] * 255);\n }\n }\n };\n}\n\n/**\n * An RGBA view of one-channel tiles (masks), for the sequential-dab tools: reads expand grey to\n * opaque RGB, writes land in RGBA copies, and `flush` writes their red channel back through\n * `target.writeTile`. Alpha is locked, so a mask's values are all a dab changes.\n */\nexport function rgbaViewOfGrey(target: PaintTileTarget): { target: PaintTileTarget; flush(): void } {\n const views = new Map<number, Uint8ClampedArray>();\n const dirty = new Map<number, { tx: number; ty: number; data: Uint8ClampedArray }>();\n const expand = (g: Uint8ClampedArray) => {\n const out = new Uint8ClampedArray(g.length * 4);\n for (let i = 0; i < g.length; i++) {\n out[i * 4] = out[i * 4 + 1] = out[i * 4 + 2] = g[i];\n out[i * 4 + 3] = 255;\n }\n return out;\n };\n const view: PaintTileTarget = {\n offset: target.offset,\n lockTransparency: true,\n selection: target.selection,\n readTile: (tx, ty) => {\n const key = tileKey(tx, ty);\n let v = views.get(key);\n if (!v) {\n // An empty mask tile is still values (0), not transparency: always give a tile.\n v = expand(target.readTile(tx, ty) ?? new Uint8ClampedArray(TILE * TILE));\n views.set(key, v);\n }\n return v;\n },\n writeTile: (tx, ty) => {\n const key = tileKey(tx, ty);\n let v = views.get(key);\n if (!v) {\n v = expand(target.readTile(tx, ty) ?? new Uint8ClampedArray(TILE * TILE));\n views.set(key, v);\n }\n dirty.set(key, { tx, ty, data: v });\n return v;\n },\n };\n return {\n target: view,\n flush: () => {\n for (const { tx, ty, data } of dirty.values()) {\n const g = target.writeTile(tx, ty);\n for (let i = 0; i < g.length; i++) g[i] = data[i * 4];\n }\n dirty.clear();\n },\n };\n}\n\nfunction unionRect(a: RasterRect | null, b: RasterRect): RasterRect {\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"]}