From 2534e0db5d1f986b3b03b02c21837fd921cd9749 Mon Sep 17 00:00:00 2001 From: kangax Date: Sat, 1 Nov 2014 17:41:08 +0100 Subject: [PATCH] Build dist --- dist/fabric.js | 540 ++++++++++++++++++++++++++++------------- dist/fabric.min.js | 14 +- dist/fabric.min.js.gz | Bin 58340 -> 59136 bytes dist/fabric.require.js | 540 ++++++++++++++++++++++++++++------------- 4 files changed, 745 insertions(+), 349 deletions(-) diff --git a/dist/fabric.js b/dist/fabric.js index 1301287e..dc451e18 100644 --- a/dist/fabric.js +++ b/dist/fabric.js @@ -15,7 +15,9 @@ else { fabric.document = require("jsdom") .jsdom(""); - fabric.window = fabric.document.createWindow(); + if (fabric.document.createWindow) { + fabric.window = fabric.document.createWindow(); + } } /** @@ -31,7 +33,6 @@ fabric.isTouchSupported = "ontouchstart" in fabric.document.documentElement; fabric.isLikelyNode = typeof Buffer !== 'undefined' && typeof window === 'undefined'; - /** * Attributes parsed from all SVG elements * @type array @@ -50,6 +51,7 @@ fabric.SHARED_ATTRIBUTES = [ * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion. */ fabric.DPI = 96; +fabric.reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)'; (function() { @@ -466,10 +468,12 @@ fabric.Collection = { * @param {Number|String} value number to operate on * @return {Number|String} */ - parseUnit: function(value) { + parseUnit: function(value, fontSize) { var unit = /\D{0,2}$/.exec(value), number = parseFloat(value); - + if (!fontSize) { + fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; + } switch (unit[0]) { case 'mm': return number * fabric.DPI / 25.4; @@ -486,6 +490,9 @@ fabric.Collection = { case 'pc': return number * fabric.DPI / 72 * 12; // or * 16 + case 'em': + return number * fontSize; + default: return number; } @@ -2871,7 +2878,7 @@ if (typeof console !== 'undefined') { return attr; } - function normalizeValue(attr, value, parentAttributes) { + function normalizeValue(attr, value, parentAttributes, fontSize) { var isArray = Object.prototype.toString.call(value) === '[object Array]', parsed; @@ -2903,7 +2910,7 @@ if (typeof console !== 'undefined') { value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center'; } else { - parsed = isArray ? value.map(parseUnit) : parseUnit(value); + parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize); } return (!isArray && isNaN(parsed) ? value : parsed); @@ -2982,7 +2989,7 @@ if (typeof console !== 'undefined') { ], // == begin transform regexp - number = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)', + number = fabric.reNum, commaWsp = '(?:\\s+,?\\s*|,\\s*)', @@ -3085,40 +3092,6 @@ if (typeof console !== 'undefined') { }; })(); - function parseFontDeclaration(value, oStyle) { - - // TODO: support non-px font size - var match = value.match(/(normal|italic)?\s*(normal|small-caps)?\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\s*(\d+)px(?:\/(normal|[\d\.]+))?\s+(.*)/); - - if (!match) { - return; - } - - var fontStyle = match[1], - // font variant is not used - // fontVariant = match[2], - fontWeight = match[3], - fontSize = match[4], - lineHeight = match[5], - fontFamily = match[6]; - - if (fontStyle) { - oStyle.fontStyle = fontStyle; - } - if (fontWeight) { - oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight); - } - if (fontSize) { - oStyle.fontSize = parseFloat(fontSize); - } - if (fontFamily) { - oStyle.fontFamily = fontFamily; - } - if (lineHeight) { - oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight; - } - } - /** * @private */ @@ -3130,12 +3103,7 @@ if (typeof console !== 'undefined') { attr = normalizeAttr(pair[0].trim().toLowerCase()); value = normalizeValue(attr, pair[1].trim()); - if (attr === 'font') { - parseFontDeclaration(value, oStyle); - } - else { - oStyle[attr] = value; - } + oStyle[attr] = value; }); } @@ -3152,12 +3120,7 @@ if (typeof console !== 'undefined') { attr = normalizeAttr(prop.toLowerCase()); value = normalizeValue(attr, style[prop]); - if (attr === 'font') { - parseFontDeclaration(value, oStyle); - } - else { - oStyle[attr] = value; - } + oStyle[attr] = value; } } @@ -3236,7 +3199,7 @@ if (typeof console !== 'undefined') { x = el.getAttribute('x') || 0, y = el.getAttribute('y') || 0, el2 = doc.getElementById(xlink).cloneNode(true), - currentTrans = (el.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')', + currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')', parentNode; for (var j = 0, attrs = el.attributes, l = attrs.length; j < l; j++) { @@ -3246,7 +3209,7 @@ if (typeof console !== 'undefined') { } if (attr.nodeName === 'transform') { - currentTrans = currentTrans + ' ' + attr.nodeValue; + currentTrans = attr.nodeValue + ' ' + currentTrans; } else { el2.setAttribute(attr.nodeName, attr.nodeValue); @@ -3254,6 +3217,7 @@ if (typeof console !== 'undefined') { } el2.setAttribute('transform', currentTrans); + el2.setAttribute('instantiated_by_use', '1'); el2.removeAttribute('id'); parentNode = el.parentNode; parentNode.replaceChild(el2, el); @@ -3261,28 +3225,67 @@ if (typeof console !== 'undefined') { } /** - * Add a element that envelop all SCG elements and makes the viewbox transformMatrix descend on all elements + * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements */ - function addSvgTransform(doc, matrix) { - matrix[3] = matrix[0] = (matrix[0] > matrix[3] ? matrix[3] : matrix[0]); - if (!(matrix[0] !== 1 || matrix[3] !== 1 || matrix[4] !== 0 || matrix[5] !== 0)) { + function addVBTransform(element, widthAttr, heightAttr) { + + // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute + // matches, e.g.: +14.56e-12, etc. + var reViewBoxAttrValue = new RegExp( + '^' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*' + + '$' + ), + viewBoxAttr = element.getAttribute('viewBox'), + scaleX = 1, scaleY = 1, minX = 0, minY = 0, + viewBoxWidth, viewBoxHeight, matrix, el; + + if (viewBoxAttr && (viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))) { + minX = -parseFloat(viewBoxAttr[1]), + minY = -parseFloat(viewBoxAttr[2]), + viewBoxWidth = parseFloat(viewBoxAttr[3]), + viewBoxHeight = parseFloat(viewBoxAttr[4]); + } + else { return; } + if (widthAttr && widthAttr !== viewBoxWidth) { + scaleX = widthAttr / viewBoxWidth; + } + if (heightAttr && heightAttr !== viewBoxHeight) { + scaleY = heightAttr / viewBoxHeight; + } + // default is to preserve aspect ratio // preserveAspectRatio attribute to be implemented - var el = doc.ownerDocument.createElement('g'); - while (doc.firstChild != null) { - el.appendChild(doc.firstChild); - } - el.setAttribute('transform', - 'matrix(' + matrix[0] + ' ' + - matrix[1] + ' ' + - matrix[2] + ' ' + - matrix[3] + ' ' + - matrix[4] + ' ' + - matrix[5] + ')'); + scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX); - doc.appendChild(el); + if (!(scaleX !== 1 || scaleY !== 1 || minX !== 0 || minY !== 0)) { + return; + } + matrix = 'matrix(' + scaleX + + ' 0' + + ' 0 ' + + scaleY + ' ' + + (minX * scaleX) + ' ' + + (minY * scaleY) + ')'; + + if (element.tagName === 'svg') { + el = element.ownerDocument.createElement('g'); + while (element.firstChild != null) { + el.appendChild(element.firstChild); + } + element.appendChild(el); + } + else { + el = element; + matrix += el.getAttribute('transform'); + } + + el.setAttribute('transform', matrix); } /** @@ -3297,25 +3300,11 @@ if (typeof console !== 'undefined') { fabric.parseSVGDocument = (function() { var reAllowedSVGTagNames = /^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/, - - // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute - // \d doesn't quite cut it (as we need to match an actual float number) - - // matches, e.g.: +14.56e-12, etc. - reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)', - - reViewBoxAttrValue = new RegExp( - '^' + - '\\s*(' + reNum + '+)\\s*,?' + - '\\s*(' + reNum + '+)\\s*,?' + - '\\s*(' + reNum + '+)\\s*,?' + - '\\s*(' + reNum + '+)\\s*' + - '$' - ); + reViewBoxTagNames = /^(symbol|image|marker|pattern|view)$/; function hasAncestorWithNodeName(element, nodeName) { while (element && (element = element.parentNode)) { - if (nodeName.test(element.nodeName)) { + if (nodeName.test(element.nodeName) && !element.getAttribute('instantiated_by_use')) { return true; } } @@ -3326,34 +3315,19 @@ if (typeof console !== 'undefined') { if (!doc) { return; } - var startTime = new Date(), - svgUid = fabric.Object.__uid++; parseUseDirectives(doc); + + var startTime = new Date(), + svgUid = fabric.Object.__uid++, /* http://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute * as per spec, width and height attributes are to be considered * 100% if no value is specified. */ - var viewBoxAttr = doc.getAttribute('viewBox'), widthAttr = parseUnit(doc.getAttribute('width') || '100%'), - heightAttr = parseUnit(doc.getAttribute('height') || '100%'), - viewBoxWidth, - viewBoxHeight; + heightAttr = parseUnit(doc.getAttribute('height') || '100%'); - if (viewBoxAttr && (viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))) { - var minX = parseFloat(viewBoxAttr[1]), - minY = parseFloat(viewBoxAttr[2]), - scaleX = 1, scaleY = 1; - viewBoxWidth = parseFloat(viewBoxAttr[3]); - viewBoxHeight = parseFloat(viewBoxAttr[4]); - if (widthAttr && widthAttr !== viewBoxWidth ) { - scaleX = widthAttr / viewBoxWidth; - } - if (heightAttr && heightAttr !== viewBoxHeight) { - scaleY = heightAttr / viewBoxHeight; - } - addSvgTransform(doc, [scaleX, 0, 0, scaleY, scaleX * -minX, scaleY * -minY]); - } + addVBTransform(doc, widthAttr, heightAttr); var descendants = fabric.util.toArray(doc.getElementsByTagName('*')); @@ -3369,8 +3343,9 @@ if (typeof console !== 'undefined') { } var elements = descendants.filter(function(el) { + reViewBoxTagNames.test(el.tagName) && addVBTransform(el, 0, 0); return reAllowedSVGTagNames.test(el.tagName) && - !hasAncestorWithNodeName(el, /^(?:pattern|defs)$/); // http://www.w3.org/TR/SVG/struct.html#DefsElement + !hasAncestorWithNodeName(el, /^(?:pattern|defs|symbol)$/); // http://www.w3.org/TR/SVG/struct.html#DefsElement }); if (!elements || (elements && !elements.length)) { @@ -3379,8 +3354,8 @@ if (typeof console !== 'undefined') { } var options = { - width: widthAttr ? widthAttr : viewBoxWidth, - height: heightAttr ? heightAttr : viewBoxHeight, + width: widthAttr, + height: heightAttr, widthAttr: widthAttr, heightAttr: heightAttr, svgUid: svgUid @@ -3389,7 +3364,6 @@ if (typeof console !== 'undefined') { fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); fabric.cssRules[svgUid] = fabric.getCSSRules(doc); // Precedence of rules: style > class > attribute - fabric.parseElements(elements, function(instances) { fabric.documentParsingTime = new Date() - startTime; if (callback) { @@ -3457,6 +3431,48 @@ if (typeof console !== 'undefined') { } extend(fabric, { + /** + * Parses a short font declaration, building adding its properties to a style object + * @static + * @function + * @memberOf fabric + * @param {String} value font declaration + * @param {Object} oStyle definition + */ + parseFontDeclaration: function(value, oStyle) { + var fontDeclaration = '(normal|italic)?\\s*(normal|small-caps)?\\s*' + + '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*(' + + fabric.reNum + + '(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|' + fabric.reNum + '))?\\s+(.*)', + match = value.match(fontDeclaration); + + if (!match) { + return; + } + var fontStyle = match[1], + // font variant is not used + // fontVariant = match[2], + fontWeight = match[3], + fontSize = match[4], + lineHeight = match[5], + fontFamily = match[6]; + + if (fontStyle) { + oStyle.fontStyle = fontStyle; + } + if (fontWeight) { + oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight); + } + if (fontSize) { + oStyle.fontSize = parseUnit(fontSize); + } + if (fontFamily) { + oStyle.fontFamily = fontFamily; + } + if (lineHeight) { + oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight; + } + }, /** * Parses an SVG document, returning all of the gradient declarations found in it @@ -3518,7 +3534,8 @@ if (typeof console !== 'undefined') { } var value, - parentAttributes = { }; + parentAttributes = { }, + fontSize; if (typeof svgUid === 'undefined') { svgUid = element.getAttribute('svgUid'); @@ -3527,12 +3544,14 @@ if (typeof console !== 'undefined') { if (element.parentNode && /^symbol|[g|a]$/i.test(element.parentNode.nodeName)) { parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid); } + fontSize = (parentAttributes && parentAttributes.fontSize ) || + element.getAttribute('font-size') || fabric.Text.DEFAULT_SVG_FONT_SIZE; var ownAttributes = attributes.reduce(function(memo, attr) { value = element.getAttribute(attr); if (value) { attr = normalizeAttr(attr); - value = normalizeValue(attr, value, parentAttributes); + value = normalizeValue(attr, value, parentAttributes, fontSize); memo[attr] = value; } @@ -3543,7 +3562,9 @@ if (typeof console !== 'undefined') { // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) ownAttributes = extend(ownAttributes, extend(getGlobalStylesForElement(element, svgUid), fabric.parseStyleAttribute(element))); - + if (ownAttributes.font) { + fabric.parseFontDeclaration(ownAttributes.font, ownAttributes); + } return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); }, @@ -3660,7 +3681,11 @@ if (typeof console !== 'undefined') { } rule = match[1]; rule.split(',').forEach(function(_rule) { - allRules[_rule.trim()] = fabric.util.object.clone(ruleObj); + _rule = _rule.replace(/^svg/i, '').trim(); + if (_rule === '') { + return; + } + allRules[_rule] = fabric.util.object.clone(ruleObj); }); }); } @@ -5356,8 +5381,15 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ var patternSource = typeof this.source === 'function' ? this.source() : this.source, patternWidth = patternSource.width / object.getWidth(), patternHeight = patternSource.height / object.getHeight(), + patternOffsetX = this.offsetX / object.getWidth(), + patternOffsetY = this.offsetY / object.getHeight(), patternImgSrc = ''; - + if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') { + patternHeight = 1; + } + if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') { + patternWidth = 1; + } if (patternSource.src) { patternImgSrc = patternSource.src; } @@ -5366,16 +5398,16 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ } return '' + + '" height="' + patternHeight + '">\n' + '' + - ''; + '">\n' + + '\n'; }, /* _TO_SVG_END_ */ @@ -5520,23 +5552,31 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @return {String} SVG representation of a shadow */ toSVG: function(object) { - var mode = 'SourceAlpha'; + var mode = 'SourceAlpha', fBoxX = 40, fBoxY = 40; if (object && (object.fill === this.color || object.stroke === this.color)) { mode = 'SourceGraphic'; } + if (object.width && object.height) { + //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion + // we add some extra space to filter box to contain the blur ( 20 ) + fBoxX = Math.abs(this.offsetX / object.getWidth()) * 100 + 20; + fBoxY = Math.abs(this.offsetY / object.getHeight()) * 100 + 20; + } + return ( - '' + - '\n' + + '\t' + - '' + - '' + - '' + - '' + - '' + - ''); + '">\n' + + '\t\n' + + '\t\n' + + '\t\t\n' + + '\t\t\n' + + '\t\n' + + '\n'); }, /* _TO_SVG_END_ */ @@ -5811,6 +5851,16 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * originX: 'left', * originY: 'top' * }); + * @example overlayImage loaded from cross-origin + * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top', + * crossOrigin: 'anonymous' + * }); */ setOverlayImage: function (image, callback, options) { return this.__setBgOverlayImage('overlayImage', image, callback, options); @@ -5852,6 +5902,16 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * originX: 'left', * originY: 'top' * }); + * @example backgroundImage loaded from cross-origin + * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top', + * crossOrigin: 'anonymous' + * }); */ setBackgroundImage: function (image, callback, options) { return this.__setBgOverlayImage('backgroundImage', image, callback, options); @@ -5934,7 +5994,7 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ fabric.util.loadImage(image, function(img) { this[property] = new fabric.Image(img, options); callback && callback(); - }, this); + }, this, options && options.crossOrigin); } else { this[property] = image; @@ -8332,10 +8392,11 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @private */ _setObjectScale: function(localMouse, transform, lockScalingX, lockScalingY, by, lockScalingFlip) { - var target = transform.target, forbidScalingX = false, forbidScalingY = false; + var target = transform.target, forbidScalingX = false, forbidScalingY = false, + strokeWidth = target.stroke ? target.strokeWidth : 0; - transform.newScaleX = localMouse.x / (target.width + target.strokeWidth); - transform.newScaleY = localMouse.y / (target.height + target.strokeWidth); + transform.newScaleX = localMouse.x / (target.width + strokeWidth / 2); + transform.newScaleY = localMouse.y / (target.height + strokeWidth / 2); if (lockScalingFlip && transform.newScaleX <= 0 && transform.newScaleX < target.scaleX) { forbidScalingX = true; @@ -8369,8 +8430,9 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab _scaleObjectEqually: function(localMouse, target, transform) { var dist = localMouse.y + localMouse.x, - lastDist = (target.height + (target.strokeWidth)) * transform.original.scaleY + - (target.width + (target.strokeWidth)) * transform.original.scaleX; + strokeWidth = target.stroke ? target.strokeWidth : 0, + lastDist = (target.height + (strokeWidth / 2)) * transform.original.scaleY + + (target.width + (strokeWidth / 2)) * transform.original.scaleX; // We use transform.scaleX/Y instead of target.scaleX/Y // because the object may have a min scale and we'll loose the proportions @@ -8481,7 +8543,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab angle = 360 + angle; } - t.target.angle = angle; + t.target.angle = angle % 360; }, /** @@ -9811,8 +9873,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab : [ target, this._activeObject ]; return new fabric.Group(groupObjects, { - originX: 'center', - originY: 'center', canvas: this }); }, @@ -9831,8 +9891,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab } else if (group.length > 1) { group = new fabric.Group(group.reverse(), { - originX: 'center', - originY: 'center', canvas: this }); group.addWithUpdate(); @@ -11413,10 +11471,12 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati return; } + var mult = this.canvas._currentMultiplier || 1; + ctx.shadowColor = this.shadow.color; - ctx.shadowBlur = this.shadow.blur; - ctx.shadowOffsetX = this.shadow.offsetX; - ctx.shadowOffsetY = this.shadow.offsetY; + ctx.shadowBlur = this.shadow.blur * mult * (this.scaleX + this.scaleY) / 2; + ctx.shadowOffsetX = this.shadow.offsetX * mult * this.scaleX; + ctx.shadowOffsetY = this.shadow.offsetY * mult * this.scaleY; }, /** @@ -12455,10 +12515,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati h = strokeWidth; } if (strokeW) { - w += strokeWidth; + w += w > 0 ? strokeWidth : -strokeWidth; } if (strokeH) { - h += strokeWidth; + h += h > 0 ? strokeWidth : -strokeWidth; } this.currentWidth = w * this.scaleX; this.currentHeight = h * this.scaleY; @@ -16412,6 +16472,14 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.originalState = { }; this.callSuper('initialize'); + if (options.originX) { + this.originX = options.originX; + } + + if (options.originY) { + this.originY = options.originY; + } + this._calcBounds(); this._updateObjectsCoords(); @@ -16435,13 +16503,14 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ _updateObjectCoords: function(object) { var objectLeft = object.getLeft(), - objectTop = object.getTop(); + objectTop = object.getTop(), + center = this.getCenterPoint(); object.set({ originalLeft: objectLeft, originalTop: objectTop, - left: objectLeft - this.left, - top: objectTop - this.top + left: objectLeft - center.x, + top: objectTop - center.y }); object.setCoords(); @@ -16700,14 +16769,13 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @private */ _setObjectPosition: function(object) { - var groupLeft = this.getLeft(), - groupTop = this.getTop(), + var center = this.getCenterPoint(), rotated = this._getRotatedLeftTop(object); object.set({ angle: object.getAngle() + this.getAngle(), - left: groupLeft + rotated.left, - top: groupTop + rotated.top, + left: center.x + rotated.left, + top: center.y + rotated.top, scaleX: object.get('scaleX') * this.get('scaleX'), scaleY: object.get('scaleY') * this.get('scaleY') }); @@ -16803,8 +16871,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot }; if (!onlyWidthHeight) { - obj.left = (minXY.x + maxXY.x) / 2 || 0; - obj.top = (minXY.y + maxXY.y) / 2 || 0; + obj.left = minXY.x || 0; + obj.top = minXY.y || 0; + if (this.originX === 'center') { + obj.left += obj.width / 2; + } + if (this.originX === 'right') { + obj.left += obj.width; + } + if (this.originY === 'center') { + obj.top += obj.height / 2; + } + if (this.originY === 'bottom') { + obj.top += obj.height; + } } return obj; }, @@ -16928,6 +17008,33 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ crossOrigin: '', + /** + * AlignX value, part of preserveAspectRatio (one of "none", "mid", "min", "max") + * @see http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute + * This parameter defines how the picture is aligned to its viewport when image element width differs from image width. + * @type String + * @default + */ + alignX: 'none', + + /** + * AlignY value, part of preserveAspectRatio (one of "none", "mid", "min", "max") + * @see http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute + * This parameter defines how the picture is aligned to its viewport when image element height differs from image height. + * @type String + * @default + */ + alignY: 'none', + + /** + * meetOrSlice value, part of preserveAspectRatio (one of "meet", "slice"). + * if meet the image is always fully visibile, if slice the viewport is always filled with image. + * @see http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute + * @type String + * @default + */ + meetOrSlice: 'meet', + /** * Constructor * @param {HTMLImageElement | String} element Image element @@ -16964,17 +17071,21 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area. * @param {HTMLImageElement} element * @param {Function} [callback] Callback is invoked when all filters have been applied and new image is generated + * @param {Object} [options] Options object * @return {fabric.Image} thisArg * @chainable */ - setElement: function(element, callback) { + setElement: function(element, callback, options) { this._element = element; this._originalElement = element; - this._initConfig(); + this._initConfig(options); if (this.filters.length !== 0) { this.applyFilters(callback); } + else if (callback) { + callback(); + } return this; }, @@ -17049,7 +17160,10 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot filters: this.filters.map(function(filterObj) { return filterObj && filterObj.toObject(); }), - crossOrigin: this.crossOrigin + crossOrigin: this.crossOrigin, + alignX: this.alignX, + alignY: this.alignY, + meetOrSlice: this.meetOrSlice }); }, @@ -17060,11 +17174,15 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {String} svg representation of an instance */ toSVG: function(reviver) { - var markup = [], x = -this.width / 2, y = -this.height / 2; + var markup = [], x = -this.width / 2, y = -this.height / 2, + preserveAspectRatio = 'none'; if (this.group && this.group.type === 'path-group') { x = this.left; y = this.top; } + if (this.alignX !== 'none' && this.alignY !== 'none') { + preserveAspectRatio = 'x' + this.alignX + 'Y' + this.alignY + ' ' + this.meetOrSlice; + } markup.push( '\n', '\n' ); @@ -17108,6 +17226,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot } }, + /** + * Sets source of an image + * @param {String} src Source string (URL) + * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied) + * @param {Object} [options] Options object + * @return {fabric.Image} thisArg + * @chainable + */ + setSrc: function(src, callback, options) { + fabric.util.loadImage(src, function(img) { + return this.setElement(img, callback, options); + }, this, options && options.crossOrigin); + }, + /** * Returns string representation of an instance * @return {String} String representation of an instance @@ -17133,7 +17265,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @chainable */ applyFilters: function(callback) { - if (!this._originalElement) { return; } @@ -17187,17 +17318,61 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {CanvasRenderingContext2D} ctx Context to render on */ _render: function(ctx, noTransform) { + var x, y, imageMargins = this._findMargins(); + + x = (noTransform ? this.left : -this.width / 2); + y = (noTransform ? this.top : -this.height / 2); + + if (this.meetOrSlice === 'slice') { + ctx.beginPath(); + ctx.rect(x, y, this.width, this.height); + ctx.clip(); + } + this._element && - ctx.drawImage( - this._element, - noTransform ? this.left : -this.width/2, - noTransform ? this.top : -this.height/2, - this.width, - this.height - ); + ctx.drawImage(this._element, + x + imageMargins.marginX, + y + imageMargins.marginY, + imageMargins.width, + imageMargins.height + ); this._renderStroke(ctx); }, + /** + * @private + */ + _findMargins: function() { + var width = this.width, height = this.height, scales, + scale, marginX = 0, marginY = 0; + + if (this.alignX !== 'none' || this.alignY !== 'none') { + scales = [this.width / this._element.width, this.height / this._element.height]; + scale = this.meetOrSlice === 'meet' + ? Math.min.apply(null, scales) : Math.max.apply(null, scales); + width = this._element.width * scale; + height = this._element.height * scale; + if (this.alignX === 'Mid') { + marginX = (this.width - width) / 2; + } + if (this.alignX === 'Max') { + marginX = this.width - width; + } + if (this.alignY === 'Mid') { + marginY = (this.height - height) / 2; + } + if (this.alignY === 'Max') { + marginY = this.height - height; + } + } + return { + width: width, + height: height, + marginX: marginX, + marginY: marginY + }; + }, + /** * @private */ @@ -17324,7 +17499,8 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @static * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement} */ - fabric.Image.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y width height xlink:href'.split(' ')); + fabric.Image.ATTRIBUTE_NAMES = + fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio xlink:href'.split(' ')); /** * Returns {@link fabric.Image} instance from an SVG element @@ -17335,8 +17511,29 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {fabric.Image} Instance of fabric.Image */ fabric.Image.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES); + var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES), + align = 'xMidYMid', meetOrSlice = 'meet', alignX, alignY, aspectRatioAttrs; + if (parsedAttributes.preserveAspectRatio) { + aspectRatioAttrs = parsedAttributes.preserveAspectRatio.split(' '); + } + + if (aspectRatioAttrs && aspectRatioAttrs.length) { + meetOrSlice = aspectRatioAttrs.pop(); + if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') { + align = meetOrSlice; + meetOrSlice = 'meet'; + } + else if (aspectRatioAttrs.length) { + align = aspectRatioAttrs.pop(); + } + } + //divide align in alignX and alignY + alignX = align !== 'none' ? align.slice(1, 4) : 'none'; + alignY = align !== 'none' ? align.slice(5, 8) : 'none'; + parsedAttributes.alignX = alignX; + parsedAttributes.alignY = alignY; + parsedAttributes.meetOrSlice = meetOrSlice; fabric.Image.fromURL(parsedAttributes['xlink:href'], callback, extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); }; @@ -19233,6 +19430,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag */ _renderText: function(ctx, textLines) { ctx.save(); + this._setOpacity(ctx); this._setShadow(ctx); this._setupCompositeOperation(ctx); this._renderTextFill(ctx, textLines); diff --git a/dist/fabric.min.js b/dist/fabric.min.js index 1ae4b9cb..421ec922 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.12"};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.nodeType===1&&fabric.util.getElementStyle(e,"position")==="fixed"&&(n=e),e.nodeType===1&&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.cssRules={},t.gradientDefs={},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,n){e[2]=Math.tan(t.util.degreesToRadians(n[0]))}function i(e,n){e[1]=Math.tan(t.util.degreesToRadians(n[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,l=t.Object.__uid++;w(n);var c=n.getAttribute("viewBox"),h=o(n.getAttribute("width")||"100%"),p=o(n.getAttribute("height")||"100%"),d,v;if(c&&(c=c.match(r))){var m=parseFloat(c[1]),g=parseFloat(c[2]),y=1,b=1;d=parseFloat(c[3]),v=parseFloat(c[4]),h&&h!==d&&(y=h/d),p&&p!==v&&(b=p/v),E(n,[y,0,0,b,y*-m,b*-g])}var S=t.util.toArray(n.getElementsByTagName("*"));if(S.length===0&&t.isLikelyNode){S=n.selectNodes('//*[name(.)!="svg"]');var x=[];for(var T=0,N=S.length;T/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,this.svgUid=n&&n.svgUid||0},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,preserveObjectStacking:!1,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(){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=s.width||0,u=s.height||0,a;if(!o||!u)"top"in s&&"bottom"in s&&(u=Math.abs(s.top-s.bottom)),"right"in s&&"left"in s&&(o=Math.abs(s.right-s.left));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))),o===0||u===0?a={width:1,height:1}:a={width:r.width/o,height:r.height/u},{x:i.x*a.width,y:i.y*a.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:"nonzero",globalCompositeOperation:"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 globalCompositeOperation 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,fillRule:this.fillRule,globalCompositeOperation:this.globalCompositeOperation};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._setupCompositeOperation(e),n||this.transform(e),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._restoreCompositeOperation(e),e.restore()},_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==="evenodd"?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}},_setupCompositeOperation:function(e){this.globalCompositeOperation&&(this._prevGlobalCompositeOperation=e.globalCompositeOperation,e.globalCompositeOperation=this.globalCompositeOperation)},_restoreCompositeOperation:function(e){this.globalCompositeOperation&&this._prevGlobalCompositeOperation&&(e.globalCompositeOperation=this._prevGlobalCompositeOperation)}}),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,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&&this.group.type==="path-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;r\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)},_set:function(e,t){this.callSuper("_set",e,t);switch(e){case"rx":this.rx=t,this.set("width",t*2);break;case"ry":this.ry=t,this.set("height",t*2)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},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&&this.group.type==="path-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;if(!this.group||this.group.type!=="path-group")n=-this.width/2,r=-this.height/2;return 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.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._setupCompositeOperation(e),this._renderTextFill(e,t),this._renderTextStroke(e,t),this._restoreCompositeOperation(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(),t||this.transform(e);var n=this.group&&this.group.type==="path-group";n&&e.translate(-this.group.width/2,-this.group.height/2),this.transformMatrix&&e.transform.apply(e,this.transformMatrix),n&&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 +/* 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.12"};typeof exports!="undefined"&&(exports.fabric=fabric),typeof document!="undefined"&&typeof window!="undefined"?(fabric.document=document,fabric.window=window):(fabric.document=require("jsdom").jsdom(""),fabric.document.createWindow&&(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,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",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,t){var n=/\D{0,2}$/.exec(e),r=parseFloat(e);t||(t=fabric.Text.DEFAULT_SVG_FONT_SIZE);switch(n[0]){case"mm":return r*fabric.DPI/25.4;case"cm":return r*fabric.DPI/2.54;case"in":return r*fabric.DPI;case"pt":return r*fabric.DPI/72;case"pc":return r*fabric.DPI/72*12;case"em":return r*t;default:return r}},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.nodeType===1&&fabric.util.getElementStyle(e,"position")==="fixed"&&(n=e),e.nodeType===1&&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 eu?u:o;if(o===1&&u===1&&a===0&&f===0)return;h="matrix("+o+" 0"+" 0 "+u+" "+a*o+" "+f*u+")";if(e.tagName==="svg"){p=e.ownerDocument.createElement("g");while(e.firstChild!=null)p.appendChild(e.firstChild);e.appendChild(p)}else p=e,h+=p.getAttribute("transform");p.setAttribute("transform",h)}function S(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 x(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.cssRules={},t.gradientDefs={},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,n){e[2]=Math.tan(t.util.degreesToRadians(n[0]))}function i(e,n){e[1]=Math.tan(t.util.degreesToRadians(n[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=t.reNum,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 r(e,t){while(e&&(e=e.parentNode))if(t.test(e.nodeName)&&!e.getAttribute("instantiated_by_use"))return!0;return!1}var e=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/,n=/^(symbol|image|marker|pattern|view)$/;return function(s,u,a){if(!s)return;b(s);var f=new Date,l=t.Object.__uid++,c=o(s.getAttribute("width")||"100%"),h=o(s.getAttribute("height")||"100%");w(s,c,h);var p=t.util.toArray(s.getElementsByTagName("*"));if(p.length===0&&t.isLikelyNode){p=s.selectNodes('//*[name(.)!="svg"]');var d=[];for(var v=0,m=p.length;v/i,"")));if(!s||!s.documentElement)return;t.parseSVGDocument(s.documentElement,function(r,i){E.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),E.has(e,function(r){r?E.get(e,function(e){var t=S(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 x(t,e,"backgroundColor"),x(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,this.svgUid=n&&n.svgUid||0},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\n'+'\n'+"\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",n=40,r=40;return e&&(e.fill===this.color||e.stroke===this.color)&&(t="SourceGraphic"),e.width&&e.height&&(n=Math.abs(this.offsetX/e.getWidth())*100+20,r=Math.abs(this.offsetY/e.getHeight())*100+20),'\n"+' \n'+' \n'+" \n"+" \n"+' \n'+" \n"+"\n"},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,preserveObjectStacking:!1,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,r&&r.crossOrigin):(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(){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%360},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=s.width||0,u=s.height||0,a;if(!o||!u)"top"in s&&"bottom"in s&&(u=Math.abs(s.top-s.bottom)),"right"in s&&"left"in s&&(o=Math.abs(s.right-s.left));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))),o===0||u===0?a={width:1,height:1}:a={width:r.width/o,height:r.height/u},{x:i.x*a.width,y:i.y*a.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(),{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:"nonzero",globalCompositeOperation:"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 globalCompositeOperation 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,fillRule:this.fillRule,globalCompositeOperation:this.globalCompositeOperation};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._setupCompositeOperation(e),n||this.transform(e),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._restoreCompositeOperation(e),e.restore()},_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;var t=this.canvas._currentMultiplier||1;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur*t*(this.scaleX+this.scaleY)/2,e.shadowOffsetX=this.shadow.offsetX*t*this.scaleX,e.shadowOffsetY=this.shadow.offsetY*t*this.scaleY},_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==="evenodd"?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}},_setupCompositeOperation:function(e){this.globalCompositeOperation&&(this._prevGlobalCompositeOperation=e.globalCompositeOperation,e.globalCompositeOperation=this.globalCompositeOperation)},_restoreCompositeOperation:function(e){this.globalCompositeOperation&&this._prevGlobalCompositeOperation&&(e.globalCompositeOperation=this._prevGlobalCompositeOperation)}}),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+=s>0?t:-t),c&&(o+=o>0?t:-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,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&&this.group.type==="path-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;r\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)},_set:function(e,t){this.callSuper("_set",e,t);switch(e){case"rx":this.rx=t,this.set("width",t*2);break;case"ry":this.ry=t,this.set("height",t*2)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},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&&this.group.type==="path-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;if(!this.group||this.group.type!=="path-group")n=-this.width/2,r=-this.height/2;return 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"),t.originX&&(this.originX=t.originX),t.originY&&(this.originY=t.originY),this._calcBounds(),this._updateObjectsCoords(),t&&n(this,t),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(){this.forEachObject(this._updateObjectCoords,this)},_updateObjectCoords:function(e){var t=e.getLeft(),n=e.getTop(),r=this.getCenterPoint();e.set({originalLeft:t,originalTop:n,left:t-r.x,top:n-r.y}),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 s=this.fill;this.fill=null,t.push("\n'),this.fill=s}return t.push("\n"),e?e(t.join("")):t.join("")},getSrc:function(){if(this.getElement())return this.getElement().src||this.getElement()._src},setSrc:function(e,t,n){fabric.util.loadImage(e,function(e){return this.setElement(e,t,n)},this,n&&n.crossOrigin)},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){var n,r,i=this._findMargins();n=t?this.left:-this.width/2,r=t?this.top:-this.height/2,this.meetOrSlice==="slice"&&(e.beginPath(),e.rect(n,r,this.width,this.height),e.clip()),this._element&&e.drawImage(this._element,n+i.marginX,r+i.marginY,i.width,i.height),this._renderStroke(e)},_findMargins:function(){var e=this.width,t=this.height,n,r,i=0,s=0;if(this.alignX!=="none"||this.alignY!=="none")n=[this.width/this._element.width,this.height/this._element.height],r=this.meetOrSlice==="meet"?Math.min.apply(null,n):Math.max.apply(null,n),e=this._element.width*r,t=this._element.height*r,this.alignX==="Mid"&&(i=(this.width-e)/2),this.alignX==="Max"&&(i=this.width-e),this.alignY==="Mid"&&(s=(this.height-t)/2),this.alignY==="Max"&&(s=this.height-t);return{width:e,height:t,marginX:i,marginY:s}},_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 preserveAspectRatio xlink:href".split(" ")),fabric.Image.fromElement=function(e,n,r){var i=fabric.parseAttributes(e,fabric.Image.ATTRIBUTE_NAMES),s="xMidYMid",o="meet",u,a,f;i.preserveAspectRatio&&(f=i.preserveAspectRatio.split(" ")),f&&f.length&&(o=f.pop(),o!=="meet"&&o!=="slice"?(s=o,o="meet"):f.length&&(s=f.pop())),u=s!=="none"?s.slice(1,4):"none",a=s!=="none"?s.slice(5,8):"none",i.alignX=u,i.alignY=a,i.meetOrSlice=o,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._setOpacity(e),this._setShadow(e),this._setupCompositeOperation(e),this._renderTextFill(e,t),this._renderTextStroke(e,t),this._restoreCompositeOperation(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(),t||this.transform(e);var n=this.group&&this.group.type==="path-group";n&&e.translate(-this.group.width/2,-this.group.height/2),this.transformMatrix&&e.transform.apply(e,this.transformMatrix),n&&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 1638e6141d3425e9ed686cbcd9d93acf6722fd8a..86583c4d7ff8f0819cda9ec1c01ea76a20219b30 100644 GIT binary patch delta 58926 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 delta 58089 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 diff --git a/dist/fabric.require.js b/dist/fabric.require.js index 3250df28..007513ca 100644 --- a/dist/fabric.require.js +++ b/dist/fabric.require.js @@ -15,7 +15,9 @@ else { fabric.document = require("jsdom") .jsdom(""); - fabric.window = fabric.document.createWindow(); + if (fabric.document.createWindow) { + fabric.window = fabric.document.createWindow(); + } } /** @@ -31,7 +33,6 @@ fabric.isTouchSupported = "ontouchstart" in fabric.document.documentElement; fabric.isLikelyNode = typeof Buffer !== 'undefined' && typeof window === 'undefined'; - /** * Attributes parsed from all SVG elements * @type array @@ -50,6 +51,7 @@ fabric.SHARED_ATTRIBUTES = [ * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion. */ fabric.DPI = 96; +fabric.reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)'; (function() { @@ -466,10 +468,12 @@ fabric.Collection = { * @param {Number|String} value number to operate on * @return {Number|String} */ - parseUnit: function(value) { + parseUnit: function(value, fontSize) { var unit = /\D{0,2}$/.exec(value), number = parseFloat(value); - + if (!fontSize) { + fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; + } switch (unit[0]) { case 'mm': return number * fabric.DPI / 25.4; @@ -486,6 +490,9 @@ fabric.Collection = { case 'pc': return number * fabric.DPI / 72 * 12; // or * 16 + case 'em': + return number * fontSize; + default: return number; } @@ -2871,7 +2878,7 @@ if (typeof console !== 'undefined') { return attr; } - function normalizeValue(attr, value, parentAttributes) { + function normalizeValue(attr, value, parentAttributes, fontSize) { var isArray = Object.prototype.toString.call(value) === '[object Array]', parsed; @@ -2903,7 +2910,7 @@ if (typeof console !== 'undefined') { value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center'; } else { - parsed = isArray ? value.map(parseUnit) : parseUnit(value); + parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize); } return (!isArray && isNaN(parsed) ? value : parsed); @@ -2982,7 +2989,7 @@ if (typeof console !== 'undefined') { ], // == begin transform regexp - number = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)', + number = fabric.reNum, commaWsp = '(?:\\s+,?\\s*|,\\s*)', @@ -3085,40 +3092,6 @@ if (typeof console !== 'undefined') { }; })(); - function parseFontDeclaration(value, oStyle) { - - // TODO: support non-px font size - var match = value.match(/(normal|italic)?\s*(normal|small-caps)?\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\s*(\d+)px(?:\/(normal|[\d\.]+))?\s+(.*)/); - - if (!match) { - return; - } - - var fontStyle = match[1], - // font variant is not used - // fontVariant = match[2], - fontWeight = match[3], - fontSize = match[4], - lineHeight = match[5], - fontFamily = match[6]; - - if (fontStyle) { - oStyle.fontStyle = fontStyle; - } - if (fontWeight) { - oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight); - } - if (fontSize) { - oStyle.fontSize = parseFloat(fontSize); - } - if (fontFamily) { - oStyle.fontFamily = fontFamily; - } - if (lineHeight) { - oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight; - } - } - /** * @private */ @@ -3130,12 +3103,7 @@ if (typeof console !== 'undefined') { attr = normalizeAttr(pair[0].trim().toLowerCase()); value = normalizeValue(attr, pair[1].trim()); - if (attr === 'font') { - parseFontDeclaration(value, oStyle); - } - else { - oStyle[attr] = value; - } + oStyle[attr] = value; }); } @@ -3152,12 +3120,7 @@ if (typeof console !== 'undefined') { attr = normalizeAttr(prop.toLowerCase()); value = normalizeValue(attr, style[prop]); - if (attr === 'font') { - parseFontDeclaration(value, oStyle); - } - else { - oStyle[attr] = value; - } + oStyle[attr] = value; } } @@ -3236,7 +3199,7 @@ if (typeof console !== 'undefined') { x = el.getAttribute('x') || 0, y = el.getAttribute('y') || 0, el2 = doc.getElementById(xlink).cloneNode(true), - currentTrans = (el.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')', + currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')', parentNode; for (var j = 0, attrs = el.attributes, l = attrs.length; j < l; j++) { @@ -3246,7 +3209,7 @@ if (typeof console !== 'undefined') { } if (attr.nodeName === 'transform') { - currentTrans = currentTrans + ' ' + attr.nodeValue; + currentTrans = attr.nodeValue + ' ' + currentTrans; } else { el2.setAttribute(attr.nodeName, attr.nodeValue); @@ -3254,6 +3217,7 @@ if (typeof console !== 'undefined') { } el2.setAttribute('transform', currentTrans); + el2.setAttribute('instantiated_by_use', '1'); el2.removeAttribute('id'); parentNode = el.parentNode; parentNode.replaceChild(el2, el); @@ -3261,28 +3225,67 @@ if (typeof console !== 'undefined') { } /** - * Add a element that envelop all SCG elements and makes the viewbox transformMatrix descend on all elements + * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements */ - function addSvgTransform(doc, matrix) { - matrix[3] = matrix[0] = (matrix[0] > matrix[3] ? matrix[3] : matrix[0]); - if (!(matrix[0] !== 1 || matrix[3] !== 1 || matrix[4] !== 0 || matrix[5] !== 0)) { + function addVBTransform(element, widthAttr, heightAttr) { + + // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute + // matches, e.g.: +14.56e-12, etc. + var reViewBoxAttrValue = new RegExp( + '^' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*' + + '$' + ), + viewBoxAttr = element.getAttribute('viewBox'), + scaleX = 1, scaleY = 1, minX = 0, minY = 0, + viewBoxWidth, viewBoxHeight, matrix, el; + + if (viewBoxAttr && (viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))) { + minX = -parseFloat(viewBoxAttr[1]), + minY = -parseFloat(viewBoxAttr[2]), + viewBoxWidth = parseFloat(viewBoxAttr[3]), + viewBoxHeight = parseFloat(viewBoxAttr[4]); + } + else { return; } + if (widthAttr && widthAttr !== viewBoxWidth) { + scaleX = widthAttr / viewBoxWidth; + } + if (heightAttr && heightAttr !== viewBoxHeight) { + scaleY = heightAttr / viewBoxHeight; + } + // default is to preserve aspect ratio // preserveAspectRatio attribute to be implemented - var el = doc.ownerDocument.createElement('g'); - while (doc.firstChild != null) { - el.appendChild(doc.firstChild); - } - el.setAttribute('transform', - 'matrix(' + matrix[0] + ' ' + - matrix[1] + ' ' + - matrix[2] + ' ' + - matrix[3] + ' ' + - matrix[4] + ' ' + - matrix[5] + ')'); + scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX); - doc.appendChild(el); + if (!(scaleX !== 1 || scaleY !== 1 || minX !== 0 || minY !== 0)) { + return; + } + matrix = 'matrix(' + scaleX + + ' 0' + + ' 0 ' + + scaleY + ' ' + + (minX * scaleX) + ' ' + + (minY * scaleY) + ')'; + + if (element.tagName === 'svg') { + el = element.ownerDocument.createElement('g'); + while (element.firstChild != null) { + el.appendChild(element.firstChild); + } + element.appendChild(el); + } + else { + el = element; + matrix += el.getAttribute('transform'); + } + + el.setAttribute('transform', matrix); } /** @@ -3297,25 +3300,11 @@ if (typeof console !== 'undefined') { fabric.parseSVGDocument = (function() { var reAllowedSVGTagNames = /^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/, - - // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute - // \d doesn't quite cut it (as we need to match an actual float number) - - // matches, e.g.: +14.56e-12, etc. - reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)', - - reViewBoxAttrValue = new RegExp( - '^' + - '\\s*(' + reNum + '+)\\s*,?' + - '\\s*(' + reNum + '+)\\s*,?' + - '\\s*(' + reNum + '+)\\s*,?' + - '\\s*(' + reNum + '+)\\s*' + - '$' - ); + reViewBoxTagNames = /^(symbol|image|marker|pattern|view)$/; function hasAncestorWithNodeName(element, nodeName) { while (element && (element = element.parentNode)) { - if (nodeName.test(element.nodeName)) { + if (nodeName.test(element.nodeName) && !element.getAttribute('instantiated_by_use')) { return true; } } @@ -3326,34 +3315,19 @@ if (typeof console !== 'undefined') { if (!doc) { return; } - var startTime = new Date(), - svgUid = fabric.Object.__uid++; parseUseDirectives(doc); + + var startTime = new Date(), + svgUid = fabric.Object.__uid++, /* http://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute * as per spec, width and height attributes are to be considered * 100% if no value is specified. */ - var viewBoxAttr = doc.getAttribute('viewBox'), widthAttr = parseUnit(doc.getAttribute('width') || '100%'), - heightAttr = parseUnit(doc.getAttribute('height') || '100%'), - viewBoxWidth, - viewBoxHeight; + heightAttr = parseUnit(doc.getAttribute('height') || '100%'); - if (viewBoxAttr && (viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))) { - var minX = parseFloat(viewBoxAttr[1]), - minY = parseFloat(viewBoxAttr[2]), - scaleX = 1, scaleY = 1; - viewBoxWidth = parseFloat(viewBoxAttr[3]); - viewBoxHeight = parseFloat(viewBoxAttr[4]); - if (widthAttr && widthAttr !== viewBoxWidth ) { - scaleX = widthAttr / viewBoxWidth; - } - if (heightAttr && heightAttr !== viewBoxHeight) { - scaleY = heightAttr / viewBoxHeight; - } - addSvgTransform(doc, [scaleX, 0, 0, scaleY, scaleX * -minX, scaleY * -minY]); - } + addVBTransform(doc, widthAttr, heightAttr); var descendants = fabric.util.toArray(doc.getElementsByTagName('*')); @@ -3369,8 +3343,9 @@ if (typeof console !== 'undefined') { } var elements = descendants.filter(function(el) { + reViewBoxTagNames.test(el.tagName) && addVBTransform(el, 0, 0); return reAllowedSVGTagNames.test(el.tagName) && - !hasAncestorWithNodeName(el, /^(?:pattern|defs)$/); // http://www.w3.org/TR/SVG/struct.html#DefsElement + !hasAncestorWithNodeName(el, /^(?:pattern|defs|symbol)$/); // http://www.w3.org/TR/SVG/struct.html#DefsElement }); if (!elements || (elements && !elements.length)) { @@ -3379,8 +3354,8 @@ if (typeof console !== 'undefined') { } var options = { - width: widthAttr ? widthAttr : viewBoxWidth, - height: heightAttr ? heightAttr : viewBoxHeight, + width: widthAttr, + height: heightAttr, widthAttr: widthAttr, heightAttr: heightAttr, svgUid: svgUid @@ -3389,7 +3364,6 @@ if (typeof console !== 'undefined') { fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); fabric.cssRules[svgUid] = fabric.getCSSRules(doc); // Precedence of rules: style > class > attribute - fabric.parseElements(elements, function(instances) { fabric.documentParsingTime = new Date() - startTime; if (callback) { @@ -3457,6 +3431,48 @@ if (typeof console !== 'undefined') { } extend(fabric, { + /** + * Parses a short font declaration, building adding its properties to a style object + * @static + * @function + * @memberOf fabric + * @param {String} value font declaration + * @param {Object} oStyle definition + */ + parseFontDeclaration: function(value, oStyle) { + var fontDeclaration = '(normal|italic)?\\s*(normal|small-caps)?\\s*' + + '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*(' + + fabric.reNum + + '(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|' + fabric.reNum + '))?\\s+(.*)', + match = value.match(fontDeclaration); + + if (!match) { + return; + } + var fontStyle = match[1], + // font variant is not used + // fontVariant = match[2], + fontWeight = match[3], + fontSize = match[4], + lineHeight = match[5], + fontFamily = match[6]; + + if (fontStyle) { + oStyle.fontStyle = fontStyle; + } + if (fontWeight) { + oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight); + } + if (fontSize) { + oStyle.fontSize = parseUnit(fontSize); + } + if (fontFamily) { + oStyle.fontFamily = fontFamily; + } + if (lineHeight) { + oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight; + } + }, /** * Parses an SVG document, returning all of the gradient declarations found in it @@ -3518,7 +3534,8 @@ if (typeof console !== 'undefined') { } var value, - parentAttributes = { }; + parentAttributes = { }, + fontSize; if (typeof svgUid === 'undefined') { svgUid = element.getAttribute('svgUid'); @@ -3527,12 +3544,14 @@ if (typeof console !== 'undefined') { if (element.parentNode && /^symbol|[g|a]$/i.test(element.parentNode.nodeName)) { parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid); } + fontSize = (parentAttributes && parentAttributes.fontSize ) || + element.getAttribute('font-size') || fabric.Text.DEFAULT_SVG_FONT_SIZE; var ownAttributes = attributes.reduce(function(memo, attr) { value = element.getAttribute(attr); if (value) { attr = normalizeAttr(attr); - value = normalizeValue(attr, value, parentAttributes); + value = normalizeValue(attr, value, parentAttributes, fontSize); memo[attr] = value; } @@ -3543,7 +3562,9 @@ if (typeof console !== 'undefined') { // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) ownAttributes = extend(ownAttributes, extend(getGlobalStylesForElement(element, svgUid), fabric.parseStyleAttribute(element))); - + if (ownAttributes.font) { + fabric.parseFontDeclaration(ownAttributes.font, ownAttributes); + } return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); }, @@ -3660,7 +3681,11 @@ if (typeof console !== 'undefined') { } rule = match[1]; rule.split(',').forEach(function(_rule) { - allRules[_rule.trim()] = fabric.util.object.clone(ruleObj); + _rule = _rule.replace(/^svg/i, '').trim(); + if (_rule === '') { + return; + } + allRules[_rule] = fabric.util.object.clone(ruleObj); }); }); } @@ -5356,8 +5381,15 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ var patternSource = typeof this.source === 'function' ? this.source() : this.source, patternWidth = patternSource.width / object.getWidth(), patternHeight = patternSource.height / object.getHeight(), + patternOffsetX = this.offsetX / object.getWidth(), + patternOffsetY = this.offsetY / object.getHeight(), patternImgSrc = ''; - + if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') { + patternHeight = 1; + } + if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') { + patternWidth = 1; + } if (patternSource.src) { patternImgSrc = patternSource.src; } @@ -5366,16 +5398,16 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ } return '' + + '" height="' + patternHeight + '">\n' + '' + - ''; + '">\n' + + '\n'; }, /* _TO_SVG_END_ */ @@ -5520,23 +5552,31 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @return {String} SVG representation of a shadow */ toSVG: function(object) { - var mode = 'SourceAlpha'; + var mode = 'SourceAlpha', fBoxX = 40, fBoxY = 40; if (object && (object.fill === this.color || object.stroke === this.color)) { mode = 'SourceGraphic'; } + if (object.width && object.height) { + //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion + // we add some extra space to filter box to contain the blur ( 20 ) + fBoxX = Math.abs(this.offsetX / object.getWidth()) * 100 + 20; + fBoxY = Math.abs(this.offsetY / object.getHeight()) * 100 + 20; + } + return ( - '' + - '\n' + + '\t' + - '' + - '' + - '' + - '' + - '' + - ''); + '">\n' + + '\t\n' + + '\t\n' + + '\t\t\n' + + '\t\t\n' + + '\t\n' + + '\n'); }, /* _TO_SVG_END_ */ @@ -5811,6 +5851,16 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * originX: 'left', * originY: 'top' * }); + * @example overlayImage loaded from cross-origin + * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top', + * crossOrigin: 'anonymous' + * }); */ setOverlayImage: function (image, callback, options) { return this.__setBgOverlayImage('overlayImage', image, callback, options); @@ -5852,6 +5902,16 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * originX: 'left', * originY: 'top' * }); + * @example backgroundImage loaded from cross-origin + * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top', + * crossOrigin: 'anonymous' + * }); */ setBackgroundImage: function (image, callback, options) { return this.__setBgOverlayImage('backgroundImage', image, callback, options); @@ -5934,7 +5994,7 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ fabric.util.loadImage(image, function(img) { this[property] = new fabric.Image(img, options); callback && callback(); - }, this); + }, this, options && options.crossOrigin); } else { this[property] = image; @@ -8332,10 +8392,11 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @private */ _setObjectScale: function(localMouse, transform, lockScalingX, lockScalingY, by, lockScalingFlip) { - var target = transform.target, forbidScalingX = false, forbidScalingY = false; + var target = transform.target, forbidScalingX = false, forbidScalingY = false, + strokeWidth = target.stroke ? target.strokeWidth : 0; - transform.newScaleX = localMouse.x / (target.width + target.strokeWidth); - transform.newScaleY = localMouse.y / (target.height + target.strokeWidth); + transform.newScaleX = localMouse.x / (target.width + strokeWidth / 2); + transform.newScaleY = localMouse.y / (target.height + strokeWidth / 2); if (lockScalingFlip && transform.newScaleX <= 0 && transform.newScaleX < target.scaleX) { forbidScalingX = true; @@ -8369,8 +8430,9 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab _scaleObjectEqually: function(localMouse, target, transform) { var dist = localMouse.y + localMouse.x, - lastDist = (target.height + (target.strokeWidth)) * transform.original.scaleY + - (target.width + (target.strokeWidth)) * transform.original.scaleX; + strokeWidth = target.stroke ? target.strokeWidth : 0, + lastDist = (target.height + (strokeWidth / 2)) * transform.original.scaleY + + (target.width + (strokeWidth / 2)) * transform.original.scaleX; // We use transform.scaleX/Y instead of target.scaleX/Y // because the object may have a min scale and we'll loose the proportions @@ -8481,7 +8543,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab angle = 360 + angle; } - t.target.angle = angle; + t.target.angle = angle % 360; }, /** @@ -9811,8 +9873,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab : [ target, this._activeObject ]; return new fabric.Group(groupObjects, { - originX: 'center', - originY: 'center', canvas: this }); }, @@ -9831,8 +9891,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab } else if (group.length > 1) { group = new fabric.Group(group.reverse(), { - originX: 'center', - originY: 'center', canvas: this }); group.addWithUpdate(); @@ -11413,10 +11471,12 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati return; } + var mult = this.canvas._currentMultiplier || 1; + ctx.shadowColor = this.shadow.color; - ctx.shadowBlur = this.shadow.blur; - ctx.shadowOffsetX = this.shadow.offsetX; - ctx.shadowOffsetY = this.shadow.offsetY; + ctx.shadowBlur = this.shadow.blur * mult * (this.scaleX + this.scaleY) / 2; + ctx.shadowOffsetX = this.shadow.offsetX * mult * this.scaleX; + ctx.shadowOffsetY = this.shadow.offsetY * mult * this.scaleY; }, /** @@ -12455,10 +12515,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati h = strokeWidth; } if (strokeW) { - w += strokeWidth; + w += w > 0 ? strokeWidth : -strokeWidth; } if (strokeH) { - h += strokeWidth; + h += h > 0 ? strokeWidth : -strokeWidth; } this.currentWidth = w * this.scaleX; this.currentHeight = h * this.scaleY; @@ -16412,6 +16472,14 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.originalState = { }; this.callSuper('initialize'); + if (options.originX) { + this.originX = options.originX; + } + + if (options.originY) { + this.originY = options.originY; + } + this._calcBounds(); this._updateObjectsCoords(); @@ -16435,13 +16503,14 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ _updateObjectCoords: function(object) { var objectLeft = object.getLeft(), - objectTop = object.getTop(); + objectTop = object.getTop(), + center = this.getCenterPoint(); object.set({ originalLeft: objectLeft, originalTop: objectTop, - left: objectLeft - this.left, - top: objectTop - this.top + left: objectLeft - center.x, + top: objectTop - center.y }); object.setCoords(); @@ -16700,14 +16769,13 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @private */ _setObjectPosition: function(object) { - var groupLeft = this.getLeft(), - groupTop = this.getTop(), + var center = this.getCenterPoint(), rotated = this._getRotatedLeftTop(object); object.set({ angle: object.getAngle() + this.getAngle(), - left: groupLeft + rotated.left, - top: groupTop + rotated.top, + left: center.x + rotated.left, + top: center.y + rotated.top, scaleX: object.get('scaleX') * this.get('scaleX'), scaleY: object.get('scaleY') * this.get('scaleY') }); @@ -16803,8 +16871,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot }; if (!onlyWidthHeight) { - obj.left = (minXY.x + maxXY.x) / 2 || 0; - obj.top = (minXY.y + maxXY.y) / 2 || 0; + obj.left = minXY.x || 0; + obj.top = minXY.y || 0; + if (this.originX === 'center') { + obj.left += obj.width / 2; + } + if (this.originX === 'right') { + obj.left += obj.width; + } + if (this.originY === 'center') { + obj.top += obj.height / 2; + } + if (this.originY === 'bottom') { + obj.top += obj.height; + } } return obj; }, @@ -16928,6 +17008,33 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ crossOrigin: '', + /** + * AlignX value, part of preserveAspectRatio (one of "none", "mid", "min", "max") + * @see http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute + * This parameter defines how the picture is aligned to its viewport when image element width differs from image width. + * @type String + * @default + */ + alignX: 'none', + + /** + * AlignY value, part of preserveAspectRatio (one of "none", "mid", "min", "max") + * @see http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute + * This parameter defines how the picture is aligned to its viewport when image element height differs from image height. + * @type String + * @default + */ + alignY: 'none', + + /** + * meetOrSlice value, part of preserveAspectRatio (one of "meet", "slice"). + * if meet the image is always fully visibile, if slice the viewport is always filled with image. + * @see http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute + * @type String + * @default + */ + meetOrSlice: 'meet', + /** * Constructor * @param {HTMLImageElement | String} element Image element @@ -16964,17 +17071,21 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area. * @param {HTMLImageElement} element * @param {Function} [callback] Callback is invoked when all filters have been applied and new image is generated + * @param {Object} [options] Options object * @return {fabric.Image} thisArg * @chainable */ - setElement: function(element, callback) { + setElement: function(element, callback, options) { this._element = element; this._originalElement = element; - this._initConfig(); + this._initConfig(options); if (this.filters.length !== 0) { this.applyFilters(callback); } + else if (callback) { + callback(); + } return this; }, @@ -17049,7 +17160,10 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot filters: this.filters.map(function(filterObj) { return filterObj && filterObj.toObject(); }), - crossOrigin: this.crossOrigin + crossOrigin: this.crossOrigin, + alignX: this.alignX, + alignY: this.alignY, + meetOrSlice: this.meetOrSlice }); }, @@ -17060,11 +17174,15 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {String} svg representation of an instance */ toSVG: function(reviver) { - var markup = [], x = -this.width / 2, y = -this.height / 2; + var markup = [], x = -this.width / 2, y = -this.height / 2, + preserveAspectRatio = 'none'; if (this.group && this.group.type === 'path-group') { x = this.left; y = this.top; } + if (this.alignX !== 'none' && this.alignY !== 'none') { + preserveAspectRatio = 'x' + this.alignX + 'Y' + this.alignY + ' ' + this.meetOrSlice; + } markup.push( '\n', '\n' ); @@ -17108,6 +17226,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot } }, + /** + * Sets source of an image + * @param {String} src Source string (URL) + * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied) + * @param {Object} [options] Options object + * @return {fabric.Image} thisArg + * @chainable + */ + setSrc: function(src, callback, options) { + fabric.util.loadImage(src, function(img) { + return this.setElement(img, callback, options); + }, this, options && options.crossOrigin); + }, + /** * Returns string representation of an instance * @return {String} String representation of an instance @@ -17133,7 +17265,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @chainable */ applyFilters: function(callback) { - if (!this._originalElement) { return; } @@ -17187,17 +17318,61 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {CanvasRenderingContext2D} ctx Context to render on */ _render: function(ctx, noTransform) { + var x, y, imageMargins = this._findMargins(); + + x = (noTransform ? this.left : -this.width / 2); + y = (noTransform ? this.top : -this.height / 2); + + if (this.meetOrSlice === 'slice') { + ctx.beginPath(); + ctx.rect(x, y, this.width, this.height); + ctx.clip(); + } + this._element && - ctx.drawImage( - this._element, - noTransform ? this.left : -this.width/2, - noTransform ? this.top : -this.height/2, - this.width, - this.height - ); + ctx.drawImage(this._element, + x + imageMargins.marginX, + y + imageMargins.marginY, + imageMargins.width, + imageMargins.height + ); this._renderStroke(ctx); }, + /** + * @private + */ + _findMargins: function() { + var width = this.width, height = this.height, scales, + scale, marginX = 0, marginY = 0; + + if (this.alignX !== 'none' || this.alignY !== 'none') { + scales = [this.width / this._element.width, this.height / this._element.height]; + scale = this.meetOrSlice === 'meet' + ? Math.min.apply(null, scales) : Math.max.apply(null, scales); + width = this._element.width * scale; + height = this._element.height * scale; + if (this.alignX === 'Mid') { + marginX = (this.width - width) / 2; + } + if (this.alignX === 'Max') { + marginX = this.width - width; + } + if (this.alignY === 'Mid') { + marginY = (this.height - height) / 2; + } + if (this.alignY === 'Max') { + marginY = this.height - height; + } + } + return { + width: width, + height: height, + marginX: marginX, + marginY: marginY + }; + }, + /** * @private */ @@ -17324,7 +17499,8 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @static * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement} */ - fabric.Image.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y width height xlink:href'.split(' ')); + fabric.Image.ATTRIBUTE_NAMES = + fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio xlink:href'.split(' ')); /** * Returns {@link fabric.Image} instance from an SVG element @@ -17335,8 +17511,29 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {fabric.Image} Instance of fabric.Image */ fabric.Image.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES); + var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES), + align = 'xMidYMid', meetOrSlice = 'meet', alignX, alignY, aspectRatioAttrs; + if (parsedAttributes.preserveAspectRatio) { + aspectRatioAttrs = parsedAttributes.preserveAspectRatio.split(' '); + } + + if (aspectRatioAttrs && aspectRatioAttrs.length) { + meetOrSlice = aspectRatioAttrs.pop(); + if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') { + align = meetOrSlice; + meetOrSlice = 'meet'; + } + else if (aspectRatioAttrs.length) { + align = aspectRatioAttrs.pop(); + } + } + //divide align in alignX and alignY + alignX = align !== 'none' ? align.slice(1, 4) : 'none'; + alignY = align !== 'none' ? align.slice(5, 8) : 'none'; + parsedAttributes.alignX = alignX; + parsedAttributes.alignY = alignY; + parsedAttributes.meetOrSlice = meetOrSlice; fabric.Image.fromURL(parsedAttributes['xlink:href'], callback, extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); }; @@ -19233,6 +19430,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag */ _renderText: function(ctx, textLines) { ctx.save(); + this._setOpacity(ctx); this._setShadow(ctx); this._setupCompositeOperation(ctx); this._renderTextFill(ctx, textLines);