@pixerate/editor 0.22.0 → 0.23.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 (83) hide show
  1. package/README.md +80 -2
  2. package/THIRD_PARTY_NOTICES.md +88 -0
  3. package/dist/agent/index.cjs +83 -108
  4. package/dist/agent/index.cjs.map +1 -1
  5. package/dist/agent/index.d.cts +69 -211
  6. package/dist/agent/index.d.ts +69 -211
  7. package/dist/agent/index.js +76 -101
  8. package/dist/agent/index.js.map +1 -1
  9. package/dist/arrangeShortcuts-B8O3f8-P.d.cts +184 -0
  10. package/dist/arrangeShortcuts-sLlD2rSX.d.ts +184 -0
  11. package/dist/canvas/index.cjs +879 -83
  12. package/dist/canvas/index.cjs.map +1 -1
  13. package/dist/canvas/index.d.cts +291 -186
  14. package/dist/canvas/index.d.ts +291 -186
  15. package/dist/canvas/index.js +865 -69
  16. package/dist/canvas/index.js.map +1 -1
  17. package/dist/chunk-26BVFKHU.cjs +453 -0
  18. package/dist/chunk-26BVFKHU.cjs.map +1 -0
  19. package/dist/chunk-2H7ZHPEJ.js +762 -0
  20. package/dist/chunk-2H7ZHPEJ.js.map +1 -0
  21. package/dist/chunk-7DWMJCAT.js +453 -0
  22. package/dist/chunk-7DWMJCAT.js.map +1 -0
  23. package/dist/chunk-ARRTP33I.js +101 -0
  24. package/dist/chunk-ARRTP33I.js.map +1 -0
  25. package/dist/chunk-CPOKFNBG.cjs +101 -0
  26. package/dist/chunk-CPOKFNBG.cjs.map +1 -0
  27. package/dist/chunk-G2I4QJOT.cjs +762 -0
  28. package/dist/chunk-G2I4QJOT.cjs.map +1 -0
  29. package/dist/{chunk-RU52I7QO.js → chunk-K3R5NG2D.js} +147 -42
  30. package/dist/chunk-K3R5NG2D.js.map +1 -0
  31. package/dist/{chunk-DENSCKFC.js → chunk-QBJ22YZR.js} +423 -30
  32. package/dist/chunk-QBJ22YZR.js.map +1 -0
  33. package/dist/{chunk-SAZRENEZ.cjs → chunk-RIKBJLS2.cjs} +424 -31
  34. package/dist/chunk-RIKBJLS2.cjs.map +1 -0
  35. package/dist/{chunk-6M3BCTBD.cjs → chunk-XDMXXC4Z.cjs} +230 -125
  36. package/dist/chunk-XDMXXC4Z.cjs.map +1 -0
  37. package/dist/commands/index.cjs +860 -0
  38. package/dist/commands/index.cjs.map +1 -0
  39. package/dist/commands/index.d.cts +592 -0
  40. package/dist/commands/index.d.ts +592 -0
  41. package/dist/commands/index.js +860 -0
  42. package/dist/commands/index.js.map +1 -0
  43. package/dist/{controller-B7GIybc4.d.cts → controller-pePCJLT1.d.cts} +78 -5
  44. package/dist/{controller-B7GIybc4.d.ts → controller-pePCJLT1.d.ts} +78 -5
  45. package/dist/history/index.cjs +12 -2
  46. package/dist/history/index.cjs.map +1 -1
  47. package/dist/history/index.d.cts +211 -7
  48. package/dist/history/index.d.ts +211 -7
  49. package/dist/history/index.js +13 -3
  50. package/dist/image-editor/index.cjs +418 -13
  51. package/dist/image-editor/index.cjs.map +1 -1
  52. package/dist/image-editor/index.d.cts +154 -3
  53. package/dist/image-editor/index.d.ts +154 -3
  54. package/dist/image-editor/index.js +417 -12
  55. package/dist/image-editor/index.js.map +1 -1
  56. package/dist/index.cjs +34 -76
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.cts +5 -42
  59. package/dist/index.d.ts +5 -42
  60. package/dist/index.js +27 -69
  61. package/dist/index.js.map +1 -1
  62. package/dist/registry-D5-R90p0.d.cts +209 -0
  63. package/dist/registry-D5-R90p0.d.ts +209 -0
  64. package/dist/spreadsheet/index.cjs +19 -3
  65. package/dist/spreadsheet/index.cjs.map +1 -1
  66. package/dist/spreadsheet/index.d.cts +67 -9
  67. package/dist/spreadsheet/index.d.ts +67 -9
  68. package/dist/spreadsheet/index.js +18 -2
  69. package/dist/{types-CJ4U-HHI.d.cts → types-DX4Mh4SL.d.cts} +1 -1
  70. package/dist/{types-CJ4U-HHI.d.ts → types-DX4Mh4SL.d.ts} +1 -1
  71. package/dist/types-GT5a5YAX.d.cts +86 -0
  72. package/dist/types-GT5a5YAX.d.ts +86 -0
  73. package/package.json +8 -2
  74. package/dist/chunk-2TWGLC5K.cjs +0 -262
  75. package/dist/chunk-2TWGLC5K.cjs.map +0 -1
  76. package/dist/chunk-6M3BCTBD.cjs.map +0 -1
  77. package/dist/chunk-DENSCKFC.js.map +0 -1
  78. package/dist/chunk-KAADNAPF.js +0 -262
  79. package/dist/chunk-KAADNAPF.js.map +0 -1
  80. package/dist/chunk-RU52I7QO.js.map +0 -1
  81. package/dist/chunk-SAZRENEZ.cjs.map +0 -1
  82. package/dist/types-BZgcDsC5.d.cts +0 -42
  83. package/dist/types-BZgcDsC5.d.ts +0 -42
