From 066eb54d30ab68be977e04a04a1ab95e09705480 Mon Sep 17 00:00:00 2001 From: kangax Date: Fri, 19 Sep 2014 13:12:12 +0200 Subject: [PATCH] Increase maxstatements, few style fixes --- .jshintrc | 9 +- dist/fabric.js | 1109 +++++++++++++++++++++++++++------------- dist/fabric.min.js | 14 +- dist/fabric.min.js.gz | Bin 57280 -> 58419 bytes dist/fabric.require.js | 1109 +++++++++++++++++++++++++++------------- src/util/arc.js | 8 +- 6 files changed, 1534 insertions(+), 715 deletions(-) diff --git a/.jshintrc b/.jshintrc index c05b47de..263e13e0 100644 --- a/.jshintrc +++ b/.jshintrc @@ -33,9 +33,10 @@ "undef": true, "unused": true, - // "maxcomplexity": 7 "maxdepth": 4, - // "maxlen": 100 - // "maxparams": 4 - "maxstatements": 30 + "maxstatements": 45 + + // "maxparams": 4, + // "maxcomplexity": 7, + // "maxlen": 120 } diff --git a/dist/fabric.js b/dist/fabric.js index aef079a1..653de5f6 100644 --- a/dist/fabric.js +++ b/dist/fabric.js @@ -885,6 +885,7 @@ fabric.Collection = { var arcToSegmentsCache = { }, segmentToBezierCache = { }, + boundsOfCurveCache = { }, _join = Array.prototype.join; /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp @@ -897,7 +898,7 @@ fabric.Collection = { return arcToSegmentsCache[argsString]; } - var PI = Math.PI, th = rotateX * (PI / 180), + var PI = Math.PI, th = rotateX * PI / 180, sinTh = Math.sin(th), cosTh = Math.cos(th), fromX = 0, fromY = 0; @@ -905,26 +906,26 @@ fabric.Collection = { rx = Math.abs(rx); ry = Math.abs(ry); - var px = -cosTh * toX - sinTh * toY, - py = -cosTh * toY + sinTh * toX, + var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5, + py = -cosTh * toY * 0.5 + sinTh * toX * 0.5, rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px, - pl = 4 * rx2 * ry2 - rx2 * py2 - ry2 * px2, + pl = rx2 * ry2 - rx2 * py2 - ry2 * px2, root = 0; if (pl < 0) { - var s = Math.sqrt(1 - 0.25 * pl/(rx2 * ry2)); + var s = Math.sqrt(1 - pl/(rx2 * ry2)); rx *= s; ry *= s; } else { - root = (large === sweep ? -0.5 : 0.5) * + root = (large === sweep ? -1.0 : 1.0) * Math.sqrt( pl /(rx2 * py2 + ry2 * px2)); } var cx = root * rx * py / ry, cy = -root * ry * px / rx, - cx1 = cosTh * cx - sinTh * cy + toX / 2, - cy1 = sinTh * cx + cosTh * cy + toY / 2, + cx1 = cosTh * cx - sinTh * cy + toX * 0.5, + cy1 = sinTh * cx + cosTh * cy + toY * 0.5, mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry), dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry); @@ -936,7 +937,7 @@ fabric.Collection = { } // Convert into cubic bezier segments <= 90deg - var segments = Math.ceil(Math.abs(dtheta / (PI * 0.5))), + var segments = Math.ceil(Math.abs(dtheta / PI * 2)), result = [], mDelta = dtheta / segments, mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2), th3 = mTheta + mDelta; @@ -945,7 +946,7 @@ fabric.Collection = { result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY); fromX = result[i][4]; fromY = result[i][5]; - mTheta += mDelta; + mTheta = th3; th3 += mDelta; } arcToSegmentsCache[argsString] = result; @@ -1019,6 +1020,129 @@ fabric.Collection = { ctx.bezierCurveTo.apply(ctx, segs[i]); } }; + + /** + * Calculate bounding box of a elliptic-arc + * @param {Number} fx start point of arc + * @param {Number} fy + * @param {Number} rx horizontal radius + * @param {Number} ry vertical radius + * @param {Number} rot angle of horizontal axe + * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points + * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction + * @param {Number} tx end point of arc + * @param {Number} ty + */ + fabric.util.getBoundsOfArc = function(fx, fy, rx, ry, rot, large, sweep, tx, ty) { + + var fromX = 0, fromY = 0, bound = [ ], bounds = [ ], + segs = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot); + + for (var i = 0, len = segs.length; i < len; i++) { + bound = getBoundsOfCurve(fromX, fromY, segs[i][0], segs[i][1], segs[i][2], segs[i][3], segs[i][4], segs[i][5]); + bound[0].x += fx; + bound[0].y += fy; + bound[1].x += fx; + bound[1].y += fy; + bounds.push(bound[0]); + bounds.push(bound[1]); + fromX = segs[i][4]; + fromY = segs[i][5]; + } + return bounds; + }; + + /** + * Calculate bounding box of a beziercurve + * @param {Number} x0 starting point + * @param {Number} y0 + * @param {Number} x1 first control point + * @param {Number} y1 + * @param {Number} x2 secondo control point + * @param {Number} y2 + * @param {Number} x3 end of beizer + * @param {Number} y3 + */ + // taken from http://jsbin.com/ivomiq/56/edit no credits available for that. + function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) { + var argsString = _join.call(arguments); + if (boundsOfCurveCache[argsString]) { + return boundsOfCurveCache[argsString]; + } + + var sqrt = Math.sqrt, + min = Math.min, max = Math.max, + abs = Math.abs, tvalues = [ ], + bounds = [[ ], [ ]], + a, b, c, t, t1, t2, b2ac, sqrtb2ac; + + b = 6 * x0 - 12 * x1 + 6 * x2; + a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; + c = 3 * x1 - 3 * x0; + + for (var i = 0; i < 2; ++i) { + if (i > 0) { + b = 6 * y0 - 12 * y1 + 6 * y2; + a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; + c = 3 * y1 - 3 * y0; + } + + if (abs(a) < 1e-12) { + if (abs(b) < 1e-12) { + continue; + } + t = -c / b; + if (0 < t && t < 1) { + tvalues.push(t); + } + continue; + } + b2ac = b * b - 4 * c * a; + if (b2ac < 0) { + continue; + } + sqrtb2ac = sqrt(b2ac); + t1 = (-b + sqrtb2ac) / (2 * a); + if (0 < t1 && t1 < 1) { + tvalues.push(t1); + } + t2 = (-b - sqrtb2ac) / (2 * a); + if (0 < t2 && t2 < 1) { + tvalues.push(t2); + } + } + + var x, y, j = tvalues.length, jlen = j, mt; + while(j--) { + t = tvalues[j]; + mt = 1 - t; + x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); + bounds[0][j] = x; + + y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3); + bounds[1][j] = y; + } + + bounds[0][jlen] = x0; + bounds[1][jlen] = y0; + bounds[0][jlen + 1] = x3; + bounds[1][jlen + 1] = y3; + var result = [ + { + x: min.apply(null, bounds[0]), + y: min.apply(null, bounds[1]) + }, + { + x: max.apply(null, bounds[0]), + y: max.apply(null, bounds[1]) + } + ]; + boundsOfCurveCache[argsString] = result; + return result; + } + + fabric.util.getBoundsOfCurve = getBoundsOfCurve; + })(); @@ -2010,7 +2134,8 @@ fabric.Collection = { var getElementStyle; if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) { getElementStyle = function(element, attr) { - return fabric.document.defaultView.getComputedStyle(element, null)[attr]; + var style = fabric.document.defaultView.getComputedStyle(element, null); + return style ? style[attr] : undefined; }; } else { @@ -4696,7 +4821,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { // convert percents to absolute values offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1); - + offset = offset < 0 ? 0 : offset > 1 ? 1 : offset; if (style) { var keyValuePairs = style.split(/\s*;\s*/); @@ -4766,19 +4891,20 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @see {@link fabric.Gradient#initialize} for constructor definition */ fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ { - /* - * Stores the original position of the gradient when we convert from % to fixed values, for objectBoundingBox case. - * @type Number - * @default 0 - */ - origX: 0, - /* - * Stores the original position of the gradient when we convert from % to fixed values, for objectBoundingBox case. + /** + * Horizontal offset for aligning gradients coming from SVG when outside pathgroups * @type Number * @default 0 */ - origY: 0, + offsetX: 0, + + /** + * Vertical offset for aligning gradients coming from SVG when outside pathgroups + * @type Number + * @default 0 + */ + offsetY: 0, /** * Constructor @@ -4804,15 +4930,13 @@ fabric.ElementsParser.prototype.checkIfDone = function() { coords.r1 = options.coords.r1 || 0; coords.r2 = options.coords.r2 || 0; } - this.coords = coords; - this.gradientUnits = options.gradientUnits || 'objectBoundingBox'; this.colorStops = options.colorStops.slice(); if (options.gradientTransform) { this.gradientTransform = options.gradientTransform; } - this.origX = options.left || this.origX; - this.origY = options.top || this.origY; + this.offsetX = options.offsetX || this.offsetX; + this.offsetY = options.offsetY || this.offsetY; }, /** @@ -4840,8 +4964,9 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return { type: this.type, coords: this.coords, - gradientUnits: this.gradientUnits, - colorStops: this.colorStops + colorStops: this.colorStops, + offsetX: this.offsetX, + offsetY: this.offsetY }; }, @@ -4852,7 +4977,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @param {Boolean} normalize Whether coords should be normalized * @return {String} SVG representation of an gradient (linear/radial) */ - toSVG: function(object, normalize) { + toSVG: function(object) { var coords = fabric.util.object.clone(this.coords), markup, commonAttributes; @@ -4861,17 +4986,19 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return a.offset - b.offset; }); - if (normalize && this.gradientUnits === 'userSpaceOnUse') { - coords.x1 += object.width / 2; - coords.y1 += object.height / 2; - coords.x2 += object.width / 2; - coords.y2 += object.height / 2; - } - else if (this.gradientUnits === 'objectBoundingBox') { - _convertValuesToPercentUnits(object, coords); + if (!(object.group && object.group.type === 'path-group')) { + for (var prop in coords) { + if (prop === 'x1' || prop === 'x2' || prop === 'r2') { + coords[prop] += this.offsetX - object.width / 2; + } + else if (prop === 'y1' || prop === 'y2') { + coords[prop] += this.offsetY - object.height / 2; + } + } } + commonAttributes = 'id="SVGID_' + this.id + - '" gradientUnits="' + this.gradientUnits + '"'; + '" gradientUnits="userSpaceOnUse"'; if (this.gradientTransform) { commonAttributes += ' gradientTransform="matrix(' + this.gradientTransform.join(' ') + ')" '; } @@ -4926,20 +5053,31 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @param {CanvasRenderingContext2D} ctx Context to render on * @return {CanvasGradient} */ - toLive: function(ctx) { - var gradient; + toLive: function(ctx, object) { + var gradient, coords = fabric.util.object.clone(this.coords); if (!this.type) { return; } + if (object.group && object.group.type === 'path-group') { + for (var prop in coords) { + if (prop === 'x1' || prop === 'x2') { + coords[prop] += -this.offsetX + object.width / 2; + } + else if (prop === 'y1' || prop === 'y2') { + coords[prop] += -this.offsetY + object.height / 2; + } + } + } + if (this.type === 'linear') { gradient = ctx.createLinearGradient( - this.coords.x1, this.coords.y1, this.coords.x2, this.coords.y2); + coords.x1, coords.y1, coords.x2, coords.y2); } else if (this.type === 'radial') { gradient = ctx.createRadialGradient( - this.coords.x1, this.coords.y1, this.coords.r1, this.coords.x2, this.coords.y2, this.coords.r2); + coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2); } for (var i = 0, len = this.colorStops.length; i < len; i++) { @@ -5010,7 +5148,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { gradientUnits = el.getAttribute('gradientUnits') || 'objectBoundingBox', gradientTransform = el.getAttribute('gradientTransform'), colorStops = [], - coords = { }; + coords = { }, ellipseMatrix; if (type === 'linear') { coords = getLinearCoords(el); @@ -5023,19 +5161,19 @@ fabric.ElementsParser.prototype.checkIfDone = function() { colorStops.push(getColorStop(colorStopEls[i])); } - _convertPercentUnitsToValues(instance, coords); + ellipseMatrix = _convertPercentUnitsToValues(instance, coords, gradientUnits); var gradient = new fabric.Gradient({ type: type, coords: coords, - gradientUnits: gradientUnits, - colorStops: colorStops + colorStops: colorStops, + offsetX: -instance.left, + offsetY: -instance.top }); - if (gradientTransform) { - gradient.gradientTransform = fabric.parseTransformAttribute(gradientTransform); + if (gradientTransform || ellipseMatrix !== '') { + gradient.gradientTransform = fabric.parseTransformAttribute((gradientTransform || '') + ellipseMatrix); } - return gradient; }, /* _FROM_SVG_END_ */ @@ -5049,7 +5187,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { */ forObject: function(obj, options) { options || (options = { }); - _convertPercentUnitsToValues(obj, options); + _convertPercentUnitsToValues(obj, options.coords, 'userSpaceOnUse'); return new fabric.Gradient(options); } }); @@ -5057,37 +5195,38 @@ fabric.ElementsParser.prototype.checkIfDone = function() { /** * @private */ - function _convertPercentUnitsToValues(object, options) { + function _convertPercentUnitsToValues(object, options, gradientUnits) { + var propValue, addFactor = 0, multFactor = 1, ellipseMatrix = ''; for (var prop in options) { + propValue = parseFloat(options[prop], 10); if (typeof options[prop] === 'string' && /^\d+%$/.test(options[prop])) { - var percents = parseFloat(options[prop], 10); - if (prop === 'x1' || prop === 'x2' || prop === 'r2') { - options[prop] = fabric.util.toFixed(object.width * percents / 100, 2) + object.left; - } - else if (prop === 'y1' || prop === 'y2') { - options[prop] = fabric.util.toFixed(object.height * percents / 100, 2) + object.top; - } + multFactor = 0.01; + } + else { + multFactor = 1; } - } - } - - /* _TO_SVG_START_ */ - /** - * @private - */ - function _convertValuesToPercentUnits(object, options) { - for (var prop in options) { - //convert to percent units if (prop === 'x1' || prop === 'x2' || prop === 'r2') { - options[prop] = fabric.util.toFixed((options[prop] - object.fill.origX) / object.width * 100, 2) + '%'; + multFactor *= gradientUnits === 'objectBoundingBox' ? object.width : 1; + addFactor = gradientUnits === 'objectBoundingBox' ? object.left || 0 : 0; } else if (prop === 'y1' || prop === 'y2') { - options[prop] = fabric.util.toFixed((options[prop] - object.fill.origY) / object.height * 100, 2) + '%'; + multFactor *= gradientUnits === 'objectBoundingBox' ? object.height : 1; + addFactor = gradientUnits === 'objectBoundingBox' ? object.top || 0 : 0; + } + options[prop] = propValue * multFactor + addFactor; + } + if (object.type === 'ellipse' && options.r2 !== null && gradientUnits === 'objectBoundingBox' && object.rx !== object.ry) { + var scaleFactor = object.ry/object.rx; + ellipseMatrix = ' scale(1, ' + scaleFactor + ')'; + if (options.y1) { + options.y1 /= scaleFactor; + } + if (options.y2) { + options.y2 /= scaleFactor; } } + return ellipseMatrix; } - /* _TO_SVG_END_ */ - })(); @@ -10974,8 +11113,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati if (this.group) { this.group.transform(ctx, fromLeft); } - ctx.globalAlpha = this.opacity; - var center = fromLeft ? this._getLeftTopCoords() : this.getCenterPoint(); ctx.translate(center.x, center.y); ctx.rotate(degreesToRadians(this.angle)); @@ -11196,12 +11333,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati if (this.group && this.group.type === 'path-group') { ctx.translate(-this.group.width/2, -this.group.height/2); - var m = this.transformMatrix; - if (m) { - ctx.transform.apply(ctx, m); + if (this.transformMatrix) { + ctx.transform.apply(ctx, this.transformMatrix); } } - ctx.globalAlpha = this.group ? (ctx.globalAlpha * this.opacity) : this.opacity; + this._setOpacity(ctx); this._setShadow(ctx); this.clipTo && fabric.util.clipContext(this, ctx); this._render(ctx, noTransform); @@ -11223,6 +11359,16 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati } }, + /* @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _setOpacity: function(ctx) { + if (this.group) { + this.group._setOpacity(ctx); + } + ctx.globalAlpha *= this.opacity; + }, + _setStrokeStyles: function(ctx) { if (this.stroke) { ctx.lineWidth = this.strokeWidth; @@ -11230,7 +11376,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati ctx.lineJoin = this.strokeLineJoin; ctx.miterLimit = this.strokeMiterLimit; ctx.strokeStyle = this.stroke.toLive - ? this.stroke.toLive(ctx) + ? this.stroke.toLive(ctx, this) : this.stroke; } }, @@ -11238,7 +11384,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati _setFillStyles: function(ctx) { if (this.fill) { ctx.fillStyle = this.fill.toLive - ? this.fill.toLive(ctx) + ? this.fill.toLive(ctx, this) : this.fill; } }, @@ -11310,15 +11456,15 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati } ctx.save(); + if (this.fill.gradientTransform) { + var g = this.fill.gradientTransform; + ctx.transform.apply(ctx, g); + } if (this.fill.toLive) { ctx.translate( -this.width / 2 + this.fill.offsetX || 0, -this.height / 2 + this.fill.offsetY || 0); } - if (this.fill.gradientTransform) { - var g = this.fill.gradientTransform; - ctx.transform.apply(ctx, g); - } if (this.fillRule === 'destination-over') { ctx.fill('evenodd'); } @@ -13748,8 +13894,8 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot 'use strict'; - var fabric = global.fabric || (global.fabric = { }), - piBy2 = Math.PI * 2, + var fabric = global.fabric || (global.fabric = { }), + pi = Math.PI, extend = fabric.util.object.extend; if (fabric.Circle) { @@ -13779,6 +13925,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ radius: 0, + /** + * Start angle of the circle, moving clockwise + * @type Number + * @default 0 + */ + startAngle: 0, + + /** + * End angle of the circle + * @type Number + * @default 2Pi + */ + endAngle: pi * 2, + /** * Constructor * @param {Object} [options] Options object @@ -13789,6 +13949,8 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.callSuper('initialize', options); this.set('radius', options.radius || 0); + this.startAngle = options.startAngle || this.startAngle; + this.endAngle = options.endAngle || this.endAngle; }, /** @@ -13814,7 +13976,9 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ toObject: function(propertiesToInclude) { return extend(this.callSuper('toObject', propertiesToInclude), { - radius: this.get('radius') + radius: this.get('radius'), + startAngle: this.startAngle, + endAngle: this.endAngle }); }, @@ -13825,20 +13989,41 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {String} svg representation of an instance */ toSVG: function(reviver) { - var markup = this._createBaseSVGMarkup(), x = 0, y = 0; - if (this.group) { - x = this.left + this.radius; - y = this.top + this.radius; + var markup = this._createBaseSVGMarkup(), x = 0, y = 0, + angle = (this.endAngle - this.startAngle) % ( 2 * pi); + + if (angle === 0) { + if (this.group && this.group.type === 'path-group') { + x = this.left + this.radius; + y = this.top + this.radius; + } + markup.push( + '\n' + ); } - markup.push( - '\n' - ); + '"/>\n' + ); + } return reviver ? reviver(markup.join('')) : markup.join(''); }, @@ -13851,7 +14036,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ _render: function(ctx, noTransform) { ctx.beginPath(); - ctx.arc(noTransform ? this.left + this.radius : 0, noTransform ? this.top + this.radius : 0, this.radius, 0, piBy2, false); + ctx.arc(noTransform ? this.left + this.radius : 0, noTransform ? this.top + this.radius : 0, this.radius, this.startAngle, this.endAngle, false); this._renderFill(ctx); this._renderStroke(ctx); }, @@ -14345,17 +14530,13 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot ry = this.ry ? Math.min(this.ry, this.height / 2) : 0, w = this.width, h = this.height, - x = noTransform ? this.left : 0, - y = noTransform ? this.top : 0, + x = noTransform ? this.left : -this.width / 2, + y = noTransform ? this.top : -this.height / 2, isRounded = rx !== 0 || ry !== 0, k = 1 - 0.5522847498 /* "magic number" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */; ctx.beginPath(); - if (!noTransform) { - ctx.translate(-this.width / 2, -this.height / 2); - } - ctx.moveTo(x + rx, y); ctx.lineTo(x + w - rx, y); @@ -14495,8 +14676,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot 'use strict'; - var fabric = global.fabric || (global.fabric = { }), - toFixed = fabric.util.toFixed; + var fabric = global.fabric || (global.fabric = { }); if (fabric.Polyline) { fabric.warn('fabric.Polyline is already defined'); @@ -14525,6 +14705,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ points: null, + /** + * Minimum X from points values, necessary to offset points + * @type Number + * @default + */ + minX: 0, + + /** + * Minimum Y from points values, necessary to offset points + * @type Number + * @default + */ + minY: 0, + /** * Constructor * @param {Array} points Array of points (where each point is an object with x and y) @@ -14545,19 +14739,22 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * top: 100 * }); */ - initialize: function(points, options, skipOffset) { - options = options || { }; - this.set('points', points); - this.callSuper('initialize', options); - this._calcDimensions(skipOffset); + initialize: function(points, options) { + return fabric.Polygon.prototype.initialize.call(this, points, options); }, /** * @private - * @param {Boolean} [skipOffset] Whether points offsetting should be skipped */ - _calcDimensions: function(skipOffset) { - return fabric.Polygon.prototype._calcDimensions.call(this, skipOffset); + _calcDimensions: function() { + return fabric.Polygon.prototype._calcDimensions.call(this); + }, + + /** + * @private + */ + _applyPointOffset: function() { + return fabric.Polygon.prototype._applyPointOffset.call(this); }, /** @@ -14576,23 +14773,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {String} svg representation of an instance */ toSVG: function(reviver) { - var points = [], - markup = this._createBaseSVGMarkup(); - - for (var i = 0, len = this.points.length; i < len; i++) { - points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); - } - - markup.push( - '\n' - ); - - return reviver ? reviver(markup.join('')) : markup.join(''); + return fabric.Polygon.prototype.toSVG.call(this, reviver); }, /* _TO_SVG_END_ */ @@ -14601,14 +14782,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {CanvasRenderingContext2D} ctx Context to render on */ _render: function(ctx) { - var point; - ctx.beginPath(); - ctx.moveTo(this.points[0].x, this.points[0].y); - for (var i = 0, len = this.points.length; i < len; i++) { - point = this.points[i]; - ctx.lineTo(point.x, point.y); - } - + fabric.Polygon.prototype.commonRender.call(this, ctx); this._renderFill(ctx); this._renderStroke(ctx); }, @@ -14667,7 +14841,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return null; } - return new fabric.Polyline(points, fabric.util.object.extend(parsedAttributes, options), true); + return new fabric.Polyline(points, fabric.util.object.extend(parsedAttributes, options)); }; /* _FROM_SVG_END_ */ @@ -14723,25 +14897,43 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ points: null, + /** + * Minimum X from points values, necessary to offset points + * @type Number + * @default + */ + minX: 0, + + /** + * Minimum Y from points values, necessary to offset points + * @type Number + * @default + */ + minY: 0, + /** * Constructor * @param {Array} points Array of points * @param {Object} [options] Options object - * @param {Boolean} [skipOffset] Whether points offsetting should be skipped * @return {fabric.Polygon} thisArg */ - initialize: function(points, options, skipOffset) { + initialize: function(points, options) { options = options || { }; this.points = points; this.callSuper('initialize', options); - this._calcDimensions(skipOffset); + this._calcDimensions(); + if (!('top' in options)) { + this.top = this.minY; + } + if (!('left' in options)) { + this.left = this.minX; + } }, /** * @private - * @param {Boolean} [skipOffset] Whether points offsetting should be skipped */ - _calcDimensions: function(skipOffset) { + _calcDimensions: function() { var points = this.points, minX = min(points, 'x'), @@ -14752,20 +14944,19 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.width = (maxX - minX) || 1; this.height = (maxY - minY) || 1; - this.minX = minX; + this.minX = minX, this.minY = minY; + }, - if (skipOffset) { - return; - } - - var halfWidth = this.width / 2 + this.minX, - halfHeight = this.height / 2 + this.minY; - + /** + * @private + */ + _applyPointOffset: function() { // change points to offset polygon into a bounding box + // executed one time this.points.forEach(function(p) { - p.x -= halfWidth; - p.y -= halfHeight; + p.x -= (this.minX + this.width / 2); + p.y -= (this.minY + this.height / 2); }, this); }, @@ -14795,7 +14986,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot } markup.push( - '\n' //jscs:enable validateIndentation @@ -15522,13 +15683,294 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @private */ _parseDimensions: function() { + var aX = [], aY = [], - previous = { }; + current, // current instruction + previous = null, + subpathStartX = 0, + subpathStartY = 0, + x = 0, // current x + y = 0, // current y + controlX = 0, // current control point x + controlY = 0, // current control point y + tempX, + tempY, + tempControlX, + tempControlY, + bounds; - this.path.forEach(function(item, i) { - this._getCoordsFromCommand(item, i, aX, aY, previous); - }, this); + for (var i = 0, len = this.path.length; i < len; ++i) { + + current = this.path[i]; + + switch (current[0]) { // first letter + + case 'l': // lineto, relative + x += current[1]; + y += current[2]; + bounds = [ ]; + break; + + case 'L': // lineto, absolute + x = current[1]; + y = current[2]; + bounds = [ ]; + break; + + case 'h': // horizontal lineto, relative + x += current[1]; + bounds = [ ]; + break; + + case 'H': // horizontal lineto, absolute + x = current[1]; + bounds = [ ]; + break; + + case 'v': // vertical lineto, relative + y += current[1]; + bounds = [ ]; + break; + + case 'V': // verical lineto, absolute + y = current[1]; + bounds = [ ]; + break; + + case 'm': // moveTo, relative + x += current[1]; + y += current[2]; + subpathStartX = x; + subpathStartY = y; + bounds = [ ]; + break; + + case 'M': // moveTo, absolute + x = current[1]; + y = current[2]; + subpathStartX = x; + subpathStartY = y; + bounds = [ ]; + break; + + case 'c': // bezierCurveTo, relative + tempX = x + current[5]; + tempY = y + current[6]; + controlX = x + current[3]; + controlY = y + current[4]; + bounds = fabric.util.getBoundsOfCurve(x, y, + x + current[1], // x1 + y + current[2], // y1 + controlX, // x2 + controlY, // y2 + tempX, + tempY + ); + x = tempX; + y = tempY; + break; + + case 'C': // bezierCurveTo, absolute + x = current[5]; + y = current[6]; + controlX = current[3]; + controlY = current[4]; + bounds = fabric.util.getBoundsOfCurve(x, y, + current[1], + current[2], + controlX, + controlY, + x, + y + ); + break; + + case 's': // shorthand cubic bezierCurveTo, relative + + // transform to absolute x,y + tempX = x + current[3]; + tempY = y + current[4]; + + // calculate reflection of previous control points + controlX = controlX ? (2 * x - controlX) : x; + controlY = controlY ? (2 * y - controlY) : y; + + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + x + current[1], + y + current[2], + tempX, + tempY + ); + // set control point to 2nd one of this command + // "... the first control point is assumed to be + // the reflection of the second control point on + // the previous command relative to the current point." + controlX = x + current[1]; + controlY = y + current[2]; + x = tempX; + y = tempY; + break; + + case 'S': // shorthand cubic bezierCurveTo, absolute + tempX = current[3]; + tempY = current[4]; + // calculate reflection of previous control points + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + current[1], + current[2], + tempX, + tempY + ); + x = tempX; + y = tempY; + // set control point to 2nd one of this command + // "... the first control point is assumed to be + // the reflection of the second control point on + // the previous command relative to the current point." + controlX = current[1]; + controlY = current[2]; + break; + + case 'q': // quadraticCurveTo, relative + // transform to absolute x,y + tempX = x + current[3]; + tempY = y + current[4]; + controlX = x + current[1]; + controlY = y + current[2]; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + tempX, + tempY + ); + x = tempX; + y = tempY; + break; + + case 'Q': // quadraticCurveTo, absolute + controlX = current[1]; + controlY = current[2]; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + current[3], + current[4] + ); + x = current[3]; + y = current[4]; + break; + + case 't': // shorthand quadraticCurveTo, relative + // transform to absolute x,y + tempX = x + current[1]; + tempY = y + current[2]; + if (previous[0].match(/[QqTt]/) === null) { + // If there is no previous command or if the previous command was not a Q, q, T or t, + // assume the control point is coincident with the current point + controlX = x; + controlY = y; + } + else if (previous[0] === 't') { + // calculate reflection of previous control points for t + controlX = 2 * x - tempControlX; + controlY = 2 * y - tempControlY; + } + else if (previous[0] === 'q') { + // calculate reflection of previous control points for q + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + } + + tempControlX = controlX; + tempControlY = controlY; + + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + tempX, + tempY + ); + x = tempX; + y = tempY; + controlX = x + current[1]; + controlY = y + current[2]; + break; + + case 'T': + tempX = current[1]; + tempY = current[2]; + // calculate reflection of previous control points + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + tempX, + tempY + ); + x = tempX; + y = tempY; + break; + + case 'a': + // TODO: optimize this + bounds = fabric.util.getBoundsOfArc(x, y, + current[1], + current[2], + current[3], + current[4], + current[5], + current[6] + x, + current[7] + y + ); + x += current[6]; + y += current[7]; + break; + + case 'A': + // TODO: optimize this + bounds = fabric.util.getBoundsOfArc(x, y, + current[1], + current[2], + current[3], + current[4], + current[5], + current[6], + current[7] + ); + x = current[6]; + y = current[7]; + break; + + case 'z': + case 'Z': + x = subpathStartX; + y = subpathStartY; + break; + } + previous = current; + bounds.forEach(function (point) { + aX.push(point.x); + aY.push(point.y); + }); + aX.push(x); + aY.push(y); + } var minX = min(aX), minY = min(aY), @@ -15538,63 +15980,13 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot deltaY = maxY - minY, o = { - left: this.left + (minX + deltaX / 2), - top: this.top + (minY + deltaY / 2), + left: minX, + top: minY, width: deltaX, height: deltaY }; return o; - }, - - _getCoordsFromCommand: function(item, i, aX, aY, previous) { - var isLowerCase = false; - - if (item[0] !== 'H') { - previous.x = (i === 0) ? getX(item) : getX(this.path[i - 1]); - } - if (item[0] !== 'V') { - previous.y = (i === 0) ? getY(item) : getY(this.path[i - 1]); - } - - // lowercased letter denotes relative position; - // transform to absolute - if (item[0] === item[0].toLowerCase()) { - isLowerCase = true; - } - - var xy = this._getXY(item, isLowerCase, previous), - val; - - val = parseInt(xy.x, 10); - if (!isNaN(val)) { - aX.push(val); - } - - val = parseInt(xy.y, 10); - if (!isNaN(val)) { - aY.push(val); - } - }, - - _getXY: function(item, isLowerCase, previous) { - - // last 2 items in an array of coordinates are the actualy x/y (except H/V), collect them - // TODO (kangax): support relative h/v commands - - var x = isLowerCase - ? previous.x + getX(item) - : item[0] === 'V' - ? previous.x - : getX(item), - - y = isLowerCase - ? previous.y + getY(item) - : item[0] === 'H' - ? previous.y - : getY(item); - - return { x: x, y: y }; } }); @@ -18389,6 +18781,19 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag } context.putImageData(imageData, 0, 0); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return { + color: this.color, + image: this.image, + mode: this.mode, + alpha: this.alpha + }; } }); @@ -19249,8 +19654,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag : (this.height/2) - (textLines.length * this.fontSize) - this._totalLineHeight; return { - textLeft: textLeft + (this.group ? this.left : 0), - textTop: textTop + (this.group ? this.top : 0), + textLeft: textLeft + (this.group && this.group.type === 'path-group' ? this.left : 0), + textTop: textTop + (this.group && this.group.type === 'path-group' ? this.top : 0), lineTop: lineTop }; }, @@ -21759,7 +22164,13 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ _keysMap: { 8: 'removeChars', + 9: 'exitEditing', + 27: 'exitEditing', 13: 'insertNewline', + 33: 'moveCursorUp', + 34: 'moveCursorDown', + 35: 'moveCursorRight', + 36: 'moveCursorLeft', 37: 'moveCursorLeft', 38: 'moveCursorUp', 39: 'moveCursorRight', @@ -21885,9 +22296,9 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (!this.isEditing || e.metaKey || e.ctrlKey) { return; } - - this.insertChars(String.fromCharCode(e.which)); - + if (e.which !== 0) { + this.insertChars(String.fromCharCode(e.which)); + } e.stopPropagation(); }, @@ -21913,7 +22324,7 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot cursorLocation = this.get2DCursorLocation(selectionProp); // if on last line, down cursor goes to end of line - if (cursorLocation.lineIndex === textLines.length - 1 || e.metaKey) { + if (cursorLocation.lineIndex === textLines.length - 1 || e.metaKey || e.keyCode === 34) { // move to the end of a text return this.text.length - selectionProp; @@ -22011,23 +22422,31 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this.selectionEnd = this.selectionStart; }, + /** + * private + */ + swapSelectionPoints: function() { + var swapSel = this.selectionEnd; + this.selectionEnd = this.selectionStart; + this.selectionStart = swapSel; + }, + /** * Moves cursor down while keeping selection * @param {Number} offset */ moveCursorDownWithShift: function(offset) { - if (this._selectionDirection === 'left' && (this.selectionStart !== this.selectionEnd)) { - this.selectionStart += offset; - this._selectionDirection = 'left'; - return; - } - else { + if (this.selectionEnd === this.selectionStart) { this._selectionDirection = 'right'; - this.selectionEnd += offset; - - if (this.selectionEnd > this.text.length) { - this.selectionEnd = this.text.length; - } + } + var prop = this._selectionDirection === 'right' ? 'selectionEnd' : 'selectionStart'; + this[prop] += offset; + if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'left') { + this.swapSelectionPoints(); + this._selectionDirection = 'right'; + } + if (this.selectionEnd > this.text.length) { + this.selectionEnd = this.text.length; } }, @@ -22039,9 +22458,8 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot getUpCursorOffset: function(e, isRight) { var selectionProp = isRight ? this.selectionEnd : this.selectionStart, cursorLocation = this.get2DCursorLocation(selectionProp); - // if on first line, up cursor goes to start of line - if (cursorLocation.lineIndex === 0 || e.metaKey) { + if (cursorLocation.lineIndex === 0 || e.metaKey || e.keyCode === 33) { return selectionProp; } @@ -22118,7 +22536,6 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this._currentCursorOpacity = 1; var offset = this.getUpCursorOffset(e, this._selectionDirection === 'right'); - if (e.shiftKey) { this.moveCursorUpWithShift(offset); } @@ -22134,26 +22551,18 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Number} offset */ moveCursorUpWithShift: function(offset) { - - if (this.selectionStart === this.selectionEnd) { - this.selectionStart -= offset; + if (this.selectionEnd === this.selectionStart) { + this._selectionDirection = 'left'; } - else { - if (this._selectionDirection === 'right') { - this.selectionEnd -= offset; - this._selectionDirection = 'right'; - return; - } - else { - this.selectionStart -= offset; - } + var prop = this._selectionDirection === 'right' ? 'selectionEnd' : 'selectionStart'; + this[prop] -= offset; + if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'right') { + this.swapSelectionPoints(); + this._selectionDirection = 'left'; } - if (this.selectionStart < 0) { this.selectionStart = 0; } - - this._selectionDirection = 'left'; }, /** @@ -22201,7 +22610,7 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (e.altKey) { this[prop] = this['findWordBoundary' + direction](this[prop]); } - else if (e.metaKey) { + else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { this[prop] = this['findLineBoundary' + direction](this[prop]); } else { diff --git a/dist/fabric.min.js b/dist/fabric.min.js index 2578189e..e69e6b23 100644 --- a/dist/fabric.min.js +++ b/dist/fabric.min.js @@ -1,7 +1,7 @@ -/* build: `node build.js modules=ALL exclude=gestures,cufon,json minifier=uglifyjs` *//*! Fabric.js Copyright 2008-2014, Printio (Juriy Zaytsev, Maxim Chernyak) */var fabric=fabric||{version:"1.4.11"};typeof exports!="undefined"&&(exports.fabric=fabric),typeof document!="undefined"&&typeof window!="undefined"?(fabric.document=document,fabric.window=window):(fabric.document=require("jsdom").jsdom(""),fabric.window=fabric.document.createWindow()),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode=typeof Buffer!="undefined"&&typeof window=="undefined",fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width"],fabric.DPI=96,function(){function e(e,t){if(!this.__eventListeners[e])return;t?fabric.util.removeFromArray(this.__eventListeners[e],t):this.__eventListeners[e].length=0}function t(e,t){this.__eventListeners||(this.__eventListeners={});if(arguments.length===1)for(var n in e)this.on(n,e[n]);else this.__eventListeners[e]||(this.__eventListeners[e]=[]),this.__eventListeners[e].push(t);return this}function n(t,n){if(!this.__eventListeners)return;if(arguments.length===0)this.__eventListeners={};else if(arguments.length===1&&typeof arguments[0]=="object")for(var r in t)e.call(this,r,t[r]);else e.call(this,t,n);return this}function r(e,t){if(!this.__eventListeners)return;var n=this.__eventListeners[e];if(!n)return;for(var r=0,i=n.length;r-1},complexity:function(){return this.getObjects().reduce(function(e,t){return e+=t.complexity?t.complexity():0,e},0)}},function(e){var t=Math.sqrt,n=Math.atan2,r=Math.PI/180;fabric.util={removeFromArray:function(e,t){var n=e.indexOf(t);return n!==-1&&e.splice(n,1),e},getRandomInt:function(e,t){return Math.floor(Math.random()*(t-e+1))+e},degreesToRadians:function(e){return e*r},radiansToDegrees:function(e){return e/r},rotatePoint:function(e,t,n){var r=Math.sin(n),i=Math.cos(n);e.subtractEquals(t);var s=e.x*i-e.y*r,o=e.x*r+e.y*i;return(new fabric.Point(s,o)).addEquals(t)},transformPoint:function(e,t,n){return n?new fabric.Point(t[0]*e.x+t[1]*e.y,t[2]*e.x+t[3]*e.y):new fabric.Point(t[0]*e.x+t[1]*e.y+t[4],t[2]*e.x+t[3]*e.y+t[5])},invertTransform:function(e){var t=e.slice(),n=1/(e[0]*e[3]-e[1]*e[2]);t=[n*e[3],-n*e[1],-n*e[2],n*e[0],0,0];var r=fabric.util.transformPoint({x:e[4],y:e[5]},t);return t[4]=-r.x,t[5]=-r.y,t},toFixed:function(e,t){return parseFloat(Number(e).toFixed(t))},parseUnit:function(e){var t=/\D{0,2}$/.exec(e),n=parseFloat(e);switch(t[0]){case"mm":return n*fabric.DPI/25.4;case"cm":return n*fabric.DPI/2.54;case"in":return n*fabric.DPI;case"pt":return n*fabric.DPI/72;case"pc":return n*fabric.DPI/72*12;default:return n}},falseFunction:function(){return!1},getKlass:function(e,t){return e=fabric.util.string.camelize(e.charAt(0).toUpperCase()+e.slice(1)),fabric.util.resolveNamespace(t)[e]},resolveNamespace:function(t){if(!t)return fabric;var n=t.split("."),r=n.length,i=e||fabric.window;for(var s=0;sr)r+=u[p++%h],r>l&&(r=l),e[d?"lineTo":"moveTo"](r,0),d=!d;e.restore()},createCanvasElement:function(e){return e||(e=fabric.document.createElement("canvas")),!e.getContext&&typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager.initElement(e),e},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(e){var t=e.prototype;for(var n=t.stateProperties.length;n--;){var r=t.stateProperties[n],i=r.charAt(0).toUpperCase()+r.slice(1),s="set"+i,o="get"+i;t[o]||(t[o]=function(e){return new Function('return this.get("'+e+'")')}(r)),t[s]||(t[s]=function(e){return new Function("value",'return this.set("'+e+'", value)')}(r))}},clipContext:function(e,t){t.save(),t.beginPath(),e.clipTo(t),t.clip()},multiplyTransformMatrices:function(e,t){var n=[[e[0],e[2],e[4]],[e[1],e[3],e[5]],[0,0,1]],r=[[t[0],t[2],t[4]],[t[1],t[3],t[5]],[0,0,1]],i=[];for(var s=0;s<3;s++){i[s]=[];for(var o=0;o<3;o++){var u=0;for(var a=0;a<3;a++)u+=n[s][a]*r[a][o];i[s][o]=u}}return[i[0][0],i[1][0],i[0][1],i[1][1],i[0][2],i[1][2]]},getFunctionBody:function(e){return(String(e).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},isTransparent:function(e,t,n,r){r>0&&(t>r?t-=r:t=0,n>r?n-=r:n=0);var i=!0,s=e.getImageData(t,n,r*2||1,r*2||1);for(var o=3,u=s.data.length;o0?_-=2*h:f===1&&_<0&&(_+=2*h);var D=Math.ceil(Math.abs(_/(h*.5))),P=[],H=_/D,B=8/3*Math.sin(H/4)*Math.sin(H/4)/Math.sin(H/2),j=M+H;for(var F=0;F=i?s-i:2*Math.PI-(i-s)}var e={},t={},n=Array.prototype.join;fabric.util.drawArc=function(e,t,n,i){var s=i[0],o=i[1],u=i[2],a=i[3],f=i[4],l=i[5],c=i[6],h=[[],[],[],[]],p=r(l-t,c-n,s,o,a,f,u);for(var d=0,v=p.length;d=t})}function r(e,t){return i(e,t,function(e,t){return e>>0;if(n===0)return-1;var r=0;arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:r!==0&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r))));if(r>=n)return-1;var i=r>=0?r:Math.max(n-Math.abs(r),0);for(;i>>0;n>>0;r>>0;n>>0;n>>0;i>>0,n=0,r;if(arguments.length>1)r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:e,capitalize:t,escapeXml:n}}(),function(){var e=Array.prototype.slice,t=Function.prototype.apply,n=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var i=this,s=e.call(arguments,1),o;return s.length?o=function(){return t.call(i,this instanceof n?this:r,s.concat(e.call(arguments)))}:o=function(){return t.call(i,this instanceof n?this:r,arguments)},n.prototype=this.prototype,o.prototype=new n,o})}(),function(){function i(){}function s(t){var n=this.constructor.superclass.prototype[t];return arguments.length>1?n.apply(this,e.call(arguments,1)):n.call(this)}function o(){function u(){this.initialize.apply(this,arguments)}var n=null,o=e.call(arguments,0);typeof o[0]=="function"&&(n=o.shift()),u.superclass=n,u.subclasses=[],n&&(i.prototype=n.prototype,u.prototype=new i,n.subclasses.push(u));for(var a=0,f=o.length;a-1?e.prototype[i]=function(e){return function(){var n=this.constructor.superclass;this.constructor.superclass=r;var i=t[e].apply(this,arguments);this.constructor.superclass=n;if(e!=="initialize")return i}}(i):e.prototype[i]=t[i],n&&(t.toString!==Object.prototype.toString&&(e.prototype.toString=t.toString),t.valueOf!==Object.prototype.valueOf&&(e.prototype.valueOf=t.valueOf))};fabric.util.createClass=o}(),function(){function t(e){var t=Array.prototype.slice.call(arguments,1),n,r,i=t.length;for(r=0;r-1?s(e,t.match(/opacity:\s*(\d?\.?\d*)/)[1]):e;for(var r in t)if(r==="opacity")s(e,t[r]);else{var i=r==="float"||r==="cssFloat"?typeof n.styleFloat=="undefined"?"cssFloat":"styleFloat":r;n[i]=t[r]}return e}var t=fabric.document.createElement("div"),n=typeof t.style.opacity=="string",r=typeof t.style.filter=="string",i=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(e){return e};n?s=function(e,t){return e.style.opacity=t,e}:r&&(s=function(e,t){var n=e.style;return e.currentStyle&&!e.currentStyle.hasLayout&&(n.zoom=1),i.test(n.filter)?(t=t>=.9999?"":"alpha(opacity="+t*100+")",n.filter=n.filter.replace(i,t)):n.filter+=" alpha(opacity="+t*100+")",e}),fabric.util.setStyle=e}(),function(){function t(e){return typeof e=="string"?fabric.document.getElementById(e):e}function s(e,t){var n=fabric.document.createElement(e);for(var r in t)r==="class"?n.className=t[r]:r==="for"?n.htmlFor=t[r]:n.setAttribute(r,t[r]);return n}function o(e,t){e&&(" "+e.className+" ").indexOf(" "+t+" ")===-1&&(e.className+=(e.className?" ":"")+t)}function u(e,t,n){return typeof t=="string"&&(t=s(t,n)),e.parentNode&&e.parentNode.replaceChild(t,e),t.appendChild(e),t}function a(e,t){var n,r,i=0,s=0,o=fabric.document.documentElement,u=fabric.document.body||{scrollLeft:0,scrollTop:0};r=e;while(e&&e.parentNode&&!n)e=e.parentNode,e!==fabric.document&&fabric.util.getElementStyle(e,"position")==="fixed"&&(n=e),e!==fabric.document&&r!==t&&fabric.util.getElementStyle(e,"position")==="absolute"?(i=0,s=0):e===fabric.document?(i=u.scrollLeft||o.scrollLeft||0,s=u.scrollTop||o.scrollTop||0):(i+=e.scrollLeft||0,s+=e.scrollTop||0);return{left:i,top:s}}function f(e){var t,n=e&&e.ownerDocument,r={left:0,top:0},i={left:0,top:0},s,o={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!n)return{left:0,top:0};for(var u in o)i[o[u]]+=parseInt(l(e,u),10)||0;return t=n.documentElement,typeof e.getBoundingClientRect!="undefined"&&(r=e.getBoundingClientRect()),s=fabric.util.getScrollLeftTop(e,null),{left:r.left+s.left-(t.clientLeft||0)+i.left,top:r.top+s.top-(t.clientTop||0)+i.top}}var e=Array.prototype.slice,n,r=function(t){return e.call(t,0)};try{n=r(fabric.document.childNodes)instanceof Array}catch(i){}n||(r=function(e){var t=new Array(e.length),n=e.length;while(n--)t[n]=e[n];return t});var l;fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?l=function(e,t){return fabric.document.defaultView.getComputedStyle(e,null)[t]}:l=function(e,t){var n=e.style[t];return!n&&e.currentStyle&&(n=e.currentStyle[t]),n},function(){function n(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=fabric.util.falseFunction),t?e.style[t]="none":typeof e.unselectable=="string"&&(e.unselectable="on"),e}function r(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=null),t?e.style[t]="":typeof e.unselectable=="string"&&(e.unselectable=""),e}var e=fabric.document.documentElement.style,t="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=n,fabric.util.makeElementSelectable=r}(),function(){function e(e,t){var n=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),i=!0;r.onload=r.onreadystatechange=function(e){if(i){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")return;i=!1,t(e||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=e,n.appendChild(r)}fabric.util.getScript=e}(),fabric.util.getById=t,fabric.util.toArray=r,fabric.util.makeElement=s,fabric.util.addClass=o,fabric.util.wrapElement=u,fabric.util.getScrollLeftTop=a,fabric.util.getElementOffset=f,fabric.util.getElementStyle=l}(),function(){function e(e,t){return e+(/\?/.test(e)?"&":"?")+t}function n(){}function r(r,i){i||(i={});var s=i.method?i.method.toUpperCase():"GET",o=i.onComplete||function(){},u=t(),a;return u.onreadystatechange=function(){u.readyState===4&&(o(u),u.onreadystatechange=n)},s==="GET"&&(a=null,typeof i.parameters=="string"&&(r=e(r,i.parameters))),u.open(s,r,!0),(s==="POST"||s==="PUT")&&u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(a),u}var t=function(){var e=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}];for(var t=e.length;t--;)try{var n=e[t]();if(n)return e[t]}catch(r){}}();fabric.util.request=r}(),fabric.log=function(){},fabric.warn=function(){},typeof console!="undefined"&&["log","warn"].forEach(function(e){typeof console[e]!="undefined"&&console[e].apply&&(fabric[e]=function(){return console[e].apply(console,arguments)})}),function(){function e(e){n(function(t){e||(e={});var r=t||+(new Date),i=e.duration||500,s=r+i,o,u=e.onChange||function(){},a=e.abort||function(){return!1},f=e.easing||function(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t},l="startValue"in e?e.startValue:0,c="endValue"in e?e.endValue:100,h=e.byValue||c-l;e.onStart&&e.onStart(),function p(t){o=t||+(new Date);var c=o>s?i:o-r;if(a()){e.onComplete&&e.onComplete();return}u(f(c,l,h,i));if(o>s){e.onComplete&&e.onComplete();return}n(p)}(r)})}function n(){return t.apply(fabric.window,arguments)}var t=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(e){fabric.window.setTimeout(e,1e3/60)};fabric.util.animate=e,fabric.util.requestAnimFrame=n}(),function(){function e(e,t,n,r){return et[3]?t[3]:t[0];if(t[0]===1&&t[3]===1&&t[4]===0&&t[5]===0)return;var n=e.ownerDocument.createElement("g");while(e.firstChild!=null)n.appendChild(e.firstChild);n.setAttribute("transform","matrix("+t[0]+" "+t[1]+" "+t[2]+" "+t[3]+" "+t[4]+" "+t[5]+")"),e.appendChild(n)}function x(e){var n=e.objects,i=e.options;return n=n.map(function(e){return t[r(e.type)].fromObject(e)}),{objects:n,options:i}}function T(e,t,n){t[n]&&t[n].toSVG&&e.push('','')}var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.string.capitalize,i=t.util.object.clone,s=t.util.toFixed,o=t.util.parseUnit,u=t.util.multiplyTransformMatrices,a={cx:"left",x:"left",r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","stroke-dasharray":"strokeDashArray","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"originX"},f={stroke:"strokeOpacity",fill:"fillOpacity"};t.parseTransformAttribute=function(){function e(e,t){var n=t[0];e[0]=Math.cos(n),e[1]=Math.sin(n),e[2]=-Math.sin(n),e[3]=Math.cos(n)}function n(e,t){var n=t[0],r=t.length===2?t[1]:t[0];e[0]=n,e[3]=r}function r(e,t){e[2]=t[0]}function i(e,t){e[1]=t[0]}function s(e,t){e[4]=t[0],t.length===2&&(e[5]=t[1])}var o=[1,0,0,1,0,0],u="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",a="(?:\\s+,?\\s*|,\\s*)",f="(?:(skewX)\\s*\\(\\s*("+u+")\\s*\\))",l="(?:(skewY)\\s*\\(\\s*("+u+")\\s*\\))",c="(?:(rotate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+")"+a+"("+u+"))?\\s*\\))",h="(?:(scale)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",p="(?:(translate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",d="(?:(matrix)\\s*\\(\\s*("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+"\\s*\\))",v="(?:"+d+"|"+p+"|"+h+"|"+c+"|"+f+"|"+l+")",m="(?:"+v+"(?:"+a+v+")*"+")",g="^\\s*(?:"+m+"?)\\s*$",y=new RegExp(g),b=new RegExp(v,"g");return function(u){var a=o.concat(),f=[];if(!u||u&&!y.test(u))return a;u.replace(b,function(u){var l=(new RegExp(v)).exec(u).filter(function(e){return e!==""&&e!=null}),c=l[1],h=l.slice(2).map(parseFloat);switch(c){case"translate":s(a,h);break;case"rotate":h[0]=t.util.degreesToRadians(h[0]),e(a,h);break;case"scale":n(a,h);break;case"skewX":r(a,h);break;case"skewY":i(a,h);break;case"matrix":a=h}f.push(a.concat()),a=o.concat()});var l=f[0];while(f.length>1)f.shift(),l=t.util.multiplyTransformMatrices(l,f[0]);return l}}(),t.parseSVGDocument=function(){function s(e,t){while(e&&(e=e.parentNode))if(t.test(e.nodeName))return!0;return!1}var e=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/,n="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",r=new RegExp("^\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*"+"$");return function(n,u,a){if(!n)return;var f=new Date;w(n);var l=n.getAttribute("viewBox"),c=o(n.getAttribute("width")||"100%"),h=o(n.getAttribute("height")||"100%"),p,d;if(l&&(l=l.match(r))){var v=parseFloat(l[1]),m=parseFloat(l[2]),g=1,y=1;p=parseFloat(l[3]),d=parseFloat(l[4]),c&&c!==p&&(g=c/p),h&&h!==d&&(y=h/d),E(n,[g,0,0,y,g*-v,y*-m])}var b=t.util.toArray(n.getElementsByTagName("*"));if(b.length===0&&t.isLikelyNode){b=n.selectNodes('//*[name(.)!="svg"]');var S=[];for(var x=0,T=b.length;x/i,"")));if(!s||!s.documentElement)return;t.parseSVGDocument(s.documentElement,function(r,i){S.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),S.has(e,function(r){r?S.get(e,function(e){var t=x(e);n(t.objects,t.options)}):new t -.util.request(e,{method:"get",onComplete:i})})},loadSVGFromString:function(e,n,r){e=e.trim();var i;if(typeof DOMParser!="undefined"){var s=new DOMParser;s&&s.parseFromString&&(i=s.parseFromString(e,"text/xml"))}else t.window.ActiveXObject&&(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(e.replace(//i,"")));t.parseSVGDocument(i.documentElement,function(e,t){n(e,t)},r)},createSVGFontFacesMarkup:function(e){var t="";for(var n=0,r=e.length;n',"",""].join("")),t},createSVGRefElementsMarkup:function(e){var t=[];return T(t,e,"backgroundColor"),T(t,e,"overlayColor"),t.join("")}})}(typeof exports!="undefined"?exports:this),fabric.ElementsParser=function(e,t,n,r){this.elements=e,this.callback=t,this.options=n,this.reviver=r},fabric.ElementsParser.prototype.parse=function(){this.instances=new Array(this.elements.length),this.numElements=this.elements.length,this.createObjects()},fabric.ElementsParser.prototype.createObjects=function(){for(var e=0,t=this.elements.length;ee.x&&this.y>e.y},gte:function(e){return this.x>=e.x&&this.y>=e.y},lerp:function(e,t){return new n(this.x+(e.x-this.x)*t,this.y+(e.y-this.y)*t)},distanceFrom:function(e){var t=this.x-e.x,n=this.y-e.y;return Math.sqrt(t*t+n*n)},midPointFrom:function(e){return new n(this.x+(e.x-this.x)/2,this.y+(e.y-this.y)/2)},min:function(e){return new n(Math.min(this.x,e.x),Math.min(this.y,e.y))},max:function(e){return new n(Math.max(this.x,e.x),Math.max(this.y,e.y))},toString:function(){return this.x+","+this.y},setXY:function(e,t){this.x=e,this.y=t},setFromPoint:function(e){this.x=e.x,this.y=e.y},swap:function(e){var t=this.x,n=this.y;this.x=e.x,this.y=e.y,e.x=t,e.y=n}}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){this.status=e,this.points=[]}var t=e.fabric||(e.fabric={});if(t.Intersection){t.warn("fabric.Intersection is already defined");return}t.Intersection=n,t.Intersection.prototype={appendPoint:function(e){this.points.push(e)},appendPoints:function(e){this.points=this.points.concat(e)}},t.Intersection.intersectLineLine=function(e,r,i,s){var o,u=(s.x-i.x)*(e.y-i.y)-(s.y-i.y)*(e.x-i.x),a=(r.x-e.x)*(e.y-i.y)-(r.y-e.y)*(e.x-i.x),f=(s.y-i.y)*(r.x-e.x)-(s.x-i.x)*(r.y-e.y);if(f!==0){var l=u/f,c=a/f;0<=l&&l<=1&&0<=c&&c<=1?(o=new n("Intersection"),o.points.push(new t.Point(e.x+l*(r.x-e.x),e.y+l*(r.y-e.y)))):o=new n}else u===0||a===0?o=new n("Coincident"):o=new n("Parallel");return o},t.Intersection.intersectLinePolygon=function(e,t,r){var i=new n,s=r.length;for(var o=0;o0&&(i.status="Intersection"),i},t.Intersection.intersectPolygonPolygon=function(e,t){var r=new n,i=e.length;for(var s=0;s0&&(r.status="Intersection"),r},t.Intersection.intersectPolygonRectangle=function(e,r,i){var s=r.min(i),o=r.max(i),u=new t.Point(o.x,s.y),a=new t.Point(s.x,o.y),f=n.intersectLinePolygon(s,u,e),l=n.intersectLinePolygon(u,o,e),c=n.intersectLinePolygon(o,a,e),h=n.intersectLinePolygon(a,s,e),p=new n;return p.appendPoints(f.points),p.appendPoints(l.points),p.appendPoints(c.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){e?this._tryParsingColor(e):this.setSource([0,0,0,1])}function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var t=e.fabric||(e.fabric={});if(t.Color){t.warn("fabric.Color is already defined.");return}t.Color=n,t.Color.prototype={_tryParsingColor:function(e){var t;e in n.colorNameMap&&(e=n.colorNameMap[e]);if(e==="transparent"){this.setSource([255,255,255,0]);return}t=n.sourceFromHex(e),t||(t=n.sourceFromRgb(e)),t||(t=n.sourceFromHsl(e)),t&&this.setSource(t)},_rgbToHsl:function(e,n,r){e/=255,n/=255,r/=255;var i,s,o,u=t.util.array.max([e,n,r]),a=t.util.array.min([e,n,r]);o=(u+a)/2;if(u===a)i=s=0;else{var f=u-a;s=o>.5?f/(2-u-a):f/(u+a);switch(u){case e:i=(n-r)/f+(n\n']:this.type==="radial"&&(r=["\n']);for(var o=0;o\n');return r.push(this.type==="linear"?"\n":"\n"),r.join("")},toLive:function(e){var t;if(!this.type)return;this.type==="linear"?t=e.createLinearGradient(this.coords.x1,this.coords.y1,this.coords.x2,this.coords.y2):this.type==="radial"&&(t=e.createRadialGradient(this.coords.x1,this.coords.y1,this.coords.r1,this.coords.x2,this.coords.y2,this.coords.r2));for(var n=0,r=this.colorStops.length;n'+''+""},toLive:function(e){var t=typeof this.source=="function"?this.source():this.source;if(!t)return"";if(typeof t.src!="undefined"){if(!t.complete)return"";if(t.naturalWidth===0||t.naturalHeight===0)return""}return e.createPattern(t,this.repeat)}}),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Shadow){t.warn("fabric.Shadow is already defined.");return}t.Shadow=t.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(e){typeof e=="string"&&(e=this._parseShadow(e));for(var n in e)this[n]=e[n];this.id=t.Object.__uid++},_parseShadow:function(e){var n=e.trim(),r=t.Shadow.reOffsetsAndBlur.exec(n)||[],i=n.replace(t.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)";return{color:i.trim(),offsetX:parseInt(r[1],10)||0,offsetY:parseInt(r[2],10)||0,blur:parseInt(r[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(e){var t="SourceAlpha";return e&&(e.fill===this.color||e.stroke===this.color)&&(t="SourceGraphic"),''+''+''+""+""+''+""+""},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY};var e={},n=t.Shadow.prototype;return this.color!==n.color&&(e.color=this.color),this.blur!==n.blur&&(e.blur=this.blur),this.offsetX!==n.offsetX&&(e.offsetX=this.offsetX),this.offsetY!==n.offsetY&&(e.offsetY=this.offsetY),e}}),t.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/}(typeof exports!="undefined"?exports:this),function(){"use strict";if(fabric.StaticCanvas){fabric.warn("fabric.StaticCanvas is already defined.");return}var e=fabric.util.object.extend,t=fabric.util.getElementOffset,n=fabric.util.removeFromArray,r=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass({initialize:function(e,t){t||(t={}),this._initStatic(e,t),fabric.StaticCanvas.activeInstance=this},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!0,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:[1,0,0,1,0,0],onBeforeScaleRotate:function(){},_initStatic:function(e,t){this._objects=[],this._createLowerCanvas(e),this._initOptions(t),this._setImageSmoothing(),t.overlayImage&&this.setOverlayImage(t.overlayImage,this.renderAll.bind(this)),t.backgroundImage&&this.setBackgroundImage(t.backgroundImage,this.renderAll.bind(this)),t.backgroundColor&&this.setBackgroundColor(t.backgroundColor,this.renderAll.bind(this)),t.overlayColor&&this.setOverlayColor(t.overlayColor,this.renderAll.bind(this)),this.calcOffset()},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(e,t,n){return this.__setBgOverlayImage("overlayImage",e,t,n)},setBackgroundImage:function(e,t,n){return this.__setBgOverlayImage("backgroundImage",e,t,n)},setOverlayColor:function(e,t){return this.__setBgOverlayColor("overlayColor",e,t)},setBackgroundColor:function(e,t){return this.__setBgOverlayColor("backgroundColor",e,t)},_setImageSmoothing:function(){var e=this.getContext();e.imageSmoothingEnabled=this.imageSmoothingEnabled,e.webkitImageSmoothingEnabled=this.imageSmoothingEnabled,e.mozImageSmoothingEnabled=this.imageSmoothingEnabled,e.msImageSmoothingEnabled=this.imageSmoothingEnabled,e.oImageSmoothingEnabled=this.imageSmoothingEnabled},__setBgOverlayImage:function(e,t,n,r){return typeof t=="string"?fabric.util.loadImage(t,function(t){this[e]=new fabric.Image(t,r),n&&n()},this):(this[e]=t,n&&n()),this},__setBgOverlayColor:function(e,t,n){if(t&&t.source){var r=this;fabric.util.loadImage(t.source,function(i){r[e]=new fabric.Pattern({source:i,repeat:t.repeat,offsetX:t.offsetX,offsetY:t.offsetY}),n&&n()})}else this[e]=t,n&&n();return this},_createCanvasElement:function(){var e=fabric.document.createElement("canvas");e.style||(e.style={});if(!e)throw r;return this._initCanvasElement(e),e},_initCanvasElement:function(e){fabric.util.createCanvasElement(e);if(typeof e.getContext=="undefined")throw r},_initOptions:function(e){for(var t in e)this[t]=e[t];this.width=this.width||parseInt(this.lowerCanvasEl.width,10)||0,this.height=this.height||parseInt(this.lowerCanvasEl.height,10)||0;if(!this.lowerCanvasEl.style)return;this.lowerCanvasEl.width=this.width,this.lowerCanvasEl.height=this.height,this.lowerCanvasEl.style.width=this.width+"px",this.lowerCanvasEl.style.height=this.height+"px",this.viewportTransform=this.viewportTransform.slice()},_createLowerCanvas:function(e){this.lowerCanvasEl=fabric.util.getById(e)||this._createCanvasElement(),this._initCanvasElement(this.lowerCanvasEl),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(e,t){return this.setDimensions({width:e},t)},setHeight:function(e,t){return this.setDimensions({height:e},t)},setDimensions:function(e,t){var n;t=t||{};for(var r in e)n=e[r],t.cssOnly||(this._setBackstoreDimension(r,e[r]),n+="px"),t.backstoreOnly||this._setCssDimension(r,n);return t.cssOnly||this.renderAll(),this.calcOffset(),this},_setBackstoreDimension:function(e,t){return this.lowerCanvasEl[e]=t,this.upperCanvasEl&&(this.upperCanvasEl[e]=t),this.cacheCanvasEl&&(this.cacheCanvasEl[e]=t),this[e]=t,this},_setCssDimension:function(e,t){return this.lowerCanvasEl.style[e]=t,this.upperCanvasEl&&(this.upperCanvasEl.style[e]=t),this.wrapperEl&&(this.wrapperEl.style[e]=t),this},getZoom:function(){return Math.sqrt(this.viewportTransform[0]*this.viewportTransform[3])},setViewportTransform:function(e){this.viewportTransform=e,this.renderAll();for(var t=0,n=this._objects.length;t"),n.join("")},_setSVGPreamble:function(e,t){t.suppressPreamble||e.push('','\n')},_setSVGHeader:function(e,t){var n,r,i;t.viewBox?(n=t.viewBox.width,r=t.viewBox.height):(n=this.width,r=this.height,this.svgViewportTransformation||(i=this.viewportTransform,n/=i[0],r/=i[3])),e.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),"")},_setSVGObjects:function(e,t){var n=this.getActiveGroup();n&&this.discardActiveGroup();for(var r=0,i=this.getObjects(),s=i.length;r"):this[t]&&t==="overlayColor"&&e.push('")},sendToBack:function(e){return n(this._objects,e),this._objects.unshift(e),this.renderAll&&this.renderAll()},bringToFront:function(e){return n(this._objects,e),this._objects.push(e),this.renderAll&&this.renderAll()},sendBackwards:function(e,t){var r=this._objects.indexOf(e);if(r!==0){var i=this._findNewLowerIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewLowerIndex:function(e,t,n){var r;if(n){r=t;for(var i=t-1;i>=0;--i){var s=e.intersectsWithObject(this._objects[i])||e.isContainedWithinObject(this._objects[i])||this._objects[i].isContainedWithinObject(e);if(s){r=i;break}}}else r=t-1;return r},bringForward:function(e,t){var r=this._objects.indexOf(e);if(r!==this._objects.length-1){var i=this._findNewUpperIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewUpperIndex:function(e,t,n){var r;if(n){r=t;for(var i=t+1;i"}}),e(fabric.StaticCanvas.prototype,fabric.Observable),e(fabric.StaticCanvas.prototype,fabric.Collection),e(fabric.StaticCanvas.prototype,fabric.DataURLExporter),e(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(e){var t=fabric.util.createCanvasElement();if(!t||!t.getContext)return null;var n=t.getContext("2d");if(!n)return null;switch(e){case"getImageData":return typeof n.getImageData!="undefined";case"setLineDash":return typeof n.setLineDash!="undefined";case"toDataURL":return typeof t.toDataURL!="undefined";case"toDataURLWithQuality":try{return t.toDataURL("image/jpeg",0),!0}catch(r){}return!1;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",setShadow:function(e){return this.shadow=new fabric.Shadow(e),this},_setBrushStyles:function(){var e=this.canvas.contextTop;e.strokeStyle=this.color,e.lineWidth=this.width,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin},_setShadow:function(){if(!this.shadow)return;var e=this.canvas.contextTop;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_resetShadow:function(){var e=this.canvas.contextTop;e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0}}),function(){var e=fabric.util.array.min,t=fabric.util.array.max;fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(e){this.canvas=e,this._points=[]},onMouseDown:function(e){this._prepareForDrawing(e),this._captureDrawingPath -(e),this._render()},onMouseMove:function(e){this._captureDrawingPath(e),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(e){var t=new fabric.Point(e.x,e.y);this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)},_addPoint:function(e){this._points.push(e)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(e){var t=new fabric.Point(e.x,e.y);this._addPoint(t)},_render:function(){var e=this.canvas.contextTop,t=this.canvas.viewportTransform,n=this._points[0],r=this._points[1];e.save(),e.transform(t[0],t[1],t[2],t[3],t[4],t[5]),e.beginPath(),this._points.length===2&&n.x===r.x&&n.y===r.y&&(n.x-=.5,r.x+=.5),e.moveTo(n.x,n.y);for(var i=1,s=this._points.length;in.padding?e.x<0?e.x+=n.padding:e.x-=n.padding:e.x=0,i(e.y)>n.padding?e.y<0?e.y+=n.padding:e.y-=n.padding:e.y=0},_rotateObject:function(e,t){var i=this._currentTransform;if(i.target.get("lockRotation"))return;var s=r(i.ey-i.top,i.ex-i.left),o=r(t-i.top,e-i.left),u=n(o-s+i.theta);u<0&&(u=360+u),i.target.angle=u},setCursor:function(e){this.upperCanvasEl.style.cursor=e},_resetObjectTransform:function(e){e.scaleX=1,e.scaleY=1,e.setAngle(0)},_drawSelection:function(){var e=this.contextTop,t=this._groupSelector,n=t.left,r=t.top,o=i(n),u=i(r);e.fillStyle=this.selectionColor,e.fillRect(t.ex-(n>0?0:-n),t.ey-(r>0?0:-r),o,u),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var a=t.ex+s-(n>0?0:o),f=t.ey+s-(r>0?0:u);e.beginPath(),fabric.util.drawDashedLine(e,a,f,a+o,f,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f+u-1,a+o,f+u-1,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f,a,f+u,this.selectionDashArray),fabric.util.drawDashedLine(e,a+o-1,f,a+o-1,f+u,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+s-(n>0?0:o),t.ey+s-(r>0?0:u),o,u)},_isLastRenderedObject:function(e){return this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay.visible&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(this.getPointer(e,!0))},findTarget:function(e,t){if(this.skipTargetFind)return;if(this._isLastRenderedObject(e))return this.lastRenderedObjectWithControlsAboveOverlay;var n=this.getActiveGroup();if(n&&!t&&this.containsPoint(e,n))return n;var r=this._searchPossibleTargets(e);return this._fireOverOutEvents(r),r},_fireOverOutEvents:function(e){e?this._hoveredTarget!==e&&(this.fire("mouse:over",{target:e}),e.fire("mouseover"),this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget}),this._hoveredTarget.fire("mouseout")),this._hoveredTarget=e):this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget}),this._hoveredTarget.fire("mouseout"),this._hoveredTarget=null)},_checkTarget:function(e,t,n){if(t&&t.visible&&t.evented&&this.containsPoint(e,t)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||!!t.isEditing)return!0;var r=this.isTargetTransparent(t,n.x,n.y);if(!r)return!0}},_searchPossibleTargets:function(e){var t,n=this.getPointer(e,!0),r=this._objects.length;while(r--)if(this._checkTarget(e,this._objects[r],n)){this.relatedTarget=this._objects[r],t=this._objects[r];break}return t},getPointer:function(t,n,r){r||(r=this.upperCanvasEl);var i=e(t,r),s=r.getBoundingClientRect(),o;return this.calcOffset(),i.x=i.x-this._offset.left,i.y=i.y-this._offset.top,n||(i=fabric.util.transformPoint(i,fabric.util.invertTransform(this.viewportTransform))),s.width===0||s.height===0?o={width:1,height:1}:o={width:r.width/s.width,height:r.height/s.height},{x:i.x*o.width,y:i.y*o.height}},_createUpperCanvas:function(){var e=this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/,"");this.upperCanvasEl=this._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+e),this.wrapperEl.appendChild(this.upperCanvasEl),this._copyCanvasStyle(this.lowerCanvasEl,this.upperCanvasEl),this._applyCanvasStyle(this.upperCanvasEl),this.contextTop=this.upperCanvasEl.getContext("2d")},_createCacheCanvas:function(){this.cacheCanvasEl=this._createCanvasElement(),this.cacheCanvasEl.setAttribute("width",this.width),this.cacheCanvasEl.setAttribute("height",this.height),this.contextCache=this.cacheCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{"class":this.containerClass}),fabric.util.setStyle(this.wrapperEl,{width:this.getWidth()+"px",height:this.getHeight()+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(e){var t=this.getWidth()||e.width,n=this.getHeight()||e.height;fabric.util.setStyle(e,{position:"absolute",width:t+"px",height:n+"px",left:0,top:0}),e.width=t,e.height=n,fabric.util.makeElementUnselectable(e)},_copyCanvasStyle:function(e,t){t.style.cssText=e.style.cssText},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},_setActiveObject:function(e){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=e,e.set("active",!0)},setActiveObject:function(e,t){return this._setActiveObject(e),this.renderAll(),this.fire("object:selected",{target:e,e:t}),e.fire("selected",{e:t}),this},getActiveObject:function(){return this._activeObject},_discardActiveObject:function(){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=null},discardActiveObject:function(e){return this._discardActiveObject(),this.renderAll(),this.fire("selection:cleared",{e:e}),this},_setActiveGroup:function(e){this._activeGroup=e,e&&e.set("active",!0)},setActiveGroup:function(e,t){return this._setActiveGroup(e),e&&(this.fire("object:selected",{target:e,e:t}),e.fire("selected",{e:t})),this},getActiveGroup:function(){return this._activeGroup},_discardActiveGroup:function(){var e=this.getActiveGroup();e&&e.destroy(),this.setActiveGroup(null)},discardActiveGroup:function(e){return this._discardActiveGroup(),this.fire("selection:cleared",{e:e}),this},deactivateAll:function(){var e=this.getObjects(),t=0,n=e.length;for(;t1&&(t=new fabric.Group(t.reverse(),{originX:"center",originY:"center",canvas:this}),t.addWithUpdate(),this.setActiveGroup(t,e),t.saveCoords(),this.fire("selection:created",{target:t}),this.renderAll())},_collectObjects:function(){var n=[],r,i=this._groupSelector.ex,s=this._groupSelector.ey,o=i+this._groupSelector.left,u=s+this._groupSelector.top,a=new fabric.Point(e(i,o),e(s,u)),f=new fabric.Point(t(i,o),t(s,u)),l=i===o&&s===u;for(var c=this._objects.length;c--;){r=this._objects[c];if(!r||!r.selectable||!r.visible)continue;if(r.intersectsWithRect(a,f)||r.isContainedWithinRect(a,f)||r.containsPoint(a)||r.containsPoint(f)){r.set("active",!0),n.push(r);if(l)break}}return n},_maybeGroupObjects:function(e){this.selection&&this._groupSelector&&this._groupSelectedObjects(e);var t=this.getActiveGroup();t&&(t.setObjectsCoords().setCoords(),t.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(e){e||(e={});var t=e.format||"png",n=e.quality||1,r=e.multiplier||1,i={left:e.left,top:e.top,width:e.width,height:e.height};return r!==1?this.__toDataURLWithMultiplier(t,n,i,r):this.__toDataURL(t,n,i)},__toDataURL:function(e,t,n){this.renderAll(!0);var r=this.upperCanvasEl||this.lowerCanvasEl,i=this.__getCroppedCanvas(r,n);e==="jpg"&&(e="jpeg");var s=fabric.StaticCanvas.supports("toDataURLWithQuality")?(i||r).toDataURL("image/"+e,t):(i||r).toDataURL("image/"+e);return this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),i&&(i=null),s},__getCroppedCanvas:function(e,t){var n,r,i="left"in t||"top"in t||"width"in t||"height"in t;return i&&(n=fabric.util.createCanvasElement(),r=n.getContext("2d"),n.width=t.width||this.width,n.height=t.height||this.height,r.drawImage(e,-t.left||0,-t.top||0)),n},__toDataURLWithMultiplier:function(e,t,n,r){var i=this.getWidth(),s=this.getHeight(),o=i*r,u=s*r,a=this.getActiveObject(),f=this.getActiveGroup(),l=this.contextTop||this.contextContainer;r>1&&this.setWidth(o).setHeight(u),l.scale(r,r),n.left&&(n.left*=r),n.top&&(n.top*=r),n.width?n.width*=r:r<1&&(n.width=o),n.height?n.height*=r:r<1&&(n.height=u),f?this._tempRemoveBordersControlsFromGroup(f):a&&this.deactivateAll&&this.deactivateAll(),this.renderAll(!0);var c=this.__toDataURL(e,t,n);return this.width=i,this.height=s,l.scale(1/r,1/r),this.setWidth(i).setHeight(s),f?this._restoreBordersControlsOnGroup(f):a&&this.setActiveObject&&this.setActiveObject(a),this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),c},toDataURLWithMultiplier:function(e,t,n){return this.toDataURL({format:e,multiplier:t,quality:n})},_tempRemoveBordersControlsFromGroup:function(e){e.origHasControls=e.hasControls,e.origBorderColor=e.borderColor,e.hasControls=!0,e.borderColor="rgba(0,0,0,0)",e.forEachObject(function(e){e.origBorderColor=e.borderColor,e.borderColor="rgba(0,0,0,0)"})},_restoreBordersControlsOnGroup:function(e){e.hideControls=e.origHideControls -,e.borderColor=e.origBorderColor,e.forEachObject(function(e){e.borderColor=e.origBorderColor,delete e.origBorderColor})}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(e,t,n){return this.loadFromJSON(e,t,n)},loadFromJSON:function(e,t,n){if(!e)return;var r=typeof e=="string"?JSON.parse(e):e;this.clear();var i=this;return this._enlivenObjects(r.objects,function(){i._setBgOverlay(r,t)},n),this},_setBgOverlay:function(e,t){var n=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!e.backgroundImage&&!e.overlayImage&&!e.background&&!e.overlay){t&&t();return}var i=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(n.renderAll(),t&&t())};this.__setBgOverlay("backgroundImage",e.backgroundImage,r,i),this.__setBgOverlay("overlayImage",e.overlayImage,r,i),this.__setBgOverlay("backgroundColor",e.background,r,i),this.__setBgOverlay("overlayColor",e.overlay,r,i),i()},__setBgOverlay:function(e,t,n,r){var i=this;if(!t){n[e]=!0;return}e==="backgroundImage"||e==="overlayImage"?fabric.Image.fromObject(t,function(t){i[e]=t,n[e]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(e,!0)](t,function(){n[e]=!0,r&&r()})},_enlivenObjects:function(e,t,n){var r=this;if(!e||e.length===0){t&&t();return}var i=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(e,function(e){e.forEach(function(e,t){r.insertAt(e,t,!0)}),r.renderOnAddRemove=i,t&&t()},null,n)},_toDataURL:function(e,t){this.clone(function(n){t(n.toDataURL(e))})},_toDataURLWithMultiplier:function(e,t,n){this.clone(function(r){n(r.toDataURLWithMultiplier(e,t))})},clone:function(e,t){var n=JSON.stringify(this.toJSON(t));this.cloneWithoutData(function(t){t.loadFromJSON(n,function(){e&&e(t)})})},cloneWithoutData:function(e){var t=fabric.document.createElement("canvas");t.width=this.getWidth(),t.height=this.getHeight();var n=new fabric.Canvas(t);n.clipTo=this.clipTo,this.backgroundImage?(n.setBackgroundImage(this.backgroundImage.src,function(){n.renderAll(),e&&e(n)}),n.backgroundImageOpacity=this.backgroundImageOpacity,n.backgroundImageStretch=this.backgroundImageStretch):e&&e(n)}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.toFixed,i=t.util.string.capitalize,s=t.util.degreesToRadians,o=t.StaticCanvas.supports("setLineDash");if(t.Object)return;t.Object=t.util.createClass({type:"object",originX:"left",originY:"top",top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,opacity:1,angle:0,cornerSize:12,transparentCorners:!0,hoverCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"source-over",backgroundColor:"",stroke:null,strokeWidth:1,strokeDashArray:null,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:10,shadow:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,transformMatrix:null,minScaleLimit:.01,selectable:!0,evented:!0,visible:!0,hasControls:!0,hasBorders:!0,hasRotatingPoint:!0,rotatingPointOffset:40,perPixelTargetFind:!1,includeDefaultValues:!0,clipTo:null,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockUniScaling:!1,lockScalingFlip:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule shadow clipTo visible backgroundColor".split(" "),initialize:function(e){e&&this.setOptions(e)},_initGradient:function(e){e.fill&&e.fill.colorStops&&!(e.fill instanceof t.Gradient)&&this.set("fill",new t.Gradient(e.fill))},_initPattern:function(e){e.fill&&e.fill.source&&!(e.fill instanceof t.Pattern)&&this.set("fill",new t.Pattern(e.fill)),e.stroke&&e.stroke.source&&!(e.stroke instanceof t.Pattern)&&this.set("stroke",new t.Pattern(e.stroke))},_initClipping:function(e){if(!e.clipTo||typeof e.clipTo!="string")return;var n=t.util.getFunctionBody(e.clipTo);typeof n!="undefined"&&(this.clipTo=new Function("ctx",n))},setOptions:function(e){for(var t in e)this.set(t,e[t]);this._initGradient(e),this._initPattern(e),this._initClipping(e)},transform:function(e,t){this.group&&this.group.transform(e,t),e.globalAlpha=this.opacity;var n=t?this._getLeftTopCoords():this.getCenterPoint();e.translate(n.x,n.y),e.rotate(s(this.angle)),e.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(e){var n=t.Object.NUM_FRACTION_DIGITS,i={type:this.type,originX:this.originX,originY:this.originY,left:r(this.left,n),top:r(this.top,n),width:r(this.width,n),height:r(this.height,n),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:r(this.strokeWidth,n),strokeDashArray:this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:r(this.strokeMiterLimit,n),scaleX:r(this.scaleX,n),scaleY:r(this.scaleY,n),angle:r(this.getAngle(),n),flipX:this.flipX,flipY:this.flipY,opacity:r(this.opacity,n),shadow:this.shadow&&this.shadow.toObject?this.shadow.toObject():this.shadow,visible:this.visible,clipTo:this.clipTo&&String(this.clipTo),backgroundColor:this.backgroundColor};return this.includeDefaultValues||(i=this._removeDefaultValues(i)),t.util.populateWithProperties(this,i,e),i},toDatalessObject:function(e){return this.toObject(e)},_removeDefaultValues:function(e){var n=t.util.getKlass(e.type).prototype,r=n.stateProperties;return r.forEach(function(t){e[t]===n[t]&&delete e[t]}),e},toString:function(){return"#"},get:function(e){return this[e]},_setObject:function(e){for(var t in e)this._set(t,e[t])},set:function(e,t){return typeof e=="object"?this._setObject(e):typeof t=="function"&&e!=="clipTo"?this._set(e,t(this.get(e))):this._set(e,t),this},_set:function(e,n){var i=e==="scaleX"||e==="scaleY";return i&&(n=this._constrainScale(n)),e==="scaleX"&&n<0?(this.flipX=!this.flipX,n*=-1):e==="scaleY"&&n<0?(this.flipY=!this.flipY,n*=-1):e==="width"||e==="height"?this.minScaleLimit=r(Math.min(.1,1/Math.max(this.width,this.height)),2):e==="shadow"&&n&&!(n instanceof t.Shadow)&&(n=new t.Shadow(n)),this[e]=n,this},toggle:function(e){var t=this.get(e);return typeof t=="boolean"&&this.set(e,!t),this},setSourcePath:function(e){return this.sourcePath=e,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:[1,0,0,1,0,0]},render:function(e,n){if(this.width===0||this.height===0||!this.visible)return;e.save(),this._setupFillRule(e),this._transform(e,n),this._setStrokeStyles(e),this._setFillStyles(e);if(this.group&&this.group.type==="path-group"){e.translate(-this.group.width/2,-this.group.height/2);var r=this.transformMatrix;r&&e.transform.apply(e,r)}e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,this._setShadow(e),this.clipTo&&t.util.clipContext(this,e),this._render(e,n),this.clipTo&&e.restore(),this._removeShadow(e),this._restoreFillRule(e),e.restore()},_transform:function(e,t){var n=this.transformMatrix;n&&!this.group&&e.setTransform.apply(e,n),t||this.transform(e)},_setStrokeStyles:function(e){this.stroke&&(e.lineWidth=this.strokeWidth,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin,e.miterLimit=this.strokeMiterLimit,e.strokeStyle=this.stroke.toLive?this.stroke.toLive(e):this.stroke)},_setFillStyles:function(e){this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e):this.fill)},_renderControls:function(e,n){var r=this.getViewportTransform();e.save();if(this.active&&!n){var i;this.group&&(i=t.util.transformPoint(this.group.getCenterPoint(),r),e.translate(i.x,i.y),e.rotate(s(this.group.angle))),i=t.util.transformPoint(this.getCenterPoint(),r,null!=this.group),this.group&&(i.x*=this.group.scaleX,i.y*=this.group.scaleY),e.translate(i.x,i.y),e.rotate(s(this.angle)),this.drawBorders(e),this.drawControls(e)}e.restore()},_setShadow:function(e){if(!this.shadow)return;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_removeShadow:function(e){if(!this.shadow)return;e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0},_renderFill:function(e){if(!this.fill)return;e.save(),this.fill.toLive&&e.translate(-this.width/2+this.fill.offsetX||0,-this.height/2+this.fill.offsetY||0);if(this.fill.gradientTransform){var t=this.fill.gradientTransform;e.transform.apply(e,t)}this.fillRule==="destination-over"?e.fill("evenodd"):e.fill(),e.restore(),this.shadow&&!this.shadow.affectStroke&&this._removeShadow(e)},_renderStroke:function(e){if(!this.stroke||this.strokeWidth===0)return;e.save();if(this.strokeDashArray)1&this.strokeDashArray.length&&this.strokeDashArray.push.apply(this.strokeDashArray,this.strokeDashArray),o?(e.setLineDash(this.strokeDashArray),this._stroke&&this._stroke(e)):this._renderDashedStroke&&this._renderDashedStroke(e),e.stroke();else{if(this.stroke.gradientTransform){var t=this.stroke.gradientTransform;e.transform.apply(e,t)}this._stroke?this._stroke(e):e.stroke()}this._removeShadow(e),e.restore()},clone:function(e,n){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(n),e):new t.Object(this.toObject(n))},cloneAsImage:function(e){var n=this.toDataURL();return t.util.loadImage(n,function(n){e&&e(new t.Image(n))}),this},toDataURL:function(e){e||(e={});var n=t.util.createCanvasElement(),r=this.getBoundingRect();n.width=r.width,n.height=r.height,t.util.wrapElement(n,"div");var i=new t.Canvas(n);e.format==="jpg"&&(e.format="jpeg"),e.format==="jpeg"&&(i.backgroundColor="#fff");var s={active:this.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new t.Point(n.width/2,n.height/2),"center","center");var o=this.canvas;i.add(this);var u=i.toDataURL(e);return this.set(s).setCoords(),this.canvas=o,i.dispose(),i=null,u},isType:function(e){return this.type===e},complexity:function(){return 0},toJSON:function(e){return this.toObject(e)},setGradient:function(e,n){n||(n={});var r={colorStops:[]};r.type=n.type||(n.r1||n.r2?"radial":"linear"),r.coords={x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2};if(n.r1||n.r2)r.coords.r1=n.r1,r.coords.r2=n.r2;for(var i in n.colorStops){var s=new t.Color(n.colorStops[i]);r.colorStops.push({offset:i,color:s.toRgb(),opacity:s.getAlpha()})}return this.set(e,t.Gradient.forObject(this,r))},setPatternFill:function(e){return this.set("fill",new t.Pattern(e))},setShadow:function(e){return this.set("shadow",e?new t.Shadow(e):null)},setColor:function(e){return this.set("fill",e),this},setAngle:function(e){var t=(this.originX!=="center"||this.originY!=="center")&&this.centeredRotation;return t&&this._setOriginToCenter(),this.set("angle",e),t&&this._resetOrigin(),this},centerH:function(){return this.canvas.centerObjectH(this),this},centerV:function(){return this.canvas.centerObjectV(this),this},center:function(){return this.canvas.centerObject(this),this},remove:function(){return this.canvas.remove(this),this},getLocalPointer:function(e,t){t=t||this.canvas.getPointer(e);var n=this.translateToOriginPoint(this.getCenterPoint(),"left","top");return{x:t.x-n.x,y:t.y-n.y}},_setupFillRule:function(e){this.fillRule&&(this._prevFillRule=e.globalCompositeOperation,e.globalCompositeOperation=this.fillRule)},_restoreFillRule:function(e){this.fillRule&&this._prevFillRule&&(e.globalCompositeOperation=this._prevFillRule)}}),t.util.createAccessors(t.Object),t.Object.prototype.rotate=t.Object.prototype.setAngle,n(t.Object.prototype,t.Observable),t.Object.NUM_FRACTION_DIGITS=2,t.Object.__uid=0}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{translateToCenterPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x+(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x-(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y+(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y-(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},translateToOriginPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x-(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x+(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y-(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y+(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},getCenterPoint:function(){var e=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(e,this.originX,this.originY)},getPointByOrigin:function(e,t){var n=this.getCenterPoint();return this.translateToOriginPoint(n,e,t)},toLocalPoint:function(t,n,r){var i=this.getCenterPoint(),s=this.stroke?this.strokeWidth:0,o,u;return n&&r?(n==="left"?o=i.x-(this.getWidth()+s*this.scaleX)/2:n==="right"?o=i.x+(this.getWidth()+s*this.scaleX)/2:o=i.x,r==="top"?u=i.y-(this.getHeight()+s*this.scaleY)/2:r==="bottom"?u=i.y+(this.getHeight()+s*this.scaleY)/2:u=i.y):(o=this.left,u=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(o,u))},setPositionByOrigin:function(e,t,n){var r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",i.x),this.set("top",i.y)},adjustPosition:function(t){var n=e(this.angle),r=this.getWidth()/2,i=Math.cos(n)*r,s=Math.sin(n)*r,o=this.getWidth(),u=Math.cos(n)*o,a=Math.sin(n)*o;this.originX==="center"&&t==="left"||this.originX==="right"&&t==="center"?(this.left-=i,this.top-=s):this.originX==="left"&&t==="center"||this.originX==="center"&&t==="right"?(this.left+=i,this.top+=s):this.originX==="left"&&t==="right"?(this.left+=u,this.top+=a):this.originX==="right"&&t==="left"&&(this.left-=u,this.top-=a),this.setCoords(),this.originX=t},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var e=this.getCenterPoint();this.originX="center",this.originY="center",this.left=e.x,this.top=e.y},_resetOrigin:function(){var e=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=e.x,this.top=e.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","center")}})}(),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,intersectsWithRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y),o=new fabric.Point(n.br.x,n.br.y),u=fabric.Intersection.intersectPolygonRectangle([r,i,o,s],e,t);return u.status==="Intersection"},intersectsWithObject:function(e){function t(e){return{tl:new fabric.Point(e.tl.x,e.tl.y),tr:new fabric.Point(e.tr.x,e.tr.y),bl:new fabric.Point(e.bl.x,e.bl.y),br:new fabric.Point(e.br.x,e.br.y)}}var n=t(this.oCoords),r=t(e.oCoords),i=fabric.Intersection.intersectPolygonPolygon([n.tl,n.tr,n.br,n.bl],[r.tl,r.tr,r.br,r.bl]);return i.status==="Intersection"},isContainedWithinObject:function(e){var t=e.getBoundingRect(),n=new fabric.Point(t.left,t.top),r=new fabric.Point(t.left+t.width,t.top+t.height);return this.isContainedWithinRect(n,r)},isContainedWithinRect:function(e,t){var n=this.getBoundingRect();return n.left>=e.x&&n.left+n.width<=t.x&&n.top>=e.y&&n.top+n.height<=t.y},containsPoint:function(e){var t=this._getImageLines(this.oCoords),n=this._findCrossPoints(e,t);return n!==0&&n%2===1},_getImageLines:function(e){return{topline:{o:e.tl,d:e.tr},rightline:{o:e.tr,d:e.br},bottomline:{o:e.br,d:e.bl},leftline:{o:e.bl,d:e.tl}}},_findCrossPoints:function(e,t){var n,r,i,s,o,u,a=0,f;for(var l in t){f=t[l];if(f.o.y=e.y&&f.d.y>=e.y)continue;f.o.x===f.d.x&&f.o.x>=e.x?(o=f.o.x,u=e.y):(n=0,r=(f.d.y-f.o.y)/(f.d.x-f.o.x),i=e.y-n*e.x,s=f.o.y-r*f.o.x,o=-(i-s)/(n-r),u=i+n*o),o>=e.x&&(a+=1);if(a===2)break}return a},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(){this.oCoords||this.setCoords();var e=[this.oCoords.tl.x,this.oCoords.tr.x,this.oCoords.br.x,this.oCoords.bl.x],t=fabric.util.array.min(e),n=fabric.util.array.max(e),r=Math.abs(t-n),i=[this.oCoords.tl.y,this.oCoords.tr.y,this.oCoords.br.y,this.oCoords.bl.y],s=fabric.util.array.min(i),o=fabric.util.array.max(i),u=Math.abs(s-o);return{left:t,top:s,width:r,height:u}},getWidth:function(){return this.width*this.scaleX},getHeight:function(){return this.height*this.scaleY},_constrainScale:function(e){return Math.abs(e)1?this.strokeWidth:0,n=e(this.angle),r=this.getViewportTransform(),i=function(e){return fabric.util.transformPoint(e,r)},s=this.width,o=this.height,u=this.strokeLineCap==="round"||this.strokeLineCap==="square",a=this.type==="line"&&this.width===1,f=this.type==="line"&&this.height===1,l=u&&f||this.type!=="line",c=u&&a||this.type!=="line";a?s=t:f&&(o=t),l&&(s+=t),c&&(o+=t),this.currentWidth=s*this.scaleX,this.currentHeight=o*this.scaleY,this.currentWidth<0&&(this.currentWidth=Math.abs(this.currentWidth));var h=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2)),p=Math.atan(isFinite(this.currentHeight/this.currentWidth)?this.currentHeight/this.currentWidth:0),d=Math.cos(p+n)*h,v=Math.sin(p+n)*h,m=Math.sin(n),g=Math.cos(n),y=this.getCenterPoint(),b=new fabric.Point(this.currentWidth,this.currentHeight),w=new fabric.Point(y.x-d,y.y-v),E=new fabric.Point(w.x+b.x*g,w.y+b.x*m),S=new fabric.Point(w.x-b.y*m,w.y+b.y*g),x=new fabric.Point(w.x+b.x/2*g,w.y+b.x/2*m),T=i(w),N=i(E),C=i(new fabric.Point(E.x-b.y*m,E.y+b.y*g)),k=i(S),L=i(new fabric.Point(w.x-b.y/2*m,w.y+b.y/2*g)),A=i(x),O=i(new fabric.Point(E.x-b.y/2*m,E.y+b.y/2*g)),M=i(new fabric.Point(S.x+b.x/2*g,S.y+b.x/2*m)),_=i(new fabric.Point(x.x,x.y)),D=Math.cos(p+n)*this.padding*Math.sqrt(2),P=Math.sin(p+n)*this.padding*Math.sqrt(2);return T=T.add(new fabric.Point(-D,-P)),N=N.add(new fabric.Point(P,-D)),C=C.add(new fabric.Point(D,P)),k=k.add(new fabric.Point(-P,D)),L=L.add(new fabric.Point((-D-P)/2,(-P+D)/2)),A=A.add(new fabric.Point((P-D)/2,-(P+D)/2)),O=O.add(new fabric.Point((P+D)/2,(P-D)/2)),M=M.add(new fabric.Point((D-P)/2,(D+P)/2)),_=_.add(new fabric.Point((P-D)/2,-(P+D)/2)),this.oCoords={tl:T,tr:N,br:C,bl:k,ml:L,mt:A,mr:O,mb:M,mtr:_},this._setCornerCoords&&this._setCornerCoords(),this}})}(),fabric.util.object.extend(fabric.Object.prototype,{sendToBack:function(){return this.group?fabric.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?fabric.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(e){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,e):this.canvas.sendBackwards(this,e),this},bringForward:function(e){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,e):this.canvas.bringForward(this,e),this},moveTo:function(e){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,e):this.canvas.moveTo(this,e),this}}),fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(){var e=this.fill?this.fill.toLive?"url(#SVGID_"+this.fill.id+")":this.fill:"none",t=this.fillRule==="destination-over"?"evenodd":this.fillRule,n=this.stroke?this.stroke.toLive?"url(#SVGID_"+this.stroke.id+")":this.stroke:"none",r=this.strokeWidth?this.strokeWidth:"0",i=this.strokeDashArray?this.strokeDashArray.join(" "):"",s=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",u=this.strokeMiterLimit?this.strokeMiterLimit:"4",a=typeof this.opacity!="undefined"?this.opacity:"1",f=this.visible?"":" visibility: hidden;",l=this.shadow&&this.type!=="text"?"filter: url(#SVGID_"+this.shadow.id+");":"";return["stroke: ",n,"; ","stroke-width: ",r,"; ","stroke-dasharray: ",i,"; ","stroke-linecap: ",s,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",u,"; ","fill: ",e,"; ","fill-rule: ",t,"; ","opacity: ",a,";",l,f].join("")},getSvgTransform:function(){if(this.group)return"";var e=fabric.util.toFixed,t=this.getAngle(),n=!this.canvas||this.canvas.svgViewportTransformation?this.getViewportTransform():[1,0,0,1,0,0],r=fabric.util.transformPoint(this.getCenterPoint(),n),i=fabric.Object.NUM_FRACTION_DIGITS,s=this.type==="path-group"?"":"translate("+e(r.x,i)+" "+e(r.y,i)+")",o=t!==0?" rotate("+e(t,i)+")":"",u=this.scaleX===1&&this.scaleY===1&&n[0]===1&&n[3]===1?"":" scale("+e(this.scaleX*n[0],i)+" "+e(this.scaleY*n[3],i)+")",a=this.type==="path-group"?this.width*n[0]:0,f=this.flipX?" matrix(-1 0 0 1 "+a+" 0) ":"",l=this.type==="path-group"?this.height*n[3]:0,c=this.flipY?" matrix(1 0 0 -1 0 "+l+")":"";return[s,o,u,f,c].join("")},getSvgTransformMatrix:function(){return this.transformMatrix?" matrix("+this.transformMatrix.join(" ")+")":""},_createBaseSVGMarkup:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),this.shadow&&e.push(this.shadow.toSVG(this)),e}}),fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(){return this.stateProperties.some(function(e){return this.get(e)!==this.originalState[e]},this)},saveState:function(e){return this.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),e&&e.stateProperties&&e.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),this},setupState:function(){return this.originalState={},this.saveState(),this}}),function(){var e=fabric.util.degreesToRadians,t=function(){return typeof G_vmlCanvasManager!="undefined"};fabric.util.object.extend(fabric.Object.prototype,{_controlsVisibility:null,_findTargetCorner:function(e){if(!this.hasControls||!this.active)return!1;var t=e.x,n=e.y,r,i;for(var s in this.oCoords){if(!this.isControlVisible(s))continue;if(s==="mtr"&&!this.hasRotatingPoint)continue;if(!(!this.get("lockUniScaling")||s!=="mt"&&s!=="mr"&&s!=="mb"&&s!=="ml"))continue;i=this._getImageLines(this.oCoords[s].corner),r=this._findCrossPoints({x:t,y:n},i);if(r!==0&&r%2===1)return this.__corner=s,s}return!1},_setCornerCoords:function(){var t=this.oCoords,n=e(this.angle),r=e(45-this.angle),i=Math.sqrt(2*Math.pow(this.cornerSize,2))/2,s=i*Math.cos(r),o=i*Math.sin(r),u=Math.sin(n),a=Math.cos(n);t.tl.corner={tl:{x:t.tl.x-o,y:t.tl.y-s},tr:{x:t.tl.x+s,y:t.tl.y-o},bl:{x:t.tl.x-s,y:t.tl.y+o},br:{x:t.tl.x+o,y:t.tl.y+s}},t.tr.corner={tl:{x:t.tr.x-o,y:t.tr.y-s},tr:{x:t.tr.x+s,y:t.tr.y-o},br:{x:t.tr.x+o,y:t.tr.y+s},bl:{x:t.tr.x-s,y:t.tr.y+o}},t.bl.corner={tl:{x:t.bl.x-o,y:t.bl.y-s},bl:{x:t.bl.x-s,y:t.bl.y+o},br:{x:t.bl.x+o,y:t.bl.y+s},tr:{x:t.bl.x+s,y:t.bl.y-o}},t.br.corner={tr:{x:t.br.x+s,y:t.br.y-o},bl:{x:t.br.x-s,y:t.br.y+o},br:{x:t.br.x+o,y:t.br.y+s},tl:{x:t.br.x-o,y:t.br.y-s}},t.ml.corner={tl:{x:t.ml.x-o,y:t.ml.y-s},tr:{x:t.ml.x+s,y:t.ml.y-o},bl:{x:t.ml.x-s,y:t.ml.y+o},br:{x:t.ml.x+o,y:t.ml.y+s}},t.mt.corner={tl:{x:t.mt.x-o,y:t.mt.y-s},tr:{x:t.mt.x+s,y:t.mt.y-o},bl:{x:t.mt.x-s,y:t.mt.y+o},br:{x:t.mt.x+o,y:t.mt.y+s}},t.mr.corner={tl:{x:t.mr.x-o,y:t.mr.y-s},tr:{x:t.mr.x+s,y:t.mr.y-o},bl:{x:t.mr.x-s,y:t.mr.y+o},br:{x:t.mr.x+o,y:t.mr.y+s}},t.mb.corner={tl:{x:t.mb.x-o,y:t.mb.y-s},tr:{x:t.mb.x+s,y:t.mb.y-o},bl:{x:t.mb.x-s,y:t.mb.y+o},br:{x:t.mb.x+o,y:t.mb.y+s}},t.mtr.corner={tl:{x:t.mtr.x-o+u*this.rotatingPointOffset,y:t.mtr.y-s-a*this.rotatingPointOffset},tr:{x:t.mtr.x+s+u*this.rotatingPointOffset,y:t.mtr.y-o-a*this.rotatingPointOffset},bl:{x:t.mtr.x-s+u*this.rotatingPointOffset,y:t.mtr.y+o-a*this.rotatingPointOffset},br:{x:t.mtr.x+o+u*this.rotatingPointOffset,y:t.mtr.y+s-a*this.rotatingPointOffset}}},drawBorders:function(e){if(!this.hasBorders)return this;var t=this.padding,n=t*2,r=this.getViewportTransform();e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=this.borderColor;var i=1/this._constrainScale(this.scaleX),s=1/this._constrainScale(this.scaleY);e.lineWidth=1/this.borderScaleFactor;var o=this.getWidth(),u=this.getHeight(),a=this.strokeWidth>1?this.strokeWidth:0,f=this.strokeLineCap==="round"||this.strokeLineCap==="square",l=this.type==="line"&&this.width===1,c=this.type==="line"&&this.height===1,h=f&&c||this.type!=="line",p=f&&l||this.type!=="line";l?o=a/i:c&&(u=a/s),h&&(o+=a/i),p&&(u+=a/s);var d=fabric.util.transformPoint(new fabric.Point(o,u),r,!0),v=d.x,m=d.y;this.group&&(v*=this.group.scaleX,m*=this.group.scaleY),e.strokeRect(~~(-(v/2)-t)-.5,~~(-(m/2)-t)-.5,~~(v+n)+1,~~(m+n)+1);if(this.hasRotatingPoint&&this.isControlVisible("mtr")&&!this.get("lockRotation")&&this.hasControls){var g=(-m-t*2)/2;e.beginPath(),e.moveTo(0,g),e.lineTo(0,g-this.rotatingPointOffset),e.closePath(),e.stroke()}return e.restore(),this},drawControls:function(e){if(!this.hasControls)return this;var t=this.cornerSize,n=t/2,r=this.getViewportTransform(),i=this.strokeWidth>1?this.strokeWidth:0,s=this.width,o=this.height,u=this.strokeLineCap==="round"||this.strokeLineCap==="square",a=this.type==="line"&&this.width===1,f=this.type==="line"&&this.height===1,l=u&&f||this.type!=="line",c=u&&a||this.type!=="line";a?s=i:f&&(o=i),l&&(s+=i),c&&(o+=i),s*=this.scaleX,o*=this.scaleY;var h=fabric.util.transformPoint(new fabric.Point(s,o),r,!0),p=h.x,d=h.y,v=-(p/2),m=-(d/2),g=this.padding,y=n,b=n-t,w=this.transparentCorners?"strokeRect":"fillRect";return e.save(),e.lineWidth=1,e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=e.fillStyle=this.cornerColor,this._drawControl("tl",e,w,v-y-g,m-y-g),this._drawControl("tr",e,w,v+p-y+g,m-y-g),this._drawControl("bl",e,w,v-y-g,m+d+b+g),this._drawControl("br",e,w,v+p+b+g,m+d+b+g),this.get("lockUniScaling")||(this._drawControl("mt",e,w,v+p/2-y,m-y-g),this._drawControl("mb",e,w,v+p/2-y,m+d+b+g),this._drawControl("mr",e,w,v+p+b+g,m+d/2-y),this._drawControl("ml",e,w,v-y-g,m+d/2-y)),this.hasRotatingPoint&&this._drawControl("mtr",e,w,v+p/2-y,m-this.rotatingPointOffset-this.cornerSize/2-g),e.restore(),this},_drawControl:function(e,n,r,i,s){var o=this.cornerSize;this.isControlVisible(e)&&(t()||this.transparentCorners||n.clearRect(i,s,o,o),n[r](i,s,o,o))},isControlVisible:function(e){return this._getControlsVisibility()[e]},setControlVisible:function(e,t){return this._getControlsVisibility()[e]=t,this},setControlsVisibility:function(e){e||(e={});for(var t in e)this.setControlVisible(t,e[t]);return this},_getControlsVisibility:function(){return this._controlsVisibility||(this._controlsVisibility={tl:!0,tr:!0,br:!0,bl:!0,ml:!0,mt:!0,mr:!0,mb:!0,mtr:!0}),this._controlsVisibility}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{FX_DURATION:500,fxCenterObjectH:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("left"),endValue:this.getCenter().left,duration:this.FX_DURATION,onChange:function(t){e.set("left",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxCenterObjectV:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("top"),endValue:this.getCenter().top,duration:this.FX_DURATION,onChange:function(t){e.set("top",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxRemove:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("opacity"),endValue:0,duration:this.FX_DURATION,onStart:function(){e.set("active",!1)},onChange:function(t){e.set("opacity",t),s.renderAll(),i()},onComplete:function(){s.remove(e),r()}}),this}}),fabric.util.object.extend(fabric.Object.prototype,{animate:function(){if(arguments[0]&&typeof arguments[0]=="object"){var e=[],t,n;for(t in arguments[0])e.push(t);for(var r=0,i=e.length;rthis.x2?this.x2:this.x1),i=-this.height/2-(this.y1>this.y2?this.y2:this.y1);n="translate("+r+", "+i+") "}return t.push("\n'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Line.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),t.Line.fromElement=function(e,r){var i=t.parseAttributes(e,t.Line.ATTRIBUTE_NAMES),s=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new t.Line(s,n(i,r))},t.Line.fromObject=function(e){var n=[e.x1,e.y1,e.x2,e.y2];return new t.Line(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return"radius"in e&&e.radius>0}var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Circle){t.warn("fabric.Circle is already defined.");return}t.Circle=t.util.createClass(t.Object,{type:"circle",radius:0,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("radius",e.radius||0)},_set:function(e,t){return this.callSuper("_set",e,t),e==="radius"&&this.setRadius(t),this},toObject -:function(e){return r(this.callSuper("toObject",e),{radius:this.get("radius")})},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=0,r=0;return this.group&&(n=this.left+this.radius,r=this.top+this.radius),t.push("\n'),e?e(t.join("")):t.join("")},_render:function(e,t){e.beginPath(),e.arc(t?this.left+this.radius:0,t?this.top+this.radius:0,this.radius,0,n,!1),this._renderFill(e),this._renderStroke(e)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(e){this.radius=e,this.set("width",e*2).set("height",e*2)},complexity:function(){return 1}}),t.Circle.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),t.Circle.fromElement=function(e,n){n||(n={});var s=t.parseAttributes(e,t.Circle.ATTRIBUTE_NAMES);if(!i(s))throw new Error("value of `r` attribute is required and can not be negative");s.left=s.left||0,s.top=s.top||0;var o=new t.Circle(r(s,n));return o.left-=o.radius,o.top-=o.radius,o},t.Circle.fromObject=function(e){return new t.Circle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Triangle){t.warn("fabric.Triangle is already defined");return}t.Triangle=t.util.createClass(t.Object,{type:"triangle",initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("width",e.width||100).set("height",e.height||100)},_render:function(e){var t=this.width/2,n=this.height/2;e.beginPath(),e.moveTo(-t,n),e.lineTo(0,-n),e.lineTo(t,n),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=this.width/2,r=this.height/2;e.beginPath(),t.util.drawDashedLine(e,-n,r,0,-r,this.strokeDashArray),t.util.drawDashedLine(e,0,-r,n,r,this.strokeDashArray),t.util.drawDashedLine(e,n,r,-n,r,this.strokeDashArray),e.closePath()},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=this.width/2,r=this.height/2,i=[-n+" "+r,"0 "+ -r,n+" "+r].join(",");return t.push("'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Triangle.fromObject=function(e){return new t.Triangle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Ellipse){t.warn("fabric.Ellipse is already defined.");return}t.Ellipse=t.util.createClass(t.Object,{type:"ellipse",rx:0,ry:0,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("rx",e.rx||0),this.set("ry",e.ry||0),this.set("width",this.get("rx")*2),this.set("height",this.get("ry")*2)},toObject:function(e){return r(this.callSuper("toObject",e),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=0,r=0;return this.group&&(n=this.left+this.rx,r=this.top+this.ry),t.push("\n'),e?e(t.join("")):t.join("")},_render:function(e,t){e.beginPath(),e.save(),e.transform(1,0,0,this.ry/this.rx,0,0),e.arc(t?this.left+this.rx:0,t?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,n,!1),e.restore(),this._renderFill(e),this._renderStroke(e)},complexity:function(){return 1}}),t.Ellipse.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),t.Ellipse.fromElement=function(e,n){n||(n={});var i=t.parseAttributes(e,t.Ellipse.ATTRIBUTE_NAMES);i.left=i.left||0,i.top=i.top||0;var s=new t.Ellipse(r(i,n));return s.top-=s.ry,s.left-=s.rx,s},t.Ellipse.fromObject=function(e){return new t.Ellipse(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;if(t.Rect){console.warn("fabric.Rect is already defined");return}var r=t.Object.prototype.stateProperties.concat();r.push("rx","ry","x","y"),t.Rect=t.util.createClass(t.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(e){e=e||{},this.callSuper("initialize",e),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(e,t){if(this.width===1&&this.height===1){e.fillRect(0,0,1,1);return}var n=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,i=this.width,s=this.height,o=t?this.left:0,u=t?this.top:0,a=n!==0||r!==0,f=.4477152502;e.beginPath(),t||e.translate(-this.width/2,-this.height/2),e.moveTo(o+n,u),e.lineTo(o+i-n,u),a&&e.bezierCurveTo(o+i-f*n,u,o+i,u+f*r,o+i,u+r),e.lineTo(o+i,u+s-r),a&&e.bezierCurveTo(o+i,u+s-f*r,o+i-f*n,u+s,o+i-n,u+s),e.lineTo(o+n,u+s),a&&e.bezierCurveTo(o+f*n,u+s,o,u+s-f*r,o,u+s-r),e.lineTo(o,u+r),a&&e.bezierCurveTo(o,u+f*r,o+f*n,u,o+n,u),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=-this.width/2,r=-this.height/2,i=this.width,s=this.height;e.beginPath(),t.util.drawDashedLine(e,n,r,n+i,r,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r,n+i,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r+s,n,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n,r+s,n,r,this.strokeDashArray),e.closePath()},toObject:function(e){var t=n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=this.left,r=this.top;return this.group||(n=-this.width/2,r=-this.height/2),t.push("\n'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Rect.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),t.Rect.fromElement=function(e,r){if(!e)return null;r=r||{};var i=t.parseAttributes(e,t.Rect.ATTRIBUTE_NAMES);return i.left=i.left||0,i.top=i.top||0,new t.Rect(n(r?t.util.object.clone(r):{},i))},t.Rect.fromObject=function(e){return new t.Rect(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.toFixed;if(t.Polyline){t.warn("fabric.Polyline is already defined");return}t.Polyline=t.util.createClass(t.Object,{type:"polyline",points:null,initialize:function(e,t,n){t=t||{},this.set("points",e),this.callSuper("initialize",t),this._calcDimensions(n)},_calcDimensions:function(e){return t.Polygon.prototype._calcDimensions.call(this,e)},toObject:function(e){return t.Polygon.prototype.toObject.call(this,e)},toSVG:function(e){var t=[],r=this._createBaseSVGMarkup();for(var i=0,s=this.points.length;i\n'),e?e(r.join("")):r.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n\n'),e?e(n.join("")):n.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n"},toObject:function(e){var t=i(this.callSuper("toObject",e),{path:this.path.map(function(e){return e.slice()}),pathOffset:this.pathOffset});return this.sourcePath&&(t.sourcePath=this.sourcePath),this.transformMatrix&&(t.transformMatrix=this.transformMatrix),t},toDatalessObject:function(e){var t=this.toObject(e);return this.sourcePath&&(t.path=this.sourcePath),delete t.sourcePath,t},toSVG:function(e){var t=[],n=this._createBaseSVGMarkup();for(var r=0,i=this.path.length;r\n"),e?e(n.join("")):n.join("")},complexity:function(){return this.path.length},_parsePath:function(){var e=[],t=[],n,r,i=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/ig,s,o;for(var f=0,l,c=this.path.length;fv)for(var g=1,y=l.length;g\n"];for(var i=0,s=t.length;i\n"),e?e(r.join("")):r.join("")},toString:function(){return"#"},isSameColor:function(){var e=(this.getObjects()[0].get("fill")||"").toLowerCase();return this.getObjects().every(function(t){return(t.get("fill")||"").toLowerCase()===e})},complexity:function(){return this.paths.reduce(function(e,t){return e+(t&&t.complexity?t.complexity():0)},0)},getObjects:function(){return this.paths}}),t.PathGroup.fromObject=function(e,n){typeof e.paths=="string"?t.loadSVGFromURL(e.paths,function(r){var i=e.paths;delete e.paths;var s=t.util.groupSVGElements(r,e,i);n(s)}):t.util.enlivenObjects(e.paths,function(r){delete e.paths,n(new t.PathGroup(r,e))})},t.PathGroup.async=!0}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.array.min,i=t.util.array.max,s=t.util.array.invoke;if(t.Group)return;var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};t.Group=t.util.createClass(t.Object,t.Collection,{type:"group",initialize:function(e,t){t=t||{},this._objects=e||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},this.callSuper("initialize"),this._calcBounds(),this._updateObjectsCoords(),t&&n(this,t),this._setOpacityIfSame(),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(){this.forEachObject(this._updateObjectCoords,this)},_updateObjectCoords:function(e){var t=e.getLeft(),n=e.getTop();e.set({originalLeft:t,originalTop:n,left:t-this.left,top:n-this.top}),e.setCoords(),e.__origHasControls=e.hasControls,e.hasControls=!1},toString:function(){return"#"},addWithUpdate:function(e){return this._restoreObjectsState(),e&&(this._objects.push(e),e.group=this),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this},_setObjectActive:function(e){e.set("active",!0),e.group=this},removeWithUpdate:function(e){return this._moveFlippedObject(e),this._restoreObjectsState(),this.forEachObject(this._setObjectActive,this),this.remove(e),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(e){e.group=this},_onObjectRemoved:function(e){delete e.group,e.set("active",!1)},delegatedProperties:{fill:!0,opacity:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(e,t){if(e in this.delegatedProperties){var n=this._objects.length;this[e]=t;while(n--)this._objects[n].set(e,t)}else this[e]=t},toObject:function(e){return n(this.callSuper("toObject",e),{objects:s(this._objects,"toObject",e)})},render:function(e){if(!this.visible)return;e.save(),this.clipTo&&t.util.clipContext(this,e);for(var n=0,r=this._objects.length;n\n'];for(var n=0,r=this._objects.length;n\n"),e?e(t.join("")):t.join("")},get:function(e){if(e in o){if(this[e])return this[e];for(var t=0,n=this._objects.length;t\n','\n");if(this.stroke||this.strokeDashArray){var i=this.fill;this.fill=null,t.push("\n'),this.fill=i}return t.push("\n"),e?e(t.join("")):t.join("")},getSrc:function(){if(this.getElement())return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(e,t){this.constructor.fromObject(this.toObject(t),e)},applyFilters:function(e){if(!this._originalElement)return;if(this.filters.length===0){this._element=this._originalElement,e&&e();return}var t=this._originalElement,n=fabric.util.createCanvasElement(),r=fabric.util.createImage(),i=this;return n.width=t.width,n.height=t.height,n.getContext("2d").drawImage(t,0,0,t.width,t.height),this.filters.forEach(function(e){e&&e.applyTo(n)}),r.width=t.width,r.height=t.height,fabric.isLikelyNode?(r.src=n.toBuffer(undefined,fabric.Image.pngCompression),i._element=r,e&&e()):(r.onload=function(){i._element=r,e&&e(),r.onload=n=t=null},r.src=n.toDataURL("image/png")),this},_render:function(e,t){this._element&&e.drawImage(this._element,t?this.left:-this.width/2,t?this.top:-this.height/2,this.width,this.height),this._renderStroke(e)},_resetWidthHeight:function(){var e=this.getElement();this.set("width",e.width),this.set("height",e.height)},_initElement:function(e){this.setElement(fabric.util.getById(e)),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(e){e||(e={}),this.setOptions(e),this._setWidthHeight(e),this._element&&this.crossOrigin&&(this._element.crossOrigin=this.crossOrigin)},_initFilters:function(e,t){e.filters&&e.filters.length?fabric.util.enlivenObjects(e.filters,function(e){t&&t(e)},"fabric.Image.filters"):t&&t()},_setWidthHeight:function(e){this.width="width"in e?e.width:this.getElement()?this.getElement().width||0:0,this.height="height"in e?e.height:this.getElement()?this.getElement().height||0:0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){fabric.Image.prototype._initFilters.call(e,e,function(r){e.filters=r||[];var i=new fabric.Image(n,e);t&&t(i)})},null,e.crossOrigin)},fabric.Image.fromURL=function(e,t,n){fabric.util.loadImage(e,function(e){t(new fabric.Image(e,n))},null,n&&n.crossOrigin)},fabric.Image.ATTRIBUTE_NAMES=fabric.SHARED_ATTRIBUTES.concat("x y width height xlink:href".split(" ")),fabric.Image.fromElement=function(e,n,r){var i=fabric.parseAttributes(e,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(i["xlink:href"],n,t(r?fabric.util.object.clone(r):{},i))},fabric.Image.async=!0,fabric.Image.pngCompression=1}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var e=this.getAngle()%360;return e>0?Math.round((e-1)/90)*90:Math.round(e/90)*90},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(e){e=e||{};var t=function(){},n=e.onComplete||t,r=e.onChange||t,i=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(e){i.setAngle(e),r()},onComplete:function(){i.setCoords(),n()},onStart:function(){i.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(e){return e.straighten(),this.renderAll(),this},fxStraightenObject:function(e){return e.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.Brightness=t.util.createClass(t.Image.filters.BaseFilter,{type:"Brightness",initialize:function(e){e=e||{},this.brightness=e.brightness||0},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.brightness;for(var s=0,o=r.length;sa||C<0||C>u)continue;var k=(N*u+C)*4,L=t[x*i+T];b+=o[k]*L,w+=o[k+1]*L,E+=o[k+2]*L,S+=o[k+3]*L}h[y]=b,h[y+1]=w,h[y+2]=E,h[y+3]=S+p*(255-S)}n.putImageData(c,0,0)},toObject:function(){return n(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),t.Image.filters.Convolute.fromObject=function(e){return new t.Image.filters.Convolute(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.GradientTransparency=t.util.createClass(t.Image.filters.BaseFilter,{type:"GradientTransparency",initialize:function(e){e=e||{},this.threshold=e.threshold||100},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.threshold,s=r.length;for(var o=0,u=r.length;o-1?e.channel:0},applyTo:function(e){if(!this.mask)return;var n=e.getContext("2d"),r=n.getImageData(0,0,e.width,e.height),i=r.data,s=this.mask.getElement(),o=t.util.createCanvasElement(),u=this.channel,a,f=r.width*r.height*4;o.width=s.width,o.height=s.height,o.getContext("2d").drawImage(s,0,0,s.width,s.height);var l=o.getContext("2d").getImageData(0,0,s.width,s.height),c=l.data;for(a=0;ao&&f>o&&l>o&&u(a-f)'},_render:function(e){typeof Cufon=="undefined"||this.useNative===!0?this._renderViaNative(e):this._renderViaCufon(e)},_renderViaNative:function(e){var n=this.text.split(this._reNewline);this._setTextStyles(e),this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this.clipTo&&t.util.clipContext(this,e),this._renderTextBackground(e,n),this._translateForTextAlign(e),this._renderText(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this.clipTo&&e.restore(),this._setBoundaries(e,n),this._totalLineHeight=0},_renderText:function(e,t){e.save(),this._setShadow(e),this._setupFillRule(e),this._renderTextFill(e,t),this._renderTextStroke(e,t),this._restoreFillRule(e),this._removeShadow(e),e.restore()},_translateForTextAlign:function(e){this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0))},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_renderChars:function(e,t,n,r,i){t[e](n,r,i)},_renderTextLine:function(e,t,n,r,i,s){i-=this.fontSize/4;if(this.textAlign!=="justify"){this._renderChars(e,t,n,r,i,s);return}var o=t.measureText(n).width,u=this.width;if(u>o){var a=n.split(/\s+/),f=t.measureText(n.replace(/\s+/g,"")).width,l=u-f,c=a.length-1,h=l/c,p=0;for(var d=0,v=a.length;d-1&&i(this.fontSize*this.lineHeight),this.textDecoration.indexOf("line-through")>-1&&i(this.fontSize*this.lineHeight-this.fontSize/2),this.textDecoration.indexOf("overline")>-1&&i(this.fontSize*this.lineHeight-this.fontSize)},_getFontDeclaration:function(){return[t.isLikelyNode?this.fontWeight:this.fontStyle,t.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",t.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(e,t){if(!this.visible)return;e.save(),this._transform(e,t);var n=this.transformMatrix,r=this.group&&this.group.type==="path-group";r&&e.translate(-this.group.width/2,-this.group.height/2),n&&e.transform(n[0],n[1],n[2],n[3],n[4],n[5]),r&&e.translate(this.left,this.top),this._render(e),e.restore()},toObject:function(e){var t=n(this.callSuper("toObject",e),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,path:this.path,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=[],n=this.text.split(this._reNewline),r=this._getSVGLeftTopOffsets(n),i=this._getSVGTextAndBg(r.lineTop,r.textLeft,n),s=this._getSVGShadows(r.lineTop,n);return r.textTop+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,this._wrapSVGTextAndBg(t,i,s,r),e?e(t.join("")):t.join("")},_getSVGLeftTopOffsets:function(e){var t=this.useNative?this.fontSize*this.lineHeight:-this._fontAscent-this._fontAscent/5*this.lineHeight,n=-(this.width/2),r=this.useNative?this.fontSize-1:this.height/2-e.length*this.fontSize-this._totalLineHeight;return{textLeft:n+(this.group?this.left:0),textTop:r+(this.group?this.top:0),lineTop:t}},_wrapSVGTextAndBg:function(e,t,n,r){e.push('\n',t.textBgRects.join(""),"',n.join(""),t.textSpans.join(""),"\n","\n")},_getSVGShadows:function(e,n){var r=[],s,o,u=1;if(!this.shadow||!this._boundaries)return r;for(s=0,o=n.length;s",t.util.string.escapeXml(n[s]),""),u=1}else u++;return r},_getSVGTextAndBg:function(e,t,n){var r=[],i=[],s=1;this._setSVGBg(i);for(var o=0,u=n.length;o",t.util.string.escapeXml(e),"")},_setSVGTextLineBg:function(e,t,n,r){e.push("\n')},_setSVGBg:function(e){this.backgroundColor&&this._boundaries&&e.push("')},_getFillAttributes:function(e){var n=e&&typeof e=="string"?new t.Color(e):"";return!n||!n.getSource()||n.getAlpha()===1?'fill="'+e+'"':'opacity="'+n.getAlpha()+'" fill="'+n.setAlpha(1).toRgb()+'"'},_set:function(e,t){e==="fontFamily"&&this.path&&(this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+t+"$3")),this.callSuper("_set",e,t),e in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),t.Text.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),t.Text.DEFAULT_SVG_FONT_SIZE=16,t.Text.fromElement=function(e,n){if(!e)return null;var r=t.parseAttributes(e,t.Text.ATTRIBUTE_NAMES);n=t.util.object.extend(n?t.util.object.clone(n):{},r),"dx"in r&&(n.left+=r.dx),"dy"in r&&(n.top+=r.dy),"fontSize"in n||(n.fontSize=t.Text.DEFAULT_SVG_FONT_SIZE),n.originX||(n.originX="left");var i=new t.Text(e.textContent,n),s=0;return i.originX==="left"&&(s=i.getWidth()/2),i.originX==="right"&&(s=-i.getWidth()/2),i.set({left:i.getLeft()+s,top:i.getTop()-i.getHeight()/2}),i},t.Text.fromObject=function(e){return new t.Text(e.text,r(e))},t.util.createAccessors(t.Text)}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_skipFillStrokeCheck:!0,_reSpace:/\s|\n/,_fontSizeFraction:4,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,_charWidthsCache:{},initialize:function(e,t){this.styles=t?t.styles||{}:{},this.callSuper("initialize",e,t),this.initBehavior(),fabric.IText.instances.push(this),this.__lineWidths={},this.__lineHeights={},this.__lineOffsets={}},isEmptyStyles:function(){if(!this.styles)return!0;var e=this.styles;for(var t in e)for(var n in e[t])for(var r in e[t][n])return!1;return!0},setSelectionStart:function(e){this.selectionStart!==e&&(this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})),this.selectionStart=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionStart=e)},setSelectionEnd:function(e){this.selectionEnd!==e&&(this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})),this.selectionEnd=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionEnd=e)},getSelectionStyles:function(e,t){if(arguments.length===2){var n=[];for(var r=e;r=r.charIndex&&(a!==o||hs&&a-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,0,this.fontSize/20),u.indexOf("line-through")>-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,o/2,a/20),u.indexOf("overline")>-1&&this._renderCharDecorationAtOffset(e,n,r,i,s-this.fontSize/this._fontSizeFraction,this.fontSize/20)},_renderCharDecorationAtOffset:function(e,t,n,r,i,s){e.fillRect(t,n-i,r,s)},_renderTextLine:function(e,t,n,r,i,s){i+=this.fontSize/4,this.callSuper("_renderTextLine",e,t,n,r,i,s)},_renderTextDecoration:function(e,t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",e,t)},_renderTextLinesBackground:function(e,t){if(!this.textBackgroundColor&&!this.styles)return;e.save(),this.textBackgroundColor&&(e.fillStyle=this.textBackgroundColor);var n=0,r=this.fontSize/this._fontSizeFraction;for(var i=0,s=t.length;in&&(n=s)}return n},_getHeightOfLine:function(e,t,n){n=n||this.text.split(this._reNewline);var r=this._getHeightOfChar(e,n[t][0],t,0),i=n[t],s=i.split("");for(var o=1,u=s.length;or&&(r=a)}return r*this.lineHeight},_getTextHeight:function(e,t){var n=0;for(var r=0,i=t.length;r-1)t++,n--;return e-t},findWordBoundaryRight:function(e){var t=0,n=e;if(this._reSpace.test(this.text.charAt(n)))while(this._reSpace.test(this.text.charAt(n)))t++,n++;while(/\S/.test(this.text.charAt(n))&&n-1)t++,n--;return e-t},findLineBoundaryRight:function(e){var t=0,n=e;while(!/\n/.test(this.text.charAt(n))&&n0&&nr;s?this.removeStyleObject(s,n+1):this.removeStyleObject(this.get2DCursorLocation(n).charIndex===0,n)}this.text=this.text.slice(0,e)+this.text.slice(t)},insertChars:function(e){var t=this.text.slice(this.selectionStart,this.selectionStart+1)==="\n";this.text=this.text.slice(0,this.selectionStart)+e+this.text.slice(this.selectionEnd),this.selectionStart===this.selectionEnd&&this.insertStyleObjects(e,t,this.copiedStyles),this.selectionStart+=e.length,this.selectionEnd=this.selectionStart,this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},insertNewlineStyleObject:function(t,n,r){this.shiftLineStyles(t,1),this.styles[t+1]||(this.styles[t+1]={});var i=this.styles[t][n-1],s={};if(r)s[0]=e(i),this.styles[t+1]=s;else{for(var o in this.styles[t])parseInt(o,10)>=n&&(s[parseInt(o,10)-n]=this.styles[t][o],delete this.styles[t][o]);this.styles[t+1]=s}},insertCharStyleObject:function(t,n,r){var i=this.styles[t],s=e(i);n===0&&!r&&(n=1);for(var o in s){var u=parseInt(o,10);u>=n&&(i[u+1]=s[u])}this.styles[t][n]=r||e(i[n-1])},insertStyleObjects:function(e,t,n){if(this.isEmptyStyles())return;var r=this.get2DCursorLocation(),i=r.lineIndex,s=r.charIndex;this.styles[i]||(this.styles[i]={}),e==="\n"?this.insertNewlineStyleObject(i,s,t):n?this._insertStyles(n):this.insertCharStyleObject(i,s)},_insertStyles:function(e){for(var t=0,n=e.length;tt&&(this.styles[s+n]=r[s])}},removeStyleObject:function(t,n){var r=this.get2DCursorLocation(n),i=r.lineIndex,s=r.charIndex;if(t){var o=this.text.split(this._reNewline),u=o[i-1],a=u?u.length:0;this.styles[i-1]||(this.styles[i-1]={});for(s in this.styles[i])this.styles[i-1][parseInt(s,10)+a]=this.styles[i][s];this.shiftLineStyles(i,-1)}else{var f=this.styles[i];if(f){var l=this.selectionStart===this.selectionEnd?-1:0;delete f[s+l]}var c=e(f);for(var h in c){var p=parseInt(h,10);p>=s&&p!==0&&(f[p-1]=c[p],delete f[p])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+(new Date),this.__lastLastClickTime=+(new Date),this.__lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(e){this.__newClickTime=+(new Date);var t=this.canvas.getPointer(e.e);this.isTripleClick(t)?(this.fire("tripleclick",e),this._stopEvent(e.e)):this.isDoubleClick(t)&&(this.fire("dblclick",e),this._stopEvent(e.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=t,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y&&this.__lastIsEditing},isTripleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y},_stopEvent:function(e){e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMousemoveHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(e){this.selectWord(this.getSelectionStartFromPointer(e.e))}),this.on("tripleclick",function(e){this.selectLine(this.getSelectionStartFromPointer(e.e))})},initMousedownHandler:function(){this.on("mousedown",function(e){var t=this.canvas.getPointer(e.e);this.__mousedownX=t.x,this.__mousedownY=t.y,this.__isMousedown=!0,this.hiddenTextarea&&this.canvas&&this.canvas.wrapperEl.appendChild(this.hiddenTextarea),this.selected&&this.setCursorByClick(e.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.initDelayedCursor(!0))})},initMousemoveHandler:function(){this.on("mousemove",function(e){if(!this.__isMousedown||!this.isEditing)return;var t=this.getSelectionStartFromPointer(e.e);t>=this.__selectionStartOnMouseDown?(this.setSelectionStart(this.__selectionStartOnMouseDown),this.setSelectionEnd(t)):(this.setSelectionStart(t),this.setSelectionEnd(this.__selectionStartOnMouseDown))})},_isObjectMoved:function(e){var t=this.canvas.getPointer(e);return this.__mousedownX!==t.x||this.__mousedownY!==t.y},initMouseupHandler:function(){this.on("mouseup",function(e){this.__isMousedown=!1;if(this._isObjectMoved(e.e))return;this.__lastSelected&&(this.enterEditing(),this.initDelayedCursor(!0)),this.selected=!0})},setCursorByClick:function(e){var t=this.getSelectionStartFromPointer(e);e.shiftKey?ts?0:1,a=r+u;return this.flipX&&(a=i-a),a>this.text.length&&(a=this.text.length),a}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.style.cssText="position: absolute; top: 0; left: -9999px",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keypress",this.onKeyPress.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",13:"insertNewline",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMap:{65:"selectAll",88:"cut"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(e){if(!this.isEditing)return;if(e.keyCode in this._keysMap)this[this._keysMap[e.keyCode]](e);else{if(!(e.keyCode in this._ctrlKeysMap&&(e.ctrlKey||e.metaKey)))return;this[this._ctrlKeysMap[e.keyCode]](e)}e.stopImmediatePropagation(),e.preventDefault(),this.canvas&&this.canvas.renderAll()},forwardDelete:function(e){this.selectionStart===this.selectionEnd&&this.moveCursorRight(e),this.removeChars(e)},copy:function(e){var t=this.getSelectedText(),n=this._getClipboardData(e);n&&n.setData("text",t),this.copiedText=t,this.copiedStyles=this.getSelectionStyles(this.selectionStart,this.selectionEnd)},paste:function(e){var t=null,n=this._getClipboardData(e);n?t=n.getData("text"):t=this.copiedText,t&&this.insertChars(t)},cut:function(e){if(this.selectionStart===this.selectionEnd)return;this.copy(),this.removeChars(e)},_getClipboardData:function(e){return e&&(e.clipboardData||fabric.window.clipboardData)},onKeyPress:function(e){if(!this.isEditing||e.metaKey||e.ctrlKey)return;this.insertChars(String.fromCharCode(e.which)),e.stopPropagation()},getDownCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.text.split(this._reNewline),i,s,o=this.text.slice(0,n),u=this.text.slice(n),a=o.slice(o.lastIndexOf("\n")+1),f=u.match(/(.*)\n?/)[1],l=(u.match(/.*\n(.*)\n?/)||{})[1]||"",c=this.get2DCursorLocation(n);if(c.lineIndex===r.length-1||e.metaKey)return this.text.length-n;var h=this._getWidthOfLine(this.ctx,c.lineIndex,r);s=this._getLineLeftOffset(h);var p=s,d=c.lineIndex;for(var v=0,m=a.length;vn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=gthis.text.length&&(this.selectionStart=this.text.length),this.selectionEnd=this.selectionStart},moveCursorDownWithShift:function(e){if(this._selectionDirection==="left"&&this.selectionStart!==this.selectionEnd){this.selectionStart+=e,this._selectionDirection="left";return}this._selectionDirection="right",this.selectionEnd+=e,this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length)},getUpCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(n);if(r.lineIndex===0||e.metaKey)return n;var i=this.text.slice(0,n),s=i.slice(i.lastIndexOf("\n")+1),o=(i.match(/\n?(.*)\n.*$/)||{})[1]||"",u=this.text.split(this._reNewline),a,f=this._getWidthOfLine(this.ctx,r.lineIndex,u),l=this._getLineLeftOffset(f),c=l,h=r.lineIndex;for(var p=0,d=s.length;pn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=g=this.text.length&&this.selectionEnd>=this.text.length)return;this.abortCursorAnimation(),this._currentCursorOpacity=1,e.shiftKey?this.moveCursorRightWithShift(e):this.moveCursorRightWithoutShift(e),this.initDelayedCursor()},moveCursorRightWithShift:function(e){this._selectionDirection==="left"&&this.selectionStart!==this.selectionEnd?this._moveRight(e,"selectionStart"):(this._selectionDirection="right",this._moveRight(e,"selectionEnd"),this.text.charAt(this.selectionEnd-1)==="\n"&&this.selectionEnd++,this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length))},moveCursorRightWithoutShift:function(e){this._selectionDirection="right",this.selectionStart===this.selectionEnd?(this._moveRight(e,"selectionStart"),this.selectionEnd=this.selectionStart):(this.selectionEnd+=this.getNumNewLinesInSelectedText(),this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length),this.selectionStart=this.selectionEnd)},removeChars:function(e){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(e):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.selectionEnd=this.selectionStart,this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(e){if(this.selectionStart!==0)if(e.metaKey){var t=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(t,this.selectionStart),this.selectionStart=t}else if(e.altKey){var n=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(n,this.selectionStart),this.selectionStart=n}else{var r=this.text.slice(this.selectionStart-1,this.selectionStart)==="\n";this.removeStyleObject(r),this.selectionStart--,this.text=this.text.slice(0,this.selectionStart)+this.text.slice(this.selectionStart+1)}}}),fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(e,t,n,r,i,s){this.styles[t]?this._setSVGTextLineChars(e,t,n,r,i,s):this.callSuper("_setSVGTextLineText",e,t,n,r,i)},_setSVGTextLineChars:function(e,t,n,r,i,s){var o=t===0||this.useNative?"y":"dy",u=e.split(""),a=0,f=this._getSVGLineLeftOffset(t),l=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t);for(var h=0,p=u.length;h'].join("")},_createTextCharSpan:function(e,t,n,r,i,s){var o=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text"},t));return['',fabric.util.string.escapeXml(e),""].join("")}}),function(){function request(e,t,n){var r=URL.parse(e);r.port||(r.port=r.protocol.indexOf("https:")===0?443:80);var i=r.port===443?HTTPS:HTTP,s=i.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(e){var r="";t&&e.setEncoding(t),e.on("end",function(){n(r)}),e.on("data",function(t){e.statusCode===200&&(r+=t)})});s.on("error",function(e){e.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(e.message)}),s.end()}function requestFs(e,t){var n=require("fs");n.readFile(e,function(e,n){if(e)throw fabric.log(e),e;t(n)})}if(typeof document!="undefined"&&typeof window!="undefined")return;var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(e,t,n){function r(r){i.src=new Buffer(r,"binary"),i._src=e,t&&t.call(n,i)}var i=new Image;e&&(e instanceof Buffer||e.indexOf("data")===0)?(i.src=i._src=e,t&&t.call(n,i)):e&&e.indexOf("http")!==0?requestFs(e,r):e?request(e,"binary",r):t&&t.call(n,e)},fabric.loadSVGFromURL=function(e,t,n){e=e.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),e.indexOf("http")!==0?requestFs(e,function(e){fabric.loadSVGFromString(e.toString(),t,n)}):request(e,"",function(e){fabric.loadSVGFromString(e,t,n)})},fabric.loadSVGFromString=function(e,t,n){var r=(new DOMParser).parseFromString(e);fabric.parseSVGDocument(r.documentElement,function(e,n){t&&t(e,n)},n)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){var r=new fabric.Image(n);r._initConfig(e),r._initFilters(e,function(e){r.filters=e||[],t&&t(r)})})},fabric.createCanvasForNode=function(e,t,n,r){r=r||n;var i=fabric.document.createElement("canvas"),s=new Canvas(e||600,t||600,r);i.style={},i.width=s.width,i.height=s.height;var o=fabric.Canvas||fabric.StaticCanvas,u=new o(i,n);return u.contextContainer=s.getContext("2d"),u.nodeCanvas=s,u.Font=Canvas.Font,u},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(e){return this.nodeCanvas.createJPEGStream(e)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(e,t){return origSetWidth.call(this,e,t),this.nodeCanvas.width=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(e,t){return origSetHeight.call(this,e,t),this.nodeCanvas.height=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}(); \ No newline at end of file +/* build: `node build.js modules=ALL exclude=gestures,cufon,json minifier=uglifyjs` *//*! Fabric.js Copyright 2008-2014, Printio (Juriy Zaytsev, Maxim Chernyak) */var fabric=fabric||{version:"1.4.11"};typeof exports!="undefined"&&(exports.fabric=fabric),typeof document!="undefined"&&typeof window!="undefined"?(fabric.document=document,fabric.window=window):(fabric.document=require("jsdom").jsdom(""),fabric.window=fabric.document.createWindow()),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode=typeof Buffer!="undefined"&&typeof window=="undefined",fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width"],fabric.DPI=96,function(){function e(e,t){if(!this.__eventListeners[e])return;t?fabric.util.removeFromArray(this.__eventListeners[e],t):this.__eventListeners[e].length=0}function t(e,t){this.__eventListeners||(this.__eventListeners={});if(arguments.length===1)for(var n in e)this.on(n,e[n]);else this.__eventListeners[e]||(this.__eventListeners[e]=[]),this.__eventListeners[e].push(t);return this}function n(t,n){if(!this.__eventListeners)return;if(arguments.length===0)this.__eventListeners={};else if(arguments.length===1&&typeof arguments[0]=="object")for(var r in t)e.call(this,r,t[r]);else e.call(this,t,n);return this}function r(e,t){if(!this.__eventListeners)return;var n=this.__eventListeners[e];if(!n)return;for(var r=0,i=n.length;r-1},complexity:function(){return this.getObjects().reduce(function(e,t){return e+=t.complexity?t.complexity():0,e},0)}},function(e){var t=Math.sqrt,n=Math.atan2,r=Math.PI/180;fabric.util={removeFromArray:function(e,t){var n=e.indexOf(t);return n!==-1&&e.splice(n,1),e},getRandomInt:function(e,t){return Math.floor(Math.random()*(t-e+1))+e},degreesToRadians:function(e){return e*r},radiansToDegrees:function(e){return e/r},rotatePoint:function(e,t,n){var r=Math.sin(n),i=Math.cos(n);e.subtractEquals(t);var s=e.x*i-e.y*r,o=e.x*r+e.y*i;return(new fabric.Point(s,o)).addEquals(t)},transformPoint:function(e,t,n){return n?new fabric.Point(t[0]*e.x+t[1]*e.y,t[2]*e.x+t[3]*e.y):new fabric.Point(t[0]*e.x+t[1]*e.y+t[4],t[2]*e.x+t[3]*e.y+t[5])},invertTransform:function(e){var t=e.slice(),n=1/(e[0]*e[3]-e[1]*e[2]);t=[n*e[3],-n*e[1],-n*e[2],n*e[0],0,0];var r=fabric.util.transformPoint({x:e[4],y:e[5]},t);return t[4]=-r.x,t[5]=-r.y,t},toFixed:function(e,t){return parseFloat(Number(e).toFixed(t))},parseUnit:function(e){var t=/\D{0,2}$/.exec(e),n=parseFloat(e);switch(t[0]){case"mm":return n*fabric.DPI/25.4;case"cm":return n*fabric.DPI/2.54;case"in":return n*fabric.DPI;case"pt":return n*fabric.DPI/72;case"pc":return n*fabric.DPI/72*12;default:return n}},falseFunction:function(){return!1},getKlass:function(e,t){return e=fabric.util.string.camelize(e.charAt(0).toUpperCase()+e.slice(1)),fabric.util.resolveNamespace(t)[e]},resolveNamespace:function(t){if(!t)return fabric;var n=t.split("."),r=n.length,i=e||fabric.window;for(var s=0;sr)r+=u[p++%h],r>l&&(r=l),e[d?"lineTo":"moveTo"](r,0),d=!d;e.restore()},createCanvasElement:function(e){return e||(e=fabric.document.createElement("canvas")),!e.getContext&&typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager.initElement(e),e},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(e){var t=e.prototype;for(var n=t.stateProperties.length;n--;){var r=t.stateProperties[n],i=r.charAt(0).toUpperCase()+r.slice(1),s="set"+i,o="get"+i;t[o]||(t[o]=function(e){return new Function('return this.get("'+e+'")')}(r)),t[s]||(t[s]=function(e){return new Function("value",'return this.set("'+e+'", value)')}(r))}},clipContext:function(e,t){t.save(),t.beginPath(),e.clipTo(t),t.clip()},multiplyTransformMatrices:function(e,t){var n=[[e[0],e[2],e[4]],[e[1],e[3],e[5]],[0,0,1]],r=[[t[0],t[2],t[4]],[t[1],t[3],t[5]],[0,0,1]],i=[];for(var s=0;s<3;s++){i[s]=[];for(var o=0;o<3;o++){var u=0;for(var a=0;a<3;a++)u+=n[s][a]*r[a][o];i[s][o]=u}}return[i[0][0],i[1][0],i[0][1],i[1][1],i[0][2],i[1][2]]},getFunctionBody:function(e){return(String(e).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},isTransparent:function(e,t,n,r){r>0&&(t>r?t-=r:t=0,n>r?n-=r:n=0);var i=!0,s=e.getImageData(t,n,r*2||1,r*2||1);for(var o=3,u=s.data.length;o0?_-=2*h:f===1&&_<0&&(_+=2*h);var D=Math.ceil(Math.abs(_/h*2)),P=[],H=_/D,B=8/3*Math.sin(H/4)*Math.sin(H/4)/Math.sin(H/2),j=M+H;for(var F=0;F=i?s-i:2*Math.PI-(i-s)}function u(e,t,i,s,o,u,a,f){var l=r.call(arguments);if(n[l])return n[l];var c=Math.sqrt,h=Math.min,p=Math.max,d=Math.abs,v=[],m=[[],[]],g,y,b,w,E,S,x,T;y=6*e-12*i+6*o,g=-3*e+9*i-9*o+3*a,b=3*i-3*e;for(var N=0;N<2;++N){N>0&&(y=6*t-12*s+6*u,g=-3*t+9*s-9*u+3*f,b=3*s-3*t);if(d(g)<1e-12){if(d(y)<1e-12)continue;w=-b/y,0=t})}function r(e,t){return i(e,t,function(e,t){return e>>0;if(n===0)return-1;var r=0;arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:r!==0&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r))));if(r>=n)return-1;var i=r>=0?r:Math.max(n-Math.abs(r),0);for(;i>>0;n>>0;r>>0;n>>0;n>>0;i>>0,n=0,r;if(arguments.length>1)r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:e,capitalize:t,escapeXml:n}}(),function(){var e=Array.prototype.slice,t=Function.prototype.apply,n=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var i=this,s=e.call(arguments,1),o;return s.length?o=function(){return t.call(i,this instanceof n?this:r,s.concat(e.call(arguments)))}:o=function(){return t.call(i,this instanceof n?this:r,arguments)},n.prototype=this.prototype,o.prototype=new n,o})}(),function(){function i(){}function s(t){var n=this.constructor.superclass.prototype[t];return arguments.length>1?n.apply(this,e.call(arguments,1)):n.call(this)}function o(){function u(){this.initialize.apply(this,arguments)}var n=null,o=e.call(arguments,0);typeof o[0]=="function"&&(n=o.shift()),u.superclass=n,u.subclasses=[],n&&(i.prototype=n.prototype,u.prototype=new i,n.subclasses.push(u));for(var a=0,f=o.length;a-1?e.prototype[i]=function(e){return function(){var n=this.constructor.superclass;this.constructor.superclass=r;var i=t[e].apply(this,arguments);this.constructor.superclass=n;if(e!=="initialize")return i}}(i):e.prototype[i]=t[i],n&&(t.toString!==Object.prototype.toString&&(e.prototype.toString=t.toString),t.valueOf!==Object.prototype.valueOf&&(e.prototype.valueOf=t.valueOf))};fabric.util.createClass=o}(),function(){function t(e){var t=Array.prototype.slice.call(arguments,1),n,r,i=t.length;for(r=0;r-1?s(e,t.match(/opacity:\s*(\d?\.?\d*)/)[1]):e;for(var r in t)if(r==="opacity")s(e,t[r]);else{var i=r==="float"||r==="cssFloat"?typeof n.styleFloat=="undefined"?"cssFloat":"styleFloat":r;n[i]=t[r]}return e}var t=fabric.document.createElement("div"),n=typeof t.style.opacity=="string",r=typeof t.style.filter=="string",i=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(e){return e};n?s=function(e,t){return e.style.opacity=t,e}:r&&(s=function(e,t){var n=e.style;return e.currentStyle&&!e.currentStyle.hasLayout&&(n.zoom=1),i.test(n.filter)?(t=t>=.9999?"":"alpha(opacity="+t*100+")",n.filter=n.filter.replace(i,t)):n.filter+=" alpha(opacity="+t*100+")",e}),fabric.util.setStyle=e}(),function(){function t(e){return typeof e=="string"?fabric.document.getElementById(e):e}function s(e,t){var n=fabric.document.createElement(e);for(var r in t)r==="class"?n.className=t[r]:r==="for"?n.htmlFor=t[r]:n.setAttribute(r,t[r]);return n}function o(e,t){e&&(" "+e.className+" ").indexOf(" "+t+" ")===-1&&(e.className+=(e.className?" ":"")+t)}function u(e,t,n){return typeof t=="string"&&(t=s(t,n)),e.parentNode&&e.parentNode.replaceChild(t,e),t.appendChild(e),t}function a(e,t){var n,r,i=0,s=0,o=fabric.document.documentElement,u=fabric.document.body||{scrollLeft:0,scrollTop:0};r=e;while(e&&e.parentNode&&!n)e=e.parentNode,e!==fabric.document&&fabric.util.getElementStyle(e,"position")==="fixed"&&(n=e),e!==fabric.document&&r!==t&&fabric.util.getElementStyle(e,"position")==="absolute"?(i=0,s=0):e===fabric.document?(i=u.scrollLeft||o.scrollLeft||0,s=u.scrollTop||o.scrollTop||0):(i+=e.scrollLeft||0,s+=e.scrollTop||0);return{left:i,top:s}}function f(e){var t,n=e&&e.ownerDocument,r={left:0,top:0},i={left:0,top:0},s,o={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!n)return{left:0,top:0};for(var u in o)i[o[u]]+=parseInt(l(e,u),10)||0;return t=n.documentElement,typeof e.getBoundingClientRect!="undefined"&&(r=e.getBoundingClientRect()),s=fabric.util.getScrollLeftTop(e,null),{left:r.left+s.left-(t.clientLeft||0)+i.left,top:r.top+s.top-(t.clientTop||0)+i.top}}var e=Array.prototype.slice,n,r=function(t){return e.call(t,0)};try{n=r(fabric.document.childNodes)instanceof Array}catch(i){}n||(r=function(e){var t=new Array(e.length),n=e.length;while(n--)t[n]=e[n];return t});var l;fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?l=function(e,t){var n=fabric.document.defaultView.getComputedStyle(e,null);return n?n[t]:undefined}:l=function(e,t){var n=e.style[t];return!n&&e.currentStyle&&(n=e.currentStyle[t]),n},function(){function n(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=fabric.util.falseFunction),t?e.style[t]="none":typeof e.unselectable=="string"&&(e.unselectable="on"),e}function r(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=null),t?e.style[t]="":typeof e.unselectable=="string"&&(e.unselectable=""),e}var e=fabric.document.documentElement.style,t="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=n,fabric.util.makeElementSelectable=r}(),function(){function e(e,t){var n=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),i=!0;r.onload=r.onreadystatechange=function(e){if(i){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")return;i=!1,t(e||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=e,n.appendChild(r)}fabric.util.getScript=e}(),fabric.util.getById=t,fabric.util.toArray=r,fabric.util.makeElement=s,fabric.util.addClass=o,fabric.util.wrapElement=u,fabric.util.getScrollLeftTop=a,fabric.util.getElementOffset=f,fabric.util.getElementStyle=l}(),function(){function e(e,t){return e+(/\?/.test(e)?"&":"?")+t}function n(){}function r(r,i){i||(i={});var s=i.method?i.method.toUpperCase():"GET",o=i.onComplete||function(){},u=t(),a;return u.onreadystatechange=function(){u.readyState===4&&(o(u),u.onreadystatechange=n)},s==="GET"&&(a=null,typeof i.parameters=="string"&&(r=e(r,i.parameters))),u.open(s,r,!0),(s==="POST"||s==="PUT")&&u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(a),u}var t=function(){var e=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}];for(var t=e.length;t--;)try{var n=e[t]();if(n)return e[t]}catch(r){}}();fabric.util.request=r}(),fabric.log=function(){},fabric.warn=function(){},typeof console!="undefined"&&["log","warn"].forEach(function(e){typeof console[e]!="undefined"&&console[e].apply&&(fabric[e]=function(){return console[e].apply(console,arguments)})}),function(){function e(e){n(function(t){e||(e={});var r=t||+(new Date),i=e.duration||500,s=r+i,o,u=e.onChange||function(){},a=e.abort||function(){return!1},f=e.easing||function(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t},l="startValue"in e?e.startValue:0,c="endValue"in e?e.endValue:100,h=e.byValue||c-l;e.onStart&&e.onStart(),function p(t){o=t||+(new Date);var c=o>s?i:o-r;if(a()){e.onComplete&&e.onComplete();return}u(f(c,l,h,i));if(o>s){e.onComplete&&e.onComplete();return}n(p)}(r)})}function n(){return t.apply(fabric.window,arguments)}var t=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(e){fabric.window.setTimeout(e,1e3/60)};fabric.util.animate=e,fabric.util.requestAnimFrame=n}(),function(){function e(e,t,n,r){return et[3]?t[3]:t[0];if(t[0]===1&&t[3]===1&&t[4]===0&&t[5]===0)return;var n=e.ownerDocument.createElement("g");while(e.firstChild!=null)n.appendChild(e.firstChild);n.setAttribute("transform","matrix("+t[0]+" "+t[1]+" "+t[2]+" "+t[3]+" "+t[4]+" "+t[5]+")"),e.appendChild(n)}function x(e){var n=e.objects,i=e.options;return n=n.map(function(e){return t[r(e.type)].fromObject(e)}),{objects:n,options:i}}function T(e,t,n){t[n]&&t[n].toSVG&&e.push('','')}var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.string.capitalize,i=t.util.object.clone,s=t.util.toFixed,o=t.util.parseUnit,u=t.util.multiplyTransformMatrices,a={cx:"left",x:"left",r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","stroke-dasharray":"strokeDashArray","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"originX"},f={stroke:"strokeOpacity",fill:"fillOpacity"};t.parseTransformAttribute=function(){function e(e,t){var n=t[0];e[0]=Math.cos(n),e[1]=Math.sin(n),e[2]=-Math.sin(n),e[3]=Math.cos(n)}function n(e,t){var n=t[0],r=t.length===2?t[1]:t[0];e[0]=n,e[3]=r}function r(e,t){e[2]=t[0]}function i(e,t){e[1]=t[0]}function s(e,t){e[4]=t[0],t.length===2&&(e[5]=t[1])}var o=[1,0,0,1,0,0],u="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",a="(?:\\s+,?\\s*|,\\s*)",f="(?:(skewX)\\s*\\(\\s*("+u+")\\s*\\))",l="(?:(skewY)\\s*\\(\\s*("+u+")\\s*\\))",c="(?:(rotate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+")"+a+"("+u+"))?\\s*\\))",h="(?:(scale)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",p="(?:(translate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",d="(?:(matrix)\\s*\\(\\s*("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+"\\s*\\))",v="(?:"+d+"|"+p+"|"+h+"|"+c+"|"+f+"|"+l+")",m="(?:"+v+"(?:"+a+v+")*"+")",g="^\\s*(?:"+m+"?)\\s*$",y=new RegExp(g),b=new RegExp(v,"g");return function(u){var a=o.concat(),f=[];if(!u||u&&!y.test(u))return a;u.replace(b,function(u){var l=(new RegExp(v)).exec(u).filter(function(e){return e!==""&&e!=null}),c=l[1],h=l.slice(2).map(parseFloat);switch(c){case"translate":s(a,h);break;case"rotate":h[0]=t.util.degreesToRadians(h[0]),e(a,h);break;case"scale":n(a,h);break;case"skewX":r(a,h);break;case"skewY":i(a,h);break;case"matrix":a=h}f.push(a.concat()),a=o.concat()});var l=f[0];while(f.length>1)f.shift(),l=t.util.multiplyTransformMatrices(l,f[0]);return l}}(),t.parseSVGDocument=function(){function s(e,t){while(e&&(e=e.parentNode))if(t.test(e.nodeName))return!0;return!1}var e=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/,n="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",r=new RegExp("^\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*"+"$");return function(n,u,a){if(!n)return;var f=new Date;w(n);var l=n.getAttribute("viewBox"),c=o(n.getAttribute("width")||"100%"),h=o(n.getAttribute("height")||"100%"),p,d;if(l&&(l=l.match(r))){var v=parseFloat(l[1]),m=parseFloat(l[2]),g=1,y=1;p=parseFloat(l[3]),d=parseFloat(l[4]),c&&c!==p&&(g=c/p),h&&h!==d&&(y=h/d),E(n,[g,0,0,y,g*-v,y*-m])}var b=t.util.toArray(n.getElementsByTagName("*"));if(b.length===0&&t.isLikelyNode){b=n.selectNodes('//*[name(.)!="svg"]');var S=[];for(var x=0,T=b.length;x/i,"")));if(!s||!s.documentElement)return;t.parseSVGDocument(s.documentElement,function(r,i){S.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),S.has(e,function(r){r?S.get(e,function(e){var t=x(e);n(t.objects,t.options)}):new t.util.request(e,{method:"get",onComplete:i})})},loadSVGFromString:function(e,n,r){e=e.trim();var i;if(typeof DOMParser!="undefined"){var s=new DOMParser;s&&s.parseFromString&&(i=s.parseFromString(e,"text/xml"))}else t.window.ActiveXObject&&(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(e.replace(//i,"")));t.parseSVGDocument(i.documentElement,function(e,t){n(e,t)},r)},createSVGFontFacesMarkup:function(e){var t="";for(var n=0,r=e.length;n',"",""].join("")),t},createSVGRefElementsMarkup:function(e){var t=[];return T(t,e,"backgroundColor"),T(t,e,"overlayColor"),t.join("")}})}(typeof exports!="undefined"?exports:this),fabric.ElementsParser=function(e,t,n,r){this.elements=e,this.callback=t,this.options=n,this.reviver=r},fabric.ElementsParser.prototype.parse=function(){this.instances=new Array(this.elements.length),this.numElements=this.elements.length,this.createObjects()},fabric.ElementsParser.prototype.createObjects=function(){for(var e=0,t=this.elements.length;ee.x&&this.y>e.y},gte:function(e){return this.x>=e.x&&this.y>=e.y},lerp:function(e,t){return new n(this.x+(e.x-this.x)*t,this.y+(e.y-this.y)*t)},distanceFrom:function(e){var t=this.x-e.x,n=this.y-e.y;return Math.sqrt(t*t+n*n)},midPointFrom:function(e){return new n(this.x+(e.x-this.x)/2,this.y+(e.y-this.y)/2)},min:function(e){return new n(Math.min(this.x,e.x),Math.min(this.y,e.y))},max:function(e){return new n(Math.max(this.x,e.x),Math.max(this.y,e.y))},toString:function(){return this.x+","+this.y},setXY:function(e,t){this.x=e,this.y=t},setFromPoint:function(e){this.x=e.x,this.y=e.y},swap:function(e){var t=this.x,n=this.y;this.x=e.x,this.y=e.y,e.x=t,e.y=n}}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){this.status=e,this.points=[]}var t=e.fabric||(e.fabric={});if(t.Intersection){t.warn("fabric.Intersection is already defined");return}t.Intersection=n,t.Intersection.prototype={appendPoint:function(e){this.points.push(e)},appendPoints:function(e){this.points=this.points.concat(e)}},t.Intersection.intersectLineLine=function(e,r,i,s){var o,u=(s.x-i.x)*(e.y-i.y)-(s.y-i.y)*(e.x-i.x),a=(r.x-e.x)*(e.y-i.y)-(r.y-e.y)*(e.x-i.x),f=(s.y-i.y)*(r.x-e.x)-(s.x-i.x)*(r.y-e.y);if(f!==0){var l=u/f,c=a/f;0<=l&&l<=1&&0<=c&&c<=1?(o=new n("Intersection"),o.points.push(new t.Point(e.x+l*(r.x-e.x),e.y+l*(r.y-e.y)))):o=new n}else u===0||a===0?o=new n("Coincident"):o=new n("Parallel");return o},t.Intersection.intersectLinePolygon=function(e,t,r){var i=new n,s=r.length;for(var o=0;o0&&(i.status="Intersection"),i},t.Intersection.intersectPolygonPolygon=function(e,t){var r=new n,i=e.length;for(var s=0;s0&&(r.status="Intersection"),r},t.Intersection.intersectPolygonRectangle=function(e,r,i){var s=r.min(i),o=r.max(i),u=new t.Point(o.x,s.y),a=new t.Point(s.x,o.y),f=n.intersectLinePolygon(s,u,e),l=n.intersectLinePolygon(u,o,e),c=n.intersectLinePolygon(o,a,e),h=n.intersectLinePolygon(a,s,e),p=new n;return p.appendPoints(f.points),p.appendPoints(l.points),p.appendPoints(c.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){e?this._tryParsingColor(e):this.setSource([0,0,0,1])}function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var t=e.fabric||(e.fabric={});if(t.Color){t.warn("fabric.Color is already defined.");return}t.Color=n,t.Color.prototype={_tryParsingColor:function(e){var t;e in n.colorNameMap&&(e=n.colorNameMap[e]);if(e==="transparent"){this.setSource([255,255,255,0]);return}t=n.sourceFromHex(e),t||(t=n.sourceFromRgb(e)),t||(t=n.sourceFromHsl(e)),t&&this.setSource(t)},_rgbToHsl:function(e,n,r){e/=255,n/=255,r/=255;var i,s,o,u=t.util.array.max([e,n,r]),a=t.util.array.min([e,n,r]);o=(u+a)/2;if(u===a)i=s=0;else{var f=u-a;s=o>.5?f/(2-u-a):f/(u+a);switch(u){case e:i=(n-r)/f+(n1?1:n;if(t){var o=t.split(/\s*;\s*/);o[o.length-1]===""&&o.pop();for(var u=o.length;u--;){var a=o[u].split(/\s*:\s*/),f=a[0].trim(),l=a[1].trim();f==="stop-color"?r=l:f==="stop-opacity"&&(s=l)}}return r||(r=e.getAttribute("stop-color")||"rgb(0,0,0)"),s||(s=e.getAttribute("stop-opacity")),r=new fabric.Color(r),i=r.getAlpha(),s=isNaN(parseFloat(s))?1:parseFloat(s),s*=i,{offset:n,color:r.toRgb(),opacity:s}}function t(e){return{x1:e.getAttribute("x1")||0,y1:e.getAttribute("y1")||0,x2:e.getAttribute("x2")||"100%",y2:e.getAttribute("y2")||0}}function n(e){return{x1:e.getAttribute("fx")||e.getAttribute("cx")||"50%",y1:e.getAttribute("fy")||e.getAttribute("cy")||"50%",r1:0,x2:e.getAttribute("cx")||"50%",y2:e.getAttribute("cy")||"50%",r2:e.getAttribute("r")||"50%"}}function r(e,t,n){var r,i=0,s=1,o="";for(var u in t){r=parseFloat(t[u],10),typeof t[u]=="string"&&/^\d+%$/.test(t[u])?s=.01:s=1;if(u==="x1"||u==="x2"||u==="r2")s*=n==="objectBoundingBox"?e.width:1,i=n==="objectBoundingBox"?e.left||0:0;else if(u==="y1"||u==="y2")s*=n==="objectBoundingBox"?e.height:1,i=n==="objectBoundingBox"?e.top||0:0;t[u]=r*s+i}if(e.type==="ellipse"&&t.r2!==null&&n==="objectBoundingBox"&&e.rx!==e.ry){var a=e.ry/e.rx;o=" scale(1, "+a+")",t.y1&&(t.y1/=a),t.y2&&(t.y2/=a)}return o}fabric.Gradient=fabric.util.createClass({offsetX:0,offsetY:0,initialize:function(e){e||(e={});var t={};this.id=fabric.Object.__uid++,this.type=e.type||"linear",t={x1:e.coords.x1||0,y1:e.coords.y1||0,x2:e.coords.x2||0,y2:e.coords.y2||0},this.type==="radial"&&(t.r1=e.coords.r1||0,t.r2=e.coords.r2||0),this.coords=t,this.colorStops=e.colorStops.slice(),e.gradientTransform&&(this.gradientTransform=e.gradientTransform),this.offsetX=e.offsetX||this.offsetX,this.offsetY=e.offsetY||this.offsetY},addColorStop:function(e){for(var t in e){var n=new fabric.Color(e[t]);this.colorStops.push({offset:t,color:n.toRgb(),opacity:n.getAlpha()})}return this},toObject:function(){return{type:this.type,coords:this.coords,colorStops:this.colorStops,offsetX:this.offsetX,offsetY:this.offsetY}},toSVG:function(e){var t=fabric.util.object.clone(this.coords),n,r;this.colorStops.sort(function(e,t){return e.offset-t.offset});if(!e.group||e.group.type!=="path-group")for(var i in t)if(i==="x1"||i==="x2"||i==="r2")t[i]+=this.offsetX-e.width/2;else if(i==="y1"||i==="y2")t[i]+=this.offsetY-e.height/2;r='id="SVGID_'+this.id+'" gradientUnits="userSpaceOnUse"',this.gradientTransform&&(r+=' gradientTransform="matrix('+this.gradientTransform.join(" ")+')" '),this.type==="linear"?n=["\n']:this.type==="radial"&&(n=["\n']);for(var s=0;s\n');return n.push(this.type==="linear"?"\n":"\n"),n.join("")},toLive:function(e,t){var n,r=fabric.util.object.clone(this.coords);if(!this.type)return;if(t.group&&t.group.type==="path-group")for(var i in r)if(i==="x1"||i==="x2")r[i]+=-this.offsetX+t.width/2;else if(i==="y1"||i==="y2")r[i]+=-this.offsetY+t.height/2;this.type==="linear"?n=e.createLinearGradient(r.x1,r.y1,r.x2,r.y2):this.type==="radial"&&(n=e.createRadialGradient(r.x1,r.y1,r.r1,r.x2,r.y2,r.r2));for(var s=0,o=this.colorStops.length;s'+''+""},toLive:function(e){var t=typeof this.source=="function"?this.source():this.source;if(!t)return"";if(typeof t.src!="undefined"){if(!t.complete)return"";if(t.naturalWidth===0||t.naturalHeight===0)return""}return e.createPattern(t,this.repeat)}}),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Shadow){t.warn("fabric.Shadow is already defined.");return}t.Shadow=t.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(e){typeof e=="string"&&(e=this._parseShadow(e));for(var n in e)this[n]=e[n];this.id=t.Object.__uid++},_parseShadow:function(e){var n=e.trim(),r=t.Shadow.reOffsetsAndBlur.exec(n)||[],i=n.replace(t.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)";return{color:i.trim(),offsetX:parseInt(r[1],10)||0,offsetY:parseInt(r[2],10)||0,blur:parseInt(r[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(e){var t="SourceAlpha";return e&&(e.fill===this.color||e.stroke===this.color)&&(t="SourceGraphic"),''+''+''+""+""+''+""+""},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY};var e={},n=t.Shadow.prototype;return this.color!==n.color&&(e.color=this.color),this.blur!==n.blur&&(e.blur=this.blur),this.offsetX!==n.offsetX&&(e.offsetX=this.offsetX),this.offsetY!==n.offsetY&&(e.offsetY=this.offsetY),e}}),t.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/}(typeof exports!="undefined"?exports:this),function(){"use strict";if(fabric.StaticCanvas){fabric.warn("fabric.StaticCanvas is already defined.");return}var e=fabric.util.object.extend,t=fabric.util.getElementOffset,n=fabric.util.removeFromArray,r=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass({initialize:function(e,t){t||(t={}),this._initStatic(e,t),fabric.StaticCanvas.activeInstance=this},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!0,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:[1,0,0,1,0,0],onBeforeScaleRotate:function(){},_initStatic:function(e,t){this._objects=[],this._createLowerCanvas(e),this._initOptions(t),this._setImageSmoothing(),t.overlayImage&&this.setOverlayImage(t.overlayImage,this.renderAll.bind(this)),t.backgroundImage&&this.setBackgroundImage(t.backgroundImage,this.renderAll.bind(this)),t.backgroundColor&&this.setBackgroundColor(t.backgroundColor,this.renderAll.bind(this)),t.overlayColor&&this.setOverlayColor(t.overlayColor,this.renderAll.bind(this)),this.calcOffset()},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(e,t,n){return this.__setBgOverlayImage("overlayImage",e,t,n)},setBackgroundImage:function(e,t,n){return this.__setBgOverlayImage("backgroundImage",e,t,n)},setOverlayColor:function(e,t){return this.__setBgOverlayColor("overlayColor",e,t)},setBackgroundColor:function(e,t){return this.__setBgOverlayColor("backgroundColor",e,t)},_setImageSmoothing:function(){var e=this.getContext();e.imageSmoothingEnabled=this.imageSmoothingEnabled,e.webkitImageSmoothingEnabled=this.imageSmoothingEnabled,e.mozImageSmoothingEnabled=this.imageSmoothingEnabled,e.msImageSmoothingEnabled=this.imageSmoothingEnabled,e.oImageSmoothingEnabled=this.imageSmoothingEnabled},__setBgOverlayImage:function(e,t,n,r){return typeof t=="string"?fabric.util.loadImage(t,function(t){this[e]=new fabric.Image(t,r),n&&n()},this):(this[e]=t,n&&n()),this},__setBgOverlayColor:function(e,t,n){if(t&&t.source){var r=this;fabric.util.loadImage(t.source,function(i){r[e]=new fabric.Pattern({source:i,repeat:t.repeat,offsetX:t.offsetX,offsetY:t.offsetY}),n&&n()})}else this[e]=t,n&&n();return this},_createCanvasElement:function(){var e=fabric.document.createElement("canvas");e.style||(e.style={});if(!e)throw r;return this._initCanvasElement(e),e},_initCanvasElement:function(e){fabric.util.createCanvasElement(e);if(typeof e.getContext=="undefined")throw r},_initOptions:function(e){for(var t in e)this[t]=e[t];this.width=this.width||parseInt(this.lowerCanvasEl.width,10)||0,this.height=this.height||parseInt(this.lowerCanvasEl.height,10)||0;if(!this.lowerCanvasEl.style)return;this.lowerCanvasEl.width=this.width,this.lowerCanvasEl.height=this.height,this.lowerCanvasEl.style.width=this.width+"px",this.lowerCanvasEl.style.height=this.height+"px",this.viewportTransform=this.viewportTransform.slice()},_createLowerCanvas:function(e){this.lowerCanvasEl=fabric.util.getById(e)||this._createCanvasElement(),this._initCanvasElement(this.lowerCanvasEl),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(e,t){return this.setDimensions({width:e},t)},setHeight:function(e,t){return this.setDimensions({height:e},t)},setDimensions:function(e,t){var n;t=t||{};for(var r in e)n=e[r],t.cssOnly||(this._setBackstoreDimension(r,e[r]),n+="px"),t.backstoreOnly||this._setCssDimension(r,n);return t.cssOnly||this.renderAll(),this.calcOffset(),this},_setBackstoreDimension:function(e,t){return this.lowerCanvasEl[e]=t,this.upperCanvasEl&&(this.upperCanvasEl[e]=t),this.cacheCanvasEl&&(this.cacheCanvasEl[e]=t),this[e]=t,this},_setCssDimension:function(e,t){return this.lowerCanvasEl.style[e]=t,this.upperCanvasEl&&(this.upperCanvasEl.style[e]=t),this.wrapperEl&&(this.wrapperEl.style[e]=t),this},getZoom:function(){return Math.sqrt(this.viewportTransform[0]*this.viewportTransform[3])},setViewportTransform:function(e){this.viewportTransform=e,this.renderAll();for(var t=0,n=this._objects.length;t"),n.join("")},_setSVGPreamble:function(e,t){t.suppressPreamble||e.push('','\n')},_setSVGHeader:function(e,t){var n,r,i;t.viewBox?(n=t.viewBox.width,r=t.viewBox.height):(n=this.width,r=this.height,this.svgViewportTransformation||(i=this.viewportTransform,n/=i[0],r/=i[3])),e.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),"")},_setSVGObjects:function(e,t){var n=this.getActiveGroup();n&&this.discardActiveGroup();for(var r=0,i=this.getObjects(),s=i.length;r"):this[t]&&t==="overlayColor"&&e.push('")},sendToBack:function(e){return n(this._objects,e),this._objects.unshift(e),this.renderAll&&this.renderAll()},bringToFront:function(e){return n(this._objects,e),this._objects.push(e),this.renderAll&&this.renderAll()},sendBackwards:function(e,t){var r=this._objects.indexOf(e);if(r!==0){var i=this._findNewLowerIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewLowerIndex:function(e,t,n){var r;if(n){r=t;for(var i=t-1;i>=0;--i){var s=e.intersectsWithObject(this._objects[i])||e.isContainedWithinObject(this._objects[i])||this._objects[i].isContainedWithinObject(e);if(s){r=i;break}}}else r=t-1;return r},bringForward:function(e,t){var r=this._objects.indexOf(e);if(r!==this._objects.length-1){var i=this._findNewUpperIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewUpperIndex:function(e,t,n){var r;if(n){r=t;for(var i=t+1;i"}}),e(fabric.StaticCanvas.prototype,fabric.Observable),e(fabric.StaticCanvas.prototype,fabric.Collection),e(fabric.StaticCanvas.prototype,fabric.DataURLExporter),e(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(e){var t=fabric.util.createCanvasElement();if(!t||!t.getContext)return null;var n=t.getContext("2d");if(!n)return null;switch(e){case"getImageData":return typeof +n.getImageData!="undefined";case"setLineDash":return typeof n.setLineDash!="undefined";case"toDataURL":return typeof t.toDataURL!="undefined";case"toDataURLWithQuality":try{return t.toDataURL("image/jpeg",0),!0}catch(r){}return!1;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",setShadow:function(e){return this.shadow=new fabric.Shadow(e),this},_setBrushStyles:function(){var e=this.canvas.contextTop;e.strokeStyle=this.color,e.lineWidth=this.width,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin},_setShadow:function(){if(!this.shadow)return;var e=this.canvas.contextTop;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_resetShadow:function(){var e=this.canvas.contextTop;e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0}}),function(){var e=fabric.util.array.min,t=fabric.util.array.max;fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(e){this.canvas=e,this._points=[]},onMouseDown:function(e){this._prepareForDrawing(e),this._captureDrawingPath(e),this._render()},onMouseMove:function(e){this._captureDrawingPath(e),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(e){var t=new fabric.Point(e.x,e.y);this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)},_addPoint:function(e){this._points.push(e)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(e){var t=new fabric.Point(e.x,e.y);this._addPoint(t)},_render:function(){var e=this.canvas.contextTop,t=this.canvas.viewportTransform,n=this._points[0],r=this._points[1];e.save(),e.transform(t[0],t[1],t[2],t[3],t[4],t[5]),e.beginPath(),this._points.length===2&&n.x===r.x&&n.y===r.y&&(n.x-=.5,r.x+=.5),e.moveTo(n.x,n.y);for(var i=1,s=this._points.length;in.padding?e.x<0?e.x+=n.padding:e.x-=n.padding:e.x=0,i(e.y)>n.padding?e.y<0?e.y+=n.padding:e.y-=n.padding:e.y=0},_rotateObject:function(e,t){var i=this._currentTransform;if(i.target.get("lockRotation"))return;var s=r(i.ey-i.top,i.ex-i.left),o=r(t-i.top,e-i.left),u=n(o-s+i.theta);u<0&&(u=360+u),i.target.angle=u},setCursor:function(e){this.upperCanvasEl.style.cursor=e},_resetObjectTransform:function(e){e.scaleX=1,e.scaleY=1,e.setAngle(0)},_drawSelection:function(){var e=this.contextTop,t=this._groupSelector,n=t.left,r=t.top,o=i(n),u=i(r);e.fillStyle=this.selectionColor,e.fillRect(t.ex-(n>0?0:-n),t.ey-(r>0?0:-r),o,u),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var a=t.ex+s-(n>0?0:o),f=t.ey+s-(r>0?0:u);e.beginPath(),fabric.util.drawDashedLine(e,a,f,a+o,f,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f+u-1,a+o,f+u-1,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f,a,f+u,this.selectionDashArray),fabric.util.drawDashedLine(e,a+o-1,f,a+o-1,f+u,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+s-(n>0?0:o),t.ey+s-(r>0?0:u),o,u)},_isLastRenderedObject:function(e){return this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay.visible&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(this.getPointer(e,!0))},findTarget:function(e,t){if(this.skipTargetFind)return;if(this._isLastRenderedObject(e))return this.lastRenderedObjectWithControlsAboveOverlay;var n=this.getActiveGroup();if(n&&!t&&this.containsPoint(e,n))return n;var r=this._searchPossibleTargets(e);return this._fireOverOutEvents(r),r},_fireOverOutEvents:function(e){e?this._hoveredTarget!==e&&(this.fire("mouse:over",{target:e}),e.fire("mouseover"),this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget}),this._hoveredTarget.fire("mouseout")),this._hoveredTarget=e):this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget}),this._hoveredTarget.fire("mouseout"),this._hoveredTarget=null)},_checkTarget:function(e,t,n){if(t&&t.visible&&t.evented&&this.containsPoint(e,t)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||!!t.isEditing)return!0;var r=this.isTargetTransparent(t,n.x,n.y);if(!r)return!0}},_searchPossibleTargets:function(e){var t,n=this.getPointer(e,!0),r=this._objects.length;while(r--)if(this._checkTarget(e,this._objects[r],n)){this.relatedTarget=this._objects[r],t=this._objects[r];break}return t},getPointer:function(t,n,r){r||(r=this.upperCanvasEl);var i=e(t,r),s=r.getBoundingClientRect(),o;return this.calcOffset(),i.x=i.x-this._offset.left,i.y=i.y-this._offset.top,n||(i=fabric.util.transformPoint(i,fabric.util.invertTransform(this.viewportTransform))),s.width===0||s.height===0?o={width:1,height:1}:o={width:r.width/s.width,height:r.height/s.height},{x:i.x*o.width,y:i.y*o.height}},_createUpperCanvas:function(){var e=this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/,"");this.upperCanvasEl=this._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+e),this.wrapperEl.appendChild(this.upperCanvasEl),this._copyCanvasStyle(this.lowerCanvasEl,this.upperCanvasEl),this._applyCanvasStyle(this.upperCanvasEl),this.contextTop=this.upperCanvasEl.getContext("2d")},_createCacheCanvas:function(){this.cacheCanvasEl=this._createCanvasElement(),this.cacheCanvasEl.setAttribute("width",this.width),this.cacheCanvasEl.setAttribute("height",this.height),this.contextCache=this.cacheCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{"class":this.containerClass}),fabric.util.setStyle(this.wrapperEl,{width:this.getWidth()+"px",height:this.getHeight()+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(e){var t=this.getWidth()||e.width,n=this.getHeight()||e.height;fabric.util.setStyle(e,{position:"absolute",width:t+"px",height:n+"px",left:0,top:0}),e.width=t,e.height=n,fabric.util.makeElementUnselectable(e)},_copyCanvasStyle:function(e,t){t.style.cssText=e.style.cssText},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},_setActiveObject:function(e){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=e,e.set("active",!0)},setActiveObject:function(e,t){return this._setActiveObject(e),this.renderAll(),this.fire("object:selected",{target:e,e:t}),e.fire("selected",{e:t}),this},getActiveObject:function(){return this._activeObject},_discardActiveObject:function(){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=null},discardActiveObject:function(e){return this._discardActiveObject(),this.renderAll(),this.fire("selection:cleared",{e:e}),this},_setActiveGroup:function(e){this._activeGroup=e,e&&e.set("active",!0)},setActiveGroup:function(e,t){return this._setActiveGroup(e),e&&(this.fire("object:selected",{target:e,e:t}),e.fire("selected",{e:t})),this},getActiveGroup:function(){return this._activeGroup},_discardActiveGroup:function(){var e=this.getActiveGroup();e&&e.destroy(),this.setActiveGroup(null)},discardActiveGroup:function(e){return this._discardActiveGroup(),this.fire("selection:cleared",{e:e}),this},deactivateAll:function(){var e=this.getObjects(),t=0,n=e.length;for(;t1&&(t=new fabric.Group(t.reverse(),{originX:"center",originY:"center",canvas:this}),t.addWithUpdate(),this.setActiveGroup(t,e),t.saveCoords(),this.fire("selection:created",{target:t}),this.renderAll())},_collectObjects:function(){var n=[],r,i=this._groupSelector.ex,s=this._groupSelector.ey,o=i+this._groupSelector.left,u=s+this._groupSelector.top,a=new fabric.Point(e(i,o),e(s,u)),f=new fabric.Point(t(i,o),t(s,u)),l=i===o&&s===u;for(var c=this._objects.length;c--;){r=this._objects[c];if(!r||!r.selectable||!r.visible)continue;if(r.intersectsWithRect(a,f)||r.isContainedWithinRect(a,f)||r.containsPoint(a)||r.containsPoint(f)){r.set("active",!0),n.push(r);if(l)break}}return n},_maybeGroupObjects:function(e){this.selection&&this._groupSelector&&this._groupSelectedObjects(e);var t=this.getActiveGroup();t&&(t.setObjectsCoords().setCoords(),t.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(e){e||(e={});var t=e.format||"png",n=e.quality||1,r=e.multiplier||1,i={left:e.left,top:e.top,width:e.width,height:e.height};return r!==1?this.__toDataURLWithMultiplier(t,n,i,r):this.__toDataURL(t,n,i)},__toDataURL:function(e,t,n){this.renderAll(!0);var r=this.upperCanvasEl||this.lowerCanvasEl,i=this.__getCroppedCanvas(r,n);e==="jpg"&&(e="jpeg");var s=fabric.StaticCanvas.supports("toDataURLWithQuality")?(i||r).toDataURL("image/"+e,t):(i||r).toDataURL("image/"+e);return this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),i&&(i=null),s},__getCroppedCanvas:function(e,t){var n,r,i="left"in t||"top"in t||"width"in t||"height"in t;return i&&(n=fabric.util.createCanvasElement(), +r=n.getContext("2d"),n.width=t.width||this.width,n.height=t.height||this.height,r.drawImage(e,-t.left||0,-t.top||0)),n},__toDataURLWithMultiplier:function(e,t,n,r){var i=this.getWidth(),s=this.getHeight(),o=i*r,u=s*r,a=this.getActiveObject(),f=this.getActiveGroup(),l=this.contextTop||this.contextContainer;r>1&&this.setWidth(o).setHeight(u),l.scale(r,r),n.left&&(n.left*=r),n.top&&(n.top*=r),n.width?n.width*=r:r<1&&(n.width=o),n.height?n.height*=r:r<1&&(n.height=u),f?this._tempRemoveBordersControlsFromGroup(f):a&&this.deactivateAll&&this.deactivateAll(),this.renderAll(!0);var c=this.__toDataURL(e,t,n);return this.width=i,this.height=s,l.scale(1/r,1/r),this.setWidth(i).setHeight(s),f?this._restoreBordersControlsOnGroup(f):a&&this.setActiveObject&&this.setActiveObject(a),this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),c},toDataURLWithMultiplier:function(e,t,n){return this.toDataURL({format:e,multiplier:t,quality:n})},_tempRemoveBordersControlsFromGroup:function(e){e.origHasControls=e.hasControls,e.origBorderColor=e.borderColor,e.hasControls=!0,e.borderColor="rgba(0,0,0,0)",e.forEachObject(function(e){e.origBorderColor=e.borderColor,e.borderColor="rgba(0,0,0,0)"})},_restoreBordersControlsOnGroup:function(e){e.hideControls=e.origHideControls,e.borderColor=e.origBorderColor,e.forEachObject(function(e){e.borderColor=e.origBorderColor,delete e.origBorderColor})}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(e,t,n){return this.loadFromJSON(e,t,n)},loadFromJSON:function(e,t,n){if(!e)return;var r=typeof e=="string"?JSON.parse(e):e;this.clear();var i=this;return this._enlivenObjects(r.objects,function(){i._setBgOverlay(r,t)},n),this},_setBgOverlay:function(e,t){var n=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!e.backgroundImage&&!e.overlayImage&&!e.background&&!e.overlay){t&&t();return}var i=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(n.renderAll(),t&&t())};this.__setBgOverlay("backgroundImage",e.backgroundImage,r,i),this.__setBgOverlay("overlayImage",e.overlayImage,r,i),this.__setBgOverlay("backgroundColor",e.background,r,i),this.__setBgOverlay("overlayColor",e.overlay,r,i),i()},__setBgOverlay:function(e,t,n,r){var i=this;if(!t){n[e]=!0;return}e==="backgroundImage"||e==="overlayImage"?fabric.Image.fromObject(t,function(t){i[e]=t,n[e]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(e,!0)](t,function(){n[e]=!0,r&&r()})},_enlivenObjects:function(e,t,n){var r=this;if(!e||e.length===0){t&&t();return}var i=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(e,function(e){e.forEach(function(e,t){r.insertAt(e,t,!0)}),r.renderOnAddRemove=i,t&&t()},null,n)},_toDataURL:function(e,t){this.clone(function(n){t(n.toDataURL(e))})},_toDataURLWithMultiplier:function(e,t,n){this.clone(function(r){n(r.toDataURLWithMultiplier(e,t))})},clone:function(e,t){var n=JSON.stringify(this.toJSON(t));this.cloneWithoutData(function(t){t.loadFromJSON(n,function(){e&&e(t)})})},cloneWithoutData:function(e){var t=fabric.document.createElement("canvas");t.width=this.getWidth(),t.height=this.getHeight();var n=new fabric.Canvas(t);n.clipTo=this.clipTo,this.backgroundImage?(n.setBackgroundImage(this.backgroundImage.src,function(){n.renderAll(),e&&e(n)}),n.backgroundImageOpacity=this.backgroundImageOpacity,n.backgroundImageStretch=this.backgroundImageStretch):e&&e(n)}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.toFixed,i=t.util.string.capitalize,s=t.util.degreesToRadians,o=t.StaticCanvas.supports("setLineDash");if(t.Object)return;t.Object=t.util.createClass({type:"object",originX:"left",originY:"top",top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,opacity:1,angle:0,cornerSize:12,transparentCorners:!0,hoverCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"source-over",backgroundColor:"",stroke:null,strokeWidth:1,strokeDashArray:null,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:10,shadow:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,transformMatrix:null,minScaleLimit:.01,selectable:!0,evented:!0,visible:!0,hasControls:!0,hasBorders:!0,hasRotatingPoint:!0,rotatingPointOffset:40,perPixelTargetFind:!1,includeDefaultValues:!0,clipTo:null,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockUniScaling:!1,lockScalingFlip:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule shadow clipTo visible backgroundColor".split(" "),initialize:function(e){e&&this.setOptions(e)},_initGradient:function(e){e.fill&&e.fill.colorStops&&!(e.fill instanceof t.Gradient)&&this.set("fill",new t.Gradient(e.fill))},_initPattern:function(e){e.fill&&e.fill.source&&!(e.fill instanceof t.Pattern)&&this.set("fill",new t.Pattern(e.fill)),e.stroke&&e.stroke.source&&!(e.stroke instanceof t.Pattern)&&this.set("stroke",new t.Pattern(e.stroke))},_initClipping:function(e){if(!e.clipTo||typeof e.clipTo!="string")return;var n=t.util.getFunctionBody(e.clipTo);typeof n!="undefined"&&(this.clipTo=new Function("ctx",n))},setOptions:function(e){for(var t in e)this.set(t,e[t]);this._initGradient(e),this._initPattern(e),this._initClipping(e)},transform:function(e,t){this.group&&this.group.transform(e,t);var n=t?this._getLeftTopCoords():this.getCenterPoint();e.translate(n.x,n.y),e.rotate(s(this.angle)),e.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(e){var n=t.Object.NUM_FRACTION_DIGITS,i={type:this.type,originX:this.originX,originY:this.originY,left:r(this.left,n),top:r(this.top,n),width:r(this.width,n),height:r(this.height,n),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:r(this.strokeWidth,n),strokeDashArray:this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:r(this.strokeMiterLimit,n),scaleX:r(this.scaleX,n),scaleY:r(this.scaleY,n),angle:r(this.getAngle(),n),flipX:this.flipX,flipY:this.flipY,opacity:r(this.opacity,n),shadow:this.shadow&&this.shadow.toObject?this.shadow.toObject():this.shadow,visible:this.visible,clipTo:this.clipTo&&String(this.clipTo),backgroundColor:this.backgroundColor};return this.includeDefaultValues||(i=this._removeDefaultValues(i)),t.util.populateWithProperties(this,i,e),i},toDatalessObject:function(e){return this.toObject(e)},_removeDefaultValues:function(e){var n=t.util.getKlass(e.type).prototype,r=n.stateProperties;return r.forEach(function(t){e[t]===n[t]&&delete e[t]}),e},toString:function(){return"#"},get:function(e){return this[e]},_setObject:function(e){for(var t in e)this._set(t,e[t])},set:function(e,t){return typeof e=="object"?this._setObject(e):typeof t=="function"&&e!=="clipTo"?this._set(e,t(this.get(e))):this._set(e,t),this},_set:function(e,n){var i=e==="scaleX"||e==="scaleY";return i&&(n=this._constrainScale(n)),e==="scaleX"&&n<0?(this.flipX=!this.flipX,n*=-1):e==="scaleY"&&n<0?(this.flipY=!this.flipY,n*=-1):e==="width"||e==="height"?this.minScaleLimit=r(Math.min(.1,1/Math.max(this.width,this.height)),2):e==="shadow"&&n&&!(n instanceof t.Shadow)&&(n=new t.Shadow(n)),this[e]=n,this},toggle:function(e){var t=this.get(e);return typeof t=="boolean"&&this.set(e,!t),this},setSourcePath:function(e){return this.sourcePath=e,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:[1,0,0,1,0,0]},render:function(e,n){if(this.width===0||this.height===0||!this.visible)return;e.save(),this._setupFillRule(e),this._transform(e,n),this._setStrokeStyles(e),this._setFillStyles(e),this.group&&this.group.type==="path-group"&&(e.translate(-this.group.width/2,-this.group.height/2),this.transformMatrix&&e.transform.apply(e,this.transformMatrix)),this._setOpacity(e),this._setShadow(e),this.clipTo&&t.util.clipContext(this,e),this._render(e,n),this.clipTo&&e.restore(),this._removeShadow(e),this._restoreFillRule(e),e.restore()},_transform:function(e,t){var n=this.transformMatrix;n&&!this.group&&e.setTransform.apply(e,n),t||this.transform(e)},_setOpacity:function(e){this.group&&this.group._setOpacity(e),e.globalAlpha*=this.opacity},_setStrokeStyles:function(e){this.stroke&&(e.lineWidth=this.strokeWidth,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin,e.miterLimit=this.strokeMiterLimit,e.strokeStyle=this.stroke.toLive?this.stroke.toLive(e,this):this.stroke)},_setFillStyles:function(e){this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e,this):this.fill)},_renderControls:function(e,n){var r=this.getViewportTransform();e.save();if(this.active&&!n){var i;this.group&&(i=t.util.transformPoint(this.group.getCenterPoint(),r),e.translate(i.x,i.y),e.rotate(s(this.group.angle))),i=t.util.transformPoint(this.getCenterPoint(),r,null!=this.group),this.group&&(i.x*=this.group.scaleX,i.y*=this.group.scaleY),e.translate(i.x,i.y),e.rotate(s(this.angle)),this.drawBorders(e),this.drawControls(e)}e.restore()},_setShadow:function(e){if(!this.shadow)return;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_removeShadow:function(e){if(!this.shadow)return;e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0},_renderFill:function(e){if(!this.fill)return;e.save();if(this.fill.gradientTransform){var t=this.fill.gradientTransform;e.transform.apply(e,t)}this.fill.toLive&&e.translate(-this.width/2+this.fill.offsetX||0,-this.height/2+this.fill.offsetY||0),this.fillRule==="destination-over"?e.fill("evenodd"):e.fill(),e.restore(),this.shadow&&!this.shadow.affectStroke&&this._removeShadow(e)},_renderStroke:function(e){if(!this.stroke||this.strokeWidth===0)return;e.save();if(this.strokeDashArray)1&this.strokeDashArray.length&&this.strokeDashArray.push.apply(this.strokeDashArray,this.strokeDashArray),o?(e.setLineDash(this.strokeDashArray),this._stroke&&this._stroke(e)):this._renderDashedStroke&&this._renderDashedStroke(e),e.stroke();else{if(this.stroke.gradientTransform){var t=this.stroke.gradientTransform;e.transform.apply(e,t)}this._stroke?this._stroke(e):e.stroke()}this._removeShadow(e),e.restore()},clone:function(e,n){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(n),e):new t.Object(this.toObject(n))},cloneAsImage:function(e){var n=this.toDataURL();return t.util.loadImage(n,function(n){e&&e(new t.Image(n))}),this},toDataURL:function(e){e||(e={});var n=t.util.createCanvasElement(),r=this.getBoundingRect();n.width=r.width,n.height=r.height,t.util.wrapElement(n,"div");var i=new t.Canvas(n);e.format==="jpg"&&(e.format="jpeg"),e.format==="jpeg"&&(i.backgroundColor="#fff");var s={active:this.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new t.Point(n.width/2,n.height/2),"center","center");var o=this.canvas;i.add(this);var u=i.toDataURL(e);return this.set(s).setCoords(),this.canvas=o,i.dispose(),i=null,u},isType:function(e){return this.type===e},complexity:function(){return 0},toJSON:function(e){return this.toObject(e)},setGradient:function(e,n){n||(n={});var r={colorStops:[]};r.type=n.type||(n.r1||n.r2?"radial":"linear"),r.coords={x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2};if(n.r1||n.r2)r.coords.r1=n.r1,r.coords.r2=n.r2;for(var i in n.colorStops){var s=new t.Color(n.colorStops[i]);r.colorStops.push({offset:i,color:s.toRgb(),opacity:s.getAlpha()})}return this.set(e,t.Gradient.forObject(this,r))},setPatternFill:function(e){return this.set("fill",new t.Pattern(e))},setShadow:function(e){return this.set("shadow",e?new t.Shadow(e):null)},setColor:function(e){return this.set("fill",e),this},setAngle:function(e){var t=(this.originX!=="center"||this.originY!=="center")&&this.centeredRotation;return t&&this._setOriginToCenter(),this.set("angle",e),t&&this._resetOrigin(),this},centerH:function(){return this.canvas.centerObjectH(this),this},centerV:function(){return this.canvas.centerObjectV(this),this},center:function(){return this.canvas.centerObject(this),this},remove:function(){return this.canvas.remove(this),this},getLocalPointer:function(e,t){t=t||this.canvas.getPointer(e);var n=this.translateToOriginPoint(this.getCenterPoint(),"left","top");return{x:t.x-n.x,y:t.y-n.y}},_setupFillRule:function(e){this.fillRule&&(this._prevFillRule=e.globalCompositeOperation,e.globalCompositeOperation=this.fillRule)},_restoreFillRule:function(e){this.fillRule&&this._prevFillRule&&(e.globalCompositeOperation=this._prevFillRule)}}),t.util.createAccessors(t.Object),t.Object.prototype.rotate=t.Object.prototype.setAngle,n(t.Object.prototype,t.Observable),t.Object.NUM_FRACTION_DIGITS=2,t.Object.__uid=0}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{translateToCenterPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x+(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x-(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y+(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y-(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},translateToOriginPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x-(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x+(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y-(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y+(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},getCenterPoint:function(){var e=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(e,this.originX,this.originY)},getPointByOrigin:function(e,t){var n=this.getCenterPoint();return this.translateToOriginPoint(n,e,t)},toLocalPoint:function(t,n,r){var i=this.getCenterPoint(),s=this.stroke?this.strokeWidth:0,o,u;return n&&r?(n==="left"?o=i.x-(this.getWidth()+s*this.scaleX)/2:n==="right"?o=i.x+(this.getWidth()+s*this.scaleX)/2:o=i.x,r==="top"?u=i.y-(this.getHeight()+s*this.scaleY)/2:r==="bottom"?u=i.y+(this.getHeight()+s*this.scaleY)/2:u=i.y):(o=this.left,u=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(o,u))},setPositionByOrigin:function(e,t,n){var r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",i.x),this.set("top",i.y)},adjustPosition:function(t){var n=e(this.angle),r=this.getWidth()/2,i=Math.cos(n)*r,s=Math.sin(n)*r,o=this.getWidth(),u=Math.cos(n)*o,a=Math.sin(n)*o;this.originX==="center"&&t==="left"||this.originX==="right"&&t==="center"?(this.left-=i,this.top-=s):this.originX==="left"&&t==="center"||this.originX==="center"&&t==="right"?(this.left+=i,this.top+=s):this.originX==="left"&&t==="right"?(this.left+=u,this.top+=a):this.originX==="right"&&t==="left"&&(this.left-=u,this.top-=a),this.setCoords(),this.originX=t},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var e=this.getCenterPoint();this.originX="center",this.originY="center",this.left=e.x,this.top=e.y},_resetOrigin:function(){var e=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=e.x,this.top=e.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","center")}})}(),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,intersectsWithRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y),o=new fabric.Point(n.br.x,n.br.y),u=fabric.Intersection.intersectPolygonRectangle([r,i,o,s],e,t);return u.status==="Intersection"},intersectsWithObject:function(e){function t(e){return{tl:new fabric.Point(e.tl.x,e.tl.y),tr:new fabric.Point(e.tr.x,e.tr.y),bl:new fabric.Point(e.bl.x,e.bl.y),br:new fabric.Point(e.br.x,e.br.y)}}var n=t(this.oCoords),r=t(e.oCoords),i=fabric.Intersection.intersectPolygonPolygon([n.tl,n.tr,n.br,n.bl],[r.tl,r.tr,r.br,r.bl]);return i.status==="Intersection"},isContainedWithinObject:function(e){var t=e.getBoundingRect(),n=new fabric.Point(t.left,t.top),r=new fabric.Point(t.left+t.width,t.top+t.height);return this.isContainedWithinRect(n,r)},isContainedWithinRect:function(e,t){var n=this.getBoundingRect();return n.left>=e.x&&n.left+n.width<=t.x&&n.top>=e.y&&n.top+n.height<=t.y},containsPoint:function(e){var t=this._getImageLines(this.oCoords),n=this._findCrossPoints(e,t);return n!==0&&n%2===1},_getImageLines:function(e){return{topline:{o:e.tl,d:e.tr},rightline:{o:e.tr,d:e.br},bottomline:{o:e.br,d:e.bl},leftline:{o:e.bl,d:e.tl}}},_findCrossPoints:function(e,t){var n,r,i,s,o,u,a=0,f;for(var l in t){f=t[l];if(f.o.y=e.y&&f.d.y>=e.y)continue;f.o.x===f.d.x&&f.o.x>=e.x?(o=f.o.x,u=e.y):(n=0,r=(f.d.y-f.o.y)/(f.d.x-f.o.x),i=e.y-n*e.x,s=f.o.y-r*f.o.x,o=-(i-s)/(n-r),u=i+n*o),o>=e.x&&(a+=1);if(a===2)break}return a},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(){this.oCoords||this.setCoords();var e=[this.oCoords.tl.x,this.oCoords.tr.x,this.oCoords.br.x,this.oCoords.bl.x],t=fabric.util.array.min(e),n=fabric.util.array.max(e),r=Math.abs(t-n),i=[this.oCoords.tl.y,this.oCoords.tr.y,this.oCoords.br.y,this.oCoords.bl.y],s=fabric.util.array.min(i),o=fabric.util.array.max(i),u=Math.abs(s-o);return{left:t,top:s,width:r,height:u}},getWidth:function(){return this.width*this.scaleX},getHeight:function(){return this.height*this.scaleY},_constrainScale:function(e){return Math.abs(e)1?this.strokeWidth:0,n=e(this.angle),r=this.getViewportTransform(),i=function(e){return fabric.util.transformPoint(e,r)},s=this.width,o=this.height,u=this.strokeLineCap==="round"||this.strokeLineCap==="square",a=this.type==="line"&&this.width===1,f=this.type==="line"&&this.height===1,l=u&&f||this.type!=="line",c=u&&a||this.type!=="line";a?s=t:f&&(o=t),l&&(s+=t),c&&(o+=t),this.currentWidth=s*this.scaleX,this.currentHeight=o*this.scaleY,this.currentWidth<0&&(this.currentWidth=Math.abs(this.currentWidth));var h=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2)),p=Math.atan(isFinite(this.currentHeight/this.currentWidth)?this.currentHeight/this.currentWidth:0),d=Math.cos(p+n)*h,v=Math.sin(p+n)*h,m=Math.sin(n),g=Math.cos(n),y=this.getCenterPoint(),b=new fabric.Point(this.currentWidth,this.currentHeight),w=new fabric.Point(y.x-d,y.y-v),E=new fabric.Point(w.x+b.x*g,w.y+b.x*m),S=new fabric.Point(w.x-b.y*m,w.y+b.y*g),x=new fabric.Point(w.x+b.x/2*g,w.y+b.x/2*m),T=i(w),N=i(E),C=i(new fabric.Point(E.x-b.y*m,E.y+b.y*g)),k=i(S),L=i(new fabric.Point(w.x-b.y/2*m,w.y+b.y/2*g)),A=i(x),O=i(new fabric.Point(E.x-b.y/2*m,E.y+b.y/2*g)),M=i(new fabric.Point(S.x+b.x/2*g,S.y+b.x/2*m)),_=i(new fabric.Point(x.x,x.y)),D=Math.cos(p+n)*this.padding*Math.sqrt(2),P=Math.sin(p+n)*this.padding*Math.sqrt(2);return T=T.add(new fabric.Point(-D,-P)),N=N.add(new fabric.Point(P,-D)),C=C.add(new fabric.Point(D,P)),k=k.add(new fabric.Point(-P,D)),L=L.add(new fabric.Point((-D-P)/2,(-P+D)/2)),A=A.add(new fabric.Point((P-D)/2,-(P+D)/2)),O=O.add(new fabric.Point((P+D)/2,(P-D)/2)),M=M.add(new fabric.Point((D-P)/2,(D+P)/2)),_=_.add(new fabric.Point((P-D)/2,-(P+D)/2)),this.oCoords={tl:T,tr:N,br:C,bl:k,ml:L,mt:A,mr:O,mb:M,mtr:_},this._setCornerCoords&&this._setCornerCoords(),this}})}(),fabric.util.object.extend(fabric.Object.prototype,{sendToBack:function(){return this.group?fabric.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?fabric.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(e){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,e):this.canvas.sendBackwards(this,e),this},bringForward:function(e){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,e):this.canvas.bringForward(this,e),this},moveTo:function(e){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,e):this.canvas.moveTo(this,e),this}}),fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(){var e=this.fill?this.fill.toLive?"url(#SVGID_"+this.fill.id+")":this.fill:"none",t=this.fillRule==="destination-over"?"evenodd":this.fillRule,n=this.stroke?this.stroke.toLive?"url(#SVGID_"+this.stroke.id+")":this.stroke:"none",r=this.strokeWidth?this.strokeWidth:"0",i=this.strokeDashArray?this.strokeDashArray.join(" "):"",s=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",u=this.strokeMiterLimit?this.strokeMiterLimit:"4",a=typeof this.opacity!="undefined"?this.opacity:"1",f=this.visible?"":" visibility: hidden;",l=this.shadow&&this.type!=="text"?"filter: url(#SVGID_"+this.shadow.id+");":"";return["stroke: ",n,"; ","stroke-width: ",r,"; ","stroke-dasharray: ",i,"; ","stroke-linecap: ",s,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",u,"; ","fill: ",e,"; ","fill-rule: ",t,"; ","opacity: ",a,";",l,f].join("")},getSvgTransform:function(){if(this.group)return"";var e=fabric.util.toFixed,t=this.getAngle(),n=!this.canvas||this.canvas.svgViewportTransformation?this.getViewportTransform():[1,0,0,1,0,0],r=fabric.util.transformPoint(this.getCenterPoint(),n),i=fabric.Object.NUM_FRACTION_DIGITS,s=this.type==="path-group"?"":"translate("+e(r.x,i)+" "+e(r.y,i)+")",o=t!==0?" rotate("+e(t,i)+")":"",u=this.scaleX===1&&this.scaleY===1&&n[0]===1&&n[3]===1?"":" scale("+e(this.scaleX*n[0],i)+" "+e(this.scaleY*n[3],i)+")",a=this.type==="path-group"?this.width*n[0]:0,f=this.flipX?" matrix(-1 0 0 1 "+a+" 0) ":"",l=this.type==="path-group"?this.height*n[3]:0,c=this.flipY?" matrix(1 0 0 -1 0 "+l+")":"";return[s,o,u,f,c].join("")},getSvgTransformMatrix:function(){return this.transformMatrix?" matrix("+this.transformMatrix.join(" ")+")":""},_createBaseSVGMarkup:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),this.shadow&&e.push(this.shadow.toSVG(this)),e}}),fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(){return this.stateProperties.some(function(e){return this.get(e)!==this.originalState[e]},this)},saveState:function(e){return this.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),e&&e.stateProperties&&e.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),this},setupState:function(){return this.originalState={},this.saveState(),this}}),function(){var e=fabric.util.degreesToRadians,t=function(){return typeof G_vmlCanvasManager!="undefined"};fabric.util.object.extend(fabric.Object.prototype,{_controlsVisibility:null,_findTargetCorner:function(e){if(!this.hasControls||!this.active)return!1;var t=e.x,n=e.y,r,i;for(var s in this.oCoords){if(!this.isControlVisible(s))continue;if(s==="mtr"&&!this.hasRotatingPoint)continue;if(!(!this.get("lockUniScaling")||s!=="mt"&&s!=="mr"&&s!=="mb"&&s!=="ml"))continue;i=this._getImageLines(this.oCoords[s].corner),r=this._findCrossPoints({x:t,y:n},i);if(r!==0&&r%2===1)return this.__corner=s,s}return!1},_setCornerCoords:function(){var t=this.oCoords,n=e(this.angle),r=e(45-this.angle),i=Math.sqrt(2*Math.pow(this.cornerSize,2))/2,s=i*Math.cos(r),o=i*Math.sin(r),u=Math.sin(n),a=Math.cos(n);t.tl.corner={tl:{x:t.tl.x-o,y:t.tl.y-s},tr:{x:t.tl.x+s,y:t.tl.y-o},bl:{x:t.tl.x-s,y:t.tl.y+o},br:{x:t.tl.x+o,y:t.tl.y+s}},t.tr.corner={tl:{x:t.tr.x-o,y:t.tr.y-s},tr:{x:t.tr.x+s,y:t.tr.y-o},br:{x:t.tr.x+o,y:t.tr.y+s},bl:{x:t.tr.x-s,y:t.tr.y+o}},t.bl.corner={tl:{x:t.bl.x-o,y:t.bl.y-s},bl:{x:t.bl.x-s,y:t.bl.y+o},br:{x:t.bl.x+o,y:t.bl.y+s},tr:{x:t.bl.x+s,y:t.bl.y-o}},t.br.corner={tr:{x:t.br.x+s,y:t.br.y-o},bl:{x:t.br.x-s,y:t.br.y+o},br:{x:t.br.x+o,y:t.br.y+s},tl:{x:t.br.x-o,y:t.br.y-s}},t.ml.corner={tl:{x:t.ml.x-o,y:t.ml.y-s},tr:{x:t.ml.x+s,y:t.ml.y-o},bl:{x:t.ml.x-s,y:t.ml.y+o},br:{x:t.ml.x+o,y:t.ml.y+s}},t.mt.corner={tl:{x:t.mt.x-o,y:t.mt.y-s},tr:{x:t.mt.x+s,y:t.mt.y-o},bl:{x:t.mt.x-s,y:t.mt.y+o},br:{x:t.mt.x+o,y:t.mt.y+s}},t.mr.corner={tl:{x:t.mr.x-o,y:t.mr.y-s},tr:{x:t.mr.x+s,y:t.mr.y-o},bl:{x:t.mr.x-s,y:t.mr.y+o},br:{x:t.mr.x+o,y:t.mr.y+s}},t.mb.corner={tl:{x:t.mb.x-o,y:t.mb.y-s},tr:{x:t.mb.x+s,y:t.mb.y-o},bl:{x:t.mb.x-s,y:t.mb.y+o},br:{x:t.mb.x+o,y:t.mb.y+s}},t.mtr.corner={tl:{x:t.mtr.x-o+u*this.rotatingPointOffset,y:t.mtr.y-s-a*this.rotatingPointOffset},tr:{x:t.mtr.x+s+u*this.rotatingPointOffset,y:t.mtr.y-o-a*this.rotatingPointOffset},bl:{x:t.mtr.x-s+u*this.rotatingPointOffset,y:t.mtr.y+o-a*this.rotatingPointOffset},br:{x:t.mtr.x+o+u*this.rotatingPointOffset,y:t.mtr.y+s-a*this.rotatingPointOffset}}},drawBorders:function(e){if(!this.hasBorders)return this;var t=this.padding,n=t*2,r=this.getViewportTransform();e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=this.borderColor;var i=1/this._constrainScale(this.scaleX),s=1/this._constrainScale(this.scaleY);e.lineWidth=1/this.borderScaleFactor;var o=this.getWidth(),u=this.getHeight(),a=this.strokeWidth>1?this.strokeWidth:0,f=this.strokeLineCap==="round"||this.strokeLineCap==="square",l=this.type==="line"&&this.width===1,c=this.type==="line"&&this.height===1,h=f&&c||this.type!=="line",p=f&&l||this.type!=="line";l?o=a/i:c&&(u=a/s),h&&(o+=a/i),p&&(u+=a/s);var d=fabric.util.transformPoint(new fabric.Point(o,u),r,!0),v=d.x,m=d.y;this.group&&(v*=this.group.scaleX,m*=this.group.scaleY),e.strokeRect(~~(-(v/2)-t)-.5,~~(-(m/2)-t)-.5,~~(v+n)+1,~~(m+n)+1);if(this.hasRotatingPoint&&this.isControlVisible("mtr")&&!this.get("lockRotation")&&this.hasControls){var g=(-m-t*2)/2;e.beginPath(),e.moveTo(0,g),e.lineTo(0,g-this.rotatingPointOffset),e.closePath(),e.stroke()}return e.restore(),this},drawControls:function(e){if(!this.hasControls)return this;var t=this.cornerSize,n=t/2,r=this.getViewportTransform(),i=this.strokeWidth>1?this.strokeWidth:0,s=this.width,o=this.height,u=this.strokeLineCap==="round"||this.strokeLineCap==="square",a=this.type==="line"&&this.width===1,f=this.type==="line"&&this.height===1,l=u&&f||this.type!=="line",c=u&&a||this.type!=="line";a?s=i:f&&(o=i),l&&(s+=i),c&&(o+=i),s*=this.scaleX,o*=this.scaleY;var h=fabric.util.transformPoint(new fabric.Point(s,o),r,!0),p=h.x,d=h.y,v=-(p/2),m=-(d/2),g=this.padding,y=n,b=n-t,w=this.transparentCorners?"strokeRect":"fillRect";return e.save(),e.lineWidth=1,e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=e.fillStyle=this.cornerColor,this._drawControl("tl",e,w,v-y-g,m-y-g),this._drawControl("tr",e,w,v+p-y+g,m-y-g),this._drawControl("bl",e,w,v-y-g,m+d+b+g),this._drawControl("br",e,w,v+p+b+g,m+d+b+g),this.get("lockUniScaling")||(this._drawControl("mt",e,w,v+p/2-y,m-y-g),this._drawControl("mb",e,w,v+p/2-y,m+d+b+g),this._drawControl("mr",e,w,v+p+b+g,m+d/2-y),this._drawControl("ml",e,w,v-y-g,m+d/2-y)),this.hasRotatingPoint&&this._drawControl("mtr",e,w,v+p/2-y,m-this.rotatingPointOffset-this.cornerSize/2-g),e.restore(),this},_drawControl:function(e,n,r,i,s){var o=this.cornerSize;this.isControlVisible(e)&&(t()||this.transparentCorners||n.clearRect(i,s,o,o),n[r](i,s,o,o))},isControlVisible:function(e){return this._getControlsVisibility()[e]},setControlVisible:function(e,t){return this._getControlsVisibility()[e]=t,this},setControlsVisibility:function(e){e||(e={});for(var t in e)this.setControlVisible(t,e[t]);return this},_getControlsVisibility:function(){return this._controlsVisibility||(this._controlsVisibility={tl:!0,tr:!0,br:!0,bl:!0,ml:!0,mt:!0,mr:!0,mb:!0,mtr:!0}),this._controlsVisibility}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{FX_DURATION:500,fxCenterObjectH:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("left"),endValue:this.getCenter().left,duration:this.FX_DURATION,onChange:function(t){e.set("left",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxCenterObjectV:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("top"),endValue:this.getCenter().top,duration:this.FX_DURATION,onChange:function(t){e.set("top",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxRemove:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("opacity"),endValue:0,duration:this.FX_DURATION,onStart:function(){e.set("active",!1)},onChange:function(t){e.set("opacity",t),s.renderAll(),i()},onComplete:function(){s.remove(e),r()}}),this}}),fabric.util.object.extend(fabric.Object.prototype,{animate:function(){if(arguments[0]&&typeof arguments[0]=="object"){var e=[],t,n;for(t in arguments[0])e.push(t);for(var r=0,i=e.length;rthis.x2?this.x2:this.x1),i=-this.height/2-(this.y1>this.y2?this.y2:this.y1);n="translate("+r+", "+i+") "}return t.push("\n'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Line.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),t.Line.fromElement=function(e,r){var i=t.parseAttributes(e,t.Line.ATTRIBUTE_NAMES),s=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new t.Line(s,n(i,r))},t.Line.fromObject=function(e){var n=[e.x1,e.y1,e.x2,e.y2];return new t.Line(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return"radius"in e&&e.radius>0}var t=e.fabric||(e.fabric={}),n=Math.PI,r=t.util.object.extend;if(t.Circle){t.warn("fabric.Circle is already defined.");return}t.Circle=t.util.createClass(t.Object,{type:"circle",radius:0,startAngle:0,endAngle:n*2,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("radius",e.radius||0),this.startAngle=e.startAngle||this.startAngle,this.endAngle=e.endAngle||this.endAngle},_set:function(e,t){return this.callSuper("_set",e,t),e==="radius"&&this.setRadius(t),this},toObject:function(e){return r(this.callSuper("toObject",e),{radius:this.get("radius"),startAngle:this.startAngle,endAngle:this.endAngle})},toSVG:function(e){var t=this._createBaseSVGMarkup(),r=0,i=0,s=(this.endAngle-this.startAngle)%(2*n);if(s===0)this.group&&this.group.type==="path-group"&&(r=this.left+this.radius,i=this.top+this.radius),t.push("\n');else{var o=Math.cos(this.startAngle)*this.radius,u=Math.sin(this.startAngle)*this.radius,a=Math.cos(this.endAngle)*this.radius,f=Math.sin(this.endAngle)*this.radius,l=s>n?"1":"0";t.push('\n')}return e?e(t.join("")):t.join("")},_render:function(e,t){e.beginPath(),e.arc(t?this.left+this.radius:0,t?this.top+this.radius:0,this.radius,this.startAngle,this.endAngle,!1),this._renderFill(e),this._renderStroke(e)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(e){this.radius=e,this.set("width",e*2).set("height",e*2)},complexity:function(){return 1}}),t.Circle.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),t.Circle.fromElement=function(e,n){n||(n={});var s=t.parseAttributes(e,t.Circle.ATTRIBUTE_NAMES);if(!i(s))throw new Error("value of `r` attribute is required and can not be negative");s.left=s.left||0,s.top=s.top||0;var o=new t.Circle(r(s,n));return o.left-=o.radius,o.top-=o.radius,o},t.Circle.fromObject=function(e){return new t.Circle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Triangle){t.warn("fabric.Triangle is already defined");return}t.Triangle=t.util.createClass(t.Object,{type:"triangle",initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("width",e.width||100).set("height",e.height||100)},_render:function(e){var t=this.width/2,n=this.height/2;e.beginPath(),e.moveTo(-t,n),e.lineTo(0,-n),e.lineTo(t,n),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=this.width/2,r=this.height/2;e.beginPath(),t.util.drawDashedLine(e,-n,r,0,-r,this.strokeDashArray),t.util.drawDashedLine(e,0,-r,n,r,this.strokeDashArray),t.util.drawDashedLine(e,n,r,-n,r,this.strokeDashArray),e.closePath()},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=this.width/2,r=this.height/2,i=[-n+" "+r,"0 "+ -r,n+" "+r].join(",");return t.push("'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Triangle.fromObject=function(e){return new t.Triangle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Ellipse){t.warn("fabric.Ellipse is already defined.");return}t.Ellipse=t.util.createClass(t.Object,{type:"ellipse",rx:0,ry:0,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("rx",e.rx||0),this.set("ry",e.ry||0),this.set("width",this.get("rx")*2),this.set("height",this.get("ry")*2)},toObject:function(e){return r(this.callSuper("toObject",e),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=0,r=0;return this.group&&(n=this.left+this.rx,r=this.top+this.ry),t.push("\n'),e?e(t.join("")):t.join("")},_render:function(e,t){e.beginPath(),e.save(),e.transform(1,0,0,this.ry/this.rx,0,0),e.arc(t?this.left+this.rx:0,t?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,n,!1),e.restore(),this._renderFill(e),this._renderStroke(e)},complexity:function(){return 1}}),t.Ellipse.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),t.Ellipse.fromElement=function(e,n){n||(n={});var i=t.parseAttributes(e,t.Ellipse.ATTRIBUTE_NAMES);i.left=i.left||0,i.top=i.top||0;var s=new t.Ellipse(r(i,n));return s.top-=s.ry,s.left-=s.rx,s},t.Ellipse.fromObject=function(e){return new t.Ellipse(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;if(t.Rect){console.warn("fabric.Rect is already defined");return}var r=t.Object.prototype.stateProperties.concat();r.push("rx","ry","x","y"),t.Rect=t.util.createClass(t.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(e){e=e||{},this.callSuper("initialize",e),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(e,t){if(this.width===1&&this.height===1){e.fillRect(0,0,1,1);return}var n=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,i=this.width,s=this.height,o=t?this.left:-this.width/2,u=t?this.top:-this.height/2,a=n!==0||r!==0,f=.4477152502;e.beginPath(),e.moveTo(o+n,u),e.lineTo(o+i-n,u),a&&e.bezierCurveTo(o+i-f*n,u,o+i,u+f*r,o+i,u+r),e.lineTo(o+i,u+s-r),a&&e.bezierCurveTo(o+i,u+s-f*r,o+i-f*n,u+s,o+i-n,u+s),e.lineTo(o+n,u+s),a&&e.bezierCurveTo(o+f*n,u+s,o,u+s-f*r,o,u+s-r),e.lineTo(o,u+r),a&&e.bezierCurveTo(o,u+f*r,o+f*n,u,o+n,u),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=-this.width/2,r=-this.height/2,i=this.width,s=this.height;e.beginPath(),t.util.drawDashedLine(e,n,r,n+i,r,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r,n+i,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r+s,n,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n,r+s,n,r,this.strokeDashArray),e.closePath()},toObject:function(e){var t=n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=this.left,r=this.top;return this.group||(n=-this.width/2,r=-this.height/2),t.push("\n'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Rect.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),t.Rect.fromElement=function(e,r){if(!e)return null;r=r||{};var i=t.parseAttributes(e,t.Rect.ATTRIBUTE_NAMES);return i.left=i.left||0,i.top=i.top||0,new t.Rect(n(r?t.util.object.clone(r):{},i))},t.Rect.fromObject=function(e){return new t.Rect(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Polyline){t.warn("fabric.Polyline is already defined");return}t.Polyline=t.util.createClass(t.Object,{type:"polyline",points:null,minX:0,minY:0,initialize:function(e,n){return t.Polygon.prototype.initialize.call(this,e,n)},_calcDimensions:function(){return t.Polygon.prototype._calcDimensions.call(this)},_applyPointOffset:function(){return t.Polygon.prototype._applyPointOffset.call(this)},toObject:function(e){return t.Polygon.prototype.toObject.call(this,e)},toSVG:function(e){return t.Polygon.prototype.toSVG.call(this,e)},_render:function(e){t.Polygon.prototype.commonRender.call(this,e),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n,r;e.beginPath();for(var i=0,s=this.points.length;i\n'),e?e(n.join("")):n.join("")},_render:function(e){this.commonRender(e),this._renderFill(e);if(this.stroke||this.strokeDashArray)e.closePath(),this._renderStroke(e)},commonRender:function(e){var t;e.beginPath(),this._applyPointOffset&&((!this.group||this.group.type!=="path-group")&&this._applyPointOffset(),this._applyPointOffset=null),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n"},toObject:function(e){var t=i(this.callSuper("toObject",e),{path:this.path.map(function(e){return e.slice()}),pathOffset:this.pathOffset});return this.sourcePath&&(t.sourcePath=this.sourcePath),this.transformMatrix&&(t.transformMatrix=this.transformMatrix),t},toDatalessObject:function(e){var t=this.toObject(e);return this.sourcePath&&(t.path=this.sourcePath),delete t.sourcePath,t},toSVG:function(e){var t=[],n=this._createBaseSVGMarkup(),r="";for(var i=0,s=this.path.length;i\n"),e?e(n.join("")):n.join("")},complexity:function(){return this.path.length},_parsePath:function(){var e=[],t=[],n,r,i=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/ig,s,o;for(var f=0,l,c=this.path.length;fv)for(var g=1,y=l.length;g\n"];for(var i=0,s=t.length;i\n"),e?e(r.join("")):r.join("")},toString:function(){return"#"},isSameColor:function(){var e=(this.getObjects()[0].get("fill")||"").toLowerCase();return this.getObjects().every(function(t){return(t.get("fill")||"").toLowerCase()===e})},complexity:function(){return this.paths.reduce(function(e,t){return e+(t&&t.complexity?t.complexity():0)},0)},getObjects:function(){return this.paths}}),t.PathGroup.fromObject=function(e,n){typeof e.paths=="string"?t.loadSVGFromURL(e.paths,function(r){var i=e.paths;delete e.paths;var s=t.util.groupSVGElements(r,e,i);n(s)}):t.util.enlivenObjects(e.paths,function(r){delete e.paths,n(new t.PathGroup(r,e))})},t.PathGroup.async=!0}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.array.min,i=t.util.array.max,s=t.util.array.invoke;if(t.Group)return;var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};t.Group=t.util.createClass(t.Object,t.Collection,{type:"group",initialize:function(e,t){t=t||{},this._objects=e||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},this.callSuper("initialize"),this._calcBounds(),this._updateObjectsCoords(),t&&n(this,t),this._setOpacityIfSame(),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(){this.forEachObject(this._updateObjectCoords,this)},_updateObjectCoords:function(e){var t=e.getLeft(),n=e.getTop();e.set({originalLeft:t,originalTop:n,left:t-this.left,top:n-this.top}),e.setCoords(),e.__origHasControls=e.hasControls,e.hasControls=!1},toString:function(){return"#"},addWithUpdate:function(e){return this._restoreObjectsState(),e&&(this._objects.push(e),e.group=this),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this},_setObjectActive:function(e){e.set("active",!0),e.group=this},removeWithUpdate:function(e){return this._moveFlippedObject(e),this._restoreObjectsState(),this.forEachObject(this._setObjectActive,this),this.remove(e),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(e){e.group=this},_onObjectRemoved:function(e){delete e.group,e.set("active",!1)},delegatedProperties:{fill:!0,opacity:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(e,t){if(e in this.delegatedProperties){var n=this._objects.length;this[e]=t;while(n--)this._objects[n].set(e,t)}else this[e]=t},toObject:function(e){return n(this.callSuper("toObject",e),{objects:s(this._objects,"toObject",e)})},render:function(e){if(!this.visible)return;e.save(),this.clipTo&&t.util.clipContext(this,e);for(var n=0,r=this._objects.length;n\n'];for(var n=0,r=this._objects.length;n\n"),e?e(t.join("")):t.join("")},get:function(e){if(e in o){if(this[e])return this[e];for(var t=0,n=this._objects.length;t\n','\n");if(this.stroke||this.strokeDashArray){var i=this.fill;this.fill=null,t.push("\n'),this.fill=i}return t.push("\n"),e?e(t.join("")):t.join("")},getSrc:function(){if(this.getElement())return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(e,t){this.constructor.fromObject(this.toObject(t),e)},applyFilters:function(e){if(!this._originalElement)return;if(this.filters.length===0){this._element=this._originalElement,e&&e();return}var t=this._originalElement,n=fabric.util.createCanvasElement(),r=fabric.util.createImage(),i=this;return n.width=t.width,n.height=t.height,n.getContext("2d").drawImage(t,0,0,t.width,t.height),this.filters.forEach(function(e){e&&e.applyTo(n)}),r.width=t.width,r.height=t.height,fabric.isLikelyNode?(r.src=n.toBuffer(undefined,fabric.Image.pngCompression),i._element=r,e&&e()):(r.onload=function(){i._element=r,e&&e(),r.onload=n=t=null},r.src=n.toDataURL("image/png")),this},_render:function(e,t){this._element&&e.drawImage(this._element,t?this.left:-this.width/2,t?this.top:-this.height/2,this.width,this.height),this._renderStroke(e)},_resetWidthHeight:function(){var e=this.getElement();this.set("width",e.width),this.set("height",e.height)},_initElement:function(e){this.setElement(fabric.util.getById(e)),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(e){e||(e={}),this.setOptions(e),this._setWidthHeight(e),this._element&&this.crossOrigin&&(this._element.crossOrigin=this.crossOrigin)},_initFilters:function(e,t){e.filters&&e.filters.length?fabric.util.enlivenObjects(e.filters,function(e){t&&t(e)},"fabric.Image.filters"):t&&t()},_setWidthHeight:function(e){this.width="width"in e?e.width:this.getElement()?this.getElement().width||0:0,this.height="height"in e?e.height:this.getElement()?this.getElement().height||0:0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){fabric.Image.prototype._initFilters.call(e,e,function(r){e.filters=r||[];var i=new fabric.Image(n,e);t&&t(i)})},null,e.crossOrigin)},fabric.Image.fromURL=function(e,t,n){fabric.util.loadImage(e,function(e){t(new fabric.Image(e,n))},null,n&&n.crossOrigin)},fabric.Image.ATTRIBUTE_NAMES=fabric.SHARED_ATTRIBUTES.concat("x y width height xlink:href".split(" ")),fabric.Image.fromElement=function(e,n,r){var i=fabric.parseAttributes(e,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(i["xlink:href"],n,t(r?fabric.util.object.clone(r):{},i))},fabric.Image.async=!0,fabric.Image.pngCompression=1}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var e=this.getAngle()%360;return e>0?Math.round((e-1)/90)*90:Math.round(e/90)*90},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(e){e=e||{};var t=function(){},n=e.onComplete||t,r=e.onChange||t,i=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(e){i.setAngle(e),r()},onComplete:function(){i.setCoords(),n()},onStart:function(){i.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(e){return e.straighten(),this.renderAll(),this},fxStraightenObject:function(e){return e.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.Brightness=t.util.createClass(t.Image.filters.BaseFilter,{type:"Brightness",initialize:function(e){e=e||{},this.brightness=e.brightness||0},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.brightness;for(var s=0,o=r.length;sa||C<0||C>u)continue;var k=(N*u+C)*4,L=t[x*i+T];b+=o[k]*L,w+=o[k+1]*L,E+=o[k+2]*L,S+=o[k+3]*L}h[y]=b,h[y+1]=w,h[y+2]=E,h[y+3]=S+p*(255-S)}n.putImageData(c,0,0)},toObject:function(){return n(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),t.Image.filters.Convolute.fromObject=function(e){return new t.Image.filters.Convolute(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.GradientTransparency=t.util.createClass(t.Image.filters.BaseFilter,{type:"GradientTransparency",initialize:function(e){e=e||{},this.threshold=e.threshold||100},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.threshold,s=r.length;for(var o=0,u=r.length;o-1?e.channel:0},applyTo:function(e){if(!this.mask)return;var n=e.getContext("2d"),r=n.getImageData(0,0,e.width,e.height),i=r.data,s=this.mask.getElement(),o=t.util.createCanvasElement(),u=this.channel,a,f=r.width*r.height*4;o.width=s.width,o.height=s.height,o.getContext("2d").drawImage(s,0,0,s.width,s.height);var l=o.getContext("2d").getImageData(0,0,s.width,s.height),c=l.data;for(a=0;ao&&f>o&&l>o&&u(a-f)'},_render:function(e){typeof Cufon=="undefined"||this.useNative===!0?this._renderViaNative(e):this._renderViaCufon(e)},_renderViaNative:function(e){var n=this.text.split(this._reNewline);this._setTextStyles(e),this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this.clipTo&&t.util.clipContext(this,e),this._renderTextBackground(e,n),this._translateForTextAlign(e),this._renderText(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this.clipTo&&e.restore(),this._setBoundaries(e,n),this._totalLineHeight=0},_renderText:function(e,t){e.save(),this._setShadow(e),this._setupFillRule(e),this._renderTextFill(e,t),this._renderTextStroke(e,t),this._restoreFillRule(e),this._removeShadow(e),e.restore()},_translateForTextAlign:function(e){this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0))},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_renderChars:function(e,t,n,r,i){t[e](n,r,i)},_renderTextLine:function(e,t,n,r,i,s){i-=this.fontSize/4;if(this.textAlign!=="justify"){this._renderChars(e,t,n,r,i,s);return}var o=t.measureText(n).width,u=this.width;if(u>o){var a=n.split(/\s+/),f=t.measureText(n.replace(/\s+/g,"")).width,l=u-f,c=a.length-1,h=l/c,p=0;for(var d=0,v=a.length;d-1&&i(this.fontSize*this.lineHeight),this.textDecoration.indexOf("line-through")>-1&&i(this.fontSize*this.lineHeight-this.fontSize/2),this.textDecoration.indexOf("overline")>-1&&i(this.fontSize*this.lineHeight-this.fontSize)},_getFontDeclaration:function(){return[t.isLikelyNode?this.fontWeight:this.fontStyle,t.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",t.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(e,t){if(!this.visible)return;e.save(),this._transform(e,t);var n=this.transformMatrix,r=this.group&&this.group.type==="path-group";r&&e.translate(-this.group.width/2,-this.group.height/2),n&&e.transform(n[0],n[1],n[2],n[3],n[4],n[5]),r&&e.translate(this.left,this.top),this._render(e),e.restore()},toObject:function(e){var t=n(this.callSuper("toObject",e),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,path:this.path,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=[],n=this.text.split(this._reNewline),r=this._getSVGLeftTopOffsets(n),i=this._getSVGTextAndBg(r.lineTop,r.textLeft,n),s=this._getSVGShadows(r.lineTop,n);return r.textTop+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,this._wrapSVGTextAndBg(t,i,s,r),e?e(t.join("")):t.join("")},_getSVGLeftTopOffsets:function(e){var t=this.useNative?this.fontSize*this.lineHeight:-this._fontAscent-this._fontAscent/5*this.lineHeight,n=-(this.width/2),r=this.useNative?this.fontSize-1:this.height/2-e.length*this.fontSize-this._totalLineHeight;return{textLeft:n+(this.group&&this.group.type==="path-group"?this.left:0),textTop:r+(this.group&&this.group.type==="path-group"?this.top:0),lineTop:t}},_wrapSVGTextAndBg:function(e,t,n,r){e.push('\n',t.textBgRects.join(""),"',n.join(""),t.textSpans.join(""),"\n","\n")},_getSVGShadows:function(e,n){var r=[],s,o,u=1;if(!this.shadow||!this._boundaries)return r;for(s=0,o=n.length;s",t.util.string.escapeXml(n[s]),""),u=1}else u++;return r},_getSVGTextAndBg:function(e,t,n){var r=[],i=[],s=1;this._setSVGBg(i);for(var o=0,u=n.length;o",t.util.string.escapeXml(e),"")},_setSVGTextLineBg:function(e,t,n,r){e.push("\n')},_setSVGBg:function(e){this.backgroundColor&&this._boundaries&&e.push("')},_getFillAttributes:function(e){var n=e&&typeof e=="string"?new t.Color(e):"";return!n||!n.getSource()||n.getAlpha()===1?'fill="'+e+'"':'opacity="'+n.getAlpha()+'" fill="'+n.setAlpha(1).toRgb()+'"'},_set:function(e,t){e==="fontFamily"&&this.path&&(this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+t+"$3")),this.callSuper("_set",e,t),e in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),t.Text.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),t.Text.DEFAULT_SVG_FONT_SIZE=16,t.Text.fromElement=function(e,n){if(!e)return null;var r=t.parseAttributes(e,t.Text.ATTRIBUTE_NAMES);n=t.util.object.extend(n?t.util.object.clone(n):{},r),"dx"in r&&(n.left+=r.dx),"dy"in r&&(n.top+=r.dy),"fontSize"in n||(n.fontSize=t.Text.DEFAULT_SVG_FONT_SIZE),n.originX||(n.originX="left");var i=new t.Text(e.textContent,n),s=0;return i.originX==="left"&&(s=i.getWidth()/2),i.originX==="right"&&(s=-i.getWidth()/2),i.set({left:i.getLeft()+s,top:i.getTop()-i.getHeight()/2}),i},t.Text.fromObject=function(e){return new t.Text(e.text,r(e))},t.util.createAccessors(t.Text)}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_skipFillStrokeCheck:!0,_reSpace:/\s|\n/,_fontSizeFraction:4,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,_charWidthsCache:{},initialize:function(e,t){this.styles=t?t.styles||{}:{},this.callSuper("initialize",e,t),this.initBehavior(),fabric.IText.instances.push(this),this.__lineWidths={},this.__lineHeights={},this.__lineOffsets={}},isEmptyStyles:function(){if(!this.styles)return!0;var e=this.styles;for(var t in e)for(var n in e[t])for(var r in e[t][n])return!1;return!0},setSelectionStart:function(e){this.selectionStart!==e&&(this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})),this.selectionStart=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionStart=e)},setSelectionEnd:function(e){this.selectionEnd!==e&&(this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})),this.selectionEnd=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionEnd=e)},getSelectionStyles:function(e,t){if(arguments.length===2){var n=[];for(var r=e;r=r.charIndex&&(a!==o||hs&&a-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,0,this.fontSize/20),u.indexOf("line-through")>-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,o/2,a/20),u.indexOf("overline")>-1&&this._renderCharDecorationAtOffset(e,n,r,i,s-this.fontSize/this._fontSizeFraction,this.fontSize/20)},_renderCharDecorationAtOffset:function(e,t,n,r,i,s){e.fillRect(t,n-i,r,s)},_renderTextLine:function(e,t,n,r,i,s){i+=this.fontSize/4,this.callSuper("_renderTextLine",e,t,n,r,i,s)},_renderTextDecoration:function(e,t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",e,t)},_renderTextLinesBackground:function(e,t){if(!this.textBackgroundColor&&!this.styles)return;e.save(),this.textBackgroundColor&&(e.fillStyle=this.textBackgroundColor);var n=0,r=this.fontSize/this._fontSizeFraction;for(var i=0,s=t.length;in&&(n=s)}return n},_getHeightOfLine:function(e,t,n){n= +n||this.text.split(this._reNewline);var r=this._getHeightOfChar(e,n[t][0],t,0),i=n[t],s=i.split("");for(var o=1,u=s.length;or&&(r=a)}return r*this.lineHeight},_getTextHeight:function(e,t){var n=0;for(var r=0,i=t.length;r-1)t++,n--;return e-t},findWordBoundaryRight:function(e){var t=0,n=e;if(this._reSpace.test(this.text.charAt(n)))while(this._reSpace.test(this.text.charAt(n)))t++,n++;while(/\S/.test(this.text.charAt(n))&&n-1)t++,n--;return e-t},findLineBoundaryRight:function(e){var t=0,n=e;while(!/\n/.test(this.text.charAt(n))&&n0&&nr;s?this.removeStyleObject(s,n+1):this.removeStyleObject(this.get2DCursorLocation(n).charIndex===0,n)}this.text=this.text.slice(0,e)+this.text.slice(t)},insertChars:function(e){var t=this.text.slice(this.selectionStart,this.selectionStart+1)==="\n";this.text=this.text.slice(0,this.selectionStart)+e+this.text.slice(this.selectionEnd),this.selectionStart===this.selectionEnd&&this.insertStyleObjects(e,t,this.copiedStyles),this.selectionStart+=e.length,this.selectionEnd=this.selectionStart,this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},insertNewlineStyleObject:function(t,n,r){this.shiftLineStyles(t,1),this.styles[t+1]||(this.styles[t+1]={});var i=this.styles[t][n-1],s={};if(r)s[0]=e(i),this.styles[t+1]=s;else{for(var o in this.styles[t])parseInt(o,10)>=n&&(s[parseInt(o,10)-n]=this.styles[t][o],delete this.styles[t][o]);this.styles[t+1]=s}},insertCharStyleObject:function(t,n,r){var i=this.styles[t],s=e(i);n===0&&!r&&(n=1);for(var o in s){var u=parseInt(o,10);u>=n&&(i[u+1]=s[u])}this.styles[t][n]=r||e(i[n-1])},insertStyleObjects:function(e,t,n){if(this.isEmptyStyles())return;var r=this.get2DCursorLocation(),i=r.lineIndex,s=r.charIndex;this.styles[i]||(this.styles[i]={}),e==="\n"?this.insertNewlineStyleObject(i,s,t):n?this._insertStyles(n):this.insertCharStyleObject(i,s)},_insertStyles:function(e){for(var t=0,n=e.length;tt&&(this.styles[s+n]=r[s])}},removeStyleObject:function(t,n){var r=this.get2DCursorLocation(n),i=r.lineIndex,s=r.charIndex;if(t){var o=this.text.split(this._reNewline),u=o[i-1],a=u?u.length:0;this.styles[i-1]||(this.styles[i-1]={});for(s in this.styles[i])this.styles[i-1][parseInt(s,10)+a]=this.styles[i][s];this.shiftLineStyles(i,-1)}else{var f=this.styles[i];if(f){var l=this.selectionStart===this.selectionEnd?-1:0;delete f[s+l]}var c=e(f);for(var h in c){var p=parseInt(h,10);p>=s&&p!==0&&(f[p-1]=c[p],delete f[p])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+(new Date),this.__lastLastClickTime=+(new Date),this.__lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(e){this.__newClickTime=+(new Date);var t=this.canvas.getPointer(e.e);this.isTripleClick(t)?(this.fire("tripleclick",e),this._stopEvent(e.e)):this.isDoubleClick(t)&&(this.fire("dblclick",e),this._stopEvent(e.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=t,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y&&this.__lastIsEditing},isTripleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y},_stopEvent:function(e){e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMousemoveHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(e){this.selectWord(this.getSelectionStartFromPointer(e.e))}),this.on("tripleclick",function(e){this.selectLine(this.getSelectionStartFromPointer(e.e))})},initMousedownHandler:function(){this.on("mousedown",function(e){var t=this.canvas.getPointer(e.e);this.__mousedownX=t.x,this.__mousedownY=t.y,this.__isMousedown=!0,this.hiddenTextarea&&this.canvas&&this.canvas.wrapperEl.appendChild(this.hiddenTextarea),this.selected&&this.setCursorByClick(e.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.initDelayedCursor(!0))})},initMousemoveHandler:function(){this.on("mousemove",function(e){if(!this.__isMousedown||!this.isEditing)return;var t=this.getSelectionStartFromPointer(e.e);t>=this.__selectionStartOnMouseDown?(this.setSelectionStart(this.__selectionStartOnMouseDown),this.setSelectionEnd(t)):(this.setSelectionStart(t),this.setSelectionEnd(this.__selectionStartOnMouseDown))})},_isObjectMoved:function(e){var t=this.canvas.getPointer(e);return this.__mousedownX!==t.x||this.__mousedownY!==t.y},initMouseupHandler:function(){this.on("mouseup",function(e){this.__isMousedown=!1;if(this._isObjectMoved(e.e))return;this.__lastSelected&&(this.enterEditing(),this.initDelayedCursor(!0)),this.selected=!0})},setCursorByClick:function(e){var t=this.getSelectionStartFromPointer(e);e.shiftKey?ts?0:1,a=r+u;return this.flipX&&(a=i-a),a>this.text.length&&(a=this.text.length),a}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.style.cssText="position: absolute; top: 0; left: -9999px",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keypress",this.onKeyPress.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",9:"exitEditing",27:"exitEditing",13:"insertNewline",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMap:{65:"selectAll",88:"cut"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(e){if(!this.isEditing)return;if(e.keyCode in this._keysMap)this[this._keysMap[e.keyCode]](e);else{if(!(e.keyCode in this._ctrlKeysMap&&(e.ctrlKey||e.metaKey)))return;this[this._ctrlKeysMap[e.keyCode]](e)}e.stopImmediatePropagation(),e.preventDefault(),this.canvas&&this.canvas.renderAll()},forwardDelete:function(e){this.selectionStart===this.selectionEnd&&this.moveCursorRight(e),this.removeChars(e)},copy:function(e){var t=this.getSelectedText(),n=this._getClipboardData(e);n&&n.setData("text",t),this.copiedText=t,this.copiedStyles=this.getSelectionStyles(this.selectionStart,this.selectionEnd)},paste:function(e){var t=null,n=this._getClipboardData(e);n?t=n.getData("text"):t=this.copiedText,t&&this.insertChars(t)},cut:function(e){if(this.selectionStart===this.selectionEnd)return;this.copy(),this.removeChars(e)},_getClipboardData:function(e){return e&&(e.clipboardData||fabric.window.clipboardData)},onKeyPress:function(e){if(!this.isEditing||e.metaKey||e.ctrlKey)return;e.which!==0&&this.insertChars(String.fromCharCode(e.which)),e.stopPropagation()},getDownCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.text.split(this._reNewline),i,s,o=this.text.slice(0,n),u=this.text.slice(n),a=o.slice(o.lastIndexOf("\n")+1),f=u.match(/(.*)\n?/)[1],l=(u.match(/.*\n(.*)\n?/)||{})[1]||"",c=this.get2DCursorLocation(n);if(c.lineIndex===r.length-1||e.metaKey||e.keyCode===34)return this.text.length-n;var h=this._getWidthOfLine(this.ctx,c.lineIndex,r);s=this._getLineLeftOffset(h);var p=s,d=c.lineIndex;for(var v=0,m=a.length;vn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=gthis.text.length&&(this.selectionStart=this.text.length),this.selectionEnd=this.selectionStart},swapSelectionPoints:function(){var e=this.selectionEnd;this.selectionEnd=this.selectionStart,this.selectionStart=e},moveCursorDownWithShift:function(e){this.selectionEnd===this.selectionStart&&(this._selectionDirection="right");var t=this._selectionDirection==="right"?"selectionEnd":"selectionStart";this[t]+=e,this.selectionEndthis.text.length&&(this.selectionEnd=this.text.length)},getUpCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(n);if(r.lineIndex===0||e.metaKey||e.keyCode===33)return n;var i=this.text.slice(0,n),s=i.slice(i.lastIndexOf("\n")+1),o=(i.match(/\n?(.*)\n.*$/)||{})[1]||"",u=this.text.split(this._reNewline),a,f=this._getWidthOfLine(this.ctx,r.lineIndex,u),l=this._getLineLeftOffset(f),c=l,h=r.lineIndex;for(var p=0,d=s.length;pn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=g=this.text.length&&this.selectionEnd>=this.text.length)return;this.abortCursorAnimation(),this._currentCursorOpacity=1,e.shiftKey?this.moveCursorRightWithShift(e):this.moveCursorRightWithoutShift(e),this.initDelayedCursor()},moveCursorRightWithShift:function(e){this._selectionDirection==="left"&&this.selectionStart!==this.selectionEnd?this._moveRight(e,"selectionStart"):(this._selectionDirection="right",this._moveRight(e,"selectionEnd"),this.text.charAt(this.selectionEnd-1)==="\n"&&this.selectionEnd++,this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length))},moveCursorRightWithoutShift:function(e){this._selectionDirection="right",this.selectionStart===this.selectionEnd?(this._moveRight(e,"selectionStart"),this.selectionEnd=this.selectionStart):(this.selectionEnd+=this.getNumNewLinesInSelectedText(),this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length),this.selectionStart=this.selectionEnd)},removeChars:function(e){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(e):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.selectionEnd=this.selectionStart,this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(e){if(this.selectionStart!==0)if(e.metaKey){var t=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(t,this.selectionStart),this.selectionStart=t}else if(e.altKey){var n=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(n,this.selectionStart),this.selectionStart=n}else{var r=this.text.slice(this.selectionStart-1,this.selectionStart)==="\n";this.removeStyleObject(r),this.selectionStart--,this.text=this.text.slice(0,this.selectionStart)+this.text.slice(this.selectionStart+1)}}}),fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(e,t,n,r,i,s){this.styles[t]?this._setSVGTextLineChars(e,t,n,r,i,s):this.callSuper("_setSVGTextLineText",e,t,n,r,i)},_setSVGTextLineChars:function(e,t,n,r,i,s){var o=t===0||this.useNative?"y":"dy",u=e.split(""),a=0,f=this._getSVGLineLeftOffset(t),l=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t);for(var h=0,p=u.length;h'].join("")},_createTextCharSpan:function(e,t,n,r,i,s){var o=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text"},t));return['',fabric.util.string.escapeXml(e),""].join("")}}),function(){function request(e,t,n){var r=URL.parse(e);r.port||(r.port=r.protocol.indexOf("https:")===0?443:80);var i=r.port===443?HTTPS:HTTP,s=i.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(e){var r="";t&&e.setEncoding(t),e.on("end",function(){n(r)}),e.on("data",function(t){e.statusCode===200&&(r+=t)})});s.on("error",function(e){e.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(e.message)}),s.end()}function requestFs(e,t){var n=require("fs");n.readFile(e,function(e,n){if(e)throw fabric.log(e),e;t(n)})}if(typeof document!="undefined"&&typeof window!="undefined")return;var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(e,t,n){function r(r){i.src=new Buffer(r,"binary"),i._src=e,t&&t.call(n,i)}var i=new Image;e&&(e instanceof Buffer||e.indexOf("data")===0)?(i.src=i._src=e,t&&t.call(n,i)):e&&e.indexOf("http")!==0?requestFs(e,r):e?request(e,"binary",r):t&&t.call(n,e)},fabric.loadSVGFromURL=function(e,t,n){e=e.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),e.indexOf("http")!==0?requestFs(e,function(e){fabric.loadSVGFromString(e.toString(),t,n)}):request(e,"",function(e){fabric.loadSVGFromString(e,t,n)})},fabric.loadSVGFromString=function(e,t,n){var r=(new DOMParser).parseFromString(e);fabric.parseSVGDocument(r.documentElement,function(e,n){t&&t(e,n)},n)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){var r=new fabric.Image(n);r._initConfig(e),r._initFilters(e,function(e){r.filters=e||[],t&&t(r)})})},fabric.createCanvasForNode=function(e,t,n,r){r=r||n;var i=fabric.document.createElement("canvas"),s=new Canvas(e||600,t||600,r);i.style={},i.width=s.width,i.height=s.height;var o=fabric.Canvas||fabric.StaticCanvas,u=new o(i,n);return u.contextContainer=s.getContext("2d"),u.nodeCanvas=s,u.Font=Canvas.Font,u},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(e){return this.nodeCanvas.createJPEGStream(e)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(e,t){return origSetWidth.call(this,e,t),this.nodeCanvas.width=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(e,t){return origSetHeight.call(this,e,t),this.nodeCanvas.height=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}(); \ No newline at end of file diff --git a/dist/fabric.min.js.gz b/dist/fabric.min.js.gz index d1f005e2a94daecbeede7f68275d8804d9f8684e..c64a700ee74a56400cf7e1e869806e86014ca518 100644 GIT binary patch literal 58419 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

