ngx-image-cropper 9.1.2 → 9.1.3
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.
- package/esm2022/lib/component/cropper.state.mjs +11 -2
- package/esm2022/lib/component/image-cropper.component.mjs +3 -3
- package/esm2022/lib/interfaces/crop-input.interface.mjs +2 -0
- package/esm2022/lib/interfaces/cropper-options.interface.mjs +1 -1
- package/esm2022/lib/interfaces/index.mjs +1 -1
- package/esm2022/lib/services/crop.service.mjs +51 -54
- package/fesm2022/ngx-image-cropper.mjs +62 -56
- package/fesm2022/ngx-image-cropper.mjs.map +1 -1
- package/lib/component/cropper.state.d.ts +2 -2
- package/lib/interfaces/crop-input.interface.d.ts +23 -0
- package/lib/interfaces/cropper-options.interface.d.ts +1 -1
- package/lib/interfaces/index.d.ts +1 -0
- package/lib/services/crop.service.d.ts +12 -6
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { resizeCanvas } from '../utils/resize.utils';
|
|
2
2
|
import { percentage } from '../utils/percentage.utils';
|
|
3
3
|
export class CropService {
|
|
4
|
-
crop(
|
|
5
|
-
const imagePosition = this.getImagePosition(
|
|
4
|
+
crop(input, output) {
|
|
5
|
+
const imagePosition = this.getImagePosition(input);
|
|
6
6
|
const width = imagePosition.x2 - imagePosition.x1;
|
|
7
7
|
const height = imagePosition.y2 - imagePosition.y1;
|
|
8
8
|
const cropCanvas = document.createElement('canvas');
|
|
@@ -12,77 +12,76 @@ export class CropService {
|
|
|
12
12
|
if (!ctx) {
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
15
|
-
if (
|
|
16
|
-
ctx.fillStyle =
|
|
15
|
+
if (input.options?.backgroundColor != null) {
|
|
16
|
+
ctx.fillStyle = input.options.backgroundColor;
|
|
17
17
|
ctx.fillRect(0, 0, width, height);
|
|
18
18
|
}
|
|
19
|
-
const scaleX = (
|
|
20
|
-
const scaleY = (
|
|
21
|
-
const { translateH, translateV } = this.getCanvasTranslate(
|
|
22
|
-
const transformedImage =
|
|
19
|
+
const scaleX = (input.transform?.scale || 1) * (input.transform?.flipH ? -1 : 1);
|
|
20
|
+
const scaleY = (input.transform?.scale || 1) * (input.transform?.flipV ? -1 : 1);
|
|
21
|
+
const { translateH, translateV } = this.getCanvasTranslate(input);
|
|
22
|
+
const transformedImage = input.loadedImage.transformed;
|
|
23
23
|
ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);
|
|
24
24
|
ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);
|
|
25
|
-
ctx.rotate((
|
|
25
|
+
ctx.rotate((input.transform?.rotate || 0) * Math.PI / 180);
|
|
26
26
|
ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);
|
|
27
27
|
const result = {
|
|
28
28
|
width, height,
|
|
29
29
|
imagePosition,
|
|
30
|
-
cropperPosition: { ...
|
|
30
|
+
cropperPosition: { ...input.cropper }
|
|
31
31
|
};
|
|
32
|
-
if (
|
|
33
|
-
result.offsetImagePosition = this.getOffsetImagePosition(
|
|
32
|
+
if (input.options?.containWithinAspectRatio) {
|
|
33
|
+
result.offsetImagePosition = this.getOffsetImagePosition(input);
|
|
34
34
|
}
|
|
35
|
-
const resizeRatio = this.getResizeRatio(width, height,
|
|
35
|
+
const resizeRatio = this.getResizeRatio(width, height, input.options);
|
|
36
36
|
if (resizeRatio !== 1) {
|
|
37
37
|
result.width = Math.round(width * resizeRatio);
|
|
38
|
-
result.height =
|
|
39
|
-
? Math.round(result.width /
|
|
38
|
+
result.height = input.options?.maintainAspectRatio
|
|
39
|
+
? Math.round(result.width / (input.options?.aspectRatio ?? 1))
|
|
40
40
|
: Math.round(height * resizeRatio);
|
|
41
41
|
resizeCanvas(cropCanvas, result.width, result.height);
|
|
42
42
|
}
|
|
43
43
|
if (output === 'blob') {
|
|
44
|
-
return this.cropToBlob(result, cropCanvas,
|
|
44
|
+
return this.cropToBlob(result, cropCanvas, input);
|
|
45
45
|
}
|
|
46
46
|
else {
|
|
47
|
-
result.base64 = cropCanvas.toDataURL('image/' +
|
|
47
|
+
result.base64 = cropCanvas.toDataURL('image/' + (input.options?.format ?? 'png'), this.getQuality(input.options));
|
|
48
48
|
return result;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
async cropToBlob(output, cropCanvas,
|
|
52
|
-
output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' +
|
|
51
|
+
async cropToBlob(output, cropCanvas, input) {
|
|
52
|
+
output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' + (input.options?.format ?? 'png'), this.getQuality(input.options)));
|
|
53
53
|
if (output.blob) {
|
|
54
54
|
output.objectUrl = URL.createObjectURL(output.blob);
|
|
55
55
|
}
|
|
56
56
|
return output;
|
|
57
57
|
}
|
|
58
|
-
getCanvasTranslate(
|
|
59
|
-
if (
|
|
60
|
-
const ratio = this.getRatio(
|
|
58
|
+
getCanvasTranslate(input) {
|
|
59
|
+
if (input.transform?.translateUnit === 'px') {
|
|
60
|
+
const ratio = this.getRatio(input);
|
|
61
61
|
return {
|
|
62
|
-
translateH: (
|
|
63
|
-
translateV: (
|
|
62
|
+
translateH: (input.transform?.translateH || 0) * ratio,
|
|
63
|
+
translateV: (input.transform?.translateV || 0) * ratio
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
else {
|
|
67
67
|
return {
|
|
68
|
-
translateH:
|
|
69
|
-
translateV:
|
|
68
|
+
translateH: input.transform?.translateH ? percentage(input.transform.translateH, input.loadedImage.transformed.size.width) : 0,
|
|
69
|
+
translateV: input.transform?.translateV ? percentage(input.transform.translateV, input.loadedImage.transformed.size.height) : 0
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
-
getRatio(
|
|
74
|
-
return
|
|
73
|
+
getRatio(input) {
|
|
74
|
+
return input.loadedImage.transformed.size.width / input.maxSize.width;
|
|
75
75
|
}
|
|
76
76
|
getImagePosition(cropperState) {
|
|
77
77
|
const ratio = this.getRatio(cropperState);
|
|
78
|
-
const cropper = cropperState.cropper();
|
|
79
78
|
const out = {
|
|
80
|
-
x1: Math.round(cropper.x1 * ratio),
|
|
81
|
-
y1: Math.round(cropper.y1 * ratio),
|
|
82
|
-
x2: Math.round(cropper.x2 * ratio),
|
|
83
|
-
y2: Math.round(cropper.y2 * ratio)
|
|
79
|
+
x1: Math.round(cropperState.cropper.x1 * ratio),
|
|
80
|
+
y1: Math.round(cropperState.cropper.y1 * ratio),
|
|
81
|
+
x2: Math.round(cropperState.cropper.x2 * ratio),
|
|
82
|
+
y2: Math.round(cropperState.cropper.y2 * ratio)
|
|
84
83
|
};
|
|
85
|
-
if (!cropperState.options
|
|
84
|
+
if (!cropperState.options?.containWithinAspectRatio) {
|
|
86
85
|
out.x1 = Math.max(out.x1, 0);
|
|
87
86
|
out.y1 = Math.max(out.y1, 0);
|
|
88
87
|
out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
|
|
@@ -90,52 +89,50 @@ export class CropService {
|
|
|
90
89
|
}
|
|
91
90
|
return out;
|
|
92
91
|
}
|
|
93
|
-
getOffsetImagePosition(
|
|
94
|
-
const canvasRotation =
|
|
95
|
-
const ratio = this.getRatio(
|
|
92
|
+
getOffsetImagePosition(input) {
|
|
93
|
+
const canvasRotation = (input.options?.canvasRotation ?? 0) + input.loadedImage.exifTransform.rotate;
|
|
94
|
+
const ratio = this.getRatio(input);
|
|
96
95
|
let offsetX;
|
|
97
96
|
let offsetY;
|
|
98
97
|
if (canvasRotation % 2) {
|
|
99
|
-
offsetX = (
|
|
100
|
-
offsetY = (
|
|
98
|
+
offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.height) / 2;
|
|
99
|
+
offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.width) / 2;
|
|
101
100
|
}
|
|
102
101
|
else {
|
|
103
|
-
offsetX = (
|
|
104
|
-
offsetY = (
|
|
102
|
+
offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.width) / 2;
|
|
103
|
+
offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.height) / 2;
|
|
105
104
|
}
|
|
106
|
-
const cropper =
|
|
105
|
+
const cropper = input.cropper;
|
|
107
106
|
const out = {
|
|
108
107
|
x1: Math.round(cropper.x1 * ratio) - offsetX,
|
|
109
108
|
y1: Math.round(cropper.y1 * ratio) - offsetY,
|
|
110
109
|
x2: Math.round(cropper.x2 * ratio) - offsetX,
|
|
111
110
|
y2: Math.round(cropper.y2 * ratio) - offsetY
|
|
112
111
|
};
|
|
113
|
-
if (!
|
|
112
|
+
if (!input.options?.containWithinAspectRatio) {
|
|
114
113
|
out.x1 = Math.max(out.x1, 0);
|
|
115
114
|
out.y1 = Math.max(out.y1, 0);
|
|
116
|
-
out.x2 = Math.min(out.x2,
|
|
117
|
-
out.y2 = Math.min(out.y2,
|
|
115
|
+
out.x2 = Math.min(out.x2, input.loadedImage.transformed.size.width);
|
|
116
|
+
out.y2 = Math.min(out.y2, input.loadedImage.transformed.size.height);
|
|
118
117
|
}
|
|
119
118
|
return out;
|
|
120
119
|
}
|
|
121
120
|
getResizeRatio(width, height, options) {
|
|
122
|
-
const ratioWidth = options.resizeToWidth / width;
|
|
123
|
-
const ratioHeight = options.resizeToHeight / height;
|
|
124
121
|
const ratios = new Array();
|
|
125
|
-
if (options.resizeToWidth > 0) {
|
|
126
|
-
ratios.push(
|
|
122
|
+
if (options?.resizeToWidth && options.resizeToWidth > 0) {
|
|
123
|
+
ratios.push(options.resizeToWidth / width);
|
|
127
124
|
}
|
|
128
|
-
if (options.resizeToHeight > 0) {
|
|
129
|
-
ratios.push(
|
|
125
|
+
if (options?.resizeToHeight && options.resizeToHeight > 0) {
|
|
126
|
+
ratios.push(options.resizeToHeight / height);
|
|
130
127
|
}
|
|
131
128
|
const result = ratios.length === 0 ? 1 : Math.min(...ratios);
|
|
132
|
-
if (result > 1 && !options
|
|
129
|
+
if (result > 1 && !options?.onlyScaleDown) {
|
|
133
130
|
return result;
|
|
134
131
|
}
|
|
135
132
|
return Math.min(result, 1);
|
|
136
133
|
}
|
|
137
134
|
getQuality(options) {
|
|
138
|
-
return Math.min(1, Math.max(0, options
|
|
135
|
+
return Math.min(1, Math.max(0, options?.imageQuality ?? 92 / 100));
|
|
139
136
|
}
|
|
140
137
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9jcm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd2RCxNQUFNLE9BQU8sV0FBVztJQUl0QixJQUFJLENBQUMsWUFBMEIsRUFBRSxNQUFrQjtRQUNqRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBc0IsQ0FBQztRQUN6RSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUNyRCxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1B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QUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRTdELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXVCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyb3BwZXJPcHRpb25zLCBDcm9wcGVyUG9zaXRpb24sIEltYWdlQ3JvcHBlZEV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDcm9wcGVyU3RhdGUgfSBmcm9tICcuLi9jb21wb25lbnQvY3JvcHBlci5zdGF0ZSc7XG5pbXBvcnQgeyByZXNpemVDYW52YXMgfSBmcm9tICcuLi91dGlscy9yZXNpemUudXRpbHMnO1xuaW1wb3J0IHsgcGVyY2VudGFnZSB9IGZyb20gJy4uL3V0aWxzL3BlcmNlbnRhZ2UudXRpbHMnO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci1vcHRpb25zLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBDcm9wU2VydmljZSB7XG5cbiAgY3JvcChjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSwgb3V0cHV0OiAnYmxvYicpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB8IG51bGw7XG4gIGNyb3AoY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIG91dHB1dDogJ2Jhc2U2NCcpOiBJbWFnZUNyb3BwZWRFdmVudCB8IG51bGw7XG4gIGNyb3AoY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIG91dHB1dDogT3V0cHV0VHlwZSk6IFByb21pc2U8SW1hZ2VDcm9wcGVkRXZlbnQ+IHwgSW1hZ2VDcm9wcGVkRXZlbnQgfCBudWxsIHtcbiAgICBjb25zdCBpbWFnZVBvc2l0aW9uID0gdGhpcy5nZXRJbWFnZVBvc2l0aW9uKGNyb3BwZXJTdGF0ZSk7XG4gICAgY29uc3Qgd2lkdGggPSBpbWFnZVBvc2l0aW9uLngyIC0gaW1hZ2VQb3NpdGlvbi54MTtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVBvc2l0aW9uLnkyIC0gaW1hZ2VQb3NpdGlvbi55MTtcbiAgICBjb25zdCBjcm9wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgY3JvcENhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNyb3BDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4ID0gY3JvcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGNyb3BwZXJTdGF0ZS5vcHRpb25zLmJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gY3JvcHBlclN0YXRlLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlWCA9IChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnNjYWxlIHx8IDEpICogKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0uZmxpcEggPyAtMSA6IDEpO1xuICAgIGNvbnN0IHNjYWxlWSA9IChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnNjYWxlIHx8IDEpICogKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0uZmxpcFYgPyAtMSA6IDEpO1xuICAgIGNvbnN0IHt0cmFuc2xhdGVILCB0cmFuc2xhdGVWfSA9IHRoaXMuZ2V0Q2FudmFzVHJhbnNsYXRlKGNyb3BwZXJTdGF0ZSk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZEltYWdlID0gY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZDtcbiAgICBjdHguc2V0VHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgc2NhbGVZLCB0cmFuc2Zvcm1lZEltYWdlLnNpemUud2lkdGggLyAyICsgdHJhbnNsYXRlSCwgdHJhbnNmb3JtZWRJbWFnZS5zaXplLmhlaWdodCAvIDIgKyB0cmFuc2xhdGVWKTtcbiAgICBjdHgudHJhbnNsYXRlKC1pbWFnZVBvc2l0aW9uLngxIC8gc2NhbGVYLCAtaW1hZ2VQb3NpdGlvbi55MSAvIHNjYWxlWSk7XG4gICAgY3R4LnJvdGF0ZSgoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS5yb3RhdGUgfHwgMCkgKiBNYXRoLlBJIC8gMTgwKTtcblxuICAgIGN0eC5kcmF3SW1hZ2UoXG4gICAgICB0cmFuc2Zvcm1lZEltYWdlLmltYWdlLFxuICAgICAgLXRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS53aWR0aCAvIDIsXG4gICAgICAtdHJhbnNmb3JtZWRJbWFnZS5zaXplLmhlaWdodCAvIDJcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0OiBJbWFnZUNyb3BwZWRFdmVudCA9IHtcbiAgICAgIHdpZHRoLCBoZWlnaHQsXG4gICAgICBpbWFnZVBvc2l0aW9uLFxuICAgICAgY3JvcHBlclBvc2l0aW9uOiB7Li4uY3JvcHBlclN0YXRlLmNyb3BwZXIoKX1cbiAgICB9O1xuICAgIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIHJlc3VsdC5vZmZzZXRJbWFnZVBvc2l0aW9uID0gdGhpcy5nZXRPZmZzZXRJbWFnZVBvc2l0aW9uKGNyb3BwZXJTdGF0ZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc2l6ZVJhdGlvID0gdGhpcy5nZXRSZXNpemVSYXRpbyh3aWR0aCwgaGVpZ2h0LCBjcm9wcGVyU3RhdGUub3B0aW9ucyk7XG4gICAgaWYgKHJlc2l6ZVJhdGlvICE9PSAxKSB7XG4gICAgICByZXN1bHQud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogcmVzaXplUmF0aW8pO1xuICAgICAgcmVzdWx0LmhlaWdodCA9IGNyb3BwZXJTdGF0ZS5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW9cbiAgICAgICAgPyBNYXRoLnJvdW5kKHJlc3VsdC53aWR0aCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKVxuICAgICAgICA6IE1hdGgucm91bmQoaGVpZ2h0ICogcmVzaXplUmF0aW8pO1xuICAgICAgcmVzaXplQ2FudmFzKGNyb3BDYW52YXMsIHJlc3VsdC53aWR0aCwgcmVzdWx0LmhlaWdodCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQgPT09ICdibG9iJykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JvcFRvQmxvYihyZXN1bHQsIGNyb3BDYW52YXMsIGNyb3BwZXJTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5iYXNlNjQgPSBjcm9wQ2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvJyArIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmZvcm1hdCwgdGhpcy5nZXRRdWFsaXR5KGNyb3BwZXJTdGF0ZS5vcHRpb25zKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JvcFRvQmxvYihvdXRwdXQ6IEltYWdlQ3JvcHBlZEV2ZW50LCBjcm9wQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB7XG4gICAgb3V0cHV0LmJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4ocmVzb2x2ZSA9PiBjcm9wQ2FudmFzLnRvQmxvYihyZXNvbHZlLCAnaW1hZ2UvJyArIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmZvcm1hdCwgdGhpcy5nZXRRdWFsaXR5KGNyb3BwZXJTdGF0ZS5vcHRpb25zKSkpO1xuICAgIGlmIChvdXRwdXQuYmxvYikge1xuICAgICAgb3V0cHV0Lm9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwob3V0cHV0LmJsb2IpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYW52YXNUcmFuc2xhdGUoY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiB7IHRyYW5zbGF0ZUg6IG51bWJlciwgdHJhbnNsYXRlVjogbnVtYmVyIH0ge1xuICAgIGlmIChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnRyYW5zbGF0ZVVuaXQgPT09ICdweCcpIHtcbiAgICAgIGNvbnN0IHJhdGlvID0gdGhpcy5nZXRSYXRpbyhjcm9wcGVyU3RhdGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNsYXRlSDogKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0udHJhbnNsYXRlSCB8fCAwKSAqIHJhdGlvLFxuICAgICAgICB0cmFuc2xhdGVWOiAoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVWIHx8IDApICogcmF0aW9cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zbGF0ZUg6IGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0udHJhbnNsYXRlSCA/IHBlcmNlbnRhZ2UoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVILCBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGgpIDogMCxcbiAgICAgICAgdHJhbnNsYXRlVjogY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVWID8gcGVyY2VudGFnZShjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnRyYW5zbGF0ZVYsIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQpIDogMFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJhdGlvKGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoIC8gY3JvcHBlclN0YXRlLm1heFNpemUoKS53aWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW1hZ2VQb3NpdGlvbihjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGNyb3BwZXJTdGF0ZSk7XG4gICAgY29uc3QgY3JvcHBlciA9IGNyb3BwZXJTdGF0ZS5jcm9wcGVyKCk7XG4gICAgY29uc3Qgb3V0OiBDcm9wcGVyUG9zaXRpb24gPSB7XG4gICAgICB4MTogTWF0aC5yb3VuZChjcm9wcGVyLngxICogcmF0aW8pLFxuICAgICAgeTE6IE1hdGgucm91bmQoY3JvcHBlci55MSAqIHJhdGlvKSxcbiAgICAgIHgyOiBNYXRoLnJvdW5kKGNyb3BwZXIueDIgKiByYXRpbyksXG4gICAgICB5MjogTWF0aC5yb3VuZChjcm9wcGVyLnkyICogcmF0aW8pXG4gICAgfTtcblxuICAgIGlmICghY3JvcHBlclN0YXRlLm9wdGlvbnMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoKTtcbiAgICAgIG91dC55MiA9IE1hdGgubWluKG91dC55MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gICAgY29uc3QgY2FudmFzUm90YXRpb24gPSBjcm9wcGVyU3RhdGUub3B0aW9ucy5jYW52YXNSb3RhdGlvbiArIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEuZXhpZlRyYW5zZm9ybS5yb3RhdGU7XG4gICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGNyb3BwZXJTdGF0ZSk7XG4gICAgbGV0IG9mZnNldFg6IG51bWJlcjtcbiAgICBsZXQgb2Zmc2V0WTogbnVtYmVyO1xuXG4gICAgaWYgKGNhbnZhc1JvdGF0aW9uICUgMikge1xuICAgICAgb2Zmc2V0WCA9IChjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUuaGVpZ2h0KSAvIDI7XG4gICAgICBvZmZzZXRZID0gKGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQgLSBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0WCA9IChjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICAgIG9mZnNldFkgPSAoY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEub3JpZ2luYWwuc2l6ZS5oZWlnaHQpIC8gMjtcbiAgICB9XG5cbiAgICBjb25zdCBjcm9wcGVyID0gY3JvcHBlclN0YXRlLmNyb3BwZXIoKTtcbiAgICBjb25zdCBvdXQ6IENyb3BwZXJQb3NpdGlvbiA9IHtcbiAgICAgIHgxOiBNYXRoLnJvdW5kKGNyb3BwZXIueDEgKiByYXRpbykgLSBvZmZzZXRYLFxuICAgICAgeTE6IE1hdGgucm91bmQoY3JvcHBlci55MSAqIHJhdGlvKSAtIG9mZnNldFksXG4gICAgICB4MjogTWF0aC5yb3VuZChjcm9wcGVyLngyICogcmF0aW8pIC0gb2Zmc2V0WCxcbiAgICAgIHkyOiBNYXRoLnJvdW5kKGNyb3BwZXIueTIgKiByYXRpbykgLSBvZmZzZXRZXG4gICAgfTtcblxuICAgIGlmICghY3JvcHBlclN0YXRlLm9wdGlvbnMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoKTtcbiAgICAgIG91dC55MiA9IE1hdGgubWluKG91dC55MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGdldFJlc2l6ZVJhdGlvKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvcHRpb25zOiBDcm9wcGVyT3B0aW9ucyk6IG51bWJlciB7XG4gICAgY29uc3QgcmF0aW9XaWR0aCA9IG9wdGlvbnMucmVzaXplVG9XaWR0aCAvIHdpZHRoO1xuICAgIGNvbnN0IHJhdGlvSGVpZ2h0ID0gb3B0aW9ucy5yZXNpemVUb0hlaWdodCAvIGhlaWdodDtcbiAgICBjb25zdCByYXRpb3MgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgaWYgKG9wdGlvbnMucmVzaXplVG9XaWR0aCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKHJhdGlvV2lkdGgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5yZXNpemVUb0hlaWdodCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKHJhdGlvSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByYXRpb3MubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKC4uLnJhdGlvcyk7XG5cbiAgICBpZiAocmVzdWx0ID4gMSAmJiAhb3B0aW9ucy5vbmx5U2NhbGVEb3duKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocmVzdWx0LCAxKTtcbiAgfVxuXG4gIGdldFF1YWxpdHkob3B0aW9uczogQ3JvcHBlck9wdGlvbnMpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBvcHRpb25zLmltYWdlUXVhbGl0eSAvIDEwMCkpO1xuICB9XG59XG4iXX0=
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9jcm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUl2RCxNQUFNLE9BQU8sV0FBVztJQUl0QixJQUFJLENBQUMsS0FBZ0IsRUFBRSxNQUFrQjtRQUN2QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBc0IsQ0FBQztRQUN6RSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDM0MsR0FBRyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUM5QyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1B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S0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRTdELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUMxQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQW1DO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIEltYWdlQ3JvcHBlZEV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyByZXNpemVDYW52YXMgfSBmcm9tICcuLi91dGlscy9yZXNpemUudXRpbHMnO1xuaW1wb3J0IHsgcGVyY2VudGFnZSB9IGZyb20gJy4uL3V0aWxzL3BlcmNlbnRhZ2UudXRpbHMnO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9wSW5wdXQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nyb3AtaW5wdXQuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIENyb3BTZXJ2aWNlIHtcblxuICBjcm9wKGlucHV0OiBDcm9wSW5wdXQsIG91dHB1dDogJ2Jsb2InKTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4gfCBudWxsO1xuICBjcm9wKGlucHV0OiBDcm9wSW5wdXQsIG91dHB1dDogJ2Jhc2U2NCcpOiBJbWFnZUNyb3BwZWRFdmVudCB8IG51bGw7XG4gIGNyb3AoaW5wdXQ6IENyb3BJbnB1dCwgb3V0cHV0OiBPdXRwdXRUeXBlKTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4gfCBJbWFnZUNyb3BwZWRFdmVudCB8IG51bGwge1xuICAgIGNvbnN0IGltYWdlUG9zaXRpb24gPSB0aGlzLmdldEltYWdlUG9zaXRpb24oaW5wdXQpO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VQb3NpdGlvbi54MiAtIGltYWdlUG9zaXRpb24ueDE7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VQb3NpdGlvbi55MiAtIGltYWdlUG9zaXRpb24ueTE7XG4gICAgY29uc3QgY3JvcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgIGNyb3BDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjcm9wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIGNvbnN0IGN0eCA9IGNyb3BDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpbnB1dC5vcHRpb25zPy5iYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGlucHV0Lm9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlWCA9IChpbnB1dC50cmFuc2Zvcm0/LnNjYWxlIHx8IDEpICogKGlucHV0LnRyYW5zZm9ybT8uZmxpcEggPyAtMSA6IDEpO1xuICAgIGNvbnN0IHNjYWxlWSA9IChpbnB1dC50cmFuc2Zvcm0/LnNjYWxlIHx8IDEpICogKGlucHV0LnRyYW5zZm9ybT8uZmxpcFYgPyAtMSA6IDEpO1xuICAgIGNvbnN0IHt0cmFuc2xhdGVILCB0cmFuc2xhdGVWfSA9IHRoaXMuZ2V0Q2FudmFzVHJhbnNsYXRlKGlucHV0KTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkSW1hZ2UgPSBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQ7XG4gICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZVgsIDAsIDAsIHNjYWxlWSwgdHJhbnNmb3JtZWRJbWFnZS5zaXplLndpZHRoIC8gMiArIHRyYW5zbGF0ZUgsIHRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyICsgdHJhbnNsYXRlVik7XG4gICAgY3R4LnRyYW5zbGF0ZSgtaW1hZ2VQb3NpdGlvbi54MSAvIHNjYWxlWCwgLWltYWdlUG9zaXRpb24ueTEgLyBzY2FsZVkpO1xuICAgIGN0eC5yb3RhdGUoKGlucHV0LnRyYW5zZm9ybT8ucm90YXRlIHx8IDApICogTWF0aC5QSSAvIDE4MCk7XG5cbiAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgdHJhbnNmb3JtZWRJbWFnZS5pbWFnZSxcbiAgICAgIC10cmFuc2Zvcm1lZEltYWdlLnNpemUud2lkdGggLyAyLFxuICAgICAgLXRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdDogSW1hZ2VDcm9wcGVkRXZlbnQgPSB7XG4gICAgICB3aWR0aCwgaGVpZ2h0LFxuICAgICAgaW1hZ2VQb3NpdGlvbixcbiAgICAgIGNyb3BwZXJQb3NpdGlvbjogey4uLmlucHV0LmNyb3BwZXJ9XG4gICAgfTtcbiAgICBpZiAoaW5wdXQub3B0aW9ucz8uY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICByZXN1bHQub2Zmc2V0SW1hZ2VQb3NpdGlvbiA9IHRoaXMuZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihpbnB1dCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc2l6ZVJhdGlvID0gdGhpcy5nZXRSZXNpemVSYXRpbyh3aWR0aCwgaGVpZ2h0LCBpbnB1dC5vcHRpb25zKTtcbiAgICBpZiAocmVzaXplUmF0aW8gIT09IDEpIHtcbiAgICAgIHJlc3VsdC53aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiByZXNpemVSYXRpbyk7XG4gICAgICByZXN1bHQuaGVpZ2h0ID0gaW5wdXQub3B0aW9ucz8ubWFpbnRhaW5Bc3BlY3RSYXRpb1xuICAgICAgICA/IE1hdGgucm91bmQocmVzdWx0LndpZHRoIC8gKGlucHV0Lm9wdGlvbnM/LmFzcGVjdFJhdGlvID8/IDEpKVxuICAgICAgICA6IE1hdGgucm91bmQoaGVpZ2h0ICogcmVzaXplUmF0aW8pO1xuICAgICAgcmVzaXplQ2FudmFzKGNyb3BDYW52YXMsIHJlc3VsdC53aWR0aCwgcmVzdWx0LmhlaWdodCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQgPT09ICdibG9iJykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JvcFRvQmxvYihyZXN1bHQsIGNyb3BDYW52YXMsIGlucHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmJhc2U2NCA9IGNyb3BDYW52YXMudG9EYXRhVVJMKCdpbWFnZS8nICsgKGlucHV0Lm9wdGlvbnM/LmZvcm1hdCA/PyAncG5nJyksIHRoaXMuZ2V0UXVhbGl0eShpbnB1dC5vcHRpb25zKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JvcFRvQmxvYihvdXRwdXQ6IEltYWdlQ3JvcHBlZEV2ZW50LCBjcm9wQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgaW5wdXQ6IENyb3BJbnB1dCk6IFByb21pc2U8SW1hZ2VDcm9wcGVkRXZlbnQ+IHtcbiAgICBvdXRwdXQuYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPihyZXNvbHZlID0+IGNyb3BDYW52YXMudG9CbG9iKHJlc29sdmUsICdpbWFnZS8nICsgKGlucHV0Lm9wdGlvbnM/LmZvcm1hdCA/PyAncG5nJyksIHRoaXMuZ2V0UXVhbGl0eShpbnB1dC5vcHRpb25zKSkpO1xuICAgIGlmIChvdXRwdXQuYmxvYikge1xuICAgICAgb3V0cHV0Lm9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwob3V0cHV0LmJsb2IpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYW52YXNUcmFuc2xhdGUoaW5wdXQ6IENyb3BJbnB1dCk6IHsgdHJhbnNsYXRlSDogbnVtYmVyLCB0cmFuc2xhdGVWOiBudW1iZXIgfSB7XG4gICAgaWYgKGlucHV0LnRyYW5zZm9ybT8udHJhbnNsYXRlVW5pdCA9PT0gJ3B4Jykge1xuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGlucHV0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zbGF0ZUg6IChpbnB1dC50cmFuc2Zvcm0/LnRyYW5zbGF0ZUggfHwgMCkgKiByYXRpbyxcbiAgICAgICAgdHJhbnNsYXRlVjogKGlucHV0LnRyYW5zZm9ybT8udHJhbnNsYXRlViB8fCAwKSAqIHJhdGlvXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2xhdGVIOiBpbnB1dC50cmFuc2Zvcm0/LnRyYW5zbGF0ZUggPyBwZXJjZW50YWdlKGlucHV0LnRyYW5zZm9ybS50cmFuc2xhdGVILCBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCkgOiAwLFxuICAgICAgICB0cmFuc2xhdGVWOiBpbnB1dC50cmFuc2Zvcm0/LnRyYW5zbGF0ZVYgPyBwZXJjZW50YWdlKGlucHV0LnRyYW5zZm9ybS50cmFuc2xhdGVWLCBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQpIDogMFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJhdGlvKGlucHV0OiBDcm9wSW5wdXQpOiBudW1iZXIge1xuICAgIHJldHVybiBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAvIGlucHV0Lm1heFNpemUud2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGdldEltYWdlUG9zaXRpb24oY3JvcHBlclN0YXRlOiBDcm9wSW5wdXQpOiBDcm9wcGVyUG9zaXRpb24ge1xuICAgIGNvbnN0IHJhdGlvID0gdGhpcy5nZXRSYXRpbyhjcm9wcGVyU3RhdGUpO1xuICAgIGNvbnN0IG91dDogQ3JvcHBlclBvc2l0aW9uID0ge1xuICAgICAgeDE6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueDEgKiByYXRpbyksXG4gICAgICB5MTogTWF0aC5yb3VuZChjcm9wcGVyU3RhdGUuY3JvcHBlci55MSAqIHJhdGlvKSxcbiAgICAgIHgyOiBNYXRoLnJvdW5kKGNyb3BwZXJTdGF0ZS5jcm9wcGVyLngyICogcmF0aW8pLFxuICAgICAgeTI6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueTIgKiByYXRpbylcbiAgICB9O1xuXG4gICAgaWYgKCFjcm9wcGVyU3RhdGUub3B0aW9ucz8uY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoKTtcbiAgICAgIG91dC55MiA9IE1hdGgubWluKG91dC55MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihpbnB1dDogQ3JvcElucHV0KTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IChpbnB1dC5vcHRpb25zPy5jYW52YXNSb3RhdGlvbiA/PyAwKSArIGlucHV0LmxvYWRlZEltYWdlIS5leGlmVHJhbnNmb3JtLnJvdGF0ZTtcbiAgICBjb25zdCByYXRpbyA9IHRoaXMuZ2V0UmF0aW8oaW5wdXQpO1xuICAgIGxldCBvZmZzZXRYOiBudW1iZXI7XG4gICAgbGV0IG9mZnNldFk6IG51bWJlcjtcblxuICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcbiAgICAgIG9mZnNldFggPSAoaW5wdXQubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBpbnB1dC5sb2FkZWRJbWFnZSEub3JpZ2luYWwuc2l6ZS5oZWlnaHQpIC8gMjtcbiAgICAgIG9mZnNldFkgPSAoaW5wdXQubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUuaGVpZ2h0IC0gaW5wdXQubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0WCA9IChpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAtIGlucHV0LmxvYWRlZEltYWdlIS5vcmlnaW5hbC5zaXplLndpZHRoKSAvIDI7XG4gICAgICBvZmZzZXRZID0gKGlucHV0LmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGlucHV0LmxvYWRlZEltYWdlIS5vcmlnaW5hbC5zaXplLmhlaWdodCkgLyAyO1xuICAgIH1cblxuICAgIGNvbnN0IGNyb3BwZXIgPSBpbnB1dC5jcm9wcGVyO1xuICAgIGNvbnN0IG91dDogQ3JvcHBlclBvc2l0aW9uID0ge1xuICAgICAgeDE6IE1hdGgucm91bmQoY3JvcHBlci54MSAqIHJhdGlvKSAtIG9mZnNldFgsXG4gICAgICB5MTogTWF0aC5yb3VuZChjcm9wcGVyLnkxICogcmF0aW8pIC0gb2Zmc2V0WSxcbiAgICAgIHgyOiBNYXRoLnJvdW5kKGNyb3BwZXIueDIgKiByYXRpbykgLSBvZmZzZXRYLFxuICAgICAgeTI6IE1hdGgucm91bmQoY3JvcHBlci55MiAqIHJhdGlvKSAtIG9mZnNldFlcbiAgICB9O1xuXG4gICAgaWYgKCFpbnB1dC5vcHRpb25zPy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIG91dC54MSA9IE1hdGgubWF4KG91dC54MSwgMCk7XG4gICAgICBvdXQueTEgPSBNYXRoLm1heChvdXQueTEsIDApO1xuICAgICAgb3V0LngyID0gTWF0aC5taW4ob3V0LngyLCBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCk7XG4gICAgICBvdXQueTIgPSBNYXRoLm1pbihvdXQueTIsIGlucHV0LmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGdldFJlc2l6ZVJhdGlvKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvcHRpb25zPzoge1xuICAgIHJlc2l6ZVRvV2lkdGg/OiBudW1iZXI7XG4gICAgcmVzaXplVG9IZWlnaHQ/OiBudW1iZXI7XG4gICAgb25seVNjYWxlRG93bj86IGJvb2xlYW47XG4gIH0pOiBudW1iZXIge1xuICAgIGNvbnN0IHJhdGlvcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgaWYgKG9wdGlvbnM/LnJlc2l6ZVRvV2lkdGggJiYgb3B0aW9ucy5yZXNpemVUb1dpZHRoID4gMCkge1xuICAgICAgcmF0aW9zLnB1c2gob3B0aW9ucy5yZXNpemVUb1dpZHRoIC8gd2lkdGgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8ucmVzaXplVG9IZWlnaHQgJiYgb3B0aW9ucy5yZXNpemVUb0hlaWdodCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKG9wdGlvbnMucmVzaXplVG9IZWlnaHQgLyBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJhdGlvcy5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4oLi4ucmF0aW9zKTtcblxuICAgIGlmIChyZXN1bHQgPiAxICYmICFvcHRpb25zPy5vbmx5U2NhbGVEb3duKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocmVzdWx0LCAxKTtcbiAgfVxuXG4gIGdldFF1YWxpdHkob3B0aW9ucz86IHsgaW1hZ2VRdWFsaXR5PzogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBvcHRpb25zPy5pbWFnZVF1YWxpdHkgPz8gOTIgLyAxMDApKTtcbiAgfVxufVxuIl19
|
|
@@ -268,7 +268,7 @@ class CropperState {
|
|
|
268
268
|
roundCropper: false,
|
|
269
269
|
onlyScaleDown: false,
|
|
270
270
|
imageQuality: 92,
|
|
271
|
-
backgroundColor:
|
|
271
|
+
backgroundColor: undefined,
|
|
272
272
|
containWithinAspectRatio: false,
|
|
273
273
|
hideResizeSquares: false,
|
|
274
274
|
alignImage: 'center',
|
|
@@ -429,6 +429,15 @@ class CropperState {
|
|
|
429
429
|
y2: this.maxSize().height
|
|
430
430
|
};
|
|
431
431
|
}
|
|
432
|
+
toCropInput() {
|
|
433
|
+
return {
|
|
434
|
+
cropper: this.cropper(),
|
|
435
|
+
maxSize: this.maxSize(),
|
|
436
|
+
transform: this.transform,
|
|
437
|
+
loadedImage: this.loadedImage,
|
|
438
|
+
options: { ...this.options }
|
|
439
|
+
};
|
|
440
|
+
}
|
|
432
441
|
}
|
|
433
442
|
|
|
434
443
|
var MoveTypes;
|
|
@@ -519,8 +528,8 @@ function percentage(percent, totalValue) {
|
|
|
519
528
|
}
|
|
520
529
|
|
|
521
530
|
class CropService {
|
|
522
|
-
crop(
|
|
523
|
-
const imagePosition = this.getImagePosition(
|
|
531
|
+
crop(input, output) {
|
|
532
|
+
const imagePosition = this.getImagePosition(input);
|
|
524
533
|
const width = imagePosition.x2 - imagePosition.x1;
|
|
525
534
|
const height = imagePosition.y2 - imagePosition.y1;
|
|
526
535
|
const cropCanvas = document.createElement('canvas');
|
|
@@ -530,77 +539,76 @@ class CropService {
|
|
|
530
539
|
if (!ctx) {
|
|
531
540
|
return null;
|
|
532
541
|
}
|
|
533
|
-
if (
|
|
534
|
-
ctx.fillStyle =
|
|
542
|
+
if (input.options?.backgroundColor != null) {
|
|
543
|
+
ctx.fillStyle = input.options.backgroundColor;
|
|
535
544
|
ctx.fillRect(0, 0, width, height);
|
|
536
545
|
}
|
|
537
|
-
const scaleX = (
|
|
538
|
-
const scaleY = (
|
|
539
|
-
const { translateH, translateV } = this.getCanvasTranslate(
|
|
540
|
-
const transformedImage =
|
|
546
|
+
const scaleX = (input.transform?.scale || 1) * (input.transform?.flipH ? -1 : 1);
|
|
547
|
+
const scaleY = (input.transform?.scale || 1) * (input.transform?.flipV ? -1 : 1);
|
|
548
|
+
const { translateH, translateV } = this.getCanvasTranslate(input);
|
|
549
|
+
const transformedImage = input.loadedImage.transformed;
|
|
541
550
|
ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);
|
|
542
551
|
ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);
|
|
543
|
-
ctx.rotate((
|
|
552
|
+
ctx.rotate((input.transform?.rotate || 0) * Math.PI / 180);
|
|
544
553
|
ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);
|
|
545
554
|
const result = {
|
|
546
555
|
width, height,
|
|
547
556
|
imagePosition,
|
|
548
|
-
cropperPosition: { ...
|
|
557
|
+
cropperPosition: { ...input.cropper }
|
|
549
558
|
};
|
|
550
|
-
if (
|
|
551
|
-
result.offsetImagePosition = this.getOffsetImagePosition(
|
|
559
|
+
if (input.options?.containWithinAspectRatio) {
|
|
560
|
+
result.offsetImagePosition = this.getOffsetImagePosition(input);
|
|
552
561
|
}
|
|
553
|
-
const resizeRatio = this.getResizeRatio(width, height,
|
|
562
|
+
const resizeRatio = this.getResizeRatio(width, height, input.options);
|
|
554
563
|
if (resizeRatio !== 1) {
|
|
555
564
|
result.width = Math.round(width * resizeRatio);
|
|
556
|
-
result.height =
|
|
557
|
-
? Math.round(result.width /
|
|
565
|
+
result.height = input.options?.maintainAspectRatio
|
|
566
|
+
? Math.round(result.width / (input.options?.aspectRatio ?? 1))
|
|
558
567
|
: Math.round(height * resizeRatio);
|
|
559
568
|
resizeCanvas(cropCanvas, result.width, result.height);
|
|
560
569
|
}
|
|
561
570
|
if (output === 'blob') {
|
|
562
|
-
return this.cropToBlob(result, cropCanvas,
|
|
571
|
+
return this.cropToBlob(result, cropCanvas, input);
|
|
563
572
|
}
|
|
564
573
|
else {
|
|
565
|
-
result.base64 = cropCanvas.toDataURL('image/' +
|
|
574
|
+
result.base64 = cropCanvas.toDataURL('image/' + (input.options?.format ?? 'png'), this.getQuality(input.options));
|
|
566
575
|
return result;
|
|
567
576
|
}
|
|
568
577
|
}
|
|
569
|
-
async cropToBlob(output, cropCanvas,
|
|
570
|
-
output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' +
|
|
578
|
+
async cropToBlob(output, cropCanvas, input) {
|
|
579
|
+
output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' + (input.options?.format ?? 'png'), this.getQuality(input.options)));
|
|
571
580
|
if (output.blob) {
|
|
572
581
|
output.objectUrl = URL.createObjectURL(output.blob);
|
|
573
582
|
}
|
|
574
583
|
return output;
|
|
575
584
|
}
|
|
576
|
-
getCanvasTranslate(
|
|
577
|
-
if (
|
|
578
|
-
const ratio = this.getRatio(
|
|
585
|
+
getCanvasTranslate(input) {
|
|
586
|
+
if (input.transform?.translateUnit === 'px') {
|
|
587
|
+
const ratio = this.getRatio(input);
|
|
579
588
|
return {
|
|
580
|
-
translateH: (
|
|
581
|
-
translateV: (
|
|
589
|
+
translateH: (input.transform?.translateH || 0) * ratio,
|
|
590
|
+
translateV: (input.transform?.translateV || 0) * ratio
|
|
582
591
|
};
|
|
583
592
|
}
|
|
584
593
|
else {
|
|
585
594
|
return {
|
|
586
|
-
translateH:
|
|
587
|
-
translateV:
|
|
595
|
+
translateH: input.transform?.translateH ? percentage(input.transform.translateH, input.loadedImage.transformed.size.width) : 0,
|
|
596
|
+
translateV: input.transform?.translateV ? percentage(input.transform.translateV, input.loadedImage.transformed.size.height) : 0
|
|
588
597
|
};
|
|
589
598
|
}
|
|
590
599
|
}
|
|
591
|
-
getRatio(
|
|
592
|
-
return
|
|
600
|
+
getRatio(input) {
|
|
601
|
+
return input.loadedImage.transformed.size.width / input.maxSize.width;
|
|
593
602
|
}
|
|
594
603
|
getImagePosition(cropperState) {
|
|
595
604
|
const ratio = this.getRatio(cropperState);
|
|
596
|
-
const cropper = cropperState.cropper();
|
|
597
605
|
const out = {
|
|
598
|
-
x1: Math.round(cropper.x1 * ratio),
|
|
599
|
-
y1: Math.round(cropper.y1 * ratio),
|
|
600
|
-
x2: Math.round(cropper.x2 * ratio),
|
|
601
|
-
y2: Math.round(cropper.y2 * ratio)
|
|
606
|
+
x1: Math.round(cropperState.cropper.x1 * ratio),
|
|
607
|
+
y1: Math.round(cropperState.cropper.y1 * ratio),
|
|
608
|
+
x2: Math.round(cropperState.cropper.x2 * ratio),
|
|
609
|
+
y2: Math.round(cropperState.cropper.y2 * ratio)
|
|
602
610
|
};
|
|
603
|
-
if (!cropperState.options
|
|
611
|
+
if (!cropperState.options?.containWithinAspectRatio) {
|
|
604
612
|
out.x1 = Math.max(out.x1, 0);
|
|
605
613
|
out.y1 = Math.max(out.y1, 0);
|
|
606
614
|
out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
|
|
@@ -608,52 +616,50 @@ class CropService {
|
|
|
608
616
|
}
|
|
609
617
|
return out;
|
|
610
618
|
}
|
|
611
|
-
getOffsetImagePosition(
|
|
612
|
-
const canvasRotation =
|
|
613
|
-
const ratio = this.getRatio(
|
|
619
|
+
getOffsetImagePosition(input) {
|
|
620
|
+
const canvasRotation = (input.options?.canvasRotation ?? 0) + input.loadedImage.exifTransform.rotate;
|
|
621
|
+
const ratio = this.getRatio(input);
|
|
614
622
|
let offsetX;
|
|
615
623
|
let offsetY;
|
|
616
624
|
if (canvasRotation % 2) {
|
|
617
|
-
offsetX = (
|
|
618
|
-
offsetY = (
|
|
625
|
+
offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.height) / 2;
|
|
626
|
+
offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.width) / 2;
|
|
619
627
|
}
|
|
620
628
|
else {
|
|
621
|
-
offsetX = (
|
|
622
|
-
offsetY = (
|
|
629
|
+
offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.width) / 2;
|
|
630
|
+
offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.height) / 2;
|
|
623
631
|
}
|
|
624
|
-
const cropper =
|
|
632
|
+
const cropper = input.cropper;
|
|
625
633
|
const out = {
|
|
626
634
|
x1: Math.round(cropper.x1 * ratio) - offsetX,
|
|
627
635
|
y1: Math.round(cropper.y1 * ratio) - offsetY,
|
|
628
636
|
x2: Math.round(cropper.x2 * ratio) - offsetX,
|
|
629
637
|
y2: Math.round(cropper.y2 * ratio) - offsetY
|
|
630
638
|
};
|
|
631
|
-
if (!
|
|
639
|
+
if (!input.options?.containWithinAspectRatio) {
|
|
632
640
|
out.x1 = Math.max(out.x1, 0);
|
|
633
641
|
out.y1 = Math.max(out.y1, 0);
|
|
634
|
-
out.x2 = Math.min(out.x2,
|
|
635
|
-
out.y2 = Math.min(out.y2,
|
|
642
|
+
out.x2 = Math.min(out.x2, input.loadedImage.transformed.size.width);
|
|
643
|
+
out.y2 = Math.min(out.y2, input.loadedImage.transformed.size.height);
|
|
636
644
|
}
|
|
637
645
|
return out;
|
|
638
646
|
}
|
|
639
647
|
getResizeRatio(width, height, options) {
|
|
640
|
-
const ratioWidth = options.resizeToWidth / width;
|
|
641
|
-
const ratioHeight = options.resizeToHeight / height;
|
|
642
648
|
const ratios = new Array();
|
|
643
|
-
if (options.resizeToWidth > 0) {
|
|
644
|
-
ratios.push(
|
|
649
|
+
if (options?.resizeToWidth && options.resizeToWidth > 0) {
|
|
650
|
+
ratios.push(options.resizeToWidth / width);
|
|
645
651
|
}
|
|
646
|
-
if (options.resizeToHeight > 0) {
|
|
647
|
-
ratios.push(
|
|
652
|
+
if (options?.resizeToHeight && options.resizeToHeight > 0) {
|
|
653
|
+
ratios.push(options.resizeToHeight / height);
|
|
648
654
|
}
|
|
649
655
|
const result = ratios.length === 0 ? 1 : Math.min(...ratios);
|
|
650
|
-
if (result > 1 && !options
|
|
656
|
+
if (result > 1 && !options?.onlyScaleDown) {
|
|
651
657
|
return result;
|
|
652
658
|
}
|
|
653
659
|
return Math.min(result, 1);
|
|
654
660
|
}
|
|
655
661
|
getQuality(options) {
|
|
656
|
-
return Math.min(1, Math.max(0, options
|
|
662
|
+
return Math.min(1, Math.max(0, options?.imageQuality ?? 92 / 100));
|
|
657
663
|
}
|
|
658
664
|
}
|
|
659
665
|
|
|
@@ -1325,7 +1331,7 @@ class ImageCropperComponent {
|
|
|
1325
1331
|
}
|
|
1326
1332
|
cropToBlob() {
|
|
1327
1333
|
return new Promise(async (resolve, reject) => {
|
|
1328
|
-
const result = await this.cropService.crop(this.state, 'blob');
|
|
1334
|
+
const result = await this.cropService.crop(this.state.toCropInput(), 'blob');
|
|
1329
1335
|
if (result) {
|
|
1330
1336
|
this.imageCropped.emit(result);
|
|
1331
1337
|
resolve(result);
|
|
@@ -1336,7 +1342,7 @@ class ImageCropperComponent {
|
|
|
1336
1342
|
});
|
|
1337
1343
|
}
|
|
1338
1344
|
cropToBase64() {
|
|
1339
|
-
const result = this.cropService.crop(this.state, 'base64');
|
|
1345
|
+
const result = this.cropService.crop(this.state.toCropInput(), 'base64');
|
|
1340
1346
|
if (result) {
|
|
1341
1347
|
this.imageCropped.emit(result);
|
|
1342
1348
|
return result;
|