all files / action/ freehand-draw.js

92.34% Statements 820/888
73.46% Branches 238/324
97.87% Functions 46/47
92.34% Lines 820/888
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221   324× 324× 324× 324× 324× 324× 324× 324× 324× 324× 324× 324× 324× 324× 324×   616× 308×   308×   324× 324×   308× 308×   77486× 77486×                 669× 669×                 56× 56×   498× 498×   250× 250×   23× 23×   3086× 1783×     1303×   3086×   6699× 6699×   5159× 5159×   61× 61×       38517× 38517×   16732× 16732×   242× 242×   15× 15×     16× 16×   755× 755×   725× 725×   37× 37×   15× 15×   136× 136×   2207× 2207×           45× 45×     116× 116×   19× 19×   347× 347×   71× 71× 71×   71×   345× 345× 345× 345×   59× 59×   431× 431×   21× 21×     47× 47×     77486× 77486× 77486×   77486× 77486×     431× 431× 431× 431× 431× 431× 431× 431× 431× 431× 431× 431× 431× 431× 431× 431× 431×   6550×   10× 10× 10× 10× 10×         10× 10× 10× 10× 10× 10× 10× 10× 10× 10× 10× 10×   10×       10× 30× 30× 30× 30× 10×     20×   30× 30×     10× 10× 10× 10× 10× 10× 10× 10× 10× 10×                                                                                                                                                                         1524×     1524×     1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524× 1524×         3050× 3050× 3050×   797× 797× 797× 797× 797× 797× 797×   797×     795×   797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572× 11572×   797× 797×   797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 797× 8767× 8767× 8767× 8767× 7970× 7970× 7970×   8767× 8767×   797×   17534×     11572× 11572×     3303× 3303×     4184× 4184× 4184× 4184× 16×     16× 16×   4184× 277× 277× 277× 277× 277× 277× 277× 277× 277× 277× 277× 277× 277×   277× 33× 33×   277× 732× 732× 732× 732× 244×     488×   732× 732×     277×   277× 267× 267×     4184×   18× 18× 18× 18× 18× 18× 108× 18× 18× 18× 18×     90× 90× 90× 90×     18× 18× 18× 18× 18× 18× 18×   18×   5159× 5159×         5159×                                                               1515×   1515×   6699× 6699×   6699× 6699× 135× 135× 135× 135× 730× 730× 730×     6699× 6699× 83× 83×   6699× 124×   6699× 6699× 6699× 6699× 6699× 3485×     7507× 7507× 173× 173× 173× 173× 173× 702× 702× 702×         498× 498× 498× 15× 15× 15× 15× 90× 90× 90× 90× 90×     498× 15× 15× 15× 15× 15× 90× 90× 90× 90× 90×       498×   250× 250× 157×   93× 89×             161× 161× 161× 11× 11× 11× 11× 11× 66× 66× 24×   42× 42×   66× 66×   11×     161× 11× 11× 10× 10× 10× 10× 60× 60× 24×   36× 36×   60× 60×         161×   93× 93× 93× 42× 42× 18×   24× 24×   42× 42×       93× 30× 30× 18×   12× 12×   30× 30×         93×   3086× 3086×   3086× 3086× 3086× 673× 673× 54×   619× 41× 41× 41× 41×   673×           673× 41× 123×   123×       673×   3086×   3086× 58× 58× 58× 58× 318× 318× 318×     3086× 58× 58× 58× 58× 58× 348× 348× 348×       3086×       3086× 3086× 3086× 3086× 3086×     23× 23× 23× 23× 23× 23× 123× 123× 123×         123× 123×             23× 23× 23× 23× 23× 23× 60× 60× 60×         60× 60×               23×                   23×   61× 61× 34× 34× 34× 34× 34× 34× 34×           34× 12×   34×     31×         27× 27× 27× 27× 27× 27× 27×     20× 20× 19×   19× 19×     20×   20×   136× 136× 136× 11× 11× 11× 11× 11× 11× 66× 66× 66×         31× 31× 31× 31×   30× 30×                   30× 30×       30×   30×       19× 19×   19× 19× 19× 19×   11×       11× 11×   19× 19× 19× 19×        
define(["require", "exports", "@syncfusion/ej2-base", "../index"], function (require, exports, ej2_base_1, index_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var FreehandDrawing = (function () {
        function FreehandDrawing(parent) {
            this.fhdObj = { lastWidth: 0, lastVelocity: 0, time: 0, pointX: 0, pointY: 0 };
            this.isFreehandDrawing = false;
            this.freehandDownPoint = { x: 0, y: 0 };
            this.isFreehandPointMoved = false;
            this.pointCounter = 0;
            this.selPointColl = {};
            this.currFHDIdx = 0;
            this.selPoints = [];
            this.dummyPoints = [];
            this.tempFHDStyles = { strokeColor: null, fillColor: null, strokeWidth: null };
            this.straightenPoint = { x: null, y: null, ratioX: null, ratioY: null };
            this.straightenPointAngle = 0;
            this.isMasking = false;
            this.parent = parent;
            this.addEventListener();
        }
        FreehandDrawing.prototype.destroy = function () {
            if (this.parent.isDestroyed) {
                return;
            }
            this.removeEventListener();
        };
        FreehandDrawing.prototype.addEventListener = function () {
            this.parent.on('freehand-draw', this.draw, this);
            this.parent.on('destroyed', this.destroy, this);
        };
        FreehandDrawing.prototype.removeEventListener = function () {
            this.parent.off('freehand-draw', this.draw);
            this.parent.off('destroyed', this.destroy);
        };
        FreehandDrawing.prototype.draw = function (args) {
            this.updateFhdPvtVar();
            switch (args.prop) {
                case 'hoverFhd': {
                    this.hoverFhd(args.value['strokeColor'], args.value['strokeWidth']);
                    break;
                }
                case 'freehandDownHandler':
                    this.freehandDownHandler(args.value['e'], args.value['canvas']);
                    break;
                case 'freehandUpHandler':
                    this.freehandUpHandler(args.value['e'], args.value['canvas'], args.value['context']);
                    break;
                case 'handle-freehand-draw': {
                    var id = parseInt(args.value['id'].split('_')[1], 10) - 1;
                    Eif (this.isFHDIdx(id)) {
                        this.deleteFhd(id, true);
                    }
                    break;
                }
                case 'freehandRedraw':
                    this.freehandRedraw(args.value['context'], args.value['points']);
                    break;
                case 'deleteFhd': {
                    var id = parseInt(args.value['id'].split('_')[1], 10) - 1;
                    this.deleteFhd(id, true);
                    break;
                }
                case 'selectFhd': {
                    var id = null;
                    Eif (args.value['id']) {
                        id = parseInt(args.value['id'].split('_')[1], 10) - 1;
                    }
                    this.selectFhd(id);
                    break;
                }
                case 'applyFhd':
                    this.applyFhd();
                    break;
                case 'cancelFhd':
                    this.cancelFhd();
                    break;
                case 'updateFHDCurPts':
                    this.updateFHDCurPts();
                    break;
                case 'rotateFhdColl':
                    this.rotateFhdColl();
                    break;
                case 'flipFHDColl':
                    this.flipFHDColl(args.value['value']);
                    break;
                case 'panFHDColl':
                    this.panFHDColl(args.value['xDiff'], args.value['yDiff'], args.value['panRegion']);
                    break;
                case 'updateFHDColl':
                    if (args.value && args.value['isPreventApply']) {
                        this.updateFHDColl(args.value['isPreventApply']);
                    }
                    else {
                        this.updateFHDColl();
                    }
                    break;
                case 'zoomFHDColl':
                    this.zoomFHDColl(args.value['isPreventApply']);
                    break;
                case 'apply-pen-draw':
                    this.applyPenDraw();
                    break;
                case 'freeHandDraw':
                    this.freeHandDraw(args.value['value']);
                    break;
                case 'isFHDIdx':
                    this.isFHDIdx(args.value['index'], args.value['obj']);
                    break;
                case 'getSqPtFD':
                    this.getSqPtFD(args.value['idx'], args.value['obj']);
                    break;
                case 'getSelPointColl':
                    args.value['obj']['selPointColl'] = ej2_base_1.extend([], this.selPointColl);
                    break;
                case 'setSelPointColl':
                    this.selPointColl = ej2_base_1.extend([], args.value['obj']['selPointColl']);
                    break;
                case 'pushSelPointColl':
                    this.selPointColl.push(ej2_base_1.extend([], args.value['obj']['selPointColl']));
                    break;
                case 'setFreehandDrawHoveredIndex':
                    this.fhdHovIdx = args.value['index'];
                    break;
                case 'getFreehandDrawHoveredIndex':
                    args.value['obj']['index'] = this.fhdHovIdx;
                    break;
                case 'setPointCounter':
                    this.pointCounter = args.value['value'];
                    break;
                case 'getPenStrokeWidth':
                    args.value['obj']['penStrokeWidth'] = this.penStrokeWidth;
                    break;
                case 'setPenStrokeWidth':
                    this.penStrokeWidth = args.value['value'];
                    break;
                case 'getCurrentFreehandDrawIndex':
                    args.value['obj']['currentFreehandDrawIndex'] = this.currFHDIdx;
                    break;
                case 'setCurrentFreehandDrawIndex':
                    this.currFHDIdx = args.value['value'];
                    break;
                case 'updateCropPtsForSel':
                    this.updateCropPtsForSel();
                    break;
                case 'getFreehandDrawSelectedId':
                    args.value['obj']['freehandDrawSelectedId'] = this.fhdSelID;
                    break;
                case 'resetFreehandDrawSelectedId':
                    this.fhdSelID = null;
                    break;
                case 'getFHDSelected':
                    args.value['obj']['isSelected'] = (this.parent.pointColl[this.fhdSelIdx] && this.parent.pointColl[this.fhdSelIdx].isSelected) ? this.parent.pointColl[this.fhdSelIdx].isSelected : false;
                    break;
                case 'resetFHDIdx':
                    this.fhdHovIdx = this.fhdSelID = this.fhdSelIdx = null;
                    break;
                case 'getHighestOrder':
                    this.getHighestOrder();
                    break;
                case 'getTempFreeHandDrawEditingStyles':
                    args.value['obj']['tempFreeHandDrawEditingStyles'] = this.tempFHDStyles;
                    break;
                case 'setFreehandSelectedIndex':
                    this.fhdSelIdx = args.value['index'];
                    break;
                case 'getFreehandSelectedIndex':
                    args.value['obj']['freehandSelectedIndex'] = this.fhdSelIdx;
                    break;
                case 'setCenterSelPoints':
                    this.setCenterSelPoints();
                    break;
                case 'getStraightenPoint':
                    args.value['obj']['straightenPoint'] = ej2_base_1.extend({}, this.straightenPoint, {}, true);
                    break;
                case 'setStraightenPoint':
                    this.straightenPoint.x = args.value['x'];
                    this.straightenPoint.y = args.value['y'];
                    if (args.value['ratioX'] && args.value['ratioY']) {
                        this.straightenPoint.ratioX = args.value['ratioX'];
                        this.straightenPoint.ratioY = args.value['ratioY'];
                    }
                    break;
                case 'resetStraightenPoint':
                    this.straightenPoint = { x: null, y: null, ratioX: null, ratioY: null };
                    this.prevStraightenObj = null;
                    this.straightenPointAngle = 0;
                    break;
                case 'getStraightenPointAngle':
                    args.value['obj']['angle'] = this.straightenPointAngle;
                    break;
                case 'reset':
                    this.reset();
                    break;
                case 'triggerShapeChanging':
                    this.triggerShapeChanging(args.value['shapeChangingArgs']);
                    break;
                case 'setMasking':
                    this.isMasking = args.value['value'];
                    break;
                case 'resetSelPoints':
                    this.selPoints = [];
                    break;
            }
        };
        FreehandDrawing.prototype.updateFhdPvtVar = function () {
            var parent = this.parent;
            Eif (parent.lowerCanvas) {
                this.lowerContext = parent.lowerCanvas.getContext('2d');
            }
            Eif (parent.upperCanvas) {
                this.upperContext = parent.upperCanvas.getContext('2d');
            }
        };
        FreehandDrawing.prototype.reset = function () {
            this.fhdObj = { lastWidth: 0, lastVelocity: 0, time: 0, pointX: 0, pointY: 0 };
            this.isFreehandDrawing = this.isFreehandPointMoved = false;
            this.selPoints = [];
            this.dummyPoints = [];
            this.freehandDownPoint = { x: 0, y: 0 };
            this.selPointColl = {};
            this.straightenPointAngle = 0;
            this.fhdHovIdx = null;
            this.pointCounter = 0;
            this.fhdSelID = null;
            this.isMasking = false;
            this.penStrokeWidth = undefined;
            this.currFHDIdx = 0;
            this.fhdSelIdx = null;
            this.tempFHDStyles = { strokeColor: null, fillColor: null, strokeWidth: null };
            this.straightenPoint = { x: null, y: null, ratioX: null, ratioY: null };
            this.prevStraightenObj = null;
        };
        FreehandDrawing.prototype.getModuleName = function () {
            return 'freehand-draw';
        };
        FreehandDrawing.prototype.hoverFhd = function (fillStyle, strokeWidth) {
            var parent = this.parent;
            var context = this.upperContext;
            var idx = -1;
            Eif (this.fhdHovIdx > -1) {
                idx = this.fhdHovIdx;
            }
            else {
                idx = this.fhdSelIdx;
            }
            parent.points = ej2_base_1.extend([], parent.pointColl[idx].points);
            this.pointCounter = 0;
            var len = parent.points.length;
            var controlPoint1;
            var controlPoint2;
            var startPoint;
            var endPoint;
            var minStrokeWidth = 0;
            var maxStrokeWidth = 0;
            context.fillStyle = fillStyle ? fillStyle : parent.pointColl[idx].strokeColor;
            context.strokeStyle = context.fillStyle;
            minStrokeWidth = maxStrokeWidth = this.penStrokeWidth = strokeWidth ?
                strokeWidth : parent.pointColl[idx].strokeWidth;
            Iif (len === 1) {
                controlPoint1 = controlPoint2 = startPoint = endPoint = parent.points[0];
                this.startDraw(context, controlPoint1, controlPoint2, startPoint, endPoint, minStrokeWidth, maxStrokeWidth);
            }
            for (var l = 0; l < len - 3; l++) {
                Eif (parent.points[l + 1] && parent.points[l + 2] && parent.points[l + 2]) {
                    controlPoint1 = (this.calcCurveCP(parent.points[l + 0], parent.points[l + 1], parent.points[l + 2])).controlPoint2;
                    controlPoint2 = (this.calcCurveCP(parent.points[l + 1], parent.points[l + 2], parent.points[l + 3])).controlPoint1;
                    if (l === 0) {
                        startPoint = parent.points[l];
                    }
                    else {
                        startPoint = parent.points[l + 1];
                    }
                    endPoint = parent.points[l + 2];
                    this.startDraw(context, controlPoint1, controlPoint2, startPoint, endPoint, minStrokeWidth, maxStrokeWidth);
                }
            }
            context.closePath();
            var point = this.getSqPtFD(idx);
            var tempLineWidth = context.lineWidth;
            context.lineWidth = 2;
            context.strokeStyle = parent.themeColl[parent.theme]['primaryColor'];
            context.beginPath();
            context.rect(point.startX, point.startY, point.width, point.height);
            context.stroke();
            context.closePath();
            context.lineWidth = tempLineWidth;
        };
        FreehandDrawing.prototype.freehandDownHandler = function (e, canvas) {
            var parent = this.parent;
            parent.lowerCanvas = document.querySelector('#' + parent.element.id + '_lowerCanvas');
            this.lowerContext = parent.lowerCanvas.getContext('2d');
            parent.upperCanvas = document.querySelector('#' + parent.element.id + '_upperCanvas');
            this.upperContext = parent.upperCanvas.getContext('2d');
            this.fhdObj.time = new Date().getTime();
            this.isFreehandDrawing = true;
            Eif (e.type === 'mousedown') {
                this.freehandDownPoint = { x: e.clientX, y: e.clientY };
            }
            else {
                this.freehandDownPoint = { x: e.touches[0].clientX, y: e.touches[0].clientY };
            }
            this.isFreehandPointMoved = false;
            ej2_base_1.EventHandler.add(canvas, 'mousemove touchmove', this.freehandMoveHandler, this);
            var shapeSettings = { id: 'pen_' + (this.currFHDIdx + 1), type: index_1.ShapeType.FreehandDraw,
                startX: this.freehandDownPoint.x, startY: this.freehandDownPoint.y,
                strokeColor: parent.activeObj.strokeSettings.strokeColor, strokeWidth: this.penStrokeWidth,
                points: null, index: parent.objColl.length + parent.freehandCounter + 1 };
            var shapeChangingArgs = { cancel: false, action: 'draw-start', previousShapeSettings: shapeSettings,
                currentShapeSettings: shapeSettings };
            this.triggerShapeChanging(shapeChangingArgs);
        };
        FreehandDrawing.prototype.freehandUpHandler = function (e, canvas, context) {
            var rect = canvas.getBoundingClientRect();
            var parent = this.parent;
            ej2_base_1.EventHandler.remove(canvas, 'mousemove touchmove', this.freehandMoveHandler);
            Eif (parent.points.length === 0) {
                Eif (e.type === 'mouseup') {
                    this.processPoint(e.clientX - rect.left, e.clientY - rect.top, true, context);
                }
                else if (e.type === 'touchend' && e.changedTouches) {
                    this.processPoint(e.changedTouches[0].clientX - rect.left, e.changedTouches[0].clientY - rect.top, true, context);
                }
                else {
                    if (!this.isFreehandPointMoved) {
                        this.processPoint(this.freehandDownPoint.x - rect.left, this.freehandDownPoint.y - rect.top, true, context);
                    }
                }
            }
            context.closePath();
            var prevCropObj = ej2_base_1.extend({}, parent.cropObj, {}, true);
            var object = { currObj: {} };
            parent.notify('filter', { prop: 'getCurrentObj', onPropertyChange: false, value: { object: object } });
            var prevObj = object['currObj'];
            prevObj.objColl = ej2_base_1.extend([], parent.objColl, [], true);
            prevObj.pointColl = ej2_base_1.extend([], parent.pointColl, [], true);
            prevObj.afterCropActions = ej2_base_1.extend([], parent.afterCropActions, [], true);
            var selPointCollObj = { selPointColl: null };
            parent.notify('freehand-draw', { prop: 'getSelPointColl', onPropertyChange: false, value: { obj: selPointCollObj } });
            prevObj.selPointColl = ej2_base_1.extend([], selPointCollObj['selPointColl'], [], true);
            var fhCnt = parent.freehandCounter;
            var penIndex = this.getHighestOrder();
            var order = parent.objColl.length + penIndex + 1;
            parent.pointColl[fhCnt] = { points: ej2_base_1.extend([], parent.points), strokeColor: parent.activeObj.strokeSettings.strokeColor,
                strokeWidth: this.penStrokeWidth, flipState: parent.transform.currFlipState,
                id: 'pen_' + (penIndex + 1), order: order };
            parent.points = [];
            this.dummyPoints = [];
            this.selPointColl[fhCnt] = { points: ej2_base_1.extend([], this.selPoints) };
            this.selPoints = [];
            this.pointCounter = 0;
            parent.freehandCounter++;
            this.isFreehandDrawing = false;
            if (!parent.isMaskImage) {
                parent.notify('undo-redo', { prop: 'updateUndoRedoColl', onPropertyChange: false,
                    value: { operation: 'freehand-draw', previousObj: prevObj, previousObjColl: prevObj.objColl,
                        previousPointColl: prevObj.pointColl, previousSelPointColl: prevObj.selPointColl,
                        previousCropObj: prevCropObj, previousText: null,
                        currentText: null, previousFilter: null, isCircleCrop: null } });
            }
            var shapeSettings = { id: 'pen_' + (penIndex + 1), type: index_1.ShapeType.FreehandDraw,
                startX: this.freehandDownPoint.x, startY: this.freehandDownPoint.y,
                strokeColor: parent.activeObj.strokeSettings.strokeColor, strokeWidth: this.penStrokeWidth,
                points: parent.pointColl[this.currFHDIdx].points, index: order };
            var shapeChangingArgs = { cancel: false, action: 'draw-end', previousShapeSettings: shapeSettings,
                currentShapeSettings: shapeSettings };
            this.triggerShapeChanging(shapeChangingArgs);
            this.currFHDIdx++;
        };
        FreehandDrawing.prototype.getHighestOrder = function () {
            var parent = this.parent;
            var index = 0;
            for (var i = 0; i < parent.pointColl.length; i++) {
                var value = parseInt(parent.pointColl[i].id.split('_')[1], 10);
                Eif (index < value) {
                    index = value;
                }
            }
            return index;
        };
        FreehandDrawing.prototype.freehandMoveHandler = function (e) {
            this.isFreehandPointMoved = true;
            var rect = this.parent.upperCanvas.getBoundingClientRect();
            var x;
            var y;
            if (e.type === 'mousemove') {
                x = e.clientX - rect.left;
                y = e.clientY - rect.top;
            }
            else {
                x = e.touches[0].clientX - rect.left;
                y = e.touches[0].clientY - rect.top;
            }
            if (this.isFreehandDrawing) {
                this.upperContext.fillStyle = this.parent.activeObj.strokeSettings.strokeColor;
                if (this.parent.isMaskImage) {
                    this.upperContext.globalCompositeOperation = 'xor';
                }
                this.processPoint(x, y, false, this.upperContext);
            }
        };
        FreehandDrawing.prototype.processPoint = function (x, y, mouseDown, context) {
            var parent = this.parent;
            var lastPoint = this.point(x, y, new Date().getTime());
            lastPoint = parent.points.length > 0 && parent.points[parent.points.length - 1];
            var isLastPointTooClose = lastPoint ? this.distanceTo(lastPoint) <= 5 : false;
            var controlPoint1;
            var controlPoint2;
            var startPoint;
            var endPoint;
            this.selPoints.push({ x: x, y: y, ratioX: (x - parent.img.destLeft) / parent.img.destWidth,
                ratioY: (y - parent.img.destTop) / parent.img.destHeight, time: this.fhdObj.time });
            Eif (!lastPoint || !(lastPoint && isLastPointTooClose) || mouseDown) {
                this.fhdObj.time = new Date().getTime();
                parent.points.push({ x: x, y: y, ratioX: (x - parent.img.destLeft) / parent.img.destWidth,
                    ratioY: (y - parent.img.destTop) / parent.img.destHeight,
                    time: this.fhdObj.time });
                this.dummyPoints.push({ x: x, y: y, ratioX: (x - parent.img.destLeft) / parent.img.destWidth,
                    ratioY: (y - parent.img.destTop) / parent.img.destHeight,
                    time: this.fhdObj.time });
                Iif (this.dummyPoints.length > 2) {
                    if (this.dummyPoints.length === 3) {
                        this.dummyPoints.unshift(this.dummyPoints[0]);
                    }
                    var p0 = this.dummyPoints[0];
                    var p1 = this.dummyPoints[1];
                    var p2 = this.dummyPoints[2];
                    var p3 = this.dummyPoints[3];
                    controlPoint1 = this.calcCurveCP(p0, p1, p2).controlPoint2;
                    controlPoint2 = this.calcCurveCP(p1, p2, p3).controlPoint1;
                    startPoint = this.dummyPoints[1];
                    endPoint = this.dummyPoints[2];
                    var minStrokeWidth = 0.5;
                    var maxStrokeWidth = 5;
                    if (!ej2_base_1.isNullOrUndefined(this.penStrokeWidth)) {
                        minStrokeWidth = maxStrokeWidth = this.penStrokeWidth;
                    }
                    this.startDraw(context, controlPoint1, controlPoint2, startPoint, endPoint, minStrokeWidth, maxStrokeWidth);
                    this.pointCounter++;
                    this.dummyPoints.shift();
                }
                Eif (mouseDown) {
                    controlPoint1 = controlPoint2 = startPoint = endPoint = { x: x, y: y, time: new Date().getTime() };
                    var minStrokeWidth = 0.5;
                    var maxStrokeWidth = 5;
                    Eif (!ej2_base_1.isNullOrUndefined(this.penStrokeWidth)) {
                        minStrokeWidth = maxStrokeWidth = this.penStrokeWidth;
                    }
                    this.startDraw(context, controlPoint1, controlPoint2, startPoint, endPoint, minStrokeWidth, maxStrokeWidth);
                }
            }
        };
        FreehandDrawing.prototype.calcCurveCP = function (p1, p2, p3) {
            Iif (!p2) {
                p2 = p1;
            }
            Iif (!p3) {
                p3 = p2;
            }
            var dx1 = p1.x - p2.x;
            var dy1 = p1.y - p2.y;
            var dx2 = p2.x - p3.x;
            var dy2 = p2.y - p3.y;
            var m1 = { x: (p1.x + p2.x) / 2.0, y: (p1.y + p2.y) / 2.0 };
            var m2 = { x: (p2.x + p3.x) / 2.0, y: (p2.y + p3.y) / 2.0 };
            var l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
            var l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
            var dxm = (m1.x - m2.x);
            var dym = (m1.y - m2.y);
            var k = l2 / (l1 + l2);
            var cm = { x: m2.x + dxm * k, y: m2.y + dym * k };
            var tx = p2.x - cm.x;
            var ty = p2.y - cm.y;
            return {
                controlPoint1: this.point(m1.x + tx, m1.y + ty, 0),
                controlPoint2: this.point(m2.x + tx, m2.y + ty, 0)
            };
        };
        FreehandDrawing.prototype.point = function (x, y, time) {
            this.fhdObj.pointX = x;
            this.fhdObj.pointY = y;
            return { x: this.fhdObj.pointX, y: this.fhdObj.pointY, time: time };
        };
        FreehandDrawing.prototype.startDraw = function (context, controlPoint1, controlPoint2, startPoint, endPoint, minStrokeWidth, maxStrokeWidth) {
            var tempVelocity;
            tempVelocity = this.pointVelocity(startPoint);
            tempVelocity = 0.7 * tempVelocity + (1 - 0.7) * this.fhdObj.lastVelocity;
            var newWidth = Math.max(maxStrokeWidth / (0.7 + 1), minStrokeWidth);
            this.drawCurve(this.fhdObj.time, newWidth, context, controlPoint1, controlPoint2, startPoint, endPoint, maxStrokeWidth);
            this.fhdObj.lastVelocity = tempVelocity;
            this.fhdObj.time = newWidth;
        };
        FreehandDrawing.prototype.pointVelocity = function (startPoint) {
            return (this.fhdObj.time !== startPoint.time) ? this.distanceTo(startPoint) /
                (this.fhdObj.time - startPoint.time) : 0;
        };
        FreehandDrawing.prototype.distanceTo = function (start) {
            return Math.sqrt(Math.pow(this.fhdObj.pointX - start.x, 2) + Math.pow(this.fhdObj.pointY - start.y, 2));
        };
        FreehandDrawing.prototype.drawCurve = function (startWidth, endWidth, context, controlPoint1, controlPoint2, startPoint, endPoint, maxStrokeWidth) {
            var width;
            var i;
            var t1;
            var t2;
            var t3;
            var u1;
            var u2;
            var u3;
            var x;
            var y;
            var widthValue = endWidth - startWidth;
            var bezierLength = this.bezierLength(controlPoint1, controlPoint2, startPoint, endPoint);
            var drawSteps = Math.ceil(bezierLength) * 2;
            context.beginPath();
            for (i = 0; i < drawSteps; i++) {
                t1 = i / drawSteps;
                t2 = t1 * t1;
                t3 = t2 * t1;
                u1 = 1 - t1;
                u2 = u1 * u1;
                u3 = u2 * u1;
                x = u3 * startPoint.x;
                x += 3 * u2 * t1 * controlPoint1.x;
                x += 3 * u1 * t2 * controlPoint2.x;
                x += t3 * endPoint.x;
                y = u3 * startPoint.y;
                y += 3 * u2 * t1 * controlPoint1.y;
                y += 3 * u1 * t2 * controlPoint2.y;
                y += t3 * endPoint.y;
                width = Math.min(startWidth + t3 * widthValue, maxStrokeWidth);
                this.drawArc(x, y, width, context);
            }
            context.closePath();
            context.fill();
        };
        FreehandDrawing.prototype.bezierLength = function (controlPoint1, controlPoint2, startPoint, endPoint) {
            var steps = 10;
            var length = 0;
            var i;
            var t;
            var pointX1;
            var pointY1;
            var pointX2;
            var pointY2;
            var pointX3;
            var pointY3;
            for (i = 0; i <= steps; i++) {
                t = i / steps;
                pointX1 = this.bezierPoint(t, startPoint.x, controlPoint1.x, controlPoint2.x, endPoint.x);
                pointY1 = this.bezierPoint(t, startPoint.y, controlPoint1.y, controlPoint2.y, endPoint.y);
                if (i > 0) {
                    pointX3 = pointX1 - pointX2;
                    pointY3 = pointY1 - pointY2;
                    length += Math.sqrt(pointX3 * pointX3 + pointY3 * pointY3);
                }
                pointX2 = pointX1;
                pointY2 = pointY1;
            }
            return length;
        };
        FreehandDrawing.prototype.bezierPoint = function (t, startPoint, cp1, cp2, endPoint) {
            return startPoint * (1.0 - t) * (1.0 - t) * (1.0 - t) + 3.0 * cp1 * (1.0 - t) * (1.0 - t) * t + 3.0 *
                cp2 * (1.0 - t) * t * t + endPoint * t * t * t;
        };
        FreehandDrawing.prototype.drawArc = function (x, y, size, context) {
            var img = this.parent.img;
            if ((x > img.destLeft && y > img.destTop && x < (img.destLeft + img.destWidth) &&
                y < (img.destTop + img.destHeight) ||
                (context !== this.lowerContext && context !== this.upperContext))) {
                context.moveTo(x, y);
                context.arc(x, y, size, 0, 2 * Math.PI, false);
            }
        };
        FreehandDrawing.prototype.freehandRedraw = function (context, points) {
            var parent = this.parent;
            var temp = context.filter;
            context.filter = 'none';
            if (points) {
                parent.pointColl[parent.freehandCounter] = { points: points, strokeColor: parent.activeObj.strokeSettings.strokeColor,
                    strokeWidth: this.penStrokeWidth, flipState: parent.transform.currFlipState,
                    id: 'pen_' + (parent.freehandCounter + 1), order: parent.objColl.length + parent.freehandCounter + 1 };
                this.selPointColl[parent.freehandCounter] = ej2_base_1.extend({}, parent.pointColl[parent.freehandCounter], {}, true);
                parent.freehandCounter++;
            }
            if (parent.freehandCounter > 0) {
                for (var n = 0; n < parent.freehandCounter; n++) {
                    parent.points = ej2_base_1.extend([], parent.pointColl[n].points);
                    this.pointCounter = 0;
                    var len = parent.points.length;
                    var controlPoint1 = void 0;
                    var controlPoint2 = void 0;
                    var startPoint = void 0;
                    var endPoint = void 0;
                    var minStrokeWidth = void 0;
                    var maxStrokeWidth = void 0;
                    Eif (len > 0) {
                        context.fillStyle = parent.pointColl[n].strokeColor;
                        minStrokeWidth = maxStrokeWidth = this.penStrokeWidth = parent.pointColl[n].strokeWidth;
                    }
                    if (len === 1) {
                        controlPoint1 = controlPoint2 = startPoint = endPoint = parent.points[0];
                        this.startDraw(context, controlPoint1, controlPoint2, startPoint, endPoint, minStrokeWidth, maxStrokeWidth);
                    }
                    for (var l = 0; l < len - 3; l++) {
                        Eif (parent.points[l + 1] && parent.points[l + 2] && parent.points[l + 2]) {
                            controlPoint1 = (this.calcCurveCP(parent.points[l + 0], parent.points[l + 1], parent.points[l + 2])).controlPoint2;
                            controlPoint2 = (this.calcCurveCP(parent.points[l + 1], parent.points[l + 2], parent.points[l + 3])).controlPoint1;
                            if (l === 0) {
                                startPoint = parent.points[l];
                            }
                            else {
                                startPoint = parent.points[l + 1];
                            }
                            endPoint = parent.points[l + 2];
                            this.startDraw(context, controlPoint1, controlPoint2, startPoint, endPoint, minStrokeWidth, maxStrokeWidth);
                        }
                    }
                    context.closePath();
                }
                if (context === this.lowerContext) {
                    parent.notify('draw', { prop: 'applyFrame', value: { ctx: this.lowerContext, frame: parent.frameObj.type, preventImg: true } });
                    this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
                }
            }
            context.filter = temp;
        };
        FreehandDrawing.prototype.getSqPtFD = function (idx, obj) {
            var activePoint = { startX: 0, startY: 0, endX: 0, endY: 0, width: 0, height: 0 };
            var sPoints = ej2_base_1.extend([], this.selPointColl[idx].points, []);
            this.parent.points = ej2_base_1.extend([], this.parent.pointColl[idx].points);
            this.pointCounter = 0;
            var len = sPoints.length;
            for (var l = 0; l < len; l++) {
                if (activePoint.startX === 0 && activePoint.startY === 0 && activePoint.endX === 0 && activePoint.endY === 0) {
                    activePoint.startX = sPoints[l].x;
                    activePoint.startY = sPoints[l].y;
                    activePoint.endX = sPoints[l].x;
                    activePoint.endY = sPoints[l].y;
                }
                else {
                    activePoint.startX = Math.min(activePoint.startX, sPoints[l].x);
                    activePoint.startY = Math.min(activePoint.startY, sPoints[l].y);
                    activePoint.endX = Math.max(activePoint.endX, sPoints[l].x);
                    activePoint.endY = Math.max(activePoint.endY, sPoints[l].y);
                }
            }
            activePoint.startX -= this.penStrokeWidth;
            activePoint.startY -= this.penStrokeWidth;
            activePoint.endX += this.penStrokeWidth;
            activePoint.endY += this.penStrokeWidth;
            activePoint.width = activePoint.endX - activePoint.startX;
            activePoint.height = activePoint.endY - activePoint.startY;
            if (obj) {
                obj['activePoint'] = activePoint;
            }
            return activePoint;
        };
        FreehandDrawing.prototype.applyPenDraw = function () {
            var parent = this.parent;
            Iif (parent.currObjType.shape === 'freehanddraw') {
                parent.notify('shape', { prop: 'apply', onPropertyChange: false, value: { shape: null, obj: null, canvas: null } });
                parent.upperCanvas.style.cursor = parent.cursor = 'default';
                parent.currObjType.shape = '';
            }
            parent.notify('shape', { prop: 'clearActObj' });
        };
        FreehandDrawing.prototype.applyFhd = function () {
            var parent = this.parent;
            var selectedPoint = parent.pointColl[this.fhdSelIdx];
            Iif (selectedPoint.strokeColor === '#42a5f5') {
                selectedPoint.strokeColor = this.tempFHDStyles.strokeColor;
            }
            parent.notify('toolbar', { prop: 'setSelectedFreehandColor', value: { color: '#42a5f5' } });
            this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
            this.lowerContext.clearRect(0, 0, parent.lowerCanvas.width, parent.lowerCanvas.height);
            parent.notify('draw', { prop: 'render-image', value: { isMouseWheel: null } });
            parent.notify('toolbar', { prop: 'refresh-main-toolbar', onPropertyChange: false });
            Eif (selectedPoint) {
                selectedPoint.isSelected = false;
            }
            parent.notify('selection', { prop: 'resetFreehandDrawVariables' });
            this.fhdHovIdx = this.fhdSelIdx = null;
        };
        FreehandDrawing.prototype.cancelFhd = function () {
            var parent = this.parent;
            var selectedPoint = parent.pointColl[this.fhdSelIdx];
            parent.notify('toolbar', { prop: 'setSelectedFreehandColor', value: { color: '#42a5f5' } });
            this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
            this.lowerContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
            this.pointCounter = 0;
            if (selectedPoint) {
                selectedPoint.strokeColor = this.tempFHDStyles.strokeColor;
                selectedPoint.strokeWidth = this.tempFHDStyles.strokeWidth;
                selectedPoint.isSelected = false;
            }
            this.fhdHovIdx = this.fhdSelIdx = this.fhdSelID = null;
            parent.notify('selection', { prop: 'resetFreehandDrawVariables' });
            parent.activeObj.strokeSettings.strokeColor = this.tempFHDStyles.strokeColor;
            parent.activeObj.strokeSettings.strokeWidth = this.penStrokeWidth = this.tempFHDStyles.strokeWidth;
            this.tempFHDStyles = { strokeColor: null, strokeWidth: null, fillColor: null };
            parent.notify('draw', { prop: 'render-image', value: { isMouseWheel: null } });
            parent.notify('toolbar', { prop: 'refresh-main-toolbar', onPropertyChange: false });
        };
        FreehandDrawing.prototype.selectFhd = function (index) {
            var parent = this.parent;
            var tempFHDStyles = ej2_base_1.extend({}, this.tempFHDStyles, {}, true);
            parent.notify('selection', { prop: 'setFreehandDrawEditing', onPropertyChange: false, value: { bool: true } });
            Eif (index || index === 0) {
                Eif (this.isFHDIdx(index)) {
                    this.fhdSelIdx = this.fhdHovIdx = index;
                    this.hoverFhd();
                    parent.upperCanvas.style.cursor = parent.cursor = 'pointer';
                }
                else {
                    return;
                }
            }
            this.fhdSelIdx = this.fhdHovIdx;
            var point = parent.pointColl[this.fhdSelIdx];
            point.isSelected = true;
            this.fhdSelID = point.id;
            Eif (point.strokeColor !== '#42a5f5') {
                parent.activeObj.strokeSettings.strokeColor = this.tempFHDStyles.strokeColor = point.strokeColor;
            }
            parent.activeObj.strokeSettings.strokeWidth = this.tempFHDStyles.strokeWidth =
                parent.pointColl[this.fhdHovIdx].strokeWidth;
            var obj = { bool: false };
            parent.notify('selection', { prop: 'getFreehandDrawEditing', onPropertyChange: false, value: { obj: obj } });
            Eif (obj['bool']) {
                var shapeSettings = { id: 'pen_' + (this.fhdSelIdx + 1), type: index_1.ShapeType.FreehandDraw,
                    startX: point.points[0].x, startY: point.points[0].y, strokeColor: point.strokeColor,
                    strokeWidth: point.strokeWidth, points: point.points, opacity: point.opacity,
                    index: point.order };
                var shapeChangingArgs = { cancel: false, action: 'select', previousShapeSettings: shapeSettings,
                    currentShapeSettings: shapeSettings };
                this.triggerShapeChanging(shapeChangingArgs);
            }
            else {
                parent.okBtn(null, true);
            }
            if (parent.isUndoRedoStack) {
                this.tempFHDStyles = tempFHDStyles;
            }
        };
        FreehandDrawing.prototype.deleteFhd = function (index, isId) {
            var parent = this.parent;
            Eif (this.isFHDIdx(index)) {
                this.upperContext.clearRect(0, 0, parent.upperCanvas.width, parent.upperCanvas.height);
                var tempPointColl = ej2_base_1.extend({}, parent.pointColl, {}, true);
                var tempSelPointColl = ej2_base_1.extend({}, this.selPointColl, {}, true);
                parent.pointColl = {};
                this.selPointColl = {};
                var count = 0;
                for (var i = 0; i < parent.freehandCounter; i++) {
                    Iif (parseInt(tempPointColl[i].id.split('_')[1], 10) - 1 !== index) {
                        parent.pointColl[count] = tempPointColl[i];
                        this.selPointColl[count] = tempSelPointColl[i];
                        count++;
                    }
                }
                parent.freehandCounter -= 1;
                this.fhdHovIdx = this.fhdSelIdx = null;
                this.currFHDIdx--;
                parent.notify('selection', { prop: 'resetFreehandDrawVariables' });
                parent.notify('draw', { prop: 'render-image', value: { isMouseWheel: null } });
                parent.notify('toolbar', { prop: 'refresh-main-toolbar', onPropertyChange: false });
            }
        };
        FreehandDrawing.prototype.zoomX = function (x) {
            return (x * this.parent.img.destWidth) + this.parent.img.destLeft;
        };
        FreehandDrawing.prototype.zoomY = function (y) {
            return (y * this.parent.img.destHeight) + this.parent.img.destTop;
        };
        FreehandDrawing.prototype.zoomFHDColl = function (isPreventApply) {
            var parent = this.parent;
            var destPoints = { startX: parent.img.destLeft, startY: parent.img.destTop,
                width: parent.img.destWidth, height: parent.img.destHeight };
            parent.notify('shape', { prop: 'straightenShapes', onPropertyChange: false });
            for (var n = 0; n < parent.freehandCounter; n++) {
                parent.points = ej2_base_1.extend([], parent.pointColl[n].points, []);
                this.pointCounter = 0;
                var len = parent.points.length;
                for (var l = 0; l < len; l++) {
                    var point = parent.points[l];
                    point.x = this.zoomX(point.ratioX);
                    point.y = this.zoomY(point.ratioY);
                }
            }
            this.updateFHDCurPts();
            if (this.straightenPoint.x && this.straightenPoint.y) {
                this.straightenPoint.x = this.zoomX(this.straightenPoint.ratioX);
                this.straightenPoint.y = this.zoomY(this.straightenPoint.ratioY);
            }
            if (parent.transform.straighten !== 0) {
                parent.notify('shape', { prop: 'straightenFHD', onPropertyChange: false });
            }
            parent.img.destLeft = destPoints.startX;
            parent.img.destTop = destPoints.startY;
            parent.img.destWidth = destPoints.width;
            parent.img.destHeight = destPoints.height;
            if (ej2_base_1.isNullOrUndefined(isPreventApply)) {
                this.freehandRedraw(this.lowerContext, null);
            }
        };
        FreehandDrawing.prototype.updateFHDCurPts = function () {
            var parent = this.parent;
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (this.selPointColl[n]) {
                    this.selPoints = ej2_base_1.extend([], this.selPointColl[n].points, []);
                    this.pointCounter = 0;
                    var len = this.selPoints.length;
                    for (var l = 0; l < len; l++) {
                        var point = this.selPoints[l];
                        point.x = this.zoomX(point.ratioX);
                        point.y = this.zoomY(point.ratioY);
                    }
                }
            }
        };
        FreehandDrawing.prototype.rotateFhdColl = function () {
            var parent = this.parent;
            var _a = parent.img, destLeft = _a.destLeft, destTop = _a.destTop, destWidth = _a.destWidth, destHeight = _a.destHeight;
            for (var n = 0; n < parent.freehandCounter; n++) {
                parent.points = ej2_base_1.extend([], parent.pointColl[n].points, []);
                this.pointCounter = 0;
                var len = parent.points.length;
                for (var l = 0; l < len; l++) {
                    var point = parent.points[l];
                    point.y = destTop + (destHeight * point.ratioX);
                    point.x = (destLeft + destWidth) - (destWidth * point.ratioY);
                    point.ratioX = (point.x - destLeft) / destWidth;
                    point.ratioY = (point.y - destTop) / destHeight;
                }
            }
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (this.selPointColl[n]) {
                    this.selPoints = ej2_base_1.extend([], this.selPointColl[n].points, []);
                    this.pointCounter = 0;
                    var len = this.selPoints.length;
                    for (var l = 0; l < len; l++) {
                        var point = this.selPoints[l];
                        point.y = destTop + (destHeight * point.ratioX);
                        point.x = (destLeft + destWidth) - (destWidth * point.ratioY);
                        point.ratioX = (point.x - destLeft) / destWidth;
                        point.ratioY = (point.y - destTop) / destHeight;
                    }
                }
            }
            this.updateFHDCurPts();
        };
        FreehandDrawing.prototype.flipFHDColl = function (value) {
            var lowercaseValue = value.toLowerCase();
            if (lowercaseValue === 'horizontal') {
                this.pointsHorizontalFlip();
            }
            else if (lowercaseValue === 'vertical') {
                this.pointsVerticalFlip();
            }
            else {
                this.pointsHorizontalFlip();
                for (var i = 0; i < this.parent.freehandCounter; i++) {
                    this.parent.pointColl[i].shapeFlip = '';
                }
                this.pointsVerticalFlip();
            }
        };
        FreehandDrawing.prototype.pointsHorizontalFlip = function () {
            var parent = this.parent;
            var _a = parent.img, destLeft = _a.destLeft, destTop = _a.destTop, destWidth = _a.destWidth, destHeight = _a.destHeight;
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (parent.pointColl[n].shapeFlip !== parent.transform.currFlipState) {
                    parent.points = ej2_base_1.extend([], parent.pointColl[n].points, []);
                    this.pointCounter = 0;
                    var len = parent.points.length;
                    for (var l = 0; l < len; l++) {
                        var point = parent.points[l];
                        if (point.x <= destLeft + (destWidth / 2)) {
                            point.x = (destLeft + destWidth) - (point.x - destLeft);
                        }
                        else Eif (point.x >= destLeft + (destWidth / 2)) {
                            point.x = destLeft + (destLeft + destWidth - point.x);
                        }
                        point.ratioX = (point.x - destLeft) / destWidth;
                        point.ratioY = (point.y - destTop) / destHeight;
                    }
                    parent.pointColl[n].shapeFlip = parent.transform.currFlipState;
                }
            }
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (this.selPointColl[n]) {
                    if (this.selPointColl[n].shapeFlip !== parent.transform.currFlipState) {
                        this.selPoints = ej2_base_1.extend([], this.selPointColl[n].points, []);
                        this.pointCounter = 0;
                        var len = this.selPoints.length;
                        for (var l = 0; l < len; l++) {
                            var point = this.selPoints[l];
                            if (point.x <= destLeft + (destWidth / 2)) {
                                point.x = (destLeft + destWidth) - (point.x - destLeft);
                            }
                            else Eif (point.x >= destLeft + (destWidth / 2)) {
                                point.x = destLeft + (destLeft + destWidth - point.x);
                            }
                            point.ratioX = (point.x - destLeft) / destWidth;
                            point.ratioY = (point.y - destTop) / destHeight;
                        }
                    }
                }
            }
            this.updateFHDCurPts();
        };
        FreehandDrawing.prototype.pointsVerticalFlip = function () {
            var parent = this.parent;
            var _a = parent.img, destLeft = _a.destLeft, destTop = _a.destTop, destWidth = _a.destWidth, destHeight = _a.destHeight;
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (parent.pointColl[n].shapeFlip !== parent.transform.currFlipState) {
                    parent.points = ej2_base_1.extend([], parent.pointColl[n].points, []);
                    this.pointCounter = 0;
                    var len = parent.points.length;
                    for (var l = 0; l < len; l++) {
                        var point = parent.points[l];
                        if (point.y <= destTop + (destHeight / 2)) {
                            point.y = (destTop + destHeight) - (point.y - destTop);
                        }
                        else Eif (point.y >= destTop + (destHeight / 2)) {
                            point.y = destTop + (destTop + destHeight - point.y);
                        }
                        point.ratioX = (point.x - destLeft) / destWidth;
                        point.ratioY = (point.y - destTop) / destHeight;
                    }
                    parent.pointColl[n].shapeFlip = parent.transform.currFlipState;
                }
            }
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (this.selPointColl[n]) {
                    if (this.selPointColl[n].shapeFlip !== parent.transform.currFlipState) {
                        this.selPoints = ej2_base_1.extend([], this.selPointColl[n].points, []);
                        this.pointCounter = 0;
                        var len = this.selPoints.length;
                        for (var l = 0; l < len; l++) {
                            var point = this.selPoints[l];
                            if (point.y <= destTop + (destHeight / 2)) {
                                point.y = (destTop + destHeight) - (point.y - destTop);
                            }
                            else Eif (point.y >= destTop + (destHeight / 2)) {
                                point.y = destTop + (destTop + destHeight - point.y);
                            }
                            point.ratioX = (point.x - destLeft) / destWidth;
                            point.ratioY = (point.y - destTop) / destHeight;
                        }
                    }
                }
            }
            this.updateFHDCurPts();
        };
        FreehandDrawing.prototype.updateFHDColl = function (isPreventApply) {
            var parent = this.parent;
            var destPoints = { startX: parent.img.destLeft, startY: parent.img.destTop,
                width: parent.img.destWidth, height: parent.img.destHeight };
            parent.notify('shape', { prop: 'straightenShapes', onPropertyChange: false });
            var _a = parent.img, destLeft = _a.destLeft, destTop = _a.destTop, destWidth = _a.destWidth, destHeight = _a.destHeight;
            for (var i = 0, iLen = parent.objColl.length; i < iLen; i++) {
                var currObj = parent.objColl[i];
                if (currObj.shape === 'line' || currObj.shape === 'arrow') {
                    parent.notify('shape', { prop: 'straightenShapePoints', value: { obj: currObj, isReverse: true } });
                }
                else if (currObj.shape === 'path') {
                    var temp = parent.transform.straighten;
                    parent.transform.straighten = -parent.transform.straighten;
                    parent.notify('shape', { prop: 'straightenPath', onPropertyChange: false, value: { obj: currObj } });
                    parent.transform.straighten = temp;
                }
                currObj.imageRatio = { startX: ((currObj.activePoint.startX - destLeft) /
                        destWidth), startY: ((currObj.activePoint.startY - destTop) / destHeight),
                    endX: ((currObj.activePoint.endX - destLeft) / destWidth),
                    endY: ((currObj.activePoint.endY - destTop) / destHeight),
                    width: destWidth / currObj.activePoint.width, height: destHeight /
                        currObj.activePoint.height };
                if (currObj.shape === 'path') {
                    for (var j = 0, jLen = currObj.pointColl.length; j < jLen; j++) {
                        currObj.pointColl[j].ratioX =
                            (currObj.pointColl[j].x - destLeft) / destWidth;
                        currObj.pointColl[j].ratioY =
                            (currObj.pointColl[j].y - destTop) / destHeight;
                    }
                }
                parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
            }
            if (parent.freehandCounter > 0 && parent.transform.straighten !== 0) {
                var temp = parent.transform.straighten;
                parent.transform.straighten = -parent.transform.straighten;
                parent.notify('shape', { prop: 'straightenFHD', onPropertyChange: false });
                parent.transform.straighten = temp;
            }
            for (var n = 0; n < parent.freehandCounter; n++) {
                parent.points = ej2_base_1.extend([], parent.pointColl[n].points, []);
                this.pointCounter = 0;
                var len = parent.points.length;
                for (var l = 0; l < len; l++) {
                    var point = parent.points[l];
                    point.ratioX = (point.x - destLeft) / destWidth;
                    point.ratioY = (point.y - destTop) / destHeight;
                }
            }
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (this.selPointColl[n]) {
                    this.selPoints = ej2_base_1.extend([], this.selPointColl[n].points, []);
                    this.pointCounter = 0;
                    var len = this.selPoints.length;
                    for (var l = 0; l < len; l++) {
                        var point = this.selPoints[l];
                        point.ratioX = (point.x - destLeft) / destWidth;
                        point.ratioY = (point.y - destTop) / destHeight;
                    }
                }
            }
            Iif (this.straightenPoint.x && this.straightenPoint.y) {
                this.straightenPoint.ratioX = (this.straightenPoint.x - destLeft) / destWidth;
                this.straightenPoint.ratioY = (this.straightenPoint.y - destTop) / destHeight;
            }
            parent.img.destLeft = destPoints.startX;
            parent.img.destTop = destPoints.startY;
            parent.img.destWidth = destPoints.width;
            parent.img.destHeight = destPoints.height;
            parent.notify('shape', { prop: 'drawAnnotations', onPropertyChange: false,
                value: { ctx: this.lowerContext, shape: 'zoom', pen: 'zoom', isPreventApply: isPreventApply } });
        };
        FreehandDrawing.prototype.panFHDColl = function (xDiff, yDiff, panRegion) {
            var parent = this.parent;
            for (var n = 0; n < parent.freehandCounter; n++) {
                parent.points = ej2_base_1.extend([], parent.pointColl[n].points, []);
                this.pointCounter = 0;
                var len = parent.points.length;
                for (var l = 0; l < len; l++) {
                    var point = parent.points[l];
                    Eif (panRegion === '' || panRegion === 'vertical') {
                        point.x += xDiff;
                    }
                    else {
                        point.x -= xDiff;
                    }
                    Eif (panRegion === '' || panRegion === 'horizontal') {
                        point.y += yDiff;
                    }
                    else {
                        point.y -= yDiff;
                    }
                }
            }
            for (var n = 0; n < parent.freehandCounter; n++) {
                Eif (this.selPointColl[n]) {
                    this.selPoints = ej2_base_1.extend([], this.selPointColl[n].points, []);
                    this.pointCounter = 0;
                    var len = this.selPoints.length;
                    for (var l = 0; l < len; l++) {
                        var point = this.selPoints[l];
                        Eif (panRegion === '' || panRegion === 'vertical') {
                            point.x += xDiff;
                        }
                        else {
                            point.x -= xDiff;
                        }
                        Eif (panRegion === '' || panRegion === 'horizontal') {
                            point.y += yDiff;
                        }
                        else {
                            point.y -= yDiff;
                        }
                    }
                }
            }
            if (this.straightenPoint.x && this.straightenPoint.y) {
                Eif (panRegion === '' || panRegion === 'vertical') {
                    this.straightenPoint.x += xDiff;
                }
                else {
                    this.straightenPoint.x -= xDiff;
                }
                Eif (panRegion === '' || panRegion === 'horizontal') {
                    this.straightenPoint.y += yDiff;
                }
                else {
                    this.straightenPoint.y -= yDiff;
                }
            }
            this.freehandRedraw(this.lowerContext, null);
        };
        FreehandDrawing.prototype.freeHandDraw = function (value) {
            var parent = this.parent;
            if (value) {
                parent.points = [];
                this.dummyPoints = [];
                parent.notify('shape', { prop: 'refreshActiveObj', onPropertyChange: false });
                parent.togglePen = true;
                parent.upperCanvas.style.cursor = parent.cursor = 'crosshair';
                parent.upperCanvas.style.display = 'block';
                Iif (ej2_base_1.isNullOrUndefined(parent.activeObj.strokeSettings)) {
                    var obj = { strokeSettings: {} };
                    parent.notify('shape', { prop: 'getStrokeSettings', onPropertyChange: false,
                        value: { obj: obj } });
                    parent.activeObj.strokeSettings = obj['strokeSettings'];
                }
                if (ej2_base_1.isNullOrUndefined(parent.activeObj.strokeSettings.strokeWidth)) {
                    parent.activeObj.strokeSettings.strokeWidth = 2;
                }
                if (parent.isMaskImage) {
                    parent.notify('toolbar', { prop: 'refresh-main-toolbar', onPropertyChange: false });
                }
                else {
                    parent.notify('toolbar', { prop: 'refresh-toolbar', onPropertyChange: false, value: { type: 'pen',
                            isApplyBtn: null, isCropping: null, isZooming: null, cType: null } });
                }
            }
            else {
                parent.upperCanvas.style.cursor = parent.cursor = 'default';
                var strokeWidth = this.penStrokeWidth;
                parent.notify('shape', { prop: 'apply', onPropertyChange: false, value: { shape: null, obj: null, canvas: null } });
                parent.notify('toolbar', { prop: 'refresh-main-toolbar', onPropertyChange: false });
                parent.notify('toolbar', { prop: 'setCurrentToolbar', value: { type: 'main' } });
                parent.notify('selection', { prop: 'setFreehandDrawCustomized', value: { isFreehandDrawCustomized: false } });
                this.penStrokeWidth = strokeWidth;
            }
        };
        FreehandDrawing.prototype.isFHDIdx = function (index, obj) {
            var isIndex = false;
            for (var i = 0; i < this.parent.freehandCounter; i++) {
                Eif (this.parent.pointColl[i].id &&
                    parseInt(this.parent.pointColl[i].id.split('_')[1], 10) - 1 === index) {
                    isIndex = true;
                    break;
                }
            }
            if (obj) {
                obj['isIndex'] = isIndex;
            }
            return isIndex;
        };
        FreehandDrawing.prototype.updateCropPtsForSel = function () {
            var parent = this.parent;
            var actPoint = parent.activeObj.activePoint;
            for (var n = 0; n < parent.freehandCounter; n++) {
                var obj = { selPointColl: ej2_base_1.extend([], this.selPointColl) };
                Eif (obj['selPointColl'][n]) {
                    this.selPoints = ej2_base_1.extend([], obj['selPointColl'][n].points, []);
                    this.pointCounter = 0;
                    var len = this.selPoints.length;
                    for (var l = 0; l < len; l++) {
                        var point = this.selPoints[l];
                        point.ratioX = (point.x - actPoint.startX) / actPoint.width;
                        point.ratioY = (point.y - actPoint.startY) / actPoint.height;
                    }
                }
            }
        };
        FreehandDrawing.prototype.triggerShapeChanging = function (shapeChangingArgs) {
            var parent = this.parent;
            var point = parent.pointColl[this.fhdSelIdx];
            parent.trigger('shapeChanging', shapeChangingArgs);
            if (parent.element.getAttribute('data-value') === 'mask-drawing' && !this.isMasking) {
                this.isMasking = true;
                parent.upperCanvas.style.cursor = 'crosshair';
                parent.notify('draw', { prop: 'updateTempObjColl' });
                parent.notify('draw', { prop: 'updateTempPointColl' });
                parent.discard();
                parent.selectMaskImage();
                return;
            }
            parent.editCompleteArgs = shapeChangingArgs;
            Iif (shapeChangingArgs.currentShapeSettings.id.indexOf('pen_') === -1 &&
                (shapeChangingArgs.action === 'draw-end' || shapeChangingArgs.action === 'select')) {
                var id = 'pen_' + shapeChangingArgs.currentShapeSettings.id;
                if (this.fhdSelIdx) {
                    parent.pointColl[this.fhdSelIdx].id = id;
                }
                else {
                    parent.pointColl[parent.freehandCounter - 1].id = id;
                }
            }
            this.penStrokeWidth = shapeChangingArgs.currentShapeSettings.strokeWidth;
            Iif (parent.activeObj.strokeSettings.strokeColor !== shapeChangingArgs.currentShapeSettings.strokeColor) {
                parent.activeObj.strokeSettings.strokeColor = shapeChangingArgs.currentShapeSettings.strokeColor;
                parent.notify('toolbar', { prop: 'update-toolbar-items', onPropertyChange: false });
            }
            if (this.fhdSelID && point && shapeChangingArgs.currentShapeSettings) {
                point.strokeColor = shapeChangingArgs.currentShapeSettings.strokeColor;
                point.strokeWidth = shapeChangingArgs.currentShapeSettings.strokeWidth;
                point.points = shapeChangingArgs.currentShapeSettings.points;
                point.opacity = shapeChangingArgs.currentShapeSettings.opacity;
            }
            if (shapeChangingArgs.action === 'select') {
                this.freehandRedraw(this.upperContext);
                parent.notify('toolbar', { prop: 'refresh-toolbar', onPropertyChange: false, value: { type: 'pen',
                        isApplyBtn: null, isCropping: null, isZooming: null, cType: null } });
            }
        };
        FreehandDrawing.prototype.setCenterSelPoints = function () {
            var parent = this.parent;
            var destPoints = { startX: parent.img.destLeft, startY: parent.img.destTop,
                width: parent.img.destWidth, height: parent.img.destHeight };
            parent.notify('shape', { prop: 'straightenShapes', onPropertyChange: false });
            var _a = parent.img, destLeft = _a.destLeft, destTop = _a.destTop, destWidth = _a.destWidth, destHeight = _a.destHeight;
            var actPoint = parent.activeObj.activePoint;
            if (ej2_base_1.isNullOrUndefined(this.prevStraightenObj) ||
                (JSON.stringify(this.prevStraightenObj.activePoint) !== JSON.stringify(actPoint))) {
                this.straightenPoint = { x: actPoint.startX + (actPoint.width / 2),
                    y: actPoint.startY + (actPoint.height / 2),
                    ratioX: (actPoint.startX + (actPoint.width / 2) - destLeft) / destWidth,
                    ratioY: (actPoint.startY + (actPoint.height / 2) - destTop) / destHeight };
                this.prevStraightenObj = ej2_base_1.extend({}, parent.activeObj, {}, true);
                this.straightenPointAngle = parent.transform.straighten;
            }
            parent.img.destLeft = destPoints.startX;
            parent.img.destTop = destPoints.startY;
            parent.img.destWidth = destPoints.width;
            parent.img.destHeight = destPoints.height;
        };
        return FreehandDrawing;
    }());
    exports.FreehandDrawing = FreehandDrawing;
});