@anu3ev/fabric-image-editor 0.1.12 → 0.1.13
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/dist/main.js +318 -228
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ActiveSelection as
|
|
1
|
+
import { ActiveSelection as z, util as U, controlsUtils as Oe, InteractiveFabricObject as Te, loadSVGFromURL as Ee, FabricImage as de, Point as ke, Rect as xe, Circle as Be, Triangle as Ze, Group as ze, Pattern as Ue, Canvas as Pe } from "fabric";
|
|
2
2
|
import { create as Ye } from "jsondiffpatch";
|
|
3
3
|
var He = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", I = function() {
|
|
4
4
|
for (var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 21, t = "", a = crypto.getRandomValues(new Uint8Array(e |= 0)); e--; )
|
|
@@ -28,7 +28,7 @@ function We(o) {
|
|
|
28
28
|
});
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
-
class
|
|
31
|
+
class Z {
|
|
32
32
|
/**
|
|
33
33
|
* Конструктор принимает редактор и опции.
|
|
34
34
|
* @param {Object} params
|
|
@@ -49,7 +49,7 @@ class B {
|
|
|
49
49
|
editor: t,
|
|
50
50
|
options: a = {}
|
|
51
51
|
} = e;
|
|
52
|
-
this.editor = t, this.canvas = t.canvas, this.options = a, this.isUndoRedoKeyPressed = !1, this.handleAdaptCanvasToContainerBound =
|
|
52
|
+
this.editor = t, this.canvas = t.canvas, this.options = a, this.isUndoRedoKeyPressed = !1, this.handleAdaptCanvasToContainerBound = Z.debounce(this.handleAdaptCanvasToContainer.bind(this), 500), this.handleCopyEventBound = this.handleCopyEvent.bind(this), this.handlePasteEventBound = this.handlePasteEvent.bind(this), this.handleUndoRedoEventBound = this.handleUndoRedoEvent.bind(this), this.handleUndoRedoKeyUpBound = this.handleUndoRedoKeyUp.bind(this), this.handleSelectAllEventBound = this.handleSelectAllEvent.bind(this), this.handleDeleteObjectsEventBound = this.handleDeleteObjectsEvent.bind(this), this.handleObjectModifiedHistoryBound = Z.debounce(this.handleObjectModifiedHistory.bind(this), 300), this.handleObjectRotatingHistoryBound = Z.debounce(this.handleObjectRotatingHistory.bind(this), 300), this.handleObjectAddedHistoryBound = this.handleObjectAddedHistory.bind(this), this.handleObjectRemovedHistoryBound = this.handleObjectRemovedHistory.bind(this), this.handleOverlayUpdateBound = this.handleOverlayUpdate.bind(this), this.handleCanvasDragStartBound = this.handleCanvasDragStart.bind(this), this.handleCanvasDraggingBound = this.handleCanvasDragging.bind(this), this.handleCanvasDragEndBound = this.handleCanvasDragEnd.bind(this), this.handleMouseWheelZoomBound = this.handleMouseWheelZoom.bind(this), this.handleBringToFrontBound = this.handleBringToFront.bind(this), this.handleResetObjectFitBound = this.handleResetObjectFit.bind(this), this.handleLockedSelectionBound = this._filterLockedSelection.bind(this), this.init();
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* Инициализация всех обработчиков согласно опциям.
|
|
@@ -103,7 +103,7 @@ class B {
|
|
|
103
103
|
this.canvas.setActiveObject(n[0]);
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
106
|
-
var i = new
|
|
106
|
+
var i = new z(n, {
|
|
107
107
|
canvas: this.canvas
|
|
108
108
|
});
|
|
109
109
|
this.canvas.setActiveObject(i), this.canvas.requestRenderAll();
|
|
@@ -176,6 +176,8 @@ class B {
|
|
|
176
176
|
* @param {Object} event — объект события
|
|
177
177
|
* @param {Object} event.clipboardData — данные из буфера обмена
|
|
178
178
|
* @param {Array} event.clipboardData.items — элементы буфера обмена
|
|
179
|
+
*
|
|
180
|
+
* TODO: Попробовать вынести методы в классы-менеджеры.
|
|
179
181
|
*/
|
|
180
182
|
handlePasteEvent(e) {
|
|
181
183
|
var t, {
|
|
@@ -183,25 +185,27 @@ class B {
|
|
|
183
185
|
} = e;
|
|
184
186
|
if (a != null && (t = a.items) !== null && t !== void 0 && t.length) {
|
|
185
187
|
var {
|
|
186
|
-
|
|
187
|
-
} =
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
var s =
|
|
192
|
-
|
|
188
|
+
imageManager: r
|
|
189
|
+
} = this.editor, {
|
|
190
|
+
items: n
|
|
191
|
+
} = a, i = n[n.length - 1];
|
|
192
|
+
if (i.type.indexOf("image") !== -1) {
|
|
193
|
+
var s = i.getAsFile();
|
|
194
|
+
if (!s) return;
|
|
195
|
+
var c = new FileReader();
|
|
196
|
+
c.onload = (g) => {
|
|
193
197
|
this.editor.imageManager.importImage({
|
|
194
|
-
source:
|
|
198
|
+
source: g.target.result
|
|
195
199
|
});
|
|
196
|
-
},
|
|
200
|
+
}, c.readAsDataURL(s);
|
|
197
201
|
return;
|
|
198
202
|
}
|
|
199
|
-
var
|
|
200
|
-
if (
|
|
201
|
-
var
|
|
202
|
-
if (
|
|
203
|
-
|
|
204
|
-
source:
|
|
203
|
+
var u = a.getData("text/html");
|
|
204
|
+
if (u) {
|
|
205
|
+
var l = new DOMParser(), d = l.parseFromString(u, "text/html"), h = d.querySelector("img");
|
|
206
|
+
if (h != null && h.src) {
|
|
207
|
+
r.importImage({
|
|
208
|
+
source: h.src
|
|
205
209
|
});
|
|
206
210
|
return;
|
|
207
211
|
}
|
|
@@ -440,90 +444,90 @@ class Re {
|
|
|
440
444
|
this.worker.terminate();
|
|
441
445
|
}
|
|
442
446
|
}
|
|
443
|
-
var
|
|
444
|
-
function
|
|
445
|
-
var n =
|
|
446
|
-
o.save(), o.translate(e, t), o.rotate(
|
|
447
|
+
var p = 12, Ve = 2, X = 8, Q = 20, Fe = 100, J = 20, K = 8, Ge = 100, $ = 32, q = 1, Xe = "#2B2D33", ee = "#3D8BF4", te = "#FFFFFF";
|
|
448
|
+
function Y(o, e, t, a, r) {
|
|
449
|
+
var n = p, i = Ve;
|
|
450
|
+
o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = te, o.strokeStyle = ee, o.lineWidth = q, o.beginPath(), o.roundRect(-12 / 2, -12 / 2, n, n, i), o.fill(), o.stroke(), o.restore();
|
|
447
451
|
}
|
|
448
452
|
function he(o, e, t, a, r) {
|
|
449
|
-
var n =
|
|
450
|
-
o.save(), o.translate(e, t), o.rotate(
|
|
453
|
+
var n = X, i = Q, s = Fe;
|
|
454
|
+
o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = te, o.strokeStyle = ee, o.lineWidth = q, o.beginPath(), o.roundRect(-8 / 2, -20 / 2, n, i, s), o.fill(), o.stroke(), o.restore();
|
|
451
455
|
}
|
|
452
456
|
function ge(o, e, t, a, r) {
|
|
453
|
-
var n =
|
|
454
|
-
o.save(), o.translate(e, t), o.rotate(
|
|
457
|
+
var n = J, i = K, s = Ge;
|
|
458
|
+
o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = te, o.strokeStyle = ee, o.lineWidth = q, o.beginPath(), o.roundRect(-20 / 2, -8 / 2, n, i, s), o.fill(), o.stroke(), o.restore();
|
|
455
459
|
}
|
|
456
460
|
var Qe = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE4Ljc1IDQuMzc1djMuNzVhLjYyNS42MjUgMCAwIDEtLjYyNS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDEgMC0xLjI1aDIuMTRsLTIuMDc3LTEuOTAzLS4wMi0uMDE5YTYuMjUgNi4yNSAwIDEgMC0uMTMgOC45NjcuNjI2LjYyNiAwIDAgMSAuODYuOTA5QTcuNDU2IDcuNDU2IDAgMCAxIDEwIDE3LjVoLS4xMDNhNy41IDcuNSAwIDEgMSA1LjM5Ni0xMi44MTJMMTcuNSA2LjcwM1Y0LjM3NWEuNjI1LjYyNSAwIDAgMSAxLjI1IDBaIi8+PC9zdmc+", Ae = new Image();
|
|
457
461
|
Ae.src = Qe;
|
|
458
462
|
function Je(o, e, t, a, r) {
|
|
459
|
-
var n =
|
|
460
|
-
o.save(), o.translate(e, t), o.rotate(
|
|
463
|
+
var n = $, i = n / 2;
|
|
464
|
+
o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = Xe, o.beginPath(), o.arc(0, 0, i, 0, 2 * Math.PI), o.fill(), o.drawImage(Ae, -16 / 2, -16 / 2, i, i), o.restore();
|
|
461
465
|
}
|
|
462
466
|
var Ke = {
|
|
463
467
|
// Угловые точки
|
|
464
468
|
tl: {
|
|
465
|
-
render:
|
|
466
|
-
sizeX:
|
|
467
|
-
sizeY:
|
|
469
|
+
render: Y,
|
|
470
|
+
sizeX: p,
|
|
471
|
+
sizeY: p,
|
|
468
472
|
offsetX: 0,
|
|
469
473
|
offsetY: 0
|
|
470
474
|
},
|
|
471
475
|
tr: {
|
|
472
|
-
render:
|
|
473
|
-
sizeX:
|
|
474
|
-
sizeY:
|
|
476
|
+
render: Y,
|
|
477
|
+
sizeX: p,
|
|
478
|
+
sizeY: p,
|
|
475
479
|
offsetX: 0,
|
|
476
480
|
offsetY: 0
|
|
477
481
|
},
|
|
478
482
|
bl: {
|
|
479
|
-
render:
|
|
480
|
-
sizeX:
|
|
481
|
-
sizeY:
|
|
483
|
+
render: Y,
|
|
484
|
+
sizeX: p,
|
|
485
|
+
sizeY: p,
|
|
482
486
|
offsetX: 0,
|
|
483
487
|
offsetY: 0
|
|
484
488
|
},
|
|
485
489
|
br: {
|
|
486
|
-
render:
|
|
487
|
-
sizeX:
|
|
488
|
-
sizeY:
|
|
490
|
+
render: Y,
|
|
491
|
+
sizeX: p,
|
|
492
|
+
sizeY: p,
|
|
489
493
|
offsetX: 0,
|
|
490
494
|
offsetY: 0
|
|
491
495
|
},
|
|
492
496
|
// Середина вертикалей
|
|
493
497
|
ml: {
|
|
494
498
|
render: he,
|
|
495
|
-
sizeX:
|
|
496
|
-
sizeY:
|
|
499
|
+
sizeX: X,
|
|
500
|
+
sizeY: Q,
|
|
497
501
|
offsetX: 0,
|
|
498
502
|
offsetY: 0
|
|
499
503
|
},
|
|
500
504
|
mr: {
|
|
501
505
|
render: he,
|
|
502
|
-
sizeX:
|
|
503
|
-
sizeY:
|
|
506
|
+
sizeX: X,
|
|
507
|
+
sizeY: Q,
|
|
504
508
|
offsetX: 0,
|
|
505
509
|
offsetY: 0
|
|
506
510
|
},
|
|
507
511
|
// Середина горизонталей
|
|
508
512
|
mt: {
|
|
509
513
|
render: ge,
|
|
510
|
-
sizeX:
|
|
511
|
-
sizeY:
|
|
514
|
+
sizeX: J,
|
|
515
|
+
sizeY: K,
|
|
512
516
|
offsetX: 0,
|
|
513
517
|
offsetY: 0
|
|
514
518
|
},
|
|
515
519
|
mb: {
|
|
516
520
|
render: ge,
|
|
517
|
-
sizeX:
|
|
518
|
-
sizeY:
|
|
521
|
+
sizeX: J,
|
|
522
|
+
sizeY: K,
|
|
519
523
|
offsetX: 0,
|
|
520
524
|
offsetY: 0
|
|
521
525
|
},
|
|
522
526
|
// Специальный «rotate» контрол
|
|
523
527
|
mtr: {
|
|
524
528
|
render: Je,
|
|
525
|
-
sizeX:
|
|
526
|
-
sizeY:
|
|
529
|
+
sizeX: $,
|
|
530
|
+
sizeY: $,
|
|
527
531
|
offsetX: 0,
|
|
528
532
|
offsetY: -32
|
|
529
533
|
}
|
|
@@ -567,7 +571,7 @@ function st(o) {
|
|
|
567
571
|
});
|
|
568
572
|
};
|
|
569
573
|
}
|
|
570
|
-
const
|
|
574
|
+
const k = {
|
|
571
575
|
style: {
|
|
572
576
|
position: "absolute",
|
|
573
577
|
display: "none",
|
|
@@ -678,7 +682,7 @@ function me(o, e) {
|
|
|
678
682
|
}
|
|
679
683
|
return t;
|
|
680
684
|
}
|
|
681
|
-
function
|
|
685
|
+
function j(o) {
|
|
682
686
|
for (var e = 1; e < arguments.length; e++) {
|
|
683
687
|
var t = arguments[e] != null ? arguments[e] : {};
|
|
684
688
|
e % 2 ? me(Object(t), !0).forEach(function(a) {
|
|
@@ -718,11 +722,11 @@ class lt {
|
|
|
718
722
|
if (this.options = t.options, !!this.options.showToolbar) {
|
|
719
723
|
this.editor = t, this.canvas = t.canvas;
|
|
720
724
|
var a = this.options.toolbar || {};
|
|
721
|
-
this.config =
|
|
722
|
-
style:
|
|
723
|
-
btnStyle:
|
|
724
|
-
icons:
|
|
725
|
-
handlers:
|
|
725
|
+
this.config = j(j(j({}, k), a), {}, {
|
|
726
|
+
style: j(j({}, k.style), a.style || {}),
|
|
727
|
+
btnStyle: j(j({}, k.btnStyle), a.btnStyle || {}),
|
|
728
|
+
icons: j(j({}, k.icons), a.icons || {}),
|
|
729
|
+
handlers: j(j({}, k.handlers), a.handlers || {})
|
|
726
730
|
}), this.currentTarget = null, this.currentLocked = null, this.isTransforming = !1, this._onMouseDown = this._handleMouseDown.bind(this), this._onObjectMoving = this._startTransform.bind(this), this._onObjectScaling = this._startTransform.bind(this), this._onObjectRotating = this._startTransform.bind(this), this._onMouseUp = this._endTransform.bind(this), this._onObjectModified = this._endTransform.bind(this), this._onSelectionChange = this._updateToolbar.bind(this), this._onSelectionClear = () => {
|
|
727
731
|
this.el.style.display = "none";
|
|
728
732
|
}, this._createDOM(), this._bindEvents();
|
|
@@ -866,7 +870,7 @@ function fe(o, e, t, a, r, n, i) {
|
|
|
866
870
|
}
|
|
867
871
|
s.done ? e(c) : Promise.resolve(c).then(a, r);
|
|
868
872
|
}
|
|
869
|
-
function
|
|
873
|
+
function V(o) {
|
|
870
874
|
return function() {
|
|
871
875
|
var e = this, t = arguments;
|
|
872
876
|
return new Promise(function(a, r) {
|
|
@@ -970,7 +974,7 @@ class ht {
|
|
|
970
974
|
*/
|
|
971
975
|
loadStateFromFullState(e) {
|
|
972
976
|
var t = this;
|
|
973
|
-
return
|
|
977
|
+
return V(function* () {
|
|
974
978
|
if (e) {
|
|
975
979
|
console.log("loadStateFromFullState fullState", e), yield t.canvas.loadFromJSON(e);
|
|
976
980
|
var a = t.canvas.getObjects().find((n) => n.id === "montage-area");
|
|
@@ -986,7 +990,7 @@ class ht {
|
|
|
986
990
|
*/
|
|
987
991
|
undo() {
|
|
988
992
|
var e = this;
|
|
989
|
-
return
|
|
993
|
+
return V(function* () {
|
|
990
994
|
if (!e.skipHistory) {
|
|
991
995
|
if (e.currentIndex <= 0) {
|
|
992
996
|
console.log("Нет предыдущих состояний для отмены.");
|
|
@@ -1013,7 +1017,7 @@ class ht {
|
|
|
1013
1017
|
*/
|
|
1014
1018
|
redo() {
|
|
1015
1019
|
var e = this;
|
|
1016
|
-
return
|
|
1020
|
+
return V(function* () {
|
|
1017
1021
|
if (!e.skipHistory) {
|
|
1018
1022
|
if (e.currentIndex >= e.patches.length) {
|
|
1019
1023
|
console.log("Нет состояний для повтора.");
|
|
@@ -1035,7 +1039,7 @@ class ht {
|
|
|
1035
1039
|
})();
|
|
1036
1040
|
}
|
|
1037
1041
|
}
|
|
1038
|
-
var gt = 0.1, vt = 2, mt = 0.1, ft = 90,
|
|
1042
|
+
var gt = 0.1, vt = 2, mt = 0.1, ft = 90, x = 16, B = 16, D = 4096, N = 4096;
|
|
1039
1043
|
function Me(o, e, t, a, r, n, i) {
|
|
1040
1044
|
try {
|
|
1041
1045
|
var s = o[n](i), c = s.value;
|
|
@@ -1044,7 +1048,7 @@ function Me(o, e, t, a, r, n, i) {
|
|
|
1044
1048
|
}
|
|
1045
1049
|
s.done ? e(c) : Promise.resolve(c).then(a, r);
|
|
1046
1050
|
}
|
|
1047
|
-
function
|
|
1051
|
+
function T(o) {
|
|
1048
1052
|
return function() {
|
|
1049
1053
|
var e = this, t = arguments;
|
|
1050
1054
|
return new Promise(function(a, r) {
|
|
@@ -1059,7 +1063,7 @@ function P(o) {
|
|
|
1059
1063
|
});
|
|
1060
1064
|
};
|
|
1061
1065
|
}
|
|
1062
|
-
class
|
|
1066
|
+
class C {
|
|
1063
1067
|
/**
|
|
1064
1068
|
* @param {object} options
|
|
1065
1069
|
* @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
|
|
@@ -1083,82 +1087,89 @@ class L {
|
|
|
1083
1087
|
*/
|
|
1084
1088
|
importImage(e) {
|
|
1085
1089
|
var t = this;
|
|
1086
|
-
return
|
|
1090
|
+
return T(function* () {
|
|
1087
1091
|
var {
|
|
1088
1092
|
source: a,
|
|
1089
1093
|
scale: r = "image-".concat(t.options.scaleType),
|
|
1090
|
-
withoutSave: n = !1
|
|
1091
|
-
contentType: i = "image/png"
|
|
1094
|
+
withoutSave: n = !1
|
|
1092
1095
|
} = e;
|
|
1093
1096
|
if (a) {
|
|
1097
|
+
var i = yield t.getContentType(a);
|
|
1098
|
+
if (!t.isAllowedContentType(i)) {
|
|
1099
|
+
var s = "Неверный contentType для изображения: ".concat(i, ". Ожидается один из: ").concat(t.options.acceptContentTypes.join(", "), ".");
|
|
1100
|
+
console.error("ImageManager. ".concat(s)), t.editor.canvas.fire("editor:error", {
|
|
1101
|
+
message: s
|
|
1102
|
+
});
|
|
1103
|
+
return;
|
|
1104
|
+
}
|
|
1094
1105
|
var {
|
|
1095
|
-
canvas:
|
|
1096
|
-
montageArea:
|
|
1097
|
-
transformManager:
|
|
1098
|
-
historyManager:
|
|
1106
|
+
canvas: c,
|
|
1107
|
+
montageArea: u,
|
|
1108
|
+
transformManager: l,
|
|
1109
|
+
historyManager: d
|
|
1099
1110
|
} = t.editor;
|
|
1100
|
-
|
|
1111
|
+
d.suspendHistory();
|
|
1101
1112
|
try {
|
|
1102
|
-
var
|
|
1113
|
+
var h, g;
|
|
1103
1114
|
if (a instanceof File)
|
|
1104
|
-
|
|
1115
|
+
h = URL.createObjectURL(a);
|
|
1105
1116
|
else if (typeof a == "string") {
|
|
1106
|
-
var
|
|
1117
|
+
var v = yield fetch(a, {
|
|
1107
1118
|
mode: "cors"
|
|
1108
|
-
}),
|
|
1119
|
+
}), f = yield v.blob({
|
|
1109
1120
|
type: i,
|
|
1110
1121
|
quality: 1
|
|
1111
1122
|
});
|
|
1112
|
-
|
|
1123
|
+
h = URL.createObjectURL(f);
|
|
1113
1124
|
} else
|
|
1114
1125
|
throw new Error("ImportImage. Неверный тип источника изображения. Ожидается URL или объект File.");
|
|
1115
|
-
t._createdBlobUrls.push(
|
|
1116
|
-
var
|
|
1117
|
-
if (
|
|
1118
|
-
var
|
|
1119
|
-
|
|
1126
|
+
t._createdBlobUrls.push(h);
|
|
1127
|
+
var y = C.getFormatFromContentType(i);
|
|
1128
|
+
if (y === "svg") {
|
|
1129
|
+
var m = yield Ee(h);
|
|
1130
|
+
g = U.groupSVGElements(m.objects, m.options);
|
|
1120
1131
|
} else
|
|
1121
|
-
|
|
1132
|
+
g = yield de.fromURL(h, {
|
|
1122
1133
|
crossOrigin: "anonymous"
|
|
1123
1134
|
});
|
|
1124
1135
|
var {
|
|
1125
|
-
width:
|
|
1126
|
-
height:
|
|
1127
|
-
} =
|
|
1128
|
-
if (
|
|
1129
|
-
var
|
|
1130
|
-
t._createdBlobUrls.push(
|
|
1136
|
+
width: b,
|
|
1137
|
+
height: M
|
|
1138
|
+
} = g;
|
|
1139
|
+
if (M > N || b > D) {
|
|
1140
|
+
var L = yield t.resizeImageToBoundaries(g._element.src, "max"), O = URL.createObjectURL(L);
|
|
1141
|
+
t._createdBlobUrls.push(O), g = yield de.fromURL(O, {
|
|
1131
1142
|
crossOrigin: "anonymous"
|
|
1132
1143
|
});
|
|
1133
1144
|
}
|
|
1134
|
-
if (
|
|
1145
|
+
if (g.set("id", "".concat(g.type, "-").concat(I())), g.set("format", y), r === "scale-montage")
|
|
1135
1146
|
t.editor.canvasManager.scaleMontageAreaToImage({
|
|
1136
|
-
object:
|
|
1147
|
+
object: g,
|
|
1137
1148
|
withoutSave: !0
|
|
1138
1149
|
});
|
|
1139
1150
|
else {
|
|
1140
1151
|
var {
|
|
1141
|
-
width:
|
|
1152
|
+
width: S,
|
|
1142
1153
|
height: A
|
|
1143
|
-
} =
|
|
1144
|
-
imageObject:
|
|
1154
|
+
} = u, P = t.calculateScaleFactor({
|
|
1155
|
+
imageObject: g,
|
|
1145
1156
|
scaleType: r
|
|
1146
1157
|
});
|
|
1147
|
-
r === "image-contain" &&
|
|
1148
|
-
object:
|
|
1158
|
+
r === "image-contain" && P < 1 ? l.fitObject({
|
|
1159
|
+
object: g,
|
|
1149
1160
|
type: "contain",
|
|
1150
1161
|
withoutSave: !0
|
|
1151
|
-
}) : r === "image-cover" && (
|
|
1152
|
-
object:
|
|
1162
|
+
}) : r === "image-cover" && (b > S || M > A) && l.fitObject({
|
|
1163
|
+
object: g,
|
|
1153
1164
|
type: "cover",
|
|
1154
1165
|
withoutSave: !0
|
|
1155
1166
|
});
|
|
1156
1167
|
}
|
|
1157
|
-
|
|
1158
|
-
} catch (
|
|
1159
|
-
console.error("importImage. Ошибка импорта изображения: ",
|
|
1160
|
-
message: "Ошибка импорта изображения: ".concat(
|
|
1161
|
-
}),
|
|
1168
|
+
c.add(g), c.centerObject(g), c.setActiveObject(g), c.renderAll(), d.resumeHistory(), n || d.saveState();
|
|
1169
|
+
} catch (E) {
|
|
1170
|
+
console.error("importImage. Ошибка импорта изображения: ", E), c.fire("editor:error", {
|
|
1171
|
+
message: "Ошибка импорта изображения: ".concat(E.message)
|
|
1172
|
+
}), d.resumeHistory();
|
|
1162
1173
|
}
|
|
1163
1174
|
}
|
|
1164
1175
|
})();
|
|
@@ -1173,15 +1184,15 @@ class L {
|
|
|
1173
1184
|
*/
|
|
1174
1185
|
resizeImageToBoundaries(e) {
|
|
1175
1186
|
var t = arguments, a = this;
|
|
1176
|
-
return
|
|
1177
|
-
var r = t.length > 1 && t[1] !== void 0 ? t[1] : "max", n = "Размер изображения больше максимального размера канваса, поэтому оно будет уменьшено до максимальных размеров: ".concat(
|
|
1187
|
+
return T(function* () {
|
|
1188
|
+
var r = t.length > 1 && t[1] !== void 0 ? t[1] : "max", n = "Размер изображения больше максимального размера канваса, поэтому оно будет уменьшено до максимальных размеров: ".concat(D, "x").concat(N);
|
|
1178
1189
|
console.warn("importImage. ".concat(n)), a.editor.canvas.fire("editor:warning", {
|
|
1179
1190
|
message: n
|
|
1180
1191
|
});
|
|
1181
1192
|
var i = yield a.editor.workerManager.post("resizeImage", {
|
|
1182
1193
|
dataURL: e,
|
|
1183
|
-
maxWidth:
|
|
1184
|
-
maxHeight:
|
|
1194
|
+
maxWidth: D,
|
|
1195
|
+
maxHeight: N,
|
|
1185
1196
|
sizeType: r
|
|
1186
1197
|
});
|
|
1187
1198
|
return i;
|
|
@@ -1200,7 +1211,7 @@ class L {
|
|
|
1200
1211
|
*/
|
|
1201
1212
|
exportCanvasAsImageFile() {
|
|
1202
1213
|
var e = arguments, t = this;
|
|
1203
|
-
return
|
|
1214
|
+
return T(function* () {
|
|
1204
1215
|
var {
|
|
1205
1216
|
fileName: a = "image.png",
|
|
1206
1217
|
contentType: r = "image/png",
|
|
@@ -1210,63 +1221,63 @@ class L {
|
|
|
1210
1221
|
canvas: s,
|
|
1211
1222
|
montageArea: c,
|
|
1212
1223
|
workerManager: u
|
|
1213
|
-
} = t.editor, l = r === "application/pdf", d = l ? "image/jpg" : r, h =
|
|
1224
|
+
} = t.editor, l = r === "application/pdf", d = l ? "image/jpg" : r, h = C.getFormatFromContentType(d);
|
|
1214
1225
|
c.setCoords();
|
|
1215
1226
|
var {
|
|
1216
1227
|
left: g,
|
|
1217
1228
|
top: v,
|
|
1218
|
-
width:
|
|
1219
|
-
height:
|
|
1220
|
-
} = c.getBoundingRect(),
|
|
1221
|
-
["image/jpg", "image/jpeg"].includes(d) && (
|
|
1222
|
-
var
|
|
1223
|
-
|
|
1224
|
-
width:
|
|
1225
|
-
height:
|
|
1229
|
+
width: f,
|
|
1230
|
+
height: y
|
|
1231
|
+
} = c.getBoundingRect(), m = yield s.clone(["id", "format", "locked"]);
|
|
1232
|
+
["image/jpg", "image/jpeg"].includes(d) && (m.backgroundColor = "#ffffff");
|
|
1233
|
+
var b = m.getObjects().find((w) => w.id === c.id);
|
|
1234
|
+
b.visible = !1, m.viewportTransform = [1, 0, 0, 1, -g, -v], m.setDimensions({
|
|
1235
|
+
width: f,
|
|
1236
|
+
height: y
|
|
1226
1237
|
}, {
|
|
1227
1238
|
backstoreOnly: !0
|
|
1228
|
-
}),
|
|
1229
|
-
var
|
|
1230
|
-
if (h === "svg" &&
|
|
1231
|
-
var
|
|
1232
|
-
|
|
1233
|
-
var O =
|
|
1239
|
+
}), m.renderAll();
|
|
1240
|
+
var M = m.getObjects().filter((w) => w.format).every((w) => w.format === "svg");
|
|
1241
|
+
if (h === "svg" && M) {
|
|
1242
|
+
var L = m.toSVG();
|
|
1243
|
+
m.dispose();
|
|
1244
|
+
var O = C._exportSVGStringAsFile(L, {
|
|
1234
1245
|
exportAsBase64: n,
|
|
1235
1246
|
exportAsBlob: i,
|
|
1236
1247
|
fileName: a
|
|
1237
|
-
}),
|
|
1248
|
+
}), S = {
|
|
1238
1249
|
image: O,
|
|
1239
1250
|
format: "svg",
|
|
1240
1251
|
contentType: "image/svg+xml",
|
|
1241
1252
|
fileName: a.replace(/\.[^/.]+$/, ".svg")
|
|
1242
1253
|
};
|
|
1243
|
-
return s.fire("editor:canvas-exported",
|
|
1254
|
+
return s.fire("editor:canvas-exported", S), S;
|
|
1244
1255
|
}
|
|
1245
|
-
var
|
|
1246
|
-
|
|
1256
|
+
var A = yield new Promise((w) => {
|
|
1257
|
+
m.getElement().toBlob(w);
|
|
1247
1258
|
});
|
|
1248
|
-
if (
|
|
1249
|
-
var
|
|
1250
|
-
image:
|
|
1259
|
+
if (m.dispose(), i) {
|
|
1260
|
+
var P = {
|
|
1261
|
+
image: A,
|
|
1251
1262
|
format: h,
|
|
1252
1263
|
contentType: d,
|
|
1253
1264
|
fileName: a
|
|
1254
1265
|
};
|
|
1255
|
-
return s.fire("editor:canvas-exported",
|
|
1266
|
+
return s.fire("editor:canvas-exported", P), P;
|
|
1256
1267
|
}
|
|
1257
|
-
var
|
|
1268
|
+
var E = yield createImageBitmap(A), re = yield u.post("toDataURL", {
|
|
1258
1269
|
format: h,
|
|
1259
1270
|
quality: 1,
|
|
1260
|
-
bitmap:
|
|
1261
|
-
}, [
|
|
1271
|
+
bitmap: E
|
|
1272
|
+
}, [E]);
|
|
1262
1273
|
if (l) {
|
|
1263
|
-
var ne = 0.264583,
|
|
1264
|
-
orientation:
|
|
1274
|
+
var ne = 0.264583, W = f * ne, _ = y * ne, we = (yield t.editor.moduleLoader.loadModule("jspdf")).jsPDF, R = new we({
|
|
1275
|
+
orientation: W > _ ? "landscape" : "portrait",
|
|
1265
1276
|
unit: "mm",
|
|
1266
|
-
format: [
|
|
1277
|
+
format: [W, _]
|
|
1267
1278
|
});
|
|
1268
|
-
if (
|
|
1269
|
-
var Ce =
|
|
1279
|
+
if (R.addImage(re, "JPG", 0, 0, W, _), n) {
|
|
1280
|
+
var Ce = R.output("datauristring"), ie = {
|
|
1270
1281
|
image: Ce,
|
|
1271
1282
|
format: "pdf",
|
|
1272
1283
|
contentType: "application/pdf",
|
|
@@ -1274,10 +1285,10 @@ class L {
|
|
|
1274
1285
|
};
|
|
1275
1286
|
return s.fire("editor:canvas-exported", ie), ie;
|
|
1276
1287
|
}
|
|
1277
|
-
var
|
|
1288
|
+
var De = R.output("blob"), Ne = new File([De], a, {
|
|
1278
1289
|
type: "application/pdf"
|
|
1279
1290
|
}), oe = {
|
|
1280
|
-
image:
|
|
1291
|
+
image: Ne,
|
|
1281
1292
|
format: "pdf",
|
|
1282
1293
|
contentType: "application/pdf",
|
|
1283
1294
|
fileName: a
|
|
@@ -1293,7 +1304,7 @@ class L {
|
|
|
1293
1304
|
};
|
|
1294
1305
|
return s.fire("editor:canvas-exported", se), se;
|
|
1295
1306
|
}
|
|
1296
|
-
var ce = h === "svg" && !
|
|
1307
|
+
var ce = h === "svg" && !M ? a.replace(/\.[^/.]+$/, ".png") : a, Le = new File([A], ce, {
|
|
1297
1308
|
type: d
|
|
1298
1309
|
}), ue = {
|
|
1299
1310
|
image: Le,
|
|
@@ -1317,7 +1328,7 @@ class L {
|
|
|
1317
1328
|
*/
|
|
1318
1329
|
exportObjectAsImageFile() {
|
|
1319
1330
|
var e = arguments, t = this;
|
|
1320
|
-
return
|
|
1331
|
+
return T(function* () {
|
|
1321
1332
|
var {
|
|
1322
1333
|
object: a,
|
|
1323
1334
|
fileName: r = "image.png",
|
|
@@ -1332,7 +1343,7 @@ class L {
|
|
|
1332
1343
|
return console.error("exportObjectAsDataURL. Не выбран объект"), c.fire("editor:error", {
|
|
1333
1344
|
message: "Не выбран объект для экспорта"
|
|
1334
1345
|
}), "";
|
|
1335
|
-
var d =
|
|
1346
|
+
var d = C.getFormatFromContentType(n);
|
|
1336
1347
|
if (d === "svg") {
|
|
1337
1348
|
var h = l.toSVG(), g = t._exportSVGStringAsFile(h, {
|
|
1338
1349
|
exportAsBase64: i,
|
|
@@ -1347,39 +1358,39 @@ class L {
|
|
|
1347
1358
|
return c.fire("editor:object-exported", v), v;
|
|
1348
1359
|
}
|
|
1349
1360
|
if (i) {
|
|
1350
|
-
var
|
|
1361
|
+
var f = yield createImageBitmap(l._element), y = yield u.post("toDataURL", {
|
|
1351
1362
|
format: d,
|
|
1352
1363
|
quality: 1,
|
|
1353
|
-
bitmap:
|
|
1354
|
-
}, [
|
|
1355
|
-
image:
|
|
1364
|
+
bitmap: f
|
|
1365
|
+
}, [f]), m = {
|
|
1366
|
+
image: y,
|
|
1356
1367
|
format: d,
|
|
1357
1368
|
contentType: n,
|
|
1358
1369
|
fileName: r
|
|
1359
1370
|
};
|
|
1360
|
-
return c.fire("editor:object-exported",
|
|
1371
|
+
return c.fire("editor:object-exported", m), m;
|
|
1361
1372
|
}
|
|
1362
|
-
var
|
|
1363
|
-
|
|
1373
|
+
var b = l.toCanvasElement(), M = yield new Promise((A) => {
|
|
1374
|
+
b.toBlob(A);
|
|
1364
1375
|
});
|
|
1365
1376
|
if (s) {
|
|
1366
|
-
var
|
|
1367
|
-
image:
|
|
1377
|
+
var L = {
|
|
1378
|
+
image: M,
|
|
1368
1379
|
format: d,
|
|
1369
1380
|
contentType: n,
|
|
1370
1381
|
fileName: r
|
|
1371
1382
|
};
|
|
1372
|
-
return c.fire("editor:object-exported",
|
|
1383
|
+
return c.fire("editor:object-exported", L), L;
|
|
1373
1384
|
}
|
|
1374
|
-
var O = new File([
|
|
1385
|
+
var O = new File([M], r, {
|
|
1375
1386
|
type: n
|
|
1376
|
-
}),
|
|
1387
|
+
}), S = {
|
|
1377
1388
|
image: O,
|
|
1378
1389
|
format: d,
|
|
1379
1390
|
contentType: n,
|
|
1380
1391
|
fileName: r
|
|
1381
1392
|
};
|
|
1382
|
-
return c.fire("editor:object-exported",
|
|
1393
|
+
return c.fire("editor:object-exported", S), S;
|
|
1383
1394
|
})();
|
|
1384
1395
|
}
|
|
1385
1396
|
/**
|
|
@@ -1423,6 +1434,84 @@ class L {
|
|
|
1423
1434
|
var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", t = e.match(/^[^/]+\/([^+;]+)/);
|
|
1424
1435
|
return t ? t[1] : "";
|
|
1425
1436
|
}
|
|
1437
|
+
/**
|
|
1438
|
+
* Проверяет, является ли contentType допустимым типом изображения.
|
|
1439
|
+
* @param {string} contentType - тип контента
|
|
1440
|
+
* @returns {boolean} true, если contentType допустим, иначе false
|
|
1441
|
+
*/
|
|
1442
|
+
isAllowedContentType() {
|
|
1443
|
+
var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", {
|
|
1444
|
+
acceptContentTypes: t
|
|
1445
|
+
} = this.editor.options;
|
|
1446
|
+
return t.includes(e);
|
|
1447
|
+
}
|
|
1448
|
+
/**
|
|
1449
|
+
* Проверяет, является ли формат допустимым.
|
|
1450
|
+
* @param {string} format - формат изображения, например 'png', 'jpeg', 'svg'
|
|
1451
|
+
* @returns {boolean} true, если формат допустим, иначе false
|
|
1452
|
+
*/
|
|
1453
|
+
isAllowedFormat() {
|
|
1454
|
+
var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", {
|
|
1455
|
+
acceptContentTypes: t
|
|
1456
|
+
} = this.editor.options, a = "image/".concat(e);
|
|
1457
|
+
return t.includes(a);
|
|
1458
|
+
}
|
|
1459
|
+
/**
|
|
1460
|
+
* Получает contentType изображения из источника
|
|
1461
|
+
* @param {File|string} source - URL изображения или объект File
|
|
1462
|
+
* @returns {Promise<string>|string} - MIME-тип изображения
|
|
1463
|
+
* @public
|
|
1464
|
+
*/
|
|
1465
|
+
getContentType(e) {
|
|
1466
|
+
var t = this;
|
|
1467
|
+
return T(function* () {
|
|
1468
|
+
return typeof e == "string" ? t.getContentTypeFromUrl(e) : e.type || "application/octet-stream";
|
|
1469
|
+
})();
|
|
1470
|
+
}
|
|
1471
|
+
/**
|
|
1472
|
+
* Получает contentType изображения через HTTP HEAD запрос или анализ URL
|
|
1473
|
+
* @param {string} src - URL изображения
|
|
1474
|
+
* @returns {Promise<string>} - MIME-тип изображения
|
|
1475
|
+
* @public
|
|
1476
|
+
*/
|
|
1477
|
+
getContentTypeFromUrl(e) {
|
|
1478
|
+
var t = this;
|
|
1479
|
+
return T(function* () {
|
|
1480
|
+
if (e.startsWith("data:")) {
|
|
1481
|
+
var a = e.match(/^data:([^;]+)/);
|
|
1482
|
+
return a ? a[1] : "application/octet-stream";
|
|
1483
|
+
}
|
|
1484
|
+
try {
|
|
1485
|
+
var r = yield fetch(e, {
|
|
1486
|
+
method: "HEAD"
|
|
1487
|
+
}), n = r.headers.get("content-type");
|
|
1488
|
+
if (n && n.startsWith("image/"))
|
|
1489
|
+
return n.split(";")[0];
|
|
1490
|
+
} catch (i) {
|
|
1491
|
+
console.warn("HEAD запрос неудачен, определяем тип по расширению:", i);
|
|
1492
|
+
}
|
|
1493
|
+
return t.getContentTypeFromExtension(e);
|
|
1494
|
+
})();
|
|
1495
|
+
}
|
|
1496
|
+
/**
|
|
1497
|
+
* Определяет contentType по расширению файла в URL
|
|
1498
|
+
* @param {string} url - URL файла
|
|
1499
|
+
* @returns {string} - MIME-тип
|
|
1500
|
+
* @public
|
|
1501
|
+
*/
|
|
1502
|
+
getContentTypeFromExtension(e) {
|
|
1503
|
+
try {
|
|
1504
|
+
var t, {
|
|
1505
|
+
acceptContentTypes: a
|
|
1506
|
+
} = this.editor.options, r = new URL(e), n = (t = r.pathname.split(".").pop()) === null || t === void 0 ? void 0 : t.toLowerCase(), i = {};
|
|
1507
|
+
return a.forEach((s) => {
|
|
1508
|
+
var c = C.getFormatFromContentType(s);
|
|
1509
|
+
c && (i[c] = s);
|
|
1510
|
+
}), i[n] || "application/octet-stream";
|
|
1511
|
+
} catch (s) {
|
|
1512
|
+
return console.warn("Не удалось определить расширение из URL:", e, s), "application/octet-stream";
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1426
1515
|
/**
|
|
1427
1516
|
* Рассчитывает коэффициент масштабирования изображения.
|
|
1428
1517
|
* @param {object} imageObject - объект изображения
|
|
@@ -1479,7 +1568,7 @@ class Mt {
|
|
|
1479
1568
|
} = this.editor, {
|
|
1480
1569
|
width: c,
|
|
1481
1570
|
height: u
|
|
1482
|
-
} = i, l = Number(Math.max(Math.min(e,
|
|
1571
|
+
} = i, l = Number(Math.max(Math.min(e, D), x));
|
|
1483
1572
|
if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreWidth(s) : this.setCanvasBackstoreWidth(l), i.set({
|
|
1484
1573
|
width: l
|
|
1485
1574
|
}), n.clipPath.set({
|
|
@@ -1492,8 +1581,8 @@ class Mt {
|
|
|
1492
1581
|
var {
|
|
1493
1582
|
left: g,
|
|
1494
1583
|
top: v
|
|
1495
|
-
} = this.getObjectDefaultCoords(i),
|
|
1496
|
-
n.setViewportTransform([
|
|
1584
|
+
} = this.getObjectDefaultCoords(i), f = n.getZoom();
|
|
1585
|
+
n.setViewportTransform([f, 0, 0, f, g, v]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), n == null || n.fire("editor:resolution-width-changed", {
|
|
1497
1586
|
width: e
|
|
1498
1587
|
});
|
|
1499
1588
|
}
|
|
@@ -1522,7 +1611,7 @@ class Mt {
|
|
|
1522
1611
|
} = this.editor, {
|
|
1523
1612
|
width: c,
|
|
1524
1613
|
height: u
|
|
1525
|
-
} = i, l = Number(Math.max(Math.min(e,
|
|
1614
|
+
} = i, l = Number(Math.max(Math.min(e, N), B));
|
|
1526
1615
|
if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreHeight(s) : this.setCanvasBackstoreHeight(l), i.set({
|
|
1527
1616
|
height: l
|
|
1528
1617
|
}), n.clipPath.set({
|
|
@@ -1535,8 +1624,8 @@ class Mt {
|
|
|
1535
1624
|
var {
|
|
1536
1625
|
left: g,
|
|
1537
1626
|
top: v
|
|
1538
|
-
} = this.getObjectDefaultCoords(i),
|
|
1539
|
-
n.setViewportTransform([
|
|
1627
|
+
} = this.getObjectDefaultCoords(i), f = n.getZoom();
|
|
1628
|
+
n.setViewportTransform([f, 0, 0, f, g, v]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), n == null || n.fire("editor:resolution-height-changed", {
|
|
1540
1629
|
height: e
|
|
1541
1630
|
});
|
|
1542
1631
|
}
|
|
@@ -1584,7 +1673,7 @@ class Mt {
|
|
|
1584
1673
|
}
|
|
1585
1674
|
setCanvasBackstoreWidth(e) {
|
|
1586
1675
|
if (!(!e || typeof e != "number")) {
|
|
1587
|
-
var t = Math.max(Math.min(e,
|
|
1676
|
+
var t = Math.max(Math.min(e, D), x);
|
|
1588
1677
|
this.editor.canvas.setDimensions({
|
|
1589
1678
|
width: t
|
|
1590
1679
|
}, {
|
|
@@ -1594,7 +1683,7 @@ class Mt {
|
|
|
1594
1683
|
}
|
|
1595
1684
|
setCanvasBackstoreHeight(e) {
|
|
1596
1685
|
if (!(!e || typeof e != "number")) {
|
|
1597
|
-
var t = Math.max(Math.min(e,
|
|
1686
|
+
var t = Math.max(Math.min(e, N), B);
|
|
1598
1687
|
this.editor.canvas.setDimensions({
|
|
1599
1688
|
height: t
|
|
1600
1689
|
}, {
|
|
@@ -1605,7 +1694,7 @@ class Mt {
|
|
|
1605
1694
|
adaptCanvasToContainer() {
|
|
1606
1695
|
var {
|
|
1607
1696
|
canvas: e
|
|
1608
|
-
} = this.editor, t = e.editorContainer, a = t.clientWidth, r = t.clientHeight, n = Math.max(Math.min(a,
|
|
1697
|
+
} = this.editor, t = e.editorContainer, a = t.clientWidth, r = t.clientHeight, n = Math.max(Math.min(a, D), x), i = Math.max(Math.min(r, N), B);
|
|
1609
1698
|
console.log("adaptCanvasToContainer newWidth", n), console.log("adaptCanvasToContainer newHeight", i), e.setDimensions({
|
|
1610
1699
|
width: n,
|
|
1611
1700
|
height: i
|
|
@@ -1766,19 +1855,19 @@ class Mt {
|
|
|
1766
1855
|
width: l,
|
|
1767
1856
|
height: d
|
|
1768
1857
|
} = u;
|
|
1769
|
-
if (l <
|
|
1770
|
-
var h = "Размер изображения меньше минимального размера канваса, поэтому оно будет растянуто до минимальных размеров: ".concat(
|
|
1858
|
+
if (l < x || d < B) {
|
|
1859
|
+
var h = "Размер изображения меньше минимального размера канваса, поэтому оно будет растянуто до минимальных размеров: ".concat(x, "x").concat(B);
|
|
1771
1860
|
console.warn("scaleMontageAreaToImage. ".concat(h)), r.fire("editor:warning", {
|
|
1772
1861
|
message: h
|
|
1773
1862
|
});
|
|
1774
1863
|
}
|
|
1775
|
-
var g = Math.min(l,
|
|
1864
|
+
var g = Math.min(l, D), v = Math.min(d, N);
|
|
1776
1865
|
if (t) {
|
|
1777
1866
|
var {
|
|
1778
|
-
width:
|
|
1779
|
-
height:
|
|
1780
|
-
} = n,
|
|
1781
|
-
g =
|
|
1867
|
+
width: f,
|
|
1868
|
+
height: y
|
|
1869
|
+
} = n, m = l / f, b = d / y, M = Math.max(m, b);
|
|
1870
|
+
g = f * M, v = y * M;
|
|
1782
1871
|
}
|
|
1783
1872
|
this.setResolutionWidth(g, {
|
|
1784
1873
|
withoutSave: !0
|
|
@@ -2034,32 +2123,31 @@ class jt {
|
|
|
2034
2123
|
fitAsOneObject: r
|
|
2035
2124
|
} = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, {
|
|
2036
2125
|
canvas: n,
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
imageObject: g,
|
|
2126
|
+
imageManager: i,
|
|
2127
|
+
historyManager: s
|
|
2128
|
+
} = this.editor, c = e || n.getActiveObject();
|
|
2129
|
+
if (c) {
|
|
2130
|
+
if (["activeselection"].includes(c.type) && !r) {
|
|
2131
|
+
var u = c.getObjects();
|
|
2132
|
+
n.discardActiveObject(), u.forEach((h) => {
|
|
2133
|
+
var g = i.calculateScaleFactor({
|
|
2134
|
+
imageObject: h,
|
|
2047
2135
|
scaleType: t
|
|
2048
2136
|
});
|
|
2049
|
-
|
|
2137
|
+
h.scale(g), n.centerObject(h);
|
|
2050
2138
|
});
|
|
2051
|
-
var
|
|
2139
|
+
var l = new z(u, {
|
|
2052
2140
|
canvas: n
|
|
2053
2141
|
});
|
|
2054
|
-
n.setActiveObject(
|
|
2142
|
+
n.setActiveObject(l);
|
|
2055
2143
|
} else {
|
|
2056
|
-
var
|
|
2057
|
-
imageObject:
|
|
2144
|
+
var d = i.calculateScaleFactor({
|
|
2145
|
+
imageObject: c,
|
|
2058
2146
|
scaleType: t
|
|
2059
2147
|
});
|
|
2060
|
-
|
|
2148
|
+
c.scale(d), n.centerObject(c);
|
|
2061
2149
|
}
|
|
2062
|
-
n.renderAll(), a ||
|
|
2150
|
+
n.renderAll(), a || s.saveState(), n.fire("editor:image-fitted", {
|
|
2063
2151
|
type: t
|
|
2064
2152
|
});
|
|
2065
2153
|
}
|
|
@@ -2231,7 +2319,7 @@ class yt {
|
|
|
2231
2319
|
}
|
|
2232
2320
|
}
|
|
2233
2321
|
}
|
|
2234
|
-
class
|
|
2322
|
+
class H {
|
|
2235
2323
|
/**
|
|
2236
2324
|
* @param {object} options
|
|
2237
2325
|
* @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
|
|
@@ -2278,7 +2366,7 @@ class Y {
|
|
|
2278
2366
|
} = this.editor;
|
|
2279
2367
|
r.suspendHistory();
|
|
2280
2368
|
var n = e || a.getActiveObject();
|
|
2281
|
-
n && (n.type === "activeselection" ?
|
|
2369
|
+
n && (n.type === "activeselection" ? H._moveSelectionForward(a, n) : a.bringObjectForward(n), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:object-bring-forward"));
|
|
2282
2370
|
}
|
|
2283
2371
|
/**
|
|
2284
2372
|
* Отправить объект на задний план по оси Z
|
|
@@ -2328,7 +2416,7 @@ class Y {
|
|
|
2328
2416
|
} = this.editor;
|
|
2329
2417
|
n.suspendHistory();
|
|
2330
2418
|
var s = e || a.getActiveObject();
|
|
2331
|
-
s && (s.type === "activeselection" ?
|
|
2419
|
+
s && (s.type === "activeselection" ? H._moveSelectionBackwards(a, s) : a.sendObjectBackwards(s), a.sendObjectToBack(r), a.sendObjectToBack(i), a.renderAll(), n.resumeHistory(), t || n.saveState(), a.fire("editor:object-send-backwards"));
|
|
2332
2420
|
}
|
|
2333
2421
|
/**
|
|
2334
2422
|
* Сдвигает выделенные объекты на один уровень вверх относительно ближайшего верхнего объекта
|
|
@@ -2367,7 +2455,7 @@ class Y {
|
|
|
2367
2455
|
e.moveObjectTo(r[i], n - 1);
|
|
2368
2456
|
}
|
|
2369
2457
|
}
|
|
2370
|
-
var
|
|
2458
|
+
var pt = ["id", "left", "top", "width", "height", "fill"], bt = ["id", "left", "top", "radius", "fill"], It = ["id", "left", "top", "width", "height", "fill"];
|
|
2371
2459
|
function je(o, e) {
|
|
2372
2460
|
var t = Object.keys(o);
|
|
2373
2461
|
if (Object.getOwnPropertySymbols) {
|
|
@@ -2378,7 +2466,7 @@ function je(o, e) {
|
|
|
2378
2466
|
}
|
|
2379
2467
|
return t;
|
|
2380
2468
|
}
|
|
2381
|
-
function
|
|
2469
|
+
function F(o) {
|
|
2382
2470
|
for (var e = 1; e < arguments.length; e++) {
|
|
2383
2471
|
var t = arguments[e] != null ? arguments[e] : {};
|
|
2384
2472
|
e % 2 ? je(Object(t), !0).forEach(function(a) {
|
|
@@ -2406,7 +2494,7 @@ function wt(o, e) {
|
|
|
2406
2494
|
}
|
|
2407
2495
|
return (e === "string" ? String : Number)(o);
|
|
2408
2496
|
}
|
|
2409
|
-
function
|
|
2497
|
+
function G(o, e) {
|
|
2410
2498
|
if (o == null) return {};
|
|
2411
2499
|
var t, a, r = Ct(o, e);
|
|
2412
2500
|
if (Object.getOwnPropertySymbols) {
|
|
@@ -2424,7 +2512,7 @@ function Ct(o, e) {
|
|
|
2424
2512
|
}
|
|
2425
2513
|
return t;
|
|
2426
2514
|
}
|
|
2427
|
-
class
|
|
2515
|
+
class Dt {
|
|
2428
2516
|
/**
|
|
2429
2517
|
* @param {object} options
|
|
2430
2518
|
* @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
|
|
@@ -2458,12 +2546,12 @@ class Nt {
|
|
|
2458
2546
|
width: n = 100,
|
|
2459
2547
|
height: i = 100,
|
|
2460
2548
|
fill: s = "blue"
|
|
2461
|
-
} = e, c =
|
|
2549
|
+
} = e, c = G(e, pt), {
|
|
2462
2550
|
withoutSelection: u,
|
|
2463
2551
|
withoutAdding: l
|
|
2464
2552
|
} = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
|
|
2465
2553
|
canvas: d
|
|
2466
|
-
} = this.editor, h = new xe(
|
|
2554
|
+
} = this.editor, h = new xe(F({
|
|
2467
2555
|
id: t,
|
|
2468
2556
|
left: a,
|
|
2469
2557
|
top: r,
|
|
@@ -2494,12 +2582,12 @@ class Nt {
|
|
|
2494
2582
|
top: r,
|
|
2495
2583
|
radius: n = 50,
|
|
2496
2584
|
fill: i = "green"
|
|
2497
|
-
} = e, s =
|
|
2585
|
+
} = e, s = G(e, bt), {
|
|
2498
2586
|
withoutSelection: c,
|
|
2499
2587
|
withoutAdding: u
|
|
2500
2588
|
} = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
|
|
2501
2589
|
canvas: l
|
|
2502
|
-
} = this.editor, d = new Be(
|
|
2590
|
+
} = this.editor, d = new Be(F({
|
|
2503
2591
|
id: t,
|
|
2504
2592
|
left: a,
|
|
2505
2593
|
top: r,
|
|
@@ -2531,12 +2619,12 @@ class Nt {
|
|
|
2531
2619
|
width: n = 100,
|
|
2532
2620
|
height: i = 100,
|
|
2533
2621
|
fill: s = "yellow"
|
|
2534
|
-
} = e, c =
|
|
2622
|
+
} = e, c = G(e, It), {
|
|
2535
2623
|
withoutSelection: u,
|
|
2536
2624
|
withoutAdding: l
|
|
2537
2625
|
} = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
|
|
2538
2626
|
canvas: d
|
|
2539
|
-
} = this.editor, h = new Ze(
|
|
2627
|
+
} = this.editor, h = new Ze(F({
|
|
2540
2628
|
id: t,
|
|
2541
2629
|
left: a,
|
|
2542
2630
|
top: r,
|
|
@@ -2555,7 +2643,7 @@ function ye(o, e, t, a, r, n, i) {
|
|
|
2555
2643
|
}
|
|
2556
2644
|
s.done ? e(c) : Promise.resolve(c).then(a, r);
|
|
2557
2645
|
}
|
|
2558
|
-
function
|
|
2646
|
+
function pe(o) {
|
|
2559
2647
|
return function() {
|
|
2560
2648
|
var e = this, t = arguments;
|
|
2561
2649
|
return new Promise(function(a, r) {
|
|
@@ -2570,7 +2658,7 @@ function be(o) {
|
|
|
2570
2658
|
});
|
|
2571
2659
|
};
|
|
2572
2660
|
}
|
|
2573
|
-
class
|
|
2661
|
+
class Nt {
|
|
2574
2662
|
/**
|
|
2575
2663
|
* @param {object} options
|
|
2576
2664
|
* @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
|
|
@@ -2587,13 +2675,13 @@ class Dt {
|
|
|
2587
2675
|
*/
|
|
2588
2676
|
copy() {
|
|
2589
2677
|
var e = this;
|
|
2590
|
-
return
|
|
2678
|
+
return pe(function* () {
|
|
2591
2679
|
var {
|
|
2592
2680
|
canvas: t
|
|
2593
2681
|
} = e.editor, a = t.getActiveObject();
|
|
2594
2682
|
if (a)
|
|
2595
2683
|
try {
|
|
2596
|
-
var r = yield a.clone();
|
|
2684
|
+
var r = yield a.clone(["format"]);
|
|
2597
2685
|
if (e.clipboard = r, typeof ClipboardItem == "undefined" || !navigator.clipboard) {
|
|
2598
2686
|
console.warn(
|
|
2599
2687
|
// eslint-disable-next-line max-len
|
|
@@ -2631,18 +2719,18 @@ class Dt {
|
|
|
2631
2719
|
*/
|
|
2632
2720
|
paste() {
|
|
2633
2721
|
var e = this;
|
|
2634
|
-
return
|
|
2722
|
+
return pe(function* () {
|
|
2635
2723
|
var {
|
|
2636
2724
|
canvas: t
|
|
2637
2725
|
} = e.editor;
|
|
2638
2726
|
if (e.clipboard) {
|
|
2639
|
-
var a = yield e.clipboard.clone();
|
|
2727
|
+
var a = yield e.clipboard.clone(["format"]);
|
|
2640
2728
|
t.discardActiveObject(), a.set({
|
|
2641
2729
|
id: "".concat(a.type, "-").concat(I()),
|
|
2642
2730
|
left: a.left + 10,
|
|
2643
2731
|
top: a.top + 10,
|
|
2644
2732
|
evented: !0
|
|
2645
|
-
}), a instanceof
|
|
2733
|
+
}), a instanceof z ? (a.canvas = t, a.forEachObject((r) => {
|
|
2646
2734
|
t.add(r);
|
|
2647
2735
|
})) : t.add(a), t.setActiveObject(a), t.requestRenderAll(), t.fire("editor:object-pasted", {
|
|
2648
2736
|
object: a
|
|
@@ -2787,7 +2875,7 @@ class Ot {
|
|
|
2787
2875
|
if (!(!n || n.type !== "group")) {
|
|
2788
2876
|
var i = n.removeAll();
|
|
2789
2877
|
a.remove(n), i.forEach((c) => a.add(c));
|
|
2790
|
-
var s = new
|
|
2878
|
+
var s = new z(i, {
|
|
2791
2879
|
canvas: a
|
|
2792
2880
|
});
|
|
2793
2881
|
a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-ungrouped");
|
|
@@ -2816,7 +2904,7 @@ class Tt {
|
|
|
2816
2904
|
objectLockManager: a
|
|
2817
2905
|
} = this.editor;
|
|
2818
2906
|
e.discardActiveObject();
|
|
2819
|
-
var r = t.getObjects(), n = r.some((s) => s.locked), i = r.length > 1 ? new
|
|
2907
|
+
var r = t.getObjects(), n = r.some((s) => s.locked), i = r.length > 1 ? new z(t.getObjects(), {
|
|
2820
2908
|
canvas: e
|
|
2821
2909
|
}) : r[0];
|
|
2822
2910
|
n && a.lockObject({
|
|
@@ -2863,7 +2951,7 @@ class Et {
|
|
|
2863
2951
|
}), a.discardActiveObject(), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-deleted"));
|
|
2864
2952
|
}
|
|
2865
2953
|
}
|
|
2866
|
-
function
|
|
2954
|
+
function be(o, e, t, a, r, n, i) {
|
|
2867
2955
|
try {
|
|
2868
2956
|
var s = o[n](i), c = s.value;
|
|
2869
2957
|
} catch (u) {
|
|
@@ -2877,16 +2965,16 @@ function kt(o) {
|
|
|
2877
2965
|
return new Promise(function(a, r) {
|
|
2878
2966
|
var n = o.apply(e, t);
|
|
2879
2967
|
function i(c) {
|
|
2880
|
-
|
|
2968
|
+
be(n, a, r, i, s, "next", c);
|
|
2881
2969
|
}
|
|
2882
2970
|
function s(c) {
|
|
2883
|
-
|
|
2971
|
+
be(n, a, r, i, s, "throw", c);
|
|
2884
2972
|
}
|
|
2885
2973
|
i(void 0);
|
|
2886
2974
|
});
|
|
2887
2975
|
};
|
|
2888
2976
|
}
|
|
2889
|
-
class
|
|
2977
|
+
class ae {
|
|
2890
2978
|
constructor(e) {
|
|
2891
2979
|
var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
2892
2980
|
this.options = t;
|
|
@@ -2920,15 +3008,15 @@ class te {
|
|
|
2920
3008
|
editor: e
|
|
2921
3009
|
}), e.canvasManager = new Mt({
|
|
2922
3010
|
editor: e
|
|
2923
|
-
}), e.imageManager = new
|
|
3011
|
+
}), e.imageManager = new C({
|
|
2924
3012
|
editor: e
|
|
2925
|
-
}), e.layerManager = new
|
|
3013
|
+
}), e.layerManager = new H({
|
|
2926
3014
|
editor: e
|
|
2927
|
-
}), e.shapeManager = new
|
|
3015
|
+
}), e.shapeManager = new Dt({
|
|
2928
3016
|
editor: e
|
|
2929
3017
|
}), e.interactionBlocker = new yt({
|
|
2930
3018
|
editor: e
|
|
2931
|
-
}), e.clipboardManager = new
|
|
3019
|
+
}), e.clipboardManager = new Nt({
|
|
2932
3020
|
editor: e
|
|
2933
3021
|
}), e.objectLockManager = new Lt({
|
|
2934
3022
|
editor: e
|
|
@@ -2938,21 +3026,19 @@ class te {
|
|
|
2938
3026
|
editor: e
|
|
2939
3027
|
}), e.deletionManager = new Et({
|
|
2940
3028
|
editor: e
|
|
2941
|
-
}), e._createMonageArea(), e._createClippingArea(), e.listeners = new
|
|
3029
|
+
}), e._createMonageArea(), e._createClippingArea(), e.listeners = new Z({
|
|
2942
3030
|
editor: e,
|
|
2943
3031
|
options: e.options
|
|
2944
3032
|
}), e.canvasManager.setEditorContainerWidth(t), e.canvasManager.setEditorContainerHeight(a), e.canvasManager.setCanvasWrapperWidth(r), e.canvasManager.setCanvasWrapperHeight(n), e.canvasManager.setCanvasCSSWidth(i), e.canvasManager.setCanvasCSSHeight(s), c != null && c.source) {
|
|
2945
3033
|
var {
|
|
2946
3034
|
source: h,
|
|
2947
3035
|
scale: g = "image-".concat(l),
|
|
2948
|
-
withoutSave: v = !0
|
|
2949
|
-
contentType: m
|
|
3036
|
+
withoutSave: v = !0
|
|
2950
3037
|
} = c;
|
|
2951
3038
|
yield e.imageManager.importImage({
|
|
2952
3039
|
source: h,
|
|
2953
3040
|
scale: g,
|
|
2954
|
-
withoutSave: v
|
|
2955
|
-
contentType: m
|
|
3041
|
+
withoutSave: v
|
|
2956
3042
|
});
|
|
2957
3043
|
} else
|
|
2958
3044
|
e.canvasManager.setDefaultScale({
|
|
@@ -2974,7 +3060,7 @@ class te {
|
|
|
2974
3060
|
this.montageArea = this.shapeManager.addRectangle({
|
|
2975
3061
|
width: e,
|
|
2976
3062
|
height: t,
|
|
2977
|
-
fill:
|
|
3063
|
+
fill: ae._createMosaicPattern(),
|
|
2978
3064
|
stroke: null,
|
|
2979
3065
|
strokeWidth: 0,
|
|
2980
3066
|
selectable: !1,
|
|
@@ -3069,6 +3155,10 @@ const xt = {
|
|
|
3069
3155
|
maxHistoryLength: 50,
|
|
3070
3156
|
// Дефолтный тип скейлинга для объектов (cotain/cover)
|
|
3071
3157
|
scaleType: "contain",
|
|
3158
|
+
/**
|
|
3159
|
+
* Массив допустимых форматов изображений для загрузки в редактор.
|
|
3160
|
+
*/
|
|
3161
|
+
acceptContentTypes: ["image/png", "image/jpeg", "image/jpg", "image/svg+xml", "image/webp"],
|
|
3072
3162
|
// Показывать панель инструментов для выделенного объекта
|
|
3073
3163
|
showToolbar: !0,
|
|
3074
3164
|
// Настройки панели инструментов выделенного объекта.
|
|
@@ -3190,7 +3280,7 @@ function Yt(o) {
|
|
|
3190
3280
|
var r = document.createElement("canvas");
|
|
3191
3281
|
return r.id = "".concat(o, "-canvas"), a.appendChild(r), t.editorContainer = a, new Promise((n) => {
|
|
3192
3282
|
t._onReadyCallback = n;
|
|
3193
|
-
var i = new
|
|
3283
|
+
var i = new ae(r.id, t);
|
|
3194
3284
|
window[o] = i;
|
|
3195
3285
|
});
|
|
3196
3286
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anu3ev/fabric-image-editor",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "JavaScript image editor built on FabricJS, allowing you to create instances with an integrated montage area and providing an API to modify and manage state.",
|
|
5
5
|
"module": "dist/main.js",
|
|
6
6
|
"files": [
|