From d93f91febcb384d5ddffee47cd2f2eb9fa2dcc25 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 31 Jul 2016 12:21:52 -0400 Subject: [PATCH] Start to cleant setSelections (#3119) --- dist/fabric.js | 269 ++++++++++++++--------- dist/fabric.min.js | 8 +- dist/fabric.min.js.gz | Bin 66516 -> 66713 bytes dist/fabric.require.js | 233 ++++++++++++-------- src/mixins/itext_behavior.mixin.js | 52 +++-- src/mixins/itext_click_behavior.mixin.js | 24 +- src/mixins/itext_key_behavior.mixin.js | 158 +++++++------ src/shapes/itext.class.js | 33 ++- test.js | 3 +- test/unit/itext_key_behaviour.js | 228 +++++++++++++++++++ test/unit/object.js | 1 - 11 files changed, 693 insertions(+), 316 deletions(-) create mode 100644 test/unit/itext_key_behaviour.js diff --git a/dist/fabric.js b/dist/fabric.js index f67e805f..e4be2a37 100644 --- a/dist/fabric.js +++ b/dist/fabric.js @@ -12110,6 +12110,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * Return the object scale factor counting also the group scaling + * @return {Object} object with scaleX and scaleY properties */ getObjectScaling: function() { var scaleX = this.scaleX, scaleY = this.scaleY; @@ -21757,12 +21758,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag */ setSelectionStart: function(index) { index = Math.max(index, 0); - if (this.selectionStart !== index) { - this.fire('selection:changed'); - this.canvas && this.canvas.fire('text:selection:changed', { target: this }); - this.selectionStart = index; - } - this._updateTextarea(); + this._updateAndFire('selectionStart', index); }, /** @@ -21771,14 +21767,31 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag */ setSelectionEnd: function(index) { index = Math.min(index, this.text.length); - if (this.selectionEnd !== index) { - this.fire('selection:changed'); - this.canvas && this.canvas.fire('text:selection:changed', { target: this }); - this.selectionEnd = index; + this._updateAndFire('selectionEnd', index); + }, + + /** + * @private + * @param {String} property 'selectionStart' or 'selectionEnd' + * @param {Number} index new position of property + */ + _updateAndFire: function(property, index) { + if (this[property] !== index) { + this._fireSelectionChanged(); + this[property] = index; } this._updateTextarea(); }, + /** + * Fires the even of selection changed + * @private + */ + _fireSelectionChanged: function() { + this.fire('selection:changed'); + this.canvas && this.canvas.fire('text:selection:changed', { target: this }); + }, + /** * Gets style of a current selection/cursor (at the start position) * @param {Number} [startIndex] Start index to get styles at @@ -21857,7 +21870,6 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag if (!this.active || !this.isEditing) { return; } - var chars = this.text.split(''), boundaries, ctx; @@ -22817,6 +22829,7 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag * Aborts cursor animation and clears all timeouts */ abortCursorAnimation: function() { + var shouldClear = this._currentTickState || this._currentTickCompleteState; this._currentTickState && this._currentTickState.abort(); this._currentTickCompleteState && this._currentTickCompleteState.abort(); @@ -22826,15 +22839,20 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag this._currentCursorOpacity = 0; // to clear just itext area we need to transform the context // it may not be worth it - this.canvas && this.canvas.clearContext(this.canvas.contextTop || this.ctx); + if (shouldClear) { + this.canvas && this.canvas.clearContext(this.canvas.contextTop || this.ctx); + } + }, /** * Selects entire text */ selectAll: function() { - this.setSelectionStart(0); - this.setSelectionEnd(this.text.length); + this.selectionStart = 0; + this.selectionEnd = this.text.length; + this._fireSelectionChanged(); + this._updateTextarea(); }, /** @@ -22965,12 +22983,15 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag * @param {Number} selectionStart Index of a character */ selectWord: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */ - newSelectionEnd = this.searchWordBoundary(selectionStart, 1); - /* search forward */ + newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */ - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionEnd); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); + this.renderCursorOrSelection(); }, /** @@ -22978,11 +22999,14 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag * @param {Number} selectionStart Index of a character */ selectLine: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; var newSelectionStart = this.findLineBoundaryLeft(selectionStart), - newSelectionEnd = this.findLineBoundaryRight(selectionStart); + newSelectionEnd = this.findLineBoundaryRight(selectionStart); - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionEnd); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); }, /** @@ -23014,9 +23038,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag if (!this.canvas) { return this; } - - this.canvas.renderAll(); this.canvas.fire('text:editing:entered', { target: this }); + this.canvas.renderAll(); this.initMouseMoveHandler(); return this; }, @@ -23052,13 +23075,15 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag return; } if (newSelectionStart > this.__selectionStartOnMouseDown) { - this.setSelectionStart(this.__selectionStartOnMouseDown); - this.setSelectionEnd(newSelectionStart); + this.selectionStart = this.__selectionStartOnMouseDown; + this.selectionEnd = newSelectionStart; } else { - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(this.__selectionStartOnMouseDown); + this.selectionStart = newSelectionStart; + this.selectionEnd = this.__selectionStartOnMouseDown; } + this._fireSelectionChanged(); + this._updateTextarea(); this.renderCursorOrSelection(); }, @@ -23225,7 +23250,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag this._removeSingleCharAndStyle(start + 1); end--; } - this.setSelectionStart(start); + this.selectionStart = start; + this.selectionEnd = start; }, _removeSingleCharAndStyle: function(index) { @@ -23248,7 +23274,6 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag if (this.selectionEnd - this.selectionStart > 1) { this._removeCharsFromTo(this.selectionStart, this.selectionEnd); - this.setSelectionEnd(this.selectionStart); } //short circuit for block paste if (!useCopiedStyle && this.isEmptyStyles()) { @@ -23281,10 +23306,11 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag return; } this._updateTextarea(); - this.canvas && this.canvas.renderAll(); this.setCoords(); + this._fireSelectionChanged(); this.fire('changed'); this.canvas && this.canvas.fire('text:changed', { target: this }); + this.canvas && this.canvas.renderAll(); }, /** @@ -23575,7 +23601,10 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.isEditing) { this.__selectionStartOnMouseDown = this.selectionStart; - this.initDelayedCursor(true); + if (this.selectionStart === this.selectionEnd) { + this.abortCursorAnimation() + } + this.renderCursorOrSelection() } }); }, @@ -23602,7 +23631,12 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.__lastSelected && !this.__corner) { this.enterEditing(options.e); - this.initDelayedCursor(true); + if (this.selectionStart === this.selectionEnd) { + this.initDelayedCursor(true); + } + else { + this.renderCursorOrSelection(); + } } this.selected = true; }); @@ -23617,17 +23651,19 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (e.shiftKey) { if (newSelectionStart < this.selectionStart) { - this.setSelectionEnd(this.selectionStart); - this.setSelectionStart(newSelectionStart); + this.selectionEnd = this.selectionStart; + this.selectionStart = newSelectionStart; } else { - this.setSelectionEnd(newSelectionStart); + this.selectionEnd = newSelectionStart; } } else { - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionStart); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionStart; } + this._fireSelectionChanged(); + this._updateTextarea(); }, /** @@ -24051,19 +24087,10 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e Event object */ moveCursorDown: function(e) { - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - - var offset = this.getDownCursorOffset(e, this._selectionDirection === 'right'); - - if (e.shiftKey) { - this.moveCursorDownWithShift(offset); + if (this.selectionStart >= this.text.length && this.selectionEnd >= this.text.length) { + return; } - else { - this.moveCursorDownWithoutShift(offset); - } - - this.initDelayedCursor(); + this._moveCursorUpOrDown('Down', e); }, /** @@ -24072,8 +24099,9 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ moveCursorDownWithoutShift: function(offset) { this._selectionDirection = 'right'; - this.setSelectionStart(this.selectionStart + offset); - this.setSelectionEnd(this.selectionStart); + this.selectionEnd = this.selectionEnd + offset; + this.selectionStart = this.selectionEnd; + return offset !== 0; }, /** @@ -24081,8 +24109,8 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ swapSelectionPoints: function() { var swapSel = this.selectionEnd; - this.setSelectionEnd(this.selectionStart); - this.setSelectionStart(swapSel); + this.selectionEnd = this.selectionStart; + this.selectionStart = swapSel; }, /** @@ -24094,18 +24122,19 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this._selectionDirection = 'right'; } if (this._selectionDirection === 'right') { - this.setSelectionEnd(this.selectionEnd + offset); + this.selectionEnd += offset; } else { - this.setSelectionStart(this.selectionStart + offset); + this.selectionStart += offset; } if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'left') { this.swapSelectionPoints(); this._selectionDirection = 'right'; } if (this.selectionEnd > this.text.length) { - this.setSelectionEnd(this.text.length); + this.selectionEnd = this.text.length; } + return offset !== 0; }, /** @@ -24187,19 +24216,34 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e Event object */ moveCursorUp: function(e) { + if (this.selectionStart === 0 && this.selectionEnd === 0) { + return; + } + this._moveCursorUpOrDown('Up', e); + }, - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - - var offset = this.getUpCursorOffset(e, this._selectionDirection === 'right'); + /** + * Moves cursor up or down, fires the events + * @param {String} direction 'Up' or 'Down' + * @param {Event} e Event object + */ + _moveCursorUpOrDown: function(direction, e) { + var action = 'get' + direction + 'CursorOffset', + moveAction = 'moveCursor' + direction, + offset = this[action](e, this._selectionDirection === 'right'); if (e.shiftKey) { - this.moveCursorUpWithShift(offset); + moveAction += 'WithShift'; } else { - this.moveCursorUpWithoutShift(offset); + moveAction += 'WithoutShift'; + } + if (this[moveAction](offset)) { + this.abortCursorAnimation(); + this._currentCursorOpacity = 1; + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); } - - this.initDelayedCursor(); }, /** @@ -24211,15 +24255,16 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this._selectionDirection = 'left'; } if (this._selectionDirection === 'right') { - this.setSelectionEnd(this.selectionEnd - offset); + this.selectionEnd -= offset; } else { - this.setSelectionStart(this.selectionStart - offset); + this.selectionStart -= offset; } if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'right') { this.swapSelectionPoints(); this._selectionDirection = 'left'; } + return offset !== 0; }, /** @@ -24227,12 +24272,10 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Number} offset */ moveCursorUpWithoutShift: function(offset) { - if (this.selectionStart === this.selectionEnd) { - this.setSelectionStart(this.selectionStart - offset); - } - this.setSelectionEnd(this.selectionStart); - this._selectionDirection = 'left'; + this.selectionStart -= offset; + this.selectionEnd = this.selectionStart; + return offset !== 0; }, /** @@ -24243,33 +24286,28 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.selectionStart === 0 && this.selectionEnd === 0) { return; } - - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - - if (e.shiftKey) { - this.moveCursorLeftWithShift(e); - } - else { - this.moveCursorLeftWithoutShift(e); - } - - this.initDelayedCursor(); + this._moveCursorLeftOrRight('Left', e); }, /** * @private + * @return {Boolean} true if a change happened */ _move: function(e, prop, direction) { - var propMethod = (prop === 'selectionStart' ? 'setSelectionStart' : 'setSelectionEnd'); + var newValue; if (e.altKey) { - this[propMethod](this['findWordBoundary' + direction](this[prop])); + newValue = this['findWordBoundary' + direction](this[prop]); } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { - this[propMethod](this['findLineBoundary' + direction](this[prop])); + newValue = this['findLineBoundary' + direction](this[prop]); } else { - this[propMethod](this[prop] + (direction === 'Left' ? -1 : 1)); + this[prop] += direction === 'Left' ? -1 : 1; + return true; + } + if (typeof newValue !== undefined && this[prop] !== newValue) { + this[prop] = newValue; + return true; } }, @@ -24277,14 +24315,14 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @private */ _moveLeft: function(e, prop) { - this._move(e, prop, 'Left'); + return this._move(e, prop, 'Left'); }, /** * @private */ _moveRight: function(e, prop) { - this._move(e, prop, 'Right'); + return this._move(e, prop, 'Right'); }, /** @@ -24292,14 +24330,16 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e */ moveCursorLeftWithoutShift: function(e) { + var change = false; this._selectionDirection = 'left'; // only move cursor when there is no selection, // otherwise we discard it, and leave cursor on same place - if (this.selectionEnd === this.selectionStart) { - this._moveLeft(e, 'selectionStart'); + if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) { + change = this._moveLeft(e, 'selectionStart'); } - this.setSelectionEnd(this.selectionStart); + this.selectionEnd = this.selectionStart; + return change; }, /** @@ -24308,11 +24348,11 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ moveCursorLeftWithShift: function(e) { if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) { - this._moveLeft(e, 'selectionEnd'); + return this._moveLeft(e, 'selectionEnd'); } - else { + else if (this.selectionStart !== 0){ this._selectionDirection = 'left'; - this._moveLeft(e, 'selectionStart'); + return this._moveLeft(e, 'selectionStart'); } }, @@ -24324,18 +24364,31 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.selectionStart >= this.text.length && this.selectionEnd >= this.text.length) { return; } + this._moveCursorLeftOrRight('Right', e); + }, - this.abortCursorAnimation(); + /** + * Moves cursor right or Left, fires event + * @param {String} direction 'Left', 'Right' + * @param {Event} e Event object + */ + _moveCursorLeftOrRight: function(direction, e) { + var actionName = 'moveCursor' + direction + 'With'; this._currentCursorOpacity = 1; if (e.shiftKey) { - this.moveCursorRightWithShift(e); + actionName += 'Shift'; } else { - this.moveCursorRightWithoutShift(e); + actionName += 'outShift'; } - - this.initDelayedCursor(); + if (this[actionName](e)) { + console.log('will fire'); + this.abortCursorAnimation(); + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); + }; }, /** @@ -24344,11 +24397,11 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ moveCursorRightWithShift: function(e) { if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) { - this._moveRight(e, 'selectionStart'); + return this._moveRight(e, 'selectionStart'); } - else { + else if (this.selectionEnd !== this.text.length) { this._selectionDirection = 'right'; - this._moveRight(e, 'selectionEnd'); + return this._moveRight(e, 'selectionEnd'); } }, @@ -24357,15 +24410,17 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e Event object */ moveCursorRightWithoutShift: function(e) { + var changed = false; this._selectionDirection = 'right'; if (this.selectionStart === this.selectionEnd) { - this._moveRight(e, 'selectionStart'); - this.setSelectionEnd(this.selectionStart); + changed = this._moveRight(e, 'selectionStart'); + this.selectionEnd = this.selectionStart; + return changed; } else { - this.setSelectionEnd(this.selectionEnd + this.getNumNewLinesInSelectedText()); - this.setSelectionStart(this.selectionEnd); + this.selectionStart = this.selectionEnd; + return true } }, diff --git a/dist/fabric.min.js b/dist/fabric.min.js index 23cc30f6..bd3d2534 100644 --- a/dist/fabric.min.js +++ b/dist/fabric.min.js @@ -1,8 +1,8 @@ -var fabric=fabric||{version:"1.6.3"};"undefined"!=typeof exports&&(exports.fabric=fabric),"undefined"!=typeof document&&"undefined"!=typeof window?(fabric.document=document,fabric.window=window,window.fabric=fabric):(fabric.document=require("jsdom").jsdom(""),fabric.document.createWindow?fabric.window=fabric.document.createWindow():fabric.window=fabric.document.parentWindow),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode="undefined"!=typeof Buffer&&"undefined"==typeof window,fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id"],fabric.DPI=96,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",fabric.fontPaths={},fabric.charWidthsCache={},fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,function(){function t(t,e){if(this.__eventListeners[t]){var i=this.__eventListeners[t];e?i[i.indexOf(e)]=!1:fabric.util.array.fill(i,!1)}}function e(t,e){if(this.__eventListeners||(this.__eventListeners={}),1===arguments.length)for(var i in t)this.on(i,t[i]);else this.__eventListeners[t]||(this.__eventListeners[t]=[]),this.__eventListeners[t].push(e);return this}function i(e,i){if(this.__eventListeners){if(0===arguments.length)for(e in this.__eventListeners)t.call(this,e);else if(1===arguments.length&&"object"==typeof arguments[0])for(var r in e)t.call(this,r,e[r]);else t.call(this,e,i);return this}}function r(t,e){if(this.__eventListeners){var i=this.__eventListeners[t];if(i){for(var r=0,n=i.length;r-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},function(t){var e=Math.sqrt,i=Math.atan2,r=Math.pow,n=Math.abs,s=Math.PI/180;fabric.util={removeFromArray:function(t,e){var i=t.indexOf(e);return i!==-1&&t.splice(i,1),t},getRandomInt:function(t,e){return Math.floor(Math.random()*(e-t+1))+t},degreesToRadians:function(t){return t*s},radiansToDegrees:function(t){return t/s},rotatePoint:function(t,e,i){t.subtractEquals(e);var r=fabric.util.rotateVector(t,i);return new fabric.Point(r.x,r.y).addEquals(e)},rotateVector:function(t,e){var i=Math.sin(e),r=Math.cos(e),n=t.x*r-t.y*i,s=t.x*i+t.y*r;return{x:n,y:s}},transformPoint:function(t,e,i){return i?new fabric.Point(e[0]*t.x+e[2]*t.y,e[1]*t.x+e[3]*t.y):new fabric.Point(e[0]*t.x+e[2]*t.y+e[4],e[1]*t.x+e[3]*t.y+e[5])},makeBoundingBoxFromPoints:function(t){var e=[t[0].x,t[1].x,t[2].x,t[3].x],i=fabric.util.array.min(e),r=fabric.util.array.max(e),n=Math.abs(i-r),s=[t[0].y,t[1].y,t[2].y,t[3].y],o=fabric.util.array.min(s),a=fabric.util.array.max(s),h=Math.abs(o-a);return{left:i,top:o,width:n,height:h}},invertTransform:function(t){var e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0]],r=fabric.util.transformPoint({x:t[4],y:t[5]},i,!0);return i[4]=-r.x,i[5]=-r.y,i},toFixed:function(t,e){return parseFloat(Number(t).toFixed(e))},parseUnit:function(t,e){var i=/\D{0,2}$/.exec(t),r=parseFloat(t);switch(e||(e=fabric.Text.DEFAULT_SVG_FONT_SIZE),i[0]){case"mm":return r*fabric.DPI/25.4;case"cm":return r*fabric.DPI/2.54;case"in":return r*fabric.DPI;case"pt":return r*fabric.DPI/72;case"pc":return r*fabric.DPI/72*12;case"em":return r*e;default:return r}},falseFunction:function(){return!1},getKlass:function(t,e){return t=fabric.util.string.camelize(t.charAt(0).toUpperCase()+t.slice(1)),fabric.util.resolveNamespace(e)[t]},resolveNamespace:function(e){if(!e)return fabric;for(var i=e.split("."),r=i.length,n=t||fabric.window,s=0;sr;)r+=a[d++%f],r>l&&(r=l),t[g?"lineTo":"moveTo"](r,0),g=!g;t.restore()},createCanvasElement:function(t){return t||(t=fabric.document.createElement("canvas")),t.getContext||"undefined"==typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(t),t},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(t){for(var e=t.prototype,i=e.stateProperties.length;i--;){var r=e.stateProperties[i],n=r.charAt(0).toUpperCase()+r.slice(1),s="set"+n,o="get"+n;e[o]||(e[o]=function(t){return new Function('return this.get("'+t+'")')}(r)),e[s]||(e[s]=function(t){return new Function("value",'return this.set("'+t+'", value)')}(r))}},clipContext:function(t,e){e.save(),e.beginPath(),t.clipTo(e),e.clip()},multiplyTransformMatrices:function(t,e,i){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]]},qrDecompose:function(t){var n=i(t[1],t[0]),o=r(t[0],2)+r(t[1],2),a=e(o),h=(t[0]*t[3]-t[2]*t[1])/a,c=i(t[0]*t[2]+t[1]*t[3],o);return{angle:n/s,scaleX:a,scaleY:h,skewX:c/s,skewY:0,translateX:t[4],translateY:t[5]}},customTransformMatrix:function(t,e,i){var r=[1,0,n(Math.tan(i*s)),1],o=[n(t),0,0,n(e)];return fabric.util.multiplyTransformMatrices(o,r,!0)},resetObjectTransform:function(t){t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.setAngle(0)},getFunctionBody:function(t){return(String(t).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},isTransparent:function(t,e,i,r){r>0&&(e>r?e-=r:e=0,i>r?i-=r:i=0);for(var n=!0,s=t.getImageData(e,i,2*r||1,2*r||1),o=3,a=s.data.length;o0?D-=2*f:1===c&&D<0&&(D+=2*f);for(var L=Math.ceil(Math.abs(D/f*2)),E=[],I=D/L,F=8/3*Math.sin(I/4)*Math.sin(I/4)/Math.sin(I/2),R=P+I,B=0;B=n?s-n:2*Math.PI-(n-s)}function r(t,e,i,r,n,s,h,c){var l=a.call(arguments);if(o[l])return o[l];var u,f,d,g,p,v,b,m,y=Math.sqrt,_=Math.min,x=Math.max,S=Math.abs,C=[],w=[[],[]];f=6*t-12*i+6*n,u=-3*t+9*i-9*n+3*h,d=3*i-3*t;for(var O=0;O<2;++O)if(O>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),S(u)<1e-12){if(S(f)<1e-12)continue;g=-d/f,0=e})}function i(t,e){return n(t,e,function(t,e){return t>>0;if(0===i)return-1;var r=0;if(arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=i)return-1;for(var n=r>=0?r:Math.max(i-Math.abs(r),0);n>>0;i>>0;r>>0;i>>0;i>>0;n>>0,r=0;if(arguments.length>1)e=arguments[1];else for(;;){if(r in this){e=this[r++];break}if(++r>=i)throw new TypeError}for(;r/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:t,capitalize:e,escapeXml:i}}(),function(){var t=Array.prototype.slice,e=Function.prototype.apply,i=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var n,s=this,o=t.call(arguments,1);return n=o.length?function(){return e.call(s,this instanceof i?this:r,o.concat(t.call(arguments)))}:function(){return e.call(s,this instanceof i?this:r,arguments)},i.prototype=this.prototype,n.prototype=new i,n})}(),function(){function t(){}function e(t){var e=this.constructor.superclass.prototype[t];return arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this)}function i(){function i(){this.initialize.apply(this,arguments)}var s=null,a=r.call(arguments,0);"function"==typeof a[0]&&(s=a.shift()),i.superclass=s,i.subclasses=[],s&&(t.prototype=s.prototype,i.prototype=new t,s.subclasses.push(i));for(var h=0,c=a.length;h-1?t.prototype[r]=function(t){return function(){var r=this.constructor.superclass;this.constructor.superclass=i;var n=e[t].apply(this,arguments);if(this.constructor.superclass=r,"initialize"!==t)return n}}(r):t.prototype[r]=e[r],s&&(e.toString!==Object.prototype.toString&&(t.prototype.toString=e.toString),e.valueOf!==Object.prototype.valueOf&&(t.prototype.valueOf=e.valueOf))};fabric.util.createClass=i}(),function(){function t(t){var e,i,r=Array.prototype.slice.call(arguments,1),n=r.length;for(i=0;i-1?s(t,e.match(/opacity:\s*(\d?\.?\d*)/)[1]):t;for(var r in e)if("opacity"===r)s(t,e[r]);else{var n="float"===r||"cssFloat"===r?"undefined"==typeof i.styleFloat?"cssFloat":"styleFloat":r;i[n]=e[r]}return t}var e=fabric.document.createElement("div"),i="string"==typeof e.style.opacity,r="string"==typeof e.style.filter,n=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(t){return t};i?s=function(t,e){return t.style.opacity=e,t}:r&&(s=function(t,e){var i=t.style;return t.currentStyle&&!t.currentStyle.hasLayout&&(i.zoom=1),n.test(i.filter)?(e=e>=.9999?"":"alpha(opacity="+100*e+")",i.filter=i.filter.replace(n,e)):i.filter+=" alpha(opacity="+100*e+")",t}),fabric.util.setStyle=t}(),function(){function t(t){return"string"==typeof t?fabric.document.getElementById(t):t}function e(t,e){var i=fabric.document.createElement(t);for(var r in e)"class"===r?i.className=e[r]:"for"===r?i.htmlFor=e[r]:i.setAttribute(r,e[r]);return i}function i(t,e){t&&(" "+t.className+" ").indexOf(" "+e+" ")===-1&&(t.className+=(t.className?" ":"")+e)}function r(t,i,r){return"string"==typeof i&&(i=e(i,r)),t.parentNode&&t.parentNode.replaceChild(i,t),i.appendChild(t),i}function n(t){for(var e=0,i=0,r=fabric.document.documentElement,n=fabric.document.body||{scrollLeft:0,scrollTop:0};t&&(t.parentNode||t.host)&&(t=t.parentNode||t.host,t===fabric.document?(e=n.scrollLeft||r.scrollLeft||0,i=n.scrollTop||r.scrollTop||0):(e+=t.scrollLeft||0,i+=t.scrollTop||0),1!==t.nodeType||"fixed"!==fabric.util.getElementStyle(t,"position")););return{left:e,top:i}}function s(t){var e,i,r=t&&t.ownerDocument,s={left:0,top:0},o={left:0,top:0},a={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return o;for(var h in a)o[a[h]]+=parseInt(l(t,h),10)||0;return e=r.documentElement,"undefined"!=typeof t.getBoundingClientRect&&(s=t.getBoundingClientRect()),i=n(t),{left:s.left+i.left-(e.clientLeft||0)+o.left,top:s.top+i.top-(e.clientTop||0)+o.top}}var o,a=Array.prototype.slice,h=function(t){return a.call(t,0)};try{o=h(fabric.document.childNodes)instanceof Array}catch(c){}o||(h=function(t){for(var e=new Array(t.length),i=t.length;i--;)e[i]=t[i];return e});var l;l=fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?function(t,e){var i=fabric.document.defaultView.getComputedStyle(t,null);return i?i[e]:void 0}:function(t,e){var i=t.style[e];return!i&&t.currentStyle&&(i=t.currentStyle[e]),i},function(){function t(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=fabric.util.falseFunction),r?t.style[r]="none":"string"==typeof t.unselectable&&(t.unselectable="on"),t}function e(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=null),r?t.style[r]="":"string"==typeof t.unselectable&&(t.unselectable=""),t}var i=fabric.document.documentElement.style,r="userSelect"in i?"userSelect":"MozUserSelect"in i?"MozUserSelect":"WebkitUserSelect"in i?"WebkitUserSelect":"KhtmlUserSelect"in i?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=t,fabric.util.makeElementSelectable=e}(),function(){function t(t,e){var i=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),n=!0;r.onload=r.onreadystatechange=function(t){if(n){if("string"==typeof this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)return;n=!1,e(t||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=t,i.appendChild(r)}fabric.util.getScript=t}(),fabric.util.getById=t,fabric.util.toArray=h,fabric.util.makeElement=e,fabric.util.addClass=i,fabric.util.wrapElement=r,fabric.util.getScrollLeftTop=n,fabric.util.getElementOffset=s,fabric.util.getElementStyle=l}(),function(){function t(t,e){return t+(/\?/.test(t)?"&":"?")+e}function e(){}function i(i,n){n||(n={});var s,o=n.method?n.method.toUpperCase():"GET",a=n.onComplete||function(){},h=r();return h.onreadystatechange=function(){4===h.readyState&&(a(h),h.onreadystatechange=e)},"GET"===o&&(s=null,"string"==typeof n.parameters&&(i=t(i,n.parameters))),h.open(o,i,!0),"POST"!==o&&"PUT"!==o||h.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),h.send(s),h}var r=function(){for(var t=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}],e=t.length;e--;)try{var i=t[e]();if(i)return t[e]}catch(r){}}();fabric.util.request=i}(),fabric.log=function(){},fabric.warn=function(){},"undefined"!=typeof console&&["log","warn"].forEach(function(t){"undefined"!=typeof console[t]&&"function"==typeof console[t].apply&&(fabric[t]=function(){return console[t].apply(console,arguments)})}),function(){function t(t){e(function(i){t||(t={});var r,n=i||+new Date,s=t.duration||500,o=n+s,a=t.onChange||function(){},h=t.abort||function(){return!1},c=t.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},l="startValue"in t?t.startValue:0,u="endValue"in t?t.endValue:100,f=t.byValue||u-l;t.onStart&&t.onStart(),function d(i){r=i||+new Date;var u=r>o?s:r-n;return h()?void(t.onComplete&&t.onComplete()):(a(c(u,l,f,s)),r>o?void(t.onComplete&&t.onComplete()):void e(d))}(n)})}function e(){return i.apply(fabric.window,arguments)}var i=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(t){fabric.window.setTimeout(t,1e3/60)};fabric.util.animate=t,fabric.util.requestAnimFrame=e}(),function(){function t(t,e,i,r){return ta?a:o),1===o&&1===a&&0===h&&0===c&&0===f&&0===d)return y;if((f||d)&&(_=" translate("+x(f)+" "+x(d)+") "),r=_+" matrix("+o+" 0 0 "+a+" "+h*o+" "+c*a+") ","svg"===t.nodeName){for(n=t.ownerDocument.createElement("g");null!=t.firstChild;)n.appendChild(t.firstChild);t.appendChild(n)}else n=t,r=n.getAttribute("transform")+r;return n.setAttribute("transform",r),y}function g(t){var e=t.objects,i=t.options;return e=e.map(function(t){return v[m(t.type)].fromObject(t)}),{objects:e,options:i}}function p(t,e,i){e[i]&&e[i].toSVG&&t.push('\t\n','\t\t\n\t\n')}var v=t.fabric||(t.fabric={}),b=v.util.object.extend,m=v.util.string.capitalize,y=v.util.object.clone,_=v.util.toFixed,x=v.util.parseUnit,S=v.util.multiplyTransformMatrices,C=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i,w=/^(symbol|image|marker|pattern|view|svg)$/i,O=/^(?:pattern|defs|symbol|metadata)$/i,T=/^(symbol|g|a|svg)$/i,k={cx:"left",x:"left",r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","stroke-dasharray":"strokeDashArray","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"originX"},j={stroke:"strokeOpacity",fill:"fillOpacity"};v.cssRules={},v.gradientDefs={},v.parseTransformAttribute=function(){function t(t,e){var i=e[0],r=3===e.length?e[1]:0,n=3===e.length?e[2]:0;t[0]=Math.cos(i),t[1]=Math.sin(i),t[2]=-Math.sin(i),t[3]=Math.cos(i),t[4]=r-(t[0]*r+t[2]*n),t[5]=n-(t[1]*r+t[3]*n)}function e(t,e){var i=e[0],r=2===e.length?e[1]:e[0];t[0]=i,t[3]=r}function i(t,e){t[2]=Math.tan(v.util.degreesToRadians(e[0]))}function r(t,e){t[1]=Math.tan(v.util.degreesToRadians(e[0]))}function n(t,e){t[4]=e[0],2===e.length&&(t[5]=e[1])}var s=[1,0,0,1,0,0],o=v.reNum,a="(?:\\s+,?\\s*|,\\s*)",h="(?:(skewX)\\s*\\(\\s*("+o+")\\s*\\))",c="(?:(skewY)\\s*\\(\\s*("+o+")\\s*\\))",l="(?:(rotate)\\s*\\(\\s*("+o+")(?:"+a+"("+o+")"+a+"("+o+"))?\\s*\\))",u="(?:(scale)\\s*\\(\\s*("+o+")(?:"+a+"("+o+"))?\\s*\\))",f="(?:(translate)\\s*\\(\\s*("+o+")(?:"+a+"("+o+"))?\\s*\\))",d="(?:(matrix)\\s*\\(\\s*("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")\\s*\\))",g="(?:"+d+"|"+f+"|"+u+"|"+l+"|"+h+"|"+c+")",p="(?:"+g+"(?:"+a+"*"+g+")*)",b="^\\s*(?:"+p+"?)\\s*$",m=new RegExp(b),y=new RegExp(g,"g"); +var fabric=fabric||{version:"1.6.3"};"undefined"!=typeof exports&&(exports.fabric=fabric),"undefined"!=typeof document&&"undefined"!=typeof window?(fabric.document=document,fabric.window=window,window.fabric=fabric):(fabric.document=require("jsdom").jsdom(""),fabric.document.createWindow?fabric.window=fabric.document.createWindow():fabric.window=fabric.document.parentWindow),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode="undefined"!=typeof Buffer&&"undefined"==typeof window,fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id"],fabric.DPI=96,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",fabric.fontPaths={},fabric.charWidthsCache={},fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,function(){function t(t,e){if(this.__eventListeners[t]){var i=this.__eventListeners[t];e?i[i.indexOf(e)]=!1:fabric.util.array.fill(i,!1)}}function e(t,e){if(this.__eventListeners||(this.__eventListeners={}),1===arguments.length)for(var i in t)this.on(i,t[i]);else this.__eventListeners[t]||(this.__eventListeners[t]=[]),this.__eventListeners[t].push(e);return this}function i(e,i){if(this.__eventListeners){if(0===arguments.length)for(e in this.__eventListeners)t.call(this,e);else if(1===arguments.length&&"object"==typeof arguments[0])for(var r in e)t.call(this,r,e[r]);else t.call(this,e,i);return this}}function r(t,e){if(this.__eventListeners){var i=this.__eventListeners[t];if(i){for(var r=0,n=i.length;r-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},function(t){var e=Math.sqrt,i=Math.atan2,r=Math.pow,n=Math.abs,s=Math.PI/180;fabric.util={removeFromArray:function(t,e){var i=t.indexOf(e);return i!==-1&&t.splice(i,1),t},getRandomInt:function(t,e){return Math.floor(Math.random()*(e-t+1))+t},degreesToRadians:function(t){return t*s},radiansToDegrees:function(t){return t/s},rotatePoint:function(t,e,i){t.subtractEquals(e);var r=fabric.util.rotateVector(t,i);return new fabric.Point(r.x,r.y).addEquals(e)},rotateVector:function(t,e){var i=Math.sin(e),r=Math.cos(e),n=t.x*r-t.y*i,s=t.x*i+t.y*r;return{x:n,y:s}},transformPoint:function(t,e,i){return i?new fabric.Point(e[0]*t.x+e[2]*t.y,e[1]*t.x+e[3]*t.y):new fabric.Point(e[0]*t.x+e[2]*t.y+e[4],e[1]*t.x+e[3]*t.y+e[5])},makeBoundingBoxFromPoints:function(t){var e=[t[0].x,t[1].x,t[2].x,t[3].x],i=fabric.util.array.min(e),r=fabric.util.array.max(e),n=Math.abs(i-r),s=[t[0].y,t[1].y,t[2].y,t[3].y],o=fabric.util.array.min(s),a=fabric.util.array.max(s),h=Math.abs(o-a);return{left:i,top:o,width:n,height:h}},invertTransform:function(t){var e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0]],r=fabric.util.transformPoint({x:t[4],y:t[5]},i,!0);return i[4]=-r.x,i[5]=-r.y,i},toFixed:function(t,e){return parseFloat(Number(t).toFixed(e))},parseUnit:function(t,e){var i=/\D{0,2}$/.exec(t),r=parseFloat(t);switch(e||(e=fabric.Text.DEFAULT_SVG_FONT_SIZE),i[0]){case"mm":return r*fabric.DPI/25.4;case"cm":return r*fabric.DPI/2.54;case"in":return r*fabric.DPI;case"pt":return r*fabric.DPI/72;case"pc":return r*fabric.DPI/72*12;case"em":return r*e;default:return r}},falseFunction:function(){return!1},getKlass:function(t,e){return t=fabric.util.string.camelize(t.charAt(0).toUpperCase()+t.slice(1)),fabric.util.resolveNamespace(e)[t]},resolveNamespace:function(e){if(!e)return fabric;for(var i=e.split("."),r=i.length,n=t||fabric.window,s=0;sr;)r+=a[d++%f],r>l&&(r=l),t[g?"lineTo":"moveTo"](r,0),g=!g;t.restore()},createCanvasElement:function(t){return t||(t=fabric.document.createElement("canvas")),t.getContext||"undefined"==typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(t),t},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(t){for(var e=t.prototype,i=e.stateProperties.length;i--;){var r=e.stateProperties[i],n=r.charAt(0).toUpperCase()+r.slice(1),s="set"+n,o="get"+n;e[o]||(e[o]=function(t){return new Function('return this.get("'+t+'")')}(r)),e[s]||(e[s]=function(t){return new Function("value",'return this.set("'+t+'", value)')}(r))}},clipContext:function(t,e){e.save(),e.beginPath(),t.clipTo(e),e.clip()},multiplyTransformMatrices:function(t,e,i){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]]},qrDecompose:function(t){var n=i(t[1],t[0]),o=r(t[0],2)+r(t[1],2),a=e(o),h=(t[0]*t[3]-t[2]*t[1])/a,c=i(t[0]*t[2]+t[1]*t[3],o);return{angle:n/s,scaleX:a,scaleY:h,skewX:c/s,skewY:0,translateX:t[4],translateY:t[5]}},customTransformMatrix:function(t,e,i){var r=[1,0,n(Math.tan(i*s)),1],o=[n(t),0,0,n(e)];return fabric.util.multiplyTransformMatrices(o,r,!0)},resetObjectTransform:function(t){t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.setAngle(0)},getFunctionBody:function(t){return(String(t).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},isTransparent:function(t,e,i,r){r>0&&(e>r?e-=r:e=0,i>r?i-=r:i=0);for(var n=!0,s=t.getImageData(e,i,2*r||1,2*r||1),o=3,a=s.data.length;o0?L-=2*f:1===c&&L<0&&(L+=2*f);for(var D=Math.ceil(Math.abs(L/f*2)),E=[],I=L/D,F=8/3*Math.sin(I/4)*Math.sin(I/4)/Math.sin(I/2),R=P+I,B=0;B=n?s-n:2*Math.PI-(n-s)}function r(t,e,i,r,n,s,h,c){var l=a.call(arguments);if(o[l])return o[l];var u,f,d,g,p,v,b,m,y=Math.sqrt,_=Math.min,x=Math.max,S=Math.abs,C=[],w=[[],[]];f=6*t-12*i+6*n,u=-3*t+9*i-9*n+3*h,d=3*i-3*t;for(var O=0;O<2;++O)if(O>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),S(u)<1e-12){if(S(f)<1e-12)continue;g=-d/f,0=e})}function i(t,e){return n(t,e,function(t,e){return t>>0;if(0===i)return-1;var r=0;if(arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=i)return-1;for(var n=r>=0?r:Math.max(i-Math.abs(r),0);n>>0;i>>0;r>>0;i>>0;i>>0;n>>0,r=0;if(arguments.length>1)e=arguments[1];else for(;;){if(r in this){e=this[r++];break}if(++r>=i)throw new TypeError}for(;r/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:t,capitalize:e,escapeXml:i}}(),function(){var t=Array.prototype.slice,e=Function.prototype.apply,i=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var n,s=this,o=t.call(arguments,1);return n=o.length?function(){return e.call(s,this instanceof i?this:r,o.concat(t.call(arguments)))}:function(){return e.call(s,this instanceof i?this:r,arguments)},i.prototype=this.prototype,n.prototype=new i,n})}(),function(){function t(){}function e(t){var e=this.constructor.superclass.prototype[t];return arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this)}function i(){function i(){this.initialize.apply(this,arguments)}var s=null,a=r.call(arguments,0);"function"==typeof a[0]&&(s=a.shift()),i.superclass=s,i.subclasses=[],s&&(t.prototype=s.prototype,i.prototype=new t,s.subclasses.push(i));for(var h=0,c=a.length;h-1?t.prototype[r]=function(t){return function(){var r=this.constructor.superclass;this.constructor.superclass=i;var n=e[t].apply(this,arguments);if(this.constructor.superclass=r,"initialize"!==t)return n}}(r):t.prototype[r]=e[r],s&&(e.toString!==Object.prototype.toString&&(t.prototype.toString=e.toString),e.valueOf!==Object.prototype.valueOf&&(t.prototype.valueOf=e.valueOf))};fabric.util.createClass=i}(),function(){function t(t){var e,i,r=Array.prototype.slice.call(arguments,1),n=r.length;for(i=0;i-1?s(t,e.match(/opacity:\s*(\d?\.?\d*)/)[1]):t;for(var r in e)if("opacity"===r)s(t,e[r]);else{var n="float"===r||"cssFloat"===r?"undefined"==typeof i.styleFloat?"cssFloat":"styleFloat":r;i[n]=e[r]}return t}var e=fabric.document.createElement("div"),i="string"==typeof e.style.opacity,r="string"==typeof e.style.filter,n=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(t){return t};i?s=function(t,e){return t.style.opacity=e,t}:r&&(s=function(t,e){var i=t.style;return t.currentStyle&&!t.currentStyle.hasLayout&&(i.zoom=1),n.test(i.filter)?(e=e>=.9999?"":"alpha(opacity="+100*e+")",i.filter=i.filter.replace(n,e)):i.filter+=" alpha(opacity="+100*e+")",t}),fabric.util.setStyle=t}(),function(){function t(t){return"string"==typeof t?fabric.document.getElementById(t):t}function e(t,e){var i=fabric.document.createElement(t);for(var r in e)"class"===r?i.className=e[r]:"for"===r?i.htmlFor=e[r]:i.setAttribute(r,e[r]);return i}function i(t,e){t&&(" "+t.className+" ").indexOf(" "+e+" ")===-1&&(t.className+=(t.className?" ":"")+e)}function r(t,i,r){return"string"==typeof i&&(i=e(i,r)),t.parentNode&&t.parentNode.replaceChild(i,t),i.appendChild(t),i}function n(t){for(var e=0,i=0,r=fabric.document.documentElement,n=fabric.document.body||{scrollLeft:0,scrollTop:0};t&&(t.parentNode||t.host)&&(t=t.parentNode||t.host,t===fabric.document?(e=n.scrollLeft||r.scrollLeft||0,i=n.scrollTop||r.scrollTop||0):(e+=t.scrollLeft||0,i+=t.scrollTop||0),1!==t.nodeType||"fixed"!==fabric.util.getElementStyle(t,"position")););return{left:e,top:i}}function s(t){var e,i,r=t&&t.ownerDocument,s={left:0,top:0},o={left:0,top:0},a={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return o;for(var h in a)o[a[h]]+=parseInt(l(t,h),10)||0;return e=r.documentElement,"undefined"!=typeof t.getBoundingClientRect&&(s=t.getBoundingClientRect()),i=n(t),{left:s.left+i.left-(e.clientLeft||0)+o.left,top:s.top+i.top-(e.clientTop||0)+o.top}}var o,a=Array.prototype.slice,h=function(t){return a.call(t,0)};try{o=h(fabric.document.childNodes)instanceof Array}catch(c){}o||(h=function(t){for(var e=new Array(t.length),i=t.length;i--;)e[i]=t[i];return e});var l;l=fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?function(t,e){var i=fabric.document.defaultView.getComputedStyle(t,null);return i?i[e]:void 0}:function(t,e){var i=t.style[e];return!i&&t.currentStyle&&(i=t.currentStyle[e]),i},function(){function t(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=fabric.util.falseFunction),r?t.style[r]="none":"string"==typeof t.unselectable&&(t.unselectable="on"),t}function e(t){return"undefined"!=typeof t.onselectstart&&(t.onselectstart=null),r?t.style[r]="":"string"==typeof t.unselectable&&(t.unselectable=""),t}var i=fabric.document.documentElement.style,r="userSelect"in i?"userSelect":"MozUserSelect"in i?"MozUserSelect":"WebkitUserSelect"in i?"WebkitUserSelect":"KhtmlUserSelect"in i?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=t,fabric.util.makeElementSelectable=e}(),function(){function t(t,e){var i=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),n=!0;r.onload=r.onreadystatechange=function(t){if(n){if("string"==typeof this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)return;n=!1,e(t||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=t,i.appendChild(r)}fabric.util.getScript=t}(),fabric.util.getById=t,fabric.util.toArray=h,fabric.util.makeElement=e,fabric.util.addClass=i,fabric.util.wrapElement=r,fabric.util.getScrollLeftTop=n,fabric.util.getElementOffset=s,fabric.util.getElementStyle=l}(),function(){function t(t,e){return t+(/\?/.test(t)?"&":"?")+e}function e(){}function i(i,n){n||(n={});var s,o=n.method?n.method.toUpperCase():"GET",a=n.onComplete||function(){},h=r();return h.onreadystatechange=function(){4===h.readyState&&(a(h),h.onreadystatechange=e)},"GET"===o&&(s=null,"string"==typeof n.parameters&&(i=t(i,n.parameters))),h.open(o,i,!0),"POST"!==o&&"PUT"!==o||h.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),h.send(s),h}var r=function(){for(var t=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}],e=t.length;e--;)try{var i=t[e]();if(i)return t[e]}catch(r){}}();fabric.util.request=i}(),fabric.log=function(){},fabric.warn=function(){},"undefined"!=typeof console&&["log","warn"].forEach(function(t){"undefined"!=typeof console[t]&&"function"==typeof console[t].apply&&(fabric[t]=function(){return console[t].apply(console,arguments)})}),function(){function t(t){e(function(i){t||(t={});var r,n=i||+new Date,s=t.duration||500,o=n+s,a=t.onChange||function(){},h=t.abort||function(){return!1},c=t.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},l="startValue"in t?t.startValue:0,u="endValue"in t?t.endValue:100,f=t.byValue||u-l;t.onStart&&t.onStart(),function d(i){r=i||+new Date;var u=r>o?s:r-n;return h()?void(t.onComplete&&t.onComplete()):(a(c(u,l,f,s)),r>o?void(t.onComplete&&t.onComplete()):void e(d))}(n)})}function e(){return i.apply(fabric.window,arguments)}var i=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(t){fabric.window.setTimeout(t,1e3/60)};fabric.util.animate=t,fabric.util.requestAnimFrame=e}(),function(){function t(t,e,i,r){return ta?a:o),1===o&&1===a&&0===h&&0===c&&0===f&&0===d)return y;if((f||d)&&(_=" translate("+x(f)+" "+x(d)+") "),r=_+" matrix("+o+" 0 0 "+a+" "+h*o+" "+c*a+") ","svg"===t.nodeName){for(n=t.ownerDocument.createElement("g");null!=t.firstChild;)n.appendChild(t.firstChild);t.appendChild(n)}else n=t,r=n.getAttribute("transform")+r;return n.setAttribute("transform",r),y}function g(t){var e=t.objects,i=t.options;return e=e.map(function(t){return v[m(t.type)].fromObject(t)}),{objects:e,options:i}}function p(t,e,i){e[i]&&e[i].toSVG&&t.push('\t\n','\t\t\n\t\n')}var v=t.fabric||(t.fabric={}),b=v.util.object.extend,m=v.util.string.capitalize,y=v.util.object.clone,_=v.util.toFixed,x=v.util.parseUnit,S=v.util.multiplyTransformMatrices,C=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i,w=/^(symbol|image|marker|pattern|view|svg)$/i,O=/^(?:pattern|defs|symbol|metadata)$/i,T=/^(symbol|g|a|svg)$/i,k={cx:"left",x:"left",r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","stroke-dasharray":"strokeDashArray","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"originX"},j={stroke:"strokeOpacity",fill:"fillOpacity"};v.cssRules={},v.gradientDefs={},v.parseTransformAttribute=function(){function t(t,e){var i=e[0],r=3===e.length?e[1]:0,n=3===e.length?e[2]:0;t[0]=Math.cos(i),t[1]=Math.sin(i),t[2]=-Math.sin(i),t[3]=Math.cos(i),t[4]=r-(t[0]*r+t[2]*n),t[5]=n-(t[1]*r+t[3]*n)}function e(t,e){var i=e[0],r=2===e.length?e[1]:e[0];t[0]=i,t[3]=r}function i(t,e){t[2]=Math.tan(v.util.degreesToRadians(e[0]))}function r(t,e){t[1]=Math.tan(v.util.degreesToRadians(e[0]))}function n(t,e){t[4]=e[0],2===e.length&&(t[5]=e[1])}var s=[1,0,0,1,0,0],o=v.reNum,a="(?:\\s+,?\\s*|,\\s*)",h="(?:(skewX)\\s*\\(\\s*("+o+")\\s*\\))",c="(?:(skewY)\\s*\\(\\s*("+o+")\\s*\\))",l="(?:(rotate)\\s*\\(\\s*("+o+")(?:"+a+"("+o+")"+a+"("+o+"))?\\s*\\))",u="(?:(scale)\\s*\\(\\s*("+o+")(?:"+a+"("+o+"))?\\s*\\))",f="(?:(translate)\\s*\\(\\s*("+o+")(?:"+a+"("+o+"))?\\s*\\))",d="(?:(matrix)\\s*\\(\\s*("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")"+a+"("+o+")\\s*\\))",g="(?:"+d+"|"+f+"|"+u+"|"+l+"|"+h+"|"+c+")",p="(?:"+g+"(?:"+a+"*"+g+")*)",b="^\\s*(?:"+p+"?)\\s*$",m=new RegExp(b),y=new RegExp(g,"g"); return function(o){var a=s.concat(),h=[];if(!o||o&&!m.test(o))return a;o.replace(y,function(o){var c=new RegExp(g).exec(o).filter(function(t){return""!==t&&null!=t}),l=c[1],u=c.slice(2).map(parseFloat);switch(l){case"translate":n(a,u);break;case"rotate":u[0]=v.util.degreesToRadians(u[0]),t(a,u);break;case"scale":e(a,u);break;case"skewX":i(a,u);break;case"skewY":r(a,u);break;case"matrix":a=u}h.push(a.concat()),a=s.concat()});for(var c=h[0];h.length>1;)h.shift(),c=v.util.multiplyTransformMatrices(c,h[0]);return c}}();var A=new RegExp("^\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*$");v.parseSVGDocument=function(){function t(t,e){for(;t&&(t=t.parentNode);)if(t.nodeName&&e.test(t.nodeName.replace("svg:",""))&&!t.getAttribute("instantiated_by_use"))return!0;return!1}return function(e,i,r){if(e){f(e);var n=new Date,s=v.Object.__uid++,o=d(e),a=v.util.toArray(e.getElementsByTagName("*"));if(o.svgUid=s,0===a.length&&v.isLikelyNode){a=e.selectNodes('//*[name(.)!="svg"]');for(var h=[],c=0,l=a.length;c/i,""))),n&&n.documentElement||e&&e(null),v.parseSVGDocument(n.documentElement,function(i,r){M.set(t,{objects:v.util.array.invoke(i,"toObject"),options:r}),e&&e(i,r)},i)}t=t.replace(/^\n\s*/,"").trim(),M.has(t,function(i){i?M.get(t,function(t){var i=g(t);e(i.objects,i.options)}):new v.util.request(t,{method:"get",onComplete:r})})},loadSVGFromString:function(t,e,i){t=t.trim();var r;if("undefined"!=typeof DOMParser){var n=new DOMParser;n&&n.parseFromString&&(r=n.parseFromString(t,"text/xml"))}else v.window.ActiveXObject&&(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(t.replace(//i,"")));v.parseSVGDocument(r.documentElement,function(t,i){e(t,i)},i)},createSVGFontFacesMarkup:function(t){for(var e,i,r,n,s,o,a,h="",c={},l=v.fontPaths,u=0,f=t.length;u',"","\n"].join("")),h},createSVGRefElementsMarkup:function(t){var e=[];return p(e,t,"backgroundColor"),p(e,t,"overlayColor"),e.join("")}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.svgUid||0},fabric.ElementsParser.prototype.parse=function(){this.instances=new Array(this.elements.length),this.numElements=this.elements.length,this.createObjects()},fabric.ElementsParser.prototype.createObjects=function(){for(var t=0,e=this.elements.length;tt.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,i){return new e(this.x+(t.x-this.x)*i,this.y+(t.y-this.y)*i)},distanceFrom:function(t){var e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)},midPointFrom:function(t){return new e(this.x+(t.x-this.x)/2,this.y+(t.y-this.y)/2)},min:function(t){return new e(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new e(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){this.x=t,this.y=e},setFromPoint:function(t){this.x=t.x,this.y=t.y},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i}}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){this.status=t,this.points=[]}var i=t.fabric||(t.fabric={});return i.Intersection?void i.warn("fabric.Intersection is already defined"):(i.Intersection=e,i.Intersection.prototype={appendPoint:function(t){this.points.push(t)},appendPoints:function(t){this.points=this.points.concat(t)}},i.Intersection.intersectLineLine=function(t,r,n,s){var o,a=(s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x),h=(r.x-t.x)*(t.y-n.y)-(r.y-t.y)*(t.x-n.x),c=(s.y-n.y)*(r.x-t.x)-(s.x-n.x)*(r.y-t.y);if(0!==c){var l=a/c,u=h/c;0<=l&&l<=1&&0<=u&&u<=1?(o=new e("Intersection"),o.points.push(new i.Point(t.x+l*(r.x-t.x),t.y+l*(r.y-t.y)))):o=new e}else o=new e(0===a||0===h?"Coincident":"Parallel");return o},i.Intersection.intersectLinePolygon=function(t,i,r){for(var n=new e,s=r.length,o=0;o0&&(n.status="Intersection"),n},i.Intersection.intersectPolygonPolygon=function(t,i){for(var r=new e,n=t.length,s=0;s0&&(r.status="Intersection"),r},void(i.Intersection.intersectPolygonRectangle=function(t,r,n){var s=r.min(n),o=r.max(n),a=new i.Point(o.x,s.y),h=new i.Point(s.x,o.y),c=e.intersectLinePolygon(s,a,t),l=e.intersectLinePolygon(a,o,t),u=e.intersectLinePolygon(o,h,t),f=e.intersectLinePolygon(h,s,t),d=new e;return d.appendPoints(c.points),d.appendPoints(l.points),d.appendPoints(u.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){t?this._tryParsingColor(t):this.setSource([0,0,0,1])}function i(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}var r=t.fabric||(t.fabric={});return r.Color?void r.warn("fabric.Color is already defined."):(r.Color=e,r.Color.prototype={_tryParsingColor:function(t){var i;t in e.colorNameMap&&(t=e.colorNameMap[t]),"transparent"===t&&(i=[255,255,255,0]),i||(i=e.sourceFromHex(t)),i||(i=e.sourceFromRgb(t)),i||(i=e.sourceFromHsl(t)),i||(i=[0,0,0,1]),i&&this.setSource(i)},_rgbToHsl:function(t,e,i){t/=255,e/=255,i/=255;var n,s,o,a=r.util.array.max([t,e,i]),h=r.util.array.min([t,e,i]);if(o=(a+h)/2,a===h)n=s=0;else{var c=a-h;switch(s=o>.5?c/(2-a-h):c/(a+h),a){case t:n=(e-i)/c+(e1?1:s,n){var o=n.split(/\s*;\s*/);""===o[o.length-1]&&o.pop();for(var a=o.length;a--;){var h=o[a].split(/\s*:\s*/),c=h[0].trim(),l=h[1].trim();"stop-color"===c?e=l:"stop-opacity"===c&&(r=l)}}return e||(e=t.getAttribute("stop-color")||"rgb(0,0,0)"),r||(r=t.getAttribute("stop-opacity")),e=new fabric.Color(e),i=e.getAlpha(),r=isNaN(parseFloat(r))?1:parseFloat(r),r*=i,{offset:s,color:e.toRgb(),opacity:r}}function e(t){return{x1:t.getAttribute("x1")||0,y1:t.getAttribute("y1")||0,x2:t.getAttribute("x2")||"100%",y2:t.getAttribute("y2")||0}}function i(t){return{x1:t.getAttribute("fx")||t.getAttribute("cx")||"50%",y1:t.getAttribute("fy")||t.getAttribute("cy")||"50%",r1:0,x2:t.getAttribute("cx")||"50%",y2:t.getAttribute("cy")||"50%",r2:t.getAttribute("r")||"50%"}}function r(t,e,i){var r,n=0,s=1,o="";for(var a in e)"Infinity"===e[a]?e[a]=1:"-Infinity"===e[a]&&(e[a]=0),r=parseFloat(e[a],10),s="string"==typeof e[a]&&/^\d+%$/.test(e[a])?.01:1,"x1"===a||"x2"===a||"r2"===a?(s*="objectBoundingBox"===i?t.width:1,n="objectBoundingBox"===i?t.left||0:0):"y1"!==a&&"y2"!==a||(s*="objectBoundingBox"===i?t.height:1,n="objectBoundingBox"===i?t.top||0:0),e[a]=r*s+n;if("ellipse"===t.type&&null!==e.r2&&"objectBoundingBox"===i&&t.rx!==t.ry){var h=t.ry/t.rx;o=" scale(1, "+h+")",e.y1&&(e.y1/=h),e.y2&&(e.y2/=h)}return o}fabric.Gradient=fabric.util.createClass({offsetX:0,offsetY:0,initialize:function(t){t||(t={});var e={};this.id=fabric.Object.__uid++,this.type=t.type||"linear",e={x1:t.coords.x1||0,y1:t.coords.y1||0,x2:t.coords.x2||0,y2:t.coords.y2||0},"radial"===this.type&&(e.r1=t.coords.r1||0,e.r2=t.coords.r2||0),this.coords=e,this.colorStops=t.colorStops.slice(),t.gradientTransform&&(this.gradientTransform=t.gradientTransform),this.offsetX=t.offsetX||this.offsetX,this.offsetY=t.offsetY||this.offsetY},addColorStop:function(t){for(var e in t){var i=new fabric.Color(t[e]);this.colorStops.push({offset:e,color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(){return{type:this.type,coords:this.coords,colorStops:this.colorStops,offsetX:this.offsetX,offsetY:this.offsetY,gradientTransform:this.gradientTransform?this.gradientTransform.concat():this.gradientTransform}},toSVG:function(t){var e,i,r=fabric.util.object.clone(this.coords);if(this.colorStops.sort(function(t,e){return t.offset-e.offset}),!t.group||"path-group"!==t.group.type)for(var n in r)"x1"===n||"x2"===n||"r2"===n?r[n]+=this.offsetX-t.width/2:"y1"!==n&&"y2"!==n||(r[n]+=this.offsetY-t.height/2);i='id="SVGID_'+this.id+'" gradientUnits="userSpaceOnUse"',this.gradientTransform&&(i+=' gradientTransform="matrix('+this.gradientTransform.join(" ")+')" '),"linear"===this.type?e=["\n']:"radial"===this.type&&(e=["\n']);for(var s=0;s\n');return e.push("linear"===this.type?"\n":"\n"),e.join("")},toLive:function(t,e){var i,r,n=fabric.util.object.clone(this.coords);if(this.type){if(e.group&&"path-group"===e.group.type)for(r in n)"x1"===r||"x2"===r?n[r]+=-this.offsetX+e.width/2:"y1"!==r&&"y2"!==r||(n[r]+=-this.offsetY+e.height/2);"linear"===this.type?i=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(i=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2));for(var s=0,o=this.colorStops.length;s\n\n\n'},toLive:function(t){var e="function"==typeof this.source?this.source():this.source;if(!e)return"";if("undefined"!=typeof e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.toFixed;return e.Shadow?void e.warn("fabric.Shadow is already defined."):(e.Shadow=e.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(t){"string"==typeof t&&(t=this._parseShadow(t));for(var i in t)this[i]=t[i];this.id=e.Object.__uid++},_parseShadow:function(t){var i=t.trim(),r=e.Shadow.reOffsetsAndBlur.exec(i)||[],n=i.replace(e.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)";return{color:n.trim(),offsetX:parseInt(r[1],10)||0,offsetY:parseInt(r[2],10)||0,blur:parseInt(r[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(t){var r=40,n=40,s=e.Object.NUM_FRACTION_DIGITS,o=e.util.rotateVector({x:this.offsetX,y:this.offsetY},e.util.degreesToRadians(-t.angle)),a=20;return t.width&&t.height&&(r=100*i((Math.abs(o.x)+this.blur)/t.width,s)+a,n=100*i((Math.abs(o.y)+this.blur)/t.height,s)+a),t.flipX&&(o.x*=-1),t.flipY&&(o.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke};var t={},i=e.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke"].forEach(function(e){this[e]!==i[e]&&(t[e]=this[e])},this),t}}),void(e.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/))}("undefined"!=typeof exports?exports:this),function(){"use strict";if(fabric.StaticCanvas)return void fabric.warn("fabric.StaticCanvas is already defined.");var t=fabric.util.object.extend,e=fabric.util.getElementOffset,i=fabric.util.removeFromArray,r=fabric.util.toFixed,n=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass({initialize:function(t,e){e||(e={}),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!0,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,preserveObjectStacking:!1,viewportTransform:[1,0,0,1,0,0],backgroundVpt:!0,overlayVpt:!0,onBeforeScaleRotate:function(){},enableRetinaScaling:!0,_initStatic:function(t,e){this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this._setImageSmoothing(),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,this.renderAll.bind(this)),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,this.renderAll.bind(this)),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,this.renderAll.bind(this)),e.overlayColor&&this.setOverlayColor(e.overlayColor,this.renderAll.bind(this)),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},_initRetinaScaling:function(){this._isRetinaScaling()&&(this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio))},calcOffset:function(){return this._offset=e(this.lowerCanvasEl),this},setOverlayImage:function(t,e,i){return this.__setBgOverlayImage("overlayImage",t,e,i)},setBackgroundImage:function(t,e,i){return this.__setBgOverlayImage("backgroundImage",t,e,i)},setOverlayColor:function(t,e){return this.__setBgOverlayColor("overlayColor",t,e)},setBackgroundColor:function(t,e){return this.__setBgOverlayColor("backgroundColor",t,e)},_setImageSmoothing:function(){var t=this.getContext();t.imageSmoothingEnabled=t.imageSmoothingEnabled||t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled||t.oImageSmoothingEnabled,t.imageSmoothingEnabled=this.imageSmoothingEnabled},__setBgOverlayImage:function(t,e,i,r){return"string"==typeof e?fabric.util.loadImage(e,function(e){e&&(this[t]=new fabric.Image(e,r)),i&&i(e)},this,r&&r.crossOrigin):(r&&e.setOptions(r),this[t]=e,i&&i(e)),this},__setBgOverlayColor:function(t,e,i){if(e&&e.source){var r=this;fabric.util.loadImage(e.source,function(n){r[t]=new fabric.Pattern({source:n,repeat:e.repeat,offsetX:e.offsetX,offsetY:e.offsetY}),i&&i()})}else this[t]=e,i&&i();return this},_createCanvasElement:function(){var t=fabric.document.createElement("canvas");if(t.style||(t.style={}),!t)throw n;return this._initCanvasElement(t),t},_initCanvasElement:function(t){if(fabric.util.createCanvasElement(t),"undefined"==typeof t.getContext)throw n},_initOptions:function(t){for(var e in t)this[e]=t[e];this.width=this.width||parseInt(this.lowerCanvasEl.width,10)||0,this.height=this.height||parseInt(this.lowerCanvasEl.height,10)||0,this.lowerCanvasEl.style&&(this.lowerCanvasEl.width=this.width,this.lowerCanvasEl.height=this.height,this.lowerCanvasEl.style.width=this.width+"px",this.lowerCanvasEl.style.height=this.height+"px",this.viewportTransform=this.viewportTransform.slice())},_createLowerCanvas:function(t){this.lowerCanvasEl=fabric.util.getById(t)||this._createCanvasElement(),this._initCanvasElement(this.lowerCanvasEl),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(t,e){return this.setDimensions({width:t},e)},setHeight:function(t,e){return this.setDimensions({height:t},e)},setDimensions:function(t,e){var i;e=e||{};for(var r in t)i=t[r],e.cssOnly||(this._setBackstoreDimension(r,t[r]),i+="px"),e.backstoreOnly||this._setCssDimension(r,i);return this._initRetinaScaling(),this._setImageSmoothing(),this.calcOffset(),e.cssOnly||this.renderAll(),this},_setBackstoreDimension:function(t,e){return this.lowerCanvasEl[t]=e,this.upperCanvasEl&&(this.upperCanvasEl[t]=e),this.cacheCanvasEl&&(this.cacheCanvasEl[t]=e),this[t]=e,this},_setCssDimension:function(t,e){return this.lowerCanvasEl.style[t]=e,this.upperCanvasEl&&(this.upperCanvasEl.style[t]=e),this.wrapperEl&&(this.wrapperEl.style[t]=e),this},getZoom:function(){return Math.sqrt(this.viewportTransform[0]*this.viewportTransform[3])},setViewportTransform:function(t){var e=this.getActiveGroup();this.viewportTransform=t,this.renderAll();for(var i=0,r=this._objects.length;i"),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,n=e.width||this.width,s=e.height||this.height,o='viewBox="0 0 '+this.width+" "+this.height+'" ',a=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?o='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,o='viewBox="'+r(-i[4]/i[0],a)+" "+r(-i[5]/i[3],a)+" "+r(this.width/i[0],a)+" "+r(this.height/i[3],a)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),"\n")},_setSVGObjects:function(t,e){for(var i,r,n=0,s=this.getObjects(),o=s.length;n\n"):this[e]&&"overlayColor"===e&&t.push('\n")},sendToBack:function(t){if(!t)return this;var e,r,n,s=this.getActiveGroup?this.getActiveGroup():null;if(t===s)for(n=s._objects,e=n.length;e--;)r=n[e],i(this._objects,r),this._objects.unshift(r);else i(this._objects,t),this._objects.unshift(t);return this.renderAll&&this.renderAll()},bringToFront:function(t){if(!t)return this;var e,r,n,s=this.getActiveGroup?this.getActiveGroup():null;if(t===s)for(n=s._objects,e=0;e=0;--n){var s=t.intersectsWithObject(this._objects[n])||t.isContainedWithinObject(this._objects[n])||this._objects[n].isContainedWithinObject(t);if(s){r=n;break}}}else r=e-1;return r},bringForward:function(t,e){if(!t)return this;var r,n,s,o,a,h=this.getActiveGroup?this.getActiveGroup():null;if(t===h)for(a=h._objects,r=a.length;r--;)n=a[r],s=this._objects.indexOf(n),s!==this._objects.length-1&&(o=s+1,i(this._objects,n),this._objects.splice(o,0,n));else s=this._objects.indexOf(t),s!==this._objects.length-1&&(o=this._findNewUpperIndex(t,s,e),i(this._objects,t),this._objects.splice(o,0,t));return this.renderAll&&this.renderAll(),this},_findNewUpperIndex:function(t,e,i){var r;if(i){r=e;for(var n=e+1;n"}}),t(fabric.StaticCanvas.prototype,fabric.Observable),t(fabric.StaticCanvas.prototype,fabric.Collection),t(fabric.StaticCanvas.prototype,fabric.DataURLExporter),t(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=fabric.util.createCanvasElement();if(!e||!e.getContext)return null;var i=e.getContext("2d");if(!i)return null;switch(t){case"getImageData":return"undefined"!=typeof i.getImageData;case"setLineDash":return"undefined"!=typeof i.setLineDash;case"toDataURL":return"undefined"!=typeof e.toDataURL;case"toDataURLWithQuality":try{return e.toDataURL("image/jpeg",0),!0}catch(r){}return!1;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",strokeDashArray:null,setShadow:function(t){return this.shadow=new fabric.Shadow(t),this},_setBrushStyles:function(){var t=this.canvas.contextTop;t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,this.strokeDashArray&&fabric.StaticCanvas.supports("setLineDash")&&t.setLineDash(this.strokeDashArray)},_setShadow:function(){if(this.shadow){var t=this.canvas.contextTop;t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur,t.shadowOffsetX=this.shadow.offsetX,t.shadowOffsetY=this.shadow.offsetY}},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}}),function(){fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(t){this.canvas=t,this._points=[]},onMouseDown:function(t){this._prepareForDrawing(t),this._captureDrawingPath(t),this._render()},onMouseMove:function(t){this._captureDrawingPath(t),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(t){var e=new fabric.Point(t.x,t.y);this._reset(),this._addPoint(e),this.canvas.contextTop.moveTo(e.x,e.y)},_addPoint:function(t){this._points.push(t)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(t){var e=new fabric.Point(t.x,t.y);this._addPoint(e)},_render:function(){var t=this.canvas.contextTop,e=this.canvas.viewportTransform,i=this._points[0],r=this._points[1];t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5]),t.beginPath(),2===this._points.length&&i.x===r.x&&i.y===r.y&&(i.x-=.5,r.x+=.5),t.moveTo(i.x,i.y);for(var n=1,s=this._points.length;n0?1:-1,"y"===i&&(s=e.target.skewY,o="top",a="bottom",r="originY"),n[-1]=o,n[1]=a,e.target.flipX&&(c*=-1),e.target.flipY&&(c*=-1),0===s?(e.skewSign=-h*t*c,e[r]=n[-t]):(s=s>0?1:-1,e.skewSign=s,e[r]=n[s*h*c])},_skewObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=!1,o=n.get("lockSkewingX"),a=n.get("lockSkewingY");if(o&&"x"===i||a&&"y"===i)return!1;var h,c,l=n.getCenterPoint(),u=n.toLocalPoint(new fabric.Point(t,e),"center","center")[i],f=n.toLocalPoint(new fabric.Point(r.lastX,r.lastY),"center","center")[i],d=n._getTransformedDimensions();return this._changeSkewTransformOrigin(u-f,r,i),h=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY)[i],c=n.translateToOriginPoint(l,r.originX,r.originY),s=this._setObjectSkew(h,r,i,d),r.lastX=t,r.lastY=e,n.setPositionByOrigin(c,r.originX,r.originY),s},_setObjectSkew:function(t,e,i,r){var n,s,o,a,h,c,l,u,f,d=e.target,g=!1,p=e.skewSign;return"x"===i?(a="y",h="Y",c="X",u=0,f=d.skewY):(a="x",h="X",c="Y",u=d.skewX,f=0),o=d._getTransformedDimensions(u,f),l=2*Math.abs(t)-o[i],l<=2?n=0:(n=p*Math.atan(l/d["scale"+c]/(o[a]/d["scale"+h])),n=fabric.util.radiansToDegrees(n)),g=d["skew"+c]!==n,d.set("skew"+c,n),0!==d["skew"+h]&&(s=d._getTransformedDimensions(),n=r[a]/s[a]*d["scale"+h],d.set("scale"+h,n)),g},_scaleObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=n.get("lockScalingX"),o=n.get("lockScalingY"),a=n.get("lockScalingFlip");if(s&&o)return!1;var h=n.translateToOriginPoint(n.getCenterPoint(),r.originX,r.originY),c=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY),l=n._getTransformedDimensions(),u=!1;return this._setLocalMouse(c,r),u=this._setObjectScale(c,r,s,o,i,a,l),n.setPositionByOrigin(h,r.originX,r.originY),u},_setObjectScale:function(t,e,i,r,n,s,o){var a,h,c,l,u=e.target,f=!1,d=!1,g=!1;return c=t.x*u.scaleX/o.x,l=t.y*u.scaleY/o.y,a=u.scaleX!==c,h=u.scaleY!==l,s&&c<=0&&ci.padding?t.x<0?t.x+=i.padding:t.x-=i.padding:t.x=0,n(t.y)>i.padding?t.y<0?t.y+=i.padding:t.y-=i.padding:t.y=0},_rotateObject:function(t,e){var n=this._currentTransform;if(n.target.get("lockRotation"))return!1;var s=r(n.ey-n.top,n.ex-n.left),o=r(e-n.top,t-n.left),a=i(o-s+n.theta);return a<0&&(a=360+a),n.target.angle=a%360,!0},setCursor:function(t){this.upperCanvasEl.style.cursor=t},_resetObjectTransform:function(t){t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.setAngle(0)},_drawSelection:function(){var t=this.contextTop,e=this._groupSelector,i=e.left,r=e.top,o=n(i),a=n(r);if(t.fillStyle=this.selectionColor,t.fillRect(e.ex-(i>0?0:-i),e.ey-(r>0?0:-r),o,a),t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,this.selectionDashArray.length>1){var h=e.ex+s-(i>0?0:o),c=e.ey+s-(r>0?0:a);t.beginPath(),fabric.util.drawDashedLine(t,h,c,h+o,c,this.selectionDashArray),fabric.util.drawDashedLine(t,h,c+a-1,h+o,c+a-1,this.selectionDashArray),fabric.util.drawDashedLine(t,h,c,h,c+a,this.selectionDashArray),fabric.util.drawDashedLine(t,h+o-1,c,h+o-1,c+a,this.selectionDashArray),t.closePath(),t.stroke()}else t.strokeRect(e.ex+s-(i>0?0:o),e.ey+s-(r>0?0:a),o,a)},findTarget:function(t,e){if(!this.skipTargetFind){var i=this.getPointer(t,!0),r=this.getActiveGroup(),n=this.getActiveObject();if(r&&!e&&this._checkTarget(i,r))return r;if(n&&this._checkTarget(i,n))return n;this.targets=[];var s=this._searchPossibleTargets(this._objects,i);return this._fireOverOutEvents(s,t),s}},_fireOverOutEvents:function(t,e){t?this._hoveredTarget!==t&&(this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout")),this.fire("mouse:over",{target:t,e:e}),t.fire("mouseover"),this._hoveredTarget=t):this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout"),this._hoveredTarget=null)},_checkTarget:function(t,e){if(e&&e.visible&&e.evented&&this.containsPoint(null,e,t)){if(!this.perPixelTargetFind&&!e.perPixelTargetFind||e.isEditing)return!0;var i=this.isTargetTransparent(e,t.x,t.y);if(!i)return!0}},_searchPossibleTargets:function(t,e){for(var i,r,n,s=t.length;s--;)if(this._checkTarget(e,t[s])){i=t[s],"group"===i.type&&i.subTargetCheck&&(r=this._normalizePointer(i,e),n=this._searchPossibleTargets(i._objects,r),n&&this.targets.push(n));break}return i},getPointer:function(e,i,r){r||(r=this.upperCanvasEl);var n,s=t(e),o=r.getBoundingClientRect(),a=o.width||0,h=o.height||0;return a&&h||("top"in o&&"bottom"in o&&(h=Math.abs(o.top-o.bottom)),"right"in o&&"left"in o&&(a=Math.abs(o.right-o.left))),this.calcOffset(),s.x=s.x-this._offset.left,s.y=s.y-this._offset.top,i||(s=fabric.util.transformPoint(s,fabric.util.invertTransform(this.viewportTransform))),n=0===a||0===h?{width:1,height:1}:{width:r.width/a,height:r.height/h},{x:s.x*n.width,y:s.y*n.height}},_createUpperCanvas:function(){var t=this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/,"");this.upperCanvasEl=this._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+t),this.wrapperEl.appendChild(this.upperCanvasEl),this._copyCanvasStyle(this.lowerCanvasEl,this.upperCanvasEl),this._applyCanvasStyle(this.upperCanvasEl),this.contextTop=this.upperCanvasEl.getContext("2d")},_createCacheCanvas:function(){this.cacheCanvasEl=this._createCanvasElement(),this.cacheCanvasEl.setAttribute("width",this.width),this.cacheCanvasEl.setAttribute("height",this.height),this.contextCache=this.cacheCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{"class":this.containerClass}),fabric.util.setStyle(this.wrapperEl,{width:this.getWidth()+"px",height:this.getHeight()+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(t){var e=this.getWidth()||t.width,i=this.getHeight()||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0}),t.width=e,t.height=i,fabric.util.makeElementUnselectable(t)},_copyCanvasStyle:function(t,e){e.style.cssText=t.style.cssText},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},_setActiveObject:function(t){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=t,t.set("active",!0)},setActiveObject:function(t,e){return this._setActiveObject(t),this.renderAll(),this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e}),this},getActiveObject:function(){return this._activeObject},_discardActiveObject:function(){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=null},discardActiveObject:function(t){return this._discardActiveObject(),this.renderAll(),this.fire("selection:cleared",{e:t}),this},_setActiveGroup:function(t){this._activeGroup=t,t&&t.set("active",!0)},setActiveGroup:function(t,e){return this._setActiveGroup(t),t&&(this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e})),this},getActiveGroup:function(){return this._activeGroup},_discardActiveGroup:function(){var t=this.getActiveGroup();t&&t.destroy(),this.setActiveGroup(null)},discardActiveGroup:function(t){return this._discardActiveGroup(),this.fire("selection:cleared",{e:t}),this},deactivateAll:function(){for(var t=this.getObjects(),e=0,i=t.length;e1)){var r=this._groupSelector;r?(i=this.getPointer(t,!0),r.left=i.x-r.ex,r.top=i.y-r.ey,this.renderTop()):this._currentTransform?this._transformObject(t):(e=this.findTarget(t),this._setCursorFromEvent(t,e)),this._handleEvent(t,"move",e?e:null)}},_transformObject:function(t){var e=this.getPointer(t),i=this._currentTransform;i.reset=!1,i.target.isMoving=!0,this._beforeScaleTransform(t,i),this._performTransformAction(t,i,e),this.renderAll()},_performTransformAction:function(t,e,i){var r=i.x,n=i.y,s=e.target,o=e.action,a=!1;"rotate"===o?(a=this._rotateObject(r,n))&&this._fire("rotating",s,t):"scale"===o?(a=this._onScale(t,e,r,n))&&this._fire("scaling",s,t):"scaleX"===o?(a=this._scaleObject(r,n,"x"))&&this._fire("scaling",s,t):"scaleY"===o?(a=this._scaleObject(r,n,"y"))&&this._fire("scaling",s,t):"skewX"===o?(a=this._skewObject(r,n,"x"))&&this._fire("skewing",s,t):"skewY"===o?(a=this._skewObject(r,n,"y"))&&this._fire("skewing",s,t):(a=this._translateObject(r,n),a&&(this._fire("moving",s,t),this.setCursor(s.moveCursor||this.moveCursor))),e.actionPerformed=a},_fire:function(t,e,i){this.fire("object:"+t,{target:e,e:i}),e.fire(t,{e:i})},_beforeScaleTransform:function(t,e){if("scale"===e.action||"scaleX"===e.action||"scaleY"===e.action){var i=this._shouldCenterTransform(e.target);(i&&("center"!==e.originX||"center"!==e.originY)||!i&&"center"===e.originX&&"center"===e.originY)&&(this._resetCurrentTransform(),e.reset=!0)}},_onScale:function(t,e,i,r){return!t[this.uniScaleKey]&&!this.uniScaleTransform||e.target.get("lockUniScaling")?(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally")):(e.currentAction="scale",this._scaleObject(i,r))},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor;if(e.selectable){var r=this.getActiveGroup(),n=e._findTargetCorner&&(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this._setCornerCursor(n,e,t):this.setCursor(i)}else this.setCursor(i);return!0},_setCornerCursor:function(e,i,r){if(e in t)this.setCursor(this._getRotatedCornerCursor(e,i,r));else{if("mtr"!==e||!i.hasRotatingPoint)return this.setCursor(this.defaultCursor),!1;this.setCursor(this.rotationCursor)}},_getRotatedCornerCursor:function(e,i,r){var n=Math.round(i.getAngle()%360/45);return n<0&&(n+=8),n+=t[e],r[this.altActionKey]&&t[e]%2===0&&(n+=2),n%=8,this.cursorMap[n]}})}(),function(){var t=Math.min,e=Math.max;fabric.util.object.extend(fabric.Canvas.prototype,{_shouldGroup:function(t,e){var i=this.getActiveObject();return t[this.selectionKey]&&e&&e.selectable&&(this.getActiveGroup()||i&&i!==e)&&this.selection},_handleGrouping:function(t,e){var i=this.getActiveGroup();(e!==i||(e=this.findTarget(t,!0)))&&(i?this._updateActiveGroup(e,t):this._createActiveGroup(e,t),this._activeGroup&&this._activeGroup.saveCoords())},_updateActiveGroup:function(t,e){var i=this.getActiveGroup();if(i.contains(t)){if(i.removeWithUpdate(t),t.set("active",!1),1===i.size())return this.discardActiveGroup(e),void this.setActiveObject(i.item(0))}else i.addWithUpdate(t);this.fire("selection:created",{target:i,e:e}),i.set("active",!0)},_createActiveGroup:function(t,e){if(this._activeObject&&t!==this._activeObject){var i=this._createGroup(t);i.addWithUpdate(),this.setActiveGroup(i),this._activeObject=null,this.fire("selection:created",{target:i,e:e})}t.set("active",!0)},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.Group(e.reverse(),{canvas:this}),e.addWithUpdate(),this.setActiveGroup(e,t),e.saveCoords(),this.fire("selection:created",{target:e}),this.renderAll())},_collectObjects:function(){for(var i,r=[],n=this._groupSelector.ex,s=this._groupSelector.ey,o=n+this._groupSelector.left,a=s+this._groupSelector.top,h=new fabric.Point(t(n,o),t(s,a)),c=new fabric.Point(e(n,o),e(s,a)),l=n===o&&s===a,u=this._objects.length;u--&&(i=this._objects[u],!(i&&i.selectable&&i.visible&&(i.intersectsWithRect(h,c)||i.isContainedWithinRect(h,c)||i.containsPoint(h)||i.containsPoint(c))&&(i.set("active",!0),r.push(i),l))););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t);var e=this.getActiveGroup();e&&(e.setObjectsCoords().setCoords(),e.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(t){t||(t={});var e=t.format||"png",i=t.quality||1,r=t.multiplier||1,n={left:t.left,top:t.top,width:t.width,height:t.height};return this._isRetinaScaling()&&(r*=fabric.devicePixelRatio),1!==r?this.__toDataURLWithMultiplier(e,i,n,r):this.__toDataURL(e,i,n)},__toDataURL:function(t,e,i){this.renderAll();var r=this.contextContainer.canvas,n=this.__getCroppedCanvas(r,i);"jpg"===t&&(t="jpeg");var s=fabric.StaticCanvas.supports("toDataURLWithQuality")?(n||r).toDataURL("image/"+t,e):(n||r).toDataURL("image/"+t);return n&&(n=null),s},__getCroppedCanvas:function(t,e){var i,r,n="left"in e||"top"in e||"width"in e||"height"in e;return n&&(i=fabric.util.createCanvasElement(),r=i.getContext("2d"),i.width=e.width||this.width,i.height=e.height||this.height,r.drawImage(t,-e.left||0,-e.top||0)),i},__toDataURLWithMultiplier:function(t,e,i,r){var n=this.getWidth(),s=this.getHeight(),o=n*r,a=s*r,h=this.getActiveObject(),c=this.getActiveGroup(),l=this.getZoom(),u=l*r/fabric.devicePixelRatio;r>1&&this.setDimensions({width:o,height:a}),this.setZoom(u),i.left&&(i.left*=r),i.top&&(i.top*=r),i.width?i.width*=r:r<1&&(i.width=o),i.height?i.height*=r:r<1&&(i.height=a),c?this._tempRemoveBordersControlsFromGroup(c):h&&this.deactivateAll&&this.deactivateAll();var f=this.__toDataURL(t,e,i);return c?this._restoreBordersControlsOnGroup(c):h&&this.setActiveObject&&this.setActiveObject(h),this.setZoom(l),this.setDimensions({width:n,height:s}),f},toDataURLWithMultiplier:function(t,e,i){return this.toDataURL({format:t,multiplier:e,quality:i})},_tempRemoveBordersControlsFromGroup:function(t){t.origHasControls=t.hasControls,t.origBorderColor=t.borderColor,t.hasControls=!0,t.borderColor="rgba(0,0,0,0)",t.forEachObject(function(t){t.origBorderColor=t.borderColor,t.borderColor="rgba(0,0,0,0)"})},_restoreBordersControlsOnGroup:function(t){t.hideControls=t.origHideControls,t.borderColor=t.origBorderColor,t.forEachObject(function(t){t.borderColor=t.origBorderColor,delete t.origBorderColor})}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(t,e,i){return this.loadFromJSON(t,e,i)},loadFromJSON:function(t,e,i){if(t){var r="string"==typeof t?JSON.parse(t):fabric.util.object.clone(t);this.clear();var n=this;return this._enlivenObjects(r.objects,function(){n._setBgOverlay(r,function(){delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay;for(var t in r)n[t]=r[t];e&&e()})},i),this}},_setBgOverlay:function(t,e){var i=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var n=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(i.renderAll(),e&&e())};this.__setBgOverlay("backgroundImage",t.backgroundImage,r,n),this.__setBgOverlay("overlayImage",t.overlayImage,r,n),this.__setBgOverlay("backgroundColor",t.background,r,n),this.__setBgOverlay("overlayColor",t.overlay,r,n),n()},__setBgOverlay:function(t,e,i,r){var n=this;return e?void("backgroundImage"===t||"overlayImage"===t?fabric.Image.fromObject(e,function(e){n[t]=e,i[t]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(t,!0)](e,function(){i[t]=!0,r&&r()})):void(i[t]=!0)},_enlivenObjects:function(t,e,i){var r=this;if(!t||0===t.length)return void(e&&e());var n=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(t,function(t){t.forEach(function(t,e){r.insertAt(t,e,!0)}),r.renderOnAddRemove=n,e&&e()},null,i)},_toDataURL:function(t,e){this.clone(function(i){e(i.toDataURL(t))})},_toDataURLWithMultiplier:function(t,e,i){this.clone(function(r){i(r.toDataURLWithMultiplier(t,e))})},clone:function(t,e){var i=JSON.stringify(this.toJSON(e));this.cloneWithoutData(function(e){e.loadFromJSON(i,function(){t&&t(e)})})},cloneWithoutData:function(t){var e=fabric.document.createElement("canvas");e.width=this.getWidth(),e.height=this.getHeight();var i=new fabric.Canvas(e);i.clipTo=this.clipTo,this.backgroundImage?(i.setBackgroundImage(this.backgroundImage.src,function(){i.renderAll(),t&&t(i)}),i.backgroundImageOpacity=this.backgroundImageOpacity,i.backgroundImageStretch=this.backgroundImageStretch):t&&t(i)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.toFixed,n=e.util.string.capitalize,s=e.util.degreesToRadians,o=e.StaticCanvas.supports("setLineDash");e.Object||(e.Object=e.util.createClass({type:"object",originX:"left",originY:"top",top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,opacity:1,angle:0,skewX:0,skewY:0,cornerSize:13,transparentCorners:!0,hoverCursor:null,moveCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",borderDashArray:null,cornerColor:"rgba(102,153,255,0.5)",cornerStrokeColor:null,cornerStyle:"rect",cornerDashArray:null,centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"nonzero",globalCompositeOperation:"source-over",backgroundColor:"",selectionBackgroundColor:"",stroke:null,strokeWidth:1,strokeDashArray:null,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:10,shadow:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,transformMatrix:null,minScaleLimit:.01,selectable:!0,evented:!0,visible:!0,hasControls:!0,hasBorders:!0,hasRotatingPoint:!0,rotatingPointOffset:40,perPixelTargetFind:!1,includeDefaultValues:!0,clipTo:null,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockUniScaling:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,excludeFromExport:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule globalCompositeOperation shadow clipTo visible backgroundColor alignX alignY meetOrSlice skewX skewY".split(" "),initialize:function(t){t&&this.setOptions(t)},_initGradient:function(t){!t.fill||!t.fill.colorStops||t.fill instanceof e.Gradient||this.set("fill",new e.Gradient(t.fill)),!t.stroke||!t.stroke.colorStops||t.stroke instanceof e.Gradient||this.set("stroke",new e.Gradient(t.stroke))},_initPattern:function(t){!t.fill||!t.fill.source||t.fill instanceof e.Pattern||this.set("fill",new e.Pattern(t.fill)),!t.stroke||!t.stroke.source||t.stroke instanceof e.Pattern||this.set("stroke",new e.Pattern(t.stroke))},_initClipping:function(t){if(t.clipTo&&"string"==typeof t.clipTo){var i=e.util.getFunctionBody(t.clipTo);"undefined"!=typeof i&&(this.clipTo=new Function("ctx",i))}},setOptions:function(t){for(var e in t)this.set(e,t[e]);this._initGradient(t),this._initPattern(t),this._initClipping(t)},transform:function(t,e){this.group&&!this.group._transformDone&&this.group===this.canvas._activeGroup&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),t.rotate(s(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),t.transform(1,0,Math.tan(s(this.skewX)),1,0,0),t.transform(1,Math.tan(s(this.skewY)),0,1,0,0)},toObject:function(t){var i=e.Object.NUM_FRACTION_DIGITS,n={type:this.type,originX:this.originX,originY:this.originY,left:r(this.left,i),top:r(this.top,i),width:r(this.width,i),height:r(this.height,i),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:r(this.strokeWidth,i),strokeDashArray:this.strokeDashArray?this.strokeDashArray.concat():this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:r(this.strokeMiterLimit,i),scaleX:r(this.scaleX,i),scaleY:r(this.scaleY,i),angle:r(this.getAngle(),i),flipX:this.flipX,flipY:this.flipY,opacity:r(this.opacity,i),shadow:this.shadow&&this.shadow.toObject?this.shadow.toObject():this.shadow,visible:this.visible,clipTo:this.clipTo&&String(this.clipTo),backgroundColor:this.backgroundColor,fillRule:this.fillRule,globalCompositeOperation:this.globalCompositeOperation,transformMatrix:this.transformMatrix?this.transformMatrix.concat():this.transformMatrix,skewX:r(this.skewX,i),skewY:r(this.skewY,i)};return this.includeDefaultValues||(n=this._removeDefaultValues(n)),e.util.populateWithProperties(this,n,t),n},toDatalessObject:function(t){return this.toObject(t)},_removeDefaultValues:function(t){var i=e.util.getKlass(t.type).prototype,r=i.stateProperties;return r.forEach(function(e){t[e]===i[e]&&delete t[e];var r="[object Array]"===Object.prototype.toString.call(t[e])&&"[object Array]"===Object.prototype.toString.call(i[e]);r&&0===t[e].length&&0===i[e].length&&delete t[e]}),t},toString:function(){return"#"},get:function(t){return this[t]},getObjectScaling:function(){var t=this.scaleX,e=this.scaleY;if(this.group){var i=this.group.getObjectScaling();t*=i.scaleX,e*=i.scaleY}return{scaleX:t,scaleY:e}},_setObject:function(t){for(var e in t)this._set(e,t[e])},set:function(t,e){return"object"==typeof t?this._setObject(t):"function"==typeof e&&"clipTo"!==t?this._set(t,e(this.get(t))):this._set(t,e),this},_set:function(t,i){var r="scaleX"===t||"scaleY"===t;return r&&(i=this._constrainScale(i)),"scaleX"===t&&i<0?(this.flipX=!this.flipX,i*=-1):"scaleY"===t&&i<0?(this.flipY=!this.flipY,i*=-1):"shadow"!==t||!i||i instanceof e.Shadow||(i=new e.Shadow(i)),this[t]=i,"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},setSourcePath:function(t){return this.sourcePath=t,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:[1,0,0,1,0,0]},render:function(t,i){0===this.width&&0===this.height||!this.visible||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),i||this.transform(t),this._setStrokeStyles(t),this._setFillStyles(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this._setOpacity(t),this._setShadow(t),this.clipTo&&e.util.clipContext(this,t),this._render(t,i),this.clipTo&&t.restore(),t.restore())},_setOpacity:function(t){this.group&&this.group._setOpacity(t),t.globalAlpha*=this.opacity},_setStrokeStyles:function(t){this.stroke&&(t.lineWidth=this.strokeWidth,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,t.strokeStyle=this.stroke.toLive?this.stroke.toLive(t,this):this.stroke)},_setFillStyles:function(t){this.fill&&(t.fillStyle=this.fill.toLive?this.fill.toLive(t,this):this.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),o?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){if(!(!this.active||i||this.group&&this.group!==this.canvas.getActiveGroup())){var r,n=this.getViewportTransform(),o=this.calcTransformMatrix();o=e.util.multiplyTransformMatrices(n,o),r=e.util.qrDecompose(o),t.save(),t.translate(r.translateX,r.translateY),t.lineWidth=1/this.borderScaleFactor,t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,this.group&&this.group===this.canvas.getActiveGroup()?(t.rotate(s(r.angle)),this.drawBordersInGroup(t,r)):(t.rotate(s(this.angle)),this.drawBorders(t)),this.drawControls(t),t.restore()}},_setShadow:function(t){if(this.shadow){var i=this.canvas&&this.canvas.viewportTransform[0]||1,r=this.canvas&&this.canvas.viewportTransform[3]||1,n=this.getObjectScaling();this.canvas&&this.canvas._isRetinaScaling()&&(i*=e.devicePixelRatio,r*=e.devicePixelRatio),t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*(i+r)*(n.scaleX+n.scaleY)/4,t.shadowOffsetX=this.shadow.offsetX*i*n.scaleX,t.shadowOffsetY=this.shadow.offsetY*r*n.scaleY}},_removeShadow:function(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)},_renderFill:function(t){if(this.fill){if(t.save(),this.fill.gradientTransform){var e=this.fill.gradientTransform;t.transform.apply(t,e)}this.fill.toLive&&t.translate(-this.width/2+this.fill.offsetX||0,-this.height/2+this.fill.offsetY||0),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore()}},_renderStroke:function(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray,this._renderDashedStroke),this.stroke.gradientTransform){var e=this.stroke.gradientTransform;t.transform.apply(t,e)}this.stroke.toLive&&t.translate(-this.width/2+this.stroke.offsetX||0,-this.height/2+this.stroke.offsetY||0),t.stroke(),t.restore()}},clone:function(t,i){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(i),t):new e.Object(this.toObject(i))},cloneAsImage:function(t){var i=this.toDataURL();return e.util.loadImage(i,function(i){t&&t(new e.Image(i))}),this},toDataURL:function(t){t||(t={});var i=e.util.createCanvasElement(),r=this.getBoundingRect();i.width=r.width,i.height=r.height,e.util.wrapElement(i,"div");var n=new e.StaticCanvas(i);"jpg"===t.format&&(t.format="jpeg"),"jpeg"===t.format&&(n.backgroundColor="#fff");var s={active:this.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new e.Point(n.getWidth()/2,n.getHeight()/2),"center","center");var o=this.canvas;n.add(this);var a=n.toDataURL(t);return this.set(s).setCoords(),this.canvas=o,n.dispose(),n=null,a},isType:function(t){return this.type===t},complexity:function(){return 0},toJSON:function(t){return this.toObject(t)},setGradient:function(t,i){i||(i={});var r={colorStops:[]};r.type=i.type||(i.r1||i.r2?"radial":"linear"),r.coords={x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2},(i.r1||i.r2)&&(r.coords.r1=i.r1,r.coords.r2=i.r2),i.gradientTransform&&(r.gradientTransform=i.gradientTransform);for(var n in i.colorStops){var s=new e.Color(i.colorStops[n]);r.colorStops.push({offset:n,color:s.toRgb(),opacity:s.getAlpha()})}return this.set(t,e.Gradient.forObject(this,r))},setPatternFill:function(t){return this.set("fill",new e.Pattern(t))},setShadow:function(t){return this.set("shadow",t?new e.Shadow(t):null)},setColor:function(t){return this.set("fill",t),this},setAngle:function(t){var e=("center"!==this.originX||"center"!==this.originY)&&this.centeredRotation;return e&&this._setOriginToCenter(),this.set("angle",t),e&&this._resetOrigin(),this},centerH:function(){return this.canvas&&this.canvas.centerObjectH(this),this},viewportCenterH:function(){return this.canvas&&this.canvas.viewportCenterObjectH(this),this},centerV:function(){return this.canvas&&this.canvas.centerObjectV(this),this},viewportCenterV:function(){return this.canvas&&this.canvas.viewportCenterObjectV(this),this},center:function(){return this.canvas&&this.canvas.centerObject(this),this},viewportCenter:function(){return this.canvas&&this.canvas.viewportCenterObject(this),this},remove:function(){return this.canvas&&this.canvas.remove(this),this},getLocalPointer:function(t,i){i=i||this.canvas.getPointer(t);var r=new e.Point(i.x,i.y),n=this._getLeftTopCoords();return this.angle&&(r=e.util.rotatePoint(r,n,e.util.degreesToRadians(-this.angle))),{x:r.x-n.x,y:r.y-n.y}},_setupCompositeOperation:function(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}}),e.util.createAccessors(e.Object),e.Object.prototype.rotate=e.Object.prototype.setAngle,i(e.Object.prototype,e.Observable),e.Object.NUM_FRACTION_DIGITS=2,e.Object.__uid=0)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.degreesToRadians,e={left:-.5,center:0,right:.5},i={top:-.5,center:0,bottom:.5};fabric.util.object.extend(fabric.Object.prototype,{translateToGivenOrigin:function(t,r,n,s,o){var a,h,c,l=t.x,u=t.y;return"string"==typeof r?r=e[r]:r-=.5,"string"==typeof s?s=e[s]:s-=.5,a=s-r,"string"==typeof n?n=i[n]:n-=.5,"string"==typeof o?o=i[o]:o-=.5,h=o-n,(a||h)&&(c=this._getTransformedDimensions(),l=t.x+a*c.x,u=t.y+h*c.y),new fabric.Point(l,u)},translateToCenterPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,i,r,"center","center");return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},translateToOriginPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,"center","center",i,r);return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},getCenterPoint:function(){var t=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(t,this.originX,this.originY)},getPointByOrigin:function(t,e){var i=this.getCenterPoint();return this.translateToOriginPoint(i,t,e)},toLocalPoint:function(e,i,r){var n,s,o=this.getCenterPoint();return n="undefined"!=typeof i&&"undefined"!=typeof r?this.translateToGivenOrigin(o,"center","center",i,r):new fabric.Point(this.left,this.top),s=new fabric.Point(e.x,e.y),this.angle&&(s=fabric.util.rotatePoint(s,o,-t(this.angle))),s.subtractEquals(n)},setPositionByOrigin:function(t,e,i){var r=this.translateToCenterPoint(t,e,i),n=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",n.x),this.set("top",n.y)},adjustPosition:function(i){var r,n,s=t(this.angle),o=this.getWidth(),a=Math.cos(s)*o,h=Math.sin(s)*o;r="string"==typeof this.originX?e[this.originX]:this.originX-.5,n="string"==typeof i?e[i]:i-.5,this.left+=a*(n-r),this.top+=h*(n-r),this.setCoords(),this.originX=i},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var t=this.getCenterPoint();this.originX="center",this.originY="center",this.left=t.x,this.top=t.y},_resetOrigin:function(){var t=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=t.x,this.top=t.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","top")}})}(),function(){function t(t){return[new fabric.Point(t.tl.x,t.tl.y),new fabric.Point(t.tr.x,t.tr.y),new fabric.Point(t.br.x,t.br.y),new fabric.Point(t.bl.x,t.bl.y)]}var e=fabric.util.degreesToRadians,i=fabric.util.multiplyTransformMatrices;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,intersectsWithRect:function(e,i){var r=t(this.oCoords),n=fabric.Intersection.intersectPolygonRectangle(r,e,i);return"Intersection"===n.status},intersectsWithObject:function(e){var i=fabric.Intersection.intersectPolygonPolygon(t(this.oCoords),t(e.oCoords));return"Intersection"===i.status},isContainedWithinObject:function(t){var e=t.getBoundingRect(),i=new fabric.Point(e.left,e.top),r=new fabric.Point(e.left+e.width,e.top+e.height);return this.isContainedWithinRect(i,r)},isContainedWithinRect:function(t,e){var i=this.getBoundingRect();return i.left>=t.x&&i.left+i.width<=e.x&&i.top>=t.y&&i.top+i.height<=e.y},containsPoint:function(t){this.oCoords||this.setCoords();var e=this._getImageLines(this.oCoords),i=this._findCrossPoints(t,e);return 0!==i&&i%2===1},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s,o,a,h,c=0;for(var l in e)if(h=e[l],!(h.o.y=t.y&&h.d.y>=t.y||(h.o.x===h.d.x&&h.o.x>=t.x?(o=h.o.x,a=t.y):(i=0,r=(h.d.y-h.o.y)/(h.d.x-h.o.x),n=t.y-i*t.x,s=h.o.y-r*h.o.x,o=-(n-s)/(i-r),a=n+i*o),o>=t.x&&(c+=1),2!==c)))break;return c},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(){return this.oCoords||this.setCoords(),fabric.util.makeBoundingBoxFromPoints([this.oCoords.tl,this.oCoords.tr,this.oCoords.br,this.oCoords.bl])},getWidth:function(){return this._getTransformedDimensions().x},getHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)0?Math.atan(s/n):0,c=n/Math.cos(h)/2,l=Math.cos(h+t)*c,u=Math.sin(h+t)*c,f=fabric.util.transformPoint(this.getCenterPoint(),i),d=new fabric.Point(f.x-l,f.y-u),g=new fabric.Point(d.x+n*a,d.y+n*o),p=new fabric.Point(d.x-s*o,d.y+s*a),v=new fabric.Point(f.x+l,f.y+u),b=new fabric.Point((d.x+p.x)/2,(d.y+p.y)/2),m=new fabric.Point((g.x+d.x)/2,(g.y+d.y)/2),y=new fabric.Point((v.x+g.x)/2,(v.y+g.y)/2),_=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point(m.x+o*this.rotatingPointOffset,m.y-a*this.rotatingPointOffset);return this.oCoords={tl:d,tr:g,br:v,bl:p,ml:b,mt:m,mr:y,mb:_,mtr:x},this._setCornerCoords&&this._setCornerCoords(),this},_calcRotateMatrix:function(){if(this.angle){var t=e(this.angle),i=Math.cos(t),r=Math.sin(t);return[i,r,-r,i,0,0]}return[1,0,0,1,0,0]},calcTransformMatrix:function(){var t=this.getCenterPoint(),e=[1,0,0,1,t.x,t.y],r=this._calcRotateMatrix(),n=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0),s=this.group?this.group.calcTransformMatrix():[1,0,0,1,0,0];return s=i(s,e),s=i(s,r),s=i(s,n)},_calcDimensionsTransformMatrix:function(t,r,n){var s=[1,0,Math.tan(e(t)),1],o=[1,Math.tan(e(r)),0,1],a=this.scaleX*(n&&this.flipX?-1:1),h=this.scaleY*(n&&this.flipY?-1:1),c=[a,0,0,h],l=i(c,s,!0);return i(l,o,!0)}})}(),fabric.util.object.extend(fabric.Object.prototype,{sendToBack:function(){return this.group?fabric.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?fabric.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(t){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,t):this.canvas.sendBackwards(this,t),this},bringForward:function(t){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,t):this.canvas.bringForward(this,t), this},moveTo:function(t){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,t):this.canvas.moveTo(this,t),this}}),function(){function t(t,e){if(e){if(e.toLive)return t+": url(#SVGID_"+e.id+"); ";var i=new fabric.Color(e),r=t+": "+i.toRgb()+"; ",n=i.getAlpha();return 1!==n&&(r+=t+"-opacity: "+n.toString()+"; "),r}return t+": none; "}fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(e){var i=this.fillRule,r=this.strokeWidth?this.strokeWidth:"0",n=this.strokeDashArray?this.strokeDashArray.join(" "):"none",s=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h="undefined"!=typeof this.opacity?this.opacity:"1",c=this.visible?"":" visibility: hidden;",l=e?"":this.getSvgFilter(),u=t("fill",this.fill),f=t("stroke",this.stroke);return[f,"stroke-width: ",r,"; ","stroke-dasharray: ",n,"; ","stroke-linecap: ",s,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",i,"; ","opacity: ",h,";",l,c].join("")},getSvgFilter:function(){return this.shadow?"filter: url(#SVGID_"+this.shadow.id+");":""},getSvgId:function(){return this.id?'id="'+this.id+'" ':""},getSvgTransform:function(){if(this.group&&"path-group"===this.group.type)return"";var t=fabric.util.toFixed,e=this.getAngle(),i=this.getSkewX()%360,r=this.getSkewY()%360,n=this.getCenterPoint(),s=fabric.Object.NUM_FRACTION_DIGITS,o="path-group"===this.type?"":"translate("+t(n.x,s)+" "+t(n.y,s)+")",a=0!==e?" rotate("+t(e,s)+")":"",h=1===this.scaleX&&1===this.scaleY?"":" scale("+t(this.scaleX,s)+" "+t(this.scaleY,s)+")",c=0!==i?" skewX("+t(i,s)+")":"",l=0!==r?" skewY("+t(r,s)+")":"",u="path-group"===this.type?this.width:0,f=this.flipX?" matrix(-1 0 0 1 "+u+" 0) ":"",d="path-group"===this.type?this.height:0,g=this.flipY?" matrix(1 0 0 -1 0 "+d+")":"";return[o,a,h,f,g,c,l].join("")},getSvgTransformMatrix:function(){return this.transformMatrix?" matrix("+this.transformMatrix.join(" ")+") ":""},_createBaseSVGMarkup:function(){var t=[];return this.fill&&this.fill.toLive&&t.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&t.push(this.stroke.toSVG(this,!1)),this.shadow&&t.push(this.shadow.toSVG(this)),t}})}(),fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(){return this.stateProperties.some(function(t){return this.get(t)!==this.originalState[t]},this)},saveState:function(t){return this.stateProperties.forEach(function(t){this.originalState[t]=this.get(t)},this),t&&t.stateProperties&&t.stateProperties.forEach(function(t){this.originalState[t]=this.get(t)},this),this},setupState:function(){return this.originalState={},this.saveState(),this}}),function(){var t=fabric.util.degreesToRadians,e=function(){return"undefined"!=typeof G_vmlCanvasManager};fabric.util.object.extend(fabric.Object.prototype,{_controlsVisibility:null,_findTargetCorner:function(t){if(!this.hasControls||!this.active)return!1;var e,i,r=t.x,n=t.y;this.__corner=0;for(var s in this.oCoords)if(this.isControlVisible(s)&&("mtr"!==s||this.hasRotatingPoint)&&(!this.get("lockUniScaling")||"mt"!==s&&"mr"!==s&&"mb"!==s&&"ml"!==s)&&(i=this._getImageLines(this.oCoords[s].corner),e=this._findCrossPoints({x:r,y:n},i),0!==e&&e%2===1))return this.__corner=s,s;return!1},_setCornerCoords:function(){var e,i,r=this.oCoords,n=t(45-this.angle),s=.707106*this.cornerSize,o=s*Math.cos(n),a=s*Math.sin(n);for(var h in r)e=r[h].x,i=r[h].y,r[h].corner={tl:{x:e-a,y:i-o},tr:{x:e+o,y:i-a},bl:{x:e-o,y:i+a},br:{x:e+a,y:i+o}}},_getNonTransformedDimensions:function(){var t=this.strokeWidth,e=this.width,i=this.height,r=!0,n=!0;return"line"===this.type&&"butt"===this.strokeLineCap&&(n=e,r=i),n&&(i+=i<0?-t:t),r&&(e+=e<0?-t:t),{x:e,y:i}},_getTransformedDimensions:function(t,e){"undefined"==typeof t&&(t=this.skewX),"undefined"==typeof e&&(e=this.skewY);var i,r,n=this._getNonTransformedDimensions(),s=n.x/2,o=n.y/2,a=[{x:-s,y:-o},{x:s,y:-o},{x:-s,y:o},{x:s,y:o}],h=this._calcDimensionsTransformMatrix(t,e,!1);for(i=0;i\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e){var n=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),s=[n.x1||0,n.y1||0,n.x2||0,n.y2||0];return new i.Line(s,r(n,e))},void(i.Line.fromObject=function(t){var e=[t.x1,t.y1,t.x2,t.y2];return new i.Line(e,t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){return"radius"in t&&t.radius>=0}var i=t.fabric||(t.fabric={}),r=Math.PI,n=i.util.object.extend;return i.Circle?void i.warn("fabric.Circle is already defined."):(i.Circle=i.util.createClass(i.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*r,initialize:function(t){t=t||{},this.callSuper("initialize",t),this.set("radius",t.radius||0),this.startAngle=t.startAngle||this.startAngle,this.endAngle=t.endAngle||this.endAngle},_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return n(this.callSuper("toObject",t),{radius:this.get("radius"),startAngle:this.startAngle,endAngle:this.endAngle})},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,n=0,s=(this.endAngle-this.startAngle)%(2*r);if(0===s)this.group&&"path-group"===this.group.type&&(i=this.left+this.radius,n=this.top+this.radius),e.push("\n');else{var o=Math.cos(this.startAngle)*this.radius,a=Math.sin(this.startAngle)*this.radius,h=Math.cos(this.endAngle)*this.radius,c=Math.sin(this.endAngle)*this.radius,l=s>r?"1":"0";e.push('\n')}return t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.arc(e?this.left+this.radius:0,e?this.top+this.radius:0,this.radius,this.startAngle,this.endAngle,!1),this._renderFill(t),this._renderStroke(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)},complexity:function(){return 1}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r){r||(r={});var s=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(s))throw new Error("value of `r` attribute is required and can not be negative");s.left=s.left||0,s.top=s.top||0;var o=new i.Circle(n(s,r));return o.left-=o.radius,o.top-=o.radius,o},void(i.Circle.fromObject=function(t){return new i.Circle(t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});return e.Triangle?void e.warn("fabric.Triangle is already defined"):(e.Triangle=e.util.createClass(e.Object,{type:"triangle",initialize:function(t){t=t||{},this.callSuper("initialize",t),this.set("width",t.width||100).set("height",t.height||100)},_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=this.width/2,r=this.height/2;t.beginPath(),e.util.drawDashedLine(t,-i,r,0,-r,this.strokeDashArray),e.util.drawDashedLine(t,0,-r,i,r,this.strokeDashArray),e.util.drawDashedLine(t,i,r,-i,r,this.strokeDashArray),t.closePath()},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.width/2,r=this.height/2,n=[-i+" "+r,"0 "+-r,i+" "+r].join(",");return e.push("'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),void(e.Triangle.fromObject=function(t){return new e.Triangle(t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=2*Math.PI,r=e.util.object.extend;return e.Ellipse?void e.warn("fabric.Ellipse is already defined."):(e.Ellipse=e.util.createClass(e.Object,{type:"ellipse",rx:0,ry:0,initialize:function(t){t=t||{},this.callSuper("initialize",t),this.set("rx",t.rx||0),this.set("ry",t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return r(this.callSuper("toObject",t),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,r=0;return this.group&&"path-group"===this.group.type&&(i=this.left+this.rx,r=this.top+this.ry),e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(e?this.left+this.rx:0,e?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)},complexity:function(){return 1}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i){i||(i={});var n=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Ellipse(r(n,i));return s.top-=s.ry,s.left-=s.rx,s},void(e.Ellipse.fromObject=function(t){return new e.Ellipse(t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;if(e.Rect)return void e.warn("fabric.Rect is already defined");var r=e.Object.prototype.stateProperties.concat();r.push("rx","ry","x","y"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(t){t=t||{},this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t,e){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var i=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,n=this.width,s=this.height,o=e?this.left:-this.width/2,a=e?this.top:-this.height/2,h=0!==i||0!==r,c=.4477152502;t.beginPath(),t.moveTo(o+i,a),t.lineTo(o+n-i,a),h&&t.bezierCurveTo(o+n-c*i,a,o+n,a+c*r,o+n,a+r),t.lineTo(o+n,a+s-r),h&&t.bezierCurveTo(o+n,a+s-c*r,o+n-c*i,a+s,o+n-i,a+s),t.lineTo(o+i,a+s),h&&t.bezierCurveTo(o+c*i,a+s,o,a+s-c*r,o,a+s-r),t.lineTo(o,a+r),h&&t.bezierCurveTo(o,a+c*r,o+c*i,a,o+i,a),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=-this.width/2,r=-this.height/2,n=this.width,s=this.height;t.beginPath(),e.util.drawDashedLine(t,i,r,i+n,r,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r,i+n,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r+s,i,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i,r+s,i,r,this.strokeDashArray),t.closePath()},toObject:function(t){var e=i(this.callSuper("toObject",t),{rx:this.get("rx")||0,ry:this.get("ry")||0});return this.includeDefaultValues||this._removeDefaultValues(e),e},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.left,r=this.top;return this.group&&"path-group"===this.group.type||(i=-this.width/2,r=-this.height/2),e.push("\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r){if(!t)return null;r=r||{};var n=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Rect(i(r?e.util.object.clone(r):{},n));return s.visible=s.visible&&s.width>0&&s.height>0,s},e.Rect.fromObject=function(t){return new e.Rect(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});return e.Polyline?void e.warn("fabric.Polyline is already defined"):(e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,initialize:function(t,i){return e.Polygon.prototype.initialize.call(this,t,i)},_calcDimensions:function(){return e.Polygon.prototype._calcDimensions.call(this)},toObject:function(t){return e.Polygon.prototype.toObject.call(this,t)},toSVG:function(t){return e.Polygon.prototype.toSVG.call(this,t)},_render:function(t,i){e.Polygon.prototype.commonRender.call(this,t,i)&&(this._renderFill(t),this._renderStroke(t))},_renderDashedStroke:function(t){var i,r;t.beginPath();for(var n=0,s=this.points.length;n\n'),t?t(r.join("")):r.join("")},_render:function(t,e){this.commonRender(t,e)&&(this._renderFill(t),(this.stroke||this.strokeDashArray)&&(t.closePath(),this._renderStroke(t)))},commonRender:function(t,e){var i,r=this.points.length;if(!r||isNaN(this.points[r-1].y))return!1;e||t.translate(-this.pathOffset.x,-this.pathOffset.y),t.beginPath(),t.moveTo(this.points[0].x,this.points[0].y);for(var n=0;n"},toObject:function(t){var e=n(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()}),pathOffset:this.pathOffset});return this.sourcePath&&(e.sourcePath=this.sourcePath),this.transformMatrix&&(e.transformMatrix=this.transformMatrix),e},toDatalessObject:function(t){var e=this.toObject(t);return this.sourcePath&&(e.path=this.sourcePath),delete e.sourcePath,e},toSVG:function(t){for(var e=[],i=this._createBaseSVGMarkup(),r="",n=0,s=this.path.length;n\n"),t?t(i.join("")):i.join("")},complexity:function(){return this.path.length},_parsePath:function(){for(var t,e,i,r,n,s=[],o=[],c=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi,l=0,u=this.path.length;lp)for(var b=1,m=n.length;b\n"); -for(var s=0,o=e.length;s\n"),t?t(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var t=this.getObjects()[0].get("fill")||"";return"string"==typeof t&&(t=t.toLowerCase(),this.getObjects().every(function(e){var i=e.get("fill")||"";return"string"==typeof i&&i.toLowerCase()===t}))},complexity:function(){return this.paths.reduce(function(t,e){return t+(e&&e.complexity?e.complexity():0)},0)},getObjects:function(){return this.paths}}),e.PathGroup.fromObject=function(t,i){"string"==typeof t.paths?e.loadSVGFromURL(t.paths,function(r){var n=t.paths;delete t.paths;var s=e.util.groupSVGElements(r,t,n);i(s)}):e.util.enlivenObjects(t.paths,function(r){delete t.paths,i(new e.PathGroup(r,t))})},void(e.PathGroup.async=!0))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max,s=e.util.array.invoke;if(!e.Group){var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};e.Group=e.util.createClass(e.Object,e.Collection,{type:"group",strokeWidth:0,subTargetCheck:!1,initialize:function(t,e,i){e=e||{},this._objects=[],i&&this.callSuper("initialize",e),this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},e.originX&&(this.originX=e.originX),e.originY&&(this.originY=e.originY),i?this._updateObjectsCoords(!0):(this._calcBounds(),this._updateObjectsCoords(),this.callSuper("initialize",e)),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(t){for(var e=this._objects.length;e--;)this._updateObjectCoords(this._objects[e],t)},_updateObjectCoords:function(t,e){if(t.__origHasControls=t.hasControls,t.hasControls=!1,!e){var i=t.getLeft(),r=t.getTop(),n=this.getCenterPoint();t.set({originalLeft:i,originalTop:r,left:i-n.x,top:r-n.y}),t.setCoords()}},toString:function(){return"#"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this},_setObjectActive:function(t){t.set("active",!0),t.group=this},removeWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),this.forEachObject(this._setObjectActive,this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(t){t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){delete t.group,t.set("active",!1)},delegatedProperties:{fill:!0,stroke:!0,strokeWidth:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(t,e){var i=this._objects.length;if(this.delegatedProperties[t]||"canvas"===t)for(;i--;)this._objects[i].set(t,e);else for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){return i(this.callSuper("toObject",t),{objects:s(this._objects,"toObject",t)})},render:function(t){if(this.visible){t.save(),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.transform(t),this._setShadow(t),this.clipTo&&e.util.clipContext(this,t),this._transformDone=!0;for(var i=0,r=this._objects.length;i\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")},get:function(t){if(t in o){if(this[t])return this[t];for(var e=0,i=this._objects.length;e\n',"\n"),this.stroke||this.strokeDashArray){var s=this.fill;this.fill=null,e.push("\n'),this.fill=s}return e.push("\n"),t?t(e.join("")):e.join("")},getSrc:function(){if(this.getElement())return this.getElement().src||this.getElement()._src},setSrc:function(t,e,i){fabric.util.loadImage(t,function(t){return this.setElement(t,e,i)},this,i&&i.crossOrigin)},toString:function(){return'#'},clone:function(t,e){this.constructor.fromObject(this.toObject(e),t)},applyFilters:function(t,e,i,r){if(e=e||this.filters,i=i||this._originalElement){var n=i,s=fabric.util.createCanvasElement(),o=fabric.util.createImage(),a=this;return s.width=n.width,s.height=n.height,s.getContext("2d").drawImage(n,0,0,n.width,n.height),0===e.length?(this._element=i,t&&t(),s):(e.forEach(function(t){t&&t.applyTo(s,t.scaleX||a.scaleX,t.scaleY||a.scaleY),!r&&t&&"Resize"===t.type&&(a.width*=t.scaleX,a.height*=t.scaleY)}),o.width=s.width,o.height=s.height,fabric.isLikelyNode?(o.src=s.toBuffer(void 0,fabric.Image.pngCompression),a._element=o,!r&&(a._filteredEl=o),t&&t()):(o.onload=function(){a._element=o,!r&&(a._filteredEl=o),t&&t(),o.onload=s=n=null},o.src=s.toDataURL("image/png")),s)}},_render:function(t,e){var i,r,n,s=this._findMargins();i=e?this.left:-this.width/2,r=e?this.top:-this.height/2,"slice"===this.meetOrSlice&&(t.beginPath(),t.rect(i,r,this.width,this.height),t.clip()),this.isMoving===!1&&this.resizeFilters.length&&this._needsResize()?(this._lastScaleX=this.scaleX,this._lastScaleY=this.scaleY,n=this.applyFilters(null,this.resizeFilters,this._filteredEl||this._originalElement,!0)):n=this._element,n&&t.drawImage(n,i+s.marginX,r+s.marginY,s.width,s.height),this._stroke(t),this._renderStroke(t)},_needsResize:function(){return this.scaleX!==this._lastScaleX||this.scaleY!==this._lastScaleY},_findMargins:function(){var t,e,i=this.width,r=this.height,n=0,s=0;return"none"===this.alignX&&"none"===this.alignY||(t=[this.width/this._element.width,this.height/this._element.height],e="meet"===this.meetOrSlice?Math.min.apply(null,t):Math.max.apply(null,t),i=this._element.width*e,r=this._element.height*e,"Mid"===this.alignX&&(n=(this.width-i)/2),"Max"===this.alignX&&(n=this.width-i),"Mid"===this.alignY&&(s=(this.height-r)/2),"Max"===this.alignY&&(s=this.height-r)),{width:i,height:r,marginX:n,marginY:s}},_resetWidthHeight:function(){var t=this.getElement();this.set("width",t.width),this.set("height",t.height)},_initElement:function(t,e){this.setElement(fabric.util.getById(t),null,e),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(t){t||(t={}),this.setOptions(t),this._setWidthHeight(t),this._element&&this.crossOrigin&&(this._element.crossOrigin=this.crossOrigin)},_initFilters:function(t,e){t&&t.length?fabric.util.enlivenObjects(t,function(t){e&&e(t)},"fabric.Image.filters"):e&&e()},_setWidthHeight:function(t){this.width="width"in t?t.width:this.getElement()?this.getElement().width||0:0,this.height="height"in t?t.height:this.getElement()?this.getElement().height||0:0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(t,e){fabric.util.loadImage(t.src,function(i){fabric.Image.prototype._initFilters.call(t,t.filters,function(r){t.filters=r||[],fabric.Image.prototype._initFilters.call(t,t.resizeFilters,function(r){t.resizeFilters=r||[];var n=new fabric.Image(i,t);e&&e(n)})})},null,t.crossOrigin)},fabric.Image.fromURL=function(t,e,i){fabric.util.loadImage(t,function(t){e&&e(new fabric.Image(t,i))},null,i&&i.crossOrigin)},fabric.Image.ATTRIBUTE_NAMES=fabric.SHARED_ATTRIBUTES.concat("x y width height preserveAspectRatio xlink:href".split(" ")),fabric.Image.fromElement=function(t,i,r){var n,s=fabric.parseAttributes(t,fabric.Image.ATTRIBUTE_NAMES);s.preserveAspectRatio&&(n=fabric.util.parsePreserveAspectRatioAttribute(s.preserveAspectRatio),e(s,n)),fabric.Image.fromURL(s["xlink:href"],i,e(r?fabric.util.object.clone(r):{},s))},fabric.Image.async=!0,void(fabric.Image.pngCompression=1))}("undefined"!=typeof exports?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var t=this.getAngle()%360;return t>0?90*Math.round((t-1)/90):90*Math.round(t/90)},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(t){t=t||{};var e=function(){},i=t.onComplete||e,r=t.onChange||e,n=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(t){n.setAngle(t),r()},onComplete:function(){n.setCoords(),i()},onStart:function(){n.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(t){return t.straighten(),this.renderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Image.filters.Brightness=e.util.createClass(e.Image.filters.BaseFilter,{type:"Brightness",initialize:function(t){t=t||{},this.brightness=t.brightness||0},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.brightness,s=0,o=r.length;sb||o<0||o>v||(h=4*(a*v+o),c=l[C*d+w],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,n+=p[h+3]*c);y[s]=e,y[s+1]=i,y[s+2]=r,y[s+3]=n+_*(255-n)}u.putImageData(m,0,0)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=function(t){return new e.Image.filters.Convolute(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Image.filters.GradientTransparency=e.util.createClass(e.Image.filters.BaseFilter,{type:"GradientTransparency",initialize:function(t){t=t||{},this.threshold=t.threshold||100},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.threshold,s=r.length,o=0,a=r.length;o-1?t.channel:0},applyTo:function(t){if(this.mask){var i,r=t.getContext("2d"),n=r.getImageData(0,0,t.width,t.height),s=n.data,o=this.mask.getElement(),a=e.util.createCanvasElement(),h=this.channel,c=n.width*n.height*4;a.width=t.width,a.height=t.height,a.getContext("2d").drawImage(o,0,0,t.width,t.height);var l=a.getContext("2d").getImageData(0,0,t.width,t.height),u=l.data;for(i=0;ic&&i>c&&r>c&&l(e-i)i&&(l=2,f=-1),a>n&&(u=2,d=-1),h=c.getImageData(0,0,i,n),t.width=o(s,i),t.height=o(a,n),c.putImageData(h,0,0);!g||!p;)i=v,n=b,s*ft)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return h(e)*h(i)/e/i}}function f(t){var h,c,u,d,g,j,A,M,P,D,L;for(T.x=(t+.5)*y,k.x=r(T.x),h=0;h=e)){D=r(1e3*s(c-T.x)),O[D]||(O[D]={});for(var E=k.y-w;E<=k.y+w;E++)E<0||E>=o||(L=r(1e3*s(E-T.y)),O[D][L]||(O[D][L]=m(n(i(D*x,2)+i(L*S,2))/1e3)),u=O[D][L],u>0&&(d=4*(E*e+c),g+=u,j+=u*v[d],A+=u*v[d+1],M+=u*v[d+2],P+=u*v[d+3]))}d=4*(h*a+t),b[d]=j/g,b[d+1]=A/g,b[d+2]=M/g,b[d+3]=P/g}return++t1&&I<-1||(x=2*I*I*I-3*I*I+1,x>0&&(E=4*(L+A*e),k+=x*p[E+3],C+=x,p[E+3]<255&&(x=x*p[E+3]/250),w+=x*p[E],O+=x*p[E+1],T+=x*p[E+2],S+=x))}b[_]=w/S,b[_+1]=O/S,b[_+2]=T/S,b[_+3]=k/C}return v},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=function(t){return new e.Image.filters.Resize(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.object.clone,n=e.util.toFixed,s=e.StaticCanvas.supports("setLineDash"),o=e.Object.NUM_FRACTION_DIGITS;if(e.Text)return void e.warn("fabric.Text is already defined");var a=e.Object.prototype.stateProperties.concat();a.push("fontFamily","fontWeight","fontSize","text","textDecoration","textAlign","fontStyle","lineHeight","textBackgroundColor"),e.Text=e.util.createClass(e.Object,{_dimensionAffectingProps:{fontSize:!0,fontWeight:!0,fontFamily:!0,fontStyle:!0,lineHeight:!0,stroke:!0,strokeWidth:!0,text:!0,textAlign:!0},_reNewline:/\r?\n/,_reSpacesAndTabs:/[ \t\r]+/g,type:"text",fontSize:40,fontWeight:"normal",fontFamily:"Times New Roman",textDecoration:"",textAlign:"left",fontStyle:"",lineHeight:1.16,textBackgroundColor:"",stateProperties:a,stroke:null,shadow:null,_fontSizeFraction:.25,_fontSizeMult:1.13,initialize:function(t,e){e=e||{},this.text=t,this.__skipDimension=!0,this.setOptions(e),this.__skipDimension=!1,this._initDimensions()},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t)),this._textLines=this._splitTextIntoLines(),this._clearCache(),this.width=this._getTextWidth(t),this.height=this._getTextHeight(t))},toString:function(){return"#'},_render:function(t){this.clipTo&&e.util.clipContext(this,t),this._setOpacity(t),this._setShadow(t),this._setupCompositeOperation(t),this._renderTextBackground(t),this._setStrokeStyles(t),this._setFillStyles(t),this._renderText(t),this._renderTextDecoration(t),this.clipTo&&t.restore()},_renderText:function(t){this._translateForTextAlign(t),this._renderTextFill(t),this._renderTextStroke(t),this._translateForTextAlign(t,!0)},_translateForTextAlign:function(t,e){if("left"!==this.textAlign&&"justify"!==this.textAlign){var i=e?-1:1;t.translate("center"===this.textAlign?i*this.width/2:i*this.width,0)}},_setTextStyles:function(t){t.textBaseline="alphabetic",this.skipTextAlign||(t.textAlign=this.textAlign),t.font=this._getFontDeclaration()},_getTextHeight:function(){return this._getHeightOfSingleLine()+(this._textLines.length-1)*this._getHeightOfLine()},_getTextWidth:function(t){for(var e=this._getLineWidth(t,0),i=1,r=this._textLines.length;ie&&(e=n)}return e},_getNonTransformedDimensions:function(){return{x:this.width,y:this.height}},_renderChars:function(t,e,i,r,n){var s=t.slice(0,-4);if(this[s].toLive){var o=-this.width/2+this[s].offsetX||0,a=-this.height/2+this[s].offsetY||0;e.save(),e.translate(o,a),r-=o,n-=a}e[t](i,r,n),this[s].toLive&&e.restore()},_renderTextLine:function(t,e,i,r,n,s){n-=this.fontSize*this._fontSizeFraction;var o=this._getLineWidth(e,s);if("justify"!==this.textAlign||this.width0?u/f:0,g=0,p=0,v=h.length;p0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearCache:function(){var t=!1;if(this._forceClearCache)return this._forceClearCache=!1,!0;for(var e in this._dimensionAffectingProps)this["__"+e]!==this[e]&&(this["__"+e]=this[e],t=!0);return t},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_measureLine:function(t,e){return t.measureText(this._textLines[e]).width},_renderTextDecoration:function(t){function e(e){var n,s,o,a,h,c,l,u=0;for(n=0,s=r._textLines.length;n-1&&n.push(.85),this.textDecoration.indexOf("line-through")>-1&&n.push(.43),this.textDecoration.indexOf("overline")>-1&&n.push(-.12),n.length>0&&e(n)}},_getFontDeclaration:function(){return[e.isLikelyNode?this.fontWeight:this.fontStyle,e.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",e.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(t,e){this.visible&&(t.save(),this._setTextStyles(t),this._shouldClearCache()&&this._initDimensions(t),this.drawSelectionBackground(t),e||this.transform(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._render(t),t.restore())},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=i(this.callSuper("toObject",t),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,textBackgroundColor:this.textBackgroundColor});return this.includeDefaultValues||this._removeDefaultValues(e),e},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this._getSVGLeftTopOffsets(this.ctx),r=this._getSVGTextAndBg(i.textTop,i.textLeft);return this._wrapSVGTextAndBg(e,r),t?t(e.join("")):e.join("")},_getSVGLeftTopOffsets:function(t){var e=this._getHeightOfLine(t,0),i=-this.width/2,r=0;return{textLeft:i+(this.group&&"path-group"===this.group.type?this.left:0),textTop:r+(this.group&&"path-group"===this.group.type?-this.top:0),lineTop:e}},_wrapSVGTextAndBg:function(t,e){var i=!0,r=this.getSvgFilter(),n=""===r?"":' style="'+r+'"';t.push("\t\n",e.textBgRects.join(""),"\t\t\n',e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i=[],r=[],n=0;this._setSVGBg(r);for(var s=0,o=this._textLines.length;s",e.util.string.escapeXml(this._textLines[t]),"\n")},_setSVGTextLineJustifed:function(t,i,r,s){var a=e.util.createCanvasElement().getContext("2d");this._setTextStyles(a);var h,c,l=this._textLines[t],u=l.split(/\s+/),f=this._getWidthOfWords(a,l),d=this.width-f,g=u.length-1,p=g>0?d/g:0,v=this._getFillAttributes(this.fill);for(s+=this._getLineLeftOffset(this._getLineWidth(a,t)),t=0,c=u.length;t",e.util.string.escapeXml(h),"\n"),s+=this._getWidthOfWords(a,h)+p},_setSVGTextLineBg:function(t,e,i,r,s){t.push("\t\t\n')},_setSVGBg:function(t){this.backgroundColor&&t.push("\t\t\n')},_getFillAttributes:function(t){var i=t&&"string"==typeof t?new e.Color(t):"";return i&&i.getSource()&&1!==i.getAlpha()?'opacity="'+i.getAlpha()+'" fill="'+i.setAlpha(1).toRgb()+'"':'fill="'+t+'"'},_set:function(t,e){this.callSuper("_set",t,e),t in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),e.Text.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),e.Text.DEFAULT_SVG_FONT_SIZE=16,e.Text.fromElement=function(t,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t){return new e.Text(t.text,r(t))},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this.selectionStart!==t&&(this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this}),this.selectionStart=t),this._updateTextarea()},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this.selectionEnd!==t&&(this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this}),this.selectionEnd=t),this._updateTextarea()},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0,this.skipTextAlign=!0,r-="center"===this.textAlign?this.width/2:"right"===this.textAlign?this.width:0;var a,h,c=this._getHeightOfLine(e,s),l=this._getLineLeftOffset(this._getLineWidth(e,s)),u="";r+=l||0,e.save(),n-=c/this.lineHeight*this._fontSizeFraction;for(var f=o,d=i.length+o;f<=d;f++)a=a||this.getCurrentCharStyle(s,f),h=this.getCurrentCharStyle(s,f+1),(this._hasStyleChanged(a,h)||f===d)&&(this._renderChar(t,e,s,f-1,u,r,n,c),u="",a=h),u+=i[f-o];e.restore()},_renderCharsFast:function(t,e,i,r,n){this.skipTextAlign=!1,"fillText"===t&&this.fill&&this.callSuper("_renderChars",t,e,i,r,n),"strokeText"===t&&(this.stroke&&this.strokeWidth>0||this.skipFillStrokeCheck)&&this.callSuper("_renderChars",t,e,i,r,n)},_renderChar:function(t,e,i,r,n,s,o,a){var h,c,l,u,f,d,g=this._getStyleDeclaration(i,r);g?(c=this._getHeightOfChar(e,n,i,r),u=g.stroke,l=g.fill,d=g.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,g&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,g||{}),d=d||this.textDecoration,g&&g.textBackgroundColor&&this._removeShadow(e),l&&e.fillText(n,s,o),u&&e.strokeText(n,s,o),(d||""!==d)&&(f=this._fontSizeFraction*a/this.lineHeight,this._renderCharDecoration(e,d,s,o,f,h,c)),g&&e.restore(),e.translate(h,0)},_hasStyleChanged:function(t,e){return t.fill!==e.fill||t.fontSize!==e.fontSize||t.textBackgroundColor!==e.textBackgroundColor||t.textDecoration!==e.textDecoration||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth},_renderCharDecoration:function(t,e,i,r,n,s,o){if(e){var a,h,c=o/15,l={underline:r+o/10,"line-through":r-o*(this._fontSizeFraction+this._fontSizeMult-1)+c,overline:r-(this._fontSizeMult-this._fontSizeFraction)*o},u=["underline","line-through","overline"];for(a=0;a-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);for(var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset(),l=0,u=this._textLines.length;lr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.setSelectionStart(this.__selectionStartOnMouseDown),this.setSelectionEnd(e)):(this.setSelectionStart(e),this.setSelectionEnd(this.__selectionStartOnMouseDown)),this.renderCursorOrSelection())}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},_updateTextarea:function(){if(this.hiddenTextarea&&!this.inCompositionMode&&(this.hiddenTextarea.value=this.text,this.hiddenTextarea.selectionStart=this.selectionStart,this.hiddenTextarea.selectionEnd=this.selectionEnd,this.selectionStart===this.selectionEnd)){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top,this.hiddenTextarea.style.fontSize=t.fontSize}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.text.split(""),e=this._getCursorBoundaries(t,"cursor"),i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(this.ctx,r)):e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.upperCanvasEl,l=c.width-s,u=c.height-s;return h=fabric.util.transformPoint(h,a),h=fabric.util.transformPoint(h,this.canvas.viewportTransform),h.x<0&&(h.x=0),h.x>l&&(h.x=l),h.y<0&&(h.y=0),h.y>u&&(h.y=u),{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea&&this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.setSelectionStart(t)},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&(this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.setSelectionEnd(this.selectionStart)),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(t){this.__newClickTime=+new Date;var e=this.canvas.getPointer(t.e);this.isTripleClick(e)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.hiddenTextarea&&this.canvas&&this.canvas.wrapperEl.appendChild(this.hiddenTextarea), -this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.initDelayedCursor(!0))}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.initDelayedCursor(!0)),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t);t.shiftKey?es?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",this.canvas?this.canvas.lowerCanvasEl.parentNode.appendChild(this.hiddenTextarea):fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",9:"exitEditing",27:"exitEditing",13:"insertNewline",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},getDownCursorOffset:function(t,e){var i,r,n=e?this.selectionEnd:this.selectionStart,s=this.get2DCursorLocation(n),o=s.lineIndex,a=this._textLines[o].slice(0,s.charIndex),h=this._textLines[o].slice(s.charIndex),c=this._textLines[o+1]||"";if(o===this._textLines.length-1||t.metaKey||34===t.keyCode)return this.text.length-n;var l=this._getLineWidth(this.ctx,o);r=this._getLineLeftOffset(l);for(var u=r,f=0,d=a.length;fi){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=vthis.text.length&&this.setSelectionEnd(this.text.length)},getUpCursorOffset:function(t,e){var i=e?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(i),n=r.lineIndex;if(0===n||t.metaKey||33===t.keyCode)return i;for(var s,o=this._textLines[n].slice(0,r.charIndex),a=this._textLines[n-1]||"",h=this._getLineWidth(this.ctx,r.lineIndex),c=this._getLineLeftOffset(h),l=c,u=0,f=o.length;ui){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=v=this.text.length&&this.selectionEnd>=this.text.length||(this.abortCursorAnimation(),this._currentCursorOpacity=1,t.shiftKey?this.moveCursorRightWithShift(t):this.moveCursorRightWithoutShift(t),this.initDelayedCursor())},moveCursorRightWithShift:function(t){"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):(this._selectionDirection="right",this._moveRight(t,"selectionEnd"))},moveCursorRightWithoutShift:function(t){this._selectionDirection="right",this.selectionStart===this.selectionEnd?(this._moveRight(t,"selectionStart"),this.setSelectionEnd(this.selectionStart)):(this.setSelectionEnd(this.selectionEnd+this.getNumNewLinesInSelectedText()),this.setSelectionStart(this.selectionEnd))},removeChars:function(t){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(t):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.clone;e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:0,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,initialize:function(t,i){this.ctx=e.util.createCanvasElement().getContext("2d"),this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this._dimensionAffectingProps.width=!0},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t)),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n=this.width&&!d&&(n.push(s),s="",r=l,d=!0),d||(s+=c),s+=a,u=this._measureText(t,c,i,h),h++,d=!1,l>f&&(f=l);return g&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f),n},_splitTextIntoLines:function(){var t=this.textAlign;this.ctx.save(),this._setTextStyles(this.ctx),this.textAlign="left";var e=this._wrapText(this.ctx,this.text);return this.textAlign=t,this.ctx.restore(),this._textLines=e,this._styleMap=this._generateStyleMap(),e},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(t,e){fabric.util.loadImage(t.src,function(i){var r=new fabric.Image(i);r._initConfig(t),r._initFilters(t.filters,function(i){r.filters=i||[],r._initFilters(t.resizeFilters,function(t){r.resizeFilters=t||[],e&&e(r)})})})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.contextContainer=s.getContext("2d"),h.nodeCanvas=s,h.contextCache=o.getContext("2d"),h.nodeCacheCanvas=o,h.Font=Canvas.Font,h},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(t,e){return origSetWidth.call(this,t,e),this.nodeCanvas.width=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(t,e){return origSetHeight.call(this,t,e),this.nodeCanvas.height=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}}(); \ No newline at end of file +for(var s=0,o=e.length;s\n"),t?t(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var t=this.getObjects()[0].get("fill")||"";return"string"==typeof t&&(t=t.toLowerCase(),this.getObjects().every(function(e){var i=e.get("fill")||"";return"string"==typeof i&&i.toLowerCase()===t}))},complexity:function(){return this.paths.reduce(function(t,e){return t+(e&&e.complexity?e.complexity():0)},0)},getObjects:function(){return this.paths}}),e.PathGroup.fromObject=function(t,i){"string"==typeof t.paths?e.loadSVGFromURL(t.paths,function(r){var n=t.paths;delete t.paths;var s=e.util.groupSVGElements(r,t,n);i(s)}):e.util.enlivenObjects(t.paths,function(r){delete t.paths,i(new e.PathGroup(r,t))})},void(e.PathGroup.async=!0))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max,s=e.util.array.invoke;if(!e.Group){var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};e.Group=e.util.createClass(e.Object,e.Collection,{type:"group",strokeWidth:0,subTargetCheck:!1,initialize:function(t,e,i){e=e||{},this._objects=[],i&&this.callSuper("initialize",e),this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},e.originX&&(this.originX=e.originX),e.originY&&(this.originY=e.originY),i?this._updateObjectsCoords(!0):(this._calcBounds(),this._updateObjectsCoords(),this.callSuper("initialize",e)),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(t){for(var e=this._objects.length;e--;)this._updateObjectCoords(this._objects[e],t)},_updateObjectCoords:function(t,e){if(t.__origHasControls=t.hasControls,t.hasControls=!1,!e){var i=t.getLeft(),r=t.getTop(),n=this.getCenterPoint();t.set({originalLeft:i,originalTop:r,left:i-n.x,top:r-n.y}),t.setCoords()}},toString:function(){return"#"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this},_setObjectActive:function(t){t.set("active",!0),t.group=this},removeWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),this.forEachObject(this._setObjectActive,this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(t){t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){delete t.group,t.set("active",!1)},delegatedProperties:{fill:!0,stroke:!0,strokeWidth:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(t,e){var i=this._objects.length;if(this.delegatedProperties[t]||"canvas"===t)for(;i--;)this._objects[i].set(t,e);else for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){return i(this.callSuper("toObject",t),{objects:s(this._objects,"toObject",t)})},render:function(t){if(this.visible){t.save(),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.transform(t),this._setShadow(t),this.clipTo&&e.util.clipContext(this,t),this._transformDone=!0;for(var i=0,r=this._objects.length;i\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")},get:function(t){if(t in o){if(this[t])return this[t];for(var e=0,i=this._objects.length;e\n',"\n"),this.stroke||this.strokeDashArray){var s=this.fill;this.fill=null,e.push("\n'),this.fill=s}return e.push("\n"),t?t(e.join("")):e.join("")},getSrc:function(){if(this.getElement())return this.getElement().src||this.getElement()._src},setSrc:function(t,e,i){fabric.util.loadImage(t,function(t){return this.setElement(t,e,i)},this,i&&i.crossOrigin)},toString:function(){return'#'},clone:function(t,e){this.constructor.fromObject(this.toObject(e),t)},applyFilters:function(t,e,i,r){if(e=e||this.filters,i=i||this._originalElement){var n=i,s=fabric.util.createCanvasElement(),o=fabric.util.createImage(),a=this;return s.width=n.width,s.height=n.height,s.getContext("2d").drawImage(n,0,0,n.width,n.height),0===e.length?(this._element=i,t&&t(),s):(e.forEach(function(t){t&&t.applyTo(s,t.scaleX||a.scaleX,t.scaleY||a.scaleY),!r&&t&&"Resize"===t.type&&(a.width*=t.scaleX,a.height*=t.scaleY)}),o.width=s.width,o.height=s.height,fabric.isLikelyNode?(o.src=s.toBuffer(void 0,fabric.Image.pngCompression),a._element=o,!r&&(a._filteredEl=o),t&&t()):(o.onload=function(){a._element=o,!r&&(a._filteredEl=o),t&&t(),o.onload=s=n=null},o.src=s.toDataURL("image/png")),s)}},_render:function(t,e){var i,r,n,s=this._findMargins();i=e?this.left:-this.width/2,r=e?this.top:-this.height/2,"slice"===this.meetOrSlice&&(t.beginPath(),t.rect(i,r,this.width,this.height),t.clip()),this.isMoving===!1&&this.resizeFilters.length&&this._needsResize()?(this._lastScaleX=this.scaleX,this._lastScaleY=this.scaleY,n=this.applyFilters(null,this.resizeFilters,this._filteredEl||this._originalElement,!0)):n=this._element,n&&t.drawImage(n,i+s.marginX,r+s.marginY,s.width,s.height),this._stroke(t),this._renderStroke(t)},_needsResize:function(){return this.scaleX!==this._lastScaleX||this.scaleY!==this._lastScaleY},_findMargins:function(){var t,e,i=this.width,r=this.height,n=0,s=0;return"none"===this.alignX&&"none"===this.alignY||(t=[this.width/this._element.width,this.height/this._element.height],e="meet"===this.meetOrSlice?Math.min.apply(null,t):Math.max.apply(null,t),i=this._element.width*e,r=this._element.height*e,"Mid"===this.alignX&&(n=(this.width-i)/2),"Max"===this.alignX&&(n=this.width-i),"Mid"===this.alignY&&(s=(this.height-r)/2),"Max"===this.alignY&&(s=this.height-r)),{width:i,height:r,marginX:n,marginY:s}},_resetWidthHeight:function(){var t=this.getElement();this.set("width",t.width),this.set("height",t.height)},_initElement:function(t,e){this.setElement(fabric.util.getById(t),null,e),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(t){t||(t={}),this.setOptions(t),this._setWidthHeight(t),this._element&&this.crossOrigin&&(this._element.crossOrigin=this.crossOrigin)},_initFilters:function(t,e){t&&t.length?fabric.util.enlivenObjects(t,function(t){e&&e(t)},"fabric.Image.filters"):e&&e()},_setWidthHeight:function(t){this.width="width"in t?t.width:this.getElement()?this.getElement().width||0:0,this.height="height"in t?t.height:this.getElement()?this.getElement().height||0:0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(t,e){fabric.util.loadImage(t.src,function(i){fabric.Image.prototype._initFilters.call(t,t.filters,function(r){t.filters=r||[],fabric.Image.prototype._initFilters.call(t,t.resizeFilters,function(r){t.resizeFilters=r||[];var n=new fabric.Image(i,t);e&&e(n)})})},null,t.crossOrigin)},fabric.Image.fromURL=function(t,e,i){fabric.util.loadImage(t,function(t){e&&e(new fabric.Image(t,i))},null,i&&i.crossOrigin)},fabric.Image.ATTRIBUTE_NAMES=fabric.SHARED_ATTRIBUTES.concat("x y width height preserveAspectRatio xlink:href".split(" ")),fabric.Image.fromElement=function(t,i,r){var n,s=fabric.parseAttributes(t,fabric.Image.ATTRIBUTE_NAMES);s.preserveAspectRatio&&(n=fabric.util.parsePreserveAspectRatioAttribute(s.preserveAspectRatio),e(s,n)),fabric.Image.fromURL(s["xlink:href"],i,e(r?fabric.util.object.clone(r):{},s))},fabric.Image.async=!0,void(fabric.Image.pngCompression=1))}("undefined"!=typeof exports?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var t=this.getAngle()%360;return t>0?90*Math.round((t-1)/90):90*Math.round(t/90)},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(t){t=t||{};var e=function(){},i=t.onComplete||e,r=t.onChange||e,n=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(t){n.setAngle(t),r()},onComplete:function(){n.setCoords(),i()},onStart:function(){n.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(t){return t.straighten(),this.renderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Image.filters.Brightness=e.util.createClass(e.Image.filters.BaseFilter,{type:"Brightness",initialize:function(t){t=t||{},this.brightness=t.brightness||0},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.brightness,s=0,o=r.length;sb||o<0||o>v||(h=4*(a*v+o),c=l[C*d+w],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,n+=p[h+3]*c);y[s]=e,y[s+1]=i,y[s+2]=r,y[s+3]=n+_*(255-n)}u.putImageData(m,0,0)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=function(t){return new e.Image.filters.Convolute(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Image.filters.GradientTransparency=e.util.createClass(e.Image.filters.BaseFilter,{type:"GradientTransparency",initialize:function(t){t=t||{},this.threshold=t.threshold||100},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.threshold,s=r.length,o=0,a=r.length;o-1?t.channel:0},applyTo:function(t){if(this.mask){var i,r=t.getContext("2d"),n=r.getImageData(0,0,t.width,t.height),s=n.data,o=this.mask.getElement(),a=e.util.createCanvasElement(),h=this.channel,c=n.width*n.height*4;a.width=t.width,a.height=t.height,a.getContext("2d").drawImage(o,0,0,t.width,t.height);var l=a.getContext("2d").getImageData(0,0,t.width,t.height),u=l.data;for(i=0;ic&&i>c&&r>c&&l(e-i)i&&(l=2,f=-1),a>n&&(u=2,d=-1),h=c.getImageData(0,0,i,n),t.width=o(s,i),t.height=o(a,n),c.putImageData(h,0,0);!g||!p;)i=v,n=b,s*ft)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return h(e)*h(i)/e/i}}function f(t){var h,c,u,d,g,j,A,M,P,L,D;for(T.x=(t+.5)*y,k.x=r(T.x),h=0;h=e)){L=r(1e3*s(c-T.x)),O[L]||(O[L]={});for(var E=k.y-w;E<=k.y+w;E++)E<0||E>=o||(D=r(1e3*s(E-T.y)),O[L][D]||(O[L][D]=m(n(i(L*x,2)+i(D*S,2))/1e3)),u=O[L][D],u>0&&(d=4*(E*e+c),g+=u,j+=u*v[d],A+=u*v[d+1],M+=u*v[d+2],P+=u*v[d+3]))}d=4*(h*a+t),b[d]=j/g,b[d+1]=A/g,b[d+2]=M/g,b[d+3]=P/g}return++t1&&I<-1||(x=2*I*I*I-3*I*I+1,x>0&&(E=4*(D+A*e),k+=x*p[E+3],C+=x,p[E+3]<255&&(x=x*p[E+3]/250),w+=x*p[E],O+=x*p[E+1],T+=x*p[E+2],S+=x))}b[_]=w/S,b[_+1]=O/S,b[_+2]=T/S,b[_+3]=k/C}return v},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=function(t){return new e.Image.filters.Resize(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.object.clone,n=e.util.toFixed,s=e.StaticCanvas.supports("setLineDash"),o=e.Object.NUM_FRACTION_DIGITS;if(e.Text)return void e.warn("fabric.Text is already defined");var a=e.Object.prototype.stateProperties.concat();a.push("fontFamily","fontWeight","fontSize","text","textDecoration","textAlign","fontStyle","lineHeight","textBackgroundColor"),e.Text=e.util.createClass(e.Object,{_dimensionAffectingProps:{fontSize:!0,fontWeight:!0,fontFamily:!0,fontStyle:!0,lineHeight:!0,stroke:!0,strokeWidth:!0,text:!0,textAlign:!0},_reNewline:/\r?\n/,_reSpacesAndTabs:/[ \t\r]+/g,type:"text",fontSize:40,fontWeight:"normal",fontFamily:"Times New Roman",textDecoration:"",textAlign:"left",fontStyle:"",lineHeight:1.16,textBackgroundColor:"",stateProperties:a,stroke:null,shadow:null,_fontSizeFraction:.25,_fontSizeMult:1.13,initialize:function(t,e){e=e||{},this.text=t,this.__skipDimension=!0,this.setOptions(e),this.__skipDimension=!1,this._initDimensions()},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t)),this._textLines=this._splitTextIntoLines(),this._clearCache(),this.width=this._getTextWidth(t),this.height=this._getTextHeight(t))},toString:function(){return"#'},_render:function(t){this.clipTo&&e.util.clipContext(this,t),this._setOpacity(t),this._setShadow(t),this._setupCompositeOperation(t),this._renderTextBackground(t),this._setStrokeStyles(t),this._setFillStyles(t),this._renderText(t),this._renderTextDecoration(t),this.clipTo&&t.restore()},_renderText:function(t){this._translateForTextAlign(t),this._renderTextFill(t),this._renderTextStroke(t),this._translateForTextAlign(t,!0)},_translateForTextAlign:function(t,e){if("left"!==this.textAlign&&"justify"!==this.textAlign){var i=e?-1:1;t.translate("center"===this.textAlign?i*this.width/2:i*this.width,0)}},_setTextStyles:function(t){t.textBaseline="alphabetic",this.skipTextAlign||(t.textAlign=this.textAlign),t.font=this._getFontDeclaration()},_getTextHeight:function(){return this._getHeightOfSingleLine()+(this._textLines.length-1)*this._getHeightOfLine()},_getTextWidth:function(t){for(var e=this._getLineWidth(t,0),i=1,r=this._textLines.length;ie&&(e=n)}return e},_getNonTransformedDimensions:function(){return{x:this.width,y:this.height}},_renderChars:function(t,e,i,r,n){var s=t.slice(0,-4);if(this[s].toLive){var o=-this.width/2+this[s].offsetX||0,a=-this.height/2+this[s].offsetY||0;e.save(),e.translate(o,a),r-=o,n-=a}e[t](i,r,n),this[s].toLive&&e.restore()},_renderTextLine:function(t,e,i,r,n,s){n-=this.fontSize*this._fontSizeFraction;var o=this._getLineWidth(e,s);if("justify"!==this.textAlign||this.width0?u/f:0,g=0,p=0,v=h.length;p0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearCache:function(){var t=!1;if(this._forceClearCache)return this._forceClearCache=!1,!0;for(var e in this._dimensionAffectingProps)this["__"+e]!==this[e]&&(this["__"+e]=this[e],t=!0);return t},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_measureLine:function(t,e){return t.measureText(this._textLines[e]).width},_renderTextDecoration:function(t){function e(e){var n,s,o,a,h,c,l,u=0;for(n=0,s=r._textLines.length;n-1&&n.push(.85),this.textDecoration.indexOf("line-through")>-1&&n.push(.43),this.textDecoration.indexOf("overline")>-1&&n.push(-.12),n.length>0&&e(n)}},_getFontDeclaration:function(){return[e.isLikelyNode?this.fontWeight:this.fontStyle,e.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",e.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(t,e){this.visible&&(t.save(),this._setTextStyles(t),this._shouldClearCache()&&this._initDimensions(t),this.drawSelectionBackground(t),e||this.transform(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._render(t),t.restore())},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=i(this.callSuper("toObject",t),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,textBackgroundColor:this.textBackgroundColor});return this.includeDefaultValues||this._removeDefaultValues(e),e},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this._getSVGLeftTopOffsets(this.ctx),r=this._getSVGTextAndBg(i.textTop,i.textLeft);return this._wrapSVGTextAndBg(e,r),t?t(e.join("")):e.join("")},_getSVGLeftTopOffsets:function(t){var e=this._getHeightOfLine(t,0),i=-this.width/2,r=0;return{textLeft:i+(this.group&&"path-group"===this.group.type?this.left:0),textTop:r+(this.group&&"path-group"===this.group.type?-this.top:0),lineTop:e}},_wrapSVGTextAndBg:function(t,e){var i=!0,r=this.getSvgFilter(),n=""===r?"":' style="'+r+'"';t.push("\t\n",e.textBgRects.join(""),"\t\t\n',e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i=[],r=[],n=0;this._setSVGBg(r);for(var s=0,o=this._textLines.length;s",e.util.string.escapeXml(this._textLines[t]),"\n")},_setSVGTextLineJustifed:function(t,i,r,s){var a=e.util.createCanvasElement().getContext("2d");this._setTextStyles(a);var h,c,l=this._textLines[t],u=l.split(/\s+/),f=this._getWidthOfWords(a,l),d=this.width-f,g=u.length-1,p=g>0?d/g:0,v=this._getFillAttributes(this.fill);for(s+=this._getLineLeftOffset(this._getLineWidth(a,t)),t=0,c=u.length;t",e.util.string.escapeXml(h),"\n"),s+=this._getWidthOfWords(a,h)+p},_setSVGTextLineBg:function(t,e,i,r,s){t.push("\t\t\n')},_setSVGBg:function(t){this.backgroundColor&&t.push("\t\t\n')},_getFillAttributes:function(t){var i=t&&"string"==typeof t?new e.Color(t):"";return i&&i.getSource()&&1!==i.getAlpha()?'opacity="'+i.getAlpha()+'" fill="'+i.setAlpha(1).toRgb()+'"':'fill="'+t+'"'},_set:function(t,e){this.callSuper("_set",t,e),t in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),e.Text.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),e.Text.DEFAULT_SVG_FONT_SIZE=16,e.Text.fromElement=function(t,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t){return new e.Text(t.text,r(t))},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0,this.skipTextAlign=!0,r-="center"===this.textAlign?this.width/2:"right"===this.textAlign?this.width:0;var a,h,c=this._getHeightOfLine(e,s),l=this._getLineLeftOffset(this._getLineWidth(e,s)),u="";r+=l||0,e.save(),n-=c/this.lineHeight*this._fontSizeFraction;for(var f=o,d=i.length+o;f<=d;f++)a=a||this.getCurrentCharStyle(s,f),h=this.getCurrentCharStyle(s,f+1),(this._hasStyleChanged(a,h)||f===d)&&(this._renderChar(t,e,s,f-1,u,r,n,c),u="",a=h),u+=i[f-o];e.restore()},_renderCharsFast:function(t,e,i,r,n){this.skipTextAlign=!1,"fillText"===t&&this.fill&&this.callSuper("_renderChars",t,e,i,r,n),"strokeText"===t&&(this.stroke&&this.strokeWidth>0||this.skipFillStrokeCheck)&&this.callSuper("_renderChars",t,e,i,r,n)},_renderChar:function(t,e,i,r,n,s,o,a){var h,c,l,u,f,d,g=this._getStyleDeclaration(i,r);g?(c=this._getHeightOfChar(e,n,i,r),u=g.stroke,l=g.fill,d=g.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,g&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,g||{}),d=d||this.textDecoration,g&&g.textBackgroundColor&&this._removeShadow(e),l&&e.fillText(n,s,o),u&&e.strokeText(n,s,o),(d||""!==d)&&(f=this._fontSizeFraction*a/this.lineHeight,this._renderCharDecoration(e,d,s,o,f,h,c)),g&&e.restore(),e.translate(h,0)},_hasStyleChanged:function(t,e){return t.fill!==e.fill||t.fontSize!==e.fontSize||t.textBackgroundColor!==e.textBackgroundColor||t.textDecoration!==e.textDecoration||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth},_renderCharDecoration:function(t,e,i,r,n,s,o){if(e){var a,h,c=o/15,l={underline:r+o/10,"line-through":r-o*(this._fontSizeFraction+this._fontSizeMult-1)+c,overline:r-(this._fontSizeMult-this._fontSizeFraction)*o},u=["underline","line-through","overline"];for(a=0;a-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);for(var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset(),l=0,u=this._textLines.length;lr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection())}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},_updateTextarea:function(){if(this.hiddenTextarea&&!this.inCompositionMode&&(this.hiddenTextarea.value=this.text,this.hiddenTextarea.selectionStart=this.selectionStart,this.hiddenTextarea.selectionEnd=this.selectionEnd,this.selectionStart===this.selectionEnd)){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top,this.hiddenTextarea.style.fontSize=t.fontSize}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.text.split(""),e=this._getCursorBoundaries(t,"cursor"),i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(this.ctx,r)):e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.upperCanvasEl,l=c.width-s,u=c.height-s;return h=fabric.util.transformPoint(h,a),h=fabric.util.transformPoint(h,this.canvas.viewportTransform),h.x<0&&(h.x=0),h.x>l&&(h.x=l),h.y<0&&(h.y=0),h.y>u&&(h.y=u),{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea&&this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.selectionStart=t,this.selectionEnd=t},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&this._removeCharsFromTo(this.selectionStart,this.selectionEnd),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(t){this.__newClickTime=+new Date;var e=this.canvas.getPointer(t.e);this.isTripleClick(e)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}), +this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.hiddenTextarea&&this.canvas&&this.canvas.wrapperEl.appendChild(this.hiddenTextarea),this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t);t.shiftKey?es?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",this.canvas?this.canvas.lowerCanvasEl.parentNode.appendChild(this.hiddenTextarea):fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",9:"exitEditing",27:"exitEditing",13:"insertNewline",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},getDownCursorOffset:function(t,e){var i,r,n=e?this.selectionEnd:this.selectionStart,s=this.get2DCursorLocation(n),o=s.lineIndex,a=this._textLines[o].slice(0,s.charIndex),h=this._textLines[o].slice(s.charIndex),c=this._textLines[o+1]||"";if(o===this._textLines.length-1||t.metaKey||34===t.keyCode)return this.text.length-n;var l=this._getLineWidth(this.ctx,o);r=this._getLineLeftOffset(l);for(var u=r,f=0,d=a.length;fi){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=v=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorUpOrDown("Down",t)},moveCursorDownWithoutShift:function(t){return this._selectionDirection="right",this.selectionEnd=this.selectionEnd+t,this.selectionStart=this.selectionEnd,0!==t},swapSelectionPoints:function(){var t=this.selectionEnd;this.selectionEnd=this.selectionStart,this.selectionStart=t},moveCursorDownWithShift:function(t){return this.selectionEnd===this.selectionStart&&(this._selectionDirection="right"),"right"===this._selectionDirection?this.selectionEnd+=t:this.selectionStart+=t,this.selectionEndthis.text.length&&(this.selectionEnd=this.text.length),0!==t},getUpCursorOffset:function(t,e){var i=e?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(i),n=r.lineIndex;if(0===n||t.metaKey||33===t.keyCode)return i;for(var s,o=this._textLines[n].slice(0,r.charIndex),a=this._textLines[n-1]||"",h=this._getLineWidth(this.ctx,r.lineIndex),c=this._getLineLeftOffset(h),l=c,u=0,f=o.length;ui){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=v=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,i+=e.shiftKey?"Shift":"outShift",this[i](e)&&(console.log("will fire"),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this.text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!1;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart,e):(this.selectionStart=this.selectionEnd,!0)},removeChars:function(t){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(t):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.clone;e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:0,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,initialize:function(t,i){this.ctx=e.util.createCanvasElement().getContext("2d"),this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this._dimensionAffectingProps.width=!0},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t)),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n=this.width&&!d&&(n.push(s),s="",r=l,d=!0),d||(s+=c),s+=a,u=this._measureText(t,c,i,h),h++,d=!1,l>f&&(f=l);return g&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f),n},_splitTextIntoLines:function(){var t=this.textAlign;this.ctx.save(),this._setTextStyles(this.ctx),this.textAlign="left";var e=this._wrapText(this.ctx,this.text);return this.textAlign=t,this.ctx.restore(),this._textLines=e,this._styleMap=this._generateStyleMap(),e},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(t,e){fabric.util.loadImage(t.src,function(i){var r=new fabric.Image(i);r._initConfig(t),r._initFilters(t.filters,function(i){r.filters=i||[],r._initFilters(t.resizeFilters,function(t){r.resizeFilters=t||[],e&&e(r)})})})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.contextContainer=s.getContext("2d"),h.nodeCanvas=s,h.contextCache=o.getContext("2d"),h.nodeCacheCanvas=o,h.Font=Canvas.Font,h},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(t,e){return origSetWidth.call(this,t,e),this.nodeCanvas.width=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(t,e){return origSetHeight.call(this,t,e),this.nodeCanvas.height=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}}(); \ No newline at end of file diff --git a/dist/fabric.min.js.gz b/dist/fabric.min.js.gz index dc6bebd942930b7949028a907f719f50de7002fa..caa9aa3263294cc98c1b0c30cbc2cdc1273fd959 100644 GIT binary patch delta 30656 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

6QCnnE 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 delta 30457 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 AQUCw| diff --git a/dist/fabric.require.js b/dist/fabric.require.js index 00c9c8b2..f6153389 100644 --- a/dist/fabric.require.js +++ b/dist/fabric.require.js @@ -10181,26 +10181,25 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }, setSelectionStart: function(index) { index = Math.max(index, 0); - if (this.selectionStart !== index) { - this.fire("selection:changed"); - this.canvas && this.canvas.fire("text:selection:changed", { - target: this - }); - this.selectionStart = index; - } - this._updateTextarea(); + this._updateAndFire("selectionStart", index); }, setSelectionEnd: function(index) { index = Math.min(index, this.text.length); - if (this.selectionEnd !== index) { - this.fire("selection:changed"); - this.canvas && this.canvas.fire("text:selection:changed", { - target: this - }); - this.selectionEnd = index; + this._updateAndFire("selectionEnd", index); + }, + _updateAndFire: function(property, index) { + if (this[property] !== index) { + this._fireSelectionChanged(); + this[property] = index; } this._updateTextarea(); }, + _fireSelectionChanged: function() { + this.fire("selection:changed"); + this.canvas && this.canvas.fire("text:selection:changed", { + target: this + }); + }, getSelectionStyles: function(startIndex, endIndex) { if (arguments.length === 2) { var styles = []; @@ -10761,16 +10760,21 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ }, delay); }, abortCursorAnimation: function() { + var shouldClear = this._currentTickState || this._currentTickCompleteState; this._currentTickState && this._currentTickState.abort(); this._currentTickCompleteState && this._currentTickCompleteState.abort(); clearTimeout(this._cursorTimeout1); clearTimeout(this._cursorTimeout2); this._currentCursorOpacity = 0; - this.canvas && this.canvas.clearContext(this.canvas.contextTop || this.ctx); + if (shouldClear) { + this.canvas && this.canvas.clearContext(this.canvas.contextTop || this.ctx); + } }, selectAll: function() { - this.setSelectionStart(0); - this.setSelectionEnd(this.text.length); + this.selectionStart = 0; + this.selectionEnd = this.text.length; + this._fireSelectionChanged(); + this._updateTextarea(); }, getSelectedText: function() { return this.text.slice(this.selectionStart, this.selectionEnd); @@ -10840,14 +10844,21 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ return index; }, selectWord: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; var newSelectionStart = this.searchWordBoundary(selectionStart, -1), newSelectionEnd = this.searchWordBoundary(selectionStart, 1); - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionEnd); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); + this.renderCursorOrSelection(); }, selectLine: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; var newSelectionStart = this.findLineBoundaryLeft(selectionStart), newSelectionEnd = this.findLineBoundaryRight(selectionStart); - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionEnd); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); }, enterEditing: function(e) { if (this.isEditing || !this.editable) { @@ -10868,10 +10879,10 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ if (!this.canvas) { return this; } - this.canvas.renderAll(); this.canvas.fire("text:editing:entered", { target: this }); + this.canvas.renderAll(); this.initMouseMoveHandler(); return this; }, @@ -10897,12 +10908,14 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ return; } if (newSelectionStart > this.__selectionStartOnMouseDown) { - this.setSelectionStart(this.__selectionStartOnMouseDown); - this.setSelectionEnd(newSelectionStart); + this.selectionStart = this.__selectionStartOnMouseDown; + this.selectionEnd = newSelectionStart; } else { - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(this.__selectionStartOnMouseDown); + this.selectionStart = newSelectionStart; + this.selectionEnd = this.__selectionStartOnMouseDown; } + this._fireSelectionChanged(); + this._updateTextarea(); this.renderCursorOrSelection(); }, _setEditingProps: function() { @@ -11020,7 +11033,8 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ this._removeSingleCharAndStyle(start + 1); end--; } - this.setSelectionStart(start); + this.selectionStart = start; + this.selectionEnd = start; }, _removeSingleCharAndStyle: function(index) { var isBeginningOfLine = this.text[index - 1] === "\n", indexStyle = isBeginningOfLine ? index : index - 1; @@ -11032,7 +11046,6 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ var style; if (this.selectionEnd - this.selectionStart > 1) { this._removeCharsFromTo(this.selectionStart, this.selectionEnd); - this.setSelectionEnd(this.selectionStart); } if (!useCopiedStyle && this.isEmptyStyles()) { this.insertChar(_chars, false); @@ -11056,12 +11069,13 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ return; } this._updateTextarea(); - this.canvas && this.canvas.renderAll(); this.setCoords(); + this._fireSelectionChanged(); this.fire("changed"); this.canvas && this.canvas.fire("text:changed", { target: this }); + this.canvas && this.canvas.renderAll(); }, insertNewlineStyleObject: function(lineIndex, charIndex, isEndOfLine) { this.shiftLineStyles(lineIndex, +1); @@ -11228,7 +11242,10 @@ fabric.util.object.extend(fabric.IText.prototype, { } if (this.isEditing) { this.__selectionStartOnMouseDown = this.selectionStart; - this.initDelayedCursor(true); + if (this.selectionStart === this.selectionEnd) { + this.abortCursorAnimation(); + } + this.renderCursorOrSelection(); } }); }, @@ -11244,7 +11261,11 @@ fabric.util.object.extend(fabric.IText.prototype, { } if (this.__lastSelected && !this.__corner) { this.enterEditing(options.e); - this.initDelayedCursor(true); + if (this.selectionStart === this.selectionEnd) { + this.initDelayedCursor(true); + } else { + this.renderCursorOrSelection(); + } } this.selected = true; }); @@ -11253,15 +11274,17 @@ fabric.util.object.extend(fabric.IText.prototype, { var newSelectionStart = this.getSelectionStartFromPointer(e); if (e.shiftKey) { if (newSelectionStart < this.selectionStart) { - this.setSelectionEnd(this.selectionStart); - this.setSelectionStart(newSelectionStart); + this.selectionEnd = this.selectionStart; + this.selectionStart = newSelectionStart; } else { - this.setSelectionEnd(newSelectionStart); + this.selectionEnd = newSelectionStart; } } else { - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionStart); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionStart; } + this._fireSelectionChanged(); + this._updateTextarea(); }, getSelectionStartFromPointer: function(e) { var mouseOffset = this.getLocalPointer(e), prevWidth = 0, width = 0, height = 0, charIndex = 0, newSelectionStart, line; @@ -11491,42 +11514,39 @@ fabric.util.object.extend(fabric.IText.prototype, { return indexOnNextLine; }, moveCursorDown: function(e) { - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - var offset = this.getDownCursorOffset(e, this._selectionDirection === "right"); - if (e.shiftKey) { - this.moveCursorDownWithShift(offset); - } else { - this.moveCursorDownWithoutShift(offset); + if (this.selectionStart >= this.text.length && this.selectionEnd >= this.text.length) { + return; } - this.initDelayedCursor(); + this._moveCursorUpOrDown("Down", e); }, moveCursorDownWithoutShift: function(offset) { this._selectionDirection = "right"; - this.setSelectionStart(this.selectionStart + offset); - this.setSelectionEnd(this.selectionStart); + this.selectionEnd = this.selectionEnd + offset; + this.selectionStart = this.selectionEnd; + return offset !== 0; }, swapSelectionPoints: function() { var swapSel = this.selectionEnd; - this.setSelectionEnd(this.selectionStart); - this.setSelectionStart(swapSel); + this.selectionEnd = this.selectionStart; + this.selectionStart = swapSel; }, moveCursorDownWithShift: function(offset) { if (this.selectionEnd === this.selectionStart) { this._selectionDirection = "right"; } if (this._selectionDirection === "right") { - this.setSelectionEnd(this.selectionEnd + offset); + this.selectionEnd += offset; } else { - this.setSelectionStart(this.selectionStart + offset); + this.selectionStart += offset; } if (this.selectionEnd < this.selectionStart && this._selectionDirection === "left") { this.swapSelectionPoints(); this._selectionDirection = "right"; } if (this.selectionEnd > this.text.length) { - this.setSelectionEnd(this.text.length); + this.selectionEnd = this.text.length; } + return offset !== 0; }, getUpCursorOffset: function(e, isRight) { var selectionProp = isRight ? this.selectionEnd : this.selectionStart, cursorLocation = this.get2DCursorLocation(selectionProp), lineIndex = cursorLocation.lineIndex; @@ -11559,110 +11579,131 @@ fabric.util.object.extend(fabric.IText.prototype, { return indexOnPrevLine; }, moveCursorUp: function(e) { - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - var offset = this.getUpCursorOffset(e, this._selectionDirection === "right"); - if (e.shiftKey) { - this.moveCursorUpWithShift(offset); - } else { - this.moveCursorUpWithoutShift(offset); + if (this.selectionStart === 0 && this.selectionEnd === 0) { + return; + } + this._moveCursorUpOrDown("Up", e); + }, + _moveCursorUpOrDown: function(direction, e) { + var action = "get" + direction + "CursorOffset", moveAction = "moveCursor" + direction, offset = this[action](e, this._selectionDirection === "right"); + if (e.shiftKey) { + moveAction += "WithShift"; + } else { + moveAction += "WithoutShift"; + } + if (this[moveAction](offset)) { + this.abortCursorAnimation(); + this._currentCursorOpacity = 1; + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); } - this.initDelayedCursor(); }, moveCursorUpWithShift: function(offset) { if (this.selectionEnd === this.selectionStart) { this._selectionDirection = "left"; } if (this._selectionDirection === "right") { - this.setSelectionEnd(this.selectionEnd - offset); + this.selectionEnd -= offset; } else { - this.setSelectionStart(this.selectionStart - offset); + this.selectionStart -= offset; } if (this.selectionEnd < this.selectionStart && this._selectionDirection === "right") { this.swapSelectionPoints(); this._selectionDirection = "left"; } + return offset !== 0; }, moveCursorUpWithoutShift: function(offset) { - if (this.selectionStart === this.selectionEnd) { - this.setSelectionStart(this.selectionStart - offset); - } - this.setSelectionEnd(this.selectionStart); this._selectionDirection = "left"; + this.selectionStart -= offset; + this.selectionEnd = this.selectionStart; + return offset !== 0; }, moveCursorLeft: function(e) { if (this.selectionStart === 0 && this.selectionEnd === 0) { return; } - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - if (e.shiftKey) { - this.moveCursorLeftWithShift(e); - } else { - this.moveCursorLeftWithoutShift(e); - } - this.initDelayedCursor(); + this._moveCursorLeftOrRight("Left", e); }, _move: function(e, prop, direction) { - var propMethod = prop === "selectionStart" ? "setSelectionStart" : "setSelectionEnd"; + var newValue; if (e.altKey) { - this[propMethod](this["findWordBoundary" + direction](this[prop])); + newValue = this["findWordBoundary" + direction](this[prop]); } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) { - this[propMethod](this["findLineBoundary" + direction](this[prop])); + newValue = this["findLineBoundary" + direction](this[prop]); } else { - this[propMethod](this[prop] + (direction === "Left" ? -1 : 1)); + this[prop] += direction === "Left" ? -1 : 1; + return true; + } + if (typeof newValue !== undefined && this[prop] !== newValue) { + this[prop] = newValue; + return true; } }, _moveLeft: function(e, prop) { - this._move(e, prop, "Left"); + return this._move(e, prop, "Left"); }, _moveRight: function(e, prop) { - this._move(e, prop, "Right"); + return this._move(e, prop, "Right"); }, moveCursorLeftWithoutShift: function(e) { + var change = false; this._selectionDirection = "left"; - if (this.selectionEnd === this.selectionStart) { - this._moveLeft(e, "selectionStart"); + if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) { + change = this._moveLeft(e, "selectionStart"); } - this.setSelectionEnd(this.selectionStart); + this.selectionEnd = this.selectionStart; + return change; }, moveCursorLeftWithShift: function(e) { if (this._selectionDirection === "right" && this.selectionStart !== this.selectionEnd) { - this._moveLeft(e, "selectionEnd"); - } else { + return this._moveLeft(e, "selectionEnd"); + } else if (this.selectionStart !== 0) { this._selectionDirection = "left"; - this._moveLeft(e, "selectionStart"); + return this._moveLeft(e, "selectionStart"); } }, moveCursorRight: function(e) { if (this.selectionStart >= this.text.length && this.selectionEnd >= this.text.length) { return; } - this.abortCursorAnimation(); + this._moveCursorLeftOrRight("Right", e); + }, + _moveCursorLeftOrRight: function(direction, e) { + var actionName = "moveCursor" + direction + "With"; this._currentCursorOpacity = 1; if (e.shiftKey) { - this.moveCursorRightWithShift(e); + actionName += "Shift"; } else { - this.moveCursorRightWithoutShift(e); + actionName += "outShift"; + } + if (this[actionName](e)) { + console.log("will fire"); + this.abortCursorAnimation(); + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); } - this.initDelayedCursor(); }, moveCursorRightWithShift: function(e) { if (this._selectionDirection === "left" && this.selectionStart !== this.selectionEnd) { - this._moveRight(e, "selectionStart"); - } else { + return this._moveRight(e, "selectionStart"); + } else if (this.selectionEnd !== this.text.length) { this._selectionDirection = "right"; - this._moveRight(e, "selectionEnd"); + return this._moveRight(e, "selectionEnd"); } }, moveCursorRightWithoutShift: function(e) { + var changed = false; this._selectionDirection = "right"; if (this.selectionStart === this.selectionEnd) { - this._moveRight(e, "selectionStart"); - this.setSelectionEnd(this.selectionStart); + changed = this._moveRight(e, "selectionStart"); + this.selectionEnd = this.selectionStart; + return changed; } else { - this.setSelectionEnd(this.selectionEnd + this.getNumNewLinesInSelectedText()); - this.setSelectionStart(this.selectionEnd); + this.selectionStart = this.selectionEnd; + return true; } }, removeChars: function(e) { diff --git a/src/mixins/itext_behavior.mixin.js b/src/mixins/itext_behavior.mixin.js index 9c9f38d5..d6fd2334 100644 --- a/src/mixins/itext_behavior.mixin.js +++ b/src/mixins/itext_behavior.mixin.js @@ -157,6 +157,7 @@ * Aborts cursor animation and clears all timeouts */ abortCursorAnimation: function() { + var shouldClear = this._currentTickState || this._currentTickCompleteState; this._currentTickState && this._currentTickState.abort(); this._currentTickCompleteState && this._currentTickCompleteState.abort(); @@ -166,15 +167,20 @@ this._currentCursorOpacity = 0; // to clear just itext area we need to transform the context // it may not be worth it - this.canvas && this.canvas.clearContext(this.canvas.contextTop || this.ctx); + if (shouldClear) { + this.canvas && this.canvas.clearContext(this.canvas.contextTop || this.ctx); + } + }, /** * Selects entire text */ selectAll: function() { - this.setSelectionStart(0); - this.setSelectionEnd(this.text.length); + this.selectionStart = 0; + this.selectionEnd = this.text.length; + this._fireSelectionChanged(); + this._updateTextarea(); }, /** @@ -305,12 +311,15 @@ * @param {Number} selectionStart Index of a character */ selectWord: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */ - newSelectionEnd = this.searchWordBoundary(selectionStart, 1); - /* search forward */ + newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */ - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionEnd); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); + this.renderCursorOrSelection(); }, /** @@ -318,11 +327,14 @@ * @param {Number} selectionStart Index of a character */ selectLine: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; var newSelectionStart = this.findLineBoundaryLeft(selectionStart), - newSelectionEnd = this.findLineBoundaryRight(selectionStart); + newSelectionEnd = this.findLineBoundaryRight(selectionStart); - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionEnd); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); }, /** @@ -354,9 +366,8 @@ if (!this.canvas) { return this; } - - this.canvas.renderAll(); this.canvas.fire('text:editing:entered', { target: this }); + this.canvas.renderAll(); this.initMouseMoveHandler(); return this; }, @@ -392,13 +403,15 @@ return; } if (newSelectionStart > this.__selectionStartOnMouseDown) { - this.setSelectionStart(this.__selectionStartOnMouseDown); - this.setSelectionEnd(newSelectionStart); + this.selectionStart = this.__selectionStartOnMouseDown; + this.selectionEnd = newSelectionStart; } else { - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(this.__selectionStartOnMouseDown); + this.selectionStart = newSelectionStart; + this.selectionEnd = this.__selectionStartOnMouseDown; } + this._fireSelectionChanged(); + this._updateTextarea(); this.renderCursorOrSelection(); }, @@ -565,7 +578,8 @@ this._removeSingleCharAndStyle(start + 1); end--; } - this.setSelectionStart(start); + this.selectionStart = start; + this.selectionEnd = start; }, _removeSingleCharAndStyle: function(index) { @@ -588,7 +602,6 @@ if (this.selectionEnd - this.selectionStart > 1) { this._removeCharsFromTo(this.selectionStart, this.selectionEnd); - this.setSelectionEnd(this.selectionStart); } //short circuit for block paste if (!useCopiedStyle && this.isEmptyStyles()) { @@ -621,10 +634,11 @@ return; } this._updateTextarea(); - this.canvas && this.canvas.renderAll(); this.setCoords(); + this._fireSelectionChanged(); this.fire('changed'); this.canvas && this.canvas.fire('text:changed', { target: this }); + this.canvas && this.canvas.renderAll(); }, /** diff --git a/src/mixins/itext_click_behavior.mixin.js b/src/mixins/itext_click_behavior.mixin.js index 31d34a93..cf7a227f 100644 --- a/src/mixins/itext_click_behavior.mixin.js +++ b/src/mixins/itext_click_behavior.mixin.js @@ -103,7 +103,10 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.isEditing) { this.__selectionStartOnMouseDown = this.selectionStart; - this.initDelayedCursor(true); + if (this.selectionStart === this.selectionEnd) { + this.abortCursorAnimation(); + } + this.renderCursorOrSelection(); } }); }, @@ -130,7 +133,12 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.__lastSelected && !this.__corner) { this.enterEditing(options.e); - this.initDelayedCursor(true); + if (this.selectionStart === this.selectionEnd) { + this.initDelayedCursor(true); + } + else { + this.renderCursorOrSelection(); + } } this.selected = true; }); @@ -145,17 +153,19 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (e.shiftKey) { if (newSelectionStart < this.selectionStart) { - this.setSelectionEnd(this.selectionStart); - this.setSelectionStart(newSelectionStart); + this.selectionEnd = this.selectionStart; + this.selectionStart = newSelectionStart; } else { - this.setSelectionEnd(newSelectionStart); + this.selectionEnd = newSelectionStart; } } else { - this.setSelectionStart(newSelectionStart); - this.setSelectionEnd(newSelectionStart); + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionStart; } + this._fireSelectionChanged(); + this._updateTextarea(); }, /** diff --git a/src/mixins/itext_key_behavior.mixin.js b/src/mixins/itext_key_behavior.mixin.js index b5b82bd0..ffd6fc38 100644 --- a/src/mixins/itext_key_behavior.mixin.js +++ b/src/mixins/itext_key_behavior.mixin.js @@ -343,19 +343,10 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e Event object */ moveCursorDown: function(e) { - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - - var offset = this.getDownCursorOffset(e, this._selectionDirection === 'right'); - - if (e.shiftKey) { - this.moveCursorDownWithShift(offset); + if (this.selectionStart >= this.text.length && this.selectionEnd >= this.text.length) { + return; } - else { - this.moveCursorDownWithoutShift(offset); - } - - this.initDelayedCursor(); + this._moveCursorUpOrDown('Down', e); }, /** @@ -364,8 +355,9 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ moveCursorDownWithoutShift: function(offset) { this._selectionDirection = 'right'; - this.setSelectionStart(this.selectionStart + offset); - this.setSelectionEnd(this.selectionStart); + this.selectionEnd = this.selectionEnd + offset; + this.selectionStart = this.selectionEnd; + return offset !== 0; }, /** @@ -373,8 +365,8 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ swapSelectionPoints: function() { var swapSel = this.selectionEnd; - this.setSelectionEnd(this.selectionStart); - this.setSelectionStart(swapSel); + this.selectionEnd = this.selectionStart; + this.selectionStart = swapSel; }, /** @@ -386,18 +378,19 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this._selectionDirection = 'right'; } if (this._selectionDirection === 'right') { - this.setSelectionEnd(this.selectionEnd + offset); + this.selectionEnd += offset; } else { - this.setSelectionStart(this.selectionStart + offset); + this.selectionStart += offset; } if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'left') { this.swapSelectionPoints(); this._selectionDirection = 'right'; } if (this.selectionEnd > this.text.length) { - this.setSelectionEnd(this.text.length); + this.selectionEnd = this.text.length; } + return offset !== 0; }, /** @@ -479,19 +472,34 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e Event object */ moveCursorUp: function(e) { + if (this.selectionStart === 0 && this.selectionEnd === 0) { + return; + } + this._moveCursorUpOrDown('Up', e); + }, - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - - var offset = this.getUpCursorOffset(e, this._selectionDirection === 'right'); + /** + * Moves cursor up or down, fires the events + * @param {String} direction 'Up' or 'Down' + * @param {Event} e Event object + */ + _moveCursorUpOrDown: function(direction, e) { + var action = 'get' + direction + 'CursorOffset', + moveAction = 'moveCursor' + direction, + offset = this[action](e, this._selectionDirection === 'right'); if (e.shiftKey) { - this.moveCursorUpWithShift(offset); + moveAction += 'WithShift'; } else { - this.moveCursorUpWithoutShift(offset); + moveAction += 'WithoutShift'; + } + if (this[moveAction](offset)) { + this.abortCursorAnimation(); + this._currentCursorOpacity = 1; + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); } - - this.initDelayedCursor(); }, /** @@ -503,15 +511,16 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this._selectionDirection = 'left'; } if (this._selectionDirection === 'right') { - this.setSelectionEnd(this.selectionEnd - offset); + this.selectionEnd -= offset; } else { - this.setSelectionStart(this.selectionStart - offset); + this.selectionStart -= offset; } if (this.selectionEnd < this.selectionStart && this._selectionDirection === 'right') { this.swapSelectionPoints(); this._selectionDirection = 'left'; } + return offset !== 0; }, /** @@ -519,12 +528,10 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Number} offset */ moveCursorUpWithoutShift: function(offset) { - if (this.selectionStart === this.selectionEnd) { - this.setSelectionStart(this.selectionStart - offset); - } - this.setSelectionEnd(this.selectionStart); - this._selectionDirection = 'left'; + this.selectionStart -= offset; + this.selectionEnd = this.selectionStart; + return offset !== 0; }, /** @@ -535,33 +542,28 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.selectionStart === 0 && this.selectionEnd === 0) { return; } - - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - - if (e.shiftKey) { - this.moveCursorLeftWithShift(e); - } - else { - this.moveCursorLeftWithoutShift(e); - } - - this.initDelayedCursor(); + this._moveCursorLeftOrRight('Left', e); }, /** * @private + * @return {Boolean} true if a change happened */ _move: function(e, prop, direction) { - var propMethod = (prop === 'selectionStart' ? 'setSelectionStart' : 'setSelectionEnd'); + var newValue; if (e.altKey) { - this[propMethod](this['findWordBoundary' + direction](this[prop])); + newValue = this['findWordBoundary' + direction](this[prop]); } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { - this[propMethod](this['findLineBoundary' + direction](this[prop])); + newValue = this['findLineBoundary' + direction](this[prop]); } else { - this[propMethod](this[prop] + (direction === 'Left' ? -1 : 1)); + this[prop] += direction === 'Left' ? -1 : 1; + return true; + } + if (typeof newValue !== undefined && this[prop] !== newValue) { + this[prop] = newValue; + return true; } }, @@ -569,14 +571,14 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @private */ _moveLeft: function(e, prop) { - this._move(e, prop, 'Left'); + return this._move(e, prop, 'Left'); }, /** * @private */ _moveRight: function(e, prop) { - this._move(e, prop, 'Right'); + return this._move(e, prop, 'Right'); }, /** @@ -584,14 +586,16 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e */ moveCursorLeftWithoutShift: function(e) { + var change = false; this._selectionDirection = 'left'; // only move cursor when there is no selection, // otherwise we discard it, and leave cursor on same place - if (this.selectionEnd === this.selectionStart) { - this._moveLeft(e, 'selectionStart'); + if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) { + change = this._moveLeft(e, 'selectionStart'); } - this.setSelectionEnd(this.selectionStart); + this.selectionEnd = this.selectionStart; + return change; }, /** @@ -600,11 +604,11 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ moveCursorLeftWithShift: function(e) { if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) { - this._moveLeft(e, 'selectionEnd'); + return this._moveLeft(e, 'selectionEnd'); } - else { + else if (this.selectionStart !== 0){ this._selectionDirection = 'left'; - this._moveLeft(e, 'selectionStart'); + return this._moveLeft(e, 'selectionStart'); } }, @@ -616,18 +620,30 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (this.selectionStart >= this.text.length && this.selectionEnd >= this.text.length) { return; } + this._moveCursorLeftOrRight('Right', e); + }, - this.abortCursorAnimation(); + /** + * Moves cursor right or Left, fires event + * @param {String} direction 'Left', 'Right' + * @param {Event} e Event object + */ + _moveCursorLeftOrRight: function(direction, e) { + var actionName = 'moveCursor' + direction + 'With'; this._currentCursorOpacity = 1; if (e.shiftKey) { - this.moveCursorRightWithShift(e); + actionName += 'Shift'; } else { - this.moveCursorRightWithoutShift(e); + actionName += 'outShift'; + } + if (this[actionName](e)) { + this.abortCursorAnimation(); + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); } - - this.initDelayedCursor(); }, /** @@ -636,11 +652,11 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot */ moveCursorRightWithShift: function(e) { if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) { - this._moveRight(e, 'selectionStart'); + return this._moveRight(e, 'selectionStart'); } - else { + else if (this.selectionEnd !== this.text.length) { this._selectionDirection = 'right'; - this._moveRight(e, 'selectionEnd'); + return this._moveRight(e, 'selectionEnd'); } }, @@ -649,15 +665,17 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e Event object */ moveCursorRightWithoutShift: function(e) { + var changed = false; this._selectionDirection = 'right'; if (this.selectionStart === this.selectionEnd) { - this._moveRight(e, 'selectionStart'); - this.setSelectionEnd(this.selectionStart); + changed = this._moveRight(e, 'selectionStart'); + this.selectionEnd = this.selectionStart; + return changed; } else { - this.setSelectionEnd(this.selectionEnd + this.getNumNewLinesInSelectedText()); - this.setSelectionStart(this.selectionEnd); + this.selectionStart = this.selectionEnd; + return true; } }, diff --git a/src/shapes/itext.class.js b/src/shapes/itext.class.js index 7bf4f41c..472ed44e 100644 --- a/src/shapes/itext.class.js +++ b/src/shapes/itext.class.js @@ -213,12 +213,7 @@ */ setSelectionStart: function(index) { index = Math.max(index, 0); - if (this.selectionStart !== index) { - this.fire('selection:changed'); - this.canvas && this.canvas.fire('text:selection:changed', { target: this }); - this.selectionStart = index; - } - this._updateTextarea(); + this._updateAndFire('selectionStart', index); }, /** @@ -227,14 +222,31 @@ */ setSelectionEnd: function(index) { index = Math.min(index, this.text.length); - if (this.selectionEnd !== index) { - this.fire('selection:changed'); - this.canvas && this.canvas.fire('text:selection:changed', { target: this }); - this.selectionEnd = index; + this._updateAndFire('selectionEnd', index); + }, + + /** + * @private + * @param {String} property 'selectionStart' or 'selectionEnd' + * @param {Number} index new position of property + */ + _updateAndFire: function(property, index) { + if (this[property] !== index) { + this._fireSelectionChanged(); + this[property] = index; } this._updateTextarea(); }, + /** + * Fires the even of selection changed + * @private + */ + _fireSelectionChanged: function() { + this.fire('selection:changed'); + this.canvas && this.canvas.fire('text:selection:changed', { target: this }); + }, + /** * Gets style of a current selection/cursor (at the start position) * @param {Number} [startIndex] Start index to get styles at @@ -313,7 +325,6 @@ if (!this.active || !this.isEditing) { return; } - var chars = this.text.split(''), boundaries, ctx; diff --git a/test.js b/test.js index 700d04e8..ea3f4660 100644 --- a/test.js +++ b/test.js @@ -36,7 +36,8 @@ testrunner.run({ './test/unit/object_interactivity.js', './test/unit/object_geometry.js', './test/unit/object_origin.js', - './test/unit/itext.js' + './test/unit/itext.js', + './test/unit/itext_key_behaviour.js' ] }, function(err, report) { if (err) { diff --git a/test/unit/itext_key_behaviour.js b/test/unit/itext_key_behaviour.js new file mode 100644 index 00000000..53ee7b05 --- /dev/null +++ b/test/unit/itext_key_behaviour.js @@ -0,0 +1,228 @@ +(function(){ + test('event selection:changed firing', function() { + var iText = new fabric.IText('test need some word\nsecond line'), + selection = 0; + + function countSelectionChange() { + selection++; + } + + iText.on('selection:changed', countSelectionChange); + + iText.enterEditing(); + equal(selection, 0, 'should not fire on enter edit'); + + iText.selectAll(); + equal(selection, 1, 'should fire once on selectAll'); + equal(iText.selectionStart, 0, 'should start from 0'); + equal(iText.selectionEnd, 31, 'should end at end of text'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.selectWord(); + equal(selection, 1, 'should fire once on selectWord'); + equal(iText.selectionStart, 0, 'should start at word start'); + equal(iText.selectionEnd, 4, 'should end at word end'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.selectLine(); + equal(selection, 1, 'should fire once on selectLine'); + equal(iText.selectionStart, 0, 'should start at line start'); + equal(iText.selectionEnd, 19, 'should end at line end'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.moveCursorLeft({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorLeft'); + equal(iText.selectionStart, 1, 'should be 1 less than 2'); + equal(iText.selectionEnd, 1, 'should be 1 less than 2'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.moveCursorRight({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorRight'); + equal(iText.selectionStart, 3, 'should be 1 more than 2'); + equal(iText.selectionEnd, 3, 'should be 1 more than 2'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.moveCursorDown({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorDown'); + equal(iText.selectionStart, 22, 'should be on second line'); + equal(iText.selectionEnd, 22, 'should be on second line'); + iText.moveCursorDown({ shiftKey: false}); + equal(selection, 2, 'should fire once on moveCursorDown'); + equal(iText.selectionStart, 31, 'should be at end of text'); + equal(iText.selectionEnd, 31, 'should be at end of text'); + selection = 0; + + iText.selectionStart = 22; + iText.selectionEnd = 22; + iText.moveCursorUp({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorUp'); + equal(iText.selectionStart, 2, 'should be back to first line'); + equal(iText.selectionEnd, 2, 'should be back on first line'); + iText.moveCursorUp({ shiftKey: false}); + equal(selection, 2, 'should fire once on moveCursorUp'); + equal(iText.selectionStart, 0, 'should be back to first line'); + equal(iText.selectionEnd, 0, 'should be back on first line'); + selection = 0; + + iText.selectionStart = 0; + iText.selectionEnd = 0; + iText.moveCursorLeft({ shiftKey: false}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 0, 'should not move'); + equal(iText.selectionEnd, 0, 'should not move'); + iText.moveCursorUp({ shiftKey: false}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 0, 'should not move'); + equal(iText.selectionEnd, 0, 'should not move'); + selection = 0; + + iText.selectionStart = 31; + iText.selectionEnd = 31; + iText.moveCursorRight({ shiftKey: false}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 31, 'should not move'); + equal(iText.selectionEnd, 31, 'should not move'); + iText.moveCursorDown({ shiftKey: false}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 31, 'should not move'); + equal(iText.selectionEnd, 31, 'should not move'); + selection = 0; + + iText.selectionStart = 28; + iText.selectionEnd = 31; + iText.moveCursorUp({ shiftKey: false}); + equal(selection, 1, 'should fire'); + equal(iText.selectionStart, 9, 'should move to upper line'); + equal(iText.selectionEnd, 9, 'should move to upper line'); + selection = 0; + + iText.selectionStart = 1; + iText.selectionEnd = 4; + iText.moveCursorDown({ shiftKey: false}); + equal(selection, 1, 'should fire'); + equal(iText.selectionStart, 24, 'should move to down line'); + equal(iText.selectionEnd, 24, 'should move to down line'); + selection = 0; + + iText.selectionStart = 0; + iText.selectionEnd = 0; + iText.insertChars('hello'); + equal(selection, 1, 'should fire once on insert multiple chars'); + equal(iText.selectionStart, 5, 'should be at end of text inserted'); + equal(iText.selectionEnd, 5, 'should be at end of text inserted'); + }); + + test('moving cursor with shift', function() { + var iText = new fabric.IText('test need some word\nsecond line'), + selection = 0; + + function countSelectionChange() { + selection++; + } + + iText.on('selection:changed', countSelectionChange); + + iText.enterEditing(); + equal(selection, 0, 'should not fire on enter edit'); + + iText.selectAll(); + equal(selection, 1, 'should fire once on selectAll'); + equal(iText.selectionStart, 0, 'should start from 0'); + equal(iText.selectionEnd, 31, 'should end at end of text'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.selectWord(); + equal(selection, 1, 'should fire once on selectWord'); + equal(iText.selectionStart, 0, 'should start at word start'); + equal(iText.selectionEnd, 4, 'should end at word end'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.selectLine(); + equal(selection, 1, 'should fire once on selectLine'); + equal(iText.selectionStart, 0, 'should start at line start'); + equal(iText.selectionEnd, 19, 'should end at line end'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.moveCursorLeft({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorLeft'); + equal(iText.selectionStart, 1, 'should be 1 less than 2'); + equal(iText.selectionEnd, 1, 'should be 1 less than 2'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.moveCursorRight({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorRight'); + equal(iText.selectionStart, 3, 'should be 1 more than 2'); + equal(iText.selectionEnd, 3, 'should be 1 more than 2'); + selection = 0; + + iText.selectionStart = 2; + iText.selectionEnd = 2; + iText.moveCursorDown({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorDown'); + equal(iText.selectionStart, 22, 'should be on second line'); + equal(iText.selectionEnd, 22, 'should be on second line'); + iText.moveCursorDown({ shiftKey: false}); + equal(selection, 2, 'should fire once on moveCursorDown'); + equal(iText.selectionStart, 31, 'should be at end of text'); + equal(iText.selectionEnd, 31, 'should be at end of text'); + selection = 0; + + iText.selectionStart = 22; + iText.selectionEnd = 22; + iText.moveCursorUp({ shiftKey: false}); + equal(selection, 1, 'should fire once on moveCursorUp'); + equal(iText.selectionStart, 2, 'should be back to first line'); + equal(iText.selectionEnd, 2, 'should be back on first line'); + iText.moveCursorUp({ shiftKey: false}); + equal(selection, 2, 'should fire once on moveCursorUp'); + equal(iText.selectionStart, 0, 'should be back to first line'); + equal(iText.selectionEnd, 0, 'should be back on first line'); + selection = 0; + + iText.selectionStart = 0; + iText.selectionEnd = 1; + iText._selectionDirection = 'left'; + iText.moveCursorLeft({ shiftKey: true}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 0, 'should not move'); + equal(iText.selectionEnd, 1, 'should not move'); + iText.moveCursorUp({ shiftKey: true}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 0, 'should not move'); + equal(iText.selectionEnd, 1, 'should not move'); + selection = 0; + + + iText.selectionStart = 30; + iText.selectionEnd = 31; + iText._selectionDirection = 'right'; + iText.moveCursorRight({ shiftKey: true}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 30, 'should not move'); + equal(iText.selectionEnd, 31, 'should not move'); + iText.moveCursorDown({ shiftKey: true}); + equal(selection, 0, 'should not fire with no change'); + equal(iText.selectionStart, 30, 'should not move'); + equal(iText.selectionEnd, 31, 'should not move'); + selection = 0; + }); + +})(); diff --git a/test/unit/object.js b/test/unit/object.js index 8f09e4a5..8696acde 100644 --- a/test/unit/object.js +++ b/test/unit/object.js @@ -1440,7 +1440,6 @@ test('toDataURL & reference to canvas', function() { group.scaleY = 2; object.group = group; var objectScale = object.getObjectScaling(); - console.log(objectScale); deepEqual(objectScale, { scaleX: object.scaleX * group.scaleX, scaleY: object.scaleY * group.scaleY