@@ -1,9 +1,252 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3;// src/image-editor/filters.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3;// src/image-editor/color.ts
2
+ var LEGACY_PROCESS_VERSION = 1;
3
+ var LATEST_PROCESS_VERSION = 2;
4
+ function normalizeProcessVersion(value) {
5
+ if (typeof value !== "number" || !Number.isInteger(value)) return LEGACY_PROCESS_VERSION;
6
+ return value >= LATEST_PROCESS_VERSION ? LATEST_PROCESS_VERSION : LEGACY_PROCESS_VERSION;
7
+ }
8
+ function srgbToLinear(v) {
9
+ return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
10
+ }
11
+ function linearToSrgb(v) {
12
+ return v <= 31308e-7 ? v * 12.92 : 1.055 * Math.pow(v, 1 / 2.4) - 0.055;
13
+ }
14
+ var LUMA_709 = [0.2126, 0.7152, 0.0722];
15
+ var IDENTITY_MATRIX3 = [1, 0, 0, 0, 1, 0, 0, 0, 1];
16
+ function mulMatrix3(a, b) {
17
+ const out = new Array(9).fill(0);
18
+ for (let r = 0; r < 3; r++) {
19
+ for (let c = 0; c < 3; c++) {
20
+ out[r * 3 + c] = a[r * 3] * b[c] + a[r * 3 + 1] * b[3 + c] + a[r * 3 + 2] * b[6 + c];
21
+ }
22
+ }
23
+ return out;
24
+ }
25
+ function applyMatrix3(m, v) {
26
+ return [
27
+ m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
28
+ m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
29
+ m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
30
+ ];
31
+ }
32
+ function invertMatrix3(m) {
33
+ const [a, b, c, d, e, f, g, h, i] = m;
34
+ const A = e * i - f * h;
35
+ const B = -(d * i - f * g);
36
+ const C = d * h - e * g;
37
+ const det = a * A + b * B + c * C;
38
+ if (!Number.isFinite(det) || Math.abs(det) < 1e-12) return null;
39
+ const k = 1 / det;
40
+ return [
41
+ A * k,
42
+ -(b * i - c * h) * k,
43
+ (b * f - c * e) * k,
44
+ B * k,
45
+ (a * i - c * g) * k,
46
+ -(a * f - c * d) * k,
47
+ C * k,
48
+ -(a * h - b * g) * k,
49
+ (a * e - b * d) * k
50
+ ];
51
+ }
52
+ function diag3(x, y, z) {
53
+ return [x, 0, 0, 0, y, 0, 0, 0, z];
54
+ }
55
+ var D65 = { x: 0.3127, y: 0.329 };
56
+ function xyToXyz(p) {
57
+ return [p.x / p.y, 1, (1 - p.x - p.y) / p.y];
58
+ }
59
+ function xyzToXy(v) {
60
+ const s = v[0] + v[1] + v[2];
61
+ return s <= 0 ? { ...D65 } : { x: v[0] / s, y: v[1] / s };
62
+ }
63
+ var SRGB_TO_XYZ = (() => {
64
+ const p = [{ x: 0.64, y: 0.33 }, { x: 0.3, y: 0.6 }, { x: 0.15, y: 0.06 }].map(xyToXyz);
65
+ const m = [p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1], p[0][2], p[1][2], p[2][2]];
66
+ const inv = invertMatrix3(m);
67
+ const s = inv ? applyMatrix3(inv, xyToXyz(D65)) : [1, 1, 1];
68
+ return mulMatrix3(m, diag3(s[0], s[1], s[2]));
69
+ })();
70
+ var XYZ_TO_SRGB = _nullishCoalesce(invertMatrix3(SRGB_TO_XYZ), () => ( IDENTITY_MATRIX3));
71
+ var BRADFORD = [0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296];
72
+ var BRADFORD_INV = _nullishCoalesce(invertMatrix3(BRADFORD), () => ( IDENTITY_MATRIX3));
73
+ function bradfordAdaptation(src, dst) {
74
+ if (src.x === dst.x && src.y === dst.y) return [...IDENTITY_MATRIX3];
75
+ const s = applyMatrix3(BRADFORD, xyToXyz(src));
76
+ const d = applyMatrix3(BRADFORD, xyToXyz(dst));
77
+ return mulMatrix3(BRADFORD_INV, mulMatrix3(diag3(d[0] / s[0], d[1] / s[1], d[2] / s[2]), BRADFORD));
78
+ }
79
+ function wbMatrix(src) {
80
+ return mulMatrix3(XYZ_TO_SRGB, mulMatrix3(bradfordAdaptation(src, D65), SRGB_TO_XYZ));
81
+ }
82
+ function linearSrgbToXy(rgb) {
83
+ return xyzToXy(applyMatrix3(SRGB_TO_XYZ, rgb));
84
+ }
85
+ var TINT_SCALE = 3e3;
86
+ var MIN_KELVIN = 1667;
87
+ var MAX_KELVIN = 25e3;
88
+ function kimXy(tIn) {
89
+ const t = Math.min(MAX_KELVIN, Math.max(MIN_KELVIN, tIn));
90
+ const t2 = t * t;
91
+ const t3 = t2 * t;
92
+ const x = t <= 4e3 ? -266123900 / t3 - 234358.9 / t2 + 877.6956 / t + 0.17991 : -3025846900 / t3 + 21070379e-1 / t2 + 222.6347 / t + 0.24039;
93
+ const x2 = x * x;
94
+ const x3 = x2 * x;
95
+ const y = t <= 2222 ? -1.1063814 * x3 - 1.3481102 * x2 + 2.18555832 * x - 0.20219683 : t <= 4e3 ? -0.9549476 * x3 - 1.37418593 * x2 + 2.09137015 * x - 0.16748867 : 3.081758 * x3 - 5.8733867 * x2 + 3.75112997 * x - 0.37001483;
96
+ return { x, y };
97
+ }
98
+ function xyToUv(p) {
99
+ const d = -2 * p.x + 12 * p.y + 3;
100
+ return [4 * p.x / d, 6 * p.y / d];
101
+ }
102
+ function uvToXy(u, v) {
103
+ const d = 2 * u - 8 * v + 4;
104
+ return { x: 3 * u / d, y: 2 * v / d };
105
+ }
106
+ function locusUv(tIn) {
107
+ const t = Math.max(1e3, tIn);
108
+ if (t >= MIN_KELVIN && t <= MAX_KELVIN) return xyToUv(kimXy(t));
109
+ const [a, b] = t < MIN_KELVIN ? [MIN_KELVIN, MIN_KELVIN + 50] : [MAX_KELVIN - 500, MAX_KELVIN];
110
+ const [ua, va] = xyToUv(kimXy(a));
111
+ const [ub, vb] = xyToUv(kimXy(b));
112
+ const ma = 1e6 / a;
113
+ const mb = 1e6 / b;
114
+ const s = (1e6 / t - ma) / (mb - ma);
115
+ return [ua + (ub - ua) * s, va + (vb - va) * s];
116
+ }
117
+ function locusNormal(t) {
118
+ const m = 1e6 / t;
119
+ const [u0, v0] = locusUv(1e6 / (m + 1));
120
+ const [u1, v1] = locusUv(1e6 / Math.max(m - 1, 1));
121
+ const du = u1 - u0;
122
+ const dv = v1 - v0;
123
+ const l = Math.max(Math.hypot(du, dv), 1e-12);
124
+ const nx = -dv / l;
125
+ const ny = du / l;
126
+ return ny < 0 ? [-nx, -ny] : [nx, ny];
127
+ }
128
+ function tempTintToXy(kelvin, tint) {
129
+ const [u, v] = locusUv(kelvin);
130
+ const [nu, nv] = locusNormal(kelvin);
131
+ const duv = tint / TINT_SCALE;
132
+ return uvToXy(u + nu * duv, v + nv * duv);
133
+ }
134
+ function xyToTempTint(p) {
135
+ const [u, v] = xyToUv(p);
136
+ const dist = (m) => {
137
+ const [lu2, lv2] = locusUv(1e6 / m);
138
+ return (u - lu2) ** 2 + (v - lv2) ** 2;
139
+ };
140
+ let best = 20;
141
+ let bd = Infinity;
142
+ for (let m = 20; m <= 1e3; m += 5) {
143
+ const d = dist(m);
144
+ if (d < bd) {
145
+ bd = d;
146
+ best = m;
147
+ }
148
+ }
149
+ let a = Math.max(best - 5, 20);
150
+ let b = Math.min(best + 5, 1e3);
151
+ const g = 0.61803398875;
152
+ for (let i = 0; i < 60; i++) {
153
+ const c = b - g * (b - a);
154
+ const d = a + g * (b - a);
155
+ if (dist(c) < dist(d)) b = d;
156
+ else a = c;
157
+ }
158
+ const kelvin = 1e6 / ((a + b) / 2);
159
+ const [lu, lv] = locusUv(kelvin);
160
+ const [nu, nv] = locusNormal(kelvin);
161
+ const duv = (u - lu) * nu + (v - lv) * nv;
162
+ return { kelvin, tint: duv * TINT_SCALE };
163
+ }
164
+ var AS_SHOT_KELVIN = 6500;
165
+ var MIRED_PER_TEMPERATURE_UNIT = 1;
166
+ var AS_SHOT_MIRED = 1e6 / AS_SHOT_KELVIN;
167
+ function temperatureToKelvin(temperature) {
168
+ return 1e6 / (AS_SHOT_MIRED - temperature * MIRED_PER_TEMPERATURE_UNIT);
169
+ }
170
+ function kelvinToTemperature(kelvin) {
171
+ return (AS_SHOT_MIRED - 1e6 / kelvin) / MIRED_PER_TEMPERATURE_UNIT;
172
+ }
173
+ var AS_SHOT_WB_INV = _nullishCoalesce(invertMatrix3(wbMatrix(tempTintToXy(AS_SHOT_KELVIN, 0))), () => ( IDENTITY_MATRIX3));
174
+ function whiteBalanceMatrix(temperature, tint = 0) {
175
+ if (!temperature && !tint) return [...IDENTITY_MATRIX3];
176
+ const set = wbMatrix(tempTintToXy(temperatureToKelvin(temperature), tint));
177
+ const m = mulMatrix3(set, AS_SHOT_WB_INV);
178
+ const g = applyMatrix3(m, [1, 1, 1]);
179
+ const y = g[0] * LUMA_709[0] + g[1] * LUMA_709[1] + g[2] * LUMA_709[2];
180
+ return mulMatrix3(m, diag3(1 / y, 1 / y, 1 / y));
181
+ }
182
+ function whiteBalanceFromSample(rgb) {
183
+ const [r, g, b] = Array.isArray(rgb) ? rgb : [rgb.r, rgb.g, rgb.b];
184
+ const lin = [r, g, b].map((c) => srgbToLinear(Math.min(255, Math.max(0, c)) / 255));
185
+ if (lin[0] + lin[1] + lin[2] <= 1e-6) return { temperature: 0, tint: 0 };
186
+ const src = linearSrgbToXy(applyMatrix3(AS_SHOT_WB_INV, lin));
187
+ const { kelvin, tint } = xyToTempTint(src);
188
+ const clamp2 = (v) => Math.max(-100, Math.min(100, v));
189
+ return { temperature: clamp2(kelvinToTemperature(kelvin)), tint: clamp2(tint) };
190
+ }
191
+ var TONE_LUT_SIZE = 4096;
192
+ var GREY = 0.18;
193
+ var GREY_P = Math.pow(GREY, 1 / 2.2);
194
+ var SHOULDER_KNEE = 0.6;
195
+ function toneCurve(y, contrast, brightness, headroom = 1) {
196
+ if (!(y > 0)) return 0;
197
+ const h = Math.max(1, headroom);
198
+ let o = Math.min(y, h);
199
+ if (h > 1 && o > SHOULDER_KNEE) {
200
+ const span = 1 - SHOULDER_KNEE;
201
+ const x = (o - SHOULDER_KNEE) / span;
202
+ const X = (h - SHOULDER_KNEE) / span;
203
+ o = SHOULDER_KNEE + span * (x * (1 + x / (X * X)) / (1 + x));
204
+ }
205
+ if (contrast === 0 && brightness === 0) return Math.min(1, o);
206
+ let p = Math.pow(Math.min(1, o), 1 / 2.2);
207
+ const c = contrast / 100;
208
+ if (c !== 0) {
209
+ p += c * 0.4 * (p - GREY_P) * (1 - (2 * p - 1) ** 2);
210
+ }
211
+ const b = brightness / 100;
212
+ if (b !== 0) {
213
+ p += b * 0.8 * p * (1 - p);
214
+ }
215
+ return Math.pow(Math.min(1, Math.max(0, p)), 2.2);
216
+ }
217
+ function buildToneLut(contrast, brightness, headroom = 1) {
218
+ const h = Math.max(1, headroom);
219
+ const lut = new Float32Array(TONE_LUT_SIZE + 1);
220
+ for (let i = 0; i <= TONE_LUT_SIZE; i++) {
221
+ lut[i] = toneCurve(h * i / TONE_LUT_SIZE, contrast, brightness, h);
222
+ }
223
+ return lut;
224
+ }
225
+ function sampleToneLut(lut, headroom, y) {
226
+ if (!(y > 0)) return lut[0];
227
+ const n = lut.length - 1;
228
+ const f = y * n / Math.max(1, headroom);
229
+ if (f >= n) return lut[n];
230
+ const i = f | 0;
231
+ return lut[i] + (lut[i + 1] - lut[i]) * (f - i);
232
+ }
233
+
234
+ // src/image-editor/filters.ts
2
235
  function clamp(value, min = 0, max = 255) {
3
236
  return Math.max(min, Math.min(max, value));
4
237
  }
