@syncfusion/ej2-image-editor 21.2.10 → 22.1.36

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 (107) hide show
  1. package/.eslintrc.json +1 -0
  2. package/CHANGELOG.md +8 -32
  3. package/dist/ej2-image-editor.umd.min.js +2 -2
  4. package/dist/ej2-image-editor.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-image-editor.es2015.js +19320 -12622
  6. package/dist/es6/ej2-image-editor.es2015.js.map +1 -1
  7. package/dist/es6/ej2-image-editor.es5.js +19139 -12414
  8. package/dist/es6/ej2-image-editor.es5.js.map +1 -1
  9. package/dist/global/ej2-image-editor.min.js +2 -2
  10. package/dist/global/ej2-image-editor.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/package.json +11 -11
  13. package/src/image-editor/action/crop.d.ts +36 -0
  14. package/src/image-editor/action/crop.js +829 -0
  15. package/src/image-editor/action/draw.d.ts +125 -0
  16. package/src/image-editor/action/draw.js +3263 -0
  17. package/src/image-editor/action/export.d.ts +23 -0
  18. package/src/image-editor/action/export.js +364 -0
  19. package/src/image-editor/action/filter.d.ts +35 -0
  20. package/src/image-editor/action/filter.js +699 -0
  21. package/src/image-editor/action/freehand-draw.d.ts +61 -0
  22. package/src/image-editor/action/freehand-draw.js +1015 -0
  23. package/src/image-editor/action/index.d.ts +9 -0
  24. package/src/image-editor/action/index.js +9 -0
  25. package/src/image-editor/action/selection.d.ts +139 -0
  26. package/src/image-editor/action/selection.js +4518 -0
  27. package/src/image-editor/action/shape.d.ts +94 -0
  28. package/src/image-editor/action/shape.js +2745 -0
  29. package/src/image-editor/action/transform.d.ts +67 -0
  30. package/src/image-editor/action/transform.js +1859 -0
  31. package/src/image-editor/action/undo-redo.d.ts +43 -0
  32. package/src/image-editor/action/undo-redo.js +800 -0
  33. package/src/image-editor/base/enum.d.ts +189 -0
  34. package/src/image-editor/base/enum.js +198 -0
  35. package/src/image-editor/{image-editor-model.d.ts → base/image-editor-model.d.ts} +130 -42
  36. package/src/image-editor/{image-editor.d.ts → base/image-editor.d.ts} +413 -1111
  37. package/src/image-editor/base/image-editor.js +2270 -0
  38. package/src/image-editor/base/index.d.ts +4 -0
  39. package/src/image-editor/base/index.js +2 -0
  40. package/src/image-editor/base/interface.d.ts +1128 -0
  41. package/src/image-editor/base/interface.js +1 -0
  42. package/src/image-editor/index.d.ts +3 -5
  43. package/src/image-editor/index.js +3 -4
  44. package/src/image-editor/renderer/index.d.ts +1 -0
  45. package/src/image-editor/renderer/index.js +1 -0
  46. package/src/image-editor/renderer/toolbar.d.ts +105 -0
  47. package/src/image-editor/renderer/toolbar.js +3018 -0
  48. package/styles/bootstrap-dark.css +69 -3
  49. package/styles/bootstrap.css +69 -3
  50. package/styles/bootstrap4.css +69 -3
  51. package/styles/bootstrap5-dark.css +69 -3
  52. package/styles/bootstrap5.css +69 -3
  53. package/styles/fabric-dark.css +69 -3
  54. package/styles/fabric.css +69 -3
  55. package/styles/fluent-dark.css +69 -3
  56. package/styles/fluent.css +69 -3
  57. package/styles/highcontrast-light.css +71 -5
  58. package/styles/highcontrast.css +72 -5
  59. package/styles/image-editor/_highcontrast-definition.scss +1 -1
  60. package/styles/image-editor/_highcontrast-light-definition.scss +1 -1
  61. package/styles/image-editor/_layout.scss +21 -7
  62. package/styles/image-editor/_material3-dark-definition.scss +1 -0
  63. package/styles/image-editor/_material3-definition.scss +11 -0
  64. package/styles/image-editor/_theme.scss +7 -2
  65. package/styles/image-editor/bootstrap-dark.css +69 -3
  66. package/styles/image-editor/bootstrap.css +69 -3
  67. package/styles/image-editor/bootstrap4.css +69 -3
  68. package/styles/image-editor/bootstrap5-dark.css +69 -3
  69. package/styles/image-editor/bootstrap5.css +69 -3
  70. package/styles/image-editor/fabric-dark.css +69 -3
  71. package/styles/image-editor/fabric.css +69 -3
  72. package/styles/image-editor/fluent-dark.css +69 -3
  73. package/styles/image-editor/fluent.css +69 -3
  74. package/styles/image-editor/highcontrast-light.css +71 -5
  75. package/styles/image-editor/highcontrast.css +72 -5
  76. package/styles/image-editor/icons/_bootstrap-dark.scss +132 -0
  77. package/styles/image-editor/icons/_bootstrap.scss +132 -0
  78. package/styles/image-editor/icons/_bootstrap4.scss +132 -0
  79. package/styles/image-editor/icons/_bootstrap5.scss +132 -0
  80. package/styles/image-editor/icons/_fabric-dark.scss +132 -0
  81. package/styles/image-editor/icons/_fabric.scss +132 -0
  82. package/styles/image-editor/icons/_fluent.scss +132 -0
  83. package/styles/image-editor/icons/_fusionnew.scss +132 -0
  84. package/styles/image-editor/icons/_highcontrast-light.scss +132 -0
  85. package/styles/image-editor/icons/_highcontrast.scss +132 -0
  86. package/styles/image-editor/icons/_material-dark.scss +132 -0
  87. package/styles/image-editor/icons/_material.scss +132 -0
  88. package/styles/image-editor/icons/_material3-dark.scss +1 -0
  89. package/styles/image-editor/icons/_material3.scss +133 -1
  90. package/styles/image-editor/icons/_tailwind.scss +132 -0
  91. package/styles/image-editor/material-dark.css +69 -3
  92. package/styles/image-editor/material.css +69 -3
  93. package/styles/image-editor/material3-dark.css +453 -0
  94. package/styles/image-editor/material3-dark.scss +14 -0
  95. package/styles/image-editor/material3.css +509 -0
  96. package/styles/image-editor/material3.scss +14 -0
  97. package/styles/image-editor/tailwind-dark.css +69 -3
  98. package/styles/image-editor/tailwind.css +69 -3
  99. package/styles/material-dark.css +69 -3
  100. package/styles/material.css +69 -3
  101. package/styles/material3-dark.css +453 -0
  102. package/styles/material3-dark.scss +3 -0
  103. package/styles/material3.css +509 -0
  104. package/styles/material3.scss +3 -0
  105. package/styles/tailwind-dark.css +69 -3
  106. package/styles/tailwind.css +69 -3
  107. package/src/image-editor/image-editor.js +0 -14827
