From db8f0515f1e70125456bdc9afd4793f08144c64c Mon Sep 17 00:00:00 2001 From: kangax Date: Thu, 26 Sep 2013 19:55:17 +0200 Subject: [PATCH] Add docs for object accessors. Build distribution. --- dist/all.js | 413 ++++++++++++++++++++++++++++++++----- dist/all.min.js | 8 +- dist/all.min.js.gz | Bin 50834 -> 51095 bytes dist/all.require.js | 413 ++++++++++++++++++++++++++++++++----- src/shapes/object.class.js | 206 +++++++++++++++++- 5 files changed, 929 insertions(+), 111 deletions(-) diff --git a/dist/all.js b/dist/all.js index 3a1d8a97..46d260a4 100644 --- a/dist/all.js +++ b/dist/all.js @@ -8443,11 +8443,22 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab uniScaleTransform: false, /** - * When true, objects use center point as the origin of transformation + * When true, objects use center point as the origin of scale transformation. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 * @type Boolean * @default */ - centerTransform: false, + centeredScaling: false, + + /** + * When true, objects use center point as the origin of rotate transformation. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredRotation: false, /** * Indicates that canvas is interactive. This property should not be changed. @@ -8475,7 +8486,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * If not empty the selection border is dashed * @type Array */ - selectionDashArray: [ ], + selectionDashArray: [ ], /** * Color of the border of selection (usually slightly darker than color of selection itself) @@ -8531,7 +8542,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @type String * @default */ - containerClass: 'canvas-container', + containerClass: 'canvas-container', /** * When true, object detection happens on per-pixel basis rather than on per-bounding-box @@ -8552,7 +8563,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @type Boolean * @default */ - skipTargetFind: false, + skipTargetFind: false, /** * @private @@ -8577,31 +8588,38 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab _resetCurrentTransform: function(e) { var t = this._currentTransform; - t.target.set('scaleX', t.original.scaleX); - t.target.set('scaleY', t.original.scaleY); - t.target.set('left', t.original.left); - t.target.set('top', t.original.top); + t.target.set({ + 'scaleX': t.original.scaleX, + 'scaleY': t.original.scaleY, + 'left': t.original.left, + 'top': t.original.top + }); - if (e.altKey || this.centerTransform || t.target.centerTransform) { - if (t.originX !== 'center') { - if (t.originX === 'right') { - t.mouseXSign = -1; - } - else { - t.mouseXSign = 1; - } + if (this._shouldCenterTransform(e, t.target)) { + if (t.action === 'rotate') { + this._setOriginToCenter(t.target); } - if (t.originY !== 'center') { - if (t.originY === 'bottom') { - t.mouseYSign = -1; + else { + if (t.originX !== 'center') { + if (t.originX === 'right') { + t.mouseXSign = -1; + } + else { + t.mouseXSign = 1; + } } - else { - t.mouseYSign = 1; + if (t.originY !== 'center') { + if (t.originY === 'bottom') { + t.mouseYSign = -1; + } + else { + t.mouseYSign = 1; + } } - } - t.originX = 'center'; - t.originY = 'center'; + t.originX = 'center'; + t.originY = 'center'; + } } else { t.originX = t.original.originX; @@ -8718,6 +8736,27 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab ); }, + /** + * @private + * @param {Event} e Event object + * @param {fabric.Object} target + */ + _shouldCenterTransform: function (e, target) { + if (!target) return; + + var t = this._currentTransform, + centerTransform; + + if (t.action === 'scale' || t.action === 'scaleX' || t.action === 'scaleY') { + centerTransform = this.centeredScaling || target.centeredScaling; + } + else if (t.action === 'rotate') { + centerTransform = this.centeredRotation || target.centeredRotation; + } + + return centerTransform ? !e.altKey : e.altKey; + }, + /** * @private * @param {Event} e Event object @@ -8741,7 +8780,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab : 'scale'; } - var originX = target.originX, originY = target.originY; + var originX = target.originX, + originY = target.originY; if (corner === 'ml' || corner === 'tl' || corner === 'bl') { originX = "right"; @@ -8757,12 +8797,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab originY = "top"; } - // if (corner === 'mtr') { - // originX = 'center'; - // originY = 'center'; - // } - - // var center = target.getCenterPoint(); this._currentTransform = { target: target, action: action, @@ -9599,7 +9633,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Event} e Event object fired on mouseup */ __onMouseUp: function (e) { - var target, pointer, render; @@ -9710,7 +9743,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Event} e Event object fired on mousedown */ __onMouseDown: function (e) { - // accept only left clicks var isLeftClick = 'which' in e ? e.which === 1 : e.button === 1; if (!isLeftClick && !fabric.isTouchSupported) return; @@ -9769,17 +9801,13 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this.fire('mouse:down', { target: target, e: e }); target && target.fire('mousedown', { e: e }); - - if (corner === 'mtr' && target.centerTransform) { - this._setOriginToCenter(target); - } }, /** * @private + * @param {Object} target Object for that origin is set to center */ _setOriginToCenter: function(target) { - this._previousOriginX = this._currentTransform.target.originX; this._previousOriginY = this._currentTransform.target.originY; @@ -9795,6 +9823,26 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this._currentTransform.top = target.top; }, + /** + * @private + * @param {Object} target Object for that center is set to origin + */ + _setCenterToOrigin: function(target) { + var originPoint = target.translateToOriginPoint( + target.getCenterPoint(), + this._previousOriginX, + this._previousOriginY); + + target.originX = this._previousOriginX; + target.originY = this._previousOriginY; + + target.left = originPoint.x; + target.top = originPoint.y; + + this._previousOriginX = null; + this._previousOriginY = null; + }, + /** * Method that defines the actions when mouse is hovering the canvas. * The currentTransform parameter will definde whether the user is rotating/scaling/translating @@ -9805,7 +9853,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Event} e Event object fired on mousemove */ __onMouseMove: function (e) { - var target, pointer; if (this.isDrawingMode) { @@ -9855,19 +9902,23 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab var x = pointer.x, y = pointer.y, reset = false, + centerTransform, transform = this._currentTransform; target = transform.target; target.isMoving = true; - if ((transform.action === 'scale' || transform.action === 'scaleX' || transform.action === 'scaleY') && - // Switch from a normal resize to center-based - ((e.altKey && (transform.originX !== 'center' || transform.originY !== 'center')) || - // Switch from center-based resize to normal one - (!e.altKey && transform.originX === 'center' && transform.originY === 'center')) - ) { - this._resetCurrentTransform(e); - reset = true; + if (transform.action === 'scale' || transform.action === 'scaleX' || transform.action === 'scaleY') { + centerTransform = this._shouldCenterTransform(e, target); + + // Switch from a normal resize to center-based + if ((centerTransform && (transform.originX !== 'center' || transform.originY !== 'center')) || + // Switch from center-based resize to normal one + (!centerTransform && transform.originX === 'center' && transform.originY === 'center') + ) { + this._resetCurrentTransform(e); + reset = true; + } } if (transform.action === 'rotate') { @@ -9886,7 +9937,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab else { // Switch from a normal resize to proportional if (!reset && transform.currentAction === 'scale') { - this._resetCurrentTransform(e); + this._resetCurrentTransform(e, target); } transform.currentAction = 'scaleEqually'; @@ -10392,6 +10443,208 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati */ fabric.Object = fabric.util.createClass(/** @lends fabric.Object.prototype */ { + // TODO: maybe document these too + // strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit clipTo transformMatrix visible + + /** + * Retrieves object's shadow + * @method getShadow + * @memberOf fabric.Object.prototype + * @return {Object} Shadow instance + */ + + /** + * Retrieves object's stroke + * @method getStroke + * @memberOf fabric.Object.prototype + * @return {String} stroke value + */ + + /** + * Sets object's stroke + * @method setStroke + * @memberOf fabric.Object.prototype + * @param {String} value stroke value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's strokeWidth + * @method getStrokeWidth + * @memberOf fabric.Object.prototype + * @return {Number} strokeWidth value + */ + + /** + * Sets object's strokeWidth + * @method setStrokeWidth + * @memberOf fabric.Object.prototype + * @param {Number} value strokeWidth value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's originX + * @method getOriginX + * @memberOf fabric.Object.prototype + * @return {String} originX value + */ + + /** + * Sets object's originX + * @method setOriginX + * @memberOf fabric.Object.prototype + * @param {String} value originX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's originY + * @method getOriginY + * @memberOf fabric.Object.prototype + * @return {String} originY value + */ + + /** + * Sets object's originY + * @method setOriginY + * @memberOf fabric.Object.prototype + * @param {String} value originY value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's fill + * @method getFill + * @memberOf fabric.Object.prototype + * @return {String} Fill value (0-1) + */ + + /** + * Sets object's fill + * @method setFill + * @memberOf fabric.Object.prototype + * @param {String} value Fill value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's opacity + * @method getOpacity + * @memberOf fabric.Object.prototype + * @return {Number} Opacity value (0-1) + */ + + /** + * Sets object's opacity + * @method setOpacity + * @memberOf fabric.Object.prototype + * @param {Number} value Opacity value (0-1) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's top position + * @method getTop + * @memberOf fabric.Object.prototype + * @return {Number} Top value (in pixels) + */ + + /** + * Sets object's top position + * @method setTop + * @memberOf fabric.Object.prototype + * @param {Number} value Top value (in pixels) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's left position + * @method getLeft + * @memberOf fabric.Object.prototype + * @return {Number} Left value (in pixels) + */ + + /** + * Sets object's left position + * @method setLeft + * @memberOf fabric.Object.prototype + * @param {Number} value Left value (in pixels) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's scaleX value + * @method getScaleX + * @memberOf fabric.Object.prototype + * @return {Number} scaleX value + */ + + /** + * Sets object's scaleX value + * @method setScaleX + * @memberOf fabric.Object.prototype + * @param {Number} value scaleX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's scaleY value + * @method getScaleY + * @memberOf fabric.Object.prototype + * @return {Number} scaleY value + */ + + /** + * Sets object's scaleY value + * @method setScaleY + * @memberOf fabric.Object.prototype + * @param {Number} value scaleY value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's flipX value + * @method getFlipX + * @memberOf fabric.Object.prototype + * @return {Boolean} flipX value + */ + + /** + * Sets object's flipX value + * @method setFlipX + * @memberOf fabric.Object.prototype + * @param {Boolean} value flipX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's flipY value + * @method getFlipY + * @memberOf fabric.Object.prototype + * @return {Boolean} flipY value + */ + + /** + * Sets object's flipY value + * @method setFlipY + * @memberOf fabric.Object.prototype + * @param {Boolean} value flipY value + * @return {fabric.Object} thisArg + * @chainable + */ + /** * Type of an object (rect, circle, path, etc.) * @type String @@ -10527,10 +10780,23 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * When true, this object will use center point as the origin of transformation - * when being resized via the controls + * when being scaled via the controls. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 * @type Boolean + * @default */ - centerTransform: false, + centeredScaling: false, + + /** + * When true, this object will use center point as the origin of transformation + * when being rotated via the controls. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredRotation: false, /** * Color of object's fill @@ -11544,7 +11810,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati extend(fabric.Object.prototype, fabric.Observable); /** - * Defines the number of fraction digits when serializing object values. You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. + * Defines the number of fraction digits to use when serializing object values. + * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. * @static * @memberof fabric.Object * @constant @@ -11553,6 +11820,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati fabric.Object.NUM_FRACTION_DIGITS = 2; /** + * Unique id used internally when creating SVG elements * @static * @memberof fabric.Object * @type Number @@ -15361,6 +15629,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @chainable */ removeWithUpdate: function(object) { + this._moveFlippedObject(object); this._restoreObjectsState(); // since _restoreObjectsState set objects inactive this.forEachObject(function(o){ o.set('active', true); o.group = this; }, this); @@ -15485,6 +15754,44 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return this; }, + /** + * Moves a flipped object to the position where it's displayed + * @private + * @param {fabric.Object} object + * @return {fabric.Group} thisArg + */ + _moveFlippedObject: function(object) { + var oldOriginX = object.get('originX'); + var oldOriginY = object.get('originY'); + var center = object.getCenterPoint(); + object.set({ + originX: 'center', + originY: 'center', + left: center.x, + top: center.y + }); + + if (this.flipX) { + object.toggle('flipX'); + object.set('left', -object.get('left')); + object.setAngle(-object.getAngle()); + } + if (this.flipY) { + object.toggle('flipY'); + object.set('top', -object.get('top')); + object.setAngle(-object.getAngle()); + } + + var newOrigin = object.getPointByOrigin(oldOriginX, oldOriginY); + object.set({ + originX: oldOriginX, + originY: oldOriginY, + left: newOrigin.x, + top: newOrigin.y + }); + return this; + }, + /** * Restores original state of a specified object in group * @private @@ -15492,7 +15799,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {fabric.Group} thisArg */ _restoreObjectState: function(object) { - var groupLeft = this.get('left'), groupTop = this.get('top'), groupAngle = this.getAngle() * (Math.PI / 180), @@ -15523,6 +15829,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @chainable */ destroy: function() { + this._objects.forEach(this._moveFlippedObject, this); return this._restoreObjectsState(); }, diff --git a/dist/all.min.js b/dist/all.min.js index 2ba62346..7b3b97d4 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,6 +1,6 @@ /* build: `node build.js modules=ALL exclude=gestures` *//*! Fabric.js Copyright 2008-2013, Printio (Juriy Zaytsev, Maxim Chernyak) */var fabric=fabric||{version:"1.3.4"};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";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)},toGrayscale:function(){return this.forEachObject(function(e){e.toGrayscale()})}},function(e){function r(e,t){var n=e.indexOf(t);return n!==-1&&e.splice(n,1),e}function i(e,t){return Math.floor(Math.random()*(t-e+1))+e}function o(e){return e*s}function u(e){return e/s}function a(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)}function f(e,t){return parseFloat(Number(e).toFixed(t))}function l(){return!1}function c(e,t){return e=fabric.util.string.camelize(e.charAt(0).toUpperCase()+e.slice(1)),h(t)[e]}function h(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}function m(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()}function y(e){return e||(e=fabric.document.createElement("canvas")),!e.getContext&&typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager.initElement(e),e}function b(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")}function w(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))}}function E(e,t){t.save(),t.beginPath(),e.clipTo(t),t.clip()}function S(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]]}function x(e){return(String(e).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]}function T(e,t,n,r){var i=r[0],s=r[1],o=r[2],u=r[3],a=r[4],f=r[5],l=r[6],c=A(f,l,i,s,u,a,o,t,n);for(var h=0;h1&&(d=Math.sqrt(d),n*=d,r*=d);var v=c/n,m=l/n,g=-l/r,y=c/r,b=v*u+m*a,w=g*u+y*a,E=v*e+m*t,S=g*e+y*t,x=(E-b)*(E-b)+(S-w)*(S-w),T=1/x-.25;T<0&&(T=0);var C=Math.sqrt(T);s===i&&(C=-C);var A=.5*(b+E)-C*(S-w),O=.5*(w+S)+C*(E-b),M=Math.atan2(w-O,b-A),_=Math.atan2(S-O,E-A),D=_-M;D<0&&s===1?D+=2*Math.PI:D>0&&s===0&&(D-=2*Math.PI);var P=Math.ceil(Math.abs(D/(Math.PI*.5+.001))),H=[];for(var B=0;B=r&&(r=e[n][t]);else while(n--)e[n]>=r&&(r=e[n]);return r}function r(e,t){if(!e||e.length===0)return undefined;var n=e.length-1,r=t?e[n][t]:e[n];if(t)while(n--)e[n][t]>>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 e(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){var t,n,r={left:0,top:0},i=e&&e.ownerDocument,s={left:0,top:0},o={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!i)return{left:0,top:0};for(var u in o)s[o[u]]+=parseInt(f(e,u),10)||0;return t=i.documentElement,typeof e.getBoundingClientRect!="undefined"&&(r=e.getBoundingClientRect()),i!=null&&i===i.window?n=i:n=i.nodeType===9&&(i.defaultView||i.parentWindow),{left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)+s.left,top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0)+s.top}}function f(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.getElementOffset=a,fabric.util.getElementStyle=f}(),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}(),function(){function e(e){e||(e={});var t=+(new Date),r=e.duration||500,i=t+r,s,o=e.onChange||function(){},u=e.abort||function(){return!1},a=e.easing||function(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t},f="startValue"in e?e.startValue:0,l="endValue"in e?e.endValue:100,c=e.byValue||l-f;e.onStart&&e.onStart(),function h(){s=+(new Date);var l=s>i?r:s-t;if(u()){e.onComplete&&e.onComplete();return}o(a(l,f,c,r));if(s>i){e.onComplete&&e.onComplete();return}n(h)}()}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 n*(e/=r)*e+t}function t(e,t,n,r){return-n*(e/=r)*(e-2)+t}function n(e,t,n,r){return e/=r/2,e<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t}function r(e,t,n,r){return n*(e/=r)*e*e+t}function i(e,t,n,r){return n*((e=e/r-1)*e*e+1)+t}function s(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e+t:n/2*((e-=2)*e*e+2)+t}function o(e,t,n,r){return n*(e/=r)*e*e*e+t}function u(e,t,n,r){return-n*((e=e/r-1)*e*e*e-1)+t}function a(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e*e+t:-n/2*((e-=2)*e*e*e-2)+t}function f(e,t,n,r){return n*(e/=r)*e*e*e*e+t}function l(e,t,n,r){return n*((e=e/r-1)*e*e*e*e+1)+t}function c(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e*e*e+t:n/2*((e-=2)*e*e*e*e+2)+t}function h(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t}function p(e,t,n,r){return n*Math.sin(e/r*(Math.PI/2))+t}function d(e,t,n,r){return-n/2*(Math.cos(Math.PI*e/r)-1)+t}function v(e,t,n,r){return e===0?t:n*Math.pow(2,10*(e/r-1))+t}function m(e,t,n,r){return e===r?t+n:n*(-Math.pow(2,-10*e/r)+1)+t}function g(e,t,n,r){return e===0?t:e===r?t+n:(e/=r/2,e<1?n/2*Math.pow(2,10*(e-1))+t:n/2*(-Math.pow(2,-10*--e)+2)+t)}function y(e,t,n,r){return-n*(Math.sqrt(1-(e/=r)*e)-1)+t}function b(e,t,n,r){return n*Math.sqrt(1-(e=e/r-1)*e)+t}function w(e,t,n,r){return e/=r/2,e<1?-n/2*(Math.sqrt(1-e*e)-1)+t:n/2*(Math.sqrt(1-(e-=2)*e)+1)+t}function E(e,t,n,r){var i=1.70158,s=0,o=n;return e===0?t:(e/=r,e===1?t+n:(s||(s=r*.3),o-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){w.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),w.has(e,function(r){r?w.get(e,function(e){var t=S(e);n(t.objects,t.options)}):new t.util.request(e,{method:"get",onComplete:i})})}function S(e){var n=e.objects,i=e.options;return n=n.map(function(e){return t[r(e.type)].fromObject(e)}),{objects:n,options:i}}function x(e,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 T(e){var t="";for(var n=0,r=e.length;n',"",""].join("")),t}function N(e){var t="";return e.backgroundColor&&e.backgroundColor.source&&(t=['',''].join("")),t}function C(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;t.SHARED_ATTRIBUTES=["transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width"];var 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"&&(i=["']);for(var s=0;s');return i.push(this.type==="linear"?"":""),i.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;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,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(){return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY}}}),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=fabric.util.removeListener,i=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:"",backgroundImageOpacity:1,backgroundImageStretch:!0,overlayImage:"",overlayImageLeft:0,overlayImageTop:0,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)),this.calcOffset()},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(e,t,n){return fabric.util.loadImage(e,function(e){this.overlayImage=e,n&&"overlayImageLeft"in n&&(this.overlayImageLeft=n.overlayImageLeft),n&&"overlayImageTop"in n&&(this.overlayImageTop=n.overlayImageTop),t&&t()},this),this},setBackgroundImage:function(e,t,n){return fabric.util.loadImage(e,function(e){this.backgroundImage=e,n&&"backgroundImageOpacity"in n&&(this.backgroundImageOpacity=n.backgroundImageOpacity),n&&"backgroundImageStretch"in n&&(this.backgroundImageStretch=n.backgroundImageStretch),t&&t()},this),this},setBackgroundColor:function(e,t){if(e.source){var n=this;fabric.util.loadImage(e.source,function(r){n.backgroundColor=new fabric.Pattern({source:r,repeat:e.repeat}),t&&t()})}else this.backgroundColor=e,t&&t();return this},_createCanvasElement:function(){var e=fabric.document.createElement("canvas");e.style||(e.style={});if(!e)throw i;return this._initCanvasElement(e),e},_initCanvasElement:function(e){fabric.util.createCanvasElement(e);if(typeof e.getContext=="undefined")throw i},_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.fire("object:removed",{target:e}),e.fire("removed")},getObjects:function(){return this._objects},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"];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.backgroundColor&&(t.fillStyle=this.backgroundColor.toLive?this.backgroundColor.toLive(t):this.backgroundColor,t.fillRect(this.backgroundColor.offsetX||0,this.backgroundColor.offsetY||0,this.width,this.height)),typeof this.backgroundImage=="object"&&this._drawBackroundImage(t);var n=this.getActiveGroup();for(var r=0,i=this._objects.length;r','\n'),t.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),""),this.backgroundColor&&this.backgroundColor.source&&t.push('"),this.backgroundImage&&t.push(''),this.overlayImage&&t.push('');var n=this.getActiveGroup();n&&this.discardActiveGroup();for(var r=0,i=this.getObjects(),s=i.length;r"),t.join("")},remove:function(e){return this.getActiveObject()===e&&(this.fire("before:selection:cleared",{target:e}),this.discardActiveObject(),this.fire("selection:cleared")),fabric.Collection.remove.call(this,e)},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;if(t){i=r;for(var s=r-1;s>=0;--s){var o=e.intersectsWithObject(this._objects[s])||e.isContainedWithinObject(this._objects[s])||this._objects[s].isContainedWithinObject(e);if(o){i=s;break}}}else i=r-1;n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},bringForward:function(e,t){var r=this._objects.indexOf(e);if(r!==this._objects.length-1){var i;if(t){i=r;for(var s=r+1;s"}}),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"}',toGrayscale:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=n.width,s=n.height,o,u,a,f;for(a=0;a0&&(t>this.targetFindTolerance?t-=this.targetFindTolerance:t=0,n>this.targetFindTolerance?n-=this.targetFindTolerance:n=0);var o=!0,u=r.getImageData(t,n,this.targetFindTolerance*2||1,this.targetFindTolerance*2||1);for(var a=3,f=u.data.length;ao.padding?l.x<0?l.x+=o.padding:l.x-=o.padding:l.x=0,i(l.y)>o.padding?l.y<0?l.y+=o.padding:l.y-=o.padding:l.y=0;var c=o.scaleX,h=o.scaleY;if(n==="equally"&&!u&&!a){var p=l.y+l.x,d=(o.height+o.strokeWidth)*r.original.scaleY+(o.width+o.strokeWidth)*r.original.scaleX;c=r.original.scaleX*p/d,h=r.original.scaleY*p/d,o.set("scaleX",c),o.set("scaleY",h)}else n?n==="x"&&!o.get("lockUniScaling")?(c=l.x/(o.width+o.strokeWidth),u||o.set("scaleX",c)):n==="y"&&!o.get("lockUniScaling")&&(h=l.y/(o.height+o.strokeWidth),a||o.set("scaleY",h)):(c=l.x/(o.width+o.strokeWidth),h=l.y/(o.height+o.strokeWidth),u||o.set("scaleX",c),a||o.set("scaleY",h));c<0&&(r.originX==="left"?r.originX="right":r.originX==="right"&&(r.originX="left")),h<0&&(r.originY==="top"?r.originY="bottom":r.originY==="bottom"&&(r.originY="top")),o.setPositionByOrigin(f,r.originX,r.originY)},_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,s=i(n),o=i(r);e.fillStyle=this.selectionColor,e.fillRect(t.ex-(n>0?0:-n),t.ey-(r>0?0:-r),s,o),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var a=t.ex+u-(n>0?0:s),f=t.ey+u-(r>0?0:o);e.beginPath(),fabric.util.drawDashedLine(e,a,f,a+s,f,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f+o-1,a+s,f+o-1,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f,a,f+o,this.selectionDashArray),fabric.util.drawDashedLine(e,a+s-1,f,a+s-1,f+o,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+u-(n>0?0:s),t.ey+u-(r>0?0:o),s,o)},_findSelectedObjects:function(e){var t=[],n=this._groupSelector.ex,r=this._groupSelector.ey,i=n+this._groupSelector.left,u=r+this._groupSelector.top,a,f=new fabric.Point(s(n,i),s(r,u)),l=new fabric.Point(o(n,i),o(r,u)),c=n===i&&r===u;for(var h=this._objects.length;h--;){a=this._objects[h];if(!a)continue;if(a.intersectsWithRect(f,l)||a.isContainedWithinRect(f,l)||a.containsPoint(f)||a.containsPoint(l))if(this.selection&&a.selectable){a.set("active",!0),t.push(a);if(c)break}}t.length===1?this.setActiveObject(t[0],e):t.length>1&&(t=new fabric.Group(t.reverse()),this.setActiveGroup(t),t.saveCoords(),this.fire("selection:created",{target:t}),this.renderAll())},findTarget:function(e,t){if(this.skipTargetFind)return;var n,r=this.getPointer(e);if(this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay.visible&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(e,this._offset))return n=this.lastRenderedObjectWithControlsAboveOverlay,n;var i=this.getActiveGroup();if(i&&!t&&this.containsPoint(e,i))return n=i,n;var s=[];for(var o=this._objects.length;o--;)if(this._objects[o]&&this._objects[o].visible&&this._objects[o].evented&&this.containsPoint(e,this._objects[o])){if(!this.perPixelTargetFind&&!this._objects[o].perPixelTargetFind){n=this._objects[o],this.relatedTarget=n;break}s[s.length]=this._objects[o]}for(var u=0,a=s.length;u"},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();var r=this.transformMatrix;r&&!this.group&&e.setTransform(r[0],r[1],r[2],r[3],r[4],r[5]),n||this.transform(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),this.overlayFill?e.fillStyle=this.overlayFill:this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e):this.fill),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()},_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"),i.add(this);var o=i.toDataURL(e);return this.set(s).setCoords(),i.dispose(),i=null,o},isType:function(e){return this.type===e},toGrayscale:function(){var e=this.get("fill");return e&&this.set("overlayFill",(new t.Color(e)).toGrayscale().toRgb()),this},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.centerH().centerV()},remove:function(){return this.canvas.remove(this)},sendToBack:function(){return this.group?t.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?t.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(e){return this.group?t.StaticCanvas.prototype.sendBackwards.call(this.group,this,e):this.canvas.sendBackwards(this,e),this},bringForward:function(e){return this.group?t.StaticCanvas.prototype.bringForward.call(this.group,this,e):this.canvas.bringForward(this,e),this},moveTo:function(e){return this.group?t.StaticCanvas.prototype.moveTo.call(this.group,this,e):this.canvas.moveTo(this,e),this}}),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;return n==="left"?i=t.x+(this.getWidth()+this.strokeWidth*this.scaleX)/2:n==="right"&&(i=t.x-(this.getWidth()+this.strokeWidth*this.scaleX)/2),r==="top"?s=t.y+(this.getHeight()+this.strokeWidth*this.scaleY)/2:r==="bottom"&&(s=t.y-(this.getHeight()+this.strokeWidth*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;return n==="left"?i=t.x-(this.getWidth()+this.strokeWidth*this.scaleX)/2:n==="right"&&(i=t.x+(this.getWidth()+this.strokeWidth*this.scaleX)/2),r==="top"?s=t.y-(this.getHeight()+this.strokeWidth*this.scaleY)/2:r==="bottom"&&(s=t.y+(this.getHeight()+this.strokeWidth*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,o;return n!==undefined&&r!==undefined?(n==="left"?s=i.x-(this.getWidth()+this.strokeWidth*this.scaleX)/2:n==="right"?s=i.x+(this.getWidth()+this.strokeWidth*this.scaleX)/2:s=i.x,r==="top"?o=i.y-(this.getHeight()+this.strokeWidth*this.scaleY)/2:r==="bottom"?o=i.y+(this.getHeight()+this.strokeWidth*this.scaleY)/2:o=i.y):(s=this.left,o=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(s,o))},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(){var t=e(this.angle),n=this.getWidth()/2,r=Math.cos(t)*n,i=Math.sin(t)*n,s=this.left,o=this.top;if(this.originX==="center"||this.originX==="right")s-=r;if(this.originY==="center"||this.originY==="bottom")o-=i;return{x:s,y:o}}})}(),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,{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;fabric.util.object.extend(fabric.Object.prototype,{_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(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.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,u,a=t/this.scaleX,f=t/this.scaleY,l=this.padding/this.scaleX,c=this.padding/this.scaleY,h=n/this.scaleY,p=n/this.scaleX,d=(n-t)/this.scaleX,v=(n-t)/this.scaleY,m=this.height,g=this.width,y=this.transparentCorners?"strokeRect":"fillRect",b=this.transparentCorners,w=typeof G_vmlCanvasManager!="undefined";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,o=i-p-r-l,u=s-h-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g-p+r+l,u=s-h-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m+v+r+c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m+v+r+c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),this.get("lockUniScaling")||(o=i+g/2-p,u=s-h-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g/2-p,u=s+m+v+r+c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m/2-h,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m/2-h,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),this.hasRotatingPoint&&(o=i+g/2-p,u=this.flipY?s+m+this.rotatingPointOffset/this.scaleY-f/2+r+c:s-this.rotatingPointOffset/this.scaleY-f/2-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),e.restore(),this}})}(),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.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(){var e=this._createBaseSVGMarkup();return e.push("'),e.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(){var e=this._createBaseSVGMarkup(),t=this.width/2,n=this.height/2,r=[-t+" "+n,"0 "+ -n,t+" "+n].join(",");return e.push("'),e.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(){var e=this._createBaseSVGMarkup();return e.push("'),e.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"),t.Rect=t.util.createClass(t.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(e){e=e||{},this.callSuper("initialize",e),this._initRxRy(),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!=="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){return n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0,x:this.get("x"),y:this.get("y")})},toSVG:function(){var e=this._createBaseSVGMarkup();return e.push("'),e.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,r=t.util.array.min;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(){var e=[],t=this._createBaseSVGMarkup();for(var r=0,i=this.points.length;r'),t.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'),t.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(){var e=[],t=this._createBaseSVGMarkup();for(var n=0,r=this.path.length;n',"",""),t.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 n=0,r=e.length;n"),t.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)},toGrayscale:function(){var e=this.paths.length;while(e--)this.paths[e].toGrayscale();return this},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(){var e=this.left,t=this.top;this.forEachObject(function(n){var r=n.get("left"),i=n.get("top");n.set("originalLeft",r),n.set("originalTop",i),n.set("left",r-e),n.set("top",i-t),n.setCoords(),n.__origHasControls=n.hasControls,n.hasControls=!1},this)},toString:function(){return"#"},getObjects:function(){return this._objects},addWithUpdate:function(e){return this._restoreObjectsState(),this._objects.push(e),e.group=this,this.forEachObject(function(e){e.set("active",!0),e.group=this},this),this._calcBounds(),this._updateObjectsCoords(),this},removeWithUpdate:function(e){return this._restoreObjectsState(),this.forEachObject(function(e){e.set("active",!0),e.group=this},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);var r=Math.max(this.scaleX,this.scaleY);this.clipTo&&t.util.clipContext(this,e);for(var i=0,s=this._objects.length;i'+e.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 t=this.fill;this.fill=null,e.push("'),this.fill=t}return e.push(""),e.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)},_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){var n=fabric.document.createElement("img"),r=e.src;n.onload=function(){fabric.Image.prototype._initFilters.call(e,e,function(r){e.filters=r||[];var i=new fabric.Image(n,e);t&&t(i),n=n.onload=n.onerror=null})},n.onerror=function(){fabric.log("Error loading "+n.src),t&&t(null,!0),n=n.onload=n.onerror=null},n.src=r},fabric.Image.fromURL=function(e,t,n){fabric.util.loadImage(e,function(e){t(new fabric.Image(e,n))})},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;s=0&&N=0&&C-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!=="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){this.transform(e,t.isLikelyNode),this._setTextStyles(e);var n=this.text.split(/\r?\n/);this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this.clipTo&&t.util.clipContext(this,e),this._renderTextBackground(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0)),e.save(),this._setShadow(e),this._renderTextFill(e,n),this._renderTextStroke(e,n),this._removeShadow(e),e.restore(),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this.clipTo&&e.restore(),this._setBoundaries(e,n),this._totalLineHeight=0},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_drawChars:function(e,t,n,r,i){t[e](n,r,i)},_drawTextLine:function(e,t,n,r,i,s){i-=this.fontSize/4;if(this.textAlign!=="justify"){this._drawChars(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-s),this.textDecoration.indexOf("overline")>-1&&i(s)},_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){return 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,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative})},toSVG:function(){var e=this.text.split(/\r?\n/),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,s=this._getSVGTextAndBg(t,n,e),o=this._getSVGShadows(t,e);return r+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,['',s.textBgRects.join(""),"',o.join(""),s.textSpans.join(""),"",""].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,n,r){var s=[],o=[],u,a,f,l=1;this.backgroundColor&&this._boundaries&&o.push("');for(u=0,f=r.length;u",t.util.string.escapeXml(r[u]),""),l=1):l++;if(!this.textBackgroundColor||!this._boundaries)continue;o.push("')}return{textSpans:s,textBgRects:o}},_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(){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 +.offsetX+'" dy="'+this.offsetY+'">'+""+""+''+""+""},toObject:function(){return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY}}}),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=fabric.util.removeListener,i=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:"",backgroundImageOpacity:1,backgroundImageStretch:!0,overlayImage:"",overlayImageLeft:0,overlayImageTop:0,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)),this.calcOffset()},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(e,t,n){return fabric.util.loadImage(e,function(e){this.overlayImage=e,n&&"overlayImageLeft"in n&&(this.overlayImageLeft=n.overlayImageLeft),n&&"overlayImageTop"in n&&(this.overlayImageTop=n.overlayImageTop),t&&t()},this),this},setBackgroundImage:function(e,t,n){return fabric.util.loadImage(e,function(e){this.backgroundImage=e,n&&"backgroundImageOpacity"in n&&(this.backgroundImageOpacity=n.backgroundImageOpacity),n&&"backgroundImageStretch"in n&&(this.backgroundImageStretch=n.backgroundImageStretch),t&&t()},this),this},setBackgroundColor:function(e,t){if(e.source){var n=this;fabric.util.loadImage(e.source,function(r){n.backgroundColor=new fabric.Pattern({source:r,repeat:e.repeat}),t&&t()})}else this.backgroundColor=e,t&&t();return this},_createCanvasElement:function(){var e=fabric.document.createElement("canvas");e.style||(e.style={});if(!e)throw i;return this._initCanvasElement(e),e},_initCanvasElement:function(e){fabric.util.createCanvasElement(e);if(typeof e.getContext=="undefined")throw i},_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.fire("object:removed",{target:e}),e.fire("removed")},getObjects:function(){return this._objects},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"];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.backgroundColor&&(t.fillStyle=this.backgroundColor.toLive?this.backgroundColor.toLive(t):this.backgroundColor,t.fillRect(this.backgroundColor.offsetX||0,this.backgroundColor.offsetY||0,this.width,this.height)),typeof this.backgroundImage=="object"&&this._drawBackroundImage(t);var n=this.getActiveGroup();for(var r=0,i=this._objects.length;r','\n'),t.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),""),this.backgroundColor&&this.backgroundColor.source&&t.push('"),this.backgroundImage&&t.push(''),this.overlayImage&&t.push('');var n=this.getActiveGroup();n&&this.discardActiveGroup();for(var r=0,i=this.getObjects(),s=i.length;r"),t.join("")},remove:function(e){return this.getActiveObject()===e&&(this.fire("before:selection:cleared",{target:e}),this.discardActiveObject(),this.fire("selection:cleared")),fabric.Collection.remove.call(this,e)},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;if(t){i=r;for(var s=r-1;s>=0;--s){var o=e.intersectsWithObject(this._objects[s])||e.isContainedWithinObject(this._objects[s])||this._objects[s].isContainedWithinObject(e);if(o){i=s;break}}}else i=r-1;n(this._objects,e),this._objects.splice(i,0,e),this.renderAll&&this.renderAll()}return this},bringForward:function(e,t){var r=this._objects.indexOf(e);if(r!==this._objects.length-1){var i;if(t){i=r;for(var s=r+1;s"}}),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"}',toGrayscale:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=n.width,s=n.height,o,u,a,f;for(a=0;a0&&(t>this.targetFindTolerance?t-=this.targetFindTolerance:t=0,n>this.targetFindTolerance?n-=this.targetFindTolerance:n=0);var o=!0,u=r.getImageData(t,n,this.targetFindTolerance*2||1,this.targetFindTolerance*2||1);for(var a=3,f=u.data.length;ao.padding?l.x<0?l.x+=o.padding:l.x-=o.padding:l.x=0,i(l.y)>o.padding?l.y<0?l.y+=o.padding:l.y-=o.padding:l.y=0;var c=o.scaleX,h=o.scaleY;if(n==="equally"&&!u&&!a){var p=l.y+l.x,d=(o.height+o.strokeWidth)*r.original.scaleY+(o.width+o.strokeWidth)*r.original.scaleX;c=r.original.scaleX*p/d,h=r.original.scaleY*p/d,o.set("scaleX",c),o.set("scaleY",h)}else n?n==="x"&&!o.get("lockUniScaling")?(c=l.x/(o.width+o.strokeWidth),u||o.set("scaleX",c)):n==="y"&&!o.get("lockUniScaling")&&(h=l.y/(o.height+o.strokeWidth),a||o.set("scaleY",h)):(c=l.x/(o.width+o.strokeWidth),h=l.y/(o.height+o.strokeWidth),u||o.set("scaleX",c),a||o.set("scaleY",h));c<0&&(r.originX==="left"?r.originX="right":r.originX==="right"&&(r.originX="left")),h<0&&(r.originY==="top"?r.originY="bottom":r.originY==="bottom"&&(r.originY="top")),o.setPositionByOrigin(f,r.originX,r.originY)},_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,s=i(n),o=i(r);e.fillStyle=this.selectionColor,e.fillRect(t.ex-(n>0?0:-n),t.ey-(r>0?0:-r),s,o),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var a=t.ex+u-(n>0?0:s),f=t.ey+u-(r>0?0:o);e.beginPath(),fabric.util.drawDashedLine(e,a,f,a+s,f,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f+o-1,a+s,f+o-1,this.selectionDashArray),fabric.util.drawDashedLine(e,a,f,a,f+o,this.selectionDashArray),fabric.util.drawDashedLine(e,a+s-1,f,a+s-1,f+o,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+u-(n>0?0:s),t.ey+u-(r>0?0:o),s,o)},_findSelectedObjects:function(e){var t=[],n=this._groupSelector.ex,r=this._groupSelector.ey,i=n+this._groupSelector.left,u=r+this._groupSelector.top,a,f=new fabric.Point(s(n,i),s(r,u)),l=new fabric.Point(o(n,i),o(r,u)),c=n===i&&r===u;for(var h=this._objects.length;h--;){a=this._objects[h];if(!a)continue;if(a.intersectsWithRect(f,l)||a.isContainedWithinRect(f,l)||a.containsPoint(f)||a.containsPoint(l))if(this.selection&&a.selectable){a.set("active",!0),t.push(a);if(c)break}}t.length===1?this.setActiveObject(t[0],e):t.length>1&&(t=new fabric.Group(t.reverse()),this.setActiveGroup(t),t.saveCoords(),this.fire("selection:created",{target:t}),this.renderAll())},findTarget:function(e,t){if(this.skipTargetFind)return;var n,r=this.getPointer(e);if(this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay.visible&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(e,this._offset))return n=this.lastRenderedObjectWithControlsAboveOverlay,n;var i=this.getActiveGroup();if(i&&!t&&this.containsPoint(e,i))return n=i,n;var s=[];for(var o=this._objects.length;o--;)if(this._objects[o]&&this._objects[o].visible&&this._objects[o].evented&&this.containsPoint(e,this._objects[o])){if(!this.perPixelTargetFind&&!this._objects[o].perPixelTargetFind){n=this._objects[o],this.relatedTarget=n;break}s[s.length]=this._objects[o]}for(var u=0,a=s.length;u"},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();var r=this.transformMatrix;r&&!this.group&&e.setTransform(r[0],r[1],r[2],r[3],r[4],r[5]),n||this.transform(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),this.overlayFill?e.fillStyle=this.overlayFill:this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e):this.fill),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()},_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"),i.add(this);var o=i.toDataURL(e);return this.set(s).setCoords(),i.dispose(),i=null,o},isType:function(e){return this.type===e},toGrayscale:function(){var e=this.get("fill");return e&&this.set("overlayFill",(new t.Color(e)).toGrayscale().toRgb()),this},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.centerH().centerV()},remove:function(){return this.canvas.remove(this)},sendToBack:function(){return this.group?t.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?t.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(e){return this.group?t.StaticCanvas.prototype.sendBackwards.call(this.group,this,e):this.canvas.sendBackwards(this,e),this},bringForward:function(e){return this.group?t.StaticCanvas.prototype.bringForward.call(this.group,this,e):this.canvas.bringForward(this,e),this},moveTo:function(e){return this.group?t.StaticCanvas.prototype.moveTo.call(this.group,this,e):this.canvas.moveTo(this,e),this}}),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;return n==="left"?i=t.x+(this.getWidth()+this.strokeWidth*this.scaleX)/2:n==="right"&&(i=t.x-(this.getWidth()+this.strokeWidth*this.scaleX)/2),r==="top"?s=t.y+(this.getHeight()+this.strokeWidth*this.scaleY)/2:r==="bottom"&&(s=t.y-(this.getHeight()+this.strokeWidth*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;return n==="left"?i=t.x-(this.getWidth()+this.strokeWidth*this.scaleX)/2:n==="right"&&(i=t.x+(this.getWidth()+this.strokeWidth*this.scaleX)/2),r==="top"?s=t.y-(this.getHeight()+this.strokeWidth*this.scaleY)/2:r==="bottom"&&(s=t.y+(this.getHeight()+this.strokeWidth*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,o;return n!==undefined&&r!==undefined?(n==="left"?s=i.x-(this.getWidth()+this.strokeWidth*this.scaleX)/2:n==="right"?s=i.x+(this.getWidth()+this.strokeWidth*this.scaleX)/2:s=i.x,r==="top"?o=i.y-(this.getHeight()+this.strokeWidth*this.scaleY)/2:r==="bottom"?o=i.y+(this.getHeight()+this.strokeWidth*this.scaleY)/2:o=i.y):(s=this.left,o=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(s,o))},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(){var t=e(this.angle),n=this.getWidth()/2,r=Math.cos(t)*n,i=Math.sin(t)*n,s=this.left,o=this.top;if(this.originX==="center"||this.originX==="right")s-=r;if(this.originY==="center"||this.originY==="bottom")o-=i;return{x:s,y:o}}})}(),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,{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;fabric.util.object.extend(fabric.Object.prototype,{_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(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.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,u,a=t/this.scaleX,f=t/this.scaleY,l=this.padding/this.scaleX,c=this.padding/this.scaleY,h=n/this.scaleY,p=n/this.scaleX,d=(n-t)/this.scaleX,v=(n-t)/this.scaleY,m=this.height,g=this.width,y=this.transparentCorners?"strokeRect":"fillRect",b=this.transparentCorners,w=typeof G_vmlCanvasManager!="undefined";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,o=i-p-r-l,u=s-h-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g-p+r+l,u=s-h-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m+v+r+c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m+v+r+c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),this.get("lockUniScaling")||(o=i+g/2-p,u=s-h-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g/2-p,u=s+m+v+r+c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m/2-h,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m/2-h,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),this.hasRotatingPoint&&(o=i+g/2-p,u=this.flipY?s+m+this.rotatingPointOffset/this.scaleY-f/2+r+c:s-this.rotatingPointOffset/this.scaleY-f/2-r-c,w||b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),e.restore(),this}})}(),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.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(){var e=this._createBaseSVGMarkup();return e.push("'),e.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(){var e=this._createBaseSVGMarkup(),t=this.width/2,n=this.height/2,r=[-t+" "+n,"0 "+ -n,t+" "+n].join(",");return e.push("'),e.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(){var e=this._createBaseSVGMarkup();return e.push("'),e.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"),t.Rect=t.util.createClass(t.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(e){e=e||{},this.callSuper("initialize",e),this._initRxRy(),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!=="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){return n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0,x:this.get("x"),y:this.get("y")})},toSVG:function(){var e=this._createBaseSVGMarkup();return e.push("'),e.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,r=t.util.array.min;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(){var e=[],t=this._createBaseSVGMarkup();for(var r=0,i=this.points.length;r'),t.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'),t.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(){var e=[],t=this._createBaseSVGMarkup();for(var n=0,r=this.path.length;n',"",""),t.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 n=0,r=e.length;n"),t.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)},toGrayscale:function(){var e=this.paths.length;while(e--)this.paths[e].toGrayscale();return this},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(){var e=this.left,t=this.top;this.forEachObject(function(n){var r=n.get("left"),i=n.get("top");n.set("originalLeft",r),n.set("originalTop",i),n.set("left",r-e),n.set("top",i-t),n.setCoords(),n.__origHasControls=n.hasControls,n.hasControls=!1},this)},toString:function(){return"#"},getObjects:function(){return this._objects},addWithUpdate:function(e){return this._restoreObjectsState(),this._objects.push(e),e.group=this,this.forEachObject(function(e){e.set("active",!0),e.group=this},this),this._calcBounds(),this._updateObjectsCoords(),this},removeWithUpdate:function(e){return this._moveFlippedObject(e),this._restoreObjectsState(),this.forEachObject(function(e){e.set("active",!0),e.group=this},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);var r=Math.max(this.scaleX,this.scaleY);this.clipTo&&t.util.clipContext(this,e);for(var i=0,s=this._objects.length;i'+e.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 t=this.fill;this.fill=null,e.push("'),this.fill=t}return e.push(""),e.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)},_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){var n=fabric.document.createElement("img"),r=e.src;n.onload=function(){fabric.Image.prototype._initFilters.call(e,e,function(r){e.filters=r||[];var i=new fabric.Image(n,e);t&&t(i),n=n.onload=n.onerror=null})},n.onerror=function(){fabric.log("Error loading "+n.src),t&&t(null,!0),n=n.onload=n.onerror=null},n.src=r},fabric.Image.fromURL=function(e,t,n){fabric.util.loadImage(e,function(e){t(new fabric.Image(e,n))})},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;s=0&&N=0&&C-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!=="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){this.transform(e,t.isLikelyNode),this._setTextStyles(e);var n=this.text.split(/\r?\n/);this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this.clipTo&&t.util.clipContext(this,e),this._renderTextBackground(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0)),e.save(),this._setShadow(e),this._renderTextFill(e,n),this._renderTextStroke(e,n),this._removeShadow(e),e.restore(),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this.clipTo&&e.restore(),this._setBoundaries(e,n),this._totalLineHeight=0},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_drawChars:function(e,t,n,r,i){t[e](n,r,i)},_drawTextLine:function(e,t,n,r,i,s){i-=this.fontSize/4;if(this.textAlign!=="justify"){this._drawChars(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-s),this.textDecoration.indexOf("overline")>-1&&i(s)},_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){return 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,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative})},toSVG:function(){var e=this.text.split(/\r?\n/),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,s=this._getSVGTextAndBg(t,n,e),o=this._getSVGShadows(t,e);return r+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,['',s.textBgRects.join(""),"',o.join(""),s.textSpans.join(""),"",""].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,n,r){var s=[],o=[],u,a,f,l=1;this.backgroundColor&&this._boundaries&&o.push("');for(u=0,f=r.length;u",t.util.string.escapeXml(r[u]),""),l=1):l++;if(!this.textBackgroundColor||!this._boundaries)continue;o.push("')}return{textSpans:s,textBgRects:o}},_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(){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 d63b44092a178213d8855f525889a76edbf1e3e4..5075ad56349f78c5d6104836e61800e23b0e0128 100644 GIT binary patch delta 38749 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

ik`Oq9EC@zCjDOy>#kp?$vg0U@uD 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 delta 38532 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 Ue%*mBackwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 * @type Boolean * @default */ - centerTransform: false, + centeredScaling: false, + + /** + * When true, objects use center point as the origin of rotate transformation. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredRotation: false, /** * Indicates that canvas is interactive. This property should not be changed. @@ -8475,7 +8486,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * If not empty the selection border is dashed * @type Array */ - selectionDashArray: [ ], + selectionDashArray: [ ], /** * Color of the border of selection (usually slightly darker than color of selection itself) @@ -8531,7 +8542,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @type String * @default */ - containerClass: 'canvas-container', + containerClass: 'canvas-container', /** * When true, object detection happens on per-pixel basis rather than on per-bounding-box @@ -8552,7 +8563,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @type Boolean * @default */ - skipTargetFind: false, + skipTargetFind: false, /** * @private @@ -8577,31 +8588,38 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab _resetCurrentTransform: function(e) { var t = this._currentTransform; - t.target.set('scaleX', t.original.scaleX); - t.target.set('scaleY', t.original.scaleY); - t.target.set('left', t.original.left); - t.target.set('top', t.original.top); + t.target.set({ + 'scaleX': t.original.scaleX, + 'scaleY': t.original.scaleY, + 'left': t.original.left, + 'top': t.original.top + }); - if (e.altKey || this.centerTransform || t.target.centerTransform) { - if (t.originX !== 'center') { - if (t.originX === 'right') { - t.mouseXSign = -1; - } - else { - t.mouseXSign = 1; - } + if (this._shouldCenterTransform(e, t.target)) { + if (t.action === 'rotate') { + this._setOriginToCenter(t.target); } - if (t.originY !== 'center') { - if (t.originY === 'bottom') { - t.mouseYSign = -1; + else { + if (t.originX !== 'center') { + if (t.originX === 'right') { + t.mouseXSign = -1; + } + else { + t.mouseXSign = 1; + } } - else { - t.mouseYSign = 1; + if (t.originY !== 'center') { + if (t.originY === 'bottom') { + t.mouseYSign = -1; + } + else { + t.mouseYSign = 1; + } } - } - t.originX = 'center'; - t.originY = 'center'; + t.originX = 'center'; + t.originY = 'center'; + } } else { t.originX = t.original.originX; @@ -8718,6 +8736,27 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab ); }, + /** + * @private + * @param {Event} e Event object + * @param {fabric.Object} target + */ + _shouldCenterTransform: function (e, target) { + if (!target) return; + + var t = this._currentTransform, + centerTransform; + + if (t.action === 'scale' || t.action === 'scaleX' || t.action === 'scaleY') { + centerTransform = this.centeredScaling || target.centeredScaling; + } + else if (t.action === 'rotate') { + centerTransform = this.centeredRotation || target.centeredRotation; + } + + return centerTransform ? !e.altKey : e.altKey; + }, + /** * @private * @param {Event} e Event object @@ -8741,7 +8780,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab : 'scale'; } - var originX = target.originX, originY = target.originY; + var originX = target.originX, + originY = target.originY; if (corner === 'ml' || corner === 'tl' || corner === 'bl') { originX = "right"; @@ -8757,12 +8797,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab originY = "top"; } - // if (corner === 'mtr') { - // originX = 'center'; - // originY = 'center'; - // } - - // var center = target.getCenterPoint(); this._currentTransform = { target: target, action: action, @@ -9599,7 +9633,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Event} e Event object fired on mouseup */ __onMouseUp: function (e) { - var target, pointer, render; @@ -9710,7 +9743,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Event} e Event object fired on mousedown */ __onMouseDown: function (e) { - // accept only left clicks var isLeftClick = 'which' in e ? e.which === 1 : e.button === 1; if (!isLeftClick && !fabric.isTouchSupported) return; @@ -9769,17 +9801,13 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this.fire('mouse:down', { target: target, e: e }); target && target.fire('mousedown', { e: e }); - - if (corner === 'mtr' && target.centerTransform) { - this._setOriginToCenter(target); - } }, /** * @private + * @param {Object} target Object for that origin is set to center */ _setOriginToCenter: function(target) { - this._previousOriginX = this._currentTransform.target.originX; this._previousOriginY = this._currentTransform.target.originY; @@ -9795,6 +9823,26 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this._currentTransform.top = target.top; }, + /** + * @private + * @param {Object} target Object for that center is set to origin + */ + _setCenterToOrigin: function(target) { + var originPoint = target.translateToOriginPoint( + target.getCenterPoint(), + this._previousOriginX, + this._previousOriginY); + + target.originX = this._previousOriginX; + target.originY = this._previousOriginY; + + target.left = originPoint.x; + target.top = originPoint.y; + + this._previousOriginX = null; + this._previousOriginY = null; + }, + /** * Method that defines the actions when mouse is hovering the canvas. * The currentTransform parameter will definde whether the user is rotating/scaling/translating @@ -9805,7 +9853,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Event} e Event object fired on mousemove */ __onMouseMove: function (e) { - var target, pointer; if (this.isDrawingMode) { @@ -9855,19 +9902,23 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab var x = pointer.x, y = pointer.y, reset = false, + centerTransform, transform = this._currentTransform; target = transform.target; target.isMoving = true; - if ((transform.action === 'scale' || transform.action === 'scaleX' || transform.action === 'scaleY') && - // Switch from a normal resize to center-based - ((e.altKey && (transform.originX !== 'center' || transform.originY !== 'center')) || - // Switch from center-based resize to normal one - (!e.altKey && transform.originX === 'center' && transform.originY === 'center')) - ) { - this._resetCurrentTransform(e); - reset = true; + if (transform.action === 'scale' || transform.action === 'scaleX' || transform.action === 'scaleY') { + centerTransform = this._shouldCenterTransform(e, target); + + // Switch from a normal resize to center-based + if ((centerTransform && (transform.originX !== 'center' || transform.originY !== 'center')) || + // Switch from center-based resize to normal one + (!centerTransform && transform.originX === 'center' && transform.originY === 'center') + ) { + this._resetCurrentTransform(e); + reset = true; + } } if (transform.action === 'rotate') { @@ -9886,7 +9937,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab else { // Switch from a normal resize to proportional if (!reset && transform.currentAction === 'scale') { - this._resetCurrentTransform(e); + this._resetCurrentTransform(e, target); } transform.currentAction = 'scaleEqually'; @@ -10392,6 +10443,208 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati */ fabric.Object = fabric.util.createClass(/** @lends fabric.Object.prototype */ { + // TODO: maybe document these too + // strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit clipTo transformMatrix visible + + /** + * Retrieves object's shadow + * @method getShadow + * @memberOf fabric.Object.prototype + * @return {Object} Shadow instance + */ + + /** + * Retrieves object's stroke + * @method getStroke + * @memberOf fabric.Object.prototype + * @return {String} stroke value + */ + + /** + * Sets object's stroke + * @method setStroke + * @memberOf fabric.Object.prototype + * @param {String} value stroke value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's strokeWidth + * @method getStrokeWidth + * @memberOf fabric.Object.prototype + * @return {Number} strokeWidth value + */ + + /** + * Sets object's strokeWidth + * @method setStrokeWidth + * @memberOf fabric.Object.prototype + * @param {Number} value strokeWidth value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's originX + * @method getOriginX + * @memberOf fabric.Object.prototype + * @return {String} originX value + */ + + /** + * Sets object's originX + * @method setOriginX + * @memberOf fabric.Object.prototype + * @param {String} value originX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's originY + * @method getOriginY + * @memberOf fabric.Object.prototype + * @return {String} originY value + */ + + /** + * Sets object's originY + * @method setOriginY + * @memberOf fabric.Object.prototype + * @param {String} value originY value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's fill + * @method getFill + * @memberOf fabric.Object.prototype + * @return {String} Fill value (0-1) + */ + + /** + * Sets object's fill + * @method setFill + * @memberOf fabric.Object.prototype + * @param {String} value Fill value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's opacity + * @method getOpacity + * @memberOf fabric.Object.prototype + * @return {Number} Opacity value (0-1) + */ + + /** + * Sets object's opacity + * @method setOpacity + * @memberOf fabric.Object.prototype + * @param {Number} value Opacity value (0-1) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's top position + * @method getTop + * @memberOf fabric.Object.prototype + * @return {Number} Top value (in pixels) + */ + + /** + * Sets object's top position + * @method setTop + * @memberOf fabric.Object.prototype + * @param {Number} value Top value (in pixels) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's left position + * @method getLeft + * @memberOf fabric.Object.prototype + * @return {Number} Left value (in pixels) + */ + + /** + * Sets object's left position + * @method setLeft + * @memberOf fabric.Object.prototype + * @param {Number} value Left value (in pixels) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's scaleX value + * @method getScaleX + * @memberOf fabric.Object.prototype + * @return {Number} scaleX value + */ + + /** + * Sets object's scaleX value + * @method setScaleX + * @memberOf fabric.Object.prototype + * @param {Number} value scaleX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's scaleY value + * @method getScaleY + * @memberOf fabric.Object.prototype + * @return {Number} scaleY value + */ + + /** + * Sets object's scaleY value + * @method setScaleY + * @memberOf fabric.Object.prototype + * @param {Number} value scaleY value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's flipX value + * @method getFlipX + * @memberOf fabric.Object.prototype + * @return {Boolean} flipX value + */ + + /** + * Sets object's flipX value + * @method setFlipX + * @memberOf fabric.Object.prototype + * @param {Boolean} value flipX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's flipY value + * @method getFlipY + * @memberOf fabric.Object.prototype + * @return {Boolean} flipY value + */ + + /** + * Sets object's flipY value + * @method setFlipY + * @memberOf fabric.Object.prototype + * @param {Boolean} value flipY value + * @return {fabric.Object} thisArg + * @chainable + */ + /** * Type of an object (rect, circle, path, etc.) * @type String @@ -10527,10 +10780,23 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * When true, this object will use center point as the origin of transformation - * when being resized via the controls + * when being scaled via the controls. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 * @type Boolean + * @default */ - centerTransform: false, + centeredScaling: false, + + /** + * When true, this object will use center point as the origin of transformation + * when being rotated via the controls. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredRotation: false, /** * Color of object's fill @@ -11544,7 +11810,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati extend(fabric.Object.prototype, fabric.Observable); /** - * Defines the number of fraction digits when serializing object values. You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. + * Defines the number of fraction digits to use when serializing object values. + * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. * @static * @memberof fabric.Object * @constant @@ -11553,6 +11820,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati fabric.Object.NUM_FRACTION_DIGITS = 2; /** + * Unique id used internally when creating SVG elements * @static * @memberof fabric.Object * @type Number @@ -15361,6 +15629,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @chainable */ removeWithUpdate: function(object) { + this._moveFlippedObject(object); this._restoreObjectsState(); // since _restoreObjectsState set objects inactive this.forEachObject(function(o){ o.set('active', true); o.group = this; }, this); @@ -15485,6 +15754,44 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return this; }, + /** + * Moves a flipped object to the position where it's displayed + * @private + * @param {fabric.Object} object + * @return {fabric.Group} thisArg + */ + _moveFlippedObject: function(object) { + var oldOriginX = object.get('originX'); + var oldOriginY = object.get('originY'); + var center = object.getCenterPoint(); + object.set({ + originX: 'center', + originY: 'center', + left: center.x, + top: center.y + }); + + if (this.flipX) { + object.toggle('flipX'); + object.set('left', -object.get('left')); + object.setAngle(-object.getAngle()); + } + if (this.flipY) { + object.toggle('flipY'); + object.set('top', -object.get('top')); + object.setAngle(-object.getAngle()); + } + + var newOrigin = object.getPointByOrigin(oldOriginX, oldOriginY); + object.set({ + originX: oldOriginX, + originY: oldOriginY, + left: newOrigin.x, + top: newOrigin.y + }); + return this; + }, + /** * Restores original state of a specified object in group * @private @@ -15492,7 +15799,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {fabric.Group} thisArg */ _restoreObjectState: function(object) { - var groupLeft = this.get('left'), groupTop = this.get('top'), groupAngle = this.getAngle() * (Math.PI / 180), @@ -15523,6 +15829,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @chainable */ destroy: function() { + this._objects.forEach(this._moveFlippedObject, this); return this._restoreObjectsState(); }, diff --git a/src/shapes/object.class.js b/src/shapes/object.class.js index 5c0b0cee..8de5ba20 100644 --- a/src/shapes/object.class.js +++ b/src/shapes/object.class.js @@ -19,6 +19,208 @@ */ fabric.Object = fabric.util.createClass(/** @lends fabric.Object.prototype */ { + // TODO: maybe document these too + // strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit clipTo transformMatrix visible + + /** + * Retrieves object's shadow + * @method getShadow + * @memberOf fabric.Object.prototype + * @return {Object} Shadow instance + */ + + /** + * Retrieves object's stroke + * @method getStroke + * @memberOf fabric.Object.prototype + * @return {String} stroke value + */ + + /** + * Sets object's stroke + * @method setStroke + * @memberOf fabric.Object.prototype + * @param {String} value stroke value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's strokeWidth + * @method getStrokeWidth + * @memberOf fabric.Object.prototype + * @return {Number} strokeWidth value + */ + + /** + * Sets object's strokeWidth + * @method setStrokeWidth + * @memberOf fabric.Object.prototype + * @param {Number} value strokeWidth value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's originX + * @method getOriginX + * @memberOf fabric.Object.prototype + * @return {String} originX value + */ + + /** + * Sets object's originX + * @method setOriginX + * @memberOf fabric.Object.prototype + * @param {String} value originX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's originY + * @method getOriginY + * @memberOf fabric.Object.prototype + * @return {String} originY value + */ + + /** + * Sets object's originY + * @method setOriginY + * @memberOf fabric.Object.prototype + * @param {String} value originY value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's fill + * @method getFill + * @memberOf fabric.Object.prototype + * @return {String} Fill value (0-1) + */ + + /** + * Sets object's fill + * @method setFill + * @memberOf fabric.Object.prototype + * @param {String} value Fill value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's opacity + * @method getOpacity + * @memberOf fabric.Object.prototype + * @return {Number} Opacity value (0-1) + */ + + /** + * Sets object's opacity + * @method setOpacity + * @memberOf fabric.Object.prototype + * @param {Number} value Opacity value (0-1) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's top position + * @method getTop + * @memberOf fabric.Object.prototype + * @return {Number} Top value (in pixels) + */ + + /** + * Sets object's top position + * @method setTop + * @memberOf fabric.Object.prototype + * @param {Number} value Top value (in pixels) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's left position + * @method getLeft + * @memberOf fabric.Object.prototype + * @return {Number} Left value (in pixels) + */ + + /** + * Sets object's left position + * @method setLeft + * @memberOf fabric.Object.prototype + * @param {Number} value Left value (in pixels) + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's scaleX value + * @method getScaleX + * @memberOf fabric.Object.prototype + * @return {Number} scaleX value + */ + + /** + * Sets object's scaleX value + * @method setScaleX + * @memberOf fabric.Object.prototype + * @param {Number} value scaleX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's scaleY value + * @method getScaleY + * @memberOf fabric.Object.prototype + * @return {Number} scaleY value + */ + + /** + * Sets object's scaleY value + * @method setScaleY + * @memberOf fabric.Object.prototype + * @param {Number} value scaleY value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's flipX value + * @method getFlipX + * @memberOf fabric.Object.prototype + * @return {Boolean} flipX value + */ + + /** + * Sets object's flipX value + * @method setFlipX + * @memberOf fabric.Object.prototype + * @param {Boolean} value flipX value + * @return {fabric.Object} thisArg + * @chainable + */ + + /** + * Retrieves object's flipY value + * @method getFlipY + * @memberOf fabric.Object.prototype + * @return {Boolean} flipY value + */ + + /** + * Sets object's flipY value + * @method setFlipY + * @memberOf fabric.Object.prototype + * @param {Boolean} value flipY value + * @return {fabric.Object} thisArg + * @chainable + */ + /** * Type of an object (rect, circle, path, etc.) * @type String @@ -1184,7 +1386,8 @@ extend(fabric.Object.prototype, fabric.Observable); /** - * Defines the number of fraction digits when serializing object values. You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. + * Defines the number of fraction digits to use when serializing object values. + * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. * @static * @memberof fabric.Object * @constant @@ -1193,6 +1396,7 @@ fabric.Object.NUM_FRACTION_DIGITS = 2; /** + * Unique id used internally when creating SVG elements * @static * @memberof fabric.Object * @type Number