5
238
  function applyAdjustments(imageData, adjustments) {
6
- const { brightness, contrast, saturation, exposure, temperature, opacity, blur } = adjustments;
239
+ if (normalizeProcessVersion(adjustments.process) === LATEST_PROCESS_VERSION) {
240
+ applyProcess2Adjustments(imageData, adjustments);
241
+ } else {
242
+ applyLegacyAdjustments(imageData, adjustments);
243
+ }
244
+ if (adjustments.blur > 0) {
245
+ applyFastBoxBlur(imageData, Math.min(Math.round(adjustments.blur), 40));
246
+ }
247
+ }
248
+ function applyLegacyAdjustments(imageData, adjustments) {
249
+ const { brightness, contrast, saturation, exposure, temperature, opacity } = adjustments;
7
250
  const data = imageData.data;
8
251
  const len = data.length;
9
252
  const hasBrightness = brightness !== 0;
@@ -57,8 +300,108 @@ function applyAdjustments(imageData, adjustments) {
57
300
  data[i + 3] = a;
58
301
  }
59
302
  }
60
- if (blur > 0) {
61
- applyFastBoxBlur(imageData, Math.min(Math.round(blur), 40));
303
+ }
304
+ var DECODE_LUT = (() => {
305
+ const lut = new Float32Array(256);
306
+ for (let i = 0; i < 256; i++) lut[i] = srgbToLinear(i / 255);
307
+ return lut;
308
+ })();
309
+ var ENCODE_LUT_SIZE = 65535;
310
+ var encodeLut = null;
311
+ function getEncodeLut() {
312
+ if (!encodeLut) {
313
+ encodeLut = new Uint8Array(ENCODE_LUT_SIZE + 1);
314
+ for (let i = 0; i <= ENCODE_LUT_SIZE; i++) {
315
+ encodeLut[i] = Math.round(linearToSrgb(i / ENCODE_LUT_SIZE) * 255);
316
+ }
317
+ }
318
+ return encodeLut;
319
+ }
320
+ var cachedPlan = null;
321
+ function getProcess2Plan(adjustments) {
322
+ const exposure = adjustments.exposure || 0;
323
+ const temperature = adjustments.temperature || 0;
324
+ const tint = adjustments.tint || 0;
325
+ const contrast = adjustments.contrast || 0;
326
+ const brightness = adjustments.brightness || 0;
327
+ const saturation = 1 + (adjustments.saturation || 0) / 100;
328
+ const key = `${exposure},${temperature},${tint},${contrast},${brightness},${saturation}`;
329
+ if (cachedPlan && cachedPlan.key === key) return cachedPlan;
330
+ const gain = Math.pow(2, exposure / 50);
331
+ const wb = whiteBalanceMatrix(temperature, tint);
332
+ const m = new Float64Array(9);
333
+ for (let i = 0; i < 9; i++) m[i] = wb[i] * gain;
334
+ const luts = [];
335
+ const scale = [0, 0, 0];
336
+ for (let c = 0; c < 3; c++) {
337
+ let reach = 0;
338
+ for (let k = 0; k < 3; k++) reach += Math.max(0, m[c * 3 + k]);
339
+ const headroom = Math.max(1, reach);
340
+ luts[c] = buildToneLut(contrast, brightness, headroom);
341
+ scale[c] = TONE_LUT_SIZE / headroom;
342
+ }
343
+ cachedPlan = { key, m, luts, scale, saturation };
344
+ return cachedPlan;
345
+ }
346
+ function applyProcess2Adjustments(imageData, adjustments) {
347
+ const data = imageData.data;
348
+ const len = data.length;
349
+ const opacity = _nullishCoalesce(adjustments.opacity, () => ( 1));
350
+ const hasOpacity = opacity < 1;
351
+ const hasColor = !!adjustments.brightness || !!adjustments.contrast || !!adjustments.saturation || !!adjustments.exposure || !!adjustments.temperature || !!adjustments.tint;
352
+ if (!hasColor) {
353
+ if (hasOpacity) {
354
+ for (let i = 3; i < len; i += 4) data[i] = clamp(data[i] * opacity);
355
+ }
356
+ return;
357
+ }
358
+ const plan = getProcess2Plan(adjustments);
359
+ const dec = DECODE_LUT;
360
+ const enc = getEncodeLut();
361
+ const { m, luts, scale, saturation } = plan;
362
+ const m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5], m6 = m[6], m7 = m[7], m8 = m[8];
363
+ const lutR = luts[0], lutG = luts[1], lutB = luts[2];
364
+ const sR = scale[0], sG = scale[1], sB = scale[2];
365
+ const N = TONE_LUT_SIZE;
366
+ const hasSaturation = saturation !== 1;
367
+ const wr = LUMA_709[0], wg = LUMA_709[1], wb = LUMA_709[2];
368
+ for (let i = 0; i < len; i += 4) {
369
+ const r0 = dec[data[i]];
370
+ const g0 = dec[data[i + 1]];
371
+ const b0 = dec[data[i + 2]];
372
+ let r = m0 * r0 + m1 * g0 + m2 * b0;
373
+ let g = m3 * r0 + m4 * g0 + m5 * b0;
374
+ let b = m6 * r0 + m7 * g0 + m8 * b0;
375
+ let f;
376
+ let k;
377
+ if (r <= 0) r = lutR[0];
378
+ else if ((f = r * sR) >= N) r = lutR[N];
379
+ else {
380
+ k = f | 0;
381
+ r = lutR[k] + (lutR[k + 1] - lutR[k]) * (f - k);
382
+ }
383
+ if (g <= 0) g = lutG[0];
384
+ else if ((f = g * sG) >= N) g = lutG[N];
385
+ else {
386
+ k = f | 0;
387
+ g = lutG[k] + (lutG[k + 1] - lutG[k]) * (f - k);
388
+ }
389
+ if (b <= 0) b = lutB[0];
390
+ else if ((f = b * sB) >= N) b = lutB[N];
391
+ else {
392
+ k = f | 0;
393
+ b = lutB[k] + (lutB[k + 1] - lutB[k]) * (f - k);
394
+ }
395
+ if (hasSaturation) {
396
+ const y = wr * r + wg * g + wb * b;
397
+ r = y + (r - y) * saturation;
398
+ g = y + (g - y) * saturation;
399
+ b = y + (b - y) * saturation;
400
+ }
401
+ data[i] = enc[r <= 0 ? 0 : r >= 1 ? ENCODE_LUT_SIZE : r * ENCODE_LUT_SIZE + 0.5 | 0];
402
+ data[i + 1] = enc[g <= 0 ? 0 : g >= 1 ? ENCODE_LUT_SIZE : g * ENCODE_LUT_SIZE + 0.5 | 0];
403
+ data[i + 2] = enc[b <= 0 ? 0 : b >= 1 ? ENCODE_LUT_SIZE : b * ENCODE_LUT_SIZE + 0.5 | 0];
404
+ if (hasOpacity) data[i + 3] = clamp(data[i + 3] * opacity);
62
405
  }
