@syncfusion/ej2-image-editor 29.2.4 → 30.1.37

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 (95) hide show
  1. package/.eslintrc.json +2 -0
  2. package/dist/ej2-image-editor.umd.min.js +2 -2
  3. package/dist/ej2-image-editor.umd.min.js.map +1 -1
  4. package/dist/es6/ej2-image-editor.es2015.js +884 -225
  5. package/dist/es6/ej2-image-editor.es2015.js.map +1 -1
  6. package/dist/es6/ej2-image-editor.es5.js +906 -235
  7. package/dist/es6/ej2-image-editor.es5.js.map +1 -1
  8. package/dist/global/ej2-image-editor.min.js +2 -2
  9. package/dist/global/ej2-image-editor.min.js.map +1 -1
  10. package/dist/global/index.d.ts +1 -1
  11. package/package.json +15 -47
  12. package/src/image-editor/action/crop.js +1 -1
  13. package/src/image-editor/action/draw.d.ts +1 -0
  14. package/src/image-editor/action/draw.js +103 -31
  15. package/src/image-editor/action/export.js +3 -0
  16. package/src/image-editor/action/selection.d.ts +1 -0
  17. package/src/image-editor/action/selection.js +39 -4
  18. package/src/image-editor/action/shape.d.ts +1 -0
  19. package/src/image-editor/action/shape.js +334 -49
  20. package/src/image-editor/action/transform.js +51 -43
  21. package/src/image-editor/action/undo-redo.d.ts +2 -0
  22. package/src/image-editor/action/undo-redo.js +22 -1
  23. package/src/image-editor/base/enum.d.ts +3 -1
  24. package/src/image-editor/base/enum.js +2 -0
  25. package/src/image-editor/base/image-editor.d.ts +13 -2
  26. package/src/image-editor/base/image-editor.js +242 -27
  27. package/src/image-editor/base/interface.d.ts +17 -1
  28. package/src/image-editor/renderer/toolbar.d.ts +2 -0
  29. package/src/image-editor/renderer/toolbar.js +110 -79
  30. package/styles/bds-lite.css +4 -0
  31. package/styles/bds.css +8 -0
  32. package/styles/bootstrap-dark-lite.css +4 -0
  33. package/styles/bootstrap-dark.css +4 -0
  34. package/styles/bootstrap-lite.css +4 -0
  35. package/styles/bootstrap.css +4 -0
  36. package/styles/bootstrap4-lite.css +4 -0
  37. package/styles/bootstrap4.css +4 -0
  38. package/styles/bootstrap5-dark-lite.css +4 -0
  39. package/styles/bootstrap5-dark.css +4 -0
  40. package/styles/bootstrap5-lite.css +4 -0
  41. package/styles/bootstrap5.3-lite.css +4 -0
  42. package/styles/bootstrap5.3.css +4 -0
  43. package/styles/bootstrap5.css +4 -0
  44. package/styles/fabric-dark-lite.css +4 -0
  45. package/styles/fabric-dark.css +19 -0
  46. package/styles/fabric-lite.css +4 -0
  47. package/styles/fabric.css +19 -0
  48. package/styles/fluent-dark-lite.css +4 -0
  49. package/styles/fluent-dark.css +13 -0
  50. package/styles/fluent-lite.css +4 -0
  51. package/styles/fluent.css +13 -0
  52. package/styles/fluent2-lite.css +8 -0
  53. package/styles/fluent2.css +12 -0
  54. package/styles/highcontrast-light-lite.css +4 -0
  55. package/styles/highcontrast-light.css +4 -0
  56. package/styles/highcontrast-lite.css +9 -1
  57. package/styles/highcontrast.css +14 -1
  58. package/styles/image-editor/_bigger.scss +56 -0
  59. package/styles/image-editor/_highcontrast-definition.scss +1 -1
  60. package/styles/image-editor/_layout.scss +36 -0
  61. package/styles/image-editor/bds.css +8 -0
  62. package/styles/image-editor/bootstrap-dark.css +4 -0
  63. package/styles/image-editor/bootstrap.css +4 -0
  64. package/styles/image-editor/bootstrap4.css +4 -0
  65. package/styles/image-editor/bootstrap5-dark.css +4 -0
  66. package/styles/image-editor/bootstrap5.3.css +4 -0
  67. package/styles/image-editor/bootstrap5.css +4 -0
  68. package/styles/image-editor/fabric-dark.css +19 -0
  69. package/styles/image-editor/fabric.css +19 -0
  70. package/styles/image-editor/fluent-dark.css +13 -0
  71. package/styles/image-editor/fluent.css +13 -0
  72. package/styles/image-editor/fluent2.css +12 -0
  73. package/styles/image-editor/highcontrast-light.css +4 -0
  74. package/styles/image-editor/highcontrast.css +14 -1
  75. package/styles/image-editor/material-dark.css +4 -0
  76. package/styles/image-editor/material.css +8 -0
  77. package/styles/image-editor/material3-dark.css +21 -1
  78. package/styles/image-editor/material3.css +21 -1
  79. package/styles/image-editor/tailwind-dark.css +8 -0
  80. package/styles/image-editor/tailwind.css +8 -0
  81. package/styles/image-editor/tailwind3.css +4 -0
  82. package/styles/material-dark-lite.css +4 -0
  83. package/styles/material-dark.css +4 -0
  84. package/styles/material-lite.css +4 -0
  85. package/styles/material.css +8 -0
  86. package/styles/material3-dark-lite.css +12 -0
  87. package/styles/material3-dark.css +21 -1
  88. package/styles/material3-lite.css +12 -0
  89. package/styles/material3.css +21 -1
  90. package/styles/tailwind-dark-lite.css +4 -0
  91. package/styles/tailwind-dark.css +8 -0
  92. package/styles/tailwind-lite.css +4 -0
  93. package/styles/tailwind.css +8 -0
  94. package/styles/tailwind3-lite.css +4 -0
  95. package/styles/tailwind3.css +4 -0
