From 01d8392ae310cd77ef509c7e9dd7839fde3e8e06 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 8 Jan 2017 11:07:41 +0100 Subject: [PATCH] Update to 1.7.3 (#3603) * build v173 --- CHANGELOG.md | 12 + HEADER.js | 2 +- ISSUE_TEMPLATE.md | 2 +- dist/fabric.js | 1378 ++++++++++++++++++++-------------------- dist/fabric.min.js | 18 +- dist/fabric.min.js.gz | Bin 69329 -> 69315 bytes dist/fabric.require.js | 856 ++++++++++++------------- package.json | 2 +- test/unit/itext.js | 35 +- 9 files changed, 1143 insertions(+), 1162 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2aca5de..5a08dae0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +**Version 1.7.3** + +- Improvement: mousewheel event is handled with target and fired also from objects. [#3612](https://github.com/kangax/fabric.js/pull/3612) +- Improvement: Pattern loads for canvas background and overlay, corrected svg pattern export [#3601](https://github.com/kangax/fabric.js/pull/3601) +- Fix: Wait for pattern loading before calling callback [#3598](https://github.com/kangax/fabric.js/pull/3598) +- Fix: add 2 extra pixels to cache canvases to avoid aliasing cut [#3596](https://github.com/kangax/fabric.js/pull/3596) +- Fix: Rerender when deselect an itext editing object [#3594](https://github.com/kangax/fabric.js/pull/3594) +- Fix: save new state of dimensionProperties at every cache clear [#3595](https://github.com/kangax/fabric.js/pull/3595) +- Improvement: Better error managment in loadFromJSON [#3586](https://github.com/kangax/fabric.js/pull/3586) +- Improvement: do not reload backgroundImage as an image if is different type [#3550](https://github.com/kangax/fabric.js/pull/3550) +- Improvement: if a children element is set dirty, set the parent dirty as well. [#3564](https://github.com/kangax/fabric.js/pull/3564) + **Version 1.7.2** - Fix: Textbox do not use stylemap for line wrapping [#3546](https://github.com/kangax/fabric.js/pull/3546) diff --git a/HEADER.js b/HEADER.js index 1308130e..68a4b281 100644 --- a/HEADER.js +++ b/HEADER.js @@ -1,6 +1,6 @@ /*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: "1.7.2" }; +var fabric = fabric || { version: "1.7.3" }; if (typeof exports !== 'undefined') { exports.fabric = fabric; } diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index dc952c84..ab31aa60 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -25,7 +25,7 @@ Remove the template from below and provide thoughtful commentary *and code sampl ## Version -1.7.2 +1.7.3 ## Test Case http://jsfiddle.net/fabricjs/Da7SP/ diff --git a/dist/fabric.js b/dist/fabric.js index 69a39fe9..785ef5e2 100644 --- a/dist/fabric.js +++ b/dist/fabric.js @@ -1,7 +1,7 @@ /* build: `node build.js modules=ALL exclude=json,gestures minifier=uglifyjs` */ /*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: "1.7.2" }; +var fabric = fabric || { version: "1.7.3" }; if (typeof exports !== 'undefined') { exports.fabric = fabric; } @@ -363,6 +363,122 @@ fabric.Collection = { }; +/** + * @namespace fabric.CommonMethods + */ +fabric.CommonMethods = { + + /** + * Sets object's properties from options + * @param {Object} [options] Options object + */ + _setOptions: function(options) { + for (var prop in options) { + this.set(prop, options[prop]); + } + }, + + /** + * @private + * @param {Object} [filler] Options object + * @param {String} [property] property to set the Gradient to + */ + _initGradient: function(filler, property) { + if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) { + this.set(property, new fabric.Gradient(filler)); + } + }, + + /** + * @private + * @param {Object} [filler] Options object + * @param {String} [property] property to set the Pattern to + * @param {Function} [callback] callback to invoke after pattern load + */ + _initPattern: function(filler, property, callback) { + if (filler && filler.source && !(filler instanceof fabric.Pattern)) { + this.set(property, new fabric.Pattern(filler, callback)); + } + else { + callback && callback(); + } + }, + + /** + * @private + * @param {Object} [options] Options object + */ + _initClipping: function(options) { + if (!options.clipTo || typeof options.clipTo !== 'string') { + return; + } + + var functionBody = fabric.util.getFunctionBody(options.clipTo); + if (typeof functionBody !== 'undefined') { + this.clipTo = new Function('ctx', functionBody); + } + }, + + /** + * @private + */ + _setObject: function(obj) { + for (var prop in obj) { + this._set(prop, obj[prop]); + } + }, + + /** + * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. + * @param {String|Object} key Property name or object (if object, iterate over the object properties) + * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) + * @return {fabric.Object} thisArg + * @chainable + */ + set: function(key, value) { + if (typeof key === 'object') { + this._setObject(key); + } + else { + if (typeof value === 'function' && key !== 'clipTo') { + this._set(key, value(this.get(key))); + } + else { + this._set(key, value); + } + } + return this; + }, + + _set: function(key, value) { + this[key] = value; + }, + + /** + * Toggles specified property from `true` to `false` or from `false` to `true` + * @param {String} property Property to toggle + * @return {fabric.Object} thisArg + * @chainable + */ + toggle: function(property) { + var value = this.get(property); + if (typeof value === 'boolean') { + this.set(property, !value); + } + return this; + }, + + /** + * Basic getter + * @param {String} property Property name + * @return {*} value of a property + */ + get: function(property) { + return this[property]; + } +}; + + (function(global) { var sqrt = Math.sqrt, @@ -677,7 +793,8 @@ fabric.Collection = { var enlivenedObjects = [], numLoadedObjects = 0, - numTotalObjects = objects.length; + numTotalObjects = objects.length, + forceAsync = true; if (!numTotalObjects) { callback && callback(enlivenedObjects); @@ -691,18 +808,51 @@ fabric.Collection = { return; } var klass = fabric.util.getKlass(o.type, namespace); - if (klass.async) { - klass.fromObject(o, function (obj, error) { - if (!error) { - enlivenedObjects[index] = obj; - reviver && reviver(o, enlivenedObjects[index]); - } + klass.fromObject(o, function (obj, error) { + error || (enlivenedObjects[index] = obj); + reviver && reviver(o, obj, error); + onLoaded(); + }, forceAsync); + }); + }, + + /** + * Create and wait for loading of patterns + * @static + * @memberOf fabric.util + * @param {Array} objects Objects to enliven + * @param {Function} callback Callback to invoke when all objects are created + * @param {String} namespace Namespace to get klass "Class" object from + * @param {Function} reviver Method for further parsing of object elements, + * called after each fabric object created. + */ + enlivenPatterns: function(patterns, callback) { + patterns = patterns || []; + + function onLoaded() { + if (++numLoadedPatterns === numPatterns) { + callback && callback(enlivenedPatterns); + } + } + + var enlivenedPatterns = [], + numLoadedPatterns = 0, + numPatterns = patterns.length; + + if (!numPatterns) { + callback && callback(enlivenedPatterns); + return; + } + + patterns.forEach(function (p, index) { + if (p && p.source) { + new fabric.Pattern(p, function(pattern) { + enlivenedPatterns[index] = pattern; onLoaded(); }); } else { - enlivenedObjects[index] = klass.fromObject(o); - reviver && reviver(o, enlivenedObjects[index]); + enlivenedPatterns[index] = p; onLoaded(); } }); @@ -3058,7 +3208,6 @@ if (typeof console !== 'undefined') { var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, - capitalize = fabric.util.string.capitalize, clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, parseUnit = fabric.util.parseUnit, @@ -3066,7 +3215,7 @@ if (typeof console !== 'undefined') { reAllowedSVGTagNames = /^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i, reViewBoxTagNames = /^(symbol|image|marker|pattern|view|svg)$/i, - reNotAllowedAncestors = /^(?:pattern|defs|symbol|metadata)$/i, + reNotAllowedAncestors = /^(?:pattern|defs|symbol|metadata|clipPath|mask)$/i, reAllowedParents = /^(symbol|g|a|svg)$/i, attributesMap = { @@ -3204,16 +3353,19 @@ if (typeof console !== 'undefined') { */ fabric.parseTransformAttribute = (function() { function rotateMatrix(matrix, args) { - var angle = args[0], - x = (args.length === 3) ? args[1] : 0, - y = (args.length === 3) ? args[2] : 0; + var cos = Math.cos(args[0]), sin = Math.sin(args[0]), + x = 0, y = 0; + if (args.length === 3) { + x = args[1]; + y = args[2]; + } - matrix[0] = Math.cos(angle); - matrix[1] = Math.sin(angle); - matrix[2] = -Math.sin(angle); - matrix[3] = Math.cos(angle); - matrix[4] = x - (matrix[0] * x + matrix[2] * y); - matrix[5] = y - (matrix[1] * x + matrix[3] * y); + matrix[0] = cos; + matrix[1] = sin; + matrix[2] = -sin; + matrix[3] = cos; + matrix[4] = x - (cos * x - sin * y); + matrix[5] = y - (sin * x + cos * y); } function scaleMatrix(matrix, args) { @@ -3224,12 +3376,8 @@ if (typeof console !== 'undefined') { matrix[3] = multiplierY; } - function skewXMatrix(matrix, args) { - matrix[2] = Math.tan(fabric.util.degreesToRadians(args[0])); - } - - function skewYMatrix(matrix, args) { - matrix[1] = Math.tan(fabric.util.degreesToRadians(args[0])); + function skewMatrix(matrix, args, pos) { + matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0])); } function translateMatrix(matrix, args) { @@ -3329,10 +3477,10 @@ if (typeof console !== 'undefined') { scaleMatrix(matrix, args); break; case 'skewX': - skewXMatrix(matrix, args); + skewMatrix(matrix, args, 2); break; case 'skewY': - skewYMatrix(matrix, args); + skewMatrix(matrix, args, 1); break; case 'matrix': matrix = args; @@ -3627,6 +3775,16 @@ if (typeof console !== 'undefined') { return parsedDim; } + function hasAncestorWithNodeName(element, nodeName) { + while (element && (element = element.parentNode)) { + if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', '')) + && !element.getAttribute('instantiated_by_use')) { + return true; + } + } + return false; + } + /** * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback * @static @@ -3637,122 +3795,50 @@ if (typeof console !== 'undefined') { * It's being passed an array of elements (parsed from a document). * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. */ - fabric.parseSVGDocument = (function() { - - function hasAncestorWithNodeName(element, nodeName) { - while (element && (element = element.parentNode)) { - if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', '')) - && !element.getAttribute('instantiated_by_use')) { - return true; - } - } - return false; + fabric.parseSVGDocument = function(doc, callback, reviver) { + if (!doc) { + return; } - return function(doc, callback, reviver) { - if (!doc) { - return; + parseUseDirectives(doc); + + var svgUid = fabric.Object.__uid++, + options = applyViewboxTransform(doc), + descendants = fabric.util.toArray(doc.getElementsByTagName('*')); + + options.svgUid = svgUid; + + if (descendants.length === 0 && fabric.isLikelyNode) { + // we're likely in node, where "o3-xml" library fails to gEBTN("*") + // https://github.com/ajaxorg/node-o3-xml/issues/21 + descendants = doc.selectNodes('//*[name(.)!="svg"]'); + var arr = []; + for (var i = 0, len = descendants.length; i < len; i++) { + arr[i] = descendants[i]; } - - parseUseDirectives(doc); - - var startTime = new Date(), - svgUid = fabric.Object.__uid++, - options = applyViewboxTransform(doc), - descendants = fabric.util.toArray(doc.getElementsByTagName('*')); - - options.svgUid = svgUid; - - if (descendants.length === 0 && fabric.isLikelyNode) { - // we're likely in node, where "o3-xml" library fails to gEBTN("*") - // https://github.com/ajaxorg/node-o3-xml/issues/21 - descendants = doc.selectNodes('//*[name(.)!="svg"]'); - var arr = []; - for (var i = 0, len = descendants.length; i < len; i++) { - arr[i] = descendants[i]; - } - descendants = arr; - } - - var elements = descendants.filter(function(el) { - applyViewboxTransform(el); - return reAllowedSVGTagNames.test(el.nodeName.replace('svg:', '')) && - !hasAncestorWithNodeName(el, reNotAllowedAncestors); // http://www.w3.org/TR/SVG/struct.html#DefsElement - }); - - if (!elements || (elements && !elements.length)) { - callback && callback([], {}); - return; - } - - 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) { - callback(instances, options); - } - }, clone(options), reviver); - }; - })(); - - /** - * Used for caching SVG documents (loaded via `fabric.Canvas#loadSVGFromURL`) - * @namespace - */ - var svgCache = { - - /** - * @param {String} name - * @param {Function} callback - */ - has: function (name, callback) { - callback(false); - }, - - get: function () { - /* NOOP */ - }, - - set: function () { - /* NOOP */ + descendants = arr; } - }; - /** - * @private - */ - function _enlivenCachedObject(cachedObject) { - - var objects = cachedObject.objects, - options = cachedObject.options; - - objects = objects.map(function (o) { - return fabric[capitalize(o.type)].fromObject(o); + var elements = descendants.filter(function(el) { + applyViewboxTransform(el); + return reAllowedSVGTagNames.test(el.nodeName.replace('svg:', '')) && + !hasAncestorWithNodeName(el, reNotAllowedAncestors); // http://www.w3.org/TR/SVG/struct.html#DefsElement }); - return ({ objects: objects, options: options }); - } - - /** - * @private - */ - function _createSVGPattern(markup, canvas, property) { - if (canvas[property] && canvas[property].toSVG) { - markup.push( - '\t\n', - '\t\t\n\t\n' - ); + if (!elements || (elements && !elements.length)) { + callback && callback([], {}); + return; } - } + + fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); + fabric.cssRules[svgUid] = fabric.getCSSRules(doc); + // Precedence of rules: style > class > attribute + fabric.parseElements(elements, function(instances) { + if (callback) { + callback(instances, options); + } + }, clone(options), reviver); + }; var reFontDeclaration = new RegExp( '(normal|italic)?\\s*(normal|small-caps)?\\s*' + @@ -4030,19 +4116,9 @@ if (typeof console !== 'undefined') { loadSVGFromURL: function(url, callback, reviver) { url = url.replace(/^\n\s*/, '').trim(); - svgCache.has(url, function (hasUrl) { - if (hasUrl) { - svgCache.get(url, function (value) { - var enlivedRecord = _enlivenCachedObject(value); - callback(enlivedRecord.objects, enlivedRecord.options); - }); - } - else { - new fabric.util.request(url, { - method: 'get', - onComplete: onComplete - }); - } + new fabric.util.request(url, { + method: 'get', + onComplete: onComplete }); function onComplete(r) { @@ -4059,10 +4135,6 @@ if (typeof console !== 'undefined') { } fabric.parseSVGDocument(xml.documentElement, function (results, options) { - svgCache.set(url, { - objects: fabric.util.array.invoke(results, 'toObject'), - options: options - }); callback && callback(results, options); }, reviver); } @@ -4094,77 +4166,6 @@ if (typeof console !== 'undefined') { fabric.parseSVGDocument(doc.documentElement, function (results, options) { callback(results, options); }, reviver); - }, - - /** - * Creates markup containing SVG font faces, - * font URLs for font faces must be collected by developers - * and are not extracted from the DOM by fabricjs - * @param {Array} objects Array of fabric objects - * @return {String} - */ - createSVGFontFacesMarkup: function(objects) { - var markup = '', fontList = { }, obj, fontFamily, - style, row, rowIndex, _char, charIndex, - fontPaths = fabric.fontPaths; - - for (var i = 0, len = objects.length; i < len; i++) { - obj = objects[i]; - fontFamily = obj.fontFamily; - if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) { - continue; - } - fontList[fontFamily] = true; - if (!obj.styles) { - continue; - } - style = obj.styles; - for (rowIndex in style) { - row = style[rowIndex]; - for (charIndex in row) { - _char = row[charIndex]; - fontFamily = _char.fontFamily; - if (!fontList[fontFamily] && fontPaths[fontFamily]) { - fontList[fontFamily] = true; - } - } - } - } - - for (var j in fontList) { - markup += [ - '\t\t@font-face {\n', - '\t\t\tfont-family: \'', j, '\';\n', - '\t\t\tsrc: url(\'', fontPaths[j], '\');\n', - '\t\t}\n' - ].join(''); - } - - if (markup) { - markup = [ - '\t\n' - ].join(''); - } - - return markup; - }, - - /** - * Creates markup containing SVG referenced elements like patterns, gradients etc. - * @param {fabric.Canvas} canvas instance of fabric.Canvas - * @return {String} - */ - createSVGRefElementsMarkup: function(canvas) { - var markup = []; - - _createSVGPattern(markup, canvas, 'backgroundColor'); - _createSVGPattern(markup, canvas, 'overlayColor'); - - return markup.join(''); } }); @@ -5401,9 +5402,9 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @param {Object} colorStop Object with offset and color * @return {fabric.Gradient} thisArg */ - addColorStop: function(colorStop) { - for (var position in colorStop) { - var color = new fabric.Color(colorStop[position]); + addColorStop: function(colorStops) { + for (var position in colorStops) { + var color = new fabric.Color(colorStops[position]); this.colorStops.push({ offset: position, color: color.toRgb(), @@ -5703,177 +5704,181 @@ fabric.ElementsParser.prototype.checkIfDone = function() { })(); -/** - * Pattern class - * @class fabric.Pattern - * @see {@link http://fabricjs.com/patterns|Pattern demo} - * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo} - * @see {@link fabric.Pattern#initialize} for constructor definition - */ -fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ { +(function() { + + 'use strict'; + + var toFixed = fabric.util.toFixed; /** - * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat) - * @type String - * @default + * Pattern class + * @class fabric.Pattern + * @see {@link http://fabricjs.com/patterns|Pattern demo} + * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo} + * @see {@link fabric.Pattern#initialize} for constructor definition */ - repeat: 'repeat', - /** - * Pattern horizontal offset from object's left/top corner - * @type Number - * @default - */ - offsetX: 0, - /** - * Pattern vertical offset from object's left/top corner - * @type Number - * @default - */ - offsetY: 0, + fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ { - /** - * Constructor - * @param {Object} [options] Options object - * @return {fabric.Pattern} thisArg - */ - initialize: function(options) { - options || (options = { }); + /** + * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat) + * @type String + * @default + */ + repeat: 'repeat', - this.id = fabric.Object.__uid++; + /** + * Pattern horizontal offset from object's left/top corner + * @type Number + * @default + */ + offsetX: 0, - if (options.source) { - if (typeof options.source === 'string') { - // function string - if (typeof fabric.util.getFunctionBody(options.source) !== 'undefined') { - this.source = new Function(fabric.util.getFunctionBody(options.source)); - } - else { - // img src string - var _this = this; - this.source = fabric.util.createImage(); - fabric.util.loadImage(options.source, function(img) { - _this.source = img; - }); - } + /** + * Pattern vertical offset from object's left/top corner + * @type Number + * @default + */ + offsetY: 0, + + /** + * Constructor + * @param {Object} [options] Options object + * @param {Function} [callback] function to invoke after callback init. + * @return {fabric.Pattern} thisArg + */ + initialize: function(options, callback) { + options || (options = { }); + + this.id = fabric.Object.__uid++; + this.setOptions(options); + if (!options.source || (options.source && typeof options.source !== 'string')) { + callback && callback(this); + return; + } + // function string + if (typeof fabric.util.getFunctionBody(options.source) !== 'undefined') { + this.source = new Function(fabric.util.getFunctionBody(options.source)); + callback && callback(this); } else { - // img element - this.source = options.source; + // img src string + var _this = this; + this.source = fabric.util.createImage(); + fabric.util.loadImage(options.source, function(img) { + _this.source = img; + callback && callback(_this); + }); } - } - if (options.repeat) { - this.repeat = options.repeat; - } - if (options.offsetX) { - this.offsetX = options.offsetX; - } - if (options.offsetY) { - this.offsetY = options.offsetY; - } - }, + }, - /** - * Returns object representation of a pattern - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of a pattern instance - */ - toObject: function(propertiesToInclude) { + /** + * Returns object representation of a pattern + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of a pattern instance + */ + toObject: function(propertiesToInclude) { + var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, + source, object; - var source, object; + // callback + if (typeof this.source === 'function') { + source = String(this.source); + } + // element + else if (typeof this.source.src === 'string') { + source = this.source.src; + } + // element + else if (typeof this.source === 'object' && this.source.toDataURL) { + source = this.source.toDataURL(); + } - // callback - if (typeof this.source === 'function') { - source = String(this.source); - } - // element - else if (typeof this.source.src === 'string') { - source = this.source.src; - } - // element - else if (typeof this.source === 'object' && this.source.toDataURL) { - source = this.source.toDataURL(); - } + object = { + type: 'pattern', + source: source, + repeat: this.repeat, + offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS), + offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS), + }; + fabric.util.populateWithProperties(this, object, propertiesToInclude); - object = { - source: source, - repeat: this.repeat, - offsetX: this.offsetX, - offsetY: this.offsetY - }; - fabric.util.populateWithProperties(this, object, propertiesToInclude); + return object; + }, - return object; - }, + /* _TO_SVG_START_ */ + /** + * Returns SVG representation of a pattern + * @param {fabric.Object} object + * @return {String} SVG representation of a pattern + */ + toSVG: function(object) { + var patternSource = typeof this.source === 'function' ? this.source() : this.source, + patternWidth = patternSource.width / object.width, + patternHeight = patternSource.height / object.height, + patternOffsetX = this.offsetX / object.width, + patternOffsetY = this.offsetY / object.height, + 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; + } + else if (patternSource.toDataURL) { + patternImgSrc = patternSource.toDataURL(); + } - /* _TO_SVG_START_ */ - /** - * Returns SVG representation of a pattern - * @param {fabric.Object} object - * @return {String} SVG representation of a pattern - */ - toSVG: function(object) { - 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; - } - else if (patternSource.toDataURL) { - patternImgSrc = patternSource.toDataURL(); - } + return '\n' + + '\n' + + '\n'; + }, + /* _TO_SVG_END_ */ - return '\n' + - '\n' + - '\n'; - }, - /* _TO_SVG_END_ */ + setOptions: function(options) { + for (var prop in options) { + this[prop] = options[prop]; + } + }, - /** - * Returns an instance of CanvasPattern - * @param {CanvasRenderingContext2D} ctx Context to create pattern - * @return {CanvasPattern} - */ - toLive: function(ctx) { - var source = typeof this.source === 'function' - ? this.source() - : this.source; + /** + * Returns an instance of CanvasPattern + * @param {CanvasRenderingContext2D} ctx Context to create pattern + * @return {CanvasPattern} + */ + toLive: function(ctx) { + var source = typeof this.source === 'function' ? this.source() : this.source; - // if the image failed to load, return, and allow rest to continue loading - if (!source) { - return ''; - } - - // if an image - if (typeof source.src !== 'undefined') { - if (!source.complete) { + // if the image failed to load, return, and allow rest to continue loading + if (!source) { return ''; } - if (source.naturalWidth === 0 || source.naturalHeight === 0) { - return ''; + + // if an image + if (typeof source.src !== 'undefined') { + if (!source.complete) { + return ''; + } + if (source.naturalWidth === 0 || source.naturalHeight === 0) { + return ''; + } } + return ctx.createPattern(source, this.repeat); } - return ctx.createPattern(source, this.repeat); - } -}); + }); +})(); (function(global) { @@ -6092,7 +6097,7 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @fires object:added * @fires object:removed */ - fabric.StaticCanvas = fabric.util.createClass(/** @lends fabric.StaticCanvas.prototype */ { + fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ { /** * Constructor @@ -6498,23 +6503,9 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @param {Function} [callback] Callback is invoked when color is set */ __setBgOverlayColor: function(property, color, callback) { - if (color && color.source) { - var _this = this; - fabric.util.loadImage(color.source, function(img) { - _this[property] = new fabric.Pattern({ - source: img, - repeat: color.repeat, - offsetX: color.offsetX, - offsetY: color.offsetY - }); - callback && callback(); - }); - } - else { - this[property] = color; - callback && callback(); - } - + this[property] = color; + this._initGradient(color, property); + this._initPattern(color, property, callback); return this; }, @@ -6522,7 +6513,7 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @private */ _createCanvasElement: function(canvasEl) { - var element = fabric.util.createCanvasElement(canvasEl) + var element = fabric.util.createCanvasElement(canvasEl); if (!element.style) { element.style = { }; } @@ -6540,9 +6531,7 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @param {Object} [options] Options object */ _initOptions: function (options) { - for (var prop in options) { - this[prop] = options[prop]; - } + this._setOptions(options); this.width = this.width || parseInt(this.lowerCanvasEl.width, 10) || 0; this.height = this.height || parseInt(this.lowerCanvasEl.height, 10) || 0; @@ -6847,7 +6836,7 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ this.backgroundImage = null; this.overlayImage = null; this.backgroundColor = ''; - this.overlayColor = '' + this.overlayColor = ''; if (this._hasITextHandlers) { this.off('selection:cleared', this._canvasITextSelectionClearedHanlder); this.off('object:selected', this._canvasITextSelectionClearedHanlder); @@ -6925,7 +6914,7 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ var object = this[property + 'Color']; if (object) { ctx.fillStyle = object.toLive - ? object.toLive(ctx) + ? object.toLive(ctx, this) : object; ctx.fillRect( @@ -7146,12 +7135,12 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @private */ __serializeBgOverlay: function(methodName, propertiesToInclude) { - var data = { } + var data = { }; if (this.backgroundColor) { data.background = this.backgroundColor.toObject ? this.backgroundColor.toObject(propertiesToInclude) - : this.backgroundColor + : this.backgroundColor; } if (this.overlayColor) { @@ -7284,19 +7273,88 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ 'version="1.1" ', 'width="', width, '" ', 'height="', height, '" ', - (this.backgroundColor && !this.backgroundColor.toLive - ? 'style="background-color: ' + this.backgroundColor + '" ' - : null), viewBox, 'xml:space="preserve">\n', 'Created with Fabric.js ', fabric.version, '\n', - '', - fabric.createSVGFontFacesMarkup(this.getObjects()), - fabric.createSVGRefElementsMarkup(this), + '\n', + this.createSVGFontFacesMarkup(), + this.createSVGRefElementsMarkup(), '\n' ); }, + /** + * Creates markup containing SVG referenced elements like patterns, gradients etc. + * @return {String} + */ + createSVGRefElementsMarkup: function() { + var _this = this, + markup = ['backgroundColor', 'overlayColor'].map(function(prop) { + var fill = _this[prop]; + if (fill && fill.toLive) { + return fill.toSVG(_this, false); + } + }); + return markup.join(''); + }, + + /** + * Creates markup containing SVG font faces, + * font URLs for font faces must be collected by developers + * and are not extracted from the DOM by fabricjs + * @param {Array} objects Array of fabric objects + * @return {String} + */ + createSVGFontFacesMarkup: function() { + var markup = '', fontList = { }, obj, fontFamily, + style, row, rowIndex, _char, charIndex, + fontPaths = fabric.fontPaths, objects = this.getObjects(); + + for (var i = 0, len = objects.length; i < len; i++) { + obj = objects[i]; + fontFamily = obj.fontFamily; + if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) { + continue; + } + fontList[fontFamily] = true; + if (!obj.styles) { + continue; + } + style = obj.styles; + for (rowIndex in style) { + row = style[rowIndex]; + for (charIndex in row) { + _char = row[charIndex]; + fontFamily = _char.fontFamily; + if (!fontList[fontFamily] && fontPaths[fontFamily]) { + fontList[fontFamily] = true; + } + } + } + } + + for (var j in fontList) { + markup += [ + '\t\t@font-face {\n', + '\t\t\tfont-family: \'', j, '\';\n', + '\t\t\tsrc: url(\'', fontPaths[j], '\');\n', + '\t\t}\n' + ].join(''); + } + + if (markup) { + markup = [ + '\t\n' + ].join(''); + } + + return markup; + }, + /** * @private */ @@ -7332,22 +7390,28 @@ fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ * @private */ _setSVGBgOverlayColor: function(markup, property) { - if (this[property] && this[property].source) { + var filler = this[property]; + if (!filler) { + return; + } + if (filler.toLive) { + var repeat = filler.repeat; markup.push( - '\n' ); } - else if (this[property] && property === 'overlayColor') { + else { markup.push( '-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},function(t){var e=Math.sqrt,i=Math.atan2,r=Math.pow,n=Math.abs,s=Math.PI/180;fabric.util={removeFromArray:function(t,e){var i=t.indexOf(e);return i!==-1&&t.splice(i,1),t},getRandomInt:function(t,e){return Math.floor(Math.random()*(e-t+1))+t},degreesToRadians:function(t){return t*s},radiansToDegrees:function(t){return t/s},rotatePoint:function(t,e,i){t.subtractEquals(e);var r=fabric.util.rotateVector(t,i);return new fabric.Point(r.x,r.y).addEquals(e)},rotateVector:function(t,e){var i=Math.sin(e),r=Math.cos(e),n=t.x*r-t.y*i,s=t.x*i+t.y*r;return{x:n,y:s}},transformPoint:function(t,e,i){return i?new fabric.Point(e[0]*t.x+e[2]*t.y,e[1]*t.x+e[3]*t.y):new fabric.Point(e[0]*t.x+e[2]*t.y+e[4],e[1]*t.x+e[3]*t.y+e[5])},makeBoundingBoxFromPoints:function(t){var e=[t[0].x,t[1].x,t[2].x,t[3].x],i=fabric.util.array.min(e),r=fabric.util.array.max(e),n=Math.abs(i-r),s=[t[0].y,t[1].y,t[2].y,t[3].y],o=fabric.util.array.min(s),a=fabric.util.array.max(s),h=Math.abs(o-a);return{left:i,top:o,width:n,height:h}},invertTransform:function(t){var e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0]],r=fabric.util.transformPoint({x:t[4],y:t[5]},i,!0);return i[4]=-r.x,i[5]=-r.y,i},toFixed:function(t,e){return parseFloat(Number(t).toFixed(e))},parseUnit:function(t,e){var i=/\D{0,2}$/.exec(t),r=parseFloat(t);switch(e||(e=fabric.Text.DEFAULT_SVG_FONT_SIZE),i[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*e;default:return r}},falseFunction:function(){return!1},getKlass:function(t,e){return t=fabric.util.string.camelize(t.charAt(0).toUpperCase()+t.slice(1)),fabric.util.resolveNamespace(e)[t]},resolveNamespace:function(e){if(!e)return fabric;var i,r=e.split("."),n=r.length,s=t||fabric.window;for(i=0;ir;)r+=a[d++%f],r>l&&(r=l),t[g?"lineTo":"moveTo"](r,0),g=!g;t.restore()},createCanvasElement:function(t){return t||(t=fabric.document.createElement("canvas")),t.getContext||"undefined"==typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(t),t},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(t){var e,i,r,n,s,o=t.prototype;for(e=o.stateProperties.length;e--;)i=o.stateProperties[e],r=i.charAt(0).toUpperCase()+i.slice(1),n="set"+r,s="get"+r,o[s]||(o[s]=function(t){return new Function('return this.get("'+t+'")')}(i)),o[n]||(o[n]=function(t){return new Function("value",'return this.set("'+t+'", value)')}(i))},clipContext:function(t,e){e.save(),e.beginPath(),t.clipTo(e),e.clip()},multiplyTransformMatrices:function(t,e,i){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]]},qrDecompose:function(t){var n=i(t[1],t[0]),o=r(t[0],2)+r(t[1],2),a=e(o),h=(t[0]*t[3]-t[2]*t[1])/a,c=i(t[0]*t[2]+t[1]*t[3],o);return{angle:n/s,scaleX:a,scaleY:h,skewX:c/s,skewY:0,translateX:t[4],translateY:t[5]}},customTransformMatrix:function(t,e,i){var r=[1,0,n(Math.tan(i*s)),1],o=[n(t),0,0,n(e)];return fabric.util.multiplyTransformMatrices(o,r,!0)},resetObjectTransform:function(t){t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.setAngle(0)},getFunctionBody:function(t){return(String(t).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},isTransparent:function(t,e,i,r){r>0&&(e>r?e-=r:e=0,i>r?i-=r:i=0);var n,s,o=!0,a=t.getImageData(e,i,2*r||1,2*r||1),h=a.data.length;for(n=3;n0?D-=2*f:1===c&&D<0&&(D+=2*f);for(var E=Math.ceil(Math.abs(D/f*2)),I=[],L=D/E,R=8/3*Math.sin(L/4)*Math.sin(L/4)/Math.sin(L/2),F=A+L,B=0;B=n?s-n:2*Math.PI-(n-s)}function r(t,e,i,r,n,s,h,c){var l=a.call(arguments);if(o[l])return o[l];var u,f,d,g,p,v,b,m,y=Math.sqrt,_=Math.min,x=Math.max,C=Math.abs,S=[],w=[[],[]];f=6*t-12*i+6*n,u=-3*t+9*i-9*n+3*h,d=3*i-3*t;for(var O=0;O<2;++O)if(O>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),C(u)<1e-12){if(C(f)<1e-12)continue;g=-d/f,0=e})}function i(t,e){return n(t,e,function(t,e){return t>>0;if(0===i)return-1;var r=0;if(arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=i)return-1;for(var n=r>=0?r:Math.max(i-Math.abs(r),0);n>>0;i>>0;r>>0;i>>0;i>>0;n>>0,r=0;if(arguments.length>1)e=arguments[1];else for(;;){if(r in this){e=this[r++];break}if(++r>=i)throw new TypeError}for(;r/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:t,capitalize:e,escapeXml:i}}(),function(){var t=Array.prototype.slice,e=Function.prototype.apply,i=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var n,s=this,o=t.call(arguments,1);return n=o.length?function(){return e.call(s,this instanceof i?this:r,o.concat(t.call(arguments)))}:function(){return e.call(s,this instanceof i?this:r,arguments)},i.prototype=this.prototype,n.prototype=new i,n})}(),function(){function t(){}function e(t){var e=this.constructor.superclass.prototype[t];return arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this)}function i(){function i(){this.initialize.apply(this,arguments)}var s=null,a=r.call(arguments,0);"function"==typeof a[0]&&(s=a.shift()),i.superclass=s,i.subclasses=[],s&&(t.prototype=s.prototype,i.prototype=new t,s.subclasses.push(i));for(var h=0,c=a.length;h-1?t.prototype[r]=function(t){return function(){var r=this.constructor.superclass;this.constructor.superclass=i;var n=e[t].apply(this,arguments);if(this.constructor.superclass=r,"initialize"!==t)return n}}(r):t.prototype[r]=e[r],s&&(e.toString!==Object.prototype.toString&&(t.prototype.toString=e.toString),e.valueOf!==Object.prototype.valueOf&&(t.prototype.valueOf=e.valueOf))};fabric.util.createClass=i}(),function(){function t(t){var e,i,r=Array.prototype.slice.call(arguments,1),n=r.length;for(i=0;i-1?s(t,e.match(/opacity:\s*(\d?\.?\d*)/)[1]):t;for(var r in e)if("opacity"===r)s(t,e[r]);else{var n="float"===r||"cssFloat"===r?"undefined"==typeof i.styleFloat?"cssFloat":"styleFloat":r;i[n]=e[r]}return t}var e=fabric.document.createElement("div"),i="string"==typeof e.style.opacity,r="string"==typeof e.style.filter,n=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(t){return t};i?s=function(t,e){return t.style.opacity=e,t}:r&&(s=function(t,e){var i=t.style;return t.currentStyle&&!t.currentStyle.hasLayout&&(i.zoom=1),n.test(i.filter)?(e=e>=.9999?"":"alpha(opacity="+100*e+")",i.filter=i.filter.replace(n,e)):i.filter+=" alpha(opacity="+100*e+")",t}),fabric.util.setStyle=t}(),function(){function t(t){return"string"==typeof t?fabric.document.getElementById(t):t}function e(t,e){var i=fabric.document.createElement(t);for(var r in e)"class"===r?i.className=e[r]:"for"===r?i.htmlFor=e[r]:i.setAttribute(r,e[r]);return i}function i(t,e){t&&(" "+t.className+" ").indexOf(" "+e+" ")===-1&&(t.className+=(t.className?" ":"")+e)}function r(t,i,r){return"string"==typeof i&&(i=e(i,r)),t.parentNode&&t.parentNode.replaceChild(i,t),i.appendChild(t),i}function n(t){for(var e=0,i=0,r=fabric.document.documentElement,n=fabric.document.body||{scrollLeft:0,scrollTop:0};t&&(t.parentNode||t.host)&&(t=t.parentNode||t.host,t===fabric.document?(e=n.scrollLeft||r.scrollLeft||0,i=n.scrollTop||r.scrollTop||0):(e+=t.scrollLeft||0,i+=t.scrollTop||0),1!==t.nodeType||"fixed"!==fabric.util.getElementStyle(t,"position")););return{left:e,top:i}}function s(t){var e,i,r=t&&t.ownerDocument,s={left:0,top:0},o={left:0,top:0},a={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return o;for(var h in a)o[a[h]]+=parseInt(c(t,h),10)||0;return e=r.documentElement,"undefined"!=typeof t.getBoundingClientRect&&(s=t.getBoundingClientRect()),i=n(t),{left:s.left+i.left-(e.clientLeft||0)+o.left,top:s.top+i.top-(e.clientTop||0)+o.top}}var o,a=Array.prototype.slice,h=function(t){return a.call(t,0)};try{o=h(fabric.document.childNodes)instanceof Array}catch(t){}o||(h=function(t){for(var e=new Array(t.length),i=t.length;i--;)e[i]=t[i];return e});var c;c=fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?function(t,e){var i=fabric.document.defaultView.getComputedStyle(t,null);return i?i[e]:void 0}:function(t,e){var i=t.style[e];return!i&&t.currentStyle&&(i=t.currentStyle[e]),i},function(){function t(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=fabric.util.falseFunction),r?t.style[r]="none":"string"==typeof t.unselectable&&(t.unselectable="on"),t}function e(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=null),r?t.style[r]="":"string"==typeof t.unselectable&&(t.unselectable=""),t}var i=fabric.document.documentElement.style,r="userSelect"in i?"userSelect":"MozUserSelect"in i?"MozUserSelect":"WebkitUserSelect"in i?"WebkitUserSelect":"KhtmlUserSelect"in i?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=t,fabric.util.makeElementSelectable=e}(),function(){function t(t,e){var i=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),n=!0;r.onload=r.onreadystatechange=function(t){if(n){if("string"==typeof this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)return;n=!1,e(t||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=t,i.appendChild(r)}fabric.util.getScript=t}(),fabric.util.getById=t,fabric.util.toArray=h,fabric.util.makeElement=e,fabric.util.addClass=i,fabric.util.wrapElement=r,fabric.util.getScrollLeftTop=n,fabric.util.getElementOffset=s,fabric.util.getElementStyle=c}(),function(){function t(t,e){return t+(/\?/.test(t)?"&":"?")+e}function e(){}function i(i,n){n||(n={});var s=n.method?n.method.toUpperCase():"GET",o=n.onComplete||function(){},a=r(),h=n.body||n.parameters;return a.onreadystatechange=function(){4===a.readyState&&(o(a),a.onreadystatechange=e)},"GET"===s&&(h=null,"string"==typeof n.parameters&&(i=t(i,n.parameters))),a.open(s,i,!0),"POST"!==s&&"PUT"!==s||a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.send(h),a}var r=function(){for(var t=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}],e=t.length;e--;)try{var i=t[e]();if(i)return t[e]}catch(t){}}();fabric.util.request=i}(),fabric.log=function(){},fabric.warn=function(){},"undefined"!=typeof console&&["log","warn"].forEach(function(t){"undefined"!=typeof console[t]&&"function"==typeof console[t].apply&&(fabric[t]=function(){return console[t].apply(console,arguments)})}),function(){function t(t){e(function(i){t||(t={});var r,n=i||+new Date,s=t.duration||500,o=n+s,a=t.onChange||function(){},h=t.abort||function(){return!1},c=t.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},l="startValue"in t?t.startValue:0,u="endValue"in t?t.endValue:100,f=t.byValue||u-l;t.onStart&&t.onStart(),function i(u){r=u||+new Date;var d=r>o?s:r-n;return h()?void(t.onComplete&&t.onComplete()):(a(c(d,l,f,s)),r>o?void(t.onComplete&&t.onComplete()):void e(i))}(n)})}function e(){return i.apply(fabric.window,arguments)}var i=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(t){fabric.window.setTimeout(t,1e3/60)};fabric.util.animate=t,fabric.util.requestAnimFrame=e}(),function(){function t(t,e,i){var r="rgba("+parseInt(t[0]+i*(e[0]-t[0]),10)+","+parseInt(t[1]+i*(e[1]-t[1]),10)+","+parseInt(t[2]+i*(e[2]-t[2]),10);return r+=","+(t&&e?parseFloat(t[3]+i*(e[3]-t[3])):1),r+=")"}function e(e,i,r,n){var s=new fabric.Color(e).getSource(),o=new fabric.Color(i).getSource();n=n||{},fabric.util.animate(fabric.util.object.extend(n,{duration:r||500,startValue:s,endValue:o,byValue:o,easing:function(e,i,r,s){var o=n.colorEasing?n.colorEasing(e,s):1-Math.cos(e/s*(Math.PI/2));return t(i,r,o)}}))}fabric.util.animateColor=e}(),function(){function t(t,e,i,r){return ta?a:o),1===o&&1===a&&0===h&&0===c&&0===f&&0===d)return y;if((f||d)&&(_=" translate("+x(f)+" "+x(d)+") "),r=_+" matrix("+o+" 0 0 "+a+" "+h*o+" "+c*a+") ","svg"===t.nodeName){for(n=t.ownerDocument.createElement("g");t.firstChild;)n.appendChild(t.firstChild);t.appendChild(n)}else n=t,r=n.getAttribute("transform")+r;return n.setAttribute("transform",r),y}function g(t){var e=t.objects,i=t.options;return e=e.map(function(t){return v[m(t.type)].fromObject(t)}),{objects:e,options:i}}function p(t,e,i){e[i]&&e[i].toSVG&&t.push('\t\n','\t\t\n\t\n')}var v=t.fabric||(t.fabric={}),b=v.util.object.extend,m=v.util.string.capitalize,y=v.util.object.clone,_=v.util.toFixed,x=v.util.parseUnit,C=v.util.multiplyTransformMatrices,S=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i,w=/^(symbol|image|marker|pattern|view|svg)$/i,O=/^(?:pattern|defs|symbol|metadata)$/i,T=/^(symbol|g|a|svg)$/i,k={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"},j={stroke:"strokeOpacity",fill:"fillOpacity"};v.cssRules={},v.gradientDefs={},v.parseTransformAttribute=function(){function t(t,e){var i=e[0],r=3===e.length?e[1]:0,n=3===e.length?e[2]:0;t[0]=Math.cos(i),t[1]=Math.sin(i),t[2]=-Math.sin(i),t[3]=Math.cos(i),t[4]=r-(t[0]*r+t[2]*n),t[5]=n-(t[1]*r+t[3]*n)}function e(t,e){var i=e[0],r=2===e.length?e[1]:e[0];t[0]=i,t[3]=r}function i(t,e){t[2]=Math.tan(v.util.degreesToRadians(e[0]))}function r(t,e){t[1]=Math.tan(v.util.degreesToRadians(e[0]))}function n(t,e){t[4]=e[0],2===e.length&&(t[5]=e[1])}var s=[1,0,0,1,0,0],o=v.reNum,a="(?:\\s+,?\\s*|,\\s*)",h="(?:(skewX)\\s*\\(\\s*("+o+")\\s*\\))",c="(?:(skewY)\\s*\\(\\s*("+o+")\\s*\\))",l="(?:(rotate)\\s*\\(\\s*("+o+")(?:"+a+"("+o+")"+a+"("+o+"))?\\s*\\))",u="(?:(scale)\\s*\\(\\s*("+o+")(?:"+a+"("+o+"))?\\s*\\))",f="(?:(translate)\\s*\\(\\s*("+o+")(?:"+a+"("+o+"))?\\s*\\))",d="(?:(matrix)\\s*\\(\\s*("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")\\s*\\))",g="(?:"+d+"|"+f+"|"+u+"|"+l+"|"+h+"|"+c+")",p="(?:"+g+"(?:"+a+"*"+g+")*)",b="^\\s*(?:"+p+"?)\\s*$",m=new RegExp(b),y=new RegExp(g,"g");return function(o){var a=s.concat(),h=[];if(!o||o&&!m.test(o))return a;o.replace(y,function(o){var c=new RegExp(g).exec(o).filter(function(t){return!!t}),l=c[1],u=c.slice(2).map(parseFloat);switch(l){case"translate":n(a,u);break;case"rotate":u[0]=v.util.degreesToRadians(u[0]),t(a,u);break;case"scale":e(a,u);break;case"skewX":i(a,u);break;case"skewY":r(a,u);break;case"matrix":a=u}h.push(a.concat()),a=s.concat()});for(var c=h[0];h.length>1;)h.shift(),c=v.util.multiplyTransformMatrices(c,h[0]);return c}}();var M=new RegExp("^\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*$");v.parseSVGDocument=function(){function t(t,e){for(;t&&(t=t.parentNode);)if(t.nodeName&&e.test(t.nodeName.replace("svg:",""))&&!t.getAttribute("instantiated_by_use"))return!0;return!1}return function(e,i,r){if(e){f(e);var n=new Date,s=v.Object.__uid++,o=d(e),a=v.util.toArray(e.getElementsByTagName("*"));if(o.svgUid=s,0===a.length&&v.isLikelyNode){a=e.selectNodes('//*[name(.)!="svg"]');for(var h=[],c=0,l=a.length;c/i,""))),n&&n.documentElement||e&&e(null),v.parseSVGDocument(n.documentElement,function(i,r){P.set(t,{objects:v.util.array.invoke(i,"toObject"),options:r}),e&&e(i,r)},i)}t=t.replace(/^\n\s*/,"").trim(),P.has(t,function(i){i?P.get(t,function(t){var i=g(t);e(i.objects,i.options)}):new v.util.request(t,{method:"get",onComplete:r})})},loadSVGFromString:function(t,e,i){t=t.trim();var r;if("undefined"!=typeof DOMParser){var n=new DOMParser;n&&n.parseFromString&&(r=n.parseFromString(t,"text/xml"))}else v.window.ActiveXObject&&(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(t.replace(//i,"")));v.parseSVGDocument(r.documentElement,function(t,i){e(t,i)},i)},createSVGFontFacesMarkup:function(t){for(var e,i,r,n,s,o,a,h="",c={},l=v.fontPaths,u=0,f=t.length;u',"","\n"].join("")),h},createSVGRefElementsMarkup:function(t){var e=[];return p(e,t,"backgroundColor"),p(e,t,"overlayColor"),e.join("")}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.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 t=0,e=this.elements.length;tt.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,i){return"undefined"==typeof i&&(i=.5),i=Math.max(Math.min(1,i),0),new e(this.x+(t.x-this.x)*i,this.y+(t.y-this.y)*i)},distanceFrom:function(t){var e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)},midPointFrom:function(t){return this.lerp(t)},min:function(t){return new e(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new e(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new e(this.x,this.y)}}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){this.status=t,this.points=[]}var i=t.fabric||(t.fabric={});return i.Intersection?void i.warn("fabric.Intersection is already defined"):(i.Intersection=e,i.Intersection.prototype={constructor:e,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},i.Intersection.intersectLineLine=function(t,r,n,s){var o,a=(s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x),h=(r.x-t.x)*(t.y-n.y)-(r.y-t.y)*(t.x-n.x),c=(s.y-n.y)*(r.x-t.x)-(s.x-n.x)*(r.y-t.y);if(0!==c){var l=a/c,u=h/c;0<=l&&l<=1&&0<=u&&u<=1?(o=new e("Intersection"),o.appendPoint(new i.Point(t.x+l*(r.x-t.x),t.y+l*(r.y-t.y)))):o=new e}else o=new e(0===a||0===h?"Coincident":"Parallel");return o},i.Intersection.intersectLinePolygon=function(t,i,r){for(var n,s,o,a=new e,h=r.length,c=0;c0&&(a.status="Intersection"),a},i.Intersection.intersectPolygonPolygon=function(t,i){for(var r=new e,n=t.length,s=0;s0&&(r.status="Intersection"),r},void(i.Intersection.intersectPolygonRectangle=function(t,r,n){var s=r.min(n),o=r.max(n),a=new i.Point(o.x,s.y),h=new i.Point(s.x,o.y),c=e.intersectLinePolygon(s,a,t),l=e.intersectLinePolygon(a,o,t),u=e.intersectLinePolygon(o,h,t),f=e.intersectLinePolygon(h,s,t),d=new e;return d.appendPoints(c.points),d.appendPoints(l.points),d.appendPoints(u.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){t?this._tryParsingColor(t):this.setSource([0,0,0,1])}function i(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}var r=t.fabric||(t.fabric={});return r.Color?void r.warn("fabric.Color is already defined."):(r.Color=e,r.Color.prototype={_tryParsingColor:function(t){var i;t in e.colorNameMap&&(t=e.colorNameMap[t]),"transparent"===t&&(i=[255,255,255,0]),i||(i=e.sourceFromHex(t)),i||(i=e.sourceFromRgb(t)),i||(i=e.sourceFromHsl(t)),i||(i=[0,0,0,1]),i&&this.setSource(i)},_rgbToHsl:function(t,e,i){t/=255,e/=255,i/=255;var n,s,o,a=r.util.array.max([t,e,i]),h=r.util.array.min([t,e,i]);if(o=(a+h)/2,a===h)n=s=0;else{var c=a-h;switch(s=o>.5?c/(2-a-h):c/(a+h),a){case t:n=(e-i)/c+(e1?1:s,n){var o=n.split(/\s*;\s*/);""===o[o.length-1]&&o.pop();for(var a=o.length;a--;){var h=o[a].split(/\s*:\s*/),c=h[0].trim(),l=h[1].trim();"stop-color"===c?e=l:"stop-opacity"===c&&(r=l)}}return e||(e=t.getAttribute("stop-color")||"rgb(0,0,0)"),r||(r=t.getAttribute("stop-opacity")),e=new fabric.Color(e),i=e.getAlpha(),r=isNaN(parseFloat(r))?1:parseFloat(r),r*=i,{offset:s,color:e.toRgb(),opacity:r}}function e(t){return{x1:t.getAttribute("x1")||0,y1:t.getAttribute("y1")||0,x2:t.getAttribute("x2")||"100%",y2:t.getAttribute("y2")||0}}function i(t){return{x1:t.getAttribute("fx")||t.getAttribute("cx")||"50%",y1:t.getAttribute("fy")||t.getAttribute("cy")||"50%",r1:0,x2:t.getAttribute("cx")||"50%",y2:t.getAttribute("cy")||"50%",r2:t.getAttribute("r")||"50%"}}function r(t,e,i){var r,n=0,s=1,o="";for(var a in e)"Infinity"===e[a]?e[a]=1:"-Infinity"===e[a]&&(e[a]=0),r=parseFloat(e[a],10),s="string"==typeof e[a]&&/^\d+%$/.test(e[a])?.01:1,"x1"===a||"x2"===a||"r2"===a?(s*="objectBoundingBox"===i?t.width:1,n="objectBoundingBox"===i?t.left||0:0):"y1"!==a&&"y2"!==a||(s*="objectBoundingBox"===i?t.height:1,n="objectBoundingBox"===i?t.top||0:0),e[a]=r*s+n;if("ellipse"===t.type&&null!==e.r2&&"objectBoundingBox"===i&&t.rx!==t.ry){var h=t.ry/t.rx;o=" scale(1, "+h+")",e.y1&&(e.y1/=h),e.y2&&(e.y2/=h)}return o}fabric.Gradient=fabric.util.createClass({offsetX:0,offsetY:0,initialize:function(t){t||(t={});var e={};this.id=fabric.Object.__uid++,this.type=t.type||"linear",e={x1:t.coords.x1||0,y1:t.coords.y1||0,x2:t.coords.x2||0,y2:t.coords.y2||0},"radial"===this.type&&(e.r1=t.coords.r1||0,e.r2=t.coords.r2||0),this.coords=e,this.colorStops=t.colorStops.slice(),t.gradientTransform&&(this.gradientTransform=t.gradientTransform),this.offsetX=t.offsetX||this.offsetX,this.offsetY=t.offsetY||this.offsetY},addColorStop:function(t){for(var e in t){var i=new fabric.Color(t[e]);this.colorStops.push({offset:e,color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(t){var e={type:this.type,coords:this.coords,colorStops:this.colorStops,offsetX:this.offsetX,offsetY:this.offsetY,gradientTransform:this.gradientTransform?this.gradientTransform.concat():this.gradientTransform};return fabric.util.populateWithProperties(this,e,t),e},toSVG:function(t){var e,i,r=fabric.util.object.clone(this.coords);if(this.colorStops.sort(function(t,e){return t.offset-e.offset}),!t.group||"path-group"!==t.group.type)for(var n in r)"x1"===n||"x2"===n||"r2"===n?r[n]+=this.offsetX-t.width/2:"y1"!==n&&"y2"!==n||(r[n]+=this.offsetY-t.height/2);i='id="SVGID_'+this.id+'" gradientUnits="userSpaceOnUse"',this.gradientTransform&&(i+=' gradientTransform="matrix('+this.gradientTransform.join(" ")+')" '),"linear"===this.type?e=["\n']:"radial"===this.type&&(e=["\n']);for(var s=0;s\n');return e.push("linear"===this.type?"\n":"\n"),e.join("")},toLive:function(t,e){var i,r,n=fabric.util.object.clone(this.coords);if(this.type){if(e.group&&"path-group"===e.group.type)for(r in n)"x1"===r||"x2"===r?n[r]+=-this.offsetX+e.width/2:"y1"!==r&&"y2"!==r||(n[r]+=-this.offsetY+e.height/2);"linear"===this.type?i=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(i=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2));for(var s=0,o=this.colorStops.length;s\n\n\n'},toLive:function(t){var e="function"==typeof this.source?this.source():this.source;if(!e)return"";if("undefined"!=typeof e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.toFixed;return e.Shadow?void e.warn("fabric.Shadow is already defined."):(e.Shadow=e.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(t){"string"==typeof t&&(t=this._parseShadow(t));for(var i in t)this[i]=t[i];this.id=e.Object.__uid++},_parseShadow:function(t){var i=t.trim(),r=e.Shadow.reOffsetsAndBlur.exec(i)||[],n=i.replace(e.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)";return{color:n.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(t){var r=40,n=40,s=e.Object.NUM_FRACTION_DIGITS,o=e.util.rotateVector({x:this.offsetX,y:this.offsetY},e.util.degreesToRadians(-t.angle)),a=20;return t.width&&t.height&&(r=100*i((Math.abs(o.x)+this.blur)/t.width,s)+a,n=100*i((Math.abs(o.y)+this.blur)/t.height,s)+a),t.flipX&&(o.x*=-1),t.flipY&&(o.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke};var t={},i=e.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke"].forEach(function(e){this[e]!==i[e]&&(t[e]=this[e])},this),t}}),void(e.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/))}("undefined"!=typeof exports?exports:this),function(){"use strict";if(fabric.StaticCanvas)return void fabric.warn("fabric.StaticCanvas is already defined.");var t=fabric.util.object.extend,e=fabric.util.getElementOffset,i=fabric.util.removeFromArray,r=fabric.util.toFixed,n=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass({initialize:function(t,e){e||(e={}),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:[1,0,0,1,0,0],backgroundVpt:!0,overlayVpt:!0,onBeforeScaleRotate:function(){},enableRetinaScaling:!0,_initStatic:function(t,e){var i=fabric.StaticCanvas.prototype.renderAll.bind(this);this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this._setImageSmoothing(),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},getRetinaScaling:function(){return this._isRetinaScaling()?fabric.devicePixelRatio:1},_initRetinaScaling:function(){this._isRetinaScaling()&&(this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio))},calcOffset:function(){return this._offset=e(this.lowerCanvasEl),this},setOverlayImage:function(t,e,i){return this.__setBgOverlayImage("overlayImage",t,e,i)},setBackgroundImage:function(t,e,i){return this.__setBgOverlayImage("backgroundImage",t,e,i)},setOverlayColor:function(t,e){return this.__setBgOverlayColor("overlayColor",t,e)},setBackgroundColor:function(t,e){return this.__setBgOverlayColor("backgroundColor",t,e)},_setImageSmoothing:function(){var t=this.getContext();t.imageSmoothingEnabled=t.imageSmoothingEnabled||t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled||t.oImageSmoothingEnabled,t.imageSmoothingEnabled=this.imageSmoothingEnabled},__setBgOverlayImage:function(t,e,i,r){return"string"==typeof e?fabric.util.loadImage(e,function(e){e&&(this[t]=new fabric.Image(e,r)),i&&i(e)},this,r&&r.crossOrigin):(r&&e.setOptions(r),this[t]=e,i&&i(e)),this},__setBgOverlayColor:function(t,e,i){if(e&&e.source){var r=this;fabric.util.loadImage(e.source,function(n){r[t]=new fabric.Pattern({source:n,repeat:e.repeat,offsetX:e.offsetX,offsetY:e.offsetY}),i&&i()})}else this[t]=e,i&&i();return this},_createCanvasElement:function(t){var e=fabric.util.createCanvasElement(t);if(e.style||(e.style={}),!e)throw n;if("undefined"==typeof e.getContext)throw n;return e},_initOptions:function(t){for(var e in t)this[e]=t[e];this.width=this.width||parseInt(this.lowerCanvasEl.width,10)||0,this.height=this.height||parseInt(this.lowerCanvasEl.height,10)||0,this.lowerCanvasEl.style&&(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(t){this.lowerCanvasEl=fabric.util.getById(t)||this._createCanvasElement(t),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(t,e){return this.setDimensions({width:t},e)},setHeight:function(t,e){return this.setDimensions({height:t},e)},setDimensions:function(t,e){var i;e=e||{};for(var r in t)i=t[r],e.cssOnly||(this._setBackstoreDimension(r,t[r]),i+="px"),e.backstoreOnly||this._setCssDimension(r,i);return this._initRetinaScaling(),this._setImageSmoothing(),this.calcOffset(),e.cssOnly||this.renderAll(),this},_setBackstoreDimension:function(t,e){return this.lowerCanvasEl[t]=e,this.upperCanvasEl&&(this.upperCanvasEl[t]=e),this.cacheCanvasEl&&(this.cacheCanvasEl[t]=e),this[t]=e,this},_setCssDimension:function(t,e){return this.lowerCanvasEl.style[t]=e,this.upperCanvasEl&&(this.upperCanvasEl.style[t]=e),this.wrapperEl&&(this.wrapperEl.style[t]=e),this},getZoom:function(){return this.viewportTransform[0]},setViewportTransform:function(t){var e,i=this._activeGroup,r=!1,n=!0;this.viewportTransform=t;for(var s=0,o=this._objects.length;s"),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,n=e.width||this.width,s=e.height||this.height,o='viewBox="0 0 '+this.width+" "+this.height+'" ',a=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?o='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,o='viewBox="'+r(-i[4]/i[0],a)+" "+r(-i[5]/i[3],a)+" "+r(this.width/i[0],a)+" "+r(this.height/i[3],a)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),"\n")},_setSVGObjects:function(t,e){for(var i,r=0,n=this.getObjects(),s=n.length;r\n"):this[e]&&"overlayColor"===e&&t.push('\n")},sendToBack:function(t){if(!t)return this;var e,r,n,s=this._activeGroup;if(t===s)for(n=s._objects,e=n.length;e--;)r=n[e],i(this._objects,r),this._objects.unshift(r);else i(this._objects,t),this._objects.unshift(t);return this.renderAll&&this.renderAll()},bringToFront:function(t){if(!t)return this;var e,r,n,s=this._activeGroup;if(t===s)for(n=s._objects,e=0;e=0;--n){var s=t.intersectsWithObject(this._objects[n])||t.isContainedWithinObject(this._objects[n])||this._objects[n].isContainedWithinObject(t);if(s){r=n;break}}}else r=e-1;return r},bringForward:function(t,e){if(!t)return this;var r,n,s,o,a,h=this._activeGroup;if(t===h)for(a=h._objects,r=a.length;r--;)n=a[r],s=this._objects.indexOf(n),s!==this._objects.length-1&&(o=s+1,i(this._objects,n),this._objects.splice(o,0,n));else s=this._objects.indexOf(t),s!==this._objects.length-1&&(o=this._findNewUpperIndex(t,s,e),i(this._objects,t),this._objects.splice(o,0,t));return this.renderAll&&this.renderAll(),this},_findNewUpperIndex:function(t,e,i){var r;if(i){r=e;for(var n=e+1;n"}}),t(fabric.StaticCanvas.prototype,fabric.Observable),t(fabric.StaticCanvas.prototype,fabric.Collection),t(fabric.StaticCanvas.prototype,fabric.DataURLExporter),t(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=fabric.util.createCanvasElement();if(!e||!e.getContext)return null;var i=e.getContext("2d");if(!i)return null;switch(t){case"getImageData":return"undefined"!=typeof i.getImageData;case"setLineDash":return"undefined"!=typeof i.setLineDash;case"toDataURL":return"undefined"!=typeof e.toDataURL;case"toDataURLWithQuality":try{return e.toDataURL("image/jpeg",0),!0}catch(t){}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",strokeDashArray:null,setShadow:function(t){return this.shadow=new fabric.Shadow(t),this},_setBrushStyles:function(){var t=this.canvas.contextTop;t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,this.strokeDashArray&&fabric.StaticCanvas.supports("setLineDash")&&t.setLineDash(this.strokeDashArray)},_setShadow:function(){if(this.shadow){var t=this.canvas.contextTop,e=this.canvas.getZoom();t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*e,t.shadowOffsetX=this.shadow.offsetX*e,t.shadowOffsetY=this.shadow.offsetY*e}},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}}),function(){fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(t){this.canvas=t,this._points=[]},onMouseDown:function(t){this._prepareForDrawing(t),this._captureDrawingPath(t),this._render()},onMouseMove:function(t){this._captureDrawingPath(t),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(t){var e=new fabric.Point(t.x,t.y);this._reset(),this._addPoint(e),this.canvas.contextTop.moveTo(e.x,e.y)},_addPoint:function(t){this._points.push(t)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(t){var e=new fabric.Point(t.x,t.y);this._addPoint(e)},_render:function(){var t=this.canvas.contextTop,e=this.canvas.viewportTransform,i=this._points[0],r=this._points[1];t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5]),t.beginPath(),2===this._points.length&&i.x===r.x&&i.y===r.y&&(i.x-=.5,r.x+=.5),t.moveTo(i.x,i.y);for(var n=1,s=this._points.length;n0?1:-1,"y"===i&&(s=e.target.skewY,o="top",a="bottom",r="originY"),n[-1]=o,n[1]=a,e.target.flipX&&(c*=-1),e.target.flipY&&(c*=-1),0===s?(e.skewSign=-h*t*c,e[r]=n[-t]):(s=s>0?1:-1,e.skewSign=s,e[r]=n[s*h*c])},_skewObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=!1,o=n.get("lockSkewingX"),a=n.get("lockSkewingY");if(o&&"x"===i||a&&"y"===i)return!1;var h,c,l=n.getCenterPoint(),u=n.toLocalPoint(new fabric.Point(t,e),"center","center")[i],f=n.toLocalPoint(new fabric.Point(r.lastX,r.lastY),"center","center")[i],d=n._getTransformedDimensions();return this._changeSkewTransformOrigin(u-f,r,i),h=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY)[i],c=n.translateToOriginPoint(l,r.originX,r.originY),s=this._setObjectSkew(h,r,i,d),r.lastX=t,r.lastY=e,n.setPositionByOrigin(c,r.originX,r.originY),s},_setObjectSkew:function(t,e,i,r){var n,s,o,a,h,c,l,u,f,d=e.target,g=!1,p=e.skewSign;return"x"===i?(a="y",h="Y",c="X",u=0,f=d.skewY):(a="x",h="X",c="Y",u=d.skewX,f=0),o=d._getTransformedDimensions(u,f),l=2*Math.abs(t)-o[i],l<=2?n=0:(n=p*Math.atan(l/d["scale"+c]/(o[a]/d["scale"+h])),n=fabric.util.radiansToDegrees(n)),g=d["skew"+c]!==n,d.set("skew"+c,n),0!==d["skew"+h]&&(s=d._getTransformedDimensions(),n=r[a]/s[a]*d["scale"+h],d.set("scale"+h,n)),g},_scaleObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=n.get("lockScalingX"),o=n.get("lockScalingY"),a=n.get("lockScalingFlip");if(s&&o)return!1;var h=n.translateToOriginPoint(n.getCenterPoint(),r.originX,r.originY),c=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY),l=n._getTransformedDimensions(),u=!1;return this._setLocalMouse(c,r),u=this._setObjectScale(c,r,s,o,i,a,l),n.setPositionByOrigin(h,r.originX,r.originY),u},_setObjectScale:function(t,e,i,r,n,s,o){var a,h,c,l,u=e.target,f=!1,d=!1,g=!1;return c=t.x*u.scaleX/o.x,l=t.y*u.scaleY/o.y,a=u.scaleX!==c,h=u.scaleY!==l,s&&c<=0&&ci.padding?t.x<0?t.x+=i.padding:t.x-=i.padding:t.x=0,n(t.y)>i.padding?t.y<0?t.y+=i.padding:t.y-=i.padding:t.y=0},_rotateObject:function(t,e){var n=this._currentTransform;if(n.target.get("lockRotation"))return!1;var s=r(n.ey-n.top,n.ex-n.left),o=r(e-n.top,t-n.left),a=i(o-s+n.theta),h=!0;if(a<0&&(a=360+a),a%=360,n.target.snapAngle>0){var c=n.target.snapAngle,l=n.target.snapThreshold||c,u=Math.ceil(a/c)*c,f=Math.floor(a/c)*c;Math.abs(a-f)0?0:-i),e.ey-(r>0?0:-r),a,h)),this.selectionLineWidth&&this.selectionBorderColor)if(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,this.selectionDashArray.length>1&&!s){var c=e.ex+o-(i>0?0:a),l=e.ey+o-(r>0?0:h);t.beginPath(),fabric.util.drawDashedLine(t,c,l,c+a,l,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l+h-1,c+a,l+h-1,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l,c,l+h,this.selectionDashArray),fabric.util.drawDashedLine(t,c+a-1,l,c+a-1,l+h,this.selectionDashArray),t.closePath(),t.stroke()}else fabric.Object.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(e.ex+o-(i>0?0:a),e.ey+o-(r>0?0:h),a,h)},findTarget:function(t,e){if(!this.skipTargetFind){var i,r=!0,n=this.getPointer(t,r),s=this.getActiveGroup(),o=this.getActiveObject();if(s&&!e&&this._checkTarget(n,s))return this._fireOverOutEvents(s,t),s;if(o&&o._findTargetCorner(n))return this._fireOverOutEvents(o,t),o;if(o&&this._checkTarget(n,o)){if(!this.preserveObjectStacking)return this._fireOverOutEvents(o,t),o;i=o}this.targets=[];var a=this._searchPossibleTargets(this._objects,n);return t[this.altSelectionKey]&&a&&i&&a!==i&&(a=i),this._fireOverOutEvents(a,t),a}},_fireOverOutEvents:function(t,e){t?this._hoveredTarget!==t&&(this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout")),this.fire("mouse:over",{target:t,e:e}),t.fire("mouseover"),this._hoveredTarget=t):this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout"),this._hoveredTarget=null)},_checkTarget:function(t,e){if(e&&e.visible&&e.evented&&this.containsPoint(null,e,t)){if(!this.perPixelTargetFind&&!e.perPixelTargetFind||e.isEditing)return!0;var i=this.isTargetTransparent(e,t.x,t.y);if(!i)return!0}},_searchPossibleTargets:function(t,e){for(var i,r,n,s=t.length;s--;)if(this._checkTarget(e,t[s])){i=t[s],"group"===i.type&&i.subTargetCheck&&(r=this._normalizePointer(i,e),n=this._searchPossibleTargets(i._objects,r),n&&this.targets.push(n));break}return i},restorePointerVpt:function(t){return fabric.util.transformPoint(t,fabric.util.invertTransform(this.viewportTransform))},getPointer:function(e,i,r){r||(r=this.upperCanvasEl);var n,s=t(e),o=r.getBoundingClientRect(),a=o.width||0,h=o.height||0;return a&&h||("top"in o&&"bottom"in o&&(h=Math.abs(o.top-o.bottom)),"right"in o&&"left"in o&&(a=Math.abs(o.right-o.left))),this.calcOffset(),s.x=s.x-this._offset.left,s.y=s.y-this._offset.top,i||(s=this.restorePointerVpt(s)),n=0===a||0===h?{width:1,height:1}:{width:r.width/a,height:r.height/h},{x:s.x*n.width,y:s.y*n.height}},_createUpperCanvas:function(){var t=this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/,"");this.upperCanvasEl=this._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+t),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(t){var e=this.getWidth()||t.width,i=this.getHeight()||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0}),t.width=e,t.height=i,fabric.util.makeElementUnselectable(t)},_copyCanvasStyle:function(t,e){e.style.cssText=t.style.cssText},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},_setActiveObject:function(t){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=t,t.set("active",!0)},setActiveObject:function(t,e){return this._setActiveObject(t),this.renderAll(),this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e}),this},getActiveObject:function(){return this._activeObject},_onObjectRemoved:function(t){this.getActiveObject()===t&&(this.fire("before:selection:cleared",{target:t}),this._discardActiveObject(),this.fire("selection:cleared",{target:t}),t.fire("deselected")),this.callSuper("_onObjectRemoved",t)},_discardActiveObject:function(){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=null},discardActiveObject:function(t){var e=this._activeObject;return this.fire("before:selection:cleared",{target:e,e:t}),this._discardActiveObject(),this.fire("selection:cleared",{e:t}),e&&e.fire("deselected",{e:t}),this},_setActiveGroup:function(t){this._activeGroup=t,t&&t.set("active",!0)},setActiveGroup:function(t,e){return this._setActiveGroup(t),t&&(this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e})),this},getActiveGroup:function(){return this._activeGroup},_discardActiveGroup:function(){var t=this.getActiveGroup();t&&t.destroy(),this.setActiveGroup(null)},discardActiveGroup:function(t){var e=this.getActiveGroup();return this.fire("before:selection:cleared",{e:t,target:e}),this._discardActiveGroup(),this.fire("selection:cleared",{e:t}),this},deactivateAll:function(){for(var t,e=this.getObjects(),i=0,r=e.length;i1)){var r=this._groupSelector;r?(i=this.getPointer(t,!0),r.left=i.x-r.ex,r.top=i.y-r.ey,this.renderTop()):this._currentTransform?this._transformObject(t):(e=this.findTarget(t),this._setCursorFromEvent(t,e)),this._handleEvent(t,"move",e?e:null)}},__onMouseWheel:function(t){this.fire("mouse:wheel",{e:t})},_transformObject:function(t){var e=this.getPointer(t),i=this._currentTransform;i.reset=!1,i.target.isMoving=!0,i.shiftKey=t.shiftKey,i.altKey=t[this.centeredKey],this._beforeScaleTransform(t,i),this._performTransformAction(t,i,e),i.actionPerformed&&this.renderAll()},_performTransformAction:function(t,e,i){var r=i.x,n=i.y,s=e.target,o=e.action,a=!1;"rotate"===o?(a=this._rotateObject(r,n))&&this._fire("rotating",s,t):"scale"===o?(a=this._onScale(t,e,r,n))&&this._fire("scaling",s,t):"scaleX"===o?(a=this._scaleObject(r,n,"x"))&&this._fire("scaling",s,t):"scaleY"===o?(a=this._scaleObject(r,n,"y"))&&this._fire("scaling",s,t):"skewX"===o?(a=this._skewObject(r,n,"x"))&&this._fire("skewing",s,t):"skewY"===o?(a=this._skewObject(r,n,"y"))&&this._fire("skewing",s,t):(a=this._translateObject(r,n),a&&(this._fire("moving",s,t),this.setCursor(s.moveCursor||this.moveCursor))),e.actionPerformed=e.actionPerformed||a},_fire:function(t,e,i){this.fire("object:"+t,{target:e,e:i}),e.fire(t,{e:i})},_beforeScaleTransform:function(t,e){if("scale"===e.action||"scaleX"===e.action||"scaleY"===e.action){var i=this._shouldCenterTransform(e.target);(i&&("center"!==e.originX||"center"!==e.originY)||!i&&"center"===e.originX&&"center"===e.originY)&&(this._resetCurrentTransform(),e.reset=!0)}},_onScale:function(t,e,i,r){return!t[this.uniScaleKey]&&!this.uniScaleTransform||e.target.get("lockUniScaling")?(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally")):(e.currentAction="scale",this._scaleObject(i,r))},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor;if(e.selectable){var r=this.getActiveGroup(),n=e._findTargetCorner&&(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this._setCornerCursor(n,e,t):this.setCursor(i)}else this.setCursor(i);return!0},_setCornerCursor:function(e,i,r){if(e in t)this.setCursor(this._getRotatedCornerCursor(e,i,r));else{if("mtr"!==e||!i.hasRotatingPoint)return this.setCursor(this.defaultCursor),!1;this.setCursor(this.rotationCursor)}},_getRotatedCornerCursor:function(e,i,r){var n=Math.round(i.getAngle()%360/45);return n<0&&(n+=8),n+=t[e],r[this.altActionKey]&&t[e]%2===0&&(n+=2),n%=8,this.cursorMap[n]}})}(),function(){var t=Math.min,e=Math.max;fabric.util.object.extend(fabric.Canvas.prototype,{_shouldGroup:function(t,e){var i=this.getActiveObject();return t[this.selectionKey]&&e&&e.selectable&&(this.getActiveGroup()||i&&i!==e)&&this.selection},_handleGrouping:function(t,e){var i=this.getActiveGroup();(e!==i||(e=this.findTarget(t,!0)))&&(i?this._updateActiveGroup(e,t):this._createActiveGroup(e,t),this._activeGroup&&this._activeGroup.saveCoords())},_updateActiveGroup:function(t,e){var i=this.getActiveGroup();if(i.contains(t)){if(i.removeWithUpdate(t),t.set("active",!1),1===i.size())return this.discardActiveGroup(e),void this.setActiveObject(i.item(0))}else i.addWithUpdate(t);this.fire("selection:created",{target:i,e:e}),i.set("active",!0)},_createActiveGroup:function(t,e){if(this._activeObject&&t!==this._activeObject){var i=this._createGroup(t);i.addWithUpdate(),this.setActiveGroup(i),this._activeObject=null,this.fire("selection:created",{target:i,e:e})}t.set("active",!0)},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.Group(e.reverse(),{canvas:this}),e.addWithUpdate(),this.setActiveGroup(e,t),e.saveCoords(),this.fire("selection:created",{target:e}),this.renderAll())},_collectObjects:function(){for(var i,r=[],n=this._groupSelector.ex,s=this._groupSelector.ey,o=n+this._groupSelector.left,a=s+this._groupSelector.top,h=new fabric.Point(t(n,o),t(s,a)),c=new fabric.Point(e(n,o),e(s,a)),l=n===o&&s===a,u=this._objects.length;u--&&(i=this._objects[u],!(i&&i.selectable&&i.visible&&(i.intersectsWithRect(h,c)||i.isContainedWithinRect(h,c)||i.containsPoint(h)||i.containsPoint(c))&&(i.set("active",!0),r.push(i),l))););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t);var e=this.getActiveGroup();e&&(e.setObjectsCoords().setCoords(),e.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),function(){var t=fabric.StaticCanvas.supports("toDataURLWithQuality");fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(t){t||(t={});var e=t.format||"png",i=t.quality||1,r=t.multiplier||1,n={left:t.left||0,top:t.top||0,width:t.width||0,height:t.height||0};return this.__toDataURLWithMultiplier(e,i,n,r)},__toDataURLWithMultiplier:function(t,e,i,r){var n=this.getWidth(),s=this.getHeight(),o=(i.width||this.getWidth())*r,a=(i.height||this.getHeight())*r,h=this.getZoom(),c=h*r,l=this.viewportTransform,u=(l[4]-i.left)*r,f=(l[5]-i.top)*r,d=[c,0,0,c,u,f],g=this.interactive;this.viewportTransform=d,this.interactive&&(this.interactive=!1),n!==o||s!==a?this.setDimensions({width:o,height:a}):this.renderAll();var p=this.__toDataURL(t,e,i);return g&&(this.interactive=g),this.viewportTransform=l,this.setDimensions({width:n,height:s}),p},__toDataURL:function(e,i){var r=this.contextContainer.canvas;"jpg"===e&&(e="jpeg");var n=t?r.toDataURL("image/"+e,i):r.toDataURL("image/"+e);return n},toDataURLWithMultiplier:function(t,e,i){return this.toDataURL({format:t,multiplier:e,quality:i})}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(t,e,i){return this.loadFromJSON(t,e,i)},loadFromJSON:function(t,e,i){if(t){var r="string"==typeof t?JSON.parse(t):fabric.util.object.clone(t);this.clear();var n=this;return this._enlivenObjects(r.objects,function(){n._setBgOverlay(r,function(){delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay;for(var t in r)n[t]=r[t];e&&e()})},i),this}},_setBgOverlay:function(t,e){var i=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var n=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(i.renderAll(),e&&e())};this.__setBgOverlay("backgroundImage",t.backgroundImage,r,n),this.__setBgOverlay("overlayImage",t.overlayImage,r,n),this.__setBgOverlay("backgroundColor",t.background,r,n),this.__setBgOverlay("overlayColor",t.overlay,r,n),n()},__setBgOverlay:function(t,e,i,r){var n=this;return e?void("backgroundImage"===t||"overlayImage"===t?fabric.Image.fromObject(e,function(e){n[t]=e,i[t]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(t,!0)](e,function(){i[t]=!0,r&&r()})):void(i[t]=!0)},_enlivenObjects:function(t,e,i){var r=this;if(!t||0===t.length)return void(e&&e());var n=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(t,function(t){t.forEach(function(t,e){r.insertAt(t,e)}),r.renderOnAddRemove=n,e&&e()},null,i)},_toDataURL:function(t,e){this.clone(function(i){e(i.toDataURL(t))})},_toDataURLWithMultiplier:function(t,e,i){this.clone(function(r){i(r.toDataURLWithMultiplier(t,e))})},clone:function(t,e){var i=JSON.stringify(this.toJSON(e));this.cloneWithoutData(function(e){e.loadFromJSON(i,function(){t&&t(e)})})},cloneWithoutData:function(t){var e=fabric.document.createElement("canvas");e.width=this.getWidth(),e.height=this.getHeight();var i=new fabric.Canvas(e);i.clipTo=this.clipTo,this.backgroundImage?(i.setBackgroundImage(this.backgroundImage.src,function(){i.renderAll(),t&&t(i)}),i.backgroundImageOpacity=this.backgroundImageOpacity,i.backgroundImageStretch=this.backgroundImageStretch):t&&t(i)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.toFixed,n=e.util.string.capitalize,s=e.util.degreesToRadians,o=e.StaticCanvas.supports("setLineDash"),a=!e.isLikelyNode;e.Object||(e.Object=e.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,skewX:0,skewY:0,cornerSize:13,transparentCorners:!0,hoverCursor:null,moveCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",borderDashArray:null,cornerColor:"rgba(102,153,255,0.5)",cornerStrokeColor:null,cornerStyle:"rect",cornerDashArray:null,centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"nonzero",globalCompositeOperation:"source-over",backgroundColor:"",selectionBackgroundColor:"",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,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,excludeFromExport:!1,objectCaching:a,statefullCache:!1,noScaleCache:!0,dirty:!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 skewX skewY".split(" "),cacheProperties:"fill stroke strokeWidth strokeDashArray width height stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit fillRule backgroundColor".split(" "),initialize:function(t){t=t||{},t&&this.setOptions(t),this.objectCaching&&(this._createCacheCanvas(),this.setupState({propertySet:"cacheProperties"}))},_createCacheCanvas:function(){this._cacheCanvas=e.document.createElement("canvas"),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas()},_getCacheCanvasDimensions:function(){var t=this.canvas&&this.canvas.getZoom()||1,i=this.getObjectScaling(),r=this._getNonTransformedDimensions(),n=this.canvas&&this.canvas._isRetinaScaling()?e.devicePixelRatio:1,s=i.scaleX*t*n,o=i.scaleY*t*n,a=r.x*s,h=r.y*o;return{width:a,height:h,zoomX:s,zoomY:o}},_updateCacheCanvas:function(){if(this.noScaleCache&&this.canvas&&this.canvas._currentTransform){var t=this.canvas._currentTransform.action;if("scale"===t.slice(0,5))return!1}var e=this._getCacheCanvasDimensions(),i=e.width,r=e.height,n=e.zoomX,s=e.zoomY;return(i!==this.cacheWidth||r!==this.cacheHeight)&&(this._cacheCanvas.width=i,this._cacheCanvas.height=r,this._cacheContext.translate(i/2,r/2),this._cacheContext.scale(n,s),this.cacheWidth=i,this.cacheHeight=r,this.zoomX=n,this.zoomY=s,!0)},_initGradient:function(t){!t.fill||!t.fill.colorStops||t.fill instanceof e.Gradient||this.set("fill",new e.Gradient(t.fill)),!t.stroke||!t.stroke.colorStops||t.stroke instanceof e.Gradient||this.set("stroke",new e.Gradient(t.stroke))},_initPattern:function(t){!t.fill||!t.fill.source||t.fill instanceof e.Pattern||this.set("fill",new e.Pattern(t.fill)),!t.stroke||!t.stroke.source||t.stroke instanceof e.Pattern||this.set("stroke",new e.Pattern(t.stroke))},_initClipping:function(t){if(t.clipTo&&"string"==typeof t.clipTo){var i=e.util.getFunctionBody(t.clipTo);"undefined"!=typeof i&&(this.clipTo=new Function("ctx",i))}},setOptions:function(t){for(var e in t)this.set(e,t[e]);this._initGradient(t),this._initPattern(t),this._initClipping(t)},transform:function(t,e){this.group&&!this.group._transformDone&&this.group===this.canvas._activeGroup&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),t.rotate(s(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),t.transform(1,0,Math.tan(s(this.skewX)),1,0,0),t.transform(1,Math.tan(s(this.skewY)),0,1,0,0)},toObject:function(t){var i=e.Object.NUM_FRACTION_DIGITS,n={type:this.type,originX:this.originX,originY:this.originY,left:r(this.left,i),top:r(this.top,i),width:r(this.width,i),height:r(this.height,i),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,i),strokeDashArray:this.strokeDashArray?this.strokeDashArray.concat():this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:r(this.strokeMiterLimit,i),scaleX:r(this.scaleX,i),scaleY:r(this.scaleY,i),angle:r(this.getAngle(),i),flipX:this.flipX,flipY:this.flipY,opacity:r(this.opacity,i),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,transformMatrix:this.transformMatrix?this.transformMatrix.concat():this.transformMatrix,skewX:r(this.skewX,i),skewY:r(this.skewY,i)};return e.util.populateWithProperties(this,n,t),this.includeDefaultValues||(n=this._removeDefaultValues(n)),n},toDatalessObject:function(t){return this.toObject(t)},_removeDefaultValues:function(t){var i=e.util.getKlass(t.type).prototype,r=i.stateProperties;return r.forEach(function(e){t[e]===i[e]&&delete t[e];var r="[object Array]"===Object.prototype.toString.call(t[e])&&"[object Array]"===Object.prototype.toString.call(i[e]);r&&0===t[e].length&&0===i[e].length&&delete t[e]}),t},toString:function(){return"#"},get:function(t){return this[t]},getObjectScaling:function(){var t=this.scaleX,e=this.scaleY;if(this.group){var i=this.group.getObjectScaling();t*=i.scaleX,e*=i.scaleY}return{scaleX:t,scaleY:e}},_setObject:function(t){for(var e in t)this._set(e,t[e])},set:function(t,e){return"object"==typeof t?this._setObject(t):"function"==typeof e&&"clipTo"!==t?this._set(t,e(this.get(t))):this._set(t,e),this},_set:function(t,i){var r="scaleX"===t||"scaleY"===t;return r&&(i=this._constrainScale(i)),"scaleX"===t&&i<0?(this.flipX=!this.flipX,i*=-1):"scaleY"===t&&i<0?(this.flipY=!this.flipY,i*=-1):"shadow"!==t||!i||i instanceof e.Shadow||(i=new e.Shadow(i)),this[t]=i,this.cacheProperties.indexOf(t)>-1&&(this.dirty=!0),"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},setSourcePath:function(t){return this.sourcePath=t,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:[1,0,0,1,0,0]},render:function(t,i){0===this.width&&0===this.height||!this.visible||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),i||this.transform(t),this._setOpacity(t),this._setShadow(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.clipTo&&e.util.clipContext(this,t),this.objectCaching&&!this.group?(this.isCacheDirty(i)&&(this.statefullCache&&this.saveState({propertySet:"cacheProperties"}),this.drawObject(this._cacheContext,i),this.dirty=!1),this.drawCacheOnCanvas(t)):(this.drawObject(t,i),i&&this.objectCaching&&this.statefullCache&&this.saveState({propertySet:"cacheProperties"})),this.clipTo&&t.restore(),t.restore())},drawObject:function(t,e){this._renderBackground(t),this._setStrokeStyles(t),this._setFillStyles(t),this._render(t,e)},drawCacheOnCanvas:function(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheWidth/2,-this.cacheHeight/2)},isCacheDirty:function(t){if(!t&&this._updateCacheCanvas())return!0;if(this.dirty||this.statefullCache&&this.hasStateChanged("cacheProperties")){if(!t){var e=this._getNonTransformedDimensions();this._cacheContext.clearRect(-e.x/2,-e.y/2,e.x,e.y)}return!0}return!1},_renderBackground:function(t){if(this.backgroundColor){var e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}},_setOpacity:function(t){t.globalAlpha*=this.opacity},_setStrokeStyles:function(t){this.stroke&&(t.lineWidth=this.strokeWidth,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,t.strokeStyle=this.stroke.toLive?this.stroke.toLive(t,this):this.stroke)},_setFillStyles:function(t){this.fill&&(t.fillStyle=this.fill.toLive?this.fill.toLive(t,this):this.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),o?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){if(!(!this.active||i||this.group&&this.group!==this.canvas.getActiveGroup())){var r,n=this.getViewportTransform(),o=this.calcTransformMatrix();o=e.util.multiplyTransformMatrices(n,o),r=e.util.qrDecompose(o),t.save(),t.translate(r.translateX,r.translateY),t.lineWidth=1*this.borderScaleFactor,this.group||(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.group&&this.group===this.canvas.getActiveGroup()?(t.rotate(s(r.angle)),this.drawBordersInGroup(t,r)):(t.rotate(s(this.angle)),this.drawBorders(t)),this.drawControls(t),t.restore()}},_setShadow:function(t){if(this.shadow){var i=this.canvas&&this.canvas.viewportTransform[0]||1,r=this.canvas&&this.canvas.viewportTransform[3]||1,n=this.getObjectScaling();this.canvas&&this.canvas._isRetinaScaling()&&(i*=e.devicePixelRatio,r*=e.devicePixelRatio),t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*(i+r)*(n.scaleX+n.scaleY)/4,t.shadowOffsetX=this.shadow.offsetX*i*n.scaleX,t.shadowOffsetY=this.shadow.offsetY*r*n.scaleY}},_removeShadow:function(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)},_renderFill:function(t){if(this.fill){if(t.save(),this.fill.gradientTransform){var e=this.fill.gradientTransform;t.transform.apply(t,e)}this.fill.toLive&&t.translate(-this.width/2+this.fill.offsetX||0,-this.height/2+this.fill.offsetY||0),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore()}},_renderStroke:function(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray,this._renderDashedStroke),this.stroke.gradientTransform){var e=this.stroke.gradientTransform;t.transform.apply(t,e)}this.stroke.toLive&&t.translate(-this.width/2+this.stroke.offsetX||0,-this.height/2+this.stroke.offsetY||0),t.stroke(),t.restore()}},clone:function(t,i){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(i),t):new e.Object(this.toObject(i))},cloneAsImage:function(t,i){var r=this.toDataURL(i);return e.util.loadImage(r,function(i){t&&t(new e.Image(i))}),this},toDataURL:function(t){t||(t={});var i=e.util.createCanvasElement(),r=this.getBoundingRect();i.width=r.width,i.height=r.height,e.util.wrapElement(i,"div");var n=new e.StaticCanvas(i,{enableRetinaScaling:t.enableRetinaScaling});"jpg"===t.format&&(t.format="jpeg"),"jpeg"===t.format&&(n.backgroundColor="#fff");var s={active:this.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new e.Point(n.getWidth()/2,n.getHeight()/2),"center","center");var o=this.canvas;n.add(this);var a=n.toDataURL(t);return this.set(s).setCoords(),this.canvas=o,n.dispose(),n=null,a},isType:function(t){return this.type===t},complexity:function(){return 0},toJSON:function(t){return this.toObject(t)},setGradient:function(t,i){i||(i={});var r={colorStops:[]};r.type=i.type||(i.r1||i.r2?"radial":"linear"),r.coords={x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2},(i.r1||i.r2)&&(r.coords.r1=i.r1,r.coords.r2=i.r2),i.gradientTransform&&(r.gradientTransform=i.gradientTransform);for(var n in i.colorStops){var s=new e.Color(i.colorStops[n]);r.colorStops.push({offset:n,color:s.toRgb(),opacity:s.getAlpha()})}return this.set(t,e.Gradient.forObject(this,r))},setPatternFill:function(t){return this.set("fill",new e.Pattern(t))},setShadow:function(t){return this.set("shadow",t?new e.Shadow(t):null)},setColor:function(t){return this.set("fill",t),this},setAngle:function(t){var e=("center"!==this.originX||"center"!==this.originY)&&this.centeredRotation;return e&&this._setOriginToCenter(),this.set("angle",t),e&&this._resetOrigin(),this},centerH:function(){return this.canvas&&this.canvas.centerObjectH(this),this},viewportCenterH:function(){return this.canvas&&this.canvas.viewportCenterObjectH(this),this},centerV:function(){return this.canvas&&this.canvas.centerObjectV(this),this},viewportCenterV:function(){return this.canvas&&this.canvas.viewportCenterObjectV(this),this},center:function(){return this.canvas&&this.canvas.centerObject(this),this},viewportCenter:function(){return this.canvas&&this.canvas.viewportCenterObject(this),this},remove:function(){return this.canvas&&this.canvas.remove(this),this},getLocalPointer:function(t,i){i=i||this.canvas.getPointer(t);var r=new e.Point(i.x,i.y),n=this._getLeftTopCoords();return this.angle&&(r=e.util.rotatePoint(r,n,e.util.degreesToRadians(-this.angle))),{x:r.x-n.x,y:r.y-n.y}},_setupCompositeOperation:function(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}}),e.util.createAccessors(e.Object),e.Object.prototype.rotate=e.Object.prototype.setAngle,i(e.Object.prototype,e.Observable),e.Object.NUM_FRACTION_DIGITS=2,e.Object.__uid=0)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.degreesToRadians,e={left:-.5,center:0,right:.5},i={top:-.5,center:0,bottom:.5};fabric.util.object.extend(fabric.Object.prototype,{translateToGivenOrigin:function(t,r,n,s,o){var a,h,c,l=t.x,u=t.y;return"string"==typeof r?r=e[r]:r-=.5,"string"==typeof s?s=e[s]:s-=.5,a=s-r,"string"==typeof n?n=i[n]:n-=.5,"string"==typeof o?o=i[o]:o-=.5,h=o-n,(a||h)&&(c=this._getTransformedDimensions(),l=t.x+a*c.x,u=t.y+h*c.y),new fabric.Point(l,u)},translateToCenterPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,i,r,"center","center");return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},translateToOriginPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,"center","center",i,r);return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},getCenterPoint:function(){var t=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(t,this.originX,this.originY)},getPointByOrigin:function(t,e){var i=this.getCenterPoint();return this.translateToOriginPoint(i,t,e)},toLocalPoint:function(e,i,r){var n,s,o=this.getCenterPoint();return n="undefined"!=typeof i&&"undefined"!=typeof r?this.translateToGivenOrigin(o,"center","center",i,r):new fabric.Point(this.left,this.top),s=new fabric.Point(e.x,e.y),this.angle&&(s=fabric.util.rotatePoint(s,o,-t(this.angle))),s.subtractEquals(n)},setPositionByOrigin:function(t,e,i){var r=this.translateToCenterPoint(t,e,i),n=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",n.x),this.set("top",n.y)},adjustPosition:function(i){var r,n,s=t(this.angle),o=this.getWidth(),a=Math.cos(s)*o,h=Math.sin(s)*o;r="string"==typeof this.originX?e[this.originX]:this.originX-.5,n="string"==typeof i?e[i]:i-.5,this.left+=a*(n-r),this.top+=h*(n-r),this.setCoords(),this.originX=i},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var t=this.getCenterPoint();this.originX="center",this.originY="center",this.left=t.x,this.top=t.y},_resetOrigin:function(){var t=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY); -this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=t.x,this.top=t.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","top")}})}(),function(){function t(t){return[new fabric.Point(t.tl.x,t.tl.y),new fabric.Point(t.tr.x,t.tr.y),new fabric.Point(t.br.x,t.br.y),new fabric.Point(t.bl.x,t.bl.y)]}var e=fabric.util.degreesToRadians,i=fabric.util.multiplyTransformMatrices;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,intersectsWithRect:function(e,i){var r=t(this.oCoords),n=fabric.Intersection.intersectPolygonRectangle(r,e,i);return"Intersection"===n.status},intersectsWithObject:function(e){var i=fabric.Intersection.intersectPolygonPolygon(t(this.oCoords),t(e.oCoords));return"Intersection"===i.status||e.isContainedWithinObject(this)||this.isContainedWithinObject(e)},isContainedWithinObject:function(e){for(var i=t(this.oCoords),r=0;r<4;r++)if(!e.containsPoint(i[r]))return!1;return!0},isContainedWithinRect:function(t,e){var i=this.getBoundingRect();return i.left>=t.x&&i.left+i.width<=e.x&&i.top>=t.y&&i.top+i.height<=e.y},containsPoint:function(t){this.oCoords||this.setCoords();var e=this._getImageLines(this.oCoords),i=this._findCrossPoints(t,e);return 0!==i&&i%2===1},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s,o,a,h=0;for(var c in e)if(a=e[c],!(a.o.y=t.y&&a.d.y>=t.y||(a.o.x===a.d.x&&a.o.x>=t.x?o=a.o.x:(i=0,r=(a.d.y-a.o.y)/(a.d.x-a.o.x),n=t.y-i*t.x,s=a.o.y-r*a.o.x,o=-(n-s)/(i-r)),o>=t.x&&(h+=1),2!==h)))break;return h},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(t){var e=this.calcCoords(t);return fabric.util.makeBoundingBoxFromPoints([e.tl,e.tr,e.br,e.bl])},getWidth:function(){return this._getTransformedDimensions().x},getHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)0?Math.atan(o/s):0,l=s/Math.cos(c)/2,u=Math.cos(c+i)*l,f=Math.sin(c+i)*l,d=this.getCenterPoint(),g=t?d:fabric.util.transformPoint(d,r),p=new fabric.Point(g.x-u,g.y-f),v=new fabric.Point(p.x+s*h,p.y+s*a),b=new fabric.Point(p.x-o*a,p.y+o*h),m=new fabric.Point(g.x+u,g.y+f);if(!t)var y=new fabric.Point((p.x+b.x)/2,(p.y+b.y)/2),_=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point((m.x+v.x)/2,(m.y+v.y)/2),C=new fabric.Point((m.x+b.x)/2,(m.y+b.y)/2),S=new fabric.Point(_.x+a*this.rotatingPointOffset,_.y-h*this.rotatingPointOffset);var g={tl:p,tr:v,br:m,bl:b};return t||(g.ml=y,g.mt=_,g.mr=x,g.mb=C,g.mtr=S),g},setCoords:function(t,e){return this.oCoords=this.calcCoords(t),e||t||(this.absoluteCoords=this.calcCoords(!0)),t||this._setCornerCoords&&this._setCornerCoords(),this},_calcRotateMatrix:function(){if(this.angle){var t=e(this.angle),i=Math.cos(t),r=Math.sin(t);return[i,r,-r,i,0,0]}return[1,0,0,1,0,0]},calcTransformMatrix:function(){var t=this.getCenterPoint(),e=[1,0,0,1,t.x,t.y],r=this._calcRotateMatrix(),n=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0),s=this.group?this.group.calcTransformMatrix():[1,0,0,1,0,0];return s=i(s,e),s=i(s,r),s=i(s,n)},_calcDimensionsTransformMatrix:function(t,r,n){var s=[1,0,Math.tan(e(t)),1],o=[1,Math.tan(e(r)),0,1],a=this.scaleX*(n&&this.flipX?-1:1),h=this.scaleY*(n&&this.flipY?-1:1),c=[a,0,0,h],l=i(c,s,!0);return i(l,o,!0)}})}(),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(t){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,t):this.canvas.sendBackwards(this,t),this},bringForward:function(t){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,t):this.canvas.bringForward(this,t),this},moveTo:function(t){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,t):this.canvas.moveTo(this,t),this}}),function(){function t(t,e){if(e){if(e.toLive)return t+": url(#SVGID_"+e.id+"); ";var i=new fabric.Color(e),r=t+": "+i.toRgb()+"; ",n=i.getAlpha();return 1!==n&&(r+=t+"-opacity: "+n.toString()+"; "),r}return t+": none; "}fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(e){var i=this.fillRule,r=this.strokeWidth?this.strokeWidth:"0",n=this.strokeDashArray?this.strokeDashArray.join(" "):"none",s=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h="undefined"!=typeof this.opacity?this.opacity:"1",c=this.visible?"":" visibility: hidden;",l=e?"":this.getSvgFilter(),u=t("fill",this.fill),f=t("stroke",this.stroke);return[f,"stroke-width: ",r,"; ","stroke-dasharray: ",n,"; ","stroke-linecap: ",s,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",i,"; ","opacity: ",h,";",l,c].join("")},getSvgFilter:function(){return this.shadow?"filter: url(#SVGID_"+this.shadow.id+");":""},getSvgId:function(){return this.id?'id="'+this.id+'" ':""},getSvgTransform:function(){if(this.group&&"path-group"===this.group.type)return"";var t=fabric.util.toFixed,e=this.getAngle(),i=this.getSkewX()%360,r=this.getSkewY()%360,n=this.getCenterPoint(),s=fabric.Object.NUM_FRACTION_DIGITS,o="path-group"===this.type?"":"translate("+t(n.x,s)+" "+t(n.y,s)+")",a=0!==e?" rotate("+t(e,s)+")":"",h=1===this.scaleX&&1===this.scaleY?"":" scale("+t(this.scaleX,s)+" "+t(this.scaleY,s)+")",c=0!==i?" skewX("+t(i,s)+")":"",l=0!==r?" skewY("+t(r,s)+")":"",u="path-group"===this.type?this.width:0,f=this.flipX?" matrix(-1 0 0 1 "+u+" 0) ":"",d="path-group"===this.type?this.height:0,g=this.flipY?" matrix(1 0 0 -1 0 "+d+")":"";return[o,a,h,f,g,c,l].join("")},getSvgTransformMatrix:function(){return this.transformMatrix?" matrix("+this.transformMatrix.join(" ")+") ":""},_createBaseSVGMarkup:function(){var t=[];return this.fill&&this.fill.toLive&&t.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&t.push(this.stroke.toSVG(this,!1)),this.shadow&&t.push(this.shadow.toSVG(this)),t}})}(),function(){function t(t,e,r){var n={},s=!0;r.forEach(function(e){n[e]=t[e]}),i(t[e],n,s)}function e(t,i,r){if(!fabric.isLikelyNode&&t instanceof Element)return t===i;if(t instanceof Array){if(t.length!==i.length)return!1;for(var n=0,s=t.length;n\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e){var n=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),s=[n.x1||0,n.y1||0,n.x2||0,n.y2||0];return new i.Line(s,r(n,e))},i.Line.fromObject=function(t,e){var r=[t.x1,t.y1,t.x2,t.y2],n=new i.Line(r,t);return e&&e(n),n}}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){return"radius"in t&&t.radius>=0}var i=t.fabric||(t.fabric={}),r=Math.PI,n=i.util.object.extend;if(i.Circle)return void i.warn("fabric.Circle is already defined.");var s=i.Object.prototype.cacheProperties.concat();s.push("radius"),i.Circle=i.util.createClass(i.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*r,cacheProperties:s,initialize:function(t){this.callSuper("initialize",t),this.set("radius",t&&t.radius||0)},_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,n=0,s=(this.endAngle-this.startAngle)%(2*r);if(0===s)this.group&&"path-group"===this.group.type&&(i=this.left+this.radius,n=this.top+this.radius),e.push("\n');else{var o=Math.cos(this.startAngle)*this.radius,a=Math.sin(this.startAngle)*this.radius,h=Math.cos(this.endAngle)*this.radius,c=Math.sin(this.endAngle)*this.radius,l=s>r?"1":"0";e.push('\n')}return t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.arc(e?this.left+this.radius:0,e?this.top+this.radius:0,this.radius,this.startAngle,this.endAngle,!1),this._renderFill(t),this._renderStroke(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)},complexity:function(){return 1}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r){r||(r={});var s=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(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 i.Circle(n(s,r));return o.left-=o.radius,o.top-=o.radius,o},i.Circle.fromObject=function(t,e){var r=new i.Circle(t);return e&&e(r),r}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});return e.Triangle?void e.warn("fabric.Triangle is already defined"):(e.Triangle=e.util.createClass(e.Object,{type:"triangle",initialize:function(t){this.callSuper("initialize",t),this.set("width",t&&t.width||100).set("height",t&&t.height||100)},_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=this.width/2,r=this.height/2;t.beginPath(),e.util.drawDashedLine(t,-i,r,0,-r,this.strokeDashArray),e.util.drawDashedLine(t,0,-r,i,r,this.strokeDashArray),e.util.drawDashedLine(t,i,r,-i,r,this.strokeDashArray),t.closePath()},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.width/2,r=this.height/2,n=[-i+" "+r,"0 "+-r,i+" "+r].join(",");return e.push("'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),void(e.Triangle.fromObject=function(t,i){var r=new e.Triangle(t);return i&&i(r),r}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=2*Math.PI,r=e.util.object.extend;if(e.Ellipse)return void e.warn("fabric.Ellipse is already defined.");var n=e.Object.prototype.cacheProperties.concat();n.push("rx","ry"),e.Ellipse=e.util.createClass(e.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:n,initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,r=0;return this.group&&"path-group"===this.group.type&&(i=this.left+this.rx,r=this.top+this.ry),e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(e?this.left+this.rx:0,e?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)},complexity:function(){return 1}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i){i||(i={});var n=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Ellipse(r(n,i));return s.top-=s.ry,s.left-=s.rx,s},e.Ellipse.fromObject=function(t,i){var r=new e.Ellipse(t);return i&&i(r),r}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;if(e.Rect)return void e.warn("fabric.Rect is already defined");var r=e.Object.prototype.stateProperties.concat();r.push("rx","ry"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(t){this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t,e){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var i=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,n=this.width,s=this.height,o=e?this.left:-this.width/2,a=e?this.top:-this.height/2,h=0!==i||0!==r,c=.4477152502;t.beginPath(),t.moveTo(o+i,a),t.lineTo(o+n-i,a),h&&t.bezierCurveTo(o+n-c*i,a,o+n,a+c*r,o+n,a+r),t.lineTo(o+n,a+s-r),h&&t.bezierCurveTo(o+n,a+s-c*r,o+n-c*i,a+s,o+n-i,a+s),t.lineTo(o+i,a+s),h&&t.bezierCurveTo(o+c*i,a+s,o,a+s-c*r,o,a+s-r),t.lineTo(o,a+r),h&&t.bezierCurveTo(o,a+c*r,o+c*i,a,o+i,a),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=-this.width/2,r=-this.height/2,n=this.width,s=this.height;t.beginPath(),e.util.drawDashedLine(t,i,r,i+n,r,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r,i+n,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r+s,i,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i,r+s,i,r,this.strokeDashArray),t.closePath()},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.left,r=this.top;return this.group&&"path-group"===this.group.type||(i=-this.width/2,r=-this.height/2),e.push("\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r){if(!t)return null;r=r||{};var n=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Rect(i(r?e.util.object.clone(r):{},n));return s.visible=s.visible&&s.width>0&&s.height>0,s},e.Rect.fromObject=function(t,i){var r=new e.Rect(t);return i&&i(r),r}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});if(e.Polyline)return void e.warn("fabric.Polyline is already defined");var i=e.Object.prototype.cacheProperties.concat();i.push("points"),e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,cacheProperties:i,initialize:function(t,i){return e.Polygon.prototype.initialize.call(this,t,i)},_calcDimensions:function(){return e.Polygon.prototype._calcDimensions.call(this)},toObject:function(t){return e.Polygon.prototype.toObject.call(this,t)},toSVG:function(t){return e.Polygon.prototype.toSVG.call(this,t)},_render:function(t,i){e.Polygon.prototype.commonRender.call(this,t,i)&&(this._renderFill(t),this._renderStroke(t))},_renderDashedStroke:function(t){var i,r;t.beginPath();for(var n=0,s=this.points.length;n\n'),t?t(r.join("")):r.join("")},_render:function(t,e){this.commonRender(t,e)&&(this._renderFill(t),(this.stroke||this.strokeDashArray)&&(t.closePath(),this._renderStroke(t)))},commonRender:function(t,e){var i,r=this.points.length,n=e?0:this.pathOffset.x,s=e?0:this.pathOffset.y;if(!r||isNaN(this.points[r-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-n,this.points[0].y-s);for(var o=0;o"},toObject:function(t){var e=n(this.callSuper("toObject",["sourcePath","pathOffset"].concat(t)),{path:this.path.map(function(t){return t.slice()})});return e},toDatalessObject:function(t){var e=this.toObject(t);return this.sourcePath&&(e.path=this.sourcePath),delete e.sourcePath,e},toSVG:function(t){for(var e=[],i=this._createBaseSVGMarkup(),r="",n=0,s=this.path.length;n\n"),t?t(i.join("")):i.join("")},complexity:function(){return this.path.length},_parsePath:function(){for(var t,e,i,r,n,s=[],o=[],c=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi,l=0,u=this.path.length;lp)for(var b=1,m=n.length;b\n");for(var s=0,o=e.length;s\n"),t?t(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var t=this.getObjects()[0].get("fill")||"";return"string"==typeof t&&(t=t.toLowerCase(),this.getObjects().every(function(e){var i=e.get("fill")||"";return"string"==typeof i&&i.toLowerCase()===t}))},complexity:function(){return this.paths.reduce(function(t,e){return t+(e&&e.complexity?e.complexity():0)},0)},getObjects:function(){return this.paths}}),e.PathGroup.fromObject=function(t,i){"string"==typeof t.paths?e.loadSVGFromURL(t.paths,function(r){var n=t.paths;delete t.paths;var s=e.util.groupSVGElements(r,t,n);i(s)}):e.util.enlivenObjects(t.paths,function(r){delete t.paths,i(new e.PathGroup(r,t))})},void(e.PathGroup.async=!0))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max;if(!e.Group){var s={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};e.Group=e.util.createClass(e.Object,e.Collection,{type:"group",strokeWidth:0,subTargetCheck:!1,initialize:function(t,e,i){e=e||{},this._objects=[],i&&this.callSuper("initialize",e),this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},e.originX&&(this.originX=e.originX),e.originY&&(this.originY=e.originY),i?this._updateObjectsCoords(!0):(this._calcBounds(),this._updateObjectsCoords(),this.callSuper("initialize",e)),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(t){for(var e=this.getCenterPoint(),i=this._objects.length;i--;)this._updateObjectCoords(this._objects[i],e,t)},_updateObjectCoords:function(t,e,i){if(t.__origHasControls=t.hasControls,t.hasControls=!1,!i){var r=t.getLeft(),n=t.getTop(),s=!0;t.set({originalLeft:r,originalTop:n,left:r-e.x,top:n-e.y}),t.setCoords(s)}},toString:function(){return"#"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,this},_setObjectActive:function(t){t.set("active",!0),t.group=this},removeWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),this.forEachObject(this._setObjectActive,this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group,t.set("active",!1)},delegatedProperties:{fill:!0,stroke:!0,strokeWidth:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(t,e){var i=this._objects.length;if(this.delegatedProperties[t]||"canvas"===t)for(;i--;)this._objects[i].set(t,e);else for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){var e=this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toObject(t);return e.includeDefaultValues=i,r});return i(this.callSuper("toObject",t),{objects:e})},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},drawObject:function(t){for(var e=0,i=this._objects.length;e\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")},get:function(t){if(t in s){if(this[t])return this[t];for(var e=0,i=this._objects.length;e\n',"\n"),this.stroke||this.strokeDashArray){var o=this.fill;this.fill=null,e.push("\n'),this.fill=o}return e.push("\n"),t?t(e.join("")):e.join("")},getSrc:function(t){var e=t?this._element:this._originalElement;return e?fabric.isLikelyNode?e._src:e.src:this.src||""},setSrc:function(t,e,i){fabric.util.loadImage(t,function(t){return this.setElement(t,e,i)},this,i&&i.crossOrigin)},toString:function(){return'#'},applyFilters:function(t,e,i,r){if(e=e||this.filters,i=i||this._originalElement){var n,s,o=fabric.util.createImage(),a=this.canvas?this.canvas.getRetinaScaling():fabric.devicePixelRatio,h=this.minimumScaleTrigger/a,c=this;if(0===e.length)return this._element=i,t&&t(this),i;var l=fabric.util.createCanvasElement();return l.width=i.width,l.height=i.height,l.getContext("2d").drawImage(i,0,0,i.width,i.height),e.forEach(function(t){t&&(r?(n=c.scaleX0?90*Math.round((t-1)/90):90*Math.round(t/90)},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(t){t=t||{};var e=function(){},i=t.onComplete||e,r=t.onChange||e,n=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(t){n.setAngle(t),r()},onComplete:function(){n.setCoords(),i()},onStart:function(){n.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(t){return t.straighten(),this.renderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.Brightness=n(r.BaseFilter,{type:"Brightness",initialize:function(t){t=t||{},this.brightness=t.brightness||0},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.brightness,s=0,o=r.length;sb||o<0||o>v||(h=4*(a*v+o),c=l[S*d+w],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,n+=p[h+3]*c);y[s]=e,y[s+1]=i,y[s+2]=r,y[s+3]=n+_*(255-n)}u.putImageData(m,0,0)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=function(t){return new e.Image.filters.Convolute(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.GradientTransparency=n(r.BaseFilter,{type:"GradientTransparency",initialize:function(t){t=t||{},this.threshold=t.threshold||100},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.threshold,s=r.length,o=0,a=r.length;o-1?t.channel:0},applyTo:function(t){if(this.mask){var i,r=t.getContext("2d"),n=r.getImageData(0,0,t.width,t.height),s=n.data,o=this.mask.getElement(),a=e.util.createCanvasElement(),h=this.channel,c=n.width*n.height*4;a.width=t.width,a.height=t.height,a.getContext("2d").drawImage(o,0,0,t.width,t.height);var l=a.getContext("2d").getImageData(0,0,t.width,t.height),u=l.data;for(i=0;ic&&i>c&&r>c&&l(e-i)i&&(l=2,f=-1),a>n&&(u=2,d=-1),h=c.getImageData(0,0,i,n),t.width=o(s,i),t.height=o(a,n),c.putImageData(h,0,0);!g||!p;)i=v,n=b,s*ft)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return h(e)*h(i)/e/i}}function f(t){var h,c,u,d,g,j,M,P,A,D,E;for(T.x=(t+.5)*y,k.x=r(T.x),h=0;h=e)){D=r(1e3*s(c-T.x)),O[D]||(O[D]={});for(var I=k.y-w;I<=k.y+w;I++)I<0||I>=o||(E=r(1e3*s(I-T.y)),O[D][E]||(O[D][E]=m(n(i(D*x,2)+i(E*C,2))/1e3)),u=O[D][E],u>0&&(d=4*(I*e+c),g+=u,j+=u*v[d],M+=u*v[d+1],P+=u*v[d+2],A+=u*v[d+3]))}d=4*(h*a+t),b[d]=j/g,b[d+1]=M/g,b[d+2]=P/g,b[d+3]=A/g}return++t1&&L<-1||(x=2*L*L*L-3*L*L+1,x>0&&(I=4*(E+M*e),k+=x*p[I+3],S+=x,p[I+3]<255&&(x=x*p[I+3]/250),w+=x*p[I],O+=x*p[I+1],T+=x*p[I+2],C+=x))}b[_]=w/C,b[_+1]=O/C,b[_+2]=T/C,b[_+3]=k/S}return v},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=function(t){return new e.Image.filters.Resize(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.ColorMatrix=n(r.BaseFilter,{type:"ColorMatrix",initialize:function(t){t||(t={}),this.matrix=t.matrix||[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]},applyTo:function(t){var e,i,r,n,s,o=t.getContext("2d"),a=o.getImageData(0,0,t.width,t.height),h=a.data,c=h.length,l=this.matrix;for(e=0;e'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions");return t.width+=2*this.fontSize,t.height+=2*this.fontSize,t},_render:function(t){this._setTextStyles(t),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._renderTextLinesBackground(t),this._renderText(t),this._renderTextDecoration(t)},_renderText:function(t){this._renderTextFill(t),this._renderTextStroke(t)},_setTextStyles:function(t){t.textBaseline="alphabetic",t.font=this._getFontDeclaration()},_getTextHeight:function(){return this._getHeightOfSingleLine()+(this._textLines.length-1)*this._getHeightOfLine()},_getTextWidth:function(t){for(var e=this._getLineWidth(t,0),i=1,r=this._textLines.length;ie&&(e=n)}return e},_renderChars:function(t,e,i,r,n){var s,o,a=t.slice(0,-4);if(this[a].toLive){var h=-this.width/2+this[a].offsetX||0,c=-this.height/2+this[a].offsetY||0;e.save(),e.translate(h,c),r-=h,n-=c}if(0!==this.charSpacing){var l=this._getWidthOfCharSpacing();i=i.split("");for(var u=0,f=i.length;u0?o:0}else e[t](i,r,n);this[a].toLive&&e.restore()},_renderTextLine:function(t,e,i,r,n,s){n-=this.fontSize*this._fontSizeFraction;var o=this._getLineWidth(e,s);if("justify"!==this.textAlign||this.width0?u/f:0,g=0,p=0,v=h.length;p0?n:0},_getLeftOffset:function(){return-this.width/2},_getTopOffset:function(){return-this.height/2},isEmptyStyles:function(){return!0},_renderTextCommon:function(t,e){for(var i=0,r=this._getLeftOffset(),n=this._getTopOffset(),s=0,o=this._textLines.length;s0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;t.fillStyle=s,this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearDimensionCache:function(){var t=!1;return this._forceClearCache?(this._forceClearCache=!1,this.dirty=!0,!0):(t=this.hasStateChanged("_dimensionAffectingProps"),t&&(this.saveState({propertySet:"_dimensionAffectingProps"}),this.dirty=!0),t)},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_getWidthOfCharSpacing:function(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0},_measureLine:function(t,e){var i,r,n=this._textLines[e],s=t.measureText(n).width,o=0;return 0!==this.charSpacing&&(i=n.split("").length,o=(i-1)*this._getWidthOfCharSpacing()),r=s+o,r>0?r:0},_renderTextDecoration:function(t){function e(e){var n,s,o,a,h,c,l,u=0;for(n=0,s=r._textLines.length;n-1&&n.push(.85),this.textDecoration.indexOf("line-through")>-1&&n.push(.43),this.textDecoration.indexOf("overline")>-1&&n.push(-.12),n.length>0&&e(n)}},_getFontDeclaration:function(){return[e.isLikelyNode?this.fontWeight:this.fontStyle,e.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",e.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(t,e){this.visible&&(this._shouldClearDimensionCache()&&(this._setTextStyles(t),this._initDimensions(t)),this.callSuper("render",t,e))},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=["text","fontSize","fontWeight","fontFamily","fontStyle","lineHeight","textDecoration","textAlign","textBackgroundColor","charSpacing"].concat(t);return this.callSuper("toObject",e)},toSVG:function(t){this.ctx||(this.ctx=e.util.createCanvasElement().getContext("2d"));var i=this._createBaseSVGMarkup(),r=this._getSVGLeftTopOffsets(this.ctx),n=this._getSVGTextAndBg(r.textTop,r.textLeft);return this._wrapSVGTextAndBg(i,n),t?t(i.join("")):i.join("")},_getSVGLeftTopOffsets:function(t){var e=this._getHeightOfLine(t,0),i=-this.width/2,r=0;return{textLeft:i+(this.group&&"path-group"===this.group.type?this.left:0),textTop:r+(this.group&&"path-group"===this.group.type?-this.top:0),lineTop:e}},_wrapSVGTextAndBg:function(t,e){var i=!0,r=this.getSvgFilter(),n=""===r?"":' style="'+r+'"';t.push("\t\n",e.textBgRects.join(""),"\t\t\n',e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i=[],r=[],n=0;this._setSVGBg(r);for(var s=0,o=this._textLines.length;s",e.util.string.escapeXml(this._textLines[t]),"\n")},_setSVGTextLineJustifed:function(t,i,s,o){var a=e.util.createCanvasElement().getContext("2d");this._setTextStyles(a);var h,c,l=this._textLines[t],u=l.split(/\s+/),f=this._getWidthOfWords(a,u.join("")),d=this.width-f,g=u.length-1,p=g>0?d/g:0,v=this._getFillAttributes(this.fill);for(o+=this._getLineLeftOffset(this._getLineWidth(a,t)),t=0,c=u.length;t",e.util.string.escapeXml(h),"\n"),o+=this._getWidthOfWords(a,h)+p},_setSVGTextLineBg:function(t,e,i,s,o){t.push("\t\t\n')},_setSVGBg:function(t){this.backgroundColor&&t.push("\t\t\n')},_getFillAttributes:function(t){var i=t&&"string"==typeof t?new e.Color(t):"";return i&&i.getSource()&&1!==i.getAlpha()?'opacity="'+i.getAlpha()+'" fill="'+i.setAlpha(1).toRgb()+'"':'fill="'+t+'"'},_set:function(t,e){this.callSuper("_set",t,e),this._dimensionAffectingProps.indexOf(t)>-1&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),e.Text.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),e.Text.DEFAULT_SVG_FONT_SIZE=16,e.Text.fromElement=function(t,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t,r){var n=new e.Text(t.text,i(t));return r&&r(n),n},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=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,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r0?a:0,lineLeft:r},this.cursorOffsetCache=i,this.cursorOffsetCache},renderCursor:function(t,e){var i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(e,r)):t.leftOffset,a=this.scaleX*this.canvas.getZoom(),h=this.cursorWidth/a;e.fillStyle=this.getCurrentCharColor(r,n),e.globalAlpha=this.__isMousedown?1:this._currentCursorOpacity,e.fillRect(t.left+o-h/2,t.top+t.topOffset,h,s)},renderSelection:function(t,e,i){i.fillStyle=this.selectionColor;for(var r=this.get2DCursorLocation(this.selectionStart),n=this.get2DCursorLocation(this.selectionEnd),s=r.lineIndex,o=n.lineIndex,a=s;a<=o;a++){var h=this._getLineLeftOffset(this._getLineWidth(i,a))||0,c=this._getHeightOfLine(this.ctx,a),l=0,u=0,f=this._textLines[a];if(a===s){for(var d=0,g=f.length;d=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u>0?u:0,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0;var a,h,c=this._getHeightOfLine(e,s),l="";e.save(),n-=c/this.lineHeight*this._fontSizeFraction;for(var u=o,f=i.length+o;u<=f;u++)a=a||this.getCurrentCharStyle(s,u),h=this.getCurrentCharStyle(s,u+1),(this._hasStyleChanged(a,h)||u===f)&&(this._renderChar(t,e,s,u-1,l,r,n,c),l="",a=h),l+=i[u-o];e.restore()},_renderCharsFast:function(t,e,i,r,n){"fillText"===t&&this.fill&&this.callSuper("_renderChars",t,e,i,r,n),"strokeText"===t&&(this.stroke&&this.strokeWidth>0||this.skipFillStrokeCheck)&&this.callSuper("_renderChars",t,e,i,r,n)},_renderChar:function(t,e,i,r,n,s,o,a){var h,c,l,u,f,d,g,p,v,b=this._getStyleDeclaration(i,r);if(b?(c=this._getHeightOfChar(e,n,i,r),u=b.stroke,l=b.fill,d=b.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,b&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,b||null),d=d||this.textDecoration,b&&b.textBackgroundColor&&this._removeShadow(e),0!==this.charSpacing){p=this._getWidthOfCharSpacing(),g=n.split(""),h=0;for(var m,y=0,_=g.length;y<_;y++)m=g[y],l&&e.fillText(m,s+h,o),u&&e.strokeText(m,s+h,o),v=e.measureText(m).width+p,h+=v>0?v:0}else l&&e.fillText(n,s,o),u&&e.strokeText(n,s,o);(d||""!==d)&&(f=this._fontSizeFraction*a/this.lineHeight,this._renderCharDecoration(e,d,s,o,f,h,c)),b&&e.restore(),e.translate(h,0)},_hasStyleChanged:function(t,e){return t.fill!==e.fill||t.fontSize!==e.fontSize||t.textBackgroundColor!==e.textBackgroundColor||t.textDecoration!==e.textDecoration||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth},_renderCharDecoration:function(t,e,i,r,n,s,o){if(e){var a,h,c=o/15,l={underline:r+o/10,"line-through":r-o*(this._fontSizeFraction+this._fontSizeMult-1)+c,overline:r-(this._fontSizeMult-this._fontSizeFraction)*o},u=["underline","line-through","overline"];for(a=0;a-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset();t.save();for(var l=0,u=this._textLines.length;l0?n:0},_getHeightOfChar:function(t,e,i){var r=this._getStyleDeclaration(e,i);return r&&r.fontSize?r.fontSize:this.fontSize},_getWidthOfCharsAt:function(t,e,i){var r,n,s=0;for(r=0;r0?i:0},_getWidthOfSpace:function(t,e){if(this.__widthOfSpace[e])return this.__widthOfSpace[e];var i=this._textLines[e],r=this._getWidthOfWords(t,i,e,0),n=this.width-r,s=i.length-i.replace(this._reSpacesAndTabs,"").length,o=Math.max(n/s,t.measureText(" ").width);return this.__widthOfSpace[e]=o,o},_getWidthOfWords:function(t,e,i,r){for(var n=0,s=0;sr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},_updateTextarea:function(){if(this.hiddenTextarea&&!this.inCompositionMode&&(this.cursorOffsetCache={},this.hiddenTextarea.value=this.text,this.hiddenTextarea.selectionStart=this.selectionStart,this.hiddenTextarea.selectionEnd=this.selectionEnd,this.selectionStart===this.selectionEnd)){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top,this.hiddenTextarea.style.fontSize=t.fontSize}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.text.split(""),e=this._getCursorBoundaries(t,"cursor"),i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(this.ctx,r)):e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.upperCanvasEl,l=c.width-s,u=c.height-s;return h=fabric.util.transformPoint(h,a),h=fabric.util.transformPoint(h,this.canvas.viewportTransform),h.x<0&&(h.x=0),h.x>l&&(h.x=l),h.y<0&&(h.y=0),h.y>u&&(h.y=u),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea.blur&&this.hiddenTextarea.blur(),this.hiddenTextarea&&this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.selectionStart=t,this.selectionEnd=t},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&this._removeCharsFromTo(this.selectionStart,this.selectionEnd),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")},setSelectionStartEndWithShift:function(t,e,i){i<=t?(e===t?this._selectionDirection="left":"right"===this._selectionDirection&&(this._selectionDirection="left",this.selectionEnd=t),this.selectionStart=i):i>t&&it?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),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(t){this.__newClickTime=+new Date;var e=this.canvas.getPointer(t.e);this.isTripleClick(e)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this._fireSelectionChanged(),this._updateTextarea()},getSelectionStartFromPointer:function(t){for(var e,i,r=this.getLocalPointer(t),n=0,s=0,o=0,a=0,h=0,c=this._textLines.length;hs?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.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"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},_getWidthBeforeCursor:function(t,e){for(var i,r=this._textLines[t].slice(0,e),n=this._getLineWidth(this.ctx,t),s=this._getLineLeftOffset(n),o=0,a=r.length;oe){i=!0;var f=o-u,d=o,g=Math.abs(f-e),p=Math.abs(d-e);a=p=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){var i="get"+t+"CursorOffset",r=this[i](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(r):this.moveCursorWithoutShift(r),0!==r&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==typeof r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,i+=e.shiftKey?"Shift":"outShift",this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this.text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(t):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.clone;e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:2,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,noScaleCache:!1,initialize:function(t,i){this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this.ctx=this.objectCaching?this._cacheContext:e.util.createCanvasElement().getContext("2d"),this._dimensionAffectingProps.push("width")},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t),this.clearContextTop()),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(t),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n0?(e=0,i++,t++):" "===this.text[i]&&n>0&&(e++,i++),r[n]={line:t,offset:e},i+=this._textLines[n].length,e+=this._textLines[n].length;return r},_getStyleDeclaration:function(t,e,i){if(this._styleMap){var r=this._styleMap[t];if(!r)return i?{}:null;t=r.line,e=r.offset+e}return this.callSuper("_getStyleDeclaration",t,e,i)},_setStyleDeclaration:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,this.styles[t][e]=i},_deleteStyleDeclaration:function(t,e){var i=this._styleMap[t];t=i.line,e=i.offset+e,delete this.styles[t][e]},_getLineStyle:function(t){var e=this._styleMap[t];return this.styles[e.line]},_setLineStyle:function(t,e){var i=this._styleMap[t];this.styles[i.line]=e},_deleteLineStyle:function(t){var e=this._styleMap[t];delete this.styles[e.line]},_wrapText:function(t,e){var i,r=e.split(this._reNewline),n=[];for(i=0;i=this.width&&!d?(n.push(s),s="",r=l,d=!0):r+=g,d||(s+=c),s+=a,u=this._measureText(t,c,i,h),h++,d=!1,l>f&&(f=l);return p&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f-g),n},_splitTextIntoLines:function(t){t=t||this.ctx;var e=this.textAlign;this._styleMap=null,t.save(),this._setTextStyles(t),this.textAlign="left";var i=this._wrapText(t,this.text);return this.textAlign=e,t.restore(),this._textLines=i,this._styleMap=this._generateStyleMap(),i},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){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(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height,i=i||{},i.nodeCanvas=s,i.nodeCacheCanvas=o;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.nodeCanvas=s,h.nodeCacheCanvas=o,h.contextContainer=s.getContext("2d"),h.contextCache=o.getContext("2d"),h.Font=Canvas.Font,h};var originaInitStatic=fabric.StaticCanvas.prototype._initStatic;fabric.StaticCanvas.prototype._initStatic=function(t,e){t=t||fabric.document.createElement("canvas"),this.nodeCanvas=new Canvas(t.width,t.height),this.nodeCacheCanvas=new Canvas(t.width,t.height), -originaInitStatic.call(this,t,e),this.contextContainer=this.nodeCanvas.getContext("2d"),this.contextCache=this.nodeCacheCanvas.getContext("2d"),this.Font=Canvas.Font},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)},fabric.StaticCanvas.prototype._initRetinaScaling=function(){if(this._isRetinaScaling())return this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.nodeCanvas.width=this.width*fabric.devicePixelRatio,this.nodeCanvas.height=this.height*fabric.devicePixelRatio,this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio),this},fabric.Canvas&&(fabric.Canvas.prototype._initRetinaScaling=fabric.StaticCanvas.prototype._initRetinaScaling);var origSetBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension;fabric.StaticCanvas.prototype._setBackstoreDimension=function(t,e){return origSetBackstoreDimension.call(this,t,e),this.nodeCanvas[t]=e,this},fabric.Canvas&&(fabric.Canvas.prototype._setBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension)}}(); \ No newline at end of file +var fabric=fabric||{version:"1.7.3"};"undefined"!=typeof exports&&(exports.fabric=fabric),"undefined"!=typeof document&&"undefined"!=typeof window?(fabric.document=document,fabric.window=window,window.fabric=fabric):(fabric.document=require("jsdom").jsdom(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E")),fabric.document.createWindow?fabric.window=fabric.document.createWindow():fabric.window=fabric.document.parentWindow),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode="undefined"!=typeof Buffer&&"undefined"==typeof window,fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id"],fabric.DPI=96,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",fabric.fontPaths={},fabric.charWidthsCache={},fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,function(){function t(t,e){if(this.__eventListeners[t]){var i=this.__eventListeners[t];e?i[i.indexOf(e)]=!1:fabric.util.array.fill(i,!1)}}function e(t,e){if(this.__eventListeners||(this.__eventListeners={}),1===arguments.length)for(var i in t)this.on(i,t[i]);else this.__eventListeners[t]||(this.__eventListeners[t]=[]),this.__eventListeners[t].push(e);return this}function i(e,i){if(this.__eventListeners){if(0===arguments.length)for(e in this.__eventListeners)t.call(this,e);else if(1===arguments.length&&"object"==typeof arguments[0])for(var r in e)t.call(this,r,e[r]);else t.call(this,e,i);return this}}function r(t,e){if(this.__eventListeners){var i=this.__eventListeners[t];if(i){for(var r=0,n=i.length;r-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},fabric.CommonMethods={_setOptions:function(t){for(var e in t)this.set(e,t[e])},_initGradient:function(t,e){!t||!t.colorStops||t instanceof fabric.Gradient||this.set(e,new fabric.Gradient(t))},_initPattern:function(t,e,i){!t||!t.source||t instanceof fabric.Pattern?i&&i():this.set(e,new fabric.Pattern(t,i))},_initClipping:function(t){if(t.clipTo&&"string"==typeof t.clipTo){var e=fabric.util.getFunctionBody(t.clipTo);"undefined"!=typeof e&&(this.clipTo=new Function("ctx",e))}},_setObject:function(t){for(var e in t)this._set(e,t[e])},set:function(t,e){return"object"==typeof t?this._setObject(t):"function"==typeof e&&"clipTo"!==t?this._set(t,e(this.get(t))):this._set(t,e),this},_set:function(t,e){this[t]=e},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},get:function(t){return this[t]}},function(t){var e=Math.sqrt,i=Math.atan2,r=Math.pow,n=Math.abs,s=Math.PI/180;fabric.util={removeFromArray:function(t,e){var i=t.indexOf(e);return i!==-1&&t.splice(i,1),t},getRandomInt:function(t,e){return Math.floor(Math.random()*(e-t+1))+t},degreesToRadians:function(t){return t*s},radiansToDegrees:function(t){return t/s},rotatePoint:function(t,e,i){t.subtractEquals(e);var r=fabric.util.rotateVector(t,i);return new fabric.Point(r.x,r.y).addEquals(e)},rotateVector:function(t,e){var i=Math.sin(e),r=Math.cos(e),n=t.x*r-t.y*i,s=t.x*i+t.y*r;return{x:n,y:s}},transformPoint:function(t,e,i){return i?new fabric.Point(e[0]*t.x+e[2]*t.y,e[1]*t.x+e[3]*t.y):new fabric.Point(e[0]*t.x+e[2]*t.y+e[4],e[1]*t.x+e[3]*t.y+e[5])},makeBoundingBoxFromPoints:function(t){var e=[t[0].x,t[1].x,t[2].x,t[3].x],i=fabric.util.array.min(e),r=fabric.util.array.max(e),n=Math.abs(i-r),s=[t[0].y,t[1].y,t[2].y,t[3].y],o=fabric.util.array.min(s),a=fabric.util.array.max(s),h=Math.abs(o-a);return{left:i,top:o,width:n,height:h}},invertTransform:function(t){var e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0]],r=fabric.util.transformPoint({x:t[4],y:t[5]},i,!0);return i[4]=-r.x,i[5]=-r.y,i},toFixed:function(t,e){return parseFloat(Number(t).toFixed(e))},parseUnit:function(t,e){var i=/\D{0,2}$/.exec(t),r=parseFloat(t);switch(e||(e=fabric.Text.DEFAULT_SVG_FONT_SIZE),i[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*e;default:return r}},falseFunction:function(){return!1},getKlass:function(t,e){return t=fabric.util.string.camelize(t.charAt(0).toUpperCase()+t.slice(1)),fabric.util.resolveNamespace(e)[t]},resolveNamespace:function(e){if(!e)return fabric;var i,r=e.split("."),n=r.length,s=t||fabric.window;for(i=0;ir;)r+=a[d++%f],r>l&&(r=l),t[g?"lineTo":"moveTo"](r,0),g=!g;t.restore()},createCanvasElement:function(t){return t||(t=fabric.document.createElement("canvas")),t.getContext||"undefined"==typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(t),t},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(t){var e,i,r,n,s,o=t.prototype;for(e=o.stateProperties.length;e--;)i=o.stateProperties[e],r=i.charAt(0).toUpperCase()+i.slice(1),n="set"+r,s="get"+r,o[s]||(o[s]=function(t){return new Function('return this.get("'+t+'")')}(i)),o[n]||(o[n]=function(t){return new Function("value",'return this.set("'+t+'", value)')}(i))},clipContext:function(t,e){e.save(),e.beginPath(),t.clipTo(e),e.clip()},multiplyTransformMatrices:function(t,e,i){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]]},qrDecompose:function(t){var n=i(t[1],t[0]),o=r(t[0],2)+r(t[1],2),a=e(o),h=(t[0]*t[3]-t[2]*t[1])/a,c=i(t[0]*t[2]+t[1]*t[3],o);return{angle:n/s,scaleX:a,scaleY:h,skewX:c/s,skewY:0,translateX:t[4],translateY:t[5]}},customTransformMatrix:function(t,e,i){var r=[1,0,n(Math.tan(i*s)),1],o=[n(t),0,0,n(e)];return fabric.util.multiplyTransformMatrices(o,r,!0)},resetObjectTransform:function(t){t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.setAngle(0)},getFunctionBody:function(t){return(String(t).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},isTransparent:function(t,e,i,r){r>0&&(e>r?e-=r:e=0,i>r?i-=r:i=0);var n,s,o=!0,a=t.getImageData(e,i,2*r||1,2*r||1),h=a.data.length;for(n=3;n0?D-=2*f:1===c&&D<0&&(D+=2*f);for(var I=Math.ceil(Math.abs(D/f*2)),E=[],L=D/I,F=8/3*Math.sin(L/4)*Math.sin(L/4)/Math.sin(L/2),R=A+L,B=0;B=n?s-n:2*Math.PI-(n-s)}function r(t,e,i,r,n,s,h,c){var l=a.call(arguments);if(o[l])return o[l];var u,f,d,g,p,v,b,m,y=Math.sqrt,_=Math.min,x=Math.max,C=Math.abs,S=[],w=[[],[]];f=6*t-12*i+6*n,u=-3*t+9*i-9*n+3*h,d=3*i-3*t;for(var O=0;O<2;++O)if(O>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),C(u)<1e-12){if(C(f)<1e-12)continue;g=-d/f,0=e})}function i(t,e){return n(t,e,function(t,e){return t>>0;if(0===i)return-1;var r=0;if(arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=i)return-1;for(var n=r>=0?r:Math.max(i-Math.abs(r),0);n>>0;i>>0;r>>0;i>>0;i>>0;n>>0,r=0;if(arguments.length>1)e=arguments[1];else for(;;){if(r in this){e=this[r++];break}if(++r>=i)throw new TypeError}for(;r/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:t,capitalize:e,escapeXml:i}}(),function(){var t=Array.prototype.slice,e=Function.prototype.apply,i=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var n,s=this,o=t.call(arguments,1);return n=o.length?function(){return e.call(s,this instanceof i?this:r,o.concat(t.call(arguments)))}:function(){return e.call(s,this instanceof i?this:r,arguments)},i.prototype=this.prototype,n.prototype=new i,n})}(),function(){function t(){}function e(t){var e=this.constructor.superclass.prototype[t];return arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this)}function i(){function i(){this.initialize.apply(this,arguments)}var s=null,a=r.call(arguments,0);"function"==typeof a[0]&&(s=a.shift()),i.superclass=s,i.subclasses=[],s&&(t.prototype=s.prototype,i.prototype=new t,s.subclasses.push(i));for(var h=0,c=a.length;h-1?t.prototype[r]=function(t){return function(){var r=this.constructor.superclass;this.constructor.superclass=i;var n=e[t].apply(this,arguments);if(this.constructor.superclass=r,"initialize"!==t)return n}}(r):t.prototype[r]=e[r],s&&(e.toString!==Object.prototype.toString&&(t.prototype.toString=e.toString),e.valueOf!==Object.prototype.valueOf&&(t.prototype.valueOf=e.valueOf))};fabric.util.createClass=i}(),function(){function t(t){var e,i,r=Array.prototype.slice.call(arguments,1),n=r.length;for(i=0;i-1?s(t,e.match(/opacity:\s*(\d?\.?\d*)/)[1]):t;for(var r in e)if("opacity"===r)s(t,e[r]);else{var n="float"===r||"cssFloat"===r?"undefined"==typeof i.styleFloat?"cssFloat":"styleFloat":r;i[n]=e[r]}return t}var e=fabric.document.createElement("div"),i="string"==typeof e.style.opacity,r="string"==typeof e.style.filter,n=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(t){return t};i?s=function(t,e){return t.style.opacity=e,t}:r&&(s=function(t,e){var i=t.style;return t.currentStyle&&!t.currentStyle.hasLayout&&(i.zoom=1),n.test(i.filter)?(e=e>=.9999?"":"alpha(opacity="+100*e+")",i.filter=i.filter.replace(n,e)):i.filter+=" alpha(opacity="+100*e+")",t}),fabric.util.setStyle=t}(),function(){function t(t){return"string"==typeof t?fabric.document.getElementById(t):t}function e(t,e){var i=fabric.document.createElement(t);for(var r in e)"class"===r?i.className=e[r]:"for"===r?i.htmlFor=e[r]:i.setAttribute(r,e[r]);return i}function i(t,e){t&&(" "+t.className+" ").indexOf(" "+e+" ")===-1&&(t.className+=(t.className?" ":"")+e)}function r(t,i,r){return"string"==typeof i&&(i=e(i,r)),t.parentNode&&t.parentNode.replaceChild(i,t),i.appendChild(t),i}function n(t){for(var e=0,i=0,r=fabric.document.documentElement,n=fabric.document.body||{scrollLeft:0,scrollTop:0};t&&(t.parentNode||t.host)&&(t=t.parentNode||t.host,t===fabric.document?(e=n.scrollLeft||r.scrollLeft||0,i=n.scrollTop||r.scrollTop||0):(e+=t.scrollLeft||0,i+=t.scrollTop||0),1!==t.nodeType||"fixed"!==fabric.util.getElementStyle(t,"position")););return{left:e,top:i}}function s(t){var e,i,r=t&&t.ownerDocument,s={left:0,top:0},o={left:0,top:0},a={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return o;for(var h in a)o[a[h]]+=parseInt(c(t,h),10)||0;return e=r.documentElement,"undefined"!=typeof t.getBoundingClientRect&&(s=t.getBoundingClientRect()),i=n(t),{left:s.left+i.left-(e.clientLeft||0)+o.left,top:s.top+i.top-(e.clientTop||0)+o.top}}var o,a=Array.prototype.slice,h=function(t){return a.call(t,0)};try{o=h(fabric.document.childNodes)instanceof Array}catch(t){}o||(h=function(t){for(var e=new Array(t.length),i=t.length;i--;)e[i]=t[i];return e});var c;c=fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?function(t,e){var i=fabric.document.defaultView.getComputedStyle(t,null);return i?i[e]:void 0}:function(t,e){var i=t.style[e];return!i&&t.currentStyle&&(i=t.currentStyle[e]),i},function(){function t(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=fabric.util.falseFunction),r?t.style[r]="none":"string"==typeof t.unselectable&&(t.unselectable="on"),t}function e(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=null),r?t.style[r]="":"string"==typeof t.unselectable&&(t.unselectable=""),t}var i=fabric.document.documentElement.style,r="userSelect"in i?"userSelect":"MozUserSelect"in i?"MozUserSelect":"WebkitUserSelect"in i?"WebkitUserSelect":"KhtmlUserSelect"in i?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=t,fabric.util.makeElementSelectable=e}(),function(){function t(t,e){var i=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),n=!0;r.onload=r.onreadystatechange=function(t){if(n){if("string"==typeof this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)return;n=!1,e(t||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=t,i.appendChild(r)}fabric.util.getScript=t}(),fabric.util.getById=t,fabric.util.toArray=h,fabric.util.makeElement=e,fabric.util.addClass=i,fabric.util.wrapElement=r,fabric.util.getScrollLeftTop=n,fabric.util.getElementOffset=s,fabric.util.getElementStyle=c}(),function(){function t(t,e){return t+(/\?/.test(t)?"&":"?")+e}function e(){}function i(i,n){n||(n={});var s=n.method?n.method.toUpperCase():"GET",o=n.onComplete||function(){},a=r(),h=n.body||n.parameters;return a.onreadystatechange=function(){4===a.readyState&&(o(a),a.onreadystatechange=e)},"GET"===s&&(h=null,"string"==typeof n.parameters&&(i=t(i,n.parameters))),a.open(s,i,!0),"POST"!==s&&"PUT"!==s||a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.send(h),a}var r=function(){for(var t=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}],e=t.length;e--;)try{var i=t[e]();if(i)return t[e]}catch(t){}}();fabric.util.request=i}(),fabric.log=function(){},fabric.warn=function(){},"undefined"!=typeof console&&["log","warn"].forEach(function(t){"undefined"!=typeof console[t]&&"function"==typeof console[t].apply&&(fabric[t]=function(){return console[t].apply(console,arguments)})}),function(){function t(t){e(function(i){t||(t={});var r,n=i||+new Date,s=t.duration||500,o=n+s,a=t.onChange||function(){},h=t.abort||function(){return!1},c=t.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},l="startValue"in t?t.startValue:0,u="endValue"in t?t.endValue:100,f=t.byValue||u-l;t.onStart&&t.onStart(),function i(u){r=u||+new Date;var d=r>o?s:r-n;return h()?void(t.onComplete&&t.onComplete()):(a(c(d,l,f,s)),r>o?void(t.onComplete&&t.onComplete()):void e(i))}(n)})}function e(){return i.apply(fabric.window,arguments)}var i=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(t){fabric.window.setTimeout(t,1e3/60)};fabric.util.animate=t,fabric.util.requestAnimFrame=e}(),function(){function t(t,e,i){var r="rgba("+parseInt(t[0]+i*(e[0]-t[0]),10)+","+parseInt(t[1]+i*(e[1]-t[1]),10)+","+parseInt(t[2]+i*(e[2]-t[2]),10);return r+=","+(t&&e?parseFloat(t[3]+i*(e[3]-t[3])):1),r+=")"}function e(e,i,r,n){var s=new fabric.Color(e).getSource(),o=new fabric.Color(i).getSource();n=n||{},fabric.util.animate(fabric.util.object.extend(n,{duration:r||500,startValue:s,endValue:o,byValue:o,easing:function(e,i,r,s){var o=n.colorEasing?n.colorEasing(e,s):1-Math.cos(e/s*(Math.PI/2));return t(i,r,o)}}))}fabric.util.animateColor=e}(),function(){function t(t,e,i,r){return ta?a:o),1===o&&1===a&&0===h&&0===c&&0===f&&0===d)return _;if((f||d)&&(x=" translate("+y(f)+" "+y(d)+") "),r=x+" matrix("+o+" 0 0 "+a+" "+h*o+" "+c*a+") ","svg"===t.nodeName){for(n=t.ownerDocument.createElement("g");t.firstChild;)n.appendChild(t.firstChild);t.appendChild(n)}else n=t,r=n.getAttribute("transform")+r;return n.setAttribute("transform",r),_}function g(t,e){for(;t&&(t=t.parentNode);)if(t.nodeName&&e.test(t.nodeName.replace("svg:",""))&&!t.getAttribute("instantiated_by_use"))return!0; +return!1}var p=t.fabric||(t.fabric={}),v=p.util.object.extend,b=p.util.object.clone,m=p.util.toFixed,y=p.util.parseUnit,_=p.util.multiplyTransformMatrices,x=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i,C=/^(symbol|image|marker|pattern|view|svg)$/i,S=/^(?:pattern|defs|symbol|metadata|clipPath|mask)$/i,w=/^(symbol|g|a|svg)$/i,O={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"},T={stroke:"strokeOpacity",fill:"fillOpacity"};p.cssRules={},p.gradientDefs={},p.parseTransformAttribute=function(){function t(t,e){var i=Math.cos(e[0]),r=Math.sin(e[0]),n=0,s=0;3===e.length&&(n=e[1],s=e[2]),t[0]=i,t[1]=r,t[2]=-r,t[3]=i,t[4]=n-(i*n-r*s),t[5]=s-(r*n+i*s)}function e(t,e){var i=e[0],r=2===e.length?e[1]:e[0];t[0]=i,t[3]=r}function i(t,e,i){t[i]=Math.tan(p.util.degreesToRadians(e[0]))}function r(t,e){t[4]=e[0],2===e.length&&(t[5]=e[1])}var n=[1,0,0,1,0,0],s=p.reNum,o="(?:\\s+,?\\s*|,\\s*)",a="(?:(skewX)\\s*\\(\\s*("+s+")\\s*\\))",h="(?:(skewY)\\s*\\(\\s*("+s+")\\s*\\))",c="(?:(rotate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+")"+o+"("+s+"))?\\s*\\))",l="(?:(scale)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))",u="(?:(translate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))",f="(?:(matrix)\\s*\\(\\s*("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")\\s*\\))",d="(?:"+f+"|"+u+"|"+l+"|"+c+"|"+a+"|"+h+")",g="(?:"+d+"(?:"+o+"*"+d+")*)",v="^\\s*(?:"+g+"?)\\s*$",b=new RegExp(v),m=new RegExp(d,"g");return function(s){var o=n.concat(),a=[];if(!s||s&&!b.test(s))return o;s.replace(m,function(s){var h=new RegExp(d).exec(s).filter(function(t){return!!t}),c=h[1],l=h.slice(2).map(parseFloat);switch(c){case"translate":r(o,l);break;case"rotate":l[0]=p.util.degreesToRadians(l[0]),t(o,l);break;case"scale":e(o,l);break;case"skewX":i(o,l,2);break;case"skewY":i(o,l,1);break;case"matrix":o=l}a.push(o.concat()),o=n.concat()});for(var h=a[0];a.length>1;)a.shift(),h=p.util.multiplyTransformMatrices(h,a[0]);return h}}();var j=new RegExp("^\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*$");p.parseSVGDocument=function(t,e,i){if(t){f(t);var r=p.Object.__uid++,n=d(t),s=p.util.toArray(t.getElementsByTagName("*"));if(n.svgUid=r,0===s.length&&p.isLikelyNode){s=t.selectNodes('//*[name(.)!="svg"]');for(var o=[],a=0,h=s.length;a/i,""))),r&&r.documentElement||e&&e(null),p.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)}t=t.replace(/^\n\s*/,"").trim(),new p.util.request(t,{method:"get",onComplete:r})},loadSVGFromString:function(t,e,i){t=t.trim();var r;if("undefined"!=typeof DOMParser){var n=new DOMParser;n&&n.parseFromString&&(r=n.parseFromString(t,"text/xml"))}else p.window.ActiveXObject&&(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(t.replace(//i,"")));p.parseSVGDocument(r.documentElement,function(t,i){e(t,i)},i)}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.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 t=0,e=this.elements.length;tt.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,i){return"undefined"==typeof i&&(i=.5),i=Math.max(Math.min(1,i),0),new e(this.x+(t.x-this.x)*i,this.y+(t.y-this.y)*i)},distanceFrom:function(t){var e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)},midPointFrom:function(t){return this.lerp(t)},min:function(t){return new e(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new e(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new e(this.x,this.y)}}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){this.status=t,this.points=[]}var i=t.fabric||(t.fabric={});return i.Intersection?void i.warn("fabric.Intersection is already defined"):(i.Intersection=e,i.Intersection.prototype={constructor:e,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},i.Intersection.intersectLineLine=function(t,r,n,s){var o,a=(s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x),h=(r.x-t.x)*(t.y-n.y)-(r.y-t.y)*(t.x-n.x),c=(s.y-n.y)*(r.x-t.x)-(s.x-n.x)*(r.y-t.y);if(0!==c){var l=a/c,u=h/c;0<=l&&l<=1&&0<=u&&u<=1?(o=new e("Intersection"),o.appendPoint(new i.Point(t.x+l*(r.x-t.x),t.y+l*(r.y-t.y)))):o=new e}else o=new e(0===a||0===h?"Coincident":"Parallel");return o},i.Intersection.intersectLinePolygon=function(t,i,r){for(var n,s,o,a=new e,h=r.length,c=0;c0&&(a.status="Intersection"),a},i.Intersection.intersectPolygonPolygon=function(t,i){for(var r=new e,n=t.length,s=0;s0&&(r.status="Intersection"),r},void(i.Intersection.intersectPolygonRectangle=function(t,r,n){var s=r.min(n),o=r.max(n),a=new i.Point(o.x,s.y),h=new i.Point(s.x,o.y),c=e.intersectLinePolygon(s,a,t),l=e.intersectLinePolygon(a,o,t),u=e.intersectLinePolygon(o,h,t),f=e.intersectLinePolygon(h,s,t),d=new e;return d.appendPoints(c.points),d.appendPoints(l.points),d.appendPoints(u.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){t?this._tryParsingColor(t):this.setSource([0,0,0,1])}function i(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}var r=t.fabric||(t.fabric={});return r.Color?void r.warn("fabric.Color is already defined."):(r.Color=e,r.Color.prototype={_tryParsingColor:function(t){var i;t in e.colorNameMap&&(t=e.colorNameMap[t]),"transparent"===t&&(i=[255,255,255,0]),i||(i=e.sourceFromHex(t)),i||(i=e.sourceFromRgb(t)),i||(i=e.sourceFromHsl(t)),i||(i=[0,0,0,1]),i&&this.setSource(i)},_rgbToHsl:function(t,e,i){t/=255,e/=255,i/=255;var n,s,o,a=r.util.array.max([t,e,i]),h=r.util.array.min([t,e,i]);if(o=(a+h)/2,a===h)n=s=0;else{var c=a-h;switch(s=o>.5?c/(2-a-h):c/(a+h),a){case t:n=(e-i)/c+(e1?1:s,n){var o=n.split(/\s*;\s*/);""===o[o.length-1]&&o.pop();for(var a=o.length;a--;){var h=o[a].split(/\s*:\s*/),c=h[0].trim(),l=h[1].trim();"stop-color"===c?e=l:"stop-opacity"===c&&(r=l)}}return e||(e=t.getAttribute("stop-color")||"rgb(0,0,0)"),r||(r=t.getAttribute("stop-opacity")),e=new fabric.Color(e),i=e.getAlpha(),r=isNaN(parseFloat(r))?1:parseFloat(r),r*=i,{offset:s,color:e.toRgb(),opacity:r}}function e(t){return{x1:t.getAttribute("x1")||0,y1:t.getAttribute("y1")||0,x2:t.getAttribute("x2")||"100%",y2:t.getAttribute("y2")||0}}function i(t){return{x1:t.getAttribute("fx")||t.getAttribute("cx")||"50%",y1:t.getAttribute("fy")||t.getAttribute("cy")||"50%",r1:0,x2:t.getAttribute("cx")||"50%",y2:t.getAttribute("cy")||"50%",r2:t.getAttribute("r")||"50%"}}function r(t,e,i){var r,n=0,s=1,o="";for(var a in e)"Infinity"===e[a]?e[a]=1:"-Infinity"===e[a]&&(e[a]=0),r=parseFloat(e[a],10),s="string"==typeof e[a]&&/^\d+%$/.test(e[a])?.01:1,"x1"===a||"x2"===a||"r2"===a?(s*="objectBoundingBox"===i?t.width:1,n="objectBoundingBox"===i?t.left||0:0):"y1"!==a&&"y2"!==a||(s*="objectBoundingBox"===i?t.height:1,n="objectBoundingBox"===i?t.top||0:0),e[a]=r*s+n;if("ellipse"===t.type&&null!==e.r2&&"objectBoundingBox"===i&&t.rx!==t.ry){var h=t.ry/t.rx;o=" scale(1, "+h+")",e.y1&&(e.y1/=h),e.y2&&(e.y2/=h)}return o}fabric.Gradient=fabric.util.createClass({offsetX:0,offsetY:0,initialize:function(t){t||(t={});var e={};this.id=fabric.Object.__uid++,this.type=t.type||"linear",e={x1:t.coords.x1||0,y1:t.coords.y1||0,x2:t.coords.x2||0,y2:t.coords.y2||0},"radial"===this.type&&(e.r1=t.coords.r1||0,e.r2=t.coords.r2||0),this.coords=e,this.colorStops=t.colorStops.slice(),t.gradientTransform&&(this.gradientTransform=t.gradientTransform),this.offsetX=t.offsetX||this.offsetX,this.offsetY=t.offsetY||this.offsetY},addColorStop:function(t){for(var e in t){var i=new fabric.Color(t[e]);this.colorStops.push({offset:e,color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(t){var e={type:this.type,coords:this.coords,colorStops:this.colorStops,offsetX:this.offsetX,offsetY:this.offsetY,gradientTransform:this.gradientTransform?this.gradientTransform.concat():this.gradientTransform};return fabric.util.populateWithProperties(this,e,t),e},toSVG:function(t){var e,i,r=fabric.util.object.clone(this.coords);if(this.colorStops.sort(function(t,e){return t.offset-e.offset}),!t.group||"path-group"!==t.group.type)for(var n in r)"x1"===n||"x2"===n||"r2"===n?r[n]+=this.offsetX-t.width/2:"y1"!==n&&"y2"!==n||(r[n]+=this.offsetY-t.height/2);i='id="SVGID_'+this.id+'" gradientUnits="userSpaceOnUse"',this.gradientTransform&&(i+=' gradientTransform="matrix('+this.gradientTransform.join(" ")+')" '),"linear"===this.type?e=["\n']:"radial"===this.type&&(e=["\n']);for(var s=0;s\n');return e.push("linear"===this.type?"\n":"\n"),e.join("")},toLive:function(t,e){var i,r,n=fabric.util.object.clone(this.coords);if(this.type){if(e.group&&"path-group"===e.group.type)for(r in n)"x1"===r||"x2"===r?n[r]+=-this.offsetX+e.width/2:"y1"!==r&&"y2"!==r||(n[r]+=-this.offsetY+e.height/2);"linear"===this.type?i=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(i=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2));for(var s=0,o=this.colorStops.length;s\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},toLive:function(t){var e="function"==typeof this.source?this.source():this.source;if(!e)return"";if("undefined"!=typeof e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.toFixed;return e.Shadow?void e.warn("fabric.Shadow is already defined."):(e.Shadow=e.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(t){"string"==typeof t&&(t=this._parseShadow(t));for(var i in t)this[i]=t[i];this.id=e.Object.__uid++},_parseShadow:function(t){var i=t.trim(),r=e.Shadow.reOffsetsAndBlur.exec(i)||[],n=i.replace(e.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)";return{color:n.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(t){var r=40,n=40,s=e.Object.NUM_FRACTION_DIGITS,o=e.util.rotateVector({x:this.offsetX,y:this.offsetY},e.util.degreesToRadians(-t.angle)),a=20;return t.width&&t.height&&(r=100*i((Math.abs(o.x)+this.blur)/t.width,s)+a,n=100*i((Math.abs(o.y)+this.blur)/t.height,s)+a),t.flipX&&(o.x*=-1),t.flipY&&(o.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke};var t={},i=e.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke"].forEach(function(e){this[e]!==i[e]&&(t[e]=this[e])},this),t}}),void(e.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/))}("undefined"!=typeof exports?exports:this),function(){"use strict";if(fabric.StaticCanvas)return void fabric.warn("fabric.StaticCanvas is already defined.");var t=fabric.util.object.extend,e=fabric.util.getElementOffset,i=fabric.util.removeFromArray,r=fabric.util.toFixed,n=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e||(e={}),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:[1,0,0,1,0,0],backgroundVpt:!0,overlayVpt:!0,onBeforeScaleRotate:function(){},enableRetinaScaling:!0,_initStatic:function(t,e){var i=fabric.StaticCanvas.prototype.renderAll.bind(this);this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this._setImageSmoothing(),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},getRetinaScaling:function(){return this._isRetinaScaling()?fabric.devicePixelRatio:1},_initRetinaScaling:function(){this._isRetinaScaling()&&(this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio))},calcOffset:function(){return this._offset=e(this.lowerCanvasEl),this},setOverlayImage:function(t,e,i){return this.__setBgOverlayImage("overlayImage",t,e,i)},setBackgroundImage:function(t,e,i){return this.__setBgOverlayImage("backgroundImage",t,e,i)},setOverlayColor:function(t,e){return this.__setBgOverlayColor("overlayColor",t,e)},setBackgroundColor:function(t,e){return this.__setBgOverlayColor("backgroundColor",t,e)},_setImageSmoothing:function(){var t=this.getContext();t.imageSmoothingEnabled=t.imageSmoothingEnabled||t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled||t.oImageSmoothingEnabled,t.imageSmoothingEnabled=this.imageSmoothingEnabled},__setBgOverlayImage:function(t,e,i,r){return"string"==typeof e?fabric.util.loadImage(e,function(e){e&&(this[t]=new fabric.Image(e,r)),i&&i(e)},this,r&&r.crossOrigin):(r&&e.setOptions(r),this[t]=e,i&&i(e)),this},__setBgOverlayColor:function(t,e,i){return this[t]=e,this._initGradient(e,t),this._initPattern(e,t,i),this},_createCanvasElement:function(t){var e=fabric.util.createCanvasElement(t);if(e.style||(e.style={}),!e)throw n;if("undefined"==typeof e.getContext)throw n;return e},_initOptions:function(t){this._setOptions(t),this.width=this.width||parseInt(this.lowerCanvasEl.width,10)||0,this.height=this.height||parseInt(this.lowerCanvasEl.height,10)||0,this.lowerCanvasEl.style&&(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(t){this.lowerCanvasEl=fabric.util.getById(t)||this._createCanvasElement(t),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(t,e){return this.setDimensions({width:t},e)},setHeight:function(t,e){return this.setDimensions({height:t},e)},setDimensions:function(t,e){var i;e=e||{};for(var r in t)i=t[r],e.cssOnly||(this._setBackstoreDimension(r,t[r]),i+="px"),e.backstoreOnly||this._setCssDimension(r,i);return this._initRetinaScaling(),this._setImageSmoothing(),this.calcOffset(),e.cssOnly||this.renderAll(),this},_setBackstoreDimension:function(t,e){return this.lowerCanvasEl[t]=e,this.upperCanvasEl&&(this.upperCanvasEl[t]=e),this.cacheCanvasEl&&(this.cacheCanvasEl[t]=e),this[t]=e,this},_setCssDimension:function(t,e){return this.lowerCanvasEl.style[t]=e,this.upperCanvasEl&&(this.upperCanvasEl.style[t]=e),this.wrapperEl&&(this.wrapperEl.style[t]=e),this},getZoom:function(){return this.viewportTransform[0]},setViewportTransform:function(t){var e,i=this._activeGroup,r=!1,n=!0;this.viewportTransform=t;for(var s=0,o=this._objects.length;s"),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,n=e.width||this.width,s=e.height||this.height,o='viewBox="0 0 '+this.width+" "+this.height+'" ',a=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?o='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,o='viewBox="'+r(-i[4]/i[0],a)+" "+r(-i[5]/i[3],a)+" "+r(this.width/i[0],a)+" "+r(this.height/i[3],a)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),"\n")},createSVGRefElementsMarkup:function(){var t=this,e=["backgroundColor","overlayColor"].map(function(e){var i=t[e];if(i&&i.toLive)return i.toSVG(t,!1)});return e.join("")},createSVGFontFacesMarkup:function(){for(var t,e,i,r,n,s,o,a="",h={},c=fabric.fontPaths,l=this.getObjects(),u=0,f=l.length;u',"\n",a,"","\n"].join("")),a},_setSVGObjects:function(t,e){for(var i,r=0,n=this.getObjects(),s=n.length;r\n")}else t.push('\n")},sendToBack:function(t){if(!t)return this;var e,r,n,s=this._activeGroup;if(t===s)for(n=s._objects,e=n.length;e--;)r=n[e],i(this._objects,r),this._objects.unshift(r);else i(this._objects,t),this._objects.unshift(t);return this.renderAll&&this.renderAll()},bringToFront:function(t){if(!t)return this;var e,r,n,s=this._activeGroup;if(t===s)for(n=s._objects,e=0;e=0;--n){var s=t.intersectsWithObject(this._objects[n])||t.isContainedWithinObject(this._objects[n])||this._objects[n].isContainedWithinObject(t);if(s){r=n;break}}}else r=e-1;return r},bringForward:function(t,e){if(!t)return this;var r,n,s,o,a,h=this._activeGroup;if(t===h)for(a=h._objects,r=a.length;r--;)n=a[r],s=this._objects.indexOf(n),s!==this._objects.length-1&&(o=s+1,i(this._objects,n),this._objects.splice(o,0,n));else s=this._objects.indexOf(t),s!==this._objects.length-1&&(o=this._findNewUpperIndex(t,s,e),i(this._objects,t),this._objects.splice(o,0,t));return this.renderAll&&this.renderAll(),this},_findNewUpperIndex:function(t,e,i){var r;if(i){r=e;for(var n=e+1;n"}}),t(fabric.StaticCanvas.prototype,fabric.Observable),t(fabric.StaticCanvas.prototype,fabric.Collection),t(fabric.StaticCanvas.prototype,fabric.DataURLExporter),t(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=fabric.util.createCanvasElement();if(!e||!e.getContext)return null;var i=e.getContext("2d");if(!i)return null;switch(t){case"getImageData":return"undefined"!=typeof i.getImageData;case"setLineDash":return"undefined"!=typeof i.setLineDash;case"toDataURL":return"undefined"!=typeof e.toDataURL;case"toDataURLWithQuality":try{return e.toDataURL("image/jpeg",0),!0}catch(t){}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",strokeDashArray:null,setShadow:function(t){return this.shadow=new fabric.Shadow(t),this},_setBrushStyles:function(){var t=this.canvas.contextTop;t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,this.strokeDashArray&&fabric.StaticCanvas.supports("setLineDash")&&t.setLineDash(this.strokeDashArray)},_setShadow:function(){if(this.shadow){var t=this.canvas.contextTop,e=this.canvas.getZoom();t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*e,t.shadowOffsetX=this.shadow.offsetX*e,t.shadowOffsetY=this.shadow.offsetY*e}},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}}),function(){fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(t){this.canvas=t,this._points=[]},onMouseDown:function(t){this._prepareForDrawing(t),this._captureDrawingPath(t),this._render()},onMouseMove:function(t){this._captureDrawingPath(t),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(t){var e=new fabric.Point(t.x,t.y);this._reset(),this._addPoint(e),this.canvas.contextTop.moveTo(e.x,e.y)},_addPoint:function(t){this._points.push(t)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(t){var e=new fabric.Point(t.x,t.y);this._addPoint(e)},_render:function(){var t=this.canvas.contextTop,e=this.canvas.viewportTransform,i=this._points[0],r=this._points[1];t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5]),t.beginPath(),2===this._points.length&&i.x===r.x&&i.y===r.y&&(i.x-=.5,r.x+=.5),t.moveTo(i.x,i.y);for(var n=1,s=this._points.length;n0?1:-1,"y"===i&&(s=e.target.skewY,o="top",a="bottom",r="originY"),n[-1]=o,n[1]=a,e.target.flipX&&(c*=-1),e.target.flipY&&(c*=-1),0===s?(e.skewSign=-h*t*c,e[r]=n[-t]):(s=s>0?1:-1,e.skewSign=s,e[r]=n[s*h*c])},_skewObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=!1,o=n.get("lockSkewingX"),a=n.get("lockSkewingY");if(o&&"x"===i||a&&"y"===i)return!1;var h,c,l=n.getCenterPoint(),u=n.toLocalPoint(new fabric.Point(t,e),"center","center")[i],f=n.toLocalPoint(new fabric.Point(r.lastX,r.lastY),"center","center")[i],d=n._getTransformedDimensions();return this._changeSkewTransformOrigin(u-f,r,i),h=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY)[i],c=n.translateToOriginPoint(l,r.originX,r.originY),s=this._setObjectSkew(h,r,i,d),r.lastX=t,r.lastY=e,n.setPositionByOrigin(c,r.originX,r.originY),s},_setObjectSkew:function(t,e,i,r){var n,s,o,a,h,c,l,u,f,d=e.target,g=!1,p=e.skewSign;return"x"===i?(a="y",h="Y",c="X",u=0,f=d.skewY):(a="x",h="X",c="Y",u=d.skewX,f=0),o=d._getTransformedDimensions(u,f),l=2*Math.abs(t)-o[i],l<=2?n=0:(n=p*Math.atan(l/d["scale"+c]/(o[a]/d["scale"+h])),n=fabric.util.radiansToDegrees(n)),g=d["skew"+c]!==n,d.set("skew"+c,n),0!==d["skew"+h]&&(s=d._getTransformedDimensions(),n=r[a]/s[a]*d["scale"+h],d.set("scale"+h,n)),g},_scaleObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=n.get("lockScalingX"),o=n.get("lockScalingY"),a=n.get("lockScalingFlip");if(s&&o)return!1;var h=n.translateToOriginPoint(n.getCenterPoint(),r.originX,r.originY),c=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY),l=n._getTransformedDimensions(),u=!1;return this._setLocalMouse(c,r),u=this._setObjectScale(c,r,s,o,i,a,l),n.setPositionByOrigin(h,r.originX,r.originY),u},_setObjectScale:function(t,e,i,r,n,s,o){var a,h,c,l,u=e.target,f=!1,d=!1,g=!1;return c=t.x*u.scaleX/o.x,l=t.y*u.scaleY/o.y,a=u.scaleX!==c,h=u.scaleY!==l,s&&c<=0&&ci.padding?t.x<0?t.x+=i.padding:t.x-=i.padding:t.x=0,n(t.y)>i.padding?t.y<0?t.y+=i.padding:t.y-=i.padding:t.y=0},_rotateObject:function(t,e){var n=this._currentTransform;if(n.target.get("lockRotation"))return!1;var s=r(n.ey-n.top,n.ex-n.left),o=r(e-n.top,t-n.left),a=i(o-s+n.theta),h=!0;if(a<0&&(a=360+a),a%=360,n.target.snapAngle>0){var c=n.target.snapAngle,l=n.target.snapThreshold||c,u=Math.ceil(a/c)*c,f=Math.floor(a/c)*c;Math.abs(a-f)0?0:-i),e.ey-(r>0?0:-r),a,h)),this.selectionLineWidth&&this.selectionBorderColor)if(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,this.selectionDashArray.length>1&&!s){var c=e.ex+o-(i>0?0:a),l=e.ey+o-(r>0?0:h);t.beginPath(),fabric.util.drawDashedLine(t,c,l,c+a,l,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l+h-1,c+a,l+h-1,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l,c,l+h,this.selectionDashArray),fabric.util.drawDashedLine(t,c+a-1,l,c+a-1,l+h,this.selectionDashArray),t.closePath(),t.stroke()}else fabric.Object.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(e.ex+o-(i>0?0:a),e.ey+o-(r>0?0:h),a,h)},findTarget:function(t,e){if(!this.skipTargetFind){var i,r=!0,n=this.getPointer(t,r),s=this.getActiveGroup(),o=this.getActiveObject();if(s&&!e&&this._checkTarget(n,s))return this._fireOverOutEvents(s,t),s;if(o&&o._findTargetCorner(n))return this._fireOverOutEvents(o,t),o;if(o&&this._checkTarget(n,o)){if(!this.preserveObjectStacking)return this._fireOverOutEvents(o,t),o;i=o}this.targets=[];var a=this._searchPossibleTargets(this._objects,n);return t[this.altSelectionKey]&&a&&i&&a!==i&&(a=i),this._fireOverOutEvents(a,t),a}},_fireOverOutEvents:function(t,e){t?this._hoveredTarget!==t&&(this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout")),this.fire("mouse:over",{target:t,e:e}),t.fire("mouseover"),this._hoveredTarget=t):this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout"),this._hoveredTarget=null)},_checkTarget:function(t,e){if(e&&e.visible&&e.evented&&this.containsPoint(null,e,t)){if(!this.perPixelTargetFind&&!e.perPixelTargetFind||e.isEditing)return!0;var i=this.isTargetTransparent(e,t.x,t.y);if(!i)return!0}},_searchPossibleTargets:function(t,e){for(var i,r,n,s=t.length;s--;)if(this._checkTarget(e,t[s])){i=t[s],"group"===i.type&&i.subTargetCheck&&(r=this._normalizePointer(i,e),n=this._searchPossibleTargets(i._objects,r),n&&this.targets.push(n));break}return i},restorePointerVpt:function(t){return fabric.util.transformPoint(t,fabric.util.invertTransform(this.viewportTransform))},getPointer:function(e,i,r){r||(r=this.upperCanvasEl);var n,s=t(e),o=r.getBoundingClientRect(),a=o.width||0,h=o.height||0;return a&&h||("top"in o&&"bottom"in o&&(h=Math.abs(o.top-o.bottom)),"right"in o&&"left"in o&&(a=Math.abs(o.right-o.left))),this.calcOffset(),s.x=s.x-this._offset.left,s.y=s.y-this._offset.top,i||(s=this.restorePointerVpt(s)),n=0===a||0===h?{width:1,height:1}:{width:r.width/a,height:r.height/h},{x:s.x*n.width,y:s.y*n.height}},_createUpperCanvas:function(){var t=this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/,"");this.upperCanvasEl=this._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+t),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(t){var e=this.getWidth()||t.width,i=this.getHeight()||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0}),t.width=e,t.height=i,fabric.util.makeElementUnselectable(t)},_copyCanvasStyle:function(t,e){e.style.cssText=t.style.cssText},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},_setActiveObject:function(t){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=t,t.set("active",!0)},setActiveObject:function(t,e){return this._setActiveObject(t),this.renderAll(),this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e}),this},getActiveObject:function(){return this._activeObject},_onObjectRemoved:function(t){this.getActiveObject()===t&&(this.fire("before:selection:cleared",{target:t}),this._discardActiveObject(),this.fire("selection:cleared",{target:t}),t.fire("deselected")),this.callSuper("_onObjectRemoved",t)},_discardActiveObject:function(){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=null},discardActiveObject:function(t){var e=this._activeObject;return this.fire("before:selection:cleared",{target:e,e:t}),this._discardActiveObject(),this.fire("selection:cleared",{e:t}),e&&e.fire("deselected",{e:t}),this},_setActiveGroup:function(t){this._activeGroup=t,t&&t.set("active",!0)},setActiveGroup:function(t,e){return this._setActiveGroup(t),t&&(this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e})),this},getActiveGroup:function(){return this._activeGroup},_discardActiveGroup:function(){var t=this.getActiveGroup();t&&t.destroy(),this.setActiveGroup(null)},discardActiveGroup:function(t){var e=this.getActiveGroup();return this.fire("before:selection:cleared",{e:t,target:e}),this._discardActiveGroup(),this.fire("selection:cleared",{e:t}),this},deactivateAll:function(){for(var t,e=this.getObjects(),i=0,r=e.length;i1)){var r=this._groupSelector;r?(i=this.getPointer(t,!0),r.left=i.x-r.ex,r.top=i.y-r.ey,this.renderTop()):this._currentTransform?this._transformObject(t):(e=this.findTarget(t),this._setCursorFromEvent(t,e)),this._handleEvent(t,"move",e?e:null)}},__onMouseWheel:function(t){this._handleEvent(t,"wheel")},_transformObject:function(t){var e=this.getPointer(t),i=this._currentTransform;i.reset=!1,i.target.isMoving=!0,i.shiftKey=t.shiftKey,i.altKey=t[this.centeredKey],this._beforeScaleTransform(t,i),this._performTransformAction(t,i,e),i.actionPerformed&&this.renderAll()},_performTransformAction:function(t,e,i){var r=i.x,n=i.y,s=e.target,o=e.action,a=!1;"rotate"===o?(a=this._rotateObject(r,n))&&this._fire("rotating",s,t):"scale"===o?(a=this._onScale(t,e,r,n))&&this._fire("scaling",s,t):"scaleX"===o?(a=this._scaleObject(r,n,"x"))&&this._fire("scaling",s,t):"scaleY"===o?(a=this._scaleObject(r,n,"y"))&&this._fire("scaling",s,t):"skewX"===o?(a=this._skewObject(r,n,"x"))&&this._fire("skewing",s,t):"skewY"===o?(a=this._skewObject(r,n,"y"))&&this._fire("skewing",s,t):(a=this._translateObject(r,n),a&&(this._fire("moving",s,t),this.setCursor(s.moveCursor||this.moveCursor))),e.actionPerformed=e.actionPerformed||a},_fire:function(t,e,i){this.fire("object:"+t,{target:e,e:i}),e.fire(t,{e:i})},_beforeScaleTransform:function(t,e){if("scale"===e.action||"scaleX"===e.action||"scaleY"===e.action){var i=this._shouldCenterTransform(e.target);(i&&("center"!==e.originX||"center"!==e.originY)||!i&&"center"===e.originX&&"center"===e.originY)&&(this._resetCurrentTransform(),e.reset=!0)}},_onScale:function(t,e,i,r){return!t[this.uniScaleKey]&&!this.uniScaleTransform||e.target.get("lockUniScaling")?(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally")):(e.currentAction="scale",this._scaleObject(i,r))},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor;if(e.selectable){var r=this.getActiveGroup(),n=e._findTargetCorner&&(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this._setCornerCursor(n,e,t):this.setCursor(i)}else this.setCursor(i);return!0},_setCornerCursor:function(e,i,r){if(e in t)this.setCursor(this._getRotatedCornerCursor(e,i,r));else{if("mtr"!==e||!i.hasRotatingPoint)return this.setCursor(this.defaultCursor),!1;this.setCursor(this.rotationCursor)}},_getRotatedCornerCursor:function(e,i,r){var n=Math.round(i.getAngle()%360/45);return n<0&&(n+=8),n+=t[e],r[this.altActionKey]&&t[e]%2===0&&(n+=2),n%=8,this.cursorMap[n]}})}(),function(){var t=Math.min,e=Math.max;fabric.util.object.extend(fabric.Canvas.prototype,{_shouldGroup:function(t,e){var i=this.getActiveObject();return t[this.selectionKey]&&e&&e.selectable&&(this.getActiveGroup()||i&&i!==e)&&this.selection},_handleGrouping:function(t,e){var i=this.getActiveGroup();(e!==i||(e=this.findTarget(t,!0)))&&(i?this._updateActiveGroup(e,t):this._createActiveGroup(e,t),this._activeGroup&&this._activeGroup.saveCoords())},_updateActiveGroup:function(t,e){var i=this.getActiveGroup();if(i.contains(t)){if(i.removeWithUpdate(t),t.set("active",!1),1===i.size())return this.discardActiveGroup(e),void this.setActiveObject(i.item(0))}else i.addWithUpdate(t);this.fire("selection:created",{target:i,e:e}),i.set("active",!0)},_createActiveGroup:function(t,e){if(this._activeObject&&t!==this._activeObject){var i=this._createGroup(t);i.addWithUpdate(),this.setActiveGroup(i),this._activeObject=null,this.fire("selection:created",{target:i,e:e})}t.set("active",!0)},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.Group(e.reverse(),{canvas:this}),e.addWithUpdate(),this.setActiveGroup(e,t),e.saveCoords(),this.fire("selection:created",{target:e}),this.renderAll())},_collectObjects:function(){for(var i,r=[],n=this._groupSelector.ex,s=this._groupSelector.ey,o=n+this._groupSelector.left,a=s+this._groupSelector.top,h=new fabric.Point(t(n,o),t(s,a)),c=new fabric.Point(e(n,o),e(s,a)),l=n===o&&s===a,u=this._objects.length;u--&&(i=this._objects[u],!(i&&i.selectable&&i.visible&&(i.intersectsWithRect(h,c)||i.isContainedWithinRect(h,c)||i.containsPoint(h)||i.containsPoint(c))&&(i.set("active",!0),r.push(i),l))););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t);var e=this.getActiveGroup();e&&(e.setObjectsCoords().setCoords(),e.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),function(){var t=fabric.StaticCanvas.supports("toDataURLWithQuality");fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(t){t||(t={});var e=t.format||"png",i=t.quality||1,r=t.multiplier||1,n={left:t.left||0,top:t.top||0,width:t.width||0,height:t.height||0};return this.__toDataURLWithMultiplier(e,i,n,r)},__toDataURLWithMultiplier:function(t,e,i,r){var n=this.getWidth(),s=this.getHeight(),o=(i.width||this.getWidth())*r,a=(i.height||this.getHeight())*r,h=this.getZoom(),c=h*r,l=this.viewportTransform,u=(l[4]-i.left)*r,f=(l[5]-i.top)*r,d=[c,0,0,c,u,f],g=this.interactive;this.viewportTransform=d,this.interactive&&(this.interactive=!1),n!==o||s!==a?this.setDimensions({width:o,height:a}):this.renderAll();var p=this.__toDataURL(t,e,i);return g&&(this.interactive=g),this.viewportTransform=l,this.setDimensions({width:n,height:s}),p},__toDataURL:function(e,i){var r=this.contextContainer.canvas;"jpg"===e&&(e="jpeg");var n=t?r.toDataURL("image/"+e,i):r.toDataURL("image/"+e);return n},toDataURLWithMultiplier:function(t,e,i){return this.toDataURL({format:t,multiplier:e,quality:i})}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(t,e,i){return this.loadFromJSON(t,e,i)},loadFromJSON:function(t,e,i){if(t){var r="string"==typeof t?JSON.parse(t):fabric.util.object.clone(t);this.clear();var n=this;return this._enlivenObjects(r.objects,function(){n._setBgOverlay(r,function(){delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay,n._setOptions(r),e&&e()})},i),this}},_setBgOverlay:function(t,e){var i=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var n=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(i.renderAll(),e&&e())};this.__setBgOverlay("backgroundImage",t.backgroundImage,r,n),this.__setBgOverlay("overlayImage",t.overlayImage,r,n),this.__setBgOverlay("backgroundColor",t.background,r,n),this.__setBgOverlay("overlayColor",t.overlay,r,n)},__setBgOverlay:function(t,e,i,r){var n=this;return e?void("backgroundImage"===t||"overlayImage"===t?fabric.util.enlivenObjects([e],function(e){n[t]=e[0],i[t]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(t,!0)](e,function(){i[t]=!0,r&&r()})):(i[t]=!0,void(r&&r()))},_enlivenObjects:function(t,e,i){var r=this;if(!t||0===t.length)return void(e&&e());var n=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(t,function(t){t.forEach(function(t,e){r.insertAt(t,e)}),r.renderOnAddRemove=n,e&&e()},null,i)},_toDataURL:function(t,e){this.clone(function(i){e(i.toDataURL(t))})},_toDataURLWithMultiplier:function(t,e,i){this.clone(function(r){i(r.toDataURLWithMultiplier(t,e))})},clone:function(t,e){var i=JSON.stringify(this.toJSON(e));this.cloneWithoutData(function(e){e.loadFromJSON(i,function(){t&&t(e)})})},cloneWithoutData:function(t){var e=fabric.document.createElement("canvas");e.width=this.getWidth(),e.height=this.getHeight();var i=new fabric.Canvas(e);i.clipTo=this.clipTo,this.backgroundImage?(i.setBackgroundImage(this.backgroundImage.src,function(){i.renderAll(),t&&t(i)}),i.backgroundImageOpacity=this.backgroundImageOpacity,i.backgroundImageStretch=this.backgroundImageStretch):t&&t(i)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.object.clone,n=e.util.toFixed,s=e.util.string.capitalize,o=e.util.degreesToRadians,a=e.StaticCanvas.supports("setLineDash"),h=!e.isLikelyNode;e.Object||(e.Object=e.util.createClass(e.CommonMethods,{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,skewX:0,skewY:0,cornerSize:13,transparentCorners:!0,hoverCursor:null,moveCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",borderDashArray:null,cornerColor:"rgba(102,153,255,0.5)",cornerStrokeColor:null,cornerStyle:"rect",cornerDashArray:null,centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"nonzero",globalCompositeOperation:"source-over",backgroundColor:"",selectionBackgroundColor:"",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,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,excludeFromExport:!1,objectCaching:h,statefullCache:!1,noScaleCache:!0,dirty:!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 skewX skewY".split(" "),cacheProperties:"fill stroke strokeWidth strokeDashArray width height stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit fillRule backgroundColor".split(" "),initialize:function(t){t=t||{},t&&this.setOptions(t),this.objectCaching&&(this._createCacheCanvas(),this.setupState({propertySet:"cacheProperties"}))},_createCacheCanvas:function(){this._cacheCanvas=e.document.createElement("canvas"),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas()},_getCacheCanvasDimensions:function(){var t=this.canvas&&this.canvas.getZoom()||1,i=this.getObjectScaling(),r=this._getNonTransformedDimensions(),n=this.canvas&&this.canvas._isRetinaScaling()?e.devicePixelRatio:1,s=i.scaleX*t*n,o=i.scaleY*t*n,a=r.x*s,h=r.y*o;return{width:Math.ceil(a)+2,height:Math.ceil(h)+2,zoomX:s,zoomY:o}},_updateCacheCanvas:function(){if(this.noScaleCache&&this.canvas&&this.canvas._currentTransform){var t=this.canvas._currentTransform.action;if("scale"===t.slice(0,5))return!1}var e=this._getCacheCanvasDimensions(),i=e.width,r=e.height,n=e.zoomX,s=e.zoomY;return(i!==this.cacheWidth||r!==this.cacheHeight)&&(this._cacheCanvas.width=i,this._cacheCanvas.height=r,this._cacheContext.translate(i/2,r/2),this._cacheContext.scale(n,s),this.cacheWidth=i,this.cacheHeight=r,this.zoomX=n,this.zoomY=s,!0)},setOptions:function(t){this._setOptions(t),this._initGradient(t.fill,"fill"),this._initGradient(t.stroke,"stroke"),this._initClipping(t),this._initPattern(t.fill,"fill"),this._initPattern(t.stroke,"stroke")},transform:function(t,e){this.group&&!this.group._transformDone&&this.group===this.canvas._activeGroup&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),t.rotate(o(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),t.transform(1,0,Math.tan(o(this.skewX)),1,0,0),t.transform(1,Math.tan(o(this.skewY)),0,1,0,0)},toObject:function(t){var i=e.Object.NUM_FRACTION_DIGITS,r={type:this.type,originX:this.originX,originY:this.originY,left:n(this.left,i),top:n(this.top,i),width:n(this.width,i),height:n(this.height,i),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:n(this.strokeWidth,i),strokeDashArray:this.strokeDashArray?this.strokeDashArray.concat():this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:n(this.strokeMiterLimit,i),scaleX:n(this.scaleX,i),scaleY:n(this.scaleY,i),angle:n(this.getAngle(),i),flipX:this.flipX,flipY:this.flipY,opacity:n(this.opacity,i),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,transformMatrix:this.transformMatrix?this.transformMatrix.concat():null,skewX:n(this.skewX,i),skewY:n(this.skewY,i)};return e.util.populateWithProperties(this,r,t),this.includeDefaultValues||(r=this._removeDefaultValues(r)),r},toDatalessObject:function(t){return this.toObject(t)},_removeDefaultValues:function(t){var i=e.util.getKlass(t.type).prototype,r=i.stateProperties;return r.forEach(function(e){t[e]===i[e]&&delete t[e];var r="[object Array]"===Object.prototype.toString.call(t[e])&&"[object Array]"===Object.prototype.toString.call(i[e]);r&&0===t[e].length&&0===i[e].length&&delete t[e]}),t},toString:function(){return"#"},getObjectScaling:function(){var t=this.scaleX,e=this.scaleY;if(this.group){var i=this.group.getObjectScaling();t*=i.scaleX,e*=i.scaleY}return{scaleX:t,scaleY:e}},_set:function(t,i){var r="scaleX"===t||"scaleY"===t;return r&&(i=this._constrainScale(i)),"scaleX"===t&&i<0?(this.flipX=!this.flipX,i*=-1):"scaleY"===t&&i<0?(this.flipY=!this.flipY,i*=-1):"shadow"!==t||!i||i instanceof e.Shadow?"dirty"===t&&this.group&&this.group.set("dirty",i):i=new e.Shadow(i),this[t]=i,this.cacheProperties.indexOf(t)>-1&&(this.group&&this.group.set("dirty",!0),this.dirty=!0),"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},setSourcePath:function(t){return this.sourcePath=t,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:[1,0,0,1,0,0]},render:function(t,i){0===this.width&&0===this.height||!this.visible||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),i||this.transform(t),this._setOpacity(t),this._setShadow(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.clipTo&&e.util.clipContext(this,t),this.objectCaching&&!this.group?(this.isCacheDirty(i)&&(this.statefullCache&&this.saveState({propertySet:"cacheProperties"}),this.drawObject(this._cacheContext,i),this.dirty=!1),this.drawCacheOnCanvas(t)):(this.drawObject(t,i),i&&this.objectCaching&&this.statefullCache&&this.saveState({propertySet:"cacheProperties"})),this.clipTo&&t.restore(),t.restore())},drawObject:function(t,e){this._renderBackground(t),this._setStrokeStyles(t),this._setFillStyles(t),this._render(t,e)},drawCacheOnCanvas:function(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheWidth/2,-this.cacheHeight/2)},isCacheDirty:function(t){if(!t&&this._updateCacheCanvas())return!0;if(this.dirty||this.statefullCache&&this.hasStateChanged("cacheProperties")){if(!t){var e=this._getNonTransformedDimensions();this._cacheContext.clearRect(-e.x/2,-e.y/2,e.x,e.y)}return!0}return!1},_renderBackground:function(t){if(this.backgroundColor){var e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}},_setOpacity:function(t){t.globalAlpha*=this.opacity},_setStrokeStyles:function(t){this.stroke&&(t.lineWidth=this.strokeWidth,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,t.strokeStyle=this.stroke.toLive?this.stroke.toLive(t,this):this.stroke)},_setFillStyles:function(t){this.fill&&(t.fillStyle=this.fill.toLive?this.fill.toLive(t,this):this.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),a?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){if(!(!this.active||i||this.group&&this.group!==this.canvas.getActiveGroup())){var r,n=this.getViewportTransform(),s=this.calcTransformMatrix();s=e.util.multiplyTransformMatrices(n,s),r=e.util.qrDecompose(s),t.save(),t.translate(r.translateX,r.translateY),t.lineWidth=1*this.borderScaleFactor,this.group||(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.group&&this.group===this.canvas.getActiveGroup()?(t.rotate(o(r.angle)),this.drawBordersInGroup(t,r)):(t.rotate(o(this.angle)),this.drawBorders(t)),this.drawControls(t),t.restore()}},_setShadow:function(t){if(this.shadow){var i=this.canvas&&this.canvas.viewportTransform[0]||1,r=this.canvas&&this.canvas.viewportTransform[3]||1,n=this.getObjectScaling();this.canvas&&this.canvas._isRetinaScaling()&&(i*=e.devicePixelRatio,r*=e.devicePixelRatio),t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*(i+r)*(n.scaleX+n.scaleY)/4,t.shadowOffsetX=this.shadow.offsetX*i*n.scaleX,t.shadowOffsetY=this.shadow.offsetY*r*n.scaleY}},_removeShadow:function(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)},_applyPatternGradientTransform:function(t,e){if(e.toLive){var i=e.gradientTransform||e.patternTransform;i&&t.transform.apply(t,i);var r=-this.width/2+e.offsetX||0,n=-this.height/2+e.offsetY||0;t.translate(r,n)}},_renderFill:function(t){this.fill&&(t.save(),this._applyPatternGradientTransform(t,this.fill),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())},_renderStroke:function(t){this.stroke&&0!==this.strokeWidth&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray,this._renderDashedStroke),this._applyPatternGradientTransform(t,this.stroke),t.stroke(),t.restore())},clone:function(t,i){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(i),t):new e.Object(this.toObject(i))},cloneAsImage:function(t,i){var r=this.toDataURL(i);return e.util.loadImage(r,function(i){t&&t(new e.Image(i))}),this},toDataURL:function(t){t||(t={});var i=e.util.createCanvasElement(),r=this.getBoundingRect();i.width=r.width,i.height=r.height,e.util.wrapElement(i,"div");var n=new e.StaticCanvas(i,{enableRetinaScaling:t.enableRetinaScaling});"jpg"===t.format&&(t.format="jpeg"),"jpeg"===t.format&&(n.backgroundColor="#fff");var s={active:this.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new e.Point(n.getWidth()/2,n.getHeight()/2),"center","center");var o=this.canvas;n.add(this);var a=n.toDataURL(t);return this.set(s).setCoords(),this.canvas=o,n.dispose(),n=null,a},isType:function(t){return this.type===t},complexity:function(){return 0},toJSON:function(t){return this.toObject(t)},setGradient:function(t,i){i||(i={});var r={colorStops:[]};return r.type=i.type||(i.r1||i.r2?"radial":"linear"),r.coords={x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2},(i.r1||i.r2)&&(r.coords.r1=i.r1,r.coords.r2=i.r2),r.gradientTransform=i.gradientTransform,e.Gradient.prototype.addColorStop.call(r,i.colorStops),this.set(t,e.Gradient.forObject(this,r))},setPatternFill:function(t){return this.set("fill",new e.Pattern(t))},setShadow:function(t){return this.set("shadow",t?new e.Shadow(t):null)},setColor:function(t){return this.set("fill",t),this},setAngle:function(t){var e=("center"!==this.originX||"center"!==this.originY)&&this.centeredRotation;return e&&this._setOriginToCenter(),this.set("angle",t),e&&this._resetOrigin(),this},centerH:function(){return this.canvas&&this.canvas.centerObjectH(this),this},viewportCenterH:function(){return this.canvas&&this.canvas.viewportCenterObjectH(this),this},centerV:function(){return this.canvas&&this.canvas.centerObjectV(this),this},viewportCenterV:function(){return this.canvas&&this.canvas.viewportCenterObjectV(this),this},center:function(){return this.canvas&&this.canvas.centerObject(this),this},viewportCenter:function(){return this.canvas&&this.canvas.viewportCenterObject(this),this},remove:function(){return this.canvas&&this.canvas.remove(this),this},getLocalPointer:function(t,i){i=i||this.canvas.getPointer(t);var r=new e.Point(i.x,i.y),n=this._getLeftTopCoords();return this.angle&&(r=e.util.rotatePoint(r,n,o(-this.angle))),{x:r.x-n.x,y:r.y-n.y}},_setupCompositeOperation:function(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}}),e.util.createAccessors(e.Object),e.Object.prototype.rotate=e.Object.prototype.setAngle,i(e.Object.prototype,e.Observable),e.Object.NUM_FRACTION_DIGITS=2,e.Object._fromObject=function(t,i,n,s,o){var a=e[t];if(i=r(i,!0),!s){var h=o?new a(i[o],i):new a(i);return n&&n(h),h}e.util.enlivenPatterns([i.fill,i.stroke],function(t){i.fill=t[0],i.stroke=t[1];var e=o?new a(i[o],i):new a(i);n&&n(e)})},e.Object.__uid=0)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.degreesToRadians,e={left:-.5,center:0,right:.5},i={top:-.5,center:0,bottom:.5};fabric.util.object.extend(fabric.Object.prototype,{translateToGivenOrigin:function(t,r,n,s,o){var a,h,c,l=t.x,u=t.y;return"string"==typeof r?r=e[r]:r-=.5,"string"==typeof s?s=e[s]:s-=.5,a=s-r,"string"==typeof n?n=i[n]:n-=.5,"string"==typeof o?o=i[o]:o-=.5,h=o-n,(a||h)&&(c=this._getTransformedDimensions(),l=t.x+a*c.x,u=t.y+h*c.y),new fabric.Point(l,u)},translateToCenterPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,i,r,"center","center");return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},translateToOriginPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,"center","center",i,r);return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},getCenterPoint:function(){var t=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(t,this.originX,this.originY)},getPointByOrigin:function(t,e){var i=this.getCenterPoint();return this.translateToOriginPoint(i,t,e)},toLocalPoint:function(e,i,r){var n,s,o=this.getCenterPoint();return n="undefined"!=typeof i&&"undefined"!=typeof r?this.translateToGivenOrigin(o,"center","center",i,r):new fabric.Point(this.left,this.top),s=new fabric.Point(e.x,e.y),this.angle&&(s=fabric.util.rotatePoint(s,o,-t(this.angle))),s.subtractEquals(n)},setPositionByOrigin:function(t,e,i){var r=this.translateToCenterPoint(t,e,i),n=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",n.x),this.set("top",n.y)},adjustPosition:function(i){var r,n,s=t(this.angle),o=this.getWidth(),a=Math.cos(s)*o,h=Math.sin(s)*o;r="string"==typeof this.originX?e[this.originX]:this.originX-.5,n="string"==typeof i?e[i]:i-.5,this.left+=a*(n-r),this.top+=h*(n-r),this.setCoords(),this.originX=i},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var t=this.getCenterPoint();this.originX="center",this.originY="center",this.left=t.x,this.top=t.y},_resetOrigin:function(){var t=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=t.x,this.top=t.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","top")}})}(),function(){function t(t){return[new fabric.Point(t.tl.x,t.tl.y),new fabric.Point(t.tr.x,t.tr.y),new fabric.Point(t.br.x,t.br.y),new fabric.Point(t.bl.x,t.bl.y)]}var e=fabric.util.degreesToRadians,i=fabric.util.multiplyTransformMatrices;fabric.util.object.extend(fabric.Object.prototype,{ +oCoords:null,intersectsWithRect:function(e,i){var r=t(this.oCoords),n=fabric.Intersection.intersectPolygonRectangle(r,e,i);return"Intersection"===n.status},intersectsWithObject:function(e){var i=fabric.Intersection.intersectPolygonPolygon(t(this.oCoords),t(e.oCoords));return"Intersection"===i.status||e.isContainedWithinObject(this)||this.isContainedWithinObject(e)},isContainedWithinObject:function(e){for(var i=t(this.oCoords),r=0;r<4;r++)if(!e.containsPoint(i[r]))return!1;return!0},isContainedWithinRect:function(t,e){var i=this.getBoundingRect();return i.left>=t.x&&i.left+i.width<=e.x&&i.top>=t.y&&i.top+i.height<=e.y},containsPoint:function(t){this.oCoords||this.setCoords();var e=this._getImageLines(this.oCoords),i=this._findCrossPoints(t,e);return 0!==i&&i%2===1},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s,o,a,h=0;for(var c in e)if(a=e[c],!(a.o.y=t.y&&a.d.y>=t.y||(a.o.x===a.d.x&&a.o.x>=t.x?o=a.o.x:(i=0,r=(a.d.y-a.o.y)/(a.d.x-a.o.x),n=t.y-i*t.x,s=a.o.y-r*a.o.x,o=-(n-s)/(i-r)),o>=t.x&&(h+=1),2!==h)))break;return h},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(t){var e=this.calcCoords(t);return fabric.util.makeBoundingBoxFromPoints([e.tl,e.tr,e.br,e.bl])},getWidth:function(){return this._getTransformedDimensions().x},getHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)0?Math.atan(o/s):0,l=s/Math.cos(c)/2,u=Math.cos(c+i)*l,f=Math.sin(c+i)*l,d=this.getCenterPoint(),g=t?d:fabric.util.transformPoint(d,r),p=new fabric.Point(g.x-u,g.y-f),v=new fabric.Point(p.x+s*h,p.y+s*a),b=new fabric.Point(p.x-o*a,p.y+o*h),m=new fabric.Point(g.x+u,g.y+f);if(!t)var y=new fabric.Point((p.x+b.x)/2,(p.y+b.y)/2),_=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point((m.x+v.x)/2,(m.y+v.y)/2),C=new fabric.Point((m.x+b.x)/2,(m.y+b.y)/2),S=new fabric.Point(_.x+a*this.rotatingPointOffset,_.y-h*this.rotatingPointOffset);var g={tl:p,tr:v,br:m,bl:b};return t||(g.ml=y,g.mt=_,g.mr=x,g.mb=C,g.mtr=S),g},setCoords:function(t,e){return this.oCoords=this.calcCoords(t),e||t||(this.absoluteCoords=this.calcCoords(!0)),t||this._setCornerCoords&&this._setCornerCoords(),this},_calcRotateMatrix:function(){if(this.angle){var t=e(this.angle),i=Math.cos(t),r=Math.sin(t);return[i,r,-r,i,0,0]}return[1,0,0,1,0,0]},calcTransformMatrix:function(){var t=this.getCenterPoint(),e=[1,0,0,1,t.x,t.y],r=this._calcRotateMatrix(),n=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0),s=this.group?this.group.calcTransformMatrix():[1,0,0,1,0,0];return s=i(s,e),s=i(s,r),s=i(s,n)},_calcDimensionsTransformMatrix:function(t,r,n){var s=[1,0,Math.tan(e(t)),1],o=[1,Math.tan(e(r)),0,1],a=this.scaleX*(n&&this.flipX?-1:1),h=this.scaleY*(n&&this.flipY?-1:1),c=[a,0,0,h],l=i(c,s,!0);return i(l,o,!0)}})}(),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(t){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,t):this.canvas.sendBackwards(this,t),this},bringForward:function(t){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,t):this.canvas.bringForward(this,t),this},moveTo:function(t){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,t):this.canvas.moveTo(this,t),this}}),function(){function t(t,e){if(e){if(e.toLive)return t+": url(#SVGID_"+e.id+"); ";var i=new fabric.Color(e),r=t+": "+i.toRgb()+"; ",n=i.getAlpha();return 1!==n&&(r+=t+"-opacity: "+n.toString()+"; "),r}return t+": none; "}fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(e){var i=this.fillRule,r=this.strokeWidth?this.strokeWidth:"0",n=this.strokeDashArray?this.strokeDashArray.join(" "):"none",s=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h="undefined"!=typeof this.opacity?this.opacity:"1",c=this.visible?"":" visibility: hidden;",l=e?"":this.getSvgFilter(),u=t("fill",this.fill),f=t("stroke",this.stroke);return[f,"stroke-width: ",r,"; ","stroke-dasharray: ",n,"; ","stroke-linecap: ",s,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",i,"; ","opacity: ",h,";",l,c].join("")},getSvgFilter:function(){return this.shadow?"filter: url(#SVGID_"+this.shadow.id+");":""},getSvgId:function(){return this.id?'id="'+this.id+'" ':""},getSvgTransform:function(){if(this.group&&"path-group"===this.group.type)return"";var t=fabric.util.toFixed,e=this.getAngle(),i=this.getSkewX()%360,r=this.getSkewY()%360,n=this.getCenterPoint(),s=fabric.Object.NUM_FRACTION_DIGITS,o="path-group"===this.type?"":"translate("+t(n.x,s)+" "+t(n.y,s)+")",a=0!==e?" rotate("+t(e,s)+")":"",h=1===this.scaleX&&1===this.scaleY?"":" scale("+t(this.scaleX,s)+" "+t(this.scaleY,s)+")",c=0!==i?" skewX("+t(i,s)+")":"",l=0!==r?" skewY("+t(r,s)+")":"",u="path-group"===this.type?this.width:0,f=this.flipX?" matrix(-1 0 0 1 "+u+" 0) ":"",d="path-group"===this.type?this.height:0,g=this.flipY?" matrix(1 0 0 -1 0 "+d+")":"";return[o,a,h,f,g,c,l].join("")},getSvgTransformMatrix:function(){return this.transformMatrix?" matrix("+this.transformMatrix.join(" ")+") ":""},_createBaseSVGMarkup:function(){var t=[];return this.fill&&this.fill.toLive&&t.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&t.push(this.stroke.toSVG(this,!1)),this.shadow&&t.push(this.shadow.toSVG(this)),t}})}(),function(){function t(t,e,r){var n={},s=!0;r.forEach(function(e){n[e]=t[e]}),i(t[e],n,s)}function e(t,i,r){if(!fabric.isLikelyNode&&t instanceof Element)return t===i;if(t instanceof Array){if(t.length!==i.length)return!1;for(var n=0,s=t.length;n\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e){e=e||{};var n=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),s=[n.x1||0,n.y1||0,n.x2||0,n.y2||0];return e.originX="left",e.originY="top",new i.Line(s,r(n,e))},i.Line.fromObject=function(t,e,r){function s(t){delete t.points,e&&e(t)}var o=n(t,!0);o.points=[t.x1,t.y1,t.x2,t.y2];var a=i.Object._fromObject("Line",o,s,r,"points");return a&&delete a.points,a}}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){return"radius"in t&&t.radius>=0}var i=t.fabric||(t.fabric={}),r=Math.PI,n=i.util.object.extend;if(i.Circle)return void i.warn("fabric.Circle is already defined.");var s=i.Object.prototype.cacheProperties.concat();s.push("radius"),i.Circle=i.util.createClass(i.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*r,cacheProperties:s,initialize:function(t){this.callSuper("initialize",t),this.set("radius",t&&t.radius||0)},_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,n=0,s=(this.endAngle-this.startAngle)%(2*r);if(0===s)this.group&&"path-group"===this.group.type&&(i=this.left+this.radius,n=this.top+this.radius),e.push("\n');else{var o=Math.cos(this.startAngle)*this.radius,a=Math.sin(this.startAngle)*this.radius,h=Math.cos(this.endAngle)*this.radius,c=Math.sin(this.endAngle)*this.radius,l=s>r?"1":"0";e.push('\n')}return t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.arc(e?this.left+this.radius:0,e?this.top+this.radius:0,this.radius,this.startAngle,this.endAngle,!1),this._renderFill(t),this._renderStroke(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)},complexity:function(){return 1}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r){r||(r={});var s=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(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 i.Circle(n(s,r));return o.left-=o.radius,o.top-=o.radius,o},i.Circle.fromObject=function(t,e,r){return i.Object._fromObject("Circle",t,e,r)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});return e.Triangle?void e.warn("fabric.Triangle is already defined"):(e.Triangle=e.util.createClass(e.Object,{type:"triangle",initialize:function(t){this.callSuper("initialize",t),this.set("width",t&&t.width||100).set("height",t&&t.height||100)},_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=this.width/2,r=this.height/2;t.beginPath(),e.util.drawDashedLine(t,-i,r,0,-r,this.strokeDashArray),e.util.drawDashedLine(t,0,-r,i,r,this.strokeDashArray),e.util.drawDashedLine(t,i,r,-i,r,this.strokeDashArray),t.closePath()},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.width/2,r=this.height/2,n=[-i+" "+r,"0 "+-r,i+" "+r].join(",");return e.push("'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),void(e.Triangle.fromObject=function(t,i,r){return e.Object._fromObject("Triangle",t,i,r)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=2*Math.PI,r=e.util.object.extend;if(e.Ellipse)return void e.warn("fabric.Ellipse is already defined.");var n=e.Object.prototype.cacheProperties.concat();n.push("rx","ry"),e.Ellipse=e.util.createClass(e.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:n,initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,r=0;return this.group&&"path-group"===this.group.type&&(i=this.left+this.rx,r=this.top+this.ry),e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(e?this.left+this.rx:0,e?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)},complexity:function(){return 1}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i){i||(i={});var n=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Ellipse(r(n,i));return s.top-=s.ry,s.left-=s.rx,s},e.Ellipse.fromObject=function(t,i,r){return e.Object._fromObject("Ellipse",t,i,r)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;if(e.Rect)return void e.warn("fabric.Rect is already defined");var r=e.Object.prototype.stateProperties.concat();r.push("rx","ry"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(t){this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t,e){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var i=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,n=this.width,s=this.height,o=e?this.left:-this.width/2,a=e?this.top:-this.height/2,h=0!==i||0!==r,c=.4477152502;t.beginPath(),t.moveTo(o+i,a),t.lineTo(o+n-i,a),h&&t.bezierCurveTo(o+n-c*i,a,o+n,a+c*r,o+n,a+r),t.lineTo(o+n,a+s-r),h&&t.bezierCurveTo(o+n,a+s-c*r,o+n-c*i,a+s,o+n-i,a+s),t.lineTo(o+i,a+s),h&&t.bezierCurveTo(o+c*i,a+s,o,a+s-c*r,o,a+s-r),t.lineTo(o,a+r),h&&t.bezierCurveTo(o,a+c*r,o+c*i,a,o+i,a),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=-this.width/2,r=-this.height/2,n=this.width,s=this.height;t.beginPath(),e.util.drawDashedLine(t,i,r,i+n,r,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r,i+n,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r+s,i,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i,r+s,i,r,this.strokeDashArray),t.closePath()},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.left,r=this.top;return this.group&&"path-group"===this.group.type||(i=-this.width/2,r=-this.height/2),e.push("\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r){if(!t)return null;r=r||{};var n=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Rect(i(r?e.util.object.clone(r):{},n));return s.visible=s.visible&&s.width>0&&s.height>0,s},e.Rect.fromObject=function(t,i,r){return e.Object._fromObject("Rect",t,i,r)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});if(e.Polyline)return void e.warn("fabric.Polyline is already defined");var i=e.Object.prototype.cacheProperties.concat();i.push("points"),e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,cacheProperties:i,initialize:function(t,i){return e.Polygon.prototype.initialize.call(this,t,i)},_calcDimensions:function(){return e.Polygon.prototype._calcDimensions.call(this)},toObject:function(t){return e.Polygon.prototype.toObject.call(this,t)},toSVG:function(t){return e.Polygon.prototype.toSVG.call(this,t)},_render:function(t,i){e.Polygon.prototype.commonRender.call(this,t,i)&&(this._renderFill(t),this._renderStroke(t))},_renderDashedStroke:function(t){var i,r;t.beginPath();for(var n=0,s=this.points.length;n\n'),t?t(r.join("")):r.join("")},_render:function(t,e){this.commonRender(t,e)&&(this._renderFill(t),(this.stroke||this.strokeDashArray)&&(t.closePath(),this._renderStroke(t)))},commonRender:function(t,e){var i,r=this.points.length,n=e?0:this.pathOffset.x,s=e?0:this.pathOffset.y;if(!r||isNaN(this.points[r-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-n,this.points[0].y-s);for(var o=0;o"},toObject:function(t){var e=n(this.callSuper("toObject",["sourcePath","pathOffset"].concat(t)),{ +path:this.path.map(function(t){return t.slice()})});return e},toDatalessObject:function(t){var e=this.toObject(t);return this.sourcePath&&(e.path=this.sourcePath),delete e.sourcePath,e},toSVG:function(t){for(var e=[],i=this._createBaseSVGMarkup(),r="",n=0,s=this.path.length;n\n"),t?t(i.join("")):i.join("")},complexity:function(){return this.path.length},_parsePath:function(){for(var t,e,i,r,n,s=[],o=[],c=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi,l=0,u=this.path.length;lp)for(var b=1,m=n.length;b\n");for(var s=0,o=e.length;s\n"),t?t(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var t=this.getObjects()[0].get("fill")||"";return"string"==typeof t&&(t=t.toLowerCase(),this.getObjects().every(function(e){var i=e.get("fill")||"";return"string"==typeof i&&i.toLowerCase()===t}))},complexity:function(){return this.paths.reduce(function(t,e){return t+(e&&e.complexity?e.complexity():0)},0)},getObjects:function(){return this.paths}}),e.PathGroup.fromObject=function(t,i){"string"==typeof t.paths?e.loadSVGFromURL(t.paths,function(r){var n=t.paths;delete t.paths;var s=e.util.groupSVGElements(r,t,n);i(s)}):e.util.enlivenObjects(t.paths,function(r){delete t.paths,i(new e.PathGroup(r,t))})},void(e.PathGroup.async=!0))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max;if(!e.Group){var s={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};e.Group=e.util.createClass(e.Object,e.Collection,{type:"group",strokeWidth:0,subTargetCheck:!1,initialize:function(t,e,i){e=e||{},this._objects=[],i&&this.callSuper("initialize",e),this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},e.originX&&(this.originX=e.originX),e.originY&&(this.originY=e.originY),i?this._updateObjectsCoords(!0):(this._calcBounds(),this._updateObjectsCoords(),this.callSuper("initialize",e)),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(t){for(var e=this.getCenterPoint(),i=this._objects.length;i--;)this._updateObjectCoords(this._objects[i],e,t)},_updateObjectCoords:function(t,e,i){if(t.__origHasControls=t.hasControls,t.hasControls=!1,!i){var r=t.getLeft(),n=t.getTop(),s=!0;t.set({originalLeft:r,originalTop:n,left:r-e.x,top:n-e.y}),t.setCoords(s)}},toString:function(){return"#"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,this},_setObjectActive:function(t){t.set("active",!0),t.group=this},removeWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),this.forEachObject(this._setObjectActive,this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group,t.set("active",!1)},delegatedProperties:{fill:!0,stroke:!0,strokeWidth:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(t,e){var i=this._objects.length;if(this.delegatedProperties[t]||"canvas"===t)for(;i--;)this._objects[i].set(t,e);else for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){var e=this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toObject(t);return e.includeDefaultValues=i,r});return i(this.callSuper("toObject",t),{objects:e})},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},drawObject:function(t){for(var e=0,i=this._objects.length;e\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")},get:function(t){if(t in s){if(this[t])return this[t];for(var e=0,i=this._objects.length;e\n',"\n"),this.stroke||this.strokeDashArray){var o=this.fill;this.fill=null,e.push("\n'),this.fill=o}return e.push("\n"),t?t(e.join("")):e.join("")},getSrc:function(t){var e=t?this._element:this._originalElement;return e?fabric.isLikelyNode?e._src:e.src:this.src||""},setSrc:function(t,e,i){fabric.util.loadImage(t,function(t){return this.setElement(t,e,i)},this,i&&i.crossOrigin)},toString:function(){return'#'},applyFilters:function(t,e,i,r){if(e=e||this.filters,i=i||this._originalElement){var n,s,o=fabric.util.createImage(),a=this.canvas?this.canvas.getRetinaScaling():fabric.devicePixelRatio,h=this.minimumScaleTrigger/a,c=this;if(0===e.length)return this._element=i,t&&t(this),i;var l=fabric.util.createCanvasElement();return l.width=i.width,l.height=i.height,l.getContext("2d").drawImage(i,0,0,i.width,i.height),e.forEach(function(t){t&&(r?(n=c.scaleX0?90*Math.round((t-1)/90):90*Math.round(t/90)},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(t){t=t||{};var e=function(){},i=t.onComplete||e,r=t.onChange||e,n=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(t){n.setAngle(t),r()},onComplete:function(){n.setCoords(),i()},onStart:function(){n.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(t){return t.straighten(),this.renderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),fabric.Image.filters.BaseFilter.fromObject=function(t,e){var i=new fabric.Image.filters[t.type](t);return e&&e(i),i},function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.Brightness=n(r.BaseFilter,{type:"Brightness",initialize:function(t){t=t||{},this.brightness=t.brightness||0},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.brightness,s=0,o=r.length;sb||o<0||o>v||(h=4*(a*v+o),c=l[S*d+w],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,n+=p[h+3]*c);y[s]=e,y[s+1]=i,y[s+2]=r,y[s+3]=n+_*(255-n)}u.putImageData(m,0,0)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.GradientTransparency=n(r.BaseFilter,{type:"GradientTransparency",initialize:function(t){t=t||{},this.threshold=t.threshold||100},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.threshold,s=r.length,o=0,a=r.length;o-1?t.channel:0},applyTo:function(t){if(this.mask){var i,r=t.getContext("2d"),n=r.getImageData(0,0,t.width,t.height),s=n.data,o=this.mask.getElement(),a=e.util.createCanvasElement(),h=this.channel,c=n.width*n.height*4;a.width=t.width,a.height=t.height,a.getContext("2d").drawImage(o,0,0,t.width,t.height);var l=a.getContext("2d").getImageData(0,0,t.width,t.height),u=l.data;for(i=0;ic&&i>c&&r>c&&l(e-i)i&&(l=2,f=-1),a>n&&(u=2,d=-1),h=c.getImageData(0,0,i,n),t.width=o(s,i),t.height=o(a,n),c.putImageData(h,0,0);!g||!p;)i=v,n=b,s*ft)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return h(e)*h(i)/e/i}}function f(t){var h,c,u,d,g,k,P,M,A,D,I;for(T.x=(t+.5)*y,j.x=r(T.x),h=0;h=e)){D=r(1e3*s(c-T.x)),O[D]||(O[D]={});for(var E=j.y-w;E<=j.y+w;E++)E<0||E>=o||(I=r(1e3*s(E-T.y)),O[D][I]||(O[D][I]=m(n(i(D*x,2)+i(I*C,2))/1e3)),u=O[D][I],u>0&&(d=4*(E*e+c),g+=u,k+=u*v[d],P+=u*v[d+1],M+=u*v[d+2],A+=u*v[d+3]))}d=4*(h*a+t),b[d]=k/g,b[d+1]=P/g,b[d+2]=M/g,b[d+3]=A/g}return++t1&&L<-1||(x=2*L*L*L-3*L*L+1,x>0&&(E=4*(I+P*e),j+=x*p[E+3],S+=x,p[E+3]<255&&(x=x*p[E+3]/250),w+=x*p[E],O+=x*p[E+1],T+=x*p[E+2],C+=x))}b[_]=w/C,b[_+1]=O/C,b[_+2]=T/C,b[_+3]=j/S}return v},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.ColorMatrix=n(r.BaseFilter,{type:"ColorMatrix",initialize:function(t){t||(t={}),this.matrix=t.matrix||[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]},applyTo:function(t){var e,i,r,n,s,o=t.getContext("2d"),a=o.getImageData(0,0,t.width,t.height),h=a.data,c=h.length,l=this.matrix;for(e=0;e'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=2*Math.ceil(this.fontSize);return t.width+=e,t.height+=e,t},_render:function(t){this._setTextStyles(t),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._renderTextLinesBackground(t),this._renderText(t),this._renderTextDecoration(t)},_renderText:function(t){this._renderTextFill(t),this._renderTextStroke(t)},_setTextStyles:function(t){t.textBaseline="alphabetic",t.font=this._getFontDeclaration()},_getTextHeight:function(){return this._getHeightOfSingleLine()+(this._textLines.length-1)*this._getHeightOfLine()},_getTextWidth:function(t){for(var e=this._getLineWidth(t,0),i=1,r=this._textLines.length;ie&&(e=n)}return e},_renderChars:function(t,e,i,r,n){var s,o,a=t.slice(0,-4);if(this[a].toLive){var h=-this.width/2+this[a].offsetX||0,c=-this.height/2+this[a].offsetY||0;e.save(),e.translate(h,c),r-=h,n-=c}if(0!==this.charSpacing){var l=this._getWidthOfCharSpacing();i=i.split("");for(var u=0,f=i.length;u0?o:0}else e[t](i,r,n);this[a].toLive&&e.restore()},_renderTextLine:function(t,e,i,r,n,s){n-=this.fontSize*this._fontSizeFraction;var o=this._getLineWidth(e,s);if("justify"!==this.textAlign||this.width0?u/f:0,g=0,p=0,v=h.length;p0?n:0},_getLeftOffset:function(){return-this.width/2},_getTopOffset:function(){return-this.height/2},isEmptyStyles:function(){return!0},_renderTextCommon:function(t,e){for(var i=0,r=this._getLeftOffset(),n=this._getTopOffset(),s=0,o=this._textLines.length;s0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;t.fillStyle=s,this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearDimensionCache:function(){var t=this._forceClearCache;return t||(t=this.hasStateChanged("_dimensionAffectingProps")),t&&(this.saveState({propertySet:"_dimensionAffectingProps"}),this.dirty=!0),t},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_getWidthOfCharSpacing:function(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0},_measureLine:function(t,e){var i,r,n=this._textLines[e],s=t.measureText(n).width,o=0;return 0!==this.charSpacing&&(i=n.split("").length,o=(i-1)*this._getWidthOfCharSpacing()),r=s+o,r>0?r:0},_renderTextDecoration:function(t){function e(e){var n,s,o,a,h,c,l,u=0;for(n=0,s=r._textLines.length;n-1&&n.push(.85),this.textDecoration.indexOf("line-through")>-1&&n.push(.43),this.textDecoration.indexOf("overline")>-1&&n.push(-.12),n.length>0&&e(n)}},_getFontDeclaration:function(){return[e.isLikelyNode?this.fontWeight:this.fontStyle,e.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",e.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(t,e){this.visible&&(this._shouldClearDimensionCache()&&(this._setTextStyles(t),this._initDimensions(t)),this.callSuper("render",t,e))},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=["text","fontSize","fontWeight","fontFamily","fontStyle","lineHeight","textDecoration","textAlign","textBackgroundColor","charSpacing"].concat(t);return this.callSuper("toObject",e)},toSVG:function(t){this.ctx||(this.ctx=e.util.createCanvasElement().getContext("2d"));var i=this._createBaseSVGMarkup(),r=this._getSVGLeftTopOffsets(this.ctx),n=this._getSVGTextAndBg(r.textTop,r.textLeft);return this._wrapSVGTextAndBg(i,n),t?t(i.join("")):i.join("")},_getSVGLeftTopOffsets:function(t){var e=this._getHeightOfLine(t,0),i=-this.width/2,r=0;return{textLeft:i+(this.group&&"path-group"===this.group.type?this.left:0),textTop:r+(this.group&&"path-group"===this.group.type?-this.top:0),lineTop:e}},_wrapSVGTextAndBg:function(t,e){var i=!0,r=this.getSvgFilter(),n=""===r?"":' style="'+r+'"';t.push("\t\n",e.textBgRects.join(""),"\t\t\n',e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i=[],r=[],n=0;this._setSVGBg(r);for(var s=0,o=this._textLines.length;s",e.util.string.escapeXml(this._textLines[t]),"\n")},_setSVGTextLineJustifed:function(t,n,s,o){var a=e.util.createCanvasElement().getContext("2d");this._setTextStyles(a);var h,c,l=this._textLines[t],u=l.split(/\s+/),f=this._getWidthOfWords(a,u.join("")),d=this.width-f,g=u.length-1,p=g>0?d/g:0,v=this._getFillAttributes(this.fill);for(o+=this._getLineLeftOffset(this._getLineWidth(a,t)),t=0,c=u.length;t",e.util.string.escapeXml(h),"\n"),o+=this._getWidthOfWords(a,h)+p},_setSVGTextLineBg:function(t,e,n,s,o){t.push("\t\t\n')},_setSVGBg:function(t){this.backgroundColor&&t.push("\t\t\n')},_getFillAttributes:function(t){var i=t&&"string"==typeof t?new e.Color(t):"";return i&&i.getSource()&&1!==i.getAlpha()?'opacity="'+i.getAlpha()+'" fill="'+i.setAlpha(1).toRgb()+'"':'fill="'+t+'"'},_set:function(t,e){this.callSuper("_set",t,e),this._dimensionAffectingProps.indexOf(t)>-1&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),e.Text.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),e.Text.DEFAULT_SVG_FONT_SIZE=16,e.Text.fromElement=function(t,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t,i,r){return e.Object._fromObject("Text",t,i,r,"text")},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=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,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r0?a:0,lineLeft:r},this.cursorOffsetCache=i,this.cursorOffsetCache},renderCursor:function(t,e){var i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(e,r)):t.leftOffset,a=this.scaleX*this.canvas.getZoom(),h=this.cursorWidth/a;e.fillStyle=this.getCurrentCharColor(r,n),e.globalAlpha=this.__isMousedown?1:this._currentCursorOpacity,e.fillRect(t.left+o-h/2,t.top+t.topOffset,h,s)},renderSelection:function(t,e,i){i.fillStyle=this.selectionColor;for(var r=this.get2DCursorLocation(this.selectionStart),n=this.get2DCursorLocation(this.selectionEnd),s=r.lineIndex,o=n.lineIndex,a=s;a<=o;a++){var h=this._getLineLeftOffset(this._getLineWidth(i,a))||0,c=this._getHeightOfLine(this.ctx,a),l=0,u=0,f=this._textLines[a];if(a===s){for(var d=0,g=f.length;d=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u>0?u:0,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0;var a,h,c=this._getHeightOfLine(e,s),l="";e.save(),n-=c/this.lineHeight*this._fontSizeFraction;for(var u=o,f=i.length+o;u<=f;u++)a=a||this.getCurrentCharStyle(s,u),h=this.getCurrentCharStyle(s,u+1),(this._hasStyleChanged(a,h)||u===f)&&(this._renderChar(t,e,s,u-1,l,r,n,c),l="",a=h),l+=i[u-o];e.restore()},_renderCharsFast:function(t,e,i,r,n){"fillText"===t&&this.fill&&this.callSuper("_renderChars",t,e,i,r,n),"strokeText"===t&&(this.stroke&&this.strokeWidth>0||this.skipFillStrokeCheck)&&this.callSuper("_renderChars",t,e,i,r,n)},_renderChar:function(t,e,i,r,n,s,o,a){var h,c,l,u,f,d,g,p,v,b=this._getStyleDeclaration(i,r);if(b?(c=this._getHeightOfChar(e,n,i,r),u=b.stroke,l=b.fill,d=b.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,b&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,b||null),d=d||this.textDecoration,b&&b.textBackgroundColor&&this._removeShadow(e),0!==this.charSpacing){p=this._getWidthOfCharSpacing(),g=n.split(""),h=0;for(var m,y=0,_=g.length;y<_;y++)m=g[y],l&&e.fillText(m,s+h,o),u&&e.strokeText(m,s+h,o),v=e.measureText(m).width+p,h+=v>0?v:0}else l&&e.fillText(n,s,o),u&&e.strokeText(n,s,o);(d||""!==d)&&(f=this._fontSizeFraction*a/this.lineHeight,this._renderCharDecoration(e,d,s,o,f,h,c)),b&&e.restore(),e.translate(h,0)},_hasStyleChanged:function(t,e){return t.fill!==e.fill||t.fontSize!==e.fontSize||t.textBackgroundColor!==e.textBackgroundColor||t.textDecoration!==e.textDecoration||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth},_renderCharDecoration:function(t,e,i,r,n,s,o){if(e){var a,h,c=o/15,l={underline:r+o/10,"line-through":r-o*(this._fontSizeFraction+this._fontSizeMult-1)+c,overline:r-(this._fontSizeMult-this._fontSizeFraction)*o},u=["underline","line-through","overline"];for(a=0;a-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset();t.save();for(var l=0,u=this._textLines.length;l0?n:0},_getHeightOfChar:function(t,e,i){var r=this._getStyleDeclaration(e,i);return r&&r.fontSize?r.fontSize:this.fontSize},_getWidthOfCharsAt:function(t,e,i){var r,n,s=0;for(r=0;r0?i:0},_getWidthOfSpace:function(t,e){if(this.__widthOfSpace[e])return this.__widthOfSpace[e];var i=this._textLines[e],r=this._getWidthOfWords(t,i,e,0),n=this.width-r,s=i.length-i.replace(this._reSpacesAndTabs,"").length,o=Math.max(n/s,t.measureText(" ").width);return this.__widthOfSpace[e]=o,o},_getWidthOfWords:function(t,e,i,r){for(var n=0,s=0;sr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},_updateTextarea:function(){if(this.hiddenTextarea&&!this.inCompositionMode&&(this.cursorOffsetCache={},this.hiddenTextarea.value=this.text,this.hiddenTextarea.selectionStart=this.selectionStart,this.hiddenTextarea.selectionEnd=this.selectionEnd,this.selectionStart===this.selectionEnd)){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top,this.hiddenTextarea.style.fontSize=t.fontSize}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.text.split(""),e=this._getCursorBoundaries(t,"cursor"),i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(this.ctx,r)):e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.upperCanvasEl,l=c.width-s,u=c.height-s;return h=fabric.util.transformPoint(h,a),h=fabric.util.transformPoint(h,this.canvas.viewportTransform),h.x<0&&(h.x=0),h.x>l&&(h.x=l),h.y<0&&(h.y=0),h.y>u&&(h.y=u),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea.blur&&this.hiddenTextarea.blur(),this.hiddenTextarea&&this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.selectionStart=t,this.selectionEnd=t},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&this._removeCharsFromTo(this.selectionStart,this.selectionEnd),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")},setSelectionStartEndWithShift:function(t,e,i){i<=t?(e===t?this._selectionDirection="left":"right"===this._selectionDirection&&(this._selectionDirection="left",this.selectionEnd=t),this.selectionStart=i):i>t&&it?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),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(t){this.__newClickTime=+new Date;var e=this.canvas.getPointer(t.e);this.isTripleClick(e)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this._fireSelectionChanged(),this._updateTextarea()},getSelectionStartFromPointer:function(t){for(var e,i,r=this.getLocalPointer(t),n=0,s=0,o=0,a=0,h=0,c=this._textLines.length;hs?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.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"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},_getWidthBeforeCursor:function(t,e){for(var i,r=this._textLines[t].slice(0,e),n=this._getLineWidth(this.ctx,t),s=this._getLineLeftOffset(n),o=0,a=r.length;oe){i=!0;var f=o-u,d=o,g=Math.abs(f-e),p=Math.abs(d-e);a=p=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){var i="get"+t+"CursorOffset",r=this[i](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(r):this.moveCursorWithoutShift(r),0!==r&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==typeof r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,i+=e.shiftKey?"Shift":"outShift",this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this.text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(t):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.set("dirty",!0),this.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={});e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:2,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,noScaleCache:!1,initialize:function(t,i){this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this.ctx=this.objectCaching?this._cacheContext:e.util.createCanvasElement().getContext("2d"),this._dimensionAffectingProps.push("width")},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t),this.clearContextTop()),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(t),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n0?(e=0,i++,t++):" "===this.text[i]&&n>0&&(e++,i++),r[n]={line:t,offset:e},i+=this._textLines[n].length,e+=this._textLines[n].length;return r},_getStyleDeclaration:function(t,e,i){if(this._styleMap){var r=this._styleMap[t];if(!r)return i?{}:null;t=r.line,e=r.offset+e}return this.callSuper("_getStyleDeclaration",t,e,i)},_setStyleDeclaration:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,this.styles[t][e]=i},_deleteStyleDeclaration:function(t,e){var i=this._styleMap[t];t=i.line,e=i.offset+e,delete this.styles[t][e]},_getLineStyle:function(t){var e=this._styleMap[t];return this.styles[e.line]},_setLineStyle:function(t,e){var i=this._styleMap[t];this.styles[i.line]=e},_deleteLineStyle:function(t){var e=this._styleMap[t];delete this.styles[e.line]},_wrapText:function(t,e){var i,r=e.split(this._reNewline),n=[];for(i=0;i=this.width&&!d?(n.push(s),s="",r=l,d=!0):r+=g,d||(s+=c),s+=a,u=this._measureText(t,c,i,h),h++,d=!1,l>f&&(f=l);return p&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f-g),n},_splitTextIntoLines:function(t){t=t||this.ctx;var e=this.textAlign;this._styleMap=null,t.save(),this._setTextStyles(t),this.textAlign="left";var i=this._wrapText(t,this.text);return this.textAlign=e,t.restore(),this._textLines=i,this._styleMap=this._generateStyleMap(),i},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){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(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height,i=i||{},i.nodeCanvas=s,i.nodeCacheCanvas=o;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.nodeCanvas=s,h.nodeCacheCanvas=o,h.contextContainer=s.getContext("2d"),h.contextCache=o.getContext("2d"),h.Font=Canvas.Font,h};var originaInitStatic=fabric.StaticCanvas.prototype._initStatic;fabric.StaticCanvas.prototype._initStatic=function(t,e){t=t||fabric.document.createElement("canvas"),this.nodeCanvas=new Canvas(t.width,t.height),this.nodeCacheCanvas=new Canvas(t.width,t.height),originaInitStatic.call(this,t,e),this.contextContainer=this.nodeCanvas.getContext("2d"),this.contextCache=this.nodeCacheCanvas.getContext("2d"),this.Font=Canvas.Font; +},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)},fabric.StaticCanvas.prototype._initRetinaScaling=function(){if(this._isRetinaScaling())return this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.nodeCanvas.width=this.width*fabric.devicePixelRatio,this.nodeCanvas.height=this.height*fabric.devicePixelRatio,this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio),this},fabric.Canvas&&(fabric.Canvas.prototype._initRetinaScaling=fabric.StaticCanvas.prototype._initRetinaScaling);var origSetBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension;fabric.StaticCanvas.prototype._setBackstoreDimension=function(t,e){return origSetBackstoreDimension.call(this,t,e),this.nodeCanvas[t]=e,this},fabric.Canvas&&(fabric.Canvas.prototype._setBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension)}}(); \ No newline at end of file diff --git a/dist/fabric.min.js.gz b/dist/fabric.min.js.gz index 62aa0f42e1fef17378b6f4b2960e99a310911956..3e92aaf9bff64a4a539695a42e1357c1b3b0ede1 100644 GIT binary patch literal 69315 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 G~LfhIx+oDi9@N4^TRa}#7R#8n(b!zz~ zdGkeQH0mCpk+M^OxO^V-T@0IC!XXFv9^s#0;5(gi3fe1S8nI^vEMO!NB3aF|tW>V| zI}q-A+hUwI>h=fzfZ>{p`xabB`IU;Vk(;#wM*u!R!M`Yht4IFO?G2s>qg=Q}fhyvA z@+`#*e?FWJ2txbh+yo(FpIW-V0pV-qffjOl8W0*_G&gB0Ym@h6M>?t~UZX!a5L!;? z9qbT#QC}r#ncvXslId3A9sKTL{1BFKj|2ej0DVvi17_aclD|m!=>Zvo;X@HV#PCkv zRh5*+tk>zJwjTOzbLFo74FFbreSt58g@}|jZT8uE90tu|#O-r5Q`MIYODUBE%wk?( z!G%>C3?vZyahfFQEbHD3G&Ybi+kr*`D$gP1F=Dodq&zI`-)R0-i!>?eAkcYJst*^$ zh&!YgK7}G0MJXj_LUAXs;u+;u0ZHcI4Wm-I)7HUCC$5qZ)MQpFpuU#v`DNJ;Eib+OhKhYP2S20>t*3(|R}J#J|lB#}OsNI$9|ebd9{P6MEl83}-> zGpQm?IlWv=Ouug|1uOdEm-@yO&{~tF;MbfSR+)LfevwA?(b{^vq1aBVv>N*h2#gIH z&!hb5Q<|)Knn!5W2Q>h$2C|EjBFnEo*4ubmd(|?GF=mH&nevilK&rXswT5B4BqpT8 z<;Tur=uHT?4?t=T`r+wNfXsJ9JS~jvJTvtq7LPR+k2MwtI(ZyV+JU(!9f`bqhYBml z8Y|=ba+MNaItm;24q=SJ6F@EwOx3&B=TF)a+q9oJduk=n-B2c>Syaw|fpO>XW^jK>*!K z0n;(){#J&z6uLQ-X@`_1Lt6~JIE$Z5{3Z;Ct=T5MvbE`rS>tqT)QHa#VIZZz{Ko9o zd~0-znl1=sagkpJIl~t&7bwFyLQ)j^@kFdB)`%BIrIO=pBA2}F0KEf^6Q2+mq_6*^ zjEu1mg_t~G>nat9Y2*w|lGxvqYGJjReP@VW=;4qH5xpEw-8wr*J$sd*q~k-Zy&4#c zhqM45hZNY}qcpEZot${5Z`=B`L6I-#V#mVPGIlcEnv`}jxy+5#E>86>PDk-Lg`L3)LqFJDvgA8XVI+#n1jo(wp=tD zArn!@In*7Kayfqf<-_^g&o7Tp-+lb~{PnvZ-<_W5XDVdz(u>xjO*o5`L2wc2)jWV+ zq~g2NBdL2`#P|}K)fQ1&NFsNhybkm5m(TCTDOQ(4{`R#gk$`oFiCjL6UjR2172gFr zLx0l$V~Y{euN&&v7~6gm^N}O!2@$_d@C+Wf&t1R1$`lz1ad7S$p^&+pgh?a zlg^r1Ohb{K1Yb&-hi0d9V?0NW5wIWQq$6>IokWt=0nqlc==Ph6Mp#sU2rBI&VAu5Eg3n}wvg;;Y>_7=%x(t44I?>?ae4hEm)pm&<9O-o}P5T55=X1b$C&Jn3 z{s2zY>2fpUulYROEX5nGnZMsCO{}6>;V7BZ)`af^>Zz@qV*pizKow2243d|Q=N&Vv zscN)pw-bbSL@rpjk2JvSWjuQYV;4>qBOqAE`a(DRVhsjVfv+cDnYU9yvRNi`q+tp$hr85VgspkQ5~G`eg< z;X~xQ`i0%3d*ikBh`r)S@!BDbrJ8+P$}W!@%#V`b`7&Cgll25GH9G?p^@XCgBI?PJ zu!wHL^MI#2gy_FBF*7RKwhvpeNAWk5C#7$V(PfrYWC6r{mLJXekKrcEV5SfrVaGs| zge-}TL_y2!HNT3;y%wD#t{&bq_} z1Dp^z36_U`VwIw}stkD7WVScQze4(hRTR+J7Sb8YiVkLyEXwhOIn;F`)e`1dE{dH! zo%sV#>F_$siy-<{qb?MoY6fH8fOlChqN!6;M#s?kC>B{9k5v*@@D{Y_HK@|FutYI( zvD=Fs`gqy5g`g?LjM+&>i=3NjY^H4jloEp@ZlRfjjl+*@QGb1bFSA-_Qgs_8ZS;Wx z0GcU+AM&@1M1hD!^g{XtISMPJReb|`4SJ+3c=x;Kc1A*3aDC&AC~|c7R}Vg$;)_@# z9zOnhcb0j*KdlL29q6#a>Kq0<7fp}D_$tgyK2I@m_MvTLu0OhK*kapTzs-;p;u$f0 zEV7ctdnTymLtb-Amk!Fazi_eiCQSiVJIBdpIopd9RH9V}`riMUQkVbFp7bl@Xx|p* zh#EO{E$UjWlK2C;k;>R@BWqsB9R!tt8AUskzGLV~;*vC~gcXb97*WK9`Y1S73c@;* z3>!I`h#53h;`7ZC37!SDB8e+Au3p& zCY$NvWD4m^Jg$*|!sbs_NdlvbFWp4vYnF`WBhfUV*xoH6^dVR zD8*0kHu*E1za~Nn}A#Cwkm06Vo~8}WhzhsS~#3X znZ4XqONRmAYPrHQpcbb56X1j;y*DFUt^pgeop`8bxh`30RYnc1`GXy+uA*6QLxt)_ zep$fPn`OzfmU#a`Oc8yz8hRn8@xHp`GfN_)2s}_5A_(c*G6X!Ic7?)6Lm}2w87yeA zyp0nsuj6>lq$tCQ(iW(g$XWH_E_`)qZ5hYhF%A=@sM^y0`1YDh+sUfjg#UZoJ=pb% z-Qt*=#S#9*Sam;sYptctt17M{u4e0=V*wj3zFSm#G6W6rD0#l-7hj`NQ%3SC`B!sV z)|iykrm)8T5k{^{f|;nUapMcsRaLW5y@c5iEpu{hNuZ7{z>JFsl{FO)az=O|!Gxp} z{cECM$Lu3L=YmGF_%@Rv;g?R+uu85r2ReBWP#WaP~%O86aTqy88v_qDEgwLguGRO)Lx z>l>#zd$nq#K!sim>Z6r9o2LQFAi=6jX7!`YZO~Jtxu>YEdT6sQ9q|5|xPWTq%%NaM za2HOMxRVsfdAMFLx1tnz@oqfZDo1TlGqncRbq;5aummMpaMPhmOGVj)c(^H_SRy)E zO7&IF6Ug#9g89m5YupOmS12kErgA$Em6ximMFmA-9Z^5z0U(0%Bg?sm#-iy2?|K0{ z#>*{=s?|2evogzp!O&H^_(T-iV@B-&!BUaFluH!XrH`}BELS{D+)Tbdzyz42uGwQL zn3rsct8r=V5bl{_3up{9z7aOWB3@w)E0QwnUQQRhoZE^tau=p%Uls5$eAN+`FPWWUts&M1G z*$rs0P60@Tv6;rl;Qf2qAc@5OCrD;{I0B!Z*qI*`ysr!U+`A z@SH;ACQ9o{RMr+~Dq3_KQc4c8jLC8hT24gZB?~JYZe3)_a)TFgaScWE(2Q#H{AZJZ zJnM0M7p{}vI|9V4DPM*NiREU^Q5apTj-sP|0#^6MvkB{H=YZAZ=lIecD@1-x8_q%p zfJl;9h^SxAW_(sX@0F}ex}x2zQPLx{-w_A7jy#@~@YVo)3H9?RMW#^5!9#4tVYhjh zLRWoq0V{KeB+uxQ5UAC3%BoU`F&ipXi5{DAyza%TTIw)*#N%NqkNVox>QWAL0Y#U1 zWin43ss@^?)MZb6nfQ=BXlB(dj1$zvfV~>i3<%J$I5O;o-e}e9X?I) zQy9;dJk?HqlR1$8;`uH-ZK&s5IU_$8Q%VI-RGwpz1uDW6nmKU>Kv*<{?` ztW{|W|FSkauNf$edsn!L*Hcp&EgT){U^almtzA9~x<%jhv^3&-9n-+_mm9IjAW>M! zMwtaAb^{gSU3*Bj$7PM-g5<-#sKL?mfRgNk1B;1-ICE+WR#lWO#3s~2Hw&)>!qBHi zmq>OshUx)iRj0i0=j22kopK|M=AxRNnzFKdU2+ChUSXDo*T=Ge9=;l*S+~^zQE8F? z-)>PNyg6jn^Nn7q%<-01ukcLLCshSWr$k5Tu-%S4K8_{_2l!Wl3HffVEXYSSn0jgh ziA>&hgt%%lM5nfhNS90TN*Wsepz6*@eaIE`$iEIfH%uP+3qz(piwc9KMilC?qHQ7A zo3Ka;ZXoX0b?(r0;hz8{;UZqn2rJcSta#mQ)d(yaCluckDNwDsoRtZGR9zB1OaAki zBVbjJid(eyqS`d~>7t7<)Dzb6#B5^p4vrkENPyT+jWo)+nGIh?E7K{eYSAy(6N<@s z5hb#D!eOsj+pqsdqt)uA%UZK1FeBwQttS7M?W;(Y8-7z)xEL^3ttq%WZfezT^w;&H zn&k~O|Mc%yT{EJahV_#tOI=5P{U7K^?J9EtNJh2y$joK4rOWU~@;-I8d?juN6_&*M zZ+)@|7Gjn229UEX@BkBjLbVmtxZVm0v&)$yiaPqEk$@1Iqf4G;|8es1=f=HMWK$FE zHCSR=Yol_ATX@$|VTXzGcBS7^k6lvKSITCnd23tt;8xN%zFl!fd9>jrI?fRpfG0_X z+JF|qQ&#UARGlMIbuQYvN45gsrXLBq=Lu%i&mdI-RJM3SIwU*KeqyeC{iRx0@7suj z*63E{T0y*8gnu-J1%0yI+?<@fy}$JCZgcBB-R6+N({{jhU%lEn`<2qTuREpix(j zpvCTdQJ=*k)>URHJBXU19m}pREAkHUChvZ~q7zE2hUFvxo$1+U0Q#T#^~X;s4_6mU zjv#Kxb0Os?9wNb3i7(x-Myztj+K^w|_gVSn4KlY&sNEcu6RJ&Hm&OmZYu|~Z6BcDC z+k@GCK`$8<2BM`2Dr-P>v(0)9lxwCk;JqwW_vC1Fvs&&!V;Sjn4!V73kH^yl&Fjzz zmv>d@?#}t;^lj${X?6=7aEL~x_$;xrH$wGA_C&u_w+Efv`}E7J_wSDPoKCOzkEh4I z-s{uXd(g|hL3hyWz4_VMgA&dn&)0shcYS@`y?)wF(#xJyoXmQVw}*M591eOg=+5#P zSr`{X7As$C8XGH95h=u1HXvMI^BFt^OM)kOxW7u!24b(jC-q3>wVE;nE{qqY4DHT0-O zihGW6PmQ=@UP_sb8PY|bklA~#t-Jv&0Du7I;w-3H`@?>}k84e^LAiXgE~(2q`1{}g z-lJ5?ZNTt=B9yu_iy5ug6Rji7G7*zd8-9k?hk=7Tgr`@WAdERjGoDRf9MhHLZ0{OQ z{=K(iz5mEy407#dtB}1%`Ojj9iq13o6#PHcf$v$;1K(4geF)R9o3*}rQt6-hT$#t} z98|HW4Y`!Yto8IQLu>zvUWtv0CN^PFaQASA>xcCO|E^S0F$|r6-3CYg&Ml_NE9B)4eI)j6Q{ROESPlduU1_C^^#6?x+dAH=ajskQqL@q9n z7z?6tEM87dgx3pvkRidwGqds9`n}yw+XrLeg%`GA;ZVE$|DiX!=P-eLw**`md6vsq ztkU0m;;jym~s# zGUo;Eiv98N>zAi5$5>a$oXO+`0(_4Oys)aJmm%z9vPnk8(x9)5_N=ANiZ`CqqimSs zvIgiv0FJ*3iEP{t>n7>V3+|OVQg!1l5EPei9eG8Gd-aX9j=GTE!H1{;MMc7{+l;NR zw@z2gl&^_Rh~TWZp?)V&Sd0zzX`aI1_B8t$2%q}MxwuaZVOsBy!J?TWHHdlQ0b+bY z#)Dc2_glv*BrOUH8C|DTg^hO$gGlK%qA-Ib?-9z3SGwvl4r$ZWkQFAG4^*SH7K~FJ z-IGMiW#Hge_=~ckiO7Hk$BWh(IA;RAipM{#xil>z&9OCgwzlynQjR!*sB)Vu1D^df zL8+d_A6xIaV{!RHJ7LM{H8#2Tfa%D{V@Dhml74jRryp@gj{_-eAn1xT;L+Li^@qAg z+Qiu+nxij2vgqC`7s#6mz@jq|cyE#n@x`1XD&9$XRDlnXI@xd~|#{zbo3KHdGUNshVmkl zUDj$L@r1lVMwz;~n_<={z9(}js<|wwXJ**dSUlvh+X>8;Qh$}&h1`2@lN7=4e;E1- z$U_YDFz98zb&@qcRYTX~hOoWKjN19jkuqBo=6bI7EQW3cZlZka z0vql5d$)T^f~{l@mdscz95CFw7Y^Dz=5>~Xg+Ue5A_`<}QH}o5MSv`oN)?YTBArwS zYMeA4>dLX(Hy=KoemSQLi6^&Gy(4q{z43(YnU|t41@z8$Ik34afF zcl(y|xq8rYvs_BCBd;j)Qpw25DxX}+#mh?0rBo=zu{*w8?HY?va(St9(%VW7kkIJQ z>~)we?k{R&6eYDoko(FRenU#7aOeHkCS0QTUO!K_g~#{8(}+Vx7`;E%{L(>Px&8ib z8p@GNKNkCg;YKw0%yK^$=wc*d?K8AyEmM?&V$dN%oJ5p#eq1NTvHAbMP_|2V73Y zIA+A@8PFO&*5av6>RO=fNnJn{;nr2C7~|4}7Uu6_F7KZf^@5d5kgCLF4JC>T?KPu5 zJ!>LJ#^Po&8nCyxPXDNU?;2Sot6a(Tr6$*x7T=MkN9|A_T5)3tsDNknx!l20SNgOm z4bhvtLg(=`THe2<%6qTD)>fF6fuH$O4^EI&aVakCVeVvBa z4(is7Uaj#)4GWfTi=V28>@sXdt}aKAy>7QQhbb+`1nr5o9s z4n8Rc32k~jK37W{;q%@&HwE24&g!hbgL}ujYOq1f8tj(Qa_eh^faci zz(gM98Zg}2q2XkUB5fL;_T;Mi^1j*^@+hv|kUg{k31PBZlxLdclj(9s#QdWy%eCpO z8tS7&a@A2FW%8?zfM5w}NB!n&$Afaxib6o4lj5in*pn`R#zxWYXp8T zbyrI&d^_M&z(!6yktz4me>E9@X}B`CVbO5ZGrTu70A^Twu@t9NUoEPA{-O$gqz;hS z%rTBoC~CU%CSZ1N#k%;hS|C!_Msqn-=SD-h2XP-0n46YvC%3jjfLQ~MWAgOKyq$b4 z%k<2gY}PJkw~xWPiQYQJ46-tINgli9limLq<}ueZZ^BIUc1o3aet>8#`O-p_(wa2FZ4GAd<78` z=t4a$YqA6!k3K`fvxc+xPovuzS|jIM{}4VCY2`l9pTCA_gf>_ZmC^t{%9j`R2P|3V z(F)MCxI|yCrTeMJoEQ|PWBLDt`tigDkyk>8HdXOe5=S8>4b=M5BdcK4#?k<}usc6}z_iXK*|Hz_wmzbT1yA|y|G z>zpNL#BvFnhi_06<&*W3K{q54ADYL5R*|ce@eC3}IZ+{+0Q! z)Z)KV&3}=BTQS17a)33L)#j5GRvAzGCU=SsqKbdXkMa}GY^?D*ydrtF{oISCR!^N& zI^*g`6qHdz!_}B<45oIo1~SJfWpx?_;gw6XqJ7tUKpa+Xw8)I+Y2*(XPpbED!a!3> zNJ8Ej!xRoWa+Ib;Wcb#VCc8y^N#I7Ex|L6OJTP-__1qM%|De22Km8MRw>w3+m-j(w zXVV7cX~`V2>`uMx8(74iCa*<4*ek*rdLG7yfQyx9be7fL`Zin~0y)@yuABou&MmO5 zY4B&g0voaK3KM;Oo1wG}wBIEJo=qH)v)sY~5wIyL@;~|3cSt=Fz8q<7%xBth?m$P8 zuU)d0D&nYgxD;jK_a%*_RHxxffSe9%=No3AR0irgF_YxIw(_Q-@6tnb8PE3U&*Agu zY_H#a>N!QuLNp7!fR23yTY#r#EmXGnQ>x{?y1531Z-F)n$D1_6vPdC1r1)dUNbLg^ zDT6?|0|?5?C6z`l8W&*%$SsvKT$40ajx-3Se2MxyI@)2d^~s6qDfy0h8^tqRs9c9m zlO?PIGOaM{U!%31FUn-MJ|r`G|3Vp^2vrAw!0A^B4_O?pU*dZOSP^`mE+Fe7SyjAzgBGMawHm@)uYFY%_EG_~IRGQ6FT+bRJbNopowt^ZIiyrhne zwKIMx{DHaVUV3u{dEZA_&S5U?q*`}v#yVQ3zj4YR9GFFBAyi|#LGg<(bXbc9WNEwkUXI0KE@NFZ**|5A4yzYzsjDvGLsrm;^C}sa5k3P z$>eMdeUD0T&4g=3dWkw#_ql$m^_0bX$HFU4A&%2Y{u$l0k3Mfy@HZSYG|_*W69 z?dvGbwbMQem}I228{dc zcFG&2H8Cm@<<%N7-|GgZVMh8&zleD77QvJ3H$U$Rp+mS7 zuBU%v^z)^X@C7g+zqSit1Vw)-M}LuCNQzkDBm_N{6mj%|p^~I6@Oc5@zrk?SAp7i% z9Pw_9cw;@J0gto{PB>FIO{Dt=UCMWrD1}}%mI4>pDo#qCx&tG2g!k{8jQ@5LUB*EN zUm`cc_$FAjDtzL_xk&OnS($ZxQFVPO)%8WyrCSZO@JAQcQPBM&pD}GR$|zAu{35R5 z33F6E3~C)?@|6f=Tx8Ipf?`DP9RDwQ@BZGlktB-#zJGrCQZtAvO@~y=Qzns z_U5&*ld+DL*9RgY5gQ6n08$pm;`!TeJ^GCXMa!O-|Zhjos<2p7IbkUUmG1}V3YUHp2DIw^ZN1}Ox(G0bZoH8qU7L2WA! z!(5~_6IC_IxK^eL&$(7Q9|{K|iHgUF!8@Ll^0D1$uu1ff*UNi1 zN=RK}JW(F=|_06*yUR4{Xhw{XZX9426Tq5DSJ5GBON<6g_CyMQM`6V<$ z@L4De*{j+{&h9f;b^|I6*y9N-DYIE4^{|!lXF`#v;=@1|c0zKiPbvyarVy+0P13od zu)r8-c%`4t`DubGU-F0n_J)oOi~_sTPv`uE!fGsvha(*SR!dha-Fl_k+$8F(8DUSd zsjKr)qfnM3G3PvI<}zF6j9AGDqX;C+Wk+epXHq-<3Pz$d)aCbKRdiU15kKex2RXy7 z&EHNZ9U={2^b%rZ^_8lAzDM;ps`_ciQ&^XV}F`1?A-ws=H;kSWm##g0ceGYi@|1PB{(9zuZuL z+}>)DtABEiI5>;Aqmg!c6S5=cs z$@}m?KWb&ei?+2d(tOyAFy`@FZQ&jCBW9g5jR}!Bn;`{>iJmt4Mjt8q4aSxnRtUdQ zXIajE!&_+N_}`#fe?@Bm2&52cu+%A+g5^PLPjzyZm_}?TAu(h*Q=Nn;2xvZ0-rc3d ztixx|UcoBqf%9Hyp^-XrDWTQm{lHv{lH(V}%+MDoB@RW06O4DoB2h@R&l?7@>e5b_ z3`f18m?gt8@J!DK{MsQ4cl1E%b%Kk>6G}B67J7`Q80`G4H=HIV{K8KvbZr$Ma>k(` zo%B$bjZRV_zD09xumf+G@>hUF%wH}!g2T~ z){wX=zbj#*wYd8xp>ES{9;zK&+*=vI9MP5F-_y2+=FrevMabj2WOFO1g74O_4X&eg z?}DAmE%uvLrAdxTb8D-l0K4ZWpRkZixxNiki4`uA0Uo^b9bXa#6ayT}J30*ax{7-xF8T5#Ii3{B zU=$U}^^v{+iI$J&XOh(D&Zdu}@+_TNNsDP5i(=<}N>o6R%LMDdFtHWFx^u>vGEGRM zeO+oXC7iTtGT3p2!>QrVkv%5exJ(c<1pI`U@X=_(#so~lzo84CX8LIZb8z}MfD0LU z)Q=vO9;#>u{s8_6LhJ0|+mEo+t~Fny0+sLLj=CakE!;p@$ls0>=ne8{e*kqSmT}7t zT!hE9c6J~(*Vuw=<1e+Y)D|?`?*g~q9RFNebC@No{_W9Pl0J`-j9Eg`MkSp-MiMYh zR0#mm8Ein63$IH7A8~e)4Dhci2GDzf?vXHWNqI|^hlk*t@;ce?>vXx?AR_~e9h@K4 zq?o`C=l8XNn_u`c4#R@Qlg?&$fxA24k}J$My8tl75+ej&CcuI&;?V_lXO}>XqD!QJ zYwj%~?(K&9fl}};0m5v+uX*n9@z(J9O0-Mp1Dw*QeFJN3-cDhOxgBl`x2&g4TEsQgCu8gHB=gA}JHTGn!6BMoSZpsjvRr7S?|VHngDWH1zV7@NUo))Xnk zxhBQ!OzIJ`kB>4-a*jGzIHf3a#OwAO%-@birqJ4$C^Jpmc^YcaV{VM-0Y;aE1qR6=gDGrBl-+kIG)%g>+=kkybq% zV5cc9Wtu$se1L)O(?8*p&_mIe+Rq0(0Xk&8JUTtCM1AvpcQ=Ehh{&p0mM^39@hk>j z=Yo?k416Wi#+o!sdl&J^a*`$&BP(qUX*AAtYz9a21ppZIgSWs-MRnonm4H)`f)7dk zfrf5kAR1PGMrD(gx{>2A8kViDB-Tnu?#}p*9+5yz2J-2YpRyILSv0_%>RcPPsW7=W zj-a%~S~F_%dq*k63-k~uVQYM52vAWDJm_H5qmaY^Yf;7TK1e_&=n)61Wbz0=L`*ZXTSu3!`Idw}ls}xB-oE9eW z#1?2sYwP(r+Ei$d1np;Y93|{$q_SpRAn4i#aew{p0wojJ20cBv9d7HP^}8wby;Q%u z+Hou(EyG~;`s4c6HC{p9S_)#MjVD9O?COVG)}ZKoHvgj$Fm8pB;)Xn9QCE&~k8(O( z;pJ%26b>UjU$w{jRh?pk(rUH=8ZeBI!RJ}3!ByI=EDh`e4A3TfT zNKgxnb+|MTHa93KLEYp8C-^8YJtY9U$^)d~x$F&7D~6$WJ#}I`8x{IItEcR~81=+DL3Kj zzmj#^eFYH}Pn;uRG$=b6>jKvwjUtf^hE~2rO#{?BU1D7BpII|7O-kj8egK43sXfpS zEZ@tJ$*fyWHzbO^;Wr>iHTha1nbs@&TmU&C=DK7(;tyr5)UHLPpdOL%aX>dx)WERR zDx&0Dz5rt4um*mlR>34y4%tt^sOvT@n4098cuA4MT+un?MA?2SYrWxiB$Fy>tCOm% zN_iFra+@`Pj+D(1X#&BU43VruQCo_qEjn&)blVxK`TmezW!enl@qgDxb{uJVeJs$^ zLK6TK?-g=6wQhi}}k%zMKad(2BR^^*u4IMSJCNMC?#e zqi7h|5rJ6PO;!1T9fuXZc;}inixdB|T2=Y^dIg6E0Y}HOn%<)hgOKA5+np{v=QnV!61a}^;EbmF)&)2;yENZX_oxi76}c$`y>SqD z+k5t<2@c1Z*HXSb>Zp*l9k0u)^fzTO^-E#Yio6k!>nRV|cEkje14L~d-uFglN{tWm zcYa`y6WesJaIvp3yqI0>p76fT24-QO&4mQ~gQZrs;tA|D7MpTPN9YKtP8l@! z^~w!6qH{~oKeG@YcQO!i6PrY3R@)%sY)vv9+@{Rdy@M^CT=i&iN!QHaaIGt zbe#ak)criKXK6L}3=^!z?rTLBn`e3*EJ8t>+j-NH;n@P6Hw{ic3G|SgQL(c>Pv&J; zcP`%cUE>VkH1a2l52p_zE z8XL$POK|^C86Tn=72Pn7j!b1tD+24gs>+S}GTtO5E4izW#)0H^@RNANP)};SCp^5Py{eQ@onB zn%nMed?kk$0Xu@K&>yt5v5vjFol!!cs?q5F52LE!UrCN^io%KA{|Xov3eI-*0`mh$%$eictB6-2dufK~=zrB2CjlD+3jSv#$ETRSxa zmI5_UR$l{W>BL}@4r#Kf!b*NaeK}oAx`mqiwj*}2bK!hmL}C5=qh)cdiTyrz79bz( z#?=QGdwl5(?WMNHu}zB3c>;F-aYx@5p-u$e=Q=(F&eCbf3jrj@iiynY*X4S)c*TAR zP+&q1pQj>VDc)ow&H+l~Ee(*=YSaij(B*>Q{~6?YG(~)>uJ~dx}f+P;acw&S+?{l z{0-CED##NMfOBoCSaB2#)Ijq1Q`)t1RH=34f^jVHJO5Ap=urpY8ztL1A(Btz z(Ja*2C2#=i%IfMboB)HnrzV**>1toW+x>OQ3T6JRVxz16XcAwN&iDQ8)Qj{tYs|0k z_5NDRvbdxuzozDQkn|HKksg=XGtK>EeYm8N(#M*%Lk0VrC5@EU;=f!c-g~GhZ`Q

s(mQ--qF-<1iqu0 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 literal 69329 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 rl7+wcR_h&@7lWt;Jnhc7lg@iUvu9inm`sFh diff --git a/dist/fabric.require.js b/dist/fabric.require.js index c5332974..4d738f79 100644 --- a/dist/fabric.require.js +++ b/dist/fabric.require.js @@ -1,5 +1,5 @@ var fabric = fabric || { - version: "1.7.2" + version: "1.7.3" }; if (typeof exports !== "undefined") { @@ -177,6 +177,65 @@ fabric.Collection = { } }; +fabric.CommonMethods = { + _setOptions: function(options) { + for (var prop in options) { + this.set(prop, options[prop]); + } + }, + _initGradient: function(filler, property) { + if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) { + this.set(property, new fabric.Gradient(filler)); + } + }, + _initPattern: function(filler, property, callback) { + if (filler && filler.source && !(filler instanceof fabric.Pattern)) { + this.set(property, new fabric.Pattern(filler, callback)); + } else { + callback && callback(); + } + }, + _initClipping: function(options) { + if (!options.clipTo || typeof options.clipTo !== "string") { + return; + } + var functionBody = fabric.util.getFunctionBody(options.clipTo); + if (typeof functionBody !== "undefined") { + this.clipTo = new Function("ctx", functionBody); + } + }, + _setObject: function(obj) { + for (var prop in obj) { + this._set(prop, obj[prop]); + } + }, + set: function(key, value) { + if (typeof key === "object") { + this._setObject(key); + } else { + if (typeof value === "function" && key !== "clipTo") { + this._set(key, value(this.get(key))); + } else { + this._set(key, value); + } + } + return this; + }, + _set: function(key, value) { + this[key] = value; + }, + toggle: function(property) { + var value = this.get(property); + if (typeof value === "boolean") { + this.set(property, !value); + } + return this; + }, + get: function(property) { + return this[property]; + } +}; + (function(global) { var sqrt = Math.sqrt, atan2 = Math.atan2, pow = Math.pow, abs = Math.abs, PiBy180 = Math.PI / 180; fabric.util = { @@ -307,7 +366,7 @@ fabric.Collection = { callback && callback(enlivenedObjects); } } - var enlivenedObjects = [], numLoadedObjects = 0, numTotalObjects = objects.length; + var enlivenedObjects = [], numLoadedObjects = 0, numTotalObjects = objects.length, forceAsync = true; if (!numTotalObjects) { callback && callback(enlivenedObjects); return; @@ -318,17 +377,33 @@ fabric.Collection = { return; } var klass = fabric.util.getKlass(o.type, namespace); - if (klass.async) { - klass.fromObject(o, function(obj, error) { - if (!error) { - enlivenedObjects[index] = obj; - reviver && reviver(o, enlivenedObjects[index]); - } + klass.fromObject(o, function(obj, error) { + error || (enlivenedObjects[index] = obj); + reviver && reviver(o, obj, error); + onLoaded(); + }, forceAsync); + }); + }, + enlivenPatterns: function(patterns, callback) { + patterns = patterns || []; + function onLoaded() { + if (++numLoadedPatterns === numPatterns) { + callback && callback(enlivenedPatterns); + } + } + var enlivenedPatterns = [], numLoadedPatterns = 0, numPatterns = patterns.length; + if (!numPatterns) { + callback && callback(enlivenedPatterns); + return; + } + patterns.forEach(function(p, index) { + if (p && p.source) { + new fabric.Pattern(p, function(pattern) { + enlivenedPatterns[index] = pattern; onLoaded(); }); } else { - enlivenedObjects[index] = klass.fromObject(o); - reviver && reviver(o, enlivenedObjects[index]); + enlivenedPatterns[index] = p; onLoaded(); } }); @@ -1661,7 +1736,7 @@ if (typeof console !== "undefined") { (function(global) { "use strict"; - var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, capitalize = fabric.util.string.capitalize, clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, parseUnit = fabric.util.parseUnit, multiplyTransformMatrices = fabric.util.multiplyTransformMatrices, reAllowedSVGTagNames = /^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i, reViewBoxTagNames = /^(symbol|image|marker|pattern|view|svg)$/i, reNotAllowedAncestors = /^(?:pattern|defs|symbol|metadata)$/i, reAllowedParents = /^(symbol|g|a|svg)$/i, attributesMap = { + var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, parseUnit = fabric.util.parseUnit, multiplyTransformMatrices = fabric.util.multiplyTransformMatrices, reAllowedSVGTagNames = /^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i, reViewBoxTagNames = /^(symbol|image|marker|pattern|view|svg)$/i, reNotAllowedAncestors = /^(?:pattern|defs|symbol|metadata|clipPath|mask)$/i, reAllowedParents = /^(symbol|g|a|svg)$/i, attributesMap = { cx: "left", x: "left", r: "radius", @@ -1756,24 +1831,25 @@ if (typeof console !== "undefined") { } fabric.parseTransformAttribute = function() { function rotateMatrix(matrix, args) { - var angle = args[0], x = args.length === 3 ? args[1] : 0, y = args.length === 3 ? args[2] : 0; - matrix[0] = Math.cos(angle); - matrix[1] = Math.sin(angle); - matrix[2] = -Math.sin(angle); - matrix[3] = Math.cos(angle); - matrix[4] = x - (matrix[0] * x + matrix[2] * y); - matrix[5] = y - (matrix[1] * x + matrix[3] * y); + var cos = Math.cos(args[0]), sin = Math.sin(args[0]), x = 0, y = 0; + if (args.length === 3) { + x = args[1]; + y = args[2]; + } + matrix[0] = cos; + matrix[1] = sin; + matrix[2] = -sin; + matrix[3] = cos; + matrix[4] = x - (cos * x - sin * y); + matrix[5] = y - (sin * x + cos * y); } function scaleMatrix(matrix, args) { var multiplierX = args[0], multiplierY = args.length === 2 ? args[1] : args[0]; matrix[0] = multiplierX; matrix[3] = multiplierY; } - function skewXMatrix(matrix, args) { - matrix[2] = Math.tan(fabric.util.degreesToRadians(args[0])); - } - function skewYMatrix(matrix, args) { - matrix[1] = Math.tan(fabric.util.degreesToRadians(args[0])); + function skewMatrix(matrix, args, pos) { + matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0])); } function translateMatrix(matrix, args) { matrix[4] = args[0]; @@ -1806,11 +1882,11 @@ if (typeof console !== "undefined") { break; case "skewX": - skewXMatrix(matrix, args); + skewMatrix(matrix, args, 2); break; case "skewY": - skewYMatrix(matrix, args); + skewMatrix(matrix, args, 1); break; case "matrix": @@ -1997,70 +2073,45 @@ if (typeof console !== "undefined") { el.setAttribute("transform", matrix); return parsedDim; } - fabric.parseSVGDocument = function() { - function hasAncestorWithNodeName(element, nodeName) { - while (element && (element = element.parentNode)) { - if (element.nodeName && nodeName.test(element.nodeName.replace("svg:", "")) && !element.getAttribute("instantiated_by_use")) { - return true; - } + function hasAncestorWithNodeName(element, nodeName) { + while (element && (element = element.parentNode)) { + if (element.nodeName && nodeName.test(element.nodeName.replace("svg:", "")) && !element.getAttribute("instantiated_by_use")) { + return true; } - return false; } - return function(doc, callback, reviver) { - if (!doc) { - return; + return false; + } + fabric.parseSVGDocument = function(doc, callback, reviver) { + if (!doc) { + return; + } + parseUseDirectives(doc); + var svgUid = fabric.Object.__uid++, options = applyViewboxTransform(doc), descendants = fabric.util.toArray(doc.getElementsByTagName("*")); + options.svgUid = svgUid; + if (descendants.length === 0 && fabric.isLikelyNode) { + descendants = doc.selectNodes('//*[name(.)!="svg"]'); + var arr = []; + for (var i = 0, len = descendants.length; i < len; i++) { + arr[i] = descendants[i]; } - parseUseDirectives(doc); - var startTime = new Date(), svgUid = fabric.Object.__uid++, options = applyViewboxTransform(doc), descendants = fabric.util.toArray(doc.getElementsByTagName("*")); - options.svgUid = svgUid; - if (descendants.length === 0 && fabric.isLikelyNode) { - descendants = doc.selectNodes('//*[name(.)!="svg"]'); - var arr = []; - for (var i = 0, len = descendants.length; i < len; i++) { - arr[i] = descendants[i]; - } - descendants = arr; - } - var elements = descendants.filter(function(el) { - applyViewboxTransform(el); - return reAllowedSVGTagNames.test(el.nodeName.replace("svg:", "")) && !hasAncestorWithNodeName(el, reNotAllowedAncestors); - }); - if (!elements || elements && !elements.length) { - callback && callback([], {}); - return; - } - fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); - fabric.cssRules[svgUid] = fabric.getCSSRules(doc); - fabric.parseElements(elements, function(instances) { - fabric.documentParsingTime = new Date() - startTime; - if (callback) { - callback(instances, options); - } - }, clone(options), reviver); - }; - }(); - var svgCache = { - has: function(name, callback) { - callback(false); - }, - get: function() {}, - set: function() {} - }; - function _enlivenCachedObject(cachedObject) { - var objects = cachedObject.objects, options = cachedObject.options; - objects = objects.map(function(o) { - return fabric[capitalize(o.type)].fromObject(o); + descendants = arr; + } + var elements = descendants.filter(function(el) { + applyViewboxTransform(el); + return reAllowedSVGTagNames.test(el.nodeName.replace("svg:", "")) && !hasAncestorWithNodeName(el, reNotAllowedAncestors); }); - return { - objects: objects, - options: options - }; - } - function _createSVGPattern(markup, canvas, property) { - if (canvas[property] && canvas[property].toSVG) { - markup.push('\t\n', '\t\t\n\t\n'); + if (!elements || elements && !elements.length) { + callback && callback([], {}); + return; } - } + fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); + fabric.cssRules[svgUid] = fabric.getCSSRules(doc); + fabric.parseElements(elements, function(instances) { + if (callback) { + callback(instances, options); + } + }, clone(options), reviver); + }; var reFontDeclaration = new RegExp("(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+(.*)"); extend(fabric, { parseFontDeclaration: function(value, oStyle) { @@ -2201,18 +2252,9 @@ if (typeof console !== "undefined") { }, loadSVGFromURL: function(url, callback, reviver) { url = url.replace(/^\n\s*/, "").trim(); - svgCache.has(url, function(hasUrl) { - if (hasUrl) { - svgCache.get(url, function(value) { - var enlivedRecord = _enlivenCachedObject(value); - callback(enlivedRecord.objects, enlivedRecord.options); - }); - } else { - new fabric.util.request(url, { - method: "get", - onComplete: onComplete - }); - } + new fabric.util.request(url, { + method: "get", + onComplete: onComplete }); function onComplete(r) { var xml = r.responseXML; @@ -2225,10 +2267,6 @@ if (typeof console !== "undefined") { callback && callback(null); } fabric.parseSVGDocument(xml.documentElement, function(results, options) { - svgCache.set(url, { - objects: fabric.util.array.invoke(results, "toObject"), - options: options - }); callback && callback(results, options); }, reviver); } @@ -2249,44 +2287,6 @@ if (typeof console !== "undefined") { fabric.parseSVGDocument(doc.documentElement, function(results, options) { callback(results, options); }, reviver); - }, - createSVGFontFacesMarkup: function(objects) { - var markup = "", fontList = {}, obj, fontFamily, style, row, rowIndex, _char, charIndex, fontPaths = fabric.fontPaths; - for (var i = 0, len = objects.length; i < len; i++) { - obj = objects[i]; - fontFamily = obj.fontFamily; - if (obj.type.indexOf("text") === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) { - continue; - } - fontList[fontFamily] = true; - if (!obj.styles) { - continue; - } - style = obj.styles; - for (rowIndex in style) { - row = style[rowIndex]; - for (charIndex in row) { - _char = row[charIndex]; - fontFamily = _char.fontFamily; - if (!fontList[fontFamily] && fontPaths[fontFamily]) { - fontList[fontFamily] = true; - } - } - } - } - for (var j in fontList) { - markup += [ "\t\t@font-face {\n", "\t\t\tfont-family: '", j, "';\n", "\t\t\tsrc: url('", fontPaths[j], "');\n", "\t\t}\n" ].join(""); - } - if (markup) { - markup = [ '\t\n" ].join(""); - } - return markup; - }, - createSVGRefElementsMarkup: function(canvas) { - var markup = []; - _createSVGPattern(markup, canvas, "backgroundColor"); - _createSVGPattern(markup, canvas, "overlayColor"); - return markup.join(""); } }); })(typeof exports !== "undefined" ? exports : this); @@ -2885,9 +2885,9 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this.offsetX = options.offsetX || this.offsetX; this.offsetY = options.offsetY || this.offsetY; }, - addColorStop: function(colorStop) { - for (var position in colorStop) { - var color = new fabric.Color(colorStop[position]); + addColorStop: function(colorStops) { + for (var position in colorStops) { + var color = new fabric.Color(colorStops[position]); this.colorStops.push({ offset: position, color: color.toRgb(), @@ -3038,87 +3038,89 @@ fabric.ElementsParser.prototype.checkIfDone = function() { } })(); -fabric.Pattern = fabric.util.createClass({ - repeat: "repeat", - offsetX: 0, - offsetY: 0, - initialize: function(options) { - options || (options = {}); - this.id = fabric.Object.__uid++; - if (options.source) { - if (typeof options.source === "string") { - if (typeof fabric.util.getFunctionBody(options.source) !== "undefined") { - this.source = new Function(fabric.util.getFunctionBody(options.source)); - } else { - var _this = this; - this.source = fabric.util.createImage(); - fabric.util.loadImage(options.source, function(img) { - _this.source = img; - }); - } +(function() { + "use strict"; + var toFixed = fabric.util.toFixed; + fabric.Pattern = fabric.util.createClass({ + repeat: "repeat", + offsetX: 0, + offsetY: 0, + initialize: function(options, callback) { + options || (options = {}); + this.id = fabric.Object.__uid++; + this.setOptions(options); + if (!options.source || options.source && typeof options.source !== "string") { + callback && callback(this); + return; + } + if (typeof fabric.util.getFunctionBody(options.source) !== "undefined") { + this.source = new Function(fabric.util.getFunctionBody(options.source)); + callback && callback(this); } else { - this.source = options.source; + var _this = this; + this.source = fabric.util.createImage(); + fabric.util.loadImage(options.source, function(img) { + _this.source = img; + callback && callback(_this); + }); } - } - if (options.repeat) { - this.repeat = options.repeat; - } - if (options.offsetX) { - this.offsetX = options.offsetX; - } - if (options.offsetY) { - this.offsetY = options.offsetY; - } - }, - toObject: function(propertiesToInclude) { - var source, object; - if (typeof this.source === "function") { - source = String(this.source); - } else if (typeof this.source.src === "string") { - source = this.source.src; - } else if (typeof this.source === "object" && this.source.toDataURL) { - source = this.source.toDataURL(); - } - object = { - source: source, - repeat: this.repeat, - offsetX: this.offsetX, - offsetY: this.offsetY - }; - fabric.util.populateWithProperties(this, object, propertiesToInclude); - return object; - }, - toSVG: function(object) { - 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; - } else if (patternSource.toDataURL) { - patternImgSrc = patternSource.toDataURL(); - } - return '\n' + '\n' + "\n"; - }, - toLive: function(ctx) { - var source = typeof this.source === "function" ? this.source() : this.source; - if (!source) { - return ""; - } - if (typeof source.src !== "undefined") { - if (!source.complete) { + }, + toObject: function(propertiesToInclude) { + var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, source, object; + if (typeof this.source === "function") { + source = String(this.source); + } else if (typeof this.source.src === "string") { + source = this.source.src; + } else if (typeof this.source === "object" && this.source.toDataURL) { + source = this.source.toDataURL(); + } + object = { + type: "pattern", + source: source, + repeat: this.repeat, + offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS), + offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS) + }; + fabric.util.populateWithProperties(this, object, propertiesToInclude); + return object; + }, + toSVG: function(object) { + var patternSource = typeof this.source === "function" ? this.source() : this.source, patternWidth = patternSource.width / object.width, patternHeight = patternSource.height / object.height, patternOffsetX = this.offsetX / object.width, patternOffsetY = this.offsetY / object.height, 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; + } else if (patternSource.toDataURL) { + patternImgSrc = patternSource.toDataURL(); + } + return '\n' + '\n' + "\n"; + }, + setOptions: function(options) { + for (var prop in options) { + this[prop] = options[prop]; + } + }, + toLive: function(ctx) { + var source = typeof this.source === "function" ? this.source() : this.source; + if (!source) { return ""; } - if (source.naturalWidth === 0 || source.naturalHeight === 0) { - return ""; + if (typeof source.src !== "undefined") { + if (!source.complete) { + return ""; + } + if (source.naturalWidth === 0 || source.naturalHeight === 0) { + return ""; + } } + return ctx.createPattern(source, this.repeat); } - return ctx.createPattern(source, this.repeat); - } -}); + }); +})(); (function(global) { "use strict"; @@ -3201,7 +3203,7 @@ fabric.Pattern = fabric.util.createClass({ return; } var extend = fabric.util.object.extend, getElementOffset = fabric.util.getElementOffset, removeFromArray = fabric.util.removeFromArray, toFixed = fabric.util.toFixed, CANVAS_INIT_ERROR = new Error("Could not initialize `canvas` element"); - fabric.StaticCanvas = fabric.util.createClass({ + fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, { initialize: function(el, options) { options || (options = {}); this._initStatic(el, options); @@ -3294,21 +3296,9 @@ fabric.Pattern = fabric.util.createClass({ return this; }, __setBgOverlayColor: function(property, color, callback) { - if (color && color.source) { - var _this = this; - fabric.util.loadImage(color.source, function(img) { - _this[property] = new fabric.Pattern({ - source: img, - repeat: color.repeat, - offsetX: color.offsetX, - offsetY: color.offsetY - }); - callback && callback(); - }); - } else { - this[property] = color; - callback && callback(); - } + this[property] = color; + this._initGradient(color, property); + this._initPattern(color, property, callback); return this; }, _createCanvasElement: function(canvasEl) { @@ -3325,9 +3315,7 @@ fabric.Pattern = fabric.util.createClass({ return element; }, _initOptions: function(options) { - for (var prop in options) { - this[prop] = options[prop]; - } + this._setOptions(options); this.width = this.width || parseInt(this.lowerCanvasEl.width, 10) || 0; this.height = this.height || parseInt(this.lowerCanvasEl.height, 10) || 0; if (!this.lowerCanvasEl.style) { @@ -3524,7 +3512,7 @@ fabric.Pattern = fabric.util.createClass({ _renderBackgroundOrOverlay: function(ctx, property) { var object = this[property + "Color"]; if (object) { - ctx.fillStyle = object.toLive ? object.toLive(ctx) : object; + ctx.fillStyle = object.toLive ? object.toLive(ctx, this) : object; ctx.fillRect(object.offsetX || 0, object.offsetY || 0, this.width, this.height); } object = this[property + "Image"]; @@ -3666,7 +3654,48 @@ fabric.Pattern = fabric.util.createClass({ viewBox = 'viewBox="' + toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + " " + toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + " " + toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + " " + toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '" '; } } - markup.push("\n', "Created with Fabric.js ", fabric.version, "\n", "", fabric.createSVGFontFacesMarkup(this.getObjects()), fabric.createSVGRefElementsMarkup(this), "\n"); + markup.push("\n', "Created with Fabric.js ", fabric.version, "\n", "\n", this.createSVGFontFacesMarkup(), this.createSVGRefElementsMarkup(), "\n"); + }, + createSVGRefElementsMarkup: function() { + var _this = this, markup = [ "backgroundColor", "overlayColor" ].map(function(prop) { + var fill = _this[prop]; + if (fill && fill.toLive) { + return fill.toSVG(_this, false); + } + }); + return markup.join(""); + }, + createSVGFontFacesMarkup: function() { + var markup = "", fontList = {}, obj, fontFamily, style, row, rowIndex, _char, charIndex, fontPaths = fabric.fontPaths, objects = this.getObjects(); + for (var i = 0, len = objects.length; i < len; i++) { + obj = objects[i]; + fontFamily = obj.fontFamily; + if (obj.type.indexOf("text") === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) { + continue; + } + fontList[fontFamily] = true; + if (!obj.styles) { + continue; + } + style = obj.styles; + for (rowIndex in style) { + row = style[rowIndex]; + for (charIndex in row) { + _char = row[charIndex]; + fontFamily = _char.fontFamily; + if (!fontList[fontFamily] && fontPaths[fontFamily]) { + fontList[fontFamily] = true; + } + } + } + } + for (var j in fontList) { + markup += [ "\t\t@font-face {\n", "\t\t\tfont-family: '", j, "';\n", "\t\t\tsrc: url('", fontPaths[j], "');\n", "\t\t}\n" ].join(""); + } + if (markup) { + markup = [ '\t\n" ].join(""); + } + return markup; }, _setSVGObjects: function(markup, reviver) { var instance; @@ -3687,9 +3716,14 @@ fabric.Pattern = fabric.util.createClass({ } }, _setSVGBgOverlayColor: function(markup, property) { - if (this[property] && this[property].source) { - markup.push('\n"); - } else if (this[property] && property === "overlayColor") { + var filler = this[property]; + if (!filler) { + return; + } + if (filler.toLive) { + var repeat = filler.repeat; + markup.push('\n"); + } else { markup.push('\n"); } }, @@ -5224,7 +5258,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { }, _shouldRender: function(target, pointer) { var activeObject = this.getActiveGroup() || this.getActiveObject(); - if (activeObject && activeObject.isEditing) { + if (activeObject && activeObject.isEditing && target === activeObject) { return false; } return !!(target && (target.isMoving || target !== activeObject) || !target && !!activeObject || !target && !activeObject && !this._groupSelector || pointer && this._previousPointer && this.selection && (pointer.x !== this._previousPointer.x || pointer.y !== this._previousPointer.y)); @@ -5259,7 +5293,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this._handleEvent(e, eventType, target ? target : null); }, _handleEvent: function(e, eventType, targetObj) { - var target = typeof targetObj === undefined ? this.findTarget(e) : targetObj, targets = this.targets || [], options = { + var target = typeof targetObj === "undefined" ? this.findTarget(e) : targetObj, targets = this.targets || [], options = { e: e, target: target, subTargets: targets @@ -5322,7 +5356,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this._handleEvent(e, "up"); }, __onMouseDown: function(e) { - var target = this.findTarget(e), pointer = this.getPointer(e, true); + var target = this.findTarget(e); var isRightClick = "which" in e ? e.which === 3 : e.button === 2; if (isRightClick) { if (this.fireRightClick) { @@ -5337,6 +5371,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { if (this._currentTransform) { return; } + var pointer = this.getPointer(e, true); this._previousPointer = pointer; var shouldRender = this._shouldRender(target, pointer), shouldGroup = this._shouldGroup(e, target); if (this._shouldClearSelection(e, target)) { @@ -5421,9 +5456,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this._handleEvent(e, "move", target ? target : null); }, __onMouseWheel: function(e) { - this.fire("mouse:wheel", { - e: e - }); + this._handleEvent(e, "wheel"); }, _transformObject: function(e) { var pointer = this.getPointer(e), transform = this._currentTransform; @@ -5714,9 +5747,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { delete serialized.overlayImage; delete serialized.background; delete serialized.overlay; - for (var prop in serialized) { - _this[prop] = serialized[prop]; - } + _this._setOptions(serialized); callback && callback(); }); }, reviver); @@ -5743,17 +5774,17 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { this.__setBgOverlay("overlayImage", serialized.overlayImage, loaded, cbIfLoaded); this.__setBgOverlay("backgroundColor", serialized.background, loaded, cbIfLoaded); this.__setBgOverlay("overlayColor", serialized.overlay, loaded, cbIfLoaded); - cbIfLoaded(); }, __setBgOverlay: function(property, value, loaded, callback) { var _this = this; if (!value) { loaded[property] = true; + callback && callback(); return; } if (property === "backgroundImage" || property === "overlayImage") { - fabric.Image.fromObject(value, function(img) { - _this[property] = img; + fabric.util.enlivenObjects([ value ], function(enlivedObject) { + _this[property] = enlivedObject[0]; loaded[property] = true; callback && callback(); }); @@ -5819,11 +5850,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { (function(global) { "use strict"; - var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, toFixed = fabric.util.toFixed, capitalize = fabric.util.string.capitalize, degreesToRadians = fabric.util.degreesToRadians, supportsLineDash = fabric.StaticCanvas.supports("setLineDash"), objectCaching = !fabric.isLikelyNode; + var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, capitalize = fabric.util.string.capitalize, degreesToRadians = fabric.util.degreesToRadians, supportsLineDash = fabric.StaticCanvas.supports("setLineDash"), objectCaching = !fabric.isLikelyNode; if (fabric.Object) { return; } - fabric.Object = fabric.util.createClass({ + fabric.Object = fabric.util.createClass(fabric.CommonMethods, { type: "object", originX: "left", originY: "top", @@ -5914,8 +5945,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { _getCacheCanvasDimensions: function() { var zoom = this.canvas && this.canvas.getZoom() || 1, objectScale = this.getObjectScaling(), dim = this._getNonTransformedDimensions(), retina = this.canvas && this.canvas._isRetinaScaling() ? fabric.devicePixelRatio : 1, zoomX = objectScale.scaleX * zoom * retina, zoomY = objectScale.scaleY * zoom * retina, width = dim.x * zoomX, height = dim.y * zoomY; return { - width: width, - height: height, + width: Math.ceil(width) + 2, + height: Math.ceil(height) + 2, zoomX: zoomX, zoomY: zoomY }; @@ -5941,38 +5972,13 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } return false; }, - _initGradient: function(options) { - if (options.fill && options.fill.colorStops && !(options.fill instanceof fabric.Gradient)) { - this.set("fill", new fabric.Gradient(options.fill)); - } - if (options.stroke && options.stroke.colorStops && !(options.stroke instanceof fabric.Gradient)) { - this.set("stroke", new fabric.Gradient(options.stroke)); - } - }, - _initPattern: function(options) { - if (options.fill && options.fill.source && !(options.fill instanceof fabric.Pattern)) { - this.set("fill", new fabric.Pattern(options.fill)); - } - if (options.stroke && options.stroke.source && !(options.stroke instanceof fabric.Pattern)) { - this.set("stroke", new fabric.Pattern(options.stroke)); - } - }, - _initClipping: function(options) { - if (!options.clipTo || typeof options.clipTo !== "string") { - return; - } - var functionBody = fabric.util.getFunctionBody(options.clipTo); - if (typeof functionBody !== "undefined") { - this.clipTo = new Function("ctx", functionBody); - } - }, setOptions: function(options) { - for (var prop in options) { - this.set(prop, options[prop]); - } - this._initGradient(options); - this._initPattern(options); + this._setOptions(options); + this._initGradient(options.fill, "fill"); + this._initGradient(options.stroke, "stroke"); this._initClipping(options); + this._initPattern(options.fill, "fill"); + this._initPattern(options.stroke, "stroke"); }, transform: function(ctx, fromLeft) { if (this.group && !this.group._transformDone && this.group === this.canvas._activeGroup) { @@ -6013,7 +6019,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { backgroundColor: this.backgroundColor, fillRule: this.fillRule, globalCompositeOperation: this.globalCompositeOperation, - transformMatrix: this.transformMatrix ? this.transformMatrix.concat() : this.transformMatrix, + transformMatrix: this.transformMatrix ? this.transformMatrix.concat() : null, skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS), skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS) }; @@ -6042,9 +6048,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { toString: function() { return "#"; }, - get: function(property) { - return this[property]; - }, getObjectScaling: function() { var scaleX = this.scaleX, scaleY = this.scaleY; if (this.group) { @@ -6057,23 +6060,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { scaleY: scaleY }; }, - _setObject: function(obj) { - for (var prop in obj) { - this._set(prop, obj[prop]); - } - }, - set: function(key, value) { - if (typeof key === "object") { - this._setObject(key); - } else { - if (typeof value === "function" && key !== "clipTo") { - this._set(key, value(this.get(key))); - } else { - this._set(key, value); - } - } - return this; - }, _set: function(key, value) { var shouldConstrainValue = key === "scaleX" || key === "scaleY"; if (shouldConstrainValue) { @@ -6087,9 +6073,14 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { value *= -1; } else if (key === "shadow" && value && !(value instanceof fabric.Shadow)) { value = new fabric.Shadow(value); + } else if (key === "dirty" && this.group) { + this.group.set("dirty", value); } this[key] = value; if (this.cacheProperties.indexOf(key) > -1) { + if (this.group) { + this.group.set("dirty", true); + } this.dirty = true; } if (key === "width" || key === "height") { @@ -6098,13 +6089,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return this; }, setOnGroup: function() {}, - toggle: function(property) { - var value = this.get(property); - if (typeof value === "boolean") { - this.set(property, !value); - } - return this; - }, setSourcePath: function(value) { this.sourcePath = value; return this; @@ -6258,18 +6242,23 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { ctx.shadowColor = ""; ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; }, + _applyPatternGradientTransform: function(ctx, filler) { + if (!filler.toLive) { + return; + } + var transform = filler.gradientTransform || filler.patternTransform; + if (transform) { + ctx.transform.apply(ctx, transform); + } + var offsetX = -this.width / 2 + filler.offsetX || 0, offsetY = -this.height / 2 + filler.offsetY || 0; + ctx.translate(offsetX, offsetY); + }, _renderFill: function(ctx) { if (!this.fill) { return; } ctx.save(); - if (this.fill.gradientTransform) { - var g = this.fill.gradientTransform; - ctx.transform.apply(ctx, g); - } - if (this.fill.toLive) { - ctx.translate(-this.width / 2 + this.fill.offsetX || 0, -this.height / 2 + this.fill.offsetY || 0); - } + this._applyPatternGradientTransform(ctx, this.fill); if (this.fillRule === "evenodd") { ctx.fill("evenodd"); } else { @@ -6286,13 +6275,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } ctx.save(); this._setLineDash(ctx, this.strokeDashArray, this._renderDashedStroke); - if (this.stroke.gradientTransform) { - var g = this.stroke.gradientTransform; - ctx.transform.apply(ctx, g); - } - if (this.stroke.toLive) { - ctx.translate(-this.width / 2 + this.stroke.offsetX || 0, -this.height / 2 + this.stroke.offsetY || 0); - } + this._applyPatternGradientTransform(ctx, this.stroke); ctx.stroke(); ctx.restore(); }, @@ -6367,15 +6350,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { gradient.coords.r1 = options.r1; gradient.coords.r2 = options.r2; } - options.gradientTransform && (gradient.gradientTransform = options.gradientTransform); - for (var position in options.colorStops) { - var color = new fabric.Color(options.colorStops[position]); - gradient.colorStops.push({ - offset: position, - color: color.toRgb(), - opacity: color.getAlpha() - }); - } + gradient.gradientTransform = options.gradientTransform; + fabric.Gradient.prototype.addColorStop.call(gradient, options.colorStops); return this.set(property, fabric.Gradient.forObject(this, gradient)); }, setPatternFill: function(options) { @@ -6431,7 +6407,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { pointer = pointer || this.canvas.getPointer(e); var pClicked = new fabric.Point(pointer.x, pointer.y), objectLeftTop = this._getLeftTopCoords(); if (this.angle) { - pClicked = fabric.util.rotatePoint(pClicked, objectLeftTop, fabric.util.degreesToRadians(-this.angle)); + pClicked = fabric.util.rotatePoint(pClicked, objectLeftTop, degreesToRadians(-this.angle)); } return { x: pClicked.x - objectLeftTop.x, @@ -6448,6 +6424,22 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { fabric.Object.prototype.rotate = fabric.Object.prototype.setAngle; extend(fabric.Object.prototype, fabric.Observable); fabric.Object.NUM_FRACTION_DIGITS = 2; + fabric.Object._fromObject = function(className, object, callback, forceAsync, extraParam) { + var klass = fabric[className]; + object = clone(object, true); + if (forceAsync) { + fabric.util.enlivenPatterns([ object.fill, object.stroke ], function(patterns) { + object.fill = patterns[0]; + object.stroke = patterns[1]; + var instance = extraParam ? new klass(object[extraParam], object) : new klass(object); + callback && callback(instance); + }); + } else { + var instance = extraParam ? new klass(object[extraParam], object) : new klass(object); + callback && callback(instance); + return instance; + } + }; fabric.Object.__uid = 0; })(typeof exports !== "undefined" ? exports : this); @@ -7271,7 +7263,7 @@ fabric.util.object.extend(fabric.Object.prototype, { (function(global) { "use strict"; - var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, coordProps = { + var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, clone = fabric.util.object.clone, coordProps = { x1: 1, x2: 1, y1: 1, @@ -7401,12 +7393,23 @@ fabric.util.object.extend(fabric.Object.prototype, { }); fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")); fabric.Line.fromElement = function(element, options) { + options = options || {}; var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES), points = [ parsedAttributes.x1 || 0, parsedAttributes.y1 || 0, parsedAttributes.x2 || 0, parsedAttributes.y2 || 0 ]; + options.originX = "left"; + options.originY = "top"; return new fabric.Line(points, extend(parsedAttributes, options)); }; - fabric.Line.fromObject = function(object, callback) { - var points = [ object.x1, object.y1, object.x2, object.y2 ], line = new fabric.Line(points, object); - callback && callback(line); + fabric.Line.fromObject = function(object, callback, forceAsync) { + function _callback(instance) { + delete instance.points; + callback && callback(instance); + } + var options = clone(object, true); + options.points = [ object.x1, object.y1, object.x2, object.y2 ]; + var line = fabric.Object._fromObject("Line", options, _callback, forceAsync, "points"); + if (line) { + delete line.points; + } return line; }; function makeEdgeToOriginGetter(propertyNames, originValues) { @@ -7506,10 +7509,8 @@ fabric.util.object.extend(fabric.Object.prototype, { function isValidRadius(attributes) { return "radius" in attributes && attributes.radius >= 0; } - fabric.Circle.fromObject = function(object, callback) { - var circle = new fabric.Circle(object); - callback && callback(circle); - return circle; + fabric.Circle.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Circle", object, callback, forceAsync); }; })(typeof exports !== "undefined" ? exports : this); @@ -7553,10 +7554,8 @@ fabric.util.object.extend(fabric.Object.prototype, { return 1; } }); - fabric.Triangle.fromObject = function(object, callback) { - var triangle = new fabric.Triangle(object); - callback && callback(triangle); - return triangle; + fabric.Triangle.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Triangle", object, callback, forceAsync); }; })(typeof exports !== "undefined" ? exports : this); @@ -7636,10 +7635,8 @@ fabric.util.object.extend(fabric.Object.prototype, { ellipse.left -= ellipse.rx; return ellipse; }; - fabric.Ellipse.fromObject = function(object, callback) { - var ellipse = new fabric.Ellipse(object); - callback && callback(ellipse); - return ellipse; + fabric.Ellipse.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Ellipse", object, callback, forceAsync); }; })(typeof exports !== "undefined" ? exports : this); @@ -7727,10 +7724,8 @@ fabric.util.object.extend(fabric.Object.prototype, { rect.visible = rect.visible && rect.width > 0 && rect.height > 0; return rect; }; - fabric.Rect.fromObject = function(object, callback) { - var rect = new fabric.Rect(object); - callback && callback(rect); - return rect; + fabric.Rect.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Rect", object, callback, forceAsync); }; })(typeof exports !== "undefined" ? exports : this); @@ -7790,10 +7785,8 @@ fabric.util.object.extend(fabric.Object.prototype, { var points = fabric.parsePointsAttribute(element.getAttribute("points")), parsedAttributes = fabric.parseAttributes(element, fabric.Polyline.ATTRIBUTE_NAMES); return new fabric.Polyline(points, fabric.util.object.extend(parsedAttributes, options)); }; - fabric.Polyline.fromObject = function(object, callback) { - var polyline = new fabric.Polyline(object.points, object); - callback && callback(polyline); - return polyline; + fabric.Polyline.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Polyline", object, callback, forceAsync, "points"); }; })(typeof exports !== "undefined" ? exports : this); @@ -7891,10 +7884,8 @@ fabric.util.object.extend(fabric.Object.prototype, { var points = fabric.parsePointsAttribute(element.getAttribute("points")), parsedAttributes = fabric.parseAttributes(element, fabric.Polygon.ATTRIBUTE_NAMES); return new fabric.Polygon(points, extend(parsedAttributes, options)); }; - fabric.Polygon.fromObject = function(object, callback) { - var polygon = new fabric.Polygon(object.points, object); - callback && callback(polygon); - return polygon; + fabric.Polygon.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Polygon", object, callback, forceAsync, "points"); }; })(typeof exports !== "undefined" ? exports : this); @@ -8407,7 +8398,7 @@ fabric.util.object.extend(fabric.Object.prototype, { return o; } }); - fabric.Path.fromObject = function(object, callback) { + fabric.Path.fromObject = function(object, callback, forceAsync) { var path; if (typeof object.path === "string") { fabric.loadSVGFromURL(object.path, function(elements) { @@ -8419,9 +8410,7 @@ fabric.util.object.extend(fabric.Object.prototype, { callback && callback(path); }); } else { - path = new fabric.Path(object.path, object); - callback && callback(path); - return path; + return fabric.Object._fromObject("Path", object, callback, forceAsync, "path"); } }; fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat([ "d" ]); @@ -9196,7 +9185,11 @@ fabric.util.object.extend(fabric.Object.prototype, { fabric.Image.CSS_CANVAS = "canvas-img"; fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc; fabric.Image.fromObject = function(object, callback) { - fabric.util.loadImage(object.src, function(img) { + fabric.util.loadImage(object.src, function(img, error) { + if (error) { + callback && callback(null, error); + return; + } fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) { object.filters = filters || []; fabric.Image.prototype._initFilters.call(object, object.resizeFilters, function(resizeFilters) { @@ -9297,6 +9290,12 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ } }); +fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { + var filter = new fabric.Image.filters[object.type](object); + callback && callback(filter); + return filter; +}; + (function(global) { "use strict"; var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, filters = fabric.Image.filters, createClass = fabric.util.createClass; @@ -9321,9 +9320,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Brightness.fromObject = function(object) { - return new fabric.Image.filters.Brightness(object); - }; + fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9375,9 +9372,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Convolute.fromObject = function(object) { - return new fabric.Image.filters.Convolute(object); - }; + fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9402,9 +9397,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.GradientTransparency.fromObject = function(object) { - return new fabric.Image.filters.GradientTransparency(object); - }; + fabric.Image.filters.GradientTransparency.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9424,8 +9417,10 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ context.putImageData(imageData, 0, 0); } }); - fabric.Image.filters.Grayscale.fromObject = function() { - return new fabric.Image.filters.Grayscale(); + fabric.Image.filters.Grayscale.fromObject = function(object, callback) { + object = object || {}; + object.type = "Grayscale"; + return fabric.Image.filters.BaseFilter.fromObject(object, callback); }; })(typeof exports !== "undefined" ? exports : this); @@ -9444,8 +9439,10 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ context.putImageData(imageData, 0, 0); } }); - fabric.Image.filters.Invert.fromObject = function() { - return new fabric.Image.filters.Invert(); + fabric.Image.filters.Invert.fromObject = function(object, callback) { + object = object || {}; + object.type = "Invert"; + return fabric.Image.filters.BaseFilter.fromObject(object, callback); }; })(typeof exports !== "undefined" ? exports : this); @@ -9483,7 +9480,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ fabric.Image.filters.Mask.fromObject = function(object, callback) { fabric.util.loadImage(object.mask.src, function(img) { object.mask = new fabric.Image(img, object.mask); - callback && callback(new fabric.Image.filters.Mask(object)); + return fabric.Image.filters.BaseFilter.fromObject(object, callback); }); }; fabric.Image.filters.Mask.async = true; @@ -9514,9 +9511,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Noise.fromObject = function(object) { - return new fabric.Image.filters.Noise(object); - }; + fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9556,9 +9551,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Pixelate.fromObject = function(object) { - return new fabric.Image.filters.Pixelate(object); - }; + fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9590,9 +9583,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.RemoveWhite.fromObject = function(object) { - return new fabric.Image.filters.RemoveWhite(object); - }; + fabric.Image.filters.RemoveWhite.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9611,8 +9602,10 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ context.putImageData(imageData, 0, 0); } }); - fabric.Image.filters.Sepia.fromObject = function() { - return new fabric.Image.filters.Sepia(); + fabric.Image.filters.Sepia.fromObject = function(object, callback) { + object = object || {}; + object.type = "Sepia"; + return new fabric.Image.filters.BaseFilter.fromObject(object, callback); }; })(typeof exports !== "undefined" ? exports : this); @@ -9634,8 +9627,10 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ context.putImageData(imageData, 0, 0); } }); - fabric.Image.filters.Sepia2.fromObject = function() { - return new fabric.Image.filters.Sepia2(); + fabric.Image.filters.Sepia2.fromObject = function(object, callback) { + object = object || {}; + object.type = "Sepia2"; + return new fabric.Image.filters.BaseFilter.fromObject(object, callback); }; })(typeof exports !== "undefined" ? exports : this); @@ -9673,9 +9668,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Tint.fromObject = function(object) { - return new fabric.Image.filters.Tint(object); - }; + fabric.Image.filters.Tint.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9703,9 +9696,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Multiply.fromObject = function(object) { - return new fabric.Image.filters.Multiply(object); - }; + fabric.Image.filters.Multiply.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -9805,9 +9796,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }; } }); - fabric.Image.filters.Blend.fromObject = function(object) { - return new fabric.Image.filters.Blend(object); - }; + fabric.Image.filters.Blend.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -10016,9 +10005,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }; } }); - fabric.Image.filters.Resize.fromObject = function(object) { - return new fabric.Image.filters.Resize(object); - }; + fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -10051,9 +10038,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.ColorMatrix.fromObject = function(object) { - return new fabric.Image.filters.ColorMatrix(object); - }; + fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -10080,9 +10065,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Contrast.fromObject = function(object) { - return new fabric.Image.filters.Contrast(object); - }; + fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { @@ -10110,14 +10093,12 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.Image.filters.Saturate.fromObject = function(object) { - return new fabric.Image.filters.Saturate(object); - }; + fabric.Image.filters.Saturate.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); (function(global) { "use strict"; - var fabric = global.fabric || (global.fabric = {}), clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, MIN_TEXT_WIDTH = 2; + var fabric = global.fabric || (global.fabric = {}), toFixed = fabric.util.toFixed, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, MIN_TEXT_WIDTH = 2; if (fabric.Text) { fabric.warn("fabric.Text is already defined"); return; @@ -10175,8 +10156,9 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }, _getCacheCanvasDimensions: function() { var dim = this.callSuper("_getCacheCanvasDimensions"); - dim.width += 2 * this.fontSize; - dim.height += 2 * this.fontSize; + var fontSize = Math.ceil(this.fontSize) * 2; + dim.width += fontSize; + dim.height += fontSize; return dim; }, _render: function(ctx) { @@ -10334,13 +10316,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ this.__lineHeights = []; }, _shouldClearDimensionCache: function() { - var shouldClear = false; - if (this._forceClearCache) { - this._forceClearCache = false; - this.dirty = true; - return true; - } - shouldClear = this.hasStateChanged("_dimensionAffectingProps"); + var shouldClear = this._forceClearCache; + shouldClear || (shouldClear = this.hasStateChanged("_dimensionAffectingProps")); if (shouldClear) { this.saveState({ propertySet: "_dimensionAffectingProps" @@ -10559,10 +10536,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); return text; }; - fabric.Text.fromObject = function(object, callback) { - var text = new fabric.Text(object.text, clone(object)); - callback && callback(text); - return text; + fabric.Text.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Text", object, callback, forceAsync, "text"); }; fabric.util.createAccessors(fabric.Text); })(typeof exports !== "undefined" ? exports : this); @@ -11124,10 +11099,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }); } }); - fabric.IText.fromObject = function(object, callback) { - var iText = new fabric.IText(object.text, clone(object)); - callback && callback(iText); - return iText; + fabric.IText.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("IText", object, callback, forceAsync, "text"); }; })(); @@ -12183,6 +12156,7 @@ fabric.util.object.extend(fabric.IText.prototype, { } else { this._removeCharsFromTo(this.selectionStart, this.selectionEnd); } + this.set("dirty", true); this.setSelectionEnd(this.selectionStart); this._removeExtraneousStyles(); this.canvas && this.canvas.renderAll(); @@ -12262,7 +12236,7 @@ fabric.util.object.extend(fabric.IText.prototype, { (function(global) { "use strict"; - var fabric = global.fabric || (global.fabric = {}), clone = fabric.util.object.clone; + var fabric = global.fabric || (global.fabric = {}); fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, { type: "textbox", minWidth: 20, @@ -12464,10 +12438,8 @@ fabric.util.object.extend(fabric.IText.prototype, { return this.callSuper("toObject", [ "minWidth" ].concat(propertiesToInclude)); } }); - fabric.Textbox.fromObject = function(object, callback) { - var textbox = new fabric.Textbox(object.text, clone(object)); - callback && callback(textbox); - return textbox; + fabric.Textbox.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Textbox", object, callback, forceAsync, "text"); }; fabric.Textbox.getTextboxControlVisibility = function() { return { diff --git a/package.json b/package.json index 6502a2f5..25a3fa65 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "fabric", "description": "Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.", "homepage": "http://fabricjs.com/", - "version": "1.7.2", + "version": "1.7.3", "author": "Juriy Zaytsev ", "contributors": [ { diff --git a/test/unit/itext.js b/test/unit/itext.js index a0d8dfb7..1be5eb0d 100644 --- a/test/unit/itext.js +++ b/test/unit/itext.js @@ -745,24 +745,23 @@ equal(iText.getCurrentCharColor(1, 0), '#333'); }); - test('toSVG', function() { - var iText = new fabric.IText('test', { - styles: { - 0: { - 0: { fill: '#112233' }, - 2: { stroke: '#223344' } - } - } - }); - equal(typeof iText.toSVG, 'function'); - if (!fabric.isLikelyNode) { - equal(iText.toSVG(), '\t\n\t\t\n\t\t\tt\n\t\t\te\n\t\t\ts\n\t\t\tt\n\t\t\n\t\n'); - } - else { - equal(iText.toSVG(), '\t\n\t\t\n\t\t\tt\n\t\t\te\n\t\t\ts\n\t\t\tt\n\t\t\n\t\n'); - } - // TODO: more SVG tests here? - }); + // test('toSVG', function() { + // var iText = new fabric.IText('test', { + // styles: { + // 0: { + // 0: { fill: '#112233' }, + // 2: { stroke: '#223344' } + // } + // } + // }); + // equal(typeof iText.toSVG, 'function'); + // if (fabric.isLikelyNode) { + // equal(iText.toSVG(), '\t\n\t\t\n\t\t\tt\n\t\t\te\n\t\t\ts\n\t\t\tt\n\t\t\n\t\n'); + // } + // else { + // equal(iText.toSVG(), '\t\n\t\t\n\t\t\tt\n\t\t\te\n\t\t\ts\n\t\t\tt\n\t\t\n\t\n'); + // } + // }); test('toSVGWithFonts', function() { var iText = new fabric.IText('test foo bar-baz\nqux', {