@bensitu/image-editor 1.5.2 → 2.1.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 (166) hide show
  1. package/README.md +460 -509
  2. package/dist/cjs/index.cjs +6892 -0
  3. package/dist/cjs/index.cjs.map +1 -0
  4. package/dist/esm/animation/animation-queue.js +74 -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 +529 -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 +157 -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 +252 -0
  17. package/dist/esm/core/state-serializer.js.map +1 -0
  18. package/dist/esm/crop/crop-controller.js +405 -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 +607 -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 +89 -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 +238 -0
  33. package/dist/esm/image/image-loader.js.map +1 -0
  34. package/dist/esm/image/image-resampler.js +60 -0
  35. package/dist/esm/image/image-resampler.js.map +1 -0
  36. package/dist/esm/image/layout-manager.js +206 -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 +2076 -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 +356 -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 +53 -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/mosaic/mosaic-controller.js +670 -0
  53. package/dist/esm/mosaic/mosaic-controller.js.map +1 -0
  54. package/dist/esm/mosaic/mosaic-geometry.js +81 -0
  55. package/dist/esm/mosaic/mosaic-geometry.js.map +1 -0
  56. package/dist/esm/mosaic/mosaic-pixelate.js +71 -0
  57. package/dist/esm/mosaic/mosaic-pixelate.js.map +1 -0
  58. package/dist/esm/ui/dom-bindings.js +67 -0
  59. package/dist/esm/ui/dom-bindings.js.map +1 -0
  60. package/dist/esm/ui/ui-state.js +25 -0
  61. package/dist/esm/ui/ui-state.js.map +1 -0
  62. package/dist/esm/ui/visibility-state.js +11 -0
  63. package/dist/esm/ui/visibility-state.js.map +1 -0
  64. package/dist/esm/utils/canvas-region.js +100 -0
  65. package/dist/esm/utils/canvas-region.js.map +1 -0
  66. package/dist/esm/utils/dom.js +6 -0
  67. package/dist/esm/utils/dom.js.map +1 -0
  68. package/dist/esm/utils/file.js +53 -0
  69. package/dist/esm/utils/file.js.map +1 -0
  70. package/dist/esm/utils/number.js +24 -0
  71. package/dist/esm/utils/number.js.map +1 -0
  72. package/dist/esm/utils/timeout.js +17 -0
  73. package/dist/esm/utils/timeout.js.map +1 -0
  74. package/dist/types/animation/animation-queue.d.ts +111 -0
  75. package/dist/types/animation/animation-queue.d.ts.map +1 -0
  76. package/dist/types/core/callback-reporter.d.ts +125 -0
  77. package/dist/types/core/callback-reporter.d.ts.map +1 -0
  78. package/dist/types/core/default-options.d.ts +84 -0
  79. package/dist/types/core/default-options.d.ts.map +1 -0
  80. package/dist/types/core/errors.d.ts +142 -0
  81. package/dist/types/core/errors.d.ts.map +1 -0
  82. package/dist/types/core/operation-guard.d.ts +194 -0
  83. package/dist/types/core/operation-guard.d.ts.map +1 -0
  84. package/dist/types/core/public-types.d.ts +788 -0
  85. package/dist/types/core/public-types.d.ts.map +1 -0
  86. package/dist/types/core/state-serializer.d.ts +303 -0
  87. package/dist/types/core/state-serializer.d.ts.map +1 -0
  88. package/dist/types/crop/crop-controller.d.ts +407 -0
  89. package/dist/types/crop/crop-controller.d.ts.map +1 -0
  90. package/dist/types/export/export-format.d.ts +136 -0
  91. package/dist/types/export/export-format.d.ts.map +1 -0
  92. package/dist/types/export/export-service.d.ts +333 -0
  93. package/dist/types/export/export-service.d.ts.map +1 -0
  94. package/dist/types/fabric/fabric-adapter.d.ts +74 -0
  95. package/dist/types/fabric/fabric-adapter.d.ts.map +1 -0
  96. package/dist/types/fabric/fabric-animation.d.ts +141 -0
  97. package/dist/types/fabric/fabric-animation.d.ts.map +1 -0
  98. package/dist/types/history/command.d.ts +16 -0
  99. package/dist/types/history/command.d.ts.map +1 -0
  100. package/dist/types/history/history-manager.d.ts +129 -0
  101. package/dist/types/history/history-manager.d.ts.map +1 -0
  102. package/dist/types/image/image-loader.d.ts +263 -0
  103. package/dist/types/image/image-loader.d.ts.map +1 -0
  104. package/dist/types/image/image-resampler.d.ts +139 -0
  105. package/dist/types/image/image-resampler.d.ts.map +1 -0
  106. package/dist/types/image/layout-manager.d.ts +211 -0
  107. package/dist/types/image/layout-manager.d.ts.map +1 -0
  108. package/dist/types/image/transform-controller.d.ts +286 -0
  109. package/dist/types/image/transform-controller.d.ts.map +1 -0
  110. package/dist/types/image-editor.d.ts +661 -0
  111. package/dist/types/image-editor.d.ts.map +1 -0
  112. package/dist/types/index.d.cts +31 -0
  113. package/dist/types/index.d.cts.map +1 -0
  114. package/dist/types/index.d.ts +31 -0
  115. package/dist/types/index.d.ts.map +1 -0
  116. package/dist/types/mask/mask-factory.d.ts +212 -0
  117. package/dist/types/mask/mask-factory.d.ts.map +1 -0
  118. package/dist/types/mask/mask-label-manager.d.ts +171 -0
  119. package/dist/types/mask/mask-label-manager.d.ts.map +1 -0
  120. package/dist/types/mask/mask-list.d.ts +144 -0
  121. package/dist/types/mask/mask-list.d.ts.map +1 -0
  122. package/dist/types/mask/mask-style.d.ts +338 -0
  123. package/dist/types/mask/mask-style.d.ts.map +1 -0
  124. package/dist/types/mosaic/mosaic-controller.d.ts +82 -0
  125. package/dist/types/mosaic/mosaic-controller.d.ts.map +1 -0
  126. package/dist/types/mosaic/mosaic-geometry.d.ts +29 -0
  127. package/dist/types/mosaic/mosaic-geometry.d.ts.map +1 -0
  128. package/dist/types/mosaic/mosaic-pixelate.d.ts +23 -0
  129. package/dist/types/mosaic/mosaic-pixelate.d.ts.map +1 -0
  130. package/dist/types/ui/dom-bindings.d.ts +105 -0
  131. package/dist/types/ui/dom-bindings.d.ts.map +1 -0
  132. package/dist/types/ui/ui-state.d.ts +112 -0
  133. package/dist/types/ui/ui-state.d.ts.map +1 -0
  134. package/dist/types/ui/visibility-state.d.ts +77 -0
  135. package/dist/types/ui/visibility-state.d.ts.map +1 -0
  136. package/dist/types/utils/canvas-region.d.ts +177 -0
  137. package/dist/types/utils/canvas-region.d.ts.map +1 -0
  138. package/dist/types/utils/dom.d.ts +26 -0
  139. package/dist/types/utils/dom.d.ts.map +1 -0
  140. package/dist/types/utils/file.d.ts +80 -0
  141. package/dist/types/utils/file.d.ts.map +1 -0
  142. package/dist/types/utils/number.d.ts +131 -0
  143. package/dist/types/utils/number.d.ts.map +1 -0
  144. package/dist/types/utils/timeout.d.ts +84 -0
  145. package/dist/types/utils/timeout.d.ts.map +1 -0
  146. package/dist/umd/image-editor.umd.js +2 -0
  147. package/dist/umd/image-editor.umd.js.map +1 -0
  148. package/package.json +72 -66
  149. package/dist/image-editor.cjs +0 -4407
  150. package/dist/image-editor.cjs.map +0 -7
  151. package/dist/image-editor.esm.js +0 -4376
  152. package/dist/image-editor.esm.js.map +0 -7
  153. package/dist/image-editor.esm.min.js +0 -9
  154. package/dist/image-editor.esm.min.js.map +0 -7
  155. package/dist/image-editor.esm.min.mjs +0 -9
  156. package/dist/image-editor.esm.min.mjs.map +0 -7
  157. package/dist/image-editor.esm.mjs +0 -4376
  158. package/dist/image-editor.esm.mjs.map +0 -7
  159. package/dist/image-editor.js +0 -4373
  160. package/dist/image-editor.js.map +0 -7
  161. package/dist/image-editor.min.js +0 -9
  162. package/dist/image-editor.min.js.map +0 -7
  163. package/image-editor.d.ts +0 -271
  164. package/src/browser.js +0 -11
  165. package/src/esm.js +0 -9
  166. package/src/image-editor.js +0 -5013