63
406
  }
64
407
  function applyFastBoxBlur(imageData, radius) {
@@ -593,7 +936,7 @@ var ImageEditorRenderer = (_class2 = class {constructor() { _class2.prototype.__
593
936
  `${naturalWidth}x${naturalHeight}`,
594
937
  `${region.x},${region.y},${region.width},${region.height}`,
595
938
  `${projection.angle},${transform.flipH},${transform.flipV}`,
596
- `${adjustments.brightness},${adjustments.contrast},${adjustments.saturation},${adjustments.exposure},${adjustments.temperature},${adjustments.blur},${adjustments.opacity}`,
939
+ `${adjustments.brightness},${adjustments.contrast},${adjustments.saturation},${adjustments.exposure},${adjustments.temperature},${_nullishCoalesce(adjustments.tint, () => ( 0))},${adjustments.blur},${adjustments.opacity},p${normalizeProcessVersion(adjustments.process)}`,
597
940
  `${depthMask.enabled},${depthMask.maskSource},${_optionalChain([depthMask, 'access', _ => _.depthRange, 'optionalAccess', _2 => _2[0]])}-${_optionalChain([depthMask, 'access', _3 => _3.depthRange, 'optionalAccess', _4 => _4[1]])},${depthMask.softness},${depthMask.invert},${depthMask.mode}`
598
941
  ].join("|");
599
942
  let baseCanvas = this.cachedBaseCanvas;
@@ -1064,9 +1407,19 @@ var DEFAULT_ADJUSTMENTS = {
1064
1407
  saturation: 0,
1065
1408
  exposure: 0,
1066
1409
  temperature: 0,
1410
+ tint: 0,
1067
1411
  blur: 0,
1068
- opacity: 1
1412
+ opacity: 1,
1413
+ process: LATEST_PROCESS_VERSION
1069
1414
  };
1415
+ function normalizeStoredAdjustments(stored) {
1416
+ if (!stored) return { ...DEFAULT_ADJUSTMENTS };
1417
+ return {
1418
+ ...DEFAULT_ADJUSTMENTS,
1419
+ ...stored,
1420
+ process: normalizeProcessVersion(stored.process)
1421
+ };
1422
+ }
1070
1423
  var DEFAULT_TRANSFORM = {
1071
1424
  rotate: 0,
1072
1425
  flipH: false,
@@ -1096,10 +1449,7 @@ var ImageEditorController = (_class3 = class {
1096
1449
  this.maxHistoryDepth = _nullishCoalesce(options.maxHistoryDepth, () => ( 50));
1097
1450
  this.onStateChange = options.onStateChange;
1098
1451
  this.renderer = new ImageEditorRenderer();
1099
- const initialAdjustments = {
1100
- ...DEFAULT_ADJUSTMENTS,
1101
- ..._optionalChain([options, 'access', _9 => _9.initialState, 'optionalAccess', _10 => _10.adjustments])
1102
- };
1452
+ const initialAdjustments = normalizeStoredAdjustments(_optionalChain([options, 'access', _9 => _9.initialState, 'optionalAccess', _10 => _10.adjustments]));
1103
1453
  const initialTransform = {
1104
1454
  ...DEFAULT_TRANSFORM,
1105
1455
  ..._optionalChain([options, 'access', _11 => _11.initialState, 'optionalAccess', _12 => _12.transform])
@@ -1346,6 +1696,19 @@ var ImageEditorController = (_class3 = class {
1346
1696
  };
1347
1697
  this.notify();
1348
1698
  }
1699
+ /** True when the adjustments use an older rendering process than {@link LATEST_PROCESS_VERSION}. */
1700
+ get isProcessOutdated() {
1701
+ return normalizeProcessVersion(this.state.adjustments.process) < LATEST_PROCESS_VERSION;
1702
+ }
1703
+ /**
1704
+ * Update to Current Process: re-interprets the current adjustment values with the latest
1705
+ * rendering process (one undo step). Returns false when already current.
1706
+ */
1707
+ upgradeProcess() {
1708
+ if (!this.isProcessOutdated) return false;
1709
+ this.setAdjustments({ process: LATEST_PROCESS_VERSION });
1710
+ return true;
1711
+ }
1349
1712
  resetAdjustments() {
1350
1713
  this.recordHistory();
1351
1714
  this.state.adjustments = { ...DEFAULT_ADJUSTMENTS };
@@ -1564,7 +1927,7 @@ var ImageEditorController = (_class3 = class {
1564
1927
  version: 1,
1565
1928
  crop: this.state.crop ? { ...this.state.crop } : null,
1566
1929
  transform: { ...this.state.transform },
1567
- adjustments: { ...this.state.adjustments },
1930
+ adjustments: serializeAdjustments(this.state.adjustments),
1568
1931
  depthMask: {
1569
1932
  ...this.state.depthMask,
1570
1933
  depthRange: [...this.state.depthMask.depthRange]
@@ -1575,7 +1938,7 @@ var ImageEditorController = (_class3 = class {
1575
1938
  applySerializedState(data) {
1576
1939
  this.state.crop = data.crop ? { ...data.crop } : null;
1577
1940
  this.state.transform = { ...data.transform };
1578
- this.state.adjustments = { ...data.adjustments };
1941
+ this.state.adjustments = normalizeStoredAdjustments(data.adjustments);
1579
1942
  this.state.depthMask = {
1580
1943
  ...data.depthMask,
1581
1944
  depthRange: [...data.depthMask.depthRange]
@@ -1583,6 +1946,14 @@ var ImageEditorController = (_class3 = class {
1583
1946
  this.state.annotations = JSON.parse(JSON.stringify(data.annotations || []));
1584
1947
  }
1585
1948
  }, _class3);
1949
+ function serializeAdjustments(adjustments) {
1950
+ const out = { ...adjustments };
1951
+ if (normalizeProcessVersion(out.process) === LEGACY_PROCESS_VERSION) {
1952
+ delete out.process;
1953
+ if (!out.tint) delete out.tint;
1954
+ }
1955
+ return out;
1956
+ }
1586
1957
  function scaleAnnotation(ann, sx, sy) {
1587
1958
  const k = Math.sqrt(Math.abs(sx * sy));
1588
1959
  const base = { ...ann, x: ann.x * sx, y: ann.y * sy };
@@ -1630,5 +2001,39 @@ function scaleAnnotation(ann, sx, sy) {
1630
2001
 
1631
2002
 
1632
2003
 
1633
- exports.DEFAULT_ADJUSTMENTS = DEFAULT_ADJUSTMENTS; exports.DEFAULT_DEPTH_MASK = DEFAULT_DEPTH_MASK; exports.DEFAULT_TRANSFORM = DEFAULT_TRANSFORM; exports.ImageEditorController = ImageEditorController; exports.ImageEditorRenderer = ImageEditorRenderer; exports.applyAdjustments = applyAdjustments; exports.applyDepthMask = applyDepthMask; exports.applyImageProjectionToContext = applyImageProjectionToContext; exports.calculateCropDrag = calculateCropDrag; exports.canvasToImagePoint = canvasToImagePoint; exports.clampCropToImage = clampCropToImage; exports.getAnnotationBounds = getAnnotationBounds; exports.getCropCursor = getCropCursor; exports.getRotatedSize = getRotatedSize; exports.getViewportMetrics = getViewportMetrics; exports.getViewportProjection = getViewportProjection; exports.globalImageCache = globalImageCache; exports.hitTestAnnotation = hitTestAnnotation; exports.hitTestCrop = hitTestCrop; exports.imageToCanvasPoint = imageToCanvasPoint; exports.isQuarterTurnSwapped = isQuarterTurnSwapped; exports.mapCropHandle = mapCropHandle; exports.normalizeAngle = normalizeAngle; exports.projectImagePoint = projectImagePoint; exports.projectImageRect = projectImageRect; exports.removeAlpha = removeAlpha; exports.unprojectCanvasPoint = unprojectCanvasPoint;
2004
+
2005
+
2006
+
2007
+
2008
+
2009
+
2010
+
2011
+
2012
+
2013
+
2014
+
2015
+
2016
+
2017
+
2018
+
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+
2029
+
2030
+
2031
+
2032
+
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+ exports.AS_SHOT_KELVIN = AS_SHOT_KELVIN; exports.D65 = D65; exports.DEFAULT_ADJUSTMENTS = DEFAULT_ADJUSTMENTS; exports.DEFAULT_DEPTH_MASK = DEFAULT_DEPTH_MASK; exports.DEFAULT_TRANSFORM = DEFAULT_TRANSFORM; exports.IDENTITY_MATRIX3 = IDENTITY_MATRIX3; exports.ImageEditorController = ImageEditorController; exports.ImageEditorRenderer = ImageEditorRenderer; exports.LATEST_PROCESS_VERSION = LATEST_PROCESS_VERSION; exports.LEGACY_PROCESS_VERSION = LEGACY_PROCESS_VERSION; exports.LUMA_709 = LUMA_709; exports.MAX_KELVIN = MAX_KELVIN; exports.MIN_KELVIN = MIN_KELVIN; exports.MIRED_PER_TEMPERATURE_UNIT = MIRED_PER_TEMPERATURE_UNIT; exports.TINT_SCALE = TINT_SCALE; exports.TONE_LUT_SIZE = TONE_LUT_SIZE; exports.applyAdjustments = applyAdjustments; exports.applyDepthMask = applyDepthMask; exports.applyImageProjectionToContext = applyImageProjectionToContext; exports.applyLegacyAdjustments = applyLegacyAdjustments; exports.applyMatrix3 = applyMatrix3; exports.applyProcess2Adjustments = applyProcess2Adjustments; exports.bradfordAdaptation = bradfordAdaptation; exports.buildToneLut = buildToneLut; exports.calculateCropDrag = calculateCropDrag; exports.canvasToImagePoint = canvasToImagePoint; exports.clampCropToImage = clampCropToImage; exports.getAnnotationBounds = getAnnotationBounds; exports.getCropCursor = getCropCursor; exports.getRotatedSize = getRotatedSize; exports.getViewportMetrics = getViewportMetrics; exports.getViewportProjection = getViewportProjection; exports.globalImageCache = globalImageCache; exports.hitTestAnnotation = hitTestAnnotation; exports.hitTestCrop = hitTestCrop; exports.imageToCanvasPoint = imageToCanvasPoint; exports.invertMatrix3 = invertMatrix3; exports.isQuarterTurnSwapped = isQuarterTurnSwapped; exports.kelvinToTemperature = kelvinToTemperature; exports.linearSrgbToXy = linearSrgbToXy; exports.linearToSrgb = linearToSrgb; exports.mapCropHandle = mapCropHandle; exports.mulMatrix3 = mulMatrix3; exports.normalizeAngle = normalizeAngle; exports.normalizeProcessVersion = normalizeProcessVersion; exports.normalizeStoredAdjustments = normalizeStoredAdjustments; exports.projectImagePoint = projectImagePoint; exports.projectImageRect = projectImageRect; exports.removeAlpha = removeAlpha; exports.sampleToneLut = sampleToneLut; exports.srgbToLinear = srgbToLinear; exports.tempTintToXy = tempTintToXy; exports.temperatureToKelvin = temperatureToKelvin; exports.toneCurve = toneCurve; exports.unprojectCanvasPoint = unprojectCanvasPoint; exports.uvToXy = uvToXy; exports.wbMatrix = wbMatrix; exports.whiteBalanceFromSample = whiteBalanceFromSample; exports.whiteBalanceMatrix = whiteBalanceMatrix; exports.xyToTempTint = xyToTempTint; exports.xyToUv = xyToUv;
1634
2039
  //# sourceMappingURL=index.cjs.map