From d870410a7d1668c46b1facb4ca3fcb479d07d9ad Mon Sep 17 00:00:00 2001 From: kangax Date: Mon, 2 Jan 2012 16:14:20 -0500 Subject: [PATCH] First (and almost complete) implementation of `fabric.Canvas#toSVG`. --- dist/all.js | 363 +++++++++++++++++++++++++++++++++++-- dist/all.min.js | 2 +- dist/all.min.js.gz | Bin 34961 -> 36422 bytes lib/cufon.js | 21 ++- src/circle.class.js | 14 ++ src/ellipse.class.js | 16 ++ src/image.class.js | 18 ++ src/line.class.js | 18 ++ src/object.class.js | 28 +++ src/parser.js | 52 +++++- src/path.class.js | 23 +++ src/path_group.class.js | 24 +++ src/polygon.class.js | 23 ++- src/polyline.class.js | 23 ++- src/rect.class.js | 14 ++ src/static_canvas.class.js | 30 +++ src/text.class.js | 36 ++++ src/triangle.class.js | 23 +++ 18 files changed, 689 insertions(+), 39 deletions(-) diff --git a/dist/all.js b/dist/all.js index 333aa20b..a5eadd60 100644 --- a/dist/all.js +++ b/dist/all.js @@ -1238,6 +1238,7 @@ Cufon.registerEngine('canvas', (function() { Cufon.textOptions.width = _width; Cufon.textOptions.height = (_height * lines) + totalLineHeight; Cufon.textOptions.lines = lines; + Cufon.textOptions.totalLineHeight = totalLineHeight; if (HAS_INLINE_BLOCK) { wStyle.width = wrapperWidth; @@ -1250,7 +1251,9 @@ Cufon.registerEngine('canvas', (function() { var g = Cufon.textOptions.context || canvas.getContext('2d'), scale = roundedHeight / viewBox.height; - + + Cufon.textOptions.fontAscent = font.ascent * scale; + g.save(); g.scale(scale, scale); @@ -1379,18 +1382,22 @@ Cufon.registerEngine('canvas', (function() { if (textDecoration) { g.save(); g.strokeStyle = g.fillStyle; + + // add 2x more thickness — closer to SVG rendering + g.lineWidth += g.lineWidth; + g.beginPath(); if (textDecoration.underline) { - g.moveTo(0, -font.face['underline-position']); - g.lineTo(charWidth, -font.face['underline-position']); + g.moveTo(0, -font.face['underline-position'] + 0.5); + g.lineTo(charWidth, -font.face['underline-position'] + 0.5); } if (textDecoration.overline) { - g.moveTo(0, font.ascent); - g.lineTo(charWidth, font.ascent); + g.moveTo(0, font.ascent + 0.5); + g.lineTo(charWidth, font.ascent + 0.5); } if (textDecoration['line-through']) { - g.moveTo(0, -font.descent); - g.lineTo(charWidth, -font.descent); + g.moveTo(0, -font.descent + 0.5); + g.lineTo(charWidth, -font.descent + 0.5); } g.stroke(); g.restore(); @@ -3527,18 +3534,50 @@ fabric.util.string = { callback(results, options); }); } - - extend(fabric, { - parseAttributes: parseAttributes, - parseElements: parseElements, - parseStyleAttribute: parseStyleAttribute, - parsePointsAttribute: parsePointsAttribute, - getCSSRules: getCSSRules, + + function createSVGFontFacesMarkup(objects) { + var markup = ''; - loadSVGFromURL: loadSVGFromURL, - loadSVGFromString: loadSVGFromString + for (var i = 0, len = objects.length; i < len; i++) { + if (objects[i].type !== 'text' || !objects[i].path) continue; + + markup += [ + '@font-face {', + 'font-family: ', objects[i].fontFamily, '; ', + 'src: url(\'', objects[i].path, '\')', + '}' + ].join(''); + } + + if (markup) { + markup = [ + '', + '', + '' + ].join(''); + } + + return markup; + } + + extend(fabric, { + + parseAttributes: parseAttributes, + parseElements: parseElements, + parseStyleAttribute: parseStyleAttribute, + parsePointsAttribute: parsePointsAttribute, + getCSSRules: getCSSRules, + + loadSVGFromURL: loadSVGFromURL, + loadSVGFromString: loadSVGFromString, + + createSVGFontFacesMarkup: createSVGFontFacesMarkup }); - + })(typeof exports != 'undefined' ? exports : this); (function() { @@ -5023,6 +5062,36 @@ fabric.util.string = { background: this.backgroundColor } }, + + /** + * Returns SVG representation of canvas + * @function + * @method toSVG + * @return {String} + */ + toSVG: function() { + var markup = [ + '', + '', + '', + 'Created with Fabric.js ', fabric.version, '', + fabric.createSVGFontFacesMarkup(this.getObjects()), + ]; + + for (var i = 0, objects = this.getObjects(), len = objects.length; i < len; i++) { + markup.push(objects[i].toSVG()); + } + markup.push(''); + + return markup.join(''); + }, /** * Returns true if canvas contains no objects @@ -6963,6 +7032,34 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return this.toObject(); }, + /** + * Returns styles-string for svg-export + * @method getSvgStyles + * @return {string} + */ + 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(""); + }, + + /** + * Returns transform-string for svg-export + * @method getSvgTransform + * @return {string} + */ + getSvgTransform: function() { + var angle = this.getAngle(); + return [ + "translate(", this.left, " ", this.top, ")", + angle !== 0 ? (" rotate(" + angle + ")") : '', + (this.scaleX === 1 && this.scaleY === 1) ? '' : (" scale(" + toFixed(this.scaleX, '2') + " " + toFixed(this.scaleY, '2') + ")") + ].join(''); + }, + /** * @private * @method _removeDefaultValues @@ -8207,6 +8304,24 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { x2: this.get('x2'), y2: this.get('y2') }); + }, + + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + console.log() + return [ + '' + ].join(''); } }); @@ -8303,6 +8418,20 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return (''); + }, + /** * @private * @method _render @@ -8468,6 +8597,29 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { */ complexity: function() { return 1; + }, + + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + + var widthBy2 = this.width / 2, + heightBy2 = this.height / 2; + + var points = [ + -widthBy2 + " " + heightBy2, + "0 " + -heightBy2, + widthBy2 + " " + heightBy2 + ].join(","); + + return ''; } }); @@ -8540,6 +8692,22 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return [ + '' + ].join(''); + }, + /** * Renders this instance on a given context * @method render @@ -8748,6 +8916,20 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { */ complexity: function() { return 1; + }, + + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return ''; } }); @@ -8808,7 +8990,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { "use strict"; - var fabric = global.fabric || (global.fabric = { }); + var fabric = global.fabric || (global.fabric = { }), + toFixed = fabric.util.toFixed; if (fabric.Polyline) { fabric.warn('fabric.Polyline is already defined'); @@ -8858,6 +9041,26 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return fabric.Polygon.prototype.toObject.call(this); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var points = []; + for (var i = 0, len = this.points.length; i < len; i++) { + points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); + } + + return [ + '' + ].join(''); + }, + /** * @private * @method _render @@ -8943,7 +9146,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, min = fabric.util.array.min, - max = fabric.util.array.max; + max = fabric.util.array.max, + toFixed = fabric.util.toFixed; if (fabric.Polygon) { fabric.warn('fabric.Polygon is already defined'); @@ -9008,6 +9212,26 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var points = []; + for (var i = 0, len = this.points.length; i < len; i++) { + points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); + } + + return [ + '' + ].join(''); + }, + /** * @private * @method _render @@ -9610,6 +9834,29 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return o; }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var chunks = []; + for (var i = 0, len = this.path.length; i < len; i++) { + chunks.push(this.path[i].join(' ')); + } + var path = chunks.join(' '); + + return [ + '', + '', + '' + ].join(''); + }, + /** * Returns number representation of an instance complexity * @method complexity @@ -9922,6 +10169,30 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return o; }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var objects = this.getObjects(); + var markup = [ + '' + ]; + + for (var i = 0, len = objects.length; i < len; i++) { + markup.push(objects[i].toSVG()); + } + markup.push(''); + + return markup.join(''); + }, + /** * Returns a string representation of this path group * @method toString @@ -10676,6 +10947,24 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return ''+ + ' element with actual transformation, then offsetting object to the top/left + // so that object's center aligns with container's left/top + 'transform="translate('+ (-this.width/2) + ' ' + (-this.height/2) + ')" ' + + 'width="' + this.width + '" ' + + 'height="' + this.height + '"' + '/>'+ + ''; + }, + /** * Returns source of an image * @method getSrc @@ -11263,6 +11552,8 @@ fabric.Image.filters.RemoveWhite.fromObject = function(object) { // update width, height this.width = o.width; this.height = o.height; + this._totalLineHeight = o.totalLineHeight; + this._fontAscent = o.fontAscent; // need to set coords _after_ the width/height was retreived from Cufon this.setCoords(); @@ -11334,6 +11625,40 @@ fabric.Image.filters.RemoveWhite.fromObject = function(object) { }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var textSpans = [ ], + textLines = this.text.split('\n'), + lineTopOffset = -this._fontAscent - ((this._fontAscent / 5) * this.lineHeight); + + for (var i = 0, len = textLines.length; i < len; i++) { + textSpans.push('', textLines[i], ''); + } + + var textLeftOffset = -(this.width/2), + textTopOffset = (this.height/2) - (textLines.length * this.fontSize) - this._totalLineHeight; + + return [ + '', + '', + textSpans.join(''), + '', + '' + ].join(''); + }, + /** * Sets "color" of an instance (alias of `set('fill', …)`) * @method setColor diff --git a/dist/all.min.js b/dist/all.min.js index 24d9d5cb..47d04397 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -4,4 +4,4 @@ var fabric=fabric||{version:"0.7.4"};if(typeof exports!="undefined"){exports.fab * Copyright (c) 2009 Simo Kinnunen. * Licensed under the MIT license. */ -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:JU){U=P}if(O>S){S=O}if(Pw){w=h}K.push(h);h=0;continue}var A=aa.glyphs[af[Z]]||aa.missingGlyph;if(!A){continue}h+=C=Number(A.w||aa.w)+T}K.push(h);h=Math.max(w,h);var m=[];for(var Z=K.length;Z--;){m[Z]=h-K[Z]}if(C===null){return null}U+=(G.width-C);B+=G.minX;var v,p;if(n){v=I;p=I.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=D;p=fabric.document.createElement("canvas");v.appendChild(p);if(z.printable){var X=fabric.document.createElement("span");X.className="cufon-alt";X.appendChild(fabric.document.createTextNode(D));v.appendChild(X)}}var ag=v.style;var N=p.style||{};var k=o.convert(G.height-H+S);var ae=Math.ceil(k);var R=ae/k;p.width=Math.ceil(o.convert(h+U-B)*R);p.height=ae;H+=G.minY;N.top=Math.round(o.convert(H-aa.ascent))+"px";N.left=Math.round(o.convert(B))+"px";var j=Math.ceil(o.convert(h*R));var t=j+"px";var s=o.convert(aa.height);var E=(z.lineHeight-1)*o.convert(-aa.ascent/5)*(L-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*L)+E;Cufon.textOptions.lines=L;if(a){ag.width=t;ag.height=s+"px"}else{ag.paddingLeft=t;ag.paddingBottom=(s-1)+"px"}var ac=Cufon.textOptions.context||p.getContext("2d"),J=ae/G.height;ac.save();ac.scale(J,J);ac.translate(-B-((1/J*p.width)/2)+(Cufon.fonts[aa.family].offsetLeft||0),-H-(Cufon.textOptions.height/J)/2);ac.lineWidth=aa.face["underline-thickness"];ac.save();function q(i,g){ac.strokeStyle=g;ac.beginPath();ac.moveTo(0,i);ac.lineTo(h,i);ac.stroke()}var r=Cufon.getTextDecoration(z),u=z.fontStyle==="italic";function ad(){ac.save();ac.fillStyle=z.backgroundColor;var aj=0,ak=0;if(z.textAlign==="right"){ac.translate(m[ak],0)}else{if(z.textAlign==="center"){ac.translate(m[ak]/2,0)}}for(var ah=0,x=af.length;ah.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?1:(l-k)/m;p(j+(r-j)*q(s));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}}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]-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(b){var c=b.fabric||(b.fabric={}),i=c.util.object.extend,f=c.util.string.capitalize,j=c.util.object.clone;var d={cx:"left",x:"left",cy:"top",y:"top",r:"radius","fill-opacity":"opacity","fill-rule":"fillRule","stroke-width":"strokeWidth",transform:"transformMatrix"};function p(u,t){if(!u){return}var w,s,r={};if(u.parentNode&&/^g$/i.test(u.parentNode.nodeName)){r=c.parseAttributes(u.parentNode,t)}var v=t.reduce(function(y,x){w=u.getAttribute(x);s=parseFloat(w);if(w){if((x==="fill"||x==="stroke")&&w==="none"){w=""}if(x==="fill-rule"){w=(w==="evenodd")?"destination-over":w}if(x==="transform"){w=c.parseTransformAttribute(w)}if(x in d){x=d[x]}y[x]=isNaN(s)?w:s}return y},{});v=i(v,i(a(u),c.parseStyleAttribute(u)));return i(r,v)}c.parseTransformAttribute=(function(){function r(K,L){var M=L[0];K[0]=Math.cos(M);K[1]=Math.sin(M);K[2]=-Math.sin(M);K[3]=Math.cos(M)}function w(M,N){var L=N[0],K=(N.length===2)?N[1]:N[0];M[0]=L;M[3]=K}function H(K,L){K[2]=L[0]}function t(K,L){K[1]=L[0]}function E(K,L){K[4]=L[0];if(L.length===2){K[5]=L[1]}}var y=[1,0,0,1,0,0],s="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",I="(?:\\s+,?\\s*|,\\s*)",z="(?:(skewX)\\s*\\(\\s*("+s+")\\s*\\))",x="(?:(skewY)\\s*\\(\\s*("+s+")\\s*\\))",G="(?:(rotate)\\s*\\(\\s*("+s+")(?:"+I+"("+s+")"+I+"("+s+"))?\\s*\\))",J="(?:(scale)\\s*\\(\\s*("+s+")(?:"+I+"("+s+"))?\\s*\\))",C="(?:(translate)\\s*\\(\\s*("+s+")(?:"+I+"("+s+"))?\\s*\\))",F="(?:(matrix)\\s*\\(\\s*("+s+")"+I+"("+s+")"+I+"("+s+")"+I+"("+s+")"+I+"("+s+")"+I+"("+s+")\\s*\\))",D="(?:"+F+"|"+C+"|"+J+"|"+G+"|"+z+"|"+x+")",A="(?:"+D+"(?:"+I+D+")*)",u="^\\s*(?:"+A+"?)\\s*$",B=new RegExp(u),v=new RegExp(D);return function(L){var K=y.concat();if(!L||(L&&!B.test(L))){return K}L.replace(v,function(P){var M=new RegExp(D).exec(P).filter(function(Q){return(Q!==""&&Q!=null)}),N=M[1],O=M.slice(2).map(parseFloat);switch(N){case"translate":E(K,O);break;case"rotate":r(K,O);break;case"scale":w(K,O);break;case"skewX":H(K,O);break;case"skewY":t(K,O);break;case"matrix":K=O;break}});return K}})();function l(u){if(!u){return null}u=u.trim();var w=u.indexOf(",")>-1;u=u.split(/\s+/);var s=[];if(w){for(var t=0,r=u.length;t0){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)=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)},getContext:function(){return this.contextTop},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(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(c){var a=fabric.document.createElement("canvas");a.width=this.getWidth();a.height=this.getHeight();var b=this.__clone||(this.__clone=new fabric.Canvas(a));b.clipTo=this.clipTo;return b.loadFromJSON(JSON.stringify(this.toJSON()),function(){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,FX_DURATION:500,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,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};if(!this.includeDefaultValues){i=this._removeDefaultValues(i)}return i},toDatalessObject:function(){return this.toObject()},_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 t=this.oCoords,q=b(45-this.getAngle()),s=Math.sqrt(2*Math.pow(this.cornersize,2))/2,i=s*Math.cos(q),r=s*Math.sin(q);t.tl.corner={tl:{x:t.tl.x-r,y:t.tl.y-i},tr:{x:t.tl.x+i,y:t.tl.y-r},bl:{x:t.tl.x-i,y:t.tl.y+r},br:{x:t.tl.x+r,y:t.tl.y+i}};t.tr.corner={tl:{x:t.tr.x-r,y:t.tr.y-i},tr:{x:t.tr.x+i,y:t.tr.y-r},br:{x:t.tr.x+r,y:t.tr.y+i},bl:{x:t.tr.x-i,y:t.tr.y+r}};t.bl.corner={tl:{x:t.bl.x-r,y:t.bl.y-i},bl:{x:t.bl.x-i,y:t.bl.y+r},br:{x:t.bl.x+r,y:t.bl.y+i},tr:{x:t.bl.x+i,y:t.bl.y-r}};t.br.corner={tr:{x:t.br.x+i,y:t.br.y-r},bl:{x:t.br.x-i,y:t.br.y+r},br:{x:t.br.x+r,y:t.br.y+i},tl:{x:t.br.x-r,y:t.br.y-i}};t.ml.corner={tl:{x:t.ml.x-r,y:t.ml.y-i},tr:{x:t.ml.x+i,y:t.ml.y-r},bl:{x:t.ml.x-i,y:t.ml.y+r},br:{x:t.ml.x+r,y:t.ml.y+i}};t.mt.corner={tl:{x:t.mt.x-r,y:t.mt.y-i},tr:{x:t.mt.x+i,y:t.mt.y-r},bl:{x:t.mt.x-i,y:t.mt.y+r},br:{x:t.mt.x+r,y:t.mt.y+i}};t.mr.corner={tl:{x:t.mr.x-r,y:t.mr.y-i},tr:{x:t.mr.x+i,y:t.mr.y-r},bl:{x:t.mr.x-i,y:t.mr.y+r},br:{x:t.mr.x+r,y:t.mr.y+i}};t.mb.corner={tl:{x:t.mb.x-r,y:t.mb.y-i},tr:{x:t.mb.x+i,y:t.mb.y-r},bl:{x:t.mb.x-i,y:t.mb.y+r},br:{x:t.mb.x+r,y:t.mb.y+i}}},toGrayscale:function(){var i=this.get("fill");if(i){this.set("overlayFill",new d.Color(i).toGrayscale().toRgb())}return this},complexity:function(){return 0},getCenter:function(){return{x:this.get("left")+this.width/2,y:this.get("top")+this.height/2}},straighten:function(){var i=this._getAngleValueForStraighten();this.setAngle(i);return this},fxStraighten:function(q){q=q||{};var r=function(){},s=q.onComplete||r,i=q.onChange||r,t=this;d.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(u){t.setAngle(u);i()},onComplete:function(){t.setCoords();s()},onStart:function(){t.setActive(false)}});return this},fxRemove:function(q){q||(q={});var r=function(){},s=q.onComplete||r,i=q.onChange||r,t=this;d.util.animate({startValue:this.get("opacity"),endValue:0,duration:this.FX_DURATION,onChange:function(u){t.set("opacity",u);i()},onComplete:s,onStart:function(){t.setActive(false)}});return this},_getAngleValueForStraighten:function(){var i=this.get("angle");if(i>-225&&i<=-135){return -180}else{if(i>-135&&i<=-45){return -90}else{if(i>-45&&i<=45){return 0}else{if(i>45&&i<=135){return 90}else{if(i>135&&i<=225){return 180}else{if(i>225&&i<=315){return 270}else{if(i>315){return 360}}}}}}}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,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/2,-this.height/2);f.lineTo(this.width/2,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")})}});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.get("scaleX");this.set("width",g).set("height",g)},toObject:function(){return e(this.callSuper("toObject"),{radius:this.get("radius")})},_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")},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}});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")})},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}});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(a){var b=a.fabric||(a.fabric={});if(b.Polyline){b.warn("fabric.Polyline is already defined");return}b.Polyline=b.util.createClass(b.Object,{type:"polyline",initialize:function(d,c){c=c||{};this.set("points",d);this.callSuper("initialize",c);this._calcDimensions()},_calcDimensions:function(){return b.Polygon.prototype._calcDimensions.call(this)},toObject:function(){return b.Polygon.prototype.toObject.call(this)},_render:function(e){var d;e.beginPath();for(var f=0,c=this.points.length;f1){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},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"},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,{maxwidth:null,maxheight:null,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},getNormalizedSize:function(d,c,e){if(e&&c&&(d.width>d.height&&(d.width/d.height)<(c/e))){normalizedWidth=~~((d.width*e)/d.height);normalizedHeight=e}else{if(e&&((d.height==d.width)||(d.height>d.width)||(d.height>e))){normalizedWidth=~~((d.width*e)/d.height);normalizedHeight=e}else{if(c&&(c'},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;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(d){var c=this.getOriginalSize();d.drawImage(this.getElement(),-c.width/2,-c.height/2,c.width,c.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.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.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(e){var g=Cufon.textOptions||(Cufon.textOptions={});g.left=this.left;g.top=this.top;g.context=e;g.color=this.fill;var f=this._initDummyElement();this.transform(e);Cufon.replaceElement(f,{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=g.width;this.height=g.height;this.setCoords()},_initDummyElement:function(){var f=b.document.createElement("div"),e=b.document.createElement("div");e.appendChild(f);f.innerHTML=this.text;f.style.fontSize=this.fontSize+"px";f.style.letterSpacing="normal";return f},render:function(e,f){e.save();this._render(e);if(!f&&this.active){this.drawBorders(e);this.hideCorners||this.drawCorners(e)}e.restore()},toObject:function(){return d(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})},setColor:function(e){this.set("fill",e);return this},setFontsize:function(e){this.set("fontSize",e);this.setCoords();return this},getText:function(){return this.text},setText:function(e){this.set("text",e);this.setCoords();return this},set:function(e,f){if(typeof e=="object"){for(var g in e){this.set(g,e[g])}}else{this[e]=f;if(e==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+f+"$3")}}return this}});b.Text.fromObject=function(e){return new b.Text(e.text,c(e))};b.Text.fromElement=function(e){}})(typeof exports!="undefined"?exports:this);(function(){if(typeof document!="undefined"&&typeof window!="undefined"){return}var XML=require("o3-xml"),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");callback(img)})};fabric.loadSVGFromURL=function(url,callback){url=url.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim();request(url,"",function(body){var doc=XML.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:JU){U=P}if(O>S){S=O}if(Pw){w=h}K.push(h);h=0;continue}var A=aa.glyphs[af[Z]]||aa.missingGlyph;if(!A){continue}h+=C=Number(A.w||aa.w)+T}K.push(h);h=Math.max(w,h);var m=[];for(var Z=K.length;Z--;){m[Z]=h-K[Z]}if(C===null){return null}U+=(G.width-C);B+=G.minX;var v,p;if(n){v=I;p=I.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=D;p=fabric.document.createElement("canvas");v.appendChild(p);if(z.printable){var X=fabric.document.createElement("span");X.className="cufon-alt";X.appendChild(fabric.document.createTextNode(D));v.appendChild(X)}}var ag=v.style;var N=p.style||{};var k=o.convert(G.height-H+S);var ae=Math.ceil(k);var R=ae/k;p.width=Math.ceil(o.convert(h+U-B)*R);p.height=ae;H+=G.minY;N.top=Math.round(o.convert(H-aa.ascent))+"px";N.left=Math.round(o.convert(B))+"px";var j=Math.ceil(o.convert(h*R));var t=j+"px";var s=o.convert(aa.height);var E=(z.lineHeight-1)*o.convert(-aa.ascent/5)*(L-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*L)+E;Cufon.textOptions.lines=L;Cufon.textOptions.totalLineHeight=E;if(a){ag.width=t;ag.height=s+"px"}else{ag.paddingLeft=t;ag.paddingBottom=(s-1)+"px"}var ac=Cufon.textOptions.context||p.getContext("2d"),J=ae/G.height;Cufon.textOptions.fontAscent=aa.ascent*J;ac.save();ac.scale(J,J);ac.translate(-B-((1/J*p.width)/2)+(Cufon.fonts[aa.family].offsetLeft||0),-H-(Cufon.textOptions.height/J)/2);ac.lineWidth=aa.face["underline-thickness"];ac.save();function q(i,g){ac.strokeStyle=g;ac.beginPath();ac.moveTo(0,i);ac.lineTo(h,i);ac.stroke()}var r=Cufon.getTextDecoration(z),u=z.fontStyle==="italic";function ad(){ac.save();ac.fillStyle=z.backgroundColor;var aj=0,ak=0;if(z.textAlign==="right"){ac.translate(m[ak],0)}else{if(z.textAlign==="center"){ac.translate(m[ak]/2,0)}}for(var ah=0,x=af.length;ah.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?1:(l-k)/m;p(j+(r-j)*q(s));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}}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]-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(i){var g=i.fabric||(i.fabric={}),o=g.util.object.extend,e=g.util.string.capitalize,p=g.util.object.clone;var k={cx:"left",x:"left",cy:"top",y:"top",r:"radius","fill-opacity":"opacity","fill-rule":"fillRule","stroke-width":"strokeWidth",transform:"transformMatrix"};function d(v,u){if(!v){return}var x,t,s={};if(v.parentNode&&/^g$/i.test(v.parentNode.nodeName)){s=g.parseAttributes(v.parentNode,u)}var w=u.reduce(function(z,y){x=v.getAttribute(y);t=parseFloat(x);if(x){if((y==="fill"||y==="stroke")&&x==="none"){x=""}if(y==="fill-rule"){x=(x==="evenodd")?"destination-over":x}if(y==="transform"){x=g.parseTransformAttribute(x)}if(y in k){y=k[y]}z[y]=isNaN(t)?x:t}return z},{});w=o(w,o(n(v),g.parseStyleAttribute(v)));return o(s,w)}g.parseTransformAttribute=(function(){function s(L,M){var N=M[0];L[0]=Math.cos(N);L[1]=Math.sin(N);L[2]=-Math.sin(N);L[3]=Math.cos(N)}function x(N,O){var M=O[0],L=(O.length===2)?O[1]:O[0];N[0]=M;N[3]=L}function I(L,M){L[2]=M[0]}function u(L,M){L[1]=M[0]}function F(L,M){L[4]=M[0];if(M.length===2){L[5]=M[1]}}var z=[1,0,0,1,0,0],t="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",J="(?:\\s+,?\\s*|,\\s*)",A="(?:(skewX)\\s*\\(\\s*("+t+")\\s*\\))",y="(?:(skewY)\\s*\\(\\s*("+t+")\\s*\\))",H="(?:(rotate)\\s*\\(\\s*("+t+")(?:"+J+"("+t+")"+J+"("+t+"))?\\s*\\))",K="(?:(scale)\\s*\\(\\s*("+t+")(?:"+J+"("+t+"))?\\s*\\))",D="(?:(translate)\\s*\\(\\s*("+t+")(?:"+J+"("+t+"))?\\s*\\))",G="(?:(matrix)\\s*\\(\\s*("+t+")"+J+"("+t+")"+J+"("+t+")"+J+"("+t+")"+J+"("+t+")"+J+"("+t+")\\s*\\))",E="(?:"+G+"|"+D+"|"+K+"|"+H+"|"+A+"|"+y+")",B="(?:"+E+"(?:"+J+E+")*)",v="^\\s*(?:"+B+"?)\\s*$",C=new RegExp(v),w=new RegExp(E);return function(M){var L=z.concat();if(!M||(M&&!C.test(M))){return L}M.replace(w,function(Q){var N=new RegExp(E).exec(Q).filter(function(R){return(R!==""&&R!=null)}),O=N[1],P=N.slice(2).map(parseFloat);switch(O){case"translate":F(L,P);break;case"rotate":s(L,P);break;case"scale":x(L,P);break;case"skewX":I(L,P);break;case"skewY":u(L,P);break;case"matrix":L=P;break}});return L}})();function r(v){if(!v){return null}v=v.trim();var x=v.indexOf(",")>-1;v=v.split(/\s+/);var t=[];if(x){for(var u=0,s=v.length;u",'",""].join("")}return t}o(g,{parseAttributes:d,parseElements:f,parseStyleAttribute:h,parsePointsAttribute:r,getCSSRules:c,loadSVGFromURL:b,loadSVGFromString:m,createSVGFontFacesMarkup:l})})(typeof exports!="undefined"?exports:this);(function(){function c(h){var g=h.getAttribute("style");if(g){var k=g.split(/\s*;\s*/);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 k=d.getElementsByTagName("stop"),d,f,e={},g;for(var h=k.length;h--;){d=k[h];f=parseInt(d.getAttribute("offset"),10)/100;e[f]=c(d)||d.getAttribute("stop-color")}var j={x1:d.getAttribute("x1")||0,y1:d.getAttribute("y1")||0,x2:d.getAttribute("x2")||"100%",y2:d.getAttribute("y2")||0};a(l,j);return fabric.Gradient.create(m,{x1:j.x1,y1:j.y1,x2:j.x2,y2:j.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()),];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.discardActiveObject()}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)},getContext:function(){return this.contextTop},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(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(c){var a=fabric.document.createElement("canvas");a.width=this.getWidth();a.height=this.getHeight();var b=this.__clone||(this.__clone=new fabric.Canvas(a));b.clipTo=this.clipTo;return b.loadFromJSON(JSON.stringify(this.toJSON()),function(){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,FX_DURATION:500,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,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};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(",this.left," ",this.top,")",i!==0?(" rotate("+i+")"):"",(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 t=this.oCoords,q=b(45-this.getAngle()),s=Math.sqrt(2*Math.pow(this.cornersize,2))/2,i=s*Math.cos(q),r=s*Math.sin(q);t.tl.corner={tl:{x:t.tl.x-r,y:t.tl.y-i},tr:{x:t.tl.x+i,y:t.tl.y-r},bl:{x:t.tl.x-i,y:t.tl.y+r},br:{x:t.tl.x+r,y:t.tl.y+i}};t.tr.corner={tl:{x:t.tr.x-r,y:t.tr.y-i},tr:{x:t.tr.x+i,y:t.tr.y-r},br:{x:t.tr.x+r,y:t.tr.y+i},bl:{x:t.tr.x-i,y:t.tr.y+r}};t.bl.corner={tl:{x:t.bl.x-r,y:t.bl.y-i},bl:{x:t.bl.x-i,y:t.bl.y+r},br:{x:t.bl.x+r,y:t.bl.y+i},tr:{x:t.bl.x+i,y:t.bl.y-r}};t.br.corner={tr:{x:t.br.x+i,y:t.br.y-r},bl:{x:t.br.x-i,y:t.br.y+r},br:{x:t.br.x+r,y:t.br.y+i},tl:{x:t.br.x-r,y:t.br.y-i}};t.ml.corner={tl:{x:t.ml.x-r,y:t.ml.y-i},tr:{x:t.ml.x+i,y:t.ml.y-r},bl:{x:t.ml.x-i,y:t.ml.y+r},br:{x:t.ml.x+r,y:t.ml.y+i}};t.mt.corner={tl:{x:t.mt.x-r,y:t.mt.y-i},tr:{x:t.mt.x+i,y:t.mt.y-r},bl:{x:t.mt.x-i,y:t.mt.y+r},br:{x:t.mt.x+r,y:t.mt.y+i}};t.mr.corner={tl:{x:t.mr.x-r,y:t.mr.y-i},tr:{x:t.mr.x+i,y:t.mr.y-r},bl:{x:t.mr.x-i,y:t.mr.y+r},br:{x:t.mr.x+r,y:t.mr.y+i}};t.mb.corner={tl:{x:t.mb.x-r,y:t.mb.y-i},tr:{x:t.mb.x+i,y:t.mb.y-r},bl:{x:t.mb.x-i,y:t.mb.y+r},br:{x:t.mb.x+r,y:t.mb.y+i}}},toGrayscale:function(){var i=this.get("fill");if(i){this.set("overlayFill",new d.Color(i).toGrayscale().toRgb())}return this},complexity:function(){return 0},getCenter:function(){return{x:this.get("left")+this.width/2,y:this.get("top")+this.height/2}},straighten:function(){var i=this._getAngleValueForStraighten();this.setAngle(i);return this},fxStraighten:function(q){q=q||{};var r=function(){},s=q.onComplete||r,i=q.onChange||r,t=this;d.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(u){t.setAngle(u);i()},onComplete:function(){t.setCoords();s()},onStart:function(){t.setActive(false)}});return this},fxRemove:function(q){q||(q={});var r=function(){},s=q.onComplete||r,i=q.onChange||r,t=this;d.util.animate({startValue:this.get("opacity"),endValue:0,duration:this.FX_DURATION,onChange:function(u){t.set("opacity",u);i()},onComplete:s,onStart:function(){t.setActive(false)}});return this},_getAngleValueForStraighten:function(){var i=this.get("angle");if(i>-225&&i<=-135){return -180}else{if(i>-135&&i<=-45){return -90}else{if(i>-45&&i<=45){return 0}else{if(i>45&&i<=135){return 90}else{if(i>135&&i<=225){return 180}else{if(i>225&&i<=315){return 270}else{if(i>315){return 360}}}}}}}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,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/2,-this.height/2);f.lineTo(this.width/2,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(){console.log();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.get("scaleX");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")},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},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,{maxwidth:null,maxheight:null,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},getNormalizedSize:function(d,c,e){if(e&&c&&(d.width>d.height&&(d.width/d.height)<(c/e))){normalizedWidth=~~((d.width*e)/d.height);normalizedHeight=e}else{if(e&&((d.height==d.width)||(d.height>d.width)||(d.height>e))){normalizedWidth=~~((d.width*e)/d.height);normalizedHeight=e}else{if(c&&(c'},getSrc:function(){return 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;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(d){var c=this.getOriginalSize();d.drawImage(this.getElement(),-c.width/2,-c.height/2,c.width,c.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.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.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(e){var g=Cufon.textOptions||(Cufon.textOptions={});g.left=this.left;g.top=this.top;g.context=e;g.color=this.fill;var f=this._initDummyElement();this.transform(e);Cufon.replaceElement(f,{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=g.width;this.height=g.height;this._totalLineHeight=g.totalLineHeight;this._fontAscent=g.fontAscent;this.setCoords()},_initDummyElement:function(){var f=b.document.createElement("div"),e=b.document.createElement("div");e.appendChild(f);f.innerHTML=this.text;f.style.fontSize=this.fontSize+"px";f.style.letterSpacing="normal";return f},render:function(e,f){e.save();this._render(e);if(!f&&this.active){this.drawBorders(e);this.hideCorners||this.drawCorners(e)}e.restore()},toObject:function(){return d(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 l=[],j=this.text.split("\n"),k=-this._fontAscent-((this._fontAscent/5)*this.lineHeight);for(var h=0,f=j.length;h',j[h],"")}var g=-(this.width/2),e=(this.height/2)-(j.length*this.fontSize)-this._totalLineHeight;return['',"',l.join(""),"",""].join("")},setColor:function(e){this.set("fill",e);return this},setFontsize:function(e){this.set("fontSize",e);this.setCoords();return this},getText:function(){return this.text},setText:function(e){this.set("text",e);this.setCoords();return this},set:function(e,f){if(typeof e=="object"){for(var g in e){this.set(g,e[g])}}else{this[e]=f;if(e==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+f+"$3")}}return this}});b.Text.fromObject=function(e){return new b.Text(e.text,c(e))};b.Text.fromElement=function(e){}})(typeof exports!="undefined"?exports:this);(function(){if(typeof document!="undefined"&&typeof window!="undefined"){return}var XML=require("o3-xml"),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");callback(img)})};fabric.loadSVGFromURL=function(url,callback){url=url.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim();request(url,"",function(body){var doc=XML.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 0bcd9f9c582b067fc7deb3ecd56d582cb986d562..2b1f82bcafcf70941197b1d943ba3ebc8d05b778 100644 GIT binary patch delta 31364 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 delta 29892 zcmV(zK<2;3oC1-N0tX+92nbH3a)7KyRNP-4fO;>Yy!=A<4&ZT z9=j2?o91m9z7P7=dti>|uHTc3!Ul%QsW4Hu7tHtNnFmjpvG>x#B`gH+1X%LbnSTvc zyry#KfU*Lva)k$4$fLb$W?yq%njfk-?M7>6I$PMvwtS7|N^0y3M*I%`UvbHxA@pQZ zByoQeZqCm&o<2e84_deVbn*f4^oa)gnmzA)B1Pnql>k6zZm;WjIw*j6b4R%wDEAvQ z$~u?s8*;fmIRh=2y+Nty^7Ngvdw<6+@%hc^m9x7N=_gOnAaf~nD}P|{z08T5J#C-Y zfj+cg&K$YJ1m_#VNS|unxrNsY)^uMXPO{kW2L*Hh5dHw+hFSTHUY!@!Dz^=tg8Z^& z!}JwNc_5oZKUqceF)j}}!|U)yy8At(OycDdX8Q$ZczIoSSY=PeRTq#Iw|~6C)~Q}+ z`gsjo2oJ98Ezm1Is7ZD(uhckdHP6{iZ~(*FEBKSrxil@}%%RG=DzjhEVOH&_<2|Xe z7yP)36jOJOpia>}^xT`XbHi#tg5&0X-V)wM+Yy+>>G}hc)>}{j=8^pZo!nQH+GHsD zoXb|<>Pi!)HU06P@O>=6hkty>g7hB{M}BegP<<44jr<4|JMJ-pufMW6z3ulqQYy!K zBf)eKJFlHpuV|kAkS0F}l-Fm&U-M zO9GS1J!3GR$g0i=9Zly*m(}nc|Lh#u7ieN5DuEP2CXs`|9l#=K=3OM$Aoe5l`+dW4YiBk45ZaDkVoTT;V(9}%3~wn2JC<@5!XxTn3|L%R zT?1ajBO-PqKy85D_p>p1bg~GG_CWEPqR2qwBe}zFxUuRKUVn$;m1^5$TV4pP0{X5q zenIv($6cetg|y%!Z5Jou8YaJQ6GRHPgE&d3{5N3d!8qb;|0(*i(B4GR!yl8|`ZsM5 zW`@63W>O{{f82E&=1EefQb0$9WwnkUVLfH2_L0Zk8vM&2p4v>2<_ z6@llCDB4^r;Q-QdV0BHx9ol^}CN+oH+R z=cQtLY=5!9jhW*hDP>zstb$N;YFUZDdVv4FCPJ3kRYINj z0~ggy$Ggb`n(D?lzH%%a#sC~Y%~$)*i@u!c;0>s9L-A&kWUa);O&g^>OwrJaw;`1y zM@lD!KVVGmS1Nr&RLs8REXgHa_!@+I05D4h@qatT@Q}s|`1mYnw6zR|;ly9oCULNs zEoXyOEtpMOm{0Q9-KKFU+gc9&IogAJq!z)38Ty-ewqVdlV*jHb4*Yep`p5g%7mh_X zbXW^`2#23^1Nw*D0F{>J{2pVfLr<7yG4LK%+(Nw#Oy%8WX@zhc2Q+A+0gO#PK0zcFyPJbLB0znbX2am0zpvI>$)RnEN|iHnie!m2*6TGQopVDaI>(0*(z z4{x*1YCt3wu=WC6#kl5|oqylDq%fJTc8iSvSSC+g<6HcY#5Bolo`sVxgv8!w7L076 zMgi9F0PDm zOulCevEAMa3+b=$r1lHl!=yv9$9P;gg+I-%aC_71lsCz(#VC}!Yky$?z9%MNi2^E~ z)n`)>?JRg82sc7ucqVL{Y{t*7_<;H2jX2#{7a*AmNT4oBjQ!afD5q-s5nJaPf5fJ` zb^dshK2w+0Hu4Gh%U5T=Zvs|xPN8Sj+zx?N`CIzQH1*>-kS1b!CxoyQ98|uf z?|Vj1DG(Cv6r+M@7=O1t{d)FpB^p0euBGpRmX(v4R{nx$S>a5H^#0)vDOLpkmEr!9 zS>_s7s^TK}i)l7PcLK-*xt2$AF?%T#z{azMDitG3>RaWIhzTi_w?&HSC7l+#M)(i) zjd{7w^TW;cu4|NbFOm7Cw+t5>9=2{bee(k{ZJ3-gcmz~S|?fBgTT|*A*bkjq5bkf>`4qVXn=QMP5 zV)B@N>h&s41aCkwlm{9+Sj**L0`D-UqwfZP4mwiP%e(4#N!?aTwwxlA8+_K2 zQb2g(dttTe?0h2bWR)x3Gh3jlOP0P>`~{)9@WOxCa4_alq5u+eR+P|{7>VO zRnOKz<&US#<~U;gp2_%VTt45DymKt zc+;H#v+1viTJHBhHyZAWjjIzkahL8K@@CVgLw_294rbCfV72SI-vc_CNzcFlV&A$R z`Y6{Jg*NJ*VU1YKY-w+f1e*96Vx#_Z>W;Vzg3d@Wl* zCbXK3hJS~^UttZ-6Y0@*^qP4v1CSFF8{U#7r>l0eWhb?MIhXwN7PjZlTlkY&25V^rI4xq3W}CwxktqsJtmFH>k6 z_Qvt*?R|<)X5a2rZg#)cmWPU|z^J%>vz3hNlYe6utvbj5(V(C=#?dHb!J6YVM(tIc zm-C4qAv#BZU5tohvYkn#GNCJP3H0iXm?}hZB1ZM)B4A_1aLTA4i##*8A4ZEXTwc%K z`u!L*8`jHYi_ORSnN$#b-f{wPK3%aelf`$!a{)4oGkHG8VaNh63!g$T$1NLXvT=AE zCx6W67|eSM_Zc6S5!QvrA|t1uT#lfG&h9{l#&tyU3Q%$2rJGsYf6&Wx#%g<3|*~t(dHy#vYejsqd`0@Z>a51Yw}t#9UJCZIR++))yb2(Xx8lVtr-I` zM-!V7i2{=vl?wi`o5u}@9&7v=OWN@%41WdPKk_u)?=8_fmvRmppRzCy;($SFqaC-D z%pBH?nkXkDL-PhFuqKdwp^Y2~)v!_-b_RI<7-=e?+y$Zav~0GZt!I8PEY6n5(6co} z&j-m%2f#~1V!#I43o!A?*$rtsMLhHXfanffx)7a~!!+^dMR*`l!!nZYuLIMaEPpBm zDgvM)0aT=c8g!yAs^dK1A3+v%-AF>F5m*Kxh#ZUGi!k!!zmBm=<>4We<(Q$mF0Aga z753?D5*7i))V~AHJHaHtvM`q}!#G*tMdtGK0~7C#|J>A%nV4=as>vlVmXi;-Ai;X< zq<1ZZMc7{lB?zYU45=d#GzX%K=zkuT(j*Wchs-2KB8KHGzq@EOFgsoHRYpLo)d8n1 z;fb~GDB+*L4ScLEk^BM#1m&%ntUh%pbiIx(fMv4H@ekh3`D9kRQgXm z!;BRG(pQ3~O1?hv)AedqyUv5Cs-AnU9&ykP>PE09+rj&rj@kB{y9ef4$NQc#o~%*1 z>Whf7&0O$-3`Xfj9NS5_Tk^rxy|wgXT96%sa@i47aVfzXS$u=Ly?=t$>tRXR9tf1q z?m&iap)Y9>57q*Lah@bKfh2K>QH8u5luW#DvN~9)pfpYcw08CQ_bOU_H$;nO0BUu< z2gi{npg-5JY3AzbaS|_4uin7OLWH18^v>IVmACd{IrCb8^_C+Dd<8Hx(S_Ha&% z=1~<>?0XW6Bkz{;_B?N%mY>roYe{5f8xo03 z)l{~mA&xxGltzXX!;hq+`N7<;szK=h_l5~a#uVn9c*F+zRopOdwT^f^y-bkrF$lXN zWM?)`2VX__m4ldXV8LVgW-%6Cgx5F21wU71V-H_@{3Tq9D}OtnVEe`j92+Y$%B@Tv zueYlDBy2@aYRUu&fU9JJgk*vqAacanJW_-xqgqPvvlFP(S(us`XhDW0h&PKtSJ!v7 z48lhTH&6M1`?>woH@Mi)Ueerb%ePYrx!JgDcfq#iCkob}nXXS3-WmtGVKO9rXWLnK z$)E|`#%?Ry>3^O$-F`hCPiNby^V6|It{Ifu+=G?qQXLo#32!q{zU5Dqt7xT@lA=ui7exM(fi?E=rf`hRC4A>qZ0otv2T^gvh6j)IWb z=*;S_@>VbrP{|CcvUC^4cD6)hVH}kT{&p5!8uXfpS0!9;7}{Oea-D5XR^A5J*SfP2 zQZwJ?+e4txtj(A`EW1W+E)Lhq2cWWCi;QB~R0ovCd`#;5Rz258n%mZnLjzZFzp(`+vp zC~%G!K$GM-{%{Jj@9gkb9N_R2zC6SOo+Z(`h@slr@kBaN;0^b8$%h16xSM)*#b-yf zabW?;1sFmj?kzu}2D(+L;4gwj_ubZ>?0@>b@+cI3VnmC9{hY&>9R z*iGG-AOdjd-sS=HbTeeMO-q<^5tp2+aBw37iE58U3W>rOVAUZE(N`{10g262wXoXY;}!Zb}AmQ#Od3%pjmCJ%0vxF^0gia0J?aI{!&Q5Z3hC(_Cgz=ieC& zmz9co#7G1j*{L`G(K?KGw&BFK&G*H!9#+Ya*|~ zkI2!-jSbm2$$a8Rl&A;GCAyhZndMp4L{5-C*R_QAi{+fwn(Y8Pksm7%Irw!G`+sx4 z{kh)8Z=)PLcz)0tDXDgXazC9#O}Mv-Y;eb0>rA@h8U@MuRA_+bwAOylUjRmaZfiMh zIhZMd&y!h3E^F)JElU@&oYn-$V>!SNMeow9SGo*o#DWT+ zD?iY~j~|$^;YR=jPmBlY z{_oF@2-0mxezE=%Wh$&>W-b~rlFq+`Zk+QSQGbdpG5kxG>_vKb4I7EQU5RahhbZ6ix1nD@L5%RbkuABnSbD)(vcOJ zd{Bm_K7dIhkXaai|2vJPdf-{}kO-8=!cr5%@W8>Lp@C}81gX55-#ZF@kt?qn&2j>hKK4|d~&ffCVoCx1;cPK;yafS8ze z7d6djlW2JT*=|&Y$t4d;VzgeOQ-t&YlATPsZYy=A?^l~XL4Pln0VTYZ9l zt9lZr_1To7yK(=Uynj_8m(5I~lktDRX-}{`#|Q2(5&AIqdA}*fRpkwG=Rjit<#JGH z*FkYjef+P$&-IWZsDA;>43GwPCjMAbig#v(iFcsXl`b7#q()IsuKF-!V(fFl!@!>`@Rx@&3>K$4nIfo)p7|Ap`$Rwj8E-QrjZbil$@@&uB zRE?$9&s>NLtAFB1-bv0pXh0h~6dGXgTIJh`$A1lza5bFu+wviQ4*BBQwdKZ8 zPP;4Sd^?B0rX4r*hTq+mbm*Mfh3wxUk;juNtLc;PJr^1g2t2Ch_ks+=Hi`j2kTBw{ zNl+u!$I%+OAm|M7gM#R25>d2K)%fL`t8382==mLXG(=J)Cg=>{!cP{8PaW3K-2$i* z9;Ud3=99~)D@Bm3jJS2dWNJ-3Z|LW))03|!g_ilD%qPzO8 zuCA`G!`m+%^}O0?FgPrk`iUzCt5J5jhKrT+vVYq!Z@1#qD?yLv(iikichTf9ghK!5 zE-}c^c_7rkSu@Dmy>y<#(9!Ist}eMvechEA*?feCI^=Eye~N%@fa+v0LRVI8@E-{6 zs{q;5?<65fU68E7Kkz*s}mGH?wp?SXigHAI&RWbY@~fK~XtUZGUI_ z%YYcC zMtpp6xr|noorp_Mi!A(Eyiwj5-T=4J`Wc@;wI2A}2oiQ>LY_`IVecfayD1NyGKM5x zg>S_>uK!K^4!N11im9m>hVp8;=u_#{mZDt=CSTeUV{%zcjv3m|nCm*BQ~X zC=jm+_{*2PCLl52x)t~rGOj5j%+HdmKO#)~@+HK7!l0Jd0+|v4;KBfYUJLk=0kbJZ zXDvcPW>9-w3*@K$J9=iS`AN2io`1yduEj2S$R)K)j&Cddf=iEy{*)B0>id0un^umf z6|(re4Qhw<_b2-MlKx)P-vyQz`x5r37RY|XuLu`!9tVF?*D!g%7CfUC{u+n_5?g#o z2G1AgxH&KF@1tUXO1Z&)j+aWyh2Klwz^U_QbMwIg)6h4Od4B$R^+wB^E`JS|^NZT5 zPJ`@(_LoRXqs&JChqmna2XfZHZ^OT&9lj#_S@bRYK7K1znf5S*?78LCQ@gHxC;isy zMGu;|!QMxX$5}$jpqUkN2+M$O7Bg^P1kG2a8J~mZtdPNo6EuI0-%Eu}vQJlqAO!XG4^r=Z{VaW25lmALZXT3xRMGV`7`+w~s#@UjKCzdfz zlv>IwJWh20gDW~i-3gqNZm!eO&W& z@jdZbZaZ|0nu@7@pkIDgW?8i^%Zx50{49BexWjHUke#7P-u@GK-!GxO&B5WX@Jw#t z$6~H^S*bv`F+i3Qcz>;Rz?8y#<$udb7sEi<(=iuiozqDe zxlp|k9|HdXX8_(hfgCL&9aTm{EC9l<{veV?_^P=Cf{P}@;S#QldEQ22zojAw1ZUP@ z5^5EKs|s0?+^7QWKgFVTU+RTh4e(c9%YY%hG&}jr_LnUcUi-_|m+kEVZtNE9P#uT- z&zqC2FE<)!wSPUp`~@8{hRN5nxs*E@)_S2VXhM66**DFRs$WO<#(3UeZo=a~S0`H$ zG!w!3Pmx5IF-8tmN40ZsnL*vP8|H)x%U(MEa z{Ni~3#Hy`HwE?$wjXdvj_-FT|g*6_(Jc*wJW|WZIwtphGOTcJ#hbkev@|gmtp`VkY z?v6BV~hT_iEMdssgFIAkdf~+cwxBm>$jm2#@&AOxH_Ix^84yF_O z7kv!eCV!(*dY&h@8LInHN{W_x(O#TPfBA!=LUD3H|R~ilZ)asS^iTR>e&PD$^wrr4(Vpp~qzN#QCTLCZk zkz;Cc6u*+uXXte>47Rtoj?t}L*oYp)KjfE#AAe2)<+8=HXu*K=FJo0#>-m$Ht>?JM zUK~F^iI3pV>L`981qMfjW8;mjRzV!Krux8T&%-x@)Ib4apxERV&iov8KUci#F9D@t z!XM~3Os*Ite&ua8=^_hu+(99a1u@8?_&GxvIuLd*X(PYpe`Gw`D_HO=AmdEpW_Teu zG=HIHuVi@S*1ny_v5|qYT4@{@x%Jvkd&I$#7xBR}izz&anhSti+G)$E`C58Oy5W!` z3n4>}yk50j)&TGX2KdrS313Amv$5j|e^d1ef9xyG8$9aN%f>GN1#BZ4CtKK9zs9)% zr2Pq&@Mm;|a2oy`S!%4~_-5G7jc)|fA%D$7sShZigI?ZBM zt9+RtQFm=szC3Ge$)iN_p<`4?fa1DxzJ$QvG4XR&&Xqc9FHnkw`qnxFq^V?ANGSBaC5Q3slZyC2(=eRjclf;3GWWF zTq}pu(BUl1txqz5!1G5Z#CORzg?Y3xPs*yNx$a4}aQOJ?GvB{O3$EJV&@-9XTz{h}*A0it zG-_CVD;_9ygh7$fG&aLp+oiAXe@T3H+%MrLdvRi2fKTDeT!2yMiACPi^SX2pr(K#@ zI;)CS$2a_pY{=k9jA84-F*w$*SN(Y0SnS^3?uaw^wWMDOrtRI{jvDNMko{DN6an@S zV1Rznumc~VD|t(~dEw^Xz<(UKGu4T(FU~}Qp8XvYpMi3nFgPBbv`*>8R8?q4oq;=M z&qR(}3F}g2d&(Irt;REstXz6Unw|p{>WMy#5B1h9D_dh>OAFMC(O$OIH-~G_LjhJ^ zf$HGE-A2DB2|5?(hCN`LeOPf6wm?Ngzr798@~61S@veK!uQ!}#${-&Y{V}Ev}u++jxOefw;8S}xy-QM!AJ$zurYWuupwt9#hnwk^PQiCro zaOS=wJc;kB>aMHGxA*R>xUOpk;ML001?2TOt=KOkXB*?rsRTus_Q(PqP|#cJNxtts z$q(ZGadOfc9uFF6?<5{rUZ{FLWY2~4Ux7W|^qU`oS&Bxd4uA5g=tnIKWZjgyk>(ri z5xuN$=p(G%UeFHh{mi#1)f(t?sr*?QH)(t?D)- ztJu1BO{-p;^MB3^WAfhBWZew3&I45?D_gBwqpeqs_T#*>ycI?Ypgy=c8GA zK3d+@?v`qI3)@wtDqGyrEpGWO_R`C=m)zCfwrX!1+v75ot!?Ypw*A(Ui;|XP8!;}7 zR3BU72QKHRYzbt6Cl>q@1zt831#dU-L^d#3)4)>;{(q?gU(>)-yMd=_1W9&oiX@_9 z?}Tvh)%ka%R~J*4oVtv*cDvMIJecE2wtwx z$5^NF8jXi?4vQPzbllU-&Rlz_S$Ck`eGW2mykOTJcUx|PeaLyonyd+x*5fo=>+2 z$f<3UTm79Uak9CYJc)NVH{mx17kPqyS;r(g=!StkVsbuh&nUUcU@1`4W-A1O7#_8b{&@Xr{lc#V zu}x>y1+lt^u#HEy(*fyhp*4KcXAcW}zZ{`|CAjS#hr`-#^tb*AtW~#&Ez~C3tY}?i zM$2#@=a@9c^n{y@HCB7UU7ULiT@Jf2dVk9;SmoF)j}mI^7)9*t$*6Uv#y*HokIzm7 zn#_dgarJMb6F{|Y>D=Ru52Kp)-NE*M9?wIBS`3| z>Y=fGLWfNc*WJeSF%a|tpfpU0ojic#F(#i?kGL-;5vhrm=J&-I^V6z)^#2O^!+)y$ z5nQVve_FYSt*JZNXKJ$jjMJ)&v?^n$GtkPvxNg(+>o)!G9(ywKlXu=xYRN&@SaZ@n z(C1My`#7Cv-6TBTVXZ-BfXaTAXW3FdWl%Hn5TxI9`q3}@*z-#`#}kw8ZX>5Aku!Of zAZn6ap8Sj1c^?KHY!96>6?%(zN`I7?@@Ey#^pz_kKFEhuGazB&9kRwx#7d$<+u)(24pcT)TqAO}cza({XUo~$%+%#sf; z58CnepSZi9eF?)ay_;R}aE01Fg53p_f1?(MP9mL-2CHyH&%U7IhiL#P0o4DOXF$a3 z|J$zjPi}r(-Rj>^)nB($4c=$c8kgK!yOb#hR3ycb8I+S%aI=TvO@8_B%Hb1<*KUrF z^`=OqCV;R~_6jMi1%Dut<3}gY91-=SlcP69QmwIX)N}t5M8H`BW`?Im-{c{3P02GfhE~oRYu4|md5R9xSdJg=pcmDl z1HNm4?|R^S;t{>NS>SsX_?`#;Nc^bq*(_EnfT){w8M>c6`hP5}2G42)7+GXulC&Y;6o@|KqOqBDiQ({upi`Q8?qCdrISMj1#lB?Y9h&Ig? z`|X7r{y2w??J{Hi!>Hyk?F|H#`BTKS9qhfA8UtxSPVDlL1?+#O;rdVtExC{ zp>uugDu27Z7R5>UH=FY&u-KwR2Q_w2JwS1L-w=lP!GOIGpuL!8WH| z#5wIUQxx-^tzcfG2bMj7>#ImR`g!^Fay;U?-nJ(&5t$!9st7?MTCD@WJ|De|-ls!m z3gr0YZgWQFYkS~qk=JtcMysT_G74&@SZyu+t)L z-E@S5G**JkhOJIe0gZYVC32>rSfPI!lBb?Q#IZdZWtbe=l+Dd4+xKOT2uc7&K%aFR z?WItEmSlXMDLO-5Z@D08ZI!hvX%{05;!Qh6mv|*JY8lQ1duZd0w^y=duDZR_3K7^V z)_+p1fa8@R3gp!{@C6{r>?nmP%rR4H^TKgMMg2C`mzDays<6(vdpmeF!EtAM>1Vp_ zfRr7L&eYNdt3+bTWjt4FJ!ct$T*8}TnpLBd?$@Y8qOr5dOxLEr3ner~XcbPqmU~2o z-eG2V$SOo|M$gg_LTF!A$+a6aa4+GsIe)JN``XLeSKgV1Cz9+j(ot70!((IUMs2y0 z))|&hX)Ab#|NPb(uwM)HZiejJ=B5dTF(CV|`8j!rz;O3o&LKq*4dssYSw8KurDF2a z32>{k{h5P|${)EmP}FT2+G0~R0n$)vAa-ExR^CX4Zuf_FpYO(u_fpNbO7tna0Dp|t zC~0Ss5IK8w(4Z`QN(fQ(Ye*+TF~FTj;yFU}ZvKnrY6Gd9+@O5FNd@?UI`+zG(cSYoo5J$6QJdc;N**C&cSGEp z65d5lkIRxabj@KvW`Wy5ZGTvOgbb{%paA|YE7GNjMb}ToMClQzIU!DysE$}?%0sr}3AKP6YIsMDMQ4gvQsxvyp4--6pihqar4SIz1=XrZi zkiST8MNsEibg3e4_LXYf?qI-7sok@?G49UH5Ngb(7ntLe-G^Ej3qOM4X{P zrjzg+aiRGvYvUXxlajhnw4t)^D(=caDfGsYm0UNI90l-}Y~4c3 zX3TE(n=5e(Vr3ps$$!LZBQclnaLmqzR#fIPxoRZ6=?+VCTjj~@08yHU41sT!9%RBx(M9d_G&=#WPzLz<3IxEZ&*J#JkN5%;8obdmM?AiB}3_ zCF{BQmGohN*X&8}(-dWlcQx;Je?H+DKLZE1?M7CjgU>vlrhhN8sVAztvvwJ%r@CtF zHg@_725a3<4XE&j~_!23U-{jNUL|MU8LZ2hvXE4T8vKIR7KD1k1%TPSleue&AZS| zhfjRZgmZ0lmug^i3E9iR0Ns0^sZgS)97^`olXL+UIDen!NjXm)R){A%C9I$b#?yJ8 z^e{Svy0T2(V$u=Df@-ZPgA~mx^A?h@j29ONE;;G71^a=%ec>HL5ibrT#nyXH)uvCG zO}o8KrAKUHUMy}=F*A(s=yjj@y5ZJfMJC|u-V05%w*tZhe|e%5<@k{|lv?yQKGcG! zxpA|hPJhJ>3F4p`FLf>0SUn9Y-aN(4^S8fz`uvqxhaYa_oi`7f8^`cAiB!GE5rjv(S9w=}#AP^^Bli1|o4D4;payYl|`b;LHqu$%lgrF%(lV zA^F=BXzTRJxHYAqtB^2(gvpbvHNk|7IGk=hihs7US~!7!Tf;a!KfXAr!JpbL|Fd@z zZ9i;bD$pxVmp}GUGPXK{Q^V@-fNyLf=RhQRK}wT;%Olo3pN;N(7D`!AliuDwNUceC zg`#{jOACwAlCNeqtaLgzluqaDB@3Er2U)LBI@j$uJB-u!6~Aa|t}BT&U^yIS}G0 z|Ab|p?7_xXvEW5NR(45nFISdDqK%qxEq{mXInl=eO>b|*tX%g4^R3j^<{UCU#Mf$r zC}ra_^!RK=fLxDKUe#`_$TO*wdSji6Qm;eFaJ)}jYh-t4M{Llay~mHm#!lm56d1^Z zX$Fjn4Np+!j|Y#s>ip`qEBaZI9A)h*t?f)o!A3>J%D0QXdjH$=4_^;|{qXVqhks_k zr?L8yn-&t@zx%ZR`W*tk+5h;lDQRB4tL4$cU!bB~UIv)aUUb{Te%!3h&5|lO=zkTQ?Oq*Kt?{yF9tZZ#EtXd^2(vYu-@O|xsiwNo zmAewZo>#5IujjZ5gMWV&N~)+@g{s!Rc|yKr6*~W!RVbks_HD912zFI=88Fb zhiYfQcCokouXsD5M$K8Y#WCBGKUs$YxH z4J#>LatZUO&*E}5j6eo@m0Js^WS-?y`NG5uft03H9@e(x(5nWui#bH0JeK6`_qmVba!J;7eZbH;Wa+Tk?AV8oY-gb`_1y(>|CMi+D%!RF_O-aIk} zGRe8*2=qTE%gxO&mk*i+xw&$^%9V2XUz)}@(*ayk2m_U+^&D`gbi&uY8v0LlbM)+1 zl*ShjoKJ&l6o2cy7F<=(b(6e?w3p!Ql@h%l^@oY!PBxy{m*IqGLdc01fLbYeV}V zKId>R<-etQ+J8w$=?w6`Je?n@Rg`M8aw5Y;6Z^O_t@4?cr?ojDDSlcdU8BjEPEg-j zMmylgzAL>q)jV;w+#{LTk4jEmf}!(FZHu*?Txn8)^kaS1lGnI@%{q|YUE`+4{|K~- zs@oS4EQ0?B{rOzopXGnBKMbUUV60z)vE)_m+d`3uu77L|8K$DlAFC=afr?%s6;(P~ zo*xu)zRCN+KW(qjPdImJ0^J~1Sf9k=IwHUDxOe8TcbH~g0>PBRRuszQ=&qJoG&rF# z7fI1!HqCSC6#(a-T>_A&)4%P-Xw7_kds%W~Uil}c?atcqW-SUGw*B~CI<&LEN#HTM z0OsRTj(=(vhjYBip~MWOz;q%6c+P9Jw>(n3X;vp+`Tbez3V#84mp!{#G&2D_2HsN2 z7!=b%NtA3e2ZK%_IfdyoWO&yjW;G8D0Hc#)+reW7??(hGVo zYXhog0$mZ$nTLpHCCfDTmnn}!ic3Alh+F(C!+)q*l1wyZ?o8))bnfS%sie>5-gxTe*TNuMDJ4rp990es;l^M#Nmm4g_T^oIy$ zHcV!1{Ehz#c7r{Wej8QmtEyvVnxzB0V8%D4l_R3~yqUK!h;qoz17d~}Eh7r1;vvr5 zM1R_QFaxfzSVl5FE9>T3cKOPvO$)PV7s~g5a3*hI&WTUO8Yq$=g^k@Zg$>!lO2xov z_j*v7P1%ennx&oAEi?lHH%AAaR?~dgyXQmO;z)Vw6l?2c8OO-l&nR~9xCkp|Cq{wI z9!gFjYszL3=yjo=Jh2&F8}!8;R=;rNvVRu1@q$WnKdanXJX}*YE6deo5BxO~hv*GsA+D9wp`=n^f2wM1 z9rA1kZ#M#wAMc#huS5Vp_wnZ?{xl{!%Xqi7i1Xv+iMWpU;h)wL^#fE5Z=l#h7QdEd zSBLRo;}lvVaT5@cLp(g+ZtTGS-ha^Fz>~39G>ul{Flx=o1c8NKbGgJ7n?q&aYeOIj zpJVlwg6vf-oYk+Q?Y+oSZN038S^ZKaR@>-UhXF=&vCaYdoRgryW4rBu4lY+!#bc8r z`|cSE8t?_;kK5ba9zj;GI?I`(h`jQjb$M3fU0?h&F=Xa)Vt4;QMLVk+fPcnAu8SgG z88Pz}b?YPFX#UvTbiO}3XmS}(!ZbvgM4e<7^?hP>_M#f4F6u1nfMnuV_9DC`V3C6& zd{zW*T^T92x=25`Mro+s!`s^{o;S%O0!89qTl4Kpti$fU3;bCFe3YYh&@PDozuJE+Cr2+QJ-?i?S&bpI?N=YoR3nW8K(U+$~3a0i7 zU($-%i+jn+>wrbm@Y;dOJdl=djqw~g;Xs5}^?6jwnK7343>NDYd6*L6m68!ky_V+(YQAqZLQaOd!}=S#XS3)f1g{Q2LLegdjxypQP(3-3SiIm_fR#A$(H z@T}il{gF~=GKI?!55w^C=?*%+g0n$nh^k>Ymnm~N=22*H2e($#D!H2@EYn=6D5d*a zYn$HAxU-ZbyPI=wnSX2YAH2-GFJxFZ06s#lqg4J3tpQI`nz6)?lC`odTCx53urw1_ z@fx(_2RV6i#| zaGKKzASlIIbQP;<#;?RdbbEVU)T-9GMrv)Dt6j?va*=a$?SJ3FT1U)iT}yjJD^l5R zh5gYH2JKsz(?At@y2~qhRJ=kSmERVRuzCCPXEQr%ZoWsWl2?_LFa*bX4iwU+WM2BJ z*1GG_70$R^zLz_4M0~}<=i_*$h|OFFV#vyoAS-`Z$WE&2_rSP0FH!M}$ot8`$8)7h zkCc<1|v>96>dq+iKUMCYX2SX z0Y^a|F@8oIP=<2E!LY_{0{dY-9HygQna>7!CoA{RQ3h&gVcD@;^vzMCy;hhA-CIX_ z6H}`lm5891Uc!Em(Jonh?&sS_q5W$B#&{OJv#NOY-cJ|Jey3VSw-Y ztJJAU=C(n(IDe%Bu5yS{sKFaa5XAkV{*JuKk#I@N$%U;pi~<4H*HPu}27j@YK^UPs0jo4r%cOzQv^WoZsd6w| zy)%32AH}+gmAD2@t18`e%k1c0)=90?u%af68>V=YF5aL@9av%vCw$%0#RBcrl0lBU zCuLoMWa2O?m8+`8S8}nnEv$4XK1o1hryhz>RcYaImjlTD;;`JLy(7B7g2&z4+nbg2 zJZ*PLpc8*_6G8O$wkO)0LYjp5&3>9)2V#?SjA~3bq*_WQ#?20gttY8kB%sTjtT5Cu zp%=Y*)@CyV%zp95*P~xQ?06CPH5X00`iyznCpyou$dL(bk=)*e_{3Y2brH{*0a>;L<_=1~SC-s4@gKCVr{!9<0`IcW1LV6_i8_)!D6f+t0RP)VdC^M z!fq*pcPU5V>JV#rKJ*FdIe8sBL&UL6ZHWs5onsgh?E{-0y~gYI;uM|YP>Fqv00V!W zp-3=j<1(cwEa@gK6%3K^A|6XeII@jTkm(LthPrjRcgdX>*&4QZcT7GSQ@Aj;QJEq* z=H73-$CML9t5Qw#L3oCp7ms&#;<*3s0Nxw#UhOF2XZO2Yo&lFqRVi7c^%@mb z5Pw6BP_d@n7o6Yry`34fZFhgoMt}zCwqIsTeAY7TW8>>rY92PJ{b^G;X?Y7X0?5pc z45c;+{Z{*`)38ZJNQ8iwJnc(IuIwWqj3VJ45qQA}JGe=4Eer9jdR6hQ#3=5Sc>x%E z$uuOaD8`90<3;fMbiW`=K4Z(bvL-`IpMUp|#i#9&m zZOqi;|Jyb!%3{NaR)dKA1p(r3!2QrRW|DH<9VOD;QChOQNsg?w&Yr_j;(NxFb3R!~fl#J+b@vp+K|$oyLFPA4h>KTn&UUI19@1 zA03-;3eHP2;D9l8oX0>|v&r!wcrNYV%0&Qo?mZ9Y_hB+&yAD|TN1`y<0Pjt=tWwW8 zW81Jz50cq*lXDW1eBS%1b)iC=7uM<+wyAVxvH+ptq zd4m>H<{LGfz?gqE7o5mEjW8ijoDQY(84gV>Wdw|r-I5nv^j|pgMsL$7N4vQ+Rn5>; zH7^Cl_d8TuLD}4ed2J1IadDiJhgh=&ZeJUN(X`VZQIsmKTB0ai3bihnd^jTIY9_Gf zcxhyP8%c9XO$Bd~_feEG|dn5aKflej)t)gTU4|uxx*~ogKatMS45v{cg>I#~8?MaDf9i=GiIg38ff|FU9bCDMs8&k00Tm$0zI-O+A_E`e1G? z&kaZzd8<%i;0UIBqAEvgl@|XcW2f#tGI| zvb+b;Doxq{WbG@-9w8#}tf#$18t%$Ux~IflPqz?UuSG`V;17pu_cmGGPg zYBZ%f0YxofA7Lr=)70x`>bA)&N4jk~9qE#OZ`T!7Zv2^5H*o7|!O@|x+cTSPTQz;U__;9C-0ng&p8ZGWni2)}4Y!V1q8;un8b zwq*mpDuh|G*HenkhRgFQ+=AzMVtm4d$|GD@Xm@)L_1R1Fxj6#Ric~Z}?NqJ|ywE}< z?e(ctcd8;OP*pXHN8R%KFXnOt>E!-pB+Jfbi%U~Mh8o|x3mJFnAih~NHIG`q6w9XK zL+f*X?OY(pL1R%XPTkg31O*Nn%d&sGWyIz8vHYU3sF%zY06_%{zXF+gC2PoK52|Y@ zbiu1(wx)*dy|r~fwyGtqo(Y1goC|7#>$q4m8>%N2^I`SmI%b8%H9g7K^@Ps_-jr~2 z88r{!7S>##Z^wP~=$ND9#u@r+Owmo_1$t+^R>rQ{1%rN;W7%>{p(%d=;j zLb+1TAoBQfYpGS|SXIAG_Q3<)oCKdsdd%v`V23np4l` z@2clBj@Ix4yW3WmE#U=@i*K|db2t|(=ES@x`Mj`I-2e5junuR;UR1w~Y8VBY66S6~ zTFWE+cV0tNco17UkKmHJ*BF35*i)sN1)@U%8s1-rX-s z7Zoo`7nLtcy`ob41?#XY;>`x(S_#iJVbw*%7c%A3aS~SClHm5Q96czH8`K0z1uz+}Ov+(f;r4N- zI7`Pf_Ublrl2ip5F5GxzfWktfPF?Yh+7-sD97^wf%cv4#XKCsqnK+@)i!E!e8nY4l zxxs&yXv61aW}JVSVdkZm+2N8MDtX~&a>)*sls1z&@;7k$k1zz4goc4+MS;BT+HQM0H5pSW}Hit z(ecZ6xGc{`$1mIAvNRpa!OBHwFAOS_Uxcatloy&iCQX0-6CP*KYXN^U_|u_3qZ4sF z!_*n3&MflNtU<8%s!8qFLDzQkFO>^r=%hO;QUcm3E-E zMX+tAw^)DA3~w06uvct*JCCp6rnunuqYOTl@Ig;R;zFyv)6<%RayJ*sjMQ=0Wy7E= zS!O87*jBl@@Emx}VW&z-Fgowr-Q1i#K(Q%9f8`3|T+L*@@;!BV6*|Vw=0d>&q>!Vgc8atbPID z*L6U*IdHGnTMO&}wRJPA#k(YCjpM!OMr!gXw1UZVR?pr-7k0EeyeKwrrcI(0J^UwI zi41>_aVsaIoDSr4rnA{}Y_d8sYqX*lODjXxHX;WG-ksln{+zkH`6BLwj~>_6DJkXk zxRH%OZg0yIxtZ(VUW6h0(m3DJ;wt1&)i(;WP^^s9L82hid=z96-Ke84Hu|}&3ryEn8z&fM#Hw%$?GX>3t{jS~g?u$T83C zQYNd;vpp`3d2Gf!_SSi9dO!Bod2FU*>`lkmOvl))^LSQld1hLkc`eUO%QLU#nQ4D{ z=CwRCEzeBLMGPC8$r*bXHZ}_}_7-An7Gmrz#MmsvI5RDGiY<3c%N?)fj%m5$wcIf+ zcf6K6rsWQ|yeg09RCt*T@Dk5Hk=%z5^U4(ndDX&86+kttn#q3V!=QtgBKN|-E_m9` z`k$b~gPmWka3Du2tPt6fqt?Yk5oE1a=s^};^;lG$>mQ{`Ac|bn@R@>+}B3Zcc zYon&jHEPO97+{Q=GN8v7mQfQha;)CltF~t|Lo|OYyg5h26|+{{I3J@h#@QhJ6q=3Z8*hM1JD}{ z;PyfF^Wm<6*!#N;Vdp&jac9N@W%0>Pm=iDb6+M6P&q87Y5=3^oE3WCqNVqk0~G+6p7c%5ERm>L=TcS(49yNA3>W z+5Rlti6X5X$e=Z{k9aYfwrA)sU=6l&GX}wPgWzdH{VYN48Ts5K9ToJ#r1uzJ?$qyU z5|O!9XV#vT<>gnXG`36Br&tBCOtDJQDQPTJgwPitjFeffdf6I~rxkyW5m^Aj2$~7T z@l*={_#+*apm44>WcBQDHxm6gfc^xvL`-6gvN~^fb(En?$EeqL zZ1s9H?JZHS??H0evWkCpe6!eX?ux}8{8{3!CHx`{z-|NYacHn})y`muQV9(cH`08g zJ%amRZ@Hljm{g1n22uU6mE~0*gw&eHyIWAI`a2MP7Cm58@A#Ost;NoXG(S?h%VA*3 z22jG1*DrPhF*x2ivD226w(F!V_AqVFg`>2GD($O^VX7qOe7k?Nl8SO#tcG~0K=5U8 zvB#Io1-cX8wOeDJO2I89+_C^?g>_%-I^3EKWdgJ>cU_(>@^l6JXwuX(O4y<=!&~=} zVz#w=dVlbKKv-9it&e80wp-l3a)euV7|gocHvp3kUmd7YpbDikCO>`q>AdB9L7sk~ z)H&2c8)$F`W4(X7HvYTR*0wOz#C{jJ(+tG{42^KdnUp1_z(%xS_7KKS0o;t3g7Y?O z?0@?7;q}3pH&B$C& zmkkB?XR|Er%;D68%<_&fJ2{MxQ$W|-+Z~YtM)JRlJ^6o)|0*j2qNiL{I23RtfJUR0 z-7jf`W1||c`Eehb5Phg0{w((J*Irq*IF9cnylrK`UuD;a+=-+in&+vx>^d6cRt5P+6J}Tdw^^ zztPURq11qo7EJPst(xd3w+IJSPrU;79cR<77AsSuu&7#VNE5q*`#{zHu_i*gHS@)J zx9a%(U3K6~_+2y+%}phC7AaD9vC&;_WNc@Kf9ikA2u=Nae>$aGsistb*uRZ0>krLL!nM10_hVFp)9(lMiC;(Byy>r z7rTGP=sDC&OYVm7`9N**r*P9*Ia69fWXl@-?-5d_lAp4aE#Q4RsWR4bpr-tNNaakz zmJ>_Mlg>J7*e#)NU0z+_<92pDQrDGh%6TOOs;lg19eyZ@9gYZ2N1K9mHLKM_FH>E` zQtgPk{V6l6DO0zKGIedrbRUYKmZ222x*mUODPYL>ubt9e>y+-TIi;VEM(KH8L_e8+ z*Euc0?t^^^gO(#7TE@r8oyeEi$d@f3p^+`j0nW)wN?v-&5>>5JV1eg%*#*UdSrW|J z)4I3*w6+D%*rdp8kux@c=eEBq5_v7;<91=$$Ye{$KE_dPGhN{NU?PwcEN(igK5>8c zRH76klQrx?V%f^<(p6RVX)WX=RgP54eW}k6L#$K5X1a!vjI)M_2F{uD@jT?BMYq79W;6P`p>qU8-{BR^c#D z-S#XzCZdT{=R{SHZI$^n%@!)+WTqk~0_l-iuCZFS)SwFmDmBEjB?nn33QvDn!YYC3 znygCTM=y4zC}*)NM^Ov{TUrks74Q4sc05D6zHhuv{bCsto+c|T;_1~+#hE3`>D7|D zOz9-oX_6hzGYOc8GeLiAsruI~2q}YlT2Zt%5VCIjms5dG@rrX1u3i0W7gRkd6cbdZ z&|~~}Z+0dq;2R)OpQh(!$lQOE3eyza!jdhrFp$%0>fDqnzbNXn1e^+t4t}Z(T@F}v zk;srzbxlgx=T^0pU{urnpQ3kJT7|TwL|V16biJ7T=Z+hF7iyD7Db^s?bJ3!q#A-ll zJUvMT%a5o;`Ovb+J1U;@SydE{C8B)XQEL#l!vP<1{g`D`q^VfyKP-RjJ?j>|{vx*6=;y|rk0&ADx+6|7Alg0v=;GWGXwbV|_LAD!Y)45!hhZ7k0NhA5*P5_4AR@pzgy1_ zXW>ux*NRzz%<30X)1V110&*$*-(TNPbx_|umMEauGKmPGV zswk#pje(|FN8-7dQ8-FF;#X__B-2s8a5*sj5Z2i8NtYeZPomZf_ns#KUWh|!9Mu7= z66g4*=r9t4or+U4<}~~yK8p9^o%l)oB3_EO;thXpWZ(H6v%SZsCx&B#4{3_^ax0Vq zYV=gX`24%=5rb0NZO1Lfd+FVylZWr4);sg{E|UH%+HI(}{wdnpX*{m|z7@Wyf27~i zH3Md=r26j$RIW$3zqKE2hwr!EN44;J>l%K)+j>Xic#aO1pIb%}&!Ib8@$=R@_(Nm* z0JVQ_zo(l15&tfK9mQe&_h|cFix(zrx7Ek1_`}xQ+CR45NMt#JuS5Cu0`fjV-bbE< z4rG3UO#b}8IDAom6>ZVqTG;N?FW`gzq5NOt-R=LY?=6>8t+KkCDZ?3 zX;{C+@lVmsRb0O!fZt-6jIHoh?L}0-vMYc6nKLeG?M_s?;seh4(rdA)0psowjV~u8s`O0L*aYde5cCcl^6U0lqj>CUQ;I`r+vm0sjo3WXdAie+3T84}lW$awl22fbyb<$HXtd?70?uE2j|D<3cD z^c_u4U+DnV8y9dyX~%!Z%9(t9@5GcId!>K7vos{~sLT8a_k30z!#I@k=@{nnCW|vi zN}-&ivXiq1xu?DGPps~r8)}c)Y70TMVvOwaKFl3g{&eP@$Pj)MQQ+cP-UN;sebA!; zD*XtzkK6U@{rdl%9RDeQY;AwDGT{SVQoqe%>V^Fzz#~LA)YKfh1i;8mmhU|yuC)B} zI{+&wxA*EQ#8AA5<&!5q{bVAK)$=BOTjS*JF(0XgybmsJZ*g+@wjeAR`{qNSYJ_}E z$@t$D`?9bvESdaK`XF$m3{DS#&)kRqF5tiC7}6A|XVJaPVZptOvAKVRLRYaKp5l)3 zCs(anE!QznG4D7(X-U8K*Qi0uUhPLg^Pm=ABk#74{{rK7r0ygKHJ~`PL*;Uw;NJke z1iuIL(A2&b?v<`}E!bty+`mtCzX9Amz{X``mv0_r@NbJ_Ujy9@nwRlG?HXC#dAtul zfYH666kv&;Q_3T(!+n2}!2I14st?!5xCweM~1*Pj=vHx>G0SvQ7{*pzJOo0@S)v#yB? zx#ADyiqq6w%-g+;!XlNblz0x|@&GCOHnq!>amWy8(as8sU zw{;2i)}OP4&uJsZLpCp~h<&S>ykL=8+@Xkml$`r4b6snb{6gFDf0TqM^F&_!PaR;&Bdt z_VCX`{PPI^C~tqMikzE5Syb-kH2X$3rv-S|&8ZUbWR=cVGe`Kuhm~}Pn)z>*S(W^# zvierGP8**y58LN4|N03o%W*)SgMwD(D6!~R&g_=8#3gHXFPE$^@0qRpavzV%#4&~e zKYSW_SQyoQh?*NW8}vBZ-1woUv~+4ehz)*y)v5Fb8*G29&>M4=xAlwo4gq6Zc_GJN zD@*Uk;(;z~Z^T}%UN;Y^v6Pooiu{(F>vc}M?cJjd{3<$oUe-6r7esO*n+uwswBVG{c4shQ={Sr4!Oll*NZAg* z^rHIqKm>n(-Tlj7{!-VmF1Ekqx8fF(wj-d+$JfTD&D^qQ#Liu+_GeG_Ia=#7w(JZq zk7p;$b*A~d_PcNy(X3)%c;&k%r-)Us6mK{XHQLGnuQ);$&WeIn-+g*uIqHsg#UfUD zt?bF7mDOSZIONLN(+WwqFXZquk<|{ONcr-XfERy}HU~Xai%~7^zs4oG#6SDu3OdQb zJdVVnVY-X{td`OR%@T(BK;F^zwliM^&#s!7B86x)JFh1*I1P7q z>}7v_4sBfXgg%c}7T{qC;H3ssUc49$lJFY+jU?=YX9wNVDCe!HTA0;m9NrVa&_gu1!SVUi&3jME;y9L0HcLO|E|=% zS~4>%m$~#^=}bDg#6TCNu@cbsv((mCk#!S0$qNu>1U`irOh&N7G4aaeGnBJd#ADS^ zE-ArmTTW6ZMYTY{dUq4#rrrZ%b(N)PB27f5OpHQrNvH9t_1uXOG~?0jttAdUGY5Zy zexy4iLuQkXZ#vWig4Oy`N+fe?bgAvIpr?0kAhR@bcj8bAgn|CneqhxVCesrQb z08r9FBSz$O^@}TcFIC#+v?kGNVsTn@CQNJw`?Qk5KE-~TzMUe2eToeBDKgln$Y7r$ zgMCU2c5x(XVWvRj$`)t(CJ;@U^^0Lv_#>EV)CMI zgWFsBZF_!+B=ei*A7O*B1DJ?=bUZqV&+PehM#_PVPBD;?HP%y#_D*f9z#Eo{FC}|k zM=PJihhbvr3o(xhr@D?>Vl!Ctijl(&-g`mGnS|KVk}SPM)ezzy*_`vKjY7& zsFeE;i2KK*b0aXke;_FAnohGhe{20J#$`_#@)@>oAWxY|!!;5>m1Srv7D&)DyF4J( z>FO?Ze+z}Oq&M$cK1xxgRe_z>!tiW!^URu%=-HVwJxw%O+KJXWK>8+>b=)1f2x?|y z?T|=0!D!En4ZDlV7N_Qke)NCjlvOOqMaUTTm>t$tKP~Ve&f-ouARrm`vW36n9+G^^ zOEM-JUU+PuV5R)fsj9sjN^CA+BsfCt8OFZ-PBx;)&EPSw*@&L2?39#0-6Tb2r^J8v z>9|Rf+32fOj^d;R@f3}@A=v_X(93UC!an2^?>R)C@RfQ?EKgxPiBo?%!a1qbcWt>U zldZ^ffPxBbobYvi-h=WI5A9QYsNVvH^0fMD0-n6?BS{Dg=RXH-|TzsL-b(*PBB{O3%4gd9jlCT13QC+ZC7?sc&-q)jE|fm*iZ&A>H${Li#7v zBOmExR#87g?fO$o(R_bYAIbzh?o<1i<=d8Wg?t}UPDs?OqT@)L@1`LVbylL?v)nu@ z#QG}Fcv*>bd)%^1^1Td(HnjXqSqpuCta7Md=K1Toqen{YD5EZW-LYMhe`kMkXX_P| zaLu`;L^KXZG?W~XBxYyG7Rfw2N*939IF5%WkqL1=w74kxt-XJV+2@T~4kcOPYJiRM z&mIY=7^b0Nm~@$y?{AOX1n16blpqn1!d|j?kHq0=eZ9Mo^+G{eU$f(`s^YfF3?%VR zQ*jMAW!8Mc>LEbEi?Iz=Fpm;FMR#7sS?kP6M-|19QW+V?XC=WuO48y9q)OKOG%AG{ zuQVSnd2@>oSKNR4>Akr1Q=~K|c!GZ^0~T(Uj4Kz{;ogQP_tZ)^8^UL~=-5hYvDyqn zi*Pyn;@QySy|f!>=E2HHLD7f1Ts|dWD^IVTNjXL{+MsJhfB!40D=`@}N3H6}y$Y8rpnOERreZgpIW&nxcqsn!3Q zHy-co8`Y*I{y5y@a9m4E{B39$SxB6^b*!sa*5MTSTD>Me+ZfBHI+BCanu^n4wI`{H-Jk)e; zDo$-3J4Sy_KWviZb-&0PR)(Z-d63eGq{H={p@_z&o?)RkPPt~%z~xN494*8WC^}%G zz#iY@vJ5*NtO0|LrF)u)QZB)=SaJ!P%;bwb8%wxVTuO`PYrO9E`)aNAK=@isF) zT4B=yaz^WzI@#@r8(?oa^f=mw2>6n*#p!>uEeRpL4KT}jndWIH9T77}$?QV^sFYtBs<2tf%s?e}xKqD~U{jmI0IzTN8cpgmy!1 z{usxyctpZ9PJCLH_8)5>2i<+5ny~AXpj@epF5AUg8MNiM-jz=^Ub2KQ_MvBVQ>EW{ zxvAU=gxXwQdB&ypN(ASL4%nGV5u1OVmZS?U)k0Ty2r-YZf4^CKw19%ZaC-hrRaD&G z={&b{K26naG9OOm&9dy0sN;&{>l*gSNBrPHw|HCcqIqyv-PcLAy`W9jRdPjnPwtk4 zvF??;V0G_xCx+U)uFh1oUHMvBMV@t=CDaN--Dx^$Qz6HG64w7Cl&`)?yl$lrQq&K~aolNBn#%)9B1NE->f}$UH zpCJzu$^+bFNe-fUM@{K?pk;pmE$NOa9!S!oJTF0lbXSu!C?eHl2Fy$t?De1>L|hL4 zIADib&h!>^hfo#vuSC?)jA2rr#7b(kw$^dy0D3czEs_w?vAJt0WX#Ra0PRJMx6`rsS~D3}uH!=EX3# zm|7f45428^$iCZD!5A5^*WL~rXjFUtt~$`PT-);tS>|KUo*;`CED|Vt^(~ed8a`OQ z?g1F!kCoo;^_WjCE}4H#FB^v+KYl&jfA`z|N7Vyn*h)K~G+fAGisdYwCoHs5eD~>C zae-vY#a0^{xIK?_R`Icoar@kP^;FJo?2$>>;~u@_I?uN~@~ACL*UKD#`S*l-;pBQ` zx(k)c@YBAl7Z+1G9Nmd(UFRZS0;(L4BJ6!UI91?DEYE>D(szFssMN)f@+IEA>*V3{ z0w1q|nz3dXZ<`yre-z)kqCB~8ZqyDk%xkxVEx_A%#we;>+ivznu1y;PLFeqW{n0}(AU%KiFM;CX%7#_} zU9jOPb}>Ise~ZYbj0&M9LRor4%a$qy9a14e0|r9!Hzh}SufRizHeiAZ(}>(bh~7%& zMiP1#0h`utAaeryuPrl2@Qbs>ndpdt=##*55bv}GPm+Ju0AK$wp$`fDCnNRgYo} zKg_7ZuT_C`6{fnBPPr~M)|L-_L{ShNZ0q-7I=gc@Ezoi;mv(g1MlE0?N}2(>!c}#I zTEhDG?d^XH;9v-s8vhkvP|0Dnwh1#ncGD;~g=H&y*zg^vR@kT8kgS@Z+=N)05U1{{b9n zP3gxT89KC|4mUT)_-BfL&ck+n96jmruc`bsreA-6lThs8NeqWt;-Xgf+fYmBQ8xWS z%h5KSu~(y_wfd#V*uEPZtttR~^=*+W%A9tIu9r+VW$B$AK#HE(A@NSr{f?FrmzBQD zbe~&Z@93`&_)DUuM}VmC`*&upc6a#mMSGl%md)T(I!^Mh?~<#pAEx8>BoK)7M@e@o zV|9N8obqwlhO0D-jq!Vblnx-1-*>4gG>b!MG;))S+-~DXVHwR~u4Nk6+!dX6_iRA6 zaI7y10Av8h&9GB?XsjZ7hfoU3>-_0r`M6*350Gf$k<8k>HOc4tmh}*CvzUr)l&(cf zTHDli@J)#=?KAMlmOYbsmq@#a; z&)f+qQqgx}ag!&&9ipyEFhO-Gd-r>zx9Nn=;%}cU=xH@+Hl5Jf{B4m8okO1%>Cg?* zr%gt90`<2;QY13z1c$&_nJl08=?z~~-9*J!xB@Qw4yk2a6-2;ZDgQFt2clhdtLdee zbkVy50^R4Ip96Xx4%1N&WnTS8I+=eY*{e@)-^6-;DV*05xjIP@Vl%_=RSV7+frc3+ zGdMjz;uU5xhy#AW2#mAb@&E*hqhY56^K4A>pnsP!b8;`ieBwFs|L#Z&I41`Cggzdf zSy{IO?$|fqipBq>4doh8|JV15d0^H^DW0~4 zM^iiyDg&@W9<}HKIj!*#d1p(G60eTIA#cE_i7T;9+guD#gT-!XAd=(3iKAhgoB)4< z&#R=@YtARRf6k3voG~OPBVl8K-Pn2-g~xw>**@8d!Y_n>UmB-*w2emDL9Jg4{`xS8 zTs2;fO9SJ+SJ(yw3=`fu-B5qVebA+g{=uW0@73q9=TyBIVBJOV<1LMNR%&oJrLr%%6_wBc-qT9vH76&GH41Zy8uy#5&58w9{$y3mA3Cf#Wd zD62r)gnNh&gDLg}{$ueCLc&FJgaLnJ?2=~eF(v$;9f9zT;WVF3+T(vD60(Jui!@Y& z!OQ2L0)|C2L0EBvrJ7E8^hM7F+r8c!xSAysB$)|1$^s@quVj|7(m|Fr;J?Wfu=G5e zc9T4BJU@K@?%jvyFMj>_{78!uN7F$V*g4G&U~?vknw9=MPkI}(=|)hK?PHH>K~sMt zUZ@uwQzv!+t|~b`v2lOIY8q|>{VJO;=y3q2#X0a`i8Tt9B(H$e-ZBmX+H`Vd5OElU zUKC`i$zJJfYysM|Do4jqysRPC%=&>AGztVP@a}LvVfBC0Byhv?{BYU>8nCys1D8Um zrxp_=#wm_gw%7#4mr@Bx)rm-EaLY!$pp#D881qQOQXkn+X3T%WT$Yf+u{|F6Pi+XS z>i~>V0|ij*R!c8XyZ7<8moI#wuG=s8is3&)xc>Yy`I2wZE1yaH@~pA-S59MB6D?;v zr6U1C5yN)pjfB16I|M_tY#}N1@<>vZ5K3uQOOh}LW#*$pX_06nLfQ9mq`0DyMBrUL+4$^)$)sKKQasx1>Ee`e(~|IOH_FTovlgJo~@AdkI@FX^%@J$i%r= z9rH?{_!ysW>g-T-WB{V{~ITWf_OJ{4p}hFrL`l z*Eftb|F$s^*)t*4*X}I%N=8PyADpGtE4QW7+`8$IJ49}a@1Kxw8yK>pQS1K$WmKG~ H4aNZg4Yx52 diff --git a/lib/cufon.js b/lib/cufon.js index f51276c6..41f852e1 100644 --- a/lib/cufon.js +++ b/lib/cufon.js @@ -732,6 +732,7 @@ Cufon.registerEngine('canvas', (function() { Cufon.textOptions.width = _width; Cufon.textOptions.height = (_height * lines) + totalLineHeight; Cufon.textOptions.lines = lines; + Cufon.textOptions.totalLineHeight = totalLineHeight; if (HAS_INLINE_BLOCK) { wStyle.width = wrapperWidth; @@ -744,7 +745,9 @@ Cufon.registerEngine('canvas', (function() { var g = Cufon.textOptions.context || canvas.getContext('2d'), scale = roundedHeight / viewBox.height; - + + Cufon.textOptions.fontAscent = font.ascent * scale; + g.save(); g.scale(scale, scale); @@ -873,18 +876,22 @@ Cufon.registerEngine('canvas', (function() { if (textDecoration) { g.save(); g.strokeStyle = g.fillStyle; + + // add 2x more thickness — closer to SVG rendering + g.lineWidth += g.lineWidth; + g.beginPath(); if (textDecoration.underline) { - g.moveTo(0, -font.face['underline-position']); - g.lineTo(charWidth, -font.face['underline-position']); + g.moveTo(0, -font.face['underline-position'] + 0.5); + g.lineTo(charWidth, -font.face['underline-position'] + 0.5); } if (textDecoration.overline) { - g.moveTo(0, font.ascent); - g.lineTo(charWidth, font.ascent); + g.moveTo(0, font.ascent + 0.5); + g.lineTo(charWidth, font.ascent + 0.5); } if (textDecoration['line-through']) { - g.moveTo(0, -font.descent); - g.lineTo(charWidth, -font.descent); + g.moveTo(0, -font.descent + 0.5); + g.lineTo(charWidth, -font.descent + 0.5); } g.stroke(); g.restore(); diff --git a/src/circle.class.js b/src/circle.class.js index 72f5ad6e..abbaf923 100644 --- a/src/circle.class.js +++ b/src/circle.class.js @@ -52,6 +52,20 @@ }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return (''); + }, + /** * @private * @method _render diff --git a/src/ellipse.class.js b/src/ellipse.class.js index 935d5a29..9805af32 100644 --- a/src/ellipse.class.js +++ b/src/ellipse.class.js @@ -55,6 +55,22 @@ }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return [ + '' + ].join(''); + }, + /** * Renders this instance on a given context * @method render diff --git a/src/image.class.js b/src/image.class.js index 3e52e39e..053c31e3 100644 --- a/src/image.class.js +++ b/src/image.class.js @@ -208,6 +208,24 @@ }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return ''+ + ' element with actual transformation, then offsetting object to the top/left + // so that object's center aligns with container's left/top + 'transform="translate('+ (-this.width/2) + ' ' + (-this.height/2) + ')" ' + + 'width="' + this.width + '" ' + + 'height="' + this.height + '"' + '/>'+ + ''; + }, + /** * Returns source of an image * @method getSrc diff --git a/src/line.class.js b/src/line.class.js index a4e9c40f..ae528d99 100644 --- a/src/line.class.js +++ b/src/line.class.js @@ -107,6 +107,24 @@ x2: this.get('x2'), y2: this.get('y2') }); + }, + + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + console.log() + return [ + '' + ].join(''); } }); diff --git a/src/object.class.js b/src/object.class.js index 5f135e0f..5c1f441c 100644 --- a/src/object.class.js +++ b/src/object.class.js @@ -198,6 +198,34 @@ return this.toObject(); }, + /** + * Returns styles-string for svg-export + * @method getSvgStyles + * @return {string} + */ + 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(""); + }, + + /** + * Returns transform-string for svg-export + * @method getSvgTransform + * @return {string} + */ + getSvgTransform: function() { + var angle = this.getAngle(); + return [ + "translate(", this.left, " ", this.top, ")", + angle !== 0 ? (" rotate(" + angle + ")") : '', + (this.scaleX === 1 && this.scaleY === 1) ? '' : (" scale(" + toFixed(this.scaleX, '2') + " " + toFixed(this.scaleY, '2') + ")") + ].join(''); + }, + /** * @private * @method _removeDefaultValues diff --git a/src/parser.js b/src/parser.js index d0baa914..66515369 100644 --- a/src/parser.js +++ b/src/parser.js @@ -644,16 +644,48 @@ callback(results, options); }); } - - extend(fabric, { - parseAttributes: parseAttributes, - parseElements: parseElements, - parseStyleAttribute: parseStyleAttribute, - parsePointsAttribute: parsePointsAttribute, - getCSSRules: getCSSRules, + + function createSVGFontFacesMarkup(objects) { + var markup = ''; - loadSVGFromURL: loadSVGFromURL, - loadSVGFromString: loadSVGFromString + for (var i = 0, len = objects.length; i < len; i++) { + if (objects[i].type !== 'text' || !objects[i].path) continue; + + markup += [ + '@font-face {', + 'font-family: ', objects[i].fontFamily, '; ', + 'src: url(\'', objects[i].path, '\')', + '}' + ].join(''); + } + + if (markup) { + markup = [ + '', + '', + '' + ].join(''); + } + + return markup; + } + + extend(fabric, { + + parseAttributes: parseAttributes, + parseElements: parseElements, + parseStyleAttribute: parseStyleAttribute, + parsePointsAttribute: parsePointsAttribute, + getCSSRules: getCSSRules, + + loadSVGFromURL: loadSVGFromURL, + loadSVGFromString: loadSVGFromString, + + createSVGFontFacesMarkup: createSVGFontFacesMarkup }); - + })(typeof exports != 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/path.class.js b/src/path.class.js index 4d3f8b37..f92cca01 100644 --- a/src/path.class.js +++ b/src/path.class.js @@ -524,6 +524,29 @@ return o; }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var chunks = []; + for (var i = 0, len = this.path.length; i < len; i++) { + chunks.push(this.path[i].join(' ')); + } + var path = chunks.join(' '); + + return [ + '', + '', + '' + ].join(''); + }, + /** * Returns number representation of an instance complexity * @method complexity diff --git a/src/path_group.class.js b/src/path_group.class.js index 968e7962..bc3d0ee7 100644 --- a/src/path_group.class.js +++ b/src/path_group.class.js @@ -162,6 +162,30 @@ return o; }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var objects = this.getObjects(); + var markup = [ + '' + ]; + + for (var i = 0, len = objects.length; i < len; i++) { + markup.push(objects[i].toSVG()); + } + markup.push(''); + + return markup.join(''); + }, + /** * Returns a string representation of this path group * @method toString diff --git a/src/polygon.class.js b/src/polygon.class.js index bc2de987..eaf12427 100644 --- a/src/polygon.class.js +++ b/src/polygon.class.js @@ -7,7 +7,8 @@ var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, min = fabric.util.array.min, - max = fabric.util.array.max; + max = fabric.util.array.max, + toFixed = fabric.util.toFixed; if (fabric.Polygon) { fabric.warn('fabric.Polygon is already defined'); @@ -72,6 +73,26 @@ }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var points = []; + for (var i = 0, len = this.points.length; i < len; i++) { + points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); + } + + return [ + '' + ].join(''); + }, + /** * @private * @method _render diff --git a/src/polyline.class.js b/src/polyline.class.js index c796d6d1..83f50daa 100644 --- a/src/polyline.class.js +++ b/src/polyline.class.js @@ -4,7 +4,8 @@ "use strict"; - var fabric = global.fabric || (global.fabric = { }); + var fabric = global.fabric || (global.fabric = { }), + toFixed = fabric.util.toFixed; if (fabric.Polyline) { fabric.warn('fabric.Polyline is already defined'); @@ -54,6 +55,26 @@ return fabric.Polygon.prototype.toObject.call(this); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var points = []; + for (var i = 0, len = this.points.length; i < len; i++) { + points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); + } + + return [ + '' + ].join(''); + }, + /** * @private * @method _render diff --git a/src/rect.class.js b/src/rect.class.js index b505bf57..fd5c005d 100644 --- a/src/rect.class.js +++ b/src/rect.class.js @@ -125,6 +125,20 @@ */ complexity: function() { return 1; + }, + + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + return ''; } }); diff --git a/src/static_canvas.class.js b/src/static_canvas.class.js index 14087fe3..94b7c40f 100644 --- a/src/static_canvas.class.js +++ b/src/static_canvas.class.js @@ -679,6 +679,36 @@ background: this.backgroundColor } }, + + /** + * Returns SVG representation of canvas + * @function + * @method toSVG + * @return {String} + */ + toSVG: function() { + var markup = [ + '', + '', + '', + 'Created with Fabric.js ', fabric.version, '', + fabric.createSVGFontFacesMarkup(this.getObjects()), + ]; + + for (var i = 0, objects = this.getObjects(), len = objects.length; i < len; i++) { + markup.push(objects[i].toSVG()); + } + markup.push(''); + + return markup.join(''); + }, /** * Returns true if canvas contains no objects diff --git a/src/text.class.js b/src/text.class.js index a8b0e0f8..09b886ca 100644 --- a/src/text.class.js +++ b/src/text.class.js @@ -192,6 +192,8 @@ // update width, height this.width = o.width; this.height = o.height; + this._totalLineHeight = o.totalLineHeight; + this._fontAscent = o.fontAscent; // need to set coords _after_ the width/height was retreived from Cufon this.setCoords(); @@ -263,6 +265,40 @@ }); }, + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + var textSpans = [ ], + textLines = this.text.split('\n'), + lineTopOffset = -this._fontAscent - ((this._fontAscent / 5) * this.lineHeight); + + for (var i = 0, len = textLines.length; i < len; i++) { + textSpans.push('', textLines[i], ''); + } + + var textLeftOffset = -(this.width/2), + textTopOffset = (this.height/2) - (textLines.length * this.fontSize) - this._totalLineHeight; + + return [ + '', + '', + textSpans.join(''), + '', + '' + ].join(''); + }, + /** * Sets "color" of an instance (alias of `set('fill', …)`) * @method setColor diff --git a/src/triangle.class.js b/src/triangle.class.js index def6355b..e46f00cb 100644 --- a/src/triangle.class.js +++ b/src/triangle.class.js @@ -66,6 +66,29 @@ */ complexity: function() { return 1; + }, + + /** + * Returns svg representation of an instance + * @method toSVG + * @return {string} svg representation of an instance + */ + toSVG: function() { + + var widthBy2 = this.width / 2, + heightBy2 = this.height / 2; + + var points = [ + -widthBy2 + " " + heightBy2, + "0 " + -heightBy2, + widthBy2 + " " + heightBy2 + ].join(","); + + return ''; } });