From b5d76f752dd2b02ba10c48b38292ceb533b2f65f Mon Sep 17 00:00:00 2001 From: kangax Date: Mon, 11 Jun 2012 19:17:24 +0200 Subject: [PATCH] =?UTF-8?q?Add=20more=20image=20filters=20(Sepia,=20Sepia2?= =?UTF-8?q?,=20Brightness,=20Noise,=20GradientTransparency)=20based=20on?= =?UTF-8?q?=20Stoyan's=20demo=20=E2=80=94=20http://www.phpied.com/pixel-ma?= =?UTF-8?q?nipulation-in-canvas/=20Fix=20bug=20with=20`fabric.Image`=20and?= =?UTF-8?q?=20filters.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HEADER.js | 2 +- dist/all.js | 328 ++++++++++++++++++++++++++++++++++++++----- dist/all.min.js | 4 +- dist/all.min.js.gz | Bin 39143 -> 39627 bytes package.json | 2 +- src/image.class.js | 9 +- src/image_filters.js | 317 +++++++++++++++++++++++++++++++++++++---- 7 files changed, 587 insertions(+), 75 deletions(-) diff --git a/HEADER.js b/HEADER.js index cd7e196f..ef6f3600 100644 --- a/HEADER.js +++ b/HEADER.js @@ -1,6 +1,6 @@ /*! Fabric.js Copyright 2008-2012, Bitsonnet (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: "0.8.17" }; +var fabric = fabric || { version: "0.8.18" }; if (typeof exports != 'undefined') { exports.fabric = fabric; diff --git a/dist/all.js b/dist/all.js index d8ac68b2..396d1116 100644 --- a/dist/all.js +++ b/dist/all.js @@ -1,6 +1,6 @@ /*! Fabric.js Copyright 2008-2012, Bitsonnet (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: "0.8.17" }; +var fabric = fabric || { version: "0.8.18" }; if (typeof exports != 'undefined') { exports.fabric = fabric; @@ -11196,13 +11196,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { */ type: 'image', - /** - * Filters to be applied to an image (when calling `applyFilters`) - * @property - * @type Array - */ - filters: [ ], - /** * Constructor * @param {HTMLImageElement | String} element Image element @@ -11216,6 +11209,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { this._originalImage = this.getElement(); this._initConfig(options); + this.filters = [ ]; + if (options.filters) { this.filters = options.filters; this.applyFilters(); @@ -11707,13 +11702,13 @@ fabric.Image.filters = { }; * @memberOf fabric.Image.filters */ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Image.filters.Grayscale.prototype */ { - + /** * @param {String} type */ type: "Grayscale", - - /** + + /** * @method applyTo * @memberOf fabric.Image.filters.Grayscale.prototype * @param {Object} canvasEl Canvas element to apply filter to @@ -11721,7 +11716,7 @@ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Imag applyTo: function(canvasEl) { var context = canvasEl.getContext('2d'), imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), - data = imageData.data, + data = imageData.data, iLen = imageData.width, jLen = imageData.height, index, average, i, j; @@ -11740,8 +11735,8 @@ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Imag context.putImageData(imageData, 0, 0); }, - - /** + + /** * @method toJSON * @return {String} json representation of filter */ @@ -11753,19 +11748,19 @@ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Imag fabric.Image.filters.Grayscale.fromObject = function() { return new fabric.Image.filters.Grayscale(); }; - + /** * @class fabric.Image.filters.RemoveWhite * @memberOf fabric.Image.filters */ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Image.filters.RemoveWhite.prototype */ { - + /** * @param {String} type */ type: "RemoveWhite", - - /** + + /** * @memberOf fabric.Image.filters.RemoveWhite.prototype * @param {Object} [options] Options object */ @@ -11774,8 +11769,8 @@ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Im this.threshold = options.threshold || 30; this.distance = options.distance || 20; }, - - /** + + /** * @method applyTo * @param {Object} canvasEl Canvas element to apply filter to */ @@ -11795,10 +11790,10 @@ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Im g = data[i+1]; b = data[i+2]; - if (r > limit && - g > limit && - b > limit && - abs(r-g) < distance && + if (r > limit && + g > limit && + b > limit && + abs(r-g) < distance && abs(r-b) < distance && abs(g-b) < distance) { @@ -11808,15 +11803,15 @@ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Im context.putImageData(imageData, 0, 0); }, - - /** + + /** * @method toJSON * @return {String} json representation of filter */ toJSON: function() { - return { - type: this.type, - threshold: this.threshold, + return { + type: this.type, + threshold: this.threshold, distance: this.distance }; } @@ -11831,13 +11826,13 @@ fabric.Image.filters.RemoveWhite.fromObject = function(object) { * @memberOf fabric.Image.filters */ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.filters.Invert.prototype */ { - + /** * @param {String} type */ type: "Invert", - - /** + + /** * @method applyTo * @memberOf fabric.Image.filters.Invert.prototype * @param {Object} canvasEl Canvas element to apply filter to @@ -11845,9 +11840,9 @@ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.f applyTo: function(canvasEl) { var context = canvasEl.getContext('2d'), imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), - data = imageData.data, + data = imageData.data, iLen = data.length, i; - + for (i = 0; i < iLen; i+=4) { data[i] = 255 - data[i]; data[i + 1] = 255 - data[i + 1]; @@ -11856,8 +11851,8 @@ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.f context.putImageData(imageData, 0, 0); }, - - /** + + /** * @method toJSON * @return {String} json representation of filter */ @@ -11869,6 +11864,267 @@ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.f fabric.Image.filters.Invert.fromObject = function() { return new fabric.Image.filters.Invert(); }; + +/** + * @class fabric.Image.filters.Sepia + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Sepia = fabric.util.createClass( /** @scope fabric.Image.filters.Sepia.prototype */ { + + /** + * @param {String} type + */ + type: "Sepia", + + /** + * @method applyTo + * @memberOf fabric.Image.filters.Sepia.prototype + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + iLen = data.length, i, avg; + + for (i = 0; i < iLen; i+=4) { + avg = 0.3 * data[i] + 0.59 * data[i + 1] + 0.11 * data[i + 2]; + data[i] = avg + 100; + data[i + 1] = avg + 50; + data[i + 2] = avg + 255; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { type: this.type }; + } +}); + +fabric.Image.filters.Sepia.fromObject = function() { + return new fabric.Image.filters.Sepia(); +}; + +/** + * @class fabric.Image.filters.Sepia2 + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Sepia2 = fabric.util.createClass( /** @scope fabric.Image.filters.Sepia2.prototype */ { + + /** + * @param {String} type + */ + type: "Sepia2", + + /** + * @method applyTo + * @memberOf fabric.Image.filters.Sepia.prototype + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + iLen = data.length, i, r, g, b; + + for (i = 0; i < iLen; i+=4) { + + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + + data[i] = (r * 0.393 + g * 0.769 + b * 0.189 ) / 1.351; + data[i + 1] = (r * 0.349 + g * 0.686 + b * 0.168 ) / 1.203; + data[i + 2] = (r * 0.272 + g * 0.534 + b * 0.131 ) / 2.140; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { type: this.type }; + } +}); + +fabric.Image.filters.Sepia2.fromObject = function() { + return new fabric.Image.filters.Sepia2(); +}; + +/** + * @class fabric.Image.filters.Brightness + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Brightness = fabric.util.createClass( /** @scope fabric.Image.filters.Brightness.prototype */ { + + /** + * @param {String} type + */ + type: "Brightness", + + /** + * @memberOf fabric.Image.filters.Brightness.prototype + * @param {Object} [options] Options object + */ + initialize: function(options) { + options || (options = { }); + this.brightness = options.brightness || 100; + }, + + /** + * @method applyTo + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + brightness = this.brightness; + + for (var i = 0, len = data.length; i < len; i += 4) { + data[i] += brightness; + data[i + 1] += brightness; + data[i + 2] += brightness; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { + type: this.type, + brightness: this.brightness + }; + } +}); + +fabric.Image.filters.Brightness.fromObject = function(object) { + return new fabric.Image.filters.Brightness(object); +}; + +/** + * @class fabric.Image.filters.Brightness + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Noise = fabric.util.createClass( /** @scope fabric.Image.filters.Noise.prototype */ { + + /** + * @param {String} type + */ + type: "Noise", + + /** + * @memberOf fabric.Image.filters.Brightness.prototype + * @param {Object} [options] Options object + */ + initialize: function(options) { + options || (options = { }); + this.noise = options.noise || 100; + }, + + /** + * @method applyTo + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + noise = this.noise, rand; + + for (var i = 0, len = data.length; i < len; i += 4) { + + rand = (0.5 - Math.random()) * noise; + + data[i] += rand; + data[i + 1] += rand; + data[i + 2] += rand; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { + type: this.type, + noise: this.noise + }; + } +}); + +fabric.Image.filters.Noise.fromObject = function(object) { + return new fabric.Image.filters.Noise(object); +}; + +/** + * @class fabric.Image.filters.Brightness + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.GradientTransparency = fabric.util.createClass( /** @scope fabric.Image.filters.GradientTransparency.prototype */ { + + /** + * @param {String} type + */ + type: "GradientTransparency", + + /** + * @memberOf fabric.Image.filters.GradientTransparency.prototype + * @param {Object} [options] Options object + */ + initialize: function(options) { + options || (options = { }); + this.threshold = options.threshold || 100; + }, + + /** + * @method applyTo + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + threshold = this.threshold, + total = data.length; + + for (var i = 0, len = data.length; i < len; i += 4) { + data[i + 3] = threshold + 255 * (total - i) / total; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { + type: this.type, + threshold: this.threshold + }; + } +}); + +fabric.Image.filters.GradientTransparency.fromObject = function(object) { + return new fabric.Image.filters.GradientTransparency(object); +}; //= require "object.class" (function(global) { diff --git a/dist/all.min.js b/dist/all.min.js index 568d318c..89f567d1 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,7 +1,7 @@ /* Fabric.js Copyright 2008-2012, Bitsonnet (Juriy Zaytsev, Maxim Chernyak) */ -var fabric=fabric||{version:"0.8.17"};if(typeof exports!="undefined"){exports.fabric=fabric}if(typeof document!="undefined"&&typeof window!="undefined"){fabric.document=document;fabric.window=window}else{fabric.document=require("jsdom").jsdom("");fabric.window=fabric.document.createWindow()}fabric.isTouchSupported="ontouchstart" in fabric.document.documentElement;if(!this.JSON){this.JSON={}}(function(){function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i");fabric.window=fabric.document.createWindow()}fabric.isTouchSupported="ontouchstart" in fabric.document.documentElement;if(!this.JSON){this.JSON={}}(function(){function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i=y.length+G){B()}else{setTimeout(arguments.callee,10)}});return function(D){if(A){D()}else{z.push(D)}}})(),supports:function(A,z){var y=fabric.document.createElement("span").style;if(y[A]===undefined){return false}y[A]=z;return y[A]===z},textAlign:function(B,A,y,z){if(A.get("textAlign")=="right"){if(y>0){B=" "+B}}else{if(y400}if(F==500){F=400}for(var G in D){G=parseInt(G,10);if(!C||GA){A=G}H.push(G)}if(FA){F=A}H.sort(function(J,I){return(B?(J>F&&I>F)?JI:(JI:JV){V=Q}if(P>T){T=P}if(Qz){z=e}L.push(e);e=0;continue}var B=ab.glyphs[ag[aa]]||ab.missingGlyph;if(!B){continue}e+=D=Number(B.w||ab.w)+U}L.push(e);e=Math.max(z,e);var m=[];for(var aa=L.length;aa--;){m[aa]=e-L[aa]}if(D===null){return null}V+=(H.width-D);C+=H.minX;var v,p;if(n){v=J;p=J.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=E;p=fabric.document.createElement("canvas");v.appendChild(p);if(A.printable){var Y=fabric.document.createElement("span");Y.className="cufon-alt";Y.appendChild(fabric.document.createTextNode(E));v.appendChild(Y)}}var ah=v.style;var O=p.style||{};var k=o.convert(H.height-I+T);var af=Math.ceil(k);var S=af/k;p.width=Math.ceil(o.convert(e+V-C)*S);p.height=af;I+=H.minY;O.top=Math.round(o.convert(I-ab.ascent))+"px";O.left=Math.round(o.convert(C))+"px";var j=Math.ceil(o.convert(e*S));var t=j+"px";var s=o.convert(ab.height);var F=(A.lineHeight-1)*o.convert(-ab.ascent/5)*(M-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*M)+F;Cufon.textOptions.lines=M;Cufon.textOptions.totalLineHeight=F;if(a){ah.width=t;ah.height=s+"px"}else{ah.paddingLeft=t;ah.paddingBottom=(s-1)+"px"}var ad=Cufon.textOptions.context||p.getContext("2d"),K=af/H.height;Cufon.textOptions.fontAscent=ab.ascent*K;Cufon.textOptions.boundaries=null;for(var w=Cufon.textOptions.shadowOffsets,aa=R.length;aa--;){w[aa]=[R[aa][0]*K,R[aa][1]*K]}ad.save();ad.scale(K,K);ad.translate(-C-((1/K*p.width)/2)+(Cufon.fonts[ab.family].offsetLeft||0),-I-(Cufon.textOptions.height/K)/2);ad.lineWidth=ab.face["underline-thickness"];ad.save();function q(l,i){ad.strokeStyle=i;ad.beginPath();ad.moveTo(0,l);ad.lineTo(e,l);ad.stroke()}var r=Cufon.getTextDecoration(A),u=A.fontStyle==="italic";function ae(){ad.save();ad.fillStyle=A.backgroundColor;var aj=0,an=0,y=[{left:0}];if(A.textAlign==="right"){ad.translate(m[an],0);y[0].left=m[an]*K}else{if(A.textAlign==="center"){ad.translate(m[an]/2,0);y[0].left=m[an]/2*K}}for(var al=0,ak=ag.length;al.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 c(e,f){return a(e,/(?:em|ex|%)$/i.test(f)?"1em":f)}function a(h,i){if(/px$/i.test(i)){return parseFloat(i)}var g=h.style.left,f=h.runtimeStyle.left;h.runtimeStyle.left=h.currentStyle.left;h.style.left=i;var e=h.style.pixelLeft;h.style.left=g;h.runtimeStyle.left=f;return e}return function(T,z,O,w,D,U,M){var h=(z===null);if(h){z=D.alt}var B=T.viewBox;var j=O.computedFontSize||(O.computedFontSize=new Cufon.CSS.Size(c(U,O.get("fontSize"))+"px",T.baseSize));var L=O.computedLSpacing;if(L==undefined){L=O.get("letterSpacing");O.computedLSpacing=L=(L=="normal")?0:~~j.convertFrom(a(U,L))}var t,m;if(h){t=D;m=D.firstChild}else{t=fabric.document.createElement("span");t.className="cufon cufon-vml";t.alt=z;m=fabric.document.createElement("span");m.className="cufon-vml-canvas";t.appendChild(m);if(w.printable){var R=fabric.document.createElement("span");R.className="cufon-alt";R.appendChild(fabric.document.createTextNode(z));t.appendChild(R)}if(!M){t.appendChild(fabric.document.createElement("cvml:shape"))}}var Z=t.style;var G=m.style;var f=j.convert(B.height),W=Math.ceil(f);var K=W/f;var J=B.minX,I=B.minY;G.height=W;G.top=Math.round(j.convert(I-T.ascent));G.left=Math.round(j.convert(J));Z.height=j.convert(T.height)+"px";var p=Cufon.getTextDecoration(w);var y=O.get("color");var X=Cufon.CSS.textTransform(z,O).split("");var e=0,H=0,q=null;var x,r,A=w.textShadow;for(var S=0,Q=0,P=X.length;St?m:(l-k);p(q(currentTime,j,byValue,m));if(l>t||n()){u.onComplete&&u.onComplete();return}h(o)})()}var h=(function(){return fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(k,j){fabric.window.setTimeout(k,1000/60)}})();function a(k,m,l){if(k){var j=new Image();j.onload=function(){m&&m.call(l,j);j=j.onload=null};j.src=k}else{m&&m.call(l,k)}}fabric.util.removeFromArray=g;fabric.util.degreesToRadians=b;fabric.util.toFixed=d;fabric.util.getRandomInt=e;fabric.util.falseFunction=i;fabric.util.animate=c;fabric.util.requestAnimFrame=h;fabric.util.loadImage=a})();(function(){var d=Array.prototype.slice;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(g){if(this===void 0||this===null){throw new TypeError()}var h=Object(this),e=h.length>>>0;if(e===0){return -1}var i=0;if(arguments.length>0){i=Number(arguments[1]);if(i!==i){i=0}else{if(i!==0&&i!==(1/0)&&i!==-(1/0)){i=(i>0||-1)*Math.floor(Math.abs(i))}}}if(i>=e){return -1}var f=i>=0?i:Math.max(e-Math.abs(i),0);for(;f>>0;f>>0;g>>0;f>>0;f>>0;g>>0,f=0,h;if(arguments.length>1){h=arguments[1]}else{do{if(f in this){h=this[f++];break}if(++f>=e){throw new TypeError()}}while(true)}for(;f=e){e=h[f][g]}}}else{while(f--){if(h[f]>=e){e=h[f]}}}return e}function c(h,g){if(!h||h.length===0){return undefined}var f=h.length-1,e=g?h[f][g]:h[f];if(g){while(f--){if(h[f][g]/g,">")}fabric.util.string={camelize:b,capitalize:c,escapeXml:a}}());(function(){var c=Array.prototype.slice,a=Function.prototype.apply,b=function(){};if(!Function.prototype.bind){Function.prototype.bind=function(d){var g=this,e=c.call(arguments,1),f;if(e.length){f=function(){return a.call(g,this instanceof b?this:d,e.concat(c.call(arguments)))}}else{f=function(){return a.call(g,this instanceof b?this:d,arguments)}}b.prototype=this.prototype;f.prototype=new b;return f}}})();(function(){var f=Array.prototype.slice,e=function(){};var c=(function(){for(var g in {toString:1}){if(g==="toString"){return false}}return true})();var b=function(g,j,h){for(var i in j){if(i in g.prototype&&typeof g.prototype[i]=="function"){g.prototype[i]=(function(k){return function(){var m=this.constructor.superclass;this.constructor.superclass=h;var l=j[k].apply(this,arguments);this.constructor.superclass=m;if(k!=="initialize"){return l}}})(i)}else{g.prototype[i]=j[i]}if(c){if(j.toString!==Object.prototype.toString){g.prototype.toString=j.toString}if(j.valueOf!==Object.prototype.valueOf){g.prototype.valueOf=j.valueOf}}}};function a(){}function d(){var k=null,j=f.call(arguments,0);if(typeof j[0]==="function"){k=j.shift()}function g(){this.initialize.apply(this,arguments)}g.superclass=k;g.subclasses=[];if(k){a.prototype=k.prototype;g.prototype=new a;k.subclasses.push(g)}for(var h=0,l=j.length;h-1?c(j,l.match(/opacity:\s*(\d?\.?\d*)/)[1]):j}for(var m in l){if(m==="opacity"){c(j,l[m])}else{var k=(m==="float"||m==="cssFloat")?(typeof n.styleFloat==="undefined"?"cssFloat":"styleFloat"):m;n[k]=l[m]}}return j}var h=fabric.document.createElement("div"),g=typeof h.style.opacity==="string",b=typeof h.style.filter==="string",a=fabric.document.defaultView,f=a&&typeof a.getComputedStyle!=="undefined",d=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,c=function(i){return i};if(g){c=function(i,j){i.style.opacity=j;return i}}else{if(b){c=function(i,j){var k=i.style;if(i.currentStyle&&!i.currentStyle.hasLayout){k.zoom=1}if(d.test(k.filter)){j=j>=0.9999?"":("alpha(opacity="+(j*100)+")");k.filter=k.filter.replace(d,j)}else{k.filter+=" alpha(opacity="+(j*100)+")"}return i}}}fabric.util.setStyle=e})();(function(){var h=Array.prototype.slice;function g(j){return typeof j==="string"?fabric.document.getElementById(j):j}function b(j){return h.call(j,0)}try{var i=b(fabric.document.childNodes) instanceof Array}catch(a){}if(!i){b=function(k){var j=new Array(k.length),l=k.length;while(l--){j[l]=k[l]}return j}}function c(k,j){var l=fabric.document.createElement(k);for(var m in j){if(m==="class"){l.className=j[m]}else{if(m==="for"){l.htmlFor=j[m]}else{l.setAttribute(m,j[m])}}}return l}function f(j,k){if((" "+j.className+" ").indexOf(" "+k+" ")===-1){j.className+=(j.className?" ":"")+k}}function e(k,l,j){if(typeof l==="string"){l=c(l,j)}if(k.parentNode){k.parentNode.replaceChild(l,k)}l.appendChild(k);return l}function d(k){var j=0,l=0;do{j+=k.offsetTop||0;l+=k.offsetLeft||0;k=k.offsetParent}while(k);return({left:l,top:j})}(function(){var k=fabric.document.documentElement.style;var l="userSelect" in k?"userSelect":"MozUserSelect" in k?"MozUserSelect":"WebkitUserSelect" in k?"WebkitUserSelect":"KhtmlUserSelect" in k?"KhtmlUserSelect":"";function m(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=fabric.util.falseFunction}if(l){n.style[l]="none"}else{if(typeof n.unselectable=="string"){n.unselectable="on"}}return n}function j(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=null}if(l){n.style[l]=""}else{if(typeof n.unselectable=="string"){n.unselectable=""}}return n}fabric.util.makeElementUnselectable=m;fabric.util.makeElementSelectable=j})();(function(){function j(k,o){var m=fabric.document.getElementsByTagName("head")[0],l=fabric.document.createElement("script"),n=true;l.type="text/javascript";l.setAttribute("runat","server");l.onload=l.onreadystatechange=function(p){if(n){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete"){return}n=false;o(p||fabric.window.event);l=l.onload=l.onreadystatechange=null}};l.src=k;m.appendChild(l)}fabric.util.getScript=j})();fabric.util.getById=g;fabric.util.toArray=b;fabric.util.makeElement=c;fabric.util.addClass=f;fabric.util.wrapElement=e;fabric.util.getElementOffset=d})();(function(){function d(e,f){return e+(/\?/.test(e)?"&":"?")+f}var c=(function(){var h=[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 e=h.length;e--;){try{var g=h[e]();if(g){return h[e]}}catch(f){}}})();function a(){}function b(g,f){f||(f={});var j=f.method?f.method.toUpperCase():"GET",i=f.onComplete||function(){},h=c(),e;h.onreadystatechange=function(){if(h.readyState===4){i(h);h.onreadystatechange=a}};if(j==="GET"){e=null;if(typeof f.parameters=="string"){g=d(g,f.parameters)}}h.open(j,g,true);if(j==="POST"||j==="PUT"){h.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}h.send(e);return h}fabric.util.request=b})();(function(){fabric.util.ease={};function d(F,E,H,G){return H*(F/=G)*F+E}function l(F,E,H,G){return -H*(F/=G)*(F-2)+E}function r(F,E,H,G){if((F/=G/2)<1){return H/2*F*F+E}return -H/2*((--F)*(F-2)-1)+E}function B(F,E,H,G){return H*(F/=G)*F*F+E}function q(F,E,H,G){return H*((F=F/G-1)*F*F+1)+E}function u(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F+E}return H/2*((F-=2)*F*F+2)+E}function t(F,E,H,G){return H*(F/=G)*F*F*F+E}function g(F,E,H,G){return -H*((F=F/G-1)*F*F*F-1)+E}function k(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F*F+E}return -H/2*((F-=2)*F*F*F-2)+E}function y(F,E,H,G){return H*(F/=G)*F*F*F*F+E}function j(F,E,H,G){return H*((F=F/G-1)*F*F*F*F+1)+E}function n(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F*F*F+E}return H/2*((F-=2)*F*F*F*F+2)+E}function f(F,E,H,G){return -H*Math.cos(F/G*(Math.PI/2))+H+E}function o(F,E,H,G){return H*Math.sin(F/G*(Math.PI/2))+E}function v(F,E,H,G){return -H/2*(Math.cos(Math.PI*F/G)-1)+E}function D(F,E,H,G){return(F==0)?E:H*Math.pow(2,10*(F/G-1))+E}function c(F,E,H,G){return(F==G)?E+H:H*(-Math.pow(2,-10*F/G)+1)+E}function i(F,E,H,G){if(F==0){return E}if(F==G){return E+H}if((F/=G/2)<1){return H/2*Math.pow(2,10*(F-1))+E}return H/2*(-Math.pow(2,-10*--F)+2)+E}function h(F,E,H,G){return -H*(Math.sqrt(1-(F/=G)*F)-1)+E}function p(F,E,H,G){return H*Math.sqrt(1-(F=F/G-1)*F)+E}function x(F,E,H,G){if((F/=G/2)<1){return -H/2*(Math.sqrt(1-F*F)-1)+E}return H/2*(Math.sqrt(1-(F-=2)*F)+1)+E}function s(G,E,K,J){var H=1.70158;var I=0;var F=K;if(G==0){return E}if((G/=J)==1){return E+K}if(!I){I=J*0.3}if(F-1;w=w.split(/\s+/);var u=[];if(y){for(var v=0,t=w.length;v/i,""))}if(!w.documentElement){return}h.parseSVGDocument(w.documentElement,function(z,y){k.set(t,{objects:h.util.array.invoke(z,"toObject"),options:y});v(z,y)})}}function b(v){var u=v.objects,t=v.options;u=u.map(function(w){return h[f(w.type)].fromObject(w)});return({objects:u,options:t})}function n(t,w){t=t.trim();var u;if(typeof DOMParser!=="undefined"){var v=new DOMParser();if(v&&v.parseFromString){u=v.parseFromString(t,"text/xml")}}else{if(h.window.ActiveXObject){var u=new ActiveXObject("Microsoft.XMLDOM");u.async="false";u.loadXML(t.replace(//i,""))}}h.parseSVGDocument(u.documentElement,function(y,x){w(y,x)})}function m(w){var u="";for(var v=0,t=w.length;v",'",""].join("")}return u}p(h,{parseAttributes:e,parseElements:g,parseStyleAttribute:i,parsePointsAttribute:s,getCSSRules:d,loadSVGFromURL:c,loadSVGFromString:n,createSVGFontFacesMarkup:m})})(typeof exports!="undefined"?exports:this);(function(){function c(h){var g=h.getAttribute("style");if(g){var k=g.split(/\s*;\s*/);if(k[k.length-1]===""){k.pop()}for(var f=k.length;f--;){var e=k[f].split(/\s*:\s*/),d=e[0].trim(),j=e[1].trim();if(d==="stop-color"){return j}}}}fabric.Gradient={create:function(l,m){m||(m={});var f=m.x1||0,k=m.y1||0,e=m.x2||l.canvas.width,i=m.y2||0,g=m.colorStops;var j=l.createLinearGradient(f,k,e,i);for(var h in g){var d=g[h];j.addColorStop(parseFloat(h),d)}return j},fromElement:function(d,m,l){var j=d.getElementsByTagName("stop"),d,f,e={},g,k={x1:d.getAttribute("x1")||0,y1:d.getAttribute("y1")||0,x2:d.getAttribute("x2")||"100%",y2:d.getAttribute("y2")||0};for(var h=j.length;h--;){d=j[h];f=d.getAttribute("offset");f=parseFloat(f)/(/%$/.test(f)?100:1);e[f]=c(d)||d.getAttribute("stop-color")}a(l,k);return fabric.Gradient.create(m,{x1:k.x1,y1:k.y1,x2:k.x2,y2:k.y2,colorStops:e})},forObject:function(g,d,e){e||(e={});a(g,e);var f=fabric.Gradient.create(d,{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,colorStops:e.colorStops});return f}};function a(f,e){for(var g in e){if(typeof e[g]==="string"&&/^\d+%$/.test(e[g])){var d=parseFloat(e[g],10);if(g==="x1"||g==="x2"){e[g]=f.width*d/100}else{if(g==="y1"||g==="y2"){e[g]=f.height*d/100}}}if(g==="x1"||g==="x2"){e[g]-=f.width/2}else{if(g==="y1"||g==="y2"){e[g]-=f.height/2}}}}function b(j){var f=j.getElementsByTagName("linearGradient"),d=j.getElementsByTagName("radialGradient"),g,h={};for(var e=f.length;e--;){g=f[e];h[g.id]=g}for(var e=d.length;e--;){g=d[e];h[g.id]=g}return h}fabric.getGradientDefs=b})();(function(b){var c=b.fabric||(b.fabric={});if(c.Point){c.warn("fabric.Point is already defined");return}c.Point=a;function a(d,e){if(arguments.length>0){this.init(d,e)}}a.prototype={constructor:a,init:function(d,e){this.x=d;this.y=e},add:function(d){return new a(this.x+d.x,this.y+d.y)},addEquals:function(d){this.x+=d.x;this.y+=d.y;return this},scalarAdd:function(d){return new a(this.x+d,this.y+d)},scalarAddEquals:function(d){this.x+=d;this.y+=d;return this},subtract:function(d){return new a(this.x-d.x,this.y-d.y)},subtractEquals:function(d){this.x-=d.x;this.y-=d.y;return this},scalarSubtract:function(d){return new a(this.x-d,this.y-d)},scalarSubtractEquals:function(d){this.x-=d;this.y-=d;return this},multiply:function(d){return new a(this.x*d,this.y*d)},multiplyEquals:function(d){this.x*=d;this.y*=d;return this},divide:function(d){return new a(this.x/d,this.y/d)},divideEquals:function(d){this.x/=d;this.y/=d;return this},eq:function(d){return(this.x==d.x&&this.y==d.y)},lt:function(d){return(this.xd.x&&this.y>d.y)},gte:function(d){return(this.x>=d.x&&this.y>=d.y)},lerp:function(e,d){return new a(this.x+(e.x-this.x)*d,this.y+(e.y-this.y)*d)},distanceFrom:function(f){var e=this.x-f.x,d=this.y-f.y;return Math.sqrt(e*e+d*d)},min:function(d){return new a(Math.min(this.x,d.x),Math.min(this.y,d.y))},max:function(d){return new a(Math.max(this.x,d.x),Math.max(this.y,d.y))},toString:function(){return this.x+","+this.y},setXY:function(d,e){this.x=d;this.y=e},setFromPoint:function(d){this.x=d.x;this.y=d.y},swap:function(e){var d=this.x,f=this.y;this.x=e.x;this.y=e.y;e.x=d;e.y=f}}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Intersection){b.warn("fabric.Intersection is already defined");return}function c(d){if(arguments.length>0){this.init(d)}}b.Intersection=c;b.Intersection.prototype={init:function(d){this.status=d;this.points=[]},appendPoint:function(d){this.points.push(d)},appendPoints:function(d){this.points=this.points.concat(d)}};b.Intersection.intersectLineLine=function(h,f,l,k){var m,i=(k.x-l.x)*(h.y-l.y)-(k.y-l.y)*(h.x-l.x),j=(f.x-h.x)*(h.y-l.y)-(f.y-h.y)*(h.x-l.x),g=(k.y-l.y)*(f.x-h.x)-(k.x-l.x)*(f.y-h.y);if(g!=0){var e=i/g,d=j/g;if(0<=e&&e<=1&&0<=d&&d<=1){m=new c("Intersection");m.points.push(new b.Point(h.x+e*(f.x-h.x),h.y+e*(f.y-h.y)))}else{m=new c("No Intersection")}}else{if(i==0||j==0){m=new c("Coincident")}else{m=new c("Parallel")}}return m};b.Intersection.intersectLinePolygon=function(e,d,l){var m=new c("No Intersection"),f=l.length;for(var h=0;h0){m.status="Intersection"}return m};b.Intersection.intersectPolygonPolygon=function(j,h){var f=new c("No Intersection"),l=j.length;for(var k=0;k0){f.status="Intersection"}return f};b.Intersection.intersectPolygonRectangle=function(n,e,d){var g=e.min(d),m=e.max(d),f=new b.Point(m.x,g.y),l=new b.Point(g.x,m.y),k=c.intersectLinePolygon(g,f,n),j=c.intersectLinePolygon(f,m,n),i=c.intersectLinePolygon(m,l,n),h=c.intersectLinePolygon(l,g,n),o=new c("No Intersection");o.appendPoints(k.points);o.appendPoints(j.points);o.appendPoints(i.points);o.appendPoints(h.points);if(o.points.length>0){o.status="Intersection"}return o}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Color){b.warn("fabric.Color is already defined.");return}function c(d){if(!d){this.setSource([0,0,0,1])}else{this._tryParsingColor(d)}}b.Color=c;b.Color.prototype={_tryParsingColor:function(d){var e=c.sourceFromHex(d);if(!e){e=c.sourceFromRgb(d)}if(e){this.setSource(e)}},getSource:function(){return this._source},setSource:function(d){this._source=d},toRgb:function(){var d=this.getSource();return"rgb("+d[0]+","+d[1]+","+d[2]+")"},toRgba:function(){var d=this.getSource();return"rgba("+d[0]+","+d[1]+","+d[2]+","+d[3]+")"},toHex:function(){var h=this.getSource();var f=h[0].toString(16);f=(f.length==1)?("0"+f):f;var e=h[1].toString(16);e=(e.length==1)?("0"+e):e;var d=h[2].toString(16);d=(d.length==1)?("0"+d):d;return f.toUpperCase()+e.toUpperCase()+d.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var d=this.getSource();d[3]=e;this.setSource(d);return this},toGrayscale:function(){var f=this.getSource(),e=parseInt((f[0]*0.3+f[1]*0.59+f[2]*0.11).toFixed(0),10),d=f[3];this.setSource([e,e,e,d]);return this},toBlackWhite:function(d){var g=this.getSource(),f=(g[0]*0.3+g[1]*0.59+g[2]*0.11).toFixed(0),e=g[3],d=d||127;f=(Number(f)','',"',"Created with Fabric.js ",fabric.version,"",fabric.createSVGFontFacesMarkup(this.getObjects())];if(this.backgroundImage){h.push('')}for(var j=0,k=this.getObjects(),g=k.length;j");return h.join("")},isEmpty:function(){return this._objects.length===0},remove:function(g){e(this._objects,g);if(this.getActiveObject()===g){this.fire("before:selection:cleared",{target:g});this.discardActiveObject();this.fire("selection:cleared")}this.renderAll();return g},sendToBack:function(g){e(this._objects,g);this._objects.unshift(g);return this.renderAll()},bringToFront:function(g){e(this._objects,g);this._objects.push(g);return this.renderAll()},sendBackwards:function(j){var h=this._objects.indexOf(j),g=h;if(h!==0){for(var k=h-1;k>=0;--k){if(j.intersectsWithObject(this._objects[k])||j.isContainedWithinObject(this._objects[k])){g=k;break}}e(this._objects,j);this._objects.splice(g,0,j)}return this.renderAll()},bringForward:function(k){var n=this.getObjects(),h=n.indexOf(k),g=h;if(h!==n.length-1){for(var m=h+1,j=this._objects.length;m"};f(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',toGrayscale:function(l){var k=l.getContext("2d"),g=k.getImageData(0,0,l.width,l.height),p=g.data,m=g.width,r=g.height,q,h,o,n;for(o=0;o0)?0:-v),r.ey-((u>0)?0:-u),t,s);this.contextTop.lineWidth=this.selectionLineWidth;this.contextTop.strokeStyle=this.selectionBorderColor;this.contextTop.strokeRect(r.ex+a-((v>0)?0:t),r.ey+a-((u>0)?0:s),t,s)},_findSelectedObjects:function(x){var y,t,D=[],s=this._groupSelector.ex,C=this._groupSelector.ey,r=s+this._groupSelector.left,A=C+this._groupSelector.top,z,w=new fabric.Point(f(s,r),f(C,A)),B=new fabric.Point(l(s,r),l(C,A));for(var u=0,v=this._objects.length;u1){var D=new fabric.Group(D);this.setActiveGroup(D);D.saveCoords();this.fire("selection:created",{target:D})}}this.renderAll()},findTarget:function(v,s){var u,w=this.getPointer(v);var t=this.getActiveGroup();if(t&&!s&&this.containsPoint(v,t)){u=t;return u}for(var r=this._objects.length;r--;){if(this._objects[r]&&this.containsPoint(v,this._objects[r])){u=this._objects[r];this.relatedTarget=u;break}}if(u&&u.selectable){return u}},getPointer:function(r){var s=q(r);return{x:s.x-this._offset.left,y:s.y-this._offset.top}},_createUpperCanvas:function(){this.upperCanvasEl=this._createCanvasElement();this.upperCanvasEl.className="upper-canvas";this.wrapperEl.appendChild(this.upperCanvasEl);this._applyCanvasStyle(this.upperCanvasEl);this.contextTop=this.upperCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{"class":this.CONTAINER_CLASS});fabric.util.setStyle(this.wrapperEl,{width:this.getWidth()+"px",height:this.getHeight()+"px",position:"relative"});fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(s){var t=this.getWidth()||s.width,r=this.getHeight()||s.height;fabric.util.setStyle(s,{position:"absolute",width:t+"px",height:r+"px",left:0,top:0});s.width=t;s.height=r;fabric.util.makeElementUnselectable(s)},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},setActiveObject:function(r,s){if(this._activeObject){this._activeObject.setActive(false)}this._activeObject=r;r.setActive(true);this.renderAll();this.fire("object:selected",{target:r,e:s});return this},getActiveObject:function(){return this._activeObject},discardActiveObject:function(){if(this._activeObject){this._activeObject.setActive(false)}this._activeObject=null;return this},setActiveGroup:function(r){this._activeGroup=r;return this},getActiveGroup:function(){return this._activeGroup},discardActiveGroup:function(){var r=this.getActiveGroup();if(r){r.destroy()}return this.setActiveGroup(null)},deactivateAll:function(){var s=this.getObjects(),t=0,r=s.length;for(;t1){var o=new fabric.PathGroup(q,n)}else{var o=q[0]}o.setSourcePath(m);if(!(o instanceof fabric.PathGroup)){fabric.util.object.extend(o,n);if(typeof n.angle!=="undefined"){o.setAngle(n.angle)}}g(o,l)})}}}},this)}catch(c){fabric.log(c.message)}},loadFromJSON:function(a,d){if(!a){return}var b=JSON.parse(a);if(!b||(b&&!b.objects)){return}this.clear();var c=this;this._enlivenObjects(b.objects,function(){c.backgroundColor=b.background;if(b.backgroundImage){c.setBackgroundImage(b.backgroundImage,c.renderAll.bind(c));c.backgroundImageOpacity=b.backgroundImageOpacity;c.backgroundImageStretch=b.backgroundImageStretch}if(d){d()}});return this},_enlivenObjects:function(b,e){var c=0,a=b.filter(function(f){return f.type==="image"}).length;var d=this;b.forEach(function(h,g){if(!h.type){return}switch(h.type){case"image":case"font":fabric[fabric.util.string.capitalize(h.type)].fromObject(h,function(i){d.insertAt(i,g,true);if(++c===a){if(e){e()}}});break;default:var f=fabric[fabric.util.string.camelize(fabric.util.string.capitalize(h.type))];if(f&&f.fromObject){d.insertAt(f.fromObject(h),g,true)}break}});if(a===0&&e){e()}},_toDataURL:function(a,b){this.clone(function(c){b(c.toDataURL(a))})},_toDataURLWithMultiplier:function(a,c,b){this.clone(function(d){b(d.toDataURLWithMultiplier(a,c))})},clone:function(b){var a=JSON.stringify(this);this.cloneWithoutData(function(c){c.loadFromJSON(a,function(){if(b){b(c)}})})},cloneWithoutData:function(c){var a=fabric.document.createElement("canvas");a.width=this.getWidth();a.height=this.getHeight();var b=new fabric.Canvas(a);b.clipTo=this.clipTo;if(this.backgroundImage){b.setBackgroundImage(this.backgroundImage.src,function(){b.renderAll();if(c){c(b)}});b.backgroundImageOpacity=this.backgroundImageOpacity;b.backgroundImageStretch=this.backgroundImageStretch}else{if(c){c(b)}}}});(function(a){var d=a.fabric||(a.fabric={}),l=d.util.object.extend,m=d.util.object.clone,c=d.util.toFixed,k=d.util.string.capitalize,p=d.util.getPointer,b=d.util.degreesToRadians,o=Array.prototype.slice;if(d.Object){return}d.Object=d.util.createClass({type:"object",includeDefaultValues:true,NUM_FRACTION_DIGITS:2,MIN_SCALE_LIMIT:0.1,stateProperties:("top left width height scaleX scaleY flipX flipY theta angle opacity cornersize fill overlayFill stroke strokeWidth fillRule borderScaleFactor transformMatrix selectable").split(" "),top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:false,flipY:false,theta:0,opacity:1,angle:0,cornersize:12,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",fill:"rgb(0,0,0)",fillRule:"source-over",overlayFill:null,stroke:null,strokeWidth:1,borderOpacityWhenMoving:0.4,borderScaleFactor:1,transformMatrix:null,selectable:true,hasControls:true,hasBorders:true,hasRotatingPoint:false,callSuper:function(i){var q=this.constructor.superclass.prototype[i];return(arguments.length>1)?q.apply(this,o.call(arguments,1)):q.call(this)},initialize:function(i){i&&this.setOptions(i)},setOptions:function(q){var r=this.stateProperties.length,s;while(r--){s=this.stateProperties[r];if(s in q){this.set(s,q[s])}}},transform:function(i){i.globalAlpha=this.opacity;i.translate(this.left,this.top);i.rotate(this.theta);i.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(){var i={type:this.type,left:c(this.left,this.NUM_FRACTION_DIGITS),top:c(this.top,this.NUM_FRACTION_DIGITS),width:c(this.width,this.NUM_FRACTION_DIGITS),height:c(this.height,this.NUM_FRACTION_DIGITS),fill:this.fill,overlayFill:this.overlayFill,stroke:this.stroke,strokeWidth:this.strokeWidth,scaleX:c(this.scaleX,this.NUM_FRACTION_DIGITS),scaleY:c(this.scaleY,this.NUM_FRACTION_DIGITS),angle:c(this.getAngle(),this.NUM_FRACTION_DIGITS),flipX:this.flipX,flipY:this.flipY,opacity:c(this.opacity,this.NUM_FRACTION_DIGITS),selectable:this.selectable,hasControls:this.hasControls,hasBorders:this.hasBorders,hasRotatingPoint:this.hasRotatingPoint};if(!this.includeDefaultValues){i=this._removeDefaultValues(i)}return i},toDatalessObject:function(){return this.toObject()},getSvgStyles:function(){return["stroke: ",(this.stroke?this.stroke:"none"),"; ","stroke-width: ",(this.strokeWidth?this.strokeWidth:"0"),"; ","fill: ",(this.fill?this.fill:"none"),"; ","opacity: ",(this.opacity?this.opacity:"1"),";"].join("")},getSvgTransform:function(){var i=this.getAngle();return["translate(",c(this.left,2)," ",c(this.top,2),")",i!==0?(" rotate("+c(i,2)+")"):"",(this.scaleX===1&&this.scaleY===1)?"":(" scale("+c(this.scaleX,2)+" "+c(this.scaleY,2)+")")].join("")},_removeDefaultValues:function(q){var i=d.Object.prototype.options;if(i){this.stateProperties.forEach(function(r){if(q[r]===i[r]){delete q[r]}})}return q},isActive:function(){return !!this.active},setActive:function(i){this.active=!!i;return this},toString:function(){return"#"},set:function(q,i){var s=(q==="scaleX"||q==="scaleY")&&ir.x&&s.xr.y&&u.y=v)&&(s.d.y>=v)){continue}if((s.o.x==s.d.x)&&(s.o.x>=w)){x=s.o.x;u=v}else{z=0;y=(s.d.y-s.o.y)/(s.d.x-s.o.x);r=v-z*w;q=s.o.y-y*s.o.x;x=-(r-q)/(z-y);u=r+z*x}if(x>=w){t+=1}if(t==2){break}}return t},_getImageLines:function(r,q){return{topline:{o:r.tl,d:r.tr},rightline:{o:r.tr,d:r.br},bottomline:{o:r.br,d:r.bl},leftline:{o:r.bl,d:r.tl}}},_setCornerCoords:function(){var w=this.oCoords,r=b(45-this.getAngle()),i=Math.sqrt(2*Math.pow(this.cornersize,2))/2,x=i*Math.cos(r),q=i*Math.sin(r),v=Math.sin(this.theta),u=Math.cos(this.theta);w.tl.corner={tl:{x:w.tl.x-q,y:w.tl.y-x},tr:{x:w.tl.x+x,y:w.tl.y-q},bl:{x:w.tl.x-x,y:w.tl.y+q},br:{x:w.tl.x+q,y:w.tl.y+x}};w.tr.corner={tl:{x:w.tr.x-q,y:w.tr.y-x},tr:{x:w.tr.x+x,y:w.tr.y-q},br:{x:w.tr.x+q,y:w.tr.y+x},bl:{x:w.tr.x-x,y:w.tr.y+q}};w.bl.corner={tl:{x:w.bl.x-q,y:w.bl.y-x},bl:{x:w.bl.x-x,y:w.bl.y+q},br:{x:w.bl.x+q,y:w.bl.y+x},tr:{x:w.bl.x+x,y:w.bl.y-q}};w.br.corner={tr:{x:w.br.x+x,y:w.br.y-q},bl:{x:w.br.x-x,y:w.br.y+q},br:{x:w.br.x+q,y:w.br.y+x},tl:{x:w.br.x-q,y:w.br.y-x}};w.ml.corner={tl:{x:w.ml.x-q,y:w.ml.y-x},tr:{x:w.ml.x+x,y:w.ml.y-q},bl:{x:w.ml.x-x,y:w.ml.y+q},br:{x:w.ml.x+q,y:w.ml.y+x}};w.mt.corner={tl:{x:w.mt.x-q,y:w.mt.y-x},tr:{x:w.mt.x+x,y:w.mt.y-q},bl:{x:w.mt.x-x,y:w.mt.y+q},br:{x:w.mt.x+q,y:w.mt.y+x}};w.mr.corner={tl:{x:w.mr.x-q,y:w.mr.y-x},tr:{x:w.mr.x+x,y:w.mr.y-q},bl:{x:w.mr.x-x,y:w.mr.y+q},br:{x:w.mr.x+q,y:w.mr.y+x}};w.mb.corner={tl:{x:w.mb.x-q,y:w.mb.y-x},tr:{x:w.mb.x+x,y:w.mb.y-q},bl:{x:w.mb.x-x,y:w.mb.y+q},br:{x:w.mb.x+q,y:w.mb.y+x}};var t=40;w.mtr.corner={tl:{x:w.mtr.x-q+(v*t),y:w.mtr.y-x-(u*t)},tr:{x:w.mtr.x+x+(v*t),y:w.mtr.y-q-(u*t)},bl:{x:w.mtr.x-x+(v*t),y:w.mtr.y+q-(u*t)},br:{x:w.mtr.x+q+(v*t),y:w.mtr.y+x-(u*t)}};var s=(-t-this.currentHeight);w.mbr.corner={tl:{x:w.mbr.x-q+(v*s),y:w.mbr.y-x-(u*s)},tr:{x:w.mbr.x+x+(v*s),y:w.mbr.y-q-(u*s)},bl:{x:w.mbr.x-x+(v*s),y:w.mbr.y+q-(u*s)},br:{x:w.mbr.x+q+(v*s),y:w.mbr.y+x-(u*s)}}},toGrayscale:function(){var i=this.get("fill");if(i){this.set("overlayFill",new d.Color(i).toGrayscale().toRgb())}return this},complexity:function(){return 0},toJSON:function(){return this.toObject()},setGradientFill:function(i,q){this.set("fill",d.Gradient.forObject(this,i,q))},animate:function(q,s,i){var r=this;if(!("from" in i)){i.from=this.get(q)}if(/[+-]/.test(s.charAt(0))){s=this.get(q)+parseFloat(s)}d.util.animate({startValue:i.from,endValue:s,byValue:i.by,easing:i.easing,duration:i.duration,onChange:function(t){r.set(q,t);i.onChange&&i.onChange()},onComplete:function(){r.setCoords();i.onComplete&&i.onComplete()}})}});d.Object.prototype.rotate=d.Object.prototype.setAngle;var j=d.Object.prototype;for(var g=j.stateProperties.length;g--;){var h=j.stateProperties[g],e=h.charAt(0).toUpperCase()+h.slice(1),f="set"+e,n="get"+e;if(!j[n]){j[n]=(function(i){return new Function('return this.get("'+i+'")')})(h)}if(!j[f]){j[f]=(function(i){return new Function("value",'return this.set("'+i+'", value)')})(h)}}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),e=c.util.object.extend,d=c.Object.prototype.set,a={x1:1,x2:1,y1:1,y2:1};if(c.Line){c.warn("fabric.Line is already defined");return}c.Line=c.util.createClass(c.Object,{type:"line",initialize:function(g,f){if(!g){g=[0,0,0,0]}this.callSuper("initialize",f);this.set("x1",g[0]);this.set("y1",g[1]);this.set("x2",g[2]);this.set("y2",g[3]);this._setWidthHeight()},_setWidthHeight:function(){this.set("width",(this.x2-this.x1)||1);this.set("height",(this.y2-this.y1)||1);this.set("left",this.x1+this.width/2);this.set("top",this.y1+this.height/2)},set:function(f,g){d.call(this,f,g);if(f in a){this._setWidthHeight()}return this},_render:function(f){f.beginPath();f.moveTo(this.width===1?0:(-this.width/2),this.height===1?0:(-this.height/2));f.lineTo(this.width===1?0:(this.width/2),this.height===1?0:(this.height/2));f.lineWidth=this.strokeWidth;var g=f.strokeStyle;f.strokeStyle=f.fillStyle;f.stroke();f.strokeStyle=g},complexity:function(){return 1},toObject:function(){return e(this.callSuper("toObject"),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){return[""].join("")}});c.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" ");c.Line.fromElement=function(g,f){var i=c.parseAttributes(g,c.Line.ATTRIBUTE_NAMES);var h=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new c.Line(h,e(i,f))};c.Line.fromObject=function(f){var g=[f.x1,f.y1,f.x2,f.y2];return new c.Line(g,f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),d=Math.PI*2,e=b.util.object.extend;if(b.Circle){b.warn("fabric.Circle is already defined.");return}b.Circle=b.util.createClass(b.Object,{type:"circle",initialize:function(f){f=f||{};this.set("radius",f.radius||0);this.callSuper("initialize",f);var g=this.get("radius")*2;this.set("width",g).set("height",g)},toObject:function(){return e(this.callSuper("toObject"),{radius:this.get("radius")})},toSVG:function(){return('')},_render:function(f,g){f.beginPath();f.globalAlpha*=this.opacity;f.arc(g?this.left:0,g?this.top:0,this.radius,0,d,false);f.closePath();if(this.fill){f.fill()}if(this.stroke){f.stroke()}},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(f){this.radius=f;this.set("width",f*2).set("height",f*2)},complexity:function(){return 1}});b.Circle.ATTRIBUTE_NAMES="cx cy r fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Circle.fromElement=function(g,f){f||(f={});var h=b.parseAttributes(g,b.Circle.ATTRIBUTE_NAMES);if(!c(h)){throw Error("value of `r` attribute is required and can not be negative")}if("left" in h){h.left-=(f.width/2)||0}if("top" in h){h.top-=(f.height/2)||0}return new b.Circle(e(h,f))};function c(f){return(("radius" in f)&&(f.radius>0))}b.Circle.fromObject=function(f){return new b.Circle(f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Triangle){b.warn("fabric.Triangle is already defined");return}b.Triangle=b.util.createClass(b.Object,{type:"triangle",initialize:function(c){c=c||{};this.callSuper("initialize",c);this.set("width",c.width||100).set("height",c.height||100)},_render:function(c){var d=this.width/2,e=this.height/2;c.beginPath();c.moveTo(-d,e);c.lineTo(0,-e);c.lineTo(d,e);c.closePath();if(this.fill){c.fill()}if(this.stroke){c.stroke()}},complexity:function(){return 1},toSVG:function(){var c=this.width/2,d=this.height/2;var e=[-c+" "+d,"0 "+-d,c+" "+d].join(",");return''}});b.Triangle.fromObject=function(c){return new b.Triangle(c)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),c=Math.PI*2,d=b.util.object.extend;if(b.Ellipse){b.warn("fabric.Ellipse is already defined.");return}b.Ellipse=b.util.createClass(b.Object,{type:"ellipse",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(){return d(this.callSuper("toObject"),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(){return[""].join("")},render:function(e,f){if(this.rx===0||this.ry===0){return}return this.callSuper("render",e,f)},_render:function(e,f){e.beginPath();e.save();e.globalAlpha*=this.opacity;e.transform(1,0,0,this.ry/this.rx,0,0);e.arc(f?this.left:0,f?this.top:0,this.rx,0,c,false);if(this.stroke){e.stroke()}if(this.fill){e.fill()}e.restore()},complexity:function(){return 1}});b.Ellipse.ATTRIBUTE_NAMES="cx cy rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Ellipse.fromElement=function(f,e){e||(e={});var g=b.parseAttributes(f,b.Ellipse.ATTRIBUTE_NAMES);if("left" in g){g.left-=(e.width/2)||0}if("top" in g){g.top-=(e.height/2)||0}return new b.Ellipse(d(g,e))};b.Ellipse.fromObject=function(e){return new b.Ellipse(e)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={});if(c.Rect){console.warn("fabric.Rect is already defined");return}c.Rect=c.util.createClass(c.Object,{type:"rect",options:{rx:0,ry:0},initialize:function(d){this._initStateProperties();this.callSuper("initialize",d);this._initRxRy()},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat(["rx","ry"])},_initRxRy:function(){if(this.rx&&!this.ry){this.ry=this.rx}else{if(this.ry&&!this.rx){this.rx=this.ry}}},_render:function(f){var j=this.rx||0,i=this.ry||0,d=-this.width/2,k=-this.height/2,e=this.width,g=this.height;f.beginPath();f.globalAlpha*=this.opacity;if(this.group){f.translate(this.x||0,this.y||0)}f.moveTo(d+j,k);f.lineTo(d+e-j,k);f.bezierCurveTo(d+e,k,d+e,k+i,d+e,k+i);f.lineTo(d+e,k+g-i);f.bezierCurveTo(d+e,k+g,d+e-j,k+g,d+e-j,k+g);f.lineTo(d+j,k+g);f.bezierCurveTo(d,k+g,d,k+g-i,d,k+g-i);f.lineTo(d,k+i);f.bezierCurveTo(d,k,d+j,k,d+j,k);f.closePath();if(this.fill){f.fill()}if(this.stroke){f.stroke()}},_normalizeLeftTopProperties:function(d){if(d.left){this.set("left",d.left+this.getWidth()/2)}this.set("x",d.left||0);if(d.top){this.set("top",d.top+this.getHeight()/2)}this.set("y",d.top||0);return this},complexity:function(){return 1},toObject:function(){return c.util.object.extend(this.callSuper("toObject"),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){return''}});c.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");function a(d){d.left=d.left||0;d.top=d.top||0;return d}c.Rect.fromElement=function(e,d){if(!e){return null}var g=c.parseAttributes(e,c.Rect.ATTRIBUTE_NAMES);g=a(g);var f=new c.Rect(c.util.object.extend((d?c.util.object.clone(d):{}),g));f._normalizeLeftTopProperties(g);return f};c.Rect.fromObject=function(d){return new c.Rect(d)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),a=c.util.toFixed;if(c.Polyline){c.warn("fabric.Polyline is already defined");return}c.Polyline=c.util.createClass(c.Object,{type:"polyline",initialize:function(e,d){d=d||{};this.set("points",e);this.callSuper("initialize",d);this._calcDimensions()},_calcDimensions:function(){return c.Polygon.prototype._calcDimensions.call(this)},toObject:function(){return c.Polygon.prototype.toObject.call(this)},toSVG:function(){var f=[];for(var e=0,d=this.points.length;e"].join("")},_render:function(f){var e;f.beginPath();for(var g=0,d=this.points.length;g"].join("")},_render:function(l){var k;l.beginPath();for(var m=0,j=this.points.length;m1){E=Math.sqrt(E);O*=E;N*=E}var R=aa/O;var Q=W/O;var D=(-W)/N;var C=(aa)/N;var H=R*M+Q*L;var q=D*M+C*L;var F=R*T+Q*S;var ab=D*T+C*S;var Z=(F-H)*(F-H)+(ab-q)*(ab-q);var U=1/Z-0.25;if(U<0){U=0}var w=Math.sqrt(U);if(P==J){w=-w}var V=0.5*(H+F)-w*(ab-q);var K=0.5*(q+ab)+w*(F-H);var v=Math.atan2(q-K,H-V);var u=Math.atan2(ab-K,F-V);var Y=u-v;if(Y<0&&P==1){Y+=2*Math.PI}else{if(Y>0&&P==0){Y-=2*Math.PI}}var B=Math.ceil(Math.abs(Y/(Math.PI*0.5+0.001)));var I=[];for(var X=0;X"},toObject:function(){var q=g(this.callSuper("toObject"),{path:this.path});if(this.sourcePath){q.sourcePath=this.sourcePath}if(this.transformMatrix){q.transformMatrix=this.transformMatrix}return q},toDatalessObject:function(){var q=this.toObject();if(this.sourcePath){q.path=this.sourcePath}delete q.sourcePath;return q},toSVG:function(){var t=[];for(var r=0,q=this.path.length;r',"',""].join("")},complexity:function(){return this.path.length},_parsePath:function(){var C=[],z,v,y;for(var u=0,t,q,w=this.path.length;uB){for(var r=1,x=q.length;r"];for(var l=0,j=m.length;l");return k.join("")},toString:function(){return"#"},isSameColor:function(){var j=this.getObjects()[0].get("fill");return this.getObjects().every(function(k){return k.get("fill")===j})},complexity:function(){return this.paths.reduce(function(j,k){return j+((k&&k.complexity)?k.complexity():0)},0)},toGrayscale:function(){var j=this.paths.length;while(j--){this.paths[j].toGrayscale()}return this},getObjects:function(){return this.paths}});function c(m){for(var l=0,j=m.length;l"},getObjects:function(){return this.objects},add:function(h){this._restoreObjectsState();this.objects.push(h);h.setActive(true);this._calcBounds();this._updateObjectsCoords();return this},remove:function(h){this._restoreObjectsState();f(this.objects,h);h.setActive(false);this._calcBounds();this._updateObjectsCoords();return this},size:function(){return this.getObjects().length},set:function(h,k){if(typeof k=="function"){this.set(h,k(this[h]))}else{if(h==="fill"||h==="opacity"){var j=this.objects.length;this[h]=k;while(j--){this.objects[j].set(h,k)}}else{this[h]=k}}return this},contains:function(h){return this.objects.indexOf(h)>-1},toObject:function(){return g(this.callSuper("toObject"),{objects:b(this.objects,"clone")})},render:function(j){j.save();this.transform(j);var n=Math.max(this.scaleX,this.scaleY);for(var l=0,h=this.objects.length,k;k=this.objects[l];l++){var m=k.borderScaleFactor;k.borderScaleFactor=n;k.render(j);k.borderScaleFactor=m}this.hideBorders||this.drawBorders(j);this.hideCorners||this.drawCorners(j);j.restore();this.setCoords()},item:function(h){return this.getObjects()[h]},complexity:function(){return this.getObjects().reduce(function(i,h){i+=(typeof h.complexity=="function")?h.complexity():0;return i},0)},_restoreObjectsState:function(){this.objects.forEach(this._restoreObjectState,this);return this},_restoreObjectState:function(j){var l=this.get("left"),m=this.get("top"),h=this.getAngle()*(Math.PI/180),k=j.get("originalLeft"),n=j.get("originalTop"),i=Math.cos(h)*j.get("top")+Math.sin(h)*j.get("left"),o=-Math.sin(h)*j.get("top")+Math.cos(h)*j.get("left");j.setAngle(j.getAngle()+this.getAngle());j.set("left",l+o*this.get("scaleX"));j.set("top",m+i*this.get("scaleY"));j.set("scaleX",j.get("scaleX")*this.get("scaleX"));j.set("scaleY",j.get("scaleY")*this.get("scaleY"));j.setCoords();j.hideCorners=false;j.setActive(false);j.setCoords();return this},destroy:function(){return this._restoreObjectsState()},saveCoords:function(){this._originalLeft=this.get("left");this._originalTop=this.get("top");return this},hasMoved:function(){return this._originalLeft!==this.get("left")||this._originalTop!==this.get("top")},setObjectsCoords:function(){this.forEachObject(function(h){h.setCoords()});return this},activateAllObjects:function(){return this.setActive(true)},setActive:function(h){this.forEachObject(function(i){i.setActive(h)});return this},forEachObject:e.StaticCanvas.prototype.forEachObject,_setOpacityIfSame:function(){var j=this.getObjects(),i=j[0]?j[0].get("opacity"):1;var h=j.every(function(k){return k.get("opacity")===i});if(h){this.opacity=i}},_calcBounds:function(){var s=[],q=[],p,n,k,h,m,l,u,r=0,t=this.objects.length;for(;ri.x&&j-hi.y},toGrayscale:function(){var h=this.objects.length;while(h--){this.objects[h].toGrayscale()}}});e.Group.fromObject=function(h){return new e.Group(h.objects,h)}})(typeof exports!="undefined"?exports:this);(function(a){var b=fabric.util.object.extend;if(!a.fabric){a.fabric={}}if(a.fabric.Image){fabric.warn("fabric.Image is already defined.");return}if(!fabric.Object){fabric.warn("fabric.Object is required for fabric.Image initialization");return}fabric.Image=fabric.util.createClass(fabric.Object,{active:false,bordervisibility:false,cornervisibility:false,type:"image",filters:[],initialize:function(d,c){c||(c={});this.callSuper("initialize",c);this._initElement(d);this._originalImage=this.getElement();this._initConfig(c);if(c.filters){this.filters=c.filters;this.applyFilters()}},getElement:function(){return this._element},setElement:function(c){this._element=c;this._initConfig();return this},getOriginalSize:function(){var c=this.getElement();return{width:c.width,height:c.height}},setBorderVisibility:function(c){this._resetWidthHeight();this._adjustWidthHeightToBorders(showBorder);this.setCoords()},setCornersVisibility:function(c){this.cornervisibility=!!c},render:function(c,d){c.save();if(!d){this.transform(c)}this._render(c);if(this.active&&!d){this.drawBorders(c);this.hideCorners||this.drawCorners(c)}c.restore()},toObject:function(){return b(this.callSuper("toObject"),{src:this._originalImage.src||this._originalImage._src,filters:this.filters.concat()})},toSVG:function(){return''},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(c){this.constructor.fromObject(this.toObject(),c)},applyFilters:function(i){if(this.filters.length===0){this.setElement(this._originalImage);i&&i();return}var c=typeof Buffer!=="undefined"&&typeof window==="undefined",g=this._originalImage,e=fabric.document.createElement("canvas"),f=c?new (require("canvas").Image):fabric.document.createElement("img"),h=this;if(!e.getContext&&typeof G_vmlCanvasManager!="undefined"){G_vmlCanvasManager.initElement(e)}e.width=g.width;e.height=g.height;e.getContext("2d").drawImage(g,0,0);this.filters.forEach(function(j){j&&j.applyTo(e)});f.onload=function(){h.setElement(f);i&&i();f.onload=e=g=null};f.width=g.width;f.height=g.height;if(c){var d=e.toDataURL("image/png").replace(/data:image\/png;base64,/,"");f.src=new Buffer(d,"base64");h.setElement(f);i&&i()}else{f.src=e.toDataURL("image/png")}return this},_render:function(c){c.drawImage(this.getElement(),-this.width/2,-this.height/2,this.width,this.height)},_adjustWidthHeightToBorders:function(c){if(c){this.currentBorder=this.borderwidth;this.width+=(2*this.currentBorder);this.height+=(2*this.currentBorder)}else{this.currentBorder=0}},_resetWidthHeight:function(){var c=this.getElement();this.set("width",c.width);this.set("height",c.height)},_initElement:function(c){this.setElement(fabric.util.getById(c));fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(c){this.setOptions(c||{});this._setBorder();this._setWidthHeight()},_initFilters:function(c){if(c.filters&&c.filters.length){this.filters=c.filters.map(function(d){return fabric.Image.filters[d.type].fromObject(d)})}},_setBorder:function(){if(this.bordervisibility){this.currentBorder=this.borderwidth}else{this.currentBorder=0}},_setWidthHeight:function(){var c=2*this.currentBorder;this.width=(this.getElement().width||0)+c;this.height=(this.getElement().height||0)+c},complexity:function(){return 1}});fabric.Image.CSS_CANVAS="canvas-img";fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc;fabric.Image.fromObject=function(d,f){var c=fabric.document.createElement("img"),e=d.src;if(d.width){c.width=d.width}if(d.height){c.height=d.height}c.onload=function(){fabric.Image.prototype._initFilters.call(d,d);var g=new fabric.Image(c,d);f&&f(g);c=c.onload=null};c.src=e};fabric.Image.fromURL=function(d,f,e){var c=fabric.document.createElement("img");c.onload=function(){if(f){f(new fabric.Image(c,e))}c=c.onload=null};c.src=d};fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" ");fabric.Image.fromElement=function(d,f,c){c||(c={});var e=fabric.parseAttributes(d,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(e["xlink:href"],f,b(e,c))};fabric.Image.async=true})(typeof exports!="undefined"?exports:this);fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var a=this.get("angle");if(a>-225&&a<=-135){return -180}else{if(a>-135&&a<=-45){return -90}else{if(a>-45&&a<=45){return 0}else{if(a>45&&a<=135){return 90}else{if(a>135&&a<=225){return 180}else{if(a>225&&a<=315){return 270}else{if(a>315){return 360}}}}}}}return 0},straighten:function(){var a=this._getAngleValueForStraighten();this.setAngle(a);return this},fxStraighten:function(b){b=b||{};var c=function(){},d=b.onComplete||c,a=b.onChange||c,e=this;fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(f){e.setAngle(f);a()},onComplete:function(){e.setCoords();d()},onStart:function(){e.setActive(false)}});return this}});fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(a){a.straighten();this.renderAll();return this},fxStraightenObject:function(a){a.fxStraighten({onChange:this.renderAll.bind(this)});return this}});fabric.Image.filters={};fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(d){var c=d.getContext("2d"),a=c.getImageData(0,0,d.width,d.height),h=a.data,e=a.width,l=a.height,k,b,g,f;for(g=0;gh&&m>h&&o>h&&p(a-m)'},_render:function(f){var h=Cufon.textOptions||(Cufon.textOptions={});h.left=this.left;h.top=this.top;h.context=f;h.color=this.fill;var g=this._initDummyElement();this.transform(f);Cufon.replaceElement(g,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor});this.width=h.width;this.height=h.height;this._totalLineHeight=h.totalLineHeight;this._fontAscent=h.fontAscent;this._boundaries=h.boundaries;this._shadowOffsets=h.shadowOffsets;this._shadows=h.shadows||[];this.setCoords()},_initDummyElement:function(){var g=c.document.createElement("pre"),f=c.document.createElement("div");f.appendChild(g);if(typeof G_vmlCanvasManager=="undefined"){g.innerHTML=this.text}else{g.innerText=this.text.replace(/\r?\n/gi,"\r")}g.style.fontSize=this.fontSize+"px";g.style.letterSpacing="normal";return g},render:function(f,g){f.save();this._render(f);if(!g&&this.active){this.drawBorders(f);this.hideCorners||this.drawCorners(f)}f.restore()},toObject:function(){return e(this.callSuper("toObject"),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor})},toSVG:function(){var i=this.text.split(/\r?\n/),j=-this._fontAscent-((this._fontAscent/5)*this.lineHeight),g=-(this.width/2),f=(this.height/2)-(i.length*this.fontSize)-this._totalLineHeight,h=this._getSVGTextAndBg(j,g,i),k=this._getSVGShadows(j,i);f+=((this._fontAscent/5)*this.lineHeight);return['',h.textBgRects.join(""),"',k.join(""),h.textSpans.join(""),"",""].join("")},_getSVGShadows:function(h,n){var o=[],k,l,p,g,f=1;for(k=0,p=this._shadows.length;k",c.util.string.escapeXml(n[l]),"");f=1}else{f++}}}return o},_getSVGTextAndBg:function(j,h,n){var g=[],k=[],l,m,o,f=1;for(l=0,o=n.length;l",c.util.string.escapeXml(n[l]),"");f=1}else{f++}if(!this.backgroundColor){continue}k.push("')}return{textSpans:g,textBgRects:k}},_getFillAttributes:function(f){var g=f?new c.Color(f):"";if(!g||!g.getSource()||g.getAlpha()===1){return'fill="'+f+'"'}return'opacity="'+g.getAlpha()+'" fill="'+g.setAlpha(1).toRgb()+'"'},setColor:function(f){this.set("fill",f);return this},setFontsize:function(f){this.set("fontSize",f);this.setCoords();return this},getText:function(){return this.text},setText:function(f){this.set("text",f);this.setCoords();return this},set:function(f,g){if(typeof f=="object"){for(var h in f){this.set(h,f[h])}}else{this[f]=g;if(f==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+g+"$3")}}return this}});c.Text.fromObject=function(f){return new c.Text(f.text,d(f))};c.Text.fromElement=function(f){}})(typeof exports!="undefined"?exports:this);(function(){if(typeof document!="undefined"&&typeof window!="undefined"){return}var DOMParser=new require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),Canvas=require("canvas"),Image=require("canvas").Image;function request(url,encoding,callback){var oURL=URL.parse(url),client=HTTP.createClient(80,oURL.hostname),request=client.request("GET",oURL.pathname,{host:oURL.hostname});client.addListener("error",function(err){if(err.errno===process.ECONNREFUSED){fabric.log("ECONNREFUSED: connection refused to "+client.host+":"+client.port)}else{fabric.log(err.message)}});request.end();request.on("response",function(response){var body="";if(encoding){response.setEncoding(encoding)}response.on("end",function(){callback(body)});response.on("data",function(chunk){if(response.statusCode==200){body+=chunk}})})}fabric.util.loadImage=function(url,callback){request(url,"binary",function(body){var img=new Image();img.src=new Buffer(body,"binary");img._src=url;callback(img)})};fabric.loadSVGFromURL=function(url,callback){url=url.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim();request(url,"",function(body){var doc=new DOMParser().parseFromString(body);fabric.parseSVGDocument(doc.documentElement,function(results,options){callback(results,options)})})};fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body);callback&&callback()})};fabric.Image.fromObject=function(object,callback){fabric.util.loadImage(object.src,function(img){var oImg=new fabric.Image(img);oImg._initConfig(object);oImg._initFilters(object);callback(oImg)})};fabric.createCanvasForNode=function(width,height){var canvasEl=fabric.document.createElement("canvas"),nodeCanvas=new Canvas(width||600,height||600);canvasEl.style={};canvasEl.width=nodeCanvas.width;canvasEl.height=nodeCanvas.height;var canvas=fabric.Canvas||fabric.StaticCanvas;var fabricCanvas=new canvas(canvasEl);fabricCanvas.contextContainer=nodeCanvas.getContext("2d");fabricCanvas.nodeCanvas=nodeCanvas;return fabricCanvas};fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()};if(fabric.Canvas){fabric.Canvas.prototype.createPNGStream}var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(width){origSetWidth.call(this);this.nodeCanvas.width=width;return this};if(fabric.Canvas){fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth}var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(height){origSetHeight.call(this);this.nodeCanvas.height=height;return this};if(fabric.Canvas){fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight}})(); \ No newline at end of file +var Cufon=(function(){var k=function(){return k.replace.apply(null,arguments)};var u=k.DOM={ready:(function(){var z=false,B={loaded:1,complete:1};var y=[],A=function(){if(z){return}z=true;for(var C;C=y.shift();C()){}};if(fabric.document.addEventListener){fabric.document.addEventListener("DOMContentLoaded",A,false);fabric.window.addEventListener("pageshow",A,false)}if(!fabric.window.opera&&fabric.document.readyState){(function(){B[fabric.document.readyState]?A():setTimeout(arguments.callee,10)})()}if(fabric.document.readyState&&fabric.document.createStyleSheet){(function(){try{fabric.document.body.doScroll("left");A()}catch(C){setTimeout(arguments.callee,1)}})()}o(fabric.window,"load",A);return function(C){if(!arguments.length){A()}else{z?C():y.push(C)}}})()};var l=k.CSS={Size:function(z,y){this.value=parseFloat(z);this.unit=String(z).match(/[a-z%]*$/)[0]||"px";this.convert=function(A){return A/y*this.value};this.convertFrom=function(A){return A/this.value*y};this.toString=function(){return this.value+this.unit}},getStyle:function(y){return new a(y.style)},quotedList:i(function(B){var A=[],z=/\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g,y;while(y=z.exec(B)){A.push(y[3]||y[1])}return A}),ready:(function(){var A=false;var z=[],B=function(){A=true;for(var D;D=z.shift();D()){}};var y=Object.prototype.propertyIsEnumerable?f("style"):{length:0};var C=f("link");u.ready(function(){var G=0,F;for(var E=0,D=C.length;F=C[E],E=y.length+G){B()}else{setTimeout(arguments.callee,10)}});return function(D){if(A){D()}else{z.push(D)}}})(),supports:function(A,z){var y=fabric.document.createElement("span").style;if(y[A]===undefined){return false}y[A]=z;return y[A]===z},textAlign:function(B,A,y,z){if(A.get("textAlign")=="right"){if(y>0){B=" "+B}}else{if(y400}if(F==500){F=400}for(var G in D){G=parseInt(G,10);if(!C||GA){A=G}H.push(G)}if(FA){F=A}H.sort(function(J,I){return(B?(J>F&&I>F)?JI:(JI:JV){V=Q}if(P>T){T=P}if(Qz){z=e}L.push(e);e=0;continue}var B=ab.glyphs[ag[aa]]||ab.missingGlyph;if(!B){continue}e+=D=Number(B.w||ab.w)+U}L.push(e);e=Math.max(z,e);var m=[];for(var aa=L.length;aa--;){m[aa]=e-L[aa]}if(D===null){return null}V+=(H.width-D);C+=H.minX;var v,p;if(n){v=J;p=J.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=E;p=fabric.document.createElement("canvas");v.appendChild(p);if(A.printable){var Y=fabric.document.createElement("span");Y.className="cufon-alt";Y.appendChild(fabric.document.createTextNode(E));v.appendChild(Y)}}var ah=v.style;var O=p.style||{};var k=o.convert(H.height-I+T);var af=Math.ceil(k);var S=af/k;p.width=Math.ceil(o.convert(e+V-C)*S);p.height=af;I+=H.minY;O.top=Math.round(o.convert(I-ab.ascent))+"px";O.left=Math.round(o.convert(C))+"px";var j=Math.ceil(o.convert(e*S));var t=j+"px";var s=o.convert(ab.height);var F=(A.lineHeight-1)*o.convert(-ab.ascent/5)*(M-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*M)+F;Cufon.textOptions.lines=M;Cufon.textOptions.totalLineHeight=F;if(a){ah.width=t;ah.height=s+"px"}else{ah.paddingLeft=t;ah.paddingBottom=(s-1)+"px"}var ad=Cufon.textOptions.context||p.getContext("2d"),K=af/H.height;Cufon.textOptions.fontAscent=ab.ascent*K;Cufon.textOptions.boundaries=null;for(var w=Cufon.textOptions.shadowOffsets,aa=R.length;aa--;){w[aa]=[R[aa][0]*K,R[aa][1]*K]}ad.save();ad.scale(K,K);ad.translate(-C-((1/K*p.width)/2)+(Cufon.fonts[ab.family].offsetLeft||0),-I-(Cufon.textOptions.height/K)/2);ad.lineWidth=ab.face["underline-thickness"];ad.save();function q(l,i){ad.strokeStyle=i;ad.beginPath();ad.moveTo(0,l);ad.lineTo(e,l);ad.stroke()}var r=Cufon.getTextDecoration(A),u=A.fontStyle==="italic";function ae(){ad.save();ad.fillStyle=A.backgroundColor;var aj=0,an=0,y=[{left:0}];if(A.textAlign==="right"){ad.translate(m[an],0);y[0].left=m[an]*K}else{if(A.textAlign==="center"){ad.translate(m[an]/2,0);y[0].left=m[an]/2*K}}for(var al=0,ak=ag.length;al.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 c(e,f){return a(e,/(?:em|ex|%)$/i.test(f)?"1em":f)}function a(h,i){if(/px$/i.test(i)){return parseFloat(i)}var g=h.style.left,f=h.runtimeStyle.left;h.runtimeStyle.left=h.currentStyle.left;h.style.left=i;var e=h.style.pixelLeft;h.style.left=g;h.runtimeStyle.left=f;return e}return function(T,z,O,w,D,U,M){var h=(z===null);if(h){z=D.alt}var B=T.viewBox;var j=O.computedFontSize||(O.computedFontSize=new Cufon.CSS.Size(c(U,O.get("fontSize"))+"px",T.baseSize));var L=O.computedLSpacing;if(L==undefined){L=O.get("letterSpacing");O.computedLSpacing=L=(L=="normal")?0:~~j.convertFrom(a(U,L))}var t,m;if(h){t=D;m=D.firstChild}else{t=fabric.document.createElement("span");t.className="cufon cufon-vml";t.alt=z;m=fabric.document.createElement("span");m.className="cufon-vml-canvas";t.appendChild(m);if(w.printable){var R=fabric.document.createElement("span");R.className="cufon-alt";R.appendChild(fabric.document.createTextNode(z));t.appendChild(R)}if(!M){t.appendChild(fabric.document.createElement("cvml:shape"))}}var Z=t.style;var G=m.style;var f=j.convert(B.height),W=Math.ceil(f);var K=W/f;var J=B.minX,I=B.minY;G.height=W;G.top=Math.round(j.convert(I-T.ascent));G.left=Math.round(j.convert(J));Z.height=j.convert(T.height)+"px";var p=Cufon.getTextDecoration(w);var y=O.get("color");var X=Cufon.CSS.textTransform(z,O).split("");var e=0,H=0,q=null;var x,r,A=w.textShadow;for(var S=0,Q=0,P=X.length;St?m:(l-k);p(q(currentTime,j,byValue,m));if(l>t||n()){u.onComplete&&u.onComplete();return}h(o)})()}var h=(function(){return fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(k,j){fabric.window.setTimeout(k,1000/60)}})();function a(k,m,l){if(k){var j=new Image();j.onload=function(){m&&m.call(l,j);j=j.onload=null};j.src=k}else{m&&m.call(l,k)}}fabric.util.removeFromArray=g;fabric.util.degreesToRadians=b;fabric.util.toFixed=d;fabric.util.getRandomInt=e;fabric.util.falseFunction=i;fabric.util.animate=c;fabric.util.requestAnimFrame=h;fabric.util.loadImage=a})();(function(){var d=Array.prototype.slice;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(g){if(this===void 0||this===null){throw new TypeError()}var h=Object(this),e=h.length>>>0;if(e===0){return -1}var i=0;if(arguments.length>0){i=Number(arguments[1]);if(i!==i){i=0}else{if(i!==0&&i!==(1/0)&&i!==-(1/0)){i=(i>0||-1)*Math.floor(Math.abs(i))}}}if(i>=e){return -1}var f=i>=0?i:Math.max(e-Math.abs(i),0);for(;f>>0;f>>0;g>>0;f>>0;f>>0;g>>0,f=0,h;if(arguments.length>1){h=arguments[1]}else{do{if(f in this){h=this[f++];break}if(++f>=e){throw new TypeError()}}while(true)}for(;f=e){e=h[f][g]}}}else{while(f--){if(h[f]>=e){e=h[f]}}}return e}function c(h,g){if(!h||h.length===0){return undefined}var f=h.length-1,e=g?h[f][g]:h[f];if(g){while(f--){if(h[f][g]/g,">")}fabric.util.string={camelize:b,capitalize:c,escapeXml:a}}());(function(){var c=Array.prototype.slice,a=Function.prototype.apply,b=function(){};if(!Function.prototype.bind){Function.prototype.bind=function(d){var g=this,e=c.call(arguments,1),f;if(e.length){f=function(){return a.call(g,this instanceof b?this:d,e.concat(c.call(arguments)))}}else{f=function(){return a.call(g,this instanceof b?this:d,arguments)}}b.prototype=this.prototype;f.prototype=new b;return f}}})();(function(){var f=Array.prototype.slice,e=function(){};var c=(function(){for(var g in {toString:1}){if(g==="toString"){return false}}return true})();var b=function(g,j,h){for(var i in j){if(i in g.prototype&&typeof g.prototype[i]=="function"){g.prototype[i]=(function(k){return function(){var m=this.constructor.superclass;this.constructor.superclass=h;var l=j[k].apply(this,arguments);this.constructor.superclass=m;if(k!=="initialize"){return l}}})(i)}else{g.prototype[i]=j[i]}if(c){if(j.toString!==Object.prototype.toString){g.prototype.toString=j.toString}if(j.valueOf!==Object.prototype.valueOf){g.prototype.valueOf=j.valueOf}}}};function a(){}function d(){var k=null,j=f.call(arguments,0);if(typeof j[0]==="function"){k=j.shift()}function g(){this.initialize.apply(this,arguments)}g.superclass=k;g.subclasses=[];if(k){a.prototype=k.prototype;g.prototype=new a;k.subclasses.push(g)}for(var h=0,l=j.length;h-1?c(j,l.match(/opacity:\s*(\d?\.?\d*)/)[1]):j}for(var m in l){if(m==="opacity"){c(j,l[m])}else{var k=(m==="float"||m==="cssFloat")?(typeof n.styleFloat==="undefined"?"cssFloat":"styleFloat"):m;n[k]=l[m]}}return j}var h=fabric.document.createElement("div"),g=typeof h.style.opacity==="string",b=typeof h.style.filter==="string",a=fabric.document.defaultView,f=a&&typeof a.getComputedStyle!=="undefined",d=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,c=function(i){return i};if(g){c=function(i,j){i.style.opacity=j;return i}}else{if(b){c=function(i,j){var k=i.style;if(i.currentStyle&&!i.currentStyle.hasLayout){k.zoom=1}if(d.test(k.filter)){j=j>=0.9999?"":("alpha(opacity="+(j*100)+")");k.filter=k.filter.replace(d,j)}else{k.filter+=" alpha(opacity="+(j*100)+")"}return i}}}fabric.util.setStyle=e})();(function(){var h=Array.prototype.slice;function g(j){return typeof j==="string"?fabric.document.getElementById(j):j}function b(j){return h.call(j,0)}try{var i=b(fabric.document.childNodes) instanceof Array}catch(a){}if(!i){b=function(k){var j=new Array(k.length),l=k.length;while(l--){j[l]=k[l]}return j}}function c(k,j){var l=fabric.document.createElement(k);for(var m in j){if(m==="class"){l.className=j[m]}else{if(m==="for"){l.htmlFor=j[m]}else{l.setAttribute(m,j[m])}}}return l}function f(j,k){if((" "+j.className+" ").indexOf(" "+k+" ")===-1){j.className+=(j.className?" ":"")+k}}function e(k,l,j){if(typeof l==="string"){l=c(l,j)}if(k.parentNode){k.parentNode.replaceChild(l,k)}l.appendChild(k);return l}function d(k){var j=0,l=0;do{j+=k.offsetTop||0;l+=k.offsetLeft||0;k=k.offsetParent}while(k);return({left:l,top:j})}(function(){var k=fabric.document.documentElement.style;var l="userSelect" in k?"userSelect":"MozUserSelect" in k?"MozUserSelect":"WebkitUserSelect" in k?"WebkitUserSelect":"KhtmlUserSelect" in k?"KhtmlUserSelect":"";function m(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=fabric.util.falseFunction}if(l){n.style[l]="none"}else{if(typeof n.unselectable=="string"){n.unselectable="on"}}return n}function j(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=null}if(l){n.style[l]=""}else{if(typeof n.unselectable=="string"){n.unselectable=""}}return n}fabric.util.makeElementUnselectable=m;fabric.util.makeElementSelectable=j})();(function(){function j(k,o){var m=fabric.document.getElementsByTagName("head")[0],l=fabric.document.createElement("script"),n=true;l.type="text/javascript";l.setAttribute("runat","server");l.onload=l.onreadystatechange=function(p){if(n){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete"){return}n=false;o(p||fabric.window.event);l=l.onload=l.onreadystatechange=null}};l.src=k;m.appendChild(l)}fabric.util.getScript=j})();fabric.util.getById=g;fabric.util.toArray=b;fabric.util.makeElement=c;fabric.util.addClass=f;fabric.util.wrapElement=e;fabric.util.getElementOffset=d})();(function(){function d(e,f){return e+(/\?/.test(e)?"&":"?")+f}var c=(function(){var h=[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 e=h.length;e--;){try{var g=h[e]();if(g){return h[e]}}catch(f){}}})();function a(){}function b(g,f){f||(f={});var j=f.method?f.method.toUpperCase():"GET",i=f.onComplete||function(){},h=c(),e;h.onreadystatechange=function(){if(h.readyState===4){i(h);h.onreadystatechange=a}};if(j==="GET"){e=null;if(typeof f.parameters=="string"){g=d(g,f.parameters)}}h.open(j,g,true);if(j==="POST"||j==="PUT"){h.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}h.send(e);return h}fabric.util.request=b})();(function(){fabric.util.ease={};function d(F,E,H,G){return H*(F/=G)*F+E}function l(F,E,H,G){return -H*(F/=G)*(F-2)+E}function r(F,E,H,G){if((F/=G/2)<1){return H/2*F*F+E}return -H/2*((--F)*(F-2)-1)+E}function B(F,E,H,G){return H*(F/=G)*F*F+E}function q(F,E,H,G){return H*((F=F/G-1)*F*F+1)+E}function u(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F+E}return H/2*((F-=2)*F*F+2)+E}function t(F,E,H,G){return H*(F/=G)*F*F*F+E}function g(F,E,H,G){return -H*((F=F/G-1)*F*F*F-1)+E}function k(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F*F+E}return -H/2*((F-=2)*F*F*F-2)+E}function y(F,E,H,G){return H*(F/=G)*F*F*F*F+E}function j(F,E,H,G){return H*((F=F/G-1)*F*F*F*F+1)+E}function n(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F*F*F+E}return H/2*((F-=2)*F*F*F*F+2)+E}function f(F,E,H,G){return -H*Math.cos(F/G*(Math.PI/2))+H+E}function o(F,E,H,G){return H*Math.sin(F/G*(Math.PI/2))+E}function v(F,E,H,G){return -H/2*(Math.cos(Math.PI*F/G)-1)+E}function D(F,E,H,G){return(F==0)?E:H*Math.pow(2,10*(F/G-1))+E}function c(F,E,H,G){return(F==G)?E+H:H*(-Math.pow(2,-10*F/G)+1)+E}function i(F,E,H,G){if(F==0){return E}if(F==G){return E+H}if((F/=G/2)<1){return H/2*Math.pow(2,10*(F-1))+E}return H/2*(-Math.pow(2,-10*--F)+2)+E}function h(F,E,H,G){return -H*(Math.sqrt(1-(F/=G)*F)-1)+E}function p(F,E,H,G){return H*Math.sqrt(1-(F=F/G-1)*F)+E}function x(F,E,H,G){if((F/=G/2)<1){return -H/2*(Math.sqrt(1-F*F)-1)+E}return H/2*(Math.sqrt(1-(F-=2)*F)+1)+E}function s(G,E,K,J){var H=1.70158;var I=0;var F=K;if(G==0){return E}if((G/=J)==1){return E+K}if(!I){I=J*0.3}if(F-1;w=w.split(/\s+/);var u=[];if(y){for(var v=0,t=w.length;v/i,""))}if(!w.documentElement){return}h.parseSVGDocument(w.documentElement,function(z,y){k.set(t,{objects:h.util.array.invoke(z,"toObject"),options:y});v(z,y)})}}function b(v){var u=v.objects,t=v.options;u=u.map(function(w){return h[f(w.type)].fromObject(w)});return({objects:u,options:t})}function n(t,w){t=t.trim();var u;if(typeof DOMParser!=="undefined"){var v=new DOMParser();if(v&&v.parseFromString){u=v.parseFromString(t,"text/xml")}}else{if(h.window.ActiveXObject){var u=new ActiveXObject("Microsoft.XMLDOM");u.async="false";u.loadXML(t.replace(//i,""))}}h.parseSVGDocument(u.documentElement,function(y,x){w(y,x)})}function m(w){var u="";for(var v=0,t=w.length;v",'",""].join("")}return u}p(h,{parseAttributes:e,parseElements:g,parseStyleAttribute:i,parsePointsAttribute:s,getCSSRules:d,loadSVGFromURL:c,loadSVGFromString:n,createSVGFontFacesMarkup:m})})(typeof exports!="undefined"?exports:this);(function(){function c(h){var g=h.getAttribute("style");if(g){var k=g.split(/\s*;\s*/);if(k[k.length-1]===""){k.pop()}for(var f=k.length;f--;){var e=k[f].split(/\s*:\s*/),d=e[0].trim(),j=e[1].trim();if(d==="stop-color"){return j}}}}fabric.Gradient={create:function(l,m){m||(m={});var f=m.x1||0,k=m.y1||0,e=m.x2||l.canvas.width,i=m.y2||0,g=m.colorStops;var j=l.createLinearGradient(f,k,e,i);for(var h in g){var d=g[h];j.addColorStop(parseFloat(h),d)}return j},fromElement:function(d,m,l){var j=d.getElementsByTagName("stop"),d,f,e={},g,k={x1:d.getAttribute("x1")||0,y1:d.getAttribute("y1")||0,x2:d.getAttribute("x2")||"100%",y2:d.getAttribute("y2")||0};for(var h=j.length;h--;){d=j[h];f=d.getAttribute("offset");f=parseFloat(f)/(/%$/.test(f)?100:1);e[f]=c(d)||d.getAttribute("stop-color")}a(l,k);return fabric.Gradient.create(m,{x1:k.x1,y1:k.y1,x2:k.x2,y2:k.y2,colorStops:e})},forObject:function(g,d,e){e||(e={});a(g,e);var f=fabric.Gradient.create(d,{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,colorStops:e.colorStops});return f}};function a(f,e){for(var g in e){if(typeof e[g]==="string"&&/^\d+%$/.test(e[g])){var d=parseFloat(e[g],10);if(g==="x1"||g==="x2"){e[g]=f.width*d/100}else{if(g==="y1"||g==="y2"){e[g]=f.height*d/100}}}if(g==="x1"||g==="x2"){e[g]-=f.width/2}else{if(g==="y1"||g==="y2"){e[g]-=f.height/2}}}}function b(j){var f=j.getElementsByTagName("linearGradient"),d=j.getElementsByTagName("radialGradient"),g,h={};for(var e=f.length;e--;){g=f[e];h[g.id]=g}for(var e=d.length;e--;){g=d[e];h[g.id]=g}return h}fabric.getGradientDefs=b})();(function(b){var c=b.fabric||(b.fabric={});if(c.Point){c.warn("fabric.Point is already defined");return}c.Point=a;function a(d,e){if(arguments.length>0){this.init(d,e)}}a.prototype={constructor:a,init:function(d,e){this.x=d;this.y=e},add:function(d){return new a(this.x+d.x,this.y+d.y)},addEquals:function(d){this.x+=d.x;this.y+=d.y;return this},scalarAdd:function(d){return new a(this.x+d,this.y+d)},scalarAddEquals:function(d){this.x+=d;this.y+=d;return this},subtract:function(d){return new a(this.x-d.x,this.y-d.y)},subtractEquals:function(d){this.x-=d.x;this.y-=d.y;return this},scalarSubtract:function(d){return new a(this.x-d,this.y-d)},scalarSubtractEquals:function(d){this.x-=d;this.y-=d;return this},multiply:function(d){return new a(this.x*d,this.y*d)},multiplyEquals:function(d){this.x*=d;this.y*=d;return this},divide:function(d){return new a(this.x/d,this.y/d)},divideEquals:function(d){this.x/=d;this.y/=d;return this},eq:function(d){return(this.x==d.x&&this.y==d.y)},lt:function(d){return(this.xd.x&&this.y>d.y)},gte:function(d){return(this.x>=d.x&&this.y>=d.y)},lerp:function(e,d){return new a(this.x+(e.x-this.x)*d,this.y+(e.y-this.y)*d)},distanceFrom:function(f){var e=this.x-f.x,d=this.y-f.y;return Math.sqrt(e*e+d*d)},min:function(d){return new a(Math.min(this.x,d.x),Math.min(this.y,d.y))},max:function(d){return new a(Math.max(this.x,d.x),Math.max(this.y,d.y))},toString:function(){return this.x+","+this.y},setXY:function(d,e){this.x=d;this.y=e},setFromPoint:function(d){this.x=d.x;this.y=d.y},swap:function(e){var d=this.x,f=this.y;this.x=e.x;this.y=e.y;e.x=d;e.y=f}}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Intersection){b.warn("fabric.Intersection is already defined");return}function c(d){if(arguments.length>0){this.init(d)}}b.Intersection=c;b.Intersection.prototype={init:function(d){this.status=d;this.points=[]},appendPoint:function(d){this.points.push(d)},appendPoints:function(d){this.points=this.points.concat(d)}};b.Intersection.intersectLineLine=function(h,f,l,k){var m,i=(k.x-l.x)*(h.y-l.y)-(k.y-l.y)*(h.x-l.x),j=(f.x-h.x)*(h.y-l.y)-(f.y-h.y)*(h.x-l.x),g=(k.y-l.y)*(f.x-h.x)-(k.x-l.x)*(f.y-h.y);if(g!=0){var e=i/g,d=j/g;if(0<=e&&e<=1&&0<=d&&d<=1){m=new c("Intersection");m.points.push(new b.Point(h.x+e*(f.x-h.x),h.y+e*(f.y-h.y)))}else{m=new c("No Intersection")}}else{if(i==0||j==0){m=new c("Coincident")}else{m=new c("Parallel")}}return m};b.Intersection.intersectLinePolygon=function(e,d,l){var m=new c("No Intersection"),f=l.length;for(var h=0;h0){m.status="Intersection"}return m};b.Intersection.intersectPolygonPolygon=function(j,h){var f=new c("No Intersection"),l=j.length;for(var k=0;k0){f.status="Intersection"}return f};b.Intersection.intersectPolygonRectangle=function(n,e,d){var g=e.min(d),m=e.max(d),f=new b.Point(m.x,g.y),l=new b.Point(g.x,m.y),k=c.intersectLinePolygon(g,f,n),j=c.intersectLinePolygon(f,m,n),i=c.intersectLinePolygon(m,l,n),h=c.intersectLinePolygon(l,g,n),o=new c("No Intersection");o.appendPoints(k.points);o.appendPoints(j.points);o.appendPoints(i.points);o.appendPoints(h.points);if(o.points.length>0){o.status="Intersection"}return o}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Color){b.warn("fabric.Color is already defined.");return}function c(d){if(!d){this.setSource([0,0,0,1])}else{this._tryParsingColor(d)}}b.Color=c;b.Color.prototype={_tryParsingColor:function(d){var e=c.sourceFromHex(d);if(!e){e=c.sourceFromRgb(d)}if(e){this.setSource(e)}},getSource:function(){return this._source},setSource:function(d){this._source=d},toRgb:function(){var d=this.getSource();return"rgb("+d[0]+","+d[1]+","+d[2]+")"},toRgba:function(){var d=this.getSource();return"rgba("+d[0]+","+d[1]+","+d[2]+","+d[3]+")"},toHex:function(){var h=this.getSource();var f=h[0].toString(16);f=(f.length==1)?("0"+f):f;var e=h[1].toString(16);e=(e.length==1)?("0"+e):e;var d=h[2].toString(16);d=(d.length==1)?("0"+d):d;return f.toUpperCase()+e.toUpperCase()+d.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var d=this.getSource();d[3]=e;this.setSource(d);return this},toGrayscale:function(){var f=this.getSource(),e=parseInt((f[0]*0.3+f[1]*0.59+f[2]*0.11).toFixed(0),10),d=f[3];this.setSource([e,e,e,d]);return this},toBlackWhite:function(d){var g=this.getSource(),f=(g[0]*0.3+g[1]*0.59+g[2]*0.11).toFixed(0),e=g[3],d=d||127;f=(Number(f)','',"',"Created with Fabric.js ",fabric.version,"",fabric.createSVGFontFacesMarkup(this.getObjects())];if(this.backgroundImage){h.push('')}for(var j=0,k=this.getObjects(),g=k.length;j");return h.join("")},isEmpty:function(){return this._objects.length===0},remove:function(g){e(this._objects,g);if(this.getActiveObject()===g){this.fire("before:selection:cleared",{target:g});this.discardActiveObject();this.fire("selection:cleared")}this.renderAll();return g},sendToBack:function(g){e(this._objects,g);this._objects.unshift(g);return this.renderAll()},bringToFront:function(g){e(this._objects,g);this._objects.push(g);return this.renderAll()},sendBackwards:function(j){var h=this._objects.indexOf(j),g=h;if(h!==0){for(var k=h-1;k>=0;--k){if(j.intersectsWithObject(this._objects[k])||j.isContainedWithinObject(this._objects[k])){g=k;break}}e(this._objects,j);this._objects.splice(g,0,j)}return this.renderAll()},bringForward:function(k){var n=this.getObjects(),h=n.indexOf(k),g=h;if(h!==n.length-1){for(var m=h+1,j=this._objects.length;m"};f(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',toGrayscale:function(l){var k=l.getContext("2d"),g=k.getImageData(0,0,l.width,l.height),p=g.data,m=g.width,r=g.height,q,h,o,n;for(o=0;o0)?0:-v),r.ey-((u>0)?0:-u),t,s);this.contextTop.lineWidth=this.selectionLineWidth;this.contextTop.strokeStyle=this.selectionBorderColor;this.contextTop.strokeRect(r.ex+a-((v>0)?0:t),r.ey+a-((u>0)?0:s),t,s)},_findSelectedObjects:function(x){var y,t,D=[],s=this._groupSelector.ex,C=this._groupSelector.ey,r=s+this._groupSelector.left,A=C+this._groupSelector.top,z,w=new fabric.Point(f(s,r),f(C,A)),B=new fabric.Point(l(s,r),l(C,A));for(var u=0,v=this._objects.length;u1){var D=new fabric.Group(D);this.setActiveGroup(D);D.saveCoords();this.fire("selection:created",{target:D})}}this.renderAll()},findTarget:function(v,s){var u,w=this.getPointer(v);var t=this.getActiveGroup();if(t&&!s&&this.containsPoint(v,t)){u=t;return u}for(var r=this._objects.length;r--;){if(this._objects[r]&&this.containsPoint(v,this._objects[r])){u=this._objects[r];this.relatedTarget=u;break}}if(u&&u.selectable){return u}},getPointer:function(r){var s=q(r);return{x:s.x-this._offset.left,y:s.y-this._offset.top}},_createUpperCanvas:function(){this.upperCanvasEl=this._createCanvasElement();this.upperCanvasEl.className="upper-canvas";this.wrapperEl.appendChild(this.upperCanvasEl);this._applyCanvasStyle(this.upperCanvasEl);this.contextTop=this.upperCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{"class":this.CONTAINER_CLASS});fabric.util.setStyle(this.wrapperEl,{width:this.getWidth()+"px",height:this.getHeight()+"px",position:"relative"});fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(s){var t=this.getWidth()||s.width,r=this.getHeight()||s.height;fabric.util.setStyle(s,{position:"absolute",width:t+"px",height:r+"px",left:0,top:0});s.width=t;s.height=r;fabric.util.makeElementUnselectable(s)},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},setActiveObject:function(r,s){if(this._activeObject){this._activeObject.setActive(false)}this._activeObject=r;r.setActive(true);this.renderAll();this.fire("object:selected",{target:r,e:s});return this},getActiveObject:function(){return this._activeObject},discardActiveObject:function(){if(this._activeObject){this._activeObject.setActive(false)}this._activeObject=null;return this},setActiveGroup:function(r){this._activeGroup=r;return this},getActiveGroup:function(){return this._activeGroup},discardActiveGroup:function(){var r=this.getActiveGroup();if(r){r.destroy()}return this.setActiveGroup(null)},deactivateAll:function(){var s=this.getObjects(),t=0,r=s.length;for(;t1){var o=new fabric.PathGroup(q,n)}else{var o=q[0]}o.setSourcePath(m);if(!(o instanceof fabric.PathGroup)){fabric.util.object.extend(o,n);if(typeof n.angle!=="undefined"){o.setAngle(n.angle)}}g(o,l)})}}}},this)}catch(c){fabric.log(c.message)}},loadFromJSON:function(a,d){if(!a){return}var b=JSON.parse(a);if(!b||(b&&!b.objects)){return}this.clear();var c=this;this._enlivenObjects(b.objects,function(){c.backgroundColor=b.background;if(b.backgroundImage){c.setBackgroundImage(b.backgroundImage,c.renderAll.bind(c));c.backgroundImageOpacity=b.backgroundImageOpacity;c.backgroundImageStretch=b.backgroundImageStretch}if(d){d()}});return this},_enlivenObjects:function(b,e){var c=0,a=b.filter(function(f){return f.type==="image"}).length;var d=this;b.forEach(function(h,g){if(!h.type){return}switch(h.type){case"image":case"font":fabric[fabric.util.string.capitalize(h.type)].fromObject(h,function(i){d.insertAt(i,g,true);if(++c===a){if(e){e()}}});break;default:var f=fabric[fabric.util.string.camelize(fabric.util.string.capitalize(h.type))];if(f&&f.fromObject){d.insertAt(f.fromObject(h),g,true)}break}});if(a===0&&e){e()}},_toDataURL:function(a,b){this.clone(function(c){b(c.toDataURL(a))})},_toDataURLWithMultiplier:function(a,c,b){this.clone(function(d){b(d.toDataURLWithMultiplier(a,c))})},clone:function(b){var a=JSON.stringify(this);this.cloneWithoutData(function(c){c.loadFromJSON(a,function(){if(b){b(c)}})})},cloneWithoutData:function(c){var a=fabric.document.createElement("canvas");a.width=this.getWidth();a.height=this.getHeight();var b=new fabric.Canvas(a);b.clipTo=this.clipTo;if(this.backgroundImage){b.setBackgroundImage(this.backgroundImage.src,function(){b.renderAll();if(c){c(b)}});b.backgroundImageOpacity=this.backgroundImageOpacity;b.backgroundImageStretch=this.backgroundImageStretch}else{if(c){c(b)}}}});(function(a){var d=a.fabric||(a.fabric={}),l=d.util.object.extend,m=d.util.object.clone,c=d.util.toFixed,k=d.util.string.capitalize,p=d.util.getPointer,b=d.util.degreesToRadians,o=Array.prototype.slice;if(d.Object){return}d.Object=d.util.createClass({type:"object",includeDefaultValues:true,NUM_FRACTION_DIGITS:2,MIN_SCALE_LIMIT:0.1,stateProperties:("top left width height scaleX scaleY flipX flipY theta angle opacity cornersize fill overlayFill stroke strokeWidth fillRule borderScaleFactor transformMatrix selectable").split(" "),top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:false,flipY:false,theta:0,opacity:1,angle:0,cornersize:12,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",fill:"rgb(0,0,0)",fillRule:"source-over",overlayFill:null,stroke:null,strokeWidth:1,borderOpacityWhenMoving:0.4,borderScaleFactor:1,transformMatrix:null,selectable:true,hasControls:true,hasBorders:true,hasRotatingPoint:false,callSuper:function(i){var q=this.constructor.superclass.prototype[i];return(arguments.length>1)?q.apply(this,o.call(arguments,1)):q.call(this)},initialize:function(i){i&&this.setOptions(i)},setOptions:function(q){var r=this.stateProperties.length,s;while(r--){s=this.stateProperties[r];if(s in q){this.set(s,q[s])}}},transform:function(i){i.globalAlpha=this.opacity;i.translate(this.left,this.top);i.rotate(this.theta);i.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(){var i={type:this.type,left:c(this.left,this.NUM_FRACTION_DIGITS),top:c(this.top,this.NUM_FRACTION_DIGITS),width:c(this.width,this.NUM_FRACTION_DIGITS),height:c(this.height,this.NUM_FRACTION_DIGITS),fill:this.fill,overlayFill:this.overlayFill,stroke:this.stroke,strokeWidth:this.strokeWidth,scaleX:c(this.scaleX,this.NUM_FRACTION_DIGITS),scaleY:c(this.scaleY,this.NUM_FRACTION_DIGITS),angle:c(this.getAngle(),this.NUM_FRACTION_DIGITS),flipX:this.flipX,flipY:this.flipY,opacity:c(this.opacity,this.NUM_FRACTION_DIGITS),selectable:this.selectable,hasControls:this.hasControls,hasBorders:this.hasBorders,hasRotatingPoint:this.hasRotatingPoint};if(!this.includeDefaultValues){i=this._removeDefaultValues(i)}return i},toDatalessObject:function(){return this.toObject()},getSvgStyles:function(){return["stroke: ",(this.stroke?this.stroke:"none"),"; ","stroke-width: ",(this.strokeWidth?this.strokeWidth:"0"),"; ","fill: ",(this.fill?this.fill:"none"),"; ","opacity: ",(this.opacity?this.opacity:"1"),";"].join("")},getSvgTransform:function(){var i=this.getAngle();return["translate(",c(this.left,2)," ",c(this.top,2),")",i!==0?(" rotate("+c(i,2)+")"):"",(this.scaleX===1&&this.scaleY===1)?"":(" scale("+c(this.scaleX,2)+" "+c(this.scaleY,2)+")")].join("")},_removeDefaultValues:function(q){var i=d.Object.prototype.options;if(i){this.stateProperties.forEach(function(r){if(q[r]===i[r]){delete q[r]}})}return q},isActive:function(){return !!this.active},setActive:function(i){this.active=!!i;return this},toString:function(){return"#"},set:function(q,i){var s=(q==="scaleX"||q==="scaleY")&&ir.x&&s.xr.y&&u.y=v)&&(s.d.y>=v)){continue}if((s.o.x==s.d.x)&&(s.o.x>=w)){x=s.o.x;u=v}else{z=0;y=(s.d.y-s.o.y)/(s.d.x-s.o.x);r=v-z*w;q=s.o.y-y*s.o.x;x=-(r-q)/(z-y);u=r+z*x}if(x>=w){t+=1}if(t==2){break}}return t},_getImageLines:function(r,q){return{topline:{o:r.tl,d:r.tr},rightline:{o:r.tr,d:r.br},bottomline:{o:r.br,d:r.bl},leftline:{o:r.bl,d:r.tl}}},_setCornerCoords:function(){var w=this.oCoords,r=b(45-this.getAngle()),i=Math.sqrt(2*Math.pow(this.cornersize,2))/2,x=i*Math.cos(r),q=i*Math.sin(r),v=Math.sin(this.theta),u=Math.cos(this.theta);w.tl.corner={tl:{x:w.tl.x-q,y:w.tl.y-x},tr:{x:w.tl.x+x,y:w.tl.y-q},bl:{x:w.tl.x-x,y:w.tl.y+q},br:{x:w.tl.x+q,y:w.tl.y+x}};w.tr.corner={tl:{x:w.tr.x-q,y:w.tr.y-x},tr:{x:w.tr.x+x,y:w.tr.y-q},br:{x:w.tr.x+q,y:w.tr.y+x},bl:{x:w.tr.x-x,y:w.tr.y+q}};w.bl.corner={tl:{x:w.bl.x-q,y:w.bl.y-x},bl:{x:w.bl.x-x,y:w.bl.y+q},br:{x:w.bl.x+q,y:w.bl.y+x},tr:{x:w.bl.x+x,y:w.bl.y-q}};w.br.corner={tr:{x:w.br.x+x,y:w.br.y-q},bl:{x:w.br.x-x,y:w.br.y+q},br:{x:w.br.x+q,y:w.br.y+x},tl:{x:w.br.x-q,y:w.br.y-x}};w.ml.corner={tl:{x:w.ml.x-q,y:w.ml.y-x},tr:{x:w.ml.x+x,y:w.ml.y-q},bl:{x:w.ml.x-x,y:w.ml.y+q},br:{x:w.ml.x+q,y:w.ml.y+x}};w.mt.corner={tl:{x:w.mt.x-q,y:w.mt.y-x},tr:{x:w.mt.x+x,y:w.mt.y-q},bl:{x:w.mt.x-x,y:w.mt.y+q},br:{x:w.mt.x+q,y:w.mt.y+x}};w.mr.corner={tl:{x:w.mr.x-q,y:w.mr.y-x},tr:{x:w.mr.x+x,y:w.mr.y-q},bl:{x:w.mr.x-x,y:w.mr.y+q},br:{x:w.mr.x+q,y:w.mr.y+x}};w.mb.corner={tl:{x:w.mb.x-q,y:w.mb.y-x},tr:{x:w.mb.x+x,y:w.mb.y-q},bl:{x:w.mb.x-x,y:w.mb.y+q},br:{x:w.mb.x+q,y:w.mb.y+x}};var t=40;w.mtr.corner={tl:{x:w.mtr.x-q+(v*t),y:w.mtr.y-x-(u*t)},tr:{x:w.mtr.x+x+(v*t),y:w.mtr.y-q-(u*t)},bl:{x:w.mtr.x-x+(v*t),y:w.mtr.y+q-(u*t)},br:{x:w.mtr.x+q+(v*t),y:w.mtr.y+x-(u*t)}};var s=(-t-this.currentHeight);w.mbr.corner={tl:{x:w.mbr.x-q+(v*s),y:w.mbr.y-x-(u*s)},tr:{x:w.mbr.x+x+(v*s),y:w.mbr.y-q-(u*s)},bl:{x:w.mbr.x-x+(v*s),y:w.mbr.y+q-(u*s)},br:{x:w.mbr.x+q+(v*s),y:w.mbr.y+x-(u*s)}}},toGrayscale:function(){var i=this.get("fill");if(i){this.set("overlayFill",new d.Color(i).toGrayscale().toRgb())}return this},complexity:function(){return 0},toJSON:function(){return this.toObject()},setGradientFill:function(i,q){this.set("fill",d.Gradient.forObject(this,i,q))},animate:function(q,s,i){var r=this;if(!("from" in i)){i.from=this.get(q)}if(/[+-]/.test(s.charAt(0))){s=this.get(q)+parseFloat(s)}d.util.animate({startValue:i.from,endValue:s,byValue:i.by,easing:i.easing,duration:i.duration,onChange:function(t){r.set(q,t);i.onChange&&i.onChange()},onComplete:function(){r.setCoords();i.onComplete&&i.onComplete()}})}});d.Object.prototype.rotate=d.Object.prototype.setAngle;var j=d.Object.prototype;for(var g=j.stateProperties.length;g--;){var h=j.stateProperties[g],e=h.charAt(0).toUpperCase()+h.slice(1),f="set"+e,n="get"+e;if(!j[n]){j[n]=(function(i){return new Function('return this.get("'+i+'")')})(h)}if(!j[f]){j[f]=(function(i){return new Function("value",'return this.set("'+i+'", value)')})(h)}}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),e=c.util.object.extend,d=c.Object.prototype.set,a={x1:1,x2:1,y1:1,y2:1};if(c.Line){c.warn("fabric.Line is already defined");return}c.Line=c.util.createClass(c.Object,{type:"line",initialize:function(g,f){if(!g){g=[0,0,0,0]}this.callSuper("initialize",f);this.set("x1",g[0]);this.set("y1",g[1]);this.set("x2",g[2]);this.set("y2",g[3]);this._setWidthHeight()},_setWidthHeight:function(){this.set("width",(this.x2-this.x1)||1);this.set("height",(this.y2-this.y1)||1);this.set("left",this.x1+this.width/2);this.set("top",this.y1+this.height/2)},set:function(f,g){d.call(this,f,g);if(f in a){this._setWidthHeight()}return this},_render:function(f){f.beginPath();f.moveTo(this.width===1?0:(-this.width/2),this.height===1?0:(-this.height/2));f.lineTo(this.width===1?0:(this.width/2),this.height===1?0:(this.height/2));f.lineWidth=this.strokeWidth;var g=f.strokeStyle;f.strokeStyle=f.fillStyle;f.stroke();f.strokeStyle=g},complexity:function(){return 1},toObject:function(){return e(this.callSuper("toObject"),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){return[""].join("")}});c.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" ");c.Line.fromElement=function(g,f){var i=c.parseAttributes(g,c.Line.ATTRIBUTE_NAMES);var h=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new c.Line(h,e(i,f))};c.Line.fromObject=function(f){var g=[f.x1,f.y1,f.x2,f.y2];return new c.Line(g,f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),d=Math.PI*2,e=b.util.object.extend;if(b.Circle){b.warn("fabric.Circle is already defined.");return}b.Circle=b.util.createClass(b.Object,{type:"circle",initialize:function(f){f=f||{};this.set("radius",f.radius||0);this.callSuper("initialize",f);var g=this.get("radius")*2;this.set("width",g).set("height",g)},toObject:function(){return e(this.callSuper("toObject"),{radius:this.get("radius")})},toSVG:function(){return('')},_render:function(f,g){f.beginPath();f.globalAlpha*=this.opacity;f.arc(g?this.left:0,g?this.top:0,this.radius,0,d,false);f.closePath();if(this.fill){f.fill()}if(this.stroke){f.stroke()}},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(f){this.radius=f;this.set("width",f*2).set("height",f*2)},complexity:function(){return 1}});b.Circle.ATTRIBUTE_NAMES="cx cy r fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Circle.fromElement=function(g,f){f||(f={});var h=b.parseAttributes(g,b.Circle.ATTRIBUTE_NAMES);if(!c(h)){throw Error("value of `r` attribute is required and can not be negative")}if("left" in h){h.left-=(f.width/2)||0}if("top" in h){h.top-=(f.height/2)||0}return new b.Circle(e(h,f))};function c(f){return(("radius" in f)&&(f.radius>0))}b.Circle.fromObject=function(f){return new b.Circle(f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Triangle){b.warn("fabric.Triangle is already defined");return}b.Triangle=b.util.createClass(b.Object,{type:"triangle",initialize:function(c){c=c||{};this.callSuper("initialize",c);this.set("width",c.width||100).set("height",c.height||100)},_render:function(c){var d=this.width/2,e=this.height/2;c.beginPath();c.moveTo(-d,e);c.lineTo(0,-e);c.lineTo(d,e);c.closePath();if(this.fill){c.fill()}if(this.stroke){c.stroke()}},complexity:function(){return 1},toSVG:function(){var c=this.width/2,d=this.height/2;var e=[-c+" "+d,"0 "+-d,c+" "+d].join(",");return''}});b.Triangle.fromObject=function(c){return new b.Triangle(c)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),c=Math.PI*2,d=b.util.object.extend;if(b.Ellipse){b.warn("fabric.Ellipse is already defined.");return}b.Ellipse=b.util.createClass(b.Object,{type:"ellipse",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(){return d(this.callSuper("toObject"),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(){return[""].join("")},render:function(e,f){if(this.rx===0||this.ry===0){return}return this.callSuper("render",e,f)},_render:function(e,f){e.beginPath();e.save();e.globalAlpha*=this.opacity;e.transform(1,0,0,this.ry/this.rx,0,0);e.arc(f?this.left:0,f?this.top:0,this.rx,0,c,false);if(this.stroke){e.stroke()}if(this.fill){e.fill()}e.restore()},complexity:function(){return 1}});b.Ellipse.ATTRIBUTE_NAMES="cx cy rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Ellipse.fromElement=function(f,e){e||(e={});var g=b.parseAttributes(f,b.Ellipse.ATTRIBUTE_NAMES);if("left" in g){g.left-=(e.width/2)||0}if("top" in g){g.top-=(e.height/2)||0}return new b.Ellipse(d(g,e))};b.Ellipse.fromObject=function(e){return new b.Ellipse(e)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={});if(c.Rect){console.warn("fabric.Rect is already defined");return}c.Rect=c.util.createClass(c.Object,{type:"rect",options:{rx:0,ry:0},initialize:function(d){this._initStateProperties();this.callSuper("initialize",d);this._initRxRy()},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat(["rx","ry"])},_initRxRy:function(){if(this.rx&&!this.ry){this.ry=this.rx}else{if(this.ry&&!this.rx){this.rx=this.ry}}},_render:function(f){var j=this.rx||0,i=this.ry||0,d=-this.width/2,k=-this.height/2,e=this.width,g=this.height;f.beginPath();f.globalAlpha*=this.opacity;if(this.group){f.translate(this.x||0,this.y||0)}f.moveTo(d+j,k);f.lineTo(d+e-j,k);f.bezierCurveTo(d+e,k,d+e,k+i,d+e,k+i);f.lineTo(d+e,k+g-i);f.bezierCurveTo(d+e,k+g,d+e-j,k+g,d+e-j,k+g);f.lineTo(d+j,k+g);f.bezierCurveTo(d,k+g,d,k+g-i,d,k+g-i);f.lineTo(d,k+i);f.bezierCurveTo(d,k,d+j,k,d+j,k);f.closePath();if(this.fill){f.fill()}if(this.stroke){f.stroke()}},_normalizeLeftTopProperties:function(d){if(d.left){this.set("left",d.left+this.getWidth()/2)}this.set("x",d.left||0);if(d.top){this.set("top",d.top+this.getHeight()/2)}this.set("y",d.top||0);return this},complexity:function(){return 1},toObject:function(){return c.util.object.extend(this.callSuper("toObject"),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){return''}});c.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");function a(d){d.left=d.left||0;d.top=d.top||0;return d}c.Rect.fromElement=function(e,d){if(!e){return null}var g=c.parseAttributes(e,c.Rect.ATTRIBUTE_NAMES);g=a(g);var f=new c.Rect(c.util.object.extend((d?c.util.object.clone(d):{}),g));f._normalizeLeftTopProperties(g);return f};c.Rect.fromObject=function(d){return new c.Rect(d)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),a=c.util.toFixed;if(c.Polyline){c.warn("fabric.Polyline is already defined");return}c.Polyline=c.util.createClass(c.Object,{type:"polyline",initialize:function(e,d){d=d||{};this.set("points",e);this.callSuper("initialize",d);this._calcDimensions()},_calcDimensions:function(){return c.Polygon.prototype._calcDimensions.call(this)},toObject:function(){return c.Polygon.prototype.toObject.call(this)},toSVG:function(){var f=[];for(var e=0,d=this.points.length;e"].join("")},_render:function(f){var e;f.beginPath();for(var g=0,d=this.points.length;g"].join("")},_render:function(l){var k;l.beginPath();for(var m=0,j=this.points.length;m1){E=Math.sqrt(E);O*=E;N*=E}var R=aa/O;var Q=W/O;var D=(-W)/N;var C=(aa)/N;var H=R*M+Q*L;var q=D*M+C*L;var F=R*T+Q*S;var ab=D*T+C*S;var Z=(F-H)*(F-H)+(ab-q)*(ab-q);var U=1/Z-0.25;if(U<0){U=0}var w=Math.sqrt(U);if(P==J){w=-w}var V=0.5*(H+F)-w*(ab-q);var K=0.5*(q+ab)+w*(F-H);var v=Math.atan2(q-K,H-V);var u=Math.atan2(ab-K,F-V);var Y=u-v;if(Y<0&&P==1){Y+=2*Math.PI}else{if(Y>0&&P==0){Y-=2*Math.PI}}var B=Math.ceil(Math.abs(Y/(Math.PI*0.5+0.001)));var I=[];for(var X=0;X"},toObject:function(){var q=g(this.callSuper("toObject"),{path:this.path});if(this.sourcePath){q.sourcePath=this.sourcePath}if(this.transformMatrix){q.transformMatrix=this.transformMatrix}return q},toDatalessObject:function(){var q=this.toObject();if(this.sourcePath){q.path=this.sourcePath}delete q.sourcePath;return q},toSVG:function(){var t=[];for(var r=0,q=this.path.length;r',"',""].join("")},complexity:function(){return this.path.length},_parsePath:function(){var C=[],z,v,y;for(var u=0,t,q,w=this.path.length;uB){for(var r=1,x=q.length;r"];for(var l=0,j=m.length;l");return k.join("")},toString:function(){return"#"},isSameColor:function(){var j=this.getObjects()[0].get("fill");return this.getObjects().every(function(k){return k.get("fill")===j})},complexity:function(){return this.paths.reduce(function(j,k){return j+((k&&k.complexity)?k.complexity():0)},0)},toGrayscale:function(){var j=this.paths.length;while(j--){this.paths[j].toGrayscale()}return this},getObjects:function(){return this.paths}});function c(m){for(var l=0,j=m.length;l"},getObjects:function(){return this.objects},add:function(h){this._restoreObjectsState();this.objects.push(h);h.setActive(true);this._calcBounds();this._updateObjectsCoords();return this},remove:function(h){this._restoreObjectsState();f(this.objects,h);h.setActive(false);this._calcBounds();this._updateObjectsCoords();return this},size:function(){return this.getObjects().length},set:function(h,k){if(typeof k=="function"){this.set(h,k(this[h]))}else{if(h==="fill"||h==="opacity"){var j=this.objects.length;this[h]=k;while(j--){this.objects[j].set(h,k)}}else{this[h]=k}}return this},contains:function(h){return this.objects.indexOf(h)>-1},toObject:function(){return g(this.callSuper("toObject"),{objects:b(this.objects,"clone")})},render:function(j){j.save();this.transform(j);var n=Math.max(this.scaleX,this.scaleY);for(var l=0,h=this.objects.length,k;k=this.objects[l];l++){var m=k.borderScaleFactor;k.borderScaleFactor=n;k.render(j);k.borderScaleFactor=m}this.hideBorders||this.drawBorders(j);this.hideCorners||this.drawCorners(j);j.restore();this.setCoords()},item:function(h){return this.getObjects()[h]},complexity:function(){return this.getObjects().reduce(function(i,h){i+=(typeof h.complexity=="function")?h.complexity():0;return i},0)},_restoreObjectsState:function(){this.objects.forEach(this._restoreObjectState,this);return this},_restoreObjectState:function(j){var l=this.get("left"),m=this.get("top"),h=this.getAngle()*(Math.PI/180),k=j.get("originalLeft"),n=j.get("originalTop"),i=Math.cos(h)*j.get("top")+Math.sin(h)*j.get("left"),o=-Math.sin(h)*j.get("top")+Math.cos(h)*j.get("left");j.setAngle(j.getAngle()+this.getAngle());j.set("left",l+o*this.get("scaleX"));j.set("top",m+i*this.get("scaleY"));j.set("scaleX",j.get("scaleX")*this.get("scaleX"));j.set("scaleY",j.get("scaleY")*this.get("scaleY"));j.setCoords();j.hideCorners=false;j.setActive(false);j.setCoords();return this},destroy:function(){return this._restoreObjectsState()},saveCoords:function(){this._originalLeft=this.get("left");this._originalTop=this.get("top");return this},hasMoved:function(){return this._originalLeft!==this.get("left")||this._originalTop!==this.get("top")},setObjectsCoords:function(){this.forEachObject(function(h){h.setCoords()});return this},activateAllObjects:function(){return this.setActive(true)},setActive:function(h){this.forEachObject(function(i){i.setActive(h)});return this},forEachObject:e.StaticCanvas.prototype.forEachObject,_setOpacityIfSame:function(){var j=this.getObjects(),i=j[0]?j[0].get("opacity"):1;var h=j.every(function(k){return k.get("opacity")===i});if(h){this.opacity=i}},_calcBounds:function(){var s=[],q=[],p,n,k,h,m,l,u,r=0,t=this.objects.length;for(;ri.x&&j-hi.y},toGrayscale:function(){var h=this.objects.length;while(h--){this.objects[h].toGrayscale()}}});e.Group.fromObject=function(h){return new e.Group(h.objects,h)}})(typeof exports!="undefined"?exports:this);(function(a){var b=fabric.util.object.extend;if(!a.fabric){a.fabric={}}if(a.fabric.Image){fabric.warn("fabric.Image is already defined.");return}if(!fabric.Object){fabric.warn("fabric.Object is required for fabric.Image initialization");return}fabric.Image=fabric.util.createClass(fabric.Object,{active:false,bordervisibility:false,cornervisibility:false,type:"image",initialize:function(d,c){c||(c={});this.callSuper("initialize",c);this._initElement(d);this._originalImage=this.getElement();this._initConfig(c);this.filters=[];if(c.filters){this.filters=c.filters;this.applyFilters()}},getElement:function(){return this._element},setElement:function(c){this._element=c;this._initConfig();return this},getOriginalSize:function(){var c=this.getElement();return{width:c.width,height:c.height}},setBorderVisibility:function(c){this._resetWidthHeight();this._adjustWidthHeightToBorders(showBorder);this.setCoords()},setCornersVisibility:function(c){this.cornervisibility=!!c},render:function(c,d){c.save();if(!d){this.transform(c)}this._render(c);if(this.active&&!d){this.drawBorders(c);this.hideCorners||this.drawCorners(c)}c.restore()},toObject:function(){return b(this.callSuper("toObject"),{src:this._originalImage.src||this._originalImage._src,filters:this.filters.concat()})},toSVG:function(){return''},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(c){this.constructor.fromObject(this.toObject(),c)},applyFilters:function(i){if(this.filters.length===0){this.setElement(this._originalImage);i&&i();return}var c=typeof Buffer!=="undefined"&&typeof window==="undefined",g=this._originalImage,e=fabric.document.createElement("canvas"),f=c?new (require("canvas").Image):fabric.document.createElement("img"),h=this;if(!e.getContext&&typeof G_vmlCanvasManager!="undefined"){G_vmlCanvasManager.initElement(e)}e.width=g.width;e.height=g.height;e.getContext("2d").drawImage(g,0,0);this.filters.forEach(function(j){j&&j.applyTo(e)});f.onload=function(){h.setElement(f);i&&i();f.onload=e=g=null};f.width=g.width;f.height=g.height;if(c){var d=e.toDataURL("image/png").replace(/data:image\/png;base64,/,"");f.src=new Buffer(d,"base64");h.setElement(f);i&&i()}else{f.src=e.toDataURL("image/png")}return this},_render:function(c){c.drawImage(this.getElement(),-this.width/2,-this.height/2,this.width,this.height)},_adjustWidthHeightToBorders:function(c){if(c){this.currentBorder=this.borderwidth;this.width+=(2*this.currentBorder);this.height+=(2*this.currentBorder)}else{this.currentBorder=0}},_resetWidthHeight:function(){var c=this.getElement();this.set("width",c.width);this.set("height",c.height)},_initElement:function(c){this.setElement(fabric.util.getById(c));fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(c){this.setOptions(c||{});this._setBorder();this._setWidthHeight()},_initFilters:function(c){if(c.filters&&c.filters.length){this.filters=c.filters.map(function(d){return fabric.Image.filters[d.type].fromObject(d)})}},_setBorder:function(){if(this.bordervisibility){this.currentBorder=this.borderwidth}else{this.currentBorder=0}},_setWidthHeight:function(){var c=2*this.currentBorder;this.width=(this.getElement().width||0)+c;this.height=(this.getElement().height||0)+c},complexity:function(){return 1}});fabric.Image.CSS_CANVAS="canvas-img";fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc;fabric.Image.fromObject=function(d,f){var c=fabric.document.createElement("img"),e=d.src;if(d.width){c.width=d.width}if(d.height){c.height=d.height}c.onload=function(){fabric.Image.prototype._initFilters.call(d,d);var g=new fabric.Image(c,d);f&&f(g);c=c.onload=null};c.src=e};fabric.Image.fromURL=function(d,f,e){var c=fabric.document.createElement("img");c.onload=function(){if(f){f(new fabric.Image(c,e))}c=c.onload=null};c.src=d};fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" ");fabric.Image.fromElement=function(d,f,c){c||(c={});var e=fabric.parseAttributes(d,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(e["xlink:href"],f,b(e,c))};fabric.Image.async=true})(typeof exports!="undefined"?exports:this);fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var a=this.get("angle");if(a>-225&&a<=-135){return -180}else{if(a>-135&&a<=-45){return -90}else{if(a>-45&&a<=45){return 0}else{if(a>45&&a<=135){return 90}else{if(a>135&&a<=225){return 180}else{if(a>225&&a<=315){return 270}else{if(a>315){return 360}}}}}}}return 0},straighten:function(){var a=this._getAngleValueForStraighten();this.setAngle(a);return this},fxStraighten:function(b){b=b||{};var c=function(){},d=b.onComplete||c,a=b.onChange||c,e=this;fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(f){e.setAngle(f);a()},onComplete:function(){e.setCoords();d()},onStart:function(){e.setActive(false)}});return this}});fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(a){a.straighten();this.renderAll();return this},fxStraightenObject:function(a){a.fxStraighten({onChange:this.renderAll.bind(this)});return this}});fabric.Image.filters={};fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(d){var c=d.getContext("2d"),a=c.getImageData(0,0,d.width,d.height),h=a.data,e=a.width,l=a.height,k,b,g,f;for(g=0;gh&&m>h&&o>h&&p(a-m)'},_render:function(f){var h=Cufon.textOptions||(Cufon.textOptions={});h.left=this.left;h.top=this.top;h.context=f;h.color=this.fill;var g=this._initDummyElement();this.transform(f);Cufon.replaceElement(g,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor});this.width=h.width;this.height=h.height;this._totalLineHeight=h.totalLineHeight;this._fontAscent=h.fontAscent;this._boundaries=h.boundaries;this._shadowOffsets=h.shadowOffsets;this._shadows=h.shadows||[];this.setCoords()},_initDummyElement:function(){var g=c.document.createElement("pre"),f=c.document.createElement("div");f.appendChild(g);if(typeof G_vmlCanvasManager=="undefined"){g.innerHTML=this.text}else{g.innerText=this.text.replace(/\r?\n/gi,"\r")}g.style.fontSize=this.fontSize+"px";g.style.letterSpacing="normal";return g},render:function(f,g){f.save();this._render(f);if(!g&&this.active){this.drawBorders(f);this.hideCorners||this.drawCorners(f)}f.restore()},toObject:function(){return e(this.callSuper("toObject"),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor})},toSVG:function(){var i=this.text.split(/\r?\n/),j=-this._fontAscent-((this._fontAscent/5)*this.lineHeight),g=-(this.width/2),f=(this.height/2)-(i.length*this.fontSize)-this._totalLineHeight,h=this._getSVGTextAndBg(j,g,i),k=this._getSVGShadows(j,i);f+=((this._fontAscent/5)*this.lineHeight);return['',h.textBgRects.join(""),"',k.join(""),h.textSpans.join(""),"",""].join("")},_getSVGShadows:function(h,n){var o=[],k,l,p,g,f=1;for(k=0,p=this._shadows.length;k",c.util.string.escapeXml(n[l]),"");f=1}else{f++}}}return o},_getSVGTextAndBg:function(j,h,n){var g=[],k=[],l,m,o,f=1;for(l=0,o=n.length;l",c.util.string.escapeXml(n[l]),"");f=1}else{f++}if(!this.backgroundColor){continue}k.push("')}return{textSpans:g,textBgRects:k}},_getFillAttributes:function(f){var g=f?new c.Color(f):"";if(!g||!g.getSource()||g.getAlpha()===1){return'fill="'+f+'"'}return'opacity="'+g.getAlpha()+'" fill="'+g.setAlpha(1).toRgb()+'"'},setColor:function(f){this.set("fill",f);return this},setFontsize:function(f){this.set("fontSize",f);this.setCoords();return this},getText:function(){return this.text},setText:function(f){this.set("text",f);this.setCoords();return this},set:function(f,g){if(typeof f=="object"){for(var h in f){this.set(h,f[h])}}else{this[f]=g;if(f==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+g+"$3")}}return this}});c.Text.fromObject=function(f){return new c.Text(f.text,d(f))};c.Text.fromElement=function(f){}})(typeof exports!="undefined"?exports:this);(function(){if(typeof document!="undefined"&&typeof window!="undefined"){return}var DOMParser=new require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),Canvas=require("canvas"),Image=require("canvas").Image;function request(url,encoding,callback){var oURL=URL.parse(url),client=HTTP.createClient(80,oURL.hostname),request=client.request("GET",oURL.pathname,{host:oURL.hostname});client.addListener("error",function(err){if(err.errno===process.ECONNREFUSED){fabric.log("ECONNREFUSED: connection refused to "+client.host+":"+client.port)}else{fabric.log(err.message)}});request.end();request.on("response",function(response){var body="";if(encoding){response.setEncoding(encoding)}response.on("end",function(){callback(body)});response.on("data",function(chunk){if(response.statusCode==200){body+=chunk}})})}fabric.util.loadImage=function(url,callback){request(url,"binary",function(body){var img=new Image();img.src=new Buffer(body,"binary");img._src=url;callback(img)})};fabric.loadSVGFromURL=function(url,callback){url=url.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim();request(url,"",function(body){var doc=new DOMParser().parseFromString(body);fabric.parseSVGDocument(doc.documentElement,function(results,options){callback(results,options)})})};fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body);callback&&callback()})};fabric.Image.fromObject=function(object,callback){fabric.util.loadImage(object.src,function(img){var oImg=new fabric.Image(img);oImg._initConfig(object);oImg._initFilters(object);callback(oImg)})};fabric.createCanvasForNode=function(width,height){var canvasEl=fabric.document.createElement("canvas"),nodeCanvas=new Canvas(width||600,height||600);canvasEl.style={};canvasEl.width=nodeCanvas.width;canvasEl.height=nodeCanvas.height;var canvas=fabric.Canvas||fabric.StaticCanvas;var fabricCanvas=new canvas(canvasEl);fabricCanvas.contextContainer=nodeCanvas.getContext("2d");fabricCanvas.nodeCanvas=nodeCanvas;return fabricCanvas};fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()};if(fabric.Canvas){fabric.Canvas.prototype.createPNGStream}var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(width){origSetWidth.call(this);this.nodeCanvas.width=width;return this};if(fabric.Canvas){fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth}var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(height){origSetHeight.call(this);this.nodeCanvas.height=height;return this};if(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 df40fae18472d1f739395fceaf4f719552b263ad..37bf8ac00b41d4a8a8d45d03d053d77f20deb7a6 100644 GIT binary patch delta 21577 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 DO}MS8 diff --git a/package.json b/package.json index 8d20b6f5..b6d432d2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fabric", "description": "Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.", - "version": "0.8.17", + "version": "0.8.18", "author": "Juriy Zaytsev ", "keywords": ["canvas", "graphic", "graphics", "SVG", "node-canvas", "parser", "HTML5", "object model"], "repository": "git://github.com/kangax/fabric.js", diff --git a/src/image.class.js b/src/image.class.js index f68ccd90..1ee8f885 100644 --- a/src/image.class.js +++ b/src/image.class.js @@ -50,13 +50,6 @@ */ type: 'image', - /** - * Filters to be applied to an image (when calling `applyFilters`) - * @property - * @type Array - */ - filters: [ ], - /** * Constructor * @param {HTMLImageElement | String} element Image element @@ -70,6 +63,8 @@ this._originalImage = this.getElement(); this._initConfig(options); + this.filters = [ ]; + if (options.filters) { this.filters = options.filters; this.applyFilters(); diff --git a/src/image_filters.js b/src/image_filters.js index 00d09e91..894f17c2 100644 --- a/src/image_filters.js +++ b/src/image_filters.js @@ -8,13 +8,13 @@ fabric.Image.filters = { }; * @memberOf fabric.Image.filters */ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Image.filters.Grayscale.prototype */ { - + /** * @param {String} type */ type: "Grayscale", - - /** + + /** * @method applyTo * @memberOf fabric.Image.filters.Grayscale.prototype * @param {Object} canvasEl Canvas element to apply filter to @@ -22,7 +22,7 @@ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Imag applyTo: function(canvasEl) { var context = canvasEl.getContext('2d'), imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), - data = imageData.data, + data = imageData.data, iLen = imageData.width, jLen = imageData.height, index, average, i, j; @@ -41,8 +41,8 @@ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Imag context.putImageData(imageData, 0, 0); }, - - /** + + /** * @method toJSON * @return {String} json representation of filter */ @@ -54,19 +54,19 @@ fabric.Image.filters.Grayscale = fabric.util.createClass( /** @scope fabric.Imag fabric.Image.filters.Grayscale.fromObject = function() { return new fabric.Image.filters.Grayscale(); }; - + /** * @class fabric.Image.filters.RemoveWhite * @memberOf fabric.Image.filters */ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Image.filters.RemoveWhite.prototype */ { - + /** * @param {String} type */ type: "RemoveWhite", - - /** + + /** * @memberOf fabric.Image.filters.RemoveWhite.prototype * @param {Object} [options] Options object */ @@ -75,8 +75,8 @@ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Im this.threshold = options.threshold || 30; this.distance = options.distance || 20; }, - - /** + + /** * @method applyTo * @param {Object} canvasEl Canvas element to apply filter to */ @@ -96,10 +96,10 @@ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Im g = data[i+1]; b = data[i+2]; - if (r > limit && - g > limit && - b > limit && - abs(r-g) < distance && + if (r > limit && + g > limit && + b > limit && + abs(r-g) < distance && abs(r-b) < distance && abs(g-b) < distance) { @@ -109,15 +109,15 @@ fabric.Image.filters.RemoveWhite = fabric.util.createClass( /** @scope fabric.Im context.putImageData(imageData, 0, 0); }, - - /** + + /** * @method toJSON * @return {String} json representation of filter */ toJSON: function() { - return { - type: this.type, - threshold: this.threshold, + return { + type: this.type, + threshold: this.threshold, distance: this.distance }; } @@ -132,13 +132,13 @@ fabric.Image.filters.RemoveWhite.fromObject = function(object) { * @memberOf fabric.Image.filters */ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.filters.Invert.prototype */ { - + /** * @param {String} type */ type: "Invert", - - /** + + /** * @method applyTo * @memberOf fabric.Image.filters.Invert.prototype * @param {Object} canvasEl Canvas element to apply filter to @@ -146,9 +146,9 @@ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.f applyTo: function(canvasEl) { var context = canvasEl.getContext('2d'), imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), - data = imageData.data, + data = imageData.data, iLen = data.length, i; - + for (i = 0; i < iLen; i+=4) { data[i] = 255 - data[i]; data[i + 1] = 255 - data[i + 1]; @@ -157,8 +157,8 @@ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.f context.putImageData(imageData, 0, 0); }, - - /** + + /** * @method toJSON * @return {String} json representation of filter */ @@ -169,4 +169,265 @@ fabric.Image.filters.Invert = fabric.util.createClass( /** @scope fabric.Image.f fabric.Image.filters.Invert.fromObject = function() { return new fabric.Image.filters.Invert(); +}; + +/** + * @class fabric.Image.filters.Sepia + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Sepia = fabric.util.createClass( /** @scope fabric.Image.filters.Sepia.prototype */ { + + /** + * @param {String} type + */ + type: "Sepia", + + /** + * @method applyTo + * @memberOf fabric.Image.filters.Sepia.prototype + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + iLen = data.length, i, avg; + + for (i = 0; i < iLen; i+=4) { + avg = 0.3 * data[i] + 0.59 * data[i + 1] + 0.11 * data[i + 2]; + data[i] = avg + 100; + data[i + 1] = avg + 50; + data[i + 2] = avg + 255; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { type: this.type }; + } +}); + +fabric.Image.filters.Sepia.fromObject = function() { + return new fabric.Image.filters.Sepia(); +}; + +/** + * @class fabric.Image.filters.Sepia2 + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Sepia2 = fabric.util.createClass( /** @scope fabric.Image.filters.Sepia2.prototype */ { + + /** + * @param {String} type + */ + type: "Sepia2", + + /** + * @method applyTo + * @memberOf fabric.Image.filters.Sepia.prototype + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + iLen = data.length, i, r, g, b; + + for (i = 0; i < iLen; i+=4) { + + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + + data[i] = (r * 0.393 + g * 0.769 + b * 0.189 ) / 1.351; + data[i + 1] = (r * 0.349 + g * 0.686 + b * 0.168 ) / 1.203; + data[i + 2] = (r * 0.272 + g * 0.534 + b * 0.131 ) / 2.140; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { type: this.type }; + } +}); + +fabric.Image.filters.Sepia2.fromObject = function() { + return new fabric.Image.filters.Sepia2(); +}; + +/** + * @class fabric.Image.filters.Brightness + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Brightness = fabric.util.createClass( /** @scope fabric.Image.filters.Brightness.prototype */ { + + /** + * @param {String} type + */ + type: "Brightness", + + /** + * @memberOf fabric.Image.filters.Brightness.prototype + * @param {Object} [options] Options object + */ + initialize: function(options) { + options || (options = { }); + this.brightness = options.brightness || 100; + }, + + /** + * @method applyTo + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + brightness = this.brightness; + + for (var i = 0, len = data.length; i < len; i += 4) { + data[i] += brightness; + data[i + 1] += brightness; + data[i + 2] += brightness; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { + type: this.type, + brightness: this.brightness + }; + } +}); + +fabric.Image.filters.Brightness.fromObject = function(object) { + return new fabric.Image.filters.Brightness(object); +}; + +/** + * @class fabric.Image.filters.Brightness + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.Noise = fabric.util.createClass( /** @scope fabric.Image.filters.Noise.prototype */ { + + /** + * @param {String} type + */ + type: "Noise", + + /** + * @memberOf fabric.Image.filters.Brightness.prototype + * @param {Object} [options] Options object + */ + initialize: function(options) { + options || (options = { }); + this.noise = options.noise || 100; + }, + + /** + * @method applyTo + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + noise = this.noise, rand; + + for (var i = 0, len = data.length; i < len; i += 4) { + + rand = (0.5 - Math.random()) * noise; + + data[i] += rand; + data[i + 1] += rand; + data[i + 2] += rand; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { + type: this.type, + noise: this.noise + }; + } +}); + +fabric.Image.filters.Noise.fromObject = function(object) { + return new fabric.Image.filters.Noise(object); +}; + +/** + * @class fabric.Image.filters.Brightness + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.GradientTransparency = fabric.util.createClass( /** @scope fabric.Image.filters.GradientTransparency.prototype */ { + + /** + * @param {String} type + */ + type: "GradientTransparency", + + /** + * @memberOf fabric.Image.filters.GradientTransparency.prototype + * @param {Object} [options] Options object + */ + initialize: function(options) { + options || (options = { }); + this.threshold = options.threshold || 100; + }, + + /** + * @method applyTo + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo: function(canvasEl) { + var context = canvasEl.getContext('2d'), + imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), + data = imageData.data, + threshold = this.threshold, + total = data.length; + + for (var i = 0, len = data.length; i < len; i += 4) { + data[i + 3] = threshold + 255 * (total - i) / total; + } + + context.putImageData(imageData, 0, 0); + }, + + /** + * @method toJSON + * @return {String} json representation of filter + */ + toJSON: function() { + return { + type: this.type, + threshold: this.threshold + }; + } +}); + +fabric.Image.filters.GradientTransparency.fromObject = function(object) { + return new fabric.Image.filters.GradientTransparency(object); }; \ No newline at end of file