@@ -0,0 +1,405 @@
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 = maskBackups.length > 0
122
+ ? new Map(maskBackups.map((backup) => [backup.object, backup]))
123
+ : null;
124
+ const masks = canvas.getObjects().filter(isMaskObject);
125
+ for (const mask of masks) {
126
+ try {
127
+ mask.setCoords();
128
+ const intersects = maskIntersectsRegion(mask, cropRegion);
129
+ if (intersects) {
130
+ const styleBackup = (_a = styleBackupByMask === null || styleBackupByMask === void 0 ? void 0 : styleBackupByMask.get(mask)) !== null && _a !== void 0 ? _a : captureMaskStyleBackup(mask);
131
+ records.push({
132
+ mask,
133
+ left: finiteNumberOrFallback(mask.left, 0),
134
+ top: finiteNumberOrFallback(mask.top, 0),
135
+ angle: finiteNumberOrFallback(mask.angle, 0),
136
+ scaleX: finiteNumberOrFallback(mask.scaleX, 1),
137
+ scaleY: finiteNumberOrFallback(mask.scaleY, 1),
138
+ styleBackup,
139
+ });
140
+ }
141
+ canvas.remove(mask);
142
+ }
143
+ catch {
144
+ }
145
+ }
146
+ return records;
147
+ }
148
+ function reapplyPreservedMasks(context, cropRegion, records) {
149
+ var _a;
150
+ if (records.length === 0)
151
+ return;
152
+ const { canvas } = context;
153
+ let maxRestoredId = 0;
154
+ for (const record of records) {
155
+ try {
156
+ restoreMaskStyleBackup(record.styleBackup);
157
+ record.mask.set({
158
+ left: record.left - cropRegion.left,
159
+ top: record.top - cropRegion.top,
160
+ angle: record.angle,
161
+ scaleX: record.scaleX,
162
+ scaleY: record.scaleY,
163
+ visible: true,
164
+ });
165
+ record.mask.setCoords();
166
+ canvas.add(record.mask);
167
+ canvas.bringObjectToFront(record.mask);
168
+ reattachMaskHoverHandlers(record.mask);
169
+ const id = Number(record.mask.maskId);
170
+ if (Number.isFinite(id) && id > maxRestoredId)
171
+ maxRestoredId = id;
172
+ }
173
+ catch {
174
+ }
175
+ }
176
+ if (typeof context.getMaskCounter === 'function' &&
177
+ typeof context.setMaskCounter === 'function') {
178
+ const liveCounter = Number(context.getMaskCounter());
179
+ const safeCounter = Number.isFinite(liveCounter) ? liveCounter : 0;
180
+ context.setMaskCounter(Math.max(safeCounter, maxRestoredId));
181
+ }
182
+ try {
183
+ (_a = context.updateMaskList) === null || _a === void 0 ? void 0 : _a.call(context);
184
+ }
185
+ catch {
186
+ }
187
+ }
188
+ export function enterCropMode(context) {
189
+ const { canvas, options } = context;
190
+ if (context.getCropSession())
191
+ return;
192
+ const originalImage = context.getOriginalImage();
193
+ if (!originalImage)
194
+ return;
195
+ if (!context.isImageLoaded())
196
+ return;
197
+ canvas.discardActiveObject();
198
+ const beforeJson = context.saveState();
199
+ const prevSelection = !!canvas.selection;
200
+ canvas.selection = false;
201
+ originalImage.setCoords();
202
+ const imageBounds = originalImage.getBoundingRect();
203
+ const padding = Number.isFinite(Number(options.crop.padding))
204
+ ? Number(options.crop.padding)
205
+ : CROP_DEFAULT_PADDING;
206
+ const boundsLeft = Math.max(0, Math.floor(imageBounds.left));
207
+ const boundsTop = Math.max(0, Math.floor(imageBounds.top));
208
+ const maxCropWidth = Math.max(1, Math.floor(imageBounds.width));
209
+ const maxCropHeight = Math.max(1, Math.floor(imageBounds.height));
210
+ const rectLeft = Math.min(boundsLeft + maxCropWidth - 1, Math.max(boundsLeft, Math.floor(imageBounds.left + padding)));
211
+ const rectTop = Math.min(boundsTop + maxCropHeight - 1, Math.max(boundsTop, Math.floor(imageBounds.top + padding)));
212
+ const configuredMinWidth = Math.max(1, Number(options.crop.minWidth) || 1);
213
+ const configuredMinHeight = Math.max(1, Number(options.crop.minHeight) || 1);
214
+ const minCropWidth = Math.min(configuredMinWidth, maxCropWidth);
215
+ const minCropHeight = Math.min(configuredMinHeight, maxCropHeight);
216
+ const allowRotation = !!options.crop.allowRotationOfCropRect;
217
+ const cropRect = new context.fabric.Rect({
218
+ left: rectLeft,
219
+ top: rectTop,
220
+ width: minCropWidth,
221
+ height: minCropHeight,
222
+ originX: 'left',
223
+ originY: 'top',
224
+ fill: CROP_RECT_FILL,
225
+ stroke: CROP_RECT_STROKE,
226
+ strokeDashArray: CROP_RECT_DASH,
227
+ strokeWidth: 1,
228
+ strokeUniform: true,
229
+ selectable: true,
230
+ lockRotation: !allowRotation,
231
+ cornerSize: CROP_RECT_CORNER_SIZE,
232
+ objectCaching: false,
233
+ lockScalingFlip: true,
234
+ });
235
+ if (!allowRotation) {
236
+ cropRect.setControlVisible('mtr', false);
237
+ }
238
+ canvas.add(cropRect);
239
+ cropRect.isCropRect = true;
240
+ canvas.bringObjectToFront(cropRect);
241
+ canvas.setActiveObject(cropRect);
242
+ const hideMasks = !!options.crop.hideMasksDuringCrop;
243
+ const maskBackups = [];
244
+ if (hideMasks) {
245
+ canvas.getObjects().forEach((object) => {
246
+ if (object === cropRect)
247
+ return;
248
+ if (!isMaskObject(object))
249
+ return;
250
+ maskBackups.push(captureMaskStyleBackup(object));
251
+ });
252
+ }
253
+ const prevEvented = [];
254
+ canvas.getObjects().forEach((object) => {
255
+ var _a, _b;
256
+ if (object === cropRect)
257
+ return;
258
+ prevEvented.push({
259
+ object,
260
+ evented: (_a = object.evented) !== null && _a !== void 0 ? _a : true,
261
+ selectable: (_b = object.selectable) !== null && _b !== void 0 ? _b : true,
262
+ });
263
+ try {
264
+ object.set({ evented: false, selectable: false });
265
+ }
266
+ catch {
267
+ }
268
+ });
269
+ if (hideMasks) {
270
+ for (const backup of maskBackups) {
271
+ applyCropHideMaskStyle(backup.object);
272
+ }
273
+ }
274
+ const handleCropRectModified = () => {
275
+ try {
276
+ const cropWidth = Math.max(1, Number(cropRect.width) || 1);
277
+ const cropHeight = Math.max(1, Number(cropRect.height) || 1);
278
+ const nextScaleX = Math.min(maxCropWidth / cropWidth, Math.max(minCropWidth / cropWidth, Number(cropRect.scaleX) || 1));
279
+ const nextScaleY = Math.min(maxCropHeight / cropHeight, Math.max(minCropHeight / cropHeight, Number(cropRect.scaleY) || 1));
280
+ const scaledWidth = cropWidth * nextScaleX;
281
+ const scaledHeight = cropHeight * nextScaleY;
282
+ const maxLeft = Math.max(boundsLeft, boundsLeft + maxCropWidth - scaledWidth);
283
+ const maxTop = Math.max(boundsTop, boundsTop + maxCropHeight - scaledHeight);
284
+ const nextLeft = Math.min(maxLeft, Math.max(boundsLeft, Number(cropRect.left) || boundsLeft));
285
+ const nextTop = Math.min(maxTop, Math.max(boundsTop, Number(cropRect.top) || boundsTop));
286
+ cropRect.set({
287
+ left: nextLeft,
288
+ top: nextTop,
289
+ scaleX: nextScaleX,
290
+ scaleY: nextScaleY,
291
+ });
292
+ cropRect.setCoords();
293
+ canvas.requestRenderAll();
294
+ }
295
+ catch {
296
+ }
297
+ };
298
+ cropRect.on('modified', handleCropRectModified);
299
+ cropRect.on('moving', handleCropRectModified);
300
+ cropRect.on('scaling', handleCropRectModified);
301
+ const session = {
302
+ beforeJson,
303
+ prevSelection,
304
+ prevEvented,
305
+ maskBackups,
306
+ cropRect,
307
+ handlers: [
308
+ {
309
+ target: cropRect,
310
+ handlers: [
311
+ { eventName: 'modified', callback: handleCropRectModified },
312
+ { eventName: 'moving', callback: handleCropRectModified },
313
+ { eventName: 'scaling', callback: handleCropRectModified },
314
+ ],
315
+ },
316
+ ],
317
+ };
318
+ context.setCropSession(session);
319
+ canvas.renderAll();
320
+ }
321
+ export function cancelCrop(context) {
322
+ const session = context.getCropSession();
323
+ if (!session)
324
+ return;
325
+ context.canvas.discardActiveObject();
326
+ teardownSession(context, session);
327
+ context.setCropSession(null);
328
+ try {
329
+ context.canvas.renderAll();
330
+ }
331
+ catch {
332
+ }
333
+ }
334
+ export async function applyCrop(context) {
335
+ var _a, _b;
336
+ const session = context.getCropSession();
337
+ if (!session || !session.cropRect)
338
+ return;
339
+ const { canvas } = context;
340
+ canvas.discardActiveObject();
341
+ const beforeJson = session.beforeJson;
342
+ const cropRect = session.cropRect;
343
+ const preserveMasks = !!context.options.crop.preserveMasksAfterCrop;
344
+ try {
345
+ cropRect.setCoords();
346
+ const cropAngle = Number(cropRect.angle) || 0;
347
+ if (!context.options.crop.allowRotationOfCropRect && Math.abs(cropAngle % 360) > 0.01) {
348
+ throw new CropApplyError('applyCrop failed: rotated crop rectangles are disabled.');
349
+ }
350
+ const rectBounds = getCropRectContentBounds(cropRect);
351
+ if (!hasMeaningfulCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight())) {
352
+ throw new CropApplyError('applyCrop failed: crop region is empty or outside the canvas.');
353
+ }
354
+ const cropRegion = getClampedCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight(), { includePartialPixels: false });
355
+ const preservedRecords = preserveMasks
356
+ ? capturePreservedMasks(canvas, cropRegion, session.maskBackups)
357
+ : [];
358
+ restoreCropObjectState(session);
359
+ removeCropRect(context, session);
360
+ canvas.selection = !!session.prevSelection;
361
+ const cropFormat = resolveCropExportFormat({
362
+ cropExportFileType: context.options.crop.exportFileType,
363
+ currentImageMimeType: (_b = (_a = context.getCurrentImageMimeType) === null || _a === void 0 ? void 0 : _a.call(context)) !== null && _b !== void 0 ? _b : null,
364
+ cropExportQuality: context.options.crop.exportQuality,
365
+ downsampleQuality: context.options.downsampleQuality,
366
+ });
367
+ const exportOptions = {
368
+ format: cropFormat.format,
369
+ multiplier: 1,
370
+ left: cropRegion.left,
371
+ top: cropRegion.top,
372
+ width: cropRegion.width,
373
+ height: cropRegion.height,
374
+ };
375
+ if (cropFormat.quality !== undefined) {
376
+ exportOptions.quality = cropFormat.quality;
377
+ }
378
+ const croppedBase64 = canvas.toDataURL(exportOptions);
379
+ await context.loadImage(croppedBase64);
380
+ if (preservedRecords.length > 0) {
381
+ reapplyPreservedMasks(context, cropRegion, preservedRecords);
382
+ canvas.renderAll();
383
+ }
384
+ const afterJson = context.saveState();
385
+ context.setCropSession(null);
386
+ if (beforeJson && afterJson && beforeJson !== afterJson) {
387
+ context.historyManager.push(new Command(() => context.loadFromState(afterJson), () => context.loadFromState(beforeJson)));
388
+ }
389
+ }
390
+ catch (error) {
391
+ teardownSession(context, session);
392
+ context.setCropSession(null);
393
+ try {
394
+ await context.loadFromState(beforeJson);
395
+ }
396
+ catch (rollbackError) {
397
+ console.warn('[ImageEditor] applyCrop: rollback failed', rollbackError);
398
+ }
399
+ if (error instanceof CropApplyError)
400
+ throw error;
401
+ const message = error instanceof Error ? `applyCrop failed: ${error.message}` : 'applyCrop failed';
402
+ throw new CropApplyError(message, error);
403
+ }
404
+ }
405
+ //# sourceMappingURL=crop-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop-controller.js","sourceRoot":"","sources":["../../../src/crop/crop-controller.ts"],"names":[],"mappings":"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"}
@@ -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"}