@@ -171,7 +171,7 @@ var Crop = /** @__PURE__ @class */ (function () {
171
171
  srcTop: (actPoint.startY * ratio.height) - (img.destTop * ratio.height),
172
172
  srcWidth: (actPoint.width * ratio.width), srcHeight: (actPoint.height * ratio.height),
173
173
  destLeft: (parent.lowerCanvas.clientWidth - maxDimension.width) / 2,
174
- destTop: (parent.lowerCanvas.clientHeight - maxDimension.height + 1) / 2,
174
+ destTop: (parent.lowerCanvas.clientHeight - maxDimension.height) / 2,
175
175
  destWidth: maxDimension.width, destHeight: maxDimension.height };
176
176
  var temp = this.lowerContext.filter;
177
177
  parent.notify('draw', { prop: 'drawImage', onPropertyChange: false });
@@ -972,7 +972,7 @@ var Draw = /** @__PURE__ @class */ (function () {
972
972
  this.isShapeTextInserted = false;
973
973
  this.isRotateZoom = false; // To restore zoomed image on selection crop selection
974
974
  this.tempStrokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null, outlineColor: '', radius: null, outlineWidth: null }; // restore stroke settings on cancel
975
- this.tempTextSettings = { text: 'Enter Text', fontFamily: '', fontSize: null, fontRatio: null, bold: false, italic: false, underline: false }; // restore text settings on cancel
975
+ this.tempTextSettings = { text: 'Enter Text', fontFamily: '', fontSize: null, fontRatio: null, bold: false, italic: false, underline: false, strikethrough: false }; // restore text settings on cancel
976
976
  this.tempAdjValue = ''; // for temp internal slider value
977
977
  this.tempFilter = ''; // restore filter style on cancel
978
978
  this.tempUndoRedoStep = 0;
@@ -1318,7 +1318,7 @@ var Draw = /** @__PURE__ @class */ (function () {
1318
1318
  this.tempAdjValue = '';
1319
1319
  this.tempStrokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null, radius: null, outlineColor: '', outlineWidth: null };
1320
1320
  this.tempTextSettings =
1321
- { text: 'Enter Text', fontFamily: this.parent.fontFamily.default, fontSize: null, fontRatio: null, bold: false, italic: false, underline: false };
1321
+ { text: 'Enter Text', fontFamily: this.parent.fontFamily.default, fontSize: null, fontRatio: null, bold: false, italic: false, underline: false, strikethrough: false };
1322
1322
  this.tempUndoRedoStep = this.tempFreehandCounter = this.tempCurrFhdIndex = 0;
1323
1323
  this.tempZoomFactor = null;
1324
1324
  this.isCancelAction = false;
@@ -2915,7 +2915,7 @@ var Draw = /** @__PURE__ @class */ (function () {
2915
2915
  var actObj = parent.activeObj;
2916
2916
  var _a = actObj.activePoint, startX = _a.startX, startY = _a.startY, width = _a.width, height = _a.height;
2917
2917
  var rows = actObj.keyHistory.split('\n');
2918
- var _b = actObj.textSettings, fontFamily = _b.fontFamily, bold = _b.bold, italic = _b.italic;
2918
+ var _b = actObj.textSettings, fontFamily = _b.fontFamily, bold = _b.bold, italic = _b.italic, underline = _b.underline, strikethrough = _b.strikethrough;
2919
2919
  var fontSize = actObj.textSettings.fontSize;
2920
2920
  var lHeight = fontSize + fontSize * 0.25;
2921
2921
  var lineHeight = ((lHeight * rows.length) - (fontSize * rows.length)) / rows.length;
@@ -2929,18 +2929,18 @@ var Draw = /** @__PURE__ @class */ (function () {
2929
2929
  canvasDraw.fillStyle = tempFill;
2930
2930
  for (var i = 0; i < rows.length; i++) {
2931
2931
  var text = rows[i];
2932
- var yPoint = ((i + 1) * fontSize * 0.85) + (i * lineHeight);
2932
+ var yPoint = ((i + 1) * fontSize * 0.9) + (i * lineHeight);
2933
2933
  if (parent.transform.degree === -360) {
2934
2934
  parent.transform.degree = 0;
2935
2935
  }
2936
2936
  if (parent.transform.degree === 0 || parent.transform.degree === 180) {
2937
2937
  if (fontSize > height) {
2938
- fontSize = actObj.textSettings.fontSize = height - (height * 0.1);
2938
+ fontSize = actObj.textSettings.fontSize = height / 1.18;
2939
2939
  }
2940
2940
  }
2941
2941
  else {
2942
2942
  if (fontSize > width) {
2943
- fontSize = actObj.textSettings.fontSize = width - (width * 0.1);
2943
+ fontSize = actObj.textSettings.fontSize = width / 1.18;
2944
2944
  }
2945
2945
  }
2946
2946
  canvasDraw.strokeStyle = actObj.strokeSettings.outlineColor;
@@ -2987,6 +2987,14 @@ var Draw = /** @__PURE__ @class */ (function () {
2987
2987
  else {
2988
2988
  canvasDraw.strokeText(text, startX + fontSize * 0.1, startY + yPoint);
2989
2989
  canvasDraw.fillText(text, startX + fontSize * 0.1, startY + yPoint);
2990
+ if (underline) {
2991
+ var yOffset = yPoint + fontSize * 0.1;
2992
+ this.drawTextDecoration(canvasDraw, text, startX, startY, yOffset, fontSize, 0.1);
2993
+ }
2994
+ if (strikethrough) {
2995
+ var yOffset = yPoint - lineHeight - fontSize * 0.025;
2996
+ this.drawTextDecoration(canvasDraw, text, startX, startY, yOffset, fontSize, 0.1);
2997
+ }
2990
2998
  }
2991
2999
  canvasDraw.lineWidth = tempWidth;
2992
3000
  }
@@ -2996,6 +3004,19 @@ var Draw = /** @__PURE__ @class */ (function () {
2996
3004
  this.drawOuterSelection(canvasDraw);
2997
3005
  }
2998
3006
  };
3007
+ Draw.prototype.drawTextDecoration = function (canvasDraw, text, startX, startY, yOffset, fontSize, horizontalPadding) {
3008
+ if (horizontalPadding === void 0) { horizontalPadding = 0.1; }
3009
+ var tempWidth = canvasDraw.lineWidth;
3010
+ var textWidth = canvasDraw.measureText(text).width;
3011
+ canvasDraw.lineWidth = fontSize * 0.1;
3012
+ canvasDraw.beginPath();
3013
+ canvasDraw.moveTo(startX + fontSize * horizontalPadding, startY + yOffset);
3014
+ canvasDraw.lineTo(startX + textWidth + fontSize * horizontalPadding, startY + yOffset);
3015
+ canvasDraw.strokeStyle = canvasDraw.fillStyle;
3016
+ canvasDraw.stroke();
3017
+ canvasDraw.lineWidth = tempWidth;
3018
+ canvasDraw.strokeStyle = this.parent.activeObj.strokeSettings.outlineColor;
3019
+ };
2999
3020
  Draw.prototype.updateActPoint = function (degree, canvasDraw) {
3000
3021
  var parent = this.parent;
3001
3022
  var actObj = parent.activeObj;
@@ -3242,6 +3263,14 @@ var Draw = /** @__PURE__ @class */ (function () {
3242
3263
  yPoint + (i > 0 ? fontSize * 0.25 : -fontSize * 0.35));
3243
3264
  canvasDraw.fillText(text, startX + fontSize * 0.15, startY +
3244
3265
  yPoint + (i > 0 ? fontSize * 0.25 : -fontSize * 0.35));
3266
+ if (actObj.textSettings.underline) {
3267
+ var yOffset = yPoint + (i > 0 ? fontSize * 0.35 : -fontSize * 0.25);
3268
+ this.drawTextDecoration(canvasDraw, text, startX, startY, yOffset, fontSize, 0.15);
3269
+ }
3270
+ if (actObj.textSettings.strikethrough) {
3271
+ var yOffset = yPoint - lineHeight + (i > 0 ? -fontSize * 0.04 : -fontSize * 0.64);
3272
+ this.drawTextDecoration(canvasDraw, text, startX, startY, yOffset, fontSize, 0.1);
3273
+ }
3245
3274
  }
3246
3275
  };
3247
3276
  Draw.prototype.clearOuterCanvas = function (context) {
@@ -3291,7 +3320,7 @@ var Draw = /** @__PURE__ @class */ (function () {
3291
3320
  }
3292
3321
  parent.img.destLeft = (parent.lowerCanvas.clientWidth - maxDimension.width) / 2;
3293
3322
  if (degree === 0) {
3294
- parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height + 1) / 2;
3323
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height) / 2;
3295
3324
  }
3296
3325
  else {
3297
3326
  parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height) / 2;
@@ -3477,6 +3506,7 @@ var Draw = /** @__PURE__ @class */ (function () {
3477
3506
  var parent = this.parent;
3478
3507
  // eslint-disable-next-line @typescript-eslint/no-this-alias
3479
3508
  var proxy = this;
3509
+ parent.imageLoaded = false;
3480
3510
  parent.baseImg.src = src;
3481
3511
  parent.baseImg.onload = function () {
3482
3512
  parent.imgSrc = src;
@@ -3521,6 +3551,10 @@ var Draw = /** @__PURE__ @class */ (function () {
3521
3551
  var action = { action: 'file-open', actionEventArgs: fileOpened };
3522
3552
  parent.triggerEditCompleteEvent(action);
3523
3553
  }
3554
+ if (_this.fileType === 'Bmp') {
3555
+ _this.fileType = FileType.Png;
3556
+ }
3557
+ parent.imageLoaded = true;
3524
3558
  };
3525
3559
  parent.baseImg.onerror = function () {
3526
3560
  hideSpinner(parent.element);
@@ -3535,9 +3569,20 @@ var Draw = /** @__PURE__ @class */ (function () {
3535
3569
  };
3536
3570
  Draw.prototype.updateBaseImgCanvas = function () {
3537
3571
  var parent = this.parent;
3538
- parent.baseImgCanvas.width = parent.baseImg.width;
3539
- parent.baseImgCanvas.height = parent.baseImg.height;
3540
- parent.baseImgCanvas.getContext('2d').drawImage(parent.baseImg, 0, 0);
3572
+ if (!parent.aspectRatioBaseDimension && parent.imageSettings.width && parent.imageSettings.height) {
3573
+ var widthRatio = parent.baseImg.width / parent.imageSettings.width;
3574
+ var heightRatio = parent.baseImg.height / parent.imageSettings.height;
3575
+ var ratio = (widthRatio + heightRatio) / 2;
3576
+ ratio = ratio < 1 ? 1 : ratio;
3577
+ parent.baseImgCanvas.width = parent.imageSettings.width * ratio;
3578
+ parent.baseImgCanvas.height = parent.imageSettings.height * ratio;
3579
+ parent.baseImgCanvas.getContext('2d').drawImage(parent.baseImg, 0, 0, parent.baseImgCanvas.width, parent.baseImgCanvas.height);
3580
+ }
3581
+ else {
3582
+ parent.baseImgCanvas.width = parent.baseImg.width;
3583
+ parent.baseImgCanvas.height = parent.baseImg.height;
3584
+ parent.baseImgCanvas.getContext('2d').drawImage(parent.baseImg, 0, 0);
3585
+ }
3541
3586
  };
3542
3587
  Draw.prototype.updateCanvas = function (isCropped, isSameDimension) {
3543
3588
  var parent = this.parent;
@@ -3564,7 +3609,7 @@ var Draw = /** @__PURE__ @class */ (function () {
3564
3609
  value: { width: parent.img.srcWidth, height: parent.img.srcHeight, obj: obj, isImgShape: null } });
3565
3610
  var maxDimension = obj;
3566
3611
  parent.img.destLeft = (parent.lowerCanvas.clientWidth - maxDimension.width) / 2;
3567
- parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height + 1) / 2;
3612
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height) / 2;
3568
3613
  this.drawImgToCanvas(maxDimension);
3569
3614
  this.origDim.width = parent.img.destWidth;
3570
3615
  this.origDim.height = parent.img.destHeight;
@@ -3901,7 +3946,7 @@ var Draw = /** @__PURE__ @class */ (function () {
3901
3946
  }
3902
3947
  parent.notify('toolbar', { prop: 'destroy-qa-toolbar', onPropertyChange: false });
3903
3948
  this.tempTextSettings = { text: 'Enter Text', fontFamily: parent.fontFamily.default, fontSize: null, fontRatio: null, bold: false,
3904
- italic: false, underline: false };
3949
+ italic: false, underline: false, strikethrough: false };
3905
3950
  parent.objColl = extend([], this.tempObjColl, [], true);
3906
3951
  parent.pointColl = extend([], this.tempPointColl, [], true);
3907
3952
  this.renderImage();
@@ -4387,7 +4432,7 @@ var Draw = /** @__PURE__ @class */ (function () {
4387
4432
  var parent = this.parent;
4388
4433
  if (parent.transform.degree % 90 === 0 && parent.transform.degree % 180 !== 0) {
4389
4434
  parent.img.destLeft = (parent.lowerCanvas.clientWidth - parent.img.destHeight) / 2;
4390
- parent.img.destTop = (parent.lowerCanvas.clientHeight - parent.img.destWidth + 1) / 2;
4435
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - parent.img.destWidth) / 2;
4391
4436
  var temp = parent.img.destWidth;
4392
4437
  parent.img.destWidth = parent.img.destHeight;
4393
4438
  parent.img.destHeight = temp;
@@ -4395,7 +4440,7 @@ var Draw = /** @__PURE__ @class */ (function () {
4395
4440
  else {
4396
4441
  if (isNullOrUndefined(isPreventDimension)) {
4397
4442
  parent.img.destLeft = (parent.lowerCanvas.clientWidth - parent.img.destWidth) / 2;
4398
- parent.img.destTop = (parent.lowerCanvas.clientHeight - parent.img.destHeight + 1) / 2;
4443
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - parent.img.destHeight) / 2;
4399
4444
  }
4400
4445
  }
4401
4446
  };
@@ -4854,7 +4899,7 @@ var Draw = /** @__PURE__ @class */ (function () {
4854
4899
  this.fileType = 'Jpeg';
4855
4900
  fileType = 'jpeg';
4856
4901
  }
4857
- if (fileType !== 'jpeg' && fileType !== 'png' && fileType !== 'svg' && fileType !== 'webp') {
4902
+ if (fileType !== 'jpeg' && fileType !== 'png' && fileType !== 'svg' && fileType !== 'webp' && fileType !== 'bmp') {
4858
4903
  this.fileType = null;
4859
4904
  }
4860
4905
  }
@@ -4885,24 +4930,33 @@ var Draw = /** @__PURE__ @class */ (function () {
4885
4930
  };
4886
4931
  Draw.prototype.getImageSizeFromURL = function (imageUrl, callback) {
4887
4932
  return __awaiter(this, void 0, void 0, function () {
4888
- var response, contentLength, imageSizeMB, ex_1;
4889
- return __generator(this, function (_a) {
4890
- switch (_a.label) {
4933
+ var response, isBlob, imageSizeMB, _a, ex_1;
4934
+ return __generator(this, function (_b) {
4935
+ switch (_b.label) {
4891
4936
  case 0:
4892
- _a.trys.push([0, 2, , 3]);
4893
- return [4 /*yield*/, fetch(imageUrl, { method: 'HEAD' })];
4937
+ _b.trys.push([0, 5, , 6]);
4938
+ isBlob = imageUrl.indexOf('blob:') === 0;
4939
+ return [4 /*yield*/, fetch(imageUrl, { method: isBlob ? 'GET' : 'HEAD' })];
4894
4940
  case 1:
4895
- response = _a.sent();
4896
- contentLength = parseInt(response.headers.get('content-length') || '0', 10);
4897
- imageSizeMB = contentLength;
4898
- callback(imageSizeMB);
4899
- return [3 /*break*/, 3];
4941
+ response = _b.sent();
4942
+ if (!isBlob) return [3 /*break*/, 3];
4943
+ return [4 /*yield*/, response.blob()];
4900
4944
  case 2:
4901
- ex_1 = _a.sent();
4945
+ _a = (_b.sent()).size;
4946
+ return [3 /*break*/, 4];
4947
+ case 3:
4948
+ _a = parseInt(response.headers.get('content-length') || '0', 10);
4949
+ _b.label = 4;
4950
+ case 4:
4951
+ imageSizeMB = _a;
4952
+ callback(imageSizeMB);
4953
+ return [3 /*break*/, 6];
4954
+ case 5:
4955
+ ex_1 = _b.sent();
4902
4956
  // eslint-disable-next-line no-console
4903
4957
  console.log(ex_1.message);
4904
- return [3 /*break*/, 3];
4905
- case 3: return [2 /*return*/];
4958
+ return [3 /*break*/, 6];
4959
+ case 6: return [2 /*return*/];
4906
4960
  }
4907
4961
  });
4908
4962
  });
@@ -5101,6 +5155,8 @@ var Draw = /** @__PURE__ @class */ (function () {
5101
5155
  this.errorLoading();
5102
5156
  return;
5103
5157
  }
5158
+ parent.imageSettings = { width: null, height: null };
5159
+ parent.aspectRatioBaseDimension = null;
5104
5160
  showSpinner(parent.element);
5105
5161
  parent.element.style.opacity = '0.5';
5106
5162
  this.inputElem = inputElement;
@@ -5233,7 +5289,7 @@ var Draw = /** @__PURE__ @class */ (function () {
5233
5289
  }
5234
5290
  var panX = (parent.lowerCanvas.clientWidth / 2) - (currObj.activePoint.startX +
5235
5291
  (currObj.activePoint.width / 2));
5236
- var panY = ((parent.lowerCanvas.clientHeight + 1) / 2) - (currObj.activePoint.startY +
5292
+ var panY = ((parent.lowerCanvas.clientHeight) / 2) - (currObj.activePoint.startY +
5237
5293
  (currObj.activePoint.height / 2));
5238
5294
  if (isNullOrUndefined(parent.activeObj.shape)) {
5239
5295
  parent.activeObj = extend({}, activeObj, {}, true);
@@ -6013,8 +6069,20 @@ var Draw = /** @__PURE__ @class */ (function () {
6013
6069
  var point = [];
6014
6070
  var parent = this.parent;
6015
6071
  var degree = parent.transform.degree;
6016
- var width = parent.baseImg.width;
6017
- var height = parent.baseImg.height;
6072
+ var width;
6073
+ var height;
6074
+ if (!parent.aspectRatioBaseDimension && parent.imageSettings.width && parent.imageSettings.height) {
6075
+ var widthRatio = parent.baseImg.width / parent.imageSettings.width;
6076
+ var heightRatio = parent.baseImg.height / parent.imageSettings.height;
6077
+ var ratio = (widthRatio + heightRatio) / 2;
6078
+ ratio = ratio < 1 ? 1 : ratio;
6079
+ width = parent.imageSettings.width * ratio;
6080
+ height = parent.imageSettings.height * ratio;
6081
+ }
6082
+ else {
6083
+ width = parent.baseImg.width;
6084
+ height = parent.baseImg.height;
6085
+ }
6018
6086
  var obj = { dim: null, width: height, height: width, angle: parent.transform.straighten };
6019
6087
  obj['dim'] = parent.getRotatedCanvasDim(obj['width'], obj['height'], obj['angle']);
6020
6088
  var baseImgCanvasWidth = degree % 90 === 0 && degree % 180 !== 0 ? obj['dim']['width'] : parent.baseImgCanvas.width;
@@ -6286,6 +6354,9 @@ var Draw = /** @__PURE__ @class */ (function () {
6286
6354
  }
6287
6355
  canvasDraw.imageSmoothingEnabled = false;
6288
6356
  canvasDraw.drawImage(offscreenCanvas, 0, 0, offscreenCanvas.width, offscreenCanvas.height, startX, startY, width, height);
6357
+ if (this.parent.imageSmoothingEnabled) {
6358
+ canvasDraw.imageSmoothingEnabled = true;
6359
+ }
6289
6360
  }
6290
6361
  obj.redactImage = this.parent.createElement('canvas');
6291
6362
  obj.redactImage.width = offscreenCanvas.width;
@@ -6340,6 +6411,9 @@ var Export = /** @__PURE__ @class */ (function () {
6340
6411
  case 'drawAnnotation':
6341
6412
  this.drawAnnotation(args.value['context'], args.value['ratio']);
6342
6413
  break;
6414
+ case 'downScaleImgCanvas':
6415
+ this.downScaleImgCanvas(args.value['canvas'], args.value['width'], args.value['height']);
6416
+ break;
6343
6417
  }
6344
6418
  };
6345
6419
  Export.prototype.getModuleName = function () {
@@ -8960,6 +9034,7 @@ var Selection = /** @__PURE__ @class */ (function () {
8960
9034
  this.isMouseUp = false;
8961
9035
  this.mouseWheel = 0;
8962
9036
  this.isTransformedShape = false;
9037
+ this.mouseClickPoint = { x: 0, y: 0 };
8963
9038
  this.parent = parent;
8964
9039
  this.addEventListener();
8965
9040
  }
@@ -9130,7 +9205,8 @@ var Selection = /** @__PURE__ @class */ (function () {
9130
9205
  parent.activeObj.textSettings.fontSize = 11;
9131
9206
  parent.activeObj.keyHistory = 'Enter Text';
9132
9207
  parent.notify('shape', { prop: 'initializeTextShape', onPropertyChange: false,
9133
- value: { text: null, fontFamily: null, fontSize: null, bold: null, italic: null, strokeColor: null } });
9208
+ value: { text: null, fontFamily: null, fontSize: null, bold: null, italic: null,
9209
+ underline: null, strikethrough: null, strokeColor: null } });
9134
9210
  }
9135
9211
  else if (args.value['shape'] === 'path') {
9136
9212
  parent.activeObj.pointColl = [];
@@ -9343,6 +9419,7 @@ var Selection = /** @__PURE__ @class */ (function () {
9343
9419
  this.isSliderActive = false;
9344
9420
  this.arrowShape = [ArrowheadType.None, ArrowheadType.SolidArrow];
9345
9421
  this.isMouseDown = this.isMouseUp = this.isTransformedShape = false;
9422
+ this.mouseClickPoint = { x: 0, y: 0 };
9346
9423
  };
9347
9424
  Selection.prototype.performTabAction = function () {
9348
9425
  var parent = this.parent;
@@ -11377,7 +11454,7 @@ var Selection = /** @__PURE__ @class */ (function () {
11377
11454
  var width_2 = this.upperContext.measureText(parent.activeObj.textSettings.text).width +
11378
11455
  parent.activeObj.textSettings.fontSize * 0.5;
11379
11456
  actPoint.endX = actPoint.startX + width_2;
11380
- actPoint.endY = actPoint.startY + parent.activeObj.textSettings.fontSize;
11457
+ actPoint.endY = actPoint.startY + (parent.activeObj.textSettings.fontSize * 1.18);
11381
11458
  actPoint.width = actPoint.endX - actPoint.startX;
11382
11459
  actPoint.height = actPoint.endY - actPoint.startY;
11383
11460
  tempActiveObj = extend({}, parent.activeObj, null, true);
@@ -12181,6 +12258,7 @@ var Selection = /** @__PURE__ @class */ (function () {
12181
12258
  var activePoint = parent.activeObj.activePoint;
12182
12259
  var x = imageEditorClickEventArgs.point.x;
12183
12260
  var y = imageEditorClickEventArgs.point.y;
12261
+ this.mouseClickPoint = { x: x, y: y };
12184
12262
  var cursor = parent.activeObj.shape && parent.activeObj.shape === 'text' ?
12185
12263
  parent.cursor : 'default';
12186
12264
  var tempCursor = parent.upperCanvas.style.cursor;
@@ -12231,7 +12309,7 @@ var Selection = /** @__PURE__ @class */ (function () {
12231
12309
  value: { isTextBox: null } });
12232
12310
  var width = this.upperContext.measureText(parent.activeObj.textSettings.text).width + parent.activeObj.textSettings.fontSize * 0.5;
12233
12311
  activePoint.endX = activePoint.startX + width;
12234
- activePoint.endY = activePoint.startY + parent.activeObj.textSettings.fontSize;
12312
+ activePoint.endY = activePoint.startY + (parent.activeObj.textSettings.fontSize * 1.18);
12235
12313
  activePoint.width = activePoint.endX - activePoint.startX;
12236
12314
  activePoint.height = activePoint.endY - activePoint.startY;
12237
12315
  }
@@ -12660,6 +12738,12 @@ var Selection = /** @__PURE__ @class */ (function () {
12660
12738
  var bbox = parent.lowerCanvas.getBoundingClientRect();
12661
12739
  x -= bbox.left;
12662
12740
  y -= bbox.top;
12741
+ if (parent.drawingShape === 'text' && this.mouseDownPoint && this.mouseDownPoint.x === x && this.mouseDownPoint.y === y) {
12742
+ parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
12743
+ if (!parent.activeObj.keyHistory) {
12744
+ parent.activeObj.keyHistory = 'Enter Text';
12745
+ }
12746
+ }
12663
12747
  var activeObjShape = void 0;
12664
12748
  var currentDrawingShape = this.currentDrawingShape;
12665
12749
  var dummyClick = false;
@@ -12837,6 +12921,12 @@ var Selection = /** @__PURE__ @class */ (function () {
12837
12921
  }
12838
12922
  }
12839
12923
  if (!isCropSelection_1) {
12924
+ var isDummyClick = false;
12925
+ if (Math.round(x) === Math.round(this.mouseClickPoint.x) && Math.round(y) ===
12926
+ Math.round(this.mouseClickPoint.y)) {
12927
+ isDummyClick = true;
12928
+ parent.notify('undo-redo', { prop: 'preventApplyEditComplete', value: { bool: true } });
12929
+ }
12840
12930
  this.adjustActObjForLineArrow();
12841
12931
  if (parent.isShapeDrawing) {
12842
12932
  var temp = this.currentDrawingShape;
@@ -12846,6 +12936,9 @@ var Selection = /** @__PURE__ @class */ (function () {
12846
12936
  else {
12847
12937
  parent.notify('undo-redo', { prop: 'updateUndoRedoStack', onPropertyChange: false });
12848
12938
  }
12939
+ if (isDummyClick) {
12940
+ parent.notify('undo-redo', { prop: 'preventApplyEditComplete', value: { bool: false } });
12941
+ }
12849
12942
  }
12850
12943
  }
12851
12944
  }
@@ -12909,6 +13002,7 @@ var Selection = /** @__PURE__ @class */ (function () {
12909
13002
  parent.notify('freehand-draw', { prop: 'resetSelPoints', onPropertyChange: false });
12910
13003
  }
12911
13004
  this.isMouseUp = false;
13005
+ this.mouseClickPoint = { x: 0, y: 0 };
12912
13006
  };
12913
13007
  Selection.prototype.adjustActObjForLineArrow = function (obj) {
12914
13008
  var isAdjusted = false;
@@ -13190,7 +13284,8 @@ var Selection = /** @__PURE__ @class */ (function () {
13190
13284
  (obj.textSettings && Math.round(obj.textSettings.fontRatio) !== Math.round(this.tempActiveObj.textSettings.fontRatio)) ||
13191
13285
  (obj.textSettings && obj.textSettings.bold !== this.tempActiveObj.textSettings.bold) ||
13192
13286
  (obj.textSettings && obj.textSettings.italic !== this.tempActiveObj.textSettings.italic) ||
13193
- (obj.textSettings && obj.textSettings.underline !== this.tempActiveObj.textSettings.underline)) {
13287
+ (obj.textSettings && obj.textSettings.underline !== this.tempActiveObj.textSettings.underline) ||
13288
+ (obj.textSettings && obj.textSettings.strikethrough !== this.tempActiveObj.textSettings.strikethrough)) {
13194
13289
  isApply = true;
13195
13290
  }
13196
13291
  if (this.isInitialTextEdited && !isApply) {
@@ -14234,6 +14329,17 @@ var Selection = /** @__PURE__ @class */ (function () {
14234
14329
  else {
14235
14330
  parent.activeObj.textSettings.italic = false;
14236
14331
  }
14332
+ parent.activeObj.textSettings.underline = parent.activeObj.textSettings.strikethrough = false;
14333
+ if (parent.textArea.style.textDecoration === 'underline line-through') {
14334
+ parent.activeObj.textSettings.underline = true;
14335
+ parent.activeObj.textSettings.strikethrough = true;
14336
+ }
14337
+ else if (parent.textArea.style.textDecoration === 'underline') {
14338
+ parent.activeObj.textSettings.underline = true;
14339
+ }
14340
+ else if (parent.textArea.style.textDecoration === 'line-through') {
14341
+ parent.activeObj.textSettings.strikethrough = true;
14342
+ }
14237
14343
  parent.activeObj.textSettings.fontSize = (parseFloat(parent.textArea.style.fontSize));
14238
14344
  };
14239
14345
  Selection.prototype.rgbToHex = function (r, g, b, a) {
@@ -14385,6 +14491,9 @@ var Selection = /** @__PURE__ @class */ (function () {
14385
14491
  if (parent.activeObj.textSettings.underline) {
14386
14492
  fontStyle.push('underline');
14387
14493
  }
14494
+ if (parent.activeObj.textSettings.strikethrough) {
14495
+ fontStyle.push('strikethrough');
14496
+ }
14388
14497
  }
14389
14498
  var _a = parent.activeObj.activePoint, startX = _a.startX, startY = _a.startY, endX = _a.endX, endY = _a.endY, width = _a.width, height = _a.height;
14390
14499
  var _b = parent.activeObj, keyHistory = _b.keyHistory, currIndex = _b.currIndex, shape = _b.shape, textSettings = _b.textSettings, strokeSettings = _b.strokeSettings, rotatedAngle = _b.rotatedAngle, imageElement = _b.imageElement, opacity = _b.opacity;
@@ -14573,7 +14682,7 @@ var Selection = /** @__PURE__ @class */ (function () {
14573
14682
  /* eslint-disable no-constant-condition */
14574
14683
  var Shape = /** @__PURE__ @class */ (function () {
14575
14684
  function Shape(parent) {
14576
- this.textSettings = { text: 'Enter Text', fontFamily: '', fontSize: null, fontRatio: null, bold: false, italic: false, underline: false };
14685
+ this.textSettings = { text: 'Enter Text', fontFamily: '', fontSize: null, fontRatio: null, bold: false, italic: false, underline: false, strikethrough: false };
14577
14686
  this.strokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null, radius: null, outlineColor: '', outlineWidth: null };
14578
14687
  this.keyHistory = ''; // text history
14579
14688
  this.preventFrameAnnotation = false;
@@ -14616,7 +14725,7 @@ var Shape = /** @__PURE__ @class */ (function () {
14616
14725
  this.drawRectangle(args.value['x'], args.value['y'], args.value['width'], args.value['height'], args.value['strokeWidth'], args.value['strokeColor'], args.value['fillColor'], args.value['degree'], args.value['isSelected'], args.value['radius']);
14617
14726
  break;
14618
14727
  case 'drawText':
14619
- this.drawText(args.value['x'], args.value['y'], args.value['text'], args.value['fontFamily'], args.value['fontSize'], args.value['bold'], args.value['italic'], args.value['color'], args.value['isSelected'], args.value['degree'], args.value['fillColor'], args.value['outlineColor'], args.value['outlineWidth'], args.value['transformCollection']);
14728
+ this.drawText(args.value['x'], args.value['y'], args.value['text'], args.value['fontFamily'], args.value['fontSize'], args.value['bold'], args.value['italic'], args.value['color'], args.value['isSelected'], args.value['degree'], args.value['fillColor'], args.value['outlineColor'], args.value['outlineWidth'], args.value['transformCollection'], args.value['underline'], args.value['strikethrough']);
14620
14729
  break;
14621
14730
  case 'redrawActObj':
14622
14731
  this.redrawActObj(args.value['x'], args.value['y'], args.value['isMouseDown']);
@@ -14780,7 +14889,7 @@ var Shape = /** @__PURE__ @class */ (function () {
14780
14889
  this.alignTextAreaIntoCanvas();
14781
14890
  break;
14782
14891
  case 'initializeTextShape':
14783
- this.initializeTextShape(args.value['text'], args.value['fontFamily'], args.value['fontSize'], args.value['bold'], args.value['italic'], args.value['strokeColor'], args.value['fillColor'], args.value['outlineColor'], args.value['outlineWidth']);
14892
+ this.initializeTextShape(args.value['text'], args.value['fontFamily'], args.value['fontSize'], args.value['bold'], args.value['italic'], args.value['underline'], args.value['strikethrough'], args.value['strokeColor'], args.value['fillColor'], args.value['outlineColor'], args.value['outlineWidth']);
14784
14893
  break;
14785
14894
  case 'stopPathDrawing':
14786
14895
  this.stopPathDrawing(args.value['e'], args.value['isApply']);
@@ -14875,7 +14984,7 @@ var Shape = /** @__PURE__ @class */ (function () {
14875
14984
  };
14876
14985
  Shape.prototype.reset = function () {
14877
14986
  this.textSettings =
14878
- { text: 'Enter Text', fontFamily: this.parent.fontFamily.default, fontSize: null, fontRatio: null, bold: false, italic: false, underline: false };
14987
+ { text: 'Enter Text', fontFamily: this.parent.fontFamily.default, fontSize: null, fontRatio: null, bold: false, italic: false, underline: false, strikethrough: false };
14879
14988
  this.strokeSettings = { strokeColor: '#fff', fillColor: '', strokeWidth: null, radius: null, outlineColor: '', outlineWidth: null };
14880
14989
  this.preventFrameAnnotation = false;
14881
14990
  };
@@ -14915,8 +15024,8 @@ var Shape = /** @__PURE__ @class */ (function () {
14915
15024
  var start = x && y ? { x: x, y: y } : null;
14916
15025
  this.drawShape('redact', null, null, null, start, width, height, null, null, null, null, null, null, null, type, value);
14917
15026
  };
14918
- Shape.prototype.drawText = function (x, y, text, fontFamily, fontSize, bold, italic, color, isSelected, degree, fillColor, outlineColor, outlineWidth, transformCollection) {
14919
- this.drawShapeText(text, fontFamily, fontSize, bold, italic, color, x, y, isSelected, degree, fillColor, outlineColor, outlineWidth, transformCollection);
15027
+ Shape.prototype.drawText = function (x, y, text, fontFamily, fontSize, bold, italic, color, isSelected, degree, fillColor, outlineColor, outlineWidth, transformCollection, underline, strikethrough) {
15028
+ this.drawShapeText(text, fontFamily, fontSize, bold, italic, color, x, y, isSelected, degree, fillColor, outlineColor, outlineWidth, transformCollection, underline, strikethrough);
14920
15029
  };
14921
15030
  Shape.prototype.initializeShape = function (type) {
14922
15031
  var parent = this.parent;
@@ -15102,7 +15211,7 @@ var Shape = /** @__PURE__ @class */ (function () {
15102
15211
  value: { obj: selPointCollObj } });
15103
15212
  this.prevObj.selPointColl = extend([], selPointCollObj['selPointColl'], [], true);
15104
15213
  };
15105
- Shape.prototype.drawShapeText = function (text, fontFamily, fontSize, bold, italic, strokeColor, x, y, isSelected, degree, fillColor, outlineColor, outlineWidth, transformCollection) {
15214
+ Shape.prototype.drawShapeText = function (text, fontFamily, fontSize, bold, italic, strokeColor, x, y, isSelected, degree, fillColor, outlineColor, outlineWidth, transformCollection, underline, strikethrough) {
15106
15215
  var parent = this.parent;
15107
15216
  if (!parent.disabled && parent.isImageLoaded) {
15108
15217
  if (parent.currObjType.shape === 'freehanddraw') {
@@ -15117,7 +15226,7 @@ var Shape = /** @__PURE__ @class */ (function () {
15117
15226
  this.refreshActiveObj();
15118
15227
  parent.activeObj.shape = parent.currObjType.shape = 'text';
15119
15228
  parent.currObjType.isCustomCrop = false;
15120
- this.initializeTextShape(text, fontFamily, fontSize, bold, italic, strokeColor, fillColor, outlineColor, outlineWidth);
15229
+ this.initializeTextShape(text, fontFamily, fontSize, bold, italic, underline, strikethrough, strokeColor, fillColor, outlineColor, outlineWidth);
15121
15230
  parent.currObjType.isText = parent.currObjType.isInitialText = true;
15122
15231
  if (isNullOrUndefined(parent.activeObj.textSettings.fontSize)) {
15123
15232
  parent.getFontSizes();
@@ -15268,7 +15377,7 @@ var Shape = /** @__PURE__ @class */ (function () {
15268
15377
  isApplyBtn: null, isCropping: null, isZooming: null, cType: null } });
15269
15378
  parent.notify('toolbar', { prop: 'update-toolbar-items', onPropertyChange: false });
15270
15379
  };
15271
- Shape.prototype.initializeTextShape = function (text, fontFamily, fontSize, bold, italic, strokeColor, fillColor, outlineColor, outlineWidth) {
15380
+ Shape.prototype.initializeTextShape = function (text, fontFamily, fontSize, bold, italic, underline, strikethrough, strokeColor, fillColor, outlineColor, outlineWidth) {
15272
15381
  var parent = this.parent;
15273
15382
  this.keyHistory = '';
15274
15383
  parent.upperCanvas.style.display = 'block';
@@ -15279,6 +15388,8 @@ var Shape = /** @__PURE__ @class */ (function () {
15279
15388
  parent.activeObj.textSettings.fontSize = fontSize || parent.activeObj.textSettings.fontSize;
15280
15389
  parent.activeObj.textSettings.bold = bold || parent.activeObj.textSettings.bold;
15281
15390
  parent.activeObj.textSettings.italic = italic || parent.activeObj.textSettings.italic;
15391
+ parent.activeObj.textSettings.underline = underline || parent.activeObj.textSettings.underline;
15392
+ parent.activeObj.textSettings.strikethrough = strikethrough || parent.activeObj.textSettings.strikethrough;
15282
15393
  parent.activeObj.strokeSettings.outlineColor = outlineColor || parent.activeObj.strokeSettings.outlineColor;
15283
15394
  parent.activeObj.strokeSettings.outlineWidth = outlineWidth || parent.activeObj.strokeSettings.outlineWidth;
15284
15395
  };
@@ -15483,6 +15594,7 @@ var Shape = /** @__PURE__ @class */ (function () {
15483
15594
  parent.activeObj.textSettings.bold = false;
15484
15595
  parent.activeObj.textSettings.italic = false;
15485
15596
  parent.activeObj.textSettings.underline = false;
15597
+ parent.activeObj.textSettings.strikethrough = false;
15486
15598
  for (var i = 0; i < shapeSettings.fontStyle.length; i++) {
15487
15599
  switch (shapeSettings.fontStyle[i]) {
15488
15600
  case 'bold':
@@ -15491,6 +15603,12 @@ var Shape = /** @__PURE__ @class */ (function () {
15491
15603
  case 'italic':
15492
15604
  parent.activeObj.textSettings.italic = true;
15493
15605
  break;
15606
+ case 'underline':
15607
+ parent.activeObj.textSettings.underline = true;
15608
+ break;
15609
+ case 'strikethrough':
15610
+ parent.activeObj.textSettings.strikethrough = true;
15611
+ break;
15494
15612
  }
15495
15613
  }
15496
15614
  }
@@ -15509,7 +15627,7 @@ var Shape = /** @__PURE__ @class */ (function () {
15509
15627
  this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
15510
15628
  this.updateFontStyles();
15511
15629
  var width = this.upperContext.measureText(this.keyHistory).width + fontSize * 0.5;
15512
- var height = fontSize;
15630
+ var height = fontSize * 1.18;
15513
15631
  this.upperContext.fillText(this.keyHistory, parent.activeObj.activePoint.startX, parent.activeObj.activePoint.startY + fontSize);
15514
15632
  this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
15515
15633
  parent.currObjType.isText = true;
@@ -15532,7 +15650,7 @@ var Shape = /** @__PURE__ @class */ (function () {
15532
15650
  var text = (parent.textArea.style.display === 'block' || parent.textArea.style.display === 'inline-block') ?
15533
15651
  this.getMaxText(true) : this.getMaxText();
15534
15652
  var width = this.upperContext.measureText(text).width + fontSize * 0.5;
15535
- var height = rows.length * fontSize;
15653
+ var height = rows.length * fontSize * 1.18;
15536
15654
  if (rows.length > 1) {
15537
15655
  height += (fontSize * 0.50);
15538
15656
  }
@@ -15567,7 +15685,7 @@ var Shape = /** @__PURE__ @class */ (function () {
15567
15685
  parent.textArea.value = '';
15568
15686
  this.updateFontStyles();
15569
15687
  var width = this.upperContext.measureText(parent.activeObj.keyHistory).width + fontSize * 0.5;
15570
- var height = fontSize;
15688
+ var height = fontSize * 1.18;
15571
15689
  var rows = parent.activeObj.keyHistory.split('\n');
15572
15690
  if (rows.length > 1) {
15573
15691
  height *= rows.length;
@@ -16322,6 +16440,9 @@ var Shape = /** @__PURE__ @class */ (function () {
16322
16440
  }
16323
16441
  parent.textArea.style.fontWeight = actObj.textSettings.bold ? 'bold' : 'normal';
16324
16442
  parent.textArea.style.fontStyle = actObj.textSettings.italic ? 'italic' : 'normal';
16443
+ parent.textArea.style.textDecoration = (actObj.textSettings.underline && actObj.textSettings.strikethrough) ? 'underline line-through' :
16444
+ (actObj.textSettings.underline) ? 'underline' :
16445
+ (actObj.textSettings.strikethrough) ? 'line-through' : 'none';
16325
16446
  parent.textArea.style.border = '2px solid ' + parent.themeColl[parent.theme]['primaryColor'];
16326
16447
  parent.textArea.value = actObj.keyHistory;
16327
16448
  parent.textArea.style.overflow = 'hidden';
@@ -16868,7 +16989,7 @@ var Shape = /** @__PURE__ @class */ (function () {
16868
16989
  /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
16869
16990
  var fileData = filesData;
16870
16991
  var fileExtension = fileData.name && fileData.name.split('.').pop().toLowerCase();
16871
- if (fileExtension && ['jpg', 'jpeg', 'png', 'svg', 'webp'].indexOf(fileExtension) === -1) {
16992
+ if (fileExtension && ['jpg', 'jpeg', 'png', 'svg', 'webp', 'bmp'].indexOf(fileExtension) === -1) {
16872
16993
  this.refreshActiveObj();
16873
16994
  return;
16874
16995
  }
@@ -17215,9 +17336,16 @@ var Shape = /** @__PURE__ @class */ (function () {
17215
17336
  var obj = { shapeSettingsObj: {} };
17216
17337
  parent.notify('selection', { prop: 'updatePrevShapeSettings', onPropertyChange: false, value: { obj: obj } });
17217
17338
  var shapeSettings = obj['shapeSettingsObj'];
17339
+ var isObjPushed = false;
17340
+ var collLength = parent.objColl.length;
17218
17341
  this.pushActItemIntoObj();
17342
+ if (collLength !== parent.objColl.length) {
17343
+ isObjPushed = true;
17344
+ }
17219
17345
  var objColl = extend([], parent.objColl, [], true);
17220
- parent.objColl.pop();
17346
+ if (isObjPushed) {
17347
+ parent.objColl.pop();
17348
+ }
17221
17349
  if (parent.textArea.style.display === 'none') {
17222
17350
  this.updateFontRatio(parent.activeObj);
17223
17351
  }
@@ -17226,24 +17354,77 @@ var Shape = /** @__PURE__ @class */ (function () {
17226
17354
  }
17227
17355
  switch (item) {
17228
17356
  case 'default':
17229
- this.updateFontStyle(item, objColl, 'normal', 'normal');
17357
+ this.updateFontStyle(item, objColl, 'normal', 'normal', false, false);
17230
17358
  break;
17231
17359
  case 'bold':
17232
- this.updateFontStyle(item, objColl, 'bold', 'normal');
17360
+ this.updateFontStyle(item, objColl, 'bold', 'normal', false, false);
17233
17361
  break;
17234
17362
  case 'italic':
17235
- this.updateFontStyle(item, objColl, 'normal', 'italic');
17363
+ this.updateFontStyle(item, objColl, 'normal', 'italic', false, false);
17236
17364
  break;
17237
17365
  case 'bolditalic':
17238
- this.updateFontStyle(item, objColl, 'bold', 'italic');
17366
+ this.updateFontStyle(item, objColl, 'bold', 'italic', false, false);
17367
+ break;
17368
+ case 'underline':
17369
+ this.updateFontStyle(item, objColl, 'normal', 'normal', true, false);
17370
+ break;
17371
+ case 'boldunderline':
17372
+ this.updateFontStyle(item, objColl, 'bold', 'normal', true, false);
17373
+ break;
17374
+ case 'italicunderline':
17375
+ this.updateFontStyle(item, objColl, 'normal', 'italic', true, false);
17376
+ break;
17377
+ case 'bolditalicunderline':
17378
+ this.updateFontStyle(item, objColl, 'bold', 'italic', true, false);
17379
+ break;
17380
+ case 'strikethrough':
17381
+ this.updateFontStyle(item, objColl, 'normal', 'normal', false, true);
17382
+ break;
17383
+ case 'boldstrikethrough':
17384
+ this.updateFontStyle(item, objColl, 'bold', 'normal', false, true);
17385
+ break;
17386
+ case 'italicstrikethrough':
17387
+ this.updateFontStyle(item, objColl, 'normal', 'italic', false, true);
17388
+ break;
17389
+ case 'underlinestrikethrough':
17390
+ this.updateFontStyle(item, objColl, 'normal', 'normal', true, true);
17391
+ break;
17392
+ case 'bolditalicstrikethrough':
17393
+ this.updateFontStyle(item, objColl, 'bold', 'italic', false, true);
17394
+ break;
17395
+ case 'boldunderlinestrikethrough':
17396
+ this.updateFontStyle(item, objColl, 'bold', 'normal', true, true);
17397
+ break;
17398
+ case 'italicunderlinestrikethrough':
17399
+ this.updateFontStyle(item, objColl, 'normal', 'italic', true, true);
17400
+ break;
17401
+ case 'bolditalicunderlinestrikethrough':
17402
+ this.updateFontStyle(item, objColl, 'bold', 'italic', true, true);
17239
17403
  break;
17240
17404
  }
17241
17405
  var shapeChangedArgs = { action: 'font-style', currentShapeSettings: extend({}, shapeSettings, {}, true) };
17242
- shapeChangedArgs.currentShapeSettings.fontStyle = [item];
17406
+ shapeChangedArgs.currentShapeSettings.fontStyle = this.getFontStyleArray(item);
17243
17407
  parent.trigger('shapeChange', shapeChangedArgs);
17244
17408
  parent.editCompleteArgs = shapeChangedArgs;
17245
17409
  };
17246
- Shape.prototype.updateFontStyle = function (item, objColl, fontWeight, fontStyle) {
17410
+ Shape.prototype.getFontStyleArray = function (item) {
17411
+ var styleArray = [];
17412
+ var lowerItem = item.toLowerCase();
17413
+ if (lowerItem.indexOf('bold') > -1) {
17414
+ styleArray.push('bold');
17415
+ }
17416
+ if (lowerItem.indexOf('italic') > -1) {
17417
+ styleArray.push('italic');
17418
+ }
17419
+ if (lowerItem.indexOf('underline') > -1) {
17420
+ styleArray.push('underline');
17421
+ }
17422
+ if (lowerItem.indexOf('strikethrough') > -1) {
17423
+ styleArray.push('strikethrough');
17424
+ }
17425
+ return styleArray;
17426
+ };
17427
+ Shape.prototype.updateFontStyle = function (item, objColl, fontWeight, fontStyle, underline, strikethrough) {
17247
17428
  var parent = this.parent;
17248
17429
  var style = parent.textArea.style;
17249
17430
  if (style.display === 'block' || style.display === 'inline-block') {
@@ -17259,9 +17440,43 @@ var Shape = /** @__PURE__ @class */ (function () {
17259
17440
  else {
17260
17441
  style.fontStyle = 'normal';
17261
17442
  }
17262
- var value = (style.fontWeight === 'normal' && style.fontStyle === 'normal' ? 'default' :
17263
- (style.fontWeight === 'bold' && style.fontStyle === 'normal' ? 'bold' :
17264
- (style.fontWeight === 'normal' && style.fontStyle === 'italic' ? 'italic' : 'bolditalic')));
17443
+ if (underline && strikethrough) {
17444
+ style.textDecoration = 'underline line-through';
17445
+ }
17446
+ else if (strikethrough) {
17447
+ style.textDecoration = 'line-through';
17448
+ }
17449
+ else if (underline) {
17450
+ style.textDecoration = 'underline';
17451
+ }
17452
+ else {
17453
+ style.textDecoration = 'none';
17454
+ }
17455
+ var key = [
17456
+ style.fontWeight === 'bold' ? 'bold' : '',
17457
+ style.fontStyle === 'italic' ? 'italic' : '',
17458
+ typeof style.textDecoration === 'string' && style.textDecoration.indexOf('underline') > -1 ? 'underline' : '',
17459
+ typeof style.textDecoration === 'string' && style.textDecoration.indexOf('line-through') > -1 ? 'strikethrough' : ''
17460
+ ].filter(Boolean).join('');
17461
+ var valueMap = {
17462
+ '': 'default',
17463
+ bold: 'bold',
17464
+ italic: 'italic',
17465
+ underline: 'underline',
17466
+ strikethrough: 'strikethrough',
17467
+ bolditalic: 'bolditalic',
17468
+ boldunderline: 'boldunderline',
17469
+ boldstrikethrough: 'boldstrikethrough',
17470
+ italicunderline: 'italicunderline',
17471
+ italicstrikethrough: 'italicstrikethrough',
17472
+ underlinestrikethrough: 'underlinestrikethrough',
17473
+ bolditalicunderline: 'bolditalicunderline',
17474
+ bolditalicstrikethrough: 'bolditalicstrikethrough',
17475
+ boldunderlinestrikethrough: 'boldunderlinestrikethrough',
17476
+ italicunderlinestrikethrough: 'italicunderlinestrikethrough',
17477
+ bolditalicunderlinestrikethrough: 'bolditalicunderlinestrikethrough'
17478
+ };
17479
+ var value = key in valueMap ? valueMap[key] : 'default';
17265
17480
  var width = this.getTextAreaWidth(value);
17266
17481
  style.width = width + 'px';
17267
17482
  this.updateObjColl(item, objColl);
@@ -17269,6 +17484,8 @@ var Shape = /** @__PURE__ @class */ (function () {
17269
17484
  else {
17270
17485
  this.textSettings.bold = parent.activeObj.textSettings.bold = fontWeight === 'normal' ? false : true;
17271
17486
  this.textSettings.italic = parent.activeObj.textSettings.italic = fontStyle === 'normal' ? false : true;
17487
+ this.textSettings.underline = parent.activeObj.textSettings.underline = underline ? true : false;
17488
+ this.textSettings.strikethrough = parent.activeObj.textSettings.strikethrough = strikethrough ? true : false;
17272
17489
  if (parent.activeObj.activePoint.width !== 0 || parent.activeObj.activePoint.height !== 0) {
17273
17490
  this.redrawText();
17274
17491
  }
@@ -17364,24 +17581,107 @@ var Shape = /** @__PURE__ @class */ (function () {
17364
17581
  parent.notify('freehand-draw', { prop: 'getSelPointColl', onPropertyChange: false,
17365
17582
  value: { obj: selPointCollObj } });
17366
17583
  prevObj.selPointColl = extend([], selPointCollObj['selPointColl'], [], true);
17367
- var tempBold = parent.activeObj.textSettings.bold;
17368
- var tempItalic = parent.activeObj.textSettings.italic;
17584
+ var textSettings = parent.activeObj.textSettings;
17585
+ var tempBold = textSettings.bold;
17586
+ var tempItalic = textSettings.italic;
17587
+ var tempUnderline = textSettings.underline;
17588
+ var tempStrikethrough = textSettings.strikethrough;
17369
17589
  switch (item) {
17370
17590
  case 'default':
17371
- parent.activeObj.textSettings.bold = false;
17372
- parent.activeObj.textSettings.italic = false;
17591
+ textSettings.bold = false;
17592
+ textSettings.italic = false;
17593
+ textSettings.underline = false;
17594
+ textSettings.strikethrough = false;
17373
17595
  break;
17374
17596
  case 'bold':
17375
- parent.activeObj.textSettings.bold = true;
17376
- parent.activeObj.textSettings.italic = false;
17597
+ textSettings.bold = true;
17598
+ textSettings.italic = false;
17599
+ textSettings.underline = false;
17600
+ textSettings.strikethrough = false;
17377
17601
  break;
17378
17602
  case 'italic':
17379
- parent.activeObj.textSettings.bold = false;
17380
- parent.activeObj.textSettings.italic = true;
17603
+ textSettings.bold = false;
17604
+ textSettings.italic = true;
17605
+ textSettings.underline = false;
17606
+ textSettings.strikethrough = false;
17381
17607
  break;
17382
17608
  case 'bolditalic':
17383
- parent.activeObj.textSettings.bold = true;
17384
- parent.activeObj.textSettings.italic = true;
17609
+ textSettings.bold = true;
17610
+ textSettings.italic = true;
17611
+ textSettings.underline = false;
17612
+ textSettings.strikethrough = false;
17613
+ break;
17614
+ case 'underline':
17615
+ textSettings.bold = false;
17616
+ textSettings.italic = false;
17617
+ textSettings.underline = true;
17618
+ textSettings.strikethrough = false;
17619
+ break;
17620
+ case 'boldunderline':
17621
+ textSettings.bold = true;
17622
+ textSettings.italic = false;
17623
+ textSettings.underline = true;
17624
+ textSettings.strikethrough = false;
17625
+ break;
17626
+ case 'italicunderline':
17627
+ textSettings.bold = false;
17628
+ textSettings.italic = true;
17629
+ textSettings.underline = true;
17630
+ textSettings.strikethrough = false;
17631
+ break;
17632
+ case 'bolditalicunderline':
17633
+ textSettings.bold = true;
17634
+ textSettings.italic = true;
17635
+ textSettings.underline = true;
17636
+ textSettings.strikethrough = false;
17637
+ break;
17638
+ case 'strikethrough':
17639
+ textSettings.bold = false;
17640
+ textSettings.italic = false;
17641
+ textSettings.underline = false;
17642
+ textSettings.strikethrough = true;
17643
+ break;
17644
+ case 'boldstrikethrough':
17645
+ textSettings.bold = true;
17646
+ textSettings.italic = false;
17647
+ textSettings.underline = false;
17648
+ textSettings.strikethrough = true;
17649
+ break;
17650
+ case 'italicstrikethrough':
17651
+ textSettings.bold = false;
17652
+ textSettings.italic = true;
17653
+ textSettings.underline = false;
17654
+ textSettings.strikethrough = true;
17655
+ break;
17656
+ case 'underlinestrikethrough':
17657
+ textSettings.bold = false;
17658
+ textSettings.italic = false;
17659
+ textSettings.underline = true;
17660
+ textSettings.strikethrough = true;
17661
+ break;
17662
+ case 'bolditalicstrikethrough':
17663
+ textSettings.bold = true;
17664
+ textSettings.italic = true;
17665
+ textSettings.underline = false;
17666
+ textSettings.strikethrough = true;
17667
+ break;
17668
+ case 'boldunderlinestrikethrough':
17669
+ textSettings.bold = true;
17670
+ textSettings.italic = false;
17671
+ textSettings.underline = true;
17672
+ textSettings.strikethrough = true;
17673
+ break;
17674
+ case 'italicunderlinestrikethrough':
17675
+ textSettings.bold = false;
17676
+ textSettings.italic = true;
17677
+ textSettings.underline = true;
17678
+ textSettings.strikethrough = true;
17679
+ break;
17680
+ case 'bolditalicunderlinestrikethrough':
17681
+ textSettings.bold = true;
17682
+ textSettings.italic = true;
17683
+ textSettings.underline = true;
17684
+ textSettings.strikethrough = true;
17385
17685
  break;
17386
17686
  }
17387
17687
  parent.objColl.push(parent.activeObj);
@@ -17391,8 +17691,10 @@ var Shape = /** @__PURE__ @class */ (function () {
17391
17691
  previousCropObj: prevCropObj, previousText: null,
17392
17692
  currentText: null, previousFilter: null, isCircleCrop: null } });
17393
17693
  parent.objColl.pop();
17394
- parent.activeObj.textSettings.bold = tempBold;
17395
- parent.activeObj.textSettings.italic = tempItalic;
17694
+ textSettings.bold = tempBold;
17695
+ textSettings.italic = tempItalic;
17696
+ textSettings.underline = tempUnderline;
17697
+ textSettings.strikethrough = tempStrikethrough;
17396
17698
  };
17397
17699
  Shape.prototype.pushActItemIntoObj = function () {
17398
17700
  var parent = this.parent;
@@ -17585,24 +17887,107 @@ var Shape = /** @__PURE__ @class */ (function () {
17585
17887
  };
17586
17888
  Shape.prototype.getTextAreaWidth = function (item) {
17587
17889
  var parent = this.parent;
17588
- var tempBold = parent.activeObj.textSettings.bold;
17589
- var tempItalic = parent.activeObj.textSettings.italic;
17890
+ var textSettings = parent.activeObj.textSettings;
17891
+ var tempBold = textSettings.bold;
17892
+ var tempItalic = textSettings.italic;
17893
+ var tempUnderline = textSettings.underline;
17894
+ var tempStrikethrough = textSettings.strikethrough;
17590
17895
  switch (item) {
17591
17896
  case 'default':
17592
- parent.activeObj.textSettings.bold = false;
17593
- parent.activeObj.textSettings.italic = false;
17897
+ textSettings.bold = false;
17898
+ textSettings.italic = false;
17899
+ textSettings.underline = false;
17900
+ textSettings.strikethrough = false;
17594
17901
  break;
17595
17902
  case 'bold':
17596
- parent.activeObj.textSettings.bold = true;
17597
- parent.activeObj.textSettings.italic = false;
17903
+ textSettings.bold = true;
17904
+ textSettings.italic = false;
17905
+ textSettings.underline = false;
17906
+ textSettings.strikethrough = false;
17598
17907
  break;
17599
17908
  case 'italic':
17600
- parent.activeObj.textSettings.bold = false;
17601
- parent.activeObj.textSettings.italic = true;
17909
+ textSettings.bold = false;
17910
+ textSettings.italic = true;
17911
+ textSettings.underline = false;
17912
+ textSettings.strikethrough = false;
17602
17913
  break;
17603
17914
  case 'bolditalic':
17604
- parent.activeObj.textSettings.bold = true;
17605
- parent.activeObj.textSettings.italic = true;
17915
+ textSettings.bold = true;
17916
+ textSettings.italic = true;
17917
+ textSettings.underline = false;
17918
+ textSettings.strikethrough = false;
17919
+ break;
17920
+ case 'underline':
17921
+ textSettings.bold = false;
17922
+ textSettings.italic = false;
17923
+ textSettings.underline = true;
17924
+ textSettings.strikethrough = false;
17925
+ break;
17926
+ case 'boldunderline':
17927
+ textSettings.bold = true;
17928
+ textSettings.italic = false;
17929
+ textSettings.underline = true;
17930
+ textSettings.strikethrough = false;
17931
+ break;
17932
+ case 'italicunderline':
17933
+ textSettings.bold = false;
17934
+ textSettings.italic = true;
17935
+ textSettings.underline = true;
17936
+ textSettings.strikethrough = false;
17937
+ break;
17938
+ case 'bolditalicunderline':
17939
+ textSettings.bold = true;
17940
+ textSettings.italic = true;
17941
+ textSettings.underline = true;
17942
+ textSettings.strikethrough = false;
17943
+ break;
17944
+ case 'strikethrough':
17945
+ textSettings.bold = false;
17946
+ textSettings.italic = false;
17947
+ textSettings.underline = false;
17948
+ textSettings.strikethrough = true;
17949
+ break;
17950
+ case 'boldstrikethrough':
17951
+ textSettings.bold = true;
17952
+ textSettings.italic = false;
17953
+ textSettings.underline = false;
17954
+ textSettings.strikethrough = true;
17955
+ break;
17956
+ case 'italicstrikethrough':
17957
+ textSettings.bold = false;
17958
+ textSettings.italic = true;
17959
+ textSettings.underline = false;
17960
+ textSettings.strikethrough = true;
17961
+ break;
17962
+ case 'underlinestrikethrough':
17963
+ textSettings.bold = false;
17964
+ textSettings.italic = false;
17965
+ textSettings.underline = true;
17966
+ textSettings.strikethrough = true;
17967
+ break;
17968
+ case 'bolditalicstrikethrough':
17969
+ textSettings.bold = true;
17970
+ textSettings.italic = true;
17971
+ textSettings.underline = false;
17972
+ textSettings.strikethrough = true;
17973
+ break;
17974
+ case 'boldunderlinestrikethrough':
17975
+ textSettings.bold = true;
17976
+ textSettings.italic = false;
17977
+ textSettings.underline = true;
17978
+ textSettings.strikethrough = true;
17979
+ break;
17980
+ case 'italicunderlinestrikethrough':
17981
+ textSettings.bold = false;
17982
+ textSettings.italic = true;
17983
+ textSettings.underline = true;
17984
+ textSettings.strikethrough = true;
17985
+ break;
17986
+ case 'bolditalicunderlinestrikethrough':
17987
+ textSettings.bold = true;
17988
+ textSettings.italic = true;
17989
+ textSettings.underline = true;
17990
+ textSettings.strikethrough = true;
17606
17991
  break;
17607
17992
  }
17608
17993
  var isTextArea = parent.textArea.style.display === 'none' ? false : true;
@@ -17610,14 +17995,16 @@ var Shape = /** @__PURE__ @class */ (function () {
17610
17995
  var width;
17611
17996
  if (!isTextArea) {
17612
17997
  width = this.upperContext.measureText(parent.activeObj.keyHistory).width +
17613
- parent.activeObj.textSettings.fontSize * 0.5;
17998
+ textSettings.fontSize * 0.5;
17614
17999
  }
17615
18000
  else {
17616
18001
  width = this.upperContext.measureText(parent.textArea.value).width +
17617
- parent.activeObj.textSettings.fontSize * 0.5;
18002
+ textSettings.fontSize * 0.5;
17618
18003
  }
17619
- parent.activeObj.textSettings.bold = tempBold;
17620
- parent.activeObj.textSettings.italic = tempItalic;
18004
+ textSettings.bold = tempBold;
18005
+ textSettings.italic = tempItalic;
18006
+ textSettings.underline = tempUnderline;
18007
+ textSettings.strikethrough = tempStrikethrough;
17621
18008
  return width;
17622
18009
  };
17623
18010
  Shape.prototype.getRedactObjDetails = function (obj) {
@@ -17696,6 +18083,12 @@ var Shape = /** @__PURE__ @class */ (function () {
17696
18083
  if (obj.textSettings.italic) {
17697
18084
  shapeDetails.fontStyle.push('italic');
17698
18085
  }
18086
+ if (obj.textSettings.underline) {
18087
+ shapeDetails.fontStyle.push('underline');
18088
+ }
18089
+ if (obj.textSettings.strikethrough) {
18090
+ shapeDetails.fontStyle.push('strikethrough');
18091
+ }
17699
18092
  shapeDetails.degree = obj.rotatedAngle * (180 / Math.PI);
17700
18093
  parent.notify('selection', { prop: 'updateTransColl', onPropertyChange: false, value: { obj: transformObj, object: obj } });
17701
18094
  shapeDetails.transformCollection = transformObj['coll'];
@@ -17995,6 +18388,7 @@ var Shape = /** @__PURE__ @class */ (function () {
17995
18388
  this.lowerContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
17996
18389
  parent.notify('draw', { prop: 'redrawImgWithObj', onPropertyChange: false });
17997
18390
  parent.notify('toolbar', { prop: 'refresh-main-toolbar', onPropertyChange: false });
18391
+ parent.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'ok' } });
17998
18392
  }
17999
18393
  };
18000
18394
  Shape.prototype.getMaxText = function (isTextBox, text, obj) {
@@ -19411,40 +19805,40 @@ var Transform = /** @__PURE__ @class */ (function () {
19411
19805
  destWidth: parent.img.destWidth, destHeight: parent.img.destHeight };
19412
19806
  if (parent.activeObj.shape) {
19413
19807
  var maxDimension = this.setZoomDimension(-0.1, parent.activeObj);
19414
- if (!isNullOrUndefined(zoomOut)) {
19415
- var actPoint = parent.activeObj.activePoint;
19416
- if (parent.transform.straighten === 0) {
19417
- if (parent.img.destLeft > actPoint.startX || parent.img.destTop >
19418
- actPoint.startY || parent.img.destLeft + parent.img.destWidth <
19419
- actPoint.endX || parent.img.destTop + parent.img.destHeight < actPoint.endY
19420
- || zoomFactor === minZoomFactor) {
19421
- zoomOut.classList.add('e-disabled');
19422
- zoomOut.parentElement.classList.add('e-overlay');
19423
- isDisabled = true;
19424
- }
19425
- else {
19426
- zoomOut.classList.remove('e-disabled');
19427
- zoomOut.parentElement.classList.remove('e-overlay');
19428
- isDisabled = false;
19429
- }
19808
+ var actPoint = parent.activeObj.activePoint;
19809
+ if (parent.transform.straighten === 0) {
19810
+ if (parent.img.destLeft > actPoint.startX || parent.img.destTop >
19811
+ actPoint.startY || parent.img.destLeft + parent.img.destWidth <
19812
+ actPoint.endX || parent.img.destTop + parent.img.destHeight < actPoint.endY
19813
+ || zoomFactor === minZoomFactor) {
19814
+ isDisabled = true;
19430
19815
  }
19431
19816
  else {
19432
- parent.img.destWidth = maxDimension.width;
19433
- parent.img.destHeight = maxDimension.height;
19434
- var obj = { isIntersect: null };
19435
- parent.notify('draw', { prop: 'updateImgCanvasPoints', onPropertyChange: false });
19436
- parent.notify('draw', { prop: 'isLinesIntersect', onPropertyChange: false, value: { obj: obj } });
19437
- if (obj['isIntersect'] ||
19438
- zoomFactor === minZoomFactor) {
19439
- zoomOut.classList.add('e-disabled');
19440
- zoomOut.parentElement.classList.add('e-overlay');
19441
- isDisabled = true;
19442
- }
19443
- else {
19444
- zoomOut.classList.remove('e-disabled');
19445
- zoomOut.parentElement.classList.remove('e-overlay');
19446
- isDisabled = false;
19447
- }
19817
+ isDisabled = false;
19818
+ }
19819
+ }
19820
+ else {
19821
+ parent.img.destWidth = maxDimension.width;
19822
+ parent.img.destHeight = maxDimension.height;
19823
+ var obj = { isIntersect: null };
19824
+ parent.notify('draw', { prop: 'updateImgCanvasPoints', onPropertyChange: false });
19825
+ parent.notify('draw', { prop: 'isLinesIntersect', onPropertyChange: false, value: { obj: obj } });
19826
+ if (obj['isIntersect'] ||
19827
+ zoomFactor === minZoomFactor) {
19828
+ isDisabled = true;
19829
+ }
19830
+ else {
19831
+ isDisabled = false;
19832
+ }
19833
+ }
19834
+ if (zoomOut) {
19835
+ if (isDisabled) {
19836
+ zoomOut.classList.add('e-disabled');
19837
+ zoomOut.parentElement.classList.add('e-overlay');
19838
+ }
19839
+ else {
19840
+ zoomOut.classList.remove('e-disabled');
19841
+ zoomOut.parentElement.classList.remove('e-overlay');
19448
19842
  }
19449
19843
  }
19450
19844
  }
@@ -19480,7 +19874,7 @@ var Transform = /** @__PURE__ @class */ (function () {
19480
19874
  maxDimension.width += (maxDimension.width * parent.transform.zoomFactor);
19481
19875
  maxDimension.height += (maxDimension.height * parent.transform.zoomFactor);
19482
19876
  parent.img.destLeft = (parent.lowerCanvas.clientWidth - maxDimension.width) / 2;
19483
- parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height + 1) / 2;
19877
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height) / 2;
19484
19878
  }
19485
19879
  parent.notify('draw', { prop: 'draw-image-to-canvas', value: { dimension: maxDimension } });
19486
19880
  maxDimension.width = this.cropDimension.width;
@@ -20191,6 +20585,7 @@ var Transform = /** @__PURE__ @class */ (function () {
20191
20585
  parent.lowerCanvas.height = parent.upperCanvas.height = parent.maskCanvas.height =
20192
20586
  parseFloat(canvasWrapper.style.height);
20193
20587
  this.lowerContext.filter = tempFilter;
20588
+ this.lowerContext.imageSmoothingQuality = parent.imageSmoothingEnabled ? 'high' : 'low';
20194
20589
  var obj = { width: 0, height: 0 };
20195
20590
  this.calcMaxDimension(parent.img.srcWidth, parent.img.srcHeight, obj);
20196
20591
  var maxDimension = obj;
@@ -20203,7 +20598,7 @@ var Transform = /** @__PURE__ @class */ (function () {
20203
20598
  maxDimension.height += (maxDimension.height * parent.transform.defaultZoomFactor);
20204
20599
  }
20205
20600
  parent.img.destLeft = (parent.lowerCanvas.clientWidth - maxDimension.width) / 2;
20206
- parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height + 1) / 2;
20601
+ parent.img.destTop = (parent.lowerCanvas.clientHeight - maxDimension.height) / 2;
20207
20602
  if (parent.transform.degree === 0 && parent.transform.currFlipState === '') {
20208
20603
  if (parent.transform.defaultZoomFactor > 0) {
20209
20604
  parent.img.destLeft += parent.panPoint.totalPannedPoint.x;
@@ -20312,11 +20707,11 @@ var Transform = /** @__PURE__ @class */ (function () {
20312
20707
  var object = { toolbarHeight: 0 };
20313
20708
  var parent = this.parent;
20314
20709
  parent.notify('toolbar', { prop: 'getToolbarHeight', value: { obj: object } });
20315
- var canvasMaxWidth = isImgShape ? parent.element.clientWidth / 3 :
20316
- parent.element.clientWidth;
20317
- var canvasMaxHeight = isImgShape ? (parent.element.clientHeight - object['toolbarHeight']) / 3 :
20318
- parent.element.clientHeight - (object['toolbarHeight']); // 1px border
20319
- canvasMaxHeight = Browser.isDevice ? canvasMaxHeight - (object['toolbarHeight']) : canvasMaxHeight; // 1px border
20710
+ var newWidth = parent.imageSettings.width ? parent.imageSettings.width : parent.element.clientWidth;
20711
+ var newHeight = parent.imageSettings.height ? parent.imageSettings.height : parent.element.clientHeight - (object['toolbarHeight']);
20712
+ var canvasMaxWidth = isImgShape ? parent.element.clientWidth / 3 : newWidth;
20713
+ var canvasMaxHeight = isImgShape ? (parent.element.clientHeight - object['toolbarHeight']) / 3 : newHeight;
20714
+ canvasMaxHeight = Browser.isDevice ? canvasMaxHeight - (object['toolbarHeight']) : canvasMaxHeight;
20320
20715
  if (Browser.isDevice && parent.isStraightening) {
20321
20716
  var cxtTbar = parent.element.querySelector('#' + parent.element.id + '_contextualToolbarArea');
20322
20717
  canvasMaxHeight -= cxtTbar ? cxtTbar.clientHeight : 0;
@@ -20324,7 +20719,8 @@ var Transform = /** @__PURE__ @class */ (function () {
20324
20719
  if (!isImgShape && parent.element.clientHeight === 0) {
20325
20720
  canvasMaxHeight = 0;
20326
20721
  }
20327
- if (isNullOrUndefined(isImgShape)) {
20722
+ var isImageSettings = parent.imageSettings.width && parent.imageSettings.height ? true : false;
20723
+ if (isNullOrUndefined(isImgShape) && !(isImageSettings)) {
20328
20724
  if (canvasMaxWidth > 30) {
20329
20725
  canvasMaxWidth -= 30;
20330
20726
  }
@@ -20550,6 +20946,9 @@ var Transform = /** @__PURE__ @class */ (function () {
20550
20946
  this.zoomAction(.0125, null, true, true);
20551
20947
  }
20552
20948
  }
20949
+ if (parent.isPublicMethod && parent.aspectWidth === width && parent.aspectHeight === height) {
20950
+ return;
20951
+ }
20553
20952
  this.resizeImg(activeObj, width, height);
20554
20953
  width = tempwidth;
20555
20954
  height = tempheight;
@@ -20595,9 +20994,12 @@ var Transform = /** @__PURE__ @class */ (function () {
20595
20994
  value: { type: 'custom', startX: null, startY: null, width: null, height: null } });
20596
20995
  }
20597
20996
  if (isNullOrUndefined(parent.currSelectionPoint)) {
20598
- parent.notify('draw', { prop: 'select', onPropertyChange: false,
20599
- value: { type: 'custom', startX: parent.img.destLeft, startY: parent.img.destTop,
20600
- width: parent.img.destWidth, height: parent.img.destHeight } });
20997
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
20998
+ if (!parent.shapeColl.some(function (item) { return item.rotatedAngle && item.rotatedAngle !== 0; })) {
20999
+ parent.notify('draw', { prop: 'select', onPropertyChange: false,
21000
+ value: { type: 'custom', startX: parent.img.destLeft, startY: parent.img.destTop,
21001
+ width: parent.img.destWidth, height: parent.img.destHeight } });
21002
+ }
20601
21003
  }
20602
21004
  else {
20603
21005
  parent.notify('draw', { prop: 'select', onPropertyChange: false,
@@ -20779,6 +21181,8 @@ var UndoRedo = /** @__PURE__ @class */ (function () {
20779
21181
  this.tempUndoRedoColl = [];
20780
21182
  this.tempUndoRedoStep = 0;
20781
21183
  this.isPreventing = false;
21184
+ this.preventEditComplete = false;
21185
+ this.preventApplyEditComplete = false;
20782
21186
  this.parent = parent;
20783
21187
  this.addEventListener();
20784
21188
  }
@@ -20860,6 +21264,12 @@ var UndoRedo = /** @__PURE__ @class */ (function () {
20860
21264
  case 'reset':
20861
21265
  this.reset();
20862
21266
  break;
21267
+ case 'preventEditComplete':
21268
+ args.value['obj']['bool'] = this.preventEditComplete;
21269
+ break;
21270
+ case 'preventApplyEditComplete':
21271
+ this.preventApplyEditComplete = args.value['bool'];
21272
+ break;
20863
21273
  }
20864
21274
  };
20865
21275
  UndoRedo.prototype.getModuleName = function () {
@@ -20874,6 +21284,7 @@ var UndoRedo = /** @__PURE__ @class */ (function () {
20874
21284
  this.tempUndoRedoColl = [];
20875
21285
  this.tempUndoRedoStep = 0;
20876
21286
  this.isPreventing = false;
21287
+ this.preventEditComplete = this.preventApplyEditComplete = false;
20877
21288
  };
20878
21289
  UndoRedo.prototype.refreshUrc = function (refreshToolbar) {
20879
21290
  var parent = this.parent;
@@ -21585,6 +21996,10 @@ var UndoRedo = /** @__PURE__ @class */ (function () {
21585
21996
  textArea.style.color = obj.strokeSettings.strokeColor;
21586
21997
  textArea.style.fontWeight = obj.textSettings.bold ? 'bold' : 'normal';
21587
21998
  textArea.style.fontStyle = obj.textSettings.italic ? 'italic' : 'normal';
21999
+ textArea.style.textDecoration = (obj.textSettings.underline && obj.textSettings.strikethrough) ? 'underline line-through' :
22000
+ (obj.textSettings.underline) ? 'underline' :
22001
+ (obj.textSettings.strikethrough) ? 'line-through' :
22002
+ 'none';
21588
22003
  textArea.style.border = '2px solid ' + parent.themeColl[parent.theme]['primaryColor'];
21589
22004
  textArea.value = obj.keyHistory;
21590
22005
  parent.activeObj = extend({}, obj, {}, true);
@@ -21918,6 +22333,7 @@ var UndoRedo = /** @__PURE__ @class */ (function () {
21918
22333
  var temp = parent.noPushUndo;
21919
22334
  parent.noPushUndo = false;
21920
22335
  parent.isUndoRedoStack = true;
22336
+ this.preventEditComplete = true;
21921
22337
  if (isPenDraw) {
21922
22338
  var tempTogglePen = parent.togglePen;
21923
22339
  var obj = { freehandDrawSelectedId: null };
@@ -21946,7 +22362,14 @@ var UndoRedo = /** @__PURE__ @class */ (function () {
21946
22362
  parent.enableTextEditing();
21947
22363
  }
21948
22364
  }
21949
- parent.isUndoRedoStack = false;
22365
+ if (this.preventEditComplete) {
22366
+ parent.isUndoRedoStack = this.preventEditComplete = false;
22367
+ if (!this.preventApplyEditComplete) {
22368
+ this.triggerActionCompletedEvent('shape-customize');
22369
+ }
22370
+ this.triggerActionCompletedEvent('shape-select');
22371
+ }
22372
+ parent.isUndoRedoStack = this.preventEditComplete = false;
21950
22373
  }
21951
22374
  };
21952
22375
  return UndoRedo;
@@ -22242,6 +22665,12 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
22242
22665
  _this.tempRedactBlur = 50;
22243
22666
  /** @hidden */
22244
22667
  _this.tempRedactPixel = 40;
22668
+ /** @hidden */
22669
+ _this.imageSettings = { width: null, height: null };
22670
+ /** @hidden */
22671
+ _this.aspectRatioBaseDimension = false;
22672
+ /** @hidden */
22673
+ _this.imageLoaded = false;
22245
22674
  _this.tempToolbarHeight = 0;
22246
22675
  _this.tempToolbar = [];
22247
22676
  ImageEditor_1.Inject(Crop, Draw, Selection, Transform, Export, ToolbarModule);
@@ -22346,11 +22775,13 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
22346
22775
  break;
22347
22776
  case 'disabled':
22348
22777
  if (newProperties.disabled) {
22349
- this.element.classList.add('e-disabled');
22778
+ this.element.classList.add('e-disabled', 'e-overlay');
22779
+ this.element.style.opacity = '0.5';
22350
22780
  this.unwireEvent();
22351
22781
  }
22352
22782
  else {
22353
- this.element.classList.remove('e-disabled');
22783
+ this.element.classList.remove('e-disabled', 'e-overlay');
22784
+ this.element.style.opacity = '1';
22354
22785
  this.wireEvent();
22355
22786
  }
22356
22787
  break;
@@ -22468,7 +22899,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
22468
22899
  if (newProperties.uploadSettings) {
22469
22900
  this.uploadSettings = newProperties.uploadSettings;
22470
22901
  if (!this.uploadSettings.allowedExtensions) {
22471
- this.uploadSettings.allowedExtensions = '.jpg, .jpeg, .png, .svg, .webp';
22902
+ this.uploadSettings.allowedExtensions = '.jpg, .jpeg, .png, .svg, .webp, .bmp';
22472
22903
  this.notify('draw', { prop: 'setNullExtension', value: { extension: true } });
22473
22904
  }
22474
22905
  else {
@@ -22517,6 +22948,10 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
22517
22948
  this.element.innerHTML = '';
22518
22949
  };
22519
22950
  ImageEditor.prototype.initialize = function () {
22951
+ if (this.disabled) {
22952
+ this.element.classList.add('e-disabled', 'e-overlay');
22953
+ this.element.style.opacity = '0.5';
22954
+ }
22520
22955
  if (this.toolbarTemplate) {
22521
22956
  this.element.appendChild(this.createElement('div', {
22522
22957
  id: this.element.id + '_toolbarArea', className: 'e-toolbar-area'
@@ -22528,7 +22963,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
22528
22963
  this.notify('toolbar', { prop: 'create-contextual-toolbar', onPropertyChange: false });
22529
22964
  }
22530
22965
  if (!this.uploadSettings.allowedExtensions) {
22531
- this.setProperties({ uploadSettings: { allowedExtensions: '.jpg, .jpeg, .png, .svg, .webp' } }, true);
22966
+ this.setProperties({ uploadSettings: { allowedExtensions: '.jpg, .jpeg, .png, .svg, .webp, .bmp' } }, true);
22532
22967
  }
22533
22968
  else {
22534
22969
  this.notify('draw', { prop: 'setNullExtension', value: { extension: false } });
@@ -22729,7 +23164,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
22729
23164
  * @returns {string[]}.
22730
23165
  */
22731
23166
  ImageEditor.prototype.getExtensionArray = function () {
22732
- var validExtensions = ['jpeg', 'jpg', 'png', 'svg', 'webp'];
23167
+ var validExtensions = ['jpeg', 'jpg', 'png', 'svg', 'webp', 'bmp'];
22733
23168
  var split = this.uploadSettings.allowedExtensions.split(',');
22734
23169
  var extension = [];
22735
23170
  for (var _i = 0, split_1 = split; _i < split_1.length; _i++) {
@@ -22781,6 +23216,9 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
22781
23216
  case 'webp':
22782
23217
  words += ' WebP,';
22783
23218
  break;
23219
+ case 'bmp':
23220
+ words += ' BMP,';
23221
+ break;
22784
23222
  }
22785
23223
  if (i === extension.length - 1) {
22786
23224
  words = words.slice(0, -1);
@@ -23069,10 +23507,16 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23069
23507
  */
23070
23508
  ImageEditor.prototype.flip = function (direction) {
23071
23509
  this.applyShapes();
23072
- this.updateImageTransformColl(direction.toLowerCase() + 'flip');
23073
- this.notify('transform', { prop: 'flip', value: { direction: direction } });
23074
- this.notify('draw', { prop: 'redrawDownScale' });
23075
- this.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'ok' } });
23510
+ if (this.activeObj.shape && this.activeObj.shape.indexOf('crop') > -1) {
23511
+ this.transformSelect(direction.toLowerCase() + 'flip');
23512
+ }
23513
+ else {
23514
+ this.updateImageTransformColl(direction.toLowerCase() + 'flip');
23515
+ this.setRotateZoom();
23516
+ this.notify('transform', { prop: 'flip', value: { direction: direction } });
23517
+ this.notify('draw', { prop: 'redrawDownScale' });
23518
+ this.notify('undo-redo', { prop: 'updateCurrUrc', value: { type: 'ok' } });
23519
+ }
23076
23520
  var actionArgs = { action: 'flip', actionEventArgs: this.editCompleteArgs };
23077
23521
  this.triggerEditCompleteEvent(actionArgs);
23078
23522
  };
@@ -23111,7 +23555,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23111
23555
  *
23112
23556
  * @param {string | ImageData } data - Specifies url of the image or image data.
23113
23557
  * @param {boolean} [resetChanges=true] - Optional. Determines whether to reset existing changes when opening the image. The default value is true, which resets all existing changes.
23114
- * @param {ImageSettings} imageSettings - Optional. Specifies the image setting that contains background color to apply when opening a transparent image. The default value of background color is an empty string (''), meaning no background color is applied by default when a transparent image is opened.
23558
+ * @param {ImageSettings} imageSettings - Optional. Specifies image settings to apply when loading an image.
23115
23559
  *
23116
23560
  * @remarks
23117
23561
  * The supported file types are JPG, JPEG, PNG, and SVG.
@@ -23119,16 +23563,88 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23119
23563
  * @returns {void}.
23120
23564
  */
23121
23565
  ImageEditor.prototype.open = function (data, resetChanges, imageSettings) {
23566
+ var _this = this;
23122
23567
  resetChanges = isNullOrUndefined(resetChanges) ? true : resetChanges;
23123
23568
  if (resetChanges) {
23124
- if (isNullOrUndefined(data)) {
23569
+ if (isNullOrUndefined(data) || this.disabled) {
23125
23570
  return;
23126
23571
  }
23127
23572
  var dropArea = document.getElementById(this.element.id + '_dropArea');
23128
23573
  if (dropArea) {
23129
23574
  dropArea.style.display = 'none';
23130
23575
  }
23131
- this.notify('draw', { prop: 'open', value: { data: data } });
23576
+ this.imageSettings = { width: null, height: null };
23577
+ this.aspectRatioBaseDimension = null;
23578
+ if (imageSettings && (imageSettings.width || imageSettings.height)) {
23579
+ var tempImageSettings_1 = extend({}, imageSettings, {}, true);
23580
+ imageSettings = this.scaleToFit(imageSettings);
23581
+ this.aspectRatioBaseDimension = imageSettings.isAspectRatio;
23582
+ if (!imageSettings.isAspectRatio && imageSettings.width && imageSettings.height) {
23583
+ this.imageSettings.width = imageSettings.width;
23584
+ this.imageSettings.height = imageSettings.height;
23585
+ this.notify('draw', { prop: 'open', value: { data: data } });
23586
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23587
+ var intervalId_1 = setInterval(function () {
23588
+ if (_this.imageLoaded && _this.baseImg.width && _this.baseImg.height) {
23589
+ _this.setInitialZoomLevel(tempImageSettings_1);
23590
+ clearInterval(intervalId_1);
23591
+ }
23592
+ }, 1);
23593
+ }
23594
+ else if (imageSettings.width || imageSettings.height) {
23595
+ this.notify('draw', { prop: 'open', value: { data: data } });
23596
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23597
+ var intervalId_2 = setInterval(function () {
23598
+ if (_this.imageLoaded && _this.baseImg.width && _this.baseImg.height) {
23599
+ _this.imageSettings.width = imageSettings.width;
23600
+ _this.imageSettings.height = imageSettings.height;
23601
+ var originalWidth = _this.baseImg.width;
23602
+ var originalHeight = _this.baseImg.height;
23603
+ var maxValue = '';
23604
+ var aspectRatioValue = void 0;
23605
+ var value = void 0;
23606
+ var newValue = void 0;
23607
+ if (imageSettings.width && imageSettings.height) {
23608
+ maxValue = imageSettings.width > imageSettings.height ? 'width' : 'height';
23609
+ }
23610
+ if (maxValue === 'width' || (imageSettings.width && maxValue !== 'height')) {
23611
+ aspectRatioValue = imageSettings.width;
23612
+ value = aspectRatioValue / (originalWidth / originalHeight);
23613
+ newValue = value % 1 >= 0.5 || value % 1 <= -0.5 ? Math.round(value) : (value < 0) ? Math.ceil(value) : Math.floor(value);
23614
+ if (!imageSettings.height || newValue > imageSettings.height) {
23615
+ _this.imageSettings.height = imageSettings.height = newValue;
23616
+ }
23617
+ else {
23618
+ aspectRatioValue = imageSettings.height;
23619
+ value = aspectRatioValue / (originalHeight / originalWidth);
23620
+ newValue = value % 1 >= 0.5 || value % 1 <= -0.5 ? Math.round(value) : (value < 0) ? Math.ceil(value) : Math.floor(value);
23621
+ _this.imageSettings.width = imageSettings.width = newValue;
23622
+ }
23623
+ }
23624
+ else if (maxValue === 'height' || (imageSettings.height && maxValue !== 'width')) {
23625
+ aspectRatioValue = imageSettings.height;
23626
+ value = aspectRatioValue / (originalHeight / originalWidth);
23627
+ newValue = value % 1 >= 0.5 || value % 1 <= -0.5 ? Math.round(value) : (value < 0) ? Math.ceil(value) : Math.floor(value);
23628
+ if (!imageSettings.width || newValue > imageSettings.width) {
23629
+ _this.imageSettings.width = imageSettings.width = newValue;
23630
+ }
23631
+ else {
23632
+ aspectRatioValue = imageSettings.width;
23633
+ value = aspectRatioValue / (originalWidth / originalHeight);
23634
+ newValue = value % 1 >= 0.5 || value % 1 <= -0.5 ? Math.round(value) : (value < 0) ? Math.ceil(value) : Math.floor(value);
23635
+ _this.imageSettings.height = imageSettings.height = newValue;
23636
+ }
23637
+ }
23638
+ _this.notify('draw', { prop: 'open', value: { data: data } });
23639
+ _this.setInitialZoomLevel(tempImageSettings_1);
23640
+ clearInterval(intervalId_2);
23641
+ }
23642
+ }, 1);
23643
+ }
23644
+ }
23645
+ else {
23646
+ this.notify('draw', { prop: 'open', value: { data: data } });
23647
+ }
23132
23648
  }
23133
23649
  else {
23134
23650
  this.updateImage(data, imageSettings ? imageSettings.backgroundColor : null);
@@ -23282,11 +23798,18 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23282
23798
  ImageEditor.prototype.rotate = function (degree) {
23283
23799
  var obj = { isRotate: false };
23284
23800
  this.applyShapes();
23285
- if (degree === 90 || degree === -90) {
23286
- this.updateImageTransformColl(degree === 90 ? 'rotateright' : 'rotateleft');
23801
+ if (this.activeObj.shape && this.activeObj.shape.indexOf('crop') > -1) {
23802
+ this.transformSelect(degree === 90 ? 'rotateright' : 'rotateleft');
23803
+ obj['isRotate'] = true;
23804
+ }
23805
+ else {
23806
+ if (degree === 90 || degree === -90) {
23807
+ this.updateImageTransformColl(degree === 90 ? 'rotateright' : 'rotateleft');
23808
+ }
23809
+ this.setRotateZoom();
23810
+ this.notify('transform', { prop: 'rotate', value: { degree: degree, obj: obj } });
23811
+ this.notify('draw', { prop: 'redrawDownScale' });
23287
23812
  }
23288
- this.notify('transform', { prop: 'rotate', value: { degree: degree, obj: obj } });
23289
- this.notify('draw', { prop: 'redrawDownScale' });
23290
23813
  var actionArgs = { action: 'rotate', actionEventArgs: this.editCompleteArgs };
23291
23814
  this.triggerEditCompleteEvent(actionArgs);
23292
23815
  return obj['isRotate'];
@@ -23304,7 +23827,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23304
23827
  * @returns {void}.
23305
23828
  */
23306
23829
  ImageEditor.prototype.export = function (type, fileName, imageQuality) {
23307
- this.applyShapes();
23830
+ this.manageActiveAction();
23308
23831
  this.notify('export', { prop: 'export', onPropertyChange: false, value: { type: type, fileName: fileName, imgQuality: imageQuality } });
23309
23832
  };
23310
23833
  /**
@@ -23412,6 +23935,17 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23412
23935
  */
23413
23936
  ImageEditor.prototype.zoom = function (zoomFactor, zoomPoint) {
23414
23937
  this.isZoomBtnClick = true;
23938
+ var prevZoom = this.transform.zoomFactor;
23939
+ if (prevZoom !== 0) {
23940
+ var zoomObj = { previousZoomValue: null };
23941
+ this.notify('transform', { prop: 'getPreviousZoomValue', value: { obj: zoomObj } });
23942
+ prevZoom = zoomObj.previousZoomValue;
23943
+ }
23944
+ if (zoomFactor !== 1 && prevZoom !== 0 && ((prevZoom < 1 && zoomFactor > 1) || (prevZoom > 1 && zoomFactor < 1))) {
23945
+ this.notify('transform', { prop: 'zoom', onPropertyChange: false,
23946
+ value: { zoomFactor: 1, zoomPoint: zoomPoint }
23947
+ });
23948
+ }
23415
23949
  this.notify('transform', { prop: 'zoom', onPropertyChange: false,
23416
23950
  value: { zoomFactor: zoomFactor, zoomPoint: zoomPoint } });
23417
23951
  this.notify('draw', { prop: 'redrawDownScale' });
@@ -23574,10 +24108,12 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23574
24108
  * @param {string} strokeColor - Specifies the outline color of the text annotation.
23575
24109
  * @param {number} strokeWidth - Specifies the outline stroke width of the text annotation.
23576
24110
  * @param {TransformationCollection[]} transformCollection - Specifies the transform collection of the text annotation.
24111
+ * @param {boolean} underline - Specifies whether the text should be underlined.
24112
+ * @param {boolean} strikethrough - Specifies whether the text should have a strikethrough.
23577
24113
  * @returns {boolean}.
23578
24114
  *
23579
24115
  */
23580
- ImageEditor.prototype.drawText = function (x, y, text, fontFamily, fontSize, bold, italic, color, isSelected, degree, fillColor, strokeColor, strokeWidth, transformCollection) {
24116
+ ImageEditor.prototype.drawText = function (x, y, text, fontFamily, fontSize, bold, italic, color, isSelected, degree, fillColor, strokeColor, strokeWidth, transformCollection, underline, strikethrough) {
23581
24117
  var isText = false;
23582
24118
  var isPointsInRange = this.allowShape(x, y);
23583
24119
  if (!this.disabled && this.isImageLoaded && (isPointsInRange || (isNullOrUndefined(x) && isNullOrUndefined(y)))) {
@@ -23585,7 +24121,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23585
24121
  this.manageActiveAction();
23586
24122
  this.notify('shape', { prop: 'drawText', onPropertyChange: false, value: { x: x, y: y, text: text, fontFamily: fontFamily,
23587
24123
  fontSize: fontSize, bold: bold, italic: italic, color: color, isSelected: isSelected, degree: degree, fillColor: fillColor,
23588
- outlineColor: strokeColor, outlineWidth: strokeWidth, transformCollection: transformCollection } });
24124
+ outlineColor: strokeColor, outlineWidth: strokeWidth, transformCollection: transformCollection, underline: underline, strikethrough: strikethrough } });
23589
24125
  this.editCompleted();
23590
24126
  }
23591
24127
  return isText;
@@ -23610,14 +24146,27 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23610
24146
  var isImage = false;
23611
24147
  var isPointsInRange = this.allowShape(x, y);
23612
24148
  if (!this.disabled && this.isImageLoaded && (isPointsInRange || (isNullOrUndefined(x) && isNullOrUndefined(y)))) {
24149
+ if (typeof data === 'string') {
24150
+ try {
24151
+ var request = new XMLHttpRequest();
24152
+ var isBlob = data.indexOf('blob:') === 0;
24153
+ request.open(isBlob ? 'GET' : 'HEAD', data, false);
24154
+ request.send();
24155
+ isImage = request.status >= 200 && request.status < 300;
24156
+ }
24157
+ catch (error) {
24158
+ isImage = false;
24159
+ }
24160
+ }
24161
+ else if (data instanceof ImageData) {
24162
+ if (data.data instanceof Uint8ClampedArray && data.width > 0 && data.height > 0) {
24163
+ isImage = true;
24164
+ }
24165
+ }
23613
24166
  this.manageActiveAction();
23614
- var length_1 = this.objColl.length;
23615
24167
  this.notify('shape', { prop: 'drawImage', onPropertyChange: false, value: { x: x, y: y, width: width, height: height,
23616
24168
  src: data, degree: degree, isAspectRatio: isAspectRatio, opacity: opacity, isSelected: isSelected } });
23617
24169
  this.editCompleted();
23618
- if (this.objColl.length > length_1) {
23619
- isImage = true;
23620
- }
23621
24170
  }
23622
24171
  return isImage;
23623
24172
  };
@@ -23742,6 +24291,8 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23742
24291
  this.applyShapes();
23743
24292
  this.notify('shape', { prop: 'deleteShape', onPropertyChange: false, value: { id: id, isShape: true } });
23744
24293
  this.editCompleted('shape-delete');
24294
+ this.notify('draw', { prop: 'clearOuterCanvas', onPropertyChange: false, value: { context: this.lowerContext } });
24295
+ this.notify('draw', { prop: 'clearOuterCanvas', onPropertyChange: false, value: { context: this.upperContext } });
23745
24296
  };
23746
24297
  /**
23747
24298
  * Get particular shapes details based on id of the shape which is drawn on an image editor.
@@ -23953,6 +24504,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23953
24504
  var isResized = false;
23954
24505
  if (((width.toString()).length <= 4 && (height.toString()).length <= 4) && (!this.isCircleCrop || isAspectRatio)) {
23955
24506
  this.manageActiveAction();
24507
+ this.isPublicMethod = true;
23956
24508
  this.notify('toolbar', { prop: 'resizeClick', value: { bool: false } });
23957
24509
  var destPoints = { startX: this.img.destLeft, startY: this.img.destTop, width: this.img.destWidth,
23958
24510
  height: this.img.destHeight };
@@ -23988,6 +24540,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
23988
24540
  else {
23989
24541
  this.notify('draw', { prop: 'performCancel', value: { isContextualToolbar: null } });
23990
24542
  }
24543
+ this.isPublicMethod = false;
23991
24544
  this.notify('draw', { prop: 'redrawDownScale' });
23992
24545
  }
23993
24546
  return isResized;
@@ -24492,6 +25045,70 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
24492
25045
  }
24493
25046
  };
24494
25047
  // Toolbar related codes
25048
+ ImageEditor.prototype.scaleToFit = function (imageSettings) {
25049
+ var tempImageSettings = extend({}, imageSettings, {}, true);
25050
+ var viewPortWidth = this.lowerCanvas.clientWidth;
25051
+ var viewPortHeight = this.lowerCanvas.clientHeight;
25052
+ if (imageSettings.width && imageSettings.height && (imageSettings.width > viewPortWidth ||
25053
+ imageSettings.height > viewPortHeight)) {
25054
+ var widthScale = viewPortWidth / imageSettings.width;
25055
+ var heightScale = viewPortHeight / imageSettings.height;
25056
+ var scale = Math.min(widthScale, heightScale);
25057
+ tempImageSettings.width = Math.round(imageSettings.width * scale);
25058
+ tempImageSettings.height = Math.round(imageSettings.height * scale);
25059
+ }
25060
+ else if (imageSettings.width && imageSettings.width > viewPortWidth) {
25061
+ var scale = viewPortWidth / imageSettings.width;
25062
+ tempImageSettings.width = Math.round(imageSettings.width * scale);
25063
+ }
25064
+ else if (imageSettings.height && imageSettings.height > viewPortHeight) {
25065
+ var scale = viewPortHeight / imageSettings.height;
25066
+ tempImageSettings.height = Math.round(imageSettings.height * scale);
25067
+ }
25068
+ return tempImageSettings;
25069
+ };
25070
+ ImageEditor.prototype.setInitialZoomLevel = function (oldImageSettings) {
25071
+ var _this = this;
25072
+ var zoomLevel = 1;
25073
+ var newWidth = this.img.destWidth;
25074
+ var newHeight = this.img.destHeight;
25075
+ var oldWidth = oldImageSettings.width;
25076
+ var oldHeight = oldImageSettings.height;
25077
+ var dimObj = { width: 0, height: 0 };
25078
+ this.notify('transform', { prop: 'calcMaxDimension', onPropertyChange: false,
25079
+ value: { width: this.img.srcWidth, height: this.img.srcHeight, obj: dimObj, isImgShape: null } });
25080
+ while ((newWidth && oldWidth && oldWidth > newWidth) || (newHeight && oldHeight && oldHeight > newHeight)) {
25081
+ newWidth = dimObj['width'] + (dimObj['width'] * 0.025 * zoomLevel);
25082
+ newHeight = dimObj['height'] + (dimObj['height'] * 0.025 * zoomLevel);
25083
+ if (Math.abs(newWidth) >= Math.abs(oldWidth) && Math.abs(newHeight) >= Math.abs(oldHeight)) {
25084
+ break;
25085
+ }
25086
+ zoomLevel++;
25087
+ }
25088
+ if (zoomLevel > 1) {
25089
+ this.isImageLoaded = true;
25090
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25091
+ var intervalId_3 = setInterval(function () {
25092
+ if (_this.imageLoaded) {
25093
+ for (var i = 1; i < zoomLevel; i++) {
25094
+ if (Math.round(i / 4) < _this.zoomSettings.maxZoomFactor) {
25095
+ _this.notify('transform', { prop: 'zoomAction', onPropertyChange: false,
25096
+ value: { zoomFactor: 0.025, zoomPoint: null, isResize: true } });
25097
+ }
25098
+ else {
25099
+ zoomLevel = i;
25100
+ break;
25101
+ }
25102
+ }
25103
+ _this.setProperties({ zoomSettings: { zoomFactor: Math.round(zoomLevel / 4) } }, true);
25104
+ _this.notify('transform', { prop: 'setPreviousZoomValue', onPropertyChange: false,
25105
+ value: { previousZoomValue: _this.zoomSettings.zoomFactor } });
25106
+ _this.notify('toolbar', { prop: 'enable-disable-btns' });
25107
+ clearInterval(intervalId_3);
25108
+ }
25109
+ }, 1);
25110
+ }
25111
+ };
24495
25112
  ImageEditor.prototype.resetToolbar = function () {
24496
25113
  if (this.toolbarHeight !== this.tempToolbarHeight && !((isNullOrUndefined(this.toolbar) ||
24497
25114
  (this.toolbar && this.toolbar.length > 0)
@@ -24506,6 +25123,14 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
24506
25123
  this.update();
24507
25124
  }
24508
25125
  };
25126
+ ImageEditor.prototype.setRotateZoom = function () {
25127
+ if (this.transform.zoomFactor > 0) {
25128
+ this.notify('draw', { prop: 'setRotateZoom', onPropertyChange: false, value: { isRotateZoom: true } });
25129
+ }
25130
+ else {
25131
+ this.notify('draw', { prop: 'setRotateZoom', onPropertyChange: false, value: { isRotateZoom: false } });
25132
+ }
25133
+ };
24509
25134
  ImageEditor.prototype.getData = function (isMaskImage) {
24510
25135
  if (isMaskImage) {
24511
25136
  this.resetToolbar();
@@ -25142,6 +25767,11 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
25142
25767
  }
25143
25768
  };
25144
25769
  ImageEditor.prototype.triggerEditCompleteEvent = function (args) {
25770
+ var obj = { bool: false };
25771
+ this.notify('undo-redo', { prop: 'preventEditComplete', value: { obj: obj } });
25772
+ if (obj['bool']) {
25773
+ return;
25774
+ }
25145
25775
  if (args.action === 'shape-insert' && args.actionEventArgs &&
25146
25776
  args.actionEventArgs.currentShapeSettings &&
25147
25777
  args.actionEventArgs.currentShapeSettings.type.toString() === 'Redact') {
@@ -26430,9 +27060,17 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
26430
27060
  this.notify('crop', { prop: 'calcRatio', onPropertyChange: false,
26431
27061
  value: { obj: obj_7, dimension: { width: ctx.canvas.width, height: ctx.canvas.height } } });
26432
27062
  }
26433
- var dimension = void 0;
26434
- // eslint-disable-next-line prefer-const
26435
- dimension = this.getRotatedCanvasDim(this.baseImg.width, this.baseImg.height, this.transform.straighten);
27063
+ var width = this.baseImg.width;
27064
+ var height = this.baseImg.height;
27065
+ if (!this.aspectRatioBaseDimension && this.imageSettings.width && this.imageSettings.height) {
27066
+ var widthRatio = this.baseImg.width / this.imageSettings.width;
27067
+ var heightRatio = this.baseImg.height / this.imageSettings.height;
27068
+ var ratio = (widthRatio + heightRatio) / 2;
27069
+ ratio = ratio < 1 ? 1 : ratio;
27070
+ width = this.imageSettings.width * ratio;
27071
+ height = this.imageSettings.height * ratio;
27072
+ }
27073
+ var dimension = this.getRotatedCanvasDim(width, height, this.transform.straighten);
26436
27074
  this.img.srcWidth = ctx.canvas.width = dimension.width;
26437
27075
  this.img.srcHeight = ctx.canvas.height = dimension.height;
26438
27076
  var x = ctx.canvas.width / 2;
@@ -26440,7 +27078,7 @@ var ImageEditor = /** @__PURE__ @class */ (function (_super) {
26440
27078
  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
26441
27079
  ctx.translate(x, y);
26442
27080
  ctx.rotate(straighten * Math.PI / 180);
26443
- ctx.drawImage(this.baseImg, -this.baseImg.width / 2, -this.baseImg.height / 2, this.baseImg.width, this.baseImg.height);
27081
+ ctx.drawImage(this.baseImg, -width / 2, -height / 2, width, height);
26444
27082
  ctx.setTransform(1, 0, 0, 1, 0, 0);
26445
27083
  var obj = { width: 0, height: 0 };
26446
27084
  this.notify('crop', { prop: 'calcRatio', onPropertyChange: false, value: { obj: obj, dimension: { width: ctx.canvas.width, height: ctx.canvas.height } } });
@@ -26758,6 +27396,8 @@ var FileType;
26758
27396
  FileType["Svg"] = "Svg";
26759
27397
  /** The WebP file type. */
26760
27398
  FileType["WebP"] = "WebP";
27399
+ /** The BMP file type. */
27400
+ FileType["Bmp"] = "Bmp";
26761
27401
  })(FileType || (FileType = {}));
26762
27402
  /**
26763
27403
  * An enumeration representing the direction of an image editor operation.
@@ -27134,7 +27774,9 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
27134
27774
  Path: 'Path',
27135
27775
  Bold: 'Bold',
27136
27776
  Italic: 'Italic',
27777
+ Underline: 'Underline',
27137
27778
  BoldItalic: 'Bold Italic',
27779
+ Strikethrough: 'Strikethrough',
27138
27780
  XSmall: 'X-Small',
27139
27781
  Small: 'Small',
27140
27782
  Medium: 'Medium',
@@ -29208,12 +29850,16 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
29208
29850
  if (!Browser.isDevice) {
29209
29851
  var obj = { shape: null };
29210
29852
  parent.notify('selection', { prop: 'getCurrentDrawingShape', value: { obj: obj } });
29211
- if (obj['shape'] !== 'path') {
29853
+ if (obj['shape'] === 'path') {
29854
+ toolbarItems.push({ id: id + '_ok', prefixIcon: 'e-icons e-check', cssClass: 'top-icon e-tick',
29855
+ tooltipText: this.l10n.getConstant('OK'), align: 'Right', tabIndex: 0, disabled: true });
29856
+ }
29857
+ else {
29212
29858
  toolbarItems.push({ id: id + '_ok', prefixIcon: 'e-icons e-check', cssClass: 'top-icon e-tick',
29213
29859
  tooltipText: this.l10n.getConstant('OK'), align: 'Right', tabIndex: 0 });
29214
- toolbarItems.push({ id: id + '_cancel', prefixIcon: 'e-icons e-close', cssClass: 'top-icon e-save',
29215
- tooltipText: this.l10n.getConstant('Cancel'), align: 'Right' });
29216
29860
  }
29861
+ toolbarItems.push({ id: id + '_cancel', prefixIcon: 'e-icons e-close', cssClass: 'top-icon e-save',
29862
+ tooltipText: this.l10n.getConstant('Cancel'), align: 'Right' });
29217
29863
  }
29218
29864
  return toolbarItems;
29219
29865
  };
@@ -29869,6 +30515,14 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
29869
30515
  toolbarItems.push({ id: id + '_italic', prefixIcon: 'e-icons e-italic', cssClass: 'top-icon e-italic',
29870
30516
  tooltipText: this.l10n.getConstant('Italic'), align: 'Center' });
29871
30517
  }
30518
+ if (items.indexOf('underline') > -1) {
30519
+ toolbarItems.push({ id: id + '_underline', prefixIcon: 'e-icons e-underline', cssClass: 'top-icon e-underline',
30520
+ tooltipText: this.l10n.getConstant('Underline'), align: 'Center' });
30521
+ }
30522
+ if (items.indexOf('strikethrough') > -1) {
30523
+ toolbarItems.push({ id: id + '_strikethrough', prefixIcon: 'e-icons e-strikethrough', cssClass: 'top-icon e-strikethrough',
30524
+ tooltipText: this.l10n.getConstant('Strikethrough'), align: 'Center' });
30525
+ }
29872
30526
  if (items.indexOf('strokeWidth') > -1) {
29873
30527
  toolbarItems.push({ id: id + '_strokeWidth', cssClass: 'top-icon e-size', tooltipText: this.l10n.getConstant('TextOutlineWidth'), align: 'Center',
29874
30528
  type: 'Input', template: '<button id="' + id + '_borderWidthBtn"></button>' });
@@ -30351,6 +31005,12 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
30351
31005
  }
30352
31006
  if (Browser.isDevice) {
30353
31007
  this.initMainToolbar(false, true, true);
31008
+ var okBtn = document.getElementById(parent.element.id + '_ok');
31009
+ var drawingObject = { shape: '' };
31010
+ parent.notify('selection', { prop: 'getCurrentDrawingShape', onPropertyChange: false, value: { obj: drawingObject } });
31011
+ if (drawingObject['shape'] === 'path' && okBtn) {
31012
+ okBtn.classList.add('e-overlay');
31013
+ }
30354
31014
  }
30355
31015
  if (parent.activeObj.shape === 'line' || parent.activeObj.shape === 'path') {
30356
31016
  args.toolbarItems = ['strokeColor', 'strokeWidth', 'z-order', 'duplicate', 'remove'];
@@ -30382,7 +31042,7 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
30382
31042
  if (Browser.isDevice) {
30383
31043
  this.initMainToolbar(false, true, true);
30384
31044
  }
30385
- args.toolbarItems = ['fontFamily', 'fontSize', 'fontColor', 'fillColor', 'strokeColor', 'strokeWidth', 'bold', 'italic', 'z-order', 'duplicate', 'remove', 'text'];
31045
+ args.toolbarItems = ['fontFamily', 'fontSize', 'fontColor', 'fillColor', 'strokeColor', 'strokeWidth', 'bold', 'italic', 'underline', 'strikethrough', 'z-order', 'duplicate', 'remove', 'text'];
30386
31046
  this.initTextToolbarItem(args.toolbarItems);
30387
31047
  break;
30388
31048
  case 'pen':
@@ -30518,8 +31178,13 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
30518
31178
  parent.notify('transform', { prop: 'getPanMove', onPropertyChange: false,
30519
31179
  value: { obj: panMoveObj } });
30520
31180
  if (panMoveObj['panMove']) {
31181
+ var currentPannedPoint = extend({}, parent.panPoint.currentPannedPoint, {}, true);
31182
+ parent.panPoint.currentPannedPoint = { x: parent.panPoint.totalPannedClientPoint.x, y: parent.panPoint.totalPannedClientPoint.y };
31183
+ parent.panPoint.totalPannedClientPoint = { x: 0, y: 0 };
31184
+ parent.panPoint.totalPannedInternalPoint = { x: 0, y: 0 };
30521
31185
  parent.notify('transform', { prop: 'drawPannedImage', onPropertyChange: false,
30522
- value: { xDiff: null, yDiff: null } });
31186
+ value: { xDiff: parent.panPoint.currentPannedPoint.x, yDiff: parent.panPoint.currentPannedPoint.y } });
31187
+ parent.panPoint.currentPannedPoint = currentPannedPoint;
30523
31188
  }
30524
31189
  };
30525
31190
  ToolbarModule.prototype.updateKBDNavigation = function (type) {
@@ -32505,60 +33170,10 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
32505
33170
  }
32506
33171
  break;
32507
33172
  case 'bold':
32508
- parent.notify('selection', { prop: 'setInitialTextEdit', value: { bool: false } });
32509
- if (parent.activeObj.textSettings.bold && parent.activeObj.textSettings.italic) {
32510
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32511
- value: { item: 'italic' } });
32512
- }
32513
- else if (parent.activeObj.textSettings.bold && !parent.activeObj.textSettings.italic) {
32514
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32515
- value: { item: 'default' } });
32516
- }
32517
- else if (!parent.activeObj.textSettings.bold && parent.activeObj.textSettings.italic) {
32518
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32519
- value: { item: 'bolditalic' } });
32520
- }
32521
- else if (!parent.activeObj.textSettings.bold && !parent.activeObj.textSettings.italic) {
32522
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32523
- value: { item: 'bold' } });
32524
- }
32525
- if (parent.element.querySelector('#' + id + '_bold').classList.contains('e-selected-btn')) {
32526
- parent.element.querySelector('#' + id + '_bold').classList.remove('e-selected-btn');
32527
- }
32528
- else {
32529
- parent.element.querySelector('#' + id + '_bold').classList.add('e-selected-btn');
32530
- }
32531
- if (parent.activeObj.activePoint.width !== 0 || parent.activeObj.activePoint.height !== 0) {
32532
- parent.notify('undo-redo', { prop: 'updateUndoRedoStack', onPropertyChange: false });
32533
- }
32534
- break;
32535
33173
  case 'italic':
32536
- parent.notify('selection', { prop: 'setInitialTextEdit', value: { bool: false } });
32537
- if (parent.activeObj.textSettings.bold && parent.activeObj.textSettings.italic) {
32538
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32539
- value: { item: 'bold' } });
32540
- }
32541
- else if (parent.activeObj.textSettings.bold && !parent.activeObj.textSettings.italic) {
32542
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32543
- value: { item: 'bolditalic' } });
32544
- }
32545
- else if (!parent.activeObj.textSettings.bold && parent.activeObj.textSettings.italic) {
32546
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32547
- value: { item: 'default' } });
32548
- }
32549
- else if (!parent.activeObj.textSettings.bold && !parent.activeObj.textSettings.italic) {
32550
- parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false,
32551
- value: { item: 'italic' } });
32552
- }
32553
- if (parent.element.querySelector('#' + id + '_italic').classList.contains('e-selected-btn')) {
32554
- parent.element.querySelector('#' + id + '_italic').classList.remove('e-selected-btn');
32555
- }
32556
- else {
32557
- parent.element.querySelector('#' + id + '_italic').classList.add('e-selected-btn');
32558
- }
32559
- if (parent.activeObj.activePoint.width !== 0 || parent.activeObj.activePoint.height !== 0) {
32560
- parent.notify('undo-redo', { prop: 'updateUndoRedoStack', onPropertyChange: false });
32561
- }
33174
+ case 'underline':
33175
+ case 'strikethrough':
33176
+ this.toggleStyle(id, type);
32562
33177
  break;
32563
33178
  case 'croptransform':
32564
33179
  this.performCropTransformClick();
@@ -32739,6 +33354,43 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
32739
33354
  }
32740
33355
  }
32741
33356
  };
33357
+ ToolbarModule.prototype.getFontStyle = function (settings) {
33358
+ var parts = [];
33359
+ if (settings.bold) {
33360
+ parts.push('bold');
33361
+ }
33362
+ if (settings.italic) {
33363
+ parts.push('italic');
33364
+ }
33365
+ if (settings.underline) {
33366
+ parts.push('underline');
33367
+ }
33368
+ if (settings.strikethrough) {
33369
+ parts.push('strikethrough');
33370
+ }
33371
+ return parts.length === 0 ? 'default' : parts.join('');
33372
+ };
33373
+ ToolbarModule.prototype.toggleStyle = function (id, style) {
33374
+ var parent = this.parent;
33375
+ parent.notify('selection', { prop: 'setInitialTextEdit', value: { bool: false } });
33376
+ var settings = parent.activeObj.textSettings;
33377
+ settings[style] = !settings[style];
33378
+ var fontStyle = this.getFontStyle(settings);
33379
+ parent.notify('shape', { prop: 'applyFontStyle', onPropertyChange: false, value: { item: fontStyle } });
33380
+ var button = parent.element.querySelector("#" + id + "_" + style);
33381
+ if (button) {
33382
+ if (button.classList.contains('e-selected-btn')) {
33383
+ button.classList.remove('e-selected-btn');
33384
+ }
33385
+ else {
33386
+ button.classList.add('e-selected-btn');
33387
+ }
33388
+ }
33389
+ if (parent.activeObj.activePoint.width !== 0 ||
33390
+ parent.activeObj.activePoint.height !== 0) {
33391
+ parent.notify('undo-redo', { prop: 'updateUndoRedoStack', onPropertyChange: false });
33392
+ }
33393
+ };
32742
33394
  ToolbarModule.prototype.updateRedactType = function (value) {
32743
33395
  var parent = this.parent;
32744
33396
  parent.activeObj.redactType = value;
@@ -32757,7 +33409,7 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
32757
33409
  if (parent.currObjType.isFiltered || parent.currObjType.isRedact) {
32758
33410
  parent.okBtn();
32759
33411
  }
32760
- if (frame && !frame.classList.contains('e-overlay')) {
33412
+ if (!frame || !frame.classList.contains('e-overlay')) {
32761
33413
  zoom = parent.transform.zoomFactor;
32762
33414
  parent.frameDestPoints = extend({}, parent.img, {}, true);
32763
33415
  if (isNullOrUndefined(parent.cxtTbarHeight)) {
@@ -32766,7 +33418,10 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
32766
33418
  this.callFrameToolbar();
32767
33419
  parent.frameObj.type = 'mat';
32768
33420
  this.callFrameToolbar();
32769
- parent.cxtTbarHeight = parent.element.querySelector('#' + id + '_customizeWrapper').scrollHeight;
33421
+ var elem = parent.element.querySelector('#' + id + '_customizeWrapper');
33422
+ if (elem) {
33423
+ parent.cxtTbarHeight = elem.scrollHeight;
33424
+ }
32770
33425
  parent.frameObj = frameObj;
32771
33426
  parent.tempFrameObj = tempFrameObj;
32772
33427
  }
@@ -33332,6 +33987,8 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
33332
33987
  var fontSizeElem = parent.element.querySelector('.e-text-font-size');
33333
33988
  var boldBtn = parent.element.querySelector('#' + id + '_bold');
33334
33989
  var italicBtn = parent.element.querySelector('#' + id + '_italic');
33990
+ var underlineBtn = parent.element.querySelector('#' + id + '_underline');
33991
+ var strikethroughBtn = parent.element.querySelector('#' + id + '_strikethrough');
33335
33992
  if (parent.activeObj.strokeSettings && parent.activeObj.textSettings) {
33336
33993
  if (isNullOrUndefined(parent.activeObj.strokeSettings.strokeWidth)) {
33337
33994
  parent.activeObj.strokeSettings.strokeWidth = 2;
@@ -33444,6 +34101,22 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
33444
34101
  italicBtn.classList.remove('e-selected-btn');
33445
34102
  }
33446
34103
  }
34104
+ if (underlineBtn) {
34105
+ if (parent.activeObj.textSettings.underline) {
34106
+ underlineBtn.classList.add('e-selected-btn');
34107
+ }
34108
+ else {
34109
+ underlineBtn.classList.remove('e-selected-btn');
34110
+ }
34111
+ }
34112
+ if (strikethroughBtn) {
34113
+ if (parent.activeObj.textSettings.strikethrough) {
34114
+ strikethroughBtn.classList.add('e-selected-btn');
34115
+ }
34116
+ else {
34117
+ strikethroughBtn.classList.remove('e-selected-btn');
34118
+ }
34119
+ }
33447
34120
  if (strokeWidthElem) {
33448
34121
  var width = parent.activeObj.shape === 'text' ? parent.activeObj.strokeSettings.outlineWidth : parent.activeObj.strokeSettings.strokeWidth;
33449
34122
  var strokeWidth = Math.round(width).toString();
@@ -33459,25 +34132,23 @@ var ToolbarModule = /** @__PURE__ @class */ (function () {
33459
34132
  ToolbarModule.prototype.getStrokeWidth = function (text) {
33460
34133
  var strokeWidth;
33461
34134
  var currentWidth = parseInt(text, 10) / 2;
33462
- switch (currentWidth) {
33463
- case 0:
33464
- strokeWidth = this.l10n.getConstant('NoOutline');
33465
- break;
33466
- case 1:
33467
- strokeWidth = this.l10n.getConstant('XSmall');
33468
- break;
33469
- case 2:
33470
- strokeWidth = this.l10n.getConstant('Small');
33471
- break;
33472
- case 3:
33473
- strokeWidth = this.l10n.getConstant('Medium');
33474
- break;
33475
- case 4:
33476
- strokeWidth = this.l10n.getConstant('Large');
33477
- break;
33478
- case 5:
33479
- strokeWidth = this.l10n.getConstant('XLarge');
33480
- break;
34135
+ if (currentWidth === 0) {
34136
+ strokeWidth = this.l10n.getConstant('NoOutline');
34137
+ }
34138
+ else if (currentWidth > 0 && currentWidth <= 1) {
34139
+ strokeWidth = this.l10n.getConstant('XSmall');
34140
+ }
34141
+ else if (currentWidth > 1 && currentWidth <= 2) {
34142
+ strokeWidth = this.l10n.getConstant('Small');
34143
+ }
34144
+ else if (currentWidth > 2 && currentWidth <= 3) {
34145
+ strokeWidth = this.l10n.getConstant('Medium');
34146
+ }
34147
+ else if (currentWidth > 3 && currentWidth <= 4) {
34148
+ strokeWidth = this.l10n.getConstant('Large');
34149
+ }
34150
+ else {
34151
+ strokeWidth = this.l10n.getConstant('XLarge');
33481
34152
  }
33482
34153
  return strokeWidth;
33483
34154
  };