@bensitu/image-editor 1.5.1 → 2.0.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 (154) hide show
  1. package/README.md +370 -466
  2. package/dist/cjs/index.cjs +5422 -0
  3. package/dist/cjs/index.cjs.map +1 -0
  4. package/dist/esm/animation/animation-queue.js +67 -0
  5. package/dist/esm/animation/animation-queue.js.map +1 -0
  6. package/dist/esm/core/callback-reporter.js +23 -0
  7. package/dist/esm/core/callback-reporter.js.map +1 -0
  8. package/dist/esm/core/default-options.js +322 -0
  9. package/dist/esm/core/default-options.js.map +1 -0
  10. package/dist/esm/core/errors.js +156 -0
  11. package/dist/esm/core/errors.js.map +1 -0
  12. package/dist/esm/core/operation-guard.js +129 -0
  13. package/dist/esm/core/operation-guard.js.map +1 -0
  14. package/dist/esm/core/public-types.js +4 -0
  15. package/dist/esm/core/public-types.js.map +1 -0
  16. package/dist/esm/core/state-serializer.js +251 -0
  17. package/dist/esm/core/state-serializer.js.map +1 -0
  18. package/dist/esm/crop/crop-controller.js +403 -0
  19. package/dist/esm/crop/crop-controller.js.map +1 -0
  20. package/dist/esm/export/export-format.js +53 -0
  21. package/dist/esm/export/export-format.js.map +1 -0
  22. package/dist/esm/export/export-service.js +596 -0
  23. package/dist/esm/export/export-service.js.map +1 -0
  24. package/dist/esm/fabric/fabric-adapter.js +37 -0
  25. package/dist/esm/fabric/fabric-adapter.js.map +1 -0
  26. package/dist/esm/fabric/fabric-animation.js +37 -0
  27. package/dist/esm/fabric/fabric-animation.js.map +1 -0
  28. package/dist/esm/history/command.js +2 -0
  29. package/dist/esm/history/command.js.map +1 -0
  30. package/dist/esm/history/history-manager.js +103 -0
  31. package/dist/esm/history/history-manager.js.map +1 -0
  32. package/dist/esm/image/image-loader.js +245 -0
  33. package/dist/esm/image/image-loader.js.map +1 -0
  34. package/dist/esm/image/image-resampler.js +55 -0
  35. package/dist/esm/image/image-resampler.js.map +1 -0
  36. package/dist/esm/image/layout-manager.js +224 -0
  37. package/dist/esm/image/layout-manager.js.map +1 -0
  38. package/dist/esm/image/transform-controller.js +132 -0
  39. package/dist/esm/image/transform-controller.js.map +1 -0
  40. package/dist/esm/image-editor.js +1740 -0
  41. package/dist/esm/image-editor.js.map +1 -0
  42. package/dist/esm/index.js +5 -0
  43. package/dist/esm/index.js.map +1 -0
  44. package/dist/esm/mask/mask-factory.js +332 -0
  45. package/dist/esm/mask/mask-factory.js.map +1 -0
  46. package/dist/esm/mask/mask-label-manager.js +120 -0
  47. package/dist/esm/mask/mask-label-manager.js.map +1 -0
  48. package/dist/esm/mask/mask-list.js +47 -0
  49. package/dist/esm/mask/mask-list.js.map +1 -0
  50. package/dist/esm/mask/mask-style.js +182 -0
  51. package/dist/esm/mask/mask-style.js.map +1 -0
  52. package/dist/esm/ui/dom-bindings.js +60 -0
  53. package/dist/esm/ui/dom-bindings.js.map +1 -0
  54. package/dist/esm/ui/ui-state.js +25 -0
  55. package/dist/esm/ui/ui-state.js.map +1 -0
  56. package/dist/esm/ui/visibility-state.js +11 -0
  57. package/dist/esm/ui/visibility-state.js.map +1 -0
  58. package/dist/esm/utils/canvas-region.js +100 -0
  59. package/dist/esm/utils/canvas-region.js.map +1 -0
  60. package/dist/esm/utils/dom.js +6 -0
  61. package/dist/esm/utils/dom.js.map +1 -0
  62. package/dist/esm/utils/file.js +53 -0
  63. package/dist/esm/utils/file.js.map +1 -0
  64. package/dist/esm/utils/number.js +24 -0
  65. package/dist/esm/utils/number.js.map +1 -0
  66. package/dist/esm/utils/timeout.js +17 -0
  67. package/dist/esm/utils/timeout.js.map +1 -0
  68. package/dist/types/animation/animation-queue.d.ts +111 -0
  69. package/dist/types/animation/animation-queue.d.ts.map +1 -0
  70. package/dist/types/core/callback-reporter.d.ts +125 -0
  71. package/dist/types/core/callback-reporter.d.ts.map +1 -0
  72. package/dist/types/core/default-options.d.ts +56 -0
  73. package/dist/types/core/default-options.d.ts.map +1 -0
  74. package/dist/types/core/errors.d.ts +142 -0
  75. package/dist/types/core/errors.d.ts.map +1 -0
  76. package/dist/types/core/operation-guard.d.ts +192 -0
  77. package/dist/types/core/operation-guard.d.ts.map +1 -0
  78. package/dist/types/core/public-types.d.ts +678 -0
  79. package/dist/types/core/public-types.d.ts.map +1 -0
  80. package/dist/types/core/state-serializer.d.ts +301 -0
  81. package/dist/types/core/state-serializer.d.ts.map +1 -0
  82. package/dist/types/crop/crop-controller.d.ts +407 -0
  83. package/dist/types/crop/crop-controller.d.ts.map +1 -0
  84. package/dist/types/export/export-format.d.ts +136 -0
  85. package/dist/types/export/export-format.d.ts.map +1 -0
  86. package/dist/types/export/export-service.d.ts +333 -0
  87. package/dist/types/export/export-service.d.ts.map +1 -0
  88. package/dist/types/fabric/fabric-adapter.d.ts +74 -0
  89. package/dist/types/fabric/fabric-adapter.d.ts.map +1 -0
  90. package/dist/types/fabric/fabric-animation.d.ts +141 -0
  91. package/dist/types/fabric/fabric-animation.d.ts.map +1 -0
  92. package/dist/types/history/command.d.ts +16 -0
  93. package/dist/types/history/command.d.ts.map +1 -0
  94. package/dist/types/history/history-manager.d.ts +129 -0
  95. package/dist/types/history/history-manager.d.ts.map +1 -0
  96. package/dist/types/image/image-loader.d.ts +265 -0
  97. package/dist/types/image/image-loader.d.ts.map +1 -0
  98. package/dist/types/image/image-resampler.d.ts +139 -0
  99. package/dist/types/image/image-resampler.d.ts.map +1 -0
  100. package/dist/types/image/layout-manager.d.ts +255 -0
  101. package/dist/types/image/layout-manager.d.ts.map +1 -0
  102. package/dist/types/image/transform-controller.d.ts +287 -0
  103. package/dist/types/image/transform-controller.d.ts.map +1 -0
  104. package/dist/types/image-editor.d.ts +650 -0
  105. package/dist/types/image-editor.d.ts.map +1 -0
  106. package/dist/types/index.d.cts +31 -0
  107. package/dist/types/index.d.cts.map +1 -0
  108. package/dist/types/index.d.ts +31 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/mask/mask-factory.d.ts +209 -0
  111. package/dist/types/mask/mask-factory.d.ts.map +1 -0
  112. package/dist/types/mask/mask-label-manager.d.ts +171 -0
  113. package/dist/types/mask/mask-label-manager.d.ts.map +1 -0
  114. package/dist/types/mask/mask-list.d.ts +144 -0
  115. package/dist/types/mask/mask-list.d.ts.map +1 -0
  116. package/dist/types/mask/mask-style.d.ts +338 -0
  117. package/dist/types/mask/mask-style.d.ts.map +1 -0
  118. package/dist/types/ui/dom-bindings.d.ts +103 -0
  119. package/dist/types/ui/dom-bindings.d.ts.map +1 -0
  120. package/dist/types/ui/ui-state.d.ts +112 -0
  121. package/dist/types/ui/ui-state.d.ts.map +1 -0
  122. package/dist/types/ui/visibility-state.d.ts +77 -0
  123. package/dist/types/ui/visibility-state.d.ts.map +1 -0
  124. package/dist/types/utils/canvas-region.d.ts +177 -0
  125. package/dist/types/utils/canvas-region.d.ts.map +1 -0
  126. package/dist/types/utils/dom.d.ts +26 -0
  127. package/dist/types/utils/dom.d.ts.map +1 -0
  128. package/dist/types/utils/file.d.ts +80 -0
  129. package/dist/types/utils/file.d.ts.map +1 -0
  130. package/dist/types/utils/number.d.ts +132 -0
  131. package/dist/types/utils/number.d.ts.map +1 -0
  132. package/dist/types/utils/timeout.d.ts +84 -0
  133. package/dist/types/utils/timeout.d.ts.map +1 -0
  134. package/dist/umd/image-editor.umd.js +2 -0
  135. package/dist/umd/image-editor.umd.js.map +1 -0
  136. package/package.json +72 -66
  137. package/dist/image-editor.cjs +0 -4185
  138. package/dist/image-editor.cjs.map +0 -7
  139. package/dist/image-editor.esm.js +0 -4154
  140. package/dist/image-editor.esm.js.map +0 -7
  141. package/dist/image-editor.esm.min.js +0 -9
  142. package/dist/image-editor.esm.min.js.map +0 -7
  143. package/dist/image-editor.esm.min.mjs +0 -9
  144. package/dist/image-editor.esm.min.mjs.map +0 -7
  145. package/dist/image-editor.esm.mjs +0 -4154
  146. package/dist/image-editor.esm.mjs.map +0 -7
  147. package/dist/image-editor.js +0 -4151
  148. package/dist/image-editor.js.map +0 -7
  149. package/dist/image-editor.min.js +0 -9
  150. package/dist/image-editor.min.js.map +0 -7
  151. package/image-editor.d.ts +0 -269
  152. package/src/browser.js +0 -11
  153. package/src/esm.js +0 -9
  154. package/src/image-editor.js +0 -4775