@@ -0,0 +1,3263 @@
1
+ import { extend, isNullOrUndefined, Browser, isBlazor, getComponent } from '@syncfusion/ej2-base';
2
+ import { Dialog, hideSpinner, showSpinner } from '@syncfusion/ej2-popups';
3
+ var Draw = /** @class */ (function () {
4
+ function Draw(parent) {
5
+ this.cancelObjColl = [];
6
+ this.cancelPointColl = [];
7
+ this.isInitialLoading = false; // Specifies whether image is loaded for the first time or not (for applying initial filter)
8
+ this.fileName = '';
9
+ this.isErrorImage = false;
10
+ this.isShapeTextInserted = false;
11
+ this.isRotateZoom = false; // To restore zoomed image on selection crop selection
12
+ this.tempStrokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null }; // restore stroke settings on cancel
13
+ this.tempTextSettings = { text: 'Enter Text', fontFamily: 'Arial', fontSize: null, fontRatio: null, bold: false, italic: false, underline: false }; // restore text settings on cancel
14
+ this.tempAdjValue = ''; // for temp internal slider value
15
+ this.tempFilter = ''; // restore filter style on cancel
16
+ this.tempUndoRedoStep = 0;
17
+ this.tempFreehandCounter = 0;
18
+ this.tempCurrFhdIndex = 0;
19
+ this.tempZoomFactor = null; // Restore zoom factor on cancel
20
+ this.isCancelAction = false;
21
+ this.rotatedFlipCropSel = false;
22
+ this.zoomCrop = { width: 0, height: 0 };
23
+ this.isImageEdited = false;
24
+ this.isFileChanged = false;
25
+ this.isNewPath = false;
26
+ this.arrowDimension = { bar: { width: 10, height: 32, ratioX: null, ratioY: null },
27
+ arrow: { width: 24, height: 24, ratioX: null, ratioY: null }, arrowSolid: { width: 32, height: 32, ratioX: null, ratioY: null },
28
+ circle: { width: 10, height: 10, ratioX: null, ratioY: null }, square: { width: 20, height: 20, ratioX: null, ratioY: null } };
29
+ this.parent = parent;
30
+ this.addEventListener();
31
+ }
32
+ Draw.prototype.destroy = function () {
33
+ if (this.parent.isDestroyed) {
34
+ return;
35
+ }
36
+ this.removeEventListener();
37
+ };
38
+ Draw.prototype.addEventListener = function () {
39
+ this.parent.on('draw', this.draw, this);
40
+ this.parent.on('destroyed', this.destroy, this);
41
+ };
42
+ Draw.prototype.removeEventListener = function () {
43
+ this.parent.off('draw', this.draw);
44
+ this.parent.off('destroyed', this.destroy);
45
+ };
46
+ Draw.prototype.draw = function (args) {
47
+ this.updatePrivateVariables();
48
+ switch (args.prop) {
49
+ case 'drawObject':
50
+ this.drawObject(args.value['canvas'], args.value['obj'], args.value['isCropRatio'], args.value['points'], args.value['isPreventDrag'], args.value['saveContext'], args.value['isPreventSelection']);
51
+ break;
52
+ case 'updateActiveObject':
53
+ this.updateActiveObject(args.value['actPoint'], args.value['obj'], args.value['isMouseMove'], args.value['x'], args.value['y']);
54
+ break;
55
+ case 'clearOuterCanvas':
56
+ this.clearOuterCanvas(args.value['context']);
57
+ break;
58
+ case 'setDestPoints':
59
+ this.setDestPoints();
60
+ break;
61
+ case 'updateCurrTransState':
62
+ this.updateCurrTransState(args.value['type'], args.value['isPreventDestination'], args.value['isRotatePan']);
63
+ break;
64
+ case 'currTransState':
65
+ this.currTransState(args.value['type'], args.value['isPreventDestination'], args.value['context'], args.value['isPreventCircleCrop']);
66
+ break;
67
+ case 'setTransform':
68
+ this.setTransform(args.value['context'], args.value['value'], args.value['isReverse']);
69
+ break;
70
+ case 'render-image':
71
+ this.renderImage(args.value['isMouseWheel']);
72
+ break;
73
+ case 'draw-image-to-canvas':
74
+ this.drawImgToCanvas(args.value['dimension']);
75
+ break;
76
+ case 'update-canvas':
77
+ this.updateCanvas();
78
+ break;
79
+ case 'performCancel':
80
+ this.performCancel(args.value['isContextualToolbar']);
81
+ break;
82
+ case 'updateFlipPan':
83
+ this.updateFlipPan(args.value['tempSelectionObj']);
84
+ break;
85
+ case 'select':
86
+ this.select(args.value['type'], args.value['startX'], args.value['startY'], args.value['width'], args.value['height']);
87
+ break;
88
+ case 'callUpdateCurrTransState':
89
+ this.callUpdateCurrTransState();
90
+ break;
91
+ case 'resetPanPoints':
92
+ this.resetPanPoints();
93
+ break;
94
+ case 'setClientTransDim':
95
+ this.setClientTransDim(args.value['isPreventDimension']);
96
+ break;
97
+ case 'redrawImgWithObj':
98
+ this.redrawImgWithObj();
99
+ break;
100
+ case 'setCurrentObj':
101
+ this.setCurrentObj(args.value['obj']);
102
+ break;
103
+ case 'performPointZoom':
104
+ this.performPointZoom(args.value['x'], args.value['y'], args.value['type']);
105
+ break;
106
+ case 'open':
107
+ this.open(args.value['data']);
108
+ break;
109
+ case 'isInitialLoading':
110
+ this.isInitialLoading = args.value['isInitialLoading'];
111
+ break;
112
+ case 'isInitialLoaded':
113
+ this.getInitialLoaded(args.value['object']);
114
+ break;
115
+ case 'fileSelect':
116
+ this.fileSelect(args.value['inputElement'], args.value['args']);
117
+ break;
118
+ case 'getFileName':
119
+ args.value['obj']['fileName'] = this.fileName;
120
+ args.value['obj']['fileType'] = this.fileType;
121
+ break;
122
+ case 'getErrorImage':
123
+ args.value['obj']['isErrorImage'] = this.isErrorImage;
124
+ break;
125
+ case 'getInitialZoomValue':
126
+ args.value['obj']['initialZoomValue'] = this.initZoomValue;
127
+ break;
128
+ case 'setShapeTextInsert':
129
+ this.isShapeTextInserted = args.value['bool'];
130
+ break;
131
+ case 'resetCurrentSelectionPoint':
132
+ this.currSelPoint = null;
133
+ break;
134
+ case 'setRotateZoom':
135
+ this.isRotateZoom = args.value['isRotateZoom'];
136
+ break;
137
+ case 'setTempStrokeSettings':
138
+ this.tempStrokeSettings = args.value['tempStrokeSettings'];
139
+ break;
140
+ case 'setTempTextSettings':
141
+ this.tempTextSettings = args.value['tempTextSettings'];
142
+ break;
143
+ case 'setTempAdjustmentValue':
144
+ this.tempAdjValue = args.value['tempAdjustmentValue'];
145
+ break;
146
+ case 'getTempAdjustmentValue':
147
+ args.value['obj']['value'] = this.tempAdjValue;
148
+ break;
149
+ case 'setTempFilter':
150
+ this.tempFilter = args.value['tempFilter'];
151
+ break;
152
+ case 'setTempUndoRedoStep':
153
+ this.tempUndoRedoStep = args.value['tempUndoRedoStep'];
154
+ break;
155
+ case 'setTempFreehandCounter':
156
+ this.tempFreehandCounter = args.value['tempFreehandCounter'];
157
+ break;
158
+ case 'setTempCurrentFreehandDrawIndex':
159
+ this.tempCurrFhdIndex = args.value['tempCurrentFreehandDrawIndex'];
160
+ break;
161
+ case 'setTempZoomFactor':
162
+ this.tempZoomFactor = args.value['tempZoomFactor'];
163
+ break;
164
+ case 'setCancelAction':
165
+ this.isCancelAction = args.value['bool'];
166
+ break;
167
+ case 'getRotatedFlipCropSelection':
168
+ args.value['bool']['isSelected'] = this.rotatedFlipCropSel;
169
+ break;
170
+ case 'getPrevActObj':
171
+ args.value['obj']['prevActObj'] = this.prevActObj;
172
+ break;
173
+ case 'setPrevActObj':
174
+ this.prevActObj = args.value['prevActObj'];
175
+ break;
176
+ case 'setZoomCropWidth':
177
+ this.zoomCrop.width = args.value['width'];
178
+ this.zoomCrop.height = args.value['height'];
179
+ break;
180
+ case 'setImageEdited':
181
+ this.isImageEdited = true;
182
+ break;
183
+ case 'reset':
184
+ this.reset();
185
+ break;
186
+ case 'dlgBtnClick':
187
+ this.dlgBtnClick();
188
+ break;
189
+ case 'dlgCloseBtnClick':
190
+ this.dlgCloseBtnClick();
191
+ break;
192
+ case 'setNewPath':
193
+ this.isNewPath = args.value['bool'];
194
+ break;
195
+ case 'getNewPath':
196
+ args.value['obj']['isNewPath'] = this.isNewPath;
197
+ break;
198
+ case 'getArrowDimension':
199
+ args.value['obj']['arrowDimension'] = this.arrowDimension;
200
+ break;
201
+ case 'setArrowDimension':
202
+ this.arrowDimension = args.value['arrowDimension'];
203
+ break;
204
+ case 'moveToSelectionRange':
205
+ this.moveToSelectionRange(args.value['type'], args.value['activeObj']);
206
+ break;
207
+ }
208
+ };
209
+ Draw.prototype.getModuleName = function () {
210
+ return 'draw';
211
+ };
212
+ Draw.prototype.updatePrivateVariables = function () {
213
+ var parent = this.parent;
214
+ if (parent.lowerCanvas) {
215
+ this.lowerContext = parent.lowerCanvas.getContext('2d');
216
+ }
217
+ if (parent.upperCanvas) {
218
+ this.upperContext = parent.upperCanvas.getContext('2d');
219
+ }
220
+ if (isNullOrUndefined(this.tempZoomFactor)) {
221
+ this.tempZoomFactor = parent.transform.zoomFactor;
222
+ }
223
+ };
224
+ Draw.prototype.reset = function () {
225
+ this.isInitialLoading = this.isErrorImage = this.isNewPath = false;
226
+ this.cancelObjColl = this.cancelPointColl = [];
227
+ this.isShapeTextInserted = false;
228
+ this.initZoomValue = null;
229
+ this.tempFilter = '';
230
+ this.currSelPoint = null;
231
+ this.isRotateZoom = false;
232
+ this.tempAdjValue = '';
233
+ this.tempStrokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null };
234
+ this.tempTextSettings =
235
+ { text: 'Enter Text', fontFamily: 'Arial', fontSize: null, fontRatio: null, bold: false, italic: false, underline: false };
236
+ this.tempUndoRedoStep = this.tempFreehandCounter = this.tempCurrFhdIndex = 0;
237
+ this.tempZoomFactor = null;
238
+ this.isCancelAction = false;
239
+ this.rotatedFlipCropSel = false;
240
+ this.prevActObj = null;
241
+ this.arrowDimension = { bar: { width: 10, height: 32, ratioX: null, ratioY: null },
242
+ arrow: { width: 24, height: 24, ratioX: null, ratioY: null }, arrowSolid: { width: 32, height: 32, ratioX: null, ratioY: null },
243
+ circle: { width: 10, height: 10, ratioX: null, ratioY: null }, square: { width: 20, height: 20, ratioX: null, ratioY: null } };
244
+ };
245
+ Draw.prototype.drawObject = function (canvas, obj, isCropRatio, points, isPreventDrag, saveContext, isPreventSelection) {
246
+ var parent = this.parent;
247
+ var actPoint = parent.activeObj.activePoint;
248
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
249
+ var canvasDraw;
250
+ if (canvas.toLowerCase() === 'original') {
251
+ canvasDraw = this.lowerContext;
252
+ }
253
+ else if (canvas.toLowerCase() === 'duplicate') {
254
+ canvasDraw = this.upperContext;
255
+ }
256
+ else if (saveContext) {
257
+ canvasDraw = saveContext;
258
+ }
259
+ if (!isPreventDrag && parent.activeObj.shape) {
260
+ this.setDragLimit();
261
+ }
262
+ if (parent.currObjType.shape) {
263
+ var splitWords = parent.currObjType.shape.split('-');
264
+ if (splitWords[0].toLowerCase() === 'crop' && isCropRatio) {
265
+ this.drawCropRatio();
266
+ }
267
+ }
268
+ if (points) {
269
+ actPoint.startX = points.startX;
270
+ actPoint.startY = points.startY;
271
+ actPoint.endX = points.endX;
272
+ actPoint.endY = points.endY;
273
+ actPoint.width = points.width;
274
+ actPoint.height = points.height;
275
+ }
276
+ if (isNullOrUndefined(parent.activeObj.strokeSettings)) {
277
+ var obj_1 = { strokeSettings: {} };
278
+ parent.notify('shape', { prop: 'getStrokeSettings', onPropertyChange: false,
279
+ value: { obj: obj_1 } });
280
+ parent.activeObj.strokeSettings = obj_1['strokeSettings'];
281
+ }
282
+ if (isNullOrUndefined(parent.activeObj.strokeSettings.strokeWidth)) {
283
+ parent.activeObj.strokeSettings.strokeWidth = 2;
284
+ }
285
+ if (obj) {
286
+ parent.activeObj = extend({}, obj, {}, true);
287
+ }
288
+ this.updateActiveObject();
289
+ if (parent.currObjType.isText) {
290
+ var obj_2 = { keyHistory: '' };
291
+ parent.notify('shape', { prop: 'getKeyHistory', onPropertyChange: false, value: { obj: obj_2 } });
292
+ parent.activeObj.keyHistory = obj_2['keyHistory'];
293
+ }
294
+ if (canvas.toLowerCase() !== 'original') {
295
+ var splitWords = void 0;
296
+ var isCrop = false;
297
+ if (parent.activeObj.shape) {
298
+ splitWords = parent.activeObj.shape.split('-');
299
+ if (splitWords[0] === 'crop') {
300
+ isCrop = true;
301
+ }
302
+ }
303
+ if (isCrop) {
304
+ this.upperContext.fillStyle = 'rgb(0, 0, 0, 0.25)';
305
+ this.upperContext.fillRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
306
+ this.upperContext.clearRect(actPoint.startX, actPoint.startY, actPoint.width, actPoint.height);
307
+ }
308
+ if (isNullOrUndefined(isPreventSelection) && (canvasDraw === this.lowerContext || canvasDraw === this.upperContext)) {
309
+ this.rotateContext('initial', canvasDraw);
310
+ this.drawOuterSelection(canvasDraw);
311
+ this.rotateContext('reverse', canvasDraw);
312
+ }
313
+ }
314
+ parent.currObjType.isActiveObj = true;
315
+ var object = { keyHistory: '' };
316
+ parent.notify('shape', { prop: 'getKeyHistory', onPropertyChange: false, value: { obj: object } });
317
+ if (obj) {
318
+ this.drawShapeObj(canvas, obj.shape, saveContext, isPreventSelection);
319
+ }
320
+ else if (object['keyHistory'] !== '' && parent.currObjType.isText) {
321
+ this.drawShapeObj(canvas, 'text', saveContext, isPreventSelection);
322
+ }
323
+ else if (parent.activeObj.shape) {
324
+ this.drawShapeObj(canvas, parent.activeObj.shape, saveContext, isPreventSelection);
325
+ }
326
+ else {
327
+ this.drawShapeObj(canvas, undefined, saveContext, isPreventSelection);
328
+ }
329
+ };
330
+ Draw.prototype.rotateContext = function (type, ctx) {
331
+ var parent = this.parent;
332
+ var activePoint = extend({}, parent.activeObj.activePoint, {}, true);
333
+ if (parent.activeObj.shape === 'line' || parent.activeObj.shape === 'arrow') {
334
+ return;
335
+ }
336
+ var rotationAngle = (type === 'initial') ? parent.activeObj.rotatedAngle : -parent.activeObj.rotatedAngle;
337
+ ctx.translate(activePoint.startX + (activePoint.width / 2), activePoint.startY + (activePoint.height / 2));
338
+ ctx.rotate(rotationAngle);
339
+ ctx.translate(-(activePoint.startX + (activePoint.width / 2)), -(activePoint.startY + (activePoint.height / 2)));
340
+ };
341
+ Draw.prototype.setDragLimit = function () {
342
+ var parent = this.parent;
343
+ var actPoint = parent.activeObj.activePoint;
344
+ if (actPoint && parent.activeObj.rotatedAngle === 0) {
345
+ if (actPoint.startX < parent.img.destLeft) {
346
+ actPoint.startX = parent.img.destLeft;
347
+ actPoint.endX = actPoint.startX + actPoint.width;
348
+ }
349
+ else if (actPoint.endX > parent.img.destLeft + parent.img.destWidth) {
350
+ actPoint.endX = parent.img.destLeft + parent.img.destWidth;
351
+ actPoint.startX = actPoint.endX - actPoint.width;
352
+ }
353
+ if (actPoint.startY < parent.img.destTop) {
354
+ actPoint.startY = parent.img.destTop;
355
+ }
356
+ else if (actPoint.endY > parent.img.destTop + parent.img.destHeight) {
357
+ actPoint.endY = parent.img.destTop + parent.img.destHeight;
358
+ actPoint.startY = actPoint.endY - actPoint.height;
359
+ }
360
+ parent.activeObj = this.updateWidthHeight(parent.activeObj);
361
+ }
362
+ };
363
+ Draw.prototype.drawCropRatio = function () {
364
+ var parent = this.parent;
365
+ var actPoint = parent.activeObj.activePoint;
366
+ var x;
367
+ var y;
368
+ var width;
369
+ var height;
370
+ if (parent.transform.zoomFactor > 0 && this.currSelPoint) {
371
+ var activeObj = extend({}, parent.activeObj, {}, true);
372
+ this.drawCustomSelection('crop-custom', null, null, null, null);
373
+ if (parent.transform.degree % 90 === 0 && parent.transform.degree % 180 !== 0) {
374
+ width = parent.activeObj.activePoint.width < parent.activeObj.activePoint.height ?
375
+ parent.activeObj.activePoint.width : parent.activeObj.activePoint.height;
376
+ height = width;
377
+ }
378
+ else {
379
+ if (parent.img.destLeft + parent.img.destLeft + parent.img.destWidth <= parent.lowerCanvas.clientWidth) {
380
+ width = actPoint.width;
381
+ }
382
+ else {
383
+ width = parent.lowerCanvas.clientWidth - parent.img.destLeft;
384
+ }
385
+ if (parent.img.destTop + parent.img.destTop + parent.img.destHeight <= parent.lowerCanvas.clientHeight) {
386
+ height = actPoint.height;
387
+ }
388
+ else {
389
+ height = parent.lowerCanvas.clientHeight - parent.img.destTop;
390
+ }
391
+ }
392
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
393
+ parent.activeObj = activeObj;
394
+ parent.currObjType.shape = activeObj.shape;
395
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
396
+ parent.currObjType.isCustomCrop = false;
397
+ }
398
+ else {
399
+ width = parent.img.destWidth;
400
+ height = parent.img.destHeight;
401
+ if (parent.img.destLeft < 0) {
402
+ width += parent.img.destLeft;
403
+ }
404
+ if (parent.img.destTop < 0) {
405
+ height += parent.img.destTop;
406
+ }
407
+ if (parent.currObjType.shape.toLowerCase() !== 'crop-square' && parent.currObjType.shape.toLowerCase() !== 'crop-circle') {
408
+ if (parent.img.destLeft + parent.img.destWidth > parent.lowerCanvas.width) {
409
+ width -= (parent.img.destLeft + parent.img.destWidth - parent.lowerCanvas.width);
410
+ }
411
+ if (parent.img.destTop + parent.img.destHeight > parent.lowerCanvas.height) {
412
+ height -= (parent.img.destTop + parent.img.destHeight - parent.lowerCanvas.height);
413
+ }
414
+ }
415
+ }
416
+ switch (parent.currObjType.shape.toLowerCase()) {
417
+ case 'crop-square':
418
+ case 'crop-circle':
419
+ parent.notify('selection', { prop: 'setDragDirection', onPropertyChange: false, value: { width: width, height: height } });
420
+ actPoint = parent.activeObj.activePoint;
421
+ if (parent.lowerCanvas.width < (actPoint.endX - actPoint.startX)) {
422
+ actPoint.startX = 7.5;
423
+ actPoint.endX = parent.lowerCanvas.width - 7.5;
424
+ }
425
+ if (parent.lowerCanvas.height < (actPoint.endY - actPoint.startY)) {
426
+ actPoint.startY = 7.5;
427
+ actPoint.endY = parent.lowerCanvas.height - 7.5;
428
+ }
429
+ if (width === parent.img.destWidth && height === parent.img.destHeight) {
430
+ actPoint.startX += parent.img.destLeft;
431
+ actPoint.startY +=
432
+ parent.img.destTop;
433
+ actPoint.endX += parent.img.destLeft;
434
+ actPoint.endY +=
435
+ parent.img.destTop;
436
+ }
437
+ if (parent.lowerCanvas.width > parent.lowerCanvas.height) {
438
+ actPoint.height = actPoint.endY - actPoint.startY;
439
+ actPoint.width = actPoint.height;
440
+ actPoint.endX = actPoint.startX +
441
+ actPoint.width;
442
+ }
443
+ else {
444
+ actPoint.width = actPoint.endX - actPoint.startX;
445
+ actPoint.height = actPoint.width;
446
+ actPoint.endY = actPoint.startY +
447
+ actPoint.height;
448
+ }
449
+ break;
450
+ case 'crop-3:2':
451
+ x = 3;
452
+ y = 2;
453
+ break;
454
+ case 'crop-4:3':
455
+ x = 4;
456
+ y = 3;
457
+ break;
458
+ case 'crop-5:4':
459
+ x = 5;
460
+ y = 4;
461
+ break;
462
+ case 'crop-7:5':
463
+ x = 7;
464
+ y = 5;
465
+ break;
466
+ case 'crop-16:9':
467
+ x = 16;
468
+ y = 9;
469
+ break;
470
+ }
471
+ if (x !== undefined && y !== undefined) {
472
+ parent.notify('selection', { prop: 'calcShapeRatio', onPropertyChange: false,
473
+ value: { x: x, y: y, imgWidth: width, imgHeight: height } });
474
+ if (width === parent.img.destWidth && height === parent.img.destHeight) {
475
+ this.updatePoints();
476
+ }
477
+ actPoint = parent.activeObj.activePoint;
478
+ }
479
+ if (actPoint.startX < parent.img.destLeft) {
480
+ var diff = (parent.img.destLeft - actPoint.startX) + 7.5;
481
+ actPoint.startX += diff;
482
+ actPoint.endX += diff;
483
+ }
484
+ if (actPoint.startY < parent.img.destTop) {
485
+ var diff = (parent.img.destTop - actPoint.startY) + 7.5;
486
+ actPoint.startY += diff;
487
+ actPoint.endY += diff;
488
+ }
489
+ parent.activeObj = this.updateWidthHeight(parent.activeObj);
490
+ this.adjToCenter();
491
+ };
492
+ Draw.prototype.adjToCenter = function () {
493
+ var parent = this.parent;
494
+ var diffX = ((parent.lowerCanvas.width) / 2) - (parent.activeObj.activePoint.endX -
495
+ parent.activeObj.activePoint.width / 2);
496
+ var diffY = ((parent.lowerCanvas.height) / 2) - (parent.activeObj.activePoint.endY -
497
+ parent.activeObj.activePoint.height / 2);
498
+ parent.activeObj.activePoint.startX += diffX;
499
+ parent.activeObj.activePoint.endX += diffX;
500
+ parent.activeObj.activePoint.startY += diffY;
501
+ parent.activeObj.activePoint.endY += diffY;
502
+ if (parent.activeObj.activePoint.startX < (parent.img.destLeft >= 7.5 ? parent.img.destLeft : 7.5)) {
503
+ var diff = ((parent.img.destLeft >= 7.5 ? parent.img.destLeft : 0) - parent.activeObj.activePoint.startX) + 7.5;
504
+ parent.activeObj.activePoint.startX += diff;
505
+ parent.activeObj.activePoint.endX += diff;
506
+ }
507
+ else if (parent.activeObj.activePoint.endX > parent.img.destLeft + parent.img.destWidth) {
508
+ var diff = (parent.activeObj.activePoint.endX - (parent.img.destLeft + parent.img.destWidth)) + 7.5;
509
+ parent.activeObj.activePoint.startX -= diff;
510
+ parent.activeObj.activePoint.endX -= diff;
511
+ }
512
+ if (parent.activeObj.activePoint.startY < (parent.img.destTop > 7.5 ? parent.img.destTop : 7.5)) {
513
+ var diff = ((parent.img.destTop > 7.5 ? parent.img.destTop : 0) - parent.activeObj.activePoint.startY) + 7.5;
514
+ parent.activeObj.activePoint.startY += diff;
515
+ parent.activeObj.activePoint.endY += diff;
516
+ }
517
+ else if (parent.activeObj.activePoint.endY > parent.img.destTop + parent.img.destHeight) {
518
+ var diff = (parent.activeObj.activePoint.endY - (parent.img.destTop + parent.img.destHeight)) + 7.5;
519
+ parent.activeObj.activePoint.startY -= diff;
520
+ parent.activeObj.activePoint.endY -= diff;
521
+ }
522
+ };
523
+ Draw.prototype.updateActiveObject = function (actPoint, obj, isMouseMove, x, y) {
524
+ actPoint = actPoint ? actPoint : extend({}, this.parent.activeObj.activePoint, {}, true);
525
+ obj = obj ? obj : extend({}, this.parent.activeObj, {}, true);
526
+ actPoint.width = actPoint.endX - actPoint.startX;
527
+ actPoint.height = actPoint.endY - actPoint.startY;
528
+ x = x ? x : 0;
529
+ y = y ? y : 0;
530
+ var horCircleWidth = actPoint.width / 2;
531
+ var verCircleHeight = actPoint.height / 2;
532
+ var radius = 7.5;
533
+ obj.horTopLine = { startX: actPoint.startX + x, startY: actPoint.startY - y,
534
+ endX: actPoint.endX + x, endY: actPoint.endY + y };
535
+ obj.horBottomLine = { startX: actPoint.startX - x, startY: actPoint.endY - y,
536
+ endX: actPoint.endX - x, endY: actPoint.endY + y };
537
+ obj.verLeftLine = { startX: actPoint.startX + x, startY: actPoint.startY - y,
538
+ endX: actPoint.startX - y, endY: actPoint.endY - y };
539
+ obj.verRightLine = { startX: actPoint.endX + x, startY: actPoint.startY + y,
540
+ endX: actPoint.endX - x, endY: actPoint.endY + y };
541
+ obj.topLeftCircle = { startX: actPoint.startX, startY: actPoint.startY,
542
+ radius: obj.horTopLine.endX ? (radius) : 0 };
543
+ obj.topCenterCircle = { startX: actPoint.startX + horCircleWidth, startY: actPoint.startY,
544
+ radius: obj.horTopLine.endX ? (radius) : 0 };
545
+ obj.topRightCircle = { startX: actPoint.endX, startY: actPoint.startY,
546
+ radius: obj.horTopLine.endX ? (radius) : 0 };
547
+ obj.centerLeftCircle = { startX: actPoint.startX, startY: actPoint.startY + verCircleHeight,
548
+ radius: obj.horTopLine.endX ? (radius) : 0 };
549
+ obj.centerRightCircle = { startX: actPoint.endX, startY: actPoint.startY + verCircleHeight,
550
+ radius: obj.horTopLine.endX ? (radius) : 0 };
551
+ obj.bottomLeftCircle = { startX: actPoint.startX, startY: actPoint.endY,
552
+ radius: obj.horTopLine.endX ? (radius) : 0 };
553
+ obj.bottomCenterCircle = { startX: actPoint.startX + horCircleWidth, startY: actPoint.endY,
554
+ radius: obj.horTopLine.endX ? (radius) : 0 };
555
+ obj.bottomRightCircle = { startX: actPoint.endX, startY: actPoint.endY,
556
+ radius: obj.horTopLine.endX ? (radius) : 0 };
557
+ if (obj.rotatedAngle === 0) {
558
+ obj.rotationCirclePoint = { x: obj.bottomCenterCircle.startX,
559
+ y: obj.bottomCenterCircle.startY + 25 };
560
+ obj.rotationCirclePoint.ratioX = (obj.rotationCirclePoint.x - this.parent.img.destLeft) / this.parent.img.destWidth;
561
+ obj.rotationCirclePoint.ratioY = (obj.rotationCirclePoint.y - this.parent.img.destTop) / this.parent.img.destHeight;
562
+ }
563
+ obj.activePoint = actPoint;
564
+ if (isNullOrUndefined(isMouseMove)) {
565
+ this.parent.activeObj = extend({}, obj, {}, true);
566
+ }
567
+ };
568
+ Draw.prototype.drawOuterSelection = function (canvasDraw, isCropCircle) {
569
+ var splitWords;
570
+ var parent = this.parent;
571
+ var actPoint = parent.activeObj.activePoint;
572
+ canvasDraw.lineWidth = (0.5);
573
+ if (parent.activeObj.shape !== undefined) {
574
+ splitWords = parent.activeObj.shape.split('-');
575
+ }
576
+ var tempObj = extend({}, parent.activeObj, {}, true);
577
+ if (parent.activeObj.shape !== undefined) {
578
+ splitWords = parent.activeObj.shape.split('-');
579
+ }
580
+ if (((splitWords !== undefined && splitWords[0] === 'crop') || parent.activeObj.shape === undefined) && !isCropCircle) {
581
+ this.upperContext.fillStyle = 'rgb(0, 0, 0, 0.25)';
582
+ this.upperContext.fillRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
583
+ this.upperContext.clearRect(actPoint.startX, actPoint.startY, actPoint.width, actPoint.height);
584
+ }
585
+ canvasDraw.strokeStyle = parent.themeColl[parent.theme]['primaryColor'];
586
+ canvasDraw.fillStyle = parent.themeColl[parent.theme]['secondaryColor'];
587
+ var degree;
588
+ if (tempObj.shapeDegree === 0) {
589
+ degree = parent.transform.degree;
590
+ }
591
+ else {
592
+ degree = parent.transform.degree - tempObj.shapeDegree;
593
+ }
594
+ if (degree < 0) {
595
+ degree = 360 + degree;
596
+ }
597
+ if (parent.activeObj.shape === 'arrow' || parent.activeObj.shape === 'line') {
598
+ canvasDraw.beginPath();
599
+ canvasDraw.moveTo(actPoint.startX, actPoint.startY);
600
+ canvasDraw.lineTo(actPoint.endX, actPoint.endY);
601
+ canvasDraw.stroke();
602
+ }
603
+ else if (parent.activeObj.shape === 'path') {
604
+ canvasDraw.beginPath();
605
+ var activeObj = extend({}, parent.activeObj, {}, true);
606
+ canvasDraw.moveTo(activeObj.pointColl[0].x, activeObj.pointColl[0].y);
607
+ if (activeObj.pointColl.length > 1) {
608
+ for (var i = 1, len = activeObj.pointColl.length; i < len; i++) {
609
+ actPoint.endX = activeObj.pointColl[i].x;
610
+ actPoint.endY = activeObj.pointColl[i].y;
611
+ canvasDraw.lineTo(actPoint.endX, actPoint.endY);
612
+ }
613
+ }
614
+ var obj = { shape: null };
615
+ parent.notify('selection', { prop: 'getCurrentDrawingShape', value: { obj: obj } });
616
+ if (obj['shape'] === 'path') {
617
+ parent.activeObj = activeObj;
618
+ }
619
+ canvasDraw.lineTo(actPoint.endX, actPoint.endY);
620
+ canvasDraw.stroke();
621
+ }
622
+ else {
623
+ canvasDraw.beginPath();
624
+ canvasDraw.rect(tempObj.activePoint.startX, tempObj.activePoint.startY, tempObj.activePoint.width, tempObj.activePoint.height);
625
+ canvasDraw.stroke();
626
+ canvasDraw.closePath();
627
+ if (parent.selectionSettings.showCircle) {
628
+ var strokeColor = canvasDraw.strokeStyle;
629
+ var fillColor = canvasDraw.fillStyle;
630
+ canvasDraw.strokeStyle = parent.selectionSettings.strokeColor;
631
+ canvasDraw.fillStyle = parent.selectionSettings.fillColor;
632
+ canvasDraw.lineWidth *= 2;
633
+ canvasDraw.beginPath();
634
+ canvasDraw.moveTo(tempObj.topLeftCircle.startX, tempObj.topLeftCircle.startY);
635
+ canvasDraw.arc(tempObj.topLeftCircle.startX, tempObj.topLeftCircle.startY, tempObj.topLeftCircle.radius, 0, 2 * Math.PI);
636
+ canvasDraw.moveTo(tempObj.topRightCircle.startX, tempObj.topRightCircle.startY);
637
+ canvasDraw.arc(tempObj.topRightCircle.startX, tempObj.topRightCircle.startY, tempObj.topRightCircle.radius, 0, 2 * Math.PI);
638
+ canvasDraw.moveTo(tempObj.bottomLeftCircle.startX, tempObj.bottomLeftCircle.startY);
639
+ canvasDraw.arc(tempObj.bottomLeftCircle.startX, tempObj.bottomLeftCircle.startY, tempObj.bottomLeftCircle.radius, 0, 2 * Math.PI);
640
+ canvasDraw.moveTo(tempObj.bottomRightCircle.startX, tempObj.bottomRightCircle.startY);
641
+ canvasDraw.arc(tempObj.bottomRightCircle.startX, tempObj.bottomRightCircle.startY, tempObj.bottomRightCircle.radius, 0, 2 * Math.PI);
642
+ canvasDraw.stroke();
643
+ canvasDraw.fill();
644
+ canvasDraw.closePath();
645
+ canvasDraw.lineWidth /= 2;
646
+ canvasDraw.strokeStyle = strokeColor;
647
+ canvasDraw.fillStyle = fillColor;
648
+ }
649
+ }
650
+ if (parent.selectionSettings.showCircle && (splitWords === undefined || splitWords[0] !== 'crop')) {
651
+ var strokeColor = canvasDraw.strokeStyle;
652
+ var fillColor = canvasDraw.fillStyle;
653
+ canvasDraw.strokeStyle = parent.selectionSettings.strokeColor;
654
+ canvasDraw.fillStyle = parent.selectionSettings.fillColor;
655
+ if (parent.activeObj.shape === 'text') {
656
+ // Text rotation codes
657
+ // canvasDraw.lineWidth *= 2;
658
+ // canvasDraw.beginPath();
659
+ // this.drawRotationArcLine(canvasDraw);
660
+ // canvasDraw.lineTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y);
661
+ // canvasDraw.stroke(); canvasDraw.fill(); canvasDraw.closePath();
662
+ // canvasDraw.beginPath();
663
+ // canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y);
664
+ // canvasDraw.arc(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y,
665
+ // parent.activeObj.bottomCenterCircle.radius, 0, 2 * Math.PI);
666
+ // canvasDraw.stroke();
667
+ // canvasDraw.fill();
668
+ // canvasDraw.closePath();
669
+ // canvasDraw.lineWidth /= 2;
670
+ }
671
+ else {
672
+ this.drawCenterCircles(canvasDraw);
673
+ }
674
+ canvasDraw.strokeStyle = strokeColor;
675
+ canvasDraw.fillStyle = fillColor;
676
+ }
677
+ tempObj.rotationCircleLine = parent.activeObj.rotationCircleLine;
678
+ parent.activeObj = extend({}, tempObj, {}, true);
679
+ };
680
+ Draw.prototype.drawArrowHead = function (canvasDraw, isStartHead) {
681
+ var headType = isStartHead ? this.parent.activeObj.start : this.parent.activeObj.end;
682
+ switch (headType) {
683
+ case 'arrowSolid':
684
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
685
+ isStartHead ? this.arrowSolid(canvasDraw, true) : this.arrowSolid(canvasDraw, false);
686
+ break;
687
+ case 'arrow':
688
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
689
+ isStartHead ? this.arrow(canvasDraw, true) : this.arrow(canvasDraw, false);
690
+ break;
691
+ case 'circleSolid':
692
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
693
+ isStartHead ? this.arrowCircleSolid(canvasDraw, true) : this.arrowCircleSolid(canvasDraw, false);
694
+ break;
695
+ case 'circle':
696
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
697
+ isStartHead ? this.arrowCircle(canvasDraw, true) : this.arrowCircle(canvasDraw, false);
698
+ break;
699
+ case 'bar':
700
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
701
+ isStartHead ? this.arrowBar(canvasDraw, true) : this.arrowBar(canvasDraw, false);
702
+ break;
703
+ case 'square':
704
+ case 'squareSolid':
705
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
706
+ isStartHead ? this.arrowSquareStart(canvasDraw) : this.arrowSquareEnd(canvasDraw);
707
+ break;
708
+ }
709
+ };
710
+ Draw.prototype.drawShapeObj = function (canvas, shape, saveContext, isPreventSelection) {
711
+ var parent = this.parent;
712
+ var actPoint = parent.activeObj.activePoint;
713
+ var currentShape = shape !== undefined ? shape : parent.currObjType.shape;
714
+ parent.currObjType.shape = currentShape;
715
+ var canvasDraw;
716
+ if (canvas.toLowerCase() === 'original') {
717
+ canvasDraw = this.lowerContext;
718
+ }
719
+ else if (canvas.toLowerCase() === 'duplicate') {
720
+ canvasDraw = this.upperContext;
721
+ }
722
+ else if (saveContext) {
723
+ canvasDraw = saveContext;
724
+ }
725
+ if (parent.currObjType.shape.toLowerCase() === 'rectangle' || parent.currObjType.shape.toLowerCase() === 'ellipse'
726
+ || parent.currObjType.shape.toLowerCase() === 'line' || parent.activeObj.shape === 'arrow' ||
727
+ parent.activeObj.shape === 'path') {
728
+ parent.activeObj.shape = parent.currObjType.shape;
729
+ }
730
+ canvasDraw.strokeStyle = parent.activeObj.strokeSettings.strokeColor;
731
+ if (shape === 'text' || shape === 'freehanddraw') {
732
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
733
+ }
734
+ else {
735
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.fillColor;
736
+ }
737
+ var horLineWidth = actPoint.width / 3;
738
+ var verLineHeight = actPoint.height / 3;
739
+ var selectionWidth = actPoint.endX - actPoint.startX;
740
+ var selectionHeight = actPoint.endY - actPoint.startY;
741
+ this.rotateContext('initial', canvasDraw);
742
+ var degree;
743
+ var tempFillStyle = canvasDraw.fillStyle;
744
+ var activeObj;
745
+ switch (parent.currObjType.shape.toLowerCase()) {
746
+ case 'rectangle':
747
+ this.drawSquareLines(canvasDraw);
748
+ if (isNullOrUndefined(isPreventSelection) && canvasDraw === this.upperContext) {
749
+ this.drawOuterSelection(canvasDraw);
750
+ }
751
+ break;
752
+ case 'ellipse':
753
+ selectionWidth = Math.abs(selectionWidth);
754
+ selectionHeight = Math.abs(selectionHeight);
755
+ canvasDraw.beginPath();
756
+ canvasDraw.ellipse(actPoint.startX + (selectionWidth / 2), actPoint.startY + (selectionHeight / 2), selectionWidth / 2, selectionHeight / 2, 0, 0, 2 * Math.PI, false);
757
+ if (parent.activeObj.strokeSettings.fillColor !== '') {
758
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.fillColor;
759
+ canvasDraw.fill();
760
+ }
761
+ canvasDraw.ellipse(actPoint.startX + (selectionWidth / 2), actPoint.startY + (selectionHeight / 2), Math.abs((selectionWidth / 2) - (parent.activeObj.strokeSettings.strokeWidth)), Math.abs((selectionHeight / 2) - (parent.activeObj.strokeSettings.strokeWidth)), 0, 0, 2 * Math.PI, false);
762
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
763
+ canvasDraw.fill('evenodd');
764
+ canvasDraw.closePath();
765
+ if (isNullOrUndefined(isPreventSelection) && canvasDraw === this.upperContext) {
766
+ this.drawOuterSelection(canvasDraw);
767
+ }
768
+ break;
769
+ case 'crop-circle':
770
+ if (canvasDraw === this.lowerContext) {
771
+ canvasDraw = this.upperContext;
772
+ }
773
+ this.shapeCircle(canvasDraw, selectionWidth, selectionHeight);
774
+ break;
775
+ case 'line':
776
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
777
+ if (isNullOrUndefined(isPreventSelection) && canvasDraw === this.upperContext) {
778
+ this.drawOuterSelection(canvasDraw);
779
+ }
780
+ break;
781
+ case 'arrow':
782
+ if (parent.activeObj.shapeDegree === 0) {
783
+ degree = parent.transform.degree;
784
+ }
785
+ else {
786
+ degree = parent.transform.degree - parent.activeObj.shapeDegree;
787
+ }
788
+ if (degree < 0) {
789
+ degree = 360 + degree;
790
+ }
791
+ canvasDraw.fillStyle = canvasDraw.strokeStyle;
792
+ if (isNullOrUndefined(parent.activeObj.triangleDirection)) {
793
+ parent.activeObj.triangleDirection = 'right';
794
+ }
795
+ if (isNullOrUndefined(parent.activeObj.start)) {
796
+ parent.activeObj.start = 'none';
797
+ }
798
+ if (isNullOrUndefined(parent.activeObj.end)) {
799
+ parent.activeObj.end = 'arrowSolid';
800
+ }
801
+ this.drawArrowHead(canvasDraw, true);
802
+ this.drawArrowHead(canvasDraw, false);
803
+ if (parent.activeObj.end === 'none') {
804
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
805
+ }
806
+ canvasDraw.fillStyle = tempFillStyle;
807
+ if (isNullOrUndefined(isPreventSelection) && canvasDraw === this.upperContext) {
808
+ this.drawOuterSelection(canvasDraw);
809
+ }
810
+ break;
811
+ case 'path':
812
+ activeObj = extend({}, parent.activeObj, {}, true);
813
+ if (activeObj.pointColl.length > 1) {
814
+ var obj = { shape: null };
815
+ parent.notify('selection', { prop: 'getCurrentDrawingShape', value: { obj: obj } });
816
+ if (obj['shape'] === 'path') {
817
+ var nextPoint = { x: 0, y: 0 };
818
+ for (var i = 0, len = activeObj.pointColl.length; i < len; i++) {
819
+ if (isNullOrUndefined(activeObj.pointColl[i + 1])) {
820
+ nextPoint.x = activeObj.activePoint.endX;
821
+ nextPoint.y = activeObj.activePoint.endY;
822
+ }
823
+ else {
824
+ nextPoint.x = activeObj.pointColl[i + 1].x;
825
+ nextPoint.y = activeObj.pointColl[i + 1].y;
826
+ }
827
+ actPoint.startX = activeObj.pointColl[i].x;
828
+ actPoint.startY = activeObj.pointColl[i].y;
829
+ actPoint.endX = nextPoint.x;
830
+ actPoint.endY = nextPoint.y;
831
+ parent.activeObj = this.updateWidthHeight(parent.activeObj);
832
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
833
+ }
834
+ }
835
+ else {
836
+ for (var i = 1, len = activeObj.pointColl.length; i < len; i++) {
837
+ actPoint.startX = activeObj.pointColl[i - 1].x;
838
+ actPoint.startY = activeObj.pointColl[i - 1].y;
839
+ actPoint.endX = activeObj.pointColl[i].x;
840
+ actPoint.endY = activeObj.pointColl[i].y;
841
+ parent.activeObj = this.updateWidthHeight(parent.activeObj);
842
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
843
+ }
844
+ }
845
+ parent.activeObj = activeObj;
846
+ }
847
+ else {
848
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
849
+ }
850
+ if (canvasDraw === this.upperContext) {
851
+ this.drawOuterSelection(canvasDraw);
852
+ }
853
+ break;
854
+ case 'text':
855
+ this.shapeText(canvasDraw);
856
+ break;
857
+ case 'crop-square':
858
+ case 'crop-3:4':
859
+ case 'crop-4:3':
860
+ case 'crop-6:9':
861
+ case 'crop-9:6':
862
+ case 'crop-9:16':
863
+ case 'crop-16:9':
864
+ if (canvasDraw === this.lowerContext) {
865
+ canvasDraw = this.upperContext;
866
+ }
867
+ this.drawSelection(horLineWidth, verLineHeight);
868
+ parent.currObjType.shape = '';
869
+ break;
870
+ default:
871
+ this.drawSelection(horLineWidth, verLineHeight);
872
+ break;
873
+ }
874
+ this.rotateContext('reverse', canvasDraw);
875
+ };
876
+ Draw.prototype.updatePoints = function () {
877
+ var parent = this.parent;
878
+ parent.activeObj.activePoint.startX += parent.img.destLeft;
879
+ parent.activeObj.activePoint.startY += parent.img.destTop;
880
+ parent.activeObj.activePoint.endX += parent.img.destLeft;
881
+ parent.activeObj.activePoint.endY += parent.img.destTop;
882
+ parent.activeObj = this.updateWidthHeight(parent.activeObj);
883
+ };
884
+ Draw.prototype.updateWidthHeight = function (obj) {
885
+ obj.activePoint.width = obj.activePoint.endX - obj.activePoint.startX;
886
+ obj.activePoint.height = obj.activePoint.endY - obj.activePoint.startY;
887
+ return obj;
888
+ };
889
+ Draw.prototype.drawCenterCircles = function (canvasDraw) {
890
+ var parent = this.parent;
891
+ var actPoint = parent.activeObj.activePoint;
892
+ canvasDraw.lineWidth *= 2;
893
+ canvasDraw.beginPath();
894
+ if (parent.activeObj.shape === 'arrow' || parent.activeObj.shape === 'line') {
895
+ canvasDraw.moveTo(actPoint.startX, actPoint.startY);
896
+ canvasDraw.arc(actPoint.startX, actPoint.startY, parent.activeObj.topCenterCircle.radius, 0, 2 * Math.PI);
897
+ canvasDraw.moveTo(actPoint.endX, actPoint.endY);
898
+ canvasDraw.arc(actPoint.endX, actPoint.endY, parent.activeObj.bottomCenterCircle.radius, 0, 2 * Math.PI);
899
+ }
900
+ else if (parent.activeObj.shape === 'path') {
901
+ var activeObj = extend({}, parent.activeObj, {}, true);
902
+ if (activeObj.pointColl.length > 1) {
903
+ for (var i = 1, len = activeObj.pointColl.length; i < len; i++) {
904
+ actPoint.startX = activeObj.pointColl[i - 1].x;
905
+ actPoint.startY = activeObj.pointColl[i - 1].y;
906
+ actPoint.endX = activeObj.pointColl[i].x;
907
+ actPoint.endY = activeObj.pointColl[i].y;
908
+ canvasDraw.moveTo(actPoint.startX, actPoint.startY);
909
+ canvasDraw.arc(actPoint.startX, actPoint.startY, parent.activeObj.topCenterCircle.radius, 0, 2 * Math.PI);
910
+ canvasDraw.moveTo(actPoint.endX, actPoint.endY);
911
+ canvasDraw.arc(actPoint.endX, actPoint.endY, parent.activeObj.bottomCenterCircle.radius, 0, 2 * Math.PI);
912
+ }
913
+ }
914
+ var obj = { shape: null };
915
+ parent.notify('selection', { prop: 'getCurrentDrawingShape', value: { obj: obj } });
916
+ if (obj['shape'] === 'path') {
917
+ parent.activeObj = activeObj;
918
+ }
919
+ canvasDraw.moveTo(actPoint.startX, actPoint.startY);
920
+ canvasDraw.arc(actPoint.startX, actPoint.startY, parent.activeObj.topCenterCircle.radius, 0, 2 * Math.PI);
921
+ canvasDraw.moveTo(actPoint.endX, actPoint.endY);
922
+ canvasDraw.arc(actPoint.endX, actPoint.endY, parent.activeObj.bottomCenterCircle.radius, 0, 2 * Math.PI);
923
+ }
924
+ else {
925
+ this.drawRotationArcLine(canvasDraw);
926
+ canvasDraw.lineTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y);
927
+ }
928
+ canvasDraw.stroke();
929
+ canvasDraw.fill();
930
+ canvasDraw.closePath();
931
+ if (parent.activeObj.shape !== 'arrow' && parent.activeObj.shape !== 'line' &&
932
+ parent.activeObj.shape !== 'path') {
933
+ canvasDraw.beginPath();
934
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y);
935
+ canvasDraw.arc(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y, parent.activeObj.bottomCenterCircle.radius, 0, 2 * Math.PI);
936
+ canvasDraw.stroke();
937
+ canvasDraw.fill();
938
+ canvasDraw.closePath();
939
+ }
940
+ canvasDraw.lineWidth /= 2;
941
+ };
942
+ Draw.prototype.drawRotationArcLine = function (canvasDraw) {
943
+ var parent = this.parent;
944
+ if (isNullOrUndefined(parent.activeObj.rotationCircleLine)) {
945
+ parent.activeObj.rotationCircleLine = 22.5;
946
+ }
947
+ var degree;
948
+ var isHorizontalflip = false;
949
+ var isVerticalflip = false;
950
+ if (parent.activeObj.shapeDegree === 0) {
951
+ degree = parent.transform.degree;
952
+ }
953
+ else {
954
+ degree = parent.transform.degree - parent.activeObj.shapeDegree;
955
+ }
956
+ if (degree < 0) {
957
+ degree = 360 + degree;
958
+ }
959
+ for (var i = 0, len = parent.activeObj.flipObjColl.length; i < len; i++) {
960
+ if (parent.activeObj.flipObjColl[i].toLowerCase() === 'horizontal') {
961
+ isHorizontalflip = true;
962
+ }
963
+ else if (parent.activeObj.flipObjColl[i].toLowerCase() === 'vertical') {
964
+ isVerticalflip = true;
965
+ }
966
+ }
967
+ switch (degree) {
968
+ case 0:
969
+ case 360:
970
+ if (isVerticalflip) {
971
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.topCenterCircle.startX,
972
+ y: parent.activeObj.topCenterCircle.startY - parent.activeObj.rotationCircleLine };
973
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y + parent.activeObj.rotationCircleLine);
974
+ }
975
+ else {
976
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.bottomCenterCircle.startX,
977
+ y: parent.activeObj.bottomCenterCircle.startY + parent.activeObj.rotationCircleLine };
978
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y - parent.activeObj.rotationCircleLine);
979
+ }
980
+ break;
981
+ case 90:
982
+ case -270:
983
+ if (isHorizontalflip) {
984
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.centerRightCircle.startX +
985
+ parent.activeObj.rotationCircleLine, y: parent.activeObj.centerLeftCircle.startY };
986
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x - parent.activeObj.rotationCircleLine, parent.activeObj.rotationCirclePoint.y);
987
+ }
988
+ else {
989
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.centerLeftCircle.startX -
990
+ parent.activeObj.rotationCircleLine, y: parent.activeObj.centerLeftCircle.startY };
991
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x + parent.activeObj.rotationCircleLine, parent.activeObj.rotationCirclePoint.y);
992
+ }
993
+ break;
994
+ case 180:
995
+ case -180:
996
+ if (isVerticalflip) {
997
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.bottomCenterCircle.startX,
998
+ y: parent.activeObj.bottomCenterCircle.startY + parent.activeObj.rotationCircleLine };
999
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y - parent.activeObj.rotationCircleLine);
1000
+ }
1001
+ else {
1002
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.topCenterCircle.startX,
1003
+ y: parent.activeObj.topCenterCircle.startY - parent.activeObj.rotationCircleLine };
1004
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x, parent.activeObj.rotationCirclePoint.y + parent.activeObj.rotationCircleLine);
1005
+ }
1006
+ break;
1007
+ case 270:
1008
+ case -90:
1009
+ if (isHorizontalflip) {
1010
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.centerLeftCircle.startX -
1011
+ parent.activeObj.rotationCircleLine, y: parent.activeObj.centerLeftCircle.startY };
1012
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x + parent.activeObj.rotationCircleLine, parent.activeObj.rotationCirclePoint.y);
1013
+ }
1014
+ else {
1015
+ parent.activeObj.rotationCirclePoint = { x: parent.activeObj.centerRightCircle.startX +
1016
+ parent.activeObj.rotationCircleLine, y: parent.activeObj.centerLeftCircle.startY };
1017
+ canvasDraw.moveTo(parent.activeObj.rotationCirclePoint.x - parent.activeObj.rotationCircleLine, parent.activeObj.rotationCirclePoint.y);
1018
+ }
1019
+ break;
1020
+ }
1021
+ };
1022
+ Draw.prototype.drawSquareLines = function (canvasDraw) {
1023
+ var splitWords;
1024
+ var parent = this.parent;
1025
+ var actPoint = parent.activeObj.activePoint;
1026
+ if (parent.activeObj.shape !== undefined) {
1027
+ splitWords = parent.activeObj.shape.split('-');
1028
+ }
1029
+ if (splitWords[0] === 'crop') {
1030
+ canvasDraw.strokeStyle = '#fff';
1031
+ }
1032
+ else {
1033
+ canvasDraw.strokeStyle = parent.activeObj.strokeSettings.strokeColor;
1034
+ }
1035
+ canvasDraw.beginPath();
1036
+ canvasDraw.rect(actPoint.startX, actPoint.startY, actPoint.width, actPoint.height);
1037
+ if (parent.activeObj.strokeSettings.fillColor !== '') {
1038
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.fillColor;
1039
+ canvasDraw.fill();
1040
+ }
1041
+ canvasDraw.rect(actPoint.startX + parent.activeObj.strokeSettings.strokeWidth, actPoint.startY + parent.activeObj.strokeSettings.strokeWidth, actPoint.width - (2 * parent.activeObj.strokeSettings.strokeWidth), actPoint.height - (2 * parent.activeObj.strokeSettings.strokeWidth));
1042
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1043
+ canvasDraw.fill('evenodd');
1044
+ canvasDraw.closePath();
1045
+ };
1046
+ Draw.prototype.drawSelection = function (horLineWidth, verLineHeight) {
1047
+ var parent = this.parent;
1048
+ var actPoint = parent.activeObj.activePoint;
1049
+ this.upperContext.strokeStyle = parent.themeColl[parent.theme]['primaryColor'];
1050
+ this.upperContext.beginPath();
1051
+ parent.activeObj.horTopInnerLine = { startX: actPoint.startX, startY: actPoint.startY +
1052
+ verLineHeight, endX: actPoint.endX, endY: actPoint.endY + verLineHeight };
1053
+ parent.activeObj.horBottomInnerLine = { startX: actPoint.startX, startY: actPoint.startY + (2 * verLineHeight), endX: actPoint.endX, endY: actPoint.endY + (2 * verLineHeight) };
1054
+ parent.activeObj.verLeftInnerLine = { startX: actPoint.startX + horLineWidth,
1055
+ startY: actPoint.startY, endX: actPoint.startX + horLineWidth,
1056
+ endY: actPoint.endY };
1057
+ parent.activeObj.verRightInnerLine = { startX: actPoint.startX + (2 * horLineWidth),
1058
+ startY: actPoint.startY, endX: actPoint.startX + (2 * horLineWidth),
1059
+ endY: actPoint.endY };
1060
+ this.upperContext.moveTo(parent.activeObj.horTopInnerLine.startX, parent.activeObj.horTopInnerLine.startY);
1061
+ this.upperContext.lineTo(parent.activeObj.horTopInnerLine.endX, parent.activeObj.horTopInnerLine.startY);
1062
+ this.upperContext.moveTo(parent.activeObj.horBottomInnerLine.startX, parent.activeObj.horBottomInnerLine.startY);
1063
+ this.upperContext.lineTo(parent.activeObj.horBottomInnerLine.endX, parent.activeObj.horBottomInnerLine.startY);
1064
+ this.upperContext.moveTo(parent.activeObj.verLeftInnerLine.startX, parent.activeObj.verLeftInnerLine.startY);
1065
+ this.upperContext.lineTo(parent.activeObj.verLeftInnerLine.endX, parent.activeObj.verLeftInnerLine.endY);
1066
+ this.upperContext.moveTo(parent.activeObj.verRightInnerLine.startX, parent.activeObj.verRightInnerLine.startY);
1067
+ this.upperContext.lineTo(parent.activeObj.verRightInnerLine.endX, parent.activeObj.verRightInnerLine.endY);
1068
+ this.upperContext.stroke();
1069
+ this.upperContext.closePath();
1070
+ };
1071
+ Draw.prototype.shapeCircle = function (canvasDraw, selectionWidth, selectionHeight) {
1072
+ var parent = this.parent;
1073
+ var actPoint = parent.activeObj.activePoint;
1074
+ canvasDraw.strokeStyle = parent.themeColl[parent.theme]['primaryColor'];
1075
+ canvasDraw.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
1076
+ canvasDraw.fillStyle = 'rgb(0, 0, 0, 0.25)';
1077
+ canvasDraw.fillRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
1078
+ var tempWidth = canvasDraw.lineWidth;
1079
+ canvasDraw.lineWidth = (2);
1080
+ canvasDraw.beginPath();
1081
+ canvasDraw.ellipse(parent.activeObj.horTopLine.startX + (selectionWidth / 2), parent.activeObj.horTopLine.startY
1082
+ + (selectionHeight / 2), selectionWidth / 2, selectionHeight / 2, 0, 0, 2 * Math.PI, false);
1083
+ canvasDraw.stroke();
1084
+ canvasDraw.closePath();
1085
+ canvasDraw.save();
1086
+ canvasDraw.beginPath();
1087
+ canvasDraw.arc(((actPoint.endX - actPoint.startX) / 2) + actPoint.startX, ((actPoint.endY - actPoint.startY) / 2) + actPoint.startY, (actPoint.width / 2), 0, Math.PI * 2);
1088
+ canvasDraw.closePath();
1089
+ canvasDraw.clip();
1090
+ canvasDraw.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
1091
+ canvasDraw.restore();
1092
+ canvasDraw.lineWidth = tempWidth;
1093
+ this.drawOuterSelection(canvasDraw, true);
1094
+ parent.currObjType.shape = '';
1095
+ };
1096
+ Draw.prototype.shapeLine = function (canvasDraw, x1, y1, x2, y2) {
1097
+ var tempLineWidth = canvasDraw.lineWidth;
1098
+ canvasDraw.lineWidth = (this.parent.activeObj.strokeSettings.strokeWidth);
1099
+ canvasDraw.beginPath();
1100
+ canvasDraw.moveTo(x1, y1);
1101
+ canvasDraw.lineTo(x2, y2);
1102
+ canvasDraw.stroke();
1103
+ canvasDraw.lineWidth = tempLineWidth;
1104
+ };
1105
+ Draw.prototype.arrow = function (canvasDraw, start) {
1106
+ var parent = this.parent;
1107
+ var actPoint = parent.activeObj.activePoint;
1108
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1109
+ var x = this.arrowDimension['arrow']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1110
+ var y = this.arrowDimension['arrow']['height'] + parent.activeObj.strokeSettings.strokeWidth;
1111
+ this.dx = actPoint.endX - actPoint.startX;
1112
+ this.dy = actPoint.endY - actPoint.startY;
1113
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1114
+ var angle = Math.atan2(this.dy, this.dx);
1115
+ if ((start && (parent.activeObj.triangleDirection === 'left' || parent.activeObj.triangleDirection === 'right')
1116
+ && (parent.activeObj.start === 'arrow' && parent.activeObj.end === 'none')
1117
+ || (parent.activeObj.start === 'arrow' && parent.activeObj.end !== 'circle'
1118
+ && parent.activeObj.end !== 'square')) ||
1119
+ (!start && (parent.activeObj.end === 'arrow' && parent.activeObj.start === 'none'
1120
+ || parent.activeObj.start !== 'circle' && parent.activeObj.start !== 'square'))) {
1121
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1122
+ }
1123
+ if ((start && parent.activeObj.triangleDirection === 'left') ||
1124
+ (!start && parent.activeObj.triangleDirection === 'right')) {
1125
+ canvasDraw.translate(actPoint.endX, actPoint.endY);
1126
+ canvasDraw.rotate(angle);
1127
+ this.shapeLine(canvasDraw, 0, 0, -x, y / 2);
1128
+ this.shapeLine(canvasDraw, 0, 0, -x, -y / 2);
1129
+ canvasDraw.rotate(-angle);
1130
+ canvasDraw.translate(-actPoint.endX, -actPoint.endY);
1131
+ }
1132
+ else if ((start && parent.activeObj.triangleDirection === 'right') ||
1133
+ (!start && parent.activeObj.triangleDirection === 'left')) {
1134
+ canvasDraw.translate(actPoint.startX, actPoint.startY);
1135
+ canvasDraw.rotate(angle);
1136
+ this.shapeLine(canvasDraw, 0, 0, x, y / 2);
1137
+ this.shapeLine(canvasDraw, 0, 0, x, -y / 2);
1138
+ canvasDraw.rotate(-angle);
1139
+ canvasDraw.translate(-actPoint.startX, -actPoint.startY);
1140
+ }
1141
+ };
1142
+ Draw.prototype.arrowSolid = function (canvasDraw, start) {
1143
+ var parent = this.parent;
1144
+ var actPoint = parent.activeObj.activePoint;
1145
+ var x = this.arrowDimension['arrowSolid']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1146
+ var y = this.arrowDimension['arrowSolid']['height'] + parent.activeObj.strokeSettings.strokeWidth;
1147
+ this.dx = actPoint.endX - actPoint.startX;
1148
+ this.dy = actPoint.endY - actPoint.startY;
1149
+ var angle = Math.atan2(this.dy, this.dx);
1150
+ if ((start && (parent.activeObj.start === 'arrowSolid' && parent.activeObj.end === 'none')
1151
+ || (parent.activeObj.start === 'arrowSolid' && parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square')) ||
1152
+ (!start && (parent.activeObj.end === 'arrowSolid' && parent.activeObj.start === 'none'
1153
+ || parent.activeObj.start !== 'circle' && parent.activeObj.start !== 'square'))) {
1154
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1155
+ }
1156
+ if ((start && parent.activeObj.triangleDirection === 'left') ||
1157
+ (!start && parent.activeObj.triangleDirection === 'right')) {
1158
+ canvasDraw.translate(actPoint.endX, actPoint.endY);
1159
+ canvasDraw.rotate(angle);
1160
+ canvasDraw.beginPath();
1161
+ canvasDraw.moveTo(parent.activeObj.strokeSettings.strokeWidth, 0);
1162
+ canvasDraw.lineTo(-x + y / 2, y / 2);
1163
+ canvasDraw.lineTo(-x + y / 2, -y / 2);
1164
+ canvasDraw.closePath();
1165
+ canvasDraw.fill();
1166
+ canvasDraw.rotate(-angle);
1167
+ canvasDraw.translate(-actPoint.endX, -actPoint.endY);
1168
+ parent.activeObj.rotatedAngle = angle;
1169
+ }
1170
+ else if ((start && parent.activeObj.triangleDirection === 'right') ||
1171
+ (!start && parent.activeObj.triangleDirection === 'left')) {
1172
+ canvasDraw.translate(actPoint.startX, actPoint.startY);
1173
+ canvasDraw.rotate(angle);
1174
+ canvasDraw.beginPath();
1175
+ canvasDraw.moveTo(0 - parent.activeObj.strokeSettings.strokeWidth, 0);
1176
+ canvasDraw.lineTo(x - y / 2, y / 2);
1177
+ canvasDraw.lineTo(x - y / 2, -y / 2);
1178
+ canvasDraw.closePath();
1179
+ canvasDraw.fill();
1180
+ canvasDraw.rotate(-angle);
1181
+ canvasDraw.translate(-actPoint.startX, -actPoint.startY);
1182
+ parent.activeObj.rotatedAngle = angle;
1183
+ }
1184
+ };
1185
+ Draw.prototype.arrowSquareStart = function (canvasDraw) {
1186
+ var parent = this.parent;
1187
+ var actPoint = parent.activeObj.activePoint;
1188
+ if ((parent.activeObj.start === 'square' && parent.activeObj.end === 'none')
1189
+ || (parent.activeObj.start === 'square' && parent.activeObj.end !== 'circle'
1190
+ && parent.activeObj.start !== 'square') || (parent.activeObj.start === 'squareSolid' && parent.activeObj.end === 'circleSolid')) {
1191
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1192
+ }
1193
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1194
+ canvasDraw.beginPath();
1195
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1196
+ var x = this.arrowDimension['square']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1197
+ var y = this.arrowDimension['square']['height'] + parent.activeObj.strokeSettings.strokeWidth;
1198
+ this.dx = actPoint.endX - actPoint.startX;
1199
+ this.dy = actPoint.endY - actPoint.startY;
1200
+ var angle = Math.atan2(this.dy, this.dx);
1201
+ if (parent.activeObj.triangleDirection === 'left') {
1202
+ canvasDraw.translate(actPoint.endX, actPoint.endY);
1203
+ canvasDraw.rotate(angle);
1204
+ if (parent.activeObj.start === 'squareSolid') {
1205
+ canvasDraw.fillRect(-x + y / 2, -y / 2, x, y);
1206
+ }
1207
+ canvasDraw.strokeRect(-x + y / 2, -y / 2, x, y);
1208
+ canvasDraw.rotate(-angle);
1209
+ canvasDraw.translate(-actPoint.endX, -actPoint.endY);
1210
+ this.squareStartIntersectX1 = actPoint.endX - (y / 2) * Math.cos(angle);
1211
+ this.squareStartIntersectY1 = actPoint.endY - (y / 2) * Math.sin(angle);
1212
+ if (parent.activeObj.start === 'square' && parent.activeObj.end !== 'square'
1213
+ && parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square') {
1214
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, this.squareStartIntersectX1, this.squareStartIntersectY1);
1215
+ }
1216
+ if (parent.activeObj.start === 'square' && parent.activeObj.end === 'circle') {
1217
+ this.shapeLine(canvasDraw, this.endCircleIntersectX1, this.endCircleIntersectY1, this.squareStartIntersectX1, this.squareStartIntersectY1);
1218
+ }
1219
+ if (parent.activeObj.start === 'squareSolid' && parent.activeObj.end === 'squareSolid') {
1220
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1221
+ }
1222
+ }
1223
+ else if (parent.activeObj.triangleDirection === 'right') {
1224
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1225
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1226
+ if (parent.activeObj.start === 'squareSolid' && parent.activeObj.end === 'squareSolid') {
1227
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1228
+ }
1229
+ canvasDraw.translate(actPoint.startX, actPoint.startY);
1230
+ canvasDraw.rotate(angle);
1231
+ if (parent.activeObj.start === 'squareSolid') {
1232
+ canvasDraw.fillRect(y / 2 - x, -y / 2, x, y);
1233
+ }
1234
+ canvasDraw.strokeRect(y / 2 - x, -y / 2, x, y);
1235
+ canvasDraw.rotate(-angle);
1236
+ canvasDraw.translate(-actPoint.startX, -actPoint.startY);
1237
+ parent.activeObj.rotatedAngle = angle;
1238
+ this.squareStartIntersectX1 = actPoint.startX + (y / 2) * Math.cos(angle);
1239
+ this.squareStartIntersectY1 = actPoint.startY + (y / 2) * Math.sin(angle);
1240
+ if (parent.activeObj.start === 'square' && parent.activeObj.end !== 'square'
1241
+ && parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square') {
1242
+ this.shapeLine(canvasDraw, actPoint.endX, actPoint.endY, this.squareStartIntersectX1, this.squareStartIntersectY1);
1243
+ }
1244
+ if (parent.activeObj.start === 'square' && parent.activeObj.end === 'circle') {
1245
+ this.shapeLine(canvasDraw, this.endCircleIntersectX1, this.endCircleIntersectY1, this.squareStartIntersectX1, this.squareStartIntersectY1);
1246
+ }
1247
+ }
1248
+ };
1249
+ Draw.prototype.arrowSquareEnd = function (canvasDraw) {
1250
+ var parent = this.parent;
1251
+ var actPoint = parent.activeObj.activePoint;
1252
+ var x = this.arrowDimension['square']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1253
+ var y = this.arrowDimension['square']['height'] + parent.activeObj.strokeSettings.strokeWidth;
1254
+ this.dx = actPoint.endX - actPoint.startX;
1255
+ this.dy = actPoint.endY - actPoint.startY;
1256
+ var angle = Math.atan2(this.dy, this.dx);
1257
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1258
+ if (parent.activeObj.triangleDirection === 'right') {
1259
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1260
+ if (parent.activeObj.end === 'squareSolid' && parent.activeObj.start === 'none') {
1261
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1262
+ }
1263
+ canvasDraw.translate(actPoint.endX, actPoint.endY);
1264
+ canvasDraw.rotate(angle);
1265
+ if (parent.activeObj.end === 'squareSolid') {
1266
+ canvasDraw.fillRect(-x + y / 2, -y / 2, x, y);
1267
+ }
1268
+ canvasDraw.strokeRect(-x + y / 2, -y / 2, x, y);
1269
+ canvasDraw.rotate(-angle);
1270
+ canvasDraw.translate(-actPoint.endX, -actPoint.endY);
1271
+ parent.activeObj.rotatedAngle = angle;
1272
+ this.squareEndIntersectX1 = actPoint.endX - (y / 2) * Math.cos(angle);
1273
+ this.squareEndIntersectY1 = actPoint.endY - (y / 2) * Math.sin(angle);
1274
+ if (parent.activeObj.end === 'square' && parent.activeObj.start !== 'square' && parent.activeObj.start !== 'circle'
1275
+ && parent.activeObj.end === 'square') {
1276
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, this.squareEndIntersectX1, this.squareEndIntersectY1);
1277
+ }
1278
+ else if ((parent.activeObj.start === 'circle') && parent.activeObj.end === 'square') {
1279
+ this.shapeLine(canvasDraw, this.squareEndIntersectX1, this.squareEndIntersectY1, this.startCircleIntersectX1, this.startCircleIntersectY1);
1280
+ }
1281
+ else if ((parent.activeObj.start === 'square') && parent.activeObj.end === 'square') {
1282
+ this.shapeLine(canvasDraw, this.squareEndIntersectX1, this.squareEndIntersectY1, this.squareStartIntersectX1, this.squareStartIntersectY1);
1283
+ }
1284
+ }
1285
+ else if (parent.activeObj.triangleDirection === 'left') {
1286
+ canvasDraw.translate(actPoint.startX, actPoint.startY);
1287
+ canvasDraw.rotate(angle);
1288
+ if (parent.activeObj.end === 'squareSolid') {
1289
+ canvasDraw.fillRect(y / 2 - x, -y / 2, x, y);
1290
+ }
1291
+ canvasDraw.strokeRect(y / 2 - x, -y / 2, x, y);
1292
+ canvasDraw.rotate(-angle);
1293
+ canvasDraw.translate(-actPoint.startX, -actPoint.startY);
1294
+ parent.activeObj.rotatedAngle = angle;
1295
+ this.squareEndIntersectX1 = actPoint.startX + (y / 2) * Math.cos(angle);
1296
+ this.squareEndIntersectY1 = actPoint.startY + (y / 2) * Math.sin(angle);
1297
+ if (parent.activeObj.end === 'square' && parent.activeObj.start !== 'square' &&
1298
+ parent.activeObj.start !== 'circle' && parent.activeObj.end === 'square') {
1299
+ this.shapeLine(canvasDraw, actPoint.endX, actPoint.endY, this.squareEndIntersectX1, this.squareEndIntersectY1);
1300
+ }
1301
+ else if ((parent.activeObj.start === 'circle') && parent.activeObj.end === 'square') {
1302
+ this.shapeLine(canvasDraw, this.squareEndIntersectX1, this.squareEndIntersectY1, this.startCircleIntersectX1, this.startCircleIntersectY1);
1303
+ }
1304
+ else if ((parent.activeObj.start === 'square') && parent.activeObj.end === 'square') {
1305
+ this.shapeLine(canvasDraw, this.squareEndIntersectX1, this.squareEndIntersectY1, this.squareStartIntersectX1, this.squareStartIntersectY1);
1306
+ }
1307
+ }
1308
+ };
1309
+ Draw.prototype.arrowCircle = function (canvasDraw, start) {
1310
+ var parent = this.parent;
1311
+ var actPoint = parent.activeObj.activePoint;
1312
+ if ((start && parent.activeObj.triangleDirection === 'left') ||
1313
+ (!start && parent.activeObj.triangleDirection === 'right')) {
1314
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1315
+ var circleRadius = this.arrowDimension['circle']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1316
+ canvasDraw.beginPath();
1317
+ canvasDraw.arc(actPoint.endX, actPoint.endY, circleRadius, 0, 2 * Math.PI);
1318
+ canvasDraw.stroke();
1319
+ canvasDraw.closePath();
1320
+ this.dx = actPoint.endX - actPoint.startX;
1321
+ this.dy = actPoint.endY - actPoint.startY;
1322
+ var a = this.dx * this.dx + this.dy * this.dy;
1323
+ var b = 2 * (this.dx * (actPoint.startX - actPoint.endX) + this.dy * (actPoint.startY - actPoint.endY));
1324
+ var c = (actPoint.startX - actPoint.endX) *
1325
+ (actPoint.startX - actPoint.endX) +
1326
+ (actPoint.startY - actPoint.endY) *
1327
+ (actPoint.startY - actPoint.endY) - circleRadius * circleRadius;
1328
+ var intersect = b * b - 4 * a * c;
1329
+ if (intersect >= 0) {
1330
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1331
+ var t2 = (-b - Math.sqrt(intersect)) / (2 * a);
1332
+ var intersectionX1 = actPoint.startX + this.dx * t2;
1333
+ var intersectionY1 = actPoint.startY + this.dy * t2;
1334
+ if (start) {
1335
+ this.startCircleIntersectX1 = intersectionX1;
1336
+ this.startCircleIntersectY1 = intersectionY1;
1337
+ canvasDraw.beginPath();
1338
+ canvasDraw.fill();
1339
+ canvasDraw.beginPath();
1340
+ if (parent.activeObj.start === 'circle' && parent.activeObj.end === 'circle') {
1341
+ this.shapeLine(canvasDraw, this.startCircleIntersectX1, this.startCircleIntersectY1, this.endCircleIntersectX1, this.endCircleIntersectY1);
1342
+ }
1343
+ else if (parent.activeObj.start === 'circle' && parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square') {
1344
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, this.startCircleIntersectX1, this.startCircleIntersectY1);
1345
+ }
1346
+ canvasDraw.stroke();
1347
+ canvasDraw.closePath();
1348
+ }
1349
+ else {
1350
+ this.endCircleIntersectX1 = intersectionX1;
1351
+ this.endCircleIntersectY1 = intersectionY1;
1352
+ if (parent.activeObj.end === 'circle' && (parent.activeObj.start !== 'circle' && parent.activeObj.start !== 'square')) {
1353
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, this.endCircleIntersectX1, this.endCircleIntersectY1);
1354
+ }
1355
+ }
1356
+ }
1357
+ var angle = Math.atan2(this.dy, this.dx);
1358
+ parent.activeObj.rotatedAngle = angle;
1359
+ }
1360
+ else if ((start && parent.activeObj.triangleDirection === 'right') ||
1361
+ (!start && parent.activeObj.triangleDirection === 'left')) {
1362
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1363
+ var circleRadius = this.arrowDimension['circle']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1364
+ canvasDraw.beginPath();
1365
+ canvasDraw.arc(actPoint.startX, actPoint.startY, circleRadius, 0, 2 * Math.PI);
1366
+ canvasDraw.stroke();
1367
+ canvasDraw.closePath();
1368
+ this.dx = actPoint.startX - actPoint.endX;
1369
+ this.dy = actPoint.startY - actPoint.endY;
1370
+ var a = this.dx * this.dx + this.dy * this.dy;
1371
+ var b = 2 * (this.dx * (actPoint.endX - actPoint.startX) +
1372
+ this.dy * (actPoint.endY - actPoint.startY));
1373
+ var c = (actPoint.endX - actPoint.startX) *
1374
+ (actPoint.endX - actPoint.startX) +
1375
+ (actPoint.endY - actPoint.startY) *
1376
+ (actPoint.endY - actPoint.startY) - circleRadius * circleRadius;
1377
+ var intersect = b * b - 4 * a * c;
1378
+ if (intersect >= 0) {
1379
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1380
+ var t2 = (-b - Math.sqrt(intersect)) / (2 * a);
1381
+ var intersectionX1 = actPoint.endX + this.dx * t2;
1382
+ var intersectionY1 = actPoint.endY + this.dy * t2;
1383
+ if (start) {
1384
+ this.startCircleIntersectX1 = intersectionX1;
1385
+ this.startCircleIntersectY1 = intersectionY1;
1386
+ if (parent.activeObj.start === 'circle' && parent.activeObj.end === 'circle') {
1387
+ this.shapeLine(canvasDraw, this.endCircleIntersectX1, this.endCircleIntersectY1, this.startCircleIntersectX1, this.startCircleIntersectY1);
1388
+ }
1389
+ else if (parent.activeObj.start === 'circle' && parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square') {
1390
+ this.shapeLine(canvasDraw, actPoint.endX, actPoint.endY, this.startCircleIntersectX1, this.startCircleIntersectY1);
1391
+ }
1392
+ }
1393
+ else {
1394
+ this.endCircleIntersectX1 = intersectionX1;
1395
+ this.endCircleIntersectY1 = intersectionY1;
1396
+ canvasDraw.beginPath();
1397
+ canvasDraw.fill();
1398
+ canvasDraw.beginPath();
1399
+ if (parent.activeObj.end === 'circle' && (parent.activeObj.start !== 'circle' && parent.activeObj.start !== 'square')) {
1400
+ this.shapeLine(canvasDraw, actPoint.endX, actPoint.endY, this.endCircleIntersectX1, this.endCircleIntersectY1);
1401
+ }
1402
+ }
1403
+ }
1404
+ var angle = Math.atan2(this.dy, this.dx);
1405
+ parent.activeObj.rotatedAngle = angle;
1406
+ }
1407
+ };
1408
+ Draw.prototype.arrowCircleSolid = function (canvasDraw, start) {
1409
+ var parent = this.parent;
1410
+ var actPoint = parent.activeObj.activePoint;
1411
+ if ((start && parent.activeObj.triangleDirection === 'left') ||
1412
+ (!start && parent.activeObj.triangleDirection === 'right')) {
1413
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1414
+ canvasDraw.beginPath();
1415
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1416
+ if ((start && (parent.activeObj.start === 'circleSolid' && parent.activeObj.end === 'none') ||
1417
+ (parent.activeObj.start === 'circleSolid' && parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square')) ||
1418
+ (!start && (parent.activeObj.end === 'circleSolid' && parent.activeObj.start === 'none'))) {
1419
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1420
+ }
1421
+ var circleRadius = this.arrowDimension['circle']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1422
+ this.dx = actPoint.endX - actPoint.startX;
1423
+ this.dy = actPoint.endY - actPoint.startY;
1424
+ canvasDraw.save();
1425
+ canvasDraw.beginPath();
1426
+ canvasDraw.arc(actPoint.endX, actPoint.endY, circleRadius, 0, 2 * Math.PI);
1427
+ canvasDraw.stroke();
1428
+ canvasDraw.fill();
1429
+ canvasDraw.closePath();
1430
+ parent.activeObj.rotatedAngle = Math.atan2(this.dy, this.dx);
1431
+ }
1432
+ else if ((start && parent.activeObj.triangleDirection === 'right') ||
1433
+ (!start && parent.activeObj.triangleDirection === 'left')) {
1434
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1435
+ canvasDraw.beginPath();
1436
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1437
+ if ((start && (parent.activeObj.start === 'circleSolid' && parent.activeObj.end === 'none') ||
1438
+ (parent.activeObj.start === 'circleSolid' && parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square')) ||
1439
+ !start && (parent.activeObj.end === 'circleSolid' && parent.activeObj.start === 'none')) {
1440
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1441
+ }
1442
+ var circleRadius = this.arrowDimension['circle']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1443
+ this.dx = actPoint.endX - actPoint.startX;
1444
+ this.dy = actPoint.endY - actPoint.startY;
1445
+ canvasDraw.save();
1446
+ canvasDraw.beginPath();
1447
+ canvasDraw.arc(actPoint.startX, actPoint.startY, circleRadius, 0, 2 * Math.PI);
1448
+ canvasDraw.stroke();
1449
+ canvasDraw.fill();
1450
+ canvasDraw.closePath();
1451
+ parent.activeObj.rotatedAngle = Math.atan2(this.dy, this.dx);
1452
+ }
1453
+ };
1454
+ Draw.prototype.arrowBar = function (canvasDraw, start) {
1455
+ var parent = this.parent;
1456
+ var actPoint = parent.activeObj.activePoint;
1457
+ if ((start && parent.activeObj.triangleDirection === 'left') ||
1458
+ (!start && parent.activeObj.triangleDirection === 'right')) {
1459
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1460
+ canvasDraw.beginPath();
1461
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1462
+ if ((start && (parent.activeObj.start === 'bar' && parent.activeObj.end === 'none') ||
1463
+ (parent.activeObj.start === 'bar' && (parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square'))) ||
1464
+ (!start && ((parent.activeObj.end === 'bar' && parent.activeObj.start === 'none') ||
1465
+ (parent.activeObj.end === 'bar' && (parent.activeObj.start !== 'circle' && parent.activeObj.start !== 'square'))))) {
1466
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1467
+ }
1468
+ var x = this.arrowDimension['bar']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1469
+ var y = this.arrowDimension['bar']['height'] + parent.activeObj.strokeSettings.strokeWidth;
1470
+ this.dx = actPoint.endX - actPoint.startX;
1471
+ this.dy = actPoint.endY - actPoint.startY;
1472
+ var angle = Math.atan2(this.dy, this.dx);
1473
+ canvasDraw.translate(actPoint.endX, actPoint.endY);
1474
+ canvasDraw.rotate(angle);
1475
+ canvasDraw.fillRect(-x + y / 4, -y / 2, x, y);
1476
+ canvasDraw.rotate(-angle);
1477
+ canvasDraw.translate(-actPoint.endX, -actPoint.endY);
1478
+ parent.activeObj.rotatedAngle = angle;
1479
+ }
1480
+ else if ((start && parent.activeObj.triangleDirection === 'right') ||
1481
+ (!start && parent.activeObj.triangleDirection === 'left')) {
1482
+ canvasDraw.lineWidth = (parent.activeObj.strokeSettings.strokeWidth);
1483
+ canvasDraw.beginPath();
1484
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1485
+ if ((start && (parent.activeObj.start === 'bar' && parent.activeObj.end === 'none')
1486
+ || (parent.activeObj.start === 'bar' && (parent.activeObj.end !== 'circle' && parent.activeObj.end !== 'square'))) ||
1487
+ (!start && (parent.activeObj.end === 'bar' && parent.activeObj.start === 'none'))) {
1488
+ this.shapeLine(canvasDraw, actPoint.startX, actPoint.startY, actPoint.endX, actPoint.endY);
1489
+ }
1490
+ var x = this.arrowDimension['bar']['width'] + parent.activeObj.strokeSettings.strokeWidth;
1491
+ var y = this.arrowDimension['bar']['height'] + parent.activeObj.strokeSettings.strokeWidth;
1492
+ this.dx = actPoint.endX - actPoint.startX;
1493
+ this.dy = actPoint.endY - actPoint.startY;
1494
+ var angle = Math.atan2(this.dy, this.dx);
1495
+ canvasDraw.translate(actPoint.startX, actPoint.startY);
1496
+ canvasDraw.rotate(angle);
1497
+ canvasDraw.fillRect(y / 4 - x, -y / 2, x, y);
1498
+ canvasDraw.rotate(-angle);
1499
+ canvasDraw.translate(-actPoint.startX, -actPoint.startY);
1500
+ parent.activeObj.rotatedAngle = angle;
1501
+ }
1502
+ };
1503
+ Draw.prototype.shapeText = function (canvasDraw) {
1504
+ var parent = this.parent;
1505
+ var actPoint = parent.activeObj.activePoint;
1506
+ var rows = parent.activeObj.keyHistory.split('\n');
1507
+ var height = parent.activeObj.textSettings.fontSize + parent.activeObj.textSettings.fontSize * 0.25;
1508
+ var lineHeight = ((height * rows.length) - (parent.activeObj.textSettings.fontSize * rows.length)) / rows.length;
1509
+ for (var i = 0; i < rows.length; i++) {
1510
+ var text = rows[i];
1511
+ var yPoint = ((i + 1) * parent.activeObj.textSettings.fontSize * 0.85) + (i * lineHeight);
1512
+ if (parent.transform.degree === -360) {
1513
+ parent.transform.degree = 0;
1514
+ }
1515
+ if (parent.transform.degree === 0 || parent.transform.degree === 180) {
1516
+ if (parent.activeObj.textSettings.fontSize > actPoint.height) {
1517
+ parent.activeObj.textSettings.fontSize = actPoint.height -
1518
+ (actPoint.height * 0.1);
1519
+ }
1520
+ }
1521
+ else {
1522
+ if (parent.activeObj.textSettings.fontSize > actPoint.width) {
1523
+ parent.activeObj.textSettings.fontSize = actPoint.width -
1524
+ (actPoint.width * 0.1);
1525
+ }
1526
+ }
1527
+ canvasDraw.strokeStyle = parent.activeObj.strokeSettings.strokeColor;
1528
+ canvasDraw.fillStyle = parent.activeObj.strokeSettings.strokeColor;
1529
+ var textStyle = '';
1530
+ if (parent.activeObj.textSettings.bold) {
1531
+ textStyle = 'bold ';
1532
+ }
1533
+ if (parent.activeObj.textSettings.italic) {
1534
+ textStyle = 'italic ';
1535
+ }
1536
+ if (parent.activeObj.textSettings.bold && parent.activeObj.textSettings.italic) {
1537
+ textStyle = 'italic bold ';
1538
+ }
1539
+ canvasDraw.font = textStyle + parent.activeObj.textSettings.fontSize + 'px' + ' ' +
1540
+ parent.activeObj.textSettings.fontFamily;
1541
+ if (parent.activeObj.flipObjColl.length === 4) {
1542
+ parent.activeObj.flipObjColl = [];
1543
+ }
1544
+ for (var j = 0, len = parent.activeObj.flipObjColl.length; j < len; j++) {
1545
+ if (parent.activeObj.flipObjColl[j].toLowerCase() === 'horizontal') {
1546
+ canvasDraw.translate(canvasDraw.canvas.width, 0);
1547
+ canvasDraw.scale(-1, 1);
1548
+ this.updateActPoint('horizontal', canvasDraw);
1549
+ }
1550
+ else if (parent.activeObj.flipObjColl[j].toLowerCase() === 'vertical') {
1551
+ canvasDraw.translate(0, canvasDraw.canvas.height);
1552
+ canvasDraw.scale(1, -1);
1553
+ this.updateActPoint('vertical', canvasDraw);
1554
+ }
1555
+ }
1556
+ if (parent.activeObj.shapeDegree !== parent.transform.degree) {
1557
+ this.rotateText(canvasDraw);
1558
+ }
1559
+ else {
1560
+ canvasDraw.fillText(text, actPoint.startX + parent.activeObj.textSettings.fontSize * 0.1, actPoint.startY + yPoint);
1561
+ }
1562
+ for (var k = 0, len = parent.activeObj.flipObjColl.length; k < len; k++) {
1563
+ if (parent.activeObj.flipObjColl[k].toLowerCase() === 'horizontal') {
1564
+ canvasDraw.translate(canvasDraw.canvas.width, 0);
1565
+ canvasDraw.scale(-1, 1);
1566
+ this.updateActPoint('horizontal', canvasDraw);
1567
+ }
1568
+ else if (parent.activeObj.flipObjColl[k].toLowerCase() === 'vertical') {
1569
+ canvasDraw.translate(0, canvasDraw.canvas.height);
1570
+ canvasDraw.scale(1, -1);
1571
+ this.updateActPoint('vertical', canvasDraw);
1572
+ }
1573
+ }
1574
+ }
1575
+ parent.currObjType.isText = false;
1576
+ };
1577
+ Draw.prototype.updateActPoint = function (degree, canvasDraw) {
1578
+ var parent = this.parent;
1579
+ var actPoint = parent.activeObj.activePoint;
1580
+ if (degree.toLowerCase() === 'horizontal') {
1581
+ if (actPoint.startX <= canvasDraw.canvas.width / 2) {
1582
+ actPoint.startX = canvasDraw.canvas.width / 2 + ((canvasDraw.canvas.width / 2) -
1583
+ actPoint.endX);
1584
+ actPoint.endX = actPoint.startX +
1585
+ actPoint.width;
1586
+ this.updateActiveObject(actPoint, parent.activeObj);
1587
+ }
1588
+ else if (actPoint.startX >= canvasDraw.canvas.width / 2) {
1589
+ actPoint.startX = canvasDraw.canvas.width - actPoint.endX;
1590
+ actPoint.endX = actPoint.startX +
1591
+ actPoint.width;
1592
+ this.updateActiveObject(actPoint, parent.activeObj);
1593
+ }
1594
+ }
1595
+ else if (degree.toLowerCase() === 'vertical') {
1596
+ if (actPoint.startY <= canvasDraw.canvas.height / 2) {
1597
+ actPoint.startY = canvasDraw.canvas.height / 2 + ((canvasDraw.canvas.height / 2) - actPoint.endY);
1598
+ actPoint.endY = actPoint.startY + actPoint.height;
1599
+ this.updateActiveObject(actPoint, parent.activeObj);
1600
+ }
1601
+ else if (actPoint.startY >= canvasDraw.canvas.height / 2) {
1602
+ actPoint.startY = canvasDraw.canvas.height - actPoint.endY;
1603
+ actPoint.endY = actPoint.startY + actPoint.height;
1604
+ this.updateActiveObject(actPoint, parent.activeObj);
1605
+ }
1606
+ }
1607
+ };
1608
+ Draw.prototype.rotateText = function (canvasDraw) {
1609
+ var parent = this.parent;
1610
+ var startX = parent.activeObj.activePoint.startX;
1611
+ var startY = parent.activeObj.activePoint.startY;
1612
+ var degree;
1613
+ var actPoint = parent.activeObj.activePoint;
1614
+ if (parent.activeObj.shapeDegree === 0) {
1615
+ degree = parent.transform.degree;
1616
+ }
1617
+ else {
1618
+ degree = parent.transform.degree - parent.activeObj.shapeDegree;
1619
+ }
1620
+ if (degree < 0) {
1621
+ degree = 360 + degree;
1622
+ }
1623
+ if (degree % 360 === 0 && (parent.transform.degree !== -360 || parent.transform.currFlipState === '')) {
1624
+ startX = actPoint.startX + parent.activeObj.textSettings.fontSize * 0.15;
1625
+ startY = actPoint.startY + (actPoint.endY - actPoint.startY);
1626
+ var rows = parent.activeObj.keyHistory.split('\n');
1627
+ for (var i = 0; i < rows.length; i++) {
1628
+ startY = actPoint.startY + (i * parent.activeObj.textSettings.fontSize + parent.activeObj.textSettings.fontSize * 0.25);
1629
+ canvasDraw.fillText(rows[i], startX, startY);
1630
+ }
1631
+ }
1632
+ else if (degree % 90 === 0 && degree % 180 !== 0) {
1633
+ canvasDraw.translate(parent.lowerCanvas.width / 2, parent.lowerCanvas.height / 2);
1634
+ canvasDraw.rotate(Math.PI / 180 * degree);
1635
+ canvasDraw.translate(-parent.lowerCanvas.height / 2, -parent.lowerCanvas.width / 2);
1636
+ if (degree % 90 === 0 && degree % 270 !== 0) {
1637
+ startY = (parent.lowerCanvas.width - actPoint.endX) +
1638
+ parent.activeObj.textSettings.fontSize * 0.4;
1639
+ startX = actPoint.startY;
1640
+ }
1641
+ else if (degree % 270 === 0) {
1642
+ startX = parent.lowerCanvas.height - actPoint.endY;
1643
+ startY = actPoint.startX + parent.activeObj.textSettings.fontSize * 0.4;
1644
+ }
1645
+ this.textFlipDegree(canvasDraw, startX, startY);
1646
+ canvasDraw.translate(parent.lowerCanvas.height / 2, parent.lowerCanvas.width / 2);
1647
+ canvasDraw.rotate(Math.PI / 180 * -degree);
1648
+ canvasDraw.translate(-parent.lowerCanvas.width / 2, -parent.lowerCanvas.height / 2);
1649
+ }
1650
+ else {
1651
+ canvasDraw.translate(parent.lowerCanvas.width / 2, parent.lowerCanvas.height / 2);
1652
+ canvasDraw.rotate(Math.PI / 180 * degree);
1653
+ startX = parent.lowerCanvas.width - actPoint.endX;
1654
+ startY = (parent.lowerCanvas.height - actPoint.endY) +
1655
+ parent.activeObj.textSettings.fontSize * 0.4;
1656
+ canvasDraw.translate(-parent.lowerCanvas.width / 2, -parent.lowerCanvas.height / 2);
1657
+ this.textFlipDegree(canvasDraw, startX, startY);
1658
+ canvasDraw.translate(parent.lowerCanvas.width / 2, parent.lowerCanvas.height / 2);
1659
+ canvasDraw.rotate(Math.PI / 180 * -degree);
1660
+ canvasDraw.translate(-parent.lowerCanvas.width / 2, -parent.lowerCanvas.height / 2);
1661
+ }
1662
+ if (parent.transform.degree === 360 || parent.transform.degree === -360) {
1663
+ parent.transform.degree = 0;
1664
+ }
1665
+ };
1666
+ Draw.prototype.textFlipDegree = function (canvasDraw, startX, startY) {
1667
+ var parent = this.parent;
1668
+ var rows = parent.activeObj.keyHistory.split('\n');
1669
+ var height = parent.activeObj.textSettings.fontSize;
1670
+ var lineHeight = ((height * rows.length) - (parent.activeObj.textSettings.fontSize * rows.length)) / rows.length;
1671
+ var yPoint = (parent.activeObj.textSettings.fontSize * 0.85) + lineHeight;
1672
+ for (var i = 0; i < rows.length; i++) {
1673
+ var text = rows[i];
1674
+ if (i > 0) {
1675
+ if (i === 1) {
1676
+ yPoint -= (parent.activeObj.textSettings.fontSize * 0.85);
1677
+ }
1678
+ yPoint += parent.activeObj.textSettings.fontSize + parent.activeObj.textSettings.fontSize * 0.15;
1679
+ }
1680
+ canvasDraw.fillText(text, startX + parent.activeObj.textSettings.fontSize * 0.15, startY +
1681
+ yPoint + (i > 0 ? parent.activeObj.textSettings.fontSize * 0.25 : -parent.activeObj.textSettings.fontSize * 0.35));
1682
+ }
1683
+ };
1684
+ Draw.prototype.clearOuterCanvas = function (context) {
1685
+ var parent = this.parent;
1686
+ var destLeft = parent.img.destLeft;
1687
+ var destTop = parent.img.destTop;
1688
+ if (parent.img.destWidth < parent.lowerCanvas.width) {
1689
+ var left = parent.img.destLeft > 0 ? parent.img.destLeft : 0;
1690
+ context.clearRect(0, 0, left, parent.lowerCanvas.height);
1691
+ context.clearRect(parent.img.destLeft + parent.img.destWidth, 0, left, parent.lowerCanvas.height);
1692
+ }
1693
+ if (parent.img.destHeight < parent.lowerCanvas.height) {
1694
+ var top_1 = parent.img.destTop > 0 ? parent.img.destTop : 0;
1695
+ context.clearRect(0, 0, parent.lowerCanvas.width, top_1);
1696
+ context.clearRect(0, parent.img.destTop + parent.img.destHeight, parent.lowerCanvas.width, top_1);
1697
+ }
1698
+ if (parent.transform.currFlipState !== '') {
1699
+ parent.img.destLeft = destLeft;
1700
+ parent.img.destTop = destTop;
1701
+ }
1702
+ };
1703
+ Draw.prototype.setDestPoints = function () {
1704
+ var maxDimension;
1705
+ var parent = this.parent;
1706
+ if (parent.transform.degree % 90 === 0 && parent.transform.degree % 180 !== 0) {
1707
+ var obj = { width: 0, height: 0 };
1708
+ parent.notify('transform', { prop: 'calcMaxDimension', onPropertyChange: false,
1709
+ value: { width: parent.img.srcHeight, height: parent.img.srcWidth, obj: obj } });
1710
+ maxDimension = obj;
1711
+ if (this.isRotateZoom) {
1712
+ maxDimension.width += (maxDimension.width * parent.transform.zoomFactor);
1713
+ maxDimension.height += (maxDimension.height * parent.transform.zoomFactor);
1714
+ parent.img.destWidth = maxDimension.height;
1715
+ parent.img.destHeight = maxDimension.width;
1716
+ }
1717
+ parent.img.destLeft = (parent.lowerCanvas.clientWidth - maxDimension.height) / 2;
1718
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.width) / 2;
1719
+ parent.img.destWidth = maxDimension.height;
1720
+ parent.img.destHeight = maxDimension.width;
1721
+ }
1722
+ else {
1723
+ var obj = { width: 0, height: 0 };
1724
+ parent.notify('transform', { prop: 'calcMaxDimension', onPropertyChange: false,
1725
+ value: { width: parent.img.srcWidth, height: parent.img.srcHeight, obj: obj } });
1726
+ maxDimension = obj;
1727
+ if (this.isRotateZoom) {
1728
+ maxDimension.width += (maxDimension.width * parent.transform.zoomFactor);
1729
+ maxDimension.height += (maxDimension.height * parent.transform.zoomFactor);
1730
+ parent.img.destWidth = maxDimension.width;
1731
+ parent.img.destHeight = maxDimension.height;
1732
+ }
1733
+ parent.img.destLeft = (parent.lowerCanvas.clientWidth - maxDimension.width) / 2;
1734
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height) / 2;
1735
+ parent.img.destWidth = maxDimension.width;
1736
+ parent.img.destHeight = maxDimension.height;
1737
+ }
1738
+ };
1739
+ Draw.prototype.updateCurrTransState = function (type, isPreventDestination, isRotatePan) {
1740
+ var parent = this.parent;
1741
+ var destLeft = parent.img.destLeft;
1742
+ var destTop = parent.img.destTop;
1743
+ if (type === 'initial') {
1744
+ this.lowerContext.setTransform(1, 0, 0, 1, 0, 0);
1745
+ if (isNullOrUndefined(isPreventDestination)) {
1746
+ this.setDestPoints();
1747
+ }
1748
+ }
1749
+ this.currTransState(type, null, null, isRotatePan);
1750
+ if (parent.transform.degree === 0 && parent.transform.currFlipState === '') {
1751
+ parent.img.destLeft = destLeft;
1752
+ parent.img.destTop = destTop;
1753
+ }
1754
+ if (parent.isCircleCrop || (parent.currSelectionPoint && parent.currSelectionPoint.shape === 'crop-circle')) {
1755
+ if (isRotatePan) {
1756
+ parent.img.destLeft += parent.panPoint.totalPannedClientPoint.x;
1757
+ parent.img.destTop +=
1758
+ parent.panPoint.totalPannedClientPoint.y;
1759
+ }
1760
+ parent.notify('crop', { prop: 'cropCircle', onPropertyChange: false,
1761
+ value: { context: this.lowerContext, isSave: null, isFlip: null } });
1762
+ if (isRotatePan) {
1763
+ parent.img.destLeft -= parent.panPoint.totalPannedClientPoint.x;
1764
+ parent.img.destTop -=
1765
+ parent.panPoint.totalPannedClientPoint.y;
1766
+ }
1767
+ }
1768
+ };
1769
+ Draw.prototype.currTransState = function (type, isPreventDimension, context, isPreventCircleCrop) {
1770
+ var parent = this.parent;
1771
+ context = context ? context : this.lowerContext;
1772
+ if (type === 'initial') {
1773
+ this.setTransformColl(context, type);
1774
+ }
1775
+ else if (type === 'reverse') {
1776
+ this.setTransformColl(context, type);
1777
+ this.setClientTransDim(isPreventDimension);
1778
+ if (parent.isCircleCrop || (parent.currSelectionPoint && parent.currSelectionPoint.shape === 'crop-circle'
1779
+ && isNullOrUndefined(isPreventCircleCrop))) {
1780
+ if (isPreventCircleCrop) {
1781
+ parent.img.destLeft += parent.panPoint.totalPannedClientPoint.x;
1782
+ parent.img.destTop += parent.panPoint.totalPannedClientPoint.y;
1783
+ }
1784
+ parent.notify('crop', { prop: 'cropCircle', onPropertyChange: false,
1785
+ value: { context: this.lowerContext, isSave: null, isFlip: null } });
1786
+ if (isPreventCircleCrop) {
1787
+ parent.img.destLeft -= parent.panPoint.totalPannedClientPoint.x;
1788
+ parent.img.destTop -= parent.panPoint.totalPannedClientPoint.y;
1789
+ }
1790
+ }
1791
+ }
1792
+ };
1793
+ Draw.prototype.setTransformColl = function (context, type) {
1794
+ var parent = this.parent;
1795
+ if (type === 'initial') {
1796
+ for (var i = 0, len = parent.rotateFlipColl.length; i < len; i++) {
1797
+ this.setTransform(context, parent.rotateFlipColl[i]);
1798
+ }
1799
+ }
1800
+ else if (type === 'reverse') {
1801
+ for (var i = parent.rotateFlipColl.length - 1; i >= 0; i--) {
1802
+ this.setTransform(context, parent.rotateFlipColl[i], true);
1803
+ }
1804
+ }
1805
+ };
1806
+ Draw.prototype.setTransform = function (context, value, isReverse) {
1807
+ var parent = this.parent;
1808
+ if (isReverse && value === 90) {
1809
+ value = -90;
1810
+ }
1811
+ else if (isReverse && value === -90) {
1812
+ value = 90;
1813
+ }
1814
+ if (value === 'horizontal' && parent.transform.degree % 90 === 0 && parent.transform.degree % 180 !== 0) {
1815
+ value = 'vertical';
1816
+ }
1817
+ else if (value === 'vertical' && parent.transform.degree % 90 === 0 && parent.transform.degree % 180 !== 0) {
1818
+ value = 'horizontal';
1819
+ }
1820
+ parent.notify('transform', { prop: 'setReverseRotate', onPropertyChange: false, value: { bool: true } });
1821
+ parent.notify('transform', { prop: 'setReverseFlip', onPropertyChange: false, value: { isReverseFlip: true } });
1822
+ if (isNullOrUndefined(isReverse)) {
1823
+ context.clearRect(0, 0, context.canvas.width, context.canvas.height);
1824
+ }
1825
+ switch (value) {
1826
+ case 90:
1827
+ case -90:
1828
+ context.translate(context.canvas.width / 2, context.canvas.height / 2);
1829
+ context.rotate(Math.PI / 180 * value);
1830
+ context.translate(-context.canvas.width / 2, -context.canvas.height / 2);
1831
+ break;
1832
+ case 'horizontal':
1833
+ context.translate(context.canvas.width, 0);
1834
+ context.scale(-1, 1);
1835
+ break;
1836
+ case 'vertical':
1837
+ context.translate(0, context.canvas.height);
1838
+ context.scale(1, -1);
1839
+ break;
1840
+ }
1841
+ parent.notify('transform', { prop: 'setReverseRotate', onPropertyChange: false, value: { bool: false } });
1842
+ parent.notify('transform', { prop: 'setReverseFlip', onPropertyChange: false, value: { isReverseFlip: false } });
1843
+ };
1844
+ Draw.prototype.drawImgToCanvas = function (maxDimension) {
1845
+ var parent = this.parent;
1846
+ this.lowerContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
1847
+ parent.img.destWidth = maxDimension.width;
1848
+ parent.img.destHeight = maxDimension.height;
1849
+ if (this.isInitialLoading) {
1850
+ parent.notify('filter', { prop: 'initFilter', onPropertyChange: false });
1851
+ this.isInitialLoading = false;
1852
+ }
1853
+ var temp = this.lowerContext.filter;
1854
+ parent.notify('filter', { prop: 'updateBrightFilter', onPropertyChange: false });
1855
+ this.lowerContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
1856
+ this.lowerContext.drawImage(parent.baseImg, parent.img.srcLeft, parent.img.srcTop, parent.img.srcWidth, parent.img.srcHeight, parent.img.destLeft, parent.img.destTop, parent.img.destWidth, parent.img.destHeight);
1857
+ if ((parent.currSelectionPoint && parent.currSelectionPoint.shape === 'crop-circle') || parent.isCircleCrop) {
1858
+ parent.notify('crop', { prop: 'cropCircle', onPropertyChange: false,
1859
+ value: { context: this.lowerContext, isSave: null, isFlip: null } });
1860
+ }
1861
+ this.lowerContext.filter = temp;
1862
+ };
1863
+ Draw.prototype.renderImage = function (isMouseWheel) {
1864
+ var parent = this.parent;
1865
+ var temp = this.lowerContext.filter;
1866
+ parent.notify('shape', { prop: 'applyActObj', onPropertyChange: false, value: { isMouseDown: null } });
1867
+ this.upperContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
1868
+ this.lowerContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
1869
+ if (isMouseWheel) {
1870
+ this.setTransformColl(this.lowerContext, 'initial');
1871
+ }
1872
+ else {
1873
+ if (parent.transform.zoomFactor > 0) {
1874
+ this.isRotateZoom = true;
1875
+ }
1876
+ this.updateCurrTransState('initial');
1877
+ }
1878
+ parent.notify('filter', { prop: 'updateBrightFilter', onPropertyChange: false });
1879
+ parent.notify('transform', { prop: 'setDestPointsForFlipState', onPropertyChange: false });
1880
+ this.lowerContext.drawImage(parent.baseImg, parent.img.srcLeft, parent.img.srcTop, parent.img.srcWidth, parent.img.srcHeight, parent.img.destLeft, parent.img.destTop, parent.img.destWidth, parent.img.destHeight);
1881
+ parent.notify('transform', { prop: 'setDestPointsForFlipState', onPropertyChange: false });
1882
+ if (isMouseWheel) {
1883
+ this.setTransformColl(this.lowerContext, 'reverse');
1884
+ }
1885
+ else {
1886
+ this.updateCurrTransState('reverse');
1887
+ this.isRotateZoom = false;
1888
+ }
1889
+ this.lowerContext.filter = 'none';
1890
+ parent.notify('shape', { prop: 'iterateObjColl', onPropertyChange: false });
1891
+ parent.notify('freehand-draw', { prop: 'freehandRedraw', onPropertyChange: false,
1892
+ value: { context: this.lowerContext, points: null } });
1893
+ this.lowerContext.filter = temp;
1894
+ if (parent.isCircleCrop || (parent.currSelectionPoint && parent.currSelectionPoint.shape === 'crop-circle')) {
1895
+ parent.notify('crop', { prop: 'cropCircle', onPropertyChange: false,
1896
+ value: { context: this.lowerContext, isSave: null, isFlip: null } });
1897
+ }
1898
+ };
1899
+ Draw.prototype.imageOnLoad = function (src) {
1900
+ var _this = this;
1901
+ var parent = this.parent;
1902
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1903
+ var proxy = this;
1904
+ parent.baseImg.src = src;
1905
+ parent.baseImg.onload = function () {
1906
+ parent.notify('filter', { prop: 'update-finetunes', onPropertyChange: false });
1907
+ proxy.lowerContext.drawImage(parent.baseImg, 0, 0, proxy.parent.lowerCanvas.width, proxy.parent.lowerCanvas.height);
1908
+ hideSpinner(parent.element);
1909
+ parent.element.style.opacity = '1';
1910
+ proxy.updateCanvas();
1911
+ if (parent.currObjType.isUndoZoom) {
1912
+ parent.currObjType.isUndoZoom = false;
1913
+ proxy.parent.lowerCanvas.style.display = 'block';
1914
+ }
1915
+ parent.isUndoRedo = _this.isErrorImage = false;
1916
+ if (!isBlazor()) {
1917
+ if (Browser.isDevice) {
1918
+ parent.notify('toolbar', { prop: 'destroy-top-toolbar', onPropertyChange: false });
1919
+ parent.notify('toolbar', { prop: 'destroy-bottom-toolbar', onPropertyChange: false });
1920
+ var eventargs = { isApplyBtn: false, isDevice: Browser.isDevice, isOkBtn: null };
1921
+ parent.notify('toolbar', { prop: 'init-main-toolbar', onPropertyChange: false, value: eventargs });
1922
+ parent.notify('toolbar', { prop: 'create-bottom-toolbar', onPropertyChange: false });
1923
+ }
1924
+ else {
1925
+ parent.notify('toolbar', { prop: 'destroy-top-toolbar', onPropertyChange: false });
1926
+ var eventargs = { isApplyBtn: false, isDevice: false, isOkBtn: null };
1927
+ parent.notify('toolbar', { prop: 'init-main-toolbar', onPropertyChange: false, value: eventargs });
1928
+ }
1929
+ }
1930
+ else {
1931
+ parent.updateToolbar(parent.element, 'imageLoaded', 'initial');
1932
+ if (Browser.isDevice) {
1933
+ parent.element.querySelector('.e-bottom-toolbar-area').style.display = 'block';
1934
+ parent.element.querySelector('.e-canvas-wrapper').style.height = (parent.element.offsetHeight
1935
+ - parent.toolbarHeight * 2) - 3 + 'px';
1936
+ }
1937
+ }
1938
+ };
1939
+ parent.baseImg.onerror = function () {
1940
+ hideSpinner(parent.element);
1941
+ // proxy.reset();
1942
+ // proxy.parent.baseImg.src = proxy.baseImgSrc;
1943
+ proxy.isErrorImage = true;
1944
+ proxy.errorLoading();
1945
+ };
1946
+ };
1947
+ Draw.prototype.errorLoading = function () {
1948
+ var parent = this.parent;
1949
+ var fileOpened = { fileName: null, fileType: null, isValidImage: false };
1950
+ if (isBlazor() && parent.events && parent.events.fileOpened.hasDelegate === true) {
1951
+ parent.dotNetRef.invokeMethodAsync('FileOpenEventAsync', 'FileOpened', fileOpened);
1952
+ }
1953
+ else {
1954
+ parent.trigger('fileOpened', fileOpened);
1955
+ }
1956
+ };
1957
+ Draw.prototype.updateCanvas = function () {
1958
+ var parent = this.parent;
1959
+ var fileOpened = { fileName: this.fileName, fileType: this.fileType, isValidImage: true };
1960
+ parent.img.srcWidth = parent.baseImg.width;
1961
+ parent.img.srcHeight = parent.baseImg.height;
1962
+ var obj = { width: 0, height: 0 };
1963
+ parent.notify('transform', { prop: 'calcMaxDimension', onPropertyChange: false,
1964
+ value: { width: parent.img.srcWidth, height: parent.img.srcHeight, obj: obj } });
1965
+ var maxDimension = obj;
1966
+ parent.img.destLeft = (parent.lowerCanvas.clientWidth - maxDimension.width) / 2;
1967
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height) / 2;
1968
+ this.drawImgToCanvas(maxDimension);
1969
+ this.zoomCrop.width = parent.img.destWidth;
1970
+ this.zoomCrop.height = parent.img.destHeight;
1971
+ parent.notify('transform', { prop: 'setCropDimension', onPropertyChange: false,
1972
+ value: { width: parent.img.destWidth, height: parent.img.destHeight } });
1973
+ var point = { startX: parent.img.destLeft, startY: parent.img.destTop, width: parent.img.destWidth,
1974
+ height: parent.img.destHeight };
1975
+ parent.notify('crop', { prop: 'setCropDestPoints', onPropertyChange: false, value: { point: point } });
1976
+ var temp = this.lowerContext.filter;
1977
+ this.lowerContext.filter = 'none';
1978
+ parent.notify('shape', { prop: 'iterateObjColl', onPropertyChange: false });
1979
+ parent.notify('freehand-draw', { prop: 'zoomFHDColl', onPropertyChange: false, value: { isPreventApply: null } });
1980
+ this.lowerContext.filter = temp;
1981
+ if (parent.img.destWidth > 0 && parent.img.destHeight > 0) {
1982
+ parent.isImageLoaded = true;
1983
+ }
1984
+ if (parent.isUndoRedo) {
1985
+ if (parent.transform.currFlipState !== '') {
1986
+ parent.notify('transform', { prop: 'flipImage', onPropertyChange: false,
1987
+ value: { direction: parent.toPascalCase(parent.transform.currFlipState) } });
1988
+ }
1989
+ }
1990
+ if (parent.disabled) {
1991
+ parent.element.setAttribute('class', 'e-disabled');
1992
+ }
1993
+ if (parent.isImageLoaded && parent.element.style.opacity !== '0.5') {
1994
+ if (isBlazor() && parent.events && parent.events.fileOpened.hasDelegate === true) {
1995
+ parent.dotNetRef.invokeMethodAsync('FileOpenEventAsync', 'FileOpened', fileOpened);
1996
+ }
1997
+ else {
1998
+ parent.trigger('fileOpened', fileOpened);
1999
+ }
2000
+ }
2001
+ if (parent.zoomSettings.zoomFactor !== 1 || parent.zoomSettings.zoomPoint) {
2002
+ parent.zoom(parent.zoomSettings.zoomFactor, parent.zoomSettings.zoomPoint);
2003
+ }
2004
+ if (isNullOrUndefined(this.initZoomValue)) {
2005
+ this.initZoomValue = parent.zoomSettings.zoomFactor;
2006
+ }
2007
+ this.isImageEdited = false;
2008
+ };
2009
+ Draw.prototype.performCancel = function (isContextualToolbar) {
2010
+ var parent = this.parent;
2011
+ isContextualToolbar = isContextualToolbar ? isContextualToolbar : false;
2012
+ var obj = { bool: false };
2013
+ parent.notify('selection', { prop: 'getFreehandDrawEditing', onPropertyChange: false, value: { obj: obj } });
2014
+ if (obj['bool']) {
2015
+ parent.notify('freehand-draw', { prop: 'cancelFhd', onPropertyChange: false });
2016
+ if (!isBlazor()) {
2017
+ parent.notify('toolbar', { prop: 'destroy-qa-toolbar', onPropertyChange: false });
2018
+ }
2019
+ else {
2020
+ parent.updateToolbar(parent.element, 'destroyQuickAccessToolbar');
2021
+ }
2022
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'cancel' } });
2023
+ }
2024
+ else if (parent.textArea.style.display === 'block') {
2025
+ parent.textArea.style.display = 'none';
2026
+ parent.textArea.value = '';
2027
+ parent.textArea.style.transform = '';
2028
+ if (this.prevActObj) {
2029
+ parent.activeObj = this.prevActObj;
2030
+ this.prevActObj = null;
2031
+ }
2032
+ else {
2033
+ parent.activeObj.strokeSettings = this.tempStrokeSettings;
2034
+ parent.activeObj.textSettings = this.tempTextSettings;
2035
+ }
2036
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'cancel' } });
2037
+ if (this.isShapeTextInserted) {
2038
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2039
+ }
2040
+ parent.notify('shape', { prop: 'applyActObj', onPropertyChange: false, value: { isMouseDown: true } });
2041
+ if (!isBlazor()) {
2042
+ parent.notify('toolbar', { prop: 'refresh-main-toolbar', onPropertyChange: false });
2043
+ }
2044
+ else {
2045
+ parent.updateToolbar(parent.element, 'imageLoaded');
2046
+ }
2047
+ }
2048
+ else if ((!isBlazor() && document.querySelector('#' + parent.element.id + '_sliderWrapper')) || (isBlazor() && !parent.element.querySelector('.e-ie-contextual-slider').classList.contains('e-hidden')) ||
2049
+ parent.currObjType.isFiltered) {
2050
+ this.lowerContext.filter = this.tempAdjValue;
2051
+ parent.canvasFilter = this.tempAdjValue;
2052
+ parent.notify('filter', { prop: 'setAdjustmentValue', onPropertyChange: false, value: { adjustmentValue: this.tempAdjValue } });
2053
+ parent.initialAdjustmentValue = this.tempAdjValue;
2054
+ if (this.lowerContext.filter.split(' ').length > 1 &&
2055
+ this.lowerContext.filter.split(' ')[0].split('(')[1].split(')')[0] === '1') {
2056
+ parent.notify('filter', { prop: 'setBrightnessAdjusted', onPropertyChange: false, value: { isBrightnessAdjusted: false } });
2057
+ }
2058
+ parent.currentFilter = this.tempFilter;
2059
+ this.lowerContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
2060
+ this.redrawImgWithObj();
2061
+ parent.currObjType.isFiltered = false;
2062
+ var obj_3 = { tempAdjustmentLevel: null };
2063
+ parent.notify('filter', { prop: 'getTempAdjustmentLevel', onPropertyChange: false, value: { obj: obj_3 } });
2064
+ parent.notify('filter', { prop: 'setAdjustmentLevel', onPropertyChange: false,
2065
+ value: { adjustmentLevel: extend({}, obj_3['tempAdjustmentLevel'], {}, true) } });
2066
+ parent.notify('undo-redo', { prop: 'setUndoRedoStep', onPropertyChange: false, value: { step: this.tempUndoRedoStep } });
2067
+ parent.upperCanvas.style.cursor = parent.cursor = 'default';
2068
+ parent.currObjType.isCustomCrop = false;
2069
+ this.tempStrokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null };
2070
+ this.clearOuterCanvas(this.lowerContext);
2071
+ if ((parent.currSelectionPoint && parent.currSelectionPoint.shape === 'crop-circle') || parent.isCircleCrop) {
2072
+ parent.notify('crop', { prop: 'cropCircle', onPropertyChange: false,
2073
+ value: { context: this.lowerContext, isSave: null, isFlip: null } });
2074
+ }
2075
+ var eventargs = { type: 'main', isApplyBtn: null, isCropping: null, isZooming: null };
2076
+ if (!isBlazor()) {
2077
+ parent.element.querySelector('.e-contextual-toolbar-wrapper').classList.add('e-hide');
2078
+ parent.notify('toolbar', { prop: 'refresh-toolbar', onPropertyChange: false, value: eventargs });
2079
+ }
2080
+ else {
2081
+ parent.updateToolbar(parent.element, 'imageLoaded');
2082
+ }
2083
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'cancel' } });
2084
+ }
2085
+ else {
2086
+ if (isContextualToolbar) {
2087
+ var eventargs = { type: 'main', isApplyBtn: null, isCropping: null, isZooming: null };
2088
+ if (!isBlazor()) {
2089
+ parent.notify('toolbar', { prop: 'refresh-toolbar', onPropertyChange: false, value: eventargs });
2090
+ }
2091
+ else {
2092
+ parent.updateToolbar(parent.element, 'imageLoaded');
2093
+ }
2094
+ }
2095
+ else {
2096
+ this.cancelItems();
2097
+ parent.togglePan = false;
2098
+ parent.notify('selection', { prop: 'setDragCanvas', value: { bool: false } });
2099
+ }
2100
+ }
2101
+ this.isShapeTextInserted = false;
2102
+ this.isNewPath = false;
2103
+ if (!isBlazor()) {
2104
+ parent.notify('toolbar', { prop: 'refresh-dropdown-btn', value: { isDisabled: false } });
2105
+ parent.notify('toolbar', { prop: 'setCurrentToolbar', value: { type: 'main' } });
2106
+ }
2107
+ };
2108
+ Draw.prototype.cancelItems = function () {
2109
+ var parent = this.parent;
2110
+ var isCropSelection = false;
2111
+ var splitWords;
2112
+ var shapes = ['rectangle', 'ellipse', 'line', 'arrow', 'path'];
2113
+ if (parent.activeObj.shape !== undefined) {
2114
+ splitWords = parent.activeObj.shape.split('-');
2115
+ }
2116
+ if (splitWords === undefined && parent.currObjType.isCustomCrop) {
2117
+ isCropSelection = true;
2118
+ }
2119
+ else if (splitWords !== undefined && splitWords[0] === 'crop') {
2120
+ isCropSelection = true;
2121
+ }
2122
+ if (isCropSelection && parent.isCropTab) {
2123
+ parent.isCropTab = false;
2124
+ parent.transform.zoomFactor = parent.transform.defaultZoomFactor;
2125
+ }
2126
+ if (parent.togglePen) {
2127
+ this.cancelPen();
2128
+ }
2129
+ else if (parent.activeObj.shape === 'text') {
2130
+ this.cancelText(isCropSelection);
2131
+ }
2132
+ else if (shapes.indexOf(parent.activeObj.shape) !== -1) {
2133
+ this.cancelShape();
2134
+ }
2135
+ else if (isCropSelection) {
2136
+ this.cancelSelection();
2137
+ }
2138
+ else {
2139
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2140
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2141
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'cancel' } });
2142
+ }
2143
+ parent.notify('selection', { prop: 'setCurrentDrawingShape', onPropertyChange: false, value: { value: '' } });
2144
+ parent.upperCanvas.style.cursor = parent.cursor = 'default';
2145
+ parent.currObjType.isCustomCrop = false;
2146
+ this.tempStrokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null };
2147
+ var eventargs = { type: 'main', isApplyBtn: null, isCropping: false, isZooming: null };
2148
+ if (!isBlazor()) {
2149
+ parent.notify('toolbar', { prop: 'refresh-toolbar', onPropertyChange: false, value: eventargs });
2150
+ }
2151
+ else {
2152
+ parent.updateToolbar(parent.element, 'imageLoaded');
2153
+ }
2154
+ };
2155
+ Draw.prototype.cancelPen = function () {
2156
+ var parent = this.parent;
2157
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2158
+ parent.togglePen = false;
2159
+ parent.upperCanvas.style.cursor = parent.cursor = 'default';
2160
+ // eslint-disable-next-line
2161
+ var tempPointsColl = extend([], parent.pointColl, [], true);
2162
+ parent.pointColl = {};
2163
+ for (var i = 0; i < this.tempFreehandCounter; i++) {
2164
+ parent.pointColl[i] = tempPointsColl[i];
2165
+ }
2166
+ parent.freehandCounter = this.tempFreehandCounter;
2167
+ parent.notify('freehand-draw', { prop: 'setCurrentFreehandDrawIndex', value: { value: this.tempCurrFhdIndex } });
2168
+ parent.activeObj.strokeSettings = this.tempStrokeSettings;
2169
+ parent.notify('shape', { prop: 'setStrokeSettings',
2170
+ value: { strokeSettings: parent.activeObj.strokeSettings, strokeColor: null, fillColor: null, strokeWidth: null } });
2171
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'cancel' } });
2172
+ parent.notify('selection', { prop: 'setFreehandDrawCustomized', value: { isFreehandDrawCustomized: false } });
2173
+ };
2174
+ Draw.prototype.cancelText = function (isCropSelection) {
2175
+ var parent = this.parent;
2176
+ parent.notify('shape', { prop: 'setTextSettings', onPropertyChange: false,
2177
+ value: { textSettings: this.tempTextSettings, fontFamily: null, fontSize: null } });
2178
+ parent.notify('shape', { prop: 'setStrokeSettings',
2179
+ value: { strokeSettings: this.tempStrokeSettings, strokeColor: null, fillColor: null, strokeWidth: null } });
2180
+ if (isNullOrUndefined(parent.activeObj.currIndex)) {
2181
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2182
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2183
+ }
2184
+ else {
2185
+ var object = { appliedUndoRedoColl: [] };
2186
+ parent.notify('undo-redo', { prop: 'getAppliedUndoRedoColl', value: { obj: object } });
2187
+ var len = object['appliedUndoRedoColl'].length;
2188
+ if (this.prevActObj && object['appliedUndoRedoColl'][len - 1] &&
2189
+ object['appliedUndoRedoColl'][len - 1].currentObjColl[object['appliedUndoRedoColl'][len - 1].currentObjColl.length - 1].currIndex
2190
+ === this.prevActObj.currIndex) {
2191
+ parent.activeObj = this.prevActObj;
2192
+ this.prevActObj = null;
2193
+ }
2194
+ else {
2195
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2196
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2197
+ }
2198
+ if (parent.activeObj.shape && parent.activeObj.keyHistory === 'Enter Text') {
2199
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2200
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2201
+ parent.notify('shape', { prop: 'draw-shape-text' });
2202
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'cancel' } });
2203
+ parent.notify('shape', { prop: 'applyActObj', onPropertyChange: false, value: { isMouseDown: true } });
2204
+ }
2205
+ else if (parent.activeObj.shape) {
2206
+ parent.notify('shape', { prop: 'redraw-text' });
2207
+ parent.notify('selection', { prop: 'redrawShape', onPropertyChange: false, value: { obj: parent.activeObj } });
2208
+ if (!isCropSelection && parent.activeObj.topLeftCircle !== undefined) {
2209
+ parent.notify('shape', { prop: 'applyActObj', onPropertyChange: false, value: { isMouseDown: true } });
2210
+ }
2211
+ parent.clearSelection();
2212
+ }
2213
+ }
2214
+ if (!isBlazor()) {
2215
+ parent.notify('toolbar', { prop: 'destroy-qa-toolbar', onPropertyChange: false });
2216
+ }
2217
+ else {
2218
+ parent.updateToolbar(parent.element, 'destroyQuickAccessToolbar');
2219
+ }
2220
+ this.tempTextSettings = { text: 'Enter Text', fontFamily: 'Arial', fontSize: null, fontRatio: null, bold: false,
2221
+ italic: false, underline: false };
2222
+ };
2223
+ Draw.prototype.cancelShape = function () {
2224
+ var parent = this.parent;
2225
+ parent.notify('shape', { prop: 'setStrokeSettings',
2226
+ value: { strokeSettings: this.tempStrokeSettings, strokeColor: null, fillColor: null, strokeWidth: null } });
2227
+ if (isNullOrUndefined(parent.activeObj.currIndex)) {
2228
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2229
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2230
+ }
2231
+ else if (this.isNewPath) {
2232
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2233
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2234
+ this.renderImage();
2235
+ }
2236
+ else {
2237
+ var object = { appliedUndoRedoColl: [] };
2238
+ parent.notify('undo-redo', { prop: 'getAppliedUndoRedoColl', value: { obj: object } });
2239
+ var len = object['appliedUndoRedoColl'].length;
2240
+ if (this.prevActObj && object['appliedUndoRedoColl'][len - 1] &&
2241
+ object['appliedUndoRedoColl'][len - 1].currentObjColl[object['appliedUndoRedoColl'][len - 1].currentObjColl.length - 1].currIndex
2242
+ === this.prevActObj.currIndex) {
2243
+ parent.activeObj = this.prevActObj;
2244
+ this.prevActObj = null;
2245
+ parent.notify('selection', { prop: 'redrawShape', onPropertyChange: false, value: { obj: parent.activeObj } });
2246
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'cancel' } });
2247
+ parent.notify('shape', { prop: 'applyActObj', onPropertyChange: false, value: { isMouseDown: true } });
2248
+ }
2249
+ else {
2250
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2251
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2252
+ }
2253
+ }
2254
+ parent.currObjType.isDragging = false;
2255
+ if (!isBlazor()) {
2256
+ parent.notify('toolbar', { prop: 'destroy-qa-toolbar', onPropertyChange: false });
2257
+ }
2258
+ else {
2259
+ parent.updateToolbar(parent.element, 'destroyQuickAccessToolbar');
2260
+ }
2261
+ };
2262
+ Draw.prototype.cancelSelection = function () {
2263
+ var parent = this.parent;
2264
+ if (parent.cancelCropSelection) {
2265
+ parent.cropObj = extend({}, parent.cancelCropSelection.previousCropObj, {}, true);
2266
+ parent.afterCropActions = parent.cancelCropSelection.previousObj.afterCropActions;
2267
+ parent.notify('undo-redo', { prop: 'undoDefault', onPropertyChange: false, value: { obj: parent.cancelCropSelection } });
2268
+ parent.currSelectionPoint = extend({}, parent.cancelCropSelection.previousCropObj.activeObj, true);
2269
+ if (parent.currSelectionPoint && isNullOrUndefined(parent.currSelectionPoint.shape)) {
2270
+ parent.currSelectionPoint = null;
2271
+ }
2272
+ this.clearOuterCanvas(this.lowerContext);
2273
+ if (parent.isCircleCrop || (parent.currSelectionPoint && parent.currSelectionPoint.shape === 'crop-circle')) {
2274
+ parent.notify('crop', { prop: 'cropCircle', onPropertyChange: false,
2275
+ value: { context: this.lowerContext, isSave: null, isFlip: null } });
2276
+ }
2277
+ }
2278
+ };
2279
+ Draw.prototype.updateFlipPan = function (tempSelectionObj) {
2280
+ var parent = this.parent;
2281
+ if (parent.transform.currFlipState !== '') {
2282
+ var temp = this.lowerContext.filter;
2283
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2284
+ parent.notify('transform', { prop: 'rotatedFlip', onPropertyChange: false });
2285
+ this.lowerContext.filter = 'none';
2286
+ parent.notify('freehand-draw', { prop: 'freehandRedraw', onPropertyChange: false,
2287
+ value: { context: this.lowerContext, points: null } });
2288
+ this.lowerContext.filter = temp;
2289
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2290
+ if (tempSelectionObj) {
2291
+ this.drawObject('duplicate', tempSelectionObj);
2292
+ }
2293
+ }
2294
+ };
2295
+ Draw.prototype.select = function (type, startX, startY, width, height) {
2296
+ var parent = this.parent;
2297
+ if (!parent.disabled && parent.isImageLoaded) {
2298
+ var object = { currObj: {} };
2299
+ parent.notify('filter', { prop: 'getCurrentObj', onPropertyChange: false, value: { object: object } });
2300
+ var previousObj = object['currObj'];
2301
+ previousObj.objColl = extend([], parent.objColl, [], true);
2302
+ previousObj.pointColl = extend([], parent.pointColl, [], true);
2303
+ previousObj.afterCropActions = parent.afterCropActions;
2304
+ var selPointCollObj = { selPointColl: null };
2305
+ parent.notify('freehand-draw', { prop: 'getSelPointColl', onPropertyChange: false,
2306
+ value: { obj: selPointCollObj } });
2307
+ previousObj.selPointColl = extend([], selPointCollObj['selPointColl'], [], true);
2308
+ parent.notify('crop', { prop: 'setPreviousCropCurrentObj', onPropertyChange: false, value: { obj: previousObj } });
2309
+ if (parent.transform.zoomFactor > 0 && parent.activeObj.shape && parent.activeObj.shape.split('-')[0] === 'crop' && isNullOrUndefined(this.currSelPoint)) {
2310
+ this.currSelPoint = extend({}, parent.activeObj, {}, true);
2311
+ }
2312
+ var isPrevent = false;
2313
+ var splitWords = void 0;
2314
+ if (parent.activeObj.shape !== undefined) {
2315
+ splitWords = parent.activeObj.shape.split('-');
2316
+ }
2317
+ if (splitWords === undefined && parent.currObjType.isCustomCrop) {
2318
+ isPrevent = true;
2319
+ }
2320
+ else if (splitWords !== undefined && splitWords[0] === 'crop') {
2321
+ isPrevent = true;
2322
+ }
2323
+ var obj = { currObj: {} };
2324
+ parent.notify('filter', { prop: 'getCurrentObj', onPropertyChange: false, value: { object: obj } });
2325
+ var prevObj = obj['currObj'];
2326
+ prevObj.objColl = extend([], parent.objColl, [], true);
2327
+ prevObj.pointColl = extend([], parent.pointColl, [], true);
2328
+ prevObj.afterCropActions = extend([], parent.afterCropActions, [], true);
2329
+ parent.notify('shape', { prop: 'redrawActObj', onPropertyChange: false,
2330
+ value: { x: null, y: null, isMouseDown: null } });
2331
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2332
+ parent.notify('shape', { prop: 'setKeyHistory', onPropertyChange: false, value: { keyHistory: '' } });
2333
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2334
+ parent.upperCanvas.style.display = 'block';
2335
+ if (parent.currSelectionPoint || parent.transform.defaultZoomFactor !== 0 ||
2336
+ (parent.transform.degree !== 0 && parent.panPoint.totalPannedInternalPoint.x !== 0 &&
2337
+ parent.panPoint.totalPannedInternalPoint.y !== 0 && !isPrevent)) {
2338
+ parent.isCircleCrop = false;
2339
+ if (parent.transform.defaultZoomFactor !== 0) {
2340
+ var isCropTab = parent.isCropTab;
2341
+ parent.isCropTab = false;
2342
+ parent.notify('transform', { prop: 'resetZoom', onPropertyChange: false });
2343
+ parent.isCropTab = isCropTab;
2344
+ this.resetPanPoints();
2345
+ }
2346
+ this.cancelObjColl = extend([], parent.objColl, [], true);
2347
+ this.cancelPointColl = extend([], parent.pointColl, [], true);
2348
+ parent.notify('freehand-draw', { prop: 'updateFHDColl', onPropertyChange: false });
2349
+ parent.isCropTab = true;
2350
+ parent.isCircleCrop = false;
2351
+ parent.notify('crop', { prop: 'setCurrSelPoints', onPropertyChange: false, value: { isSetDimension: true } });
2352
+ parent.transform.zoomFactor = parent.transform.cropZoomFactor;
2353
+ if (isNullOrUndefined(parent.cropObj.activeObj.shape)) {
2354
+ parent.currObjType.shape = 'crop-' + type.toLowerCase();
2355
+ this.drawNewSelection(type, startX, startY, width, height);
2356
+ }
2357
+ }
2358
+ else {
2359
+ if (type === 'custom') {
2360
+ parent.currObjType.shape = '';
2361
+ }
2362
+ this.drawNewSelection(type, startX, startY, width, height);
2363
+ }
2364
+ }
2365
+ };
2366
+ Draw.prototype.drawNewSelection = function (type, startX, startY, width, height) {
2367
+ var parent = this.parent;
2368
+ var points;
2369
+ var cropShape = 'crop-' + type;
2370
+ if (cropShape.toLowerCase() === 'crop-custom') {
2371
+ if (parent.currObjType.shape === '' || parent.currObjType.shape === 'crop-custom') {
2372
+ this.drawCustomSelection('crop-custom', startX, startY, width, height);
2373
+ }
2374
+ }
2375
+ else if (cropShape.toLowerCase() === 'crop-canvas') {
2376
+ parent.upperCanvas.style.display = 'block';
2377
+ parent.notify('selection', { prop: 'setDragCanvas', value: { bool: true } });
2378
+ }
2379
+ else {
2380
+ parent.currObjType.isCustomCrop = false;
2381
+ parent.currObjType.shape = cropShape.toLowerCase();
2382
+ if (width && height) {
2383
+ points = { startX: startX, startY: startY, endX: startX + width, endY: startY + height,
2384
+ width: width, height: height };
2385
+ }
2386
+ else if (width && cropShape === 'crop-circle') {
2387
+ points = { startX: startX, startY: startY, endX: startX + width, endY: startY + width,
2388
+ width: width, height: width };
2389
+ }
2390
+ parent.activeObj.shape = cropShape.toLowerCase();
2391
+ this.updateSelectionInsert(points);
2392
+ }
2393
+ };
2394
+ Draw.prototype.updateSelectionInsert = function (points) {
2395
+ var _this = this;
2396
+ var parent = this.parent;
2397
+ var actPoint = parent.activeObj.activePoint;
2398
+ var obj = { shapeSettingsObj: {} };
2399
+ parent.notify('selection', { prop: 'updatePrevShapeSettings', onPropertyChange: false, value: { obj: obj } });
2400
+ var selectionSettings = { type: parent.getSelectionType(obj['shapeSettingsObj']['type']), startX: obj['shapeSettingsObj']['startX'],
2401
+ startY: obj['shapeSettingsObj']['startY'], width: obj['shapeSettingsObj']['width'], height: obj['shapeSettingsObj']['height'] };
2402
+ var selectionChangingArgs = { action: 'insert', previousSelectionSettings: selectionSettings,
2403
+ currentSelectionSettings: selectionSettings };
2404
+ if (isBlazor() && parent.events && parent.events.onSelectionResizeStart.hasDelegate === true) {
2405
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
2406
+ parent.dotNetRef.invokeMethodAsync('SelectionEventAsync', 'OnSelectionResizeStart', selectionChangingArgs).then(function (selectionChangingArgs) {
2407
+ parent.notify('shape', { prop: 'updSelChangeEventArgs', onPropertyChange: false,
2408
+ value: { selectionSettings: selectionChangingArgs.currentSelectionSettings } });
2409
+ if (selectionChangingArgs.currentSelectionSettings.type === 'Custom') {
2410
+ _this.drawObject('duplicate', parent.activeObj, null, null, true);
2411
+ }
2412
+ else {
2413
+ if (actPoint.startX !== 0 || actPoint.startY !== 0 ||
2414
+ actPoint.width !== 0 || actPoint.height !== 0) {
2415
+ points = { startX: actPoint.startX, startY: actPoint.startY,
2416
+ endX: actPoint.endX, endY: actPoint.endY,
2417
+ width: actPoint.width, height: actPoint.height };
2418
+ }
2419
+ _this.drawObject('duplicate', null, true, points);
2420
+ }
2421
+ });
2422
+ }
2423
+ else {
2424
+ parent.trigger('selectionChanging', selectionChangingArgs);
2425
+ parent.notify('shape', { prop: 'updSelChangeEventArgs', onPropertyChange: false,
2426
+ value: { selectionSettings: selectionChangingArgs.currentSelectionSettings } });
2427
+ if (selectionChangingArgs.currentSelectionSettings.type === 'Custom') {
2428
+ this.drawObject('duplicate', parent.activeObj, null, null, true);
2429
+ }
2430
+ else {
2431
+ if (actPoint.startX !== 0 || actPoint.startY !== 0 ||
2432
+ actPoint.width !== 0 || actPoint.height !== 0) {
2433
+ points = { startX: actPoint.startX, startY: actPoint.startY,
2434
+ endX: actPoint.endX, endY: actPoint.endY,
2435
+ width: actPoint.width, height: actPoint.height };
2436
+ }
2437
+ this.drawObject('duplicate', null, true, points);
2438
+ }
2439
+ }
2440
+ };
2441
+ Draw.prototype.drawCustomSelection = function (cropShape, startX, startY, width, height) {
2442
+ var parent = this.parent;
2443
+ var actPoint = parent.activeObj.activePoint;
2444
+ parent.currObjType.isCustomCrop = true;
2445
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2446
+ parent.currObjType.shape = parent.activeObj.shape = cropShape.toLowerCase();
2447
+ if (!isNullOrUndefined(startX) && !isNullOrUndefined(startY) && !isNullOrUndefined(width) && !isNullOrUndefined(height)) {
2448
+ actPoint.startX = startX;
2449
+ actPoint.startY = startY;
2450
+ actPoint.endX = startX + width;
2451
+ actPoint.endY = startY + height;
2452
+ actPoint.width = width;
2453
+ actPoint.height = height;
2454
+ }
2455
+ else {
2456
+ if (isNullOrUndefined(parent.transform.zoomFactor) || parent.transform.zoomFactor === 0) {
2457
+ var imgLeft_1 = parent.img.destLeft;
2458
+ var imgTop_1 = parent.img.destTop;
2459
+ var imgWidth_1 = parent.img.destWidth;
2460
+ var imgHeight_1 = parent.img.destHeight;
2461
+ var lowerCanvasWidth_1 = parent.lowerCanvas.width;
2462
+ var lowerCanvasHeight_1 = parent.lowerCanvas.height;
2463
+ var activePoint_1 = actPoint;
2464
+ if (imgLeft_1 >= 0 && imgTop_1 >= 0) {
2465
+ activePoint_1.startX = imgLeft_1;
2466
+ activePoint_1.startY = imgTop_1;
2467
+ activePoint_1.endX = imgLeft_1 + imgWidth_1;
2468
+ activePoint_1.endY = imgTop_1 + imgHeight_1;
2469
+ }
2470
+ else if (imgLeft_1 >= 0) {
2471
+ activePoint_1.startX = imgLeft_1;
2472
+ activePoint_1.startY = 7.5;
2473
+ activePoint_1.endX = imgLeft_1 + imgWidth_1;
2474
+ activePoint_1.endY = lowerCanvasHeight_1 - 15;
2475
+ }
2476
+ else if (imgTop_1 >= 0) {
2477
+ activePoint_1.startX = 7.5;
2478
+ activePoint_1.startY = imgTop_1;
2479
+ activePoint_1.endX = lowerCanvasWidth_1 - 15;
2480
+ activePoint_1.endY = imgTop_1 + imgHeight_1;
2481
+ }
2482
+ else {
2483
+ activePoint_1.startX = 7.5;
2484
+ activePoint_1.startY = 7.5;
2485
+ activePoint_1.endX = lowerCanvasWidth_1 - 15;
2486
+ activePoint_1.endY = lowerCanvasHeight_1 - 15;
2487
+ }
2488
+ }
2489
+ else {
2490
+ var imgLeft_2 = parent.img.destLeft;
2491
+ var imgTop_2 = parent.img.destTop;
2492
+ var imgWidth_2 = parent.img.destWidth;
2493
+ var imgHeight_2 = parent.img.destHeight;
2494
+ var lowerCanvasWidth_2 = parent.lowerCanvas.width;
2495
+ var lowerCanvasHeight_2 = parent.lowerCanvas.height;
2496
+ var activePoint_2 = actPoint;
2497
+ activePoint_2.startX = Math.max(imgLeft_2 > 0 ? imgLeft_2 : 7.5, imgLeft_2);
2498
+ activePoint_2.startY = Math.max(imgTop_2 > 0 ? imgTop_2 : 7.5, imgTop_2);
2499
+ activePoint_2.endX = Math.min(imgLeft_2 + imgWidth_2 + 15 < lowerCanvasWidth_2 ? imgLeft_2 + imgWidth_2 - 15 :
2500
+ lowerCanvasWidth_2 - 15, imgLeft_2 + imgWidth_2);
2501
+ activePoint_2.endY = Math.min(imgTop_2 + imgHeight_2 + 15 < lowerCanvasHeight_2 ? imgTop_2 + imgHeight_2 - 15 :
2502
+ lowerCanvasHeight_2 - 15, imgTop_2 + imgHeight_2);
2503
+ }
2504
+ var imgLeft = parent.img.destLeft;
2505
+ var imgTop = parent.img.destTop;
2506
+ var imgWidth = parent.img.destWidth;
2507
+ var imgHeight = parent.img.destHeight;
2508
+ var lowerCanvasWidth = parent.lowerCanvas.clientWidth;
2509
+ var lowerCanvasHeight = parent.lowerCanvas.clientHeight;
2510
+ var activePoint = actPoint;
2511
+ activePoint.startX = Math.max(activePoint.startX, imgLeft);
2512
+ activePoint.startY = Math.max(activePoint.startY, imgTop);
2513
+ activePoint.endX = Math.min(activePoint.endX, imgLeft + imgWidth);
2514
+ activePoint.endY = Math.min(activePoint.endY, imgTop + imgHeight);
2515
+ if (activePoint.startX === imgLeft && imgLeft + imgWidth > lowerCanvasWidth) {
2516
+ activePoint.endX = lowerCanvasWidth - 15;
2517
+ }
2518
+ if (activePoint.startY === imgTop && imgTop + imgHeight > lowerCanvasHeight) {
2519
+ activePoint.endY = lowerCanvasHeight - 15;
2520
+ }
2521
+ parent.activeObj = this.updateWidthHeight(parent.activeObj);
2522
+ this.updateActiveObject(actPoint, parent.activeObj);
2523
+ }
2524
+ this.updateSelectionInsert();
2525
+ };
2526
+ Draw.prototype.callUpdateCurrTransState = function () {
2527
+ var parent = this.parent;
2528
+ var tempObjColl = extend([], parent.objColl, [], true);
2529
+ var tempActiveObj = extend({}, parent.activeObj, {}, true);
2530
+ parent.objColl = [];
2531
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
2532
+ this.isRotateZoom = true;
2533
+ this.updateCurrTransState('initial');
2534
+ this.lowerContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
2535
+ if (parent.transform.degree === 0 && parent.rotateFlipColl.length > 0) {
2536
+ parent.img.destLeft += parent.panPoint.totalPannedPoint.x;
2537
+ parent.img.destTop += parent.panPoint.totalPannedPoint.y;
2538
+ }
2539
+ parent.img.destLeft += parent.panPoint.totalPannedInternalPoint.x;
2540
+ parent.img.destTop += parent.panPoint.totalPannedInternalPoint.y;
2541
+ var temp = this.lowerContext.filter;
2542
+ if (parent.transform.degree === 0) {
2543
+ parent.notify('transform', { prop: 'setDestPointsForFlipState', onPropertyChange: false });
2544
+ }
2545
+ parent.notify('filter', { prop: 'updateBrightFilter', onPropertyChange: false });
2546
+ this.lowerContext.drawImage(parent.baseImg, parent.img.srcLeft, parent.img.srcTop, parent.img.srcWidth, parent.img.srcHeight, parent.img.destLeft, parent.img.destTop, parent.img.destWidth, parent.img.destHeight);
2547
+ this.updateCurrTransState('reverse');
2548
+ if (parent.transform.degree === 0 && parent.rotateFlipColl.length > 0) {
2549
+ parent.img.destLeft += parent.panPoint.totalPannedPoint.x;
2550
+ parent.img.destTop += parent.panPoint.totalPannedPoint.y;
2551
+ }
2552
+ this.isRotateZoom = false;
2553
+ parent.objColl = tempObjColl;
2554
+ var tempTogglePen = parent.togglePen;
2555
+ parent.togglePen = false;
2556
+ this.lowerContext.filter = 'none';
2557
+ parent.notify('shape', { prop: 'iterateObjColl', onPropertyChange: false });
2558
+ parent.img.destLeft += parent.panPoint.totalPannedInternalPoint.x;
2559
+ parent.img.destTop += parent.panPoint.totalPannedInternalPoint.y;
2560
+ parent.notify('freehand-draw', { prop: 'freehandRedraw', onPropertyChange: false,
2561
+ value: { context: this.lowerContext, points: null } });
2562
+ parent.img.destLeft -= parent.panPoint.totalPannedInternalPoint.x;
2563
+ parent.img.destTop -= parent.panPoint.totalPannedInternalPoint.y;
2564
+ parent.togglePen = tempTogglePen;
2565
+ this.lowerContext.filter = temp;
2566
+ parent.activeObj = tempActiveObj;
2567
+ };
2568
+ Draw.prototype.resetPanPoints = function () {
2569
+ this.parent.panPoint.totalPannedPoint = { x: 0, y: 0 };
2570
+ this.parent.panPoint.totalPannedClientPoint = { x: 0, y: 0 };
2571
+ this.parent.panPoint.totalPannedInternalPoint = { x: 0, y: 0 };
2572
+ };
2573
+ Draw.prototype.setClientTransDim = function (isPreventDimension) {
2574
+ var parent = this.parent;
2575
+ if (parent.transform.degree % 90 === 0 && parent.transform.degree % 180 !== 0) {
2576
+ parent.img.destLeft = (parent.lowerCanvas.width - parent.img.destHeight) / 2;
2577
+ parent.img.destTop = (parent.lowerCanvas.height - parent.img.destWidth) / 2;
2578
+ var temp = parent.img.destWidth;
2579
+ parent.img.destWidth = parent.img.destHeight;
2580
+ parent.img.destHeight = temp;
2581
+ }
2582
+ else {
2583
+ if (isNullOrUndefined(isPreventDimension)) {
2584
+ parent.img.destLeft = (parent.lowerCanvas.width - parent.img.destWidth) / 2;
2585
+ parent.img.destTop = (parent.lowerCanvas.height - parent.img.destHeight) / 2;
2586
+ }
2587
+ }
2588
+ };
2589
+ Draw.prototype.redrawImgWithObj = function () {
2590
+ var parent = this.parent;
2591
+ var obj = { canvasFilter: parent.canvasFilter };
2592
+ this.lowerContext.filter = obj['canvasFilter'];
2593
+ if (parent.rotateFlipColl.length !== 0) {
2594
+ var totalPannedInternalPoint = extend({}, parent.panPoint.totalPannedInternalPoint, {}, true);
2595
+ var destPoints = { startX: parent.img.destLeft, startY: parent.img.destTop, width: parent.img.destWidth,
2596
+ height: parent.img.destHeight };
2597
+ this.callUpdateCurrTransState();
2598
+ parent.panPoint.totalPannedInternalPoint = totalPannedInternalPoint;
2599
+ parent.img.destLeft = destPoints.startX;
2600
+ parent.img.destTop = destPoints.startY;
2601
+ parent.img.destWidth = destPoints.width;
2602
+ parent.img.destHeight = destPoints.height;
2603
+ }
2604
+ else {
2605
+ this.callUpdateCurrTransState();
2606
+ }
2607
+ if (parent.isCircleCrop) {
2608
+ parent.notify('crop', { prop: 'cropCircle', onPropertyChange: false,
2609
+ value: { context: this.lowerContext, isSave: null, isFlip: null } });
2610
+ }
2611
+ var tempFilter = this.lowerContext.filter;
2612
+ this.lowerContext.filter = parent.getDefaultFilter();
2613
+ parent.notify('shape', { prop: 'iterateObjColl', onPropertyChange: false });
2614
+ parent.notify('freehand-draw', { prop: 'freehandRedraw', onPropertyChange: false,
2615
+ value: { context: this.lowerContext, points: null } });
2616
+ this.lowerContext.filter = tempFilter;
2617
+ };
2618
+ Draw.prototype.setCurrentObj = function (obj) {
2619
+ var parent = this.parent;
2620
+ var isObj = obj ? true : false;
2621
+ obj = obj ? obj : parent.cropObj;
2622
+ parent.transform.cropZoomFactor = obj.cropZoom;
2623
+ parent.transform.defaultZoomFactor = obj.defaultZoom;
2624
+ if (!isObj) {
2625
+ parent.transform.zoomFactor = obj.cropZoom;
2626
+ }
2627
+ else {
2628
+ if (obj.activeObj.shape && obj.activeObj.shape.split('-')[0] === 'crop') {
2629
+ parent.transform.zoomFactor = obj.cropZoom;
2630
+ }
2631
+ else {
2632
+ parent.transform.zoomFactor = obj.defaultZoom;
2633
+ }
2634
+ }
2635
+ parent.setProperties({ zoomSettings: { zoomFactor: obj.zoomFactor } }, true);
2636
+ parent.notify('transform', { prop: 'setPreviousZoomValue', onPropertyChange: false, value: { previousZoomValue: obj.previousZoomValue } });
2637
+ parent.panPoint.totalPannedPoint = extend({}, obj.totalPannedPoint, {}, true);
2638
+ parent.panPoint.totalPannedClientPoint = extend({}, obj.totalPannedClientPoint, {}, true);
2639
+ parent.panPoint.totalPannedInternalPoint = extend({}, obj.totalPannedInternalPoint, {}, true);
2640
+ var point = extend({}, obj.tempFlipPanPoint, {}, true);
2641
+ parent.notify('crop', { prop: 'setTempFlipPanPoint', onPropertyChange: false, value: { point: point } });
2642
+ parent.rotateFlipColl = extend([], obj.rotateFlipColl, [], true);
2643
+ parent.transform.degree = obj.degree;
2644
+ parent.transform.currFlipState = obj.currFlipState;
2645
+ parent.img.destLeft = obj.destPoints.startX;
2646
+ parent.img.destTop = obj.destPoints.startY;
2647
+ parent.img.destWidth = obj.destPoints.width;
2648
+ parent.img.destHeight = obj.destPoints.height;
2649
+ parent.img.srcLeft = obj.srcPoints.startX;
2650
+ parent.img.srcTop = obj.srcPoints.startY;
2651
+ parent.img.srcWidth = obj.srcPoints.width;
2652
+ parent.img.srcHeight = obj.srcPoints.height;
2653
+ if (obj.afterCropActions) {
2654
+ parent.afterCropActions = obj.afterCropActions;
2655
+ }
2656
+ this.lowerContext.filter = obj.filter;
2657
+ parent.notify('filter', { prop: 'setBrightnessAdjusted', onPropertyChange: false, value: { isBrightnessAdjusted: false } });
2658
+ var isCircleCrop = parent.isCircleCrop;
2659
+ var currSelectionPoint;
2660
+ if (isNullOrUndefined(parent.currSelectionPoint)) {
2661
+ currSelectionPoint = null;
2662
+ }
2663
+ else {
2664
+ currSelectionPoint = extend({}, parent.currSelectionPoint, {}, true);
2665
+ parent.currSelectionPoint = null;
2666
+ }
2667
+ parent.isCircleCrop = false;
2668
+ this.drawCropSelectionImage(obj, false);
2669
+ if (parent.transform.degree !== 0) {
2670
+ if (parent.transform.currFlipState === '') {
2671
+ parent.notify('transform', { prop: 'rotatePan', onPropertyChange: false,
2672
+ value: { isCropSelection: null, isDefaultZoom: null } });
2673
+ }
2674
+ else {
2675
+ parent.notify('transform', { prop: 'drawPannedImage', value: { xDiff: 0, yDiff: 0 } });
2676
+ }
2677
+ parent.img.destLeft = obj.destPoints.startX;
2678
+ parent.img.destTop = obj.destPoints.startY;
2679
+ parent.panPoint.totalPannedClientPoint = extend({}, obj.totalPannedClientPoint, {}, true);
2680
+ parent.panPoint.totalPannedInternalPoint = extend({}, obj.totalPannedInternalPoint, {}, true);
2681
+ }
2682
+ parent.activeObj = extend({}, obj.activeObj, {}, true);
2683
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2684
+ if (parent.activeObj.activePoint.width !== 0 && parent.activeObj.activePoint.height !== 0) {
2685
+ this.drawObject('duplicate', null, null, null, true);
2686
+ }
2687
+ var activeObj = extend({}, obj.activeObj, {}, true);
2688
+ var isAfterCropAction = false;
2689
+ if (parent.afterCropActions.length > 0) {
2690
+ var object = { collection: parent.afterCropActions };
2691
+ parent.notify('shape', { prop: 'alignRotateFlipColl', onPropertyChange: false,
2692
+ value: { collection: parent.afterCropActions, isRotateFlipCollection: null, obj: object } });
2693
+ parent.afterCropActions = object['collection'];
2694
+ }
2695
+ var afterCropActions = extend([], parent.afterCropActions, [], true);
2696
+ if (!isObj && afterCropActions.length > 0) {
2697
+ isAfterCropAction = true;
2698
+ for (var i = 0; i < afterCropActions.length; i++) {
2699
+ if (afterCropActions[i] === 'horizontalflip' || afterCropActions[i] === 'verticalflip') {
2700
+ parent.activeObj = extend({}, currSelectionPoint, {}, true);
2701
+ this.rotatedFlipCropSel = true;
2702
+ }
2703
+ parent.notify('transform', { prop: 'updateTransform', onPropertyChange: false, value: { text: afterCropActions[i] } });
2704
+ }
2705
+ activeObj = extend({}, parent.activeObj, {}, true);
2706
+ this.resetPanPoints();
2707
+ parent.activeObj = activeObj;
2708
+ this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
2709
+ if (parent.activeObj.activePoint.width !== 0 && parent.activeObj.activePoint.height !== 0) {
2710
+ this.drawObject('duplicate', null, null, null, true);
2711
+ }
2712
+ if (obj.degree !== parent.transform.degree) {
2713
+ parent.transform.cropZoomFactor = null;
2714
+ parent.transform.zoomFactor = 0;
2715
+ }
2716
+ parent.notify('freehand-draw', { prop: 'updateFHDColl', onPropertyChange: false });
2717
+ if (this.rotatedFlipCropSel) {
2718
+ this.rotatedFlipCropSel = false;
2719
+ }
2720
+ }
2721
+ parent.afterCropActions = afterCropActions;
2722
+ if (!this.isCancelAction && !isAfterCropAction) {
2723
+ parent.notify('freehand-draw', { prop: 'updateFHDColl', onPropertyChange: false });
2724
+ parent.notify('freehand-draw', { prop: 'zoomFHDColl', onPropertyChange: false, value: { isPreventApply: null } });
2725
+ parent.img.destLeft = obj.destPoints.startX;
2726
+ parent.img.destTop = obj.destPoints.startY;
2727
+ }
2728
+ parent.activeObj = activeObj;
2729
+ parent.isCircleCrop = isCircleCrop;
2730
+ if (isNullOrUndefined(currSelectionPoint)) {
2731
+ parent.currSelectionPoint = null;
2732
+ }
2733
+ else {
2734
+ parent.currSelectionPoint = extend({}, currSelectionPoint, {}, true);
2735
+ if (parent.currSelectionPoint && isNullOrUndefined(parent.currSelectionPoint.shape)) {
2736
+ parent.currSelectionPoint = null;
2737
+ }
2738
+ }
2739
+ };
2740
+ Draw.prototype.drawCropSelectionImage = function (obj, isObj) {
2741
+ var parent = this.parent;
2742
+ var temp = this.lowerContext.filter;
2743
+ parent.clearContext(this.lowerContext);
2744
+ parent.clearContext(this.upperContext);
2745
+ this.lowerContext.setTransform(1, 0, 0, 1, 0, 0);
2746
+ if (isObj) {
2747
+ this.updateCurrTransState('initial');
2748
+ }
2749
+ else {
2750
+ this.setTransformColl(this.lowerContext, 'initial');
2751
+ }
2752
+ parent.notify('transform', { prop: 'setDestPointsForFlipState', onPropertyChange: false });
2753
+ this.lowerContext.drawImage(parent.baseImg, parent.img.srcLeft, parent.img.srcTop, parent.img.srcWidth, parent.img.srcHeight, parent.img.destLeft, parent.img.destTop, parent.img.destWidth, parent.img.destHeight);
2754
+ if (isObj) {
2755
+ this.updateCurrTransState('reverse');
2756
+ }
2757
+ else {
2758
+ this.setTransformColl(this.lowerContext, 'reverse');
2759
+ }
2760
+ parent.img.destLeft = parent.cropObj.destPoints.startX;
2761
+ parent.img.destTop = parent.cropObj.destPoints.startY;
2762
+ var activeObj = extend({}, obj.activeObj, {}, true);
2763
+ this.lowerContext.filter = 'none';
2764
+ if (this.isCancelAction) {
2765
+ parent.notify('shape', { prop: 'zoomObjColl', onPropertyChange: false, value: { isPreventApply: null } });
2766
+ parent.notify('freehand-draw', { prop: 'zoomFHDColl', onPropertyChange: false, value: { isPreventApply: null } });
2767
+ }
2768
+ else {
2769
+ parent.img.destLeft = obj.destPoints.startX;
2770
+ parent.img.destTop = obj.destPoints.startY;
2771
+ parent.img.destWidth = obj.destPoints.width;
2772
+ parent.img.destHeight = obj.destPoints.height;
2773
+ parent.img.srcLeft = obj.srcPoints.startX;
2774
+ parent.img.srcTop = obj.srcPoints.startY;
2775
+ parent.img.srcWidth = obj.srcPoints.width;
2776
+ parent.img.srcHeight = obj.srcPoints.height;
2777
+ var destPoints = { startX: parent.img.destLeft, startY: parent.img.destTop, width: parent.img.destWidth,
2778
+ height: parent.img.destHeight };
2779
+ parent.img.destLeft = obj.activeObj.activePoint.startX;
2780
+ parent.img.destTop = obj.activeObj.activePoint.startY;
2781
+ parent.img.destWidth = obj.activeObj.activePoint.width;
2782
+ parent.img.destHeight = obj.activeObj.activePoint.height;
2783
+ parent.notify('shape', { prop: 'zoomObjColl', onPropertyChange: false, value: { isPreventApply: null } });
2784
+ parent.notify('freehand-draw', { prop: 'zoomFHDColl', onPropertyChange: false, value: { isPreventApply: null } });
2785
+ parent.img.destLeft = destPoints.startX;
2786
+ parent.img.destTop = destPoints.startY;
2787
+ parent.img.destWidth = destPoints.width;
2788
+ parent.img.destHeight = destPoints.height;
2789
+ }
2790
+ parent.activeObj = activeObj;
2791
+ this.lowerContext.filter = temp;
2792
+ };
2793
+ Draw.prototype.performPointZoom = function (x, y, type) {
2794
+ var parent = this.parent;
2795
+ var ratioX = (x - parent.img.destLeft) / parent.img.destWidth;
2796
+ var ratioY = (y - parent.img.destTop) / parent.img.destHeight;
2797
+ var isUndoRedo = parent.isUndoRedo;
2798
+ parent.isUndoRedo = true;
2799
+ parent.setProperties({ zoomSettings: { zoomPoint: { x: x, y: y } } }, true);
2800
+ if (type === 'zoomIn') {
2801
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
2802
+ value: { zoomFactor: .1, zoomPoint: null } });
2803
+ }
2804
+ else if (type === 'zoomOut') {
2805
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
2806
+ value: { zoomFactor: -.1, zoomPoint: null } });
2807
+ }
2808
+ parent.isUndoRedo = isUndoRedo;
2809
+ if (parent.transform.zoomFactor > 0) {
2810
+ var destLeft = parent.img.destLeft;
2811
+ var destTop = parent.img.destTop;
2812
+ var activeObj = extend({}, parent.activeObj, {}, true);
2813
+ if (parent.transform.degree === 0) {
2814
+ parent.img.destLeft = x - (ratioX * parent.img.destWidth);
2815
+ parent.img.destTop = y - (ratioY * parent.img.destHeight);
2816
+ this.drawZoomPanImage(parent.img.destLeft - destLeft, parent.img.destTop - destTop);
2817
+ }
2818
+ else {
2819
+ var isCropTab = parent.isCropTab;
2820
+ parent.isCropTab = true;
2821
+ var objColl = extend([], parent.objColl, [], true);
2822
+ var pointColl = extend([], parent.pointColl, [], true);
2823
+ parent.objColl = [];
2824
+ parent.pointColl = [];
2825
+ parent.freehandCounter = 0;
2826
+ var object = { selPointColl: null };
2827
+ parent.notify('freehand-draw', { prop: 'getSelPointColl', onPropertyChange: false,
2828
+ value: { obj: object } });
2829
+ var cropSelPointColl = object['selPointColl'];
2830
+ parent.notify('freehand-draw', { prop: 'setSelPointColl', onPropertyChange: false,
2831
+ value: { obj: { selPointColl: [] } } });
2832
+ parent.panPoint.currentPannedPoint = { x: (x - (ratioX * parent.img.destWidth)) - destLeft,
2833
+ y: (y - (ratioY * parent.img.destHeight)) - destTop };
2834
+ parent.notify('transform', { prop: 'rotatePan', onPropertyChange: false,
2835
+ value: { isCropSelection: null, isDefaultZoom: null } });
2836
+ parent.isCropTab = isCropTab;
2837
+ parent.objColl = objColl;
2838
+ parent.pointColl = pointColl;
2839
+ parent.freehandCounter = parent.pointColl.length;
2840
+ parent.notify('freehand-draw', { prop: 'setSelPointColl', onPropertyChange: false,
2841
+ value: { obj: { selPointColl: cropSelPointColl } } });
2842
+ parent.notify('shape', { prop: 'panObjColl', onPropertyChange: false,
2843
+ value: { xDiff: parent.panPoint.currentPannedPoint.x, yDiff: parent.panPoint.currentPannedPoint.y, panRegion: '' } });
2844
+ parent.notify('freehand-draw', { prop: 'panFHDColl', onPropertyChange: false,
2845
+ value: { xDiff: parent.panPoint.currentPannedPoint.x, yDiff: parent.panPoint.currentPannedPoint.y, panRegion: '' } });
2846
+ }
2847
+ this.adjustPanning(activeObj);
2848
+ parent.activeObj = activeObj;
2849
+ if (parent.activeObj.activePoint.width !== 0 && parent.activeObj.activePoint.height !== 0) {
2850
+ this.drawObject('duplicate', null, null, null, true);
2851
+ }
2852
+ }
2853
+ };
2854
+ Draw.prototype.adjustPanning = function (activeObj) {
2855
+ var parent = this.parent;
2856
+ if (activeObj.activePoint.width !== 0 && activeObj.activePoint.height !== 0) {
2857
+ var destLeft = parent.img.destLeft;
2858
+ var destTop = parent.img.destTop;
2859
+ var point = { x: 0, y: 0 };
2860
+ if (parent.img.destLeft > activeObj.activePoint.startX) {
2861
+ point.x = parent.img.destLeft - activeObj.activePoint.startX;
2862
+ }
2863
+ else if (parent.img.destLeft + parent.img.destWidth < activeObj.activePoint.startX + activeObj.activePoint.width) {
2864
+ point.x = (parent.img.destLeft + parent.img.destWidth) - (activeObj.activePoint.startX + activeObj.activePoint.width);
2865
+ }
2866
+ if (parent.img.destTop > activeObj.activePoint.startY) {
2867
+ point.y = parent.img.destTop - activeObj.activePoint.startY;
2868
+ }
2869
+ else if (parent.img.destTop + parent.img.destHeight < activeObj.activePoint.startY + activeObj.activePoint.height) {
2870
+ point.y = (parent.img.destTop + parent.img.destHeight) - (activeObj.activePoint.startY + activeObj.activePoint.height);
2871
+ }
2872
+ if (parent.transform.degree === 0) {
2873
+ parent.img.destLeft -= point.x;
2874
+ parent.img.destTop -= point.y;
2875
+ this.drawZoomPanImage(parent.img.destLeft - destLeft, parent.img.destTop - destTop);
2876
+ }
2877
+ else {
2878
+ var isCropTab = parent.isCropTab;
2879
+ parent.isCropTab = true;
2880
+ var objColl = extend([], parent.objColl, [], true);
2881
+ var pointColl = extend([], parent.pointColl, [], true);
2882
+ parent.objColl = [];
2883
+ parent.pointColl = [];
2884
+ parent.freehandCounter = 0;
2885
+ var object = { selPointColl: null };
2886
+ parent.notify('freehand-draw', { prop: 'getSelPointColl', onPropertyChange: false,
2887
+ value: { obj: object } });
2888
+ var cropSelPointColl = object['selPointColl'];
2889
+ parent.notify('freehand-draw', { prop: 'setSelPointColl', onPropertyChange: false,
2890
+ value: { obj: { selPointColl: [] } } });
2891
+ parent.img.destLeft -= point.x;
2892
+ parent.img.destTop -= point.y;
2893
+ parent.panPoint.currentPannedPoint = { x: parent.img.destLeft - destLeft, y: parent.img.destTop - destTop };
2894
+ parent.notify('transform', { prop: 'rotatePan', onPropertyChange: false,
2895
+ value: { isCropSelection: null, isDefaultZoom: null } });
2896
+ parent.isCropTab = isCropTab;
2897
+ parent.objColl = objColl;
2898
+ parent.pointColl = pointColl;
2899
+ parent.freehandCounter = parent.pointColl.length;
2900
+ parent.notify('freehand-draw', { prop: 'setSelPointColl', onPropertyChange: false,
2901
+ value: { obj: { selPointColl: cropSelPointColl } } });
2902
+ parent.notify('shape', { prop: 'panObjColl', onPropertyChange: false,
2903
+ value: { xDiff: parent.panPoint.currentPannedPoint.x, yDiff: parent.panPoint.currentPannedPoint.y, panRegion: '' } });
2904
+ parent.notify('freehand-draw', { prop: 'panFHDColl', onPropertyChange: false,
2905
+ value: { xDiff: parent.panPoint.currentPannedPoint.x, yDiff: parent.panPoint.currentPannedPoint.y, panRegion: '' } });
2906
+ }
2907
+ }
2908
+ };
2909
+ Draw.prototype.drawZoomPanImage = function (x, y) {
2910
+ var parent = this.parent;
2911
+ parent.notify('shape', { prop: 'panObjColl', onPropertyChange: false,
2912
+ value: { xDiff: x, yDiff: y, panRegion: '' } });
2913
+ parent.notify('freehand-draw', { prop: 'panFHDColl', onPropertyChange: false,
2914
+ value: { xDiff: x, yDiff: y, panRegion: '' } });
2915
+ this.renderImage(true);
2916
+ var obj = { width: 0, height: 0 };
2917
+ parent.notify('transform', { prop: 'calcMaxDimension', onPropertyChange: false,
2918
+ value: { width: parent.img.srcWidth, height: parent.img.srcHeight, obj: obj } });
2919
+ var maxDimension = obj;
2920
+ maxDimension.width += (maxDimension.width * parent.transform.zoomFactor);
2921
+ maxDimension.height += (maxDimension.height * parent.transform.zoomFactor);
2922
+ parent.panPoint.totalPannedPoint.x += x;
2923
+ parent.panPoint.totalPannedPoint.y += y;
2924
+ parent.notify('crop', { prop: 'setTempFlipPanPoint', onPropertyChange: false, value: { point: { x: 0, y: 0 } } });
2925
+ };
2926
+ Draw.prototype.openNewImage = function () {
2927
+ var parent = this.parent;
2928
+ var inMemoryContext = parent.inMemoryCanvas.getContext('2d');
2929
+ showSpinner(parent.element);
2930
+ parent.element.style.opacity = '0.5';
2931
+ var toolbar = document.querySelector('#' + parent.element.id + '_currPos');
2932
+ if (toolbar) {
2933
+ toolbar.style.display = 'none';
2934
+ }
2935
+ var obj = { defToolbarItems: null };
2936
+ if (!isBlazor()) {
2937
+ parent.notify('toolbar', { prop: 'getDefToolbarItems', value: { obj: obj } });
2938
+ if (obj['defToolbarItems'].length === 0 &&
2939
+ (isNullOrUndefined(document.getElementById(parent.element.id + '_toolbar')))) {
2940
+ var height = parent.element.querySelector('#' + parent.element.id + '_toolbarArea').clientHeight;
2941
+ parent.notify('toolbar', { prop: 'setToolbarHeight', value: { height: height } });
2942
+ }
2943
+ }
2944
+ else {
2945
+ if (parent.element.querySelector('#' + parent.element.id + '_toolbar')) {
2946
+ parent.toolbarHeight = parent.element.querySelector('#' + parent.element.id + '_toolbar').clientHeight;
2947
+ }
2948
+ else {
2949
+ parent.toolbarHeight = 0;
2950
+ }
2951
+ }
2952
+ parent.reset();
2953
+ parent.update();
2954
+ parent.transform.degree = 0;
2955
+ parent.transform.zoomFactor = 0;
2956
+ parent.isImageLoaded = false;
2957
+ parent.currSelectionPoint = null;
2958
+ var type = typeof (this.openURL);
2959
+ if (type === 'string') {
2960
+ var fileName = this.openURL.split('.');
2961
+ if (fileName.length > 1) {
2962
+ fileName = fileName[fileName.length - 2].split('/');
2963
+ this.fileName = fileName[fileName.length - 1];
2964
+ }
2965
+ else {
2966
+ this.fileName = 'ImageEditor';
2967
+ }
2968
+ this.fileType = this.getFileExtensionFromURL(this.openURL);
2969
+ if (this.fileType) {
2970
+ this.fileType = parent.toPascalCase(this.fileType);
2971
+ var fileType = this.fileType.toLowerCase();
2972
+ if (fileType === 'jpg' || fileType === 'jpeg') {
2973
+ this.fileType = 'Jpeg';
2974
+ fileType = 'jpeg';
2975
+ }
2976
+ if (fileType !== 'jpeg' && fileType !== 'png' && fileType !== 'svg') {
2977
+ this.fileType = null;
2978
+ }
2979
+ }
2980
+ this.imageOnLoad(this.openURL);
2981
+ }
2982
+ else {
2983
+ this.fileName = 'ImageEditor';
2984
+ this.fileType = null;
2985
+ parent.lowerCanvas = document.querySelector('#' + parent.element.id + '_lowerCanvas');
2986
+ parent.upperCanvas = document.querySelector('#' + parent.element.id + '_upperCanvas');
2987
+ this.lowerContext = parent.lowerCanvas.getContext('2d');
2988
+ this.upperContext = parent.upperCanvas.getContext('2d');
2989
+ parent.clearContext(this.lowerContext);
2990
+ parent.clearContext(this.upperContext);
2991
+ parent.clearContext(inMemoryContext);
2992
+ parent.inMemoryCanvas.width = parent.baseImg.width = this.openURL.width;
2993
+ parent.inMemoryCanvas.height = parent.baseImg.height = this.openURL.height;
2994
+ inMemoryContext.putImageData(this.openURL, 0, 0);
2995
+ parent.baseImg.src = parent.inMemoryCanvas.toDataURL();
2996
+ }
2997
+ };
2998
+ Draw.prototype.dlgBtnClick = function () {
2999
+ var parent = this.parent;
3000
+ parent.export();
3001
+ if (this.isFileChanged) {
3002
+ parent.isImageLoaded = this.isFileChanged = false;
3003
+ parent.reset();
3004
+ this.checkToolbarTemplate(this.inputElem, this.openURL);
3005
+ }
3006
+ else {
3007
+ this.reset();
3008
+ this.openNewImage();
3009
+ }
3010
+ if (!isBlazor()) {
3011
+ getComponent(document.getElementById(parent.element.id + '_dialog'), 'dialog').destroy();
3012
+ }
3013
+ this.isImageEdited = false;
3014
+ };
3015
+ Draw.prototype.dlgCloseBtnClick = function () {
3016
+ var parent = this.parent;
3017
+ this.baseImgSrc = parent.baseImg.src;
3018
+ if (this.isFileChanged) {
3019
+ parent.isImageLoaded = this.isFileChanged = false;
3020
+ parent.reset();
3021
+ this.checkToolbarTemplate(this.inputElem, this.openURL);
3022
+ }
3023
+ else {
3024
+ this.reset();
3025
+ this.openNewImage();
3026
+ }
3027
+ if (!isBlazor()) {
3028
+ getComponent(document.getElementById(parent.element.id + '_dialog'), 'dialog').destroy();
3029
+ }
3030
+ this.isImageEdited = false;
3031
+ };
3032
+ Draw.prototype.showDialogPopup = function () {
3033
+ this.parent.element.querySelector('#' + this.parent.element.id + '_dialog').style.display = 'block';
3034
+ var dialog = new Dialog({
3035
+ header: 'Confirm Save Changes',
3036
+ closeOnEscape: true,
3037
+ content: '<span>Do you want to save the changes you made to the image?</span>',
3038
+ target: document.getElementById('target'),
3039
+ width: '285px',
3040
+ isModal: true,
3041
+ animationSettings: { effect: 'Zoom' },
3042
+ close: this.dlgCloseBtnClick.bind(this),
3043
+ buttons: [
3044
+ { click: this.dlgCloseBtnClick.bind(this),
3045
+ buttonModel: { content: 'No', iconCss: 'e-icons e-close' }
3046
+ },
3047
+ { click: this.dlgBtnClick.bind(this),
3048
+ buttonModel: { content: 'Yes', isPrimary: true, iconCss: 'e-icons e-check' } }
3049
+ ]
3050
+ });
3051
+ dialog.appendTo('#' + this.parent.element.id + '_dialog');
3052
+ };
3053
+ Draw.prototype.restoreOldImage = function () {
3054
+ if (this.parent.isImageLoaded) {
3055
+ // if (this.isImageEdited || this.parent.pointColl.length > 0 || this.parent.objColl.length > 0) {
3056
+ // this.showDialogPopup();
3057
+ // } else {
3058
+ // this.reset();
3059
+ // this.openNewImage();
3060
+ // }
3061
+ // const data: ImageData = this.parent.getImageData();
3062
+ // const canvas: HTMLCanvasElement = document.createElement('canvas');
3063
+ // canvas.width = data.width; canvas.height = data.height;
3064
+ // canvas.getContext('2d').putImageData(data, 0, 0);
3065
+ // this.baseImgSrc = canvas.toDataURL();
3066
+ this.reset();
3067
+ this.openNewImage();
3068
+ }
3069
+ else {
3070
+ this.openNewImage();
3071
+ }
3072
+ };
3073
+ Draw.prototype.open = function (data) {
3074
+ if (!this.parent.disabled) {
3075
+ this.openURL = data;
3076
+ this.restoreOldImage();
3077
+ }
3078
+ };
3079
+ Draw.prototype.getInitialLoaded = function (object) {
3080
+ object['isInitialLoaded'] = this.isInitialLoading;
3081
+ };
3082
+ Draw.prototype.getFileExtensionFromURL = function (url) {
3083
+ var lastDotIndex = url.lastIndexOf(".");
3084
+ if (lastDotIndex !== -1) {
3085
+ return url.slice(lastDotIndex + 1).toLowerCase();
3086
+ }
3087
+ return null;
3088
+ };
3089
+ Draw.prototype.fileSelect = function (inputElement, args) {
3090
+ var parent = this.parent;
3091
+ if (!parent.disabled) {
3092
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
3093
+ var filesData = args.target.files[0];
3094
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
3095
+ var fileData = filesData;
3096
+ var fileExtension = fileData.name && fileData.name.split('.')[1].toLowerCase();
3097
+ if (fileExtension && ['jpg', 'jpeg', 'png', 'svg'].indexOf(fileExtension) === -1) {
3098
+ this.errorLoading();
3099
+ return;
3100
+ }
3101
+ showSpinner(parent.element);
3102
+ parent.element.style.opacity = '0.5';
3103
+ this.inputElem = inputElement;
3104
+ fileExtension = fileData.name && fileData.name.split('.')[1];
3105
+ if (fileExtension) {
3106
+ var fileType = parent.toPascalCase(fileExtension);
3107
+ if (fileType === 'JPG' || fileType === 'Jpg') {
3108
+ this.fileType = 'Jpeg';
3109
+ }
3110
+ else {
3111
+ this.fileType = fileType;
3112
+ }
3113
+ }
3114
+ else {
3115
+ this.fileType = null;
3116
+ }
3117
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
3118
+ var URL_1 = window.URL;
3119
+ var url = URL_1.createObjectURL(filesData);
3120
+ this.openURL = url;
3121
+ if (parent.isImageLoaded && (this.isImageEdited || parent.pointColl.length > 0 || parent.objColl.length > 0)) {
3122
+ this.isFileChanged = true;
3123
+ if (!isBlazor()) {
3124
+ this.showDialogPopup();
3125
+ }
3126
+ else {
3127
+ parent.dotNetRef.invokeMethodAsync('UpdateDialog');
3128
+ }
3129
+ }
3130
+ else {
3131
+ this.checkToolbarTemplate(inputElement, url);
3132
+ }
3133
+ }
3134
+ };
3135
+ Draw.prototype.checkToolbarTemplate = function (inputElement, url) {
3136
+ var parent = this.parent;
3137
+ if (isNullOrUndefined(parent.toolbarTemplate)) {
3138
+ parent.reset();
3139
+ parent.update();
3140
+ }
3141
+ this.fileName = inputElement.value.split('\\')[inputElement.value.split('\\').length - 1];
3142
+ this.fileName = this.fileName.split('.')[0];
3143
+ this.imageOnLoad(url.toString());
3144
+ inputElement.value = '';
3145
+ };
3146
+ Draw.prototype.moveToSelectionRange = function (type, activeObj) {
3147
+ var parent = this.parent;
3148
+ if (parent.activeObj.shape) {
3149
+ if (type === 'rotateleft' || type === 'rotateright') {
3150
+ var zoomFactor = parent.transform.zoomFactor;
3151
+ parent.objColl.push(parent.activeObj);
3152
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
3153
+ if (parent.transform.degree % 90 === 0 && parent.transform.degree % 180 !== 0) {
3154
+ if (parent.objColl[parent.objColl.length - 1].activePoint.width < activeObj.activePoint.height) {
3155
+ for (var i = 2; i < parent.zoomSettings.maxZoomFactor; i++) {
3156
+ if (parent.objColl[parent.objColl.length - 1].activePoint.width >= activeObj.activePoint.height ||
3157
+ this.isSelectionBiggerThanCanvas(parent.objColl[parent.objColl.length - 1]) ||
3158
+ this.isSelectionOutsideCanvas(parent.objColl[parent.objColl.length - 1])) {
3159
+ if (!isNullOrUndefined(zoomFactor)) {
3160
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3161
+ value: { zoomFactor: -0.1, zoomPoint: null } });
3162
+ }
3163
+ break;
3164
+ }
3165
+ zoomFactor += 0.1;
3166
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3167
+ value: { zoomFactor: zoomFactor, zoomPoint: null } });
3168
+ }
3169
+ }
3170
+ else {
3171
+ for (var i = 2; i < parent.zoomSettings.maxZoomFactor; i++) {
3172
+ if (parent.objColl[parent.objColl.length - 1].activePoint.width >= activeObj.activePoint.height ||
3173
+ this.isSelectionBiggerThanCanvas(parent.objColl[parent.objColl.length - 1]) ||
3174
+ this.isSelectionOutsideCanvas(parent.objColl[parent.objColl.length - 1])) {
3175
+ if (!isNullOrUndefined(zoomFactor)) {
3176
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3177
+ value: { zoomFactor: 0.1, zoomPoint: null } });
3178
+ }
3179
+ break;
3180
+ }
3181
+ zoomFactor -= .1;
3182
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3183
+ value: { zoomFactor: zoomFactor, zoomPoint: null } });
3184
+ }
3185
+ }
3186
+ }
3187
+ else {
3188
+ if (parent.objColl[parent.objColl.length - 1].activePoint.height < activeObj.activePoint.width) {
3189
+ for (var i = 2; i < parent.zoomSettings.maxZoomFactor; i++) {
3190
+ if (parent.objColl[parent.objColl.length - 1].activePoint.height >= activeObj.activePoint.width ||
3191
+ this.isSelectionBiggerThanCanvas(parent.objColl[parent.objColl.length - 1]) ||
3192
+ this.isSelectionOutsideCanvas(parent.objColl[parent.objColl.length - 1])) {
3193
+ if (!isNullOrUndefined(zoomFactor)) {
3194
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3195
+ value: { zoomFactor: -0.1, zoomPoint: null } });
3196
+ }
3197
+ break;
3198
+ }
3199
+ zoomFactor += 0.1;
3200
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3201
+ value: { zoomFactor: zoomFactor, zoomPoint: null } });
3202
+ }
3203
+ }
3204
+ else {
3205
+ for (var i = 2; i < parent.zoomSettings.maxZoomFactor; i++) {
3206
+ if (parent.objColl[parent.objColl.length - 1].activePoint.height >= activeObj.activePoint.width ||
3207
+ this.isSelectionBiggerThanCanvas(parent.objColl[parent.objColl.length - 1]) ||
3208
+ this.isSelectionOutsideCanvas(parent.objColl[parent.objColl.length - 1])) {
3209
+ if (!isNullOrUndefined(zoomFactor)) {
3210
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3211
+ value: { zoomFactor: 0.1, zoomPoint: null } });
3212
+ }
3213
+ break;
3214
+ }
3215
+ zoomFactor -= .1;
3216
+ parent.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
3217
+ value: { zoomFactor: zoomFactor, zoomPoint: null } });
3218
+ }
3219
+ }
3220
+ }
3221
+ var panX = (parent.lowerCanvas.clientWidth / 2) - (parent.objColl[parent.objColl.length - 1].activePoint.startX +
3222
+ (parent.objColl[parent.objColl.length - 1].activePoint.width / 2));
3223
+ var panY = (parent.lowerCanvas.clientHeight / 2) - (parent.objColl[parent.objColl.length - 1].activePoint.startY +
3224
+ (parent.objColl[parent.objColl.length - 1].activePoint.height / 2));
3225
+ if (parent.transform.degree === 0) {
3226
+ parent.img.destLeft += panX;
3227
+ parent.img.destTop += panY;
3228
+ parent.notify('transform', { prop: 'drawPannImage', value: { point: { x: panX, y: panY } } });
3229
+ }
3230
+ else {
3231
+ parent.panPoint.currentPannedPoint = { x: panX, y: panY };
3232
+ parent.notify('transform', { prop: 'drawPannedImage', value: { xDiff: panX, yDiff: panY } });
3233
+ parent.panPoint.currentPannedPoint = { x: 0, y: 0 };
3234
+ }
3235
+ parent.notify('transform', { prop: 'setTempPanMove', onPropertyChange: false,
3236
+ value: { point: null } });
3237
+ parent.activeObj = extend({}, parent.objColl[parent.objColl.length - 1]);
3238
+ parent.objColl.pop();
3239
+ parent.notify('draw', { prop: 'drawObject', onPropertyChange: false, value: { canvas: 'duplicate', obj: parent.activeObj } });
3240
+ }
3241
+ }
3242
+ };
3243
+ Draw.prototype.isSelectionBiggerThanCanvas = function (obj) {
3244
+ var isBigger = false;
3245
+ if (obj.activePoint.startX <= this.parent.img.destLeft ||
3246
+ obj.activePoint.startY <= this.parent.img.destTop ||
3247
+ obj.activePoint.endX >= this.parent.img.destLeft + this.parent.img.destWidth ||
3248
+ obj.activePoint.endY >= this.parent.img.destTop + this.parent.img.destHeight) {
3249
+ isBigger = true;
3250
+ }
3251
+ return isBigger;
3252
+ };
3253
+ Draw.prototype.isSelectionOutsideCanvas = function (obj) {
3254
+ var isOutside = false;
3255
+ if ((obj.activePoint.height < this.parent.lowerCanvas.height - this.parent.toolbarHeight) ||
3256
+ (obj.activePoint.width < this.parent.lowerCanvas.width)) {
3257
+ isOutside = true;
3258
+ }
3259
+ return isOutside;
3260
+ };
3261
+ return Draw;
3262
+ }());
3263
+ export { Draw };