xRTf 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

D!u%#z+Zz%*s1N{b)pbSv{zPb7A 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 literal 57280 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 B$GQLj diff --git a/dist/fabric.require.js b/dist/fabric.require.js index 810f6e73..c7eacaa0 100644 --- a/dist/fabric.require.js +++ b/dist/fabric.require.js @@ -885,6 +885,7 @@ fabric.Collection = { var arcToSegmentsCache = { }, segmentToBezierCache = { }, + boundsOfCurveCache = { }, _join = Array.prototype.join; /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp @@ -897,7 +898,7 @@ fabric.Collection = { return arcToSegmentsCache[argsString]; } - var PI = Math.PI, th = rotateX * (PI / 180), + var PI = Math.PI, th = rotateX * PI / 180, sinTh = Math.sin(th), cosTh = Math.cos(th), fromX = 0, fromY = 0; @@ -905,26 +906,26 @@ fabric.Collection = { rx = Math.abs(rx); ry = Math.abs(ry); - var px = -cosTh * toX - sinTh * toY, - py = -cosTh * toY + sinTh * toX, + var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5, + py = -cosTh * toY * 0.5 + sinTh * toX * 0.5, rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px, - pl = 4 * rx2 * ry2 - rx2 * py2 - ry2 * px2, + pl = rx2 * ry2 - rx2 * py2 - ry2 * px2, root = 0; if (pl < 0) { - var s = Math.sqrt(1 - 0.25 * pl/(rx2 * ry2)); + var s = Math.sqrt(1 - pl/(rx2 * ry2)); rx *= s; ry *= s; } else { - root = (large === sweep ? -0.5 : 0.5) * + root = (large === sweep ? -1.0 : 1.0) * Math.sqrt( pl /(rx2 * py2 + ry2 * px2)); } var cx = root * rx * py / ry, cy = -root * ry * px / rx, - cx1 = cosTh * cx - sinTh * cy + toX / 2, - cy1 = sinTh * cx + cosTh * cy + toY / 2, + cx1 = cosTh * cx - sinTh * cy + toX * 0.5, + cy1 = sinTh * cx + cosTh * cy + toY * 0.5, mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry), dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry); @@ -936,7 +937,7 @@ fabric.Collection = { } // Convert into cubic bezier segments <= 90deg - var segments = Math.ceil(Math.abs(dtheta / (PI * 0.5))), + var segments = Math.ceil(Math.abs(dtheta / PI * 2)), result = [], mDelta = dtheta / segments, mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2), th3 = mTheta + mDelta; @@ -945,7 +946,7 @@ fabric.Collection = { result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY); fromX = result[i][4]; fromY = result[i][5]; - mTheta += mDelta; + mTheta = th3; th3 += mDelta; } arcToSegmentsCache[argsString] = result; @@ -1019,6 +1020,129 @@ fabric.Collection = { ctx.bezierCurveTo.apply(ctx, segs[i]); } }; + + /** + * Calculate bounding box of a elliptic-arc + * @param {Number} fx start point of arc + * @param {Number} fy + * @param {Number} rx horizontal radius + * @param {Number} ry vertical radius + * @param {Number} rot angle of horizontal axe + * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points + * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction + * @param {Number} tx end point of arc + * @param {Number} ty + */ + fabric.util.getBoundsOfArc = function(fx, fy, rx, ry, rot, large, sweep, tx, ty) { + + var fromX = 0, fromY = 0, bound = [ ], bounds = [ ], + segs = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot); + + for (var i = 0, len = segs.length; i < len; i++) { + bound = getBoundsOfCurve(fromX, fromY, segs[i][0], segs[i][1], segs[i][2], segs[i][3], segs[i][4], segs[i][5]); + bound[0].x += fx; + bound[0].y += fy; + bound[1].x += fx; + bound[1].y += fy; + bounds.push(bound[0]); + bounds.push(bound[1]); + fromX = segs[i][4]; + fromY = segs[i][5]; + } + return bounds; + }; + + /** + * Calculate bounding box of a beziercurve + * @param {Number} x0 starting point + * @param {Number} y0 + * @param {Number} x1 first control point + * @param {Number} y1 + * @param {Number} x2 secondo control point + * @param {Number} y2 + * @param {Number} x3 end of beizer + * @param {Number} y3 + */ + // taken from http://jsbin.com/ivomiq/56/edit no credits available for that. + function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) { + var argsString = _join.call(arguments); + if (boundsOfCurveCache[argsString]) { + return boundsOfCurveCache[argsString]; + } + + var sqrt = Math.sqrt, + min = Math.min, max = Math.max, + abs = Math.abs, tvalues = [ ], + bounds = [[ ], [ ]], + a, b, c, t, t1, t2, b2ac, sqrtb2ac; + + b = 6 * x0 - 12 * x1 + 6 * x2; + a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; + c = 3 * x1 - 3 * x0; + + for (var i = 0; i < 2; ++i) { + if (i > 0) { + b = 6 * y0 - 12 * y1 + 6 * y2; + a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; + c = 3 * y1 - 3 * y0; + } + + if (abs(a) < 1e-12) { + if (abs(b) < 1e-12) { + continue; + } + t = -c / b; + if (0 < t && t < 1) { + tvalues.push(t); + } + continue; + } + b2ac = b * b - 4 * c * a; + if (b2ac < 0) { + continue; + } + sqrtb2ac = sqrt(b2ac); + t1 = (-b + sqrtb2ac) / (2 * a); + if (0 < t1 && t1 < 1) { + tvalues.push(t1); + } + t2 = (-b - sqrtb2ac) / (2 * a); + if (0 < t2 && t2 < 1) { + tvalues.push(t2); + } + } + + var x, y, j = tvalues.length, jlen = j, mt; + while(j--) { + t = tvalues[j]; + mt = 1 - t; + x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); + bounds[0][j] = x; + + y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3); + bounds[1][j] = y; + } + + bounds[0][jlen] = x0; + bounds[1][jlen] = y0; + bounds[0][jlen + 1] = x3; + bounds[1][jlen + 1] = y3; + var result = [ + { + x: min.apply(null, bounds[0]), + y: min.apply(null, bounds[1]) + }, + { + x: max.apply(null, bounds[0]), + y: max.apply(null, bounds[1]) + } + ]; + boundsOfCurveCache[argsString] = result; + return result; + } + + fabric.util.getBoundsOfCurve = getBoundsOfCurve; + })(); @@ -2010,7 +2134,8 @@ fabric.Collection = { var getElementStyle; if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) { getElementStyle = function(element, attr) { - return fabric.document.defaultView.getComputedStyle(element, null)[attr]; + var style = fabric.document.defaultView.getComputedStyle(element, null); + return style ? style[attr] : undefined; }; } else { @@ -4696,7 +4821,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { // convert percents to absolute values offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1); - + offset = offset < 0 ? 0 : offset > 1 ? 1 : offset; if (style) { var keyValuePairs = style.split(/\s*;\s*/); @@ -4766,19 +4891,20 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @see {@link fabric.Gradient#initialize} for constructor definition */ fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ { - /* - * Stores the original position of the gradient when we convert from % to fixed values, for objectBoundingBox case. - * @type Number - * @default 0 - */ - origX: 0, - /* - * Stores the original position of the gradient when we convert from % to fixed values, for objectBoundingBox case. + /** + * Horizontal offset for aligning gradients coming from SVG when outside pathgroups * @type Number * @default 0 */ - origY: 0, + offsetX: 0, + + /** + * Vertical offset for aligning gradients coming from SVG when outside pathgroups + * @type Number + * @default 0 + */ + offsetY: 0, /** * Constructor @@ -4804,15 +4930,13 @@ fabric.ElementsParser.prototype.checkIfDone = function() { coords.r1 = options.coords.r1 || 0; coords.r2 = options.coords.r2 || 0; } - this.coords = coords; - this.gradientUnits = options.gradientUnits || 'objectBoundingBox'; this.colorStops = options.colorStops.slice(); if (options.gradientTransform) { this.gradientTransform = options.gradientTransform; } - this.origX = options.left || this.origX; - this.origY = options.top || this.origY; + this.offsetX = options.offsetX || this.offsetX; + this.offsetY = options.offsetY || this.offsetY; }, /** @@ -4840,8 +4964,9 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return { type: this.type, coords: this.coords, - gradientUnits: this.gradientUnits, - colorStops: this.colorStops + colorStops: this.colorStops, + offsetX: this.offsetX, + offsetY: this.offsetY }; }, @@ -4852,7 +4977,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @param {Boolean} normalize Whether coords should be normalized * @return {String} SVG representation of an gradient (linear/radial) */ - toSVG: function(object, normalize) { + toSVG: function(object) { var coords = fabric.util.object.clone(this.coords), markup, commonAttributes; @@ -4861,17 +4986,19 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return a.offset - b.offset; }); - if (normalize && this.gradientUnits === 'userSpaceOnUse') { - coords.x1 += object.width / 2; - coords.y1 += object.height / 2; - coords.x2 += object.width / 2; - coords.y2 += object.height / 2; - } - else if (this.gradientUnits === 'objectBoundingBox') { - _convertValuesToPercentUnits(object, coords); + if (!(object.group && object.group.type === 'path-group')) { + for (var prop in coords) { + if (prop === 'x1' || prop === 'x2' || prop === 'r2') { + coords[prop] += this.offsetX - object.width / 2; + } + else if (prop === 'y1' || prop === 'y2') { + coords[prop] += this.offsetY - object.height / 2; + } + } } + commonAttributes = 'id="SVGID_' + this.id + - '" gradientUnits="' + this.gradientUnits + '"'; + '" gradientUnits="userSpaceOnUse"'; if (this.gradientTransform) { commonAttributes += ' gradientTransform="matrix(' + this.gradientTransform.join(' ') + ')" '; } @@ -4926,20 +5053,31 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @param {CanvasRenderingContext2D} ctx Context to render on * @return {CanvasGradient} */ - toLive: function(ctx) { - var gradient; + toLive: function(ctx, object) { + var gradient, coords = fabric.util.object.clone(this.coords); if (!this.type) { return; } + if (object.group && object.group.type === 'path-group') { + for (var prop in coords) { + if (prop === 'x1' || prop === 'x2') { + coords[prop] += -this.offsetX + object.width / 2; + } + else if (prop === 'y1' || prop === 'y2') { + coords[prop] += -this.offsetY + object.height / 2; + } + } + } + if (this.type === 'linear') { gradient = ctx.createLinearGradient( - this.coords.x1, this.coords.y1, this.coords.x2, this.coords.y2); + coords.x1, coords.y1, coords.x2, coords.y2); } else if (this.type === 'radial') { gradient = ctx.createRadialGradient( - this.coords.x1, this.coords.y1, this.coords.r1, this.coords.x2, this.coords.y2, this.coords.r2); + coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2); } for (var i = 0, len = this.colorStops.length; i < len; i++) { @@ -5010,7 +5148,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { gradientUnits = el.getAttribute('gradientUnits') || 'objectBoundingBox', gradientTransform = el.getAttribute('gradientTransform'), colorStops = [], - coords = { }; + coords = { }, ellipseMatrix; if (type === 'linear') { coords = getLinearCoords(el); @@ -5023,19 +5161,19 @@ fabric.ElementsParser.prototype.checkIfDone = function() { colorStops.push(getColorStop(colorStopEls[i])); } - _convertPercentUnitsToValues(instance, coords); + ellipseMatrix = _convertPercentUnitsToValues(instance, coords, gradientUnits); var gradient = new fabric.Gradient({ type: type, coords: coords, - gradientUnits: gradientUnits, - colorStops: colorStops + colorStops: colorStops, + offsetX: -instance.left, + offsetY: -instance.top }); - if (gradientTransform) { - gradient.gradientTransform = fabric.parseTransformAttribute(gradientTransform); + if (gradientTransform || ellipseMatrix !== '') { + gradient.gradientTransform = fabric.parseTransformAttribute((gradientTransform || '') + ellipseMatrix); } - return gradient; }, /* _FROM_SVG_END_ */ @@ -5049,7 +5187,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { */ forObject: function(obj, options) { options || (options = { }); - _convertPercentUnitsToValues(obj, options); + _convertPercentUnitsToValues(obj, options.coords, 'userSpaceOnUse'); return new fabric.Gradient(options); } }); @@ -5057,37 +5195,38 @@ fabric.ElementsParser.prototype.checkIfDone = function() { /** * @private */ - function _convertPercentUnitsToValues(object, options) { + function _convertPercentUnitsToValues(object, options, gradientUnits) { + var propValue, addFactor = 0, multFactor = 1, ellipseMatrix = ''; for (var prop in options) { + propValue = parseFloat(options[prop], 10); if (typeof options[prop] === 'string' && /^\d+%$/.test(options[prop])) { - var percents = parseFloat(options[prop], 10); - if (prop === 'x1' || prop === 'x2' || prop === 'r2') { - options[prop] = fabric.util.toFixed(object.width * percents / 100, 2) + object.left; - } - else if (prop === 'y1' || prop === 'y2') { - options[prop] = fabric.util.toFixed(object.height * percents / 100, 2) + object.top; - } + multFactor = 0.01; + } + else { + multFactor = 1; } - } - } - - /* _TO_SVG_START_ */ - /** - * @private - */ - function _convertValuesToPercentUnits(object, options) { - for (var prop in options) { - //convert to percent units if (prop === 'x1' || prop === 'x2' || prop === 'r2') { - options[prop] = fabric.util.toFixed((options[prop] - object.fill.origX) / object.width * 100, 2) + '%'; + multFactor *= gradientUnits === 'objectBoundingBox' ? object.width : 1; + addFactor = gradientUnits === 'objectBoundingBox' ? object.left || 0 : 0; } else if (prop === 'y1' || prop === 'y2') { - options[prop] = fabric.util.toFixed((options[prop] - object.fill.origY) / object.height * 100, 2) + '%'; + multFactor *= gradientUnits === 'objectBoundingBox' ? object.height : 1; + addFactor = gradientUnits === 'objectBoundingBox' ? object.top || 0 : 0; + } + options[prop] = propValue * multFactor + addFactor; + } + if (object.type === 'ellipse' && options.r2 !== null && gradientUnits === 'objectBoundingBox' && object.rx !== object.ry) { + var scaleFactor = object.ry/object.rx; + ellipseMatrix = ' scale(1, ' + scaleFactor + ')'; + if (options.y1) { + options.y1 /= scaleFactor; + } + if (options.y2) { + options.y2 /= scaleFactor; } } + return ellipseMatrix; } - /* _TO_SVG_END_ */ - })(); @@ -10974,8 +11113,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati if (this.group) { this.group.transform(ctx, fromLeft); } - ctx.globalAlpha = this.opacity; - var center = fromLeft ? this._getLeftTopCoords() : this.getCenterPoint(); ctx.translate(center.x, center.y); ctx.rotate(degreesToRadians(this.angle)); @@ -11196,12 +11333,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati if (this.group && this.group.type === 'path-group') { ctx.translate(-this.group.width/2, -this.group.height/2); - var m = this.transformMatrix; - if (m) { - ctx.transform.apply(ctx, m); + if (this.transformMatrix) { + ctx.transform.apply(ctx, this.transformMatrix); } } - ctx.globalAlpha = this.group ? (ctx.globalAlpha * this.opacity) : this.opacity; + this._setOpacity(ctx); this._setShadow(ctx); this.clipTo && fabric.util.clipContext(this, ctx); this._render(ctx, noTransform); @@ -11223,6 +11359,16 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati } }, + /* @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _setOpacity: function(ctx) { + if (this.group) { + this.group._setOpacity(ctx); + } + ctx.globalAlpha *= this.opacity; + }, + _setStrokeStyles: function(ctx) { if (this.stroke) { ctx.lineWidth = this.strokeWidth; @@ -11230,7 +11376,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati ctx.lineJoin = this.strokeLineJoin; ctx.miterLimit = this.strokeMiterLimit; ctx.strokeStyle = this.stroke.toLive - ? this.stroke.toLive(ctx) + ? this.stroke.toLive(ctx, this) : this.stroke; } }, @@ -11238,7 +11384,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati _setFillStyles: function(ctx) { if (this.fill) { ctx.fillStyle = this.fill.toLive - ? this.fill.toLive(ctx) + ? this.fill.toLive(ctx, this) : this.fill; } }, @@ -11310,15 +11456,15 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati } ctx.save(); + if (this.fill.gradientTransform) { + var g = this.fill.gradientTransform; + ctx.transform.apply(ctx, g); + } if (this.fill.toLive) { ctx.translate( -this.width / 2 + this.fill.offsetX || 0, -this.height / 2 + this.fill.offsetY || 0); } - if (this.fill.gradientTransform) { - var g = this.fill.gradientTransform; - ctx.transform.apply(ctx, g); - } if (this.fillRule === 'destination-over') { ctx.fill('evenodd'); } @@ -13748,8 +13894,8 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot 'use strict'; - var fabric = global.fabric || (global.fabric = { }), - piBy2 = Math.PI * 2, + var fabric = global.fabric || (global.fabric = { }), + pi = Math.PI, extend = fabric.util.object.extend; if (fabric.Circle) { @@ -13779,6 +13925,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ radius: 0, + /** + * Start angle of the circle, moving clockwise + * @type Number + * @default 0 + */ + startAngle: 0, + + /** + * End angle of the circle + * @type Number + * @default 2Pi + */ + endAngle: pi * 2, + /** * Constructor * @param {Object} [options] Options object @@ -13789,6 +13949,8 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.callSuper('initialize', options); this.set('radius', options.radius || 0); + this.startAngle = options.startAngle || this.startAngle; + this.endAngle = options.endAngle || this.endAngle; }, /** @@ -13814,7 +13976,9 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ toObject: function(propertiesToInclude) { return extend(this.callSuper('toObject', propertiesToInclude), { - radius: this.get('radius') + radius: this.get('radius'), + startAngle: this.startAngle, + endAngle: this.endAngle }); }, @@ -13825,20 +13989,41 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {String} svg representation of an instance */ toSVG: function(reviver) { - var markup = this._createBaseSVGMarkup(), x = 0, y = 0; - if (this.group) { - x = this.left + this.radius; - y = this.top + this.radius; + var markup = this._createBaseSVGMarkup(), x = 0, y = 0, + angle = (this.endAngle - this.startAngle) % ( 2 * pi); + + if (angle === 0) { + if (this.group && this.group.type === 'path-group') { + x = this.left + this.radius; + y = this.top + this.radius; + } + markup.push( + '\n' + ); } - markup.push( - '\n' - ); + '"/>\n' + ); + } return reviver ? reviver(markup.join('')) : markup.join(''); }, @@ -13851,7 +14036,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ _render: function(ctx, noTransform) { ctx.beginPath(); - ctx.arc(noTransform ? this.left + this.radius : 0, noTransform ? this.top + this.radius : 0, this.radius, 0, piBy2, false); + ctx.arc(noTransform ? this.left + this.radius : 0, noTransform ? this.top + this.radius : 0, this.radius, this.startAngle, this.endAngle, false); this._renderFill(ctx); this._renderStroke(ctx); }, @@ -14345,17 +14530,13 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot ry = this.ry ? Math.min(this.ry, this.height / 2) : 0, w = this.width, h = this.height, - x = noTransform ? this.left : 0, - y = noTransform ? this.top : 0, + x = noTransform ? this.left : -this.width / 2, + y = noTransform ? this.top : -this.height / 2, isRounded = rx !== 0 || ry !== 0, k = 1 - 0.5522847498 /* "magic number" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */; ctx.beginPath(); - if (!noTransform) { - ctx.translate(-this.width / 2, -this.height / 2); - } - ctx.moveTo(x + rx, y); ctx.lineTo(x + w - rx, y); @@ -14495,8 +14676,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot 'use strict'; - var fabric = global.fabric || (global.fabric = { }), - toFixed = fabric.util.toFixed; + var fabric = global.fabric || (global.fabric = { }); if (fabric.Polyline) { fabric.warn('fabric.Polyline is already defined'); @@ -14525,6 +14705,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ points: null, + /** + * Minimum X from points values, necessary to offset points + * @type Number + * @default + */ + minX: 0, + + /** + * Minimum Y from points values, necessary to offset points + * @type Number + * @default + */ + minY: 0, + /** * Constructor * @param {Array} points Array of points (where each point is an object with x and y) @@ -14545,19 +14739,22 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * top: 100 * }); */ - initialize: function(points, options, skipOffset) { - options = options || { }; - this.set('points', points); - this.callSuper('initialize', options); - this._calcDimensions(skipOffset); + initialize: function(points, options) { + return fabric.Polygon.prototype.initialize.call(this, points, options); }, /** * @private - * @param {Boolean} [skipOffset] Whether points offsetting should be skipped */ - _calcDimensions: function(skipOffset) { - return fabric.Polygon.prototype._calcDimensions.call(this, skipOffset); + _calcDimensions: function() { + return fabric.Polygon.prototype._calcDimensions.call(this); + }, + + /** + * @private + */ + _applyPointOffset: function() { + return fabric.Polygon.prototype._applyPointOffset.call(this); }, /** @@ -14576,23 +14773,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {String} svg representation of an instance */ toSVG: function(reviver) { - var points = [], - markup = this._createBaseSVGMarkup(); - - for (var i = 0, len = this.points.length; i < len; i++) { - points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); - } - - markup.push( - '\n' - ); - - return reviver ? reviver(markup.join('')) : markup.join(''); + return fabric.Polygon.prototype.toSVG.call(this, reviver); }, /* _TO_SVG_END_ */ @@ -14601,14 +14782,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {CanvasRenderingContext2D} ctx Context to render on */ _render: function(ctx) { - var point; - ctx.beginPath(); - ctx.moveTo(this.points[0].x, this.points[0].y); - for (var i = 0, len = this.points.length; i < len; i++) { - point = this.points[i]; - ctx.lineTo(point.x, point.y); - } - + fabric.Polygon.prototype.commonRender.call(this, ctx); this._renderFill(ctx); this._renderStroke(ctx); }, @@ -14667,7 +14841,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return null; } - return new fabric.Polyline(points, fabric.util.object.extend(parsedAttributes, options), true); + return new fabric.Polyline(points, fabric.util.object.extend(parsedAttributes, options)); }; /* _FROM_SVG_END_ */ @@ -14723,25 +14897,43 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ points: null, + /** + * Minimum X from points values, necessary to offset points + * @type Number + * @default + */ + minX: 0, + + /** + * Minimum Y from points values, necessary to offset points + * @type Number + * @default + */ + minY: 0, + /** * Constructor * @param {Array} points Array of points * @param {Object} [options] Options object - * @param {Boolean} [skipOffset] Whether points offsetting should be skipped * @return {fabric.Polygon} thisArg */ - initialize: function(points, options, skipOffset) { + initialize: function(points, options) { options = options || { }; this.points = points; this.callSuper('initialize', options); - this._calcDimensions(skipOffset); + this._calcDimensions(); + if (!('top' in options)) { + this.top = this.minY; + } + if (!('left' in options)) { + this.left = this.minX; + } }, /** * @private - * @param {Boolean} [skipOffset] Whether points offsetting should be skipped */ - _calcDimensions: function(skipOffset) { + _calcDimensions: function() { var points = this.points, minX = min(points, 'x'), @@ -14752,20 +14944,19 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.width = (maxX - minX) || 1; this.height = (maxY - minY) || 1; - this.minX = minX; + this.minX = minX, this.minY = minY; + }, - if (skipOffset) { - return; - } - - var halfWidth = this.width / 2 + this.minX, - halfHeight = this.height / 2 + this.minY; - + /** + * @private + */ + _applyPointOffset: function() { // change points to offset polygon into a bounding box + // executed one time this.points.forEach(function(p) { - p.x -= halfWidth; - p.y -= halfHeight; + p.x -= (this.minX + this.width / 2); + p.y -= (this.minY + this.height / 2); }, this); }, @@ -14795,7 +14986,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot } markup.push( - '\n' //jscs:enable validateIndentation @@ -15522,13 +15683,294 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @private */ _parseDimensions: function() { + var aX = [], aY = [], - previous = { }; + current, // current instruction + previous = null, + subpathStartX = 0, + subpathStartY = 0, + x = 0, // current x + y = 0, // current y + controlX = 0, // current control point x + controlY = 0, // current control point y + tempX, + tempY, + tempControlX, + tempControlY, + bounds; - this.path.forEach(function(item, i) { - this._getCoordsFromCommand(item, i, aX, aY, previous); - }, this); + for (var i = 0, len = this.path.length; i < len; ++i) { + + current = this.path[i]; + + switch (current[0]) { // first letter + + case 'l': // lineto, relative + x += current[1]; + y += current[2]; + bounds = [ ]; + break; + + case 'L': // lineto, absolute + x = current[1]; + y = current[2]; + bounds = [ ]; + break; + + case 'h': // horizontal lineto, relative + x += current[1]; + bounds = [ ]; + break; + + case 'H': // horizontal lineto, absolute + x = current[1]; + bounds = [ ]; + break; + + case 'v': // vertical lineto, relative + y += current[1]; + bounds = [ ]; + break; + + case 'V': // verical lineto, absolute + y = current[1]; + bounds = [ ]; + break; + + case 'm': // moveTo, relative + x += current[1]; + y += current[2]; + subpathStartX = x; + subpathStartY = y; + bounds = [ ]; + break; + + case 'M': // moveTo, absolute + x = current[1]; + y = current[2]; + subpathStartX = x; + subpathStartY = y; + bounds = [ ]; + break; + + case 'c': // bezierCurveTo, relative + tempX = x + current[5]; + tempY = y + current[6]; + controlX = x + current[3]; + controlY = y + current[4]; + bounds = fabric.util.getBoundsOfCurve(x, y, + x + current[1], // x1 + y + current[2], // y1 + controlX, // x2 + controlY, // y2 + tempX, + tempY + ); + x = tempX; + y = tempY; + break; + + case 'C': // bezierCurveTo, absolute + x = current[5]; + y = current[6]; + controlX = current[3]; + controlY = current[4]; + bounds = fabric.util.getBoundsOfCurve(x, y, + current[1], + current[2], + controlX, + controlY, + x, + y + ); + break; + + case 's': // shorthand cubic bezierCurveTo, relative + + // transform to absolute x,y + tempX = x + current[3]; + tempY = y + current[4]; + + // calculate reflection of previous control points + controlX = controlX ? (2 * x - controlX) : x; + controlY = controlY ? (2 * y - controlY) : y; + + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + x + current[1], + y + current[2], + tempX, + tempY + ); + // set control point to 2nd one of this command + // "... the first control point is assumed to be + // the reflection of the second control point on + // the previous command relative to the current point." + controlX = x + current[1]; + controlY = y + current[2]; + x = tempX; + y = tempY; + break; + + case 'S': // shorthand cubic bezierCurveTo, absolute + tempX = current[3]; + tempY = current[4]; + // calculate reflection of previous control points + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + current[1], + current[2], + tempX, + tempY + ); + x = tempX; + y = tempY; + // set control point to 2nd one of this command + // "... the first control point is assumed to be + // the reflection of the second control point on + // the previous command relative to the current point." + controlX = current[1]; + controlY = current[2]; + break; + + case 'q': // quadraticCurveTo, relative + // transform to absolute x,y + tempX = x + current[3]; + tempY = y + current[4]; + controlX = x + current[1]; + controlY = y + current[2]; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + tempX, + tempY + ); + x = tempX; + y = tempY; + break; + + case 'Q': // quadraticCurveTo, absolute + controlX = current[1]; + controlY = current[2]; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + current[3], + current[4] + ); + x = current[3]; + y = current[4]; + break; + + case 't': // shorthand quadraticCurveTo, relative + // transform to absolute x,y + tempX = x + current[1]; + tempY = y + current[2]; + if (previous[0].match(/[QqTt]/) === null) { + // If there is no previous command or if the previous command was not a Q, q, T or t, + // assume the control point is coincident with the current point + controlX = x; + controlY = y; + } + else if (previous[0] === 't') { + // calculate reflection of previous control points for t + controlX = 2 * x - tempControlX; + controlY = 2 * y - tempControlY; + } + else if (previous[0] === 'q') { + // calculate reflection of previous control points for q + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + } + + tempControlX = controlX; + tempControlY = controlY; + + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + tempX, + tempY + ); + x = tempX; + y = tempY; + controlX = x + current[1]; + controlY = y + current[2]; + break; + + case 'T': + tempX = current[1]; + tempY = current[2]; + // calculate reflection of previous control points + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + bounds = fabric.util.getBoundsOfCurve(x, y, + controlX, + controlY, + controlX, + controlY, + tempX, + tempY + ); + x = tempX; + y = tempY; + break; + + case 'a': + // TODO: optimize this + bounds = fabric.util.getBoundsOfArc(x, y, + current[1], + current[2], + current[3], + current[4], + current[5], + current[6] + x, + current[7] + y + ); + x += current[6]; + y += current[7]; + break; + + case 'A': + // TODO: optimize this + bounds = fabric.util.getBoundsOfArc(x, y, + current[1], + current[2], + current[3], + current[4], + current[5], + current[6], + current[7] + ); + x = current[6]; + y = current[7]; + break; + + case 'z': + case 'Z': + x = subpathStartX; + y = subpathStartY; + break; + } + previous = current; + bounds.forEach(function (point) { + aX.push(point.x); + aY.push(point.y); + }); + aX.push(x); + aY.push(y); + } var minX = min(aX), minY = min(aY), @@ -15538,63 +15980,13 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot deltaY = maxY - minY, o = { - left: this.left + (minX + deltaX / 2), - top: this.top + (minY + deltaY / 2), + left: minX, + top: minY, width: deltaX, height: deltaY }; return o; - }, - - _getCoordsFromCommand: function(item, i, aX, aY, previous) { - var isLowerCase = false; - - if (item[0] !== 'H') { - previous.x = (i === 0) ? getX(item) : getX(this.path[i - 1]); - } - if (item[0] !== 'V') { - previous.y = (i === 0) ? getY(item) : getY(this.path[i - 1]); - } - - // lowercased letter denotes relative position; - // transform to absolute - if (item[0] === item[0].toLowerCase()) { - isLowerCase = true; - } - - var xy = this._getXY(item, isLowerCase, previous), - val; - - val = parseInt(xy.x, 10); - if (!isNaN(val)) { - aX.push(val); - } - - val = parseInt(xy.y, 10); - if (!isNaN(val)) { - aY.push(val); - } - }, - - _getXY: function(item, isLowerCase, previous) { - - // last 2 items in an array of coordinates are the actualy x/y (except H/V), collect them - // TODO (kangax): support relative h/v commands - - var x = isLowerCase - ? previous.x + getX(item) - : item[0] === 'V' - ? previous.x - : getX(item), - - y = isLowerCase - ? previous.y + getY(item) - : item[0] === 'H' - ? previous.y - : getY(item); - - return { x: x, y: y }; } }); @@ -18389,6 +18781,19 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag } context.putImageData(imageData, 0, 0); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return { + color: this.color, + image: this.image, + mode: this.mode, + alpha: this.alpha + }; } }); @@ -19249,8 +19654,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag : (this.height/2) - (textLines.length * this.fontSize) - this._totalLineHeight; return { - textLeft: textLeft + (this.group ? this.left : 0), - textTop: textTop + (this.group ? this.top : 0), + textLeft: textLeft + (this.group && this.group.type === 'path-group' ? this.left : 0), + textTop: textTop + (this.group && this.group.type === 'path-group' ? this.top : 0), lineTop: lineTop }; }, @@ -21759,7 +22164,13 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ _keysMap: { 8: 'removeChars', + 9: 'exitEditing', + 27: 'exitEditing', 13: 'insertNewline', + 33: 'moveCursorUp', + 34: 'moveCursorDown', + 35: 'moveCursorRight', + 36: 'moveCursorLeft', 37: 'moveCursorLeft', 38: 'moveCursorUp', 39: 'moveCursorRight', @@ -21885,9 +22296,9 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (!this.isEditing || e.metaKey || e.ctrlKey) { return; } - - this.insertChars(String.fromCharCode(e.which)); - + if (e.which !== 0) { + this.insertChars(String.fromCharCode(e.which)); + } e.stopPropagation(); }, @@ -21913,7 +22324,7 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot cursorLocation = this.get2DCursorLocation(selectionProp); // if on last line, down cursor goes to end of line - if (cursorLocation.lineIndex === textLines.length - 1 || e.metaKey) { + if (cursorLocation.lineIndex === textLines.length - 1 || e.metaKey || e.keyCode === 34) { // move to the end of a text return this.text.length - selectionProp; @@ -22011,23 +22422,31 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this.selectionEnd = this.selectionStart; }, + /** + * private + */ + swapSelectionPoints: function() { + var swapSel = this.selectionEnd; + this.selectionEnd = this.selectionStart; + this.selectionStart = swapSel; + }, + /** * Moves cursor down while keeping selection * @param {Number} offset */ moveCursorDownWithShift: function(offset) { - if (this._selectionDirection === 'left' && (this.selectionStart !== this.selectionEnd)) { - this.selectionStart += offset; - this._selectionDirection = 'left'; - return; - } - else { + if (this.selectionEnd === this.selectionStart) { this._selectionDirection = 'right'; - this.selectionEnd += offset; - - if (this.selectionEnd > this.text.length) { - this.selectionEnd = this.text.length; - } + } + var prop = this._selectionDirection === 'right' ? 'selectionEnd' : 'selectionStart'; + this[prop] += offset; + if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'left') { + this.swapSelectionPoints(); + this._selectionDirection = 'right'; + } + if (this.selectionEnd > this.text.length) { + this.selectionEnd = this.text.length; } }, @@ -22039,9 +22458,8 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot getUpCursorOffset: function(e, isRight) { var selectionProp = isRight ? this.selectionEnd : this.selectionStart, cursorLocation = this.get2DCursorLocation(selectionProp); - // if on first line, up cursor goes to start of line - if (cursorLocation.lineIndex === 0 || e.metaKey) { + if (cursorLocation.lineIndex === 0 || e.metaKey || e.keyCode === 33) { return selectionProp; } @@ -22118,7 +22536,6 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this._currentCursorOpacity = 1; var offset = this.getUpCursorOffset(e, this._selectionDirection === 'right'); - if (e.shiftKey) { this.moveCursorUpWithShift(offset); } @@ -22134,26 +22551,18 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Number} offset */ moveCursorUpWithShift: function(offset) { - - if (this.selectionStart === this.selectionEnd) { - this.selectionStart -= offset; + if (this.selectionEnd === this.selectionStart) { + this._selectionDirection = 'left'; } - else { - if (this._selectionDirection === 'right') { - this.selectionEnd -= offset; - this._selectionDirection = 'right'; - return; - } - else { - this.selectionStart -= offset; - } + var prop = this._selectionDirection === 'right' ? 'selectionEnd' : 'selectionStart'; + this[prop] -= offset; + if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'right') { + this.swapSelectionPoints(); + this._selectionDirection = 'left'; } - if (this.selectionStart < 0) { this.selectionStart = 0; } - - this._selectionDirection = 'left'; }, /** @@ -22201,7 +22610,7 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (e.altKey) { this[prop] = this['findWordBoundary' + direction](this[prop]); } - else if (e.metaKey) { + else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { this[prop] = this['findLineBoundary' + direction](this[prop]); } else { diff --git a/src/util/arc.js b/src/util/arc.js index 151daa42..8075fb19 100644 --- a/src/util/arc.js +++ b/src/util/arc.js @@ -145,7 +145,7 @@ * @param {Number} rx horizontal radius * @param {Number} ry vertical radius * @param {Number} rot angle of horizontal axe - * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points + * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction * @param {Number} tx end point of arc * @param {Number} ty @@ -186,7 +186,7 @@ if (boundsOfCurveCache[argsString]) { return boundsOfCurveCache[argsString]; } - + var sqrt = Math.sqrt, min = Math.min, max = Math.max, abs = Math.abs, tvalues = [ ], @@ -230,7 +230,7 @@ } var x, y, j = tvalues.length, jlen = j, mt; - while(j--) { + while (j--) { t = tvalues[j]; mt = 1 - t; x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); @@ -253,7 +253,7 @@ x: max.apply(null, bounds[0]), y: max.apply(null, bounds[1]) } - ]; + ]; boundsOfCurveCache[argsString] = result; return result; }