From ec8a920081afe43a1a49e80814effee990bb83c3 Mon Sep 17 00:00:00 2001 From: kangax Date: Thu, 21 Nov 2013 18:00:29 +0100 Subject: [PATCH] Reorganize parser.js --- dist/all.js | 682 ++++++++++++++++++++++---------------------- dist/all.min.js | 12 +- dist/all.min.js.gz | Bin 59928 -> 59903 bytes dist/all.require.js | 682 ++++++++++++++++++++++---------------------- src/parser.js | 682 ++++++++++++++++++++++---------------------- 5 files changed, 1011 insertions(+), 1047 deletions(-) diff --git a/dist/all.js b/dist/all.js index 23c426e5..7ddb623f 100644 --- a/dist/all.js +++ b/dist/all.js @@ -4362,55 +4362,13 @@ if (typeof console !== 'undefined') { return attributes; } - /** - * Returns an object of attributes' name/value, given element and an array of attribute names; - * Parses parent "g" nodes recursively upwards. - * @static - * @memberOf fabric - * @param {DOMElement} element Element to parse - * @param {Array} attributes Array of attributes to parse - * @return {Object} object containing parsed attributes' names/values - */ - function parseAttributes(element, attributes) { - - if (!element) { - return; - } - - var value, - parentAttributes = { }; - - // if there's a parent container (`g` node), parse its attributes recursively upwards - if (element.parentNode && /^g$/i.test(element.parentNode.nodeName)) { - parentAttributes = fabric.parseAttributes(element.parentNode, attributes); - } - - var ownAttributes = attributes.reduce(function(memo, attr) { - value = element.getAttribute(attr); - if (value) { - attr = normalizeAttr(attr); - value = normalizeValue(attr, value, parentAttributes); - - memo[attr] = value; - } - return memo; - }, { }); - - // add values parsed from style, which take precedence over attributes - // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) - - ownAttributes = extend(ownAttributes, - extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); - return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); - } - /** * Parses "transform" attribute, returning an array of values * @static * @function * @memberOf fabric - * @param attributeValue {String} string containing attribute value - * @return {Array} array of 6 elements representing transformation matrix + * @param {String} attributeValue String containing attribute value + * @return {Array} Array of 6 elements representing transformation matrix */ fabric.parseTransformAttribute = (function() { function rotateMatrix(matrix, args) { @@ -4558,49 +4516,6 @@ if (typeof console !== 'undefined') { }; })(); - /** - * Parses "points" attribute, returning an array of values - * @static - * @memberOf fabric - * @param points {String} points attribute string - * @return {Array} array of points - */ - function parsePointsAttribute(points) { - - // points attribute is required and must not be empty - if (!points) return null; - - points = points.trim(); - var asPairs = points.indexOf(',') > -1; - - points = points.split(/\s+/); - var parsedPoints = [ ], i, len; - - // points could look like "10,20 30,40" or "10 20 30 40" - if (asPairs) { - i = 0; - len = points.length; - for (; i < len; i++) { - var pair = points[i].split(','); - parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); - } - } - else { - i = 0; - len = points.length; - for (; i < len; i+=2) { - parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); - } - } - - // odd number of points is an error - if (parsedPoints.length % 2 !== 0) { - // return null; - } - - return parsedPoints; - } - function parseFontDeclaration(value, oStyle) { // TODO: support non-px font size @@ -4633,29 +4548,6 @@ if (typeof console !== 'undefined') { } } - /** - * Parses "style" attribute, retuning an object with values - * @static - * @memberOf fabric - * @param {SVGElement} element Element to parse - * @return {Object} Objects with values parsed from style attribute of an element - */ - function parseStyleAttribute(element) { - var oStyle = { }, - style = element.getAttribute('style'); - - if (!style) return oStyle; - - if (typeof style === 'string') { - parseStyleString(style, oStyle); - } - else { - parseStyleObject(style, oStyle); - } - - return oStyle; - } - /** * @private */ @@ -4696,81 +4588,6 @@ if (typeof console !== 'undefined') { } } - function resolveGradients(instances) { - for (var i = instances.length; i--; ) { - var instanceFillValue = instances[i].get('fill'); - - if (/^url\(/.test(instanceFillValue)) { - - var gradientId = instanceFillValue.slice(5, instanceFillValue.length - 1); - - if (fabric.gradientDefs[gradientId]) { - instances[i].set('fill', - fabric.Gradient.fromElement(fabric.gradientDefs[gradientId], instances[i])); - } - } - } - } - - /** - * Transforms an array of svg elements to corresponding fabric.* instances - * @static - * @memberOf fabric - * @param {Array} elements Array of elements to parse - * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) - * @param {Object} [options] Options object - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function parseElements(elements, callback, options, reviver) { - fabric.ElementsParser.parse(elements, callback, options, reviver); - } - - /** - * Returns CSS rules for a given SVG document - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} CSS rules of this document - */ - function getCSSRules(doc) { - var styles = doc.getElementsByTagName('style'), - allRules = { }, - rules; - - // very crude parsing of style contents - for (var i = 0, len = styles.length; i < len; i++) { - var styleContents = styles[0].textContent; - - // remove comments - styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); - - rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); - rules = rules.map(function(rule) { return rule.trim(); }); - - rules.forEach(function(rule) { - var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); - rule = match[1]; - var declaration = match[2].trim(), - propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); - - if (!allRules[rule]) { - allRules[rule] = { }; - } - - for (var i = 0, len = propertyValuePairs.length; i < len; i++) { - var pair = propertyValuePairs[i].split(/\s*:\s*/), - property = pair[0], - value = pair[1]; - - allRules[rule][property] = value; - } - }); - } - - return allRules; - } - /** * @private */ @@ -4881,7 +4698,7 @@ if (typeof console !== 'undefined') { }; fabric.gradientDefs = fabric.getGradientDefs(doc); - fabric.cssRules = getCSSRules(doc); + fabric.cssRules = fabric.getCSSRules(doc); // Precedence of rules: style > class > attribute @@ -4925,53 +4742,6 @@ if (typeof console !== 'undefined') { } }; - /** - * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) - * @memberof fabric - * @param {String} url - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function loadSVGFromURL(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 - }); - } - }); - - function onComplete(r) { - - var xml = r.responseXML; - if (!xml.documentElement && fabric.window.ActiveXObject && r.responseText) { - xml = new ActiveXObject('Microsoft.XMLDOM'); - xml.async = 'false'; - //IE chokes on DOCTYPE - xml.loadXML(r.responseText.replace(//i,'')); - } - if (!xml.documentElement) return; - - fabric.parseSVGDocument(xml.documentElement, function (results, options) { - svgCache.set(url, { - objects: fabric.util.array.invoke(results, 'toObject'), - options: options - }); - callback(results, options); - }, reviver); - } - } - /** * @private */ @@ -4987,80 +4757,6 @@ if (typeof console !== 'undefined') { return ({ objects: objects, options: options }); } - /** - * Takes string corresponding to an SVG document, and parses it into a set of fabric objects - * @memberof fabric - * @param {String} string - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function loadSVGFromString(string, callback, reviver) { - string = string.trim(); - var doc; - if (typeof DOMParser !== 'undefined') { - var parser = new DOMParser(); - if (parser && parser.parseFromString) { - doc = parser.parseFromString(string, 'text/xml'); - } - } - else if (fabric.window.ActiveXObject) { - doc = new ActiveXObject('Microsoft.XMLDOM'); - doc.async = 'false'; - //IE chokes on DOCTYPE - doc.loadXML(string.replace(//i,'')); - } - - fabric.parseSVGDocument(doc.documentElement, function (results, options) { - callback(results, options); - }, reviver); - } - - /** - * Creates markup containing SVG font faces - * @param {Array} objects Array of fabric objects - * @return {String} - */ - function createSVGFontFacesMarkup(objects) { - var markup = ''; - - for (var i = 0, len = objects.length; i < len; i++) { - if (objects[i].type !== 'text' || !objects[i].path) continue; - - markup += [ - '@font-face {', - 'font-family: ', objects[i].fontFamily, '; ', - 'src: url(\'', objects[i].path, '\')', - '}' - ].join(''); - } - - if (markup) { - markup = [ - '' - ].join(''); - } - - return markup; - } - - /** - * Creates markup containing SVG referenced elements like patterns, gradients etc. - * @param {fabric.Canvas} canvas instance of fabric.Canvas - * @return {String} - */ - function createSVGRefElementsMarkup(canvas) { - var markup = [ ]; - - _createSVGPattern(markup, canvas, 'backgroundColor'); - _createSVGPattern(markup, canvas, 'overlayColor'); - - return markup.join(''); - } - /** * @private */ @@ -5080,51 +4776,343 @@ if (typeof console !== 'undefined') { } } - /** - * Parses an SVG document, returning all of the gradient declarations found in it - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element - */ - function getGradientDefs(doc) { - var linearGradientEls = doc.getElementsByTagName('linearGradient'), - radialGradientEls = doc.getElementsByTagName('radialGradient'), - el, i, - gradientDefs = { }; - - i = linearGradientEls.length; - for (; i--; ) { - el = linearGradientEls[i]; - gradientDefs[el.getAttribute('id')] = el; - } - - i = radialGradientEls.length; - for (; i--; ) { - el = radialGradientEls[i]; - gradientDefs[el.getAttribute('id')] = el; - } - - return gradientDefs; - } - extend(fabric, { - parseAttributes: parseAttributes, - parseElements: parseElements, - parseStyleAttribute: parseStyleAttribute, - parsePointsAttribute: parsePointsAttribute, - getCSSRules: getCSSRules, + /** + * Initializes gradients on instances, according to gradients parsed from a document + * @param {Array} instances + */ + resolveGradients: function(instances) { + for (var i = instances.length; i--; ) { + var instanceFillValue = instances[i].get('fill'); - loadSVGFromURL: loadSVGFromURL, - loadSVGFromString: loadSVGFromString, + if (!(/^url\(/).test(instanceFillValue)) continue; - createSVGFontFacesMarkup: createSVGFontFacesMarkup, - createSVGRefElementsMarkup: createSVGRefElementsMarkup, + var gradientId = instanceFillValue.slice(5, instanceFillValue.length - 1); - getGradientDefs: getGradientDefs, - resolveGradients: resolveGradients + if (fabric.gradientDefs[gradientId]) { + instances[i].set('fill', + fabric.Gradient.fromElement(fabric.gradientDefs[gradientId], instances[i])); + } + } + }, + + /** + * Parses an SVG document, returning all of the gradient declarations found in it + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element + */ + getGradientDefs: function(doc) { + var linearGradientEls = doc.getElementsByTagName('linearGradient'), + radialGradientEls = doc.getElementsByTagName('radialGradient'), + el, i, + gradientDefs = { }; + + i = linearGradientEls.length; + for (; i--; ) { + el = linearGradientEls[i]; + gradientDefs[el.getAttribute('id')] = el; + } + + i = radialGradientEls.length; + for (; i--; ) { + el = radialGradientEls[i]; + gradientDefs[el.getAttribute('id')] = el; + } + + return gradientDefs; + }, + + /** + * Returns an object of attributes' name/value, given element and an array of attribute names; + * Parses parent "g" nodes recursively upwards. + * @static + * @memberOf fabric + * @param {DOMElement} element Element to parse + * @param {Array} attributes Array of attributes to parse + * @return {Object} object containing parsed attributes' names/values + */ + parseAttributes: function(element, attributes) { + + if (!element) { + return; + } + + var value, + parentAttributes = { }; + + // if there's a parent container (`g` node), parse its attributes recursively upwards + if (element.parentNode && /^g$/i.test(element.parentNode.nodeName)) { + parentAttributes = fabric.parseAttributes(element.parentNode, attributes); + } + + var ownAttributes = attributes.reduce(function(memo, attr) { + value = element.getAttribute(attr); + if (value) { + attr = normalizeAttr(attr); + value = normalizeValue(attr, value, parentAttributes); + + memo[attr] = value; + } + return memo; + }, { }); + + // add values parsed from style, which take precedence over attributes + // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) + ownAttributes = extend(ownAttributes, + extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); + + return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); + }, + + /** + * Transforms an array of svg elements to corresponding fabric.* instances + * @static + * @memberOf fabric + * @param {Array} elements Array of elements to parse + * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) + * @param {Object} [options] Options object + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + parseElements: function(elements, callback, options, reviver) { + fabric.ElementsParser.parse(elements, callback, options, reviver); + }, + + /** + * Parses "style" attribute, retuning an object with values + * @static + * @memberOf fabric + * @param {SVGElement} element Element to parse + * @return {Object} Objects with values parsed from style attribute of an element + */ + parseStyleAttribute: function(element) { + var oStyle = { }, + style = element.getAttribute('style'); + + if (!style) return oStyle; + + if (typeof style === 'string') { + parseStyleString(style, oStyle); + } + else { + parseStyleObject(style, oStyle); + } + + return oStyle; + }, + + /** + * Parses "points" attribute, returning an array of values + * @static + * @memberOf fabric + * @param points {String} points attribute string + * @return {Array} array of points + */ + parsePointsAttribute: function(points) { + + // points attribute is required and must not be empty + if (!points) return null; + + points = points.trim(); + var asPairs = points.indexOf(',') > -1; + + points = points.split(/\s+/); + var parsedPoints = [ ], i, len; + + // points could look like "10,20 30,40" or "10 20 30 40" + if (asPairs) { + i = 0; + len = points.length; + for (; i < len; i++) { + var pair = points[i].split(','); + parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); + } + } + else { + i = 0; + len = points.length; + for (; i < len; i+=2) { + parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); + } + } + + // odd number of points is an error + if (parsedPoints.length % 2 !== 0) { + // return null; + } + + return parsedPoints; + }, + + /** + * Returns CSS rules for a given SVG document + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} CSS rules of this document + */ + getCSSRules: function(doc) { + var styles = doc.getElementsByTagName('style'), + allRules = { }, + rules; + + // very crude parsing of style contents + for (var i = 0, len = styles.length; i < len; i++) { + var styleContents = styles[0].textContent; + + // remove comments + styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); + + rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); + rules = rules.map(function(rule) { return rule.trim(); }); + + rules.forEach(function(rule) { + var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); + rule = match[1]; + var declaration = match[2].trim(), + propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); + + if (!allRules[rule]) { + allRules[rule] = { }; + } + + for (var i = 0, len = propertyValuePairs.length; i < len; i++) { + var pair = propertyValuePairs[i].split(/\s*:\s*/), + property = pair[0], + value = pair[1]; + + allRules[rule][property] = value; + } + }); + } + + return allRules; + }, + + /** + * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) + * @memberof fabric + * @param {String} url + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + 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 + }); + } + }); + + function onComplete(r) { + + var xml = r.responseXML; + if (!xml.documentElement && fabric.window.ActiveXObject && r.responseText) { + xml = new ActiveXObject('Microsoft.XMLDOM'); + xml.async = 'false'; + //IE chokes on DOCTYPE + xml.loadXML(r.responseText.replace(//i,'')); + } + if (!xml.documentElement) return; + + fabric.parseSVGDocument(xml.documentElement, function (results, options) { + svgCache.set(url, { + objects: fabric.util.array.invoke(results, 'toObject'), + options: options + }); + callback(results, options); + }, reviver); + } + }, + + /** + * Takes string corresponding to an SVG document, and parses it into a set of fabric objects + * @memberof fabric + * @param {String} string + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + loadSVGFromString: function(string, callback, reviver) { + string = string.trim(); + var doc; + if (typeof DOMParser !== 'undefined') { + var parser = new DOMParser(); + if (parser && parser.parseFromString) { + doc = parser.parseFromString(string, 'text/xml'); + } + } + else if (fabric.window.ActiveXObject) { + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = 'false'; + //IE chokes on DOCTYPE + doc.loadXML(string.replace(//i,'')); + } + + fabric.parseSVGDocument(doc.documentElement, function (results, options) { + callback(results, options); + }, reviver); + }, + + /** + * Creates markup containing SVG font faces + * @param {Array} objects Array of fabric objects + * @return {String} + */ + createSVGFontFacesMarkup: function(objects) { + var markup = ''; + + for (var i = 0, len = objects.length; i < len; i++) { + if (objects[i].type !== 'text' || !objects[i].path) continue; + + markup += [ + '@font-face {', + 'font-family: ', objects[i].fontFamily, '; ', + 'src: url(\'', objects[i].path, '\')', + '}' + ].join(''); + } + + if (markup) { + markup = [ + '' + ].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(''); + } }); })(typeof exports !== 'undefined' ? exports : this); diff --git a/dist/all.min.js b/dist/all.min.js index 783f1c5a..dabaf11f 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,7 +1,7 @@ /* build: `node build.js modules=ALL exclude=gestures minifier=uglifyjs` *//*! Fabric.js Copyright 2008-2013, Printio (Juriy Zaytsev, Maxim Chernyak) */var fabric=fabric||{version:"1.3.12"};typeof exports!="undefined"&&(exports.fabric=fabric),typeof document!="undefined"&&typeof window!="undefined"?(fabric.document=document,fabric.window=window):(fabric.document=require("jsdom").jsdom(""),fabric.window=fabric.document.createWindow()),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode=typeof Buffer!="undefined"&&typeof window=="undefined",fabric.SHARED_ATTRIBUTES=["transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width"];var Cufon=function(){function r(e){var t=this.face=e.face;this.glyphs=e.glyphs,this.w=e.w,this.baseSize=parseInt(t["units-per-em"],10),this.family=t["font-family"].toLowerCase(),this.weight=t["font-weight"],this.style=t["font-style"]||"normal",this.viewBox=function(){var e=t.bbox.split(/\s+/),n={minX:parseInt(e[0],10),minY:parseInt(e[1],10),maxX:parseInt(e[2],10),maxY:parseInt(e[3],10)};return n.width=n.maxX-n.minX,n.height=n.maxY-n.minY,n.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")},n}(),this.ascent=-parseInt(t.ascent,10),this.descent=-parseInt(t.descent,10),this.height=-this.ascent+this.descent}function i(){var e={},t={oblique:"italic",italic:"oblique"};this.add=function(t){(e[t.style]||(e[t.style]={}))[t.weight]=t},this.get=function(n,r){var i=e[n]||e[t[n]]||e.normal||e.italic||e.oblique;if(!i)return null;r={normal:400,bold:700}[r]||parseInt(r,10);if(i[r])return i[r];var s={1:1,99:0}[r%100],o=[],u,a;s===undefined&&(s=r>400),r==500&&(r=400);for(var f in i){f=parseInt(f,10);if(!u||fa)a=f;o.push(f)}return ra&&(r=a),o.sort(function(e,t){return(s?e>r&&t>r?et:et:e=i.length+e?r():setTimeout(arguments.callee,10)}),function(t){e?t():n.push(t)}}(),supports:function(e,t){var n=fabric.document.createElement("span").style;return n[e]===undefined?!1:(n[e]=t,n[e]===t)},textAlign:function(e,t,n,r){return t.get("textAlign")=="right"?n>0&&(e=" "+e):nk&&(k=N),A.push(N),N=0;continue}var O=t.glyphs[T[b]]||t.missingGlyph;if(!O)continue;N+=C=Number(O.w||t.w)+h}A.push(N),N=Math.max(k,N);var M=[];for(var b=A.length;b--;)M[b]=N-A[b];if(C===null)return null;d+=l.width-C,m+=l.minX;var _,D;if(f)_=u,D=u.firstChild;else{_=fabric.document.createElement("span"),_.className="cufon cufon-canvas",_.alt=n,D=fabric.document.createElement("canvas"),_.appendChild(D);if(i.printable){var P=fabric.document.createElement("span");P.className="cufon-alt",P.appendChild(fabric.document.createTextNode(n)),_.appendChild(P)}}var H=_.style,B=D.style||{},j=c.convert(l.height-p+v),F=Math.ceil(j),I=F/j;D.width=Math.ceil(c.convert(N+d-m)*I),D.height=F,p+=l.minY,B.top=Math.round(c.convert(p-t.ascent))+"px",B.left=Math.round(c.convert(m))+"px";var q=Math.ceil(c.convert(N*I)),R=q+"px",U=c.convert(t.height),z=(i.lineHeight-1)*c.convert(-t.ascent/5)*(L-1);Cufon.textOptions.width=q,Cufon.textOptions.height=U*L+z,Cufon.textOptions.lines=L,Cufon.textOptions.totalLineHeight=z,e?(H.width=R,H.height=U+"px"):(H.paddingLeft=R,H.paddingBottom=U-1+"px");var W=Cufon.textOptions.context||D.getContext("2d"),X=F/l.height;Cufon.textOptions.fontAscent=t.ascent*X,Cufon.textOptions.boundaries=null;for(var V=Cufon.textOptions.shadowOffsets,b=y.length;b--;)V[b]=[y[b][0]*X,y[b][1]*X];W.save(),W.scale(X,X),W.translate(-m-1/X*D.width/2+(Cufon.fonts[t.family].offsetLeft||0),-p-Cufon.textOptions.height/X/2+(Cufon.fonts[t.family].offsetTop||0)),W.lineWidth=t.face["underline-thickness"],W.save();var J=Cufon.getTextDecoration(i),K=i.fontStyle==="italic";W.save(),Q();if(g)for(var b=0,w=g.length;b.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}'),function(e,t,i,s,o,u,a){var f=t===null;f&&(t=o.alt);var l=e.viewBox,c=i.computedFontSize||(i.computedFontSize=new Cufon.CSS.Size(n(u,i.get("fontSize"))+"px",e.baseSize)),h=i.computedLSpacing;h==undefined&&(h=i.get("letterSpacing"),i.computedLSpacing=h=h=="normal"?0:~~c.convertFrom(r(u,h)));var p,d;if(f)p=o,d=o.firstChild;else{p=fabric.document.createElement("span"),p.className="cufon cufon-vml",p.alt=t,d=fabric.document.createElement("span"),d.className="cufon-vml-canvas",p.appendChild(d);if(s.printable){var v=fabric.document.createElement("span");v.className="cufon-alt",v.appendChild(fabric.document.createTextNode(t)),p.appendChild(v)}a||p.appendChild(fabric.document.createElement("cvml:shape"))}var m=p.style,g=d.style,y=c.convert(l.height),b=Math.ceil(y),w=b/y,E=l.minX,S=l.minY;g.height=b,g.top=Math.round(c.convert(S-e.ascent)),g.left=Math.round(c.convert(E)),m.height=c.convert(e.height)+"px";var x=Cufon.getTextDecoration(s),T=i.get("color"),N=Cufon.CSS.textTransform(t,i).split(""),C=0,k=0,L=null,A,O,M=s.textShadow;for(var _=0,D=0,P=N.length;_-1},complexity:function(){return this.getObjects().reduce(function(e,t){return e+=t.complexity?t.complexity():0,e},0)}},function(e){var t=Math.sqrt,n=Math.atan2,r=Math.PI/180;fabric.util={removeFromArray:function(e,t){var n=e.indexOf(t);return n!==-1&&e.splice(n,1),e},getRandomInt:function(e,t){return Math.floor(Math.random()*(t-e+1))+e},degreesToRadians:function(e){return e*r},radiansToDegrees:function(e){return e/r},rotatePoint:function(e,t,n){var r=Math.sin(n),i=Math.cos(n);e.subtractEquals(t);var s=e.x*i-e.y*r,o=e.x*r+e.y*i;return(new fabric.Point(s,o)).addEquals(t)},toFixed:function(e,t){return parseFloat(Number(e).toFixed(t))},falseFunction:function(){return!1},getKlass:function(e,t){return e=fabric.util.string.camelize(e.charAt(0).toUpperCase()+e.slice(1)),fabric.util.resolveNamespace(t)[e]},resolveNamespace:function(t){if(!t)return fabric;var n=t.split("."),r=n.length,i=e||fabric.window;for(var s=0;s1?r=new fabric.PathGroup(e,t):r=e[0],typeof n!="undefined"&&r.setSourcePath(n),r},populateWithProperties:function(e,t,n){if(n&&Object.prototype.toString.call(n)==="[object Array]")for(var r=0,i=n.length;rr)r+=u[p++%h],r>l&&(r=l),e[d?"lineTo":"moveTo"](r,0),d=!d;e.restore()},createCanvasElement:function(e){return e||(e=fabric.document.createElement("canvas")),!e.getContext&&typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager.initElement(e),e},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(e){var t=e.prototype;for(var n=t.stateProperties.length;n--;){var r=t.stateProperties[n],i=r.charAt(0).toUpperCase()+r.slice(1),s="set"+i,o="get"+i;t[o]||(t[o]=function(e){return new Function('return this.get("'+e+'")')}(r)),t[s]||(t[s]=function(e){return new Function("value",'return this.set("'+e+'", value)')}(r))}},clipContext:function(e,t){t.save(),t.beginPath(),e.clipTo(t),t.clip()},multiplyTransformMatrices:function(e,t){var n=[[e[0],e[2],e[4]],[e[1],e[3],e[5]],[0,0,1]],r=[[t[0],t[2],t[4]],[t[1],t[3],t[5]],[0,0,1]],i=[];for(var s=0;s<3;s++){i[s]=[];for(var o=0;o<3;o++){var u=0;for(var a=0;a<3;a++)u+=n[s][a]*r[a][o];i[s][o]=u}}return[i[0][0],i[1][0],i[0][1],i[1][1],i[0][2],i[1][2]]},getFunctionBody:function(e){return(String(e).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},normalizePoints:function(e,t){var n=fabric.util.array.min(e,"x"),r=fabric.util.array.min(e,"y");n=n<0?n:0,r=n<0?r:0;for(var i=0,s=e.length;i0&&(t>r?t-=r:t=0,n>r?n-=r:n=0);var i=!0,s=e.getImageData(t,n,r*2||1,r*2||1);for(var o=3,u=s.data.length;o0&&f===0&&(E-=2*Math.PI);var S=Math.ceil(Math.abs(E/(Math.PI*.5+.001))),x=[];for(var T=0;T1&&(h=Math.sqrt(h),t*=h,n*=h);var p=f/t,d=a/t,v=-a/n,m=f/n;return{x0:p*r+d*i,y0:v*r+m*i,x1:p*s+d*o,y1:v*s+m*o,sin_th:a,cos_th:f}}function o(e,i,s,o,u,a,f,l){r=n.call(arguments);if(t[r])return t[r];var c=l*u,h=-f*a,p=f*u,d=l*a,v=.5*(o-s),m=8/3*Math.sin(v*.5)*Math.sin(v*.5)/Math.sin(v),g=e+Math.cos(s)-m*Math.sin(s),y=i+Math.sin(s)+m*Math.cos(s),b=e+Math.cos(o),w=i+Math.sin(o),E=b+m*Math.sin(o),S=w-m*Math.cos(o);return t[r]=[c*g+h*y,p*g+d*y,c*E+h*S,p*E+d*S,c*b+h*w,p*b+d*w],t[r]}var e={},t={},n=Array.prototype.join,r;fabric.util.drawArc=function(e,t,n,r){var s=r[0],u=r[1],a=r[2],f=r[3],l=r[4],c=r[5],h=r[6],p=i(c,h,s,u,f,l,a,t,n);for(var d=0;d=t})}function r(e,t){return i(e,t,function(e,t){return e>>0;if(n===0)return-1;var r=0;arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:r!==0&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r))));if(r>=n)return-1;var i=r>=0?r:Math.max(n-Math.abs(r),0);for(;i>>0;n>>0;r>>0;n>>0;n>>0;i>>0,n=0,r;if(arguments.length>1)r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:e,capitalize:t,escapeXml:n}}(),function(){var e=Array.prototype.slice,t=Function.prototype.apply,n=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var i=this,s=e.call(arguments,1),o;return s.length?o=function(){return t.call(i,this instanceof n?this:r,s.concat(e.call(arguments)))}:o=function(){return t.call(i,this instanceof n?this:r,arguments)},n.prototype=this.prototype,o.prototype=new n,o})}(),function(){function i(){}function s(t){var n=this.constructor.superclass.prototype[t];return arguments.length>1?n.apply(this,e.call(arguments,1)):n.call(this)}function o(){function u(){this.initialize.apply(this,arguments)}var n=null,o=e.call(arguments,0);typeof o[0]=="function"&&(n=o.shift()),u.superclass=n,u.subclasses=[],n&&(i.prototype=n.prototype,u.prototype=new i,n.subclasses.push(u));for(var a=0,f=o.length;a-1?e.prototype[i]=function(e){return function(){var n=this.constructor.superclass;this.constructor.superclass=r;var i=t[e].apply(this,arguments);this.constructor.superclass=n;if(e!=="initialize")return i}}(i):e.prototype[i]=t[i],n&&(t.toString!==Object.prototype.toString&&(e.prototype.toString=t.toString),t.valueOf!==Object.prototype.valueOf&&(e.prototype.valueOf=t.valueOf))};fabric.util.createClass=o}(),function(){function t(e){var t=Array.prototype.slice.call(arguments,1),n,r,i=t.length;for(r=0;r-1?s(e,t.match(/opacity:\s*(\d?\.?\d*)/)[1]):e;for(var r in t)if(r==="opacity")s(e,t[r]);else{var i=r==="float"||r==="cssFloat"?typeof n.styleFloat=="undefined"?"cssFloat":"styleFloat":r;n[i]=t[r]}return e}var t=fabric.document.createElement("div"),n=typeof t.style.opacity=="string",r=typeof t.style.filter=="string",i=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(e){return e};n?s=function(e,t){return e.style.opacity=t,e}:r&&(s=function(e,t){var n=e.style;return e.currentStyle&&!e.currentStyle.hasLayout&&(n.zoom=1),i.test(n.filter)?(t=t>=.9999?"":"alpha(opacity="+t*100+")",n.filter=n.filter.replace(i,t)):n.filter+=" alpha(opacity="+t*100+")",e}),fabric.util.setStyle=e}(),function(){function t(e){return typeof e=="string"?fabric.document.getElementById(e):e}function s(e,t){var n=fabric.document.createElement(e);for(var r in t)r==="class"?n.className=t[r]:r==="for"?n.htmlFor=t[r]:n.setAttribute(r,t[r]);return n}function o(e,t){(" "+e.className+" ").indexOf(" "+t+" ")===-1&&(e.className+=(e.className?" ":"")+t)}function u(e,t,n){return typeof t=="string"&&(t=s(t,n)),e.parentNode&&e.parentNode.replaceChild(t,e),t.appendChild(e),t}function a(e,t){var n,r,i=0,s=0,o=fabric.document.documentElement,u=fabric.document.body||{scrollLeft:0,scrollTop:0};r=e;while(e&&e.parentNode&&!n)e=e.parentNode,e!==fabric.document&&fabric.util.getElementStyle(e,"position")==="fixed"&&(n=e),e!==fabric.document&&r!==t&&fabric.util.getElementStyle(e,"position")==="absolute"?(i=0,s=0):e===fabric.document?(i=u.scrollLeft||o.scrollLeft||0,s=u.scrollTop||o.scrollTop||0):(i+=e.scrollLeft||0,s+=e.scrollTop||0);return{left:i,top:s}}function f(e){var t,n={left:0,top:0},r=e&&e.ownerDocument,i={left:0,top:0},s,o={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return{left:0,top:0};for(var u in o)i[o[u]]+=parseInt(l(e,u),10)||0;return t=r.documentElement,typeof e.getBoundingClientRect!="undefined"&&(n=e.getBoundingClientRect()),s=fabric.util.getScrollLeftTop(e,null),{left:n.left+s.left-(t.clientLeft||0)+i.left,top:n.top+s.top-(t.clientTop||0)+i.top}}function l(e,t){e.style||(e.style={});if(fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle)return fabric.document.defaultView.getComputedStyle(e,null)[t];var n=e.style[t];return!n&&e.currentStyle&&(n=e.currentStyle[t]),n}var e=Array.prototype.slice,n=function(t){return e.call(t,0)},r;try{r=n(fabric.document.childNodes)instanceof Array}catch(i){}r||(n=function(e){var t=new Array(e.length),n=e.length;while(n--)t[n]=e[n];return t}),function(){function n(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=fabric.util.falseFunction),t?e.style[t]="none":typeof e.unselectable=="string"&&(e.unselectable="on"),e}function r(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=null),t?e.style[t]="":typeof e.unselectable=="string"&&(e.unselectable=""),e}var e=fabric.document.documentElement.style,t="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=n,fabric.util.makeElementSelectable=r}(),function(){function e(e,t){var n=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),i=!0;r.onload=r.onreadystatechange=function(e){if(i){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")return;i=!1,t(e||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=e,n.appendChild(r)}fabric.util.getScript=e}(),fabric.util.getById=t,fabric.util.toArray=n,fabric.util.makeElement=s,fabric.util.addClass=o,fabric.util.wrapElement=u,fabric.util.getScrollLeftTop=a,fabric.util.getElementOffset=f,fabric.util.getElementStyle=l}(),function(){function e(e,t){return e+(/\?/.test(e)?"&":"?")+t}function n(){}function r(r,i){i||(i={});var s=i.method?i.method.toUpperCase():"GET",o=i.onComplete||function(){},u=t(),a;return u.onreadystatechange=function(){u.readyState===4&&(o(u),u.onreadystatechange=n)},s==="GET"&&(a=null,typeof i.parameters=="string"&&(r=e(r,i.parameters))),u.open(s,r,!0),(s==="POST"||s==="PUT")&&u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(a),u}var t=function(){var e=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}];for(var t=e.length;t--;)try{var n=e[t]();if(n)return e[t]}catch(r){}}();fabric.util.request=r}(),fabric.log=function(){},fabric.warn=function(){},typeof console!="undefined"&&["log","warn"].forEach(function(e){typeof console[e]!="undefined"&&console[e].apply&&(fabric[e]=function(){return console[e].apply(console,arguments)})}),function(){function e(e){n(function(t){e||(e={});var r=t||+(new Date),i=e.duration||500,s=r+i,o,u=e.onChange||function(){},a=e.abort||function(){return!1},f=e.easing||function(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t},l="startValue"in e?e.startValue:0,c="endValue"in e?e.endValue:100,h=e.byValue||c-l;e.onStart&&e.onStart(),function p(t){o=t||+(new Date);var c=o>s?i:o-r;if(a()){e.onComplete&&e.onComplete();return}u(f(c,l,h,i));if(o>s){e.onComplete&&e.onComplete();return}n(p)}(r)})}var t=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(e){fabric.window.setTimeout(e,1e3/60)},n=function(){return t.apply(fabric.window,arguments)};fabric.util.animate=e,fabric.util.requestAnimFrame=n}(),function(){function e(e,t,n,r){return e-1;e=e.split(/\s+/);var n=[],r,i;if(t){r=0,i=e.length;for(;r/i,"")));if(!s.documentElement)return;t.parseSVGDocument(s.documentElement,function(r,i){S.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),S.has(e,function(r){r?S.get(e,function(e){var t=T(e);n(t.objects,t.options)}):new t.util.request(e,{method:"get",onComplete:i})})}function T(e){var n=e.objects,i=e.options;return n=n.map(function(e){return t[r(e.type)].fromObject(e)}),{objects:n,options:i}}function N(e,n,r){e=e.trim();var i;if(typeof DOMParser!="undefined"){var s=new DOMParser;s&&s.parseFromString&&(i=s.parseFromString(e,"text/xml"))}else t.window.ActiveXObject&&(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(e.replace(//i,"")));t.parseSVGDocument(i.documentElement,function(e,t){n(e,t)},r)}function C(e){var t="";for(var n=0,r=e.length;n',"",""].join("")),t}function k(e){var t=[];return L(t,e,"backgroundColor"),L(t,e,"overlayColor"),t.join("")}function L(e,t,n){t[n]&&t[n].toSVG&&e.push('','')}function A(e){var t=e.getElementsByTagName("linearGradient"),n=e.getElementsByTagName("radialGradient"),r,i,s={};i=t.length;for(;i--;)r=t[i],s[r.getAttribute("id")]=r;i=n.length;for(;i--;)r=n[i],s[r.getAttribute("id")]=r;return s}var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.string.capitalize,i=t.util.object.clone,s=t.util.toFixed,o=t.util.multiplyTransformMatrices,u={"fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight",cx:"left",x:"left",r:"radius","stroke-dasharray":"strokeDashArray","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration",cy:"top",y:"top",transform:"transformMatrix"},a={stroke:"strokeOpacity",fill:"fillOpacity"};t.parseTransformAttribute=function(){function e(e,t){var n=t[0];e[0]=Math.cos(n),e[1]=Math.sin(n),e[2]=-Math.sin(n),e[3]=Math.cos(n)}function n(e,t){var n=t[0],r=t.length===2?t[1]:t[0];e[0]=n,e[3]=r}function r(e,t){e[2]=t[0]}function i(e,t){e[1]=t[0]}function s(e,t){e[4]=t[0],t.length===2&&(e[5]=t[1])}var o=[1,0,0,1,0,0],u="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",a="(?:\\s+,?\\s*|,\\s*)",f="(?:(skewX)\\s*\\(\\s*("+u+")\\s*\\))",l="(?:(skewY)\\s*\\(\\s*("+u+")\\s*\\))",c="(?:(rotate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+")"+a+"("+u+"))?\\s*\\))",h="(?:(scale)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",p="(?:(translate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",d="(?:(matrix)\\s*\\(\\s*("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+"\\s*\\))",v="(?:"+d+"|"+p+"|"+h+"|"+c+"|"+f+"|"+l+")",m="(?:"+v+"(?:"+a+v+")*"+")",g="^\\s*(?:"+m+"?)\\s*$",y=new RegExp(g),b=new RegExp(v,"g");return function(u){var a=o.concat(),f=[];if(!u||u&&!y.test(u))return a;u.replace(b,function(t){var u=(new RegExp(v)).exec(t).filter(function(e){return e!==""&&e!=null}),l=u[1],c=u.slice(2).map(parseFloat);switch(l){case"translate":s(a,c);break;case"rotate":e(a,c);break;case"scale":n(a,c);break;case"skewX":r(a,c);break;case"skewY":i(a,c);break;case"matrix":a=c}f.push(a.concat()),a=o.concat()});var l=f[0];while(f.length>1)f.shift(),l=t.util.multiplyTransformMatrices(l,f[0]);return l}}(),t.parseSVGDocument=function(){function s(e,t){while(e&&(e=e.parentNode))if(t.test(e.nodeName))return!0;return!1}var e=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/,n="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",r=new RegExp("^\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*"+"$");return function(n,o,u){if(!n)return;var a=new Date,f=t.util.toArray(n.getElementsByTagName("*"));if(f.length===0){f=n.selectNodes("//*[name(.)!='svg']");var l=[];for(var c=0,h=f.length;ce.x&&this.y>e.y},gte:function(e){return this.x>=e.x&&this.y>=e.y},lerp:function(e,t){return new n(this.x+(e.x-this.x)*t,this.y+(e.y-this.y)*t)},distanceFrom:function(e){var t=this.x-e.x,n=this.y-e.y;return Math.sqrt(t*t+n*n)},midPointFrom:function(e){return new n(this.x+(e.x-this.x)/2,this.y+(e.y-this.y)/2)},min:function(e){return new n(Math.min(this.x,e.x),Math.min(this.y,e.y))},max:function(e){return new n(Math.max(this.x,e.x),Math.max(this.y,e.y))},toString:function(){return this.x+","+this.y},setXY:function(e,t){this.x=e,this.y=t},setFromPoint:function(e){this.x=e.x,this.y=e.y},swap:function(e){var t=this.x,n=this.y;this.x=e.x,this.y=e.y,e.x=t,e.y=n}}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){this.status=e,this.points=[]}var t=e.fabric||(e.fabric={});if(t.Intersection){t.warn("fabric.Intersection is already defined");return}t.Intersection=n,t.Intersection.prototype={appendPoint:function(e){this.points.push(e)},appendPoints:function(e){this.points=this.points.concat(e)}},t.Intersection.intersectLineLine=function(e,r,i,s){var o,u=(s.x-i.x)*(e.y-i.y)-(s.y-i.y)*(e.x-i.x),a=(r.x-e.x)*(e.y-i.y)-(r.y-e.y)*(e.x-i.x),f=(s.y-i.y)*(r.x-e.x)-(s.x-i.x)*(r.y-e.y);if(f!==0){var l=u/f,c=a/f;0<=l&&l<=1&&0<=c&&c<=1?(o=new n("Intersection"),o.points.push(new t.Point(e.x+l*(r.x-e.x),e.y+l*(r.y-e.y)))):o=new n}else u===0||a===0?o=new n("Coincident"):o=new n("Parallel");return o},t.Intersection.intersectLinePolygon=function(e,t,r){var i=new n,s=r.length;for(var o=0;o0&&(i.status="Intersection"),i},t.Intersection.intersectPolygonPolygon=function(e,t){var r=new n,i=e.length;for(var s=0;s0&&(r.status="Intersection"),r},t.Intersection.intersectPolygonRectangle=function(e,r,i){var s=r.min(i),o=r.max(i),u=new t.Point(o.x,s.y),a=new t.Point(s.x,o.y),f=n.intersectLinePolygon(s,u,e),l=n.intersectLinePolygon(u,o,e),c=n.intersectLinePolygon(o,a,e),h=n.intersectLinePolygon(a,s,e),p=new n;return p.appendPoints(f.points),p.appendPoints(l.points),p.appendPoints(c.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){e?this._tryParsingColor(e):this.setSource([0,0,0,1])}function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var t=e.fabric||(e.fabric={});if(t.Color){t.warn("fabric.Color is already defined.");return}t.Color=n,t.Color.prototype={_tryParsingColor:function(e){var t;e in n.colorNameMap&&(e=n.colorNameMap[e]),t=n.sourceFromHex(e),t||(t=n.sourceFromRgb(e)),t||(t=n.sourceFromHsl(e)),t&&this.setSource(t)},_rgbToHsl:function(e,n,r){e/=255,n/=255,r/=255;var i,s,o,u=t.util.array.max([e,n,r]),a=t.util.array.min([e,n,r]);o=(u+a)/2;if(u===a)i=s=0;else{var f=u-a;s=o>.5?f/(2-u-a):f/(u+a);switch(u){case e:i=(n-r)/f+(n']:this.type==="radial"&&(r=["']);for(var i=0;i');return r.push(this.type==="linear"?"":""),r.join("")},toLive:function(e){var t;if(!this.type)return;this.type==="linear"?t=e.createLinearGradient(this.coords.x1,this.coords.y1,this.coords.x2,this.coords.y2):this.type==="radial"&&(t=e.createRadialGradient(this.coords.x1,this.coords.y1,this.coords.r1,this.coords.x2,this.coords.y2,this.coords.r2));for(var n=0,r=this.colorStops.length;n'+''+""},toLive:function(e){var t=typeof this.source=="function"?this.source():this.source;if(typeof t.src!="undefined"){if(!t.complete)return"";if(t.naturalWidth===0||t.naturalHeight===0)return""}return e.createPattern(t,this.repeat -)}}),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Shadow){t.warn("fabric.Shadow is already defined.");return}t.Shadow=t.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(e){typeof e=="string"&&(e=this._parseShadow(e));for(var n in e)this[n]=e[n];this.id=t.Object.__uid++},_parseShadow:function(e){var n=e.trim(),r=t.Shadow.reOffsetsAndBlur.exec(n)||[],i=n.replace(t.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)";return{color:i.trim(),offsetX:parseInt(r[1],10)||0,offsetY:parseInt(r[2],10)||0,blur:parseInt(r[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(e){var t="SourceAlpha";return e&&(e.fill===this.color||e.stroke===this.color)&&(t="SourceGraphic"),''+''+''+""+""+''+""+""},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY};var e={},n=t.Shadow.prototype;return this.color!==n.color&&(e.color=this.color),this.blur!==n.blur&&(e.blur=this.blur),this.offsetX!==n.offsetX&&(e.offsetX=this.offsetX),this.offsetY!==n.offsetY&&(e.offsetY=this.offsetY),e}}),t.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/}(typeof exports!="undefined"?exports:this),function(){"use strict";if(fabric.StaticCanvas){fabric.warn("fabric.StaticCanvas is already defined.");return}var e=fabric.util.object.extend,t=fabric.util.getElementOffset,n=fabric.util.removeFromArray,r=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass({initialize:function(e,t){t||(t={}),this._initStatic(e,t),fabric.StaticCanvas.activeInstance=this},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!0,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,onBeforeScaleRotate:function(){},_initStatic:function(e,t){this._objects=[],this._createLowerCanvas(e),this._initOptions(t),t.overlayImage&&this.setOverlayImage(t.overlayImage,this.renderAll.bind(this)),t.backgroundImage&&this.setBackgroundImage(t.backgroundImage,this.renderAll.bind(this)),t.backgroundColor&&this.setBackgroundColor(t.backgroundColor,this.renderAll.bind(this)),t.overlayColor&&this.setOverlayColor(t.overlayColor,this.renderAll.bind(this)),this.calcOffset()},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(e,t,n){return this.__setBgOverlayImage("overlayImage",e,t,n)},setBackgroundImage:function(e,t,n){return this.__setBgOverlayImage("backgroundImage",e,t,n)},setOverlayColor:function(e,t){return this.__setBgOverlayColor("overlayColor",e,t)},setBackgroundColor:function(e,t){return this.__setBgOverlayColor("backgroundColor",e,t)},__setBgOverlayImage:function(e,t,n,r){return typeof t=="string"?fabric.util.loadImage(t,function(t){this[e]=new fabric.Image(t,r),n&&n()},this):(this[e]=t,n&&n()),this},__setBgOverlayColor:function(e,t,n){if(t.source){var r=this;fabric.util.loadImage(t.source,function(i){r[e]=new fabric.Pattern({source:i,repeat:t.repeat,offsetX:t.offsetX,offsetY:t.offsetY}),n&&n()})}else this[e]=t,n&&n();return this},_createCanvasElement:function(){var e=fabric.document.createElement("canvas");e.style||(e.style={});if(!e)throw r;return this._initCanvasElement(e),e},_initCanvasElement:function(e){fabric.util.createCanvasElement(e);if(typeof e.getContext=="undefined")throw r},_initOptions:function(e){for(var t in e)this[t]=e[t];this.width=parseInt(this.lowerCanvasEl.width,10)||0,this.height=parseInt(this.lowerCanvasEl.height,10)||0;if(!this.lowerCanvasEl.style)return;this.lowerCanvasEl.style.width=this.width+"px",this.lowerCanvasEl.style.height=this.height+"px"},_createLowerCanvas:function(e){this.lowerCanvasEl=fabric.util.getById(e)||this._createCanvasElement(),this._initCanvasElement(this.lowerCanvasEl),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(e){return this._setDimension("width",e)},setHeight:function(e){return this._setDimension("height",e)},setDimensions:function(e){for(var t in e)this._setDimension(t,e[t]);return this},_setDimension:function(e,t){return this.lowerCanvasEl[e]=t,this.lowerCanvasEl.style[e]=t+"px",this.upperCanvasEl&&(this.upperCanvasEl[e]=t,this.upperCanvasEl.style[e]=t+"px"),this.cacheCanvasEl&&(this.cacheCanvasEl[e]=t),this.wrapperEl&&(this.wrapperEl.style[e]=t+"px"),this[e]=t,this.calcOffset(),this.renderAll(),this},getElement:function(){return this.lowerCanvasEl},getActiveObject:function(){return null},getActiveGroup:function(){return null},_draw:function(e,t){if(!t)return;if(this.controlsAboveOverlay){var n=t.hasBorders,r=t.hasControls;t.hasBorders=t.hasControls=!1,t.render(e),t.hasBorders=n,t.hasControls=r}else t.render(e)},_onObjectAdded:function(e){this.stateful&&e.setupState(),e.setCoords(),e.canvas=this,this.fire("object:added",{target:e}),e.fire("added")},_onObjectRemoved:function(e){this.getActiveObject()===e&&(this.fire("before:selection:cleared",{target:e}),this._discardActiveObject(),this.fire("selection:cleared")),this.fire("object:removed",{target:e}),e.fire("removed")},clearContext:function(e){return e.clearRect(0,0,this.width,this.height),this},getContext:function(){return this.contextContainer},clear:function(){return this._objects.length=0,this.discardActiveGroup&&this.discardActiveGroup(),this.discardActiveObject&&this.discardActiveObject(),this.clearContext(this.contextContainer),this.contextTop&&this.clearContext(this.contextTop),this.fire("canvas:cleared"),this.renderAll(),this},renderAll:function(e){var t=this[e===!0&&this.interactive?"contextTop":"contextContainer"],n=this.getActiveGroup();return this.contextTop&&this.selection&&!this._groupSelector&&this.clearContext(this.contextTop),e||this.clearContext(t),this.fire("before:render"),this.clipTo&&fabric.util.clipContext(this,t),this._renderBackground(t),this._renderObjects(t,n),this._renderActiveGroup(t,n),this.clipTo&&t.restore(),this._renderOverlay(t),this.controlsAboveOverlay&&this.interactive&&this.drawControls(t),this.fire("after:render"),this},_renderObjects:function(e,t){for(var n=0,r=this._objects.length;n"),n.join("")},_setSVGPreamble:function(e,t){t.suppressPreamble||e.push('','\n')},_setSVGHeader:function(e,t){e.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),"")},_setSVGObjects:function(e,t){var n=this.getActiveGroup();n&&this.discardActiveGroup();for(var r=0,i=this.getObjects(),s=i.length;r"):this[t]&&t==="overlayColor"&&e.push('")},sendToBack:function(e){return n(this._objects,e),this._objects.unshift(e),this.renderAll&&this.renderAll()},bringToFront:function(e){return n(this._objects,e),this._objects.push(e),this.renderAll&&this.renderAll()},sendBackwards:function(e,t){var r=this._objects.indexOf(e);if(r!==0){var i=this._findNewLowerIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewLowerIndex:function(e,t,n){var r;if(n){r=t;for(var i=t-1;i>=0;--i){var s=e.intersectsWithObject(this._objects[i])||e.isContainedWithinObject(this._objects[i])||this._objects[i].isContainedWithinObject(e);if(s){r=i;break}}}else r=t-1;return r},bringForward:function(e,t){var r=this._objects.indexOf(e);if(r!==this._objects.length-1){var i=this._findNewUpperIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewUpperIndex:function(e,t,n){var r;if(n){r=t;for(var i=t+1;i"}}),e(fabric.StaticCanvas.prototype,fabric.Observable),e(fabric.StaticCanvas.prototype,fabric.Collection),e(fabric.StaticCanvas.prototype,fabric.DataURLExporter),e(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(e){var t=fabric.util.createCanvasElement();if(!t||!t.getContext)return null;var n=t.getContext("2d");if(!n)return null;switch(e){case"getImageData":return typeof n.getImageData!="undefined";case"setLineDash":return typeof n.setLineDash!="undefined";case"toDataURL":return typeof t.toDataURL!="undefined";case"toDataURLWithQuality":try{return t.toDataURL("image/jpeg",0),!0}catch(r){}return!1;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",setShadow:function(e){return this.shadow=new fabric.Shadow(e),this},_setBrushStyles:function(){var e=this.canvas.contextTop;e.strokeStyle=this.color,e.lineWidth=this.width,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin},_setShadow:function(){if(!this.shadow)return;var e=this.canvas.contextTop;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_resetShadow:function(){var e=this.canvas.contextTop;e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0}}),function(){var e=fabric.util.array.min,t=fabric.util.array.max;fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(e){this.canvas=e,this._points=[]},onMouseDown:function(e){this._prepareForDrawing(e),this._captureDrawingPath(e),this._render()},onMouseMove:function(e){this._captureDrawingPath(e),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(e){var t=new fabric.Point(e.x,e.y);this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)},_addPoint:function(e){this._points.push(e)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(e){var t=new fabric.Point(e.x,e.y);this._addPoint(t)},_render:function(){var e=this.canvas.contextTop;e.beginPath();var t=this._points[0],n=this._points[1];this._points.length===2&&t.x===n.x&&t.y===n.y&&(t.x-=.5,n.x+=.5),e.moveTo(t.x,t.y);for(var r=1,i=this._points.length;rn.padding?e.x<0?e.x+=n.padding:e.x-=n.padding:e.x=0,i(e.y)>n.padding?e.y<0?e.y+=n.padding:e.y-=n.padding:e.y=0},_rotateObject:function(e,t){var i=this._currentTransform,s=this._offset;if(i.target.get("lockRotation"))return;var o=r(i.ey-i.top-s.top,i.ex-i.left-s.left),u=r(t-i.top-s.top,e-i.left-s.left),a=n(u-o+i.theta);a<0&&(a=360+a),i.target.angle=a},_setCursor:function(e){this.upperCanvasEl.style.cursor=e},_resetObjectTransform:function(e){e.scaleX=1,e.scaleY=1,e.setAngle(0)},_drawSelection:function(){var e=this.contextTop,t=this._groupSelector,n=t.left,r=t.top,o=i(n),u=i(r);e.fillStyle=this.selectionColor,e.fillRect(t.ex-(n>0?0:-n),t.ey-(r>0?0:-r),o,u),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var a=t.ex+s-(n>0?0:o),f=t.ey+s-(r>0?0:u);e.beginPath(),fabric.util.drawDashedLine(e,a,f,a+o,f,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f+u-1,a+o,f+u-1,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f,a,f+u,this.selectionDashArray),fabric.util.drawDashedLine(e,a+o-1,f,a+o-1,f+u,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+s-(n>0?0:o),t.ey+s-(r>0?0:u),o,u)},_isLastRenderedObject:function(e){return this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay.visible&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(e,this._offset)},findTarget:function(e,t){if(this.skipTargetFind)return;if(this._isLastRenderedObject(e))return this.lastRenderedObjectWithControlsAboveOverlay;var n=this.getActiveGroup();return n&&!t&&this.containsPoint(e,n)?n:this._searchPossibleTargets(e)},_searchPossibleTargets:function(e){var t=[],n,r=this.getPointer(e);for(var i=this._objects.length;i--;)if(this._objects[i]&&this._objects[i].visible&&this._objects[i].evented&&this.containsPoint(e,this._objects[i])){if(!this.perPixelTargetFind&&!this._objects[i].perPixelTargetFind){n=this._objects[i],this.relatedTarget=n;break}t[t.length]=this._objects[i]}for(var s=0,o=t.length;s1&&(t=new fabric.Group(t.reverse(),{originX:"center",originY:"center"}),this.setActiveGroup(t,e),t.saveCoords(),this.fire("selection:created",{target:t}),this.renderAll())},_collectObjects:function(){var n=[],r,i=this._groupSelector.ex,s=this._groupSelector.ey,o=i+this._groupSelector.left,u=s+this._groupSelector.top,a=new fabric.Point(e(i,o),e(s,u)),f=new fabric.Point(t(i,o),t(s,u)),l=i===o&&s===u;for(var c=this._objects.length;c--;){r=this._objects[c];if(!r||!r.selectable||!r.visible)continue;if(r.intersectsWithRect(a,f)||r.isContainedWithinRect(a,f)||r.containsPoint(a)||r.containsPoint(f)){r.set("active",!0),n.push(r);if(l)break}}return n},_maybeGroupObjects:function(e){this.selection&&this._groupSelector&&this._groupSelectedObjects(e);var t=this.getActiveGroup();t&&(t.setObjectsCoords().setCoords(),t.isMoving=!1,this._setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(e){e||(e={});var t=e.format||"png",n=e.quality||1,r=e.multiplier||1,i={left:e.left,top:e.top,width:e.width,height:e.height};return r!==1?this.__toDataURLWithMultiplier(t,n,i,r):this.__toDataURL(t,n,i)},__toDataURL:function(e,t,n){this.renderAll(!0);var r=this.upperCanvasEl||this.lowerCanvasEl,i=this.__getCroppedCanvas(r,n);e==="jpg"&&(e="jpeg");var s=fabric.StaticCanvas.supports("toDataURLWithQuality")?(i||r).toDataURL("image/"+e,t):(i||r).toDataURL("image/"+e);return this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),i&&(i=null),s},__getCroppedCanvas:function(e,t){var n,r,i="left"in t||"top"in t||"width"in t||"height"in t;return i&&(n=fabric.util.createCanvasElement(),r=n.getContext("2d"),n.width=t.width||this.width,n.height=t.height||this.height,r.drawImage(e,-t.left||0,-t.top||0)),n},__toDataURLWithMultiplier:function(e,t,n,r){var i=this.getWidth(),s=this.getHeight(),o=i*r,u=s*r,a=this.getActiveObject(),f=this.getActiveGroup(),l=this.contextTop||this.contextContainer;this.setWidth(o).setHeight(u),l.scale(r,r),n.left&&(n.left*=r),n.top&&(n.top*=r),n.width&&(n.width*=r),n.height&&(n.height*=r),f?this._tempRemoveBordersControlsFromGroup(f):a&&this.deactivateAll&&this.deactivateAll(),this.renderAll(!0);var c=this.__toDataURL(e,t,n);return this.width=i,this.height=s,l.scale(1/r,1/r),this.setWidth(i).setHeight(s),f?this._restoreBordersControlsOnGroup(f):a&&this.setActiveObject&&this.setActiveObject(a),this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),c},toDataURLWithMultiplier:function(e,t,n){return this.toDataURL({format:e,multiplier:t,quality:n})},_tempRemoveBordersControlsFromGroup:function(e){e.origHasControls=e.hasControls,e.origBorderColor=e.borderColor,e.hasControls=!0,e.borderColor="rgba(0,0,0,0)",e.forEachObject(function(e){e.origBorderColor=e.borderColor,e.borderColor="rgba(0,0,0,0)"})},_restoreBordersControlsOnGroup:function(e){e.hideControls=e.origHideControls,e.borderColor=e.origBorderColor,e.forEachObject(function(e){e.borderColor=e.origBorderColor,delete e.origBorderColor})}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(e,t,n){return this.loadFromJSON(e,t,n)},loadFromJSON:function(e,t,n){if(!e)return;var r=typeof e=="string"?JSON.parse(e):e;this.clear();var i=this;return this._enlivenObjects(r.objects,function(){i._setBgOverlay(r,t)},n),this},_setBgOverlay:function(e,t){var n=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!e.backgroundImage&&!e.overlayImage&&!e.background&&!e.overlay){t&&t();return}var i=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(n.renderAll(),t&&t())};this.__setBgOverlay("backgroundImage",e.backgroundImage,r,i),this.__setBgOverlay("overlayImage",e.overlayImage,r,i),this.__setBgOverlay("backgroundColor",e.background,r,i),this.__setBgOverlay("overlayColor",e.overlay,r,i),i()},__setBgOverlay:function(e,t,n,r){var i=this;if(!t){n[e]=!0;return}e==="backgroundImage"||e==="overlayImage"?fabric.Image.fromObject(t,function(t){i[e]=t,n[e]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(e,!0)](t,function(){n[e]=!0,r&&r()})},_enlivenObjects:function(e,t,n){var r=this;e.length===0&&t&&t();var i=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(e,function(e){e.forEach(function(e,t){r.insertAt(e,t,!0)}),r.renderOnAddRemove=i,t&&t()},null,n)},_toDataURL:function(e,t){this.clone(function(n){t(n.toDataURL(e))})},_toDataURLWithMultiplier:function(e,t,n){this.clone(function(r){n(r.toDataURLWithMultiplier(e,t))})},clone:function(e,t){var n=JSON.stringify(this.toJSON(t));this.cloneWithoutData(function(t){t.loadFromJSON(n,function(){e&&e(t)})})},cloneWithoutData:function(e){var t=fabric.document.createElement("canvas");t.width=this.getWidth(),t.height=this.getHeight();var n=new fabric.Canvas(t);n.clipTo=this.clipTo,this.backgroundImage?(n.setBackgroundImage(this.backgroundImage.src,function(){n.renderAll(),e&&e(n)}),n.backgroundImageOpacity=this.backgroundImageOpacity,n.backgroundImageStretch=this.backgroundImageStretch):e&&e(n)}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.toFixed,i=t.util.string.capitalize,s=t.util.degreesToRadians,o=t.StaticCanvas.supports("setLineDash");if(t.Object)return;t.Object=t.util.createClass({type:"object",originX:"left",originY:"top",top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,opacity:1,angle:0,cornerSize:12,transparentCorners:!0,hoverCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"source-over",backgroundColor:"",stroke:null,strokeWidth:1,strokeDashArray:null,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:10,shadow:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,transformMatrix:null,minScaleLimit:.01,selectable:!0,evented:!0,visible:!0,hasControls:!0,hasBorders:!0,hasRotatingPoint:!0,rotatingPointOffset:40,perPixelTargetFind:!1,includeDefaultValues:!0,clipTo:null,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockUniScaling:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule shadow clipTo visible backgroundColor".split(" "),initialize:function(e){e&&this.setOptions(e)},_initGradient:function(e){e.fill&&e.fill.colorStops&&!(e.fill instanceof t.Gradient)&&this.set("fill",new t.Gradient(e.fill))},_initPattern:function(e){e.fill&&e.fill.source&&!(e.fill instanceof t.Pattern)&&this.set("fill",new t.Pattern(e.fill)),e.stroke&&e.stroke.source&&!(e.stroke instanceof t.Pattern)&&this.set("stroke",new t.Pattern(e.stroke))},_initClipping:function(e){if(!e.clipTo||typeof e.clipTo!="string")return;var n=t.util.getFunctionBody(e.clipTo);typeof n!="undefined"&&(this.clipTo=new Function("ctx",n))},setOptions:function(e){for(var t in e)this.set(t,e[t]);this._initGradient(e),this._initPattern(e),this._initClipping(e)},transform:function(e,t){e.globalAlpha=this.opacity;var n=t?this._getLeftTopCoords():this.getCenterPoint();e.translate(n.x,n.y),e.rotate(s(this.angle)),e.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(e){var n=t.Object.NUM_FRACTION_DIGITS,i={type:this.type,originX:this.originX,originY:this.originY,left:r(this.left,n),top:r(this.top,n),width:r(this.width,n),height:r(this.height,n),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:r(this.strokeWidth,n),strokeDashArray:this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:r(this.strokeMiterLimit,n),scaleX:r(this.scaleX,n),scaleY:r(this.scaleY,n),angle:r(this.getAngle(),n),flipX:this.flipX,flipY:this.flipY,opacity:r(this.opacity,n),shadow:this.shadow&&this.shadow.toObject?this.shadow.toObject():this.shadow,visible:this.visible,clipTo:this.clipTo&&String(this.clipTo),backgroundColor:this.backgroundColor};return this.includeDefaultValues||(i=this._removeDefaultValues(i)),t.util.populateWithProperties(this,i,e),i},toDatalessObject:function(e){return this.toObject(e)},_removeDefaultValues:function(e){var n=t.util.getKlass(e.type).prototype,r=n.stateProperties;return r.forEach(function(t){e[t]===n[t]&&delete e[t]}),e},toString:function(){return"#"},get:function(e){return this[e]},set:function(e,t){if(typeof e=="object")for(var n in e)this._set(n,e[n]);else typeof t=="function"&&e!=="clipTo"?this._set(e,t(this.get(e))):this._set(e,t);return this},_set:function(e,n){var i=e==="scaleX"||e==="scaleY";return i&&(n=this._constrainScale(n)),e==="scaleX"&&n<0?(this.flipX=!this.flipX,n*=-1):e==="scaleY"&&n<0?(this.flipY=!this.flipY,n*=-1):e==="width"||e==="height"?this.minScaleLimit=r(Math.min(.1,1/Math.max(this.width,this.height)),2):e==="shadow"&&n&&!(n instanceof t.Shadow)&&(n=new t.Shadow(n)),this[e]=n,this},toggle:function(e){var t=this.get(e);return typeof t=="boolean"&&this.set(e,!t),this},setSourcePath:function(e){return this.sourcePath=e,this},render:function(e,n){if(this.width===0||this.height===0||!this.visible)return;e.save(),this._transform(e,n),this._setStrokeStyles(e),this._setFillStyles(e);var r=this.transformMatrix;r&&this.group&&(e.translate(-this.group.width/2,-this.group.height/2),e.transform(r[0],r[1],r[2],r[3],r[4],r[5])),this._setShadow(e),this.clipTo&&t.util.clipContext(this,e),this._render(e,n),this.clipTo&&e.restore(),this._removeShadow(e),this.active&&!n&&(this.drawBorders(e),this.drawControls(e)),e.restore()},_transform:function(e,t){var n=this.transformMatrix;n&&!this.group&&e.setTransform(n[0],n[1],n[2],n[3],n[4],n[5]),t||this.transform(e)},_setStrokeStyles:function(e){this.stroke&&(e.lineWidth=this.strokeWidth,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin,e.miterLimit=this.strokeMiterLimit,e.strokeStyle=this.stroke.toLive?this.stroke.toLive(e):this.stroke)},_setFillStyles:function(e){this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e):this.fill)},_setShadow:function(e){if(!this.shadow)return;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_removeShadow:function(e){e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0},_renderFill:function(e){if(!this.fill)return;this.fill.toLive&&(e.save(),e.translate(-this.width/2+this.fill.offsetX||0,-this.height/2+this.fill.offsetY||0)),e.fill(),this.fill.toLive&&e.restore(),this.shadow&&!this.shadow.affectStroke&&this._removeShadow(e)},_renderStroke:function(e){if(!this.stroke)return;e.save(),this.strokeDashArray?(1&this.strokeDashArray.length&&this.strokeDashArray.push.apply(this.strokeDashArray,this.strokeDashArray),o?(e.setLineDash(this.strokeDashArray),this._stroke&&this._stroke(e)):this._renderDashedStroke&&this._renderDashedStroke(e),e.stroke()):this._stroke?this._stroke(e):e.stroke(),this._removeShadow(e),e.restore()},clone:function(e,n){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(n),e):new t.Object(this.toObject(n))},cloneAsImage:function(e){var n=this.toDataURL();return t.util.loadImage(n,function(n){e&&e(new t.Image(n))}),this},toDataURL:function(e){e||(e={});var n=t.util.createCanvasElement(),r=this.getBoundingRect();n.width=r.width,n.height=r.height,t.util.wrapElement(n,"div");var i=new t.Canvas(n);e.format==="jpg"&&(e.format="jpeg"),e.format==="jpeg"&&(i.backgroundColor="#fff");var s={active:this.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new t.Point(n.width/2,n.height/2),"center","center");var o=this.canvas;i.add(this);var u=i.toDataURL(e);return this.set(s).setCoords(),this.canvas=o,i.dispose(),i=null,u},isType:function(e){return this.type===e},complexity:function(){return 0},toJSON:function(e){return this.toObject(e)},setGradient:function(e,n){n||(n={});var r={colorStops:[]};r.type=n.type||(n.r1||n.r2?"radial":"linear"),r.coords={x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2};if(n.r1||n.r2)r.coords.r1=n.r1,r.coords.r2=n.r2;for(var i in n.colorStops){var s=new t.Color(n.colorStops[i]);r.colorStops.push({offset:i,color:s.toRgb(),opacity:s.getAlpha()})}return this.set(e,t.Gradient.forObject(this,r))},setPatternFill:function(e){return this.set("fill",new t.Pattern(e))},setShadow:function(e){return this.set("shadow",new t.Shadow(e))},setColor:function(e){return this.set("fill",e),this},centerH:function(){return this.canvas.centerObjectH(this),this},centerV:function(){return this.canvas.centerObjectV(this),this},center:function(){return this.canvas.centerObject(this),this},remove:function(){return this.canvas.remove(this)},getLocalPointer:function(e,t){t=t||this.canvas.getPointer(e);var n=this.translateToOriginPoint(this.getCenterPoint(),"left","top");return{x:t.x-n.x,y:t.y-n.y}}}),t.util.createAccessors(t.Object),t.Object.prototype.rotate=t.Object.prototype.setAngle,n(t.Object.prototype,t.Observable),t.Object.NUM_FRACTION_DIGITS=2,t.Object.__uid=0}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{translateToCenterPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x+(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x-(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y+(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y-(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},translateToOriginPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x-(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x+(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y-(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y+(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},getCenterPoint:function(){var e=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(e,this.originX,this.originY)},getPointByOrigin:function(e,t){var n=this.getCenterPoint();return this.translateToOriginPoint(n,e,t)},toLocalPoint:function(t,n,r){var i=this.getCenterPoint(),s=this.stroke?this.strokeWidth:0,o,u;return n&&r?(n==="left"?o=i.x-(this.getWidth()+s*this.scaleX)/2:n==="right"?o=i.x+(this.getWidth()+s*this.scaleX)/2:o=i.x,r==="top"?u=i.y-(this.getHeight()+s*this.scaleY)/2:r==="bottom"?u=i.y+(this.getHeight()+s*this.scaleY)/2:u=i.y):(o=this.left,u=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(o,u))},setPositionByOrigin:function(e,t,n){var r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",i.x),this.set("top",i.y)},adjustPosition:function(t){var n=e(this.angle),r=this.getWidth()/2,i=Math.cos(n)*r,s=Math.sin(n)*r,o=this.getWidth(),u=Math.cos(n)*o,a=Math.sin(n)*o;this.originX==="center"&&t==="left"||this.originX==="right"&&t==="center"?(this.left-=i,this.top-=s):this.originX==="left"&&t==="center"||this.originX==="center"&&t==="right"?(this.left+=i,this.top+=s):this.originX==="left"&&t==="right"?(this.left+=u,this.top+=a):this.originX==="right"&&t==="left"&&(this.left-=u,this.top-=a),this.setCoords(),this.originX=t},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","center")}})}(),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,intersectsWithRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y),o=new fabric.Point(n.br.x,n.br.y),u=fabric.Intersection.intersectPolygonRectangle([r,i,o,s],e,t);return u.status==="Intersection"},intersectsWithObject:function(e){function t(e){return{tl:new fabric.Point(e.tl.x,e.tl.y),tr:new fabric.Point(e.tr.x,e.tr.y),bl:new fabric.Point(e.bl.x,e.bl.y),br:new fabric.Point(e.br.x,e.br.y)}}var n=t(this.oCoords),r=t(e.oCoords),i=fabric.Intersection.intersectPolygonPolygon([n.tl,n.tr,n.br,n.bl],[r.tl,r.tr,r.br,r.bl]);return i.status==="Intersection"},isContainedWithinObject:function(e){var t=e.getBoundingRect(),n=new fabric.Point(t.left,t.top),r=new fabric.Point(t.left+t.width,t.top+t.height);return this.isContainedWithinRect(n,r)},isContainedWithinRect:function(e,t){var n=this.getBoundingRect();return n.left>e.x&&n.left+n.widthe.y&&n.top+n.height=e.y&&f.d.y>=e.y)continue;f.o.x===f.d.x&&f.o.x>=e.x?(o=f.o.x,u=e.y):(n=0,r=(f.d.y-f.o.y)/(f.d.x-f.o.x),i=e.y-n*e.x,s=f.o.y-r*f.o.x,o=-(i-s)/(n-r),u=i+n*o),o>=e.x&&(a+=1);if(a===2)break}return a},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(){this.oCoords||this.setCoords();var e=[this.oCoords.tl.x,this.oCoords.tr.x,this.oCoords.br.x,this.oCoords.bl.x],t=fabric.util.array.min(e),n=fabric.util.array.max(e),r=Math.abs(t-n),i=[this.oCoords.tl.y,this.oCoords.tr.y,this.oCoords.br.y,this.oCoords.bl.y],s=fabric.util.array.min(i),o=fabric.util.array.max(i),u=Math.abs(s-o);return{left:t,top:s,width:r,height:u}},getWidth:function(){return this.width*this.scaleX},getHeight:function(){return this.height*this.scaleY},_constrainScale:function(e){return Math.abs(e)1?this.strokeWidth:0,n=this.padding,r=e(this.angle);this.currentWidth=(this.width+t)*this.scaleX+n*2,this.currentHeight=(this.height+t)*this.scaleY+n*2,this.currentWidth<0&&(this.currentWidth=Math.abs(this.currentWidth));var i=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2)),s=Math.atan(isFinite(this.currentHeight/this.currentWidth)?this.currentHeight/this.currentWidth:0),o=Math.cos(s+r)*i,u=Math.sin(s+r)*i,a=Math.sin(r),f=Math.cos(r),l=this.getCenterPoint(),c={x:l.x-o,y:l.y-u},h={x:c.x+this.currentWidth*f,y:c.y+this.currentWidth*a},p={x:h.x-this.currentHeight*a,y:h.y+this.currentHeight*f},d={x:c.x-this.currentHeight*a,y:c.y+this.currentHeight*f},v={x:c.x-this.currentHeight/2*a,y:c.y+this.currentHeight/2*f},m={x:c.x+this.currentWidth/2*f,y:c.y+this.currentWidth/2*a},g={x:h.x-this.currentHeight/2*a,y:h.y+this.currentHeight/2*f},y={x:d.x+this.currentWidth/2*f,y:d.y+this.currentWidth/2*a},b={x:m.x,y:m.y};return this.oCoords={tl:c,tr:h,br:p,bl:d,ml:v,mt:m,mr:g,mb:y,mtr:b},this._setCornerCoords&&this._setCornerCoords(),this}})}(),fabric.util.object.extend(fabric.Object.prototype,{sendToBack:function(){return this.group?fabric.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?fabric.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(e){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,e):this.canvas.sendBackwards(this,e),this},bringForward:function(e){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,e):this.canvas.bringForward(this,e),this},moveTo:function(e){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,e):this.canvas.moveTo(this,e),this}}),fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(){var e=this.fill?this.fill.toLive?"url(#SVGID_"+this.fill.id+")":this.fill:"none",t=this.stroke?this.stroke.toLive?"url(#SVGID_"+this.stroke.id+")":this.stroke:"none",n=this.strokeWidth?this.strokeWidth:"0",r=this.strokeDashArray?this.strokeDashArray.join(" "):"",i=this.strokeLineCap?this.strokeLineCap:"butt",s=this.strokeLineJoin?this.strokeLineJoin:"miter",o=this.strokeMiterLimit?this.strokeMiterLimit:"4",u=typeof this.opacity!="undefined"?this.opacity:"1",a=this.visible?"":" visibility: hidden;",f=this.shadow&&this.type!=="text"?"filter: url(#SVGID_"+this.shadow.id+");":"";return["stroke: ",t,"; ","stroke-width: ",n,"; ","stroke-dasharray: ",r,"; ","stroke-linecap: ",i,"; ","stroke-linejoin: ",s,"; ","stroke-miterlimit: ",o,"; ","fill: ",e,"; ","opacity: ",u,";",f,a].join("")},getSvgTransform:function(){var e=fabric.util.toFixed,t=this.getAngle(),n=this.getCenterPoint(),r=fabric.Object.NUM_FRACTION_DIGITS,i="translate("+e(n.x,r)+" "+e(n.y,r)+")",s=t!==0?" rotate("+e(t,r)+")":"",o=this.scaleX===1&&this.scaleY===1?"":" scale("+e(this.scaleX,r)+" "+e(this.scaleY,r)+")",u=this.flipX?"matrix(-1 0 0 1 0 0) ":"",a=this.flipY?"matrix(1 0 0 -1 0 0)":"";return[i,s,o,u,a].join("")},_createBaseSVGMarkup:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),this.shadow&&e.push(this.shadow.toSVG(this)),e}}),fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(){return this.stateProperties.some(function(e){return this.get(e)!==this.originalState[e]},this)},saveState:function(e){return this.stateProperties.forEach(function(e){this.originalState -[e]=this.get(e)},this),e&&e.stateProperties&&e.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),this},setupState:function(){return this.originalState={},this.saveState(),this}}),function(){var e=fabric.util.getPointer,t=fabric.util.degreesToRadians,n=typeof G_vmlCanvasManager!="undefined";fabric.util.object.extend(fabric.Object.prototype,{_controlsVisibility:null,_findTargetCorner:function(t,n){if(!this.hasControls||!this.active)return!1;var r=e(t,this.canvas.upperCanvasEl),i=r.x-n.left,s=r.y-n.top,o,u;for(var a in this.oCoords){if(!this.isControlVisible(a))continue;if(a==="mtr"&&!this.hasRotatingPoint)continue;if(!(!this.get("lockUniScaling")||a!=="mt"&&a!=="mr"&&a!=="mb"&&a!=="ml"))continue;u=this._getImageLines(this.oCoords[a].corner),o=this._findCrossPoints({x:i,y:s},u);if(o!==0&&o%2===1)return this.__corner=a,a}return!1},_setCornerCoords:function(){var e=this.oCoords,n=t(this.angle),r=t(45-this.angle),i=Math.sqrt(2*Math.pow(this.cornerSize,2))/2,s=i*Math.cos(r),o=i*Math.sin(r),u=Math.sin(n),a=Math.cos(n);e.tl.corner={tl:{x:e.tl.x-o,y:e.tl.y-s},tr:{x:e.tl.x+s,y:e.tl.y-o},bl:{x:e.tl.x-s,y:e.tl.y+o},br:{x:e.tl.x+o,y:e.tl.y+s}},e.tr.corner={tl:{x:e.tr.x-o,y:e.tr.y-s},tr:{x:e.tr.x+s,y:e.tr.y-o},br:{x:e.tr.x+o,y:e.tr.y+s},bl:{x:e.tr.x-s,y:e.tr.y+o}},e.bl.corner={tl:{x:e.bl.x-o,y:e.bl.y-s},bl:{x:e.bl.x-s,y:e.bl.y+o},br:{x:e.bl.x+o,y:e.bl.y+s},tr:{x:e.bl.x+s,y:e.bl.y-o}},e.br.corner={tr:{x:e.br.x+s,y:e.br.y-o},bl:{x:e.br.x-s,y:e.br.y+o},br:{x:e.br.x+o,y:e.br.y+s},tl:{x:e.br.x-o,y:e.br.y-s}},e.ml.corner={tl:{x:e.ml.x-o,y:e.ml.y-s},tr:{x:e.ml.x+s,y:e.ml.y-o},bl:{x:e.ml.x-s,y:e.ml.y+o},br:{x:e.ml.x+o,y:e.ml.y+s}},e.mt.corner={tl:{x:e.mt.x-o,y:e.mt.y-s},tr:{x:e.mt.x+s,y:e.mt.y-o},bl:{x:e.mt.x-s,y:e.mt.y+o},br:{x:e.mt.x+o,y:e.mt.y+s}},e.mr.corner={tl:{x:e.mr.x-o,y:e.mr.y-s},tr:{x:e.mr.x+s,y:e.mr.y-o},bl:{x:e.mr.x-s,y:e.mr.y+o},br:{x:e.mr.x+o,y:e.mr.y+s}},e.mb.corner={tl:{x:e.mb.x-o,y:e.mb.y-s},tr:{x:e.mb.x+s,y:e.mb.y-o},bl:{x:e.mb.x-s,y:e.mb.y+o},br:{x:e.mb.x+o,y:e.mb.y+s}},e.mtr.corner={tl:{x:e.mtr.x-o+u*this.rotatingPointOffset,y:e.mtr.y-s-a*this.rotatingPointOffset},tr:{x:e.mtr.x+s+u*this.rotatingPointOffset,y:e.mtr.y-o-a*this.rotatingPointOffset},bl:{x:e.mtr.x-s+u*this.rotatingPointOffset,y:e.mtr.y+o-a*this.rotatingPointOffset},br:{x:e.mtr.x+o+u*this.rotatingPointOffset,y:e.mtr.y+s-a*this.rotatingPointOffset}}},drawBorders:function(e){if(!this.hasBorders)return this;var t=this.padding,n=t*2,r=~~(this.strokeWidth/2)*2;e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=this.borderColor;var i=1/this._constrainScale(this.scaleX),s=1/this._constrainScale(this.scaleY);e.lineWidth=1/this.borderScaleFactor,e.scale(i,s);var o=this.getWidth(),u=this.getHeight();e.strokeRect(~~(-(o/2)-t-r/2*this.scaleX)-.5,~~(-(u/2)-t-r/2*this.scaleY)-.5,~~(o+n+r*this.scaleX)+1,~~(u+n+r*this.scaleY)+1);if(this.hasRotatingPoint&&this.isControlVisible("mtr")&&!this.get("lockRotation")&&this.hasControls){var a=(this.flipY?u+r*this.scaleY+t*2:-u-r*this.scaleY-t*2)/2;e.beginPath(),e.moveTo(0,a),e.lineTo(0,a+(this.flipY?this.rotatingPointOffset:-this.rotatingPointOffset)),e.closePath(),e.stroke()}return e.restore(),this},drawControls:function(e){if(!this.hasControls)return this;var t=this.cornerSize,n=t/2,r=~~(this.strokeWidth/2),i=-(this.width/2),s=-(this.height/2),o=this.padding/this.scaleX,u=this.padding/this.scaleY,a=n/this.scaleY,f=n/this.scaleX,l=(n-t)/this.scaleX,c=(n-t)/this.scaleY,h=this.height,p=this.width,d=this.transparentCorners?"strokeRect":"fillRect";return e.save(),e.lineWidth=1/Math.max(this.scaleX,this.scaleY),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=e.fillStyle=this.cornerColor,this._drawControl("tl",e,d,i-f-r-o,s-a-r-u),this._drawControl("tr",e,d,i+p-f+r+o,s-a-r-u),this._drawControl("tr",e,d,i-f-r-o,s+h+c+r+u),this._drawControl("br",e,d,i+p+l+r+o,s+h+c+r+u),this.get("lockUniScaling")||(this._drawControl("mt",e,d,i+p/2-f,s-a-r-u),this._drawControl("mb",e,d,i+p/2-f,s+h+c+r+u),this._drawControl("mb",e,d,i+p+l+r+o,s+h/2-a),this._drawControl("ml",e,d,i-f-r-o,s+h/2-a)),this.hasRotatingPoint&&this._drawControl("mtr",e,d,i+p/2-f,this.flipY?s+h+this.rotatingPointOffset/this.scaleY-this.cornerSize/this.scaleX/2+r+u:s-this.rotatingPointOffset/this.scaleY-this.cornerSize/this.scaleY/2-r-u),e.restore(),this},_drawControl:function(e,t,r,i,s){var o=this.cornerSize/this.scaleX,u=this.cornerSize/this.scaleY;this.isControlVisible(e)&&(n||this.transparentCorners||t.clearRect(i,s,o,u),t[r](i,s,o,u))},isControlVisible:function(e){return this._getControlsVisibility()[e]},setControlVisible:function(e,t){return this._getControlsVisibility()[e]=t,this},setControlsVisibility:function(e){e||(e={});for(var t in e)this.setControlVisible(t,e[t]);return this},_getControlsVisibility:function(){return this._controlsVisibility||(this._controlsVisibility={tl:!0,tr:!0,br:!0,bl:!0,ml:!0,mt:!0,mr:!0,mb:!0,mtr:!0}),this._controlsVisibility}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{FX_DURATION:500,fxCenterObjectH:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("left"),endValue:this.getCenter().left,duration:this.FX_DURATION,onChange:function(t){e.set("left",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxCenterObjectV:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("top"),endValue:this.getCenter().top,duration:this.FX_DURATION,onChange:function(t){e.set("top",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxRemove:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("opacity"),endValue:0,duration:this.FX_DURATION,onStart:function(){e.set("active",!1)},onChange:function(t){e.set("opacity",t),s.renderAll(),i()},onComplete:function(){s.remove(e),r()}}),this}}),fabric.util.object.extend(fabric.Object.prototype,{animate:function(){if(arguments[0]&&typeof arguments[0]=="object"){var e=[],t,n;for(t in arguments[0])e.push(t);for(var r=0,i=e.length;r'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Line.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),t.Line.fromElement=function(e,r){var i=t.parseAttributes(e,t.Line.ATTRIBUTE_NAMES),s=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new t.Line(s,n(i,r))},t.Line.fromObject=function(e){var n=[e.x1,e.y1,e.x2,e.y2];return new t.Line(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return"radius"in e&&e.radius>0}var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Circle){t.warn("fabric.Circle is already defined.");return}t.Circle=t.util.createClass(t.Object,{type:"circle",initialize:function(e){e=e||{},this.set("radius",e.radius||0),this.callSuper("initialize",e)},_set:function(e,t){return this.callSuper("_set",e,t),e==="radius"&&this.setRadius(t),this},toObject:function(e){return r(this.callSuper("toObject",e),{radius:this.get("radius")})},toSVG:function(e){var t=this._createBaseSVGMarkup();return t.push("'),e?e(t.join("")):t.join("")},_render:function(e,t){e.beginPath(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,e.arc(t?this.left:0,t?this.top:0,this.radius,0,n,!1),e.closePath(),this._renderFill(e),this._renderStroke(e)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(e){this.radius=e,this.set("width",e*2).set("height",e*2)},complexity:function(){return 1}}),t.Circle.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),t.Circle.fromElement=function(e,n){n||(n={});var s=t.parseAttributes(e,t.Circle.ATTRIBUTE_NAMES);if(!i(s))throw new Error("value of `r` attribute is required and can not be negative");"left"in s&&(s.left-=n.width/2||0),"top"in s&&(s.top-=n.height/2||0);var o=new t.Circle(r(s,n));return o.cx=parseFloat(e.getAttribute("cx"))||0,o.cy=parseFloat(e.getAttribute("cy"))||0,o},t.Circle.fromObject=function(e){return new t.Circle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Triangle){t.warn("fabric.Triangle is already defined");return}t.Triangle=t.util.createClass(t.Object,{type:"triangle",initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("width",e.width||100).set("height",e.height||100)},_render:function(e){var t=this.width/2,n=this.height/2;e.beginPath(),e.moveTo(-t,n),e.lineTo(0,-n),e.lineTo(t,n),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=this.width/2,r=this.height/2;e.beginPath(),t.util.drawDashedLine(e,-n,r,0,-r,this.strokeDashArray),t.util.drawDashedLine(e,0,-r,n,r,this.strokeDashArray),t.util.drawDashedLine(e,n,r,-n,r,this.strokeDashArray),e.closePath()},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=this.width/2,r=this.height/2,i=[-n+" "+r,"0 "+ -r,n+" "+r].join(",");return t.push("'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Triangle.fromObject=function(e){return new t.Triangle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Ellipse){t.warn("fabric.Ellipse is already defined.");return}t.Ellipse=t.util.createClass(t.Object,{type:"ellipse",rx:0,ry:0,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("rx",e.rx||0),this.set("ry",e.ry||0),this.set("width",this.get("rx")*2),this.set("height",this.get("ry")*2)},toObject:function(e){return r(this.callSuper("toObject",e),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(e){var t=this._createBaseSVGMarkup();return t.push("'),e?e(t.join("")):t.join("")},render:function(e,t){if(this.rx===0||this.ry===0)return;return this.callSuper("render",e,t)},_render:function(e,t){e.beginPath(),e.save(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&this.group&&e.translate(this.cx,this.cy),e.transform(1,0,0,this.ry/this.rx,0,0),e.arc(t?this.left:0,t?this.top:0,this.rx,0,n,!1),this._renderFill(e),this._renderStroke(e),e.restore()},complexity:function(){return 1}}),t.Ellipse.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),t.Ellipse.fromElement=function(e,n){n||(n={});var i=t.parseAttributes(e,t.Ellipse.ATTRIBUTE_NAMES),s=i.left,o=i.top;"left"in i&&(i.left-=n.width/2||0),"top"in i&&(i.top-=n.height/2||0);var u=new t.Ellipse(r(i,n));return u.cx=s||0,u.cy=o||0,u},t.Ellipse.fromObject=function(e){return new t.Ellipse(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return e.left=e.left||0,e.top=e.top||0,e}var t=e.fabric||(e.fabric={}),n=t.util.object.extend;if(t.Rect){console.warn("fabric.Rect is already defined");return}var r=t.Object.prototype.stateProperties.concat();r.push("rx","ry","x","y"),t.Rect=t.util.createClass(t.Object,{stateProperties:r,type:"rect",rx:0,ry:0,x:0,y:0,strokeDashArray:null,initialize:function(e){e=e||{},this.callSuper("initialize",e),this._initRxRy(),this.x=e.x||0,this.y=e.y||0},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(e){var t=this.rx||0,n=this.ry||0,r=-this.width/2,i=-this.height/2,s=this.width,o=this.height,u=this.group&&this.group.type==="path-group";e.beginPath(),e.globalAlpha=u?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&u&&e.translate(this.width/2+this.x,this.height/2+this.y),!this.transformMatrix&&u&&e.translate(-this.group.width/2+this.width/2+this.x,-this.group.height/2+this.height/2+this.y);var a=t!==0||n!==0;e.moveTo(r+t,i),e.lineTo(r+s-t,i),a&&e.quadraticCurveTo(r+s,i,r+s,i+n,r+s,i+n),e.lineTo(r+s,i+o-n),a&&e.quadraticCurveTo(r+s,i+o,r+s-t,i+o,r+s-t,i+o),e.lineTo(r+t,i+o),a&&e.quadraticCurveTo(r,i+o,r,i+o-n,r,i+o-n),e.lineTo(r,i+n),a&&e.quadraticCurveTo(r,i,r+t,i,r+t,i),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=-this.width/2,r=-this.height/2,i=this.width,s=this.height;e.beginPath(),t.util.drawDashedLine(e,n,r,n+i,r,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r,n+i,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r+s,n,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n,r+s,n,r,this.strokeDashArray),e.closePath()},_normalizeLeftTopProperties:function(e){return"left"in e&&this.set("left",e.left+this.getWidth()/2),this.set("x",e.left||0),"top"in e&&this.set("top",e.top+this.getHeight()/2),this.set("y",e.top||0),this},toObject:function(e){var t=n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0,x:this.get("x"),y:this.get("y")});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=this._createBaseSVGMarkup();return t.push("'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Rect.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),t.Rect.fromElement=function(e,r){if(!e)return null;var s=t.parseAttributes(e,t.Rect.ATTRIBUTE_NAMES);s=i(s);var o=new t.Rect(n(r?t.util.object.clone(r):{},s));return o._normalizeLeftTopProperties(s),o},t.Rect.fromObject=function(e){return new t.Rect(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.toFixed;if(t.Polyline){t.warn("fabric.Polyline is already defined");return}t.Polyline=t.util.createClass(t.Object,{type:"polyline",initialize:function(e,t,n){t=t||{},this.set("points",e),this.callSuper("initialize",t),this._calcDimensions(n)},_calcDimensions:function(e){return t.Polygon.prototype._calcDimensions.call(this,e)},toObject:function(e){return t.Polygon.prototype.toObject.call(this,e)},toSVG:function(e){var t=[],r=this._createBaseSVGMarkup();for(var i=0,s=this.points.length;i'),e?e(r.join("")):r.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n'),e?e(n.join("")):n.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n"},toObject:function(e){var t=s(this.callSuper("toObject",e),{path:this.path,pathOffset:this.pathOffset});return this.sourcePath&&(t.sourcePath=this.sourcePath),this.transformMatrix&&(t.transformMatrix=this.transformMatrix),t},toDatalessObject:function(e){var t=this.toObject(e);return this.sourcePath&&(t.path=this.sourcePath),delete t.sourcePath,t},toSVG:function(e){var t=[],n=this._createBaseSVGMarkup();for(var r=0,i=this.path.length;r',"",""),e?e(n.join("")):n.join("")},complexity:function(){return this.path.length},_parsePath:function(){var e=[],n=[],r,i,s=/(-?\.\d+)|(-?\d+(\.\d+)?)/g,o,u;for(var a=0,f,l=this.path.length;ad)for(var v=1,m=f.length;v"];for(var r=0,i=t.length;r"),e?e(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var e=this.getObjects()[0].get("fill");return this.getObjects().every(function(t){return t.get("fill")===e})},complexity:function(){return this.paths.reduce(function(e,t){return e+(t&&t.complexity?t.complexity():0)},0)},getObjects:function(){return this.paths}}),t.PathGroup.fromObject=function(e,n){typeof e.paths=="string"?t.loadSVGFromURL(e.paths,function(r){var i=e.paths;delete e.paths;var s=t.util.groupSVGElements(r,e,i);n(s)}):t.util.enlivenObjects(e.paths,function(r){delete e.paths,n(new t.PathGroup(r,e))})},t.PathGroup.async=!0}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.array.min,i=t.util.array.max,s=t.util.array.invoke;if(t.Group)return;var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};t.Group=t.util.createClass(t.Object,t.Collection,{type:"group",initialize:function(e,t){t=t||{},this._objects=e||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},this.callSuper("initialize"),this._calcBounds(),this._updateObjectsCoords(),t&&n(this,t),this._setOpacityIfSame(),this.setCoords(!0),this.saveCoords()},_updateObjectsCoords:function(){this.forEachObject(this._updateObjectCoords,this)},_updateObjectCoords:function(e){var t=e.getLeft(),n=e.getTop();e.set({originalLeft:t,originalTop:n,left:t-this.left,top:n-this.top}),e.setCoords(),e.__origHasControls=e.hasControls,e.hasControls=!1},toString:function(){return"#"},addWithUpdate:function(e){return this._restoreObjectsState(),this._objects.push(e),e.group=this,this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this},_setObjectActive:function(e){e.set("active",!0),e.group=this},removeWithUpdate:function(e){return this._moveFlippedObject(e),this._restoreObjectsState(),this.forEachObject(this._setObjectActive,this),this.remove(e),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(e){e.group=this},_onObjectRemoved:function(e){delete e.group,e.set("active",!1)},delegatedProperties:{fill:!0,opacity:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(e,t){if(e in this.delegatedProperties){var n=this._objects.length;this[e]=t;while(n--)this._objects[n].set(e,t)}else this[e]=t},toObject:function(e){return n(this.callSuper("toObject",e),{objects:s(this._objects,"toObject",e)})},render:function(e,n){if(!this.visible)return;e.save(),this.transform(e),this.clipTo&&t.util.clipContext(this,e);for(var r=0,i=this._objects.length;r'];for(var n=0,r=this._objects.length;n"),e?e(t.join("")):t.join("")},get:function(e){if(e in o){if(this[e])return this[e];for(var t=0,n=this._objects.length;t','");if(this.stroke||this.strokeDashArray){var n=this.fill;this.fill=null,t.push("'),this.fill=n}return t.push(""),e?e(t.join("")):t.join("")},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(e,t){this.constructor.fromObject(this.toObject(t),e)},applyFilters:function(e){if(this.filters.length===0){this._element=this._originalElement,e&&e();return}var t=this._originalElement,n=fabric.util.createCanvasElement(),r=fabric.util.createImage(),i=this;return n.width=t.width,n.height=t.height,n.getContext("2d").drawImage(t,0,0,t.width,t.height),this.filters.forEach(function(e){e&&e.applyTo(n)}),r.width=t.width,r.height=t.height,fabric.isLikelyNode?(r.src=n.toBuffer(undefined,fabric.Image.pngCompression),i._element=r,e&&e()):(r.onload=function(){i._element=r,e&&e(),r.onload=n=t=null},r.src=n.toDataURL("image/png")),this},_render:function(e){e.drawImage(this._element,-this.width/2,-this.height/2,this.width,this.height)},_resetWidthHeight:function(){var e=this.getElement();this.set("width",e.width),this.set("height",e.height)},_initElement:function(e){this.setElement(fabric.util.getById(e)),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(e){e||(e={}),this.setOptions(e),this._setWidthHeight(e),this._element.crossOrigin=this.crossOrigin},_initFilters:function(e,t){e.filters&&e.filters.length?fabric.util.enlivenObjects(e.filters,function(e){t&&t(e)},"fabric.Image.filters"):t&&t()},_setWidthHeight:function(e){this.width="width"in e?e.width:this.getElement().width||0,this.height="height"in e?e.height:this.getElement().height||0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){fabric.Image.prototype._initFilters.call(e,e,function(r){e.filters=r||[];var i=new fabric.Image(n,e);t&&t(i)})},null,e.crossOrigin)},fabric.Image.fromURL=function(e,t,n){fabric.util.loadImage(e,function(e){t(new fabric.Image(e,n))},null,n&&n.crossOrigin)},fabric.Image.ATTRIBUTE_NAMES=fabric.SHARED_ATTRIBUTES.concat("x y width height xlink:href".split(" ")),fabric.Image.fromElement=function(e,n,r){var i=fabric.parseAttributes(e,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(i["xlink:href"],n,t(r?fabric.util.object.clone(r):{},i))},fabric.Image.async=!0,fabric.Image.pngCompression=1}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var e=this.getAngle()%360;return e>0?Math.round((e-1)/90)*90:Math.round(e/90)*90},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(e){e=e||{};var t=function(){},n=e.onComplete||t,r=e.onChange||t,i=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(e){i.setAngle(e),r()},onComplete:function(){i.setCoords(),n()},onStart:function(){i.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(e){return e.straighten(),this.renderAll(),this},fxStraightenObject:function(e){return e.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.Brightness=t.util.createClass(t.Image.filters.BaseFilter,{type:"Brightness",initialize:function(e){e=e||{},this.brightness=e.brightness||100},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.brightness;for(var s=0,o=r.length;sa||C<0||C>u)continue;var k=(N*u+C)*4,L=t[x*i+T];b+=o[k]*L,w+=o[k+1]*L,E+=o[k+2]*L,S+=o[k+3]*L}h[y]=b,h[y+1]=w,h[y+2]=E,h[y+3]=S+p*(255-S)}n.putImageData(c,0,0)},toObject:function(){return n(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),t.Image.filters.Convolute.fromObject=function(e){return new t.Image.filters.Convolute(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.GradientTransparency=t.util.createClass(t.Image.filters.BaseFilter,{type:"GradientTransparency",initialize:function(e){e=e||{},this.threshold=e.threshold||100},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.threshold,s=r.length;for(var o=0,u=r.length;o-1?e.channel:0},applyTo:function(e){if(!this.mask)return;var n=e.getContext("2d"),r=n.getImageData(0,0,e.width,e.height),i=r.data,s=this.mask.getElement(),o=t.util.createCanvasElement(),u=this.channel,a,f=r.width*r.height*4;o.width=s.width,o.height=s.height,o.getContext("2d").drawImage(s,0,0,s.width,s.height);var l=o.getContext("2d").getImageData(0,0,s.width,s.height),c=l.data;for(a=0;ao&&f>o&&l>o&&u(a-f)'},_render:function(e){var t=this.group&&this.group.type==="path-group";t&&!this.transformMatrix?e.translate(-this.group.width/2+this.left,-this.group.height/2+this.top):t&&this.transformMatrix&&e.translate(-this.group.width/2,-this.group.height/2),typeof Cufon=="undefined"||this.useNative===!0?this._renderViaNative(e):this._renderViaCufon(e)},_renderViaNative:function(e){var n=this.text.split(this._reNewline);this.transform(e,t.isLikelyNode),this._setTextStyles(e),this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this.clipTo&&t.util.clipContext(this,e),this._renderTextBackground(e,n),this._translateForTextAlign(e),this._renderText(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this.clipTo&&e.restore(),this._setBoundaries(e,n),this._totalLineHeight=0},_renderText:function(e,t){e.save(),this._setShadow(e),this._renderTextFill(e,t),this._renderTextStroke(e,t),this._removeShadow(e),e.restore()},_translateForTextAlign:function(e){this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0))},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_renderChars:function(e,t,n,r,i){t[e](n,r,i)},_renderTextLine:function(e,t,n,r,i,s){i-=this.fontSize/4;if(this.textAlign!=="justify"){this._renderChars(e,t,n,r,i,s);return}var o=t.measureText(n).width,u=this.width;if(u>o){var a=n.split(/\s+/),f=t.measureText(n.replace(/\s+/g,"")).width,l=u-f,c=a.length-1,h=l/c,p=0;for(var d=0,v=a.length;d-1&&i(this.fontSize*this.lineHeight),this.textDecoration.indexOf("line-through")>-1&&i(this.fontSize*this.lineHeight-this.fontSize/2),this.textDecoration.indexOf("overline")>-1&&i(this.fontSize*this.lineHeight-this.fontSize)},_getFontDeclaration:function(){return[t.isLikelyNode?this.fontWeight:this.fontStyle,t.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",t.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(e,t){if(!this.visible)return;e.save(),this._render(e),!t&&this.active&&(this.drawBorders(e),this.drawControls(e)),e.restore()},toObject:function(e){var t=n(this.callSuper("toObject",e),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,path:this.path,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=[],n=this.text.split(this._reNewline),r=this._getSVGLeftTopOffsets(n),i=this._getSVGTextAndBg(r.lineTop,r.textLeft,n),s=this._getSVGShadows(r.lineTop,n);return r.textTop+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,this._wrapSVGTextAndBg(t,i,s,r),e?e(t.join("")):t.join("")},_getSVGLeftTopOffsets:function(e){var t=this.useNative?this.fontSize*this.lineHeight:-this._fontAscent-this._fontAscent/5*this.lineHeight,n=-(this.width/2),r=this.useNative?this.fontSize-1:this.height/2-e.length*this.fontSize-this._totalLineHeight;return{textLeft:n,textTop:r,lineTop:t}},_wrapSVGTextAndBg:function(e,t,n,r){e.push('',t.textBgRects.join(""),"',n.join(""),t.textSpans.join(""),"","")},_getSVGShadows:function(e,n){var r=[],s,o,u=1;if(!this.shadow||!this._boundaries)return r;for(s=0,o=n.length;s",t.util.string.escapeXml(n[s]),""),u=1}else u++;return r},_getSVGTextAndBg:function(e,t,n){var r=[],i=[],s=1;this._setSVGBg(i);for(var o=0,u=n.length;o",t.util.string.escapeXml(e),"")},_setSVGTextLineBg:function(e,t,n,r){e.push("')},_setSVGBg:function(e){this.backgroundColor&&this._boundaries&&e.push("')},_getFillAttributes:function(e){var n=e&&typeof e=="string"?new t.Color(e):"";return!n||!n.getSource()||n.getAlpha()===1?'fill="'+e+'"':'opacity="'+n.getAlpha()+'" fill="'+n.setAlpha(1).toRgb()+'"'},_set:function(e,t){e==="fontFamily"&&this.path&&(this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+t+"$3")),this.callSuper("_set",e,t),e in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),t.Text.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y font-family font-style font-weight font-size text-decoration".split(" ")),t.Text.fromElement=function(e,n){if(!e)return null;var r=t.parseAttributes(e,t.Text.ATTRIBUTE_NAMES);n=t.util.object.extend(n?t.util.object.clone(n):{},r);var i=new t.Text(e.textContent,n);return i.set({left:i.getLeft()+i.getWidth()/2,top:i.getTop()-i.getHeight()/2}),i},t.Text.fromObject=function(e){return new t.Text(e.text,r(e))},t.util.createAccessors(t.Text)}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Text.prototype,{_renderViaCufon:function(e){var t=Cufon.textOptions||(Cufon.textOptions={});t.left=this.left,t.top=this.top,t.context=e,t.color=this.fill;var n=this._initDummyElementForCufon();this.transform(e),Cufon.replaceElement(n,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.shadow&&this.shadow.toString(),textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,stroke:this.stroke,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor}),this.width=t.width,this.height=t.height,this._totalLineHeight=t.totalLineHeight,this._fontAscent=t.fontAscent,this._boundaries=t.boundaries,n=null,this.setCoords()},_initDummyElementForCufon:function(){var e=fabric.document.createElement("pre"),t=fabric.document.createElement("div");return t.appendChild(e),typeof G_vmlCanvasManager=="undefined"?e.innerHTML=this.text:e.innerText=this.text.replace(/\r?\n/gi,"\r"),e.style.fontSize=this.fontSize+"px",e.style.letterSpacing="normal",e}}),function(){var e=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,skipFillStrokeCheck:!0,_reSpace:/\s|\n/,_fontSizeFraction:4,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,_charWidthsCache:{},initialize:function(e,t){this.styles=t.styles||{},this.callSuper("initialize",e,t),this.initBehavior(),fabric.IText.instances.push(this),this.__lineWidths={},this.__lineHeights={},this.__lineOffsets={}},isEmptyStyles:function(){if(!this.styles)return!0;var e=this.styles;for(var t in e)for(var n in e[t])for(var r in e[t][n])return!1;return!0},setSelectionStart:function(e){this.selectionStart=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionStart=e)},setSelectionEnd:function(e){this.selectionEnd=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionEnd=e)},getSelectionStyles:function(){var e=this.get2DCursorLocation();return this.styles[e.lineIndex]?this.styles[e.lineIndex][e.charIndex]||{}:{}},setSelectionStyles:function(e){if(this.selectionStart===this.selectionEnd)this._extendStyles(this.selectionStart,e);else for(var t=this.selectionStart;t-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,0),o.indexOf("line-through")>-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,s/this._fontSizeFraction),o.indexOf("overline")>-1&&this._renderCharDecorationAtOffset(e,n,r,i,s-this.fontSize/this._fontSizeFraction)},_renderCharDecorationAtOffset:function(e,t,n,r,i){e.fillRect(t,n-i,r,1)},_renderTextLine:function(e,t,n,r,i,s){i+=this.fontSize/4,this.callSuper("_renderTextLine",e,t,n,r,i,s)},_renderTextDecoration:function(e,t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",e,t)},_renderTextLinesBackground:function(e,t){if(!this.textBackgroundColor&&!this.styles)return;e.save(),this.textBackgroundColor&&(e.fillStyle=this.textBackgroundColor);var n=0,r=this.fontSize/this._fontSizeFraction;for(var i=0,s=t.length;in&&(n=s)}return n},_getHeightOfLine:function(e,t,n){n=n||this.text.split(this._reNewline);var r=this._getHeightOfChar(e,n[t][0],t,0),i=n[t],s=i.split("");for(var o=1,u=s.length;or&&(r=a)}return r*this.lineHeight},_getTextHeight:function(e,t){var n=0;for(var r=0,i=t.length;r-1)t++,n--;return e-t},findWordBoundaryRight:function(e){var t=0,n=e;if(this._reSpace.test(this.text.charAt(n)))while(this._reSpace.test(this.text.charAt(n)))t++,n++;while(/\S/.test(this.text.charAt(n))&&n-1)t++,n--;return e-t},findLineBoundaryRight:function(e){var t=0,n=e;while(!/\n/.test(this.text.charAt(n))&&n0&&nr;s?this.removeStyleObject(s,n+1):this.removeStyleObject(this.get2DCursorLocation(n).charIndex===0,n)}this.text=this.text.slice(0,e)+this.text.slice(t)},insertChars:function(e){var t=this.text.slice(this.selectionStart,this.selectionStart+1)==="\n";this.text=this.text.slice(0,this.selectionStart)+e+this.text.slice(this.selectionEnd),this.selectionStart===this.selectionEnd?this.insertStyleObject(e,t):this.selectionEnd-this.selectionStart>1,this.selectionStart+=e.length,this.selectionEnd=this.selectionStart,this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("text:changed")},insertNewlineStyleObject:function(t,n,r){this.shiftLineStyles(t,1),this.styles[t+1]||(this.styles[t+1]={});var i=this.styles[t][n-1],s={};if(r)s[0]=e(i),this.styles[t+1]=s;else{for(var o in this.styles[t])parseInt(o,10)>=n&&(s[parseInt(o,10)-n]=this.styles[t][o],delete this.styles[t][o]);this.styles[t+1]=s}},insertCharStyleObject:function(t,n){var r=this.styles[t],i=e(r);n===0&&(n=1);for(var s in i){var o=parseInt(s,10);o>=n&&(r[o+1]=i[o])}this.styles[t][n]=e(r[n-1])},insertStyleObject:function(e,t){if(this.isEmptyStyles())return;var n=this.get2DCursorLocation(),r=n.lineIndex,i=n.charIndex;this.styles[r]||(this.styles[r]={}),e==="\n"?this.insertNewlineStyleObject(r,i,t):this.insertCharStyleObject(r,i)},shiftLineStyles:function(t,n){var r=e(this.styles);for(var i in this.styles){var s=parseInt(i,10);s>t&&(this.styles[s+n]=r[s])}},removeStyleObject:function(t,n){var r=this.get2DCursorLocation(n),i=r.lineIndex,s=r.charIndex;if(t){var o=this.text.split(this._reNewline),u=o[i-1],a=u.length;this.styles[i-1]||(this.styles[i-1]={});for(s in this.styles[i])this.styles[i-1][parseInt(s,10)+a]=this.styles[i][s];this.shiftLineStyles(i,-1)}else{var f=this.styles[i];if(f){var l=this.selectionStart===this.selectionEnd?-1:0;delete f[s+l]}var c=e(f);for(var h in c){var p=parseInt(h,10);p>=s&&p!==0&&(f[p-1]=c[p],delete f[p])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+(new Date),this.__lastLastClickTime=+(new Date),this.lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(e){this.__newClickTime=+(new Date);var t=this.canvas.getPointer(e.e);this.isTripleClick(t)?(this.fire("tripleclick",e),this._stopEvent(e.e)):this.isDoubleClick(t)&&(this.fire("dblclick",e),this._stopEvent(e.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=t},isDoubleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y},isTripleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y},_stopEvent:function(e){e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMousemoveHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(e){this.selectWord(this.getSelectionStartFromPointer(e.e))}),this.on("tripleclick",function(e){this.selectLine(this.getSelectionStartFromPointer(e.e))})},initMousedownHandler:function(){this.on("mousedown",function(e){var t=this.canvas.getPointer(e.e);this.__mousedownX=t.x,this.__mousedownY=t.y,this.__isMousedown=!0,this.hiddenTextarea&&this.canvas&&this.canvas.wrapperEl.appendChild(this.hiddenTextarea),this.isEditing?(this.setCursorByClick(e.e),this.__selectionStartOnMouseDown=this.selectionStart):this.exitEditingOnOthers()})},initMousemoveHandler:function(){this.on("mousemove",function(e){if(!this.__isMousedown||!this.isEditing)return;var t=this.getSelectionStartFromPointer(e.e);t>=this.__selectionStartOnMouseDown?(this.setSelectionStart(this.__selectionStartOnMouseDown),this.setSelectionEnd(t)):(this.setSelectionStart(t),this.setSelectionEnd(this.__selectionStartOnMouseDown))})},_isObjectMoved:function(e){var t=this.canvas.getPointer(e);return this.__mousedownX!==t.x||this.__mousedownY!==t.y},initMouseupHandler:function(){this.on("mouseup",function(e){this.__isMousedown=!1;if(this._isObjectMoved(e.e))return;this.selected&&this.enterEditing()})},setCursorByClick:function(e){var t=this.getSelectionStartFromPointer(e);e.shiftKey?ts?0:1,a=r+u;return this.flipX&&(a=i-a),a>this.text.length&&(a=this.text.length),a}}),fabric.util.object.extend(fabric.IText.prototype,{initKeyHandlers:function(){fabric.util.addListener(fabric.document,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(fabric.document,"keypress",this.onKeyPress.bind(this))},initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.style.cssText="position: absolute; top: 0; left: -9999px",fabric.document.body.appendChild(this.hiddenTextarea)},_keysMap:{8:"removeChars",13:"insertNewline",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMap:{65:"selectAll",67:"copy",86:"paste",88:"cut"},onKeyDown:function(e){if(!this.isEditing)return;if(e.keyCode in this._keysMap)this[this._keysMap[e.keyCode]](e);else{if(!(e.keyCode in this._ctrlKeysMap&&(e.ctrlKey||e.metaKey)))return;this[this._ctrlKeysMap[e.keyCode]](e)}e.preventDefault(),e.stopPropagation(),this.canvas&&this.canvas.renderAll()},forwardDelete:function(e){this.selectionStart===this.selectionEnd&&this.moveCursorRight(e),this.removeChars(e)},copy:function(){var e=this.getSelectedText();this.copiedText=e},paste:function(){this.copiedText&&this.insertChars(this.copiedText)},cut:function(e){this.copy(),this.removeChars(e)},onKeyPress:function(e){if(!this.isEditing||e.metaKey||e.ctrlKey||e.keyCode===8||e.keyCode===13)return;this.insertChars(String.fromCharCode(e.which)),e.preventDefault(),e.stopPropagation()},getDownCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.text.split(this._reNewline),i,s,o=this.text.slice(0,n),u=this.text.slice(n),a=o.slice(o.lastIndexOf("\n")+1),f=u.match(/(.*)\n?/)[1],l=(u.match(/.*\n(.*)\n?/)||{})[1]||"",c=this.get2DCursorLocation(n);if(c.lineIndex===r.length-1||e.metaKey)return this.text.length-n;var h=this._getWidthOfLine(this.ctx,c.lineIndex,r);s=this._getLineLeftOffset(h);var p=s,d=c.lineIndex;for(var v=0,m=a.length;vn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=gthis.text.length&&(this.selectionStart=this.text.length),this.selectionEnd=this.selectionStart},moveCursorDownWithShift:function(e){if(this._selectionDirection==="left"&&this.selectionStart!==this.selectionEnd){this.selectionStart+=e,this._selectionDirection="left";return}this._selectionDirection="right",this.selectionEnd+=e,this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length)},getUpCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(n);if(r.lineIndex===0||e.metaKey)return n;var i=this.text.slice(0,n),s=i.slice(i.lastIndexOf("\n")+1),o=(i.match(/\n?(.*)\n.*$/)||{})[1]||"",u=this.text.split(this._reNewline),a,f,l=this._getWidthOfLine(this.ctx,r.lineIndex,u);f=this._getLineLeftOffset(l);var c=f,h=r.lineIndex;for(var p=0,d=s.length;pn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=g=this.text.length&&this.selectionEnd>=this.text.length)return;this.abortCursorAnimation(),this._currentCursorOpacity=1,e.shiftKey?this.moveCursorRightWithShift(e):this.moveCursorRightWithoutShift(e),this.initDelayedCursor()},moveCursorRightWithShift:function(e){this._selectionDirection==="left"&&this.selectionStart!==this.selectionEnd?this._moveRight(e,"selectionStart"):(this._selectionDirection="right",this._moveRight(e,"selectionEnd"),this.text.charAt(this.selectionEnd-1)==="\n"&&this.selectionEnd++,this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length))},moveCursorRightWithoutShift:function(e){this._selectionDirection="right",this.selectionStart===this.selectionEnd?(this._moveRight(e,"selectionStart"),this.selectionEnd=this.selectionStart):(this.selectionEnd+=this.getNumNewLinesInSelectedText(),this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length),this.selectionStart=this.selectionEnd)},removeChars:function(e){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(e):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.selectionEnd=this.selectionStart,this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("text:changed")},_removeCharsNearCursor:function(e){if(this.selectionStart!==0)if(e.metaKey){var t=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(t,this.selectionStart),this.selectionStart=t}else if(e.altKey){var n=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(n,this.selectionStart),this.selectionStart=n}else{var r=this.text.slice(this.selectionStart-1,this.selectionStart)==="\n";this.removeStyleObject(r),this.selectionStart--,this.text=this.text.slice(0,this.selectionStart)+this.text.slice(this.selectionStart+1)}}}),fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(e,t,n,r,i,s){this.styles[t]?this._setSVGTextLineChars(e,t,n,r,i,s):this.callSuper("_setSVGTextLineText",e,t,n,r,i)},_setSVGTextLineChars:function(e,t,n,r,i,s){var o=t===0||this.useNative?"y":"dy",u=e.split(""),a=0,f=this._getSVGLineLeftOffset(t),l=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t);for(var h=0,p=u.length;h'].join("")},_createTextCharSpan:function(e,t,n,r,i,s){var o=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text"},t));return['',fabric.util.string.escapeXml(e),""].join("")}}),function(){function request(e,t,n){var r=URL.parse(e);r.port||(r.port=r.protocol.indexOf("https:")===0?443:80);var i=r.port===443?HTTPS:HTTP,s=i.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(e){var r="";t&&e.setEncoding(t),e.on("end",function(){n(r)}),e.on("data",function(t){e.statusCode===200&&(r+=t)})});s.on("error",function(e){e.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(e.message)}),s.end()}function request_fs(e,t){var n=require("fs");n.readFile(e,function(e,n){if(e)throw fabric.log(e),e;t(n)})}if(typeof document!="undefined"&&typeof window!="undefined")return;var DOMParser=(new require("xmldom")).DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(e,t,n){var r=function(r){i.src=new Buffer(r,"binary"),i._src=e,t&&t.call(n,i)},i=new Image;e&&(e instanceof Buffer||e.indexOf("data")===0)?(i.src=i._src=e,t&&t.call(n,i)):e&&e.indexOf("http")!==0?request_fs(e,r):e&&request(e,"binary",r)},fabric.loadSVGFromURL=function(e,t,n){e=e.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),e.indexOf("http")!==0?request_fs(e,function(e){fabric.loadSVGFromString(e,t,n)}):request(e,"",function(e){fabric.loadSVGFromString(e,t,n)})},fabric.loadSVGFromString=function(e,t,n){var r=(new DOMParser).parseFromString(e);fabric.parseSVGDocument(r.documentElement,function(e,n){t&&t(e,n)},n)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){var r=new fabric.Image(n);r._initConfig(e),r._initFilters(e,function(e){r.filters=e||[],t&&t(r)})})},fabric.createCanvasForNode=function(e,t){var n=fabric.document.createElement("canvas"),r=new Canvas(e||600,t||600);n.style={},n.width=r.width,n.height=r.height;var i=fabric.Canvas||fabric.StaticCanvas,s=new i(n);return s.contextContainer=r.getContext("2d"),s.nodeCanvas=r,s.Font=Canvas.Font,s},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(e){return this.nodeCanvas.createJPEGStream(e)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(e){return origSetWidth.call(this,e),this.nodeCanvas.width=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(e){return origSetHeight.call(this,e),this.nodeCanvas.height=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}(); \ No newline at end of file +n}})();var a=t(fabric.document.documentElement,"addEventListener","removeEventListener")&&t(fabric.window,"addEventListener","removeEventListener"),f=t(fabric.document.documentElement,"attachEvent","detachEvent")&&t(fabric.window,"attachEvent","detachEvent"),l={},c={},h,p;a?(h=function(e,t,n){e.addEventListener(t,n,!1)},p=function(e,t,n){e.removeEventListener(t,n,!1)}):f?(h=function(e,t,r){var o=n(e);i(o,e),l[o]||(l[o]={}),l[o][t]||(l[o][t]=[]);var u=s(o,r);l[o][t].push(u),e.attachEvent("on"+t,u.wrappedHandler)},p=function(e,t,r){var i=n(e),s;if(l[i]&&l[i][t])for(var o=0,u=l[i][t].length;o-1?s(e,t.match(/opacity:\s*(\d?\.?\d*)/)[1]):e;for(var r in t)if(r==="opacity")s(e,t[r]);else{var i=r==="float"||r==="cssFloat"?typeof n.styleFloat=="undefined"?"cssFloat":"styleFloat":r;n[i]=t[r]}return e}var t=fabric.document.createElement("div"),n=typeof t.style.opacity=="string",r=typeof t.style.filter=="string",i=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(e){return e};n?s=function(e,t){return e.style.opacity=t,e}:r&&(s=function(e,t){var n=e.style;return e.currentStyle&&!e.currentStyle.hasLayout&&(n.zoom=1),i.test(n.filter)?(t=t>=.9999?"":"alpha(opacity="+t*100+")",n.filter=n.filter.replace(i,t)):n.filter+=" alpha(opacity="+t*100+")",e}),fabric.util.setStyle=e}(),function(){function t(e){return typeof e=="string"?fabric.document.getElementById(e):e}function s(e,t){var n=fabric.document.createElement(e);for(var r in t)r==="class"?n.className=t[r]:r==="for"?n.htmlFor=t[r]:n.setAttribute(r,t[r]);return n}function o(e,t){(" "+e.className+" ").indexOf(" "+t+" ")===-1&&(e.className+=(e.className?" ":"")+t)}function u(e,t,n){return typeof t=="string"&&(t=s(t,n)),e.parentNode&&e.parentNode.replaceChild(t,e),t.appendChild(e),t}function a(e,t){var n,r,i=0,s=0,o=fabric.document.documentElement,u=fabric.document.body||{scrollLeft:0,scrollTop:0};r=e;while(e&&e.parentNode&&!n)e=e.parentNode,e!==fabric.document&&fabric.util.getElementStyle(e,"position")==="fixed"&&(n=e),e!==fabric.document&&r!==t&&fabric.util.getElementStyle(e,"position")==="absolute"?(i=0,s=0):e===fabric.document?(i=u.scrollLeft||o.scrollLeft||0,s=u.scrollTop||o.scrollTop||0):(i+=e.scrollLeft||0,s+=e.scrollTop||0);return{left:i,top:s}}function f(e){var t,n={left:0,top:0},r=e&&e.ownerDocument,i={left:0,top:0},s,o={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return{left:0,top:0};for(var u in o)i[o[u]]+=parseInt(l(e,u),10)||0;return t=r.documentElement,typeof e.getBoundingClientRect!="undefined"&&(n=e.getBoundingClientRect()),s=fabric.util.getScrollLeftTop(e,null),{left:n.left+s.left-(t.clientLeft||0)+i.left,top:n.top+s.top-(t.clientTop||0)+i.top}}function l(e,t){e.style||(e.style={});if(fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle)return fabric.document.defaultView.getComputedStyle(e,null)[t];var n=e.style[t];return!n&&e.currentStyle&&(n=e.currentStyle[t]),n}var e=Array.prototype.slice,n=function(t){return e.call(t,0)},r;try{r=n(fabric.document.childNodes)instanceof Array}catch(i){}r||(n=function(e){var t=new Array(e.length),n=e.length;while(n--)t[n]=e[n];return t}),function(){function n(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=fabric.util.falseFunction),t?e.style[t]="none":typeof e.unselectable=="string"&&(e.unselectable="on"),e}function r(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=null),t?e.style[t]="":typeof e.unselectable=="string"&&(e.unselectable=""),e}var e=fabric.document.documentElement.style,t="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=n,fabric.util.makeElementSelectable=r}(),function(){function e(e,t){var n=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),i=!0;r.onload=r.onreadystatechange=function(e){if(i){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")return;i=!1,t(e||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=e,n.appendChild(r)}fabric.util.getScript=e}(),fabric.util.getById=t,fabric.util.toArray=n,fabric.util.makeElement=s,fabric.util.addClass=o,fabric.util.wrapElement=u,fabric.util.getScrollLeftTop=a,fabric.util.getElementOffset=f,fabric.util.getElementStyle=l}(),function(){function e(e,t){return e+(/\?/.test(e)?"&":"?")+t}function n(){}function r(r,i){i||(i={});var s=i.method?i.method.toUpperCase():"GET",o=i.onComplete||function(){},u=t(),a;return u.onreadystatechange=function(){u.readyState===4&&(o(u),u.onreadystatechange=n)},s==="GET"&&(a=null,typeof i.parameters=="string"&&(r=e(r,i.parameters))),u.open(s,r,!0),(s==="POST"||s==="PUT")&&u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(a),u}var t=function(){var e=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}];for(var t=e.length;t--;)try{var n=e[t]();if(n)return e[t]}catch(r){}}();fabric.util.request=r}(),fabric.log=function(){},fabric.warn=function(){},typeof console!="undefined"&&["log","warn"].forEach(function(e){typeof console[e]!="undefined"&&console[e].apply&&(fabric[e]=function(){return console[e].apply(console,arguments)})}),function(){function e(e){n(function(t){e||(e={});var r=t||+(new Date),i=e.duration||500,s=r+i,o,u=e.onChange||function(){},a=e.abort||function(){return!1},f=e.easing||function(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t},l="startValue"in e?e.startValue:0,c="endValue"in e?e.endValue:100,h=e.byValue||c-l;e.onStart&&e.onStart(),function p(t){o=t||+(new Date);var c=o>s?i:o-r;if(a()){e.onComplete&&e.onComplete();return}u(f(c,l,h,i));if(o>s){e.onComplete&&e.onComplete();return}n(p)}(r)})}var t=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(e){fabric.window.setTimeout(e,1e3/60)},n=function(){return t.apply(fabric.window,arguments)};fabric.util.animate=e,fabric.util.requestAnimFrame=n}(),function(){function e(e,t,n,r){return e','')}var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.string.capitalize,i=t.util.object.clone,s=t.util.toFixed,o=t.util.multiplyTransformMatrices,u={"fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight",cx:"left",x:"left",r:"radius","stroke-dasharray":"strokeDashArray","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration",cy:"top",y:"top",transform:"transformMatrix"},a={stroke:"strokeOpacity",fill:"fillOpacity"};t.parseTransformAttribute=function(){function e(e,t){var n=t[0];e[0]=Math.cos(n),e[1]=Math.sin(n),e[2]=-Math.sin(n),e[3]=Math.cos(n)}function n(e,t){var n=t[0],r=t.length===2?t[1]:t[0];e[0]=n,e[3]=r}function r(e,t){e[2]=t[0]}function i(e,t){e[1]=t[0]}function s(e,t){e[4]=t[0],t.length===2&&(e[5]=t[1])}var o=[1,0,0,1,0,0],u="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",a="(?:\\s+,?\\s*|,\\s*)",f="(?:(skewX)\\s*\\(\\s*("+u+")\\s*\\))",l="(?:(skewY)\\s*\\(\\s*("+u+")\\s*\\))",c="(?:(rotate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+")"+a+"("+u+"))?\\s*\\))",h="(?:(scale)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",p="(?:(translate)\\s*\\(\\s*("+u+")(?:"+a+"("+u+"))?\\s*\\))",d="(?:(matrix)\\s*\\(\\s*("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+a+"("+u+")"+"\\s*\\))",v="(?:"+d+"|"+p+"|"+h+"|"+c+"|"+f+"|"+l+")",m="(?:"+v+"(?:"+a+v+")*"+")",g="^\\s*(?:"+m+"?)\\s*$",y=new RegExp(g),b=new RegExp(v,"g");return function(u){var a=o.concat(),f=[];if(!u||u&&!y.test(u))return a;u.replace(b,function(t){var u=(new RegExp(v)).exec(t).filter(function(e){return e!==""&&e!=null}),l=u[1],c=u.slice(2).map(parseFloat);switch(l){case"translate":s(a,c);break;case"rotate":e(a,c);break;case"scale":n(a,c);break;case"skewX":r(a,c);break;case"skewY":i(a,c);break;case"matrix":a=c}f.push(a.concat()),a=o.concat()});var l=f[0];while(f.length>1)f.shift(),l=t.util.multiplyTransformMatrices(l,f[0]);return l}}(),t.parseSVGDocument=function(){function s(e,t){while(e&&(e=e.parentNode))if(t.test(e.nodeName))return!0;return!1}var e=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/,n="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",r=new RegExp("^\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*"+"$");return function(n,o,u){if(!n)return;var a=new Date,f=t.util.toArray(n.getElementsByTagName("*"));if(f.length===0){f=n.selectNodes("//*[name(.)!='svg']");var l=[];for(var c=0,h=f.length;c-1;e=e.split(/\s+/);var n=[],r,i;if(t){r=0,i=e.length;for(;r/i,"")));if(!s.documentElement)return;t.parseSVGDocument(s.documentElement,function(r,i){m.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),m.has(e,function(r){r?m.get(e,function(e){var t=g(e);n(t.objects,t.options)}):new t.util.request(e,{method:"get",onComplete:i})})},loadSVGFromString:function(e,n,r){e=e.trim();var i;if(typeof DOMParser!="undefined"){var s=new DOMParser;s&&s.parseFromString&&(i=s.parseFromString(e,"text/xml"))}else t.window.ActiveXObject&&(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(e.replace(//i,"")));t.parseSVGDocument(i.documentElement,function(e,t){n(e,t)},r)},createSVGFontFacesMarkup:function(e){var t="";for(var n=0,r=e.length;n',"",t,"",""].join("")),t},createSVGRefElementsMarkup:function(e){var t=[];return y(t,e,"backgroundColor"),y(t,e,"overlayColor"),t.join("")}})}(typeof exports!="undefined"?exports:this),fabric.ElementsParser={parse:function(e,t,n,r){this.elements=e,this.callback=t,this.options=n,this.reviver=r,this.instances=new Array(e.length),this.numElements=e.length,this.createObjects()},createObjects:function(){for(var e=0,t=this.elements.length;ee.x&&this.y>e.y},gte:function(e){return this.x>=e.x&&this.y>=e.y},lerp:function(e,t){return new n(this.x+(e.x-this.x)*t,this.y+(e.y-this.y)*t)},distanceFrom:function(e){var t=this.x-e.x,n=this.y-e.y;return Math.sqrt(t*t+n*n)},midPointFrom:function(e){return new n(this.x+(e.x-this.x)/2,this.y+(e.y-this.y)/2)},min:function(e){return new n(Math.min(this.x,e.x),Math.min(this.y,e.y))},max:function(e){return new n(Math.max(this.x,e.x),Math.max(this.y,e.y))},toString:function(){return this.x+","+this.y},setXY:function(e,t){this.x=e,this.y=t},setFromPoint:function(e){this.x=e.x,this.y=e.y},swap:function(e){var t=this.x,n=this.y;this.x=e.x,this.y=e.y,e.x=t,e.y=n}}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){this.status=e,this.points=[]}var t=e.fabric||(e.fabric={});if(t.Intersection){t.warn("fabric.Intersection is already defined");return}t.Intersection=n,t.Intersection.prototype={appendPoint:function(e){this.points.push(e)},appendPoints:function(e){this.points=this.points.concat(e)}},t.Intersection.intersectLineLine=function(e,r,i,s){var o,u=(s.x-i.x)*(e.y-i.y)-(s.y-i.y)*(e.x-i.x),a=(r.x-e.x)*(e.y-i.y)-(r.y-e.y)*(e.x-i.x),f=(s.y-i.y)*(r.x-e.x)-(s.x-i.x)*(r.y-e.y);if(f!==0){var l=u/f,c=a/f;0<=l&&l<=1&&0<=c&&c<=1?(o=new n("Intersection"),o.points.push(new t.Point(e.x+l*(r.x-e.x),e.y+l*(r.y-e.y)))):o=new n}else u===0||a===0?o=new n("Coincident"):o=new n("Parallel");return o},t.Intersection.intersectLinePolygon=function(e,t,r){var i=new n,s=r.length;for(var o=0;o0&&(i.status="Intersection"),i},t.Intersection.intersectPolygonPolygon=function(e,t){var r=new n,i=e.length;for(var s=0;s0&&(r.status="Intersection"),r},t.Intersection.intersectPolygonRectangle=function(e,r,i){var s=r.min(i),o=r.max(i),u=new t.Point(o.x,s.y),a=new t.Point(s.x,o.y),f=n.intersectLinePolygon(s,u,e),l=n.intersectLinePolygon(u,o,e),c=n.intersectLinePolygon(o,a,e),h=n.intersectLinePolygon(a,s,e),p=new n;return p.appendPoints(f.points),p.appendPoints(l.points),p.appendPoints(c.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){e?this._tryParsingColor(e):this.setSource([0,0,0,1])}function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var t=e.fabric||(e.fabric={});if(t.Color){t.warn("fabric.Color is already defined.");return}t.Color=n,t.Color.prototype={_tryParsingColor:function(e){var t;e in n.colorNameMap&&(e=n.colorNameMap[e]),t=n.sourceFromHex(e),t||(t=n.sourceFromRgb(e)),t||(t=n.sourceFromHsl(e)),t&&this.setSource(t)},_rgbToHsl:function(e,n,r){e/=255,n/=255,r/=255;var i,s,o,u=t.util.array.max([e,n,r]),a=t.util.array.min([e,n,r]);o=(u+a)/2;if(u===a)i=s=0;else{var f=u-a;s=o>.5?f/(2-u-a):f/(u+a);switch(u){case e:i=(n-r)/f+(n']:this.type==="radial"&&(r=["']);for(var i=0;i');return r.push(this.type==="linear"?"":""),r.join("")},toLive:function(e){var t;if(!this.type)return;this.type==="linear"?t=e.createLinearGradient(this.coords.x1,this.coords.y1,this.coords.x2,this.coords.y2):this.type==="radial"&&(t=e.createRadialGradient(this.coords.x1,this.coords.y1,this.coords.r1,this.coords.x2,this.coords.y2,this.coords.r2));for(var n=0,r=this.colorStops.length;n'+''+""},toLive:function(e){var t=typeof this.source=="function"?this.source():this.source;if(typeof t.src!="undefined"){if(!t.complete)return"";if(t.naturalWidth===0||t.naturalHeight===0)return""}return e.createPattern(t,this.repeat)}}),function( +e){"use strict";var t=e.fabric||(e.fabric={});if(t.Shadow){t.warn("fabric.Shadow is already defined.");return}t.Shadow=t.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(e){typeof e=="string"&&(e=this._parseShadow(e));for(var n in e)this[n]=e[n];this.id=t.Object.__uid++},_parseShadow:function(e){var n=e.trim(),r=t.Shadow.reOffsetsAndBlur.exec(n)||[],i=n.replace(t.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)";return{color:i.trim(),offsetX:parseInt(r[1],10)||0,offsetY:parseInt(r[2],10)||0,blur:parseInt(r[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(e){var t="SourceAlpha";return e&&(e.fill===this.color||e.stroke===this.color)&&(t="SourceGraphic"),''+''+''+""+""+''+""+""},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY};var e={},n=t.Shadow.prototype;return this.color!==n.color&&(e.color=this.color),this.blur!==n.blur&&(e.blur=this.blur),this.offsetX!==n.offsetX&&(e.offsetX=this.offsetX),this.offsetY!==n.offsetY&&(e.offsetY=this.offsetY),e}}),t.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/}(typeof exports!="undefined"?exports:this),function(){"use strict";if(fabric.StaticCanvas){fabric.warn("fabric.StaticCanvas is already defined.");return}var e=fabric.util.object.extend,t=fabric.util.getElementOffset,n=fabric.util.removeFromArray,r=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass({initialize:function(e,t){t||(t={}),this._initStatic(e,t),fabric.StaticCanvas.activeInstance=this},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!0,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,onBeforeScaleRotate:function(){},_initStatic:function(e,t){this._objects=[],this._createLowerCanvas(e),this._initOptions(t),t.overlayImage&&this.setOverlayImage(t.overlayImage,this.renderAll.bind(this)),t.backgroundImage&&this.setBackgroundImage(t.backgroundImage,this.renderAll.bind(this)),t.backgroundColor&&this.setBackgroundColor(t.backgroundColor,this.renderAll.bind(this)),t.overlayColor&&this.setOverlayColor(t.overlayColor,this.renderAll.bind(this)),this.calcOffset()},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(e,t,n){return this.__setBgOverlayImage("overlayImage",e,t,n)},setBackgroundImage:function(e,t,n){return this.__setBgOverlayImage("backgroundImage",e,t,n)},setOverlayColor:function(e,t){return this.__setBgOverlayColor("overlayColor",e,t)},setBackgroundColor:function(e,t){return this.__setBgOverlayColor("backgroundColor",e,t)},__setBgOverlayImage:function(e,t,n,r){return typeof t=="string"?fabric.util.loadImage(t,function(t){this[e]=new fabric.Image(t,r),n&&n()},this):(this[e]=t,n&&n()),this},__setBgOverlayColor:function(e,t,n){if(t.source){var r=this;fabric.util.loadImage(t.source,function(i){r[e]=new fabric.Pattern({source:i,repeat:t.repeat,offsetX:t.offsetX,offsetY:t.offsetY}),n&&n()})}else this[e]=t,n&&n();return this},_createCanvasElement:function(){var e=fabric.document.createElement("canvas");e.style||(e.style={});if(!e)throw r;return this._initCanvasElement(e),e},_initCanvasElement:function(e){fabric.util.createCanvasElement(e);if(typeof e.getContext=="undefined")throw r},_initOptions:function(e){for(var t in e)this[t]=e[t];this.width=parseInt(this.lowerCanvasEl.width,10)||0,this.height=parseInt(this.lowerCanvasEl.height,10)||0;if(!this.lowerCanvasEl.style)return;this.lowerCanvasEl.style.width=this.width+"px",this.lowerCanvasEl.style.height=this.height+"px"},_createLowerCanvas:function(e){this.lowerCanvasEl=fabric.util.getById(e)||this._createCanvasElement(),this._initCanvasElement(this.lowerCanvasEl),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(e){return this._setDimension("width",e)},setHeight:function(e){return this._setDimension("height",e)},setDimensions:function(e){for(var t in e)this._setDimension(t,e[t]);return this},_setDimension:function(e,t){return this.lowerCanvasEl[e]=t,this.lowerCanvasEl.style[e]=t+"px",this.upperCanvasEl&&(this.upperCanvasEl[e]=t,this.upperCanvasEl.style[e]=t+"px"),this.cacheCanvasEl&&(this.cacheCanvasEl[e]=t),this.wrapperEl&&(this.wrapperEl.style[e]=t+"px"),this[e]=t,this.calcOffset(),this.renderAll(),this},getElement:function(){return this.lowerCanvasEl},getActiveObject:function(){return null},getActiveGroup:function(){return null},_draw:function(e,t){if(!t)return;if(this.controlsAboveOverlay){var n=t.hasBorders,r=t.hasControls;t.hasBorders=t.hasControls=!1,t.render(e),t.hasBorders=n,t.hasControls=r}else t.render(e)},_onObjectAdded:function(e){this.stateful&&e.setupState(),e.setCoords(),e.canvas=this,this.fire("object:added",{target:e}),e.fire("added")},_onObjectRemoved:function(e){this.getActiveObject()===e&&(this.fire("before:selection:cleared",{target:e}),this._discardActiveObject(),this.fire("selection:cleared")),this.fire("object:removed",{target:e}),e.fire("removed")},clearContext:function(e){return e.clearRect(0,0,this.width,this.height),this},getContext:function(){return this.contextContainer},clear:function(){return this._objects.length=0,this.discardActiveGroup&&this.discardActiveGroup(),this.discardActiveObject&&this.discardActiveObject(),this.clearContext(this.contextContainer),this.contextTop&&this.clearContext(this.contextTop),this.fire("canvas:cleared"),this.renderAll(),this},renderAll:function(e){var t=this[e===!0&&this.interactive?"contextTop":"contextContainer"],n=this.getActiveGroup();return this.contextTop&&this.selection&&!this._groupSelector&&this.clearContext(this.contextTop),e||this.clearContext(t),this.fire("before:render"),this.clipTo&&fabric.util.clipContext(this,t),this._renderBackground(t),this._renderObjects(t,n),this._renderActiveGroup(t,n),this.clipTo&&t.restore(),this._renderOverlay(t),this.controlsAboveOverlay&&this.interactive&&this.drawControls(t),this.fire("after:render"),this},_renderObjects:function(e,t){for(var n=0,r=this._objects.length;n"),n.join("")},_setSVGPreamble:function(e,t){t.suppressPreamble||e.push('','\n')},_setSVGHeader:function(e,t){e.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),"")},_setSVGObjects:function(e,t){var n=this.getActiveGroup();n&&this.discardActiveGroup();for(var r=0,i=this.getObjects(),s=i.length;r"):this[t]&&t==="overlayColor"&&e.push('")},sendToBack:function(e){return n(this._objects,e),this._objects.unshift(e),this.renderAll&&this.renderAll()},bringToFront:function(e){return n(this._objects,e),this._objects.push(e),this.renderAll&&this.renderAll()},sendBackwards:function(e,t){var r=this._objects.indexOf(e);if(r!==0){var i=this._findNewLowerIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewLowerIndex:function(e,t,n){var r;if(n){r=t;for(var i=t-1;i>=0;--i){var s=e.intersectsWithObject(this._objects[i])||e.isContainedWithinObject(this._objects[i])||this._objects[i].isContainedWithinObject(e);if(s){r=i;break}}}else r=t-1;return r},bringForward:function(e,t){var r=this._objects.indexOf(e);if(r!==this._objects.length-1){var i=this._findNewUpperIndex(e,r,t);n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},_findNewUpperIndex:function(e,t,n){var r;if(n){r=t;for(var i=t+1;i"}}),e(fabric.StaticCanvas.prototype,fabric.Observable),e(fabric.StaticCanvas.prototype,fabric.Collection),e(fabric.StaticCanvas.prototype,fabric.DataURLExporter),e(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(e){var t=fabric.util.createCanvasElement();if(!t||!t.getContext)return null;var n=t.getContext("2d");if(!n)return null;switch(e){case"getImageData":return typeof n.getImageData!="undefined";case"setLineDash":return typeof n.setLineDash!="undefined";case"toDataURL":return typeof t.toDataURL!="undefined";case"toDataURLWithQuality":try{return t.toDataURL("image/jpeg",0),!0}catch(r){}return!1;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",setShadow:function(e){return this.shadow=new fabric.Shadow(e),this},_setBrushStyles:function(){var e=this.canvas.contextTop;e.strokeStyle=this.color,e.lineWidth=this.width,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin},_setShadow:function(){if(!this.shadow)return;var e=this.canvas.contextTop;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_resetShadow:function(){var e=this.canvas.contextTop;e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0}}),function(){var e=fabric.util.array.min,t=fabric.util.array.max;fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(e){this.canvas=e,this._points=[]},onMouseDown:function(e){this._prepareForDrawing(e),this._captureDrawingPath(e),this._render()},onMouseMove:function(e){this._captureDrawingPath(e),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(e){var t=new fabric.Point(e.x,e.y);this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)},_addPoint:function(e){this._points.push(e)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(e){var t=new fabric.Point(e.x,e.y);this._addPoint(t)},_render:function(){var e=this.canvas.contextTop;e.beginPath();var t=this._points[0],n=this._points[1];this._points.length===2&&t.x===n.x&&t.y===n.y&&(t.x-=.5,n.x+=.5),e.moveTo(t.x,t.y);for(var r=1,i=this._points.length;rn.padding?e.x<0?e.x+=n.padding:e.x-=n.padding:e.x=0,i(e.y)>n.padding?e.y<0?e.y+=n.padding:e.y-=n.padding:e.y=0},_rotateObject:function(e,t){var i=this._currentTransform,s=this._offset;if(i.target.get("lockRotation"))return;var o=r(i.ey-i.top-s.top,i.ex-i.left-s.left),u=r(t-i.top-s.top,e-i.left-s.left),a=n(u-o+i.theta);a<0&&(a=360+a),i.target.angle=a},_setCursor:function(e){this.upperCanvasEl.style.cursor=e},_resetObjectTransform:function(e){e.scaleX=1,e.scaleY=1,e.setAngle(0)},_drawSelection:function(){var e=this.contextTop,t=this._groupSelector,n=t.left,r=t.top,o=i(n),u=i(r);e.fillStyle=this.selectionColor,e.fillRect(t.ex-(n>0?0:-n),t.ey-(r>0?0:-r),o,u),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var a=t.ex+s-(n>0?0:o),f=t.ey+s-(r>0?0:u);e.beginPath(),fabric.util.drawDashedLine(e,a,f,a+o,f,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f+u-1,a+o,f+u-1,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f,a,f+u,this.selectionDashArray),fabric.util.drawDashedLine(e,a+o-1,f,a+o-1,f+u,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+s-(n>0?0:o),t.ey+s-(r>0?0:u),o,u)},_isLastRenderedObject:function(e){return this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay.visible&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(e,this._offset)},findTarget:function(e,t){if(this.skipTargetFind)return;if(this._isLastRenderedObject(e))return this.lastRenderedObjectWithControlsAboveOverlay;var n=this.getActiveGroup();return n&&!t&&this.containsPoint(e,n)?n:this._searchPossibleTargets(e)},_searchPossibleTargets:function(e){var t=[],n,r=this.getPointer(e);for(var i=this._objects.length;i--;)if(this._objects[i]&&this._objects[i].visible&&this._objects[i].evented&&this.containsPoint(e,this._objects[i])){if(!this.perPixelTargetFind&&!this._objects[i].perPixelTargetFind){n=this._objects[i],this.relatedTarget=n;break}t[t.length]=this._objects[i]}for(var s=0,o=t.length;s1&&(t=new fabric.Group(t.reverse(),{originX:"center",originY:"center"}),this.setActiveGroup(t,e),t.saveCoords(),this.fire("selection:created",{target:t}),this.renderAll())},_collectObjects:function(){var n=[],r,i=this._groupSelector.ex,s=this._groupSelector.ey,o=i+this._groupSelector.left,u=s+this._groupSelector.top,a=new fabric.Point(e(i,o),e(s,u)),f=new fabric.Point(t(i,o),t(s,u)),l=i===o&&s===u;for(var c=this._objects.length;c--;){r=this._objects[c];if(!r||!r.selectable||!r.visible)continue;if(r.intersectsWithRect(a,f)||r.isContainedWithinRect(a,f)||r.containsPoint(a)||r.containsPoint(f)){r.set("active",!0),n.push(r);if(l)break}}return n},_maybeGroupObjects:function(e){this.selection&&this._groupSelector&&this._groupSelectedObjects(e);var t=this.getActiveGroup();t&&(t.setObjectsCoords().setCoords(),t.isMoving=!1,this._setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(e){e||(e={});var t=e.format||"png",n=e.quality||1,r=e.multiplier||1,i={left:e.left,top:e.top,width:e.width,height:e.height};return r!==1?this.__toDataURLWithMultiplier(t,n,i,r):this.__toDataURL(t,n,i)},__toDataURL:function(e,t,n){this.renderAll(!0);var r=this.upperCanvasEl||this.lowerCanvasEl,i=this.__getCroppedCanvas(r,n);e==="jpg"&&(e="jpeg");var s=fabric.StaticCanvas.supports("toDataURLWithQuality")?(i||r).toDataURL("image/"+e,t):(i||r).toDataURL("image/"+e);return this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),i&&(i=null),s},__getCroppedCanvas:function(e,t){var n,r,i="left"in t||"top"in t||"width"in t||"height"in t;return i&&(n=fabric.util.createCanvasElement(),r=n.getContext("2d"),n.width=t.width||this.width,n.height=t.height||this.height,r.drawImage(e,-t.left||0,-t.top||0)),n},__toDataURLWithMultiplier:function(e,t,n,r){var i=this.getWidth(),s=this.getHeight(),o=i*r,u=s*r,a=this.getActiveObject(),f=this.getActiveGroup(),l=this.contextTop||this.contextContainer;this.setWidth(o).setHeight(u),l.scale(r,r),n.left&&(n.left*=r),n.top&&(n.top*=r),n.width&&(n.width*=r),n.height&&(n.height*=r),f?this._tempRemoveBordersControlsFromGroup(f):a&&this.deactivateAll&&this.deactivateAll(),this.renderAll(!0);var c=this.__toDataURL(e,t,n);return this.width=i,this.height=s,l.scale(1/r,1/r),this.setWidth(i).setHeight(s),f?this._restoreBordersControlsOnGroup(f):a&&this.setActiveObject&&this.setActiveObject(a),this.contextTop&&this.clearContext(this.contextTop),this.renderAll(),c},toDataURLWithMultiplier:function(e,t,n){return this.toDataURL({format:e,multiplier:t,quality:n})},_tempRemoveBordersControlsFromGroup:function(e){e.origHasControls=e.hasControls,e.origBorderColor=e.borderColor,e.hasControls=!0,e.borderColor="rgba(0,0,0,0)",e.forEachObject(function(e){e.origBorderColor=e.borderColor,e.borderColor="rgba(0,0,0,0)"})},_restoreBordersControlsOnGroup:function(e){e.hideControls=e.origHideControls,e.borderColor=e.origBorderColor,e.forEachObject(function(e){e.borderColor=e.origBorderColor,delete e.origBorderColor})}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(e,t,n){return this.loadFromJSON(e,t,n)},loadFromJSON:function(e,t,n){if(!e)return;var r=typeof e=="string"?JSON.parse(e):e;this.clear();var i=this;return this._enlivenObjects(r.objects,function(){i._setBgOverlay(r,t)},n),this},_setBgOverlay:function(e,t){var n=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!e.backgroundImage&&!e.overlayImage&&!e.background&&!e.overlay){t&&t();return}var i=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(n.renderAll(),t&&t())};this.__setBgOverlay("backgroundImage",e.backgroundImage,r,i),this.__setBgOverlay("overlayImage",e.overlayImage,r,i),this.__setBgOverlay("backgroundColor",e.background,r,i),this.__setBgOverlay("overlayColor",e.overlay,r,i),i()},__setBgOverlay:function(e,t,n,r){var i=this;if(!t){n[e]=!0;return}e==="backgroundImage"||e==="overlayImage"?fabric.Image.fromObject(t,function(t){i[e]=t,n[e]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(e,!0)](t,function(){n[e]=!0,r&&r()})},_enlivenObjects:function(e,t,n){var r=this;e.length===0&&t&&t();var i=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(e,function(e){e.forEach(function(e,t){r.insertAt(e,t,!0)}),r.renderOnAddRemove=i,t&&t()},null,n)},_toDataURL:function(e,t){this.clone(function(n){t(n.toDataURL(e))})},_toDataURLWithMultiplier:function(e,t,n){this.clone(function(r){n(r.toDataURLWithMultiplier(e,t))})},clone:function(e,t){var n=JSON.stringify(this.toJSON(t));this.cloneWithoutData(function(t){t.loadFromJSON(n,function(){e&&e(t)})})},cloneWithoutData:function(e){var t=fabric.document.createElement("canvas");t.width=this.getWidth(),t.height=this.getHeight();var n=new fabric.Canvas(t);n.clipTo=this.clipTo,this.backgroundImage?(n.setBackgroundImage(this.backgroundImage.src,function(){n.renderAll(),e&&e(n)}),n.backgroundImageOpacity=this.backgroundImageOpacity,n.backgroundImageStretch=this.backgroundImageStretch):e&&e(n)}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.toFixed,i=t.util.string.capitalize,s=t.util.degreesToRadians,o=t.StaticCanvas.supports("setLineDash");if(t.Object)return;t.Object=t.util.createClass({type:"object",originX:"left",originY:"top",top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,opacity:1,angle:0,cornerSize:12,transparentCorners:!0,hoverCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"source-over",backgroundColor:"",stroke:null,strokeWidth:1,strokeDashArray:null,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:10,shadow:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,transformMatrix:null,minScaleLimit:.01,selectable:!0,evented:!0,visible:!0,hasControls:!0,hasBorders:!0,hasRotatingPoint:!0,rotatingPointOffset:40,perPixelTargetFind:!1,includeDefaultValues:!0,clipTo:null,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockUniScaling:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule shadow clipTo visible backgroundColor".split(" "),initialize:function(e){e&&this.setOptions(e)},_initGradient:function(e){e.fill&&e.fill.colorStops&&!(e.fill instanceof t.Gradient)&&this.set("fill",new t.Gradient(e.fill))},_initPattern:function(e){e.fill&&e.fill.source&&!(e.fill instanceof t.Pattern)&&this.set("fill",new t.Pattern(e.fill)),e.stroke&&e.stroke.source&&!(e.stroke instanceof t.Pattern)&&this.set("stroke",new t.Pattern(e.stroke))},_initClipping:function(e){if(!e.clipTo||typeof e.clipTo!="string")return;var n=t.util.getFunctionBody(e.clipTo);typeof n!="undefined"&&(this.clipTo=new Function("ctx",n))},setOptions:function(e){for(var t in e)this.set(t,e[t]);this._initGradient(e),this._initPattern(e),this._initClipping(e)},transform:function(e,t){e.globalAlpha=this.opacity;var n=t?this._getLeftTopCoords():this.getCenterPoint();e.translate(n.x,n.y),e.rotate(s(this.angle)),e.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(e){var n=t.Object.NUM_FRACTION_DIGITS,i={type:this.type,originX:this.originX,originY:this.originY,left:r(this.left,n),top:r(this.top,n),width:r(this.width,n),height:r(this.height,n),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:r(this.strokeWidth,n),strokeDashArray:this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:r(this.strokeMiterLimit,n),scaleX:r(this.scaleX,n),scaleY:r(this.scaleY,n),angle:r(this.getAngle(),n),flipX:this.flipX,flipY:this.flipY,opacity:r(this.opacity,n),shadow:this.shadow&&this.shadow.toObject?this.shadow.toObject():this.shadow,visible:this.visible,clipTo:this.clipTo&&String(this.clipTo),backgroundColor:this.backgroundColor};return this.includeDefaultValues||(i=this._removeDefaultValues(i)),t.util.populateWithProperties(this,i,e),i},toDatalessObject:function(e){return this.toObject(e)},_removeDefaultValues:function(e){var n=t.util.getKlass(e.type).prototype,r=n.stateProperties;return r.forEach(function(t){e[t]===n[t]&&delete e[t]}),e},toString:function(){return"#"},get:function(e){return this[e]},set:function(e,t){if(typeof e=="object")for(var n in e)this._set(n,e[n]);else typeof t=="function"&&e!=="clipTo"?this._set(e,t(this.get(e))):this._set(e,t);return this},_set:function(e,n){var i=e==="scaleX"||e==="scaleY";return i&&(n=this._constrainScale(n)),e==="scaleX"&&n<0?(this.flipX=!this.flipX,n*=-1):e==="scaleY"&&n<0?(this.flipY=!this.flipY,n*=-1):e==="width"||e==="height"?this.minScaleLimit=r(Math.min(.1,1/Math.max(this.width,this.height)),2):e==="shadow"&&n&&!(n instanceof t.Shadow)&&(n=new t.Shadow(n)),this[e]=n,this},toggle:function(e){var t=this.get(e);return typeof t=="boolean"&&this.set(e,!t),this},setSourcePath:function(e){return this.sourcePath=e,this},render:function(e,n){if(this.width===0||this.height===0||!this.visible)return;e.save(),this._transform(e,n),this._setStrokeStyles(e),this._setFillStyles(e);var r=this.transformMatrix;r&&this.group&&(e.translate(-this.group.width/2,-this.group.height/2),e.transform(r[0],r[1],r[2],r[3],r[4],r[5])),this._setShadow(e),this.clipTo&&t.util.clipContext(this,e),this._render(e,n),this.clipTo&&e.restore(),this._removeShadow(e),this.active&&!n&&(this.drawBorders(e),this.drawControls(e)),e.restore()},_transform:function(e,t){var n=this.transformMatrix;n&&!this.group&&e.setTransform(n[0],n[1],n[2],n[3],n[4],n[5]),t||this.transform(e)},_setStrokeStyles:function(e){this.stroke&&(e.lineWidth=this.strokeWidth,e.lineCap=this.strokeLineCap,e.lineJoin=this.strokeLineJoin,e.miterLimit=this.strokeMiterLimit,e.strokeStyle=this.stroke.toLive?this.stroke.toLive(e):this.stroke)},_setFillStyles:function(e){this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e):this.fill)},_setShadow:function(e){if(!this.shadow)return;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_removeShadow:function(e){e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0},_renderFill:function(e){if(!this.fill)return;this.fill.toLive&&(e.save(),e.translate(-this.width/2+this.fill.offsetX||0,-this.height/2+this.fill.offsetY||0)),e.fill(),this.fill.toLive&&e.restore(),this.shadow&&!this.shadow.affectStroke&&this._removeShadow(e)},_renderStroke:function(e){if(!this.stroke)return;e.save(),this.strokeDashArray?(1&this.strokeDashArray.length&&this.strokeDashArray.push.apply(this.strokeDashArray,this.strokeDashArray),o?(e.setLineDash(this.strokeDashArray),this._stroke&&this._stroke(e)):this._renderDashedStroke&&this._renderDashedStroke(e),e.stroke()):this._stroke?this._stroke(e):e.stroke(),this._removeShadow(e),e.restore()},clone:function(e,n){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(n),e):new t.Object(this.toObject(n))},cloneAsImage:function(e){var n=this.toDataURL();return t.util.loadImage(n,function(n){e&&e(new t.Image(n))}),this},toDataURL:function(e){e||(e={});var n=t.util.createCanvasElement(),r=this.getBoundingRect();n.width=r.width,n.height=r.height,t.util.wrapElement(n,"div");var i=new t.Canvas(n);e.format==="jpg"&&(e.format="jpeg"),e.format==="jpeg"&&(i.backgroundColor="#fff");var s={active:this.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new t.Point(n.width/2,n.height/2),"center","center");var o=this.canvas;i.add(this);var u=i.toDataURL(e);return this.set(s).setCoords(),this.canvas=o,i.dispose(),i=null,u},isType:function(e){return this.type===e},complexity:function(){return 0},toJSON:function(e){return this.toObject(e)},setGradient:function(e,n){n||(n={});var r={colorStops:[]};r.type=n.type||(n.r1||n.r2?"radial":"linear"),r.coords={x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2};if(n.r1||n.r2)r.coords.r1=n.r1,r.coords.r2=n.r2;for(var i in n.colorStops){var s=new t.Color(n.colorStops[i]);r.colorStops.push({offset:i,color:s.toRgb(),opacity:s.getAlpha()})}return this.set(e,t.Gradient.forObject(this,r))},setPatternFill:function(e){return this.set("fill",new t.Pattern(e))},setShadow:function(e){return this.set("shadow",new t.Shadow(e))},setColor:function(e){return this.set("fill",e),this},centerH:function(){return this.canvas.centerObjectH(this),this},centerV:function(){return this.canvas.centerObjectV(this),this},center:function(){return this.canvas.centerObject(this),this},remove:function(){return this.canvas.remove(this)},getLocalPointer:function(e,t){t=t||this.canvas.getPointer(e);var n=this.translateToOriginPoint(this.getCenterPoint(),"left","top");return{x:t.x-n.x,y:t.y-n.y}}}),t.util.createAccessors(t.Object),t.Object.prototype.rotate=t.Object.prototype.setAngle,n(t.Object.prototype,t.Observable),t.Object.NUM_FRACTION_DIGITS=2,t.Object.__uid=0}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{translateToCenterPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x+(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x-(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y+(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y-(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},translateToOriginPoint:function(t,n,r){var i=t.x,s=t.y,o=this.stroke?this.strokeWidth:0;return n==="left"?i=t.x-(this.getWidth()+o*this.scaleX)/2:n==="right"&&(i=t.x+(this.getWidth()+o*this.scaleX)/2),r==="top"?s=t.y-(this.getHeight()+o*this.scaleY)/2:r==="bottom"&&(s=t.y+(this.getHeight()+o*this.scaleY)/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},getCenterPoint:function(){var e=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(e,this.originX,this.originY)},getPointByOrigin:function(e,t){var n=this.getCenterPoint();return this.translateToOriginPoint(n,e,t)},toLocalPoint:function(t,n,r){var i=this.getCenterPoint(),s=this.stroke?this.strokeWidth:0,o,u;return n&&r?(n==="left"?o=i.x-(this.getWidth()+s*this.scaleX)/2:n==="right"?o=i.x+(this.getWidth()+s*this.scaleX)/2:o=i.x,r==="top"?u=i.y-(this.getHeight()+s*this.scaleY)/2:r==="bottom"?u=i.y+(this.getHeight()+s*this.scaleY)/2:u=i.y):(o=this.left,u=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(o,u))},setPositionByOrigin:function(e,t,n){var r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",i.x),this.set("top",i.y)},adjustPosition:function(t){var n=e(this.angle),r=this.getWidth()/2,i=Math.cos(n)*r,s=Math.sin(n)*r,o=this.getWidth(),u=Math.cos(n)*o,a=Math.sin(n)*o;this.originX==="center"&&t==="left"||this.originX==="right"&&t==="center"?(this.left-=i,this.top-=s):this.originX==="left"&&t==="center"||this.originX==="center"&&t==="right"?(this.left+=i,this.top+=s):this.originX==="left"&&t==="right"?(this.left+=u,this.top+=a):this.originX==="right"&&t==="left"&&(this.left-=u,this.top-=a),this.setCoords(),this.originX=t},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","center")}})}(),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,intersectsWithRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y),o=new fabric.Point(n.br.x,n.br.y),u=fabric.Intersection.intersectPolygonRectangle([r,i,o,s],e,t);return u.status==="Intersection"},intersectsWithObject:function(e){function t(e){return{tl:new fabric.Point(e.tl.x,e.tl.y),tr:new fabric.Point(e.tr.x,e.tr.y),bl:new fabric.Point(e.bl.x,e.bl.y),br:new fabric.Point(e.br.x,e.br.y)}}var n=t(this.oCoords),r=t(e.oCoords),i=fabric.Intersection.intersectPolygonPolygon([n.tl,n.tr,n.br,n.bl],[r.tl,r.tr,r.br,r.bl]);return i.status==="Intersection"},isContainedWithinObject:function(e){var t=e.getBoundingRect(),n=new fabric.Point(t.left,t.top),r=new fabric.Point(t.left+t.width,t.top+t.height);return this.isContainedWithinRect(n,r)},isContainedWithinRect:function(e,t){var n=this.getBoundingRect();return n.left>e.x&&n.left+n.widthe.y&&n.top+n.height=e.y&&f.d.y>=e.y)continue;f.o.x===f.d.x&&f.o.x>=e.x?(o=f.o.x,u=e.y):(n=0,r=(f.d.y-f.o.y)/(f.d.x-f.o.x),i=e.y-n*e.x,s=f.o.y-r*f.o.x,o=-(i-s)/(n-r),u=i+n*o),o>=e.x&&(a+=1);if(a===2)break}return a},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(){this.oCoords||this.setCoords();var e=[this.oCoords.tl.x,this.oCoords.tr.x,this.oCoords.br.x,this.oCoords.bl.x],t=fabric.util.array.min(e),n=fabric.util.array.max(e),r=Math.abs(t-n),i=[this.oCoords.tl.y,this.oCoords.tr.y,this.oCoords.br.y,this.oCoords.bl.y],s=fabric.util.array.min(i),o=fabric.util.array.max(i),u=Math.abs(s-o);return{left:t,top:s,width:r,height:u}},getWidth:function(){return this.width*this.scaleX},getHeight:function(){return this.height*this.scaleY},_constrainScale:function(e){return Math.abs(e)1?this.strokeWidth:0,n=this.padding,r=e(this.angle);this.currentWidth=(this.width+t)*this.scaleX+n*2,this.currentHeight=(this.height+t)*this.scaleY+n*2,this.currentWidth<0&&(this.currentWidth=Math.abs(this.currentWidth));var i=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2)),s=Math.atan(isFinite(this.currentHeight/this.currentWidth)?this.currentHeight/this.currentWidth:0),o=Math.cos(s+r)*i,u=Math.sin(s+r)*i,a=Math.sin(r),f=Math.cos(r),l=this.getCenterPoint(),c={x:l.x-o,y:l.y-u},h={x:c.x+this.currentWidth*f,y:c.y+this.currentWidth*a},p={x:h.x-this.currentHeight*a,y:h.y+this.currentHeight*f},d={x:c.x-this.currentHeight*a,y:c.y+this.currentHeight*f},v={x:c.x-this.currentHeight/2*a,y:c.y+this.currentHeight/2*f},m={x:c.x+this.currentWidth/2*f,y:c.y+this.currentWidth/2*a},g={x:h.x-this.currentHeight/2*a,y:h.y+this.currentHeight/2*f},y={x:d.x+this.currentWidth/2*f,y:d.y+this.currentWidth/2*a},b={x:m.x,y:m.y};return this.oCoords={tl:c,tr:h,br:p,bl:d,ml:v,mt:m,mr:g,mb:y,mtr:b},this._setCornerCoords&&this._setCornerCoords(),this}})}(),fabric.util.object.extend(fabric.Object.prototype,{sendToBack:function(){return this.group?fabric.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?fabric.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(e){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,e):this.canvas.sendBackwards(this,e),this},bringForward:function(e){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,e):this.canvas.bringForward(this,e),this},moveTo:function(e){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,e):this.canvas.moveTo(this,e),this}}),fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(){var e=this.fill?this.fill.toLive?"url(#SVGID_"+this.fill.id+")":this.fill:"none",t=this.stroke?this.stroke.toLive?"url(#SVGID_"+this.stroke.id+")":this.stroke:"none",n=this.strokeWidth?this.strokeWidth:"0",r=this.strokeDashArray?this.strokeDashArray.join(" "):"",i=this.strokeLineCap?this.strokeLineCap:"butt",s=this.strokeLineJoin?this.strokeLineJoin:"miter",o=this.strokeMiterLimit?this.strokeMiterLimit:"4",u=typeof this.opacity!="undefined"?this.opacity:"1",a=this.visible?"":" visibility: hidden;",f=this.shadow&&this.type!=="text"?"filter: url(#SVGID_"+this.shadow.id+");":"";return["stroke: ",t,"; ","stroke-width: ",n,"; ","stroke-dasharray: ",r,"; ","stroke-linecap: ",i,"; ","stroke-linejoin: ",s,"; ","stroke-miterlimit: ",o,"; ","fill: ",e,"; ","opacity: ",u,";",f,a].join("")},getSvgTransform:function(){var e=fabric.util.toFixed,t=this.getAngle(),n=this.getCenterPoint(),r=fabric.Object.NUM_FRACTION_DIGITS,i="translate("+e(n.x,r)+" "+e(n.y,r)+")",s=t!==0?" rotate("+e(t,r)+")":"",o=this.scaleX===1&&this.scaleY===1?"":" scale("+e(this.scaleX,r)+" "+e(this.scaleY,r)+")",u=this.flipX?"matrix(-1 0 0 1 0 0) ":"",a=this.flipY?"matrix(1 0 0 -1 0 0)":"";return[i,s,o,u,a].join("")},_createBaseSVGMarkup:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),this.shadow&&e.push(this.shadow.toSVG(this)),e}}),fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(){return this.stateProperties.some(function(e){return this.get(e)!==this.originalState[e]},this)},saveState:function(e){return this.stateProperties.forEach(function(e){this.originalState[e]=this. +get(e)},this),e&&e.stateProperties&&e.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),this},setupState:function(){return this.originalState={},this.saveState(),this}}),function(){var e=fabric.util.getPointer,t=fabric.util.degreesToRadians,n=typeof G_vmlCanvasManager!="undefined";fabric.util.object.extend(fabric.Object.prototype,{_controlsVisibility:null,_findTargetCorner:function(t,n){if(!this.hasControls||!this.active)return!1;var r=e(t,this.canvas.upperCanvasEl),i=r.x-n.left,s=r.y-n.top,o,u;for(var a in this.oCoords){if(!this.isControlVisible(a))continue;if(a==="mtr"&&!this.hasRotatingPoint)continue;if(!(!this.get("lockUniScaling")||a!=="mt"&&a!=="mr"&&a!=="mb"&&a!=="ml"))continue;u=this._getImageLines(this.oCoords[a].corner),o=this._findCrossPoints({x:i,y:s},u);if(o!==0&&o%2===1)return this.__corner=a,a}return!1},_setCornerCoords:function(){var e=this.oCoords,n=t(this.angle),r=t(45-this.angle),i=Math.sqrt(2*Math.pow(this.cornerSize,2))/2,s=i*Math.cos(r),o=i*Math.sin(r),u=Math.sin(n),a=Math.cos(n);e.tl.corner={tl:{x:e.tl.x-o,y:e.tl.y-s},tr:{x:e.tl.x+s,y:e.tl.y-o},bl:{x:e.tl.x-s,y:e.tl.y+o},br:{x:e.tl.x+o,y:e.tl.y+s}},e.tr.corner={tl:{x:e.tr.x-o,y:e.tr.y-s},tr:{x:e.tr.x+s,y:e.tr.y-o},br:{x:e.tr.x+o,y:e.tr.y+s},bl:{x:e.tr.x-s,y:e.tr.y+o}},e.bl.corner={tl:{x:e.bl.x-o,y:e.bl.y-s},bl:{x:e.bl.x-s,y:e.bl.y+o},br:{x:e.bl.x+o,y:e.bl.y+s},tr:{x:e.bl.x+s,y:e.bl.y-o}},e.br.corner={tr:{x:e.br.x+s,y:e.br.y-o},bl:{x:e.br.x-s,y:e.br.y+o},br:{x:e.br.x+o,y:e.br.y+s},tl:{x:e.br.x-o,y:e.br.y-s}},e.ml.corner={tl:{x:e.ml.x-o,y:e.ml.y-s},tr:{x:e.ml.x+s,y:e.ml.y-o},bl:{x:e.ml.x-s,y:e.ml.y+o},br:{x:e.ml.x+o,y:e.ml.y+s}},e.mt.corner={tl:{x:e.mt.x-o,y:e.mt.y-s},tr:{x:e.mt.x+s,y:e.mt.y-o},bl:{x:e.mt.x-s,y:e.mt.y+o},br:{x:e.mt.x+o,y:e.mt.y+s}},e.mr.corner={tl:{x:e.mr.x-o,y:e.mr.y-s},tr:{x:e.mr.x+s,y:e.mr.y-o},bl:{x:e.mr.x-s,y:e.mr.y+o},br:{x:e.mr.x+o,y:e.mr.y+s}},e.mb.corner={tl:{x:e.mb.x-o,y:e.mb.y-s},tr:{x:e.mb.x+s,y:e.mb.y-o},bl:{x:e.mb.x-s,y:e.mb.y+o},br:{x:e.mb.x+o,y:e.mb.y+s}},e.mtr.corner={tl:{x:e.mtr.x-o+u*this.rotatingPointOffset,y:e.mtr.y-s-a*this.rotatingPointOffset},tr:{x:e.mtr.x+s+u*this.rotatingPointOffset,y:e.mtr.y-o-a*this.rotatingPointOffset},bl:{x:e.mtr.x-s+u*this.rotatingPointOffset,y:e.mtr.y+o-a*this.rotatingPointOffset},br:{x:e.mtr.x+o+u*this.rotatingPointOffset,y:e.mtr.y+s-a*this.rotatingPointOffset}}},drawBorders:function(e){if(!this.hasBorders)return this;var t=this.padding,n=t*2,r=~~(this.strokeWidth/2)*2;e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=this.borderColor;var i=1/this._constrainScale(this.scaleX),s=1/this._constrainScale(this.scaleY);e.lineWidth=1/this.borderScaleFactor,e.scale(i,s);var o=this.getWidth(),u=this.getHeight();e.strokeRect(~~(-(o/2)-t-r/2*this.scaleX)-.5,~~(-(u/2)-t-r/2*this.scaleY)-.5,~~(o+n+r*this.scaleX)+1,~~(u+n+r*this.scaleY)+1);if(this.hasRotatingPoint&&this.isControlVisible("mtr")&&!this.get("lockRotation")&&this.hasControls){var a=(this.flipY?u+r*this.scaleY+t*2:-u-r*this.scaleY-t*2)/2;e.beginPath(),e.moveTo(0,a),e.lineTo(0,a+(this.flipY?this.rotatingPointOffset:-this.rotatingPointOffset)),e.closePath(),e.stroke()}return e.restore(),this},drawControls:function(e){if(!this.hasControls)return this;var t=this.cornerSize,n=t/2,r=~~(this.strokeWidth/2),i=-(this.width/2),s=-(this.height/2),o=this.padding/this.scaleX,u=this.padding/this.scaleY,a=n/this.scaleY,f=n/this.scaleX,l=(n-t)/this.scaleX,c=(n-t)/this.scaleY,h=this.height,p=this.width,d=this.transparentCorners?"strokeRect":"fillRect";return e.save(),e.lineWidth=1/Math.max(this.scaleX,this.scaleY),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=e.fillStyle=this.cornerColor,this._drawControl("tl",e,d,i-f-r-o,s-a-r-u),this._drawControl("tr",e,d,i+p-f+r+o,s-a-r-u),this._drawControl("tr",e,d,i-f-r-o,s+h+c+r+u),this._drawControl("br",e,d,i+p+l+r+o,s+h+c+r+u),this.get("lockUniScaling")||(this._drawControl("mt",e,d,i+p/2-f,s-a-r-u),this._drawControl("mb",e,d,i+p/2-f,s+h+c+r+u),this._drawControl("mb",e,d,i+p+l+r+o,s+h/2-a),this._drawControl("ml",e,d,i-f-r-o,s+h/2-a)),this.hasRotatingPoint&&this._drawControl("mtr",e,d,i+p/2-f,this.flipY?s+h+this.rotatingPointOffset/this.scaleY-this.cornerSize/this.scaleX/2+r+u:s-this.rotatingPointOffset/this.scaleY-this.cornerSize/this.scaleY/2-r-u),e.restore(),this},_drawControl:function(e,t,r,i,s){var o=this.cornerSize/this.scaleX,u=this.cornerSize/this.scaleY;this.isControlVisible(e)&&(n||this.transparentCorners||t.clearRect(i,s,o,u),t[r](i,s,o,u))},isControlVisible:function(e){return this._getControlsVisibility()[e]},setControlVisible:function(e,t){return this._getControlsVisibility()[e]=t,this},setControlsVisibility:function(e){e||(e={});for(var t in e)this.setControlVisible(t,e[t]);return this},_getControlsVisibility:function(){return this._controlsVisibility||(this._controlsVisibility={tl:!0,tr:!0,br:!0,bl:!0,ml:!0,mt:!0,mr:!0,mb:!0,mtr:!0}),this._controlsVisibility}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{FX_DURATION:500,fxCenterObjectH:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("left"),endValue:this.getCenter().left,duration:this.FX_DURATION,onChange:function(t){e.set("left",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxCenterObjectV:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("top"),endValue:this.getCenter().top,duration:this.FX_DURATION,onChange:function(t){e.set("top",t),s.renderAll(),i()},onComplete:function(){e.setCoords(),r()}}),this},fxRemove:function(e,t){t=t||{};var n=function(){},r=t.onComplete||n,i=t.onChange||n,s=this;return fabric.util.animate({startValue:e.get("opacity"),endValue:0,duration:this.FX_DURATION,onStart:function(){e.set("active",!1)},onChange:function(t){e.set("opacity",t),s.renderAll(),i()},onComplete:function(){s.remove(e),r()}}),this}}),fabric.util.object.extend(fabric.Object.prototype,{animate:function(){if(arguments[0]&&typeof arguments[0]=="object"){var e=[],t,n;for(t in arguments[0])e.push(t);for(var r=0,i=e.length;r'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Line.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),t.Line.fromElement=function(e,r){var i=t.parseAttributes(e,t.Line.ATTRIBUTE_NAMES),s=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new t.Line(s,n(i,r))},t.Line.fromObject=function(e){var n=[e.x1,e.y1,e.x2,e.y2];return new t.Line(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return"radius"in e&&e.radius>0}var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Circle){t.warn("fabric.Circle is already defined.");return}t.Circle=t.util.createClass(t.Object,{type:"circle",initialize:function(e){e=e||{},this.set("radius",e.radius||0),this.callSuper("initialize",e)},_set:function(e,t){return this.callSuper("_set",e,t),e==="radius"&&this.setRadius(t),this},toObject:function(e){return r(this.callSuper("toObject",e),{radius:this.get("radius")})},toSVG:function(e){var t=this._createBaseSVGMarkup();return t.push("'),e?e(t.join("")):t.join("")},_render:function(e,t){e.beginPath(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,e.arc(t?this.left:0,t?this.top:0,this.radius,0,n,!1),e.closePath(),this._renderFill(e),this._renderStroke(e)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(e){this.radius=e,this.set("width",e*2).set("height",e*2)},complexity:function(){return 1}}),t.Circle.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),t.Circle.fromElement=function(e,n){n||(n={});var s=t.parseAttributes(e,t.Circle.ATTRIBUTE_NAMES);if(!i(s))throw new Error("value of `r` attribute is required and can not be negative");"left"in s&&(s.left-=n.width/2||0),"top"in s&&(s.top-=n.height/2||0);var o=new t.Circle(r(s,n));return o.cx=parseFloat(e.getAttribute("cx"))||0,o.cy=parseFloat(e.getAttribute("cy"))||0,o},t.Circle.fromObject=function(e){return new t.Circle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Triangle){t.warn("fabric.Triangle is already defined");return}t.Triangle=t.util.createClass(t.Object,{type:"triangle",initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("width",e.width||100).set("height",e.height||100)},_render:function(e){var t=this.width/2,n=this.height/2;e.beginPath(),e.moveTo(-t,n),e.lineTo(0,-n),e.lineTo(t,n),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=this.width/2,r=this.height/2;e.beginPath(),t.util.drawDashedLine(e,-n,r,0,-r,this.strokeDashArray),t.util.drawDashedLine(e,0,-r,n,r,this.strokeDashArray),t.util.drawDashedLine(e,n,r,-n,r,this.strokeDashArray),e.closePath()},toSVG:function(e){var t=this._createBaseSVGMarkup(),n=this.width/2,r=this.height/2,i=[-n+" "+r,"0 "+ -r,n+" "+r].join(",");return t.push("'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Triangle.fromObject=function(e){return new t.Triangle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Ellipse){t.warn("fabric.Ellipse is already defined.");return}t.Ellipse=t.util.createClass(t.Object,{type:"ellipse",rx:0,ry:0,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("rx",e.rx||0),this.set("ry",e.ry||0),this.set("width",this.get("rx")*2),this.set("height",this.get("ry")*2)},toObject:function(e){return r(this.callSuper("toObject",e),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(e){var t=this._createBaseSVGMarkup();return t.push("'),e?e(t.join("")):t.join("")},render:function(e,t){if(this.rx===0||this.ry===0)return;return this.callSuper("render",e,t)},_render:function(e,t){e.beginPath(),e.save(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&this.group&&e.translate(this.cx,this.cy),e.transform(1,0,0,this.ry/this.rx,0,0),e.arc(t?this.left:0,t?this.top:0,this.rx,0,n,!1),this._renderFill(e),this._renderStroke(e),e.restore()},complexity:function(){return 1}}),t.Ellipse.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),t.Ellipse.fromElement=function(e,n){n||(n={});var i=t.parseAttributes(e,t.Ellipse.ATTRIBUTE_NAMES),s=i.left,o=i.top;"left"in i&&(i.left-=n.width/2||0),"top"in i&&(i.top-=n.height/2||0);var u=new t.Ellipse(r(i,n));return u.cx=s||0,u.cy=o||0,u},t.Ellipse.fromObject=function(e){return new t.Ellipse(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return e.left=e.left||0,e.top=e.top||0,e}var t=e.fabric||(e.fabric={}),n=t.util.object.extend;if(t.Rect){console.warn("fabric.Rect is already defined");return}var r=t.Object.prototype.stateProperties.concat();r.push("rx","ry","x","y"),t.Rect=t.util.createClass(t.Object,{stateProperties:r,type:"rect",rx:0,ry:0,x:0,y:0,strokeDashArray:null,initialize:function(e){e=e||{},this.callSuper("initialize",e),this._initRxRy(),this.x=e.x||0,this.y=e.y||0},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(e){var t=this.rx||0,n=this.ry||0,r=-this.width/2,i=-this.height/2,s=this.width,o=this.height,u=this.group&&this.group.type==="path-group";e.beginPath(),e.globalAlpha=u?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&u&&e.translate(this.width/2+this.x,this.height/2+this.y),!this.transformMatrix&&u&&e.translate(-this.group.width/2+this.width/2+this.x,-this.group.height/2+this.height/2+this.y);var a=t!==0||n!==0;e.moveTo(r+t,i),e.lineTo(r+s-t,i),a&&e.quadraticCurveTo(r+s,i,r+s,i+n,r+s,i+n),e.lineTo(r+s,i+o-n),a&&e.quadraticCurveTo(r+s,i+o,r+s-t,i+o,r+s-t,i+o),e.lineTo(r+t,i+o),a&&e.quadraticCurveTo(r,i+o,r,i+o-n,r,i+o-n),e.lineTo(r,i+n),a&&e.quadraticCurveTo(r,i,r+t,i,r+t,i),e.closePath(),this._renderFill(e),this._renderStroke(e)},_renderDashedStroke:function(e){var n=-this.width/2,r=-this.height/2,i=this.width,s=this.height;e.beginPath(),t.util.drawDashedLine(e,n,r,n+i,r,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r,n+i,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n+i,r+s,n,r+s,this.strokeDashArray),t.util.drawDashedLine(e,n,r+s,n,r,this.strokeDashArray),e.closePath()},_normalizeLeftTopProperties:function(e){return"left"in e&&this.set("left",e.left+this.getWidth()/2),this.set("x",e.left||0),"top"in e&&this.set("top",e.top+this.getHeight()/2),this.set("y",e.top||0),this},toObject:function(e){var t=n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0,x:this.get("x"),y:this.get("y")});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=this._createBaseSVGMarkup();return t.push("'),e?e(t.join("")):t.join("")},complexity:function(){return 1}}),t.Rect.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),t.Rect.fromElement=function(e,r){if(!e)return null;var s=t.parseAttributes(e,t.Rect.ATTRIBUTE_NAMES);s=i(s);var o=new t.Rect(n(r?t.util.object.clone(r):{},s));return o._normalizeLeftTopProperties(s),o},t.Rect.fromObject=function(e){return new t.Rect(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.toFixed;if(t.Polyline){t.warn("fabric.Polyline is already defined");return}t.Polyline=t.util.createClass(t.Object,{type:"polyline",initialize:function(e,t,n){t=t||{},this.set("points",e),this.callSuper("initialize",t),this._calcDimensions(n)},_calcDimensions:function(e){return t.Polygon.prototype._calcDimensions.call(this,e)},toObject:function(e){return t.Polygon.prototype.toObject.call(this,e)},toSVG:function(e){var t=[],r=this._createBaseSVGMarkup();for(var i=0,s=this.points.length;i'),e?e(r.join("")):r.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n'),e?e(n.join("")):n.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n"},toObject:function(e){var t=s(this.callSuper("toObject",e),{path:this.path,pathOffset:this.pathOffset});return this.sourcePath&&(t.sourcePath=this.sourcePath),this.transformMatrix&&(t.transformMatrix=this.transformMatrix),t},toDatalessObject:function(e){var t=this.toObject(e);return this.sourcePath&&(t.path=this.sourcePath),delete t.sourcePath,t},toSVG:function(e){var t=[],n=this._createBaseSVGMarkup();for(var r=0,i=this.path.length;r',"",""),e?e(n.join("")):n.join("")},complexity:function(){return this.path.length},_parsePath:function(){var e=[],n=[],r,i,s=/(-?\.\d+)|(-?\d+(\.\d+)?)/g,o,u;for(var a=0,f,l=this.path.length;ad)for(var v=1,m=f.length;v"];for(var r=0,i=t.length;r"),e?e(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var e=this.getObjects()[0].get("fill");return this.getObjects().every(function(t){return t.get("fill")===e})},complexity:function(){return this.paths.reduce(function(e,t){return e+(t&&t.complexity?t.complexity():0)},0)},getObjects:function(){return this.paths}}),t.PathGroup.fromObject=function(e,n){typeof e.paths=="string"?t.loadSVGFromURL(e.paths,function(r){var i=e.paths;delete e.paths;var s=t.util.groupSVGElements(r,e,i);n(s)}):t.util.enlivenObjects(e.paths,function(r){delete e.paths,n(new t.PathGroup(r,e))})},t.PathGroup.async=!0}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.array.min,i=t.util.array.max,s=t.util.array.invoke;if(t.Group)return;var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};t.Group=t.util.createClass(t.Object,t.Collection,{type:"group",initialize:function(e,t){t=t||{},this._objects=e||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},this.callSuper("initialize"),this._calcBounds(),this._updateObjectsCoords(),t&&n(this,t),this._setOpacityIfSame(),this.setCoords(!0),this.saveCoords()},_updateObjectsCoords:function(){this.forEachObject(this._updateObjectCoords,this)},_updateObjectCoords:function(e){var t=e.getLeft(),n=e.getTop();e.set({originalLeft:t,originalTop:n,left:t-this.left,top:n-this.top}),e.setCoords(),e.__origHasControls=e.hasControls,e.hasControls=!1},toString:function(){return"#"},addWithUpdate:function(e){return this._restoreObjectsState(),this._objects.push(e),e.group=this,this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this},_setObjectActive:function(e){e.set("active",!0),e.group=this},removeWithUpdate:function(e){return this._moveFlippedObject(e),this._restoreObjectsState(),this.forEachObject(this._setObjectActive,this),this.remove(e),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(e){e.group=this},_onObjectRemoved:function(e){delete e.group,e.set("active",!1)},delegatedProperties:{fill:!0,opacity:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(e,t){if(e in this.delegatedProperties){var n=this._objects.length;this[e]=t;while(n--)this._objects[n].set(e,t)}else this[e]=t},toObject:function(e){return n(this.callSuper("toObject",e),{objects:s(this._objects,"toObject",e)})},render:function(e,n){if(!this.visible)return;e.save(),this.transform(e),this.clipTo&&t.util.clipContext(this,e);for(var r=0,i=this._objects.length;r'];for(var n=0,r=this._objects.length;n"),e?e(t.join("")):t.join("")},get:function(e){if(e in o){if(this[e])return this[e];for(var t=0,n=this._objects.length;t','");if(this.stroke||this.strokeDashArray){var n=this.fill;this.fill=null,t.push("'),this.fill=n}return t.push(""),e?e(t.join("")):t.join("")},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(e,t){this.constructor.fromObject(this.toObject(t),e)},applyFilters:function(e){if(this.filters.length===0){this._element=this._originalElement,e&&e();return}var t=this._originalElement,n=fabric.util.createCanvasElement(),r=fabric.util.createImage(),i=this;return n.width=t.width,n.height=t.height,n.getContext("2d").drawImage(t,0,0,t.width,t.height),this.filters.forEach(function(e){e&&e.applyTo(n)}),r.width=t.width,r.height=t.height,fabric.isLikelyNode?(r.src=n.toBuffer(undefined,fabric.Image.pngCompression),i._element=r,e&&e()):(r.onload=function(){i._element=r,e&&e(),r.onload=n=t=null},r.src=n.toDataURL("image/png")),this},_render:function(e){e.drawImage(this._element,-this.width/2,-this.height/2,this.width,this.height)},_resetWidthHeight:function(){var e=this.getElement();this.set("width",e.width),this.set("height",e.height)},_initElement:function(e){this.setElement(fabric.util.getById(e)),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(e){e||(e={}),this.setOptions(e),this._setWidthHeight(e),this._element.crossOrigin=this.crossOrigin},_initFilters:function(e,t){e.filters&&e.filters.length?fabric.util.enlivenObjects(e.filters,function(e){t&&t(e)},"fabric.Image.filters"):t&&t()},_setWidthHeight:function(e){this.width="width"in e?e.width:this.getElement().width||0,this.height="height"in e?e.height:this.getElement().height||0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){fabric.Image.prototype._initFilters.call(e,e,function(r){e.filters=r||[];var i=new fabric.Image(n,e);t&&t(i)})},null,e.crossOrigin)},fabric.Image.fromURL=function(e,t,n){fabric.util.loadImage(e,function(e){t(new fabric.Image(e,n))},null,n&&n.crossOrigin)},fabric.Image.ATTRIBUTE_NAMES=fabric.SHARED_ATTRIBUTES.concat("x y width height xlink:href".split(" ")),fabric.Image.fromElement=function(e,n,r){var i=fabric.parseAttributes(e,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(i["xlink:href"],n,t(r?fabric.util.object.clone(r):{},i))},fabric.Image.async=!0,fabric.Image.pngCompression=1}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var e=this.getAngle()%360;return e>0?Math.round((e-1)/90)*90:Math.round(e/90)*90},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(e){e=e||{};var t=function(){},n=e.onComplete||t,r=e.onChange||t,i=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(e){i.setAngle(e),r()},onComplete:function(){i.setCoords(),n()},onStart:function(){i.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(e){return e.straighten(),this.renderAll(),this},fxStraightenObject:function(e){return e.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.Brightness=t.util.createClass(t.Image.filters.BaseFilter,{type:"Brightness",initialize:function(e){e=e||{},this.brightness=e.brightness||100},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.brightness;for(var s=0,o=r.length;sa||C<0||C>u)continue;var k=(N*u+C)*4,L=t[x*i+T];b+=o[k]*L,w+=o[k+1]*L,E+=o[k+2]*L,S+=o[k+3]*L}h[y]=b,h[y+1]=w,h[y+2]=E,h[y+3]=S+p*(255-S)}n.putImageData(c,0,0)},toObject:function(){return n(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),t.Image.filters.Convolute.fromObject=function(e){return new t.Image.filters.Convolute(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend;t.Image.filters.GradientTransparency=t.util.createClass(t.Image.filters.BaseFilter,{type:"GradientTransparency",initialize:function(e){e=e||{},this.threshold=e.threshold||100},applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=this.threshold,s=r.length;for(var o=0,u=r.length;o-1?e.channel:0},applyTo:function(e){if(!this.mask)return;var n=e.getContext("2d"),r=n.getImageData(0,0,e.width,e.height),i=r.data,s=this.mask.getElement(),o=t.util.createCanvasElement(),u=this.channel,a,f=r.width*r.height*4;o.width=s.width,o.height=s.height,o.getContext("2d").drawImage(s,0,0,s.width,s.height);var l=o.getContext("2d").getImageData(0,0,s.width,s.height),c=l.data;for(a=0;ao&&f>o&&l>o&&u(a-f)'},_render:function(e){var t=this.group&&this.group.type==="path-group";t&&!this.transformMatrix?e.translate(-this.group.width/2+this.left,-this.group.height/2+this.top):t&&this.transformMatrix&&e.translate(-this.group.width/2,-this.group.height/2),typeof Cufon=="undefined"||this.useNative===!0?this._renderViaNative(e):this._renderViaCufon(e)},_renderViaNative:function(e){var n=this.text.split(this._reNewline);this.transform(e,t.isLikelyNode),this._setTextStyles(e),this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this.clipTo&&t.util.clipContext(this,e),this._renderTextBackground(e,n),this._translateForTextAlign(e),this._renderText(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this.clipTo&&e.restore(),this._setBoundaries(e,n),this._totalLineHeight=0},_renderText:function(e,t){e.save(),this._setShadow(e),this._renderTextFill(e,t),this._renderTextStroke(e,t),this._removeShadow(e),e.restore()},_translateForTextAlign:function(e){this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0))},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_renderChars:function(e,t,n,r,i){t[e](n,r,i)},_renderTextLine:function(e,t,n,r,i,s){i-=this.fontSize/4;if(this.textAlign!=="justify"){this._renderChars(e,t,n,r,i,s);return}var o=t.measureText(n).width,u=this.width;if(u>o){var a=n.split(/\s+/),f=t.measureText(n.replace(/\s+/g,"")).width,l=u-f,c=a.length-1,h=l/c,p=0;for(var d=0,v=a.length;d-1&&i(this.fontSize*this.lineHeight),this.textDecoration.indexOf("line-through")>-1&&i(this.fontSize*this.lineHeight-this.fontSize/2),this.textDecoration.indexOf("overline")>-1&&i(this.fontSize*this.lineHeight-this.fontSize)},_getFontDeclaration:function(){return[t.isLikelyNode?this.fontWeight:this.fontStyle,t.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",t.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(e,t){if(!this.visible)return;e.save(),this._render(e),!t&&this.active&&(this.drawBorders(e),this.drawControls(e)),e.restore()},toObject:function(e){var t=n(this.callSuper("toObject",e),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,path:this.path,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative});return this.includeDefaultValues||this._removeDefaultValues(t),t},toSVG:function(e){var t=[],n=this.text.split(this._reNewline),r=this._getSVGLeftTopOffsets(n),i=this._getSVGTextAndBg(r.lineTop,r.textLeft,n),s=this._getSVGShadows(r.lineTop,n);return r.textTop+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,this._wrapSVGTextAndBg(t,i,s,r),e?e(t.join("")):t.join("")},_getSVGLeftTopOffsets:function(e){var t=this.useNative?this.fontSize*this.lineHeight:-this._fontAscent-this._fontAscent/5*this.lineHeight,n=-(this.width/2),r=this.useNative?this.fontSize-1:this.height/2-e.length*this.fontSize-this._totalLineHeight;return{textLeft:n,textTop:r,lineTop:t}},_wrapSVGTextAndBg:function(e,t,n,r){e.push('',t.textBgRects.join(""),"',n.join(""),t.textSpans.join(""),"","")},_getSVGShadows:function(e,n){var r=[],s,o,u=1;if(!this.shadow||!this._boundaries)return r;for(s=0,o=n.length;s",t.util.string.escapeXml(n[s]),""),u=1}else u++;return r},_getSVGTextAndBg:function(e,t,n){var r=[],i=[],s=1;this._setSVGBg(i);for(var o=0,u=n.length;o",t.util.string.escapeXml(e),"")},_setSVGTextLineBg:function(e,t,n,r){e.push("')},_setSVGBg:function(e){this.backgroundColor&&this._boundaries&&e.push("')},_getFillAttributes:function(e){var n=e&&typeof e=="string"?new t.Color(e):"";return!n||!n.getSource()||n.getAlpha()===1?'fill="'+e+'"':'opacity="'+n.getAlpha()+'" fill="'+n.setAlpha(1).toRgb()+'"'},_set:function(e,t){e==="fontFamily"&&this.path&&(this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+t+"$3")),this.callSuper("_set",e,t),e in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),t.Text.ATTRIBUTE_NAMES=t.SHARED_ATTRIBUTES.concat("x y font-family font-style font-weight font-size text-decoration".split(" ")),t.Text.fromElement=function(e,n){if(!e)return null;var r=t.parseAttributes(e,t.Text.ATTRIBUTE_NAMES);n=t.util.object.extend(n?t.util.object.clone(n):{},r);var i=new t.Text(e.textContent,n);return i.set({left:i.getLeft()+i.getWidth()/2,top:i.getTop()-i.getHeight()/2}),i},t.Text.fromObject=function(e){return new t.Text(e.text,r(e))},t.util.createAccessors(t.Text)}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Text.prototype,{_renderViaCufon:function(e){var t=Cufon.textOptions||(Cufon.textOptions={});t.left=this.left,t.top=this.top,t.context=e,t.color=this.fill;var n=this._initDummyElementForCufon();this.transform(e),Cufon.replaceElement(n,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.shadow&&this.shadow.toString(),textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,stroke:this.stroke,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor}),this.width=t.width,this.height=t.height,this._totalLineHeight=t.totalLineHeight,this._fontAscent=t.fontAscent,this._boundaries=t.boundaries,n=null,this.setCoords()},_initDummyElementForCufon:function(){var e=fabric.document.createElement("pre"),t=fabric.document.createElement("div");return t.appendChild(e),typeof G_vmlCanvasManager=="undefined"?e.innerHTML=this.text:e.innerText=this.text.replace(/\r?\n/gi,"\r"),e.style.fontSize=this.fontSize+"px",e.style.letterSpacing="normal",e}}),function(){var e=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,skipFillStrokeCheck:!0,_reSpace:/\s|\n/,_fontSizeFraction:4,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,_charWidthsCache:{},initialize:function(e,t){this.styles=t.styles||{},this.callSuper("initialize",e,t),this.initBehavior(),fabric.IText.instances.push(this),this.__lineWidths={},this.__lineHeights={},this.__lineOffsets={}},isEmptyStyles:function(){if(!this.styles)return!0;var e=this.styles;for(var t in e)for(var n in e[t])for(var r in e[t][n])return!1;return!0},setSelectionStart:function(e){this.selectionStart=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionStart=e)},setSelectionEnd:function(e){this.selectionEnd=e,this.hiddenTextarea&&(this.hiddenTextarea.selectionEnd=e)},getSelectionStyles:function(){var e=this.get2DCursorLocation();return this.styles[e.lineIndex]?this.styles[e.lineIndex][e.charIndex]||{}:{}},setSelectionStyles:function(e){if(this.selectionStart===this.selectionEnd)this._extendStyles(this.selectionStart,e);else for(var t=this.selectionStart;t-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,0),o.indexOf("line-through")>-1&&this._renderCharDecorationAtOffset(e,n,r+this.fontSize/this._fontSizeFraction,i,s/this._fontSizeFraction),o.indexOf("overline")>-1&&this._renderCharDecorationAtOffset(e,n,r,i,s-this.fontSize/this._fontSizeFraction)},_renderCharDecorationAtOffset:function(e,t,n,r,i){e.fillRect(t,n-i,r,1)},_renderTextLine:function(e,t,n,r,i,s){i+=this.fontSize/4,this.callSuper("_renderTextLine",e,t,n,r,i,s)},_renderTextDecoration:function(e,t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",e,t)},_renderTextLinesBackground:function(e,t){if(!this.textBackgroundColor&&!this.styles)return;e.save(),this.textBackgroundColor&&(e.fillStyle=this.textBackgroundColor);var n=0,r=this.fontSize/this._fontSizeFraction;for(var i=0,s=t.length;in&&(n=s)}return n},_getHeightOfLine:function(e,t,n){n=n||this.text.split(this._reNewline);var r=this._getHeightOfChar(e,n[t][0],t,0),i=n[t],s=i.split("");for(var o=1,u=s.length;or&&(r=a)}return r*this.lineHeight},_getTextHeight:function(e,t){var n=0;for(var r=0,i=t.length;r-1)t++,n--;return e-t},findWordBoundaryRight:function(e){var t=0,n=e;if(this._reSpace.test(this.text.charAt(n)))while(this._reSpace.test(this.text.charAt(n)))t++,n++;while(/\S/.test(this.text.charAt(n))&&n-1)t++,n--;return e-t},findLineBoundaryRight:function(e){var t=0,n=e;while(!/\n/.test(this.text.charAt(n))&&n0&&nr;s?this.removeStyleObject(s,n+1):this.removeStyleObject(this.get2DCursorLocation(n).charIndex===0,n)}this.text=this.text.slice(0,e)+this.text.slice(t)},insertChars:function(e){var t=this.text.slice(this.selectionStart,this.selectionStart+1)==="\n";this.text=this.text.slice(0,this.selectionStart)+e+this.text.slice(this.selectionEnd),this.selectionStart===this.selectionEnd?this.insertStyleObject(e,t):this.selectionEnd-this.selectionStart>1,this.selectionStart+=e.length,this.selectionEnd=this.selectionStart,this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("text:changed")},insertNewlineStyleObject:function(t,n,r){this.shiftLineStyles(t,1),this.styles[t+1]||(this.styles[t+1]={});var i=this.styles[t][n-1],s={};if(r)s[0]=e(i),this.styles[t+1]=s;else{for(var o in this.styles[t])parseInt(o,10)>=n&&(s[parseInt(o,10)-n]=this.styles[t][o],delete this.styles[t][o]);this.styles[t+1]=s}},insertCharStyleObject:function(t,n){var r=this.styles[t],i=e(r);n===0&&(n=1);for(var s in i){var o=parseInt(s,10);o>=n&&(r[o+1]=i[o])}this.styles[t][n]=e(r[n-1])},insertStyleObject:function(e,t){if(this.isEmptyStyles())return;var n=this.get2DCursorLocation(),r=n.lineIndex,i=n.charIndex;this.styles[r]||(this.styles[r]={}),e==="\n"?this.insertNewlineStyleObject(r,i,t):this.insertCharStyleObject(r,i)},shiftLineStyles:function(t,n){var r=e(this.styles);for(var i in this.styles){var s=parseInt(i,10);s>t&&(this.styles[s+n]=r[s])}},removeStyleObject:function(t,n){var r=this.get2DCursorLocation(n),i=r.lineIndex,s=r.charIndex;if(t){var o=this.text.split(this._reNewline),u=o[i-1],a=u.length;this.styles[i-1]||(this.styles[i-1]={});for(s in this.styles[i])this.styles[i-1][parseInt(s,10)+a]=this.styles[i][s];this.shiftLineStyles(i,-1)}else{var f=this.styles[i];if(f){var l=this.selectionStart===this.selectionEnd?-1:0;delete f[s+l]}var c=e(f);for(var h in c){var p=parseInt(h,10);p>=s&&p!==0&&(f[p-1]=c[p],delete f[p])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+(new Date),this.__lastLastClickTime=+(new Date),this.lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(e){this.__newClickTime=+(new Date);var t=this.canvas.getPointer(e.e);this.isTripleClick(t)?(this.fire("tripleclick",e),this._stopEvent(e.e)):this.isDoubleClick(t)&&(this.fire("dblclick",e),this._stopEvent(e.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=t},isDoubleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y},isTripleClick:function(e){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===e.x&&this.__lastPointer.y===e.y},_stopEvent:function(e){e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMousemoveHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(e){this.selectWord(this.getSelectionStartFromPointer(e.e))}),this.on("tripleclick",function(e){this.selectLine(this.getSelectionStartFromPointer(e.e))})},initMousedownHandler:function(){this.on("mousedown",function(e){var t=this.canvas.getPointer(e.e);this.__mousedownX=t.x,this.__mousedownY=t.y,this.__isMousedown=!0,this.hiddenTextarea&&this.canvas&&this.canvas.wrapperEl.appendChild(this.hiddenTextarea),this.isEditing?(this.setCursorByClick(e.e),this.__selectionStartOnMouseDown=this.selectionStart):this.exitEditingOnOthers()})},initMousemoveHandler:function(){this.on("mousemove",function(e){if(!this.__isMousedown||!this.isEditing)return;var t=this.getSelectionStartFromPointer(e.e);t>=this.__selectionStartOnMouseDown?(this.setSelectionStart(this.__selectionStartOnMouseDown),this.setSelectionEnd(t)):(this.setSelectionStart(t),this.setSelectionEnd(this.__selectionStartOnMouseDown))})},_isObjectMoved:function(e){var t=this.canvas.getPointer(e);return this.__mousedownX!==t.x||this.__mousedownY!==t.y},initMouseupHandler:function(){this.on("mouseup",function(e){this.__isMousedown=!1;if(this._isObjectMoved(e.e))return;this.selected&&this.enterEditing()})},setCursorByClick:function(e){var t=this.getSelectionStartFromPointer(e);e.shiftKey?ts?0:1,a=r+u;return this.flipX&&(a=i-a),a>this.text.length&&(a=this.text.length),a}}),fabric.util.object.extend(fabric.IText.prototype,{initKeyHandlers:function(){fabric.util.addListener(fabric.document,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(fabric.document,"keypress",this.onKeyPress.bind(this))},initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.style.cssText="position: absolute; top: 0; left: -9999px",fabric.document.body.appendChild(this.hiddenTextarea)},_keysMap:{8:"removeChars",13:"insertNewline",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMap:{65:"selectAll",67:"copy",86:"paste",88:"cut"},onKeyDown:function(e){if(!this.isEditing)return;if(e.keyCode in this._keysMap)this[this._keysMap[e.keyCode]](e);else{if(!(e.keyCode in this._ctrlKeysMap&&(e.ctrlKey||e.metaKey)))return;this[this._ctrlKeysMap[e.keyCode]](e)}e.preventDefault(),e.stopPropagation(),this.canvas&&this.canvas.renderAll()},forwardDelete:function(e){this.selectionStart===this.selectionEnd&&this.moveCursorRight(e),this.removeChars(e)},copy:function(){var e=this.getSelectedText();this.copiedText=e},paste:function(){this.copiedText&&this.insertChars(this.copiedText)},cut:function(e){this.copy(),this.removeChars(e)},onKeyPress:function(e){if(!this.isEditing||e.metaKey||e.ctrlKey||e.keyCode===8||e.keyCode===13)return;this.insertChars(String.fromCharCode(e.which)),e.preventDefault(),e.stopPropagation()},getDownCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.text.split(this._reNewline),i,s,o=this.text.slice(0,n),u=this.text.slice(n),a=o.slice(o.lastIndexOf("\n")+1),f=u.match(/(.*)\n?/)[1],l=(u.match(/.*\n(.*)\n?/)||{})[1]||"",c=this.get2DCursorLocation(n);if(c.lineIndex===r.length-1||e.metaKey)return this.text.length-n;var h=this._getWidthOfLine(this.ctx,c.lineIndex,r);s=this._getLineLeftOffset(h);var p=s,d=c.lineIndex;for(var v=0,m=a.length;vn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=gthis.text.length&&(this.selectionStart=this.text.length),this.selectionEnd=this.selectionStart},moveCursorDownWithShift:function(e){if(this._selectionDirection==="left"&&this.selectionStart!==this.selectionEnd){this.selectionStart+=e,this._selectionDirection="left";return}this._selectionDirection="right",this.selectionEnd+=e,this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length)},getUpCursorOffset:function(e,t){var n=t?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(n);if(r.lineIndex===0||e.metaKey)return n;var i=this.text.slice(0,n),s=i.slice(i.lastIndexOf("\n")+1),o=(i.match(/\n?(.*)\n.*$/)||{})[1]||"",u=this.text.split(this._reNewline),a,f,l=this._getWidthOfLine(this.ctx,r.lineIndex,u);f=this._getLineLeftOffset(l);var c=f,h=r.lineIndex;for(var p=0,d=s.length;pn){f=!0;var d=u-p,v=u,m=Math.abs(d-n),g=Math.abs(v-n);a=g=this.text.length&&this.selectionEnd>=this.text.length)return;this.abortCursorAnimation(),this._currentCursorOpacity=1,e.shiftKey?this.moveCursorRightWithShift(e):this.moveCursorRightWithoutShift(e),this.initDelayedCursor()},moveCursorRightWithShift:function(e){this._selectionDirection==="left"&&this.selectionStart!==this.selectionEnd?this._moveRight(e,"selectionStart"):(this._selectionDirection="right",this._moveRight(e,"selectionEnd"),this.text.charAt(this.selectionEnd-1)==="\n"&&this.selectionEnd++,this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length))},moveCursorRightWithoutShift:function(e){this._selectionDirection="right",this.selectionStart===this.selectionEnd?(this._moveRight(e,"selectionStart"),this.selectionEnd=this.selectionStart):(this.selectionEnd+=this.getNumNewLinesInSelectedText(),this.selectionEnd>this.text.length&&(this.selectionEnd=this.text.length),this.selectionStart=this.selectionEnd)},removeChars:function(e){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(e):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.selectionEnd=this.selectionStart,this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll().renderAll(),this.setCoords(),this.fire("text:changed")},_removeCharsNearCursor:function(e){if(this.selectionStart!==0)if(e.metaKey){var t=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(t,this.selectionStart),this.selectionStart=t}else if(e.altKey){var n=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(n,this.selectionStart),this.selectionStart=n}else{var r=this.text.slice(this.selectionStart-1,this.selectionStart)==="\n";this.removeStyleObject(r),this.selectionStart--,this.text=this.text.slice(0,this.selectionStart)+this.text.slice(this.selectionStart+1)}}}),fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(e,t,n,r,i,s){this.styles[t]?this._setSVGTextLineChars(e,t,n,r,i,s):this.callSuper("_setSVGTextLineText",e,t,n,r,i)},_setSVGTextLineChars:function(e,t,n,r,i,s){var o=t===0||this.useNative?"y":"dy",u=e.split(""),a=0,f=this._getSVGLineLeftOffset(t),l=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t);for(var h=0,p=u.length;h'].join("")},_createTextCharSpan:function(e,t,n,r,i,s){var o=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text"},t));return['',fabric.util.string.escapeXml(e),""].join("")}}),function(){function request(e,t,n){var r=URL.parse(e);r.port||(r.port=r.protocol.indexOf("https:")===0?443:80);var i=r.port===443?HTTPS:HTTP,s=i.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(e){var r="";t&&e.setEncoding(t),e.on("end",function(){n(r)}),e.on("data",function(t){e.statusCode===200&&(r+=t)})});s.on("error",function(e){e.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(e.message)}),s.end()}function request_fs(e,t){var n=require("fs");n.readFile(e,function(e,n){if(e)throw fabric.log(e),e;t(n)})}if(typeof document!="undefined"&&typeof window!="undefined")return;var DOMParser=(new require("xmldom")).DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(e,t,n){var r=function(r){i.src=new Buffer(r,"binary"),i._src=e,t&&t.call(n,i)},i=new Image;e&&(e instanceof Buffer||e.indexOf("data")===0)?(i.src=i._src=e,t&&t.call(n,i)):e&&e.indexOf("http")!==0?request_fs(e,r):e&&request(e,"binary",r)},fabric.loadSVGFromURL=function(e,t,n){e=e.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),e.indexOf("http")!==0?request_fs(e,function(e){fabric.loadSVGFromString(e,t,n)}):request(e,"",function(e){fabric.loadSVGFromString(e,t,n)})},fabric.loadSVGFromString=function(e,t,n){var r=(new DOMParser).parseFromString(e);fabric.parseSVGDocument(r.documentElement,function(e,n){t&&t(e,n)},n)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){var r=new fabric.Image(n);r._initConfig(e),r._initFilters(e,function(e){r.filters=e||[],t&&t(r)})})},fabric.createCanvasForNode=function(e,t){var n=fabric.document.createElement("canvas"),r=new Canvas(e||600,t||600);n.style={},n.width=r.width,n.height=r.height;var i=fabric.Canvas||fabric.StaticCanvas,s=new i(n);return s.contextContainer=r.getContext("2d"),s.nodeCanvas=r,s.Font=Canvas.Font,s},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(e){return this.nodeCanvas.createJPEGStream(e)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(e){return origSetWidth.call(this,e),this.nodeCanvas.width=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(e){return origSetHeight.call(this,e),this.nodeCanvas.height=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}(); \ No newline at end of file diff --git a/dist/all.min.js.gz b/dist/all.min.js.gz index 223972639dcf97ce2e56eab059cb8af7e0ea45b0..71d117895f3ff4a73a4fbe15ea2f5643db5b33b4 100644 GIT binary patch delta 59738 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 P)1LhwJgT`*m}&z6?Rl5u delta 59807 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≫TZ^>) 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 diff --git a/dist/all.require.js b/dist/all.require.js index 5bc687fa..ffeda160 100644 --- a/dist/all.require.js +++ b/dist/all.require.js @@ -4362,55 +4362,13 @@ if (typeof console !== 'undefined') { return attributes; } - /** - * Returns an object of attributes' name/value, given element and an array of attribute names; - * Parses parent "g" nodes recursively upwards. - * @static - * @memberOf fabric - * @param {DOMElement} element Element to parse - * @param {Array} attributes Array of attributes to parse - * @return {Object} object containing parsed attributes' names/values - */ - function parseAttributes(element, attributes) { - - if (!element) { - return; - } - - var value, - parentAttributes = { }; - - // if there's a parent container (`g` node), parse its attributes recursively upwards - if (element.parentNode && /^g$/i.test(element.parentNode.nodeName)) { - parentAttributes = fabric.parseAttributes(element.parentNode, attributes); - } - - var ownAttributes = attributes.reduce(function(memo, attr) { - value = element.getAttribute(attr); - if (value) { - attr = normalizeAttr(attr); - value = normalizeValue(attr, value, parentAttributes); - - memo[attr] = value; - } - return memo; - }, { }); - - // add values parsed from style, which take precedence over attributes - // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) - - ownAttributes = extend(ownAttributes, - extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); - return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); - } - /** * Parses "transform" attribute, returning an array of values * @static * @function * @memberOf fabric - * @param attributeValue {String} string containing attribute value - * @return {Array} array of 6 elements representing transformation matrix + * @param {String} attributeValue String containing attribute value + * @return {Array} Array of 6 elements representing transformation matrix */ fabric.parseTransformAttribute = (function() { function rotateMatrix(matrix, args) { @@ -4558,49 +4516,6 @@ if (typeof console !== 'undefined') { }; })(); - /** - * Parses "points" attribute, returning an array of values - * @static - * @memberOf fabric - * @param points {String} points attribute string - * @return {Array} array of points - */ - function parsePointsAttribute(points) { - - // points attribute is required and must not be empty - if (!points) return null; - - points = points.trim(); - var asPairs = points.indexOf(',') > -1; - - points = points.split(/\s+/); - var parsedPoints = [ ], i, len; - - // points could look like "10,20 30,40" or "10 20 30 40" - if (asPairs) { - i = 0; - len = points.length; - for (; i < len; i++) { - var pair = points[i].split(','); - parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); - } - } - else { - i = 0; - len = points.length; - for (; i < len; i+=2) { - parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); - } - } - - // odd number of points is an error - if (parsedPoints.length % 2 !== 0) { - // return null; - } - - return parsedPoints; - } - function parseFontDeclaration(value, oStyle) { // TODO: support non-px font size @@ -4633,29 +4548,6 @@ if (typeof console !== 'undefined') { } } - /** - * Parses "style" attribute, retuning an object with values - * @static - * @memberOf fabric - * @param {SVGElement} element Element to parse - * @return {Object} Objects with values parsed from style attribute of an element - */ - function parseStyleAttribute(element) { - var oStyle = { }, - style = element.getAttribute('style'); - - if (!style) return oStyle; - - if (typeof style === 'string') { - parseStyleString(style, oStyle); - } - else { - parseStyleObject(style, oStyle); - } - - return oStyle; - } - /** * @private */ @@ -4696,81 +4588,6 @@ if (typeof console !== 'undefined') { } } - function resolveGradients(instances) { - for (var i = instances.length; i--; ) { - var instanceFillValue = instances[i].get('fill'); - - if (/^url\(/.test(instanceFillValue)) { - - var gradientId = instanceFillValue.slice(5, instanceFillValue.length - 1); - - if (fabric.gradientDefs[gradientId]) { - instances[i].set('fill', - fabric.Gradient.fromElement(fabric.gradientDefs[gradientId], instances[i])); - } - } - } - } - - /** - * Transforms an array of svg elements to corresponding fabric.* instances - * @static - * @memberOf fabric - * @param {Array} elements Array of elements to parse - * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) - * @param {Object} [options] Options object - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function parseElements(elements, callback, options, reviver) { - fabric.ElementsParser.parse(elements, callback, options, reviver); - } - - /** - * Returns CSS rules for a given SVG document - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} CSS rules of this document - */ - function getCSSRules(doc) { - var styles = doc.getElementsByTagName('style'), - allRules = { }, - rules; - - // very crude parsing of style contents - for (var i = 0, len = styles.length; i < len; i++) { - var styleContents = styles[0].textContent; - - // remove comments - styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); - - rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); - rules = rules.map(function(rule) { return rule.trim(); }); - - rules.forEach(function(rule) { - var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); - rule = match[1]; - var declaration = match[2].trim(), - propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); - - if (!allRules[rule]) { - allRules[rule] = { }; - } - - for (var i = 0, len = propertyValuePairs.length; i < len; i++) { - var pair = propertyValuePairs[i].split(/\s*:\s*/), - property = pair[0], - value = pair[1]; - - allRules[rule][property] = value; - } - }); - } - - return allRules; - } - /** * @private */ @@ -4881,7 +4698,7 @@ if (typeof console !== 'undefined') { }; fabric.gradientDefs = fabric.getGradientDefs(doc); - fabric.cssRules = getCSSRules(doc); + fabric.cssRules = fabric.getCSSRules(doc); // Precedence of rules: style > class > attribute @@ -4925,53 +4742,6 @@ if (typeof console !== 'undefined') { } }; - /** - * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) - * @memberof fabric - * @param {String} url - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function loadSVGFromURL(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 - }); - } - }); - - function onComplete(r) { - - var xml = r.responseXML; - if (!xml.documentElement && fabric.window.ActiveXObject && r.responseText) { - xml = new ActiveXObject('Microsoft.XMLDOM'); - xml.async = 'false'; - //IE chokes on DOCTYPE - xml.loadXML(r.responseText.replace(//i,'')); - } - if (!xml.documentElement) return; - - fabric.parseSVGDocument(xml.documentElement, function (results, options) { - svgCache.set(url, { - objects: fabric.util.array.invoke(results, 'toObject'), - options: options - }); - callback(results, options); - }, reviver); - } - } - /** * @private */ @@ -4987,80 +4757,6 @@ if (typeof console !== 'undefined') { return ({ objects: objects, options: options }); } - /** - * Takes string corresponding to an SVG document, and parses it into a set of fabric objects - * @memberof fabric - * @param {String} string - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function loadSVGFromString(string, callback, reviver) { - string = string.trim(); - var doc; - if (typeof DOMParser !== 'undefined') { - var parser = new DOMParser(); - if (parser && parser.parseFromString) { - doc = parser.parseFromString(string, 'text/xml'); - } - } - else if (fabric.window.ActiveXObject) { - doc = new ActiveXObject('Microsoft.XMLDOM'); - doc.async = 'false'; - //IE chokes on DOCTYPE - doc.loadXML(string.replace(//i,'')); - } - - fabric.parseSVGDocument(doc.documentElement, function (results, options) { - callback(results, options); - }, reviver); - } - - /** - * Creates markup containing SVG font faces - * @param {Array} objects Array of fabric objects - * @return {String} - */ - function createSVGFontFacesMarkup(objects) { - var markup = ''; - - for (var i = 0, len = objects.length; i < len; i++) { - if (objects[i].type !== 'text' || !objects[i].path) continue; - - markup += [ - '@font-face {', - 'font-family: ', objects[i].fontFamily, '; ', - 'src: url(\'', objects[i].path, '\')', - '}' - ].join(''); - } - - if (markup) { - markup = [ - '' - ].join(''); - } - - return markup; - } - - /** - * Creates markup containing SVG referenced elements like patterns, gradients etc. - * @param {fabric.Canvas} canvas instance of fabric.Canvas - * @return {String} - */ - function createSVGRefElementsMarkup(canvas) { - var markup = [ ]; - - _createSVGPattern(markup, canvas, 'backgroundColor'); - _createSVGPattern(markup, canvas, 'overlayColor'); - - return markup.join(''); - } - /** * @private */ @@ -5080,51 +4776,343 @@ if (typeof console !== 'undefined') { } } - /** - * Parses an SVG document, returning all of the gradient declarations found in it - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element - */ - function getGradientDefs(doc) { - var linearGradientEls = doc.getElementsByTagName('linearGradient'), - radialGradientEls = doc.getElementsByTagName('radialGradient'), - el, i, - gradientDefs = { }; - - i = linearGradientEls.length; - for (; i--; ) { - el = linearGradientEls[i]; - gradientDefs[el.getAttribute('id')] = el; - } - - i = radialGradientEls.length; - for (; i--; ) { - el = radialGradientEls[i]; - gradientDefs[el.getAttribute('id')] = el; - } - - return gradientDefs; - } - extend(fabric, { - parseAttributes: parseAttributes, - parseElements: parseElements, - parseStyleAttribute: parseStyleAttribute, - parsePointsAttribute: parsePointsAttribute, - getCSSRules: getCSSRules, + /** + * Initializes gradients on instances, according to gradients parsed from a document + * @param {Array} instances + */ + resolveGradients: function(instances) { + for (var i = instances.length; i--; ) { + var instanceFillValue = instances[i].get('fill'); - loadSVGFromURL: loadSVGFromURL, - loadSVGFromString: loadSVGFromString, + if (!(/^url\(/).test(instanceFillValue)) continue; - createSVGFontFacesMarkup: createSVGFontFacesMarkup, - createSVGRefElementsMarkup: createSVGRefElementsMarkup, + var gradientId = instanceFillValue.slice(5, instanceFillValue.length - 1); - getGradientDefs: getGradientDefs, - resolveGradients: resolveGradients + if (fabric.gradientDefs[gradientId]) { + instances[i].set('fill', + fabric.Gradient.fromElement(fabric.gradientDefs[gradientId], instances[i])); + } + } + }, + + /** + * Parses an SVG document, returning all of the gradient declarations found in it + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element + */ + getGradientDefs: function(doc) { + var linearGradientEls = doc.getElementsByTagName('linearGradient'), + radialGradientEls = doc.getElementsByTagName('radialGradient'), + el, i, + gradientDefs = { }; + + i = linearGradientEls.length; + for (; i--; ) { + el = linearGradientEls[i]; + gradientDefs[el.getAttribute('id')] = el; + } + + i = radialGradientEls.length; + for (; i--; ) { + el = radialGradientEls[i]; + gradientDefs[el.getAttribute('id')] = el; + } + + return gradientDefs; + }, + + /** + * Returns an object of attributes' name/value, given element and an array of attribute names; + * Parses parent "g" nodes recursively upwards. + * @static + * @memberOf fabric + * @param {DOMElement} element Element to parse + * @param {Array} attributes Array of attributes to parse + * @return {Object} object containing parsed attributes' names/values + */ + parseAttributes: function(element, attributes) { + + if (!element) { + return; + } + + var value, + parentAttributes = { }; + + // if there's a parent container (`g` node), parse its attributes recursively upwards + if (element.parentNode && /^g$/i.test(element.parentNode.nodeName)) { + parentAttributes = fabric.parseAttributes(element.parentNode, attributes); + } + + var ownAttributes = attributes.reduce(function(memo, attr) { + value = element.getAttribute(attr); + if (value) { + attr = normalizeAttr(attr); + value = normalizeValue(attr, value, parentAttributes); + + memo[attr] = value; + } + return memo; + }, { }); + + // add values parsed from style, which take precedence over attributes + // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) + ownAttributes = extend(ownAttributes, + extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); + + return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); + }, + + /** + * Transforms an array of svg elements to corresponding fabric.* instances + * @static + * @memberOf fabric + * @param {Array} elements Array of elements to parse + * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) + * @param {Object} [options] Options object + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + parseElements: function(elements, callback, options, reviver) { + fabric.ElementsParser.parse(elements, callback, options, reviver); + }, + + /** + * Parses "style" attribute, retuning an object with values + * @static + * @memberOf fabric + * @param {SVGElement} element Element to parse + * @return {Object} Objects with values parsed from style attribute of an element + */ + parseStyleAttribute: function(element) { + var oStyle = { }, + style = element.getAttribute('style'); + + if (!style) return oStyle; + + if (typeof style === 'string') { + parseStyleString(style, oStyle); + } + else { + parseStyleObject(style, oStyle); + } + + return oStyle; + }, + + /** + * Parses "points" attribute, returning an array of values + * @static + * @memberOf fabric + * @param points {String} points attribute string + * @return {Array} array of points + */ + parsePointsAttribute: function(points) { + + // points attribute is required and must not be empty + if (!points) return null; + + points = points.trim(); + var asPairs = points.indexOf(',') > -1; + + points = points.split(/\s+/); + var parsedPoints = [ ], i, len; + + // points could look like "10,20 30,40" or "10 20 30 40" + if (asPairs) { + i = 0; + len = points.length; + for (; i < len; i++) { + var pair = points[i].split(','); + parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); + } + } + else { + i = 0; + len = points.length; + for (; i < len; i+=2) { + parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); + } + } + + // odd number of points is an error + if (parsedPoints.length % 2 !== 0) { + // return null; + } + + return parsedPoints; + }, + + /** + * Returns CSS rules for a given SVG document + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} CSS rules of this document + */ + getCSSRules: function(doc) { + var styles = doc.getElementsByTagName('style'), + allRules = { }, + rules; + + // very crude parsing of style contents + for (var i = 0, len = styles.length; i < len; i++) { + var styleContents = styles[0].textContent; + + // remove comments + styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); + + rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); + rules = rules.map(function(rule) { return rule.trim(); }); + + rules.forEach(function(rule) { + var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); + rule = match[1]; + var declaration = match[2].trim(), + propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); + + if (!allRules[rule]) { + allRules[rule] = { }; + } + + for (var i = 0, len = propertyValuePairs.length; i < len; i++) { + var pair = propertyValuePairs[i].split(/\s*:\s*/), + property = pair[0], + value = pair[1]; + + allRules[rule][property] = value; + } + }); + } + + return allRules; + }, + + /** + * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) + * @memberof fabric + * @param {String} url + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + 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 + }); + } + }); + + function onComplete(r) { + + var xml = r.responseXML; + if (!xml.documentElement && fabric.window.ActiveXObject && r.responseText) { + xml = new ActiveXObject('Microsoft.XMLDOM'); + xml.async = 'false'; + //IE chokes on DOCTYPE + xml.loadXML(r.responseText.replace(//i,'')); + } + if (!xml.documentElement) return; + + fabric.parseSVGDocument(xml.documentElement, function (results, options) { + svgCache.set(url, { + objects: fabric.util.array.invoke(results, 'toObject'), + options: options + }); + callback(results, options); + }, reviver); + } + }, + + /** + * Takes string corresponding to an SVG document, and parses it into a set of fabric objects + * @memberof fabric + * @param {String} string + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + loadSVGFromString: function(string, callback, reviver) { + string = string.trim(); + var doc; + if (typeof DOMParser !== 'undefined') { + var parser = new DOMParser(); + if (parser && parser.parseFromString) { + doc = parser.parseFromString(string, 'text/xml'); + } + } + else if (fabric.window.ActiveXObject) { + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = 'false'; + //IE chokes on DOCTYPE + doc.loadXML(string.replace(//i,'')); + } + + fabric.parseSVGDocument(doc.documentElement, function (results, options) { + callback(results, options); + }, reviver); + }, + + /** + * Creates markup containing SVG font faces + * @param {Array} objects Array of fabric objects + * @return {String} + */ + createSVGFontFacesMarkup: function(objects) { + var markup = ''; + + for (var i = 0, len = objects.length; i < len; i++) { + if (objects[i].type !== 'text' || !objects[i].path) continue; + + markup += [ + '@font-face {', + 'font-family: ', objects[i].fontFamily, '; ', + 'src: url(\'', objects[i].path, '\')', + '}' + ].join(''); + } + + if (markup) { + markup = [ + '' + ].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(''); + } }); })(typeof exports !== 'undefined' ? exports : this); diff --git a/src/parser.js b/src/parser.js index 39a8865e..7b5172b3 100644 --- a/src/parser.js +++ b/src/parser.js @@ -98,55 +98,13 @@ return attributes; } - /** - * Returns an object of attributes' name/value, given element and an array of attribute names; - * Parses parent "g" nodes recursively upwards. - * @static - * @memberOf fabric - * @param {DOMElement} element Element to parse - * @param {Array} attributes Array of attributes to parse - * @return {Object} object containing parsed attributes' names/values - */ - function parseAttributes(element, attributes) { - - if (!element) { - return; - } - - var value, - parentAttributes = { }; - - // if there's a parent container (`g` node), parse its attributes recursively upwards - if (element.parentNode && /^g$/i.test(element.parentNode.nodeName)) { - parentAttributes = fabric.parseAttributes(element.parentNode, attributes); - } - - var ownAttributes = attributes.reduce(function(memo, attr) { - value = element.getAttribute(attr); - if (value) { - attr = normalizeAttr(attr); - value = normalizeValue(attr, value, parentAttributes); - - memo[attr] = value; - } - return memo; - }, { }); - - // add values parsed from style, which take precedence over attributes - // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) - - ownAttributes = extend(ownAttributes, - extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); - return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); - } - /** * Parses "transform" attribute, returning an array of values * @static * @function * @memberOf fabric - * @param attributeValue {String} string containing attribute value - * @return {Array} array of 6 elements representing transformation matrix + * @param {String} attributeValue String containing attribute value + * @return {Array} Array of 6 elements representing transformation matrix */ fabric.parseTransformAttribute = (function() { function rotateMatrix(matrix, args) { @@ -294,49 +252,6 @@ }; })(); - /** - * Parses "points" attribute, returning an array of values - * @static - * @memberOf fabric - * @param points {String} points attribute string - * @return {Array} array of points - */ - function parsePointsAttribute(points) { - - // points attribute is required and must not be empty - if (!points) return null; - - points = points.trim(); - var asPairs = points.indexOf(',') > -1; - - points = points.split(/\s+/); - var parsedPoints = [ ], i, len; - - // points could look like "10,20 30,40" or "10 20 30 40" - if (asPairs) { - i = 0; - len = points.length; - for (; i < len; i++) { - var pair = points[i].split(','); - parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); - } - } - else { - i = 0; - len = points.length; - for (; i < len; i+=2) { - parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); - } - } - - // odd number of points is an error - if (parsedPoints.length % 2 !== 0) { - // return null; - } - - return parsedPoints; - } - function parseFontDeclaration(value, oStyle) { // TODO: support non-px font size @@ -369,29 +284,6 @@ } } - /** - * Parses "style" attribute, retuning an object with values - * @static - * @memberOf fabric - * @param {SVGElement} element Element to parse - * @return {Object} Objects with values parsed from style attribute of an element - */ - function parseStyleAttribute(element) { - var oStyle = { }, - style = element.getAttribute('style'); - - if (!style) return oStyle; - - if (typeof style === 'string') { - parseStyleString(style, oStyle); - } - else { - parseStyleObject(style, oStyle); - } - - return oStyle; - } - /** * @private */ @@ -432,81 +324,6 @@ } } - function resolveGradients(instances) { - for (var i = instances.length; i--; ) { - var instanceFillValue = instances[i].get('fill'); - - if (/^url\(/.test(instanceFillValue)) { - - var gradientId = instanceFillValue.slice(5, instanceFillValue.length - 1); - - if (fabric.gradientDefs[gradientId]) { - instances[i].set('fill', - fabric.Gradient.fromElement(fabric.gradientDefs[gradientId], instances[i])); - } - } - } - } - - /** - * Transforms an array of svg elements to corresponding fabric.* instances - * @static - * @memberOf fabric - * @param {Array} elements Array of elements to parse - * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) - * @param {Object} [options] Options object - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function parseElements(elements, callback, options, reviver) { - fabric.ElementsParser.parse(elements, callback, options, reviver); - } - - /** - * Returns CSS rules for a given SVG document - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} CSS rules of this document - */ - function getCSSRules(doc) { - var styles = doc.getElementsByTagName('style'), - allRules = { }, - rules; - - // very crude parsing of style contents - for (var i = 0, len = styles.length; i < len; i++) { - var styleContents = styles[0].textContent; - - // remove comments - styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); - - rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); - rules = rules.map(function(rule) { return rule.trim(); }); - - rules.forEach(function(rule) { - var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); - rule = match[1]; - var declaration = match[2].trim(), - propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); - - if (!allRules[rule]) { - allRules[rule] = { }; - } - - for (var i = 0, len = propertyValuePairs.length; i < len; i++) { - var pair = propertyValuePairs[i].split(/\s*:\s*/), - property = pair[0], - value = pair[1]; - - allRules[rule][property] = value; - } - }); - } - - return allRules; - } - /** * @private */ @@ -617,7 +434,7 @@ }; fabric.gradientDefs = fabric.getGradientDefs(doc); - fabric.cssRules = getCSSRules(doc); + fabric.cssRules = fabric.getCSSRules(doc); // Precedence of rules: style > class > attribute @@ -661,53 +478,6 @@ } }; - /** - * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) - * @memberof fabric - * @param {String} url - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function loadSVGFromURL(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 - }); - } - }); - - function onComplete(r) { - - var xml = r.responseXML; - if (!xml.documentElement && fabric.window.ActiveXObject && r.responseText) { - xml = new ActiveXObject('Microsoft.XMLDOM'); - xml.async = 'false'; - //IE chokes on DOCTYPE - xml.loadXML(r.responseText.replace(//i,'')); - } - if (!xml.documentElement) return; - - fabric.parseSVGDocument(xml.documentElement, function (results, options) { - svgCache.set(url, { - objects: fabric.util.array.invoke(results, 'toObject'), - options: options - }); - callback(results, options); - }, reviver); - } - } - /** * @private */ @@ -723,80 +493,6 @@ return ({ objects: objects, options: options }); } - /** - * Takes string corresponding to an SVG document, and parses it into a set of fabric objects - * @memberof fabric - * @param {String} string - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - function loadSVGFromString(string, callback, reviver) { - string = string.trim(); - var doc; - if (typeof DOMParser !== 'undefined') { - var parser = new DOMParser(); - if (parser && parser.parseFromString) { - doc = parser.parseFromString(string, 'text/xml'); - } - } - else if (fabric.window.ActiveXObject) { - doc = new ActiveXObject('Microsoft.XMLDOM'); - doc.async = 'false'; - //IE chokes on DOCTYPE - doc.loadXML(string.replace(//i,'')); - } - - fabric.parseSVGDocument(doc.documentElement, function (results, options) { - callback(results, options); - }, reviver); - } - - /** - * Creates markup containing SVG font faces - * @param {Array} objects Array of fabric objects - * @return {String} - */ - function createSVGFontFacesMarkup(objects) { - var markup = ''; - - for (var i = 0, len = objects.length; i < len; i++) { - if (objects[i].type !== 'text' || !objects[i].path) continue; - - markup += [ - '@font-face {', - 'font-family: ', objects[i].fontFamily, '; ', - 'src: url(\'', objects[i].path, '\')', - '}' - ].join(''); - } - - if (markup) { - markup = [ - '' - ].join(''); - } - - return markup; - } - - /** - * Creates markup containing SVG referenced elements like patterns, gradients etc. - * @param {fabric.Canvas} canvas instance of fabric.Canvas - * @return {String} - */ - function createSVGRefElementsMarkup(canvas) { - var markup = [ ]; - - _createSVGPattern(markup, canvas, 'backgroundColor'); - _createSVGPattern(markup, canvas, 'overlayColor'); - - return markup.join(''); - } - /** * @private */ @@ -816,51 +512,343 @@ } } - /** - * Parses an SVG document, returning all of the gradient declarations found in it - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element - */ - function getGradientDefs(doc) { - var linearGradientEls = doc.getElementsByTagName('linearGradient'), - radialGradientEls = doc.getElementsByTagName('radialGradient'), - el, i, - gradientDefs = { }; - - i = linearGradientEls.length; - for (; i--; ) { - el = linearGradientEls[i]; - gradientDefs[el.getAttribute('id')] = el; - } - - i = radialGradientEls.length; - for (; i--; ) { - el = radialGradientEls[i]; - gradientDefs[el.getAttribute('id')] = el; - } - - return gradientDefs; - } - extend(fabric, { - parseAttributes: parseAttributes, - parseElements: parseElements, - parseStyleAttribute: parseStyleAttribute, - parsePointsAttribute: parsePointsAttribute, - getCSSRules: getCSSRules, + /** + * Initializes gradients on instances, according to gradients parsed from a document + * @param {Array} instances + */ + resolveGradients: function(instances) { + for (var i = instances.length; i--; ) { + var instanceFillValue = instances[i].get('fill'); - loadSVGFromURL: loadSVGFromURL, - loadSVGFromString: loadSVGFromString, + if (!(/^url\(/).test(instanceFillValue)) continue; - createSVGFontFacesMarkup: createSVGFontFacesMarkup, - createSVGRefElementsMarkup: createSVGRefElementsMarkup, + var gradientId = instanceFillValue.slice(5, instanceFillValue.length - 1); - getGradientDefs: getGradientDefs, - resolveGradients: resolveGradients + if (fabric.gradientDefs[gradientId]) { + instances[i].set('fill', + fabric.Gradient.fromElement(fabric.gradientDefs[gradientId], instances[i])); + } + } + }, + + /** + * Parses an SVG document, returning all of the gradient declarations found in it + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element + */ + getGradientDefs: function(doc) { + var linearGradientEls = doc.getElementsByTagName('linearGradient'), + radialGradientEls = doc.getElementsByTagName('radialGradient'), + el, i, + gradientDefs = { }; + + i = linearGradientEls.length; + for (; i--; ) { + el = linearGradientEls[i]; + gradientDefs[el.getAttribute('id')] = el; + } + + i = radialGradientEls.length; + for (; i--; ) { + el = radialGradientEls[i]; + gradientDefs[el.getAttribute('id')] = el; + } + + return gradientDefs; + }, + + /** + * Returns an object of attributes' name/value, given element and an array of attribute names; + * Parses parent "g" nodes recursively upwards. + * @static + * @memberOf fabric + * @param {DOMElement} element Element to parse + * @param {Array} attributes Array of attributes to parse + * @return {Object} object containing parsed attributes' names/values + */ + parseAttributes: function(element, attributes) { + + if (!element) { + return; + } + + var value, + parentAttributes = { }; + + // if there's a parent container (`g` node), parse its attributes recursively upwards + if (element.parentNode && /^g$/i.test(element.parentNode.nodeName)) { + parentAttributes = fabric.parseAttributes(element.parentNode, attributes); + } + + var ownAttributes = attributes.reduce(function(memo, attr) { + value = element.getAttribute(attr); + if (value) { + attr = normalizeAttr(attr); + value = normalizeValue(attr, value, parentAttributes); + + memo[attr] = value; + } + return memo; + }, { }); + + // add values parsed from style, which take precedence over attributes + // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) + ownAttributes = extend(ownAttributes, + extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); + + return _setStrokeFillOpacity(extend(parentAttributes, ownAttributes)); + }, + + /** + * Transforms an array of svg elements to corresponding fabric.* instances + * @static + * @memberOf fabric + * @param {Array} elements Array of elements to parse + * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) + * @param {Object} [options] Options object + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + parseElements: function(elements, callback, options, reviver) { + fabric.ElementsParser.parse(elements, callback, options, reviver); + }, + + /** + * Parses "style" attribute, retuning an object with values + * @static + * @memberOf fabric + * @param {SVGElement} element Element to parse + * @return {Object} Objects with values parsed from style attribute of an element + */ + parseStyleAttribute: function(element) { + var oStyle = { }, + style = element.getAttribute('style'); + + if (!style) return oStyle; + + if (typeof style === 'string') { + parseStyleString(style, oStyle); + } + else { + parseStyleObject(style, oStyle); + } + + return oStyle; + }, + + /** + * Parses "points" attribute, returning an array of values + * @static + * @memberOf fabric + * @param points {String} points attribute string + * @return {Array} array of points + */ + parsePointsAttribute: function(points) { + + // points attribute is required and must not be empty + if (!points) return null; + + points = points.trim(); + var asPairs = points.indexOf(',') > -1; + + points = points.split(/\s+/); + var parsedPoints = [ ], i, len; + + // points could look like "10,20 30,40" or "10 20 30 40" + if (asPairs) { + i = 0; + len = points.length; + for (; i < len; i++) { + var pair = points[i].split(','); + parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); + } + } + else { + i = 0; + len = points.length; + for (; i < len; i+=2) { + parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); + } + } + + // odd number of points is an error + if (parsedPoints.length % 2 !== 0) { + // return null; + } + + return parsedPoints; + }, + + /** + * Returns CSS rules for a given SVG document + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} CSS rules of this document + */ + getCSSRules: function(doc) { + var styles = doc.getElementsByTagName('style'), + allRules = { }, + rules; + + // very crude parsing of style contents + for (var i = 0, len = styles.length; i < len; i++) { + var styleContents = styles[0].textContent; + + // remove comments + styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); + + rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); + rules = rules.map(function(rule) { return rule.trim(); }); + + rules.forEach(function(rule) { + var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); + rule = match[1]; + var declaration = match[2].trim(), + propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); + + if (!allRules[rule]) { + allRules[rule] = { }; + } + + for (var i = 0, len = propertyValuePairs.length; i < len; i++) { + var pair = propertyValuePairs[i].split(/\s*:\s*/), + property = pair[0], + value = pair[1]; + + allRules[rule][property] = value; + } + }); + } + + return allRules; + }, + + /** + * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) + * @memberof fabric + * @param {String} url + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + 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 + }); + } + }); + + function onComplete(r) { + + var xml = r.responseXML; + if (!xml.documentElement && fabric.window.ActiveXObject && r.responseText) { + xml = new ActiveXObject('Microsoft.XMLDOM'); + xml.async = 'false'; + //IE chokes on DOCTYPE + xml.loadXML(r.responseText.replace(//i,'')); + } + if (!xml.documentElement) return; + + fabric.parseSVGDocument(xml.documentElement, function (results, options) { + svgCache.set(url, { + objects: fabric.util.array.invoke(results, 'toObject'), + options: options + }); + callback(results, options); + }, reviver); + } + }, + + /** + * Takes string corresponding to an SVG document, and parses it into a set of fabric objects + * @memberof fabric + * @param {String} string + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + loadSVGFromString: function(string, callback, reviver) { + string = string.trim(); + var doc; + if (typeof DOMParser !== 'undefined') { + var parser = new DOMParser(); + if (parser && parser.parseFromString) { + doc = parser.parseFromString(string, 'text/xml'); + } + } + else if (fabric.window.ActiveXObject) { + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = 'false'; + //IE chokes on DOCTYPE + doc.loadXML(string.replace(//i,'')); + } + + fabric.parseSVGDocument(doc.documentElement, function (results, options) { + callback(results, options); + }, reviver); + }, + + /** + * Creates markup containing SVG font faces + * @param {Array} objects Array of fabric objects + * @return {String} + */ + createSVGFontFacesMarkup: function(objects) { + var markup = ''; + + for (var i = 0, len = objects.length; i < len; i++) { + if (objects[i].type !== 'text' || !objects[i].path) continue; + + markup += [ + '@font-face {', + 'font-family: ', objects[i].fontFamily, '; ', + 'src: url(\'', objects[i].path, '\')', + '}' + ].join(''); + } + + if (markup) { + markup = [ + '' + ].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(''); + } }); })(typeof exports !== 'undefined' ? exports : this);