@@ -0,0 +1,403 @@
1
+ import { CropApplyError } from '../core/errors.js';
2
+ import { isMaskObject } from '../core/public-types.js';
3
+ import { Command } from '../history/history-manager.js';
4
+ import { applyCropHideMaskStyle, captureMaskStyleBackup, reattachMaskHoverHandlers, restoreMaskStyleBackup, } from '../mask/mask-style.js';
5
+ import { getClampedCanvasRegion, getObjectBBox, hasMeaningfulCanvasRegion, } from '../utils/canvas-region.js';
6
+ import { clampQuality as clampExportQuality, mimeTypeFor, tryNormalizeImageFormat, } from '../export/export-format.js';
7
+ const CROP_RECT_FILL = 'rgba(0,0,0,0.12)';
8
+ const CROP_RECT_STROKE = '#00aaff';
9
+ const CROP_RECT_DASH = [6, 4];
10
+ const CROP_RECT_CORNER_SIZE = 8;
11
+ const CROP_DEFAULT_PADDING = 10;
12
+ const CROPPED_EXPORT_QUALITY_FALLBACK = 0.92;
13
+ function finiteNumberOrFallback(value, fallback) {
14
+ const numeric = Number(value);
15
+ return Number.isFinite(numeric) ? numeric : fallback;
16
+ }
17
+ function imageMimeToFormat(mimeType) {
18
+ if (mimeType === 'image/jpeg')
19
+ return 'jpeg';
20
+ if (mimeType === 'image/png')
21
+ return 'png';
22
+ if (mimeType === 'image/webp')
23
+ return 'webp';
24
+ return null;
25
+ }
26
+ function resolveLossyCropQuality(cropExportQuality, downsampleQuality) {
27
+ const cropQuality = Number(cropExportQuality);
28
+ if (Number.isFinite(cropQuality)) {
29
+ return clampExportQuality(cropQuality, CROPPED_EXPORT_QUALITY_FALLBACK);
30
+ }
31
+ const fallbackQuality = Number(downsampleQuality);
32
+ if (Number.isFinite(fallbackQuality)) {
33
+ return clampExportQuality(fallbackQuality, CROPPED_EXPORT_QUALITY_FALLBACK);
34
+ }
35
+ return CROPPED_EXPORT_QUALITY_FALLBACK;
36
+ }
37
+ function resolveCropExportFormat(input) {
38
+ var _a, _b;
39
+ const requested = input.cropExportFileType;
40
+ const format = requested === undefined || requested === null || requested === 'source'
41
+ ? ((_a = imageMimeToFormat(input.currentImageMimeType)) !== null && _a !== void 0 ? _a : 'png')
42
+ : ((_b = tryNormalizeImageFormat(String(requested))) !== null && _b !== void 0 ? _b : 'png');
43
+ const mimeType = mimeTypeFor(format);
44
+ if (format === 'png')
45
+ return { format, mimeType };
46
+ return {
47
+ format,
48
+ mimeType,
49
+ quality: resolveLossyCropQuality(input.cropExportQuality, input.downsampleQuality),
50
+ };
51
+ }
52
+ function getCropRectContentBounds(cropRect) {
53
+ const angle = Number(cropRect.angle) || 0;
54
+ const normalizedAngle = Math.abs(angle % 360);
55
+ if (normalizedAngle > 0.01 && Math.abs(normalizedAngle - 360) > 0.01) {
56
+ return getObjectBBox(cropRect);
57
+ }
58
+ return {
59
+ left: Number(cropRect.left) || 0,
60
+ top: Number(cropRect.top) || 0,
61
+ width: Math.max(0, (Number(cropRect.width) || 0) * Math.abs(Number(cropRect.scaleX) || 1)),
62
+ height: Math.max(0, (Number(cropRect.height) || 0) * Math.abs(Number(cropRect.scaleY) || 1)),
63
+ };
64
+ }
65
+ function removeCropRect(context, session) {
66
+ for (const targetHandlers of session.handlers) {
67
+ for (const record of targetHandlers.handlers) {
68
+ try {
69
+ targetHandlers.target.off(record.eventName, record.callback);
70
+ }
71
+ catch {
72
+ }
73
+ }
74
+ }
75
+ session.handlers = [];
76
+ if (session.cropRect) {
77
+ try {
78
+ context.canvas.remove(session.cropRect);
79
+ }
80
+ catch {
81
+ }
82
+ session.cropRect = null;
83
+ }
84
+ }
85
+ function restoreCropObjectState(session) {
86
+ for (const record of session.prevEvented) {
87
+ try {
88
+ record.object.set({ evented: record.evented, selectable: record.selectable });
89
+ }
90
+ catch {
91
+ }
92
+ }
93
+ session.prevEvented = [];
94
+ }
95
+ function restoreCropMaskBackups(session) {
96
+ for (const backup of session.maskBackups) {
97
+ restoreMaskStyleBackup(backup);
98
+ }
99
+ session.maskBackups = [];
100
+ }
101
+ function teardownSession(context, session) {
102
+ removeCropRect(context, session);
103
+ restoreCropObjectState(session);
104
+ restoreCropMaskBackups(session);
105
+ try {
106
+ context.canvas.selection = !!session.prevSelection;
107
+ }
108
+ catch {
109
+ }
110
+ }
111
+ function maskIntersectsRegion(mask, region) {
112
+ const bbox = getObjectBBox(mask);
113
+ return (bbox.left < region.left + region.width &&
114
+ bbox.left + bbox.width > region.left &&
115
+ bbox.top < region.top + region.height &&
116
+ bbox.top + bbox.height > region.top);
117
+ }
118
+ function capturePreservedMasks(canvas, cropRegion, maskBackups = []) {
119
+ var _a;
120
+ const records = [];
121
+ const styleBackupByMask = new Map(maskBackups.map((backup) => [backup.object, backup]));
122
+ const masks = canvas.getObjects().filter(isMaskObject);
123
+ for (const mask of masks) {
124
+ try {
125
+ mask.setCoords();
126
+ const intersects = maskIntersectsRegion(mask, cropRegion);
127
+ if (intersects) {
128
+ const styleBackup = (_a = styleBackupByMask.get(mask)) !== null && _a !== void 0 ? _a : captureMaskStyleBackup(mask);
129
+ records.push({
130
+ mask,
131
+ left: finiteNumberOrFallback(mask.left, 0),
132
+ top: finiteNumberOrFallback(mask.top, 0),
133
+ angle: finiteNumberOrFallback(mask.angle, 0),
134
+ scaleX: finiteNumberOrFallback(mask.scaleX, 1),
135
+ scaleY: finiteNumberOrFallback(mask.scaleY, 1),
136
+ styleBackup,
137
+ });
138
+ }
139
+ canvas.remove(mask);
140
+ }
141
+ catch {
142
+ }
143
+ }
144
+ return records;
145
+ }
146
+ function reapplyPreservedMasks(context, cropRegion, records) {
147
+ var _a;
148
+ if (records.length === 0)
149
+ return;
150
+ const { canvas } = context;
151
+ let maxRestoredId = 0;
152
+ for (const record of records) {
153
+ try {
154
+ restoreMaskStyleBackup(record.styleBackup);
155
+ record.mask.set({
156
+ left: record.left - cropRegion.left,
157
+ top: record.top - cropRegion.top,
158
+ angle: record.angle,
159
+ scaleX: record.scaleX,
160
+ scaleY: record.scaleY,
161
+ visible: true,
162
+ });
163
+ record.mask.setCoords();
164
+ canvas.add(record.mask);
165
+ canvas.bringObjectToFront(record.mask);
166
+ reattachMaskHoverHandlers(record.mask);
167
+ const id = Number(record.mask.maskId);
168
+ if (Number.isFinite(id) && id > maxRestoredId)
169
+ maxRestoredId = id;
170
+ }
171
+ catch {
172
+ }
173
+ }
174
+ if (typeof context.getMaskCounter === 'function' &&
175
+ typeof context.setMaskCounter === 'function') {
176
+ const liveCounter = Number(context.getMaskCounter());
177
+ const safeCounter = Number.isFinite(liveCounter) ? liveCounter : 0;
178
+ context.setMaskCounter(Math.max(safeCounter, maxRestoredId));
179
+ }
180
+ try {
181
+ (_a = context.updateMaskList) === null || _a === void 0 ? void 0 : _a.call(context);
182
+ }
183
+ catch {
184
+ }
185
+ }
186
+ export function enterCropMode(context) {
187
+ const { canvas, options } = context;
188
+ if (context.getCropSession())
189
+ return;
190
+ const originalImage = context.getOriginalImage();
191
+ if (!originalImage)
192
+ return;
193
+ if (!context.isImageLoaded())
194
+ return;
195
+ canvas.discardActiveObject();
196
+ const beforeJson = context.saveState();
197
+ const prevSelection = !!canvas.selection;
198
+ canvas.selection = false;
199
+ originalImage.setCoords();
200
+ const imageBounds = originalImage.getBoundingRect();
201
+ const padding = Number.isFinite(Number(options.crop.padding))
202
+ ? Number(options.crop.padding)
203
+ : CROP_DEFAULT_PADDING;
204
+ const boundsLeft = Math.max(0, Math.floor(imageBounds.left));
205
+ const boundsTop = Math.max(0, Math.floor(imageBounds.top));
206
+ const maxCropWidth = Math.max(1, Math.floor(imageBounds.width));
207
+ const maxCropHeight = Math.max(1, Math.floor(imageBounds.height));
208
+ const rectLeft = Math.min(boundsLeft + maxCropWidth - 1, Math.max(boundsLeft, Math.floor(imageBounds.left + padding)));
209
+ const rectTop = Math.min(boundsTop + maxCropHeight - 1, Math.max(boundsTop, Math.floor(imageBounds.top + padding)));
210
+ const configuredMinWidth = Math.max(1, Number(options.crop.minWidth) || 1);
211
+ const configuredMinHeight = Math.max(1, Number(options.crop.minHeight) || 1);
212
+ const minCropWidth = Math.min(configuredMinWidth, maxCropWidth);
213
+ const minCropHeight = Math.min(configuredMinHeight, maxCropHeight);
214
+ const allowRotation = !!options.crop.allowRotationOfCropRect;
215
+ const cropRect = new context.fabric.Rect({
216
+ left: rectLeft,
217
+ top: rectTop,
218
+ width: minCropWidth,
219
+ height: minCropHeight,
220
+ originX: 'left',
221
+ originY: 'top',
222
+ fill: CROP_RECT_FILL,
223
+ stroke: CROP_RECT_STROKE,
224
+ strokeDashArray: CROP_RECT_DASH,
225
+ strokeWidth: 1,
226
+ strokeUniform: true,
227
+ selectable: true,
228
+ lockRotation: !allowRotation,
229
+ cornerSize: CROP_RECT_CORNER_SIZE,
230
+ objectCaching: false,
231
+ lockScalingFlip: true,
232
+ });
233
+ if (!allowRotation) {
234
+ cropRect.setControlVisible('mtr', false);
235
+ }
236
+ canvas.add(cropRect);
237
+ cropRect.isCropRect = true;
238
+ canvas.bringObjectToFront(cropRect);
239
+ canvas.setActiveObject(cropRect);
240
+ const hideMasks = !!options.crop.hideMasksDuringCrop;
241
+ const maskBackups = [];
242
+ if (hideMasks) {
243
+ canvas.getObjects().forEach((object) => {
244
+ if (object === cropRect)
245
+ return;
246
+ if (!isMaskObject(object))
247
+ return;
248
+ maskBackups.push(captureMaskStyleBackup(object));
249
+ });
250
+ }
251
+ const prevEvented = [];
252
+ canvas.getObjects().forEach((object) => {
253
+ var _a, _b;
254
+ if (object === cropRect)
255
+ return;
256
+ prevEvented.push({
257
+ object,
258
+ evented: (_a = object.evented) !== null && _a !== void 0 ? _a : true,
259
+ selectable: (_b = object.selectable) !== null && _b !== void 0 ? _b : true,
260
+ });
261
+ try {
262
+ object.set({ evented: false, selectable: false });
263
+ }
264
+ catch {
265
+ }
266
+ });
267
+ if (hideMasks) {
268
+ for (const backup of maskBackups) {
269
+ applyCropHideMaskStyle(backup.object);
270
+ }
271
+ }
272
+ const handleCropRectModified = () => {
273
+ try {
274
+ const cropWidth = Math.max(1, Number(cropRect.width) || 1);
275
+ const cropHeight = Math.max(1, Number(cropRect.height) || 1);
276
+ const nextScaleX = Math.min(maxCropWidth / cropWidth, Math.max(minCropWidth / cropWidth, Number(cropRect.scaleX) || 1));
277
+ const nextScaleY = Math.min(maxCropHeight / cropHeight, Math.max(minCropHeight / cropHeight, Number(cropRect.scaleY) || 1));
278
+ const scaledWidth = cropWidth * nextScaleX;
279
+ const scaledHeight = cropHeight * nextScaleY;
280
+ const maxLeft = Math.max(boundsLeft, boundsLeft + maxCropWidth - scaledWidth);
281
+ const maxTop = Math.max(boundsTop, boundsTop + maxCropHeight - scaledHeight);
282
+ const nextLeft = Math.min(maxLeft, Math.max(boundsLeft, Number(cropRect.left) || boundsLeft));
283
+ const nextTop = Math.min(maxTop, Math.max(boundsTop, Number(cropRect.top) || boundsTop));
284
+ cropRect.set({
285
+ left: nextLeft,
286
+ top: nextTop,
287
+ scaleX: nextScaleX,
288
+ scaleY: nextScaleY,
289
+ });
290
+ cropRect.setCoords();
291
+ canvas.requestRenderAll();
292
+ }
293
+ catch {
294
+ }
295
+ };
296
+ cropRect.on('modified', handleCropRectModified);
297
+ cropRect.on('moving', handleCropRectModified);
298
+ cropRect.on('scaling', handleCropRectModified);
299
+ const session = {
300
+ beforeJson,
301
+ prevSelection,
302
+ prevEvented,
303
+ maskBackups,
304
+ cropRect,
305
+ handlers: [
306
+ {
307
+ target: cropRect,
308
+ handlers: [
309
+ { eventName: 'modified', callback: handleCropRectModified },
310
+ { eventName: 'moving', callback: handleCropRectModified },
311
+ { eventName: 'scaling', callback: handleCropRectModified },
312
+ ],
313
+ },
314
+ ],
315
+ };
316
+ context.setCropSession(session);
317
+ canvas.renderAll();
318
+ }
319
+ export function cancelCrop(context) {
320
+ const session = context.getCropSession();
321
+ if (!session)
322
+ return;
323
+ context.canvas.discardActiveObject();
324
+ teardownSession(context, session);
325
+ context.setCropSession(null);
326
+ try {
327
+ context.canvas.renderAll();
328
+ }
329
+ catch {
330
+ }
331
+ }
332
+ export async function applyCrop(context) {
333
+ var _a, _b;
334
+ const session = context.getCropSession();
335
+ if (!session || !session.cropRect)
336
+ return;
337
+ const { canvas } = context;
338
+ canvas.discardActiveObject();
339
+ const beforeJson = session.beforeJson;
340
+ const cropRect = session.cropRect;
341
+ const preserveMasks = !!context.options.crop.preserveMasksAfterCrop;
342
+ try {
343
+ cropRect.setCoords();
344
+ const cropAngle = Number(cropRect.angle) || 0;
345
+ if (!context.options.crop.allowRotationOfCropRect && Math.abs(cropAngle % 360) > 0.01) {
346
+ throw new CropApplyError('applyCrop failed: rotated crop rectangles are disabled.');
347
+ }
348
+ const rectBounds = getCropRectContentBounds(cropRect);
349
+ if (!hasMeaningfulCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight())) {
350
+ throw new CropApplyError('applyCrop failed: crop region is empty or outside the canvas.');
351
+ }
352
+ const cropRegion = getClampedCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight(), { includePartialPixels: false });
353
+ const preservedRecords = preserveMasks
354
+ ? capturePreservedMasks(canvas, cropRegion, session.maskBackups)
355
+ : [];
356
+ restoreCropObjectState(session);
357
+ removeCropRect(context, session);
358
+ canvas.selection = !!session.prevSelection;
359
+ const cropFormat = resolveCropExportFormat({
360
+ cropExportFileType: context.options.crop.exportFileType,
361
+ currentImageMimeType: (_b = (_a = context.getCurrentImageMimeType) === null || _a === void 0 ? void 0 : _a.call(context)) !== null && _b !== void 0 ? _b : null,
362
+ cropExportQuality: context.options.crop.exportQuality,
363
+ downsampleQuality: context.options.downsampleQuality,
364
+ });
365
+ const exportOptions = {
366
+ format: cropFormat.format,
367
+ multiplier: 1,
368
+ left: cropRegion.left,
369
+ top: cropRegion.top,
370
+ width: cropRegion.width,
371
+ height: cropRegion.height,
372
+ };
373
+ if (cropFormat.quality !== undefined) {
374
+ exportOptions.quality = cropFormat.quality;
375
+ }
376
+ const croppedBase64 = canvas.toDataURL(exportOptions);
377
+ await context.loadImage(croppedBase64);
378
+ if (preservedRecords.length > 0) {
379
+ reapplyPreservedMasks(context, cropRegion, preservedRecords);
380
+ canvas.renderAll();
381
+ }
382
+ const afterJson = context.saveState();
383
+ context.setCropSession(null);
384
+ if (beforeJson && afterJson && beforeJson !== afterJson) {
385
+ context.historyManager.push(new Command(() => context.loadFromState(afterJson), () => context.loadFromState(beforeJson)));
386
+ }
387
+ }
388
+ catch (error) {
389
+ teardownSession(context, session);
390
+ context.setCropSession(null);
391
+ try {
392
+ await context.loadFromState(beforeJson);
393
+ }
394
+ catch (rollbackError) {
395
+ console.warn('[ImageEditor] applyCrop: rollback failed', rollbackError);
396
+ }
397
+ if (error instanceof CropApplyError)
398
+ throw error;
399
+ const message = error instanceof Error ? `applyCrop failed: ${error.message}` : 'applyCrop failed';
400
+ throw new CropApplyError(message, error);
401
+ }
402
+ }
403
+ //# sourceMappingURL=crop-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop-controller.js","sourceRoot":"","sources":["../../../src/crop/crop-controller.ts"],"names":[],"mappings":"AA8HA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAuB,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EACH,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,sBAAsB,EACtB,aAAa,EACb,yBAAyB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,YAAY,IAAI,kBAAkB,EAClC,WAAW,EACX,uBAAuB,GAC1B,MAAM,4BAA4B,CAAC;AAyJpC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,MAAM,cAAc,GAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEhD,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,+BAA+B,GAAG,IAAI,CAAC;AAU7C,SAAS,sBAAsB,CAAC,KAAc,EAAE,QAAgB;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzD,CAAC;AAQD,SAAS,iBAAiB,CAAC,QAA8B;IACrD,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAC7C,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,iBAA0B,EAAE,iBAA0B;IACnF,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,kBAAkB,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,OAAO,kBAAkB,CAAC,eAAe,EAAE,+BAA+B,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,+BAA+B,CAAC;AAC3C,CAAC;AAED,SAAS,uBAAuB,CAAC,KAKhC;;IACG,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB,CAAC;IAC3C,MAAM,MAAM,GACR,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,QAAQ;QACnE,CAAC,CAAC,CAAC,MAAA,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,CAAC,mCAAI,KAAK,CAAC;QAC1D,CAAC,CAAC,CAAC,MAAA,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,mCAAI,KAAK,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAClD,OAAO;QACH,MAAM;QACN,QAAQ;QACR,OAAO,EAAE,uBAAuB,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,CAAC;KACrF,CAAC;AACN,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAuB;IAMrD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAC9C,IAAI,eAAe,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QACnE,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,MAAM,EAAE,IAAI,CAAC,GAAG,CACZ,CAAC,EACD,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAC1E;KACJ,CAAC;AACN,CAAC;AASD,SAAS,cAAc,CAAC,OAA8B,EAAE,OAAoB;IAExE,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACA,cAAc,CAAC,MAAgC,CAAC,GAAG,CAChD,MAAM,CAAC,SAAwC,EAC/C,MAAM,CAAC,QAAQ,CAClB,CAAC;YACN,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC;IAItB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAI,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC5B,CAAC;AACL,CAAC;AAQD,SAAS,sBAAsB,CAAC,OAAoB;IAChD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACL,CAAC;IACD,OAAO,CAAC,WAAW,GAAG,EAAE,CAAC;AAC7B,CAAC;AAsBD,SAAS,sBAAsB,CAAC,OAAoB;IAChD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,WAAW,GAAG,EAAE,CAAC;AAC7B,CAAC;AA4BD,SAAS,eAAe,CAAC,OAA8B,EAAE,OAAoB;IACzE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACL,CAAC;AAkDD,SAAS,oBAAoB,CACzB,IAAgB,EAChB,MAAoE;IAEpE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CACH,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI;QACpC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM;QACrC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CACtC,CAAC;AACN,CAAC;AA8BD,SAAS,qBAAqB,CAC1B,MAAuB,EACvB,UAAwE,EACxE,cAA4B,EAAE;;IAE9B,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAE1D,IAAI,UAAU,EAAE,CAAC;gBACb,MAAM,WAAW,GAAG,MAAA,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBAChF,OAAO,CAAC,IAAI,CAAC;oBACT,IAAI;oBAKJ,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1C,GAAG,EAAE,sBAAsB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAExC,KAAK,EAAE,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC5C,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC9C,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC9C,WAAW;iBACd,CAAC,CAAC;YACP,CAAC;YAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AA0BD,SAAS,qBAAqB,CAC1B,OAA8B,EAC9B,UAAwE,EACxE,OAA8B;;IAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YAUD,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAM3C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBACZ,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI;gBACnC,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG;gBAChC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAExB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAKvC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,aAAa;gBAAE,aAAa,GAAG,EAAE,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACL,CAAC;IAID,IACI,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU;QAC5C,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,EAC9C,CAAC;QACC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,CAAC;IAGD,IAAI,CAAC;QACD,MAAA,OAAO,CAAC,cAAc,uDAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACL,CAAC;AA+CD,MAAM,UAAU,aAAa,CAAC,OAA8B;IACxD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,OAAO,CAAC,cAAc,EAAE;QAAE,OAAO;IACrC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IACjD,IAAI,CAAC,aAAa;QAAE,OAAO;IAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;QAAE,OAAO;IAGrC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAK7B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IACzC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;IAIzB,aAAa,CAAC,SAAS,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAC9B,CAAC,CAAC,oBAAoB,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACrB,UAAU,GAAG,YAAY,GAAG,CAAC,EAC7B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAC/D,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACpB,SAAS,GAAG,aAAa,GAAG,CAAC,EAC7B,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAC7D,CAAC;IACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;IAE7D,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACrC,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,gBAAgB;QACxB,eAAe,EAAE,cAAc;QAC/B,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAIhB,YAAY,EAAE,CAAC,aAAa;QAC5B,UAAU,EAAE,qBAAqB;QACjC,aAAa,EAAE,KAAK;QACpB,eAAe,EAAE,IAAI;KACxB,CAAC,CAAC;IACH,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAGpB,QAAqD,CAAC,UAAU,GAAG,IAAI,CAAC;IACzE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAQjC,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACrD,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,IAAI,MAAM,KAAK,QAAQ;gBAAE,OAAO;YAChC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBAAE,OAAO;YAClC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACP,CAAC;IAKD,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;;QACnC,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO;QAChC,WAAW,CAAC,IAAI,CAAC;YACb,MAAM;YACN,OAAO,EAAE,MAAA,MAAM,CAAC,OAAO,mCAAI,IAAI;YAC/B,UAAU,EAAE,MAAA,MAAM,CAAC,UAAU,mCAAI,IAAI;SACxC,CAAC,CAAC;QACH,IAAI,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACL,CAAC,CAAC,CAAC;IAOH,IAAI,SAAS,EAAE,CAAC;QACZ,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YAC/B,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAKD,MAAM,sBAAsB,GAAG,GAAS,EAAE;QACtC,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACvB,YAAY,GAAG,SAAS,EACxB,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CACnE,CAAC;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACvB,aAAa,GAAG,UAAU,EAC1B,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CACrE,CAAC;YACF,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;YAC3C,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC;YAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACrB,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAC5D,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACpB,MAAM,EACN,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CACzD,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,OAAO;gBACZ,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,UAAU;aACrB,CAAC,CAAC;YACH,QAAQ,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACL,CAAC,CAAC;IACF,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAgB;QACzB,UAAU;QACV,aAAa;QACb,WAAW;QAGX,WAAW;QACX,QAAQ;QACR,QAAQ,EAAE;YACN;gBACI,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE;oBACN,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,sBAAsB,EAAE;oBAC3D,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE;oBACzD,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,sBAAsB,EAAE;iBAC7D;aACJ;SACJ;KACJ,CAAC;IACF,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAGhC,MAAM,CAAC,SAAS,EAAE,CAAC;AACvB,CAAC;AAuBD,MAAM,UAAU,UAAU,CAAC,OAA8B;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO;IAGrB,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAErC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC;QAGD,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACL,CAAC;AAuFD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA8B;;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAG3B,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAE7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;IAEpE,IAAI,CAAC;QAID,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;YACpF,MAAM,IAAI,cAAc,CAAC,yDAAyD,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,cAAc,CACpB,+DAA+D,CAClE,CAAC;QACN,CAAC;QACD,MAAM,UAAU,GAAG,sBAAsB,CACrC,UAAU,EACV,MAAM,CAAC,QAAQ,EAAE,EACjB,MAAM,CAAC,SAAS,EAAE,EAClB,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAClC,CAAC;QAmBF,MAAM,gBAAgB,GAA0B,aAAa;YACzD,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC;YAChE,CAAC,CAAC,EAAE,CAAC;QAOT,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAGjC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAK3C,MAAM,UAAU,GAAG,uBAAuB,CAAC;YACvC,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc;YACvD,oBAAoB,EAAE,MAAA,MAAA,OAAO,CAAC,uBAAuB,uDAAI,mCAAI,IAAI;YACjE,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa;YACrD,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,iBAAiB;SACvD,CAAC,CAAC;QACH,MAAM,aAAa,GAA4B;YAC3C,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC5B,CAAC;QACF,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QAC/C,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAClC,aAAuD,CAC1D,CAAC;QAIF,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QASvC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;YAG7D,MAAM,CAAC,SAAS,EAAE,CAAC;QACvB,CAAC;QAGD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAKtC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAO7B,IAAI,UAAU,IAAI,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACtD,OAAO,CAAC,cAAc,CAAC,IAAI,CACvB,IAAI,OAAO,CACP,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EACtC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAC1C,CACJ,CAAC;QACN,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAKb,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC;YACD,MAAM,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,aAAa,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,aAAa,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,KAAK,YAAY,cAAc;YAAE,MAAM,KAAK,CAAC;QACjD,MAAM,OAAO,GACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACvF,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;AACL,CAAC"}
@@ -0,0 +1,53 @@
1
+ const FORMAT_ALIAS_TABLE = Object.freeze({
2
+ jpeg: 'jpeg',
3
+ jpg: 'jpeg',
4
+ 'image/jpeg': 'jpeg',
5
+ png: 'png',
6
+ 'image/png': 'png',
7
+ webp: 'webp',
8
+ 'image/webp': 'webp',
9
+ });
10
+ const MIME_TABLE = Object.freeze({
11
+ jpeg: 'image/jpeg',
12
+ png: 'image/png',
13
+ webp: 'image/webp',
14
+ });
15
+ export function normalizeImageFormat(input) {
16
+ var _a;
17
+ return (_a = tryNormalizeImageFormat(input)) !== null && _a !== void 0 ? _a : 'jpeg';
18
+ }
19
+ export function tryNormalizeImageFormat(input) {
20
+ var _a;
21
+ if (!input)
22
+ return null;
23
+ const key = String(input).toLowerCase();
24
+ if (Object.prototype.hasOwnProperty.call(FORMAT_ALIAS_TABLE, key)) {
25
+ return (_a = FORMAT_ALIAS_TABLE[key]) !== null && _a !== void 0 ? _a : null;
26
+ }
27
+ return null;
28
+ }
29
+ export function mimeTypeFor(format) {
30
+ return MIME_TABLE[format];
31
+ }
32
+ export function clampQuality(quality, fallback) {
33
+ const numeric = Number(quality);
34
+ if (!Number.isFinite(numeric))
35
+ return fallback;
36
+ return Math.max(0, Math.min(1, numeric));
37
+ }
38
+ export function resolveExportFormat(options, downsampleQuality) {
39
+ var _a;
40
+ const providedOptions = options !== null && options !== void 0 ? options : {};
41
+ const fileType = providedOptions.fileType;
42
+ const formatAlias = providedOptions.format;
43
+ const requested = fileType || formatAlias;
44
+ const format = normalizeImageFormat(requested);
45
+ const mimeType = mimeTypeFor(format);
46
+ if (format === 'png') {
47
+ return { format, mimeType, quality: undefined };
48
+ }
49
+ const rawQuality = (_a = providedOptions.quality) !== null && _a !== void 0 ? _a : downsampleQuality;
50
+ const quality = clampQuality(rawQuality, downsampleQuality);
51
+ return { format, mimeType, quality };
52
+ }
53
+ //# sourceMappingURL=export-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-format.js","sourceRoot":"","sources":["../../../src/export/export-format.ts"],"names":[],"mappings":"AAoEA,MAAM,kBAAkB,GAAoD,MAAM,CAAC,MAAM,CAAC;IACtF,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,YAAY,EAAE,MAAM;IACpB,GAAG,EAAE,KAAK;IACV,WAAW,EAAE,KAAK;IAClB,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,MAAM;CACvB,CAAC,CAAC;AAQH,MAAM,UAAU,GAA2D,MAAM,CAAC,MAAM,CAAC;IACrF,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;CACrB,CAAC,CAAC;AAkBH,MAAM,UAAU,oBAAoB,CAAC,KAAqB;;IACtD,OAAO,MAAA,uBAAuB,CAAC,KAAK,CAAC,mCAAI,MAAM,CAAC;AACpD,CAAC;AASD,MAAM,UAAU,uBAAuB,CAAC,KAAqB;;IAGzD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE,CAAC;QAChE,OAAO,MAAA,kBAAkB,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAWD,MAAM,UAAU,WAAW,CAAC,MAA6B;IACrD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAoBD,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,QAAgB;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7C,CAAC;AA6BD,MAAM,UAAU,mBAAmB,CAC/B,OAIU,EACV,iBAAyB;;IAEzB,MAAM,eAAe,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IAItC,MAAM,QAAQ,GAAI,eAAuC,CAAC,QAAQ,CAAC;IACnE,MAAM,WAAW,GAAI,eAAuC,CAAC,MAAM,CAAC;IACpE,MAAM,SAAS,GAAG,QAAQ,IAAI,WAAW,CAAC;IAE1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAInB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IASD,MAAM,UAAU,GAAG,MAAA,eAAe,CAAC,OAAO,mCAAI,iBAAiB,CAAC;IAChE,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAE5D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC"}