You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							393 lines
						
					
					
						
							15 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							393 lines
						
					
					
						
							15 KiB
						
					
					
				
								/*!
							 | 
						|
								 * Signature Pad v3.0.0-beta.3 | https://github.com/szimek/signature_pad
							 | 
						|
								 * (c) 2018 Szymon Nowak | Released under the MIT license
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								(function (global, factory) {
							 | 
						|
								    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
							 | 
						|
								    typeof define === 'function' && define.amd ? define(factory) :
							 | 
						|
								    (global.SignaturePad = factory());
							 | 
						|
								  }(this, (function () { 'use strict';
							 | 
						|
								  
							 | 
						|
								    var Point = (function () {
							 | 
						|
								        function Point(x, y, time) {
							 | 
						|
								            this.x = x;
							 | 
						|
								            this.y = y;
							 | 
						|
								            this.time = time || Date.now();
							 | 
						|
								        }
							 | 
						|
								        Point.prototype.distanceTo = function (start) {
							 | 
						|
								            return Math.sqrt(Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2));
							 | 
						|
								        };
							 | 
						|
								        Point.prototype.equals = function (other) {
							 | 
						|
								            return this.x === other.x && this.y === other.y && this.time === other.time;
							 | 
						|
								        };
							 | 
						|
								        Point.prototype.velocityFrom = function (start) {
							 | 
						|
								            return (this.time !== start.time) ? this.distanceTo(start) / (this.time - start.time) : 0;
							 | 
						|
								        };
							 | 
						|
								        return Point;
							 | 
						|
								    }());
							 | 
						|
								  
							 | 
						|
								    var Bezier = (function () {
							 | 
						|
								        function Bezier(startPoint, control2, control1, endPoint, startWidth, endWidth) {
							 | 
						|
								            this.startPoint = startPoint;
							 | 
						|
								            this.control2 = control2;
							 | 
						|
								            this.control1 = control1;
							 | 
						|
								            this.endPoint = endPoint;
							 | 
						|
								            this.startWidth = startWidth;
							 | 
						|
								            this.endWidth = endWidth;
							 | 
						|
								        }
							 | 
						|
								        Bezier.fromPoints = function (points, widths) {
							 | 
						|
								            var c2 = this.calculateControlPoints(points[0], points[1], points[2]).c2;
							 | 
						|
								            var c3 = this.calculateControlPoints(points[1], points[2], points[3]).c1;
							 | 
						|
								            return new Bezier(points[1], c2, c3, points[2], widths.start, widths.end);
							 | 
						|
								        };
							 | 
						|
								        Bezier.calculateControlPoints = function (s1, s2, s3) {
							 | 
						|
								            var dx1 = s1.x - s2.x;
							 | 
						|
								            var dy1 = s1.y - s2.y;
							 | 
						|
								            var dx2 = s2.x - s3.x;
							 | 
						|
								            var dy2 = s2.y - s3.y;
							 | 
						|
								            var m1 = { x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0 };
							 | 
						|
								            var m2 = { x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.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 = s2.x - cm.x;
							 | 
						|
								            var ty = s2.y - cm.y;
							 | 
						|
								            return {
							 | 
						|
								                c1: new Point(m1.x + tx, m1.y + ty),
							 | 
						|
								                c2: new Point(m2.x + tx, m2.y + ty)
							 | 
						|
								            };
							 | 
						|
								        };
							 | 
						|
								        Bezier.prototype.length = function () {
							 | 
						|
								            var steps = 10;
							 | 
						|
								            var length = 0;
							 | 
						|
								            var px;
							 | 
						|
								            var py;
							 | 
						|
								            for (var i = 0; i <= steps; i += 1) {
							 | 
						|
								                var t = i / steps;
							 | 
						|
								                var cx = this.point(t, this.startPoint.x, this.control1.x, this.control2.x, this.endPoint.x);
							 | 
						|
								                var cy = this.point(t, this.startPoint.y, this.control1.y, this.control2.y, this.endPoint.y);
							 | 
						|
								                if (i > 0) {
							 | 
						|
								                    var xdiff = cx - px;
							 | 
						|
								                    var ydiff = cy - py;
							 | 
						|
								                    length += Math.sqrt((xdiff * xdiff) + (ydiff * ydiff));
							 | 
						|
								                }
							 | 
						|
								                px = cx;
							 | 
						|
								                py = cy;
							 | 
						|
								            }
							 | 
						|
								            return length;
							 | 
						|
								        };
							 | 
						|
								        Bezier.prototype.point = function (t, start, c1, c2, end) {
							 | 
						|
								            return (start * (1.0 - t) * (1.0 - t) * (1.0 - t))
							 | 
						|
								                + (3.0 * c1 * (1.0 - t) * (1.0 - t) * t)
							 | 
						|
								                + (3.0 * c2 * (1.0 - t) * t * t)
							 | 
						|
								                + (end * t * t * t);
							 | 
						|
								        };
							 | 
						|
								        return Bezier;
							 | 
						|
								    }());
							 | 
						|
								  
							 | 
						|
								    function throttle(fn, wait) {
							 | 
						|
								        if (wait === void 0) { wait = 250; }
							 | 
						|
								        var previous = 0;
							 | 
						|
								        var timeout = null;
							 | 
						|
								        var result;
							 | 
						|
								        var storedContext;
							 | 
						|
								        var storedArgs;
							 | 
						|
								        var later = function () {
							 | 
						|
								            previous = Date.now();
							 | 
						|
								            timeout = null;
							 | 
						|
								            result = fn.apply(storedContext, storedArgs);
							 | 
						|
								            if (!timeout) {
							 | 
						|
								                storedContext = null;
							 | 
						|
								                storedArgs = [];
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								        return function () {
							 | 
						|
								            var args = [];
							 | 
						|
								            for (var _i = 0; _i < arguments.length; _i++) {
							 | 
						|
								                args[_i] = arguments[_i];
							 | 
						|
								            }
							 | 
						|
								            var now = Date.now();
							 | 
						|
								            var remaining = wait - (now - previous);
							 | 
						|
								            storedContext = this;
							 | 
						|
								            storedArgs = args;
							 | 
						|
								            if (remaining <= 0 || remaining > wait) {
							 | 
						|
								                if (timeout) {
							 | 
						|
								                    clearTimeout(timeout);
							 | 
						|
								                    timeout = null;
							 | 
						|
								                }
							 | 
						|
								                previous = now;
							 | 
						|
								                result = fn.apply(storedContext, storedArgs);
							 | 
						|
								                if (!timeout) {
							 | 
						|
								                    storedContext = null;
							 | 
						|
								                    storedArgs = [];
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								            else if (!timeout) {
							 | 
						|
								                timeout = setTimeout(later, remaining);
							 | 
						|
								            }
							 | 
						|
								            return result;
							 | 
						|
								        };
							 | 
						|
								    }
							 | 
						|
								  
							 | 
						|
								    var SignaturePad = (function () {
							 | 
						|
								        function SignaturePad(canvas, options) {
							 | 
						|
								            if (options === void 0) { options = {}; }
							 | 
						|
								            var _this = this;
							 | 
						|
								            this.canvas = canvas;
							 | 
						|
								            this.options = options;
							 | 
						|
								            this._handleTouchStart = function (event) {
							 | 
						|
								                if (event.touches.length === 1) {
							 | 
						|
								                    var touch = event.changedTouches[0];
							 | 
						|
								                    _this._strokeBegin(touch);
							 | 
						|
								                }
							 | 
						|
								            };
							 | 
						|
								            this._handleTouchMove = function (event) {
							 | 
						|
								                var touch = event.touches[0];
							 | 
						|
								                _this._strokeMoveUpdate(touch);
							 | 
						|
								            };
							 | 
						|
								            this._handleTouchEnd = function (event) {
							 | 
						|
								                var wasCanvasTouched = event.target === _this.canvas;
							 | 
						|
								                if (wasCanvasTouched) {
							 | 
						|
								                    event.preventDefault();
							 | 
						|
								                    var touch = event.changedTouches[0];
							 | 
						|
								                    _this._strokeEnd(touch);
							 | 
						|
								                }
							 | 
						|
								            };
							 | 
						|
								            this.velocityFilterWeight = options.velocityFilterWeight || 0.7;
							 | 
						|
								            this.minWidth = options.minWidth || 0.5;
							 | 
						|
								            this.maxWidth = options.maxWidth || 2.5;
							 | 
						|
								            this.throttle = ('throttle' in options ? options.throttle : 16);
							 | 
						|
								            this.minDistance = ('minDistance' in options ? options.minDistance : 5);
							 | 
						|
								            if (this.throttle) {
							 | 
						|
								                this._strokeMoveUpdate = throttle(SignaturePad.prototype._strokeUpdate, this.throttle);
							 | 
						|
								            }
							 | 
						|
								            else {
							 | 
						|
								                this._strokeMoveUpdate = SignaturePad.prototype._strokeUpdate;
							 | 
						|
								            }
							 | 
						|
								            this.dotSize = options.dotSize || function () {
							 | 
						|
								                return (this.minWidth + this.maxWidth) / 2;
							 | 
						|
								            };
							 | 
						|
								            this.penColor = options.penColor || 'black';
							 | 
						|
								            this.backgroundColor = options.backgroundColor || 'rgba(0,0,0,0)';
							 | 
						|
								            this.onBegin = options.onBegin;
							 | 
						|
								            this.onEnd = options.onEnd;
							 | 
						|
								            this._ctx = canvas.getContext('2d');
							 | 
						|
								            this.clear();
							 | 
						|
								        }
							 | 
						|
								        SignaturePad.prototype.clear = function () {
							 | 
						|
								            var ctx = this._ctx;
							 | 
						|
								            var canvas = this.canvas;
							 | 
						|
								            ctx.fillStyle = this.backgroundColor;
							 | 
						|
								            ctx.clearRect(0, 0, canvas.width, canvas.height);
							 | 
						|
								            ctx.fillRect(0, 0, canvas.width, canvas.height);
							 | 
						|
								            this._data = [];
							 | 
						|
								            this._reset();
							 | 
						|
								            this._isEmpty = true;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype.fromDataURL = function (dataUrl, options, callback) {
							 | 
						|
								            var _this = this;
							 | 
						|
								            if (options === void 0) { options = {}; }
							 | 
						|
								            var image = new Image();
							 | 
						|
								            var ratio = options.ratio || 1;
							 | 
						|
								            var width = options.width || (this.canvas.width / ratio);
							 | 
						|
								            var height = options.height || (this.canvas.height / ratio);
							 | 
						|
								            this._reset();
							 | 
						|
								            image.onload = function () {
							 | 
						|
								                _this._ctx.drawImage(image, 0, 0, width, height);
							 | 
						|
								                if (callback) {
							 | 
						|
								                    callback();
							 | 
						|
								                }
							 | 
						|
								            };
							 | 
						|
								            image.onerror = function (error) {
							 | 
						|
								                if (callback) {
							 | 
						|
								                    callback(error);
							 | 
						|
								                }
							 | 
						|
								            };
							 | 
						|
								            image.src = dataUrl;
							 | 
						|
								            this._isEmpty = false;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype.toDataURL = function (type, encoderOptions) {
							 | 
						|
								            if (type === void 0) { type = 'image/png'; }
							 | 
						|
								            return this.canvas.toDataURL(type, encoderOptions);
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype.isEmpty = function () {
							 | 
						|
								            return this._isEmpty;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype.fromData = function (pointGroups) {
							 | 
						|
								            var _this = this;
							 | 
						|
								            this.clear();
							 | 
						|
								            this._fromData(pointGroups, function (_a) {
							 | 
						|
								                var color = _a.color, curve = _a.curve;
							 | 
						|
								                return _this._drawCurve({ color: color, curve: curve });
							 | 
						|
								            }, function (_a) {
							 | 
						|
								                var color = _a.color, point = _a.point;
							 | 
						|
								                return _this._drawDot({ color: color, point: point });
							 | 
						|
								            });
							 | 
						|
								            this._data = pointGroups;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype.toData = function () {
							 | 
						|
								            return this._data;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._strokeBegin = function (event) {
							 | 
						|
								            var newPointGroup = {
							 | 
						|
								                color: this.penColor,
							 | 
						|
								                points: []
							 | 
						|
								            };
							 | 
						|
								            this._data.push(newPointGroup);
							 | 
						|
								            this._reset();
							 | 
						|
								            this._strokeUpdate(event);
							 | 
						|
								            if (typeof this.onBegin === 'function') {
							 | 
						|
								                this.onBegin(event);
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._strokeUpdate = function (event) {
							 | 
						|
								            var x = event.x;
							 | 
						|
								            var y = event.y;
							 | 
						|
								            var point = this._createPoint(x, y);
							 | 
						|
								            var lastPointGroup = this._data[this._data.length - 1];
							 | 
						|
								            var lastPoints = lastPointGroup.points;
							 | 
						|
								            var lastPoint = lastPoints.length > 0 && lastPoints[lastPoints.length - 1];
							 | 
						|
								            var isLastPointTooClose = lastPoint ? point.distanceTo(lastPoint) <= this.minDistance : false;
							 | 
						|
								            var color = lastPointGroup.color;
							 | 
						|
								            if (!lastPoint || !(lastPoint && isLastPointTooClose)) {
							 | 
						|
								                var curve = this._addPoint(point);
							 | 
						|
								                if (!lastPoint) {
							 | 
						|
								                    this._drawDot({ color: color, point: point });
							 | 
						|
								                }
							 | 
						|
								                else if (curve) {
							 | 
						|
								                    this._drawCurve({ color: color, curve: curve });
							 | 
						|
								                }
							 | 
						|
								                lastPoints.push({
							 | 
						|
								                    time: point.time,
							 | 
						|
								                    x: point.x,
							 | 
						|
								                    y: point.y
							 | 
						|
								                });
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._strokeEnd = function (event) {
							 | 
						|
								            this._strokeUpdate(event);
							 | 
						|
								            if (typeof this.onEnd === 'function') {
							 | 
						|
								                this.onEnd(event);
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._reset = function () {
							 | 
						|
								            this._lastPoints = [];
							 | 
						|
								            this._lastVelocity = 0;
							 | 
						|
								            this._lastWidth = (this.minWidth + this.maxWidth) / 2;
							 | 
						|
								            this._ctx.fillStyle = this.penColor;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._createPoint = function (x, y) {
							 | 
						|
								            return new Point(x, y, new Date().getTime());
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._addPoint = function (point) {
							 | 
						|
								            var _lastPoints = this._lastPoints;
							 | 
						|
								            _lastPoints.push(point);
							 | 
						|
								            if (_lastPoints.length > 2) {
							 | 
						|
								                if (_lastPoints.length === 3) {
							 | 
						|
								                    _lastPoints.unshift(_lastPoints[0]);
							 | 
						|
								                }
							 | 
						|
								                var widths = this._calculateCurveWidths(_lastPoints[1], _lastPoints[2]);
							 | 
						|
								                var curve = Bezier.fromPoints(_lastPoints, widths);
							 | 
						|
								                _lastPoints.shift();
							 | 
						|
								                return curve;
							 | 
						|
								            }
							 | 
						|
								            return null;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._calculateCurveWidths = function (startPoint, endPoint) {
							 | 
						|
								            var velocity = (this.velocityFilterWeight * endPoint.velocityFrom(startPoint))
							 | 
						|
								                + ((1 - this.velocityFilterWeight) * this._lastVelocity);
							 | 
						|
								            var newWidth = this._strokeWidth(velocity);
							 | 
						|
								            var widths = {
							 | 
						|
								                end: newWidth,
							 | 
						|
								                start: this._lastWidth
							 | 
						|
								            };
							 | 
						|
								            this._lastVelocity = velocity;
							 | 
						|
								            this._lastWidth = newWidth;
							 | 
						|
								            return widths;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._strokeWidth = function (velocity) {
							 | 
						|
								            return Math.max(this.maxWidth / (velocity + 1), this.minWidth);
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._drawCurveSegment = function (x, y, width) {
							 | 
						|
								            var ctx = this._ctx;
							 | 
						|
								            ctx.moveTo(x, y);
							 | 
						|
								            ctx.arc(x, y, width, 0, 2 * Math.PI, false);
							 | 
						|
								            this._isEmpty = false;
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._drawCurve = function (_a) {
							 | 
						|
								            var color = _a.color, curve = _a.curve;
							 | 
						|
								            var ctx = this._ctx;
							 | 
						|
								            var widthDelta = curve.endWidth - curve.startWidth;
							 | 
						|
								            var drawSteps = Math.floor(curve.length()) * 2;
							 | 
						|
								            ctx.beginPath();
							 | 
						|
								            ctx.fillStyle = color;
							 | 
						|
								            for (var i = 0; i < drawSteps; i += 1) {
							 | 
						|
								                var t = i / drawSteps;
							 | 
						|
								                var tt = t * t;
							 | 
						|
								                var ttt = tt * t;
							 | 
						|
								                var u = 1 - t;
							 | 
						|
								                var uu = u * u;
							 | 
						|
								                var uuu = uu * u;
							 | 
						|
								                var x = uuu * curve.startPoint.x;
							 | 
						|
								                x += 3 * uu * t * curve.control1.x;
							 | 
						|
								                x += 3 * u * tt * curve.control2.x;
							 | 
						|
								                x += ttt * curve.endPoint.x;
							 | 
						|
								                var y = uuu * curve.startPoint.y;
							 | 
						|
								                y += 3 * uu * t * curve.control1.y;
							 | 
						|
								                y += 3 * u * tt * curve.control2.y;
							 | 
						|
								                y += ttt * curve.endPoint.y;
							 | 
						|
								                var width = curve.startWidth + (ttt * widthDelta);
							 | 
						|
								                this._drawCurveSegment(x, y, width);
							 | 
						|
								            }
							 | 
						|
								            ctx.closePath();
							 | 
						|
								            ctx.fill();
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._drawDot = function (_a) {
							 | 
						|
								            var color = _a.color, point = _a.point;
							 | 
						|
								            var ctx = this._ctx;
							 | 
						|
								            var width = 1;
							 | 
						|
								            ctx.beginPath();
							 | 
						|
								            this._drawCurveSegment(point.x, point.y, width);
							 | 
						|
								            ctx.closePath();
							 | 
						|
								            ctx.fillStyle = color;
							 | 
						|
								            ctx.fill();
							 | 
						|
								        };
							 | 
						|
								        SignaturePad.prototype._fromData = function (pointGroups, drawCurve, drawDot) {
							 | 
						|
								            for (var _i = 0, pointGroups_1 = pointGroups; _i < pointGroups_1.length; _i++) {
							 | 
						|
								                var group = pointGroups_1[_i];
							 | 
						|
								                var color = group.color, points = group.points;
							 | 
						|
								                if (points.length > 1) {
							 | 
						|
								                    for (var j = 0; j < points.length; j += 1) {
							 | 
						|
								                        var basicPoint = points[j];
							 | 
						|
								                        var point = new Point(basicPoint.x, basicPoint.y, basicPoint.time);
							 | 
						|
								                        this.penColor = color;
							 | 
						|
								                        if (j === 0) {
							 | 
						|
								                            this._reset();
							 | 
						|
								                        }
							 | 
						|
								                        var curve = this._addPoint(point);
							 | 
						|
								                        if (curve) {
							 | 
						|
								                            drawCurve({ color: color, curve: curve });
							 | 
						|
								                        }
							 | 
						|
								                    }
							 | 
						|
								                }
							 | 
						|
								                else {
							 | 
						|
								                    this._reset();
							 | 
						|
								                    drawDot({
							 | 
						|
								                        color: color,
							 | 
						|
								                        point: points[0]
							 | 
						|
								                    });
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								        return SignaturePad;
							 | 
						|
								    }());
							 | 
						|
								  
							 | 
						|
								    return SignaturePad;
							 | 
						|
								  
							 | 
						|
								  })));
							 | 
						|
								  
							 | 
						|
								  
							 |