From 5a2eb2e3dfa7d1cb26a1b9f67629b8bf02929a32 Mon Sep 17 00:00:00 2001 From: kangax Date: Sun, 13 May 2012 18:30:12 +0400 Subject: [PATCH] [BACK_INCOMPAT] `fabric.Canvas#getContext` now returns context of canvas element on which all objects are drawn. `fabric.Canvas#getSelectionContext` returns context of canvas element on which object selection is drawn. --- dist/all.js | 161 +++++++++++++++++++----------------- dist/all.min.js | 2 +- dist/all.min.js.gz | Bin 37442 -> 37449 bytes lib/aligning_guidelines.js | 2 +- lib/centering_guidelines.js | 2 +- src/canvas.class.js | 152 +++++++++++++++++----------------- src/static_canvas.class.js | 9 ++ 7 files changed, 173 insertions(+), 155 deletions(-) diff --git a/dist/all.js b/dist/all.js index 49473f7e..07d8e2a2 100644 --- a/dist/all.js +++ b/dist/all.js @@ -4857,6 +4857,15 @@ fabric.util.string = { return this; }, + /** + * Returns context of canvas where objects are drawn + * @method getContext + * @return {CanvasRenderingContext2D} + */ + getContext: function () { + return this.contextContainer; + }, + /** * Clears all contexts (background, main, top) of an instance * @method clear @@ -5438,7 +5447,7 @@ fabric.util.string = { })(typeof exports != 'undefined' ? exports : this); (function() { - + var extend = fabric.util.object.extend, getPointer = fabric.util.getPointer, addListener = fabric.util.addListener, @@ -5453,41 +5462,41 @@ fabric.util.string = { 'mr': 'e-resize', 'mb': 's-resize' }, - + utilMin = fabric.util.array.min, utilMax = fabric.util.array.max, - + sqrt = Math.sqrt, pow = Math.pow, atan2 = Math.atan2, abs = Math.abs, min = Math.min, max = Math.max, - + STROKE_OFFSET = 0.5; - + /** * @class fabric.Canvas * @constructor * @extends fabric.StaticCanvas * @param {HTMLElement | String} el <canvas> element to initialize instance on * @param {Object} [options] Options object - */ + */ fabric.Canvas = function(el, options) { options || (options = { }); this._initStatic(el, options); this._initInteractive(); - + fabric.Canvas.activeInstance = this; }; - + function ProtoProxy(){ } ProtoProxy.prototype = fabric.StaticCanvas.prototype; fabric.Canvas.prototype = new ProtoProxy; - + var InteractiveMethods = /** @scope fabric.Canvas.prototype */ { - + /** * Indicates that canvas is interactive. This property should not be changed. * @property @@ -5550,14 +5559,14 @@ fabric.util.string = { * @type String */ CURSOR: 'default', - + /** * Default element class that's given to wrapper (div) element of canvas * @constant * @type String */ CONTAINER_CLASS: 'canvas-container', - + _initInteractive: function() { this._currentTransform = null; this._groupSelector = null; @@ -5568,7 +5577,7 @@ fabric.util.string = { this._initEvents(); this.calcOffset(); }, - + /** * Adds mouse listeners to canvas * @method _initEvents @@ -5604,12 +5613,12 @@ fabric.util.string = { fabric.isTouchSupported && addListener(_this.upperCanvasEl, 'touchmove', _this._onMouseMove); }; - this._onMouseMove = function (e) { + this._onMouseMove = function (e) { e.preventDefault && e.preventDefault(); _this.__onMouseMove(e); }; - this._onResize = function (e) { + this._onResize = function (e) { _this.calcOffset(); }; @@ -5722,7 +5731,7 @@ fabric.util.string = { var target = this.findTarget(e), pointer = this.getPointer(e), - activeGroup = this.getActiveGroup(), + activeGroup = this.getActiveGroup(), corner; if (this._shouldClearSelection(e)) { @@ -5803,7 +5812,7 @@ fabric.util.string = { // performance. var target = this.findTarget(e); - if (!target) { + if (!target) { // image/text was hovered-out from, we remove its borders for (var i = this._objects.length; i--; ) { if (this._objects[i] && !this._objects[i].active) { @@ -5813,7 +5822,7 @@ fabric.util.string = { style.cursor = this.CURSOR; } else { - // set proper cursor + // set proper cursor this._setCursorFromEvent(e, target); if (target.isActive()) { // display corners when hovering over an image @@ -5823,14 +5832,14 @@ fabric.util.string = { } else { // object is being transformed (scaled/rotated/moved/etc.) - var pointer = getPointer(e), - x = pointer.x, + var pointer = getPointer(e), + x = pointer.x, y = pointer.y; this._currentTransform.target.isMoving = true; - if (this._currentTransform.action === 'rotate') { - // rotate object only if shift key is not pressed + if (this._currentTransform.action === 'rotate') { + // rotate object only if shift key is not pressed // and if it is not a group we are transforming if (!e.shiftKey) { @@ -5883,7 +5892,7 @@ fabric.util.string = { containsPoint: function (e, target) { var pointer = this.getPointer(e), xy = this._normalizePointer(target, pointer), - x = xy.x, + x = xy.x, y = xy.y; // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html @@ -5907,13 +5916,13 @@ fabric.util.string = { */ _normalizePointer: function (object, pointer) { - var activeGroup = this.getActiveGroup(), - x = pointer.x, + var activeGroup = this.getActiveGroup(), + x = pointer.x, y = pointer.y; var isObjectInGroup = ( - activeGroup && - object.type !== 'group' && + activeGroup && + object.type !== 'group' && activeGroup.contains(object) ); @@ -5933,10 +5942,10 @@ fabric.util.string = { activeGroup = this.getActiveGroup(); return ( !target || ( - target && - activeGroup && - !activeGroup.contains(target) && - activeGroup !== target && + target && + activeGroup && + !activeGroup.contains(target) && + activeGroup !== target && !e.shiftKey ) ); @@ -5947,15 +5956,15 @@ fabric.util.string = { * @method _setupCurrentTransform */ _setupCurrentTransform: function (e, target) { - var action = 'drag', + var action = 'drag', corner, pointer = getPointer(e); if (corner = target._findTargetCorner(e, this._offset)) { - action = (corner === 'ml' || corner === 'mr') - ? 'scaleX' - : (corner === 'mt' || corner === 'mb') - ? 'scaleY' + action = (corner === 'ml' || corner === 'mr') + ? 'scaleX' + : (corner === 'mt' || corner === 'mb') + ? 'scaleY' : 'rotate'; } @@ -5968,7 +5977,7 @@ fabric.util.string = { offsetY: pointer.y - target.top, ex: pointer.x, ey: pointer.y, - left: target.left, + left: target.left, top: target.top, theta: target.theta, width: target.width * target.scaleX @@ -6090,7 +6099,7 @@ fabric.util.string = { path.push('L ', xPoint - minX, ' ', yPoint - minY, ' '); } - // TODO (kangax): maybe remove Path creation from here, to decouple fabric.Canvas from fabric.Path, + // TODO (kangax): maybe remove Path creation from here, to decouple fabric.Canvas from fabric.Path, // and instead fire something like "drawing:completed" event with path string path = path.join(''); @@ -6129,9 +6138,9 @@ fabric.util.string = { * @method _scaleObject * @param x {Number} pointer's x coordinate * @param y {Number} pointer's y coordinate - * @param by {String} Either 'x' or 'y' - specifies dimension constraint by which to scale an object. + * @param by {String} Either 'x' or 'y' - specifies dimension constraint by which to scale an object. * When not provided, an object is scaled by both dimensions equally - */ + */ _scaleObject: function (x, y, by) { var t = this._currentTransform, offset = this._offset, @@ -6161,10 +6170,10 @@ fabric.util.string = { * @method _rotateObject * @param x {Number} pointer's x coordinate * @param y {Number} pointer's y coordinate - */ + */ _rotateObject: function (x, y) { - var t = this._currentTransform, + var t = this._currentTransform, o = this._offset; if (t.target.lockRotation) return; @@ -6198,8 +6207,8 @@ fabric.util.string = { else { var activeGroup = this.getActiveGroup(); // only show proper corner when group selection is not active - var corner = !!target._findTargetCorner - && (!activeGroup || !activeGroup.contains(target)) + var corner = !!target._findTargetCorner + && (!activeGroup || !activeGroup.contains(target)) && target._findTargetCorner(e, this._offset); if (!corner) { @@ -6234,7 +6243,7 @@ fabric.util.string = { this.contextTop.fillRect( groupSelector.ex - ((left > 0) ? 0 : -left), groupSelector.ey - ((top > 0) ? 0 : -top), - aleft, + aleft, atop ); @@ -6242,7 +6251,7 @@ fabric.util.string = { this.contextTop.strokeStyle = this.selectionBorderColor; this.contextTop.strokeRect( - groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft), + groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft), groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop), aleft, atop @@ -6250,7 +6259,7 @@ fabric.util.string = { }, _findSelectedObjects: function (e) { - var target, + var target, targetRegion, group = [ ], x1 = this._groupSelector.ex, @@ -6266,7 +6275,7 @@ fabric.util.string = { if (!currentObject) continue; - if (currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2) || + if (currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2) || currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2)) { if (this.selection && currentObject.selectable) { @@ -6279,7 +6288,7 @@ fabric.util.string = { // do not create group for 1 element only if (group.length === 1) { this.setActiveObject(group[0], e); - } + } else if (group.length > 1) { var group = new fabric.Group(group); this.setActiveGroup(group); @@ -6295,7 +6304,7 @@ fabric.util.string = { * @method findTarget * @param {Event} e mouse event * @param {Boolean} skipGroup when true, group is skipped and only objects are traversed through - */ + */ findTarget: function (e, skipGroup) { var target, @@ -6334,7 +6343,7 @@ fabric.util.string = { y: pointer.y - this._offset.top }; }, - + /** * @method _createUpperCanvas * @param {HTMLElement|String} canvasEl Canvas element @@ -6343,13 +6352,13 @@ fabric.util.string = { _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'); }, - + /** * @private * @method _initWrapperElement @@ -6357,7 +6366,7 @@ fabric.util.string = { * @param {Number} height */ _initWrapperElement: function () { - this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { + this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { 'class': this.CONTAINER_CLASS }); fabric.util.setStyle(this.wrapperEl, { @@ -6367,7 +6376,7 @@ fabric.util.string = { }); fabric.util.makeElementUnselectable(this.wrapperEl); }, - + /** * @private * @method _applyCanvasStyle @@ -6376,7 +6385,7 @@ fabric.util.string = { _applyCanvasStyle: function (element) { var width = this.getWidth() || element.width, height = this.getHeight() || element.height; - + fabric.util.setStyle(element, { position: 'absolute', width: width + 'px', @@ -6388,16 +6397,16 @@ fabric.util.string = { element.height = height; fabric.util.makeElementUnselectable(element); }, - + /** - * Returns topmost canvas context + * Returns context of canvas where object selection is drawn * @method getContext * @return {CanvasRenderingContext2D} */ - getContext: function () { + getSelectionContext: function() { return this.contextTop; }, - + /** * Sets given object as active * @method setActiveObject @@ -6411,13 +6420,13 @@ fabric.util.string = { } this._activeObject = object; object.setActive(true); - + this.renderAll(); - + this.fire('object:selected', { target: object, e: e }); return this; }, - + /** * Returns currently active object * @method getActiveObject @@ -6426,7 +6435,7 @@ fabric.util.string = { getActiveObject: function () { return this._activeObject; }, - + /** * Discards currently active object * @method discardActiveObject @@ -6440,11 +6449,11 @@ fabric.util.string = { this._activeObject = null; return this; }, - + /** * Sets active group to a speicified one * @method setActiveGroup - * @param {fabric.Group} group Group to set as a current one + * @param {fabric.Group} group Group to set as a current one * @return {fabric.Canvas} thisArg * @chainable */ @@ -6452,7 +6461,7 @@ fabric.util.string = { this._activeGroup = group; return this; }, - + /** * Returns currently active group * @method getActiveGroup @@ -6461,7 +6470,7 @@ fabric.util.string = { getActiveGroup: function () { return this._activeGroup; }, - + /** * Removes currently active group * @method discardActiveGroup @@ -6474,7 +6483,7 @@ fabric.util.string = { } return this.setActiveGroup(null); }, - + /** * Deactivates all objects by calling their setActive(false) * @method deactivateAll @@ -6491,7 +6500,7 @@ fabric.util.string = { this.discardActiveObject(); return this; }, - + /** * Deactivates all objects and dispatches appropriate events * @method deactivateAllWithDispatch @@ -6509,22 +6518,22 @@ fabric.util.string = { return this; } }; - + fabric.Canvas.prototype.toString = fabric.StaticCanvas.prototype.toString; extend(fabric.Canvas.prototype, InteractiveMethods); - - // iterating manually to workaround Opera's bug + + // iterating manually to workaround Opera's bug // where "prototype" property is enumerable and overrides existing prototype for (var prop in fabric.StaticCanvas) { if (prop !== 'prototype') { fabric.Canvas[prop] = fabric.StaticCanvas[prop]; } } - + if (fabric.isTouchSupported) { fabric.Canvas.prototype._setCursorFromEvent = function() { }; } - + /** * @class fabric.Element * @alias fabric.Canvas diff --git a/dist/all.min.js b/dist/all.min.js index a88878d9..511b0805 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -4,4 +4,4 @@ var fabric=fabric||{version:"0.8.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:JV){V=Q}if(P>T){T=P}if(Qz){z=e}L.push(e);e=0;continue}var B=ab.glyphs[ag[aa]]||ab.missingGlyph;if(!B){continue}e+=D=Number(B.w||ab.w)+U}L.push(e);e=Math.max(z,e);var m=[];for(var aa=L.length;aa--;){m[aa]=e-L[aa]}if(D===null){return null}V+=(H.width-D);C+=H.minX;var v,p;if(n){v=J;p=J.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=E;p=fabric.document.createElement("canvas");v.appendChild(p);if(A.printable){var Y=fabric.document.createElement("span");Y.className="cufon-alt";Y.appendChild(fabric.document.createTextNode(E));v.appendChild(Y)}}var ah=v.style;var O=p.style||{};var k=o.convert(H.height-I+T);var af=Math.ceil(k);var S=af/k;p.width=Math.ceil(o.convert(e+V-C)*S);p.height=af;I+=H.minY;O.top=Math.round(o.convert(I-ab.ascent))+"px";O.left=Math.round(o.convert(C))+"px";var j=Math.ceil(o.convert(e*S));var t=j+"px";var s=o.convert(ab.height);var F=(A.lineHeight-1)*o.convert(-ab.ascent/5)*(M-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*M)+F;Cufon.textOptions.lines=M;Cufon.textOptions.totalLineHeight=F;if(a){ah.width=t;ah.height=s+"px"}else{ah.paddingLeft=t;ah.paddingBottom=(s-1)+"px"}var ad=Cufon.textOptions.context||p.getContext("2d"),K=af/H.height;Cufon.textOptions.fontAscent=ab.ascent*K;Cufon.textOptions.boundaries=null;for(var w=Cufon.textOptions.shadowOffsets,aa=R.length;aa--;){w[aa]=[R[aa][0]*K,R[aa][1]*K]}ad.save();ad.scale(K,K);ad.translate(-C-((1/K*p.width)/2)+(Cufon.fonts[ab.family].offsetLeft||0),-I-(Cufon.textOptions.height/K)/2);ad.lineWidth=ab.face["underline-thickness"];ad.save();function q(l,i){ad.strokeStyle=i;ad.beginPath();ad.moveTo(0,l);ad.lineTo(e,l);ad.stroke()}var r=Cufon.getTextDecoration(A),u=A.fontStyle==="italic";function ae(){ad.save();ad.fillStyle=A.backgroundColor;var aj=0,an=0,y=[{left:0}];if(A.textAlign==="right"){ad.translate(m[an],0);y[0].left=m[an]*K}else{if(A.textAlign==="center"){ad.translate(m[an]/2,0);y[0].left=m[an]/2*K}}for(var al=0,ak=ag.length;al.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}');function c(e,f){return a(e,/(?:em|ex|%)$/i.test(f)?"1em":f)}function a(h,i){if(/px$/i.test(i)){return parseFloat(i)}var g=h.style.left,f=h.runtimeStyle.left;h.runtimeStyle.left=h.currentStyle.left;h.style.left=i;var e=h.style.pixelLeft;h.style.left=g;h.runtimeStyle.left=f;return e}return function(T,z,O,w,D,U,M){var h=(z===null);if(h){z=D.alt}var B=T.viewBox;var j=O.computedFontSize||(O.computedFontSize=new Cufon.CSS.Size(c(U,O.get("fontSize"))+"px",T.baseSize));var L=O.computedLSpacing;if(L==undefined){L=O.get("letterSpacing");O.computedLSpacing=L=(L=="normal")?0:~~j.convertFrom(a(U,L))}var t,m;if(h){t=D;m=D.firstChild}else{t=fabric.document.createElement("span");t.className="cufon cufon-vml";t.alt=z;m=fabric.document.createElement("span");m.className="cufon-vml-canvas";t.appendChild(m);if(w.printable){var R=fabric.document.createElement("span");R.className="cufon-alt";R.appendChild(fabric.document.createTextNode(z));t.appendChild(R)}if(!M){t.appendChild(fabric.document.createElement("cvml:shape"))}}var Z=t.style;var G=m.style;var f=j.convert(B.height),W=Math.ceil(f);var K=W/f;var J=B.minX,I=B.minY;G.height=W;G.top=Math.round(j.convert(I-T.ascent));G.left=Math.round(j.convert(J));Z.height=j.convert(T.height)+"px";var p=Cufon.getTextDecoration(w);var y=O.get("color");var X=Cufon.CSS.textTransform(z,O).split("");var e=0,H=0,q=null;var x,r,A=w.textShadow;for(var S=0,Q=0,P=X.length;St?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}else{m&&m.call(l,k)}}fabric.util.removeFromArray=g;fabric.util.degreesToRadians=b;fabric.util.toFixed=d;fabric.util.getRandomInt=e;fabric.util.falseFunction=i;fabric.util.animate=c;fabric.util.requestAnimFrame=h;fabric.util.loadImage=a})();(function(){var d=Array.prototype.slice;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(g){if(this===void 0||this===null){throw new TypeError()}var h=Object(this),e=h.length>>>0;if(e===0){return -1}var i=0;if(arguments.length>0){i=Number(arguments[1]);if(i!==i){i=0}else{if(i!==0&&i!==(1/0)&&i!==-(1/0)){i=(i>0||-1)*Math.floor(Math.abs(i))}}}if(i>=e){return -1}var f=i>=0?i:Math.max(e-Math.abs(i),0);for(;f>>0;f>>0;g>>0;f>>0;f>>0;g>>0,f=0,h;if(arguments.length>1){h=arguments[1]}else{do{if(f in this){h=this[f++];break}if(++f>=e){throw new TypeError()}}while(true)}for(;f=e){e=h[f][g]}}}else{while(f--){if(h[f]>=e){e=h[f]}}}return e}function c(h,g){if(!h||h.length===0){return undefined}var f=h.length-1,e=g?h[f][g]:h[f];if(g){while(f--){if(h[f][g]",">")}fabric.util.string={camelize:b,capitalize:c,escapeXml:a}}());(function(){var c=Array.prototype.slice,a=Function.prototype.apply,b=function(){};if(!Function.prototype.bind){Function.prototype.bind=function(d){var g=this,e=c.call(arguments,1),f;if(e.length){f=function(){return a.call(g,this instanceof b?this:d,e.concat(c.call(arguments)))}}else{f=function(){return a.call(g,this instanceof b?this:d,arguments)}}b.prototype=this.prototype;f.prototype=new b;return f}}})();(function(){var f=Array.prototype.slice,e=function(){};var c=(function(){for(var g in {toString:1}){if(g==="toString"){return false}}return true})();var b;if(c){b=function(g,i){if(i.toString!==Object.prototype.toString){g.prototype.toString=i.toString}if(i.valueOf!==Object.prototype.valueOf){g.prototype.valueOf=i.valueOf}for(var h in i){g.prototype[h]=i[h]}}}else{b=function(g,i){for(var h in i){g.prototype[h]=i[h]}}}function a(){}function d(){var k=null,j=f.call(arguments,0);if(typeof j[0]==="function"){k=j.shift()}function g(){this.initialize.apply(this,arguments)}g.superclass=k;g.subclasses=[];if(k){a.prototype=k.prototype;g.prototype=new a;k.subclasses.push(g)}for(var h=0,l=j.length;h-1?c(j,l.match(/opacity:\s*(\d?\.?\d*)/)[1]):j}for(var m in l){if(m==="opacity"){c(j,l[m])}else{var k=(m==="float"||m==="cssFloat")?(typeof n.styleFloat==="undefined"?"cssFloat":"styleFloat"):m;n[k]=l[m]}}return j}var h=fabric.document.createElement("div"),g=typeof h.style.opacity==="string",b=typeof h.style.filter==="string",a=fabric.document.defaultView,f=a&&typeof a.getComputedStyle!=="undefined",d=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,c=function(i){return i};if(g){c=function(i,j){i.style.opacity=j;return i}}else{if(b){c=function(i,j){var k=i.style;if(i.currentStyle&&!i.currentStyle.hasLayout){k.zoom=1}if(d.test(k.filter)){j=j>=0.9999?"":("alpha(opacity="+(j*100)+")");k.filter=k.filter.replace(d,j)}else{k.filter+=" alpha(opacity="+(j*100)+")"}return i}}}fabric.util.setStyle=e})();(function(){var h=Array.prototype.slice;function g(j){return typeof j==="string"?fabric.document.getElementById(j):j}function b(j){return h.call(j,0)}try{var i=b(fabric.document.childNodes) instanceof Array}catch(a){}if(!i){b=function(k){var j=new Array(k.length),l=k.length;while(l--){j[l]=k[l]}return j}}function c(k,j){var l=fabric.document.createElement(k);for(var m in j){if(m==="class"){l.className=j[m]}else{if(m==="for"){l.htmlFor=j[m]}else{l.setAttribute(m,j[m])}}}return l}function f(j,k){if((" "+j.className+" ").indexOf(" "+k+" ")===-1){j.className+=(j.className?" ":"")+k}}function e(k,l,j){if(typeof l==="string"){l=c(l,j)}if(k.parentNode){k.parentNode.replaceChild(l,k)}l.appendChild(k);return l}function d(k){var j=0,l=0;do{j+=k.offsetTop||0;l+=k.offsetLeft||0;k=k.offsetParent}while(k);return({left:l,top:j})}(function(){var k=fabric.document.documentElement.style;var l="userSelect" in k?"userSelect":"MozUserSelect" in k?"MozUserSelect":"WebkitUserSelect" in k?"WebkitUserSelect":"KhtmlUserSelect" in k?"KhtmlUserSelect":"";function m(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=fabric.util.falseFunction}if(l){n.style[l]="none"}else{if(typeof n.unselectable=="string"){n.unselectable="on"}}return n}function j(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=null}if(l){n.style[l]=""}else{if(typeof n.unselectable=="string"){n.unselectable=""}}return n}fabric.util.makeElementUnselectable=m;fabric.util.makeElementSelectable=j})();(function(){function j(k,o){var m=fabric.document.getElementsByTagName("head")[0],l=fabric.document.createElement("script"),n=true;l.type="text/javascript";l.setAttribute("runat","server");l.onload=l.onreadystatechange=function(p){if(n){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete"){return}n=false;o(p||fabric.window.event);l=l.onload=l.onreadystatechange=null}};l.src=k;m.appendChild(l)}fabric.util.getScript=j})();fabric.util.getById=g;fabric.util.toArray=b;fabric.util.makeElement=c;fabric.util.addClass=f;fabric.util.wrapElement=e;fabric.util.getElementOffset=d})();(function(){function d(e,f){return e+(/\?/.test(e)?"&":"?")+f}var c=(function(){var h=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest()}];for(var e=h.length;e--;){try{var g=h[e]();if(g){return h[e]}}catch(f){}}})();function a(){}function b(g,f){f||(f={});var j=f.method?f.method.toUpperCase():"GET",i=f.onComplete||function(){},h=c(),e;h.onreadystatechange=function(){if(h.readyState===4){i(h);h.onreadystatechange=a}};if(j==="GET"){e=null;if(typeof f.parameters=="string"){g=d(g,f.parameters)}}h.open(j,g,true);if(j==="POST"||j==="PUT"){h.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}h.send(e);return h}fabric.util.request=b})();(function(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/i,""))}if(!v.documentElement){return}g.parseSVGDocument(v.documentElement,function(y,x){j.set(s,{objects:g.util.array.invoke(y,"toObject"),options:x});u(y,x)})}}function a(u){var t=u.objects,s=u.options;t=t.map(function(v){return g[e(v.type)].fromObject(v)});return({objects:t,options:s})}function m(s,v){s=s.trim();var t;if(typeof DOMParser!=="undefined"){var u=new DOMParser();if(u&&u.parseFromString){t=u.parseFromString(s,"text/xml")}}else{if(g.window.ActiveXObject){var t=new ActiveXObject("Microsoft.XMLDOM");t.async="false";t.loadXML(s.replace(//i,""))}}g.parseSVGDocument(t.documentElement,function(x,w){v(x,w)})}function l(v){var t="";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 j=d.getElementsByTagName("stop"),d,f,e={},g,k={x1:d.getAttribute("x1")||0,y1:d.getAttribute("y1")||0,x2:d.getAttribute("x2")||"100%",y2:d.getAttribute("y2")||0};for(var h=j.length;h--;){d=j[h];f=d.getAttribute("offset");f=parseFloat(f)/(/%$/.test(f)?100:1);e[f]=c(d)||d.getAttribute("stop-color")}a(l,k);return fabric.Gradient.create(m,{x1:k.x1,y1:k.y1,x2:k.x2,y2:k.y2,colorStops:e})},forObject:function(g,d,e){e||(e={});a(g,e);var f=fabric.Gradient.create(d,{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,colorStops:e.colorStops});return f}};function a(f,e){for(var g in e){if(typeof e[g]==="string"&&/^\d+%$/.test(e[g])){var d=parseFloat(e[g],10);if(g==="x1"||g==="x2"){e[g]=f.width*d/100}else{if(g==="y1"||g==="y2"){e[g]=f.height*d/100}}}if(g==="x1"||g==="x2"){e[g]-=f.width/2}else{if(g==="y1"||g==="y2"){e[g]-=f.height/2}}}}function b(j){var f=j.getElementsByTagName("linearGradient"),d=j.getElementsByTagName("radialGradient"),g,h={};for(var e=f.length;e--;){g=f[e];h[g.id]=g}for(var e=d.length;e--;){g=d[e];h[g.id]=g}return h}fabric.getGradientDefs=b})();(function(b){var c=b.fabric||(b.fabric={});if(c.Point){c.warn("fabric.Point is already defined");return}c.Point=a;function a(d,e){if(arguments.length>0){this.init(d,e)}}a.prototype={constructor:a,init:function(d,e){this.x=d;this.y=e},add:function(d){return new a(this.x+d.x,this.y+d.y)},addEquals:function(d){this.x+=d.x;this.y+=d.y;return this},scalarAdd:function(d){return new a(this.x+d,this.y+d)},scalarAddEquals:function(d){this.x+=d;this.y+=d;return this},subtract:function(d){return new a(this.x-d.x,this.y-d.y)},subtractEquals:function(d){this.x-=d.x;this.y-=d.y;return this},scalarSubtract:function(d){return new a(this.x-d,this.y-d)},scalarSubtractEquals:function(d){this.x-=d;this.y-=d;return this},multiply:function(d){return new a(this.x*d,this.y*d)},multiplyEquals:function(d){this.x*=d;this.y*=d;return this},divide:function(d){return new a(this.x/d,this.y/d)},divideEquals:function(d){this.x/=d;this.y/=d;return this},eq:function(d){return(this.x==d.x&&this.y==d.y)},lt:function(d){return(this.xd.x&&this.y>d.y)},gte:function(d){return(this.x>=d.x&&this.y>=d.y)},lerp:function(e,d){return new a(this.x+(e.x-this.x)*d,this.y+(e.y-this.y)*d)},distanceFrom:function(f){var e=this.x-f.x,d=this.y-f.y;return Math.sqrt(e*e+d*d)},min:function(d){return new a(Math.min(this.x,d.x),Math.min(this.y,d.y))},max:function(d){return new a(Math.max(this.x,d.x),Math.max(this.y,d.y))},toString:function(){return this.x+","+this.y},setXY:function(d,e){this.x=d;this.y=e},setFromPoint:function(d){this.x=d.x;this.y=d.y},swap:function(e){var d=this.x,f=this.y;this.x=e.x;this.y=e.y;e.x=d;e.y=f}}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Intersection){b.warn("fabric.Intersection is already defined");return}function c(d){if(arguments.length>0){this.init(d)}}b.Intersection=c;b.Intersection.prototype={init:function(d){this.status=d;this.points=[]},appendPoint:function(d){this.points.push(d)},appendPoints:function(d){this.points=this.points.concat(d)}};b.Intersection.intersectLineLine=function(h,f,l,k){var m,i=(k.x-l.x)*(h.y-l.y)-(k.y-l.y)*(h.x-l.x),j=(f.x-h.x)*(h.y-l.y)-(f.y-h.y)*(h.x-l.x),g=(k.y-l.y)*(f.x-h.x)-(k.x-l.x)*(f.y-h.y);if(g!=0){var e=i/g,d=j/g;if(0<=e&&e<=1&&0<=d&&d<=1){m=new c("Intersection");m.points.push(new b.Point(h.x+e*(f.x-h.x),h.y+e*(f.y-h.y)))}else{m=new c("No Intersection")}}else{if(i==0||j==0){m=new c("Coincident")}else{m=new c("Parallel")}}return m};b.Intersection.intersectLinePolygon=function(e,d,l){var m=new c("No Intersection"),f=l.length;for(var h=0;h0){m.status="Intersection"}return m};b.Intersection.intersectPolygonPolygon=function(j,h){var f=new c("No Intersection"),l=j.length;for(var k=0;k0){f.status="Intersection"}return f};b.Intersection.intersectPolygonRectangle=function(n,e,d){var g=e.min(d),m=e.max(d),f=new b.Point(m.x,g.y),l=new b.Point(g.x,m.y),k=c.intersectLinePolygon(g,f,n),j=c.intersectLinePolygon(f,m,n),i=c.intersectLinePolygon(m,l,n),h=c.intersectLinePolygon(l,g,n),o=new c("No Intersection");o.appendPoints(k.points);o.appendPoints(j.points);o.appendPoints(i.points);o.appendPoints(h.points);if(o.points.length>0){o.status="Intersection"}return o}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Color){b.warn("fabric.Color is already defined.");return}function c(d){if(!d){this.setSource([0,0,0,1])}else{this._tryParsingColor(d)}}b.Color=c;b.Color.prototype={_tryParsingColor:function(d){var e=c.sourceFromHex(d);if(!e){e=c.sourceFromRgb(d)}if(e){this.setSource(e)}},getSource:function(){return this._source},setSource:function(d){this._source=d},toRgb:function(){var d=this.getSource();return"rgb("+d[0]+","+d[1]+","+d[2]+")"},toRgba:function(){var d=this.getSource();return"rgba("+d[0]+","+d[1]+","+d[2]+","+d[3]+")"},toHex:function(){var h=this.getSource();var f=h[0].toString(16);f=(f.length==1)?("0"+f):f;var e=h[1].toString(16);e=(e.length==1)?("0"+e):e;var d=h[2].toString(16);d=(d.length==1)?("0"+d):d;return f.toUpperCase()+e.toUpperCase()+d.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var d=this.getSource();d[3]=e;this.setSource(d);return this},toGrayscale:function(){var f=this.getSource(),e=parseInt((f[0]*0.3+f[1]*0.59+f[2]*0.11).toFixed(0),10),d=f[3];this.setSource([e,e,e,d]);return this},toBlackWhite:function(d){var g=this.getSource(),f=(g[0]*0.3+g[1]*0.59+g[2]*0.11).toFixed(0),e=g[3],d=d||127;f=(Number(f)','',"',"Created with Fabric.js ",fabric.version,"",fabric.createSVGFontFacesMarkup(this.getObjects())];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(b){var a=JSON.stringify(this);this.cloneWithoutData(function(c){c.loadFromJSON(a,function(){if(b){b(c)}})})},cloneWithoutData:function(c){var a=fabric.document.createElement("canvas");a.width=this.getWidth();a.height=this.getHeight();var b=this.__clone||(this.__clone=new fabric.Canvas(a));b.clipTo=this.clipTo;if(c){c(b)}}});(function(a){var d=a.fabric||(a.fabric={}),l=d.util.object.extend,m=d.util.object.clone,c=d.util.toFixed,k=d.util.string.capitalize,p=d.util.getPointer,b=d.util.degreesToRadians,o=Array.prototype.slice;if(d.Object){return}d.Object=d.util.createClass({type:"object",includeDefaultValues:true,NUM_FRACTION_DIGITS:2,MIN_SCALE_LIMIT:0.1,stateProperties:("top left width height scaleX scaleY flipX flipY theta angle opacity cornersize fill overlayFill stroke strokeWidth fillRule borderScaleFactor transformMatrix selectable").split(" "),top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:false,flipY:false,theta:0,opacity:1,angle:0,cornersize:12,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",fill:"rgb(0,0,0)",fillRule:"source-over",overlayFill:null,stroke:null,strokeWidth:1,borderOpacityWhenMoving:0.4,borderScaleFactor:1,transformMatrix:null,selectable:true,hasControls:true,hasBorders:true,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(",c(this.left,2)," ",c(this.top,2),")",i!==0?(" rotate("+c(i,2)+")"):"",(this.scaleX===1&&this.scaleY===1)?"":(" scale("+c(this.scaleX,2)+" "+c(this.scaleY,2)+")")].join("")},_removeDefaultValues:function(q){var i=d.Object.prototype.options;if(i){this.stateProperties.forEach(function(r){if(q[r]===i[r]){delete q[r]}})}return q},isActive:function(){return !!this.active},setActive:function(i){this.active=!!i;return this},toString:function(){return"#"},set:function(q,i){var s=(q==="scaleX"||q==="scaleY")&&ir.x&&s.xr.y&&u.y=v)&&(s.d.y>=v)){continue}if((s.o.x==s.d.x)&&(s.o.x>=w)){x=s.o.x;u=v}else{z=0;y=(s.d.y-s.o.y)/(s.d.x-s.o.x);r=v-z*w;q=s.o.y-y*s.o.x;x=-(r-q)/(z-y);u=r+z*x}if(x>=w){t+=1}if(t==2){break}}return t},_getImageLines:function(r,q){return{topline:{o:r.tl,d:r.tr},rightline:{o:r.tr,d:r.br},bottomline:{o:r.br,d:r.bl},leftline:{o:r.bl,d:r.tl}}},_setCornerCoords:function(){var 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},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===1?0:(-this.width/2),this.height===1?0:(-this.height/2));f.lineTo(this.width===1?0:(this.width/2),this.height===1?0:(this.height/2));f.lineWidth=this.strokeWidth;var g=f.strokeStyle;f.strokeStyle=f.fillStyle;f.stroke();f.strokeStyle=g},complexity:function(){return 1},toObject:function(){return e(this.callSuper("toObject"),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){return[""].join("")}});c.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" ");c.Line.fromElement=function(g,f){var i=c.parseAttributes(g,c.Line.ATTRIBUTE_NAMES);var h=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new c.Line(h,e(i,f))};c.Line.fromObject=function(f){var g=[f.x1,f.y1,f.x2,f.y2];return new c.Line(g,f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),d=Math.PI*2,e=b.util.object.extend;if(b.Circle){b.warn("fabric.Circle is already defined.");return}b.Circle=b.util.createClass(b.Object,{type:"circle",initialize:function(f){f=f||{};this.set("radius",f.radius||0);this.callSuper("initialize",f);var g=this.get("radius")*2*this.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},toObject:function(){return c.util.object.extend(this.callSuper("toObject"),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){return''}});c.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");function a(d){d.left=d.left||0;d.top=d.top||0;return d}c.Rect.fromElement=function(e,d){if(!e){return null}var g=c.parseAttributes(e,c.Rect.ATTRIBUTE_NAMES);g=a(g);var f=new c.Rect(c.util.object.extend((d?c.util.object.clone(d):{}),g));f._normalizeLeftTopProperties(g);return f};c.Rect.fromObject=function(d){return new c.Rect(d)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),a=c.util.toFixed;if(c.Polyline){c.warn("fabric.Polyline is already defined");return}c.Polyline=c.util.createClass(c.Object,{type:"polyline",initialize:function(e,d){d=d||{};this.set("points",e);this.callSuper("initialize",d);this._calcDimensions()},_calcDimensions:function(){return c.Polygon.prototype._calcDimensions.call(this)},toObject:function(){return c.Polygon.prototype.toObject.call(this)},toSVG:function(){var f=[];for(var e=0,d=this.points.length;e"].join("")},_render:function(f){var e;f.beginPath();for(var g=0,d=this.points.length;g"].join("")},_render:function(l){var k;l.beginPath();for(var m=0,j=this.points.length;m1){E=Math.sqrt(E);O*=E;N*=E}var R=aa/O;var Q=W/O;var D=(-W)/N;var C=(aa)/N;var H=R*M+Q*L;var q=D*M+C*L;var F=R*T+Q*S;var ab=D*T+C*S;var Z=(F-H)*(F-H)+(ab-q)*(ab-q);var U=1/Z-0.25;if(U<0){U=0}var w=Math.sqrt(U);if(P==J){w=-w}var V=0.5*(H+F)-w*(ab-q);var K=0.5*(q+ab)+w*(F-H);var v=Math.atan2(q-K,H-V);var u=Math.atan2(ab-K,F-V);var Y=u-v;if(Y<0&&P==1){Y+=2*Math.PI}else{if(Y>0&&P==0){Y-=2*Math.PI}}var B=Math.ceil(Math.abs(Y/(Math.PI*0.5+0.001)));var I=[];for(var X=0;X"},toObject:function(){var q=g(this.callSuper("toObject"),{path:this.path});if(this.sourcePath){q.sourcePath=this.sourcePath}if(this.transformMatrix){q.transformMatrix=this.transformMatrix}return q},toDatalessObject:function(){var q=this.toObject();if(this.sourcePath){q.path=this.sourcePath}delete q.sourcePath;return q},toSVG:function(){var t=[];for(var r=0,q=this.path.length;r',"',""].join("")},complexity:function(){return this.path.length},_parsePath:function(){var C=[],z,v,y;for(var u=0,t,q,w=this.path.length;uB){for(var r=1,x=q.length;r"];for(var l=0,j=m.length;l");return k.join("")},toString:function(){return"#"},isSameColor:function(){var j=this.getObjects()[0].get("fill");return this.getObjects().every(function(k){return k.get("fill")===j})},complexity:function(){return this.paths.reduce(function(j,k){return j+((k&&k.complexity)?k.complexity():0)},0)},toGrayscale:function(){var j=this.paths.length;while(j--){this.paths[j].toGrayscale()}return this},getObjects:function(){return this.paths}});function c(m){for(var l=0,j=m.length;l"},getObjects:function(){return this.objects},add:function(h){this._restoreObjectsState();this.objects.push(h);h.setActive(true);this._calcBounds();this._updateObjectsCoords();return this},remove:function(h){this._restoreObjectsState();f(this.objects,h);h.setActive(false);this._calcBounds();this._updateObjectsCoords();return this},size:function(){return this.getObjects().length},set:function(h,k){if(typeof k=="function"){this.set(h,k(this[h]))}else{if(h==="fill"||h==="opacity"){var j=this.objects.length;this[h]=k;while(j--){this.objects[j].set(h,k)}}else{this[h]=k}}return this},contains:function(h){return this.objects.indexOf(h)>-1},toObject:function(){return g(this.callSuper("toObject"),{objects:b(this.objects,"clone")})},render:function(j){j.save();this.transform(j);var n=Math.max(this.scaleX,this.scaleY);for(var l=0,h=this.objects.length,k;k=this.objects[l];l++){var m=k.borderScaleFactor;k.borderScaleFactor=n;k.render(j);k.borderScaleFactor=m}this.hideBorders||this.drawBorders(j);this.hideCorners||this.drawCorners(j);j.restore();this.setCoords()},item:function(h){return this.getObjects()[h]},complexity:function(){return this.getObjects().reduce(function(i,h){i+=(typeof h.complexity=="function")?h.complexity():0;return i},0)},_restoreObjectsState:function(){this.objects.forEach(this._restoreObjectState,this);return this},_restoreObjectState:function(j){var l=this.get("left"),m=this.get("top"),h=this.getAngle()*(Math.PI/180),k=j.get("originalLeft"),n=j.get("originalTop"),i=Math.cos(h)*j.get("top")+Math.sin(h)*j.get("left"),o=-Math.sin(h)*j.get("top")+Math.cos(h)*j.get("left");j.setAngle(j.getAngle()+this.getAngle());j.set("left",l+o*this.get("scaleX"));j.set("top",m+i*this.get("scaleY"));j.set("scaleX",j.get("scaleX")*this.get("scaleX"));j.set("scaleY",j.get("scaleY")*this.get("scaleY"));j.setCoords();j.hideCorners=false;j.setActive(false);j.setCoords();return this},destroy:function(){return this._restoreObjectsState()},saveCoords:function(){this._originalLeft=this.get("left");this._originalTop=this.get("top");return this},hasMoved:function(){return this._originalLeft!==this.get("left")||this._originalTop!==this.get("top")},setObjectsCoords:function(){this.forEachObject(function(h){h.setCoords()});return this},activateAllObjects:function(){return this.setActive(true)},setActive:function(h){this.forEachObject(function(i){i.setActive(h)});return this},forEachObject:e.StaticCanvas.prototype.forEachObject,_setOpacityIfSame:function(){var j=this.getObjects(),i=j[0]?j[0].get("opacity"):1;var h=j.every(function(k){return k.get("opacity")===i});if(h){this.opacity=i}},_calcBounds:function(){var s=[],q=[],p,n,k,h,m,l,u,r=0,t=this.objects.length;for(;ri.x&&j-hi.y},toGrayscale:function(){var h=this.objects.length;while(h--){this.objects[h].toGrayscale()}}});e.Group.fromObject=function(h){return new e.Group(h.objects,h)}})(typeof exports!="undefined"?exports:this);(function(a){var b=fabric.util.object.extend;if(!a.fabric){a.fabric={}}if(a.fabric.Image){fabric.warn("fabric.Image is already defined.");return}if(!fabric.Object){fabric.warn("fabric.Object is required for fabric.Image initialization");return}fabric.Image=fabric.util.createClass(fabric.Object,{active:false,bordervisibility:false,cornervisibility:false,type:"image",filters:[],initialize:function(d,c){c||(c={});this.callSuper("initialize",c);this._initElement(d);this._originalImage=this.getElement();this._initConfig(c);if(c.filters){this.filters=c.filters;this.applyFilters()}},getElement:function(){return this._element},setElement:function(c){this._element=c;this._initConfig();return this},getOriginalSize:function(){var c=this.getElement();return{width:c.width,height:c.height}},setBorderVisibility:function(c){this._resetWidthHeight();this._adjustWidthHeightToBorders(showBorder);this.setCoords()},setCornersVisibility:function(c){this.cornervisibility=!!c},render:function(c,d){c.save();if(!d){this.transform(c)}this._render(c);if(this.active&&!d){this.drawBorders(c);this.hideCorners||this.drawCorners(c)}c.restore()},toObject:function(){return b(this.callSuper("toObject"),{src:this._originalImage.src||this._originalImage._src,filters:this.filters.concat()})},toSVG:function(){return''},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(c){this.constructor.fromObject(this.toObject(),c)},applyFilters:function(i){if(this.filters.length===0){this.setElement(this._originalImage);i&&i();return}var c=typeof Buffer!=="undefined"&&typeof window==="undefined",g=this._originalImage,e=fabric.document.createElement("canvas"),f=c?new (require("canvas").Image):fabric.document.createElement("img"),h=this;if(!e.getContext&&typeof G_vmlCanvasManager!="undefined"){G_vmlCanvasManager.initElement(e)}e.width=g.width;e.height=g.height;e.getContext("2d").drawImage(g,0,0);this.filters.forEach(function(j){j&&j.applyTo(e)});f.onload=function(){h.setElement(f);i&&i();f.onload=e=g=null};f.width=g.width;f.height=g.height;if(c){var d=e.toDataURL("image/png").replace(/data:image\/png;base64,/,"");f.src=new Buffer(d,"base64");h.setElement(f);i&&i()}else{f.src=e.toDataURL("image/png")}return this},_render:function(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.prototype.getSvgSrc=fabric.Image.prototype.getSrc;fabric.Image.fromObject=function(d,f){var c=fabric.document.createElement("img"),e=d.src;if(d.width){c.width=d.width}if(d.height){c.height=d.height}c.onload=function(){fabric.Image.prototype._initFilters.call(d,d);var g=new fabric.Image(c,d);f&&f(g);c=c.onload=null};c.src=e};fabric.Image.fromURL=function(d,f,e){var c=fabric.document.createElement("img");c.onload=function(){if(f){f(new fabric.Image(c,e))}c=c.onload=null};c.src=d};fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" ");fabric.Image.fromElement=function(d,f,c){c||(c={});var e=fabric.parseAttributes(d,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(e["xlink:href"],f,b(e,c))};fabric.Image.async=true})(typeof exports!="undefined"?exports:this);fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var a=this.get("angle");if(a>-225&&a<=-135){return -180}else{if(a>-135&&a<=-45){return -90}else{if(a>-45&&a<=45){return 0}else{if(a>45&&a<=135){return 90}else{if(a>135&&a<=225){return 180}else{if(a>225&&a<=315){return 270}else{if(a>315){return 360}}}}}}}return 0},straighten:function(){var a=this._getAngleValueForStraighten();this.setAngle(a);return this},fxStraighten:function(b){b=b||{};var c=function(){},d=b.onComplete||c,a=b.onChange||c,e=this;fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(f){e.setAngle(f);a()},onComplete:function(){e.setCoords();d()},onStart:function(){e.setActive(false)}});return this}});fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(a){a.straighten();this.renderAll();return this},fxStraightenObject:function(a){a.fxStraighten({onChange:this.renderAll.bind(this)});return this}});fabric.Image.filters={};fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(d){var c=d.getContext("2d"),a=c.getImageData(0,0,d.width,d.height),h=a.data,e=a.width,l=a.height,k,b,g,f;for(g=0;gh&&m>h&&o>h&&p(a-m)'},_render:function(f){var h=Cufon.textOptions||(Cufon.textOptions={});h.left=this.left;h.top=this.top;h.context=f;h.color=this.fill;var g=this._initDummyElement();this.transform(f);Cufon.replaceElement(g,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor});this.width=h.width;this.height=h.height;this._totalLineHeight=h.totalLineHeight;this._fontAscent=h.fontAscent;this._boundaries=h.boundaries;this._shadowOffsets=h.shadowOffsets;this._shadows=h.shadows||[];this.setCoords()},_initDummyElement:function(){var g=c.document.createElement("pre"),f=c.document.createElement("div");f.appendChild(g);if(typeof G_vmlCanvasManager=="undefined"){g.innerHTML=this.text}else{g.innerText=this.text.replace(/\r?\n/gi,"\r")}g.style.fontSize=this.fontSize+"px";g.style.letterSpacing="normal";return g},render:function(f,g){f.save();this._render(f);if(!g&&this.active){this.drawBorders(f);this.hideCorners||this.drawCorners(f)}f.restore()},toObject:function(){return e(this.callSuper("toObject"),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor})},toSVG:function(){var i=this.text.split(/\r?\n/),j=-this._fontAscent-((this._fontAscent/5)*this.lineHeight),g=-(this.width/2),f=(this.height/2)-(i.length*this.fontSize)-this._totalLineHeight,h=this._getSVGTextAndBg(j,g,i),k=this._getSVGShadows(j,i);f+=((this._fontAscent/5)*this.lineHeight);return['',h.textBgRects.join(""),"',k.join(""),h.textSpans.join(""),"",""].join("")},_getSVGShadows:function(h,n){var o=[],k,l,p,g,f=1;for(k=0,p=this._shadows.length;k",c.util.string.escapeXml(n[l]),"");f=1}else{f++}}}return o},_getSVGTextAndBg:function(j,h,n){var g=[],k=[],l,m,o,f=1;for(l=0,o=n.length;l",c.util.string.escapeXml(n[l]),"");f=1}else{f++}if(!this.backgroundColor){continue}k.push("')}return{textSpans:g,textBgRects:k}},_getFillAttributes:function(f){var g=f?new c.Color(f):"";if(!g||!g.getSource()||g.getAlpha()===1){return'fill="'+f+'"'}return'opacity="'+g.getAlpha()+'" fill="'+g.setAlpha(1).toRgb()+'"'},setColor:function(f){this.set("fill",f);return this},setFontsize:function(f){this.set("fontSize",f);this.setCoords();return this},getText:function(){return this.text},setText:function(f){this.set("text",f);this.setCoords();return this},set:function(f,g){if(typeof f=="object"){for(var h in f){this.set(h,f[h])}}else{this[f]=g;if(f==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+g+"$3")}}return this}});c.Text.fromObject=function(f){return new c.Text(f.text,d(f))};c.Text.fromElement=function(f){}})(typeof exports!="undefined"?exports:this);(function(){if(typeof document!="undefined"&&typeof window!="undefined"){return}var 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");img._src=url;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:JV){V=Q}if(P>T){T=P}if(Qz){z=e}L.push(e);e=0;continue}var B=ab.glyphs[ag[aa]]||ab.missingGlyph;if(!B){continue}e+=D=Number(B.w||ab.w)+U}L.push(e);e=Math.max(z,e);var m=[];for(var aa=L.length;aa--;){m[aa]=e-L[aa]}if(D===null){return null}V+=(H.width-D);C+=H.minX;var v,p;if(n){v=J;p=J.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=E;p=fabric.document.createElement("canvas");v.appendChild(p);if(A.printable){var Y=fabric.document.createElement("span");Y.className="cufon-alt";Y.appendChild(fabric.document.createTextNode(E));v.appendChild(Y)}}var ah=v.style;var O=p.style||{};var k=o.convert(H.height-I+T);var af=Math.ceil(k);var S=af/k;p.width=Math.ceil(o.convert(e+V-C)*S);p.height=af;I+=H.minY;O.top=Math.round(o.convert(I-ab.ascent))+"px";O.left=Math.round(o.convert(C))+"px";var j=Math.ceil(o.convert(e*S));var t=j+"px";var s=o.convert(ab.height);var F=(A.lineHeight-1)*o.convert(-ab.ascent/5)*(M-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*M)+F;Cufon.textOptions.lines=M;Cufon.textOptions.totalLineHeight=F;if(a){ah.width=t;ah.height=s+"px"}else{ah.paddingLeft=t;ah.paddingBottom=(s-1)+"px"}var ad=Cufon.textOptions.context||p.getContext("2d"),K=af/H.height;Cufon.textOptions.fontAscent=ab.ascent*K;Cufon.textOptions.boundaries=null;for(var w=Cufon.textOptions.shadowOffsets,aa=R.length;aa--;){w[aa]=[R[aa][0]*K,R[aa][1]*K]}ad.save();ad.scale(K,K);ad.translate(-C-((1/K*p.width)/2)+(Cufon.fonts[ab.family].offsetLeft||0),-I-(Cufon.textOptions.height/K)/2);ad.lineWidth=ab.face["underline-thickness"];ad.save();function q(l,i){ad.strokeStyle=i;ad.beginPath();ad.moveTo(0,l);ad.lineTo(e,l);ad.stroke()}var r=Cufon.getTextDecoration(A),u=A.fontStyle==="italic";function ae(){ad.save();ad.fillStyle=A.backgroundColor;var aj=0,an=0,y=[{left:0}];if(A.textAlign==="right"){ad.translate(m[an],0);y[0].left=m[an]*K}else{if(A.textAlign==="center"){ad.translate(m[an]/2,0);y[0].left=m[an]/2*K}}for(var al=0,ak=ag.length;al.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}');function c(e,f){return a(e,/(?:em|ex|%)$/i.test(f)?"1em":f)}function a(h,i){if(/px$/i.test(i)){return parseFloat(i)}var g=h.style.left,f=h.runtimeStyle.left;h.runtimeStyle.left=h.currentStyle.left;h.style.left=i;var e=h.style.pixelLeft;h.style.left=g;h.runtimeStyle.left=f;return e}return function(T,z,O,w,D,U,M){var h=(z===null);if(h){z=D.alt}var B=T.viewBox;var j=O.computedFontSize||(O.computedFontSize=new Cufon.CSS.Size(c(U,O.get("fontSize"))+"px",T.baseSize));var L=O.computedLSpacing;if(L==undefined){L=O.get("letterSpacing");O.computedLSpacing=L=(L=="normal")?0:~~j.convertFrom(a(U,L))}var t,m;if(h){t=D;m=D.firstChild}else{t=fabric.document.createElement("span");t.className="cufon cufon-vml";t.alt=z;m=fabric.document.createElement("span");m.className="cufon-vml-canvas";t.appendChild(m);if(w.printable){var R=fabric.document.createElement("span");R.className="cufon-alt";R.appendChild(fabric.document.createTextNode(z));t.appendChild(R)}if(!M){t.appendChild(fabric.document.createElement("cvml:shape"))}}var Z=t.style;var G=m.style;var f=j.convert(B.height),W=Math.ceil(f);var K=W/f;var J=B.minX,I=B.minY;G.height=W;G.top=Math.round(j.convert(I-T.ascent));G.left=Math.round(j.convert(J));Z.height=j.convert(T.height)+"px";var p=Cufon.getTextDecoration(w);var y=O.get("color");var X=Cufon.CSS.textTransform(z,O).split("");var e=0,H=0,q=null;var x,r,A=w.textShadow;for(var S=0,Q=0,P=X.length;St?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}else{m&&m.call(l,k)}}fabric.util.removeFromArray=g;fabric.util.degreesToRadians=b;fabric.util.toFixed=d;fabric.util.getRandomInt=e;fabric.util.falseFunction=i;fabric.util.animate=c;fabric.util.requestAnimFrame=h;fabric.util.loadImage=a})();(function(){var d=Array.prototype.slice;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(g){if(this===void 0||this===null){throw new TypeError()}var h=Object(this),e=h.length>>>0;if(e===0){return -1}var i=0;if(arguments.length>0){i=Number(arguments[1]);if(i!==i){i=0}else{if(i!==0&&i!==(1/0)&&i!==-(1/0)){i=(i>0||-1)*Math.floor(Math.abs(i))}}}if(i>=e){return -1}var f=i>=0?i:Math.max(e-Math.abs(i),0);for(;f>>0;f>>0;g>>0;f>>0;f>>0;g>>0,f=0,h;if(arguments.length>1){h=arguments[1]}else{do{if(f in this){h=this[f++];break}if(++f>=e){throw new TypeError()}}while(true)}for(;f=e){e=h[f][g]}}}else{while(f--){if(h[f]>=e){e=h[f]}}}return e}function c(h,g){if(!h||h.length===0){return undefined}var f=h.length-1,e=g?h[f][g]:h[f];if(g){while(f--){if(h[f][g]",">")}fabric.util.string={camelize:b,capitalize:c,escapeXml:a}}());(function(){var c=Array.prototype.slice,a=Function.prototype.apply,b=function(){};if(!Function.prototype.bind){Function.prototype.bind=function(d){var g=this,e=c.call(arguments,1),f;if(e.length){f=function(){return a.call(g,this instanceof b?this:d,e.concat(c.call(arguments)))}}else{f=function(){return a.call(g,this instanceof b?this:d,arguments)}}b.prototype=this.prototype;f.prototype=new b;return f}}})();(function(){var f=Array.prototype.slice,e=function(){};var c=(function(){for(var g in {toString:1}){if(g==="toString"){return false}}return true})();var b;if(c){b=function(g,i){if(i.toString!==Object.prototype.toString){g.prototype.toString=i.toString}if(i.valueOf!==Object.prototype.valueOf){g.prototype.valueOf=i.valueOf}for(var h in i){g.prototype[h]=i[h]}}}else{b=function(g,i){for(var h in i){g.prototype[h]=i[h]}}}function a(){}function d(){var k=null,j=f.call(arguments,0);if(typeof j[0]==="function"){k=j.shift()}function g(){this.initialize.apply(this,arguments)}g.superclass=k;g.subclasses=[];if(k){a.prototype=k.prototype;g.prototype=new a;k.subclasses.push(g)}for(var h=0,l=j.length;h-1?c(j,l.match(/opacity:\s*(\d?\.?\d*)/)[1]):j}for(var m in l){if(m==="opacity"){c(j,l[m])}else{var k=(m==="float"||m==="cssFloat")?(typeof n.styleFloat==="undefined"?"cssFloat":"styleFloat"):m;n[k]=l[m]}}return j}var h=fabric.document.createElement("div"),g=typeof h.style.opacity==="string",b=typeof h.style.filter==="string",a=fabric.document.defaultView,f=a&&typeof a.getComputedStyle!=="undefined",d=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,c=function(i){return i};if(g){c=function(i,j){i.style.opacity=j;return i}}else{if(b){c=function(i,j){var k=i.style;if(i.currentStyle&&!i.currentStyle.hasLayout){k.zoom=1}if(d.test(k.filter)){j=j>=0.9999?"":("alpha(opacity="+(j*100)+")");k.filter=k.filter.replace(d,j)}else{k.filter+=" alpha(opacity="+(j*100)+")"}return i}}}fabric.util.setStyle=e})();(function(){var h=Array.prototype.slice;function g(j){return typeof j==="string"?fabric.document.getElementById(j):j}function b(j){return h.call(j,0)}try{var i=b(fabric.document.childNodes) instanceof Array}catch(a){}if(!i){b=function(k){var j=new Array(k.length),l=k.length;while(l--){j[l]=k[l]}return j}}function c(k,j){var l=fabric.document.createElement(k);for(var m in j){if(m==="class"){l.className=j[m]}else{if(m==="for"){l.htmlFor=j[m]}else{l.setAttribute(m,j[m])}}}return l}function f(j,k){if((" "+j.className+" ").indexOf(" "+k+" ")===-1){j.className+=(j.className?" ":"")+k}}function e(k,l,j){if(typeof l==="string"){l=c(l,j)}if(k.parentNode){k.parentNode.replaceChild(l,k)}l.appendChild(k);return l}function d(k){var j=0,l=0;do{j+=k.offsetTop||0;l+=k.offsetLeft||0;k=k.offsetParent}while(k);return({left:l,top:j})}(function(){var k=fabric.document.documentElement.style;var l="userSelect" in k?"userSelect":"MozUserSelect" in k?"MozUserSelect":"WebkitUserSelect" in k?"WebkitUserSelect":"KhtmlUserSelect" in k?"KhtmlUserSelect":"";function m(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=fabric.util.falseFunction}if(l){n.style[l]="none"}else{if(typeof n.unselectable=="string"){n.unselectable="on"}}return n}function j(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=null}if(l){n.style[l]=""}else{if(typeof n.unselectable=="string"){n.unselectable=""}}return n}fabric.util.makeElementUnselectable=m;fabric.util.makeElementSelectable=j})();(function(){function j(k,o){var m=fabric.document.getElementsByTagName("head")[0],l=fabric.document.createElement("script"),n=true;l.type="text/javascript";l.setAttribute("runat","server");l.onload=l.onreadystatechange=function(p){if(n){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete"){return}n=false;o(p||fabric.window.event);l=l.onload=l.onreadystatechange=null}};l.src=k;m.appendChild(l)}fabric.util.getScript=j})();fabric.util.getById=g;fabric.util.toArray=b;fabric.util.makeElement=c;fabric.util.addClass=f;fabric.util.wrapElement=e;fabric.util.getElementOffset=d})();(function(){function d(e,f){return e+(/\?/.test(e)?"&":"?")+f}var c=(function(){var h=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest()}];for(var e=h.length;e--;){try{var g=h[e]();if(g){return h[e]}}catch(f){}}})();function a(){}function b(g,f){f||(f={});var j=f.method?f.method.toUpperCase():"GET",i=f.onComplete||function(){},h=c(),e;h.onreadystatechange=function(){if(h.readyState===4){i(h);h.onreadystatechange=a}};if(j==="GET"){e=null;if(typeof f.parameters=="string"){g=d(g,f.parameters)}}h.open(j,g,true);if(j==="POST"||j==="PUT"){h.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}h.send(e);return h}fabric.util.request=b})();(function(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/i,""))}if(!v.documentElement){return}g.parseSVGDocument(v.documentElement,function(y,x){j.set(s,{objects:g.util.array.invoke(y,"toObject"),options:x});u(y,x)})}}function a(u){var t=u.objects,s=u.options;t=t.map(function(v){return g[e(v.type)].fromObject(v)});return({objects:t,options:s})}function m(s,v){s=s.trim();var t;if(typeof DOMParser!=="undefined"){var u=new DOMParser();if(u&&u.parseFromString){t=u.parseFromString(s,"text/xml")}}else{if(g.window.ActiveXObject){var t=new ActiveXObject("Microsoft.XMLDOM");t.async="false";t.loadXML(s.replace(//i,""))}}g.parseSVGDocument(t.documentElement,function(x,w){v(x,w)})}function l(v){var t="";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 j=d.getElementsByTagName("stop"),d,f,e={},g,k={x1:d.getAttribute("x1")||0,y1:d.getAttribute("y1")||0,x2:d.getAttribute("x2")||"100%",y2:d.getAttribute("y2")||0};for(var h=j.length;h--;){d=j[h];f=d.getAttribute("offset");f=parseFloat(f)/(/%$/.test(f)?100:1);e[f]=c(d)||d.getAttribute("stop-color")}a(l,k);return fabric.Gradient.create(m,{x1:k.x1,y1:k.y1,x2:k.x2,y2:k.y2,colorStops:e})},forObject:function(g,d,e){e||(e={});a(g,e);var f=fabric.Gradient.create(d,{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,colorStops:e.colorStops});return f}};function a(f,e){for(var g in e){if(typeof e[g]==="string"&&/^\d+%$/.test(e[g])){var d=parseFloat(e[g],10);if(g==="x1"||g==="x2"){e[g]=f.width*d/100}else{if(g==="y1"||g==="y2"){e[g]=f.height*d/100}}}if(g==="x1"||g==="x2"){e[g]-=f.width/2}else{if(g==="y1"||g==="y2"){e[g]-=f.height/2}}}}function b(j){var f=j.getElementsByTagName("linearGradient"),d=j.getElementsByTagName("radialGradient"),g,h={};for(var e=f.length;e--;){g=f[e];h[g.id]=g}for(var e=d.length;e--;){g=d[e];h[g.id]=g}return h}fabric.getGradientDefs=b})();(function(b){var c=b.fabric||(b.fabric={});if(c.Point){c.warn("fabric.Point is already defined");return}c.Point=a;function a(d,e){if(arguments.length>0){this.init(d,e)}}a.prototype={constructor:a,init:function(d,e){this.x=d;this.y=e},add:function(d){return new a(this.x+d.x,this.y+d.y)},addEquals:function(d){this.x+=d.x;this.y+=d.y;return this},scalarAdd:function(d){return new a(this.x+d,this.y+d)},scalarAddEquals:function(d){this.x+=d;this.y+=d;return this},subtract:function(d){return new a(this.x-d.x,this.y-d.y)},subtractEquals:function(d){this.x-=d.x;this.y-=d.y;return this},scalarSubtract:function(d){return new a(this.x-d,this.y-d)},scalarSubtractEquals:function(d){this.x-=d;this.y-=d;return this},multiply:function(d){return new a(this.x*d,this.y*d)},multiplyEquals:function(d){this.x*=d;this.y*=d;return this},divide:function(d){return new a(this.x/d,this.y/d)},divideEquals:function(d){this.x/=d;this.y/=d;return this},eq:function(d){return(this.x==d.x&&this.y==d.y)},lt:function(d){return(this.xd.x&&this.y>d.y)},gte:function(d){return(this.x>=d.x&&this.y>=d.y)},lerp:function(e,d){return new a(this.x+(e.x-this.x)*d,this.y+(e.y-this.y)*d)},distanceFrom:function(f){var e=this.x-f.x,d=this.y-f.y;return Math.sqrt(e*e+d*d)},min:function(d){return new a(Math.min(this.x,d.x),Math.min(this.y,d.y))},max:function(d){return new a(Math.max(this.x,d.x),Math.max(this.y,d.y))},toString:function(){return this.x+","+this.y},setXY:function(d,e){this.x=d;this.y=e},setFromPoint:function(d){this.x=d.x;this.y=d.y},swap:function(e){var d=this.x,f=this.y;this.x=e.x;this.y=e.y;e.x=d;e.y=f}}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Intersection){b.warn("fabric.Intersection is already defined");return}function c(d){if(arguments.length>0){this.init(d)}}b.Intersection=c;b.Intersection.prototype={init:function(d){this.status=d;this.points=[]},appendPoint:function(d){this.points.push(d)},appendPoints:function(d){this.points=this.points.concat(d)}};b.Intersection.intersectLineLine=function(h,f,l,k){var m,i=(k.x-l.x)*(h.y-l.y)-(k.y-l.y)*(h.x-l.x),j=(f.x-h.x)*(h.y-l.y)-(f.y-h.y)*(h.x-l.x),g=(k.y-l.y)*(f.x-h.x)-(k.x-l.x)*(f.y-h.y);if(g!=0){var e=i/g,d=j/g;if(0<=e&&e<=1&&0<=d&&d<=1){m=new c("Intersection");m.points.push(new b.Point(h.x+e*(f.x-h.x),h.y+e*(f.y-h.y)))}else{m=new c("No Intersection")}}else{if(i==0||j==0){m=new c("Coincident")}else{m=new c("Parallel")}}return m};b.Intersection.intersectLinePolygon=function(e,d,l){var m=new c("No Intersection"),f=l.length;for(var h=0;h0){m.status="Intersection"}return m};b.Intersection.intersectPolygonPolygon=function(j,h){var f=new c("No Intersection"),l=j.length;for(var k=0;k0){f.status="Intersection"}return f};b.Intersection.intersectPolygonRectangle=function(n,e,d){var g=e.min(d),m=e.max(d),f=new b.Point(m.x,g.y),l=new b.Point(g.x,m.y),k=c.intersectLinePolygon(g,f,n),j=c.intersectLinePolygon(f,m,n),i=c.intersectLinePolygon(m,l,n),h=c.intersectLinePolygon(l,g,n),o=new c("No Intersection");o.appendPoints(k.points);o.appendPoints(j.points);o.appendPoints(i.points);o.appendPoints(h.points);if(o.points.length>0){o.status="Intersection"}return o}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Color){b.warn("fabric.Color is already defined.");return}function c(d){if(!d){this.setSource([0,0,0,1])}else{this._tryParsingColor(d)}}b.Color=c;b.Color.prototype={_tryParsingColor:function(d){var e=c.sourceFromHex(d);if(!e){e=c.sourceFromRgb(d)}if(e){this.setSource(e)}},getSource:function(){return this._source},setSource:function(d){this._source=d},toRgb:function(){var d=this.getSource();return"rgb("+d[0]+","+d[1]+","+d[2]+")"},toRgba:function(){var d=this.getSource();return"rgba("+d[0]+","+d[1]+","+d[2]+","+d[3]+")"},toHex:function(){var h=this.getSource();var f=h[0].toString(16);f=(f.length==1)?("0"+f):f;var e=h[1].toString(16);e=(e.length==1)?("0"+e):e;var d=h[2].toString(16);d=(d.length==1)?("0"+d):d;return f.toUpperCase()+e.toUpperCase()+d.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var d=this.getSource();d[3]=e;this.setSource(d);return this},toGrayscale:function(){var f=this.getSource(),e=parseInt((f[0]*0.3+f[1]*0.59+f[2]*0.11).toFixed(0),10),d=f[3];this.setSource([e,e,e,d]);return this},toBlackWhite:function(d){var g=this.getSource(),f=(g[0]*0.3+g[1]*0.59+g[2]*0.11).toFixed(0),e=g[3],d=d||127;f=(Number(f)','',"',"Created with Fabric.js ",fabric.version,"",fabric.createSVGFontFacesMarkup(this.getObjects())];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)},getSelectionContext: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(b){var a=JSON.stringify(this);this.cloneWithoutData(function(c){c.loadFromJSON(a,function(){if(b){b(c)}})})},cloneWithoutData:function(c){var a=fabric.document.createElement("canvas");a.width=this.getWidth();a.height=this.getHeight();var b=this.__clone||(this.__clone=new fabric.Canvas(a));b.clipTo=this.clipTo;if(c){c(b)}}});(function(a){var d=a.fabric||(a.fabric={}),l=d.util.object.extend,m=d.util.object.clone,c=d.util.toFixed,k=d.util.string.capitalize,p=d.util.getPointer,b=d.util.degreesToRadians,o=Array.prototype.slice;if(d.Object){return}d.Object=d.util.createClass({type:"object",includeDefaultValues:true,NUM_FRACTION_DIGITS:2,MIN_SCALE_LIMIT:0.1,stateProperties:("top left width height scaleX scaleY flipX flipY theta angle opacity cornersize fill overlayFill stroke strokeWidth fillRule borderScaleFactor transformMatrix selectable").split(" "),top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:false,flipY:false,theta:0,opacity:1,angle:0,cornersize:12,padding:0,borderColor:"rgba(102,153,255,0.75)",cornerColor:"rgba(102,153,255,0.5)",fill:"rgb(0,0,0)",fillRule:"source-over",overlayFill:null,stroke:null,strokeWidth:1,borderOpacityWhenMoving:0.4,borderScaleFactor:1,transformMatrix:null,selectable:true,hasControls:true,hasBorders:true,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(",c(this.left,2)," ",c(this.top,2),")",i!==0?(" rotate("+c(i,2)+")"):"",(this.scaleX===1&&this.scaleY===1)?"":(" scale("+c(this.scaleX,2)+" "+c(this.scaleY,2)+")")].join("")},_removeDefaultValues:function(q){var i=d.Object.prototype.options;if(i){this.stateProperties.forEach(function(r){if(q[r]===i[r]){delete q[r]}})}return q},isActive:function(){return !!this.active},setActive:function(i){this.active=!!i;return this},toString:function(){return"#"},set:function(q,i){var s=(q==="scaleX"||q==="scaleY")&&ir.x&&s.xr.y&&u.y=v)&&(s.d.y>=v)){continue}if((s.o.x==s.d.x)&&(s.o.x>=w)){x=s.o.x;u=v}else{z=0;y=(s.d.y-s.o.y)/(s.d.x-s.o.x);r=v-z*w;q=s.o.y-y*s.o.x;x=-(r-q)/(z-y);u=r+z*x}if(x>=w){t+=1}if(t==2){break}}return t},_getImageLines:function(r,q){return{topline:{o:r.tl,d:r.tr},rightline:{o:r.tr,d:r.br},bottomline:{o:r.br,d:r.bl},leftline:{o:r.bl,d:r.tl}}},_setCornerCoords:function(){var 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},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===1?0:(-this.width/2),this.height===1?0:(-this.height/2));f.lineTo(this.width===1?0:(this.width/2),this.height===1?0:(this.height/2));f.lineWidth=this.strokeWidth;var g=f.strokeStyle;f.strokeStyle=f.fillStyle;f.stroke();f.strokeStyle=g},complexity:function(){return 1},toObject:function(){return e(this.callSuper("toObject"),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){return[""].join("")}});c.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" ");c.Line.fromElement=function(g,f){var i=c.parseAttributes(g,c.Line.ATTRIBUTE_NAMES);var h=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new c.Line(h,e(i,f))};c.Line.fromObject=function(f){var g=[f.x1,f.y1,f.x2,f.y2];return new c.Line(g,f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),d=Math.PI*2,e=b.util.object.extend;if(b.Circle){b.warn("fabric.Circle is already defined.");return}b.Circle=b.util.createClass(b.Object,{type:"circle",initialize:function(f){f=f||{};this.set("radius",f.radius||0);this.callSuper("initialize",f);var g=this.get("radius")*2*this.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},toObject:function(){return c.util.object.extend(this.callSuper("toObject"),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){return''}});c.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");function a(d){d.left=d.left||0;d.top=d.top||0;return d}c.Rect.fromElement=function(e,d){if(!e){return null}var g=c.parseAttributes(e,c.Rect.ATTRIBUTE_NAMES);g=a(g);var f=new c.Rect(c.util.object.extend((d?c.util.object.clone(d):{}),g));f._normalizeLeftTopProperties(g);return f};c.Rect.fromObject=function(d){return new c.Rect(d)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),a=c.util.toFixed;if(c.Polyline){c.warn("fabric.Polyline is already defined");return}c.Polyline=c.util.createClass(c.Object,{type:"polyline",initialize:function(e,d){d=d||{};this.set("points",e);this.callSuper("initialize",d);this._calcDimensions()},_calcDimensions:function(){return c.Polygon.prototype._calcDimensions.call(this)},toObject:function(){return c.Polygon.prototype.toObject.call(this)},toSVG:function(){var f=[];for(var e=0,d=this.points.length;e"].join("")},_render:function(f){var e;f.beginPath();for(var g=0,d=this.points.length;g"].join("")},_render:function(l){var k;l.beginPath();for(var m=0,j=this.points.length;m1){E=Math.sqrt(E);O*=E;N*=E}var R=aa/O;var Q=W/O;var D=(-W)/N;var C=(aa)/N;var H=R*M+Q*L;var q=D*M+C*L;var F=R*T+Q*S;var ab=D*T+C*S;var Z=(F-H)*(F-H)+(ab-q)*(ab-q);var U=1/Z-0.25;if(U<0){U=0}var w=Math.sqrt(U);if(P==J){w=-w}var V=0.5*(H+F)-w*(ab-q);var K=0.5*(q+ab)+w*(F-H);var v=Math.atan2(q-K,H-V);var u=Math.atan2(ab-K,F-V);var Y=u-v;if(Y<0&&P==1){Y+=2*Math.PI}else{if(Y>0&&P==0){Y-=2*Math.PI}}var B=Math.ceil(Math.abs(Y/(Math.PI*0.5+0.001)));var I=[];for(var X=0;X"},toObject:function(){var q=g(this.callSuper("toObject"),{path:this.path});if(this.sourcePath){q.sourcePath=this.sourcePath}if(this.transformMatrix){q.transformMatrix=this.transformMatrix}return q},toDatalessObject:function(){var q=this.toObject();if(this.sourcePath){q.path=this.sourcePath}delete q.sourcePath;return q},toSVG:function(){var t=[];for(var r=0,q=this.path.length;r',"',""].join("")},complexity:function(){return this.path.length},_parsePath:function(){var C=[],z,v,y;for(var u=0,t,q,w=this.path.length;uB){for(var r=1,x=q.length;r"];for(var l=0,j=m.length;l");return k.join("")},toString:function(){return"#"},isSameColor:function(){var j=this.getObjects()[0].get("fill");return this.getObjects().every(function(k){return k.get("fill")===j})},complexity:function(){return this.paths.reduce(function(j,k){return j+((k&&k.complexity)?k.complexity():0)},0)},toGrayscale:function(){var j=this.paths.length;while(j--){this.paths[j].toGrayscale()}return this},getObjects:function(){return this.paths}});function c(m){for(var l=0,j=m.length;l"},getObjects:function(){return this.objects},add:function(h){this._restoreObjectsState();this.objects.push(h);h.setActive(true);this._calcBounds();this._updateObjectsCoords();return this},remove:function(h){this._restoreObjectsState();f(this.objects,h);h.setActive(false);this._calcBounds();this._updateObjectsCoords();return this},size:function(){return this.getObjects().length},set:function(h,k){if(typeof k=="function"){this.set(h,k(this[h]))}else{if(h==="fill"||h==="opacity"){var j=this.objects.length;this[h]=k;while(j--){this.objects[j].set(h,k)}}else{this[h]=k}}return this},contains:function(h){return this.objects.indexOf(h)>-1},toObject:function(){return g(this.callSuper("toObject"),{objects:b(this.objects,"clone")})},render:function(j){j.save();this.transform(j);var n=Math.max(this.scaleX,this.scaleY);for(var l=0,h=this.objects.length,k;k=this.objects[l];l++){var m=k.borderScaleFactor;k.borderScaleFactor=n;k.render(j);k.borderScaleFactor=m}this.hideBorders||this.drawBorders(j);this.hideCorners||this.drawCorners(j);j.restore();this.setCoords()},item:function(h){return this.getObjects()[h]},complexity:function(){return this.getObjects().reduce(function(i,h){i+=(typeof h.complexity=="function")?h.complexity():0;return i},0)},_restoreObjectsState:function(){this.objects.forEach(this._restoreObjectState,this);return this},_restoreObjectState:function(j){var l=this.get("left"),m=this.get("top"),h=this.getAngle()*(Math.PI/180),k=j.get("originalLeft"),n=j.get("originalTop"),i=Math.cos(h)*j.get("top")+Math.sin(h)*j.get("left"),o=-Math.sin(h)*j.get("top")+Math.cos(h)*j.get("left");j.setAngle(j.getAngle()+this.getAngle());j.set("left",l+o*this.get("scaleX"));j.set("top",m+i*this.get("scaleY"));j.set("scaleX",j.get("scaleX")*this.get("scaleX"));j.set("scaleY",j.get("scaleY")*this.get("scaleY"));j.setCoords();j.hideCorners=false;j.setActive(false);j.setCoords();return this},destroy:function(){return this._restoreObjectsState()},saveCoords:function(){this._originalLeft=this.get("left");this._originalTop=this.get("top");return this},hasMoved:function(){return this._originalLeft!==this.get("left")||this._originalTop!==this.get("top")},setObjectsCoords:function(){this.forEachObject(function(h){h.setCoords()});return this},activateAllObjects:function(){return this.setActive(true)},setActive:function(h){this.forEachObject(function(i){i.setActive(h)});return this},forEachObject:e.StaticCanvas.prototype.forEachObject,_setOpacityIfSame:function(){var j=this.getObjects(),i=j[0]?j[0].get("opacity"):1;var h=j.every(function(k){return k.get("opacity")===i});if(h){this.opacity=i}},_calcBounds:function(){var s=[],q=[],p,n,k,h,m,l,u,r=0,t=this.objects.length;for(;ri.x&&j-hi.y},toGrayscale:function(){var h=this.objects.length;while(h--){this.objects[h].toGrayscale()}}});e.Group.fromObject=function(h){return new e.Group(h.objects,h)}})(typeof exports!="undefined"?exports:this);(function(a){var b=fabric.util.object.extend;if(!a.fabric){a.fabric={}}if(a.fabric.Image){fabric.warn("fabric.Image is already defined.");return}if(!fabric.Object){fabric.warn("fabric.Object is required for fabric.Image initialization");return}fabric.Image=fabric.util.createClass(fabric.Object,{active:false,bordervisibility:false,cornervisibility:false,type:"image",filters:[],initialize:function(d,c){c||(c={});this.callSuper("initialize",c);this._initElement(d);this._originalImage=this.getElement();this._initConfig(c);if(c.filters){this.filters=c.filters;this.applyFilters()}},getElement:function(){return this._element},setElement:function(c){this._element=c;this._initConfig();return this},getOriginalSize:function(){var c=this.getElement();return{width:c.width,height:c.height}},setBorderVisibility:function(c){this._resetWidthHeight();this._adjustWidthHeightToBorders(showBorder);this.setCoords()},setCornersVisibility:function(c){this.cornervisibility=!!c},render:function(c,d){c.save();if(!d){this.transform(c)}this._render(c);if(this.active&&!d){this.drawBorders(c);this.hideCorners||this.drawCorners(c)}c.restore()},toObject:function(){return b(this.callSuper("toObject"),{src:this._originalImage.src||this._originalImage._src,filters:this.filters.concat()})},toSVG:function(){return''},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(c){this.constructor.fromObject(this.toObject(),c)},applyFilters:function(i){if(this.filters.length===0){this.setElement(this._originalImage);i&&i();return}var c=typeof Buffer!=="undefined"&&typeof window==="undefined",g=this._originalImage,e=fabric.document.createElement("canvas"),f=c?new (require("canvas").Image):fabric.document.createElement("img"),h=this;if(!e.getContext&&typeof G_vmlCanvasManager!="undefined"){G_vmlCanvasManager.initElement(e)}e.width=g.width;e.height=g.height;e.getContext("2d").drawImage(g,0,0);this.filters.forEach(function(j){j&&j.applyTo(e)});f.onload=function(){h.setElement(f);i&&i();f.onload=e=g=null};f.width=g.width;f.height=g.height;if(c){var d=e.toDataURL("image/png").replace(/data:image\/png;base64,/,"");f.src=new Buffer(d,"base64");h.setElement(f);i&&i()}else{f.src=e.toDataURL("image/png")}return this},_render:function(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.prototype.getSvgSrc=fabric.Image.prototype.getSrc;fabric.Image.fromObject=function(d,f){var c=fabric.document.createElement("img"),e=d.src;if(d.width){c.width=d.width}if(d.height){c.height=d.height}c.onload=function(){fabric.Image.prototype._initFilters.call(d,d);var g=new fabric.Image(c,d);f&&f(g);c=c.onload=null};c.src=e};fabric.Image.fromURL=function(d,f,e){var c=fabric.document.createElement("img");c.onload=function(){if(f){f(new fabric.Image(c,e))}c=c.onload=null};c.src=d};fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" ");fabric.Image.fromElement=function(d,f,c){c||(c={});var e=fabric.parseAttributes(d,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(e["xlink:href"],f,b(e,c))};fabric.Image.async=true})(typeof exports!="undefined"?exports:this);fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var a=this.get("angle");if(a>-225&&a<=-135){return -180}else{if(a>-135&&a<=-45){return -90}else{if(a>-45&&a<=45){return 0}else{if(a>45&&a<=135){return 90}else{if(a>135&&a<=225){return 180}else{if(a>225&&a<=315){return 270}else{if(a>315){return 360}}}}}}}return 0},straighten:function(){var a=this._getAngleValueForStraighten();this.setAngle(a);return this},fxStraighten:function(b){b=b||{};var c=function(){},d=b.onComplete||c,a=b.onChange||c,e=this;fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(f){e.setAngle(f);a()},onComplete:function(){e.setCoords();d()},onStart:function(){e.setActive(false)}});return this}});fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(a){a.straighten();this.renderAll();return this},fxStraightenObject:function(a){a.fxStraighten({onChange:this.renderAll.bind(this)});return this}});fabric.Image.filters={};fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(d){var c=d.getContext("2d"),a=c.getImageData(0,0,d.width,d.height),h=a.data,e=a.width,l=a.height,k,b,g,f;for(g=0;gh&&m>h&&o>h&&p(a-m)'},_render:function(f){var h=Cufon.textOptions||(Cufon.textOptions={});h.left=this.left;h.top=this.top;h.context=f;h.color=this.fill;var g=this._initDummyElement();this.transform(f);Cufon.replaceElement(g,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor});this.width=h.width;this.height=h.height;this._totalLineHeight=h.totalLineHeight;this._fontAscent=h.fontAscent;this._boundaries=h.boundaries;this._shadowOffsets=h.shadowOffsets;this._shadows=h.shadows||[];this.setCoords()},_initDummyElement:function(){var g=c.document.createElement("pre"),f=c.document.createElement("div");f.appendChild(g);if(typeof G_vmlCanvasManager=="undefined"){g.innerHTML=this.text}else{g.innerText=this.text.replace(/\r?\n/gi,"\r")}g.style.fontSize=this.fontSize+"px";g.style.letterSpacing="normal";return g},render:function(f,g){f.save();this._render(f);if(!g&&this.active){this.drawBorders(f);this.hideCorners||this.drawCorners(f)}f.restore()},toObject:function(){return e(this.callSuper("toObject"),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor})},toSVG:function(){var i=this.text.split(/\r?\n/),j=-this._fontAscent-((this._fontAscent/5)*this.lineHeight),g=-(this.width/2),f=(this.height/2)-(i.length*this.fontSize)-this._totalLineHeight,h=this._getSVGTextAndBg(j,g,i),k=this._getSVGShadows(j,i);f+=((this._fontAscent/5)*this.lineHeight);return['',h.textBgRects.join(""),"',k.join(""),h.textSpans.join(""),"",""].join("")},_getSVGShadows:function(h,n){var o=[],k,l,p,g,f=1;for(k=0,p=this._shadows.length;k",c.util.string.escapeXml(n[l]),"");f=1}else{f++}}}return o},_getSVGTextAndBg:function(j,h,n){var g=[],k=[],l,m,o,f=1;for(l=0,o=n.length;l",c.util.string.escapeXml(n[l]),"");f=1}else{f++}if(!this.backgroundColor){continue}k.push("')}return{textSpans:g,textBgRects:k}},_getFillAttributes:function(f){var g=f?new c.Color(f):"";if(!g||!g.getSource()||g.getAlpha()===1){return'fill="'+f+'"'}return'opacity="'+g.getAlpha()+'" fill="'+g.setAlpha(1).toRgb()+'"'},setColor:function(f){this.set("fill",f);return this},setFontsize:function(f){this.set("fontSize",f);this.setCoords();return this},getText:function(){return this.text},setText:function(f){this.set("text",f);this.setCoords();return this},set:function(f,g){if(typeof f=="object"){for(var h in f){this.set(h,f[h])}}else{this[f]=g;if(f==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+g+"$3")}}return this}});c.Text.fromObject=function(f){return new c.Text(f.text,d(f))};c.Text.fromElement=function(f){}})(typeof exports!="undefined"?exports:this);(function(){if(typeof document!="undefined"&&typeof window!="undefined"){return}var 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");img._src=url;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 94ccd276746c9a36d258aac48320aec4debfd4c0..fcf79ecac25679582f89a243d7d92de4c3f55be6 100644 GIT binary patch delta 14809 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%0D1_=s5|5EnElbzt&i z)5jPNBN@kfNO8=Ej-(f$!1XNa`kAV*Ks?{_@B%ED%$8ZVgW-WBGdq2UN#__0u(72M zLNuq&J4nJhPGB@Z3(1{P_9Opxh1XPyGh+Z!Ow)x#UiyTv(!)a{!X9wy)nFGSHB09m zL#q%{e;e%eH{9{ZwkLlb?lX5_f`2=bx~`X^E{M;s9w4+Ndl`Ride^twz?dY zHm`yLwFP$n`rXf;FTQdrboXA!WwM}Ny1ZhgK+`sm65OJ`U9j2pD+P{~Dt+!9h2um> z0nY%o&Wk8sgR1EGs;V4uoe> ze{;)%y1YTgE3C@32Too=6~pRQO*Aj-)Dz*7>gJf9a+UD-#*Y=Ei}Bq)C4_QYp+eN$ zeLod(!5n2LBW4}zZ&QPs#P^G|9!$Fx3DR2dnHisB_`Fr03;3MsPoR_o<7)w#`U@J; z?MzzGj{MpMuV_E5m%=g`0!6XNe|_wjztyj19=cb}1^E(W(GnvRsFr@YR>$29oVc^& zX@Vjf0&aKODC&*2J#{FsZ|>3GOg~JwP<~JD)YD9HryF}Gez`8%hhMI77y5sE7d%ZA z?Ltv+-@G8-vJ0(0XBRxpJb4!|&DsY9tvsTTkj(AuxG5-u(3^z~pgZD*f6W3odu!d< zC$kZaWJ_#PKmWof&Ld`h1Jh%yR-Wk*L4p5wI4o49)5lT+H1eoOj9(_;>pLESL_o>x zj3D`VEpjD<2TF^paf@W}BrVj=Wt%xXU;@y5E?dTF71kKYF76nw`W3ko-l_g=NQE=M z0D`#U47p-kj*!{gn3_0Ubd^%x-T_+hVqUyR~JiJlM^~tQ0^b(Bt zc~8TyFVSt`He9Hd$oozRtJ|TpZb!0$H}qV%D1I(Pk8@lNnrdjJ7J4s{(+EVQZ*jG7 zNtS6g6Hkmp5C~~XA+k0lhfXtSAV4v)G3-sQlR$W;y(KJ)(F&7Ee|NTAm}L5GVS5|) zvKEqCDlPa*Qc?Ew!Gczb+XsN?vY{OaTAN>n07w%6@V7d zZ@V}qf`h@tg0sVxfBHCP1GLpRL#dE{sJ>N74EA}r@2={r>WX#O@Mq0qM%L)DuqFVv z^>m6NzVjrz<_1Tm$*#VEH(ZlM>SiGjh;QgR(A3UmDTb@Rl`xLOemOdiodS=AE>Ga{ z`pj8JXy}HHV;0|5x%m1Y-Sy5+xDZd?Il;R0zD7eF6+kiRxT(&yQAsCVGmHZ-)1 z^LW&VUh2D6e+?1yL<+(eehjqW8kA}!CH`5Uu8^BlwRNG540RHutL4oS!!rX&j15R_ z>OXp5CO_ajzF3lp*3ia}5Fy^B?AIhqTFE$Btoilxq>~!MW~1YP)6TIJH;tX(&NTch zEzr3}p*)IaAzb5&fq*xbF>mN$S>H{$PLwU~NXkwke-B#bWjMl<*JA4+HwsiB{Mg>K zAV!|vvI?jA*t~h?Ujn7WZI6WotKk1&JQu~|S^tUSp+YJY()KNw2x8``J>-Gt#?+xA zC`tr$4vI?kKF8M)UM?9^B9CnaeEB+sVQ^Ym=H0M6ygN&Ncb0H>2xbDJlhRm}+F&%l z8PRZvf4K!3JWFR;COm)O`jgv_5csLZ|2vG)W5L72lQ5@fU!1F|zwrJ!Nay3ba`8 z5GaPPc^SLHh20Aro1bzPp5dNl4-a9svxC%Le`*d7l3?f=!fp+QA~K%HlN5R^OQuE> zbkZgq)s)=;;9T`VOy(KX*Kk#qq`fS_^P7|?|`L>EGuP#>eRT*Hi) ze_0H=izfcYzl9X9x zS?YMJ&yXt2*Aaxz#$auI+*!)|G)@-3h2p^=TnIMJ!uY&e6=fD&qvOD*(II*e$T`KQ z324lOY+6=L;!uN4O##3y(Mhk-H6eQ&e?K%0ijc0b2*>FrlscAml|@+7~=lKQtua0Ad7fM300Cf8`-p zUcE_p>zp;OV_*8;VR}dw;yX4PM&_6hYlpvmbNM#cM%V^)J=W4s_v<~XY33;-mKUi%kl?aGz#QTQHzZ; zp;-5>6tL{Fc2&7$0sO>>UzHpDf2nQQ*6~4O6=#=g3`%x_q3L*-I@!WcP;Diu--)`L zv-nJD=pmRrL*)6cRD=Kj#QzN}8OzdyX?!=%qQ;Wj(U4SZDYm%aa>(o_T?ho>OKjdy zp}sALi^^@Ze;66c&o|{Tt=!1OVk0&K8DPK)0}t@eB^MMpWVdmfm`zm`f6>^;$j{m% z6g1!y#g~VN%$z}5DZ=GMQAAGt3ss*Ky|-7t-~^dwPR!w-0=>O;0_q%6TR^{Nh8+5q z59oM}?ZOwT@C7fd$bdWU=RTkSUQqp) zY4S28ng@G>k`he62r}Cv_v(zFJgM#MfkTh6h23)!z+J=-hd|YW~_m@$;!SgzGElxnKu)6@lJ#& zH^WkdJ+95ffU0085z_gD+QBmney`Jrco}#e_6k?^WhXrG@#;JA$)Z- zulb7KveW3{;V!Rst#Y;0+AwIm6Cd0S*8QE!gEh{H(7F?*tmoR0;h?}m?HuE_t~54~ zRbCy?PM+sk$a6opc#hqh%%4f@Y~g&*H=b9O4buR}cqC`Serd^Wa~#Eu3}9Z!_b&j) zW#U2Ik|RRHe<%W2#tR8-mMYjv>OTaj|6w7$Dr(;;M%_7yl3qmGPfR{uN?m&ypw2u2 zYP8&#FefBb+}9lWEhWLreD6DKUC%tvIveHr#?al$aY+`&k|@5|!HtdJc${C1krM|z zLwc&Avf8f*`C2|3B;$_Hsfpmp{4Q*KMKvt+q20Xme;SW^TW%rLXf5qdOfB~0!-7t7 z1NT7$JSOqEqx`qA-Tk1?Lp?dwDHCB#4NkoxKF_%M%#?q7inSSL03W-FVGmy2#7 zrI^;#e^dIRXK{KX-yr2DTtqdL^>F&6nP=qC=#wT0p5hh+jvF}^HlVOcC}&ZTurHsM zf0)ddfyv}#id*?o`EDdoye*1jAe_&w#o)5j5$_#EtS`w%2m=-|m0NG`R zHfSu4fMP`1jsF3>Q2M<^Wa|V`D$+-J;?fkUg@`3H4s?sFqSOr%1fQ&|lPw>d9X*hI zTlq$8Q>aam7Q11f^dvi`#xN{s34;Vm;-rnNl-FA=25iG;K2-jGqPd>l>@V@@CR%5-@nco{i zi?x9^kJ}Fq_Z#7M-W(#s2m(6d^ut4kH7SMbAmTSUX}4YPO_K@gH{ElkRBq>9Z}G6$ zByNisOo5W+iM6~hu+B1Vk^uu|8q6-(Q-rV-*aI>yQrHal!afAuD3 z>RT8Q6ZprL40f)cn~Ay;*1P<}@nI3Sj1#6MqBnwsZFk&F3{iV!`zYwcWf<7W`dLR*&58Uc;c_ObN$#2917K=^^2MEAG=@nq8vyVfWp9G0}Q7qS^@4v#7=fv(hasK__e-LW z&yZT+--EA28(#&yrWYy&sNn@C?WXF#(aX zv6ceaymp#gFJNtlqM*pPf1|RSYd>e#dp$G`{p8polhY3Rw~9)#!)q>I7gFdUu0j5-_^} zx#I`O7U=yZz)SIqIo7lwY#y>2+uz;}s-b@vXUBu{oz_i=+?BDEMhS-Yk}=XOsz6V> zXm_sjM!Fbi=nz8<518dXfpKXD0xpW>kk;lNXvu%~X4AzJ0q4L2I0u%q`i_ZY`dTxq zTy7Iup@=P$$y*{N?znR9`kJhzoOR5mT`O!z3(mdvDc6i5ddh#y(H@W{MU8S3xRVfE z7Jq9pxgeHj|3gW8lNVh6;{WvF>t5Iy{Ax=;lFu=bC^8Lk001vbiGbdbUikX zJ3a>n6DOIEh_z*^h>^ucG9h=q*|p5FyfYt&v`)95cDulyf5f=*(~Qkx9t_67lss+_ z2VzxuDFmpH39>OEtLGl%@3C%Ox|H1#-;>x}D}N%P{G1|oUL;VRvtcFVU`u?@OSHo! zQcs{i7o{F-%oqOeMTx(_mpCFS3ErdBChG`{V1uu&CE*hE4gRLb&61(&!^?bJLj4wh z6y>H#Z<_dgSXxLmgm+EYgjGokd4q_%HiC0n0`AH*s}d6CniMYAq`vNfRMb6Sd7veW5+}7AkMVR3;gA_fd`oST)Zgx7TFj-@*oR5No+95l5`JADLf?D;jFQY(I zE-r*+a22GJ0`$Q`DY!26fWlK%a2*3?tR@ALp|v!BOK%1=IN?wDw?TJG7ACOuFIaA| zp}e!)qDi&pbh-vj{xq7-#+gc>=WOwf5whl#NR$xM0hO!)CE`I4twBZToP;6>YHOc|oK=Xn&6UGKz4-zl>it&GP_!yOw~g5V z83Uy#f!~|Q+><7PY#@P@m5J9=Q0U3iUA)ReD#DC@y6N-hNl$o!lSN-YK|E{HoISQT z@~%23MTQ3qG*|%yW?bFFh^q-3cN9|qUnS@r@)!`Z060Op4J^nZx^N334C7{=c+`B6 z0GOX?t_qXIUnPHmG+bbxWBSNuWe%VnW{{u)$-R)EVH#57;xx|D%PC26J!kb9T?%@g zG#)}NG+-2opFK-lFXkkE$v3VY?FHpgsGu^e+^c|hWvmWMgtnTSp%IiqkBb&lhD#V}IU64Xhj0~vp*6+NZDQC*qO-eXvvF3Z z-#0ZLlYU?qe~(2=4wT=nOy$K%?!nqBE=ZolnB=i@IXO55@<_%2FgGsM&-28u!EF?8 zv4T(I&RYeeF_-Zuj8$;RKXDD_IC1R`AVIyf1mn9V7}7PtD6Yxn3;gHh75V9tFSDvW zSX;xD2*N^a*43xfK(aCSs7~?(H;w~hU~J3L1vPSQNi(gUzdU~G7!zEDF}mMKOvHl= z-~ubFY`TMJ1u5;#(&nuog7F~HswbVUFccU2fTctVF3H@8VezyGTzdvQd~!4{qteBO zIo^|9VIqH^5+cY6zvV}5J$WS_6_{y%To^~56T^E4|54lL{`r1>OK{h&BD>;+<76L- z?}_5V6a~xYmP)?q)E0^U1nYFq%f2&3d3B# z`-g}(z4_D~FQ63n_ym=gLtpV+50UT>!E3c=GUyu%Z>nr?B75%m*;33PnLfRaV9dx& zcC8yo(ZZ7%VmAVP!IM&AGJipK%Sf_qBO$y%mlF8Xas3o{?fMFxjh>*3(F{F_F3^E! zf__8i=q~h58docqAL^mjR+-Y!-=Z)SucJjIKDR_dn#8jBX78|}F!Mam^h+NhL>Cl^ zcMg2`(-2gN^Kr0mlGk2(?%0=DH)^5Hqt(vEceQhYv(@y#!M-tMLoh^z^CGzgOD)R9 zh=Q}si=*eJNyY#CPgnsQa~M@_qH?YJlJSJ4osg8X2>&k2=z5bgW56kvHYrecsv<}k zp%-k4bSLnx&ZhWG<|r$md(Dt~q>^)hTtI=xsyz3>lN@9ke|sF+1gi<-WU49L4C(pv1zLz&ndq~9hAJ@vyW4JHO)&zmbt!-7J({hK z7WgBnt|4WOCX#DNS>vqGKUCo|3GJ&y*fg8g?WW1;YCEA_(q52n$&QmtW*jp~wB>rv zEQ5ZNiCE=^_8xES3IB4aAvT$!z0#opTzr92JwAW+*eZ zk){%_VqFA(d&;ch7_(PY4!&Q-=n{7o^N+?dz9CF{7uOo=n3}5a#-n}ywc=kZ^lX#$ zW;_A5lQL&20cVq4XCncClYwU(0bi4zXW;?ClYnR>2t^94;pnyp1e2_2D*@P(*l08z zZF;BJY>c|m#$uT^76Wcj{Pfs=Ex3P2{yvQ!f0HR`D@U-6e&xDGpL_M7fQ7k27|yYa zK_%q|!1)nQF_3vK4@luQJcw8?4q!Y%xyz<8hJAxye7lF2)2rwn|BZdjFq9%G2qZ;$4%OZ+8)n&-fF7sL!)&-(l_uU1A<*vmtOB0Rgy^J#i=vjLAm#sMF}8 zr}Z8MZbyoo%v$1s`0Rn~ylhbx80sfQzc1i*G zlSy|-9UL@3&%CRovz)6WZQ~7C|k@4XSR+n8Y%4g3Tm9Hcc|YxJj1@V!K!o!2xA*=dA{-MVX7Z zxZ>8YTLM=*_FB#ktSc>$63IG$ZNZg}cK!;6q;wY_JpLvunw(4dQnmKm<;C02pFcR> zy1?~7QOfCZIB5JYlht0<_R5nY(SK}qFRb`nZ>s{O)D)s)E1dpJ6A)zkk7k2v<`K&|9b%Itvv}MysDW#wK30^t)t#SzlHk z9v-Ur{Hi*i!1&>-eOMmXm0f#Bn1Sm&-UWQQrrDK?nNA3bo`%qO^w#yt6 zgUuKkxYHS4#;IQYOR8S?E^G&T0=$0;y+Q`wO6p8Av{2@n-wn-$Jra`P$PLk&m%##; zKP|LYo3|D`+csvAS_koRFG$v;v zZ`v;Ee3KL~BYy(+MZmN_;sK3LP|b$C%%m|L3cY7nJpaq!3bmPwz`fGuLJhBV1^G8I z%70Hq!ym})Lg#VL>qy076?M#9#_ZcMZ)D6X9)mn`X%-7nKVsB=XD!^jvcV*R^YMkc|)FRfN~_9QKZgudk;S27iIm-6w|sLc}3OxYN7%;WrP% zuCHDEgYL2`jtKF9aHR=<-$?kD6HdnD7dcM}kxu1Z#SuTvZ?C1Z`B{{Q$a2r;Vx~Od zDHU4CUrT+)Qx9qVDM(sY_iy>urJPbJPUWoPJUNvU`uAu0_bvTBW?3j)%KE~FKNKi}j^CZ+g&L&OhZ;%@oM-od4;G(B^p${sR)g*|aesn+@G{`d#F9>Pnu{SWgLN|>f%C#? zo)<>^?lkAQ2+lZ8^CI{l3`sTg|AnQTP4LbsBhbWaXb>rAE$2!syM;b(VRT0AFN8mf zjQ_})FyvV3>pHwzng$DfwKNq53MA4N?Rf@Md&V!e9+yo+em%hIL>EJ55PE!8Hc^|( z!he;lFk39!$`*nuB4gC=L`FX}w#jN!nL+49w5P9iKnI-%v#camp!*!BNb8JqQ&F6g zWEWP0J~uCvor3mt!iHZn?NWB1bm0jK4RB%`J4%e3jm-W+oD;*OYqow#F&aBfC_i zN_!H1$+<-K;Se9F(NI6vzkvFC?bfv|i(oY|hksPwSA_egw3eb)3F_8KoIodbKvN;M zRQZB#aVAJ=$z(i~#|pWWY|1bxJq$5VGH2|F9ZNhyT~P zXr8rC@c}gai)Iem6B^>ED^#_kgA@Nq_SRu=hHm?GZcWM!6gEO^c*7AJFvs@WPVfde zqhQ4y$rbl2aJ1Y;6|B7CrUKMPJEo6_#|tv=5|v)!3Yg+0Ep8U4a-t%Df}usAs#9|+ zb73X7^w4wF$|Cs=l%@nR<6Fwt5Dz;$F3vjRYK9iiC1CIA2XnJs{+`KR zt5Gm)&p9(6+q@wt9hsN^=HRXW2ItsW`%Nb}MVFI}H5~zDldClwe*(@6-E!vQ z_*o1(5wl}@!fz+cUNTmG$N!wLBVp6!E@2txOWYjy1Si_h^HTUG_m9jl?wH(PnPJ>3 zx&O`#d&NDKuY%)N#-V+41$1A{u&-Y8oxl!zm)CM13@#o(^oJxuAUbn^Pb;sLny{`AM*STeTt_5nE<|T%kBh~}5 z!e#cBRAJ~`F&NF%e|RodHHZ; z?TiMbH>g5Ug`JAmA^lMF^1@r|+izLZnX1Xud|Wkz)+{*Z8r$5Nai|ZYgwqUNlVu~{|AihMnp+N|WZKgtbNns5448DATZo_fLQr7F%z5EK+}i2XZpZzR^h}J4BouRi zg7CG&%J5xZe=z4@yM26e`1!Eyuo-hY9efTakwfW|XJKTo)Z4L}vPbI{pc%1@JZL7Y z;Do!`@ws77)NBoUp`(mZ_EJk_-e@btvQBLk9FheWjMK; z-#1}ziFT3YP+2Vz*xX<{*>!vJQmI#dPLfIkl{CNaf6%YnmHktqjsxQ0uALNYFQOpU z=OXMDeyO7nLN?}?AmjV0z&2EXJcfm{6y3oi?;NI zER`T1e`&kd0jZ03=rTjo*H#a@M7!WzGh>gfn-y^s7G900bjLiths8c(3A7JiIY5IS zm;24g8r|i-<6#?D`KXnMS~l{j8W`p5@9q8IuvI>OMe%!U;}N=k@I_n^1^Cv>PXaqB zH=V*Ag?Uewcy+h_gLFflcr7Tpx$pTg;&I@6f83`hJ0p{C)*;z_sk7}Y=ZKMXhYWk@ z4j2Tx;||yZ+YY}Q*hcu>V44k@@fvUN#}mHf>)}bE)A2bs@Lf!N7eY`h*{`JNh>DIy z(Xl8x7DdN)(FQx}6Xe8H07Kx!*m}zun+J(8qH~yrE}$Pq71hNU?MbdR1_HxLHJ498 ze}RFXp7>V-ui!D;gioQ}s1C!Vg(woO6#2>^=gPUDrvu)yysI+vdgIxQt14$8Uau`{ zQ9d5GCG%&HnbtUyN=cC>92lf2c@sB`Hj=E-Mj9mTxa0TQX{{f1g46(1i)_j$OKIB) zSX-BzslbhVrG2AK1#S#e0eYHSBLM}%f14lyT}R|ipTul`n1#f?ZcP9E6j@Zz)xk=^4p3m8(m&%ADWKf6&?a zb46BlL#w=@GG%G0Rim}lveth3=JHkPo}G464Rrb0(uecGtbY%>;xpy$%5rzHT$!r0 z#9dY5u3ci(U-YB+x$^3=ygHW0)0CE0SEbeM(&9f0N)lxRI55J%aD_i`I0r>TAQBuH z^aql>s40@(EZ{&CkZvg8wL$+{f0Az~;I&!6YuSQ$a<7xbtYq%EAo!~M+f$>9p(`G` z@^*RG^9w7~lXb311_)?bO<-0;f#9)3vp6>a`IGQ+<4VMtr#~tmeGV7amknglK96Ms zR}9;U8HLN|G76Uk8OcDEk%C{y+X{-#Labq)h7N^(`~CS<6Uea7Xz?!Ke_3Nuz;Ofm zhtM20sTPRpC!%wGkvi6?VZ{8H3Wu+NBUSvJor>`MaubAFjD?mMyQ!Vy^Rg*-Z|*(b zWTlxIxlyPYd!p!D1R240n7IdCKO0~QIZLdGoY1UsK9yrcjxrE<0Ynv9`j!k7r{nkM z$h`(}!BQl0HB$f|9}?;wbGcH)Cz ze`g22(NE3+LJSY-#HQ;yW{U|&-Rw~US>Xx}R;&{1nlLDu|K_#uf5f?`%J}_wE1S1I zO6mu}9@&!a85KE(Qo8+!)JH3;58)&n3}QNt5)*&8d9*(8OQgVDXXS>myoNB12PR~N zfa>sj2MNdL;5+{TB7?#1x9#>S``!;p2ga(K=N2jxUo|OfbnGX9M`q)beB+bNjZdC!Ji0#&N9n+rts_QambV}#Q57N7LQKLY!f`h_eFzJB3M>s> zVg{!WJjCF;@)jp-gmb(kK4C+Q@0Z0RnlZ%p%HjvGts0?ee{9=GxTt=JP@GA(&Wp#_4jwn5TuD|r;pK8@#-ZtS-AxLv7yqRb(} zXOoq<>7rtU5TtLCe)MIEJv&84Jn^NwTbojmsF}Qtku~YUhmi5ixQ{7I@zel$At zo|b1A{-qql4O!C1OO-eDotj?6Lk~5@3mZKF{Gm)OC z=!Dix5eEueO{a*xCVxH0-YJX(GfA3Y|9JF5MHx2nAzF;mJaiitX zQ#9}veOx*S*tbFKTbveo+0EQ+d^QPJWGia-ev-=*gowJ=b`$iUy;pl#Nzi-tUhT(! zz*hsm_V+cE{GNxWZXj?HsE%EkcFgd2GtP*iiE4SZfdIe5v@S|hFu8eWA6 zuyfblucn>{ds6(7q6SEOa{COQtkvQ;i9enle}zH)3(oG=wd-C-kNfQ98jZmi2b3uO zjYd8yh)jNJ+``9eU87x)E&x^n$p5<*EaKIFgw>?;_|y7HeM45?*ZYb*;Y({!uxss7 zq-aonDfV=uGEq5@Mm*l+h9O zt{d&KE%86kVVZ>eEi|26(3ODg*?+eqKu3vTrjk=u20QY>Jc>^QG7Un6a(Ata9-$`l z0sl3L(Hqv)=rD@7gH#Ib4*K_>$7DCpjt}4e>+sVbzn-6be%t(MZ%+oiJv~2r`!FZ#kf&Kd#~~6&HeP3`v_wwS7TtB*%9R9ChTm`I*|v6`+sWwOaMC; zU)Jg|79QlGG;Vn>WHEJ&RYC(=kVAahl2qD^>Vx>($>?O)!RDLqijT;bW_$8 z1>M%=GYZu~{mazFM7M}H==_{@pnKzVU@0S3Yt0+pp6wYX>*K>UfTjD=g_V(2(D%`o z1Xh)!yt8~Km}A;!=`#iPbbo=jqCl$)K{dfaKyx`ABW6M_g$NG{XxI5%#I(ufBEo|L z+I4?tr*E`hFsB>|%i=*Qtbf5N_IAplHqbbeJ`~`egzOL3n)fs1;tWuju`C~-nV9-Q zJvCm;WC6Jpn$_7Ki{XIhbs3IeP$srFw>$-%GAm2L&G87c`z;mHU4J0jC+2>pWwrqe z_7=GeKqzDCI_`>4N&5VR5|%Weq#-a4#S5>Hn-U2xoo1>m0Y~QIrR$1tm#L-XqF|#E zlt8hbu`Xu1A)lcw&d41a@s6ZR1kvY4oF`o?uX*@9dak^5^S{8EY$`3YVy)^ZO%ExMzp63^PhV zeygEqp4Br?et%^Lh^K%l+k?JaTP^8jtKT#0{5)q|2?O!6(_2vmQ1b?HI1vj`X0E0+ zio)9v7f-MC62y#E#wwYTl#jUBjthZg7VQ?Un|e7GF$m)NxH&PBtT*?MiZDh`9w^X! zbn(alw;+NIOkvP+bU{wjv8(KK{%)NSxd)0R%XZj4N`C-QOY11g>Xx6~je?@yW^pTc}{JwPLS1RJXmJF{26RPFpuCueVJtW=%mYceEtS6a-R%rK@YG)8t6*Uc{LBma1&f2^o>h?#6V&N_=$hn%VO8tgW6_Xz$oXoa=^|j62wB?$H)Ng6Ikf*Yy2ANjE zubiN!%^Y{L?C+mGye}f}bSZf#v1TFJPk=%ec*jjlL&MzB?Dm@*u`6O@P9e{7Xn*@g zi=eSACI?24cAuCz5VwHB1{nV{1|7lY{3E+`$p+GV@S^s$uP^h-bga{ANT zvr;kc`fbGHk#oV6ykmHQuWn1nT~vA z5B~PIzwPr}UfP)R0Z$+p80?ya*e=fz08wTM3D~aew4MPO2y1l>bPhVZrGKG!x>@_x z8J9M7O1FR`N^eMTG|XU1LWm>=K_-q+US$;76NVB*2sSK?BJJJ)ePNH{TnWG@%II%+ z)Nc&&<$NGQykh)NembC~jYve>%bWfyjeG~%@RB9j>&f+E{TTme_-jBi2%pBR>)3TT z^S-8Ta(ItIIurIv0I#GSJAc0rLG)2%H0^wzq4fT-?(N|(rxdWQZ-HC0lMQR(tLx|4 zn{?)gogZyoL|rRx8i$R8zJf8lzXh1ym}; z0SvVwUxp-%5l-Bq=pP=SWG1P|4i-(OMTOBOY9yVfxvMaASHX}{41X=ToM)Ne%u-wn zOYg*BO|A1jh^J~vM%I!{wF4`)Hj{WzK9HIz&hc$bj)uT9P56q9{3|v^NBj>DqbIJ? zgjQ*yS80m2k5h9sM)@NR7jMy>6e4(Y{us-ak*DibQhZa*DmnkCT;|p<$LMuaHgs%$ zgi*a_T(cTkTcT4X7k`hBm?Z*nL6cJLC7(2XjK?sNF{y_XlYHn%Z2<~g&$6zcsR|23 z?JW;4z=FwanRPoD>PIrO(|4G3j)DCeTk0T0bLzZWLrCPMPY5eLJR~B70jFLKc0p3Jblx#c3L&+@UVp=#czy zN;(&zFlsT+Lpg}*rTda3uu7tcbtZvmr^RiAo z5&EcZj_D~^36F35SRuL?-|ZhlD5@1IH_hF*P!Z$HQCu?O&$0eCm8MC2zewxBv|EuN ztp%T%@i~UiTlKks&#C?dN;xpT7LcjGpdsDPqy_EBuZ^RmMb2|3$&?Lz>CF|J#>#q- zCG`6m0Dtj}e!@0S58-0dM=N8!Segm4aV!n}SQ8af8y48JLP^3geRv2{zbY2y8>w$K z9@0S{wkl^y-Tx7~=r_XoZa-2^({|wBk@+B+P zs?Vc9mpq-NK&Y7Ic`5ymQyxu6=mq(J_0n$lJb!K8D&qsLqpvl_jC`}&j~{-0{qgJB zFCRaB_*f4J8_O?oX(8dm`_CtD-($g_PCk9A3z%1Ft49^)ZczS>NkjxwZqF%j^A7T zYJcXTtJGY;E6dGD+}$9EJ3F2xC`uvVcBhS^-e}uXhXVWN9{tVq!*mPf z_vB7J%@lXKv3KH^>!N-5cLCF^eL&F4 zqXP-a+|G`hf-(rbS=a!&7H-%qfU~#Ooqv5Y8_`I%#2NMTFMQ%W`qeiuJ;rL~nH~|~ z_kV}OLbW)3EHywQ?})_sWdgpw)Fje+dqPVTB-kvrj?>feS`IP(i2h%3&JE4JkbnXPN0p6-;I#}d6qa(^X{ zGaiwr6Gqr|lEEUXt{cX~8?{`Y%sNRg!RVd$H2nG!T@Y@=g=&es?}V_r9ZKtVBrAAB z&xMQP=R))z$5ooChE`Ca_YygcKt$~pR|}V9nPxNb#7G2zkfszOYg2OQG=s|i6z>{C z*yK71gqPV{!lD>?Fqw2`%Y{j%-+vaiw_z`9k+}u@+}9C$tF>p{`VIQBvM{hd^tbX9 zA}`z?@PL1}$G27f6~_nl+iGjMSj?vIoAX!c&d#$!c;Os*>l(@J1VD!lgWt?jk%{rL z#p!5XLw)NS-9F_W8O9nnu~?32=QCdcXaRk&i(?`<7)&fUJ8Y?sV>Up$i+?ke3h9UH zTcyNcpNISIs=lhOSa%J7);#`WjUEeY0&rVTrzqk(PqJ%nJY<^R>Kk~&HA$qN6#{|y zhOPrm?QE7}==oa-<2dY>qx0At@VMsk1TL@7oOOhTZs<5>@oklhum90q@9cyN@#LKo ztV>VY)F=ge=gauhtPflawtuHQBisOE>|O9}@5=6D?hSgl%!})DH-ONEyaP9I2X3u9 z@XmTpxGezuI(ZB1_nz5}aUvyPwoVIQI20&jz!TwBeU67c?HD_WnP9OJb!sDwhnTmKn22&?M(|}Wq{13)--3xCW}ezZ9*AyC9V&vNL_p`Ds8sKB{1)NmlJOz(*jB)ouTvNX zrqpIZFC z!x+5}JUl!JW17(ktl$JJH(=9M`;7%VbCg61<6JQefU_3y9MD&FraUZjj1VBDtu!XH zND{AU1y%#0e&ZH@0eBZ9yI<8)wuY@h>jMvgV)%`haVT8ay}+^gDQDs3?OFEl5N10& zNbRNO@E{3>o_`_i)?g?iLx?;{p~tdhYBWJ7ZNgDa*$n{BC7&;h#pO2WcT zFoq)iN-++i026hQyHL3;m3tA?B@``UMbzD4bm8k6qlW7X(nkA2-xu=xg3-vn)Nc@7 z^W73j7mx%98n=xBU3f!uA*2cQF)GV7%y^l_pu1?|Z-4yDD5}9i_*s>`Z;H^$EKT~z zfyVdV#_^!Iw3)LpJmwaV^KdXjaV(K8%N?Ahj-C1pslt36LHKM8*4D?JrMyq$Wbs=l z9t^^TVACv&&#P5YX2CT&4tyFNq6dMTQ+%3$#!SejWz{4OHQ3Y?0NfHC?iyVavbXU= z)1XLc>3<|?>txY!N7=dZ3yj0N%$H@0E3M*aP6Z%Z!72j0&W)26Hsx%C;_PAfb1awM ze#K?yDO@5?@{25~e~Sb+0F43o)hk9`oGlf6ibUFuNrtZlt_6c$Bn#!@vdB8GUz#@_ z(0OUZ0dm(cd@nB2c z)R(L3p1OO+&d__!iruj+f8a%if9*f9&H^T zG=ElccDcp?V<#A9j)$C+E&K%4R-*cysJl6f&yyNHdTD z2A?qS0RLQaL4iYd8@GwsR8O%HJ`qRr1;g+d-xrQ3ZW<;b$|NdWW>Goe zq|RYf=BcX+$vPmJ(<_G&atT=FG+#c=7jE2YF}P%;pWUIj)Ewc%!!50wpb-Hg(SNVK z<^Bz}VGiFee4z?o@WP4=xZ^(S0}93k)qj~LpQLR5TY9$}TtA_~$40n8Y;Q^f%$_V*ZIybaJ`85@Lr(r>8vCa(0>7c3gh_ z07v=>M=hm$%pbXs|A~3D>J0uY^8|xq!f7j*cuRA8&J@pK7~Z_9p`$v$4Sy`fqZ)=w zk+K9dk3xe-sI|P>$>S8EPqn3>mKtlhsYkn@!SWAy`RFnH6rq^ABa$7^;bEG=F z@@MD`XcBM68i<>$?91Xib`qa?GjSL1M7VJ?#6;NR+Dr_n3U(49ZIml9rV?W+VFjvE zFv*rFFOO~-Lu3M|ylF$U{OV*^>`)dB6~d7gzl_j8Nq*uBa8nZ(W(&i8!d zc~#jk4RDM{awhDTmh3jiQQXL2%oCtS%Z&+hLPEuT&5_?y61>d!zQfk_%=4_X zQC@5e-K`v#WMM3c;)|Wt*a(it?8SIDalkXA*BL6SeT0zTcD1 z!$Ke0%{!v;sJG=7LVu0c((c66Vy`?b=p;9AA4KqC5}!NDe;eC%5Be|ElT)2C5t3Bi z0HIRPU8=|^r7}+%l~U&QEF%wd0Y80kZvv;wNpmE%uYZ~9Gw3>Yfn{=cpl)gk*;iBy z5cvzKpYDzi^JwV)707^fQiE@{ve|gK=mt`XX-z$)FM1ZIH-GXCQhvhSQ$tw~r%#%B zM$U_jEf!S@zq!9`Xt31VN zPJT$-^u?9rnKl311>nK}*Xy3wgHLMr!Ez4yQC+XFExf?K}#6tPtqi9 zMOl z%wg-BFJI4p`FQgA?T7dEm$e$}t!Nb=_Iis)wk9cC#9#`PEKjWEbb)o2X_M?0Fx!|6lRaAo zlPyz%hkw3uEkNExlGzA+ZOpG_NhDG7?E-Uq;eP$UTQ~|VTD)$^=6&C?alz%Ey=osF z%kcm0<(iQPCv(YaTi53kHj$g94dS;hqwMjUma->bR$JbM-24F$fL>}5?)bfbG#R<( ze%7?ahOJndtTl}&rO`1~rpVV}GpaW^FW%V0a@FW`@pzQ@Z*96cd1h?Hy)c`cQn+`ro#cLvf;ydtON$fW)vE30b+X{kd9tDv zCw{8E7+**C{qPzF4JVKD*2+#&gjC(q$E3@9cvAlnpCN_`GX}yBwq3v(dSK!;PB8cr z42B1RLVKDSUqa6?dGL0aB0miAM0i~ieSC&Yd&(l}wao|!LO)L-k#)UgUQ(R_@7YAX zjNp<+U;2P4S9q4ZTJ8OCgo9^5Hi!v`l#R6%7{a5SCf5sC+o32Z^6kLt=GxEMHGiMM z+>xZs+=ok|Xy>rNT4+Cu=a;psjc1E^oRXOtr^Ib4vJZx5AN7S3+vplddp3HrQ9F$f zJP0VFO`D=lM0z#)VY@m3ScOjApqK>AEpzX|YC2x5*kEeM;3tj6}Yw}Wcv zAI917;C!cb6C!tIIAnsMy=06ui$58!Lq{O8uJcBE7HH@wK@AU>=znj3Ro$f6TugkS0Zqa?7_)wV(-3)bLJtHRA-*`D@Z$qE$_kO{IeA)@CCPT=pcZe4nk-4ddc-&`wy zf|>lBB6eORP@S`3CFEdBe9ud?!zI#6pg$L-9&F4P{_jPJKfISXA}R^qqtqs&2n<4l zkF6!)3G@yArZ>%!q2a^Jd|X2P7Jm!n7D;cK_-a^MNbQ4nP1uB0Ny~PFh2oZ z2~35Lp}A6ggK;kTyKsgD`Ll|?AINzKMe|(v<%8&WZunkjGom(CIfg;5=9Ea35YsV{ ztN|tB9T1H`Mf975f&k?%p%0lEM#VlAa7Qo!oyajet~+=!4&k#AOnwq8?EUz;9;T9iInI(Nz{DN%Os^AYF4&)NpL=Ei7PxC@uUe zliOYz7Jpg-8nw;E-!c>dv&`ZbTZ$9BYHL@M3tt>1AA#SS$Gnmzf@~mxl$D9sQ&8y1 z(>=S&LnpkW$PASqd8@rM*c`jTKzt=VkcZBC88V11q?j%!6r4wT=nOy!fMU=)A4 z{x>%+)z9<9ufc5;Z?S?;<33vjqcN9ZD2!Eb$Ukun<~VWf1t39nv;;%6CK#19!9c9Z zZ9RD<9u=5re_R*}o)g1+2mevq=Wh9a zeoJuIt|GhQh2vx&itmZy!U6@$=ax#o>Ez9oNUz>F__>{Jm<4~#g|0LAQ;1Xt>+9K~ zJ6&d7?VB)^o(aQTzx#)XH@*4P9WS8t_4ovpb3fI)(BGmk6tAO2BtCCMLYl;~_-600 zp)m72&-6>zAd}r<8v&`4`C=Oh2!6B7i=*eJC6gUv9075YI%B|895yLXcB&#a8KD$M;6l*BiF;iB?)A_eZzi`rl zP2MOo9N7e`37cf9DZC5nqzl{OlTKt8f4JFm!>D3w;OcL2+Riy0{}bZ8@CmV#x67E5 z8HNP>w437f5SjO!$^eP5(6z;M5uhO4(1!CJ?Pj)~wyh`MR7e$MNI9Mer&DQmrQs62 zUUH{wb9tv5+#gRoS3sJ~(;asu(sZ4WvEd><46aeh3QCAT6gb>?N$T?1&JKD*f7xu9 z<9@S<$#Df(*=*7c3plXL(pv1zLz&nJ4VF!AJ@3gW3Ml))dYda1sQn zUDD2vZ^?Xo8Q%gIx}s-{6h7AQ!5QmEQ9WniCE?K;?h%# z_8xES3IB4aAvT$!y~~n{yhp{1ZsQlcQ!P7dDNi60c%i1b=(V ztl}86S5ywZU&ZJNli+3=0(5AT{AN4>q?0*kDghspWM?A*T$6}r905C%rDx#*F_VXA zBnSlvtl{Xk#{rYGXe$AmH^r;rK7~JMIrUf;OGhU(A1@))ofW$gjnt&#B3@L=1$Pw81=-CYxS^VKa3cowM(cOU~9tlXuh>a8}qkSpuR%DliF%MC5!$pH3*MziFknZ z0~Os|_eTNF*G|@2XRQvMT8FxpleN}a+!>QRYp?;wlkICQ6ONl$fP85A^@$d3M0{xZi^QHO_2G?mWzkmxz3IXk^_k!S0C4*bfJ@KZyg!N{7hx+N&r0~ z%eLc6*Q)4B78T0V>6*e^lb~;R5f01v6M(4CvuodB?g(9C9$vF3a2o*ul#@hpC=F=I zM)#=G=%T0f9>r{vd2v7jL)x>uaqa;madp{=bghMfnT2bNlgooEVFG$`c}PFc;pcPu z`5Jz{xDwH-lg)D(3j|*?NMd7ol&Zjpv+;9n0Rr(clVEjM0SvRabszx(Mh27Gb}9k& jlLdE50kD%$cSr#WlbLrL0b#SXcZ?bc(DhDv*X02Kp6`4O diff --git a/lib/aligning_guidelines.js b/lib/aligning_guidelines.js index 3762a240..7805a609 100644 --- a/lib/aligning_guidelines.js +++ b/lib/aligning_guidelines.js @@ -5,7 +5,7 @@ */ function initAligningGuidelines(canvas) { - var ctx = canvas.getContext(), + var ctx = canvas.getSelectionContext(), canvasHeight = canvas.getHeight(), aligningLineOffset = 5, aligningLineMargin = 4, diff --git a/lib/centering_guidelines.js b/lib/centering_guidelines.js index 6509fdfe..7e262d93 100644 --- a/lib/centering_guidelines.js +++ b/lib/centering_guidelines.js @@ -15,7 +15,7 @@ function initCenteringGuidelines(canvas) { centerLineMargin = 4, centerLineColor = 'rgba(255,0,241,0.5)', centerLineWidth = 1, - ctx = canvas.getContext(); + ctx = canvas.getSelectionContext(); for (var i = canvasWidthCenter - centerLineMargin, len = canvasWidthCenter + centerLineMargin; i <= len; i++) { canvasWidthCenterMap[i] = true; diff --git a/src/canvas.class.js b/src/canvas.class.js index 1a98ee70..f804cca2 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -1,5 +1,5 @@ (function() { - + var extend = fabric.util.object.extend, getPointer = fabric.util.getPointer, addListener = fabric.util.addListener, @@ -14,41 +14,41 @@ 'mr': 'e-resize', 'mb': 's-resize' }, - + utilMin = fabric.util.array.min, utilMax = fabric.util.array.max, - + sqrt = Math.sqrt, pow = Math.pow, atan2 = Math.atan2, abs = Math.abs, min = Math.min, max = Math.max, - + STROKE_OFFSET = 0.5; - + /** * @class fabric.Canvas * @constructor * @extends fabric.StaticCanvas * @param {HTMLElement | String} el <canvas> element to initialize instance on * @param {Object} [options] Options object - */ + */ fabric.Canvas = function(el, options) { options || (options = { }); this._initStatic(el, options); this._initInteractive(); - + fabric.Canvas.activeInstance = this; }; - + function ProtoProxy(){ } ProtoProxy.prototype = fabric.StaticCanvas.prototype; fabric.Canvas.prototype = new ProtoProxy; - + var InteractiveMethods = /** @scope fabric.Canvas.prototype */ { - + /** * Indicates that canvas is interactive. This property should not be changed. * @property @@ -111,14 +111,14 @@ * @type String */ CURSOR: 'default', - + /** * Default element class that's given to wrapper (div) element of canvas * @constant * @type String */ CONTAINER_CLASS: 'canvas-container', - + _initInteractive: function() { this._currentTransform = null; this._groupSelector = null; @@ -129,7 +129,7 @@ this._initEvents(); this.calcOffset(); }, - + /** * Adds mouse listeners to canvas * @method _initEvents @@ -165,12 +165,12 @@ fabric.isTouchSupported && addListener(_this.upperCanvasEl, 'touchmove', _this._onMouseMove); }; - this._onMouseMove = function (e) { + this._onMouseMove = function (e) { e.preventDefault && e.preventDefault(); _this.__onMouseMove(e); }; - this._onResize = function (e) { + this._onResize = function (e) { _this.calcOffset(); }; @@ -283,7 +283,7 @@ var target = this.findTarget(e), pointer = this.getPointer(e), - activeGroup = this.getActiveGroup(), + activeGroup = this.getActiveGroup(), corner; if (this._shouldClearSelection(e)) { @@ -364,7 +364,7 @@ // performance. var target = this.findTarget(e); - if (!target) { + if (!target) { // image/text was hovered-out from, we remove its borders for (var i = this._objects.length; i--; ) { if (this._objects[i] && !this._objects[i].active) { @@ -374,7 +374,7 @@ style.cursor = this.CURSOR; } else { - // set proper cursor + // set proper cursor this._setCursorFromEvent(e, target); if (target.isActive()) { // display corners when hovering over an image @@ -384,14 +384,14 @@ } else { // object is being transformed (scaled/rotated/moved/etc.) - var pointer = getPointer(e), - x = pointer.x, + var pointer = getPointer(e), + x = pointer.x, y = pointer.y; this._currentTransform.target.isMoving = true; - if (this._currentTransform.action === 'rotate') { - // rotate object only if shift key is not pressed + if (this._currentTransform.action === 'rotate') { + // rotate object only if shift key is not pressed // and if it is not a group we are transforming if (!e.shiftKey) { @@ -444,7 +444,7 @@ containsPoint: function (e, target) { var pointer = this.getPointer(e), xy = this._normalizePointer(target, pointer), - x = xy.x, + x = xy.x, y = xy.y; // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html @@ -468,13 +468,13 @@ */ _normalizePointer: function (object, pointer) { - var activeGroup = this.getActiveGroup(), - x = pointer.x, + var activeGroup = this.getActiveGroup(), + x = pointer.x, y = pointer.y; var isObjectInGroup = ( - activeGroup && - object.type !== 'group' && + activeGroup && + object.type !== 'group' && activeGroup.contains(object) ); @@ -494,10 +494,10 @@ activeGroup = this.getActiveGroup(); return ( !target || ( - target && - activeGroup && - !activeGroup.contains(target) && - activeGroup !== target && + target && + activeGroup && + !activeGroup.contains(target) && + activeGroup !== target && !e.shiftKey ) ); @@ -508,15 +508,15 @@ * @method _setupCurrentTransform */ _setupCurrentTransform: function (e, target) { - var action = 'drag', + var action = 'drag', corner, pointer = getPointer(e); if (corner = target._findTargetCorner(e, this._offset)) { - action = (corner === 'ml' || corner === 'mr') - ? 'scaleX' - : (corner === 'mt' || corner === 'mb') - ? 'scaleY' + action = (corner === 'ml' || corner === 'mr') + ? 'scaleX' + : (corner === 'mt' || corner === 'mb') + ? 'scaleY' : 'rotate'; } @@ -529,7 +529,7 @@ offsetY: pointer.y - target.top, ex: pointer.x, ey: pointer.y, - left: target.left, + left: target.left, top: target.top, theta: target.theta, width: target.width * target.scaleX @@ -651,7 +651,7 @@ path.push('L ', xPoint - minX, ' ', yPoint - minY, ' '); } - // TODO (kangax): maybe remove Path creation from here, to decouple fabric.Canvas from fabric.Path, + // TODO (kangax): maybe remove Path creation from here, to decouple fabric.Canvas from fabric.Path, // and instead fire something like "drawing:completed" event with path string path = path.join(''); @@ -690,9 +690,9 @@ * @method _scaleObject * @param x {Number} pointer's x coordinate * @param y {Number} pointer's y coordinate - * @param by {String} Either 'x' or 'y' - specifies dimension constraint by which to scale an object. + * @param by {String} Either 'x' or 'y' - specifies dimension constraint by which to scale an object. * When not provided, an object is scaled by both dimensions equally - */ + */ _scaleObject: function (x, y, by) { var t = this._currentTransform, offset = this._offset, @@ -722,10 +722,10 @@ * @method _rotateObject * @param x {Number} pointer's x coordinate * @param y {Number} pointer's y coordinate - */ + */ _rotateObject: function (x, y) { - var t = this._currentTransform, + var t = this._currentTransform, o = this._offset; if (t.target.lockRotation) return; @@ -759,8 +759,8 @@ else { var activeGroup = this.getActiveGroup(); // only show proper corner when group selection is not active - var corner = !!target._findTargetCorner - && (!activeGroup || !activeGroup.contains(target)) + var corner = !!target._findTargetCorner + && (!activeGroup || !activeGroup.contains(target)) && target._findTargetCorner(e, this._offset); if (!corner) { @@ -795,7 +795,7 @@ this.contextTop.fillRect( groupSelector.ex - ((left > 0) ? 0 : -left), groupSelector.ey - ((top > 0) ? 0 : -top), - aleft, + aleft, atop ); @@ -803,7 +803,7 @@ this.contextTop.strokeStyle = this.selectionBorderColor; this.contextTop.strokeRect( - groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft), + groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft), groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop), aleft, atop @@ -811,7 +811,7 @@ }, _findSelectedObjects: function (e) { - var target, + var target, targetRegion, group = [ ], x1 = this._groupSelector.ex, @@ -827,7 +827,7 @@ if (!currentObject) continue; - if (currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2) || + if (currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2) || currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2)) { if (this.selection && currentObject.selectable) { @@ -840,7 +840,7 @@ // do not create group for 1 element only if (group.length === 1) { this.setActiveObject(group[0], e); - } + } else if (group.length > 1) { var group = new fabric.Group(group); this.setActiveGroup(group); @@ -856,7 +856,7 @@ * @method findTarget * @param {Event} e mouse event * @param {Boolean} skipGroup when true, group is skipped and only objects are traversed through - */ + */ findTarget: function (e, skipGroup) { var target, @@ -895,7 +895,7 @@ y: pointer.y - this._offset.top }; }, - + /** * @method _createUpperCanvas * @param {HTMLElement|String} canvasEl Canvas element @@ -904,13 +904,13 @@ _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'); }, - + /** * @private * @method _initWrapperElement @@ -918,7 +918,7 @@ * @param {Number} height */ _initWrapperElement: function () { - this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { + this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { 'class': this.CONTAINER_CLASS }); fabric.util.setStyle(this.wrapperEl, { @@ -928,7 +928,7 @@ }); fabric.util.makeElementUnselectable(this.wrapperEl); }, - + /** * @private * @method _applyCanvasStyle @@ -937,7 +937,7 @@ _applyCanvasStyle: function (element) { var width = this.getWidth() || element.width, height = this.getHeight() || element.height; - + fabric.util.setStyle(element, { position: 'absolute', width: width + 'px', @@ -949,16 +949,16 @@ element.height = height; fabric.util.makeElementUnselectable(element); }, - + /** - * Returns topmost canvas context + * Returns context of canvas where object selection is drawn * @method getContext * @return {CanvasRenderingContext2D} */ - getContext: function () { + getSelectionContext: function() { return this.contextTop; }, - + /** * Sets given object as active * @method setActiveObject @@ -972,13 +972,13 @@ } this._activeObject = object; object.setActive(true); - + this.renderAll(); - + this.fire('object:selected', { target: object, e: e }); return this; }, - + /** * Returns currently active object * @method getActiveObject @@ -987,7 +987,7 @@ getActiveObject: function () { return this._activeObject; }, - + /** * Discards currently active object * @method discardActiveObject @@ -1001,11 +1001,11 @@ this._activeObject = null; return this; }, - + /** * Sets active group to a speicified one * @method setActiveGroup - * @param {fabric.Group} group Group to set as a current one + * @param {fabric.Group} group Group to set as a current one * @return {fabric.Canvas} thisArg * @chainable */ @@ -1013,7 +1013,7 @@ this._activeGroup = group; return this; }, - + /** * Returns currently active group * @method getActiveGroup @@ -1022,7 +1022,7 @@ getActiveGroup: function () { return this._activeGroup; }, - + /** * Removes currently active group * @method discardActiveGroup @@ -1035,7 +1035,7 @@ } return this.setActiveGroup(null); }, - + /** * Deactivates all objects by calling their setActive(false) * @method deactivateAll @@ -1052,7 +1052,7 @@ this.discardActiveObject(); return this; }, - + /** * Deactivates all objects and dispatches appropriate events * @method deactivateAllWithDispatch @@ -1070,22 +1070,22 @@ return this; } }; - + fabric.Canvas.prototype.toString = fabric.StaticCanvas.prototype.toString; extend(fabric.Canvas.prototype, InteractiveMethods); - - // iterating manually to workaround Opera's bug + + // iterating manually to workaround Opera's bug // where "prototype" property is enumerable and overrides existing prototype for (var prop in fabric.StaticCanvas) { if (prop !== 'prototype') { fabric.Canvas[prop] = fabric.StaticCanvas[prop]; } } - + if (fabric.isTouchSupported) { fabric.Canvas.prototype._setCursorFromEvent = function() { }; } - + /** * @class fabric.Element * @alias fabric.Canvas diff --git a/src/static_canvas.class.js b/src/static_canvas.class.js index 78118ed3..9f5e40cb 100644 --- a/src/static_canvas.class.js +++ b/src/static_canvas.class.js @@ -420,6 +420,15 @@ return this; }, + /** + * Returns context of canvas where objects are drawn + * @method getContext + * @return {CanvasRenderingContext2D} + */ + getContext: function () { + return this.contextContainer; + }, + /** * Clears all contexts (background, main, top) of an instance * @method clear